Source code for geqo.operations.measurement

from geqo.__logger__ import get_logger
from geqo.core.quantum_circuit import Sequence
from geqo.core.quantum_operation import QuantumOperation

logger = get_logger(__name__)


[docs] class Measure(QuantumOperation): """This class allows to define a measurement operation. The argument ```numberQubits``` specifies the number of measured qubits. Besides the specified number of qubits, this operation also acts on the same number of classical bits for storing the measurement result. """ def __init__(self, numberQubits): """ The constructor of this class takes a number of qubits. Note that it also needs the same number of classical bits for storing the results of a measurement. Parameters ---------- numberQubits : int The number of qubits, which this gate acts on. This is identical to the number of classical bits. Returns ------- Measure : geqo.operations.measurement.Measure An object of this class that corresponds to the gate with the provided number of qubits. """ self.numberQubits = numberQubits def __repr__(self): """ Returns ------- string_representation : String Representation of the object as character string. """ return "Measure(" + str(self.numberQubits) + ")" def __eq__(self, other): """ Comparator with other objects. Parameters ---------- other : An object, which should be compared to this object. Returns ------- True : If the provided object is of the same type and if has the same number of qubits. False : else """ if not isinstance(other, Measure): return False else: return self.numberQubits == other.numberQubits
[docs] def getInverse(self): """ Calling this method raises an exception because this operation has no inverse. """ raise Exception("Measure has no inverse")
[docs] def getEquivalentSequence(self): """ Return a sequence, which is equivalent to this operation. A ```Sequence``` object is returned with this operation as only component in the list of operations. Returns ------- Sequence : geqo.core.quantum_circuits.Sequence An object of the class```Sequence``` is returned with this operation and the appropriate quantum and classical targets in it. """ numberQubits = self.getNumberQubits() allQubits = list(range(numberQubits)) numberBits = self.getNumberQubits() allBits = list(range(numberBits)) return Sequence(allBits, allQubits, [(self, allQubits, allBits)])
[docs] def getNumberQubits(self): """ Return the number of qubits that are used by this operation. Returns ------- numberQubits : int The number of qubits, which are used by this BasicGate. """ return self.numberQubits
[docs] def getNumberClassicalBits(self): """ Returns ------- numberBits : int The number of classical bits, which are used by this operation. """ return self.numberQubits
[docs] def hasDecomposition(self): """ Returns ------- False : Bool This operation is considered to be as a non-decomposable operation. """ return False
[docs] def isUnitary(self): """ Returns ------- False : Bool This is not a unitary operation. """ return False
[docs] class DropQubits(QuantumOperation): """This operation allows to specify that a number of qubits are dropped from the system. This means, that the number of qubits of the system is reduced and the resulting state of the smaller system is calculated by tracing out the dropped qubits. For instance, ```DropQubits(1)``` corresponds to tracing out one qubit. """ def __init__(self, numberQubits): """ The constructor of this class takes a number of qubits. Parameters ---------- numberQubits : int The number of qubits, which this gate acts on. Returns ------- DropQubits : geqo.operations.measurement.DropQubits An object of this class that corresponds to the gate with the provided number of qubits. """ self.numberQubits = numberQubits def __repr__(self): """ Returns ------- string_representation : String Representation of the object as character string. """ return "DropQubits(" + str(self.numberQubits) + ")" def __eq__(self, other): """ Comparator with other objects. Parameters ---------- other : An object, which should be compared to this object. Returns ------- True : If the provided object is of the same type and if has the same number of qubits. False : else """ if not isinstance(other, DropQubits): return False else: return self.numberQubits == other.numberQubits
[docs] def getInverse(self): """ Calling this method raises an exception because this operation has no inverse. """ raise Exception("DropQubits has no inverse")
[docs] def getEquivalentSequence(self): """ Return a sequence, which is equivalent to this operation. A ```Sequence``` object is returned with this operation as only component in the list of operations. Returns ------- Sequence : geqo.core.quantum_circuits.Sequence An object of the class```Sequence``` is returned with this operation and the appropriate quantum targets in it. """ numberQubits = self.getNumberQubits() allQubits = list(range(numberQubits)) numberBits = self.getNumberClassicalBits() allBits = list(range(numberBits)) return Sequence(allBits, allQubits, [(self, allQubits)])
[docs] def getNumberQubits(self): """ Return the number of qubits that are used by this operation. Returns ------- numberQubits : int The number of qubits, which are used by this BasicGate. """ return self.numberQubits
[docs] def getNumberClassicalBits(self): """ Returns ------- 0 : int The number of classical bits, which are used by PermuteQubits, is zero. """ return 0
[docs] def hasDecomposition(self): """ Returns ------- False : Bool This operation is considered to be as a non-decomposable operation. """ return False
[docs] def isUnitary(self): """ Returns ------- False : Bool This is not a unitary operation. """ return False