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)
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)
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)
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]
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, )
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
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
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))