def test_rdm(self): norb, nelec = 10, 4 strs = cistring.gen_strings4orblist(range(norb), nelec) numpy.random.seed(11) mask = numpy.random.random(len(strs)) > .6 strsa = strs[mask] mask = numpy.random.random(len(strs)) > .7 strsb = strs[mask] ci_strs = (strsa, strsb) ci_coeff = select_ci._as_SCIvector( numpy.random.random((len(strsa), len(strsb))), ci_strs) ci0 = select_ci.to_fci(ci_coeff, norb, (nelec, nelec)) dm1ref, dm2ref = direct_spin1.make_rdm12s(ci0, norb, (nelec, nelec)) dm1 = select_ci.make_rdm1s(ci_coeff, norb, (nelec, nelec)) self.assertAlmostEqual(abs(dm1[0] - dm1ref[0]).sum(), 0, 9) self.assertAlmostEqual(abs(dm1[1] - dm1ref[1]).sum(), 0, 9) dm2 = select_ci.make_rdm2s(ci_coeff, norb, (nelec, nelec)) self.assertAlmostEqual(abs(dm2[0] - dm2ref[0]).sum(), 0, 9) self.assertAlmostEqual(abs(dm2[1] - dm2ref[1]).sum(), 0, 9) self.assertAlmostEqual(abs(dm2[2] - dm2ref[2]).sum(), 0, 9) ci1_coeff = select_ci._as_SCIvector( numpy.random.random((len(strsa), len(strsb))), ci_strs) ci1 = select_ci.to_fci(ci1_coeff, norb, (nelec, nelec)) dm1ref, dm2ref = direct_spin1.trans_rdm12s(ci1, ci0, norb, (nelec, nelec)) dm1 = select_ci.trans_rdm1s(ci1_coeff, ci_coeff, norb, (nelec, nelec)) self.assertAlmostEqual(abs(dm1[0] - dm1ref[0]).sum(), 0, 9) self.assertAlmostEqual(abs(dm1[1] - dm1ref[1]).sum(), 0, 9)
def test_rdm(self): norb, nelec = 10, 4 strs = cistring.gen_strings4orblist(range(norb), nelec) numpy.random.seed(11) mask = numpy.random.random(len(strs)) > .6 strsa = strs[mask] mask = numpy.random.random(len(strs)) > .7 strsb = strs[mask] ci_strs = (strsa, strsb) ci_coeff = select_ci._as_SCIvector(numpy.random.random((len(strsa),len(strsb))), ci_strs) ci0 = select_ci.to_fci(ci_coeff, norb, (nelec,nelec)) dm1ref, dm2ref = direct_spin1.make_rdm12s(ci0, norb, (nelec,nelec)) dm1 = select_ci.make_rdm1s(ci_coeff, norb, (nelec,nelec)) self.assertAlmostEqual(abs(dm1[0]-dm1ref[0]).sum(), 0, 9) self.assertAlmostEqual(abs(dm1[1]-dm1ref[1]).sum(), 0, 9) dm2 = select_ci.make_rdm2s(ci_coeff, norb, (nelec,nelec)) self.assertAlmostEqual(abs(dm2[0]-dm2ref[0]).sum(), 0, 9) self.assertAlmostEqual(abs(dm2[1]-dm2ref[1]).sum(), 0, 9) self.assertAlmostEqual(abs(dm2[2]-dm2ref[2]).sum(), 0, 9) ci1_coeff = select_ci._as_SCIvector(numpy.random.random((len(strsa),len(strsb))), ci_strs) ci1 = select_ci.to_fci(ci1_coeff, norb, (nelec,nelec)) dm1ref, dm2ref = direct_spin1.trans_rdm12s(ci1, ci0, norb, (nelec,nelec)) dm1 = select_ci.trans_rdm1s(ci1_coeff, ci_coeff, norb, (nelec,nelec)) self.assertAlmostEqual(abs(dm1[0]-dm1ref[0]).sum(), 0, 9) self.assertAlmostEqual(abs(dm1[1]-dm1ref[1]).sum(), 0, 9)
def test_contract(self): myci = select_ci.SelectCI() ci0 = select_ci.to_fci(civec_strs, norb, nelec) e1 = numpy.dot(civec_strs.ravel(), select_ci.contract_2e(eri, civec_strs, norb, nelec).ravel()) e2 = numpy.dot(ci0.ravel(), direct_spin1.contract_2e(eri, ci0, norb, nelec).ravel()) self.assertAlmostEqual(e1, e2, 9) dm1 = myci.make_rdm1(civec_strs, norb, nelec) self.assertAlmostEqual(finger(dm1), 0.70181046385686563, 9) dm1 = myci.trans_rdm1(civec_strs, civec_strs, norb, nelec) self.assertAlmostEqual(finger(dm1), 0.70181046385686563, 9) dm2 = myci.make_rdm2(civec_strs, norb, nelec) self.assertAlmostEqual(finger(dm2), -3.8397469683353962, 9)
def test_spin_square(self): norb, nelec = 10, 4 strs = cistring.gen_strings4orblist(range(norb), nelec) numpy.random.seed(11) mask = numpy.random.random(len(strs)) > .6 strsa = strs[mask] mask = numpy.random.random(len(strs)) > .7 strsb = strs[mask] ci_strs = (strsa, strsb) ci_coeff = select_ci._as_SCIvector(numpy.random.random((len(strsa),len(strsb))), ci_strs) ci0 = select_ci.to_fci(ci_coeff, norb, (nelec,nelec)) ss0 = select_ci.spin_square(ci_coeff, norb, (nelec,nelec)) ss1 = spin_op.spin_square0(ci0, norb, (nelec,nelec)) self.assertAlmostEqual(ss0[0], ss1[0], 9)
def test_contract(self): myci = select_ci.SCI() ci0 = select_ci.to_fci(civec_strs, norb, nelec) e1 = numpy.dot( civec_strs.ravel(), select_ci.contract_2e(eri, civec_strs, norb, nelec).ravel()) e2 = numpy.dot(ci0.ravel(), direct_spin1.contract_2e(eri, ci0, norb, nelec).ravel()) self.assertAlmostEqual(e1, e2, 9) dm1 = myci.make_rdm1(civec_strs, norb, nelec) self.assertAlmostEqual(finger(dm1), 0.70181046385686563, 9) dm1 = myci.trans_rdm1(civec_strs, civec_strs, norb, nelec) self.assertAlmostEqual(finger(dm1), 0.70181046385686563, 9) dm2 = myci.make_rdm2(civec_strs, norb, nelec) self.assertAlmostEqual(finger(dm2), -3.8397469683353962, 9)
def test_spin_square(self): norb, nelec = 10, 4 strs = cistring.gen_strings4orblist(range(norb), nelec) numpy.random.seed(11) mask = numpy.random.random(len(strs)) > .6 strsa = strs[mask] mask = numpy.random.random(len(strs)) > .7 strsb = strs[mask] ci_strs = (strsa, strsb) ci_coeff = select_ci._as_SCIvector( numpy.random.random((len(strsa), len(strsb))), ci_strs) ci0 = select_ci.to_fci(ci_coeff, norb, (nelec, nelec)) ss0 = select_ci.spin_square(ci_coeff, norb, (nelec, nelec)) ss1 = spin_op.spin_square0(ci0, norb, (nelec, nelec)) self.assertAlmostEqual(ss0[0], ss1[0], 9)
def test_contract_2e_symm(self): norb, nelec = 7, (4,4) strs = cistring.gen_strings4orblist(range(norb), nelec[0]) numpy.random.seed(11) mask = numpy.random.random(len(strs)) > .3 strsa = strs[mask] mask = numpy.random.random(len(strs)) > .2 strsb = strs[mask] ci_strs = (strsa, strsb) civec_strs = select_ci._as_SCIvector(numpy.random.random((len(strsa),len(strsb))), ci_strs) orbsym = (numpy.random.random(norb) * 4).astype(int) nn = norb*(norb+1)//2 eri = (numpy.random.random(nn*(nn+1)//2)-.2)**3 ci0 = select_ci.to_fci(civec_strs, norb, nelec) e1 = numpy.dot(civec_strs.ravel(), select_ci_symm.contract_2e(eri, civec_strs, norb, nelec, orbsym=orbsym).ravel()) e2 = numpy.dot(ci0.ravel(), direct_spin1_symm.contract_2e(eri, ci0, norb, nelec, orbsym=orbsym).ravel()) self.assertAlmostEqual(e1, e2, 9)
from pyscf.fci import cistring norb, nelec = 7, (4,4) strs = cistring.gen_strings4orblist(range(norb), nelec[0]) numpy.random.seed(11) mask = numpy.random.random(len(strs)) > .3 strsa = strs[mask] mask = numpy.random.random(len(strs)) > .2 strsb = strs[mask] ci_strs = (strsa, strsb) civec_strs = select_ci._as_SCIvector(numpy.random.random((len(strsa),len(strsb))), ci_strs) orbsym = (numpy.random.random(norb) * 4).astype(int) nn = norb*(norb+1)//2 eri = (numpy.random.random(nn*(nn+1)//2)-.2)**3 ci0 = select_ci.to_fci(civec_strs, norb, nelec) e1 = numpy.dot(civec_strs.ravel(), contract_2e(eri, civec_strs, norb, nelec, orbsym=orbsym).ravel()) e2 = numpy.dot(ci0.ravel(), direct_spin1_symm.contract_2e(eri, ci0, norb, nelec, orbsym=orbsym).ravel()) print(e1-e2) mol = gto.Mole() mol.verbose = 0 mol.output = None mol.atom = [ ['O', ( 0., 0. , 0. )], ['H', ( 0., -0.757, 0.587)], ['H', ( 0., 0.757 , 0.587)],] mol.basis = 'sto-3g' mol.symmetry = 1 mol.build() m = scf.RHF(mol).run()
from pyscf.fci import cistring norb, nelec = 7, (4,4) strs = cistring.gen_strings4orblist(range(norb), nelec[0]) numpy.random.seed(11) mask = numpy.random.random(len(strs)) > .3 strsa = strs[mask] mask = numpy.random.random(len(strs)) > .2 strsb = strs[mask] ci_strs = (strsa, strsb) civec_strs = select_ci._as_SCIvector(numpy.random.random((len(strsa),len(strsb))), ci_strs) orbsym = (numpy.random.random(norb) * 4).astype(int) nn = norb*(norb+1)//2 eri = (numpy.random.random(nn*(nn+1)//2)-.2)**3 ci0 = select_ci.to_fci(civec_strs, norb, nelec) ci0 = addons.symmetrize_wfn(ci0, norb, nelec, orbsym) civec_strs = select_ci.from_fci(ci0, civec_strs._strs, norb, nelec) e1 = numpy.dot(civec_strs.ravel(), contract_2e(eri, civec_strs, norb, nelec, orbsym=orbsym).ravel()) e2 = numpy.dot(ci0.ravel(), direct_spin1_symm.contract_2e(eri, ci0, norb, nelec, orbsym=orbsym).ravel()) print(e1-e2) mol = gto.Mole() mol.verbose = 0 mol.output = None mol.atom = [ ['O', ( 0., 0. , 0. )], ['H', ( 0., -0.757, 0.587)], ['H', ( 0., 0.757 , 0.587)],] mol.basis = 'sto-3g' mol.symmetry = 1
def test_from_to_fci(self): ci0 = select_ci.to_fci(civec_strs, norb, nelec) ci1 = select_ci.from_fci(ci0, ci_strs, norb, nelec) self.assertAlmostEqual(abs(ci1 - ci_coeff).sum(), 0, 12)
mc.fcisolver = fci.selected_ci_spin0_symm.SCI(mol) mc.fix_spin_(shift=.5, ss=0.0000) mc.fcisolver.ci_coeff_cutoff = 0.0005 mc.fcisolver.select_cutoff = 0.0005 #mc.__dict__.update(scf.chkfile.load(name+'.chk', 'mcscf')) #mo = lib.chkfile.load(name+'.chk', 'mcscf/mo_coeff') mc.kernel(mo) nmo = mc.ncore + mc.ncas rdm1, rdm2 = mc.fcisolver.make_rdm12(mc.ci, mc.ncas, mc.nelecas) rdm1, rdm2 = mcscf.addons._make_rdm12_on_mo(rdm1, rdm2, mc.ncore, mc.ncas, nmo) orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, mc.mo_coeff[:, :nmo]) natocc, natorb = symm.eigh(-rdm1, orbsym) for i, k in enumerate(numpy.argmax(abs(natorb), axis=0)): if natorb[k, i] < 0: natorb[:, i] *= -1 natorb = numpy.dot(mc.mo_coeff[:, :nmo], natorb) natocc = -natocc wfn_file = name + '.wfn' with open(wfn_file, 'w') as f2: wfn_format.write_mo(f2, mol, natorb, mo_occ=natocc) wfn_format.write_coeff(f2, mol, mc.mo_coeff[:, :nmo]) wfn_format.write_ci(f2, select_ci.to_fci(mc.ci, mc.ncas, mc.nelecas), mc.ncas, mc.nelecas, ncore=mc.ncore)
def test_from_to_fci(self): ci0 = select_ci.to_fci(civec_strs, norb, nelec) ci1 = select_ci.from_fci(ci0, ci_strs, norb, nelec) self.assertAlmostEqual(abs(ci1-ci_coeff).sum(), 0, 12)