def _matrix_to_pauli_string_phasors(self, mat: np.ndarray,
                                     qubit: ops.QubitId) -> ops.OP_TREE:
     rotations = decompositions.single_qubit_matrix_to_pauli_rotations(
         mat, self.tolerance)
     for pauli, half_turns in rotations:
         pauli_string = ops.PauliString.from_single(qubit, pauli)
         yield PauliStringPhasor(pauli_string, half_turns=half_turns)
 def _matrix_to_pauli_string_phasors(self,
                                     mat: np.ndarray,
                                     qubit: ops.QubitId) -> ops.OP_TREE:
     rotations = decompositions.single_qubit_matrix_to_pauli_rotations(
                                    mat, self.tolerance)
     for pauli, half_turns in rotations:
         pauli_string = ops.PauliString.from_single(qubit, pauli)
         yield PauliStringPhasor(pauli_string, half_turns=half_turns)
Exemplo n.º 3
0
 def _matrix_to_clifford_op(self, mat: np.ndarray, qubit: ops.QubitId
                            ) -> Optional[ops.Operation]:
     rotations = decompositions.single_qubit_matrix_to_pauli_rotations(
                                    mat, self.tolerance)
     clifford_gate = ops.CliffordGate.I
     for pauli, half_turns in rotations:
         if self._tol.all_near_zero_mod(half_turns, 0.5):
             clifford_gate = clifford_gate.merged_with(
                 self._rotation_to_clifford_gate(pauli, half_turns))
         else:
             return None
     return clifford_gate(qubit)
 def _matrix_to_pauli_string_phasors(self, mat: np.ndarray,
                                     qubit: ops.QubitId) -> ops.OP_TREE:
     rotations = decompositions.single_qubit_matrix_to_pauli_rotations(
         mat, self.tolerance)
     out_ops = []  # type: List[ops.Operation]
     for pauli, half_turns in rotations:
         if (self.keep_clifford
                 and self._tol.all_near_zero_mod(half_turns, 0.5)):
             cliff_gate = ops.CliffordGate.from_quarter_turns(
                 pauli, round(half_turns * 2))
             if out_ops and not isinstance(out_ops[-1], PauliStringPhasor):
                 op = cast(ops.GateOperation, out_ops[-1])
                 gate = cast(ops.CliffordGate, op.gate)
                 out_ops[-1] = gate.merged_with(cliff_gate)(qubit)
             else:
                 out_ops.append(cliff_gate(qubit))
         else:
             pauli_string = ops.PauliString.from_single(qubit, pauli)
             out_ops.append(
                 PauliStringPhasor(pauli_string, half_turns=half_turns))
     return out_ops