BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
FitObjective Class Reference

Description

Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting. Thereby supports simultaneous fitting of several data sets and model functions, as demonstrated in example fit52/multiple_datasets.

Definition at line 42 of file FitObjective.h.

Collaboration diagram for FitObjective:
[legend]

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...
 
void addSimulationAndData (const PyBuilderCallback &callback, const std::vector< double > &data, const std::vector< double > &stdv, double weight=1.0)
 
void addSimulationAndData (const PyBuilderCallback &callback, const std::vector< double > &data, double weight=1.0)
 
void addSimulationAndData (const PyBuilderCallback &callback, const std::vector< std::vector< double >> &data, const std::vector< std::vector< double >> &stdv, double weight=1.0)
 Constructs simulation/data pair for later fit. More...
 
void addSimulationAndData (const PyBuilderCallback &callback, const std::vector< std::vector< double >> &data, 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)
 
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. More...
 
void execSimulations (const mumufit::Parameters &params)
 
std::vector< double > 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. 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 explicitly 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
 
SimulationResult relativeDifference (size_t i_item=0) const
 Returns relative difference between simulation and experimental data in the form of SimulationResult. More...
 
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. The area outside of the region of interest is not included, masked data is nullified. 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. The area outside of the region of interest is not included, masked data is nullified. 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. The area outside of the region of interest is not included, masked data is nullified. More...
 

Static Public Member Functions

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

Private Types

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

Private Member Functions

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

Private Attributes

std::vector< SimDataPairm_fit_objects
 
std::unique_ptr< FitStatusm_fit_status
 
std::unique_ptr< IMetricWrapper > m_metric_module
 

Member Typedef Documentation

◆ DataPairAccessor

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

Definition at line 136 of file FitObjective.h.

Constructor & Destructor Documentation

◆ FitObjective()

FitObjective::FitObjective ( )

Definition at line 125 of file FitObjective.cpp.

126  : m_metric_module(
127  std::make_unique<ObjectiveMetricWrapper>(std::make_unique<PoissonLikeMetric>()))
128  , m_fit_status(std::make_unique<FitStatus>(this))
129 {
130 }
std::unique_ptr< IMetricWrapper > m_metric_module
Definition: FitObjective.h:141
std::unique_ptr< FitStatus > m_fit_status
Definition: FitObjective.h:142

◆ ~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 224 of file FitObjective.cpp.

225 {
226  return dataPair(i_item).absoluteDifference();
227 }
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/4]

void FitObjective::addSimulationAndData ( const PyBuilderCallback callback,
const std::vector< double > &  data,
const std::vector< double > &  stdv,
double  weight = 1.0 
)

Definition at line 170 of file FitObjective.cpp.

173 {
174  execAddSimulationAndData(simulationBuilder(callback), *DataUtils::Array::createPField1D(data),
175  DataUtils::Array::createPField1D(stdv), weight);
176 }
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.
std::unique_ptr< Datafield > createPField1D(const std::vector< double > &vec)
Definition: ArrayUtils.cpp:32

References DataUtils::Array::createPField1D(), and execAddSimulationAndData().

Here is the call graph for this function:

◆ addSimulationAndData() [2/4]

void FitObjective::addSimulationAndData ( const PyBuilderCallback callback,
const std::vector< double > &  data,
double  weight = 1.0 
)

Definition at line 155 of file FitObjective.cpp.

157 {
158  execAddSimulationAndData(simulationBuilder(callback), *DataUtils::Array::createPField1D(data),
159  nullptr, weight);
160 }

References DataUtils::Array::createPField1D(), and execAddSimulationAndData().

Here is the call graph for this function:

◆ addSimulationAndData() [3/4]

void FitObjective::addSimulationAndData ( const PyBuilderCallback callback,
const std::vector< std::vector< double >> &  data,
const std::vector< std::vector< double >> &  stdv,
double  weight = 1.0 
)

Constructs simulation/data pair for later fit.

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

Definition at line 162 of file FitObjective.cpp.

165 {
166  execAddSimulationAndData(simulationBuilder(callback), *DataUtils::Array::createPField2D(data),
167  DataUtils::Array::createPField2D(stdv), weight);
168 }
std::unique_ptr< Datafield > createPField2D(const std::vector< std::vector< double >> &vec)
Definition: ArrayUtils.cpp:40

References DataUtils::Array::createPField2D(), and execAddSimulationAndData().

Here is the call graph for this function:

◆ addSimulationAndData() [4/4]

void FitObjective::addSimulationAndData ( const PyBuilderCallback callback,
const std::vector< std::vector< double >> &  data,
double  weight = 1.0 
)

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 148 of file FitObjective.cpp.

150 {
151  execAddSimulationAndData(simulationBuilder(callback), *DataUtils::Array::createPField2D(data),
152  nullptr, weight);
153 }

References DataUtils::Array::createPField2D(), and execAddSimulationAndData().

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 366 of file FitObjective.cpp.

367 {
368  bool result = true;
369  for (size_t i = 0, size = fitObjectCount(); i < size; ++i)
370  result = result && dataPair(i).containsUncertainties();
371  return result;
372 }
unsigned fitObjectCount() const
bool containsUncertainties() const

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 375 of file FitObjective.cpp.

376 {
378 }
std::string availableMetricOptions()
Prints available metric options.

References ObjectiveMetricUtils::availableMetricOptions().

Here is the call graph for this function:

◆ composeArray()

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

Definition at line 380 of file FitObjective.cpp.

381 {
382  const size_t n_objs = m_fit_objects.size();
383  if (n_objs == 0)
384  return {};
385  if (n_objs == 1)
386  return (m_fit_objects[0].*getter)();
387 
388  std::vector<double> result;
389  for (const auto& pair : m_fit_objects) {
390  std::vector<double> array = (pair.*getter)();
391  std::move(array.begin(), array.end(), std::back_inserter(result));
392  }
393  return result;
394 }
std::vector< SimDataPair > m_fit_objects
Definition: FitObjective.h:140

References m_fit_objects.

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

◆ containsUncertainties()

bool FitObjective::containsUncertainties ( size_t  i_item) const

Returns true if the specified DataPair element contains uncertainties.

Definition at line 360 of file FitObjective.cpp.

361 {
362  return dataPair(i_item).containsUncertainties();
363 }

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 257 of file FitObjective.cpp.

258 {
259  return m_fit_objects.at(i_item);
260 }

References m_fit_objects.

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

◆ evaluate()

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

Definition at line 178 of file FitObjective.cpp.

179 {
180  execSimulations(params);
181  const double metric_value = m_metric_module->compute(m_fit_objects, params.size());
182  m_fit_status->update(params, metric_value);
183  return metric_value;
184 }
void execSimulations(const mumufit::Parameters &params)
size_t size() const
Definition: Parameters.cpp:51

References execSimulations(), m_fit_objects, m_fit_status, m_metric_module, 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 186 of file FitObjective.cpp.

187 {
188  evaluate(params);
189 
190  std::vector<double> result = experimental_array(); // init result with experimental data values
191  const std::vector<double> sim_values = simulation_array();
192  std::transform(result.begin(), result.end(), sim_values.begin(), result.begin(),
193  [](double lhs, double rhs) { return lhs - rhs; });
194  return result;
195 }
virtual double evaluate(const mumufit::Parameters &params)
std::vector< double > experimental_array() const
Returns one-dimensional array representing merged experimental data. The area outside of the region o...
std::vector< double > simulation_array() const
Returns one-dimensional array representing merged simulated intensities data. The area outside of the...

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

Here is the call graph for this function:

◆ execAddSimulationAndData()

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

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

Should be private, but is used in several tests.

Definition at line 141 of file FitObjective.cpp.

144 {
145  m_fit_objects.emplace_back(builder, data, std::move(stdv), weight);
146 }

References m_fit_objects.

Referenced by addSimulationAndData().

◆ execSimulations()

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

Definition at line 318 of file FitObjective.cpp.

319 {
320  if (m_fit_status->isInterrupted())
321  throw std::runtime_error("Fitting was interrupted by the user.");
322 
323  if (m_fit_objects.empty())
324  throw std::runtime_error("FitObjective::execSimulations() -> Error. "
325  "No simulation/data defined.");
326 
327  for (auto& obj : m_fit_objects)
328  obj.execSimulation(params);
329 }

References m_fit_objects, and m_fit_status.

Referenced by evaluate().

◆ 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 231 of file FitObjective.cpp.

232 {
234 }
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 204 of file FitObjective.cpp.

205 {
206  return dataPair(i_item).experimentalData();
207 }
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 explicitly called on last iteration to notify all observers.

Definition at line 293 of file FitObjective.cpp.

294 {
295  m_fit_status->finalize(result);
296 }

References m_fit_status.

◆ fitObjectCount()

unsigned FitObjective::fitObjectCount ( ) const

Definition at line 298 of file FitObjective.cpp.

299 {
300  return static_cast<unsigned>(m_fit_objects.size());
301 }

References m_fit_objects.

Referenced by allPairsHaveUncertainties().

◆ initPlot() [1/2]

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

Definition at line 267 of file FitObjective.cpp.

268 {
269  m_fit_status->addObserver(every_nth, std::move(observer));
270 }

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 272 of file FitObjective.cpp.

273 {
274  fit_observer_t observer = [&](const FitObjective& objective) { callback.update(objective); };
275  m_fit_status->addObserver(every_nth, std::move(observer));
276 }
std::function< void(const FitObjective &)> fit_observer_t
Definition: FitTypes.h:36
Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting....
Definition: FitObjective.h:42
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 262 of file FitObjective.cpp.

263 {
264  m_fit_status->initPrint(every_nth);
265 }

References m_fit_status.

◆ interruptFitting()

void FitObjective::interruptFitting ( )

Definition at line 303 of file FitObjective.cpp.

304 {
305  m_fit_status->setInterrupted();
306 }

References m_fit_status.

◆ isCompleted()

bool FitObjective::isCompleted ( ) const

Definition at line 278 of file FitObjective.cpp.

279 {
280  return m_fit_status->isCompleted();
281 }

References m_fit_status.

Referenced by FitPrintService::print().

◆ isFirstIteration()

bool FitObjective::isFirstIteration ( ) const

Definition at line 313 of file FitObjective.cpp.

314 {
315  return iterationInfo().iterationCount() == 1;
316 }
IterationInfo iterationInfo() const
unsigned iterationCount() const
Returns current number of minimizer iterations.

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

Referenced by FitPrintService::print().

Here is the call graph for this function:

◆ isInterrupted()

bool FitObjective::isInterrupted ( ) const

Definition at line 308 of file FitObjective.cpp.

309 {
310  return m_fit_status->isInterrupted();
311 }

References m_fit_status.

◆ iterationInfo()

IterationInfo FitObjective::iterationInfo ( ) const

Definition at line 283 of file FitObjective.cpp.

284 {
285  return m_fit_status->iterationInfo();
286 }

References m_fit_status.

Referenced by isFirstIteration(), FitPrintService::iterationHeaderString(), and FitPrintService::parameterString().

◆ minimizerResult()

mumufit::MinimizerResult FitObjective::minimizerResult ( ) const

Definition at line 288 of file FitObjective.cpp.

289 {
290  return m_fit_status->minimizerResult();
291 }

References m_fit_status.

Referenced by FitPrintService::fitResultString().

◆ 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 217 of file FitObjective.cpp.

218 {
219  return dataPair(i_item).relativeDifference();
220 }
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:

◆ setChiSquaredModule()

void FitObjective::setChiSquaredModule ( const IChiSquaredModule module)

Definition at line 331 of file FitObjective.cpp.

332 {
333  std::cout << "Warning in FitObjective::setChiSquaredModule: setChiSquaredModule is deprecated "
334  "and will be removed in future versions. Please use "
335  "FitObjective::setObjectiveMetric instead."
336  << std::endl;
337 
338  std::unique_ptr<IChiSquaredModule> chi_module(module.clone());
339  m_metric_module = std::make_unique<ChiModuleWrapper>(std::move(chi_module));
340 }
IChiSquaredModule * clone() const override=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 347 of file FitObjective.cpp.

348 {
349  m_metric_module = std::make_unique<ObjectiveMetricWrapper>(
351 }
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 353 of file FitObjective.cpp.

354 {
356  std::make_unique<ObjectiveMetricWrapper>(ObjectiveMetricUtils::createMetric(metric, norm));
357 }

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 342 of file FitObjective.cpp.

343 {
344  m_metric_module = std::make_unique<ObjectiveMetricWrapper>(std::move(metric));
345 }

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 238 of file FitObjective.cpp.

239 {
241 }
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:

◆ simulationResult()

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

Returns simulation result in the form of SimulationResult.

Definition at line 198 of file FitObjective.cpp.

199 {
200  return dataPair(i_item).simulationResult();
201 }
SimulationResult simulationResult() const
Returns the result of last computed simulation.

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 245 of file FitObjective.cpp.

246 {
248 }
std::vector< double > uncertainties_array() const
Returns the flattened experimental uncertainties cut to the ROI area. If no uncertainties are availab...

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

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 210 of file FitObjective.cpp.

211 {
212  return dataPair(i_item).uncertainties();
213 }
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 252 of file FitObjective.cpp.

253 {
255 }
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 141 of file FitObjective.h.

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


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