Source code for qibocal.cli.fit
import datetime
import json
import pathlib
import shutil
import yaml
from qibo.backends import GlobalBackend
from qibolab.serialize import dump_runcard
from qibocal.config import log, raise_error
from ..auto.execute import Executor
from ..auto.history import add_timings_to_meta
from ..auto.mode import ExecutionMode
from ..auto.operation import RESULTSFILE
from ..auto.runcard import Runcard
from .utils import META, RUNCARD, UPDATED_PLATFORM
[docs]def fit(input_path, update, output_path, force):
"""Post-processing analysis
Arguments:
- input_path: input folder.
- update: perform platform update
- output_path: new folder with data and fit
"""
if output_path is not None:
if output_path.exists():
if force is False:
raise_error(RuntimeError, f"Directory {output_path} already exists.")
# overwrite output_path
log.warning(f"Deleting previous directory {output_path}.")
shutil.rmtree(pathlib.Path.cwd() / output_path)
path = shutil.copytree(input_path, output_path)
else:
if len(list(input_path.glob(f"**/{RESULTSFILE}.json"))) > 0:
if force:
log.warning(f"Overwriting fit in {input_path}.")
else:
raise_error(
RuntimeError, f"Directory {input_path} contains fitting results."
)
path = input_path
meta = json.loads((path / META).read_text())
# load runcard
runcard = Runcard.load(yaml.safe_load((path / RUNCARD).read_text()))
# set backend, platform and qubits
GlobalBackend.set_backend(backend=meta["backend"], platform=meta["platform"])
backend = GlobalBackend()
platform = backend.platform
# load executor
executor = Executor.load(
runcard, path, update=update, platform=platform, targets=runcard.targets
)
# perform post-processing
list(executor.run(mode=ExecutionMode.fit))
# update time in meta
meta = add_timings_to_meta(meta, executor.history)
e = datetime.datetime.now(datetime.timezone.utc)
meta["end-time"] = e.strftime("%H:%M:%S")
# dump updated runcard
if platform is not None and update: # pragma: no cover
# cannot test update since dummy may produce wrong values and trigger errors
(path / UPDATED_PLATFORM).mkdir(parents=True, exist_ok=True)
dump_runcard(platform, path / UPDATED_PLATFORM)
# dump json
(path / META).write_text(json.dumps(meta, indent=4))