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()))