Ejemplo n.º 1
0
def test():
    r = 1.5
    geometry = [('H', (0,0,1*r)), ('H', (0,0,2*r)), ('H', (0,0,3*r)), ('H', (0,0,4*r))]


    charge = 0
    spin = 0
    basis = 'sto-3g'

    [n_orb, n_a, n_b, h, g, mol, E_nuc, E_scf, C, S] = pyscf_helper.init(geometry,charge,spin,basis)

    print(" n_orb: %4i" %n_orb)
    print(" n_a  : %4i" %n_a)
    print(" n_b  : %4i" %n_b)

    sq_ham = pyscf_helper.SQ_Hamiltonian()
    sq_ham.init(h, g, C, S)
    print(" HF Energy: %12.8f" %(E_nuc + sq_ham.energy_of_determinant(range(n_a),range(n_b))))
    ehf = E_nuc + sq_ham.energy_of_determinant(range(n_a),range(n_b))
    assert(abs(ehf - -1.82913741) < 1e-7)
    fermi_ham  = sq_ham.export_FermionOperator()

    hamiltonian = openfermion.transforms.get_sparse_operator(fermi_ham)

    s2 = vqe_methods.Make_S2(n_orb)

    #build reference configuration
    occupied_list = []
    for i in range(n_a):
        occupied_list.append(i*2)
    for i in range(n_b):
        occupied_list.append(i*2+1)

    print(" Build reference state with %4i alpha and %4i beta electrons" %(n_a,n_b), occupied_list)
    reference_ket = scipy.sparse.csc_matrix(openfermion.jw_configuration_state(occupied_list, 2*n_orb)).transpose()

    [e,v] = scipy.sparse.linalg.eigsh(hamiltonian.real,1,which='SA',v0=reference_ket.todense())
    for ei in range(len(e)):
        S2 = v[:,ei].conj().T.dot(s2.dot(v[:,ei]))
        print(" State %4i: %12.8f au  <S2>: %12.8f" %(ei,e[ei]+E_nuc,S2))
    
    fermi_ham += FermionOperator((),E_nuc)
    pyscf.molden.from_mo(mol, "full.molden", sq_ham.C)

    #   Francesco, change this to singlet_GSD() if you want generalized singles and doubles
    pool = operator_pools.singlet_SD()
    pool.init(n_orb, n_occ_a=n_a, n_occ_b=n_b, n_vir_a=n_orb-n_a, n_vir_b=n_orb-n_b)

    [e,v,params] = vqe_methods.adapt_vqe(fermi_ham, pool, reference_ket, theta_thresh=1e-9)

    print(" Final ADAPT-VQE energy: %12.8f" %e)
    print(" <S^2> of final state  : %12.8f" %(v.conj().T.dot(s2.dot(v))[0,0].real))

    assert(abs(-1.99471290 - e) < 1e-7)
Ejemplo n.º 2
0
import vqe_methods
import operator_pools

import sys

r = 2.684
geometry = [('H', (0, 0, -r)), ('Be', (0, 0, 0)), ('H', (0, 0, r))]

filename = "beh2_r2684_random01_sd.out"

sys.stdout = open(filename, 'w')

vqe_methods.test_random(geometry, pool=operator_pools.singlet_SD(), seed=1)
Ejemplo n.º 3
0
import vqe_methods
import operator_pools

import sys

r = 2.684
geometry = [('H', (0, 0, -r)), ('Be', (0, 0, 0)), ('H', (0, 0, r))]

filename = "beh2_r2684_lex_sd.out"

sys.stdout = open(filename, 'w')

vqe_methods.test_lexical(geometry, pool=operator_pools.singlet_SD())
Ejemplo n.º 4
0
import vqe_methods
import operator_pools

import sys

r = 2.684
geometry = [('H', (0, 0, -r)), ('Be', (0, 0, 0)), ('H', (0, 0, r))]

filename = "beh2_r2684_adapt_sd.out"

sys.stdout = open(filename, 'w')

vqe_methods.adapt_vqe(geometry,
                      pool=operator_pools.singlet_SD(),
                      adapt_thresh=1e-7)
Ejemplo n.º 5
0
import vqe_methods
import operator_pools

r = 1.5
geometry = [('H', (0, 0, 1 * r)), ('H', (0, 0, 2 * r)), ('H', (0, 0, 3 * r)),
            ('H', (0, 0, 4 * r)), ('H', (0, 0, 5 * r)), ('H', (0, 0, 6 * r))]

vqe_methods.adapt_vqe(geometry, pool=operator_pools.singlet_SD())
Ejemplo n.º 6
0
    #Thetas
    parameters = [0] * pool.n_ops

    pool.generate_SparseMatrix()

    ucc = UCC(hamiltonian, pool.spmat_ops, reference_ket, parameters)

    opt_result = scipy.optimize.minimize(ucc.energy,
                                         parameters,
                                         options={
                                             'gtol': 1e-6,
                                             'disp': True
                                         },
                                         method='BFGS',
                                         callback=ucc.callback)
    print(" Finished: %20.12f" % ucc.curr_energy)
    parameters = opt_result['x']
    for p in parameters:
        print(p)


if __name__ == "__main__":
    r = 1.5
    geometry = [('H', (0, 0, 1 * r)), ('H', (0, 0, 2 * r)),
                ('H', (0, 0, 3 * r)), ('H', (0, 0, 4 * r))]

    vqe_methods.ucc(geometry, pool=operator_pools.singlet_SD())
    #vqe_methods.adapt_vqe(geometry,pool = operator_pools.singlet_SD())
    #vqe_methods.adapt_vqe(geometry,pool = operator_pools.singlet_GSD())