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)
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
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
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)
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")
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
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
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])
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")
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"), ]
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("__")
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
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")
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_"), ], )
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("__")
def c(a: str, b: str) -> bool: return stim.PauliString(a).commutes(stim.PauliString(b))
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)
def test_identity(): p = stim.PauliString(3) assert len(p) == 3 assert p[0] == p[1] == p[2] == 0 assert p.sign == +1
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")
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))
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")