Skip to content

Commit 10139fb

Browse files
committed
refactor: analytical computations build optimization
1 parent 8b3c27b commit 10139fb

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/pysatl_core/families/distribution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def analytical_computations(
8787
cache_val = getattr(self, "_analytical_cache_val", None)
8888

8989
if cache_key != key or cache_val is None:
90-
cache_val = self.family._build_analytical_computations(self.parameters)
90+
cache_val = self.family.build_analytical_computations(self.parameters)
9191
self._analytical_cache_key = key
9292
self._analytical_cache_val = cache_val
9393

src/pysatl_core/families/parametric_family.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,46 @@ def _build_analytical_computations(
291291

292292
return result
293293

294+
def build_analytical_computations(
295+
self, parameters: Parametrization
296+
) -> dict[GenericCharacteristicName, AnalyticalComputation[Any, Any]]:
297+
"""
298+
Build analytical computations mapping for the given parameter instance.
299+
300+
This uses a precomputed provider plan so runtime work is reduced to:
301+
- (Optionally) converting parameters to base once,
302+
- binding callables with :func:`functools.partial`.
303+
304+
Parameters
305+
----------
306+
parameters : Parametrization
307+
Parameters in any registered parametrization.
308+
309+
Returns
310+
-------
311+
dict[GenericCharacteristicName, AnalyticalComputation]
312+
Mapping from characteristic name to analytical computation callable.
313+
"""
314+
plan = self._analytical_plan.get(parameters.name, {})
315+
result: dict[GenericCharacteristicName, AnalyticalComputation[Any, Any]] = {}
316+
base_params: Parametrization | None = None
317+
318+
for characteristic, provider_name in plan.items():
319+
if provider_name == parameters.name:
320+
params_obj = parameters
321+
else:
322+
if base_params is None:
323+
base_params = self.get_base_parameters(parameters)
324+
params_obj = base_params
325+
326+
func_factory = self.distr_characteristics[characteristic][provider_name]
327+
result[characteristic] = AnalyticalComputation(
328+
target=characteristic,
329+
func=partial(func_factory, params_obj),
330+
)
331+
332+
return result
333+
294334
def distribution(
295335
self,
296336
parametrization_name: str | None = None,

0 commit comments

Comments
 (0)