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 {
36 
37 public:
38  FitObjective();
39  virtual ~FitObjective();
40 
41 #ifndef SWIG
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  {
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  {
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 
94 
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.
std::function< void(const FitObjective &)> fit_observer_t
Definition: FitTypes.h:30
std::function< std::unique_ptr< Simulation >(const Fit::Parameters &)> simulation_builder_t
Definition: FitTypes.h:28
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
void run_simulations(const Fit::Parameters &params)
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
std::unique_ptr< IMetricWrapper > m_metric_module
Definition: FitObjective.h:141
bool isFirstIteration() const
virtual double evaluate(const Fit::Parameters &params)
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: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< SimDataPair > m_fit_objects
Definition: FitObjective.h:140
static simulation_builder_t simulationBuilder(PyBuilderCallback &callback)
void interruptFitting()
size_t check_index(size_t index) 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:135
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.
size_t numberOfFitElements() const
std::vector< double > experimental_array() const
Returns one dimensional array representing merged experimental data.
virtual ~FitObjective()
Fit::MinimizerResult minimizerResult() const
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:142
const SimDataPair & dataPair(size_t i_item=0) const
Returns a reference to i-th SimDataPair.
virtual std::vector< double > evaluate_residuals(const Fit::Parameters &params)
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: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