Esempio n. 1
0
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
Esempio n. 2
0
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)
Esempio n. 3
0
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)")
Esempio n. 4
0
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()
Esempio n. 6
0
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}'