Iteration 0007 — 2eb53381cda9 (accepted)¶
GitHub commit: 2eb53381cda9 Published branch: fermilink-optimize/pyscf-casscf
Change summary¶
Use lazy density-fitted JK for Newton-CASSCF AH Hessian-vector response contractions while keeping exact AO2MO/CASCI energies and strict convergence checks unchanged
Acceptance rationale¶
Correctness passed and the primary metric improved by ~52.65% without forbidden cache or final-answer reuse.
Guardrails & metrics¶
field |
value |
|---|---|
decision |
ACCEPTED |
correctness |
ok |
correctness mode |
field_tolerances |
hard reject |
no |
guardrail errors |
0 |
incumbent commit |
|
candidate commit |
|
incumbent metric |
102.444 |
candidate metric |
48.5098 |
baseline metric |
102.444 |
Δ vs incumbent |
+52.647% (lower-is-better sign) |
changed files |
pyscf/mcscf/newton_casscf.py |
Diffstat¶
pyscf/mcscf/newton_casscf.py | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
Diff¶
diff --git a/pyscf/mcscf/newton_casscf.py b/pyscf/mcscf/newton_casscf.py
index da2c677e4..b695365d3 100644
--- a/pyscf/mcscf/newton_casscf.py
+++ b/pyscf/mcscf/newton_casscf.py
@@ -29,6 +29,7 @@ from pyscf.lib import logger
from pyscf.mcscf import casci, mc1step, addons
from pyscf.mcscf.casci import get_fock, cas_natorb, canonicalize
from pyscf import scf
+from pyscf import df
from pyscf.soscf import ciah
def _pack_ci_get_H (mc, mo, ci0):
@@ -851,6 +852,29 @@ class CASSCF(mc1step.CASSCF):
e_tot, e_tot-elast, ss[0])
return e_tot, e_cas, fcivec
+ def update_jk_in_ah(self, mo, r, casdm1, eris):
+ ncore = self.ncore
+ ncas = self.ncas
+ nocc = ncore + ncas
+
+ dm3 = reduce(numpy.dot, (mo[:,:ncore], r[:ncore,ncore:], mo[:,ncore:].T))
+ dm3 = dm3 + dm3.T
+ dm4 = reduce(numpy.dot, (mo[:,ncore:nocc], casdm1, r[ncore:nocc], mo.T))
+ dm4 = dm4 + dm4.T
+
+ with_df = getattr(self, '_ah_jk_df', None)
+ if with_df is None or with_df.mol is not self.mol:
+ with_df = df.DF(self.mol)
+ with_df.max_memory = self.max_memory
+ with_df.stdout = self.stdout
+ with_df.verbose = self.verbose
+ self._ah_jk_df = with_df
+
+ vj, vk = with_df.get_jk((dm3, dm3*2+dm4), hermi=1)
+ va = reduce(numpy.dot, (casdm1, mo[:,ncore:nocc].T, vj[0]*2-vk[0], mo))
+ vc = reduce(numpy.dot, (mo[:,:ncore].T, vj[1]*2-vk[1], mo[:,ncore:]))
+ return va, vc
+
def update_ao2mo(self, mo):
raise DeprecationWarning('update_ao2mo was obsoleted since pyscf v1.0. '
'Use .ao2mo method instead')