def test_measure_kickback():
    s = stim.TableauSimulator()
    assert s.measure_kickback(0) == (False, None)
    assert s.measure_kickback(0) == (False, None)
    assert s.current_measurement_record() == [False, False]

    s.h(0)
    v = s.measure_kickback(0)
    assert isinstance(v[0], bool)
    assert v[1] == stim.PauliString("X")
    assert s.measure_kickback(0) == (v[0], None)
    assert s.current_measurement_record() == [False, False, v[0], v[0]]

    s = stim.TableauSimulator()
    s.h(0)
    s.cnot(0, 1)
    v = s.measure_kickback(0)
    assert isinstance(v[0], bool)
    assert v[1] == stim.PauliString("XX")
    assert s.measure_kickback(0) == (v[0], None)

    s = stim.TableauSimulator()
    s.h(0)
    s.cnot(0, 1)
    v = s.measure_kickback(1)
    assert isinstance(v[0], bool)
    assert v[1] == stim.PauliString("XX")
    assert s.measure_kickback(0) == (v[0], None)
Example #2
0
def test_init_copy():
    p = stim.PauliString("_XYZ")
    p2 = stim.PauliString(p)
    assert p is not p2
    assert p == p2

    p = stim.PauliString("-i_XYZ")
    p2 = stim.PauliString(p)
    assert p is not p2
    assert p == p2
Example #3
0
def test_copy():
    p = stim.PauliString(3)
    p2 = p.copy()
    assert p == p2
    assert p is not p2

    p = stim.PauliString("-i_XYZ")
    p2 = p.copy()
    assert p == p2
    assert p is not p2
Example #4
0
def test_commutes_different_lengths():
    x1000 = stim.PauliString("X" * 1000)
    z1000 = stim.PauliString("Z" * 1000)
    x1 = stim.PauliString("X")
    z1 = stim.PauliString("Z")
    assert x1.commutes(x1000)
    assert x1000.commutes(x1)
    assert z1.commutes(z1000)
    assert z1000.commutes(z1)
    assert not z1.commutes(x1000)
    assert not x1000.commutes(z1)
    assert not x1.commutes(z1000)
    assert not z1000.commutes(x1)
Example #5
0
def test_imaginary_phase():
    p = stim.PauliString("IXYZ")
    ip = stim.PauliString("iIXYZ")
    assert 1j * p == p * 1j == ip == -stim.PauliString("-iIXYZ")
    assert p.sign == 1
    assert (-p).sign == -1
    assert ip.sign == 1j
    assert (-ip).sign == -1j
    assert stim.PauliString("X") * stim.PauliString(
        "Y") == 1j * stim.PauliString("Z")
    assert stim.PauliString("Y") * stim.PauliString(
        "X") == -1j * stim.PauliString("Z")
def test_identity():
    t = stim.Tableau(3)
    assert len(t) == 3
    assert t.x_output(0) == stim.PauliString("X__")
    assert t.x_output(1) == stim.PauliString("_X_")
    assert t.x_output(2) == stim.PauliString("__X")
    assert t.z_output(0) == stim.PauliString("Z__")
    assert t.z_output(1) == stim.PauliString("_Z_")
    assert t.z_output(2) == stim.PauliString("__Z")
    assert t.y_output(0) == stim.PauliString("Y__")
    assert t.y_output(1) == stim.PauliString("_Y_")
    assert t.y_output(2) == stim.PauliString("__Y")
Example #7
0
def test_from_str():
    p = stim.PauliString("-_XYZ_ZYX")
    assert len(p) == 8
    assert p[0] == 0
    assert p[1] == 1
    assert p[2] == 2
    assert p[3] == 3
    assert p[4] == 0
    assert p[5] == 3
    assert p[6] == 2
    assert p[7] == 1
    assert p.sign == -1

    p = stim.PauliString("")
    assert len(p) == 0
    assert p.sign == +1
def test_set_num_qubits():
    s = stim.TableauSimulator()
    s.h(0)
    s.cnot(0, 1)
    s.cnot(0, 2)
    s.cnot(0, 3)
    t = s.current_inverse_tableau()
    s.set_num_qubits(8)
    s.set_num_qubits(4)
    assert s.current_inverse_tableau() == t
    assert s.peek_bloch(0) == stim.PauliString("_")
    s.set_num_qubits(8)
    s.set_num_qubits(4)
    s.cnot(0, 4)
    s.set_num_qubits(4)
    assert s.peek_bloch(0) in [stim.PauliString("+Z"), stim.PauliString("-Z")]
def test_paulis():
    s = stim.TableauSimulator()
    s.h(*range(0, 22, 2))
    s.cnot(*range(22))

    s.do(stim.PauliString("ZZZ_YYY_XXX"))
    s.z(0, 1, 2)
    s.y(4, 5, 6)
    s.x(8, 9, 10)

    s.cnot(*range(22))
    s.h(*range(0, 22, 2))
    assert s.measure_many(*range(22)) == [False] * 22

    s = stim.TableauSimulator()
    s.do(stim.PauliString("Z" * 500))
    assert s.measure_many(*range(500)) == [False] * 500
    s.do(stim.PauliString("X" * 500))
    assert s.measure_many(*range(500)) == [True] * 500
Example #10
0
def test_get_set_sign():
    p = stim.PauliString(2)
    assert p.sign == +1
    p.sign = -1
    assert str(p) == "-__"
    assert p.sign == -1
    p.sign = +1
    assert str(p) == "+__"
    assert p.sign == +1
    with pytest.raises(ValueError, match="new_sign"):
        p.sign = 5
Example #11
0
def test_init_list():
    assert stim.PauliString([]) == stim.PauliString(0)
    assert stim.PauliString([0, 1, 2, 3]) == stim.PauliString("_XYZ")

    with pytest.raises(ValueError, match="pauli"):
        _ = stim.PauliString([-1])
    with pytest.raises(ValueError, match="pauli"):
        _ = stim.PauliString([4])
    with pytest.raises(TypeError):
        _ = stim.PauliString([2**500])
Example #12
0
def test_repr():
    assert repr(stim.PauliString(3)) == 'stim.PauliString("+___")'
    assert repr(stim.PauliString("-XYZ")) == 'stim.PauliString("-XYZ")'
    vs = [
        stim.PauliString(""),
        stim.PauliString("ZXYZZ"),
        stim.PauliString("-XYZ"),
        stim.PauliString("I"),
        stim.PauliString("iIXYZ"),
        stim.PauliString("-iIXYZ"),
    ]
    for v in vs:
        r = repr(v)
        assert eval(r, {'stim': stim}) == v
def test_access_tableau():
    s = stim.TableauSimulator()
    assert s.current_inverse_tableau() == stim.Tableau(0)

    s.h(0)
    assert s.current_inverse_tableau() == stim.Tableau.from_named_gate("H")

    s.h(0)
    assert s.current_inverse_tableau() == stim.Tableau(1)

    s.h(1)
    s.h(1)
    assert s.current_inverse_tableau() == stim.Tableau(2)

    s.h(2)
    assert s.current_inverse_tableau(
    ) == stim.Tableau.from_conjugated_generators(
        xs=[
            stim.PauliString("X__"),
            stim.PauliString("_X_"),
            stim.PauliString("__Z"),
        ],
        zs=[
            stim.PauliString("Z__"),
            stim.PauliString("_Z_"),
            stim.PauliString("__X"),
        ],
    )
def test_peek_bloch():
    s = stim.TableauSimulator()
    assert s.peek_bloch(0) == stim.PauliString("+Z")
    s.x(0)
    assert s.peek_bloch(0) == stim.PauliString("-Z")
    s.h(0)
    assert s.peek_bloch(0) == stim.PauliString("-X")
    s.sqrt_x(1)
    assert s.peek_bloch(1) == stim.PauliString("-Y")
    s.cz(0, 1)
    assert s.peek_bloch(0) == stim.PauliString("+I")
    assert s.peek_bloch(1) == stim.PauliString("+I")
Example #15
0
def test_get_set_item():
    p = stim.PauliString(5)
    assert list(p) == [0, 0, 0, 0, 0]
    assert p[0] == 0
    p[0] = 1
    assert p[0] == 1
    p[0] = 'Y'
    assert p[0] == 2
    p[0] = 'Z'
    assert p[0] == 3

    with pytest.raises(IndexError, match="new_pauli"):
        p[0] = 't'
    with pytest.raises(IndexError, match="new_pauli"):
        p[0] = 10

    assert p[1] == 0
    p[1] = 2
    assert p[1] == 2
def test_canonical_stabilizers():
    s = stim.TableauSimulator()
    s.h(0)
    s.h(1)
    s.h(2)
    s.cz(0, 1)
    s.cz(1, 2)
    assert s.canonical_stabilizers() == [
        stim.PauliString("+X_X"),
        stim.PauliString("+ZXZ"),
        stim.PauliString("+_ZX"),
    ]
    s.s(1)
    assert s.canonical_stabilizers() == [
        stim.PauliString("+X_X"),
        stim.PauliString("-ZXY"),
        stim.PauliString("+_ZX"),
    ]
Example #17
0
def test_equality():
    assert stim.PauliString(4) == stim.PauliString(4)
    assert stim.PauliString(3) != stim.PauliString(4)
    assert not (stim.PauliString(4) != stim.PauliString(4))
    assert not (stim.PauliString(3) == stim.PauliString(4))

    assert stim.PauliString("+X") == stim.PauliString("+X")
    assert stim.PauliString("+X") != stim.PauliString("-X")
    assert stim.PauliString("+X") != stim.PauliString("+Y")
    assert stim.PauliString("+X") != stim.PauliString("-Y")

    assert stim.PauliString("__") != stim.PauliString("_X")
    assert stim.PauliString("__") != stim.PauliString("X_")
    assert stim.PauliString("__") != stim.PauliString("XX")
    assert stim.PauliString("__") == stim.PauliString("__")
Example #18
0
def test_repr():
    assert repr(stim.PauliString(3)) == 'stim.PauliString("+___")'
    v = stim.PauliString("-XYZ")
    r = repr(v)
    assert r == 'stim.PauliString("-XYZ")'
    assert eval(r, {'stim': stim}) == v
Example #19
0
def test_product():
    assert stim.PauliString("") * stim.PauliString("") == stim.PauliString("")

    x = stim.PauliString("X")
    y = stim.PauliString("Y")
    z = stim.PauliString("Z")

    assert x == +1 * x == x * +1 == +x
    assert x * -1 == -x == -1 * x
    assert (-x)[0] == 1
    assert (-x).sign == -1
    assert -(-x) == x

    with pytest.raises(ValueError, match="!= len"):
        _ = stim.PauliString(10) * stim.PauliString(11)
    with pytest.raises(ValueError, match="!= len"):
        _ = stim.PauliString(10).extended_product(stim.PauliString(11))

    with pytest.raises(ValueError, match="non-commut"):
        _ = x * z
    assert x * x == stim.PauliString(1)
    assert x.extended_product(y) == (1j, z)
    assert y.extended_product(x) == (1j, -z)
    assert x.extended_product(x) == (1, stim.PauliString(1))

    xx = stim.PauliString("+XX")
    yy = stim.PauliString("+YY")
    zz = stim.PauliString("+ZZ")
    assert xx * zz == -yy
    assert xx.extended_product(zz) == (1, -yy)
def test_pauli_output():
    h = stim.Tableau.from_named_gate("H")
    assert h.x_output(0) == stim.PauliString("Z")
    assert h.y_output(0) == stim.PauliString("-Y")
    assert h.z_output(0) == stim.PauliString("X")

    s = stim.Tableau.from_named_gate("S")
    assert s.x_output(0) == stim.PauliString("Y")
    assert s.y_output(0) == stim.PauliString("-X")
    assert s.z_output(0) == stim.PauliString("Z")

    s_dag = stim.Tableau.from_named_gate("S_DAG")
    assert s_dag.x_output(0) == stim.PauliString("-Y")
    assert s_dag.y_output(0) == stim.PauliString("X")
    assert s_dag.z_output(0) == stim.PauliString("Z")

    cz = stim.Tableau.from_named_gate("CZ")
    assert cz.x_output(0) == stim.PauliString("XZ")
    assert cz.y_output(0) == stim.PauliString("YZ")
    assert cz.z_output(0) == stim.PauliString("Z_")
    assert cz.x_output(1) == stim.PauliString("ZX")
    assert cz.y_output(1) == stim.PauliString("ZY")
    assert cz.z_output(1) == stim.PauliString("_Z")
Example #21
0
def test_str():
    assert str(stim.PauliString(3)) == "+___"
    assert str(stim.PauliString("XYZ")) == "+XYZ"
    assert str(stim.PauliString("-XYZ")) == "-XYZ"
    assert str(stim.PauliString("iXYZ")) == "+iXYZ"
    assert str(stim.PauliString("-iXYZ")) == "-iXYZ"
def test_from_conjugated_generators():
    assert stim.Tableau(3) == stim.Tableau.from_conjugated_generators(
        xs=[
            stim.PauliString("X__"),
            stim.PauliString("_X_"),
            stim.PauliString("__X"),
        ],
        zs=[
            stim.PauliString("Z__"),
            stim.PauliString("_Z_"),
            stim.PauliString("__Z"),
        ],
    )

    assert stim.Tableau.from_named_gate(
        "S") == stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("Y"),
            ],
            zs=[
                stim.PauliString("Z"),
            ],
        )

    assert stim.Tableau.from_named_gate(
        "S_DAG") == stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("-Y"),
            ],
            zs=[
                stim.PauliString("Z"),
            ],
        )

    assert stim.Tableau(2) == stim.Tableau.from_conjugated_generators(
        xs=[
            stim.PauliString("X_"),
            stim.PauliString("_X"),
        ],
        zs=[
            stim.PauliString("Z_"),
            stim.PauliString("_Z"),
        ],
    )

    with pytest.raises(ValueError, match=re.escape("len(p) == len(zs)")):
        stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("X_"),
                stim.PauliString("_X"),
            ],
            zs=[
                stim.PauliString("Z_"),
                stim.PauliString("_Z_"),
            ],
        )

    with pytest.raises(ValueError, match="imag"):
        stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("iX_"),
                stim.PauliString("_X"),
            ],
            zs=[
                stim.PauliString("Z_"),
                stim.PauliString("_Z"),
            ],
        )
    with pytest.raises(ValueError, match="imag"):
        stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("X_"),
                stim.PauliString("_X"),
            ],
            zs=[
                stim.PauliString("Z_"),
                stim.PauliString("i_Z"),
            ],
        )

    with pytest.raises(ValueError, match=re.escape("len(p) == len(xs)")):
        stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("X_"),
                stim.PauliString("_X_"),
            ],
            zs=[
                stim.PauliString("Z_"),
                stim.PauliString("_Z"),
            ],
        )

    with pytest.raises(ValueError, match=re.escape("len(xs) != len(zs)")):
        stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("X_"),
            ],
            zs=[
                stim.PauliString("Z_"),
                stim.PauliString("_Z"),
            ],
        )

    with pytest.raises(ValueError, match=re.escape("len(xs) != len(zs)")):
        stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("X_"),
                stim.PauliString("_X"),
            ],
            zs=[
                stim.PauliString("Z_"),
            ],
        )

    with pytest.raises(ValueError, match="commutativity"):
        stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("X_"),
                stim.PauliString("_Z"),
            ],
            zs=[
                stim.PauliString("Z_"),
                stim.PauliString("_Z"),
            ],
        )

    with pytest.raises(ValueError, match="commutativity"):
        stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("X_"),
                stim.PauliString("Z_"),
            ],
            zs=[
                stim.PauliString("Z_"),
                stim.PauliString("X_"),
            ],
        )

    with pytest.raises(ValueError, match="commutativity"):
        stim.Tableau.from_conjugated_generators(
            xs=[
                stim.PauliString("X_"),
                stim.PauliString("X_"),
            ],
            zs=[
                stim.PauliString("Z_"),
                stim.PauliString("Z_"),
            ],
        )
Example #23
0
def test_equality():
    assert not (stim.PauliString(4) == None)
    assert not (stim.PauliString(4) == "other object")
    assert not (stim.PauliString(4) == object())
    assert stim.PauliString(4) != None
    assert stim.PauliString(4) != "other object"
    assert stim.PauliString(4) != object()

    assert stim.PauliString(4) == stim.PauliString(4)
    assert stim.PauliString(3) != stim.PauliString(4)
    assert not (stim.PauliString(4) != stim.PauliString(4))
    assert not (stim.PauliString(3) == stim.PauliString(4))

    assert stim.PauliString("+X") == stim.PauliString("+X")
    assert stim.PauliString("+X") != stim.PauliString("-X")
    assert stim.PauliString("+X") != stim.PauliString("+Y")
    assert stim.PauliString("+X") != stim.PauliString("-Y")
    assert stim.PauliString("+X") != stim.PauliString("+iX")
    assert stim.PauliString("+X") != stim.PauliString("-iX")

    assert stim.PauliString("__") != stim.PauliString("_X")
    assert stim.PauliString("__") != stim.PauliString("X_")
    assert stim.PauliString("__") != stim.PauliString("XX")
    assert stim.PauliString("__") == stim.PauliString("__")
Example #24
0
 def c(a: str, b: str) -> bool:
     return stim.PauliString(a).commutes(stim.PauliString(b))
Example #25
0
def test_product():
    assert stim.PauliString("") * stim.PauliString("") == stim.PauliString("")
    assert stim.PauliString("i") * stim.PauliString("i") == stim.PauliString(
        "-")
    assert stim.PauliString("i") * stim.PauliString("-i") == stim.PauliString(
        "+")
    assert stim.PauliString("-i") * stim.PauliString("-i") == stim.PauliString(
        "-")
    assert stim.PauliString("i") * stim.PauliString("-") == stim.PauliString(
        "-i")

    x = stim.PauliString("X")
    y = stim.PauliString("Y")
    z = stim.PauliString("Z")

    assert x == +1 * x == x * +1 == +x
    assert x * -1 == -x == -1 * x
    assert (-x)[0] == 1
    assert (-x).sign == -1
    assert -(-x) == x

    assert stim.PauliString(10) * stim.PauliString(11) == stim.PauliString(11)

    assert x * z == stim.PauliString("-iY")
    assert x * x == stim.PauliString(1)
    assert x * y == stim.PauliString("iZ")
    assert y * x == stim.PauliString("-iZ")
    assert x * y == 1j * z
    assert y * x == z * -1j
    assert x.extended_product(y) == (1, 1j * z)
    assert y.extended_product(x) == (1, -1j * z)
    assert x.extended_product(x) == (1, stim.PauliString(1))

    xx = stim.PauliString("+XX")
    yy = stim.PauliString("+YY")
    zz = stim.PauliString("+ZZ")
    assert xx * zz == -yy
    assert xx.extended_product(zz) == (1, -yy)
Example #26
0
def test_identity():
    p = stim.PauliString(3)
    assert len(p) == 3
    assert p[0] == p[1] == p[2] == 0
    assert p.sign == +1
Example #27
0
def test_inplace_product():
    p = stim.PauliString("X")
    alias = p

    p *= 1j
    assert alias == stim.PauliString("iX")
    assert alias is p
    p *= 1j
    assert alias == stim.PauliString("-X")
    p *= 1j
    assert alias == stim.PauliString("-iX")
    p *= 1j
    assert alias == stim.PauliString("+X")

    p *= stim.PauliString("Z")
    assert alias == stim.PauliString("-iY")

    p *= -1j
    assert alias == stim.PauliString("-Y")
    p *= -1j
    assert alias == stim.PauliString("iY")
    p *= -1j
    assert alias == stim.PauliString("+Y")
    p *= -1j
    assert alias == stim.PauliString("-iY")

    p *= stim.PauliString("i_")
    assert alias == stim.PauliString("+Y")
    p *= stim.PauliString("i_")
    assert alias == stim.PauliString("iY")
    p *= stim.PauliString("i_")
    assert alias == stim.PauliString("-Y")
    p *= stim.PauliString("i_")
    assert alias == stim.PauliString("-iY")

    p *= stim.PauliString("-i_")
    assert alias == stim.PauliString("-Y")
    p *= stim.PauliString("-i_")
    assert alias == stim.PauliString("iY")
    p *= stim.PauliString("-i_")
    assert alias == stim.PauliString("+Y")
    p *= stim.PauliString("-i_")
    assert alias == stim.PauliString("-iY")

    assert alias is p
def test_call():
    t = stim.Tableau.from_named_gate("CNOT")
    assert t(stim.PauliString("__")) == stim.PauliString("__")
    assert t(stim.PauliString("-__")) == stim.PauliString("-__")
    assert t(stim.PauliString("i__")) == stim.PauliString("i__")
    assert t(stim.PauliString("-i__")) == stim.PauliString("-i__")
    assert t(stim.PauliString("X_")) == stim.PauliString("XX")
    assert t(stim.PauliString("Y_")) == stim.PauliString("YX")
    assert t(stim.PauliString("Z_")) == stim.PauliString("Z_")
    assert t(stim.PauliString("_X")) == stim.PauliString("_X")
    assert t(stim.PauliString("_Y")) == stim.PauliString("ZY")
    assert t(stim.PauliString("_Z")) == stim.PauliString("ZZ")
    assert t(stim.PauliString("YY")) == stim.PauliString("-XZ")
    assert t(stim.PauliString("-YY")) == stim.PauliString("XZ")
Example #29
0
def test_hash():
    # stim.PauliString is mutable. It must not also be value-hashable.
    # Defining __hash__ requires defining a FrozenPauliString variant instead.
    with pytest.raises(TypeError, match="unhashable"):
        _ = hash(stim.PauliString(1))
Example #30
0
def test_get_slice():
    p = stim.PauliString("XXXX__YYYY__ZZZZX")
    assert p[:7] == stim.PauliString("XXXX__Y")
    assert p[:-3] == stim.PauliString("XXXX__YYYY__ZZ")
    assert p[::2] == stim.PauliString("XX_YY_ZZX")
    assert p[::-1] == stim.PauliString("XZZZZ__YYYY__XXXX")
    assert p[-3:3] == stim.PauliString("")
    assert p[-6:-1] == stim.PauliString("_ZZZZ")
    assert p[3:5:-1] == stim.PauliString("")
    assert p[5:3:-1] == stim.PauliString("__")
    assert p[4:2:-1] == stim.PauliString("_X")
    assert p[2:0:-1] == stim.PauliString("XX")