Exemplo n.º 1
0
def GetHamiltonian2(molecule, basis, n_excitations='FCI'):
    recompute = 1
    # Try to load it.
    name = 'data/operators/%s_%s_hamiltonian_%s.npz'\
        % (molecule, basis, str(n_excitations))
    try:
        assert not recompute
        hamiltonian = LoadSparse(name)

    # Compute pre-projected Hamiltonian.
    except:
        repulsion, coefficients, terms = commutators.GetHamiltonianTerms(
            molecule, basis, add_conjugates=True)
        hamiltonian = MakeOperator(coefficients, terms)

        # Project, if necessary.
        if n_excitations != 'FCI':
            n_hilbert = hamiltonian.shape[0]
            n_electrons = commutators.ElectronCount(molecule)
            n_orbitals = int(numpy.rint(numpy.log2(n_hilbert)))
            if n_orbitals - n_electrons > n_excitations:
                projector = ConfigurationProjector(n_orbitals, n_electrons,
                                                   n_excitations)
                hamiltonian = projector * hamiltonian * projector.getH()

        # Save and return.
        SaveSparse(name, hamiltonian)
    return hamiltonian
Exemplo n.º 2
0
def main():

    # Test parameters.
    molecule = str(argv[1])
    basis = str(argv[2])
    try:
        cc_form = bool(argv[3])
    except:
        cc_form = False
    try:
        run_type = str(argv[4])
    except:
        run_type = 'ucc'

    try:
        dirpath = str(argv[5])
    except:
        dirpath = None

    # Get Hamiltonian
    print 'dirpath', dirpath
    fci_hamiltonian = GetHamiltonian(molecule, basis, n_excitations='FCI')
    cisd_hamiltonian = GetHamiltonian(molecule, basis, n_excitations=2)
    repulsion, coefficients, ham_terms = commutators.GetHamiltonianTerms(
        molecule, basis)
    print 'Number of terms %i' % len(ham_terms)
    print "terms:", ham_terms
    n_electrons = commutators.ElectronCount(molecule)
    n_orbitals = commutators.OrbitalCount(ham_terms)
    print "n orbitals:", n_orbitals
    basis_parsed = basis.split('-')

    print basis_parsed
    print basis_parsed[0]
    energies = []

    # Get states and energies.
    #fci_state = SparseDiagonalize(fci_hamiltonian)
    #print fci_state
    cisd_state = SparseDiagonalize(cisd_hamiltonian)
    #print cisd_state
    hf_state = HartreeFockState(n_electrons, n_orbitals)
    #fci_energy = Expectation(fci_hamiltonian, fci_state)
    #cisd_energy = Expectation(fci_hamiltonian, cisd_state)
    hf_energy = Expectation(fci_hamiltonian, hf_state)
    print basis_parsed
    # energies=[basis_parsed[0],str(hf_energy+repulsion),str(cisd_energy+repulsion),str(fci_energy+repulsion)]
    energies = [basis_parsed[0], str(hf_energy + repulsion)]

    # Get terms
    initial_guess = []
    terms = []
    # JRF
    jw_terms = GetJordanWignerTerms(n_orbitals)
    counter = 0
    coeffs = []
    thres = 1E-08

    if run_type == 'troyer':

        for coefficient, term in zip(coefficients, ham_terms):
            # JRF
            counter = counter + 1
            hterm = MatrixForm(1.,
                               term,
                               jw_terms,
                               add_conjugates=True,
                               anti_hermitian=cc_form)
            hcontribution = Expectation(hterm, cisd_state)
            initial_guess += [hcontribution]
            terms += [term]

    elif run_type == 'troyer-wc':

        # JRF
        for coefficient, term in zip(coefficients, ham_terms):
            # JRF
            hterm = MatrixForm(1.,
                               term,
                               jw_terms,
                               add_conjugates=True,
                               anti_hermitian=cc_form)
            hcontribution = Expectation(hterm, cisd_state)
            if commutators.GetConjugate(term):
                counter = counter + 1
                initial_guess += [hcontribution]
                terms += [term]

    elif run_type == 'ucc':

        opt = 1
        if opt == 1:
            n_excitations = 2
            print 'electrons:', n_electrons
            ncore = 0
            occ = range(ncore + 1, n_electrons + 1)
            vir = range(n_electrons + 1, n_orbitals + 1)
            operators = []
            for n in range(1, n_excitations + 1):
                for cosa1 in combinations(occ, n):
                    for cosa2 in combinations(vir, n):
                        cosita = []
                        cosita.extend(cosa2[::-1])
                        cosita.extend([x * -1 for x in cosa1[::-1]])
                        operators.append(cosita)
        else:
            operators = [[3, 4, -2, -1], [6, 5, -2, -1]]
        # JRF
        for term in operators:
            # JRF
            hterm = MatrixForm(1.,
                               term,
                               jw_terms,
                               add_conjugates=True,
                               anti_hermitian=False)
            hcontribution = Expectation(hterm, cisd_state)
            # print "hamiltonian terms"
            # print ham_terms
            # location=ham_terms.index(term)
            # hcontribution=coefficients[location]
            counter = counter + 1
            initial_guess += [hcontribution]
            terms += [term]

    print initial_guess

    filename1 = molecule + basis + '.out'
    output1 = open(filename1, 'a')
    # output2=open('OptimalParameters_H3pd__CCD.out','a')
    print 'This is the number of terms for VQE:', counter
    ncalls, solution, variational_energy = VariationallyMinimize(
        terms, hf_state, initial_guess, fci_hamiltonian, cc_form)
    print 'Variationally optimal energy is %s.\n' % repr(
        float(variational_energy + repulsion))
    diff = variational_energy - fci_energy
    print 'Data %f %s %i %s.\n' % (thres, repr(
        float(variational_energy)), counter, repr(float(diff)))
    print 'Optimal parameters \n'
    for t, ov in zip(terms, solution):
        if abs(ov) > 1E-6:
            print t, ov
    print energies
    # Obtain variational solution.
    print 'Analyzing %s in the %s basis.\n' % (molecule, basis)
    print 'Hartree-Fock energy is %s.' % repr(float(hf_energy))
    print '\nExact (FCI) energy is %s.' % repr(float(fci_energy))
    print 'CISD energy is %s.' % repr(float(cisd_energy))
    print 'Hartree-Fock energy is %s.' % repr(float(hf_energy))

    # writing results
    energies.append(str(variational_energy + repulsion))
    energies.append(str(diff))
    energies.append(ncalls)
    energies.append(counter)
    output1.write((" ".join(str(i) for i in energies) + '\n'))
    output1.close()