def test_transform(): """ Just prints things out; TODO: figure out a thing to test. """ from pyscf import gto, scf import pyqmc r = 1.54 / .529177 mol = gto.M(atom='H 0. 0. 0.; H 0. 0. %g' % r, ecp='bfd', basis='bfd_vtz', unit='bohr', verbose=1) mf = scf.RHF(mol).run() wf = pyqmc.slater_jastrow(mol, mf) enacc = pyqmc.EnergyAccumulator(mol) print(list(wf.parameters.keys())) transform = LinearTransform(wf.parameters) x = transform.serialize_parameters(wf.parameters) nconfig = 10 configs = pyqmc.initial_guess(mol, nconfig) wf.recompute(configs) pgrad = wf.pgradient() gradtrans = transform.serialize_gradients(pgrad) assert gradtrans.shape[1] == len(x) assert gradtrans.shape[0] == nconfig
def generate_wfs(): from pyscf import gto, scf import pyqmc mol = gto.M( atom="O 0 0 0; H 0 -2.757 2.587; H 0 2.757 2.587", basis="bfd_vtz", ecp="bfd" ) mf = scf.RHF(mol).run() wf=pyqmc.slater_jastrow(mol,mf) return mol,mf,wf
def test(): """ Optimize a Helium atom's wave function and check that it's better than Hartree-Fock""" mol = gto.M(atom="He 0. 0. 0.", basis="bfd_vdz", ecp="bfd", unit="bohr") mf = scf.RHF(mol).run() wf = slater_jastrow(mol, mf) nconf = 500 wf, dfgrad, dfline = line_minimization(wf, initial_guess(mol, nconf), gradient_generator(mol, wf)) dfgrad = pd.DataFrame(dfgrad) mfen = mf.energy_tot() enfinal = dfgrad["en"].values[-1] enfinal_err = dfgrad["en_err"].values[-1] assert mfen > enfinal
def setuph2(r, obdm_steps=5): from pyscf import gto, scf, lo from pyqmc.accumulators import LinearTransform, EnergyAccumulator from pyqmc.obdm import OBDMAccumulator from pyqmc.cvmc import DescriptorFromOBDM, PGradDescriptor import itertools # ccECP from A. Annaberdiyev et al. Journal of Chemical Physics 149, 134108 (2018) basis = { "H": gto.basis.parse(""" H S 23.843185 0.00411490 10.212443 0.01046440 4.374164 0.02801110 1.873529 0.07588620 0.802465 0.18210620 0.343709 0.34852140 0.147217 0.37823130 0.063055 0.11642410 """) } """ H S 0.040680 1.00000000 H S 0.139013 1.00000000 H P 0.166430 1.00000000 H P 0.740212 1.00000000 """ ecp = { "H": gto.basis.parse_ecp(""" H nelec 0 H ul 1 21.24359508259891 1.00000000000000 3 21.24359508259891 21.24359508259891 2 21.77696655044365 -10.85192405303825 """) } mol = gto.M(atom=f"H 0. 0. 0.; H 0. 0. {r}", unit="bohr", basis=basis, ecp=ecp, verbose=5) mf = scf.RHF(mol).run() mo_occ = mf.mo_coeff[:, mf.mo_occ > 0] a = lo.iao.iao(mol, mo_occ) a = lo.vec_lowdin(a, mf.get_ovlp()) obdm_up = OBDMAccumulator(mol=mol, orb_coeff=a, nstep=obdm_steps, spin=0) obdm_down = OBDMAccumulator(mol=mol, orb_coeff=a, nstep=obdm_steps, spin=1) wf = pyqmc.slater_jastrow(mol, mf) freeze = {} for k in wf.parameters: freeze[k] = np.zeros(wf.parameters[k].shape, dtype='bool') print(freeze.keys()) print(wf.parameters['wf1mo_coeff_alpha']) #this freezing allows us to easily go between bonding and # AFM configurations. freeze['wf1mo_coeff_alpha'][0, 0] = True freeze['wf1mo_coeff_beta'][1, 0] = True descriptors = { "t": [[(1.0, (0, 1)), (1.0, (1, 0))], [(1.0, (0, 1)), (1.0, (1, 0))]], "trace": [[(1.0, (0, 0)), (1.0, (1, 1))], [(1.0, (0, 0)), (1.0, (1, 1))]], } for i in [0, 1]: descriptors[f"nup{i}"] = [[(1.0, (i, i))], []] descriptors[f"ndown{i}"] = [[], [(1.0, (i, i))]] acc = PGradDescriptor( EnergyAccumulator(mol), LinearTransform(wf.parameters, freeze=freeze), [obdm_up, obdm_down], DescriptorFromOBDM(descriptors, norm=2.0), ) return { "wf": wf, "acc": acc, "mol": mol, "mf": mf, "descriptors": descriptors }
mol = gto.M(atom="O 0 0 0; H 0 -2.757 2.587; H 0 2.757 2.587", basis="bfd_vtz", ecp="bfd") mf = scf.RHF(mol).run() # clean_pyscf_objects gets rid of the TextIO objects that can't # be sent using parsl. mol, mf = clean_pyscf_objects(mol, mf) # It's better to load parsl after pyscf has run. Some of the # executors have timeouts and will kill the job while pyscf is running! parsl.load(config) parsl.set_stream_logger(level=logging.WARNING) # We make a Slater-Jastrow wave function and # only optimize the Jastrow coefficients. wf = pyqmc.slater_jastrow(mol, mf) acc = pyqmc.gradient_generator(mol, wf, ["wf2acoeff", "wf2bcoeff"]) # Generate the initial configurations. # Here we run VMC for a few steps with no accumulators to equilibrate the # walkers. configs = pyqmc.initial_guess(mol, nconf) df, configs = distvmc(wf, configs, accumulators={}, nsteps=10, npartitions=ncore) # This uses a stochastic reconfiguration step to generate parameter changes along a line, # then minimizes the energy along that line. wf, dfgrad, dfline = line_minimization(