qpandalite.task.task_utils 源代码
"""Utility functions for quantum task management.
Provides helpers for loading/saving circuit files, managing local task
records (``online_info``), and generating timestamp strings. These are
used internally by the platform-specific task modules.
"""
__all__ = ["load_circuit", "load_circuit_group", "make_savepath", "load_all_online_info", "get_last_taskid", "write_taskinfo", "timestr", "timestr_ymd_hms"]
import requests
from pathlib import Path
import os
import json
from datetime import datetime
[文档]
def load_circuit(basepath = None):
'''Load all quantum circuits from text files under *basepath*.
Each ``.txt`` file is read as a single circuit string and stored in a
dict keyed by filename.
Args:
basepath (os.PathLike, optional): Directory containing circuit files.
Defaults to ``<cwd>/output_circuits``.
Returns:
dict[str, str]: Mapping from filename to circuit text.
'''
circuits = dict()
if not basepath:
basepath = Path.cwd() / 'output_circuits'
files = os.listdir(basepath)
for file in files:
if file.endswith('txt'):
with open(basepath / file, 'r') as fp:
circuit_text = fp.read()
circuits[file] = circuit_text
return circuits
[文档]
def load_circuit_group(path = None):
'''Load multiple circuits from a single grouped circuit file.
The file is split on the ``//////////`` delimiter. Only non-empty
fragments starting with ``QINIT`` are kept.
Args:
path (os.PathLike, optional): Path to the grouped circuit file.
Defaults to ``<cwd>/output_circuits/originir.txt``.
Returns:
dict[int, str]: Mapping from index to circuit text.
'''
circuits = dict()
if not path:
path = Path.cwd() / 'output_circuits' / 'originir.txt'
with open(path, 'r') as fp:
circuit_text = fp.read()
originirs = circuit_text.split('//////////')
for i, originir in enumerate(originirs):
stripped = originir.strip()
if stripped and stripped.startswith('QINIT'):
circuits[i] = stripped
return circuits
[文档]
def make_savepath(savepath = None):
'''Ensure the save directory and ``online_info.txt`` exist.
Creates *savepath* and an empty ``online_info.txt`` inside it if they
do not already exist.
Args:
savepath (os.PathLike, optional): Target directory.
Defaults to ``<cwd>/online_info``.
'''
if not savepath:
savepath = Path.cwd() / 'online_info'
if not os.path.exists(savepath):
os.makedirs(savepath)
if not os.path.exists(savepath / 'online_info.txt'):
with open(savepath / 'online_info.txt', 'w') as fp:
pass
[文档]
def load_all_online_info(savepath = None):
'''Load all locally saved online task info entries.
Reads ``online_info.txt`` line-by-line; each line is expected to be a
JSON object.
Args:
savepath (os.PathLike, optional): Directory containing
``online_info.txt``. Defaults to ``<cwd>/online_info``.
Returns:
list[dict]: A list of parsed JSON objects.
'''
if not savepath:
savepath = Path.cwd() / 'online_info'
online_info = []
with open(savepath / 'online_info.txt', 'r') as fp:
lines = fp.read().strip().splitlines()
for line in lines:
online_info.append(json.loads(line))
return online_info
[文档]
def get_last_taskid(savepath = None):
'''Return the task ID of the most recently submitted task.
Args:
savepath (os.PathLike, optional): Directory containing
``online_info.txt``. Defaults to ``<cwd>/online_info``.
Returns:
str: The taskid from the last line of ``online_info.txt``.
'''
if not savepath:
savepath = Path.cwd() / 'online_info'
with open(savepath / 'online_info.txt', 'r') as fp:
lines = fp.read().strip().splitlines()
last_task = json.loads(lines[-1])
return last_task['taskid']
[文档]
def write_taskinfo(taskid, taskinfo, savepath = None):
'''Persist task info to a per-task JSON file.
Writes ``<savepath>/<taskid>.txt`` containing the JSON-serialized
*taskinfo*. If *savepath* is ``None``, nothing is written. Existing
files are never overwritten.
Args:
taskid (str): The task ID used as the filename.
taskinfo (dict): Task information to save.
savepath (os.PathLike, optional): Target directory. If ``None``,
the call is a no-op.
'''
# if no savepath, then it will not save anything
if not savepath:
return
# savepath = Path.cwd() / 'online_info'
# no overwrite
if os.path.exists(savepath / '{}.txt'.format(taskid)):
return
with open(savepath / '{}.txt'.format(taskid), 'w') as fp:
json.dump(taskinfo, fp)
[文档]
def timestr():
"""Return a human-readable timestamp string (``YYYYMMDD_HHMMSS``)."""
return timestr_ymd_hms()
[文档]
def timestr_ymd_hms():
"""Return the current time formatted as ``YYYYMMDD_HHMMSS``."""
return datetime.now().strftime(r"%Y%m%d_%H%M%S")