def default_multislater(mol, mf, mc): import numpy as np wf = MultiSlater(mol, mf, mc) freeze = {} freeze["det_coeff"] = np.zeros(wf.parameters["det_coeff"].shape).astype(bool) freeze["det_coeff"][0] = True # Determinant coefficient pivot to_opt = ["det_coeff"] # Don't have orbital coeff opt on this yet return wf, to_opt, freeze
def default_multislater(mol, mf, mc, tol=None, optimize_orbitals=False): import numpy as np wf = MultiSlater(mol, mf, mc, tol) to_opt = ["det_coeff"] to_opt = {"det_coeff": np.ones(wf.parameters["det_coeff"].shape).astype(bool)} to_opt["det_coeff"][0] = False # Determinant coefficient pivot if optimize_orbitals: for k in ["mo_coeff_alpha", "mo_coeff_beta"]: to_opt[k] = np.ones(wf.parameters[k].shape).astype(bool) return wf, to_opt
def test_ecp(): mol = gto.M( atom="""C 0 0 0 C 1 0 0 """, ecp="bfd", basis="bfd_vtz", ) mf = scf.RHF(mol).run() nconf = 1000 coords = initial_guess(mol, nconf) thresholds = [1e15, 100, 50, 20, 10, 5, 1] label = ["S", "J", "SJ"] ind = 0 for wf in [ PySCFSlaterUHF(mol, mf), JastrowSpin(mol), MultiplyWF(PySCFSlaterUHF(mol, mf), JastrowSpin(mol)), ]: wf.recompute(coords) print(label[ind]) ind += 1 for threshold in thresholds: eacc = EnergyAccumulator(mol, threshold) start = time.time() eacc(coords, wf) end = time.time() print("Threshold=", threshold, np.around(end - start, 2), "s") mc = mcscf.CASCI(mf, ncas=4, nelecas=(2, 2)) mc.kernel() label = ["MS"] ind = 0 for wf in [MultiSlater(mol, mf, mc)]: wf.recompute(coords) print(label[ind]) ind += 1 for threshold in thresholds: eacc = EnergyAccumulator(mol, threshold) start = time.time() eacc(coords, wf) end = time.time() print("Threshold=", threshold, np.around(end - start, 2), "s")
def default_multislater(mol, mf, mc, tol=None, freeze_orb=None): import numpy as np # Nothing provided, nothing frozen if freeze_orb is None: freeze_orb = [[],[]] wf = MultiSlater(mol, mf, mc, tol, freeze_orb) to_opt = ["det_coeff"] freeze = {} freeze["det_coeff"] = np.zeros(wf.parameters["det_coeff"].shape).astype(bool) freeze["det_coeff"][0] = True # Determinant coefficient pivot for s, k in enumerate(['mo_coeff_alpha','mo_coeff_beta']): to_freeze = np.zeros(wf.parameters[k].shape, dtype=bool) to_freeze[:, freeze_orb[s]] = True if to_freeze.sum() < np.prod(to_freeze.shape): freeze[k] = to_freeze to_opt.append(k) return wf, to_opt, freeze
def test(): """ Tests that the multi-slater wave function value, gradient and parameter gradient evaluations are working correctly. Also checks that VMC energy matches energy calculated in PySCF """ mol = gto.M(atom="Li 0. 0. 0.; H 0. 0. 1.5", basis="cc-pvtz", unit="bohr", spin=0) epsilon = 1e-4 delta = 1e-5 nsteps = 200 warmup = 10 for mf in [scf.RHF(mol).run(), scf.ROHF(mol).run(), scf.UHF(mol).run()]: # Test same number of elecs mc = mcscf.CASCI(mf, ncas=4, nelecas=(1, 1)) mc.kernel() wf = MultiSlater(mol, mf, mc) nconf = 10 nelec = np.sum(mol.nelec) epos = initial_guess(mol, nconf) for k, item in testwf.test_updateinternals(wf, epos).items(): assert item < epsilon assert testwf.test_wf_gradient(wf, epos, delta=delta)[0] < epsilon assert testwf.test_wf_laplacian(wf, epos, delta=delta)[0] < epsilon assert testwf.test_wf_pgradient(wf, epos, delta=delta)[0] < epsilon # Test same number of elecs mc = mcscf.CASCI(mf, ncas=4, nelecas=(1, 1)) mc.kernel() wf = pyqmc.default_msj(mol, mf, mc)[0] nelec = np.sum(mol.nelec) epos = initial_guess(mol, nconf) for k, item in testwf.test_updateinternals(wf, epos).items(): assert item < epsilon assert testwf.test_wf_gradient(wf, epos, delta=delta)[0] < epsilon assert testwf.test_wf_laplacian(wf, epos, delta=delta)[0] < epsilon assert testwf.test_wf_pgradient(wf, epos, delta=delta)[0] < epsilon # Test different number of elecs mc = mcscf.CASCI(mf, ncas=4, nelecas=(2, 0)) mc.kernel() wf = MultiSlater(mol, mf, mc) nelec = np.sum(mol.nelec) epos = initial_guess(mol, nconf) for k, item in testwf.test_updateinternals(wf, epos).items(): assert item < epsilon assert testwf.test_wf_gradient(wf, epos, delta=delta)[0] < epsilon assert testwf.test_wf_laplacian(wf, epos, delta=delta)[0] < epsilon assert testwf.test_wf_pgradient(wf, epos, delta=delta)[0] < epsilon # Quick VMC test nconf = 1000 coords = initial_guess(mol, nconf) df, coords = vmc(wf, coords, nsteps=nsteps, accumulators={"energy": EnergyAccumulator(mol)}) df = pd.DataFrame(df) df = reblock(df["energytotal"][warmup:], 20) en = df.mean() err = df.sem() assert en - mc.e_tot < 5 * err