77import numpy as np
88from numpy .typing import NDArray
99
10+ from ._materialize import DEFAULT_COMPRESSED_LIMIT_BYTES , guard_compressed_values_allocation
11+ from ._select import estimate_canonical_select_size
1012from .exchange_hankel import get_exchange_kernels_hankel
1113from .exchange_laguerre import (
1214 QuadratureParams ,
2123_FAST_LAGUERRE_PASSTHROUGH_KEYS = {
2224 "adaptive_nquad" ,
2325 "canonical_select_max_entries" ,
26+ "compressed_limit_bytes" ,
2427 "kappa" ,
2528 "nquad" ,
2629 "potential" ,
@@ -93,6 +96,37 @@ def apply(rho: ComplexArray, include_minus: bool = True) -> ComplexArray:
9396 return apply
9497
9598
99+ def _guard_compressed_kernel_values (
100+ G_magnitudes : RealArray ,
101+ G_angles : RealArray ,
102+ nmax : int ,
103+ * ,
104+ select : Iterable [Quad ] | None ,
105+ compressed_limit_bytes : float | int | None ,
106+ backend_name : str ,
107+ ) -> tuple [RealArray , RealArray , list [Quad ] | None ]:
108+ G_magnitudes_arr = cast (RealArray , np .asarray (G_magnitudes , dtype = np .float64 ).ravel ())
109+ G_angles_arr = cast (RealArray , np .asarray (G_angles , dtype = np .float64 ).ravel ())
110+ if G_magnitudes_arr .shape != G_angles_arr .shape :
111+ raise ValueError ("G_magnitudes and G_angles must have the same shape." )
112+
113+ select_list : list [Quad ] | None
114+ if select is None :
115+ select_list = None
116+ n_select = estimate_canonical_select_size (int (nmax ))
117+ else :
118+ select_list = [cast (Quad , tuple (int (x ) for x in quad )) for quad in select ]
119+ n_select = len (select_list )
120+
121+ guard_compressed_values_allocation (
122+ nG = int (G_magnitudes_arr .size ),
123+ n_select = int (n_select ),
124+ compressed_limit_bytes = compressed_limit_bytes ,
125+ backend_name = backend_name ,
126+ )
127+ return G_magnitudes_arr , G_angles_arr , select_list
128+
129+
96130def _build_compressed_constructor_hf (
97131 values : ComplexArray ,
98132 select : list [Quad ],
@@ -295,6 +329,10 @@ def get_fockmatrix_constructor(
295329 """
296330
297331 chosen = (method or "laguerre" ).strip ().lower ()
332+ backend_kwargs = dict (kwargs )
333+ compressed_limit_bytes = backend_kwargs .pop (
334+ "compressed_limit_bytes" , DEFAULT_COMPRESSED_LIMIT_BYTES
335+ )
298336 backend : Any
299337 if chosen in {"hankel" , "hk" }:
300338 backend = get_exchange_kernels_hankel
@@ -317,14 +355,23 @@ def get_fockmatrix_constructor(
317355 "Use 'laguerre', 'ogata', or 'hankel'."
318356 )
319357
358+ G_magnitudes_arr , G_angles_arr , select_list = _guard_compressed_kernel_values (
359+ G_magnitudes ,
360+ G_angles ,
361+ nmax ,
362+ select = select ,
363+ compressed_limit_bytes = compressed_limit_bytes ,
364+ backend_name = f"{ chosen } exchange kernels" ,
365+ )
366+
320367 values , select_list = cast (
321368 tuple [ComplexArray , list [Quad ]],
322369 backend (
323- G_magnitudes ,
324- G_angles ,
370+ G_magnitudes_arr ,
371+ G_angles_arr ,
325372 nmax ,
326- select = select ,
327- ** kwargs ,
373+ select = select_list ,
374+ ** backend_kwargs ,
328375 ),
329376 )
330377
@@ -349,6 +396,10 @@ def get_fockmatrix_constructor_hf(
349396 Σ^F_{n m}(G) = - Σ_{r,t} X_{m r n t}(G) ρ^*_{t r}(G).
350397 """
351398 chosen = (method or "laguerre" ).strip ().lower ()
399+ backend_kwargs = dict (kwargs )
400+ compressed_limit_bytes = backend_kwargs .pop (
401+ "compressed_limit_bytes" , DEFAULT_COMPRESSED_LIMIT_BYTES
402+ )
352403 backend : Any
353404 if chosen in {"hankel" , "hk" }:
354405 backend = get_exchange_kernels_hankel
@@ -362,14 +413,23 @@ def get_fockmatrix_constructor_hf(
362413 "Use 'laguerre', 'ogata', or 'hankel'."
363414 )
364415
416+ G_magnitudes_arr , G_angles_arr , select_list = _guard_compressed_kernel_values (
417+ G_magnitudes ,
418+ G_angles ,
419+ nmax ,
420+ select = select ,
421+ compressed_limit_bytes = compressed_limit_bytes ,
422+ backend_name = f"{ chosen } exchange kernels" ,
423+ )
424+
365425 values , select_list = cast (
366426 tuple [ComplexArray , list [Quad ]],
367427 backend (
368- G_magnitudes ,
369- G_angles ,
428+ G_magnitudes_arr ,
429+ G_angles_arr ,
370430 nmax ,
371- select = select ,
372- ** kwargs ,
431+ select = select_list ,
432+ ** backend_kwargs ,
373433 ),
374434 )
375435 return _build_compressed_constructor_hf (values , select_list , nmax )
0 commit comments