Source code for qctoolkit.pulses.loop_pulse_template

from typing import Dict, Set, Optional, Any

"""RELATED THIRD PARTY IMPORTS"""

"""LOCAL IMPORTS"""
from qctoolkit.serialization import Serializer

from qctoolkit.pulses.parameters import Parameter
from qctoolkit.pulses.pulse_template import PulseTemplate, MeasurementWindow
from qctoolkit.pulses.conditions import Condition, ConditionMissingException
from qctoolkit.pulses.instructions import InstructionBlock
from qctoolkit.pulses.sequencing import Sequencer

__all__ = ['LoopPulseTemplate', 'ConditionMissingException']


[docs]class LoopPulseTemplate(PulseTemplate): """Conditional looping in a pulse. A LoopPulseTemplate is a PulseTemplate which is repeated during execution as long as a certain condition holds. """ def __init__(self, condition: str, body: PulseTemplate, identifier: Optional[str]=None) -> None: super().__init__(identifier=identifier) self.__condition = condition self.__body = body def __str__(self) -> str: return "LoopPulseTemplate: Condition <{}>, Body <{}>".format(self.__condition, self.__body) @property def body(self) -> PulseTemplate: return self.__body @property def condition(self) -> str: return self.__condition @property def parameter_names(self) -> Set[str]: return self.__body.parameter_names
[docs] def get_measurement_windows(self, parameters: Dict[str, Parameter] = None) -> MeasurementWindow: raise NotImplemented()
@property def parameter_declarations(self) -> Set[str]: return self.__body.parameter_declarations @property def is_interruptable(self) -> bool: return self.__body.is_interruptable def __obtain_condition_object(self, conditions: Dict[str, Condition]) -> Condition: try: return conditions[self.__condition] except: raise ConditionMissingException(self.__condition)
[docs] def build_sequence(self, sequencer: Sequencer, parameters: Dict[str, Parameter], conditions: Dict[str, Condition], instruction_block: InstructionBlock) -> None: self.__obtain_condition_object(conditions).build_sequence_loop(self, self.__body, sequencer, parameters, conditions, instruction_block)
[docs] def requires_stop(self, parameters: Dict[str, Parameter], conditions: Dict[str, Condition]) -> bool: return self.__obtain_condition_object(conditions).requires_stop()
[docs] def get_serialization_data(self, serializer: Serializer) -> Dict[str, Any]: data = dict( type=serializer.get_type_identifier(self), condition=self.__condition, body=serializer._serialize_subpulse(self.__body) ) return data
@staticmethod
[docs] def deserialize(serializer: Serializer, condition: str, body: Dict[str, Any], identifier: Optional[str]=None) -> 'LoopPulseTemplate': body = serializer.deserialize(body) return LoopPulseTemplate(condition, body, identifier=identifier)