def test_compose_front(self): """Test front compose method.""" # DEPRECATED # UnitaryChannel evolution chan1 = SuperOp(self.sopX) chan2 = SuperOp(self.sopY) chan = chan1.compose(chan2, front=True) targ = SuperOp(self.sopZ) self.assertEqual(chan, targ) # 50% depolarizing channel chan1 = SuperOp(self.depol_sop(0.5)) chan = chan1.compose(chan1, front=True) targ = SuperOp(self.depol_sop(0.75)) self.assertEqual(chan, 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.compose(chan1, front=True), targ) targ = SuperOp(np.dot(mat1, mat2)) self.assertEqual(chan1.compose(chan2, front=True), targ) # Compose different dimensions chan1 = SuperOp(self.rand_matrix(16, 4)) chan2 = SuperOp(self.rand_matrix(4, 16)) chan = chan1.compose(chan2, front=True) self.assertEqual(chan.dim, (4, 4)) chan = chan2.compose(chan1, front=True) self.assertEqual(chan.dim, (2, 2))
def test_compose(self): """Test compose method.""" # UnitaryChannel evolution chan1 = SuperOp(self.sopX) chan2 = SuperOp(self.sopY) chan = chan1.compose(chan2) targ = SuperOp(self.sopZ) self.assertEqual(chan, targ) # 50% depolarizing channel chan1 = SuperOp(self.depol_sop(0.5)) chan = chan1.compose(chan1) targ = SuperOp(self.depol_sop(0.75)) self.assertEqual(chan, 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(chan1.compose(chan2), targ) self.assertEqual(chan1 @ chan2, targ) targ = SuperOp(np.dot(mat1, mat2)) self.assertEqual(chan2.compose(chan1), targ) self.assertEqual(chan2 @ chan1, targ) # Compose different dimensions chan1 = SuperOp(self.rand_matrix(16, 4), input_dim=2, output_dim=4) chan2 = SuperOp(self.rand_matrix(4, 16), output_dim=2) chan = chan1.compose(chan2) self.assertEqual(chan.dims, (2, 2)) chan = chan2.compose(chan1) self.assertEqual(chan.dims, (4, 4))
def test_compose_subsystem(self): """Test subsystem compose method.""" # 3-qubit superoperator 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(full_op.data, mat) self.assertEqual(op.compose(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(full_op.data, mat) self.assertEqual(op.compose(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(full_op.data, mat) self.assertEqual(op.compose(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(full_op.data, mat) self.assertEqual(op.compose(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(full_op.data, mat) self.assertEqual(op.compose(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(full_op.data, mat) self.assertEqual(op.compose(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(full_op.data, mat) self.assertEqual(op.compose(op1, qargs=[2]), SuperOp(targ)) self.assertEqual(op @ op1([2]), SuperOp(targ))
def test_compose_front_subsystem(self): """Test subsystem front compose 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 qubits=[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.compose(op3, qubits=[0, 1, 2], front=True), SuperOp(targ)) # op3 qubits=[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.compose(op3, qubits=[2, 1, 0], front=True), SuperOp(targ)) # op2 qubits=[0, 1] full_op = iden.tensor(SuperOp(mat_b)).tensor(SuperOp(mat_a)) targ = np.dot(mat, full_op.data) self.assertEqual(op.compose(op2, qubits=[0, 1], front=True), SuperOp(targ)) # op2 qubits=[2, 0] full_op = SuperOp(mat_a).tensor(iden).tensor(SuperOp(mat_b)) targ = np.dot(mat, full_op.data) self.assertEqual(op.compose(op2, qubits=[2, 0], front=True), SuperOp(targ)) # op1 qubits=[0] full_op = iden.tensor(iden).tensor(SuperOp(mat_a)) targ = np.dot(mat, full_op.data) self.assertEqual(op.compose(op1, qubits=[0], front=True), SuperOp(targ)) # op1 qubits=[1] full_op = iden.tensor(SuperOp(mat_a)).tensor(iden) targ = np.dot(mat, full_op.data) self.assertEqual(op.compose(op1, qubits=[1], front=True), SuperOp(targ)) # op1 qubits=[2] full_op = SuperOp(mat_a).tensor(iden).tensor(iden) targ = np.dot(mat, full_op.data) self.assertEqual(op.compose(op1, qubits=[2], front=True), SuperOp(targ))