Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
Parameter.py
Go to the documentation of this file.
1"""Python wrappers for C++ parameters."""
2
3from __future__ import annotations
4
5from enum import Enum
6from typing import List, Optional, Tuple, Union
7
8from pyhyperiso.phyperiso.pyhyperiso.core import DependentParameter as _CppDependentParameter
9from pyhyperiso.phyperiso.pyhyperiso.core import Parameter as _CppParameter
10from pyhyperiso.phyperiso.pyhyperiso.core import ParameterMode as _CppParameterMode
11from pyhyperiso.core.Common.ParamId import ParamId
12from pyhyperiso.core.Math.Scalar import Scalar, _to_scalar
13
14
15class ParameterMode(Enum):
16 """Update mode used by shiftable C++ parameters.
17
18 Attributes:
19 FIXED: The parameter value is fixed to its expected value.
20 SHIFTABLE: The parameter can be shifted through the C++ shift machinery.
21 """
22
23 FIXED = _CppParameterMode.FIXED
24 SHIFTABLE = _CppParameterMode.SHIFTABLE
25
26
28 """Python wrapper around the C++ ``Parameter`` object.
29
30 Parameters store a central value and statistical/systematic uncertainties.
31 They may also carry optional metadata such as a scale or bin range. Numeric
32 inputs are converted to the package ``Scalar`` type before crossing the
33 pybind boundary.
34
35 Args:
36 pid: Parameter identifier.
37 expected: Central value.
38 stat: Statistical uncertainty.
39 syst: Systematic uncertainty.
40 scale: Optional scale metadata.
41 bin: Optional bin metadata forwarded to the C++ object.
42
43 Examples:
44 >>> pid = ParamId(type=ParameterType.SM, block="MASS", code=25)
45 >>> p = Parameter(pid, expected=125.0, stat=0.1, syst=0.2)
46 >>> p.combined_std
47 Scalar(...)
48 """
49
51 self,
52 pid: ParamId,
53 expected: Union[float, complex, Scalar],
54 stat: Union[float, complex, Scalar],
55 syst: Union[float, complex, Scalar],
56 scale: Optional[float] = None,
57 bin: Optional[List] = None,
58 ) -> None:
59 self._cpp_obj = _CppParameter(
60 pid._cpp_obj,
61 _to_scalar(expected)._cpp_obj,
62 _to_scalar(stat)._cpp_obj,
63 _to_scalar(syst)._cpp_obj,
64 )
65 if scale is not None:
66 self._cpp_obj.set_scale(scale)
67 if bin is not None:
68 self._cpp_obj.set_bin(bin)
69
70 @property
71 def value(self) -> Scalar:
72 """Current parameter value after any active shift."""
73 return Scalar.from_cpp(self._cpp_obj.get_val())
74
75 @property
76 def std(self) -> Tuple[Scalar, Scalar]:
77 """Statistical and systematic uncertainties as ``(stat, syst)``."""
78 stat, syst = self._cpp_obj.get_std()
79 return Scalar.from_cpp(stat), Scalar.from_cpp(syst)
80
81 @property
82 def combined_std(self) -> Scalar:
83 """Combined uncertainty according to the C++ parameter rules."""
84 return Scalar.from_cpp(self._cpp_obj.get_combined_std())
85
86 @property
87 def pid(self) -> ParamId:
88 """Identifier of this parameter."""
89 return ParamId.from_cpp(self._cpp_obj.get_id())
90
91 def set_expected(self, val: Union[float, complex, Scalar]) -> None:
92 """Set the central value.
93
94 Args:
95 val: New expected value.
96 """
97 self._cpp_obj.set_expected(_to_scalar(val)._cpp_obj)
98
100 self,
101 stat: Union[float, complex, Scalar],
102 syst: Union[float, complex, Scalar],
103 ) -> None:
104 """Set statistical and systematic uncertainties.
105
106 Args:
107 stat: Statistical uncertainty.
108 syst: Systematic uncertainty.
109 """
110 self._cpp_obj.set_std(_to_scalar(stat)._cpp_obj, _to_scalar(syst)._cpp_obj)
111
112 def set_shift(self, shift: Union[float, complex, Scalar]) -> None:
113 """Set the active shift value for a shiftable parameter.
114
115 Args:
116 shift: Shift value forwarded to C++.
117 """
118 self._cpp_obj.set_shift(_to_scalar(shift)._cpp_obj)
119
120 def set_mode(self, mode: ParameterMode) -> None:
121 """Set whether the parameter is fixed or shiftable.
122
123 Args:
124 mode: New parameter mode.
125 """
126 self._cpp_obj.set_mode(mode.value)
127
128 def __repr__(self) -> str:
129 """Return a readable representation for debugging."""
130 return (
131 f"<Parameter pid={self.pid}, value={self.value}, "
132 f"std={self.std}, combined_std={self.combined_std}>"
133 )
134
135 @staticmethod
136 def from_cpp(cpp_obj) -> "Parameter":
137 """Wrap an existing bound C++ ``Parameter``.
138
139 Args:
140 cpp_obj: Bound C++ parameter instance.
141
142 Returns:
143 Python wrapper sharing the provided C++ object.
144 """
145 param = Parameter.__new__(Parameter)
146 param._cpp_obj = cpp_obj
147 return param
148
149
151 """Python wrapper around a C++ ``DependentParameter``.
152
153 Dependent parameters can update their value from other parameters, and can
154 be frozen to avoid repeated recomputation in workflows that scan many
155 points.
156 """
157
158 def __init__(self, cpp_obj: _CppDependentParameter) -> None:
159 """Wrap an existing C++ dependent parameter."""
160 self._cpp_obj_cpp_obj = cpp_obj
161
162 def depends_on(self, pid: ParamId) -> bool:
163 """Return whether this parameter depends on ``pid``."""
164 return bool(self._cpp_obj_cpp_obj.dependsOn(pid._cpp_obj))
165
166 def init(self) -> None:
167 """Initialize the underlying dependent parameter."""
169
170 def update(self) -> None:
171 """Recompute the parameter value from its dependencies."""
173
174 def freeze(self) -> None:
175 """Freeze updates for the dependent parameter."""
177
178 def unfreeze(self) -> None:
179 """Re-enable updates for the dependent parameter."""
181
182
183__all__ = ["Parameter", "ParameterMode", "PyDependentParameter"]
None set_expected(self, Union[float, complex, Scalar] val)
Definition Parameter.py:91
None set_mode(self, ParameterMode mode)
Definition Parameter.py:120
None set_std(self, Union[float, complex, Scalar] stat, Union[float, complex, Scalar] syst)
Definition Parameter.py:103
None __init__(self, ParamId pid, Union[float, complex, Scalar] expected, Union[float, complex, Scalar] stat, Union[float, complex, Scalar] syst, Optional[float] scale=None, Optional[List] bin=None)
Definition Parameter.py:58
None set_shift(self, Union[float, complex, Scalar] shift)
Definition Parameter.py:112
None __init__(self, _CppDependentParameter cpp_obj)
Definition Parameter.py:158
Hash specialization for SymbolId<Tag>.
Definition BlockName.h:353