Source code for emodpy_hiv.parameterized_call

from functools import partial
from typing import Dict, Any


[docs]class ParameterizedCall: def __init__(self, func: callable, non_hyperparameters: Dict[str, Any] = None, hyperparameters: Dict[str, Any] = None, label: str = None): self.func = func self._non_hyperparameters = {} if non_hyperparameters is None else non_hyperparameters self.hyperparameters = {} if hyperparameters is None else hyperparameters self.label = label @property def _label_str(self): return "" if self.label is None else f"--{self.label}" def _label_hyperparameter(self, hyperparameter: str) -> str: labeled_hyperparameter = hyperparameter + self._label_str return labeled_hyperparameter def _unlabel_hyperparameter(self, labeled_hyperparameter: str) -> str: unlabeled_hyperparameter = labeled_hyperparameter.removesuffix(self._label_str) if self._label_str != "" and unlabeled_hyperparameter == labeled_hyperparameter: raise ValueError(f"Cannot remove label: {self.label} from labeled hyperparameter: {labeled_hyperparameter}") return unlabeled_hyperparameter @property def labeled_hyperparameters(self) -> Dict[str, Any]: return {self._label_hyperparameter(hp): value for hp, value in self.hyperparameters.items()} @property def _hyperparameters_none_filtered(self): return {hp: value for hp, value in self.hyperparameters.items() if value is not None} def _set_hyperparameter(self, hyperparameter: str, value: Any) -> None: if hyperparameter not in self.hyperparameters: raise ValueError(f"Cannot set unknown hyperparameter: {hyperparameter}") self.hyperparameters[hyperparameter] = value
[docs] def set_labeled_hyperparameter(self, labeled_hyperparameter: str, value: Any) -> None: hyperparameter = self._unlabel_hyperparameter(labeled_hyperparameter=labeled_hyperparameter) self._set_hyperparameter(hyperparameter=hyperparameter, value=value)
[docs] def prepare_call(self) -> callable: return partial(self.func, **self._non_hyperparameters, **self._hyperparameters_none_filtered)