def test_apply_CZ(self):

        # Classical CNOT
        z0x0 = StabilizerState([[0, 0, 1, 0], [0, 1, 0, 0]])
        z1x1 = StabilizerState([[0, 0, 1, 0, 1], [0, 1, 0, 0, 1]])
        z0x0.apply_X(0)
        z0x0.apply_CZ(0, 1)
        z0x0.put_in_standard_form()
        self.assertTrue(z0x0 == z1x1)

        # EPR pair
        z0z0 = StabilizerState([[0, 0, 1, 0], [0, 0, 0, 1]])
        epr = StabilizerState([[1, 1, 0, 0], [0, 0, 1, 1]])
        z0z0.apply_H(0)
        # Effective CNOT
        z0z0.apply_H(1)
        z0z0.apply_CZ(0, 1)
        z0z0.apply_H(1)
        self.assertTrue(z0z0 == epr)

        # Graph state
        z0z0 = StabilizerState([[0, 0, 1, 0], [0, 0, 0, 1]])
        graph_state = StabilizerState([[1, 0, 0, 1], [0, 1, 1, 0]])
        z0z0.apply_H(0)
        z0z0.apply_H(1)
        # Effective CPHASE
        z0z0.apply_CZ(0, 1)
        self.assertTrue(z0z0 == graph_state)
 def test_gaussian_elimination(self):
     S = StabilizerState(["XZZ", "YIX", "IXX"])
     S.put_in_standard_form()
     self.assertTrue(
         np.array_equal(
             S.to_array(),
             StabilizerState(["+1XZZ", "-1ZYZ", "-1ZZY"]).to_array()))
    def test_standard_form(self):
        tests = [  # stabilizers
            ["ZI", "IZ"],
            ["ZZ", "XX"],
            ["ZX", "XZ"],
            ["XXX", "ZZI", "IZZ"],
            ["XIII", "IXII", "IIXI", "IIIX"],
            ["XZII", "ZXZI", "IZXZ", "IIZX"],  # line graph
            ["XZIZ", "ZXZI", "IZXZ", "ZIZX"],  # cycle graph
            ["XZZZ", "ZXZZ", "ZZXZ", "ZZZX"],  # complete graph
            ["XZZZ", "ZXII", "ZIXI", "ZIIX"],  # star graph
        ]

        for stabilizers in tests:
            with self.subTest(stabilizers=stabilizers):
                state = StabilizerState(stabilizers)
                state.put_in_standard_form()
                # Check that there are no X or Y in the first column except the first row
                for row in state._group[1:, :]:
                    self.assertFalse(row[0])