Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
DependentParameter.cpp
Go to the documentation of this file.
2#include "SourcesView.h"
3
5 ParamId pid,
6 std::unordered_map<ParamId, std::shared_ptr<Parameter>> sources_in,
7 DepParamUpdateFunc recalculateFunc)
8: Parameter(pid, 0, 0, 0),
9 sources_raw(sources_in),
10 sources(std::make_unique<ParamSrc>(sources_raw, ParameterTypeMapper::str(pid.type.value()) + "::" + pid.block)),
11 recalculateLambda(recalculateFunc),
12 saved_sources_raw(std::move(sources_in)),
13 saved_recalculateLambda(recalculateFunc),
14 frozen(false)
15{
16 dirty = true;
17}
18
20 return (*sources).raw().contains(pid);
21}
22
23
25 if (auto me = self.lock()) {
26 for (auto& [_, param] : (*sources).raw()) {
27 param->removeObserver(me);
28 }
29 }
30}
31
33 auto dependents = std::exchange(observers, {});
34
35 this->clear_above();
36
37 if (auto host = owner_block.lock()) {
38 host->erase_local(this->id.code);
39 }
40
41 for (auto& obs : dependents) {
42 if (obs) obs->clear_below();
43 }
44}
45
47 auto me_base = shared_from_this();
48 auto me_dep = std::static_pointer_cast<DependentParameter>(me_base);
49 self = me_dep;
50
51 for (auto& [_, src] : (*sources).raw()) {
52 src->addObserver(me_base);
53 }
54}
55
57 dirty = true;
58}
59
61 if (frozen) {
62 update_at_unfreeze = true;
63 this->notifyObservers();
64 return;
65 }
66 dirty = true;
68}
69
70// scalar_t DependentParameter::get_val() const {
71// const_cast<DependentParameter*>(this)->ensure_up_to_date();
72// return expected;
73// }
74
79
81 if (!dirty) return;
82 if (frozen) return;
83
84 for (const auto& [pid, src] : sources->raw()) {
85 if (!src) LOG_ERROR("Error", "Null source param for", pid.code);
86 (void)src->get_val();
87 }
88
89 if (!recalculateLambda) {
90 LOG_ERROR("Error", "DependentParameter has no recalculateLambda");
91 }
92
93 dirty = false;
94 auto me_dep = std::static_pointer_cast<DependentParameter>(shared_from_this());
95 recalculateLambda(*sources, me_dep);
96}
97
98
100 this->frozen = true;
101}
102
104 this->frozen = false;
105 if (update_at_unfreeze) {
106 update();
107 update_at_unfreeze = false;
108 }
109}
110
112 std::unordered_map<ParamId, std::shared_ptr<Parameter>> new_sources,
113 DepParamUpdateFunc new_lambda)
114{
115 clear_above();
116
117 saved_sources_raw = new_sources;
118 saved_recalculateLambda = new_lambda;
119
120 sources_raw = std::move(new_sources);
121 sources = std::make_unique<ParamSrc>(
122 sources_raw,
123 ParameterTypeMapper::str(id.type.value()) + "::" + id.block
124 );
125 recalculateLambda = std::move(new_lambda);
126
127 if (auto me = self.lock()) {
128 for (auto& [_, src] : sources->raw()) {
129 if (src) src->addObserver(me);
130 }
131 }
132
133 dirty = true;
134 dependency_detached = false;
136}
137
139{
140 if (dependency_detached) return;
141
143 clear_above();
144
145 sources_raw.clear();
146 sources = std::make_unique<ParamSrc>(
147 sources_raw,
148 ParameterTypeMapper::str(id.type.value()) + "::" + id.block
149 );
150
151 recalculateLambda = {};
152 dirty = false;
153 dependency_detached = true;
154
155 // notifyObservers();
156}
157
159{
160 if (!dependency_detached) return;
161
162 sources_raw = saved_sources_raw;
163 sources = std::make_unique<ParamSrc>(
164 sources_raw,
165 ParameterTypeMapper::str(id.type.value()) + "::" + id.block
166 );
167 recalculateLambda = saved_recalculateLambda;
168
169 if (auto me = self.lock()) {
170 for (auto& [_, src] : sources->raw()) {
171 if (src) src->addObserver(me);
172 }
173 }
174
175 dirty = true;
176 dependency_detached = false;
178}
179
181 LOG_DEBUG("Destruct DependentParameter at", self.lock().get());
182 if (auto me = self.lock()) {
183 for (auto& [_, src] : (*sources).raw()) {
184 src->removeObserver(me);
185 }
186 }
187}
Defines parameters whose values are lazily computed from other parameters.
std::function< void(const ParamSrc &, std::shared_ptr< DependentParameter >)> DepParamUpdateFunc
Function signature used to recompute a DependentParameter.
#define LOG_ERROR(type,...)
Macro for logging error messages and terminating the application.
Definition Logger.h:41
#define LOG_DEBUG(...)
Macro for logging debug messages.
Definition Logger.h:45
@ FIXED
The parameter remains fixed at its expected value.
Parameter whose value is computed from other parameters and cached lazily.
void rebind(std::unordered_map< ParamId, std::shared_ptr< Parameter > > new_sources, DepParamUpdateFunc new_lambda)
Replaces the dependency set and recomputation rule at runtime.
void clear_above() override
Detaches this parameter from all upstream source parameters.
scalar_t get_val() const override
Returns the current cached value, recomputing it on demand if needed.
void unfreeze() override
Unfreezes the dependent parameter.
void update() override
Marks the parameter as dirty and propagates the update downstream.
void freeze() override
Freezes the dependent parameter.
DependentParameter(ParamId pid, std::unordered_map< ParamId, std::shared_ptr< Parameter > > sources, DepParamUpdateFunc recalculateFunc)
Constructs a dependent parameter from its id, sources, and recomputation rule.
void clear_below() override
Clears this parameter and all downstream dependent parameters.
void ensure_up_to_date()
Recomputes the parameter if its cached value is stale.
bool dependsOn(const ParamId &pid)
Checks whether this parameter depends on a given source parameter.
void reattach()
Restores previously detached dependencies and recomputation rule.
void mark_dirty()
Marks the cached value as dirty.
void init()
Initializes observer registration on all source parameters.
void detach()
Temporarily detaches all dependencies while keeping the current cached value.
static std::string str(const IdOf< ParamTypeTag > &id)
Returns the string representation associated with an identifier.
Lightweight view over a set of source parameters keyed by ParamId.
Represents a single parameter with value, uncertainties, and dependency links.
Definition Parameter.h:78
ParameterMode mode
Current operating mode.
Definition Parameter.h:85
std::vector< std::shared_ptr< Parameter > > observers
Observers notified when this parameter changes.
Definition Parameter.h:86
scalar_t expected
Expected value of the parameter.
Definition Parameter.h:81
scalar_t shift
Additive shift applied when the parameter is SHIFTABLE.
Definition Parameter.h:84
void notifyObservers()
Notifies downstream parameter observers and then the owner block.
std::weak_ptr< Block > owner_block
Owning Block (if any) that this parameter belongs to.
Definition Parameter.h:87
Hash specialization for SymbolId<Tag>.
Definition BlockName.h:353
Composite identifier for a single parameter.
Definition ParamID.h:57