Пример #1
0
 def test_integrals_self_inverse(self):
     hc, hr1, hr2 = get_doci_from_integrals(
         self.molecule.one_body_integrals, self.molecule.two_body_integrals)
     doci = DOCIHamiltonian(0, hc, hr1, hr2)
     proj_one_body, proj_two_body = doci.get_projected_integrals()
     hc_test, hr1_test, hr2_test = get_doci_from_integrals(
         proj_one_body, proj_two_body)
     self.assertTrue(numpy.allclose(hc, hc_test))
     self.assertTrue(numpy.allclose(hr1, hr1_test))
     self.assertTrue(numpy.allclose(hr2, hr2_test))
Пример #2
0
 def test_integrals_self_inverse(self):
     hc, hr1, hr2 = get_doci_from_integrals(
         self.molecule.one_body_integrals, self.molecule.two_body_integrals)
     proj_one_body, proj_two_body = get_projected_integrals_from_doci(
         hc, hr1, hr2)
     hc_test, hr1_test, hr2_test = get_doci_from_integrals(
         proj_one_body, proj_two_body)
     self.assertTrue(numpy.allclose(hc, hc_test))
     self.assertTrue(numpy.allclose(hr1, hr1_test))
     print(hr2)
     print(hr2_test)
     self.assertTrue(numpy.allclose(hr2, hr2_test))
Пример #3
0
    def test_fermionic_hamiltonian_from_integrals(self):
        constant = self.molecule.nuclear_repulsion
        doci_constant = constant
        hc, hr1, hr2 = get_doci_from_integrals(
            self.molecule.one_body_integrals, self.molecule.two_body_integrals)

        doci = DOCIHamiltonian(doci_constant, hc, hr1, hr2)

        doci_qubit_op = doci.qubit_operator
        doci_mat = get_sparse_operator(doci_qubit_op).toarray()
        #doci_eigvals, doci_eigvecs = numpy.linalg.eigh(doci_mat)
        doci_eigvals, _ = numpy.linalg.eigh(doci_mat)

        tensors = doci.n_body_tensors
        one_body_tensors, two_body_tensors = tensors[(1, 0)], tensors[(1, 1, 0,
                                                                       0)]
        fermion_op1 = get_fermion_operator(
            InteractionOperator(constant, one_body_tensors,
                                0. * two_body_tensors))

        fermion_op2 = get_fermion_operator(
            InteractionOperator(0, 0 * one_body_tensors,
                                0.5 * two_body_tensors))

        import openfermion as of
        fermion_op1_jw = of.transforms.jordan_wigner(fermion_op1)
        fermion_op2_jw = of.transforms.jordan_wigner(fermion_op2)

        fermion_op_jw = fermion_op1_jw + fermion_op2_jw
        #fermion_eigvals, fermion_eigvecs = numpy.linalg.eigh(
        #    get_sparse_operator(fermion_op_jw).toarray())
        fermion_eigvals, _ = numpy.linalg.eigh(
            get_sparse_operator(fermion_op_jw).toarray())

        for eigval in doci_eigvals:
            assert any(abs(fermion_eigvals -
                           eigval) < 1e-6), "The DOCI spectrum should \
            have been contained in the spectrum of the fermionic operators"

        fermion_diagonal = get_sparse_operator(
            fermion_op_jw).toarray().diagonal()
        qubit_diagonal = doci_mat.diagonal()
        assert numpy.isclose(
            fermion_diagonal[0], qubit_diagonal[0]
        ) and numpy.isclose(
            fermion_diagonal[-1], qubit_diagonal[-1]
        ), "The first and last elements of hte qubit and fermionic diagonal of \
        the Hamiltonian maxtrix should be the same as the vaccum should be \
        mapped to the computational all zero state and the completely filled \
        state should be mapped to the all one state"

        print(fermion_diagonal)
        print(qubit_diagonal)
Пример #4
0
    def test_integrals_to_doci(self):
        one_body_integrals = self.molecule.one_body_integrals
        two_body_integrals = self.molecule.two_body_integrals
        hc, hr1, hr2 = get_doci_from_integrals(one_body_integrals,
                                               two_body_integrals)
        self.assertEqual(hc.shape[0], 2)
        self.assertEqual(hr1.shape[0], 2)
        self.assertEqual(hr2.shape[0], 2)

        for p in range(2):
            self.assertEqual(
                hc[p] + hr2[p, p],
                2 * one_body_integrals[p, p] + two_body_integrals[p, p, p, p])
            for q in range(2):
                if p != q:
                    self.assertEqual(hr1[p, q], two_body_integrals[p, p, q, q])
                    self.assertEqual(
                        hr2[p, q], 2 * two_body_integrals[p, q, q, p] -
                        two_body_integrals[p, q, p, q])