From d72409f339624279740f980783eb43df7934dc83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Sierro?= Date: Wed, 26 Jul 2023 15:01:08 +0200 Subject: [PATCH] parameters must now be compiled --- src/scgenerator/parameter.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/scgenerator/parameter.py b/src/scgenerator/parameter.py index e0122f1..a2dc586 100644 --- a/src/scgenerator/parameter.py +++ b/src/scgenerator/parameter.py @@ -450,6 +450,13 @@ class Parameters: setattr(self, k, v) self.__post_init__() + def __setattr__(self, k, v): + if self._frozen: + raise AttributeError( + f"cannot set attribute to frozen {self.__class__.__name__} instance" + ) + object.__setattr__(self, k, v) + def get_evaluator(self): evaluator = Evaluator.default(self.full_field) evaluator.set(self._param_dico.copy()) @@ -462,7 +469,15 @@ class Parameters: param["version"] = __version__ return param - def compile(self, exhaustive=False): + def compute(self, p_name: str, *other_p_names: str) -> Any | tuple[Any]: + evaluator = self.get_evaluator() + first = evaluator.compute(p_name) + if other_p_names: + return (first, *(evaluator.compute(p) for p in other_p_names)) + else: + return first + + def compile(self, exhaustive=False) -> Parameters: to_compute = MANDATORY_PARAMETERS evaluator = self.get_evaluator() for k in to_compute: @@ -474,7 +489,11 @@ class Parameters: evaluator.compute(p) except Exception: pass - return self.__class__(**{k: v for k, v in evaluator.params.items() if k in self._p_names}) + computed = self.__class__( + **{k: v for k, v in evaluator.params.items() if k in self._p_names} + ) + computed._frozen = True + return computed def pretty_str(self, params: Iterable[str] = None, exclude=None) -> str: """return a pretty formatted string describing the parameters""" @@ -522,6 +541,7 @@ class Parameters: "effective_area_arr", "nonlinear_op", "linear_op", + "c_to_a_factor", } types = (np.ndarray, float, int, str, list, tuple, dict, Path) out = {}