Пример #1
0
    def test_dot_HS(self):
        U, V = rng.randint(0, 100, (2, 2, 2))
        S = util.dot_HS(U, V)
        T = util.dot_HS(U, V, eps=0)
        self.assertArrayEqual(S, T)

        for d in rng.randint(2, 10, (5, )):
            U, V = testutil.rand_herm(d, 2)
            self.assertArrayAlmostEqual(util.dot_HS(U, V),
                                        (U.conj().T @ V).trace())

            U = testutil.rand_unit(d).squeeze()
            self.assertEqual(util.dot_HS(U, U), d)
            self.assertEqual(util.dot_HS(U, U + 1e-14, eps=1e-10), d)
Пример #2
0
    def test_oper_equiv(self):
        with self.assertRaises(ValueError):
            util.oper_equiv(rng.standard_normal((2, 2)),
                            rng.standard_normal((3, 3)))

        for d in rng.randint(2, 10, (5, )):
            psi = rng.standard_normal((d, 1)) + 1j * rng.standard_normal(
                (d, 1))
            # Also test broadcasting
            U = testutil.rand_herm(d, rng.randint(1, 11)).squeeze()
            phase = rng.standard_normal()

            result = util.oper_equiv(psi, psi * np.exp(1j * phase))
            self.assertTrue(result[0])
            self.assertAlmostEqual(result[1], phase, places=5)

            result = util.oper_equiv(psi * np.exp(1j * phase), psi)
            self.assertTrue(result[0])
            self.assertAlmostEqual(result[1], -phase, places=5)

            psi /= np.linalg.norm(psi, ord=2)

            result = util.oper_equiv(psi,
                                     psi * np.exp(1j * phase),
                                     normalized=True,
                                     eps=1e-13)
            self.assertTrue(result[0])
            self.assertArrayAlmostEqual(result[1], phase, atol=1e-5)

            result = util.oper_equiv(psi, psi + 1)
            self.assertFalse(result[0])

            result = util.oper_equiv(U, U * np.exp(1j * phase))
            self.assertTrue(np.all(result[0]))
            self.assertArrayAlmostEqual(result[1], phase, atol=1e-5)

            result = util.oper_equiv(U * np.exp(1j * phase), U)
            self.assertTrue(np.all(result[0]))
            self.assertArrayAlmostEqual(result[1], -phase, atol=1e-5)

            norm = np.sqrt(util.dot_HS(U, U))
            norm = norm[:, None, None] if U.ndim == 3 else norm
            U /= norm
            # TIP: In numpy 1.18 we could just do:
            # U /= np.expand_dims(np.sqrt(util.dot_HS(U, U)), axis=(-1, -2))
            result = util.oper_equiv(U,
                                     U * np.exp(1j * phase),
                                     normalized=True,
                                     eps=1e-10)
            self.assertTrue(np.all(result[0]))
            self.assertArrayAlmostEqual(result[1], phase)

            result = util.oper_equiv(U, U + 1)
            self.assertFalse(np.all(result[0]))
Пример #3
0
    def test_oper_equiv(self):
        with self.assertRaises(ValueError):
            util.oper_equiv(*[np.ones((1, 2, 3))] * 2)

        for d in rng.randint(2, 10, (5, )):
            psi = rng.standard_normal((d, 1)) + 1j * rng.standard_normal(
                (d, 1))
            U = testutil.rand_herm(d).squeeze()
            phase = rng.standard_normal()

            result = util.oper_equiv(psi, psi * np.exp(1j * phase))
            self.assertTrue(result[0])
            self.assertAlmostEqual(result[1], phase, places=5)

            result = util.oper_equiv(psi * np.exp(1j * phase), psi)
            self.assertTrue(result[0])
            self.assertAlmostEqual(result[1], -phase, places=5)

            psi /= np.linalg.norm(psi, ord=2)

            result = util.oper_equiv(psi,
                                     psi * np.exp(1j * phase),
                                     normalized=True,
                                     eps=1e-13)
            self.assertTrue(result[0])
            self.assertAlmostEqual(result[1], phase, places=5)

            result = util.oper_equiv(psi, psi + 1)
            self.assertFalse(result[0])

            result = util.oper_equiv(U, U * np.exp(1j * phase))
            self.assertTrue(result[0])
            self.assertAlmostEqual(result[1], phase, places=5)

            result = util.oper_equiv(U * np.exp(1j * phase), U)
            self.assertTrue(result[0])
            self.assertAlmostEqual(result[1], -phase, places=5)

            U /= np.sqrt(util.dot_HS(U, U))
            result = util.oper_equiv(U,
                                     U * np.exp(1j * phase),
                                     normalized=True,
                                     eps=1e-10)
            self.assertTrue(result[0])
            self.assertAlmostEqual(result[1], phase)

            result = util.oper_equiv(U, U + 1)
            self.assertFalse(result[0])
Пример #4
0
    def test_dot_HS(self):
        for d in rng.randint(2, 10, (5, )):
            U = qutip.rand_herm(d)
            V = qutip.rand_herm(d)
            self.assertArrayAlmostEqual(util.dot_HS(U, V), (U.dag() * V).tr())

            U = qutip.rand_unitary(d)
            self.assertEqual(util.dot_HS(U, U), d)

            self.assertEqual(util.dot_HS(U, U + 1e-14, eps=1e-10), d)
            self.assertArrayAlmostEqual(util.dot_HS(U, V), (U.dag() * V).tr())

            U = qutip.rand_unitary(d)
            self.assertEqual(util.dot_HS(U, U), d)

            self.assertEqual(util.dot_HS(U, U + 1e-14, eps=1e-10), d)