BornAgain  1.18.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 scattering at grazing incidence
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 
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 
34 {
35  static simulation_builder_t simulationBuilder(PyBuilderCallback& callback);
36 
37 public:
38  FitObjective();
39  virtual ~FitObjective();
40 
41 #ifndef SWIG
42  void addSimulationAndData(simulation_builder_t builder, const OutputData<double>& data,
43  std::unique_ptr<OutputData<double>> uncertainties,
44  double weight = 1.0);
45 #endif
46  //! Constructs simulation/data pair for later fit.
47  //! @param callback: simulation builder capable of producing simulations
48  //! @param data: experimental data array
49  //! @param weight: weight of dataset in metric calculations
50  template <class T>
51  void addSimulationAndData(PyBuilderCallback& callback, const T& data, double weight = 1.0)
52  {
53  addSimulationAndData(simulationBuilder(callback), *ArrayUtils::createData(data), nullptr,
54  weight);
55  }
56 
57  //! Constructs simulation/data pair for later fit.
58  //! @param callback: simulation builder capable of producing simulations
59  //! @param data: experimental data array
60  //! @param uncertainties: data uncertainties array
61  //! @param weight: weight of dataset in metric calculations
62  template <class T>
63  void addSimulationAndData(PyBuilderCallback& callback, const T& data, const T& uncertainties,
64  double weight = 1.0)
65  {
66  addSimulationAndData(simulationBuilder(callback), *ArrayUtils::createData(data),
68  }
69 
70  virtual double evaluate(const Fit::Parameters& params);
71 
72  virtual std::vector<double> evaluate_residuals(const Fit::Parameters& params);
73 
74  size_t numberOfFitElements() const;
75 
76  SimulationResult simulationResult(size_t i_item = 0) const;
77  SimulationResult experimentalData(size_t i_item = 0) const;
78  SimulationResult uncertaintyData(size_t i_item = 0) const;
79  SimulationResult relativeDifference(size_t i_item = 0) const;
80  SimulationResult absoluteDifference(size_t i_item = 0) const;
81 
82  std::vector<double> experimental_array() const;
83  std::vector<double> simulation_array() const;
84  std::vector<double> uncertainties() const;
85  std::vector<double> weights_array() const;
86 
87  //! Initializes printing to standard output on every_nth fit iteration.
88  void initPrint(int every_nth);
89 
90  //! Initializes observer callback to be called on every_nth fit iteration.
91  void initPlot(int every_nth, PyObserverCallback& callback);
92 
93  IterationInfo iterationInfo() const;
94 
95  Fit::MinimizerResult minimizerResult() const;
96 
97  //! Should be explicitely called on last iteration to notify all observers.
98  void finalize(const Fit::MinimizerResult& result);
99 
100  unsigned fitObjectCount() const;
101 
102  void run_simulations(const Fit::Parameters& params);
103 
104  void setChiSquaredModule(const IChiSquaredModule& module);
105 
106  void setObjectiveMetric(const std::string& metric);
107  //! Sets objective metric to the FitObjective.
108  //! @param metric: metric name
109  //! @param norm: metric norm name (defaults to L2-norm)
110  void setObjectiveMetric(const std::string& metric, const std::string& norm);
111 
112  bool containsUncertainties(size_t i_item) const;
113  bool allPairsHaveUncertainties() const;
114 
115  static std::string availableMetricOptions();
116 
117 #ifndef SWIG
118  //! Returns a reference to i-th SimDataPair.
119  const SimDataPair& dataPair(size_t i_item = 0) const;
120 
121  void initPlot(int every_nth, fit_observer_t observer);
122 
123  bool isCompleted() const;
124 
125  void interruptFitting();
126 
127  bool isInterrupted() const;
128 
129  bool isFirstIteration() const;
130 
131  void setObjectiveMetric(std::unique_ptr<ObjectiveMetric> metric);
132 #endif // SWIG
133 
134 private:
135  typedef std::vector<double> (SimDataPair::*DataPairAccessor)() const;
136 
137  std::vector<double> composeArray(DataPairAccessor getter) const;
138  size_t check_index(size_t index) 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_CORE_FITTING_FITOBJECTIVE_H
Defines various functions to interact from numpy on Python side.
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:34
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:63
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:51
void finalize(const Fit::MinimizerResult &result)
Should be explicitely called on last iteration to notify all observers.
void initPlot(int every_nth, PyObserverCallback &callback)
Initializes observer callback to be called on every_nth fit iteration.
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.
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.
std::vector< double > experimental_array() const
Returns one dimensional array representing merged experimental data.
SimulationResult absoluteDifference(size_t i_item=0) const
Returns absolute value of difference between simulation and experimental data in the form of Simulati...
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.
Contains status of the fitting (running, interupted etc) and all intermediate information which has t...
Definition: FitStatus.h:35
Result of minimization round.
A collection of fit parameters.
Definition: Parameters.h:28
Interface residual calculations.
Stores fit iteration info to track fit flow from various observers.
Definition: IterationInfo.h:26
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:26
Wrapper around OutputData<double> that also provides unit conversions.
CreateDataImpl::ReturnType< T > createData(const T &vec)
Creates OutputData array from input vector.
Definition: ArrayUtils.h:61