From 1e294fbd928b7326e8774496edf94ce9e9697ede Mon Sep 17 00:00:00 2001 From: Shaun Weatherly Date: Tue, 10 Dec 2024 17:43:11 -0500 Subject: [PATCH 1/7] Fixes issues identified by `ruff` and `flake8` in `pbe.py` --- src/quemb/kbe/pbe.py | 45 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/src/quemb/kbe/pbe.py b/src/quemb/kbe/pbe.py index da52e678..e60a02cd 100644 --- a/src/quemb/kbe/pbe.py +++ b/src/quemb/kbe/pbe.py @@ -22,6 +22,8 @@ ) from quemb.shared.helper import copy_docstring +from .helper import get_eri, get_scfObj, get_veff + class BE(Mixin_k_Localize): """ @@ -248,8 +250,8 @@ def __init__( for k in range(nk): dm_nocore[k] += 2.0 * numpy.dot( - self.C[k][:, self.ncore : self.ncore + self.Nocc], - self.C[k][:, self.ncore : self.ncore + self.Nocc].conj().T, + self.C[k][:, self.ncore: self.ncore + self.Nocc], + self.C[k][:, self.ncore: self.ncore + self.Nocc].conj().T, ) C_core[k] += self.C[k][:, : self.ncore] P_core[k] += numpy.dot(C_core[k], C_core[k].conj().T) @@ -493,41 +495,38 @@ def initialize(self, eri_, compute_hf, restart=False): """ if compute_hf: E_hf = 0.0 - EH1 = 0.0 - ECOUL = 0.0 - EF = 0.0 # Create a file to store ERIs if not restart: file_eri = h5py.File(self.eri_file, "w") lentmp = len(self.edge_idx) transform_parallel = False # hard set for now - for I in range(self.Nfrag): + for fidx in range(self.Nfrag): if lentmp: fobjs_ = Frags( - self.fsites[I], - I, - edge=self.edge[I], + self.fsites[fidx], + fidx, + edge=self.edge[fidx], eri_file=self.eri_file, - center=self.center[I], - edge_idx=self.edge_idx[I], - center_idx=self.center_idx[I], - efac=self.ebe_weight[I], - centerf_idx=self.centerf_idx[I], + center=self.center[fidx], + edge_idx=self.edge_idx[fidx], + center_idx=self.center_idx[fidx], + efac=self.ebe_weight[fidx], + centerf_idx=self.centerf_idx[fidx], unitcell=self.unitcell, unitcell_nkpt=self.unitcell_nkpt, ) else: fobjs_ = Frags( - self.fsites[I], - I, + self.fsites[fidx], + fidx, edge=[], center=[], eri_file=self.eri_file, edge_idx=[], center_idx=[], centerf_idx=[], - efac=self.ebe_weight[I], + efac=self.ebe_weight[fidx], unitcell=self.unitcell, unitcell_nkpt=self.unitcell_nkpt, ) @@ -667,7 +666,7 @@ def initialize(self, eri_, compute_hf, restart=False): # energy if compute_hf: - eh1, ecoul, ef = self.Fobjs[frg].energy_hf(return_e1=True) + self.Fobjs[frg].energy_hf(return_e1=True) E_hf += self.Fobjs[frg].ebe_hf print(flush=True) @@ -798,8 +797,8 @@ def update_fock(self, heff=None): for fobj in self.Fobjs: fobj.fock += fobj.heff else: - for idx, fobj in self.Fobjs: - fobj.fock += heff[idx] + for fidx, fobj in self.Fobjs: + fobj.fock += heff[fidx] def write_heff(self, heff_file="bepotfile.h5"): """ @@ -857,8 +856,8 @@ def initialize_pot(Nfrag, edge_idx): pot_ = [] if not len(edge_idx) == 0: - for I in range(Nfrag): - for i in edge_idx[I]: + for fidx in range(Nfrag): + for i in edge_idx[fidx]: for j in range(len(i)): for k in range(len(i)): if j > k: @@ -894,7 +893,6 @@ def parallel_fock_wrapper(dname, nao, dm, S, TA, hf_veff, eri_file): """ Wrapper for parallel Fock transformation """ - from .helper import get_eri, get_veff eri_ = get_eri(dname, nao, eri_file=eri_file, ignore_symm=True) veff0, veff_ = get_veff(eri_, dm, S, TA, hf_veff, return_veff0=True) @@ -906,7 +904,6 @@ def parallel_scf_wrapper(dname, nao, nocc, h1, dm_init, eri_file): """ Wrapper for performing fragment scf calculation """ - from .helper import get_eri, get_scfObj eri = get_eri(dname, nao, eri_file=eri_file) mf_ = get_scfObj(h1, eri, nocc, dm_init) From e87741bc3b07aa754bbd2f43bd99e6b9f8d72929 Mon Sep 17 00:00:00 2001 From: Shaun Weatherly Date: Tue, 10 Dec 2024 17:54:39 -0500 Subject: [PATCH 2/7] Modified missing imports in `pbe.py` --- src/quemb/kbe/pbe.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/quemb/kbe/pbe.py b/src/quemb/kbe/pbe.py index e60a02cd..e8790feb 100644 --- a/src/quemb/kbe/pbe.py +++ b/src/quemb/kbe/pbe.py @@ -16,14 +16,17 @@ from quemb.kbe.misc import print_energy, storePBE from quemb.kbe.pfrag import Frags from quemb.molbe._opt import BEOPT +from quemb.molbe.helper import ( + get_eri, + get_scfObj, + get_veff + ) from quemb.shared import be_var from quemb.shared.external.optqn import ( get_be_error_jacobian as _ext_get_be_error_jacobian, ) from quemb.shared.helper import copy_docstring -from .helper import get_eri, get_scfObj, get_veff - class BE(Mixin_k_Localize): """ From c90750f69283912cdfb0417ced75e4efc3f5a570 Mon Sep 17 00:00:00 2001 From: Shaun Weatherly Date: Tue, 10 Dec 2024 17:56:43 -0500 Subject: [PATCH 3/7] I guess `ruff` likes whitespaces before colons. --- src/quemb/kbe/pbe.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/quemb/kbe/pbe.py b/src/quemb/kbe/pbe.py index e8790feb..dd9f08cd 100644 --- a/src/quemb/kbe/pbe.py +++ b/src/quemb/kbe/pbe.py @@ -253,8 +253,8 @@ def __init__( for k in range(nk): dm_nocore[k] += 2.0 * numpy.dot( - self.C[k][:, self.ncore: self.ncore + self.Nocc], - self.C[k][:, self.ncore: self.ncore + self.Nocc].conj().T, + self.C[k][:, self.ncore : self.ncore + self.Nocc], + self.C[k][:, self.ncore : self.ncore + self.Nocc].conj().T, ) C_core[k] += self.C[k][:, : self.ncore] P_core[k] += numpy.dot(C_core[k], C_core[k].conj().T) From 960d80ae9973d1ca3e6b2b5acccb7910cf6464d7 Mon Sep 17 00:00:00 2001 From: Shaun Weatherly Date: Tue, 10 Dec 2024 18:01:24 -0500 Subject: [PATCH 4/7] Ruff fixes for modified imports. --- src/quemb/kbe/pbe.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/quemb/kbe/pbe.py b/src/quemb/kbe/pbe.py index dd9f08cd..9055f78a 100644 --- a/src/quemb/kbe/pbe.py +++ b/src/quemb/kbe/pbe.py @@ -16,11 +16,7 @@ from quemb.kbe.misc import print_energy, storePBE from quemb.kbe.pfrag import Frags from quemb.molbe._opt import BEOPT -from quemb.molbe.helper import ( - get_eri, - get_scfObj, - get_veff - ) +from quemb.molbe.helper import get_eri, get_scfObj, get_veff from quemb.shared import be_var from quemb.shared.external.optqn import ( get_be_error_jacobian as _ext_get_be_error_jacobian, From df6fce43887f0a67ac7ec8031f39f77b2638b900 Mon Sep 17 00:00:00 2001 From: Shaun Weatherly Date: Thu, 12 Dec 2024 15:29:44 -0500 Subject: [PATCH 5/7] Refactor `Frags.energy()` and `Frags.energy_hf()` to return `None` by default. --- src/quemb/kbe/pbe.py | 3 +-- src/quemb/molbe/mbe.py | 2 +- src/quemb/molbe/pfrag.py | 15 +++++++++------ src/quemb/molbe/ube.py | 4 ++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/quemb/kbe/pbe.py b/src/quemb/kbe/pbe.py index df354608..af19eb5c 100644 --- a/src/quemb/kbe/pbe.py +++ b/src/quemb/kbe/pbe.py @@ -661,9 +661,8 @@ def initialize(self, eri_, compute_hf, restart=False): * 2.0 ) - # energy if compute_hf: - self.Fobjs[frg].energy_hf(return_e1=True) + self.Fobjs[frg].energy_hf() # Updates fragment HF energy. E_hf += self.Fobjs[frg].ebe_hf print(flush=True) diff --git a/src/quemb/molbe/mbe.py b/src/quemb/molbe/mbe.py index c6f0ce8e..0221a51a 100644 --- a/src/quemb/molbe/mbe.py +++ b/src/quemb/molbe/mbe.py @@ -905,7 +905,7 @@ def initialize(self, eri_, compute_hf, restart=False): ) if compute_hf: - _, _, _ = fobjs_.energy_hf(return_e1=True) # eh1, ecoul, ef + fobjs_.energy_hf() # Updates fragment HF energy. E_hf += fobjs_.ebe_hf if not restart: diff --git a/src/quemb/molbe/pfrag.py b/src/quemb/molbe/pfrag.py index 1c34ba22..96f1aa3e 100644 --- a/src/quemb/molbe/pfrag.py +++ b/src/quemb/molbe/pfrag.py @@ -307,7 +307,7 @@ def set_udim(self, cout): cout += 1 return cout - def energy(self, rdm2s, eri=None, print_fragE=False): + def energy(self, rdm2s, eri=None, return_e=False, print_fragE=False): # This function uses old energy expression and will be removed rdm2s = numpy.einsum( "ijkl,pi,qj,rk,sl->pqrs", @@ -361,14 +361,17 @@ def energy(self, rdm2s, eri=None, print_fragE=False): ) self.ebe = etmp - return e1 + e2 + ec + if return_e: + return e1 + e2 + ec + else: + return None def energy_hf( self, rdm_hf=None, mo_coeffs=None, eri=None, - return_e1=False, + return_e=False, unrestricted=False, spin_ind=None, ): @@ -437,12 +440,12 @@ def energy_hf( self.ebe_hf = etmp - if return_e1: + if return_e: e_h1 = 0.0 e_coul = 0.0 for i in self.efac[1]: e_h1 += self.efac[0] * e1[i] e_coul += self.efac[0] * (e2[i] + ec[i]) return (e_h1, e_coul, e1 + e2 + ec) - - return e1 + e2 + ec + else: + return None diff --git a/src/quemb/molbe/ube.py b/src/quemb/molbe/ube.py index 94bf9674..420ba9b9 100644 --- a/src/quemb/molbe/ube.py +++ b/src/quemb/molbe/ube.py @@ -324,7 +324,7 @@ def initialize(self, eri_, compute_hf): if compute_hf: eh1_a, ecoul_a, ef_a = fobj_a.energy_hf( - return_e1=True, unrestricted=True, spin_ind=0 + return_e=True, unrestricted=True, spin_ind=0 ) unused(ef_a) EH1 += eh1_a @@ -347,7 +347,7 @@ def initialize(self, eri_, compute_hf): if compute_hf: eh1_b, ecoul_b, ef_b = fobj_b.energy_hf( - return_e1=True, unrestricted=True, spin_ind=1 + return_e=True, unrestricted=True, spin_ind=1 ) unused(ef_b) EH1 += eh1_b From 6c665e3e03e64e72bccfc5747cb8c89da208181a Mon Sep 17 00:00:00 2001 From: Shaun Weatherly Date: Thu, 12 Dec 2024 15:38:04 -0500 Subject: [PATCH 6/7] Rename `Frags.energy_hf` to `Frags.update_ebe_hf`. Also renamed `Frags.energy` to `Frags.update_ebe`. In both cases this makes the purpose and side-effects of the function more clear. Note that Frags.energy does not appear to be used anywhere in the code, however. --- src/quemb/kbe/pbe.py | 2 +- src/quemb/kbe/pfrag.py | 2 +- src/quemb/molbe/mbe.py | 2 +- src/quemb/molbe/pfrag.py | 4 ++-- src/quemb/molbe/solver.py | 2 +- src/quemb/molbe/ube.py | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/quemb/kbe/pbe.py b/src/quemb/kbe/pbe.py index af19eb5c..0a9ccdd4 100644 --- a/src/quemb/kbe/pbe.py +++ b/src/quemb/kbe/pbe.py @@ -662,7 +662,7 @@ def initialize(self, eri_, compute_hf, restart=False): ) if compute_hf: - self.Fobjs[frg].energy_hf() # Updates fragment HF energy. + self.Fobjs[frg].update_ebe_hf() # Updates fragment HF energy. E_hf += self.Fobjs[frg].ebe_hf print(flush=True) diff --git a/src/quemb/kbe/pfrag.py b/src/quemb/kbe/pfrag.py index 88a08451..e7e9bd58 100644 --- a/src/quemb/kbe/pfrag.py +++ b/src/quemb/kbe/pfrag.py @@ -420,7 +420,7 @@ def set_udim(self, cout): cout += 1 return cout - def energy_hf( + def update_ebe_hf( self, rdm_hf=None, mo_coeffs=None, eri=None, return_e1=False, unrestricted=False ): if mo_coeffs is None: diff --git a/src/quemb/molbe/mbe.py b/src/quemb/molbe/mbe.py index 0221a51a..076539a1 100644 --- a/src/quemb/molbe/mbe.py +++ b/src/quemb/molbe/mbe.py @@ -905,7 +905,7 @@ def initialize(self, eri_, compute_hf, restart=False): ) if compute_hf: - fobjs_.energy_hf() # Updates fragment HF energy. + fobjs_.update_ebe_hf() # Updates fragment HF energy. E_hf += fobjs_.ebe_hf if not restart: diff --git a/src/quemb/molbe/pfrag.py b/src/quemb/molbe/pfrag.py index 96f1aa3e..1efaa9d4 100644 --- a/src/quemb/molbe/pfrag.py +++ b/src/quemb/molbe/pfrag.py @@ -307,7 +307,7 @@ def set_udim(self, cout): cout += 1 return cout - def energy(self, rdm2s, eri=None, return_e=False, print_fragE=False): + def update_ebe(self, rdm2s, eri=None, return_e=False, print_fragE=False): # This function uses old energy expression and will be removed rdm2s = numpy.einsum( "ijkl,pi,qj,rk,sl->pqrs", @@ -366,7 +366,7 @@ def energy(self, rdm2s, eri=None, return_e=False, print_fragE=False): else: return None - def energy_hf( + def update_ebe_hf( self, rdm_hf=None, mo_coeffs=None, diff --git a/src/quemb/molbe/solver.py b/src/quemb/molbe/solver.py index 2f882970..6b581e9b 100644 --- a/src/quemb/molbe/solver.py +++ b/src/quemb/molbe/solver.py @@ -304,7 +304,7 @@ def be_func( veff0=fobj.veff0, ) total_e = [sum(x) for x in zip(total_e, e_f)] - fobj.energy_hf() + fobj.update_ebe_hf() if frag_energy or eeval: Ecorr = sum(total_e) diff --git a/src/quemb/molbe/ube.py b/src/quemb/molbe/ube.py index 420ba9b9..6257256b 100644 --- a/src/quemb/molbe/ube.py +++ b/src/quemb/molbe/ube.py @@ -323,7 +323,7 @@ def initialize(self, eri_, compute_hf): ) if compute_hf: - eh1_a, ecoul_a, ef_a = fobj_a.energy_hf( + eh1_a, ecoul_a, ef_a = fobj_a.update_ebe_hf( return_e=True, unrestricted=True, spin_ind=0 ) unused(ef_a) @@ -346,7 +346,7 @@ def initialize(self, eri_, compute_hf): ) if compute_hf: - eh1_b, ecoul_b, ef_b = fobj_b.energy_hf( + eh1_b, ecoul_b, ef_b = fobj_b.update_ebe_hf( return_e=True, unrestricted=True, spin_ind=1 ) unused(ef_b) From 7ccce6337813eed25158a093b03a5d1e5126d94e Mon Sep 17 00:00:00 2001 From: Oskar Weser Date: Thu, 12 Dec 2024 18:18:02 -0500 Subject: [PATCH 7/7] removed unused molbe `ubpdate_ebe` function (happened after talking to Shaun) --- src/quemb/molbe/pfrag.py | 59 ---------------------------------------- 1 file changed, 59 deletions(-) diff --git a/src/quemb/molbe/pfrag.py b/src/quemb/molbe/pfrag.py index 5ebcd34b..fe62368a 100644 --- a/src/quemb/molbe/pfrag.py +++ b/src/quemb/molbe/pfrag.py @@ -306,65 +306,6 @@ def set_udim(self, cout): cout += 1 return cout - def update_ebe(self, rdm2s, eri=None, return_e=False, print_fragE=False): - # This function uses old energy expression and will be removed - rdm2s = numpy.einsum( - "ijkl,pi,qj,rk,sl->pqrs", - 0.5 * rdm2s, - *([self.mo_coeffs] * 4), - optimize=True, - ) - - e1 = 2.0 * numpy.einsum( - "ij,ij->i", self.h1[: self.nfsites], self._rdm1[: self.nfsites] - ) - ec = numpy.einsum( - "ij,ij->i", self.veff[: self.nfsites], self._rdm1[: self.nfsites] - ) - - if self.TA.ndim == 3: - jmax = self.TA[0].shape[1] - else: - jmax = self.TA.shape[1] - - if eri is None: - r = h5py.File(self.eri_file, "r") - eri = r[self.dname][()] - r.close() - - e2 = numpy.zeros_like(e1) - for i in range(self.nfsites): - for j in range(jmax): - ij = i * (i + 1) // 2 + j if i > j else j * (j + 1) // 2 + i - Gij = rdm2s[i, j, :jmax, :jmax].copy() - Gij[numpy.diag_indices(jmax)] *= 0.5 - Gij += Gij.T - - e2[i] += Gij[numpy.tril_indices(jmax)] @ eri[ij] - - e_ = e1 + e2 + ec - etmp = 0.0 - e1_ = 0.0 - ec_ = 0.0 - e2_ = 0.0 - for i in self.efac[1]: - etmp += self.efac[0] * e_[i] - e1_ += self.efac[0] * e1[i] - ec_ += self.efac[0] * ec[i] - e2_ += self.efac[0] * e2[i] - - print( - "BE Energy Frag-{:>3} {:>12.7f} {:>12.7f} {:>12.7f}; Total : {:>12.7f}".format( # noqa: E501 - self.dname, e1_, ec_, e2_, etmp - ) - ) - - self.ebe = etmp - if return_e: - return e1 + e2 + ec - else: - return None - def update_ebe_hf( self, rdm_hf=None,