def test_dot(self): """Test dot method.""" # UnitaryChannel evolution chan1 = SuperOp(self.sopX) chan2 = SuperOp(self.sopY) targ = SuperOp(self.sopZ) self.assertEqual(chan1.dot(chan2), targ) self.assertEqual(chan1 * chan2, targ) # 50% depolarizing channel chan1 = SuperOp(self.depol_sop(0.5)) targ = SuperOp(self.depol_sop(0.75)) self.assertEqual(chan1.dot(chan1), targ) self.assertEqual(chan1 * chan1, targ) # Random superoperator mat1 = self.rand_matrix(4, 4) mat2 = self.rand_matrix(4, 4) chan1 = SuperOp(mat1) chan2 = SuperOp(mat2) targ = SuperOp(np.dot(mat2, mat1)) self.assertEqual(chan2.dot(chan1), targ) self.assertEqual(chan2 * chan1, targ) targ = SuperOp(np.dot(mat1, mat2)) self.assertEqual(chan1 * chan2, targ) # Compose different dimensions chan1 = SuperOp(self.rand_matrix(16, 4)) chan2 = SuperOp(self.rand_matrix(4, 16)) chan = chan1.dot(chan2) self.assertEqual(chan.dim, (4, 4)) chan = chan2.dot(chan1) self.assertEqual(chan.dim, (2, 2))
def test_dot_subsystem(self): """Test subsystem dot method.""" # 3-qubit operator mat = self.rand_matrix(64, 64) mat_a = self.rand_matrix(4, 4) mat_b = self.rand_matrix(4, 4) mat_c = self.rand_matrix(4, 4) iden = SuperOp(np.eye(4)) op = SuperOp(mat) op1 = SuperOp(mat_a) op2 = SuperOp(mat_b).tensor(SuperOp(mat_a)) op3 = SuperOp(mat_c).tensor(SuperOp(mat_b)).tensor(SuperOp(mat_a)) # op3 qargs=[0, 1, 2] full_op = SuperOp(mat_c).tensor(SuperOp(mat_b)).tensor(SuperOp(mat_a)) targ = np.dot(mat, full_op.data) self.assertEqual(op.dot(op3, qargs=[0, 1, 2]), SuperOp(targ)) self.assertEqual(op * op3([0, 1, 2]), SuperOp(targ)) # op3 qargs=[2, 1, 0] full_op = SuperOp(mat_a).tensor(SuperOp(mat_b)).tensor(SuperOp(mat_c)) targ = np.dot(mat, full_op.data) self.assertEqual(op.dot(op3, qargs=[2, 1, 0]), SuperOp(targ)) self.assertEqual(op * op3([2, 1, 0]), SuperOp(targ)) # op2 qargs=[0, 1] full_op = iden.tensor(SuperOp(mat_b)).tensor(SuperOp(mat_a)) targ = np.dot(mat, full_op.data) self.assertEqual(op.dot(op2, qargs=[0, 1]), SuperOp(targ)) self.assertEqual(op * op2([0, 1]), SuperOp(targ)) # op2 qargs=[2, 0] full_op = SuperOp(mat_a).tensor(iden).tensor(SuperOp(mat_b)) targ = np.dot(mat, full_op.data) self.assertEqual(op.dot(op2, qargs=[2, 0]), SuperOp(targ)) self.assertEqual(op * op2([2, 0]), SuperOp(targ)) # op1 qargs=[0] full_op = iden.tensor(iden).tensor(SuperOp(mat_a)) targ = np.dot(mat, full_op.data) self.assertEqual(op.dot(op1, qargs=[0]), SuperOp(targ)) self.assertEqual(op * op1([0]), SuperOp(targ)) # op1 qargs=[1] full_op = iden.tensor(SuperOp(mat_a)).tensor(iden) targ = np.dot(mat, full_op.data) self.assertEqual(op.dot(op1, qargs=[1]), SuperOp(targ)) self.assertEqual(op * op1([1]), SuperOp(targ)) # op1 qargs=[2] full_op = SuperOp(mat_a).tensor(iden).tensor(iden) targ = np.dot(mat, full_op.data) self.assertEqual(op.dot(op1, qargs=[2]), SuperOp(targ)) self.assertEqual(op * op1([2]), SuperOp(targ))