Source code for qblox_scheduler.experiments.loops
# Repository: https://gitlab.com/qblox/packages/software/qblox-scheduler
# Licensed according to the LICENSE file on the main branch
#
# Copyright 2025, Qblox B.V.
"""Module containing the step to a set a parameter."""
from __future__ import annotations
from typing import TYPE_CHECKING
from qblox_scheduler.experiments.experiment import Step
from qblox_scheduler.instrument_coordinator.utility import merge_acquisition_sets
if TYPE_CHECKING:
from xarray import Dataset
from qblox_scheduler.device_under_test import QuantumDevice
from qblox_scheduler.operations.expressions import Expression
from qblox_scheduler.operations.loop_domains import LinearDomain
from qblox_scheduler.operations.variables import Variable
[docs]
class Loop(Step):
"""Experiment step that loops other steps over some values."""
def __init__(self, domains: dict[Variable, LinearDomain], steps: list[Step]) -> None:
super().__init__(f"loop steps over {domains}")
self.data["loop_info"] = {
"domains": domains,
"steps": steps,
}
@property
[docs]
def domains(self) -> dict[Variable, LinearDomain]:
"""Domains to loop over."""
return self.data["loop_info"]["domains"]
@property
[docs]
def steps(self) -> list[Step]:
"""Steps to execute."""
return self.data["loop_info"]["steps"]
[docs]
def run(self, device: QuantumDevice, timeout: int = 10) -> Dataset | None:
"""Execute step on quantum device."""
if not self.domains:
return
data_set = None
nsteps = len(next(iter(self.domains.values())))
values = {var: iter(dom.values()) for var, dom in self.domains.items()}
for _ in range(nsteps):
substitutions: dict[Expression, Expression | int | float | complex] = {
var: next(values) for var, values in values.items()
}
for step in self.steps:
sub_step = step.substitute(substitutions)
sub_data_set = sub_step.run(device, timeout=timeout)
if sub_data_set is not None:
if data_set is None:
data_set = sub_data_set
else:
data_set = merge_acquisition_sets(data_set, sub_data_set)
return data_set