Пример #1
0
 def __init__(
     self,
     kraus_ops: Iterable[np.ndarray],
     key: Union[str, value.MeasurementKey, None] = None,
     validate: bool = False,
 ):
     kraus_ops = list(kraus_ops)
     if not kraus_ops:
         raise ValueError('KrausChannel must have at least one operation.')
     num_qubits = np.log2(kraus_ops[0].shape[0])
     if not num_qubits.is_integer(
     ) or kraus_ops[0].shape[1] != kraus_ops[0].shape[0]:
         raise ValueError(
             f'Input Kraus ops of shape {kraus_ops[0].shape} does not '
             'represent a square operator over qubits.')
     self._num_qubits = int(num_qubits)
     for i, op in enumerate(kraus_ops):
         if not op.shape == kraus_ops[0].shape:
             raise ValueError(
                 'Inconsistent Kraus operator shapes: '
                 f'op[0]: {kraus_ops[0].shape}, op[{i}]: {op.shape}')
     if validate and not linalg.is_cptp(kraus_ops=kraus_ops):
         raise ValueError('Kraus operators do not describe a CPTP map.')
     self._kraus_ops = kraus_ops
     if not isinstance(key, value.MeasurementKey) and key is not None:
         key = value.MeasurementKey(key)
     self._key = key
Пример #2
0
 def __init__(
     self,
     mixture: Iterable[Tuple[float, np.ndarray]],
     key: Union[str, value.MeasurementKey, None] = None,
     validate: bool = False,
 ):
     mixture = list(mixture)
     if not mixture:
         raise ValueError('MixedUnitaryChannel must have at least one unitary.')
     if not protocols.approx_eq(sum(p[0] for p in mixture), 1):
         raise ValueError('Unitary probabilities must sum to 1.')
     m0 = mixture[0][1]
     num_qubits = np.log2(m0.shape[0])
     if not num_qubits.is_integer() or m0.shape[1] != m0.shape[0]:
         raise ValueError(
             f'Input mixture of shape {m0.shape} does not '
             'represent a square operator over qubits.'
         )
     self._num_qubits = int(num_qubits)
     for i, op in enumerate(p[1] for p in mixture):
         if not op.shape == m0.shape:
             raise ValueError(
                 f'Inconsistent unitary shapes: op[0]: {m0.shape}, op[{i}]: {op.shape}'
             )
         if validate and not linalg.is_unitary(op):
             raise ValueError(f'Element {i} of mixture is non-unitary.')
     self._mixture = mixture
     if not isinstance(key, value.MeasurementKey) and key is not None:
         key = value.MeasurementKey(key)
     self._key = key
Пример #3
0
    def __init__(
        self,
        num_qubits: Optional[int] = None,
        key: Union[str, 'cirq.MeasurementKey'] = '',
        invert_mask: Tuple[bool, ...] = (),
        qid_shape: Tuple[int, ...] = None,
    ) -> None:
        """Inits MeasurementGate.

        Args:
            num_qubits: The number of qubits to act upon.
            key: The string key of the measurement.
            invert_mask: A list of values indicating whether the corresponding
                qubits should be flipped. The list's length must not be longer
                than the number of qubits, but it is permitted to be shorter.
                Qubits with indices past the end of the mask are not flipped.
            qid_shape: Specifies the dimension of each qid the measurement
                applies to.  The default is 2 for every qubit.

        Raises:
            ValueError: If the length of invert_mask is greater than num_qubits.
                or if the length of qid_shape doesn't equal num_qubits.
        """
        if qid_shape is None:
            if num_qubits is None:
                raise ValueError(
                    'Specify either the num_qubits or qid_shape argument.')
            qid_shape = (2, ) * num_qubits
        elif num_qubits is None:
            num_qubits = len(qid_shape)
        if num_qubits == 0:
            raise ValueError('Measuring an empty set of qubits.')
        self._qid_shape = qid_shape
        if len(self._qid_shape) != num_qubits:
            raise ValueError('len(qid_shape) != num_qubits')
        self._mkey = (key if isinstance(key, value.MeasurementKey) else
                      value.MeasurementKey(name=key))
        self._invert_mask = invert_mask or ()
        if self.invert_mask is not None and len(
                self.invert_mask) > self.num_qubits():
            raise ValueError('len(invert_mask) > num_qubits')
Пример #4
0
    def __init__(
        self,
        observable: Union['cirq.BaseDensePauliString', Iterable['cirq.Pauli']],
        key: Union[str, 'cirq.MeasurementKey'] = '',
    ) -> None:
        """Inits PauliMeasurementGate.

        Args:
            observable: Pauli observable to measure. Any `Iterable[cirq.Pauli]`
                is a valid Pauli observable (with a +1 coefficient by default).
                If you wish to measure pauli observables with coefficient -1,
                then pass a `cirq.DensePauliString` as observable.
            key: The string key of the measurement.

        Raises:
            ValueError: If the observable is empty.
        """
        if not observable:
            raise ValueError(f'Pauli observable {observable} is empty.')
        if not all(
                isinstance(p, pauli_gates.Pauli)
                for p in cast(Iterable['cirq.Gate'], observable)):
            raise ValueError(
                f'Pauli observable {observable} must be Iterable[`cirq.Pauli`].'
            )
        coefficient = (observable.coefficient if isinstance(
            observable, dps.BaseDensePauliString) else 1)
        if coefficient not in [+1, -1]:
            raise ValueError(
                f'`cirq.DensePauliString` observable {observable} must have coefficient +1/-1.'
            )

        self._observable = dps.DensePauliString(observable,
                                                coefficient=coefficient)
        self._mkey = (key if isinstance(key, value.MeasurementKey) else
                      value.MeasurementKey(name=key))
Пример #5
0
 def key(self, key: Union[str, value.MeasurementKey]) -> None:
     if isinstance(key, str):
         key = value.MeasurementKey(name=key)
     self.mkey = key
Пример #6
0
 def key(self, key: Union[str, value.MeasurementKey]):
     if isinstance(key, value.MeasurementKey):
         self.mkey = key
     else:
         self.mkey = value.MeasurementKey(name=key)
Пример #7
0
 def key(self, key: Union[str, 'cirq.MeasurementKey']):
     if isinstance(key, str):
         key = value.MeasurementKey(name=key)
     self._mkey = key
Пример #8
0
 def key(self, key_str: str):
     self.mkey = value.MeasurementKey(key_str)