Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
Parameter.cpp
Go to the documentation of this file.
1#include "Parameter.h"
2#include "Block.h"
3#include <stdexcept>
4#include <utility>
5
7 : id(id), expected(mean), deviation_stat(std_stat), deviation_syst(std_syst), shift(0), mode(ParameterMode::FIXED) {}
8
9
11 *this = other;
12}
13
14
16 if (new_mode != mode) {
17 mode = new_mode;
18 }
19}
20
22 this->deviation_stat = stat;
23 this->deviation_syst = syst;
24}
25
26void Parameter::set_scale(double scale) {
27 this->scale.emplace(scale);
28}
29
30void Parameter::set_bin(std::pair<double, double> bin) {
31 this->binning.emplace(bin);
32}
33
35 if (auto b = owner_block.lock()) {
36 b->ensure_up_to_date();
37 }
38 return this->mode == ParameterMode::FIXED ? expected : expected + shift;
39}
40
42 LOG_DEBUG("Parameter::set_expected of ", id.block, " ", id.code);
43 this->expected = val;
45}
46
50
52 this-> id = id;
53}
54
56 return std::hypot(static_cast<double>(deviation_stat),
57 static_cast<double>(deviation_syst));
58}
59
60std::pair<scalar_t, scalar_t> Parameter::get_std() const {
61 return std::make_pair(deviation_stat, deviation_syst);
62}
63
65 return this->scale.value_or(-1.0);
66}
67
68std::pair<double, double> Parameter::get_bin() {
69 return this->binning.value_or(std::pair(-1.0, -1.0));
70}
71
73{
74 return id;
75}
76
80
83 this->shift = shift;
84 } else {
85 throw std::runtime_error("Cannot change the value of immutable parameter " + id.block + " " + std::to_string(id.code));
86 }
87}
88
89void Parameter::addObserver(std::shared_ptr<Parameter> observer) {
90 auto it = std::find_if(observers.begin(), observers.end(),
91 [&](const std::shared_ptr<Parameter>& p){ return p.get() == observer.get(); });
92 if (it == observers.end()) observers.push_back(observer);
93}
94
96 auto dependents = std::exchange(observers, {});
97 LOG_DEBUG("cleaning param : ",this->id.block,this->id.code);
98
99 this->clear_above();
100
101 for (auto& obs : dependents) {
102 if (obs) obs->clear_below();
103 }
104}
105
106std::unordered_map<ParamId, std::shared_ptr<Parameter>> Parameter::get_source_parameters() const {
107 return {};
108}
109
110void Parameter::set_owner_block(std::weak_ptr<Block> owner) { owner_block = std::move(owner); }
111
112std::weak_ptr<Block> Parameter::get_owner_block() const { return owner_block; }
113
114
116 this->id = other.id;
117 this->expected = other.expected;
118 this->deviation_stat = other.deviation_stat;
119 this->deviation_syst = other.deviation_syst;
120 this->mode = other.mode;
121 this->shift = other.shift;
122 this->scale = other.scale;
123 this->binning = other.binning;
124 return *this;
125}
126
128 expected = other.expected;
131 shift = other.shift;
132 mode = other.mode;
133 scale = other.scale;
134 binning = other.binning;
135}
136
138 for (size_t i = 0; i < observers.size(); ++i) {
139 auto& observer = observers[i];
140 if (!observer) continue;
141 observer->update();
142 }
143 observers.erase(std::remove(observers.begin(), observers.end(), nullptr), observers.end());
144}
145
148 if (auto b = owner_block.lock()) {
149 b->notifyObservers();
150 }
151}
152
153void Parameter::removeObserver(std::shared_ptr<Parameter> observer) {
154 auto it = std::find_if(observers.begin(), observers.end(),
155 [&](const std::shared_ptr<Parameter>& p){ return p.get() == observer.get(); });
156 if (it != observers.end()) observers.erase(it);
157}
158
159std::ostream& operator<<(std::ostream& os, const Parameter& p) {
160 os << "Parameter " << p.id.block << "," << p.id.code;
161 if (p.binning.has_value()) {
162 os << " [" << p.binning.value().first << "," << p.binning.value().second << "] ";
163 }
164
165 os << "=" << p.expected << "+-" << p.deviation_syst << "+-" << p.deviation_stat << std::endl;
166 return os;
167}
168
170 this->expected += other.expected;
171 this->deviation_stat = std::hypot(other.deviation_stat, this->deviation_stat);
172 this->deviation_syst = std::hypot(other.deviation_syst, this->deviation_syst);
173 this->shift += other.shift;
174 return *this;
175}
176
178 this->expected *= scale;
179 this->deviation_stat *= std::abs(scale);
180 this->deviation_syst *= std::abs(scale);
181 this->shift *= scale;
182 return *this;
183}
Defines classes used to store parameters and to build derived/dependent parameter blocks.
ParameterType
#define LOG_DEBUG(...)
Macro for logging debug messages.
Definition Logger.h:45
std::ostream & operator<<(std::ostream &os, const Parameter &p)
Defines the Parameter class used to store individual physical/model parameters.
ParameterMode
Defines the modes in which a parameter can operate.
Definition Parameter.h:45
@ FIXED
The parameter remains fixed at its expected value.
@ SHIFTABLE
The parameter value is shifted by an additive offset.
Represents a single parameter with value, uncertainties, and dependency links.
Definition Parameter.h:78
scalar_t deviation_syst
Systematic standard deviation.
Definition Parameter.h:83
std::optional< double > scale
Optional renormalization scale associated with the parameter.
Definition Parameter.h:88
ParameterMode mode
Current operating mode.
Definition Parameter.h:85
Parameter & operator+=(const Parameter &other)
Adds another parameter payload to this one.
std::vector< std::shared_ptr< Parameter > > observers
Observers notified when this parameter changes.
Definition Parameter.h:86
void set_id(ParamId id)
Replaces the identifier of the parameter.
Definition Parameter.cpp:51
void notifyParamObserversOnly()
Notifies only parameter observers.
void addObserver(std::shared_ptr< Parameter > observer)
Adds an observer parameter.
Definition Parameter.cpp:89
scalar_t expected
Expected value of the parameter.
Definition Parameter.h:81
virtual void clear_below()
Recursively clears downstream dependencies below this parameter.
Definition Parameter.cpp:95
Parameter()
Default constructor.
Definition Parameter.h:102
double get_scale()
Returns the parameter scale metadata.
Definition Parameter.cpp:64
virtual std::unordered_map< ParamId, std::shared_ptr< Parameter > > get_source_parameters() const
Returns the source parameters this parameter depends on.
void set_expected(scalar_t val)
Sets the expected value and notifies dependents.
Definition Parameter.cpp:41
void set_owner(ParameterType type)
Changes the owner ParameterType part of the identifier.
Definition Parameter.cpp:77
Parameter & operator=(const Parameter &other)
Assignment operator.
void overwrite_payload_from(const Parameter &other)
Overwrites the numerical/configuration payload from another parameter.
virtual void clear_above()
Hook to clear upstream dependencies.
Definition Parameter.h:336
scalar_t deviation_stat
Statistical standard deviation.
Definition Parameter.h:82
void set_bin(std::pair< double, double > bin)
Sets the binning metadata of the parameter.
Definition Parameter.cpp:30
virtual scalar_t get_val() const
Returns the current value of the parameter.
Definition Parameter.cpp:34
std::pair< scalar_t, scalar_t > get_std() const
Returns statistical and systematic uncertainties separately.
Definition Parameter.cpp:60
void removeObserver(std::shared_ptr< Parameter > observer)
Removes an observer parameter.
void set_expected_silent(scalar_t val)
Sets the expected value without notifying observers.
Definition Parameter.cpp:47
ParamId id
Unique identifier for the parameter.
Definition Parameter.h:80
std::pair< double, double > get_bin()
Returns the parameter bin metadata.
Definition Parameter.cpp:68
std::optional< std::pair< double, double > > binning
Optional energy bin [low, high] associated with the parameter.
Definition Parameter.h:89
std::weak_ptr< Block > get_owner_block() const
Returns the owning block of this parameter.
void set_owner_block(std::weak_ptr< Block > owner)
Sets the owning block of this parameter.
void set_std(scalar_t stat, scalar_t syst)
Sets the statistical and systematic uncertainties.
Definition Parameter.cpp:21
ParamId get_id() const
Returns the identifier of the parameter.
Definition Parameter.cpp:72
Parameter & operator*=(const scalar_t &scale)
Multiplies the parameter by a scalar factor.
scalar_t shift
Additive shift applied when the parameter is SHIFTABLE.
Definition Parameter.h:84
scalar_t get_combined_std() const
Returns the combined standard deviation.
Definition Parameter.cpp:55
void set_scale(double scale)
Sets the parameter scale metadata.
Definition Parameter.cpp:26
void notifyObservers()
Notifies downstream parameter observers and then the owner block.
void set_shift(scalar_t shift)
Sets the additive shift of the parameter.
Definition Parameter.cpp:81
void set_mode(ParameterMode mode)
Sets the parameter mode.
Definition Parameter.cpp:15
std::weak_ptr< Block > owner_block
Owning Block (if any) that this parameter belongs to.
Definition Parameter.h:87
Composite identifier for a single parameter.
Definition ParamID.h:57
void set_parameter_type(ParameterType type)
Sets or overwrites the parameter type.
Definition ParamID.cpp:8
BlockName block
Name of the block where the parameter is stored.
Definition ParamID.h:73
LhaID code
Index or multi-index of the parameter inside the block.
Definition ParamID.h:82