def from_fcivec(ci0, norb, nelec, frozen=0): '''Extract CISD coefficients from FCI coefficients''' if frozen is not 0: raise NotImplementedError if isinstance(nelec, (int, numpy.number)): nelecb = nelec//2 neleca = nelec - nelecb else: neleca, nelecb = nelec norba = norbb = norb nocc = nocca, noccb = neleca, nelecb nvira = norba - nocca nvirb = norbb - noccb t1addra, t1signa = cisd.tn_addrs_signs(norba, nocca, 1) t1addrb, t1signb = cisd.tn_addrs_signs(norbb, noccb, 1) na = cistring.num_strings(norba, nocca) nb = cistring.num_strings(norbb, noccb) ci0 = ci0.reshape(na,nb) c0 = ci0[0,0] c1a = (ci0[t1addra,0] * t1signa).reshape(nocca,nvira) c1b = (ci0[0,t1addrb] * t1signb).reshape(noccb,nvirb) c2ab = numpy.einsum('i,j,ij->ij', t1signa, t1signb, ci0[t1addra[:,None],t1addrb]) c2ab = c2ab.reshape(nocca,nvira,noccb,nvirb).transpose(0,2,1,3) t2addra, t2signa = cisd.tn_addrs_signs(norba, nocca, 2) t2addrb, t2signb = cisd.tn_addrs_signs(norbb, noccb, 2) c2aa = (ci0[t2addra,0] * t2signa).reshape(nocca*(nocca-1)//2, nvira*(nvira-1)//2) c2aa = _unpack_4fold(c2aa, nocca, nvira) c2bb = (ci0[0,t2addrb] * t2signb).reshape(noccb*(noccb-1)//2, nvirb*(nvirb-1)//2) c2bb = _unpack_4fold(c2bb, noccb, nvirb) return amplitudes_to_cisdvec(c0, (c1a,c1b), (c2aa,c2ab,c2bb))
def cisdvec_to_amplitudes(civec, nmo, nocc, copy=True): nvir = nmo - nocc c0 = civec[0] cp = lambda x: (x.copy() if copy else x) c1 = cp(civec[1:nocc * nvir + 1].reshape(nocc, nvir)) c2 = ccsd._unpack_4fold(civec[nocc * nvir + 1:], nocc, nvir) return c0, c1, c2
def cisdvec_to_amplitudes(civec, nmo, nocc): norba, norbb = nmo nocca, noccb = nocc nvira = norba - nocca nvirb = norbb - noccb nooa = nocca * (nocca-1) // 2 nvva = nvira * (nvira-1) // 2 noob = noccb * (noccb-1) // 2 nvvb = nvirb * (nvirb-1) // 2 size = (1, nocca*nvira, noccb*nvirb, nocca*noccb*nvira*nvirb, nooa*nvva, noob*nvvb) loc = numpy.cumsum(size) c0 = civec[0] c1a = civec[loc[0]:loc[1]].reshape(nocca,nvira) c1b = civec[loc[1]:loc[2]].reshape(noccb,nvirb) c2ab = civec[loc[2]:loc[3]].reshape(nocca,noccb,nvira,nvirb) c2aa = _unpack_4fold(civec[loc[3]:loc[4]], nocca, nvira) c2bb = _unpack_4fold(civec[loc[4]:loc[5]], noccb, nvirb) return c0, (c1a,c1b), (c2aa,c2ab,c2bb)
def from_fcivec(ci0, norb, nelec, frozen=0): from pyscf.ci.gcisd import t2strs if frozen is not 0: raise NotImplementedError if isinstance(nelec, (int, numpy.number)): nelecb = nelec // 2 neleca = nelec - nelecb else: neleca, nelecb = nelec norba = norbb = norb nocc = nocca, noccb = neleca, nelecb nvira = norba - nocca nvirb = norbb - noccb t1addra, t1signa = cisd.t1strs(norba, nocca) t1addrb, t1signb = cisd.t1strs(norbb, noccb) na = cistring.num_strings(norba, nocca) nb = cistring.num_strings(norbb, noccb) ci0 = ci0.reshape(na, nb) c0 = ci0[0, 0] c1a = ((ci0[t1addra, 0] * t1signa).reshape(nvira, nocca).T)[::-1] c1b = ((ci0[0, t1addrb] * t1signb).reshape(nvirb, noccb).T)[::-1] c2ab = numpy.einsum('i,j,ij->ij', t1signa, t1signb, ci0[t1addra][:, t1addrb]) c2ab = c2ab.reshape(nvira, nocca, nvirb, noccb).transpose(1, 3, 0, 2) c2ab = c2ab[::-1, ::-1] t2addra, t2signa = t2strs(norba, nocca) c2aa = (ci0[t2addra, 0] * t2signa).reshape(nvira * (nvira - 1) // 2, -1).T c2aa = _unpack_4fold(c2aa[::-1], nocca, nvira) t2addrb, t2signb = t2strs(norbb, noccb) c2bb = (ci0[0, t2addrb] * t2signb).reshape(nvirb * (nvirb - 1) // 2, -1).T c2bb = _unpack_4fold(c2bb[::-1], noccb, nvirb) return amplitudes_to_cisdvec(c0, (c1a, c1b), (c2aa, c2ab, c2bb))
def cisdvec_to_amplitudes(civec, nmo, nocc): nvir = nmo - nocc c0 = civec[0] c1 = civec[1:nocc*nvir+1].reshape(nocc,nvir) c2 = ccsd._unpack_4fold(civec[nocc*nvir+1:], nocc, nvir) return c0, c1, c2