BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
FitObjective.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Core/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_CORE_FITTING_FITOBJECTIVE_H
16 #define BORNAGAIN_CORE_FITTING_FITOBJECTIVE_H
17 
20 #include "Device/Data/ArrayUtils.h"
22 
23 class FitStatus;
24 class IChiSquaredModule;
25 class IMetricWrapper;
26 class ObjectiveMetric;
27 class PyBuilderCallback;
28 class PyObserverCallback;
29 
30 //! Holds vector of `SimDataPair`s (experimental data and simulation results) for use in fitting.
31 //! @ingroup fitting_internal
32 
33 class FitObjective {
35 
36 public:
37  FitObjective();
38  virtual ~FitObjective();
39 
40 #ifndef SWIG
42  std::unique_ptr<OutputData<double>> uncertainties,
43  double weight = 1.0);
44 #endif
45  //! Constructs simulation/data pair for later fit.
46  //! @param callback: simulation builder capable of producing simulations
47  //! @param data: experimental data array
48  //! @param weight: weight of dataset in metric calculations
49  template <class T>
50  void addSimulationAndData(PyBuilderCallback& callback, const T& data, double weight = 1.0)
51  {
53  weight);
54  }
55 
56  //! Constructs simulation/data pair for later fit.
57  //! @param callback: simulation builder capable of producing simulations
58  //! @param data: experimental data array
59  //! @param uncertainties: data uncertainties array
60  //! @param weight: weight of dataset in metric calculations
61  template <class T>
62  void addSimulationAndData(PyBuilderCallback& callback, const T& data, const T& uncertainties,
63  double weight = 1.0)
64  {
67  }
68 
69  virtual double evaluate(const mumufit::Parameters& params);
70 
71  virtual std::vector<double> evaluate_residuals(const mumufit::Parameters& params);
72 
73  size_t numberOfFitElements() const;
74 
75  SimulationResult simulationResult(size_t i_item = 0) const;
76  SimulationResult experimentalData(size_t i_item = 0) const;
77  SimulationResult uncertaintyData(size_t i_item = 0) const;
78  SimulationResult relativeDifference(size_t i_item = 0) const;
79  SimulationResult absoluteDifference(size_t i_item = 0) const;
80 
81  std::vector<double> experimental_array() const;
82  std::vector<double> simulation_array() const;
83  std::vector<double> uncertainties() const;
84  std::vector<double> weights_array() const;
85 
86  //! Initializes printing to standard output on every_nth fit iteration.
87  void initPrint(int every_nth);
88 
89  //! Initializes observer callback to be called on every_nth fit iteration.
90  void initPlot(int every_nth, PyObserverCallback& callback);
91 
93 
95 
96  //! Should be explicitely called on last iteration to notify all observers.
97  void finalize(const mumufit::MinimizerResult& result);
98 
99  unsigned fitObjectCount() const;
100 
101  void run_simulations(const mumufit::Parameters& params);
102 
103  void setChiSquaredModule(const IChiSquaredModule& module);
104 
105  void setObjectiveMetric(const std::string& metric);
106  //! Sets objective metric to the FitObjective.
107  //! @param metric: metric name
108  //! @param norm: metric norm name (defaults to L2-norm)
109  void setObjectiveMetric(const std::string& metric, const std::string& norm);
110 
111  bool containsUncertainties(size_t i_item) const;
112  bool allPairsHaveUncertainties() const;
113 
114  static std::string availableMetricOptions();
115 
116 #ifndef SWIG
117  //! Returns a reference to i-th SimDataPair.
118  const SimDataPair& dataPair(size_t i_item = 0) const;
119 
120  void initPlot(int every_nth, fit_observer_t observer);
121 
122  bool isCompleted() const;
123 
124  void interruptFitting();
125 
126  bool isInterrupted() const;
127 
128  bool isFirstIteration() const;
129 
130  void setObjectiveMetric(std::unique_ptr<ObjectiveMetric> metric);
131 #endif // USER_API
132 
133 private:
134  typedef std::vector<double> (SimDataPair::*DataPairAccessor)() const;
135 
136  std::vector<double> composeArray(DataPairAccessor getter) const;
137  size_t check_index(size_t index) const;
138 
139  std::vector<SimDataPair> m_fit_objects;
140  std::unique_ptr<IMetricWrapper> m_metric_module;
141  std::unique_ptr<FitStatus> m_fit_status;
142 };
143 
144 #endif // BORNAGAIN_CORE_FITTING_FITOBJECTIVE_H
Defines various functions to interact from numpy on Python side.
std::function< void(const FitObjective &)> fit_observer_t
Definition: FitTypes.h:35
std::function< std::unique_ptr< ISimulation >(const mumufit::Parameters &)> simulation_builder_t
Definition: FitTypes.h:33
Defines class IterationInfo.
Defines class MinimizerResult.
Defines class SimDataPair.
Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting.
Definition: FitObjective.h:33
SimulationResult uncertaintyData(size_t i_item=0) const
Returns experimental data uncertainties in the form of SimulationResult.
void addSimulationAndData(PyBuilderCallback &callback, const T &data, const T &uncertainties, double weight=1.0)
Constructs simulation/data pair for later fit.
Definition: FitObjective.h:62
virtual std::vector< double > evaluate_residuals(const mumufit::Parameters &params)
std::unique_ptr< IMetricWrapper > m_metric_module
Definition: FitObjective.h:140
bool isFirstIteration() const
IterationInfo iterationInfo() const
void addSimulationAndData(simulation_builder_t builder, const OutputData< double > &data, std::unique_ptr< OutputData< double >> uncertainties, double weight=1.0)
Constructs simulation/data pair for later fit.
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 addSimulationAndData(PyBuilderCallback &callback, const T &data, double weight=1.0)
Constructs simulation/data pair for later fit.
Definition: FitObjective.h:50
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:139
static simulation_builder_t simulationBuilder(PyBuilderCallback &callback)
virtual double evaluate(const mumufit::Parameters &params)
void interruptFitting()
size_t check_index(size_t index) const
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.
SimulationResult experimentalData(size_t i_item=0) const
Returns experimental data in the form of SimulationResult.
unsigned fitObjectCount() const
void setChiSquaredModule(const IChiSquaredModule &module)
std::vector< double >(SimDataPair::* DataPairAccessor)() const
Definition: FitObjective.h:134
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.
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.
void run_simulations(const mumufit::Parameters &params)
size_t numberOfFitElements() const
std::vector< double > experimental_array() const
Returns one dimensional array representing merged experimental data.
virtual ~FitObjective()
void finalize(const mumufit::MinimizerResult &result)
Should be explicitely 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
std::unique_ptr< FitStatus > m_fit_status
Definition: FitObjective.h:141
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.
bool isCompleted() const
Contains status of the fitting (running, interupted etc) and all intermediate information which has t...
Definition: FitStatus.h:38
Interface residual calculations.
Stores fit iteration info to track fit flow from various observers.
Definition: IterationInfo.h:25
Base class for metric implementations.
Builds simulation object using a Python callable.
Observer for FitObjective based on Python callable.
Holds pair of simulation/experimental data to fit.
Definition: SimDataPair.h:30
Wrapper around OutputData<double> that also provides unit conversions.
Result of minimization round.
A collection of fit parameters.
Definition: Parameters.h:26
CreateDataImpl::ReturnType< T > createData(const T &vec)
Creates OutputData array from input vector.
Definition: ArrayUtils.h:65