def test_density_matrix_seed(self): rgen1 = np.random.RandomState(1) dm1 = uniform.density_matrix(2, 2, False, rgen1) rgen2 = np.random.RandomState(1) dm2 = uniform.density_matrix(2, 2, False, rgen2) self.assertEqual(la.norm(dm1 - dm2), 0)
def test_partial_trace(self): a = uni.density_matrix(2) b = uni.density_matrix(2) tot = a ^ b self.assertAlmostEqual( la.norm(a.density_matrix() - tot.TrB().density_matrix()), 0) self.assertAlmostEqual( la.norm(b.density_matrix() - tot.TrA().density_matrix()), 0)
def test_density_matrix_as_matrix(self): dm = uniform.density_matrix(4, as_state=False) self.assertTrue(dm.shape == (4, 4)) self.assertTrue(type(dm), np.ndarray) self.assertTrue(dm.dtype == np.complex128) self.assertTrue(ch.QuantumState(dm).is_valid())
def test_partial_trace_asym(self): a = uni.density_matrix(2) b = uni.density_matrix(3) tot = a ^ b self.assertAlmostEqual( la.norm(a.density_matrix() - tot.TrB(2).density_matrix()), 0) self.assertAlmostEqual( la.norm(b.density_matrix() - tot.TrA(3).density_matrix()), 0) tot = b ^ a self.assertAlmostEqual( la.norm(b.density_matrix() - tot.TrB(3).density_matrix()), 0) self.assertAlmostEqual( la.norm(a.density_matrix() - tot.TrA(2).density_matrix()), 0)
def test_kron_n(self): X = uni.density_matrix(2) X3_a = X.kron(3) X3_b = X ^ X ^ X self.assertEqual( la.norm(X3_a.density_matrix() - X3_b.density_matrix()), 0)
def test_2_qubit_bv_random(self): bv = uniform.bloch_vector(4,pure=True) self.assertAlmostEqual(np.trace(bv.density_matrix()),1,12) dm = uniform.density_matrix(4,rank=1) self.assertAlmostEqual(la.norm(dm.bloch_vector()),1,12) bv2 = ch.QuantumState(dm.bloch_vector(),'bv') dv1 = dm.density_vector() dv2 = bv2.density_vector() self.assertAlmostEqual(la.norm(dm.density_matrix()-bv2.density_matrix()),0,15)
def test_1_qutrit_random_op(self): state = uniform.density_matrix(3) op = uniform.choi(3) out = op*state op2 = ch.QuantumChannel(op.ptm(),'ptm') self.assertAlmostEqual(la.norm(op.choi()-op2.choi()),0,14) bvout = op.ptm()[1:,1:]@state.bloch_vector()+op.ptm()[1:,0,np.newaxis]*1./np.sqrt(2) bvout2 = ch.QuantumState(bvout,'bv') self.assertAlmostEqual(la.norm(out.bloch_vector()-bvout),0,14) self.assertAlmostEqual(la.norm(out.density_matrix()-bvout2.density_matrix()),0,14)
def test_2_qutrit_random_op(self): state = uniform.density_matrix(9) op = uniform.choi(9) out = op*state op2 = ch.QuantumChannel(op.ptm(),'ptm') self.assertAlmostEqual(la.norm(op.choi()-op2.choi()),0,14) #This illustrates the ugliness of wanting a unit sphere bvout = op.ptm()[1:,1:]@state.bloch_vector()+op.ptm()[1:,0,np.newaxis]*1./np.sqrt(8) bvout2 = ch.QuantumState(bvout,'bv') self.assertAlmostEqual(la.norm(out.bloch_vector()-bvout),0,15) self.assertAlmostEqual(la.norm(out.density_matrix()-bvout2.density_matrix()),0,14)
def test_density_matrix_as_state(self): dm = uniform.density_matrix(3) self.assertTrue(dm.is_valid())
def test_rank_density_matrix(self): for i in range(1, 10): dm = uniform.density_matrix(9, i) self.assertTrue(dm.rank() == i)