BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
FitObjective Class Reference

Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting. More...

Public Member Functions

 FitObjective ()
 
virtual ~FitObjective ()
 
SimulationResult absoluteDifference (size_t i_item=0) const
 Returns absolute value of difference between simulation and experimental data in the form of SimulationResult. More...
 
template<class T >
void addSimulationAndData (PyBuilderCallback &callback, const T &data, const T &uncertainties, double weight=1.0)
 Constructs simulation/data pair for later fit. More...
 
template<class T >
void addSimulationAndData (PyBuilderCallback &callback, const T &data, double weight=1.0)
 Constructs simulation/data pair for later fit. More...
 
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. More...
 
bool allPairsHaveUncertainties () const
 Returns true if all the data pairs in FitObjective instance contain uncertainties. More...
 
bool containsUncertainties (size_t i_item) const
 Returns true if the specified DataPair element contains uncertainties. More...
 
const SimDataPairdataPair (size_t i_item=0) const
 Returns a reference to i-th SimDataPair. More...
 
virtual double evaluate (const mumufit::Parameters &params)
 
virtual std::vector< double > evaluate_residuals (const mumufit::Parameters &params)
 
std::vector< double > experimental_array () const
 Returns one dimensional array representing merged experimental data. More...
 
SimulationResult experimentalData (size_t i_item=0) const
 Returns experimental data in the form of SimulationResult. More...
 
void finalize (const mumufit::MinimizerResult &result)
 Should be explicitely called on last iteration to notify all observers. More...
 
unsigned fitObjectCount () const
 
void initPlot (int every_nth, fit_observer_t observer)
 
void initPlot (int every_nth, PyObserverCallback &callback)
 Initializes observer callback to be called on every_nth fit iteration. More...
 
void initPrint (int every_nth)
 Initializes printing to standard output on every_nth fit iteration. More...
 
void interruptFitting ()
 
bool isCompleted () const
 
bool isFirstIteration () const
 
bool isInterrupted () const
 
IterationInfo iterationInfo () const
 
mumufit::MinimizerResult minimizerResult () const
 
size_t numberOfFitElements () const
 
SimulationResult relativeDifference (size_t i_item=0) const
 Returns relative difference between simulation and experimental data in the form of SimulationResult. More...
 
void run_simulations (const mumufit::Parameters &params)
 
void setChiSquaredModule (const IChiSquaredModule &module)
 
void setObjectiveMetric (const std::string &metric)
 
void setObjectiveMetric (const std::string &metric, const std::string &norm)
 Sets objective metric to the FitObjective. More...
 
void setObjectiveMetric (std::unique_ptr< ObjectiveMetric > metric)
 
std::vector< double > simulation_array () const
 Returns one dimensional array representing merged simulated intensities data. More...
 
SimulationResult simulationResult (size_t i_item=0) const
 Returns simulation result in the form of SimulationResult. More...
 
std::vector< double > uncertainties () const
 Returns one-dimensional array representing merged data uncertainties. More...
 
SimulationResult uncertaintyData (size_t i_item=0) const
 Returns experimental data uncertainties in the form of SimulationResult. More...
 
std::vector< double > weights_array () const
 Returns one-dimensional array representing merged user weights. More...
 

Static Public Member Functions

static std::string availableMetricOptions ()
 Returns available metrics and norms. More...
 

Private Types

typedef std::vector< double >(SimDataPair::* DataPairAccessor) () const
 

Private Member Functions

size_t check_index (size_t index) const
 
std::vector< double > composeArray (DataPairAccessor getter) const
 

Static Private Member Functions

static simulation_builder_t simulationBuilder (PyBuilderCallback &callback)
 

Private Attributes

std::vector< SimDataPairm_fit_objects
 
std::unique_ptr< FitStatusm_fit_status
 
std::unique_ptr< IMetricWrapperm_metric_module
 

Detailed Description

Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting.

Definition at line 33 of file FitObjective.h.

Member Typedef Documentation

◆ DataPairAccessor

typedef std::vector<double>(SimDataPair::* FitObjective::DataPairAccessor) () const
private

Definition at line 134 of file FitObjective.h.

Constructor & Destructor Documentation

◆ FitObjective()

FitObjective::FitObjective ( )

Definition at line 59 of file FitObjective.cpp.

61  std::make_unique<ObjectiveMetricWrapper>(std::make_unique<PoissonLikeMetric>()))
62  , m_fit_status(std::make_unique<FitStatus>(this))
63 {
64 }
std::unique_ptr< IMetricWrapper > m_metric_module
Definition: FitObjective.h:140
std::unique_ptr< FitStatus > m_fit_status
Definition: FitObjective.h:141

◆ ~FitObjective()

FitObjective::~FitObjective ( )
virtualdefault

Member Function Documentation

◆ absoluteDifference()

SimulationResult FitObjective::absoluteDifference ( size_t  i_item = 0) const

Returns absolute value of difference between simulation and experimental data in the form of SimulationResult.

Definition at line 134 of file FitObjective.cpp.

135 {
136  return dataPair(i_item).absoluteDifference();
137 }
const SimDataPair & dataPair(size_t i_item=0) const
Returns a reference to i-th SimDataPair.
SimulationResult absoluteDifference() const
Returns the absolute difference between simulated and experimental data cut to the ROI area.

References SimDataPair::absoluteDifference(), and dataPair().

Here is the call graph for this function:

◆ addSimulationAndData() [1/3]

template<class T >
void FitObjective::addSimulationAndData ( PyBuilderCallback callback,
const T &  data,
const T &  uncertainties,
double  weight = 1.0 
)
inline

Constructs simulation/data pair for later fit.

Parameters
callbacksimulation builder capable of producing simulations
dataexperimental data array
uncertaintiesdata uncertainties array
weightweight of dataset in metric calculations

Definition at line 62 of file FitObjective.h.

64  {
67  }
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.
static simulation_builder_t simulationBuilder(PyBuilderCallback &callback)
std::vector< double > uncertainties() const
Returns one-dimensional array representing merged data uncertainties.
CreateDataImpl::ReturnType< T > createData(const T &vec)
Creates OutputData array from input vector.
Definition: ArrayUtils.h:65

References addSimulationAndData(), ArrayUtils::createData(), simulationBuilder(), and uncertainties().

Here is the call graph for this function:

◆ addSimulationAndData() [2/3]

template<class T >
void FitObjective::addSimulationAndData ( PyBuilderCallback callback,
const T &  data,
double  weight = 1.0 
)
inline

Constructs simulation/data pair for later fit.

Parameters
callbacksimulation builder capable of producing simulations
dataexperimental data array
weightweight of dataset in metric calculations

Definition at line 50 of file FitObjective.h.

51  {
53  weight);
54  }

References addSimulationAndData(), ArrayUtils::createData(), and simulationBuilder().

Here is the call graph for this function:

◆ addSimulationAndData() [3/3]

void FitObjective::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.

Parameters
buildersimulation builder capable of producing simulations
dataexperimental data array
uncertaintiesdata uncertainties array
weightweight of dataset in metric calculations

Definition at line 73 of file FitObjective.cpp.

77 {
78  m_fit_objects.emplace_back(builder, data, std::move(uncertainties), weight);
79 }
std::vector< SimDataPair > m_fit_objects
Definition: FitObjective.h:139

References m_fit_objects, and uncertainties().

Referenced by addSimulationAndData().

Here is the call graph for this function:

◆ allPairsHaveUncertainties()

bool FitObjective::allPairsHaveUncertainties ( ) const

Returns true if all the data pairs in FitObjective instance contain uncertainties.

Definition at line 276 of file FitObjective.cpp.

277 {
278  bool result = true;
279  for (size_t i = 0, size = fitObjectCount(); i < size; ++i)
280  result = result && dataPair(i).containsUncertainties();
281  return result;
282 }
unsigned fitObjectCount() const
bool containsUncertainties() const
Definition: SimDataPair.cpp:86

References SimDataPair::containsUncertainties(), dataPair(), and fitObjectCount().

Here is the call graph for this function:

◆ availableMetricOptions()

std::string FitObjective::availableMetricOptions ( )
static

Returns available metrics and norms.

Definition at line 285 of file FitObjective.cpp.

286 {
288 }
std::string availableMetricOptions()
Prints available metric options.

References ObjectiveMetricUtils::availableMetricOptions().

Here is the call graph for this function:

◆ check_index()

size_t FitObjective::check_index ( size_t  index) const
private

Definition at line 307 of file FitObjective.cpp.

308 {
309  if (index >= m_fit_objects.size())
310  throw std::runtime_error("FitObjective::check_index() -> Index outside of range");
311  return index;
312 }

References m_fit_objects.

Referenced by dataPair().

◆ composeArray()

std::vector< double > FitObjective::composeArray ( DataPairAccessor  getter) const
private

Definition at line 290 of file FitObjective.cpp.

291 {
292  const size_t n_objs = m_fit_objects.size();
293  if (n_objs == 0)
294  return {};
295  if (n_objs == 1)
296  return (m_fit_objects[0].*getter)();
297 
298  std::vector<double> result;
299  result.reserve(numberOfFitElements());
300  for (auto& pair : m_fit_objects) {
301  std::vector<double> array = (pair.*getter)();
302  std::move(array.begin(), array.end(), std::back_inserter(result));
303  }
304  return result;
305 }
size_t numberOfFitElements() const

References m_fit_objects, and numberOfFitElements().

Referenced by experimental_array(), simulation_array(), uncertainties(), and weights_array().

Here is the call graph for this function:

◆ containsUncertainties()

bool FitObjective::containsUncertainties ( size_t  i_item) const

Returns true if the specified DataPair element contains uncertainties.

Definition at line 270 of file FitObjective.cpp.

271 {
272  return dataPair(i_item).containsUncertainties();
273 }

References SimDataPair::containsUncertainties(), and dataPair().

Here is the call graph for this function:

◆ dataPair()

const SimDataPair & FitObjective::dataPair ( size_t  i_item = 0) const

Returns a reference to i-th SimDataPair.

Definition at line 167 of file FitObjective.cpp.

168 {
169  return m_fit_objects[check_index(i_item)];
170 }
size_t check_index(size_t index) const

References check_index(), and m_fit_objects.

Referenced by absoluteDifference(), allPairsHaveUncertainties(), containsUncertainties(), experimentalData(), relativeDifference(), simulationResult(), uncertaintyData(), and GUIFitObserver::update().

Here is the call graph for this function:

◆ evaluate()

double FitObjective::evaluate ( const mumufit::Parameters params)
virtual

Definition at line 81 of file FitObjective.cpp.

82 {
83  run_simulations(params);
84  const double metric_value = m_metric_module->compute(m_fit_objects, params.size());
85  m_fit_status->update(params, metric_value);
86  return metric_value;
87 }
void run_simulations(const mumufit::Parameters &params)
size_t size() const
Definition: Parameters.cpp:51

References m_fit_objects, m_fit_status, m_metric_module, run_simulations(), and mumufit::Parameters::size().

Referenced by evaluate_residuals().

Here is the call graph for this function:

◆ evaluate_residuals()

std::vector< double > FitObjective::evaluate_residuals ( const mumufit::Parameters params)
virtual

Definition at line 89 of file FitObjective.cpp.

90 {
91  evaluate(params);
92 
93  std::vector<double> result = experimental_array(); // init result with experimental data values
94  const std::vector<double> sim_values = simulation_array();
95  std::transform(result.begin(), result.end(), sim_values.begin(), result.begin(),
96  [](double lhs, double rhs) { return lhs - rhs; });
97  return result;
98 }
virtual double evaluate(const mumufit::Parameters &params)
std::vector< double > experimental_array() const
Returns one dimensional array representing merged experimental data.
std::vector< double > simulation_array() const
Returns one dimensional array representing merged simulated intensities data.

References evaluate(), experimental_array(), and simulation_array().

Here is the call graph for this function:

◆ experimental_array()

std::vector< double > FitObjective::experimental_array ( ) const

Returns one dimensional array representing merged experimental data.

The area outside of the region of interest is not included, masked data is nullified.

Definition at line 141 of file FitObjective.cpp.

142 {
144 }
std::vector< double > composeArray(DataPairAccessor getter) const
std::vector< double > experimental_array() const
Returns the flattened experimental data cut to the ROI area.

References composeArray(), and SimDataPair::experimental_array().

Referenced by evaluate_residuals().

Here is the call graph for this function:

◆ experimentalData()

SimulationResult FitObjective::experimentalData ( size_t  i_item = 0) const

Returns experimental data in the form of SimulationResult.

Definition at line 114 of file FitObjective.cpp.

115 {
116  return dataPair(i_item).experimentalData();
117 }
SimulationResult experimentalData() const
Returns the experimental data cut to the ROI area.

References dataPair(), and SimDataPair::experimentalData().

Here is the call graph for this function:

◆ finalize()

void FitObjective::finalize ( const mumufit::MinimizerResult result)

Should be explicitely called on last iteration to notify all observers.

Definition at line 203 of file FitObjective.cpp.

204 {
205  m_fit_status->finalize(result);
206 }

References m_fit_status.

◆ fitObjectCount()

unsigned FitObjective::fitObjectCount ( ) const

Definition at line 208 of file FitObjective.cpp.

209 {
210  return static_cast<unsigned>(m_fit_objects.size());
211 }

References m_fit_objects.

Referenced by allPairsHaveUncertainties().

◆ initPlot() [1/2]

void FitObjective::initPlot ( int  every_nth,
fit_observer_t  observer 
)

Definition at line 177 of file FitObjective.cpp.

178 {
179  m_fit_status->addObserver(every_nth, observer);
180 }

References m_fit_status.

◆ initPlot() [2/2]

void FitObjective::initPlot ( int  every_nth,
PyObserverCallback callback 
)

Initializes observer callback to be called on every_nth fit iteration.

Definition at line 182 of file FitObjective.cpp.

183 {
184  fit_observer_t observer = [&](const FitObjective& objective) { callback.update(objective); };
185  m_fit_status->addObserver(every_nth, observer);
186 }
std::function< void(const FitObjective &)> fit_observer_t
Definition: FitTypes.h:35
Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting.
Definition: FitObjective.h:33
virtual void update(const FitObjective &)

References m_fit_status, and PyObserverCallback::update().

Here is the call graph for this function:

◆ initPrint()

void FitObjective::initPrint ( int  every_nth)

Initializes printing to standard output on every_nth fit iteration.

Definition at line 172 of file FitObjective.cpp.

173 {
174  m_fit_status->initPrint(every_nth);
175 }

References m_fit_status.

◆ interruptFitting()

void FitObjective::interruptFitting ( )

Definition at line 213 of file FitObjective.cpp.

214 {
215  m_fit_status->setInterrupted();
216 }

References m_fit_status.

◆ isCompleted()

bool FitObjective::isCompleted ( ) const

Definition at line 188 of file FitObjective.cpp.

189 {
190  return m_fit_status->isCompleted();
191 }

References m_fit_status.

Referenced by GUIFitObserver::is_obligatory_iteration(), GUIFitObserver::is_suitable_iteration(), FitPrintService::print(), and GUIFitObserver::update().

◆ isFirstIteration()

bool FitObjective::isFirstIteration ( ) const

Definition at line 223 of file FitObjective.cpp.

224 {
225  return iterationInfo().iterationCount() == 1;
226 }
IterationInfo iterationInfo() const
unsigned iterationCount() const
Returns current number of minimizer iterations.

References IterationInfo::iterationCount(), and iterationInfo().

Referenced by GUIFitObserver::is_suitable_iteration(), and FitPrintService::print().

Here is the call graph for this function:

◆ isInterrupted()

bool FitObjective::isInterrupted ( ) const

Definition at line 218 of file FitObjective.cpp.

219 {
220  return m_fit_status->isInterrupted();
221 }

References m_fit_status.

Referenced by GUIFitObserver::is_suitable_iteration().

◆ iterationInfo()

IterationInfo FitObjective::iterationInfo ( ) const

◆ minimizerResult()

mumufit::MinimizerResult FitObjective::minimizerResult ( ) const

Definition at line 198 of file FitObjective.cpp.

199 {
200  return m_fit_status->minimizerResult();
201 }

References m_fit_status.

Referenced by FitPrintService::fitResultString(), and GUIFitObserver::update().

◆ numberOfFitElements()

size_t FitObjective::numberOfFitElements ( ) const

Definition at line 100 of file FitObjective.cpp.

101 {
102  return std::accumulate(
103  m_fit_objects.begin(), m_fit_objects.end(), 0u,
104  [](size_t acc, auto& obj) -> size_t { return acc + obj.numberOfFitElements(); });
105 }

References m_fit_objects.

Referenced by composeArray().

◆ relativeDifference()

SimulationResult FitObjective::relativeDifference ( size_t  i_item = 0) const

Returns relative difference between simulation and experimental data in the form of SimulationResult.

Definition at line 127 of file FitObjective.cpp.

128 {
129  return dataPair(i_item).relativeDifference();
130 }
SimulationResult relativeDifference() const
Returns the relative difference between simulated and experimental data cut to the ROI area.

References dataPair(), and SimDataPair::relativeDifference().

Here is the call graph for this function:

◆ run_simulations()

void FitObjective::run_simulations ( const mumufit::Parameters params)

Definition at line 228 of file FitObjective.cpp.

229 {
230  if (m_fit_status->isInterrupted())
231  throw std::runtime_error("Fitting was interrupted by the user.");
232 
233  if (m_fit_objects.empty())
234  throw std::runtime_error("FitObjective::run_simulations() -> Error. "
235  "No simulation/data defined.");
236 
237  for (auto& obj : m_fit_objects)
238  obj.runSimulation(params);
239 }

References m_fit_objects, and m_fit_status.

Referenced by evaluate().

◆ setChiSquaredModule()

void FitObjective::setChiSquaredModule ( const IChiSquaredModule module)

Definition at line 241 of file FitObjective.cpp.

242 {
243  std::cout << "Warning in FitObjective::setChiSquaredModule: setChiSquaredModule is deprecated "
244  "and will be removed in future versions. Please use "
245  "FitObjective::setObjectiveMetric instead."
246  << std::endl;
247 
248  std::unique_ptr<IChiSquaredModule> chi_module(module.clone());
249  m_metric_module = std::make_unique<ChiModuleWrapper>(std::move(chi_module));
250 }
virtual IChiSquaredModule * clone() const =0
clone method

References IChiSquaredModule::clone(), and m_metric_module.

Here is the call graph for this function:

◆ setObjectiveMetric() [1/3]

void FitObjective::setObjectiveMetric ( const std::string &  metric)

Definition at line 257 of file FitObjective.cpp.

258 {
259  m_metric_module = std::make_unique<ObjectiveMetricWrapper>(
261 }
std::string defaultNormName()
Returns default norm name.
std::unique_ptr< ObjectiveMetric > createMetric(const std::string &metric)
Creates the specified metric with the default norm.

References ObjectiveMetricUtils::createMetric(), ObjectiveMetricUtils::defaultNormName(), and m_metric_module.

Here is the call graph for this function:

◆ setObjectiveMetric() [2/3]

void FitObjective::setObjectiveMetric ( const std::string &  metric,
const std::string &  norm 
)

Sets objective metric to the FitObjective.

Parameters
metricmetric name
normmetric norm name (defaults to L2-norm)

Definition at line 263 of file FitObjective.cpp.

264 {
266  std::make_unique<ObjectiveMetricWrapper>(ObjectiveMetricUtils::createMetric(metric, norm));
267 }

References ObjectiveMetricUtils::createMetric(), and m_metric_module.

Here is the call graph for this function:

◆ setObjectiveMetric() [3/3]

void FitObjective::setObjectiveMetric ( std::unique_ptr< ObjectiveMetric metric)

Definition at line 252 of file FitObjective.cpp.

253 {
254  m_metric_module = std::make_unique<ObjectiveMetricWrapper>(std::move(metric));
255 }

References m_metric_module.

◆ simulation_array()

std::vector< double > FitObjective::simulation_array ( ) const

Returns one dimensional array representing merged simulated intensities data.

The area outside of the region of interest is not included, masked data is nullified.

Definition at line 148 of file FitObjective.cpp.

149 {
151 }
std::vector< double > simulation_array() const
Returns the flattened simulated intensities cut to the ROI area.

References composeArray(), and SimDataPair::simulation_array().

Referenced by evaluate_residuals().

Here is the call graph for this function:

◆ simulationBuilder()

simulation_builder_t FitObjective::simulationBuilder ( PyBuilderCallback callback)
staticprivate

Definition at line 49 of file FitObjective.cpp.

50 {
51  return [&callback](const mumufit::Parameters& params) {
52  auto simulation = callback.build_simulation(params);
53  std::unique_ptr<ISimulation> clone(simulation->clone());
54  delete simulation; // deleting Python object
55  return clone;
56  };
57 }
virtual ISimulation * build_simulation(mumufit::Parameters)
A collection of fit parameters.
Definition: Parameters.h:26
@ clone
full deep copying with item identifiers preserved

References PyBuilderCallback::build_simulation().

Referenced by addSimulationAndData().

Here is the call graph for this function:

◆ simulationResult()

SimulationResult FitObjective::simulationResult ( size_t  i_item = 0) const

Returns simulation result in the form of SimulationResult.

Definition at line 108 of file FitObjective.cpp.

109 {
110  return dataPair(i_item).simulationResult();
111 }
SimulationResult simulationResult() const
Returns the result of last computed simulation.
Definition: SimDataPair.cpp:96

References dataPair(), and SimDataPair::simulationResult().

Here is the call graph for this function:

◆ uncertainties()

std::vector< double > FitObjective::uncertainties ( ) const

Returns one-dimensional array representing merged data uncertainties.

The area outside of the region of interest is not included, masked data is nullified.

Definition at line 155 of file FitObjective.cpp.

156 {
158 }
std::vector< double > uncertainties_array() const
Returns the flattened experimental uncertainties cut to the ROI area.

References composeArray(), and SimDataPair::uncertainties_array().

Referenced by addSimulationAndData().

Here is the call graph for this function:

◆ uncertaintyData()

SimulationResult FitObjective::uncertaintyData ( size_t  i_item = 0) const

Returns experimental data uncertainties in the form of SimulationResult.

Definition at line 120 of file FitObjective.cpp.

121 {
122  return dataPair(i_item).uncertainties();
123 }
SimulationResult uncertainties() const
Returns the data uncertainties cut to the ROI area If no uncertainties present, returns zero-filled S...

References dataPair(), and SimDataPair::uncertainties().

Here is the call graph for this function:

◆ weights_array()

std::vector< double > FitObjective::weights_array ( ) const

Returns one-dimensional array representing merged user weights.

The area outside of the region of interest is not included, masked data is nullified.

Definition at line 162 of file FitObjective.cpp.

163 {
165 }
std::vector< double > user_weights_array() const
Returns a flat array of user weights cut to the ROI area.

References composeArray(), and SimDataPair::user_weights_array().

Here is the call graph for this function:

Member Data Documentation

◆ m_fit_objects

std::vector<SimDataPair> FitObjective::m_fit_objects
private

◆ m_fit_status

std::unique_ptr<FitStatus> FitObjective::m_fit_status
private

◆ m_metric_module

std::unique_ptr<IMetricWrapper> FitObjective::m_metric_module
private

Definition at line 140 of file FitObjective.h.

Referenced by evaluate(), setChiSquaredModule(), and setObjectiveMetric().


The documentation for this class was generated from the following files: