def test_h2o_rdm(self): mol = mol_s2 mf = mf_s2 mycc = uccsd.UCCSD(mf) mycc.frozen = 2 ecc, t1, t2 = mycc.kernel() l1, l2 = mycc.solve_lambda() dm1a, dm1b = mycc.make_rdm1(t1, t2, l1, l2) dm2aa, dm2ab, dm2bb = mycc.make_rdm2(t1, t2, l1, l2) mo_a = mf.mo_coeff[0] mo_b = mf.mo_coeff[1] nmoa = mo_a.shape[1] nmob = mo_b.shape[1] eriaa = ao2mo.kernel(mf._eri, mo_a, compact=False).reshape([nmoa] * 4) eribb = ao2mo.kernel(mf._eri, mo_b, compact=False).reshape([nmob] * 4) eriab = ao2mo.kernel(mf._eri, (mo_a, mo_a, mo_b, mo_b), compact=False) eriab = eriab.reshape([nmoa, nmoa, nmob, nmob]) hcore = mf.get_hcore() h1a = reduce(numpy.dot, (mo_a.T.conj(), hcore, mo_a)) h1b = reduce(numpy.dot, (mo_b.T.conj(), hcore, mo_b)) e1 = numpy.einsum('ij,ji', h1a, dm1a) e1 += numpy.einsum('ij,ji', h1b, dm1b) e1 += numpy.einsum('ijkl,ijkl', eriaa, dm2aa) * .5 e1 += numpy.einsum('ijkl,ijkl', eriab, dm2ab) e1 += numpy.einsum('ijkl,ijkl', eribb, dm2bb) * .5 e1 += mol.energy_nuc() self.assertAlmostEqual(e1, mycc.e_tot, 7) d1 = uccsd_rdm._gamma1_intermediates(mycc, mycc.t1, mycc.t2, mycc.l1, mycc.l2) mycc.max_memory = 0 d2 = uccsd_rdm._gamma2_intermediates(mycc, mycc.t1, mycc.t2, mycc.l1, mycc.l2, True) dm2 = uccsd_rdm._make_rdm2(mycc, d1, d2, with_dm1=True, with_frozen=True) e1 = numpy.einsum('ij,ji', h1a, dm1a) e1 += numpy.einsum('ij,ji', h1b, dm1b) e1 += numpy.einsum('ijkl,ijkl', eriaa, dm2[0]) * .5 e1 += numpy.einsum('ijkl,ijkl', eriab, dm2[1]) e1 += numpy.einsum('ijkl,ijkl', eribb, dm2[2]) * .5 e1 += mol.energy_nuc() self.assertAlmostEqual(e1, mycc.e_tot, 7)
def test_h2o_rdm(self): mol = mol_s2 mf = mf_s2 mycc = uccsd.UCCSD(mf) mycc.frozen = 2 ecc, t1, t2 = mycc.kernel() l1, l2 = mycc.solve_lambda() dm1a,dm1b = mycc.make_rdm1(t1, t2, l1, l2) dm2aa,dm2ab,dm2bb = mycc.make_rdm2(t1, t2, l1, l2) mo_a = mf.mo_coeff[0] mo_b = mf.mo_coeff[1] nmoa = mo_a.shape[1] nmob = mo_b.shape[1] eriaa = ao2mo.kernel(mf._eri, mo_a, compact=False).reshape([nmoa]*4) eribb = ao2mo.kernel(mf._eri, mo_b, compact=False).reshape([nmob]*4) eriab = ao2mo.kernel(mf._eri, (mo_a,mo_a,mo_b,mo_b), compact=False) eriab = eriab.reshape([nmoa,nmoa,nmob,nmob]) hcore = mf.get_hcore() h1a = reduce(numpy.dot, (mo_a.T.conj(), hcore, mo_a)) h1b = reduce(numpy.dot, (mo_b.T.conj(), hcore, mo_b)) e1 = numpy.einsum('ij,ji', h1a, dm1a) e1+= numpy.einsum('ij,ji', h1b, dm1b) e1+= numpy.einsum('ijkl,ijkl', eriaa, dm2aa) * .5 e1+= numpy.einsum('ijkl,ijkl', eriab, dm2ab) e1+= numpy.einsum('ijkl,ijkl', eribb, dm2bb) * .5 e1+= mol.energy_nuc() self.assertAlmostEqual(e1, mycc.e_tot, 7) d1 = uccsd_rdm._gamma1_intermediates(mycc, mycc.t1, mycc.t2, mycc.l1, mycc.l2) mycc.max_memory = 0 d2 = uccsd_rdm._gamma2_intermediates(mycc, mycc.t1, mycc.t2, mycc.l1, mycc.l2, True) dm2 = uccsd_rdm._make_rdm2(mycc, d1, d2, with_dm1=True, with_frozen=True) e1 = numpy.einsum('ij,ji', h1a, dm1a) e1+= numpy.einsum('ij,ji', h1b, dm1b) e1+= numpy.einsum('ijkl,ijkl', eriaa, dm2[0]) * .5 e1+= numpy.einsum('ijkl,ijkl', eriab, dm2[1]) e1+= numpy.einsum('ijkl,ijkl', eribb, dm2[2]) * .5 e1+= mol.energy_nuc() self.assertAlmostEqual(e1, mycc.e_tot, 7)
def _gamma2_intermediates(mycc, t1, t2, l1, l2, eris=None, compress_vvvv=False): d2 = uccsd_rdm._gamma2_intermediates(mycc, t1, t2, l1, l2) if eris is None: eris = mycc.ao2mo() dovov, dovOV, dOVov, dOVOV = d2[0] dvvvv, dvvVV, dVVvv, dVVVV = d2[1] doooo, dooOO, dOOoo, dOOOO = d2[2] doovv, dooVV, dOOvv, dOOVV = d2[3] dovvo, dovVO, dOVvo, dOVVO = d2[4] dvvov, dvvOV, dVVov, dVVOV = d2[5] dovvv, dovVV, dOVvv, dOVVV = d2[6] dooov, dooOV, dOOov, dOOOV = d2[7] t1a, t1b = t1 t2aa, t2ab, t2bb = t2 nocca, noccb, nvira, nvirb = t2ab.shape nmoa = eris.focka.shape[0] nmob = eris.fockb.shape[0] mo_ea = eris.focka.diagonal().real mo_eb = eris.fockb.diagonal().real eia = mo_ea[:nocca, None] - mo_ea[nocca:] eIA = mo_eb[:noccb, None] - mo_eb[noccb:] fvo = eris.focka[nocca:, :nocca] fVO = eris.fockb[noccb:, :noccb] # aaa d3 = lib.direct_sum('ia+jb+kc->ijkabc', eia, eia, eia) w = numpy.einsum('ijae,kceb->ijkabc', t2aa, numpy.asarray(eris.get_ovvv()).conj()) w -= numpy.einsum('mkbc,iajm->ijkabc', t2aa, numpy.asarray(eris.ovoo.conj())) v = numpy.einsum('jbkc,ia->ijkabc', numpy.asarray(eris.ovov).conj(), t1a) v += numpy.einsum('jkbc,ai->ijkabc', t2aa, fvo) * .5 rw = r6(p6(w)) / d3 wvd = r6(p6(w * 2 + v)) / d3 dovov += numpy.einsum('ia,ijkabc->jbkc', t1a, rw.conj()) * 0.25 # *(1/8) instead of (1/4) because ooov appears 4 times in the 2pdm tensor due # to symmetrization, and its contribution is scaled by 1/2 in Tr(H,2pdm) dooov -= numpy.einsum('mkbc,ijkabc->jmia', t2aa, wvd.conj()) * .125 dovvv += numpy.einsum('kjcf,ijkabc->iafb', t2aa, wvd.conj()) * .125 # bbb d3 = lib.direct_sum('ia+jb+kc->ijkabc', eIA, eIA, eIA) w = numpy.einsum('ijae,kceb->ijkabc', t2bb, numpy.asarray(eris.get_OVVV()).conj()) w -= numpy.einsum('imab,kcjm->ijkabc', t2bb, numpy.asarray(eris.OVOO.conj())) v = numpy.einsum('jbkc,ia->ijkabc', numpy.asarray(eris.OVOV).conj(), t1b) v += numpy.einsum('jkbc,ai->ijkabc', t2bb, fVO) * .5 rw = r6(p6(w)) / d3 wvd = r6(p6(w * 2 + v)) / d3 dOVOV += numpy.einsum('ia,ijkabc->jbkc', t1b, rw.conj()) * .25 dOOOV -= numpy.einsum('mkbc,ijkabc->jmia', t2bb, wvd.conj()) * .125 dOVVV += numpy.einsum('kjcf,ijkabc->iafb', t2bb, wvd.conj()) * .125 # baa d3 = lib.direct_sum('ia+jb+kc->ijkabc', eIA, eia, eia) w = numpy.einsum('jIeA,kceb->IjkAbc', t2ab, numpy.asarray(eris.get_ovvv()).conj()) * 2 w += numpy.einsum('jIbE,kcEA->IjkAbc', t2ab, numpy.asarray(eris.get_ovVV()).conj()) * 2 w += numpy.einsum('jkbe,IAec->IjkAbc', t2aa, numpy.asarray(eris.get_OVvv()).conj()) w -= numpy.einsum('mIbA,kcjm->IjkAbc', t2ab, numpy.asarray(eris.ovoo).conj()) * 2 w -= numpy.einsum('jMbA,kcIM->IjkAbc', t2ab, numpy.asarray(eris.ovOO).conj()) * 2 w -= numpy.einsum('jmbc,IAkm->IjkAbc', t2aa, numpy.asarray(eris.OVoo).conj()) v = numpy.einsum('jbkc,IA->IjkAbc', numpy.asarray(eris.ovov).conj(), t1b) v += numpy.einsum('kcIA,jb->IjkAbc', numpy.asarray(eris.ovOV).conj(), t1a) v += numpy.einsum('kcIA,jb->IjkAbc', numpy.asarray(eris.ovOV).conj(), t1a) v += numpy.einsum('jkbc,AI->IjkAbc', t2aa, fVO) * .5 v += numpy.einsum('kIcA,bj->IjkAbc', t2ab, fvo) * 2 rw = r4(w) / d3 wvd = r4(w * 2 + v) / d3 dovvv += numpy.einsum('jiea,ijkabc->kceb', t2ab, wvd.conj()) * .25 dovVV += numpy.einsum('jibe,ijkabc->kcea', t2ab, wvd.conj()) * .25 dOVvv += numpy.einsum('jkbe,ijkabc->iaec', t2aa, wvd.conj()) * .125 dooov -= numpy.einsum('miba,ijkabc->jmkc', t2ab, wvd.conj()) * .25 dOOov -= numpy.einsum('jmba,ijkabc->imkc', t2ab, wvd.conj()) * .25 dooOV -= numpy.einsum('jmbc,ijkabc->kmia', t2aa, wvd.conj()) * .125 dovov += numpy.einsum('ia,ijkabc->jbkc', t1b, rw.conj()) * .25 #dOVov += numpy.einsum('jb,ijkabc->iakc', t1a, rw.conj()) * .25 dovOV += numpy.einsum('jb,ijkabc->kcia', t1a, rw.conj()) * .25 # bba d3 = lib.direct_sum('ia+jb+kc->ijkabc', eia, eIA, eIA) w = numpy.einsum('ijae,kceb->ijkabc', t2ab, numpy.asarray(eris.get_OVVV()).conj()) * 2 w += numpy.einsum('ijeb,kcea->ijkabc', t2ab, numpy.asarray(eris.get_OVvv()).conj()) * 2 w += numpy.einsum('jkbe,iaec->ijkabc', t2bb, numpy.asarray(eris.get_ovVV()).conj()) w -= numpy.einsum('imab,kcjm->ijkabc', t2ab, numpy.asarray(eris.OVOO).conj()) * 2 w -= numpy.einsum('mjab,kcim->ijkabc', t2ab, numpy.asarray(eris.OVoo).conj()) * 2 w -= numpy.einsum('jmbc,iakm->ijkabc', t2bb, numpy.asarray(eris.ovOO).conj()) v = numpy.einsum('jbkc,ia->ijkabc', numpy.asarray(eris.OVOV).conj(), t1a) v += numpy.einsum('iakc,jb->ijkabc', numpy.asarray(eris.ovOV).conj(), t1b) v += numpy.einsum('iakc,jb->ijkabc', numpy.asarray(eris.ovOV).conj(), t1b) v += numpy.einsum('JKBC,ai->iJKaBC', t2bb, fvo) * .5 v += numpy.einsum('iKaC,BJ->iJKaBC', t2ab, fVO) * 2 rw = r4(w) / d3 wvd = r4(w * 2 + v) / d3 dOVVV += numpy.einsum('ijae,ijkabc->kceb', t2ab, wvd.conj()) * .25 dOVvv += numpy.einsum('ijeb,ijkabc->kcea', t2ab, wvd.conj()) * .25 dovVV += numpy.einsum('jkbe,ijkabc->iaec', t2bb, wvd.conj()) * .125 dOOOV -= numpy.einsum('imab,ijkabc->jmkc', t2ab, wvd.conj()) * .25 dooOV -= numpy.einsum('mjab,ijkabc->imkc', t2ab, wvd.conj()) * .25 dOOov -= numpy.einsum('jmbc,ijkabc->kmia', t2bb, wvd.conj()) * .125 dOVOV += numpy.einsum('ia,ijkabc->jbkc', t1a, rw.conj()) * .25 dovOV += numpy.einsum('jb,ijkabc->iakc', t1b, rw.conj()) * .25 #dOVov += numpy.einsum('jb,ijkabc->kcia', t1b, rw.conj()) * .25 if compress_vvvv: nmoa, nmob = mycc.nmo nocca, noccb, nvira, nvirb = t2ab.shape idxa = numpy.tril_indices(nvira) idxa = idxa[0] * nvira + idxa[1] idxb = numpy.tril_indices(nvirb) idxb = idxb[0] * nvirb + idxb[1] dvvvv = dvvvv + dvvvv.transpose(1, 0, 2, 3) dvvvv = lib.take_2d(dvvvv.reshape(nvira**2, nvira**2), idxa, idxa) dvvvv *= .5 dvvVV = dvvVV + dvvVV.transpose(1, 0, 2, 3) dvvVV = lib.take_2d(dvvVV.reshape(nvira**2, nvirb**2), idxa, idxb) dVVVV = dVVVV + dVVVV.transpose(1, 0, 2, 3) dVVVV = lib.take_2d(dVVVV.reshape(nvirb**2, nvirb**2), idxb, idxb) dVVVV *= .5 d2 = ((dovov, dovOV, dOVov, dOVOV), (dvvvv, dvvVV, dVVvv, dVVVV), (doooo, dooOO, dOOoo, dOOOO), (doovv, dooVV, dOOvv, dOOVV), (dovvo, dovVO, dOVvo, dOVVO), (dvvov, dvvOV, dVVov, dVVOV), (dovvv, dovVV, dOVvv, dOVVV), (dooov, dooOV, dOOov, dOOOV)) return d2
def _gamma2_intermediates(mycc, t1, t2, l1, l2, eris=None, compress_vvvv=False): d2 = uccsd_rdm._gamma2_intermediates(mycc, t1, t2, l1, l2) if eris is None: eris = mycc.ao2mo() dovov, dovOV, dOVov, dOVOV = d2[0] dvvvv, dvvVV, dVVvv, dVVVV = d2[1] doooo, dooOO, dOOoo, dOOOO = d2[2] doovv, dooVV, dOOvv, dOOVV = d2[3] dovvo, dovVO, dOVvo, dOVVO = d2[4] dvvov, dvvOV, dVVov, dVVOV = d2[5] dovvv, dovVV, dOVvv, dOVVV = d2[6] dooov, dooOV, dOOov, dOOOV = d2[7] t1a, t1b = t1 t2aa, t2ab, t2bb = t2 nocca, noccb, nvira, nvirb = t2ab.shape nmoa = eris.focka.shape[0] nmob = eris.fockb.shape[0] mo_ea, mo_eb = eris.mo_energy eia = mo_ea[:nocca,None] - mo_ea[nocca:] eIA = mo_eb[:noccb,None] - mo_eb[noccb:] fvo = eris.focka[nocca:,:nocca] fVO = eris.fockb[noccb:,:noccb] # aaa d3 = lib.direct_sum('ia+jb+kc->ijkabc', eia, eia, eia) w = numpy.einsum('ijae,kceb->ijkabc', t2aa, numpy.asarray(eris.get_ovvv()).conj()) w-= numpy.einsum('mkbc,iajm->ijkabc', t2aa, numpy.asarray(eris.ovoo.conj())) v = numpy.einsum('jbkc,ia->ijkabc', numpy.asarray(eris.ovov).conj(), t1a) v+= numpy.einsum('jkbc,ai->ijkabc', t2aa, fvo) * .5 rw = r6(p6(w)) / d3 wvd = r6(p6(w * 2 + v)) / d3 dovov += numpy.einsum('ia,ijkabc->jbkc', t1a, rw.conj()) * 0.25 # *(1/8) instead of (1/4) because ooov appears 4 times in the 2pdm tensor due # to symmetrization, and its contribution is scaled by 1/2 in Tr(H,2pdm) dooov -= numpy.einsum('mkbc,ijkabc->jmia', t2aa, wvd.conj()) * .125 dovvv += numpy.einsum('kjcf,ijkabc->iafb', t2aa, wvd.conj()) * .125 # bbb d3 = lib.direct_sum('ia+jb+kc->ijkabc', eIA, eIA, eIA) w = numpy.einsum('ijae,kceb->ijkabc', t2bb, numpy.asarray(eris.get_OVVV()).conj()) w-= numpy.einsum('imab,kcjm->ijkabc', t2bb, numpy.asarray(eris.OVOO.conj())) v = numpy.einsum('jbkc,ia->ijkabc', numpy.asarray(eris.OVOV).conj(), t1b) v+= numpy.einsum('jkbc,ai->ijkabc', t2bb, fVO) * .5 rw = r6(p6(w)) / d3 wvd = r6(p6(w * 2 + v)) / d3 dOVOV += numpy.einsum('ia,ijkabc->jbkc', t1b, rw.conj()) * .25 dOOOV -= numpy.einsum('mkbc,ijkabc->jmia', t2bb, wvd.conj()) * .125 dOVVV += numpy.einsum('kjcf,ijkabc->iafb', t2bb, wvd.conj()) * .125 # baa d3 = lib.direct_sum('ia+jb+kc->ijkabc', eIA, eia, eia) w = numpy.einsum('jIeA,kceb->IjkAbc', t2ab, numpy.asarray(eris.get_ovvv()).conj()) * 2 w += numpy.einsum('jIbE,kcEA->IjkAbc', t2ab, numpy.asarray(eris.get_ovVV()).conj()) * 2 w += numpy.einsum('jkbe,IAec->IjkAbc', t2aa, numpy.asarray(eris.get_OVvv()).conj()) w -= numpy.einsum('mIbA,kcjm->IjkAbc', t2ab, numpy.asarray(eris.ovoo).conj()) * 2 w -= numpy.einsum('jMbA,kcIM->IjkAbc', t2ab, numpy.asarray(eris.ovOO).conj()) * 2 w -= numpy.einsum('jmbc,IAkm->IjkAbc', t2aa, numpy.asarray(eris.OVoo).conj()) v = numpy.einsum('jbkc,IA->IjkAbc', numpy.asarray(eris.ovov).conj(), t1b) v += numpy.einsum('kcIA,jb->IjkAbc', numpy.asarray(eris.ovOV).conj(), t1a) v += numpy.einsum('kcIA,jb->IjkAbc', numpy.asarray(eris.ovOV).conj(), t1a) v += numpy.einsum('jkbc,AI->IjkAbc', t2aa, fVO) * .5 v += numpy.einsum('kIcA,bj->IjkAbc', t2ab, fvo) * 2 rw = r4(w) / d3 wvd = r4(w * 2 + v) / d3 dovvv += numpy.einsum('jiea,ijkabc->kceb', t2ab, wvd.conj()) * .25 dovVV += numpy.einsum('jibe,ijkabc->kcea', t2ab, wvd.conj()) * .25 dOVvv += numpy.einsum('jkbe,ijkabc->iaec', t2aa, wvd.conj()) * .125 dooov -= numpy.einsum('miba,ijkabc->jmkc', t2ab, wvd.conj()) * .25 dOOov -= numpy.einsum('jmba,ijkabc->imkc', t2ab, wvd.conj()) * .25 dooOV -= numpy.einsum('jmbc,ijkabc->kmia', t2aa, wvd.conj()) * .125 dovov += numpy.einsum('ia,ijkabc->jbkc', t1b, rw.conj()) * .25 #dOVov += numpy.einsum('jb,ijkabc->iakc', t1a, rw.conj()) * .25 dovOV += numpy.einsum('jb,ijkabc->kcia', t1a, rw.conj()) * .25 # bba d3 = lib.direct_sum('ia+jb+kc->ijkabc', eia, eIA, eIA) w = numpy.einsum('ijae,kceb->ijkabc', t2ab, numpy.asarray(eris.get_OVVV()).conj()) * 2 w += numpy.einsum('ijeb,kcea->ijkabc', t2ab, numpy.asarray(eris.get_OVvv()).conj()) * 2 w += numpy.einsum('jkbe,iaec->ijkabc', t2bb, numpy.asarray(eris.get_ovVV()).conj()) w -= numpy.einsum('imab,kcjm->ijkabc', t2ab, numpy.asarray(eris.OVOO).conj()) * 2 w -= numpy.einsum('mjab,kcim->ijkabc', t2ab, numpy.asarray(eris.OVoo).conj()) * 2 w -= numpy.einsum('jmbc,iakm->ijkabc', t2bb, numpy.asarray(eris.ovOO).conj()) v = numpy.einsum('jbkc,ia->ijkabc', numpy.asarray(eris.OVOV).conj(), t1a) v += numpy.einsum('iakc,jb->ijkabc', numpy.asarray(eris.ovOV).conj(), t1b) v += numpy.einsum('iakc,jb->ijkabc', numpy.asarray(eris.ovOV).conj(), t1b) v += numpy.einsum('JKBC,ai->iJKaBC', t2bb, fvo) * .5 v += numpy.einsum('iKaC,BJ->iJKaBC', t2ab, fVO) * 2 rw = r4(w) / d3 wvd = r4(w * 2 + v) / d3 dOVVV += numpy.einsum('ijae,ijkabc->kceb', t2ab, wvd.conj()) * .25 dOVvv += numpy.einsum('ijeb,ijkabc->kcea', t2ab, wvd.conj()) * .25 dovVV += numpy.einsum('jkbe,ijkabc->iaec', t2bb, wvd.conj()) * .125 dOOOV -= numpy.einsum('imab,ijkabc->jmkc', t2ab, wvd.conj()) * .25 dooOV -= numpy.einsum('mjab,ijkabc->imkc', t2ab, wvd.conj()) * .25 dOOov -= numpy.einsum('jmbc,ijkabc->kmia', t2bb, wvd.conj()) * .125 dOVOV += numpy.einsum('ia,ijkabc->jbkc', t1a, rw.conj()) * .25 dovOV += numpy.einsum('jb,ijkabc->iakc', t1b, rw.conj()) * .25 #dOVov += numpy.einsum('jb,ijkabc->kcia', t1b, rw.conj()) * .25 if compress_vvvv: nmoa, nmob = mycc.nmo nocca, noccb, nvira, nvirb = t2ab.shape idxa = numpy.tril_indices(nvira) idxa = idxa[0] * nvira + idxa[1] idxb = numpy.tril_indices(nvirb) idxb = idxb[0] * nvirb + idxb[1] dvvvv = dvvvv + dvvvv.transpose(1,0,2,3) dvvvv = lib.take_2d(dvvvv.reshape(nvira**2,nvira**2), idxa, idxa) dvvvv *= .5 dvvVV = dvvVV + dvvVV.transpose(1,0,2,3) dvvVV = lib.take_2d(dvvVV.reshape(nvira**2,nvirb**2), idxa, idxb) dVVVV = dVVVV + dVVVV.transpose(1,0,2,3) dVVVV = lib.take_2d(dVVVV.reshape(nvirb**2,nvirb**2), idxb, idxb) dVVVV *= .5 d2 = ((dovov, dovOV, dOVov, dOVOV), (dvvvv, dvvVV, dVVvv, dVVVV), (doooo, dooOO, dOOoo, dOOOO), (doovv, dooVV, dOOvv, dOOVV), (dovvo, dovVO, dOVvo, dOVVO), (dvvov, dvvOV, dVVov, dVVOV), (dovvv, dovVV, dOVvv, dOVVV), (dooov, dooOV, dOOov, dOOOV)) return d2