def test_negate(): q0, q1 = _make_qubits(2) qubit_pauli_map = {q0: Pauli.X, q1: Pauli.Y} ps1 = PauliString(qubit_pauli_map) ps2 = PauliString(qubit_pauli_map, True) assert ps1.negate() == -ps1 == ps2 assert ps1 == ps2.negate() == -ps2 assert ps1.negate().negate() == ps1
def test_pass_operations_over_single(shift, t_or_f): q0, q1 = _make_qubits(2) X, Y, Z = (pauli + shift for pauli in Pauli.XYZ) op0 = CliffordGate.from_pauli(Y)(q1) ps_before = PauliString({q0: X}, t_or_f) ps_after = ps_before _assert_pass_over([op0], ps_before, ps_after) op0 = CliffordGate.from_pauli(X)(q0) op1 = CliffordGate.from_pauli(Y)(q1) ps_before = PauliString({q0: X, q1: Y}, t_or_f) ps_after = ps_before _assert_pass_over([op0, op1], ps_before, ps_after) op0 = CliffordGate.from_double_map({Z: (X, False), X: (Z, False)})(q0) ps_before = PauliString({q0: X, q1: Y}, t_or_f) ps_after = PauliString({q0: Z, q1: Y}, t_or_f) _assert_pass_over([op0], ps_before, ps_after) op1 = CliffordGate.from_pauli(X)(q1) ps_before = PauliString({q0: X, q1: Y}, t_or_f) ps_after = ps_before.negate() _assert_pass_over([op1], ps_before, ps_after) ps_after = PauliString({q0: Z, q1: Y}, not t_or_f) _assert_pass_over([op0, op1], ps_before, ps_after)
def test_repr(): q0, q1, q2 = _make_qubits(3) pauli_string = PauliString({q2: Pauli.X, q1: Pauli.Y, q0: Pauli.Z}) assert (repr(pauli_string) == "PauliString({NamedQubit('q0'): Pauli.Z, " "NamedQubit('q1'): Pauli.Y, NamedQubit('q2'): Pauli.X}, False)") assert (repr( pauli_string.negate()) == "PauliString({NamedQubit('q0'): Pauli.Z, " "NamedQubit('q1'): Pauli.Y, NamedQubit('q2'): Pauli.X}, True)")
def test_eq_ne_hash(): q0, q1, q2 = _make_qubits(3) eq = cirq.testing.EqualsTester() ps1 = PauliString({q0: Pauli.X, q1: Pauli.Y, q2: Pauli.Z}) ps2 = PauliString({q0: Pauli.X, q1: Pauli.Y, q2: Pauli.X}) eq.make_equality_group( lambda: PauliStringPhasor(PauliString({}), half_turns=0.5), lambda: PauliStringPhasor(PauliString({}), half_turns=-1.5), lambda: PauliStringPhasor(PauliString({}), half_turns=2.5)) eq.make_equality_group( lambda: PauliStringPhasor(PauliString({}, True), half_turns=-0.5)) eq.add_equality_group(PauliStringPhasor(ps1), PauliStringPhasor(ps1, half_turns=1)) eq.add_equality_group(PauliStringPhasor(ps1.negate(), half_turns=1)) eq.add_equality_group(PauliStringPhasor(ps2), PauliStringPhasor(ps2, half_turns=1)) eq.add_equality_group(PauliStringPhasor(ps2.negate(), half_turns=1)) eq.add_equality_group(PauliStringPhasor(ps2, half_turns=0.5)) eq.add_equality_group(PauliStringPhasor(ps2.negate(), half_turns=-0.5)) eq.add_equality_group( PauliStringPhasor(ps1, half_turns=cirq.value.Symbol('a')))
def test_default_text_diagram(): class DiagramGate(PauliStringGateOperation, cirq.TextDiagrammable): def map_qubits(self, qubit_map): pass def text_diagram_info( self, args: cirq.TextDiagramInfoArgs) -> cirq.TextDiagramInfo: return self._pauli_string_diagram_info(args) q0, q1, q2 = _make_qubits(3) ps = PauliString({q0: Pauli.X, q1: Pauli.Y, q2: Pauli.Z}) circuit = cirq.Circuit.from_ops( DiagramGate(ps), DiagramGate(ps.negate()), ) assert circuit.to_text_diagram() == """ q0: ───[X]───[X]─── │ │ q1: ───[Y]───[Y]─── │ │ q2: ───[Z]───[Z]─── """.strip()
def test_str(): q0, q1, q2 = _make_qubits(3) pauli_string = PauliString({q2: Pauli.X, q1: Pauli.Y, q0: Pauli.Z}) assert str(pauli_string) == '{+, q0:Z, q1:Y, q2:X}' assert str(pauli_string.negate()) == '{-, q0:Z, q1:Y, q2:X}'