def test_compose(self): """Test compose method.""" # Random input test state rho = self.rand_rho(2) # UnitaryChannel evolution chan1 = PTM(self.ptmX) chan2 = PTM(self.ptmY) chan = chan1.compose(chan2) targ = PTM(self.ptmZ)._evolve(rho) self.assertAllClose(chan._evolve(rho), targ) # 50% depolarizing channel chan1 = PTM(self.depol_ptm(0.5)) chan = chan1.compose(chan1) targ = PTM(self.depol_ptm(0.75))._evolve(rho) self.assertAllClose(chan._evolve(rho), targ) # Compose random ptm1 = self.rand_matrix(4, 4, real=True) ptm2 = self.rand_matrix(4, 4, real=True) chan1 = PTM(ptm1, input_dims=2, output_dims=2) chan2 = PTM(ptm2, input_dims=2, output_dims=2) targ = chan2._evolve(chan1._evolve(rho)) chan = chan1.compose(chan2) self.assertEqual(chan.dim, (2, 2)) self.assertAllClose(chan._evolve(rho), targ) chan = chan1 @ chan2 self.assertEqual(chan.dim, (2, 2)) self.assertAllClose(chan._evolve(rho), targ)
def test_compose_front(self): """Test front compose method.""" # Random input test state rho = self.rand_rho(2) # UnitaryChannel evolution chan1 = PTM(self.ptmX) chan2 = PTM(self.ptmY) chan = chan2.compose(chan1, front=True) targ = PTM(self.ptmZ)._evolve(rho) self.assertAllClose(chan._evolve(rho), targ) # Compose random ptm1 = self.rand_matrix(4, 4, real=True) ptm2 = self.rand_matrix(4, 4, real=True) chan1 = PTM(ptm1, input_dims=2, output_dims=2) chan2 = PTM(ptm2, input_dims=2, output_dims=2) targ = chan2._evolve(chan1._evolve(rho)) chan = chan2.compose(chan1, front=True) self.assertEqual(chan.dim, (2, 2)) self.assertAllClose(chan._evolve(rho), targ)
def test_evolve(self): """Test evolve method.""" input_psi = [0, 1] input_rho = [[0, 0], [0, 1]] # Identity channel chan = PTM(self.ptmI) target_rho = np.array([[0, 0], [0, 1]]) self.assertAllClose(chan._evolve(input_psi), target_rho) self.assertAllClose(chan._evolve(np.array(input_psi)), target_rho) self.assertAllClose(chan._evolve(input_rho), target_rho) self.assertAllClose(chan._evolve(np.array(input_rho)), target_rho) # Hadamard channel chan = PTM(self.ptmH) target_rho = np.array([[1, -1], [-1, 1]]) / 2 self.assertAllClose(chan._evolve(input_psi), target_rho) self.assertAllClose(chan._evolve(np.array(input_psi)), target_rho) self.assertAllClose(chan._evolve(input_rho), target_rho) self.assertAllClose(chan._evolve(np.array(input_rho)), target_rho) # Completely depolarizing channel chan = PTM(self.depol_ptm(1)) target_rho = np.eye(2) / 2 self.assertAllClose(chan._evolve(input_psi), target_rho) self.assertAllClose(chan._evolve(np.array(input_psi)), target_rho) self.assertAllClose(chan._evolve(input_rho), target_rho) self.assertAllClose(chan._evolve(np.array(input_rho)), target_rho)