BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
FitObjective.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sim/Fitting/FitObjective.h
6 //! @brief Defines class FitObjective.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
15 #ifndef BORNAGAIN_SIM_FITTING_FITOBJECTIVE_H
16 #define BORNAGAIN_SIM_FITTING_FITOBJECTIVE_H
17 
18 #ifndef USER_API
19 #include "Device/Data/ArrayUtils.h"
20 #include "Sim/Fitting/FitTypes.h"
21 
22 class FitStatus;
23 class IChiSquaredModule;
24 class IMetricWrapper;
25 class IterationInfo;
26 class ObjectiveMetric;
27 class PyBuilderCallback;
28 class PyObserverCallback;
29 class SimDataPair;
30 class SimulationResult;
31 namespace mumufit {
32 
33 class MinimizerResult;
34 class Parameters;
35 
36 } // namespace mumufit
37 
38 //! Holds vector of SimDataPair%s (experimental data and simulation results) for use in fitting.
39 //! Thereby supports simultaneous fitting of several data sets and model functions,
40 //! as demonstrated in example fit52/multiple_datasets.
41 
42 class FitObjective {
43 public:
44  FitObjective();
45  virtual ~FitObjective();
46 
47 #ifndef SWIG
48  void execAddSimulationAndData(const simulation_builder_t& builder, const Datafield& data,
49  std::unique_ptr<Datafield>&& stdv, double weight = 1.0);
50 #endif
51  //! Constructs simulation/data pair for later fit.
52  //! @param callback: simulation builder capable of producing simulations
53  //! @param data: experimental data array
54  //! @param weight: weight of dataset in metric calculations
55  void addSimulationAndData(const PyBuilderCallback& callback,
56  const std::vector<std::vector<double>>& data, double weight = 1.0);
57 
58  void addSimulationAndData(const PyBuilderCallback& callback, const std::vector<double>& data,
59  double weight = 1.0);
60 
61  //! Constructs simulation/data pair for later fit.
62  //! @param callback: simulation builder capable of producing simulations
63  //! @param data: experimental data array
64  //! @param stdv: data uncertainties array
65  //! @param weight: weight of dataset in metric calculations
66  void addSimulationAndData(const PyBuilderCallback& callback,
67  const std::vector<std::vector<double>>& data,
68  const std::vector<std::vector<double>>& stdv, double weight = 1.0);
69 
70  void addSimulationAndData(const PyBuilderCallback& callback, const std::vector<double>& data,
71  const std::vector<double>& stdv, double weight = 1.0);
72 
73  virtual double evaluate(const mumufit::Parameters& params);
74 
75  virtual std::vector<double> evaluate_residuals(const mumufit::Parameters& params);
76 
77  SimulationResult simulationResult(size_t i_item = 0) const;
78  SimulationResult experimentalData(size_t i_item = 0) const;
79  SimulationResult uncertaintyData(size_t i_item = 0) const;
80  SimulationResult relativeDifference(size_t i_item = 0) const;
81  SimulationResult absoluteDifference(size_t i_item = 0) const;
82 
83  std::vector<double> experimental_array() const;
84  std::vector<double> simulation_array() const;
85  std::vector<double> uncertainties() const;
86  std::vector<double> weights_array() const;
87 
88  //! Initializes printing to standard output on every_nth fit iteration.
89  void initPrint(int every_nth);
90 
91  //! Initializes observer callback to be called on every_nth fit iteration.
92  void initPlot(int every_nth, PyObserverCallback& callback);
93 
95 
97 
98  //! Should be explicitly called on last iteration to notify all observers.
99  void finalize(const mumufit::MinimizerResult& result);
100 
101  unsigned fitObjectCount() const;
102 
103  void execSimulations(const mumufit::Parameters& params);
104 
105  void setChiSquaredModule(const IChiSquaredModule& module);
106 
107  void setObjectiveMetric(const std::string& metric);
108  //! Sets objective metric to the FitObjective.
109  //! @param metric: metric name
110  //! @param norm: metric norm name (defaults to L2-norm)
111  void setObjectiveMetric(const std::string& metric, const std::string& norm);
112 
113  bool containsUncertainties(size_t i_item) const;
114  bool allPairsHaveUncertainties() const;
115 
116  static std::string availableMetricOptions();
117 
118 #ifndef SWIG
119  //! Returns a reference to i-th SimDataPair.
120  const SimDataPair& dataPair(size_t i_item = 0) const;
121 
122  void initPlot(int every_nth, fit_observer_t&& observer);
123 
124  bool isCompleted() const;
125 
126  void interruptFitting();
127 
128  bool isInterrupted() const;
129 
130  bool isFirstIteration() const;
131 
132  void setObjectiveMetric(std::unique_ptr<ObjectiveMetric> metric);
133 #endif // SWIG
134 
135 private:
136  using DataPairAccessor = std::vector<double> (SimDataPair::*)() const;
137 
138  std::vector<double> composeArray(DataPairAccessor getter) const;
139 
140  std::vector<SimDataPair> m_fit_objects;
141  std::unique_ptr<IMetricWrapper> m_metric_module;
142  std::unique_ptr<FitStatus> m_fit_status;
143 };
144 
145 #endif // BORNAGAIN_SIM_FITTING_FITOBJECTIVE_H
146 #endif // USER_API
Defines various functions to interact from numpy on Python side.
Defines common types for fitting library.
std::function< void(const FitObjective &)> fit_observer_t
Definition: FitTypes.h:36
std::function< std::unique_ptr< ISimulation >(const mumufit::Parameters &)> simulation_builder_t
Definition: FitTypes.h:34
Stores radiation power per bin.
Definition: Datafield.h:30
Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting....
Definition: FitObjective.h:42
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 &params)
std::unique_ptr< IMetricWrapper > m_metric_module
Definition: FitObjective.h:141
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
Definition: FitObjective.h:140
virtual double evaluate(const mumufit::Parameters &params)
void interruptFitting()
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
Definition: FitObjective.h:136
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...
virtual ~FitObjective()
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 &params)
std::unique_ptr< FitStatus > m_fit_status
Definition: FitObjective.h:142
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.
bool isCompleted() const
Contains status of the fitting (running, interupted etc) and all intermediate information which has t...
Definition: FitStatus.h:39
Interface residual calculations.
Stores fit iteration info to track fit flow from various observers. Used in context of FitObjective.
Definition: IterationInfo.h:25
Base class for metric implementations.
Builds simulation object using a Python callable. Base class to wrap Python callable and pass it to C...
Observer for FitObjective based on Python callable. Base class to wrap Python callable and pass it to...
Holds pair of simulation/experimental data to fit.
Definition: SimDataPair.h:30
Wrapper around Datafield that also provides unit conversions.
Result of minimization round.
A collection of fit parameters.
Definition: Parameters.h:26
The multi-library, multi-algorithm fit wrapper library.