def test_linkstr_index(self): idx1 = cistring.gen_linkstr_index_o0(range(4), 2) idx2 = cistring.gen_linkstr_index(range(4), 2) idx23 = numpy.array([ [0, 0, 3, 1], [3, 3, 3, 1], [1, 0, 4, 1], [2, 0, 5, 1], [1, 3, 0, 1], [2, 3, 1, 1], ]) self.assertTrue(numpy.all(idx1[:, :, 2:] == idx2[:, :, 2:])) self.assertTrue(numpy.all(idx23 == idx2[3])) idx1 = cistring.gen_linkstr_index(range(7), 3) idx2 = cistring.reform_linkstr_index(idx1) idx3 = cistring.gen_linkstr_index_trilidx(range(7), 3) idx3[:, :, 1] = 0 self.assertTrue(numpy.all(idx2 == idx3)) tab1 = cistring.gen_cre_str_index_o0(range(8), 4) tab2 = cistring.gen_cre_str_index_o1(range(8), 4) self.assertAlmostEqual(abs(tab1 - tab2).max(), 0, 12) tab1 = cistring.gen_des_str_index_o0(range(8), 4) tab2 = cistring.gen_des_str_index_o1(range(8), 4) self.assertAlmostEqual(abs(tab1 - tab2).max(), 0, 12) tab1 = cistring.gen_linkstr_index_o0(range(8), 4) tab2 = cistring.gen_linkstr_index(range(8), 4) self.assertAlmostEqual(abs(tab1 - tab2).sum(), 0, 12) tab3 = cistring.gen_linkstr_index_o1(range(8), 4) self.assertAlmostEqual(abs(tab1 - tab3).sum(), 0, 12)
def contract_2e(eri, fcivec, norb, nelec, opt=None): if isinstance(nelec, (int, numpy.number)): nelecb = nelec//2 neleca = nelec - nelecb else: neleca, nelecb = nelec link_indexa = cistring.gen_linkstr_index_o0(range(norb), neleca) link_indexb = cistring.gen_linkstr_index_o0(range(norb), nelecb) na = cistring.num_strings(norb, neleca) nb = cistring.num_strings(norb, nelecb) ci0 = fcivec.reshape(na,nb) t1 = numpy.zeros((norb,norb,na,nb)) for str0, tab in enumerate(link_indexa): for a, i, str1, sign in tab: t1[a,i,str1] += sign * ci0[str0] for str0, tab in enumerate(link_indexb): for a, i, str1, sign in tab: t1[a,i,:,str1] += sign * ci0[:,str0] t1 = numpy.dot(eri.reshape(norb*norb,-1), t1.reshape(norb*norb,-1)) t1 = t1.reshape(norb,norb,na,nb) fcinew = numpy.zeros_like(ci0) for str0, tab in enumerate(link_indexa): for a, i, str1, sign in tab: fcinew[str1] += sign * t1[a,i,str0] for str0, tab in enumerate(link_indexb): for a, i, str1, sign in tab: fcinew[:,str1] += sign * t1[a,i,:,str0] return fcinew.reshape(fcivec.shape)
def test_linkstr_index(self): idx1 = cistring.gen_linkstr_index_o0(range(4), 2) idx2 = cistring.gen_linkstr_index(range(4), 2) idx23 = numpy.array([[0, 0, 3, 1], [3, 3, 3, 1], [1, 0, 4, 1], [2, 0, 5, 1], [1, 3, 0, 1], [2, 3, 1, 1],]) self.assertTrue(numpy.all(idx1[:,:,2:] == idx2[:,:,2:])) self.assertTrue(numpy.all(idx23 == idx2[3])) idx1 = cistring.gen_linkstr_index(range(7), 3) idx2 = cistring.reform_linkstr_index(idx1) idx3 = cistring.gen_linkstr_index_trilidx(range(7), 3) idx3[:,:,1] = 0 self.assertTrue(numpy.all(idx2 == idx3)) tab1 = cistring.gen_cre_str_index_o0(range(8), 4) tab2 = cistring.gen_cre_str_index_o1(range(8), 4) self.assertAlmostEqual(abs(tab1 - tab2).max(), 0, 12) tab1 = cistring.gen_des_str_index_o0(range(8), 4) tab2 = cistring.gen_des_str_index_o1(range(8), 4) self.assertAlmostEqual(abs(tab1 - tab2).max(), 0, 12) tab1 = cistring.gen_linkstr_index_o0(range(8), 4) tab2 = cistring.gen_linkstr_index(range(8), 4) self.assertAlmostEqual(abs(tab1 - tab2).sum(), 0, 12) tab3 = cistring.gen_linkstr_index_o1(range(8), 4) self.assertAlmostEqual(abs(tab1 - tab3).sum(), 0, 12)
def contract_2e(eri, fcivec, norb, nelec, opt=None): if isinstance(nelec, (int, numpy.number)): nelecb = nelec // 2 neleca = nelec - nelecb else: neleca, nelecb = nelec link_indexa = cistring.gen_linkstr_index_o0(range(norb), neleca) link_indexb = cistring.gen_linkstr_index_o0(range(norb), nelecb) na = cistring.num_strings(norb, neleca) nb = cistring.num_strings(norb, nelecb) ci0 = fcivec.reshape(na, nb) t1 = numpy.zeros((norb, norb, na, nb)) for str0, tab in enumerate(link_indexa): for a, i, str1, sign in tab: t1[a, i, str1] += sign * ci0[str0] for str0, tab in enumerate(link_indexb): for a, i, str1, sign in tab: t1[a, i, :, str1] += sign * ci0[:, str0] t1 = numpy.dot(eri.reshape(norb * norb, -1), t1.reshape(norb * norb, -1)) t1 = t1.reshape(norb, norb, na, nb) fcinew = numpy.zeros_like(ci0) for str0, tab in enumerate(link_indexa): for a, i, str1, sign in tab: fcinew[str1] += sign * t1[a, i, str0] for str0, tab in enumerate(link_indexb): for a, i, str1, sign in tab: fcinew[:, str1] += sign * t1[a, i, :, str0] return fcinew.reshape(fcivec.shape)
def contract_1e(f1e, fcivec, norb, nelec): if isinstance(nelec, (int, numpy.number)): nelecb = nelec//2 neleca = nelec - nelecb else: neleca, nelecb = nelec link_indexa = cistring.gen_linkstr_index_o0(range(norb), neleca) link_indexb = cistring.gen_linkstr_index_o0(range(norb), nelecb) na = cistring.num_strings(norb, neleca) nb = cistring.num_strings(norb, nelecb) ci0 = fcivec.reshape(na,nb) t1 = numpy.zeros((norb,norb,na,nb)) for str0, tab in enumerate(link_indexa): for a, i, str1, sign in tab: t1[a,i,str1] += sign * ci0[str0] for str0, tab in enumerate(link_indexb): for a, i, str1, sign in tab: t1[a,i,:,str1] += sign * ci0[:,str0] fcinew = numpy.dot(f1e.reshape(-1), t1.reshape(-1,na*nb)) return fcinew.reshape(fcivec.shape)
def contract_1e(f1e, fcivec, norb, nelec): if isinstance(nelec, (int, numpy.number)): nelecb = nelec // 2 neleca = nelec - nelecb else: neleca, nelecb = nelec link_indexa = cistring.gen_linkstr_index_o0(range(norb), neleca) link_indexb = cistring.gen_linkstr_index_o0(range(norb), nelecb) na = cistring.num_strings(norb, neleca) nb = cistring.num_strings(norb, nelecb) ci0 = fcivec.reshape(na, nb) t1 = numpy.zeros((norb, norb, na, nb)) for str0, tab in enumerate(link_indexa): for a, i, str1, sign in tab: t1[a, i, str1] += sign * ci0[str0] for str0, tab in enumerate(link_indexb): for a, i, str1, sign in tab: t1[a, i, :, str1] += sign * ci0[:, str0] fcinew = numpy.dot(f1e.reshape(-1), t1.reshape(-1, na * nb)) return fcinew.reshape(fcivec.shape)
def contract_1e(f1e, fcivec, norb, nelec): link_indexa = cistring.gen_linkstr_index_o0(range(norb), nelec) na = cistring.num_strings(norb, nelec) t1 = numpy.zeros((norb, norb, na), dtype=numpy.complex128) for str0, tab in enumerate(link_indexa): for a, i, str1, sign in tab: t1[a, i, str1] += sign * fcivec[str0] fcinew = numpy.dot(f1e.reshape(-1), t1.reshape(-1, na)) return fcinew.reshape(fcivec.shape)
def make_hdiag(h1e, g2e, norb, nelec, opt=None): if isinstance(nelec, (int, numpy.number)): nelecb = nelec//2 neleca = nelec - nelecb else: neleca, nelecb = nelec link_indexa = cistring.gen_linkstr_index_o0(range(norb), neleca) link_indexb = cistring.gen_linkstr_index_o0(range(norb), nelecb) occslista = [tab[:neleca,0] for tab in link_indexa] occslistb = [tab[:nelecb,0] for tab in link_indexb] g2e = ao2mo.restore(1, g2e, norb) diagj = numpy.einsum('iijj->ij',g2e) diagk = numpy.einsum('ijji->ij',g2e) hdiag = [] for aocc in occslista: for bocc in occslistb: e1 = h1e[aocc,aocc].sum() + h1e[bocc,bocc].sum() e2 = diagj[aocc][:,aocc].sum() + diagj[aocc][:,bocc].sum() \ + diagj[bocc][:,aocc].sum() + diagj[bocc][:,bocc].sum() \ - diagk[aocc][:,aocc].sum() - diagk[bocc][:,bocc].sum() hdiag.append(e1 + e2*.5) return numpy.array(hdiag)
def make_hdiag(h1e, g2e, norb, nelec, opt=None): if isinstance(nelec, (int, numpy.number)): nelecb = nelec // 2 neleca = nelec - nelecb else: neleca, nelecb = nelec link_indexa = cistring.gen_linkstr_index_o0(range(norb), neleca) link_indexb = cistring.gen_linkstr_index_o0(range(norb), nelecb) occslista = [tab[:neleca, 0] for tab in link_indexa] occslistb = [tab[:nelecb, 0] for tab in link_indexb] g2e = ao2mo.restore(1, g2e, norb) diagj = numpy.einsum('iijj->ij', g2e) diagk = numpy.einsum('ijji->ij', g2e) hdiag = [] for aocc in occslista: for bocc in occslistb: e1 = h1e[aocc, aocc].sum() + h1e[bocc, bocc].sum() e2 = diagj[aocc][:,aocc].sum() + diagj[aocc][:,bocc].sum() \ + diagj[bocc][:,aocc].sum() + diagj[bocc][:,bocc].sum() \ - diagk[aocc][:,aocc].sum() - diagk[bocc][:,bocc].sum() hdiag.append(e1 + e2 * .5) return numpy.array(hdiag)
def make_hdiag(h1e, g2e, norb, nelec, opt=None): link_indexa = cistring.gen_linkstr_index_o0(range(norb), nelec) occslista = [tab[:nelec, 0] for tab in link_indexa] #g2e = pyscf.ao2mo.restore(1, g2e, norb) diagj = numpy.einsum('iijj->ij', g2e) diagk = numpy.einsum('ijji->ij', g2e) hdiag = [] for aocc in occslista: e1 = h1e[aocc, aocc].sum() e2 = diagj[aocc][:, aocc].sum() - diagk[aocc][:, aocc].sum() hdiag.append(e1 + e2 * .5) return numpy.array(hdiag)
def test_linkstr_index(self): idx1 = cistring.gen_linkstr_index_o0(range(4), 2) idx2 = cistring.gen_linkstr_index(range(4), 2) idx23 = numpy.array([[0, 0, 3, 1], [3, 3, 3, 1], [1, 0, 4, 1], [2, 0, 5, 1], [1, 3, 0, 1], [2, 3, 1, 1],]) self.assertTrue(numpy.all(idx1[:,:,2:] == idx2[:,:,2:])) self.assertTrue(numpy.all(idx23 == idx2[3])) idx1 = cistring.gen_linkstr_index(range(7), 3) idx2 = cistring.reform_linkstr_index(idx1) idx3 = cistring.gen_linkstr_index_trilidx(range(7), 3) idx3[:,:,1] = 0 self.assertTrue(numpy.all(idx2 == idx3))
def contract_2e(eri, fcivec, norb, nelec, opt=None): link_indexa = cistring.gen_linkstr_index_o0(range(norb), nelec) na = cistring.num_strings(norb, nelec) ci0 = fcivec t1 = numpy.zeros((norb, norb, na), dtype=numpy.complex128) for str0, tab in enumerate(link_indexa): for a, i, str1, sign in tab: t1[a, i, str1] += sign * ci0[str0] t1 = numpy.dot(eri.reshape(norb * norb, -1), t1.reshape(norb * norb, -1)) t1 = t1.reshape(norb, norb, na) fcinew = numpy.zeros_like(ci0, dtype=numpy.complex128) for str0, tab in enumerate(link_indexa): for a, i, str1, sign in tab: fcinew[str1] += sign * t1[a, i, str0] return fcinew.reshape(fcivec.shape)