def _pass_single_clifford_gate_over(pauli_map: Dict[raw_types.QubitId, Pauli], gate: CliffordGate, qubit: raw_types.QubitId, after_to_before: bool = False) -> bool: if qubit not in pauli_map: return False if not after_to_before: gate = gate.inverse() pauli, inv = gate.transform(pauli_map[qubit]) pauli_map[qubit] = pauli return inv
def default_decompose(self, qubits: Sequence[raw_types.QubitId] ) -> op_tree.OP_TREE: q0, q1 = qubits right_gate0 = CliffordGate.from_single_map( z_to=(self.pauli0, self.invert0)) right_gate1 = CliffordGate.from_single_map( z_to=(self.pauli1, self.invert1)) left_gate0 = right_gate0.inverse() left_gate1 = right_gate1.inverse() yield left_gate0(q0) yield left_gate1(q1) yield common_gates.Rot11Gate(half_turns=self._exponent)(q0, q1) yield right_gate0(q0) yield right_gate1(q1)
def pauli_string_to_z_ops( pauli_string: PauliString) -> Iterable[ops.Operation]: """Yields the single qubit operations to apply before a Pauli string of Zs (and apply the inverse of these operations after) to make it equivalent to the given pauli_string.""" for qubit, pauli in pauli_string.items(): yield CliffordGate.from_single_map({pauli: (Pauli.Z, False)})(qubit)
def to_z_basis_ops(self) -> op_tree.OP_TREE: """Returns operations to convert the qubits to the computational basis. """ for qubit, pauli in self.items(): yield CliffordGate.from_single_map({pauli: (Pauli.Z, False)})(qubit)