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