Source code for qupulse.pulses.measurement

from typing import Optional, List, Tuple, Union, Dict, Set, Mapping
from numbers import Real
import itertools

from qupulse.expressions import Expression
from qupulse.utils.types import MeasurementWindow
from qupulse.parameter_scope import Scope

MeasurementDeclaration = Tuple[str, Union[Expression, str, Real], Union[Expression, str, Real]]


[docs]class MeasurementDefiner: def __init__(self, measurements: Optional[List[MeasurementDeclaration]]): if measurements is None: self._measurement_windows = [] else: self._measurement_windows = [(name, begin if isinstance(begin, Expression) else Expression(begin), length if isinstance(length, Expression) else Expression(length)) for name, begin, length in measurements] for _, _, length in self._measurement_windows: if (length < 0) is True: raise ValueError('Measurement window length may not be negative')
[docs] def get_measurement_windows(self, parameters: Union[Mapping[str, Real], Scope], measurement_mapping: Dict[str, Optional[str]]) -> List[MeasurementWindow]: """Calculate measurement windows with the given parameter set and rename them woth the measurement mapping""" try: volatile = parameters.get_volatile_parameters().keys() except AttributeError: volatile = frozenset() resulting_windows = [] for name, begin, length in self._measurement_windows: name = measurement_mapping[name] if name is None: continue assert volatile.isdisjoint(begin.variables) and volatile.isdisjoint(length.variables), "volatile measurement parameters are not supported" begin_val = begin.evaluate_in_scope(parameters) length_val = length.evaluate_in_scope(parameters) if begin_val < 0 or length_val < 0: raise ValueError('Measurement window with negative begin or length: {}, {}'.format(begin, length)) resulting_windows.append( (name, begin_val, length_val) ) return resulting_windows
@property def measurement_parameters(self) -> Set[str]: return set(var for _, begin, length in self._measurement_windows for var in itertools.chain(begin.variables, length.variables)) @property def measurement_declarations(self) -> List[MeasurementDeclaration]: return [(name, begin.original_expression, length.original_expression) for name, begin, length in self._measurement_windows] @property def measurement_names(self) -> Set[str]: return {name for name, *_ in self._measurement_windows}