From 544617534b73b0ebf18e2a37022fe5f9f475a080 Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 10 Jul 2023 15:50:46 +0400 Subject: [PATCH 1/5] Implement report dump after each protocol --- src/qibocal/auto/execute.py | 1 + src/qibocal/cli/_base.py | 1 - src/qibocal/cli/builders.py | 4 +-- .../resonator_spectroscopy.py | 27 +++++++++++++++++-- .../protocols/characterization/utils.py | 6 ----- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/qibocal/auto/execute.py b/src/qibocal/auto/execute.py index 9b59f5a96..d6736a378 100644 --- a/src/qibocal/auto/execute.py +++ b/src/qibocal/auto/execute.py @@ -141,3 +141,4 @@ def run(self): if self.platform is not None: if self.update and task.update: self.platform.update(completed.results.update) + yield diff --git a/src/qibocal/cli/_base.py b/src/qibocal/cli/_base.py index 28a9b45ee..62f0aab1b 100644 --- a/src/qibocal/cli/_base.py +++ b/src/qibocal/cli/_base.py @@ -59,7 +59,6 @@ def command(runcard, folder, force, update): builder.run() if update: builder.dump_platform_runcard() - builder.dump_report() @click.command(context_settings=CONTEXT_SETTINGS) diff --git a/src/qibocal/cli/builders.py b/src/qibocal/cli/builders.py index 344163038..c43632dd8 100644 --- a/src/qibocal/cli/builders.py +++ b/src/qibocal/cli/builders.py @@ -95,13 +95,13 @@ def _prepare_output(self, runcard): def run(self): """Execute protocols in runcard.""" - if self.platform is not None: self.platform.connect() self.platform.setup() self.platform.start() - self.executor.run() + for _ in self.executor.run(): + self.dump_report() if self.platform is not None: self.platform.stop() diff --git a/src/qibocal/protocols/characterization/resonator_spectroscopy.py b/src/qibocal/protocols/characterization/resonator_spectroscopy.py index 7c1eaf418..59eb24994 100644 --- a/src/qibocal/protocols/characterization/resonator_spectroscopy.py +++ b/src/qibocal/protocols/characterization/resonator_spectroscopy.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass, field, fields from typing import Optional, Union import numpy as np @@ -9,7 +9,14 @@ from qibolab.qubits import QubitId from qibolab.sweeper import Parameter, Sweeper, SweeperType -from qibocal.auto.operation import Data, Parameters, Qubits, Results, Routine +from qibocal.auto.operation import ( + Data, + Parameters, + ParameterValue, + Qubits, + Results, + Routine, +) from .utils import PowerLevel, lorentzian_fit, spectroscopy_plot @@ -61,6 +68,22 @@ class ResonatorSpectroscopyResults(Results): ) """Readout attenuation [dB] for each qubit.""" + @property + def update(self): + """Method overwritten from Results to not update + amplitude when running resonator spectroscopy at + high power.""" + up: dict[str, ParameterValue] = {} + if self.bare_frequency == {}: + fields_to_updated = [fld for fld in fields(self) if fld.name != "amplitude"] + else: + fields_to_updated = fields(self) + for fld in fields_to_updated: + if "update" in fld.metadata: + up[fld.metadata["update"]] = getattr(self, fld.name) + + return up + ResSpecType = np.dtype( [("freq", np.float64), ("msr", np.float64), ("phase", np.float64)] diff --git a/src/qibocal/protocols/characterization/utils.py b/src/qibocal/protocols/characterization/utils.py index 3d644e3fb..3e84ada03 100644 --- a/src/qibocal/protocols/characterization/utils.py +++ b/src/qibocal/protocols/characterization/utils.py @@ -90,7 +90,6 @@ def spectroscopy_plot(data, fit: Results, qubit): qubit_data = data[qubit] fitting_report = "" - frequencies = qubit_data.freq * HZ_TO_GHZ fig.add_trace( go.Scatter( @@ -145,14 +144,9 @@ def spectroscopy_plot(data, fit: Results, qubit): else: label = "qubit frequency" freq = fit.frequency - fitting_report += f"{qubit} | {label}: {freq[qubit]*GHZ_TO_HZ:,.0f} Hz
" - if fit.amplitude[qubit] is not None: fitting_report += f"{qubit} | amplitude: {fit.amplitude[qubit]}
" - if data.power_level is PowerLevel.high: - # TODO: find better solution for not updating amplitude in high power - fit.amplitude.pop(qubit) if data.__class__.__name__ == "ResonatorSpectroscopyAttenuationData": if fit.attenuation[qubit] is not None and fit.attenuation[qubit] != 0: From ddcf810d94a98a69b40d769e5626b1a1d43787f3 Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 10 Jul 2023 16:12:12 +0400 Subject: [PATCH 2/5] Fix tests --- tests/test_auto.py | 3 ++- tests/test_task_options.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_auto.py b/tests/test_auto.py index ed7cf9519..dfc264f0e 100644 --- a/tests/test_auto.py +++ b/tests/test_auto.py @@ -36,6 +36,7 @@ def test_execution(card: pathlib.Path): """ testcard = TestCard(**yaml.safe_load(card.read_text(encoding="utf-8"))) executor = Executor.load(testcard.runcard, output=pathlib.Path(tempfile.mkdtemp())) - executor.run() + for _ in executor.run(): + pass assert testcard.validation.result == [step[0] for step in executor.history] diff --git a/tests/test_task_options.py b/tests/test_task_options.py index abaa7fe42..92345d068 100644 --- a/tests/test_task_options.py +++ b/tests/test_task_options.py @@ -34,7 +34,7 @@ "freq_width": 10_000_000, "freq_step": 100_000, "amplitude": 0.4, - "power_level": "low", + "power_level": "high", }, }, ], @@ -99,7 +99,7 @@ def test_update_argument(global_update, local_update): platform.qubits, global_update, ) - executor.run() + next(executor.run()) if local_update and global_update: assert old_readout_frequency != platform.qubits[0].readout_frequency else: From f10c97be95b57736dea42b653a8fc714922692fa Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Mon, 10 Jul 2023 16:58:15 +0400 Subject: [PATCH 3/5] Rodolfo's suggestion Co-authored-by: Rodolfo Carobene <74607088+rodolfocarobene@users.noreply.github.com> --- .../protocols/characterization/resonator_spectroscopy.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/qibocal/protocols/characterization/resonator_spectroscopy.py b/src/qibocal/protocols/characterization/resonator_spectroscopy.py index 59eb24994..a056f1061 100644 --- a/src/qibocal/protocols/characterization/resonator_spectroscopy.py +++ b/src/qibocal/protocols/characterization/resonator_spectroscopy.py @@ -74,10 +74,8 @@ def update(self): amplitude when running resonator spectroscopy at high power.""" up: dict[str, ParameterValue] = {} - if self.bare_frequency == {}: - fields_to_updated = [fld for fld in fields(self) if fld.name != "amplitude"] - else: - fields_to_updated = fields(self) + fields_to_updated = [fld for fld in fields(self) if fld.name != "amplitude"] if self.bare_frequency == {} else fields(self) + for fld in fields_to_updated: if "update" in fld.metadata: up[fld.metadata["update"]] = getattr(self, fld.name) From 3627c84237d40ee74a9d5d4b19518c7dc7d38f7a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 12:58:23 +0000 Subject: [PATCH 4/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../protocols/characterization/resonator_spectroscopy.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/resonator_spectroscopy.py b/src/qibocal/protocols/characterization/resonator_spectroscopy.py index a056f1061..1cb4372f5 100644 --- a/src/qibocal/protocols/characterization/resonator_spectroscopy.py +++ b/src/qibocal/protocols/characterization/resonator_spectroscopy.py @@ -74,7 +74,11 @@ def update(self): amplitude when running resonator spectroscopy at high power.""" up: dict[str, ParameterValue] = {} - fields_to_updated = [fld for fld in fields(self) if fld.name != "amplitude"] if self.bare_frequency == {} else fields(self) + fields_to_updated = ( + [fld for fld in fields(self) if fld.name != "amplitude"] + if self.bare_frequency == {} + else fields(self) + ) for fld in fields_to_updated: if "update" in fld.metadata: From 708f595139d86d23ebea5d604161a72c8137a8fa Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 10 Jul 2023 20:17:51 +0400 Subject: [PATCH 5/5] Fix coverage --- .../protocols/characterization/ramsey.py | 1 - tests/test_task_options.py | 36 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/qibocal/protocols/characterization/ramsey.py b/src/qibocal/protocols/characterization/ramsey.py index 53828cbb0..b996905f3 100644 --- a/src/qibocal/protocols/characterization/ramsey.py +++ b/src/qibocal/protocols/characterization/ramsey.py @@ -267,7 +267,6 @@ def _fit(data: RamseyData) -> RamseyResults: log.warning(f"ramsey_fit: the fitting was not succesful. {e}") popt = [0] * 5 t2 = 5.0 - print(qubit_freq) corrected_qubit_frequency = int(qubit_freq) delta_phys = 0 diff --git a/tests/test_task_options.py b/tests/test_task_options.py index 92345d068..e822d5b27 100644 --- a/tests/test_task_options.py +++ b/tests/test_task_options.py @@ -26,27 +26,17 @@ "nshots": 10, }, }, - { - "id": "resonator frequency", - "priority": 0, - "operation": "resonator_spectroscopy", - "parameters": { - "freq_width": 10_000_000, - "freq_step": 100_000, - "amplitude": 0.4, - "power_level": "high", - }, - }, ], } def modify_card(card, qubits=None, update=None): """Modify runcard to change local qubits or update.""" - if qubits is not None: - card["actions"][0]["qubits"] = qubits - elif update is not None: - card["actions"][0]["update"] = update + for action in card["actions"]: + if qubits is not None: + action["qubits"] = qubits + elif update is not None: + action["update"] = update return card @@ -74,6 +64,7 @@ def test_qubits_argument(platform, local_qubits): "id": "resonator frequency", "priority": 0, "operation": "resonator_spectroscopy", + "main": "classification", "parameters": { "freq_width": 10_000_000, "freq_step": 100_000, @@ -81,6 +72,12 @@ def test_qubits_argument(platform, local_qubits): "power_level": "low", }, }, + { + "id": "classification", + "priority": 0, + "operation": "single_shot_classification", + "parameters": {"nshots": 100}, + }, ], } @@ -91,6 +88,7 @@ def test_update_argument(global_update, local_update): """Test possible update combinations between global and local.""" platform = deepcopy(create_platform("dummy")) old_readout_frequency = platform.qubits[0].readout_frequency + old_iq_angle = platform.qubits[1].iq_angle NEW_CARD = modify_card(deepcopy(UPDATE_CARD), update=local_update) executor = Executor.load( Runcard.load(NEW_CARD), @@ -99,8 +97,14 @@ def test_update_argument(global_update, local_update): platform.qubits, global_update, ) - next(executor.run()) + + for _ in executor.run(): + pass + if local_update and global_update: assert old_readout_frequency != platform.qubits[0].readout_frequency + assert old_iq_angle != platform.qubits[1].iq_angle + else: assert old_readout_frequency == platform.qubits[0].readout_frequency + assert old_iq_angle == platform.qubits[1].iq_angle