Source code for quara.simulation.generation_setting

from typing import Union, Tuple, List
from abc import abstractmethod
import dataclasses

from quara.objects.qoperation import QOperation
from quara.objects.qoperation_typical import generate_qoperation
from quara.objects.state import State
from quara.objects.povm import Povm
from quara.objects.gate import Gate
from quara.objects.mprocess import MProcess


[docs]class QOperationGenerationSetting: def __init__( self, c_sys: "CompositeSystem", qoperation_base: Union[QOperation, Tuple[str]], ids: List[int] = None, is_seed_or_generator_required: bool = False, is_physicality_required: bool = True, ) -> None: self._composite_system = c_sys self._is_seed_or_generator_required = is_seed_or_generator_required self._is_physicality_required = is_physicality_required type_error_message = "Type of 'qoperation_base' must be QOperation or tuple of length 2 containing the string (`('state', 'z0')`, etc.), " type_error_message += f"not {type(qoperation_base)}" if isinstance(qoperation_base, QOperation): self._qoperation_base = qoperation_base elif type(qoperation_base) == tuple: # Validation if len(qoperation_base) != 2: raise TypeError(type_error_message) else: for item in qoperation_base: if type(item) != str: raise TypeError(type_error_message) # Generate QOperation object. qoperation_type = qoperation_base[0] qoperation_name = qoperation_base[1] self._qoperation_base = generate_qoperation( mode=qoperation_type, name=qoperation_name, c_sys=c_sys, ids=ids, is_physicality_required=is_physicality_required, ) else: raise TypeError(type_error_message) @property def composite_system(self): return self._composite_system @property def qoperation_base(self): return self._qoperation_base @property def is_seed_or_generator_required(self): return self._is_seed_or_generator_required
[docs] def generate(self): if type(self.qoperation_base) == State: return self.generate_state() if type(self.qoperation_base) == Povm: return self.generate_povm() if type(self.qoperation_base) == Gate: return self.generate_gate() if type(self.qoperation_base) == MProcess: return self.generate_mprocess() raise NotImplementedError()
[docs] @abstractmethod def generate_state(self): raise NotImplementedError()
[docs] @abstractmethod def generate_povm(self): raise NotImplementedError()
[docs] @abstractmethod def generate_gate(self): raise NotImplementedError()
[docs] @abstractmethod def generate_mprocess(self): raise NotImplementedError()
[docs]@dataclasses.dataclass class QOperationGenerationSettings: true_setting: QOperationGenerationSetting tester_settings: List[QOperationGenerationSetting]