def get_vind(self, mf): '''Compute Ax''' singlet = self.singlet cell = mf.cell kpts = mf.kpts mo_coeff = mf.mo_coeff mo_energy = mf.mo_energy mo_occ = mf.mo_occ nkpts = len(mo_occ) nao, nmo = mo_coeff[0][0].shape occidxa = [numpy.where(mo_occ[0][k]> 0)[0] for k in range(nkpts)] occidxb = [numpy.where(mo_occ[1][k]> 0)[0] for k in range(nkpts)] viridxa = [numpy.where(mo_occ[0][k]==0)[0] for k in range(nkpts)] viridxb = [numpy.where(mo_occ[1][k]==0)[0] for k in range(nkpts)] orboa = [mo_coeff[0][k][:,occidxa[k]] for k in range(nkpts)] orbob = [mo_coeff[1][k][:,occidxb[k]] for k in range(nkpts)] orbva = [mo_coeff[0][k][:,viridxa[k]] for k in range(nkpts)] orbvb = [mo_coeff[1][k][:,viridxb[k]] for k in range(nkpts)] e_ai_a = _get_eai(mo_energy[0], mo_occ[0]) e_ai_b = _get_eai(mo_energy[1], mo_occ[1]) hdiag = numpy.hstack([x.ravel() for x in (e_ai_a + e_ai_b)]) tot_x_a = sum(x.size for x in e_ai_a) tot_x_b = sum(x.size for x in e_ai_b) mem_now = lib.current_memory()[0] max_memory = max(2000, self.max_memory*.8-mem_now) vresp = _gen_uhf_response(mf, hermi=0, max_memory=max_memory) def vind(zs): nz = len(zs) zs = [_unpack(z, mo_occ) for z in zs] dmvo = numpy.empty((2,nz,nkpts,nao,nao), dtype=numpy.complex128) for i in range(nz): dm1a, dm1b = zs[i] for k in range(nkpts): dmvo[0,i,k] = reduce(numpy.dot, (orbva[k], dm1a[k], orboa[k].T.conj())) dmvo[1,i,k] = reduce(numpy.dot, (orbvb[k], dm1b[k], orbob[k].T.conj())) v1ao = vresp(dmvo) v1s = [] for i in range(nz): dm1a, dm1b = zs[i] v1as = [] v1bs = [] for k in range(nkpts): v1a = reduce(numpy.dot, (orbva[k].T.conj(), v1ao[0,i,k], orboa[k])) v1b = reduce(numpy.dot, (orbvb[k].T.conj(), v1ao[1,i,k], orbob[k])) v1a += e_ai_a[k] * dm1a[k] v1b += e_ai_b[k] * dm1b[k] v1as.append(v1a.ravel()) v1bs.append(v1b.ravel()) v1s += v1as + v1bs return numpy.hstack(v1s).reshape(nz,-1) return vind, hdiag
def _gen_hop_uhf_external(mf, verbose=None): cell = mf.cell mo_coeff = mf.mo_coeff mo_occ = mf.mo_occ nkpts = len(mo_occ[0]) occidxa = [numpy.where(mo_occ[0][k]>0)[0] for k in range(nkpts)] occidxb = [numpy.where(mo_occ[1][k]>0)[0] for k in range(nkpts)] viridxa = [numpy.where(mo_occ[0][k]==0)[0] for k in range(nkpts)] viridxb = [numpy.where(mo_occ[1][k]==0)[0] for k in range(nkpts)] nocca = [len(occidxa[k]) for k in range(nkpts)] noccb = [len(occidxb[k]) for k in range(nkpts)] nvira = [len(viridxa[k]) for k in range(nkpts)] nvirb = [len(viridxb[k]) for k in range(nkpts)] moa, mob = mo_coeff orboa = [moa[k][:,occidxa[k]] for k in range(nkpts)] orbva = [moa[k][:,viridxa[k]] for k in range(nkpts)] orbob = [mob[k][:,occidxb[k]] for k in range(nkpts)] orbvb = [mob[k][:,viridxb[k]] for k in range(nkpts)] h1e = mf.get_hcore() dm0 = mf.make_rdm1(mo_coeff, mo_occ) fock_ao = h1e + mf.get_veff(cell, dm0) focka = [reduce(numpy.dot, (moa[k].T.conj(), fock_ao[0][k], moa[k])) for k in range(nkpts)] fockb = [reduce(numpy.dot, (mob[k].T.conj(), fock_ao[1][k], mob[k])) for k in range(nkpts)] fooa = [focka[k][occidxa[k][:,None],occidxa[k]] for k in range(nkpts)] fvva = [focka[k][viridxa[k][:,None],viridxa[k]] for k in range(nkpts)] foob = [fockb[k][occidxb[k][:,None],occidxb[k]] for k in range(nkpts)] fvvb = [fockb[k][viridxb[k][:,None],viridxb[k]] for k in range(nkpts)] hdiagab = [fvva[k].diagonal().real[:,None] - foob[k].diagonal().real for k in range(nkpts)] hdiagba = [fvvb[k].diagonal().real[:,None] - fooa[k].diagonal().real for k in range(nkpts)] hdiag2 = numpy.hstack([x.ravel() for x in (hdiagab + hdiagba)]) vresp1 = _gen_uhf_response(mf, with_j=False, hermi=0) def hop_uhf2ghf(x1): x1ab = [] x1ba = [] ip = 0 for k in range(nkpts): nv = nvira[k] no = noccb[k] x1ab.append(x1[ip:ip+nv*no].reshape(nv,no)) ip += nv * no for k in range(nkpts): nv = nvirb[k] no = nocca[k] x1ba.append(x1[ip:ip+nv*no].reshape(nv,no)) ip += nv * no dm1ab = [] dm1ba = [] for k in range(nkpts): d1ab = reduce(numpy.dot, (orbva[k], x1ab[k], orbob[k].T.conj())) d1ba = reduce(numpy.dot, (orbvb[k], x1ba[k], orboa[k].T.conj())) dm1ab.append(d1ab+d1ba.T.conj()) dm1ba.append(d1ba+d1ab.T.conj()) v1ao = vresp1(lib.asarray([dm1ab,dm1ba])) x2ab = [0] * nkpts x2ba = [0] * nkpts for k in range(nkpts): x2ab[k] = numpy.einsum('pr,rq->pq', fvva[k], x1ab[k]) x2ab[k]-= numpy.einsum('sq,ps->pq', foob[k], x1ab[k]) x2ba[k] = numpy.einsum('pr,rq->pq', fvvb[k], x1ba[k]) x2ba[k]-= numpy.einsum('qs,ps->pq', fooa[k], x1ba[k]) x2ab[k] += reduce(numpy.dot, (orbva[k].T.conj(), v1ao[0][k], orbob[k])) x2ba[k] += reduce(numpy.dot, (orbvb[k].T.conj(), v1ao[1][k], orboa[k])) return numpy.hstack([x.real.ravel() for x in (x2ab+x2ba)]) return hop_uhf2ghf, hdiag2
def gen_vind(self, mf): singlet = self.singlet cell = mf.cell kpts = mf.kpts mo_coeff = mf.mo_coeff mo_energy = mf.mo_energy mo_occ = mf.mo_occ nkpts = len(mo_occ) nao, nmo = mo_coeff[0][0].shape occidxa = [numpy.where(mo_occ[0][k] > 0)[0] for k in range(nkpts)] occidxb = [numpy.where(mo_occ[1][k] > 0)[0] for k in range(nkpts)] viridxa = [numpy.where(mo_occ[0][k] == 0)[0] for k in range(nkpts)] viridxb = [numpy.where(mo_occ[1][k] == 0)[0] for k in range(nkpts)] orboa = [mo_coeff[0][k][:, occidxa[k]] for k in range(nkpts)] orbob = [mo_coeff[1][k][:, occidxb[k]] for k in range(nkpts)] orbva = [mo_coeff[0][k][:, viridxa[k]] for k in range(nkpts)] orbvb = [mo_coeff[1][k][:, viridxb[k]] for k in range(nkpts)] e_ia_a = _get_e_ia(mo_energy[0], mo_occ[0]) e_ia_b = _get_e_ia(mo_energy[1], mo_occ[1]) hdiag = numpy.hstack([x.ravel() for x in (e_ia_a + e_ia_b)]) hdiag = numpy.hstack((hdiag, hdiag)) tot_x_a = sum(x.size for x in e_ia_a) tot_x_b = sum(x.size for x in e_ia_b) tot_x = tot_x_a + tot_x_b mem_now = lib.current_memory()[0] max_memory = max(2000, self.max_memory * .8 - mem_now) vresp = _gen_uhf_response(mf, hermi=0, max_memory=max_memory) def vind(xys): nz = len(xys) x1s = [_unpack(x[:tot_x], mo_occ) for x in xys] y1s = [_unpack(x[tot_x:], mo_occ) for x in xys] dmov = numpy.empty((2, nz, nkpts, nao, nao), dtype=numpy.complex128) for i in range(nz): xa, xb = x1s[i] ya, yb = y1s[i] for k in range(nkpts): dmx = reduce(numpy.dot, (orboa[k], xa[k], orbva[k].conj().T)) dmy = reduce(numpy.dot, (orbva[k], ya[k].T, orboa[k].conj().T)) dmov[0, i, k] = dmx + dmy # AX + BY dmx = reduce(numpy.dot, (orbob[k], xb[k], orbvb[k].conj().T)) dmy = reduce(numpy.dot, (orbvb[k], yb[k].T, orbob[k].conj().T)) dmov[1, i, k] = dmx + dmy # AX + BY with lib.temporary_env(mf, exxdiv=None): dmov = dmov.reshape(2 * nz, nkpts, nao, nao) v1ao = vresp(dmov) v1ao = v1ao.reshape(2, nz, nkpts, nao, nao) v1s = [] for i in range(nz): xa, xb = x1s[i] ya, yb = y1s[i] v1xsa = [] v1xsb = [] v1ysa = [] v1ysb = [] for k in range(nkpts): v1xa = reduce(numpy.dot, (orboa[k].conj().T, v1ao[0, i, k], orbva[k])) v1xb = reduce(numpy.dot, (orbob[k].conj().T, v1ao[1, i, k], orbvb[k])) v1ya = reduce( numpy.dot, (orbva[k].conj().T, v1ao[0, i, k], orboa[k])).T v1yb = reduce( numpy.dot, (orbvb[k].conj().T, v1ao[1, i, k], orbob[k])).T v1xa += e_ia_a[k] * xa[k] v1xb += e_ia_b[k] * xb[k] v1ya += e_ia_a[k] * ya[k] v1yb += e_ia_b[k] * yb[k] v1xsa.append(v1xa.ravel()) v1xsb.append(v1xb.ravel()) v1ysa.append(-v1ya.ravel()) v1ysb.append(-v1yb.ravel()) v1s += v1xsa + v1xsb + v1ysa + v1ysb return numpy.hstack(v1s).reshape(nz, -1) return vind, hdiag
def _gen_hop_uhf_external(mf, verbose=None): cell = mf.cell mo_coeff = mf.mo_coeff mo_occ = mf.mo_occ nkpts = len(mo_occ[0]) occidxa = [numpy.where(mo_occ[0][k] > 0)[0] for k in range(nkpts)] occidxb = [numpy.where(mo_occ[1][k] > 0)[0] for k in range(nkpts)] viridxa = [numpy.where(mo_occ[0][k] == 0)[0] for k in range(nkpts)] viridxb = [numpy.where(mo_occ[1][k] == 0)[0] for k in range(nkpts)] nocca = [len(occidxa[k]) for k in range(nkpts)] noccb = [len(occidxb[k]) for k in range(nkpts)] nvira = [len(viridxa[k]) for k in range(nkpts)] nvirb = [len(viridxb[k]) for k in range(nkpts)] moa, mob = mo_coeff orboa = [moa[k][:, occidxa[k]] for k in range(nkpts)] orbva = [moa[k][:, viridxa[k]] for k in range(nkpts)] orbob = [mob[k][:, occidxb[k]] for k in range(nkpts)] orbvb = [mob[k][:, viridxb[k]] for k in range(nkpts)] h1e = mf.get_hcore() dm0 = mf.make_rdm1(mo_coeff, mo_occ) fock_ao = h1e + mf.get_veff(cell, dm0) focka = [ reduce(numpy.dot, (moa[k].T.conj(), fock_ao[0][k], moa[k])) for k in range(nkpts) ] fockb = [ reduce(numpy.dot, (mob[k].T.conj(), fock_ao[1][k], mob[k])) for k in range(nkpts) ] fooa = [focka[k][occidxa[k][:, None], occidxa[k]] for k in range(nkpts)] fvva = [focka[k][viridxa[k][:, None], viridxa[k]] for k in range(nkpts)] foob = [fockb[k][occidxb[k][:, None], occidxb[k]] for k in range(nkpts)] fvvb = [fockb[k][viridxb[k][:, None], viridxb[k]] for k in range(nkpts)] hdiagab = [ fvva[k].diagonal().reshape(-1, 1) - foob[k].diagonal() for k in range(nkpts) ] hdiagba = [ fvvb[k].diagonal().reshape(-1, 1) - fooa[k].diagonal() for k in range(nkpts) ] hdiag2 = numpy.hstack([x.ravel() for x in (hdiagab + hdiagba)]) vresp1 = _gen_uhf_response(mf, with_j=False, hermi=0) def hop_uhf2ghf(x1): x1ab = [] x1ba = [] ip = 0 for k in range(nkpts): nv = nvira[k] no = noccb[k] x1ab.append(x1[ip:ip + nv * no].reshape(nv, no)) ip += nv * no for k in range(nkpts): nv = nvirb[k] no = nocca[k] x1ba.append(x1[ip:ip + nv * no].reshape(nv, no)) ip += nv * no dm1ab = [] dm1ba = [] for k in range(nkpts): d1ab = reduce(numpy.dot, (orbva[k], x1ab[k], orbob[k].T.conj())) d1ba = reduce(numpy.dot, (orbvb[k], x1ba[k], orboa[k].T.conj())) dm1ab.append(d1ab + d1ba.T.conj()) dm1ba.append(d1ba + d1ab.T.conj()) v1ao = vresp1(lib.asarray([dm1ab, dm1ba])) x2ab = [0] * nkpts x2ba = [0] * nkpts for k in range(nkpts): x2ab[k] = numpy.einsum('pr,rq->pq', fvva[k], x1ab[k]) x2ab[k] -= numpy.einsum('sq,ps->pq', foob[k], x1ab[k]) x2ba[k] = numpy.einsum('pr,rq->pq', fvvb[k], x1ba[k]) x2ba[k] -= numpy.einsum('qs,ps->pq', fooa[k], x1ba[k]) x2ab[k] += reduce(numpy.dot, (orbva[k].T.conj(), v1ao[0][k], orbob[k])) x2ba[k] += reduce(numpy.dot, (orbvb[k].T.conj(), v1ao[1][k], orboa[k])) return numpy.hstack([x.ravel() for x in (x2ab + x2ba)]) return hop_uhf2ghf, hdiag2
def get_vind(self, mf): '''Compute Ax''' singlet = self.singlet cell = mf.cell kpts = mf.kpts mo_coeff = mf.mo_coeff mo_energy = mf.mo_energy mo_occ = mf.mo_occ nkpts = len(mo_occ) nao, nmo = mo_coeff[0][0].shape occidxa = [numpy.where(mo_occ[0][k]> 0)[0] for k in range(nkpts)] occidxb = [numpy.where(mo_occ[1][k]> 0)[0] for k in range(nkpts)] viridxa = [numpy.where(mo_occ[0][k]==0)[0] for k in range(nkpts)] viridxb = [numpy.where(mo_occ[1][k]==0)[0] for k in range(nkpts)] orboa = [mo_coeff[0][k][:,occidxa[k]] for k in range(nkpts)] orbob = [mo_coeff[1][k][:,occidxb[k]] for k in range(nkpts)] orbva = [mo_coeff[0][k][:,viridxa[k]] for k in range(nkpts)] orbvb = [mo_coeff[1][k][:,viridxb[k]] for k in range(nkpts)] e_ia_a = _get_e_ia(mo_energy[0], mo_occ[0]) e_ia_b = _get_e_ia(mo_energy[1], mo_occ[1]) hdiag = numpy.hstack([x.ravel() for x in (e_ia_a + e_ia_b)]) tot_x_a = sum(x.size for x in e_ia_a) tot_x_b = sum(x.size for x in e_ia_b) mem_now = lib.current_memory()[0] max_memory = max(2000, self.max_memory*.8-mem_now) vresp = _gen_uhf_response(mf, hermi=0, max_memory=max_memory) def vind(zs): nz = len(zs) zs = [_unpack(z, mo_occ) for z in zs] dmov = numpy.empty((2,nz,nkpts,nao,nao), dtype=numpy.complex128) for i in range(nz): dm1a, dm1b = zs[i] for k in range(nkpts): dmov[0,i,k] = reduce(numpy.dot, (orboa[k], dm1a[k], orbva[k].conj().T)) dmov[1,i,k] = reduce(numpy.dot, (orbob[k], dm1b[k], orbvb[k].conj().T)) with lib.temporary_env(mf, exxdiv=None): dmov = dmov.reshape(2*nz,nkpts,nao,nao) v1ao = vresp(dmov) v1ao = v1ao.reshape(2,nz,nkpts,nao,nao) v1s = [] for i in range(nz): dm1a, dm1b = zs[i] v1as = [] v1bs = [] for k in range(nkpts): v1a = reduce(numpy.dot, (orboa[k].conj().T, v1ao[0,i,k], orbva[k])) v1b = reduce(numpy.dot, (orbob[k].conj().T, v1ao[1,i,k], orbvb[k])) v1a += e_ia_a[k] * dm1a[k] v1b += e_ia_b[k] * dm1b[k] v1as.append(v1a.ravel()) v1bs.append(v1b.ravel()) v1s += v1as + v1bs return numpy.hstack(v1s).reshape(nz,-1) return vind, hdiag
def get_vind(self, mf): singlet = self.singlet cell = mf.cell kpts = mf.kpts mo_coeff = mf.mo_coeff mo_energy = mf.mo_energy mo_occ = mf.mo_occ nkpts = len(mo_occ) nao, nmo = mo_coeff[0][0].shape occidxa = [numpy.where(mo_occ[0][k]> 0)[0] for k in range(nkpts)] occidxb = [numpy.where(mo_occ[1][k]> 0)[0] for k in range(nkpts)] viridxa = [numpy.where(mo_occ[0][k]==0)[0] for k in range(nkpts)] viridxb = [numpy.where(mo_occ[1][k]==0)[0] for k in range(nkpts)] orboa = [mo_coeff[0][k][:,occidxa[k]] for k in range(nkpts)] orbob = [mo_coeff[1][k][:,occidxb[k]] for k in range(nkpts)] orbva = [mo_coeff[0][k][:,viridxa[k]] for k in range(nkpts)] orbvb = [mo_coeff[1][k][:,viridxb[k]] for k in range(nkpts)] e_ia_a = _get_e_ia(mo_energy[0], mo_occ[0]) e_ia_b = _get_e_ia(mo_energy[1], mo_occ[1]) hdiag = numpy.hstack([x.ravel() for x in (e_ia_a + e_ia_b)]) hdiag = numpy.hstack((hdiag, hdiag)) tot_x_a = sum(x.size for x in e_ia_a) tot_x_b = sum(x.size for x in e_ia_b) tot_x = tot_x_a + tot_x_b mem_now = lib.current_memory()[0] max_memory = max(2000, self.max_memory*.8-mem_now) vresp = _gen_uhf_response(mf, hermi=0, max_memory=max_memory) def vind(xys): nz = len(xys) x1s = [_unpack(x[:tot_x], mo_occ) for x in xys] y1s = [_unpack(x[tot_x:], mo_occ) for x in xys] dmov = numpy.empty((2,nz,nkpts,nao,nao), dtype=numpy.complex128) for i in range(nz): xa, xb = x1s[i] ya, yb = y1s[i] for k in range(nkpts): dmx = reduce(numpy.dot, (orboa[k], xa[k] , orbva[k].conj().T)) dmy = reduce(numpy.dot, (orbva[k], ya[k].T, orboa[k].conj().T)) dmov[0,i,k] = dmx + dmy # AX + BY dmx = reduce(numpy.dot, (orbob[k], xb[k] , orbvb[k].conj().T)) dmy = reduce(numpy.dot, (orbvb[k], yb[k].T, orbob[k].conj().T)) dmov[1,i,k] = dmx + dmy # AX + BY with lib.temporary_env(mf, exxdiv=None): dmov = dmov.reshape(2*nz,nkpts,nao,nao) v1ao = vresp(dmov) v1ao = v1ao.reshape(2,nz,nkpts,nao,nao) v1s = [] for i in range(nz): xa, xb = x1s[i] ya, yb = y1s[i] v1xsa = [] v1xsb = [] v1ysa = [] v1ysb = [] for k in range(nkpts): v1xa = reduce(numpy.dot, (orboa[k].conj().T, v1ao[0,i,k], orbva[k])) v1xb = reduce(numpy.dot, (orbob[k].conj().T, v1ao[1,i,k], orbvb[k])) v1ya = reduce(numpy.dot, (orbva[k].conj().T, v1ao[0,i,k], orboa[k])).T v1yb = reduce(numpy.dot, (orbvb[k].conj().T, v1ao[1,i,k], orbob[k])).T v1xa+= e_ia_a[k] * xa[k] v1xb+= e_ia_b[k] * xb[k] v1ya+= e_ia_a[k] * ya[k] v1yb+= e_ia_b[k] * yb[k] v1xsa.append(v1xa.ravel()) v1xsb.append(v1xb.ravel()) v1ysa.append(-v1ya.ravel()) v1ysb.append(-v1yb.ravel()) v1s += v1xsa + v1xsb + v1ysa + v1ysb return numpy.hstack(v1s).reshape(nz,-1) return vind, hdiag