Пример #1
0
    def _unitary_(self) -> Union[np.ndarray, NotImplementedType]:
        qubits = cirq.LineQid.for_gate(self)
        op = self.sub_gate.on(*qubits[self.num_controls():])
        c_op = cop.ControlledOperation(qubits[:self.num_controls()], op,
                                       self.control_values)

        return protocols.unitary(c_op, default=NotImplemented)
Пример #2
0
    def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
        qubits = cirq.LineQubit.range(self.num_controls() +
                                      self.sub_gate.num_qubits())
        op = self.sub_gate.on(*qubits[self.num_controls():])
        c_op = cop.ControlledOperation(qubits[:self.num_controls()], op)

        return protocols.apply_unitary(c_op, args, default=NotImplemented)
Пример #3
0
 def _apply_unitary_(self,
                     args: 'protocols.ApplyUnitaryArgs') -> np.ndarray:
     qubits = cirq.LineQid.for_gate(self)
     op = self.sub_gate.on(*qubits[self.num_controls():])
     c_op = cop.ControlledOperation(qubits[:self.num_controls()], op,
                                    self.control_values)
     return protocols.apply_unitary(c_op, args, default=NotImplemented)
Пример #4
0
    def _decompose_(self, qubits):
        result = protocols.decompose_once_with_qubits(self.sub_gate,
                                                      qubits[1:],
                                                      NotImplemented)
        if result is NotImplemented:
            return NotImplemented

        return [cop.ControlledOperation(qubits[0], op) for op in result]
Пример #5
0
 def on(self, *qubits: 'cirq.Qid') -> cop.ControlledOperation:
     if len(qubits) == 0:
         raise ValueError("Applied a gate to an empty set of qubits. Gate: {!r}".format(self))
     self.validate_args(qubits)
     return cop.ControlledOperation(
         qubits[: self.num_controls()],
         self.sub_gate.on(*qubits[self.num_controls() :]),
         self.control_values,
     )
Пример #6
0
    def _decompose_(self, qubits):
        result = protocols.decompose_once_with_qubits(
            self.sub_gate, qubits[self.num_controls():], NotImplemented)

        if result is NotImplemented:
            return NotImplemented

        decomposed = []
        for op in result:
            decomposed.append(
                cop.ControlledOperation(qubits[:self.num_controls()], op))
        return decomposed
Пример #7
0
    def _decompose_(self, qubits):
        if isinstance(self.sub_gate, matrix_gates.MatrixGate):
            # Default decompositions of 2/3 qubit `cirq.MatrixGate` ignores global phase, which is
            # local phase in the controlled variant and hence cannot be ignored.
            return NotImplemented

        result = protocols.decompose_once_with_qubits(
            self.sub_gate, qubits[self.num_controls():], NotImplemented)
        if result is NotImplemented:
            return NotImplemented

        decomposed: List['cirq.Operation'] = []
        for op in result:
            decomposed.append(
                cop.ControlledOperation(qubits[:self.num_controls()], op,
                                        self.control_values))
        return decomposed
Пример #8
0
    def on(self, *qubits: raw_types.Qid) -> cop.ControlledOperation:
        if len(qubits) == 0:
            raise ValueError(
                "Applied a gate to an empty set of qubits. Gate: {!r}".format(
                    self))
        self.validate_args(qubits)

        # Merge specified controls and new controls.
        merged_controls = []
        remaining_qubits = list(qubits)
        for control in self.control_qubits:
            if control is None:
                merged_controls.append(remaining_qubits.pop(0))
            else:
                merged_controls.append(control)

        return cop.ControlledOperation(merged_controls,
                                       self.sub_gate.on(*remaining_qubits))