def test_densitymatrix(self): # should raise an exception for non unit trace matrices with self.assertRaises(TypeError): densitymatrix(2 * self.rho.matrix, self.subsystems) # GHZ state is not PPT self.assertEqual(False, densitymatrix(self.ghz, self.subsystems).ppt([0])) # Separable state is PPT self.assertEqual(True, densitymatrix(self.sep, self.subsystems).ppt([0])) # make sure negativity is properly calculated self.assertAlmostEqual(0.5, densitymatrix(self.ghz, self.subsystems).negativity([0])) self.assertEqual(self.neg, self.rho.negativity([0]))
def setUp(self): self.subsystems = [2, 2, 2] M = random.randn(8, 8) + 1.0j * random.randn(8, 8) rho = numpy.dot(M.conjugate().transpose(), M) rho /= numpy.trace(rho) self.rho = densitymatrix(rho, self.subsystems) ptrho = numpy.zeros((8, 8), dtype=numpy.complex128) ptrho[:4, :4] = rho[:4, :4] ptrho[4:, 4:] = rho[4:, 4:] ptrho[:4, 4:] = rho[4:, :4] ptrho[4:, :4] = rho[:4, 4:] ev = numpy.linalg.eigvalsh(ptrho) self.neg = numpy.sum(numpy.absolute(ev[ev < 0])) self.ghz = [ [1.0 / 2, 0, 0, 0, 0, 0, 0, 1.0 / 2], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [1.0 / 2, 0, 0, 0, 0, 0, 0, 1.0 / 2], ] self.sep = [ [1.0 / 2, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1.0 / 2], ]
def randstate(minweight): psi = numpy.random.randn(dim) + 1.j*numpy.random.randn(dim) p = minweight*numpy.random.rand(1) rhopure = numpy.outer(psi.conjugate(),psi) rhopure /= numpy.trace(rhopure) return densitymatrix((1-p)*rhopure + p*rhomixed.random(),subsystems)