@@ -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