def test_evolve(self): """Test _evolve method.""" # Test hadamard op = Operator(np.array([[1, 1], [1, -1]]) / np.sqrt(2)) target_psi = np.array([1, 1]) / np.sqrt(2) target_rho = np.array([[0.5, 0.5], [0.5, 0.5]]) # Test list vector evolve self.assertAllClose(op._evolve([1, 0]), target_psi) # Test np.array vector evolve self.assertAllClose(op._evolve(np.array([1, 0])), target_psi) # Test list density matrix evolve self.assertAllClose(op._evolve([[1, 0], [0, 0]]), target_rho) # Test np.array density matrix evolve self.assertAllClose(op._evolve(np.array([[1, 0], [0, 0]])), target_rho)
def test_evolve_rand(self): """Test evolve method on random state.""" mat = self.rand_matrix(4, 4) rho = self.rand_rho(4) target_rho = np.dot(np.dot(mat, rho), np.conj(mat.T)) op = Operator(mat) self.assertAllClose(op._evolve(rho), target_rho)
def _other_to_operator(self, rep, qubits_test_cases, repetitions): """Test Other to Operator evolution.""" for nq in qubits_test_cases: dim = 2**nq for _ in range(repetitions): rho = self.rand_rho(dim) mat = self.rand_matrix(dim, dim) chan1 = rep(Operator(mat)) rho1 = chan1._evolve(rho) chan2 = Operator(chan1) rho2 = chan2._evolve(rho) self.assertAllClose(rho1, rho2)
def test_evolve_subsystem(self): """Test subsystem _evolve method.""" # Test evolving single-qubit of 3-qubit system mat = self.rand_matrix(2, 2) op = Operator(mat) psi = self.rand_matrix(1, 8).flatten() rho = self.rand_rho(8) # Evolve on qubit 0 mat0 = np.kron(np.eye(4), mat) psi0_targ = np.dot(mat0, psi) self.assertAllClose(op._evolve(psi, qargs=[0]), psi0_targ) rho0_targ = np.dot(np.dot(mat0, rho), np.conj(mat0.T)) self.assertAllClose(op._evolve(rho, qargs=[0]), rho0_targ) # Evolve on qubit 1 mat1 = np.kron(np.kron(np.eye(2), mat), np.eye(2)) psi1_targ = np.dot(mat1, psi) self.assertAllClose(op._evolve(psi, qargs=[1]), psi1_targ) rho1_targ = np.dot(np.dot(mat1, rho), np.conj(mat1.T)) self.assertAllClose(op._evolve(rho, qargs=[1]), rho1_targ) # Evolve on qubit 2 mat2 = np.kron(mat, np.eye(4)) psi2_targ = np.dot(mat2, psi) self.assertAllClose(op._evolve(psi, qargs=[2]), psi2_targ) rho2_targ = np.dot(np.dot(mat2, rho), np.conj(mat2.T)) self.assertAllClose(op._evolve(rho, qargs=[2]), rho2_targ) # Test 2-qubit evolution mat_a = self.rand_matrix(2, 2) mat_b = self.rand_matrix(2, 2) op = Operator(np.kron(mat_b, mat_a)) psi = self.rand_matrix(1, 8).flatten() rho = self.rand_rho(8) # Evolve on qubits [0, 2] mat02 = np.kron(mat_b, np.kron(np.eye(2), mat_a)) psi02_targ = np.dot(mat02, psi) self.assertAllClose(op._evolve(psi, qargs=[0, 2]), psi02_targ) rho02_targ = np.dot(np.dot(mat02, rho), np.conj(mat02.T)) self.assertAllClose(op._evolve(rho, qargs=[0, 2]), rho02_targ) # Evolve on qubits [2, 0] mat20 = np.kron(mat_a, np.kron(np.eye(2), mat_b)) psi20_targ = np.dot(mat20, psi) self.assertAllClose(op._evolve(psi, qargs=[2, 0]), psi20_targ) rho20_targ = np.dot(np.dot(mat20, rho), np.conj(mat20.T)) self.assertAllClose(op._evolve(rho, qargs=[2, 0]), rho20_targ) # Test evolve on 3-qubits mat_a = self.rand_matrix(2, 2) mat_b = self.rand_matrix(2, 2) mat_c = self.rand_matrix(2, 2) op = Operator(np.kron(mat_c, np.kron(mat_b, mat_a))) psi = self.rand_matrix(1, 8).flatten() rho = self.rand_rho(8) # Evolve on qubits [0, 1, 2] mat012 = np.kron(mat_c, np.kron(mat_b, mat_a)) psi012_targ = np.dot(mat012, psi) self.assertAllClose(op._evolve(psi, qargs=[0, 1, 2]), psi012_targ) rho012_targ = np.dot(np.dot(mat012, rho), np.conj(mat012.T)) self.assertAllClose(op._evolve(rho, qargs=[0, 1, 2]), rho012_targ) # Evolve on qubits [2, 1, 0] mat210 = np.kron(mat_a, np.kron(mat_b, mat_c)) psi210_targ = np.dot(mat210, psi) self.assertAllClose(op._evolve(psi, qargs=[2, 1, 0]), psi210_targ) rho210_targ = np.dot(np.dot(mat210, rho), np.conj(mat210.T)) self.assertAllClose(op._evolve(rho, qargs=[2, 1, 0]), rho210_targ)