コード例 #1
0
 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)
コード例 #2
0
 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)
コード例 #3
0
 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)
コード例 #4
0
    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)