44 class IMetricWrapper {
46 virtual ~IMetricWrapper() =
default;
47 virtual double compute(
const std::vector<SimDataPair>& fit_objects,
size_t n_pars)
const = 0;
51 class ChiModuleWrapper :
public IMetricWrapper {
53 explicit ChiModuleWrapper(std::unique_ptr<IChiSquaredModule> module);
54 double compute(
const std::vector<SimDataPair>& fit_objects,
size_t n_pars)
const override;
57 std::unique_ptr<IChiSquaredModule> m_module;
60 class ObjectiveMetricWrapper :
public IMetricWrapper {
62 explicit ObjectiveMetricWrapper(std::unique_ptr<ObjectiveMetric> module);
63 double compute(
const std::vector<SimDataPair>& fit_objects,
size_t n_pars)
const override;
66 std::unique_ptr<ObjectiveMetric> m_module;
73 ChiModuleWrapper::ChiModuleWrapper(std::unique_ptr<IChiSquaredModule> module)
74 : m_module(std::move(module))
79 double ChiModuleWrapper::compute(
const std::vector<SimDataPair>& fit_objects,
size_t n_pars)
const
83 for (
const auto& obj : fit_objects) {
84 const auto sim_array = obj.simulation_array();
85 const auto exp_array = obj.experimental_array();
86 const auto weights = obj.user_weights_array();
87 const size_t n_elements = sim_array.size();
88 for (
size_t i = 0; i < n_elements; ++i) {
89 double value = m_module->residual(sim_array[i], exp_array[i], weights[i]);
90 result += value * value;
92 n_points += n_elements;
95 int fnorm =
static_cast<int>(n_points) -
static_cast<int>(n_pars);
97 throw std::runtime_error(
"Error in ChiModuleWrapper: Normalization shall be positive");
99 return result / fnorm;
102 ObjectiveMetricWrapper::ObjectiveMetricWrapper(std::unique_ptr<ObjectiveMetric> module)
103 : m_module(std::move(module))
108 double ObjectiveMetricWrapper::compute(
const std::vector<SimDataPair>& fit_objects,
size_t)
const
111 bool use_uncertainties =
true;
112 for (
const auto& obj : fit_objects)
113 use_uncertainties = use_uncertainties && obj.containsUncertainties();
116 for (
const auto& obj : fit_objects)
117 result += m_module->compute(obj, use_uncertainties);
128 , m_fit_status(std::make_unique<
FitStatus>(this))
143 std::unique_ptr<Datafield>&& stdv,
double weight)
145 m_fit_objects.emplace_back(builder, data, std::move(stdv), weight);
149 const std::vector<std::vector<double>>& data,
double weight)
156 const std::vector<double>& data,
double weight)
163 const std::vector<std::vector<double>>& data,
164 const std::vector<std::vector<double>>& stdv,
double weight)
171 const std::vector<double>& data,
172 const std::vector<double>& stdv,
double weight)
192 std::transform(result.begin(), result.end(), sim_values.begin(), result.begin(),
193 [](
double lhs,
double rhs) { return lhs - rhs; });
269 m_fit_status->addObserver(every_nth, std::move(observer));
275 m_fit_status->addObserver(every_nth, std::move(observer));
321 throw std::runtime_error(
"Fitting was interrupted by the user.");
324 throw std::runtime_error(
"FitObjective::execSimulations() -> Error. "
325 "No simulation/data defined.");
328 obj.execSimulation(params);
333 std::cout <<
"Warning in FitObjective::setChiSquaredModule: setChiSquaredModule is deprecated "
334 "and will be removed in future versions. Please use "
335 "FitObjective::setObjectiveMetric instead."
338 std::unique_ptr<IChiSquaredModule> chi_module(module.
clone());
339 m_metric_module = std::make_unique<ChiModuleWrapper>(std::move(chi_module));
344 m_metric_module = std::make_unique<ObjectiveMetricWrapper>(std::move(metric));
388 std::vector<double> result;
390 std::vector<double> array = (pair.*getter)();
391 std::move(array.begin(), array.end(), std::back_inserter(result));
Defines the macro ASSERT.
#define ASSERT(condition)
Defines class ChiSquaredModule.
Defines class FitObjective.
std::function< void(const FitObjective &)> fit_observer_t
std::function< std::unique_ptr< ISimulation >(const mumufit::Parameters &)> simulation_builder_t
Defines interface ISimulation.
Defines class MinimizerResult.
Defines ObjectiveMetric utilities and corresponding namespace.
Defines ObjectiveMetric classes.
Defines family of PyFittingCallbacks classes.
Defines class SimDataPair.
Stores radiation power per bin.
Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting....
SimulationResult uncertaintyData(size_t i_item=0) const
Returns experimental data uncertainties in the form of SimulationResult.
virtual std::vector< double > evaluate_residuals(const mumufit::Parameters ¶ms)
std::unique_ptr< IMetricWrapper > m_metric_module
bool isFirstIteration() const
IterationInfo iterationInfo() const
bool allPairsHaveUncertainties() const
Returns true if all the data pairs in FitObjective instance contain uncertainties.
SimulationResult relativeDifference(size_t i_item=0) const
Returns relative difference between simulation and experimental data in the form of SimulationResult.
void execAddSimulationAndData(const simulation_builder_t &builder, const Datafield &data, std::unique_ptr< Datafield > &&stdv, double weight=1.0)
Constructs simulation/data pair for later fit.
void initPlot(int every_nth, PyObserverCallback &callback)
Initializes observer callback to be called on every_nth fit iteration.
std::vector< SimDataPair > m_fit_objects
virtual double evaluate(const mumufit::Parameters ¶ms)
mumufit::MinimizerResult minimizerResult() const
void setObjectiveMetric(const std::string &metric)
std::vector< double > composeArray(DataPairAccessor getter) const
std::vector< double > uncertainties() const
Returns one-dimensional array representing merged data uncertainties. The area outside of the region ...
SimulationResult experimentalData(size_t i_item=0) const
Returns experimental data in the form of SimulationResult.
unsigned fitObjectCount() const
void setChiSquaredModule(const IChiSquaredModule &module)
static std::string availableMetricOptions()
Returns available metrics and norms.
bool containsUncertainties(size_t i_item) const
Returns true if the specified DataPair element contains uncertainties.
std::vector< double >(SimDataPair::*)() const DataPairAccessor
SimulationResult simulationResult(size_t i_item=0) const
Returns simulation result in the form of SimulationResult.
void initPrint(int every_nth)
Initializes printing to standard output on every_nth fit iteration.
std::vector< double > weights_array() const
Returns one-dimensional array representing merged user weights. The area outside of the region of int...
std::vector< double > experimental_array() const
Returns one-dimensional array representing merged experimental data. The area outside of the region o...
void finalize(const mumufit::MinimizerResult &result)
Should be explicitly called on last iteration to notify all observers.
SimulationResult absoluteDifference(size_t i_item=0) const
Returns absolute value of difference between simulation and experimental data in the form of Simulati...
bool isInterrupted() const
void execSimulations(const mumufit::Parameters ¶ms)
std::unique_ptr< FitStatus > m_fit_status
const SimDataPair & dataPair(size_t i_item=0) const
Returns a reference to i-th SimDataPair.
std::vector< double > simulation_array() const
Returns one-dimensional array representing merged simulated intensities data. The area outside of the...
void addSimulationAndData(const PyBuilderCallback &callback, const std::vector< std::vector< double >> &data, double weight=1.0)
Constructs simulation/data pair for later fit.
Contains status of the fitting (running, interupted etc) and all intermediate information which has t...
Interface residual calculations.
IChiSquaredModule * clone() const override=0
clone method
Stores fit iteration info to track fit flow from various observers. Used in context of FitObjective.
unsigned iterationCount() const
Returns current number of minimizer iterations.
Implementation of metric with standard deviation , where is the simulated intensity....
Builds simulation object using a Python callable. Base class to wrap Python callable and pass it to C...
virtual ISimulation * build_simulation(const mumufit::Parameters &) const
Observer for FitObjective based on Python callable. Base class to wrap Python callable and pass it to...
virtual void update(const FitObjective &)
Holds pair of simulation/experimental data to fit.
std::vector< double > experimental_array() const
Returns the flattened experimental data cut to the ROI area.
SimulationResult absoluteDifference() const
Returns the absolute difference between simulated and experimental data cut to the ROI area.
std::vector< double > user_weights_array() const
Returns a flat array of user weights cut to the ROI area.
std::vector< double > uncertainties_array() const
Returns the flattened experimental uncertainties cut to the ROI area. If no uncertainties are availab...
std::vector< double > simulation_array() const
Returns the flattened simulated intensities cut to the ROI area.
SimulationResult uncertainties() const
Returns the data uncertainties cut to the ROI area If no uncertainties present, returns zero-filled S...
SimulationResult experimentalData() const
Returns the experimental data cut to the ROI area.
bool containsUncertainties() const
SimulationResult relativeDifference() const
Returns the relative difference between simulated and experimental data cut to the ROI area.
SimulationResult simulationResult() const
Returns the result of last computed simulation.
Wrapper around Datafield that also provides unit conversions.
Result of minimization round.
A collection of fit parameters.
std::unique_ptr< Datafield > createPField1D(const std::vector< double > &vec)
std::unique_ptr< Datafield > createPField2D(const std::vector< std::vector< double >> &vec)
std::string defaultNormName()
Returns default norm name.
std::string availableMetricOptions()
Prints available metric options.
std::unique_ptr< ObjectiveMetric > createMetric(const std::string &metric)
Creates the specified metric with the default norm.