def __init__(self, qubits, observable=Observable.Z()): """ - qubit (int): The index of the qubit - observable=Observable.Z() (matrix, tuple, or QNN-Gen Observable object): The observable to meausre with respect to - If matrix it should be a list or numpy.ndarray - If tuple, it should be of the form ("name": matrix) """ if isinstance(qubits, int): self.qubits = [qubits] else: self.qubits = qubits # just single-qubit for now if isinstance(observable, (list, np.ndarray)): self.observable = Observable(observable) elif isinstance(observable, tuple): self.observable = Observable(matrix=observable[1], name=observable[0]) elif isinstance(observable, Observable): self.observable = observable else: raise ValueError( "Observable argument is not a correct type. Check the __init__ docstring." ) if self.observable.name == "Z": requires_rotation = False else: requires_rotation = True super().__init__(qubits=self.qubits, rotate=requires_rotation)
def default_measurement(self, observable=None, measurement_qubit=None): """ Default measurement is the Z expectation of the measurement_qubit Inputs: - observable=None [Observable]: If None, defaults to Observable.Z() - measurement_qubit [int]: If None, defaults to self.measurement_quibt = n_qubits//2 Returns: - Expectation() measurement object """ from Observable import Observable from Measurement import Expectation if observable is None: observable = Observable.Z() if measurement_qubit is None: measurement_qubit = self.measurement_qubit expectation = Expectation(measurement_qubit, observable) return expectation