BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
FitObjective Class Reference
Collaboration diagram for FitObjective:

Public Member Functions

 FitObjective ()
 
virtual ~FitObjective ()
 
void addSimulationAndData (simulation_builder_t builder, const OutputData< double > &data, std::unique_ptr< OutputData< double >> uncertainties, double weight=1.0)
 
template<class T >
void addSimulationAndData (PyBuilderCallback &callback, const T &data, double weight=1.0)
 
template<class T >
void addSimulationAndData (PyBuilderCallback &callback, const T &data, const T &uncertainties, double weight=1.0)
 
virtual double evaluate (const Fit::Parameters &params)
 
virtual std::vector< double > evaluate_residuals (const Fit::Parameters &params)
 
size_t numberOfFitElements () const
 
SimulationResult simulationResult (size_t i_item=0) const
 
SimulationResult experimentalData (size_t i_item=0) const
 
SimulationResult uncertaintyData (size_t i_item=0) const
 
SimulationResult relativeDifference (size_t i_item=0) const
 
SimulationResult absoluteDifference (size_t i_item=0) const
 
std::vector< double > experimental_array () const
 
std::vector< double > simulation_array () const
 
std::vector< double > uncertainties () const
 
std::vector< double > weights_array () const
 
void initPrint (int every_nth)
 
void initPlot (int every_nth, PyObserverCallback &callback)
 
IterationInfo iterationInfo () const
 
Fit::MinimizerResult minimizerResult () const
 
void finalize (const Fit::MinimizerResult &result)
 
unsigned fitObjectCount () const
 
void run_simulations (const Fit::Parameters &params)
 
void setChiSquaredModule (const IChiSquaredModule &module)
 
void setObjectiveMetric (const std::string &metric)
 
void setObjectiveMetric (const std::string &metric, const std::string &norm)
 
bool containsUncertainties (size_t i_item) const
 
bool allPairsHaveUncertainties () const
 
const SimDataPairdataPair (size_t i_item=0) const
 
void initPlot (int every_nth, fit_observer_t observer)
 
bool isCompleted () const
 
void interruptFitting ()
 
bool isInterrupted () const
 
bool isFirstIteration () const
 
void setObjectiveMetric (std::unique_ptr< ObjectiveMetric > metric)
 

Static Public Member Functions

static std::string availableMetricOptions ()
 

Private Types

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

Private Member Functions

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

Static Private Member Functions

static simulation_builder_t simulationBuilder (PyBuilderCallback &callback)
 

Private Attributes

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

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 135 of file FitObjective.h.

Constructor & Destructor Documentation

◆ FitObjective()

FitObjective::FitObjective ( )

Definition at line 62 of file FitObjective.cpp.

64  std::make_unique<ObjectiveMetricWrapper>(std::make_unique<PoissonLikeMetric>())),
65  m_fit_status(std::make_unique<FitStatus>(this))
66 {
67 }
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

◆ simulationBuilder()

simulation_builder_t FitObjective::simulationBuilder ( PyBuilderCallback callback)
staticprivate

Definition at line 52 of file FitObjective.cpp.

53 {
54  return [&callback](const Fit::Parameters& params) {
55  auto simulation = callback.build_simulation(params);
56  std::unique_ptr<Simulation> clone(simulation->clone());
57  delete simulation; // deleting Python object
58  return clone;
59  };
60 }
A collection of fit parameters.
Definition: Parameters.h:28
virtual Simulation * build_simulation(Fit::Parameters)

References PyBuilderCallback::build_simulation().

Referenced by addSimulationAndData().

Here is the call graph for this function:

◆ addSimulationAndData() [1/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 76 of file FitObjective.cpp.

80 {
81  m_fit_objects.emplace_back(builder, data, std::move(uncertainties), weight);
82 }
std::vector< SimDataPair > m_fit_objects
Definition: FitObjective.h:140
std::vector< double > uncertainties() const
Returns one-dimensional array representing merged data uncertainties.

References m_fit_objects, and uncertainties().

Referenced by addSimulationAndData().

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 51 of file FitObjective.h.

52  {
54  weight);
55  }
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)
CreateDataImpl::ReturnType< T > createData(const T &vec)
Creates OutputData array from input vector.
Definition: ArrayUtils.h:61

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

Here is the call graph for this function:

◆ addSimulationAndData() [3/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 63 of file FitObjective.h.

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

Here is the call graph for this function:

◆ evaluate()

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

Definition at line 84 of file FitObjective.cpp.

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

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

Referenced by evaluate_residuals().

Here is the call graph for this function:

◆ evaluate_residuals()

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

Definition at line 92 of file FitObjective.cpp.

93 {
94  evaluate(params);
95 
96  std::vector<double> result = experimental_array(); // init result with experimental data values
97  const std::vector<double> sim_values = simulation_array();
98  std::transform(result.begin(), result.end(), sim_values.begin(), result.begin(),
99  [](double lhs, double rhs) { return lhs - rhs; });
100  return result;
101 }
virtual double evaluate(const Fit::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:

◆ numberOfFitElements()

size_t FitObjective::numberOfFitElements ( ) const

Definition at line 103 of file FitObjective.cpp.

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

References m_fit_objects.

Referenced by composeArray().

◆ simulationResult()

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

Returns simulation result in the form of SimulationResult.

Definition at line 111 of file FitObjective.cpp.

112 {
113  return dataPair(i_item).simulationResult();
114 }
const SimDataPair & dataPair(size_t i_item=0) const
Returns a reference to i-th SimDataPair.
SimulationResult simulationResult() const
Returns the result of last computed simulation.
Definition: SimDataPair.cpp:91

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

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

118 {
119  return dataPair(i_item).experimentalData();
120 }
SimulationResult experimentalData() const
Returns the experimental data cut to the ROI area.
Definition: SimDataPair.cpp:98

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

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

124 {
125  return dataPair(i_item).uncertainties();
126 }
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:

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

131 {
132  return dataPair(i_item).relativeDifference();
133 }
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:

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

138 {
139  return dataPair(i_item).absoluteDifference();
140 }
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:

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

145 {
147 }
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:

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

152 {
154 }
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:

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

159 {
161 }
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:

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

166 {
168 }
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:

◆ initPrint()

void FitObjective::initPrint ( int  every_nth)

Initializes printing to standard output on every_nth fit iteration.

Definition at line 175 of file FitObjective.cpp.

176 {
177  m_fit_status->initPrint(every_nth);
178 }

References m_fit_status.

◆ initPlot() [1/2]

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

Initializes observer callback to be called on every_nth fit iteration.

Definition at line 185 of file FitObjective.cpp.

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

References m_fit_status, and PyObserverCallback::update().

Here is the call graph for this function:

◆ iterationInfo()

IterationInfo FitObjective::iterationInfo ( ) const

Definition at line 196 of file FitObjective.cpp.

197 {
198  return m_fit_status->iterationInfo();
199 }

References m_fit_status.

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

◆ minimizerResult()

Fit::MinimizerResult FitObjective::minimizerResult ( ) const

Definition at line 201 of file FitObjective.cpp.

202 {
203  return m_fit_status->minimizerResult();
204 }

References m_fit_status.

Referenced by FitPrintService::fitResultString().

◆ finalize()

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

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

Definition at line 206 of file FitObjective.cpp.

207 {
208  m_fit_status->finalize(result);
209 }

References m_fit_status.

◆ fitObjectCount()

unsigned FitObjective::fitObjectCount ( ) const

Definition at line 211 of file FitObjective.cpp.

212 {
213  return static_cast<unsigned>(m_fit_objects.size());
214 }

References m_fit_objects.

Referenced by allPairsHaveUncertainties().

◆ run_simulations()

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

Definition at line 231 of file FitObjective.cpp.

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

References m_fit_objects, and m_fit_status.

Referenced by evaluate().

◆ setChiSquaredModule()

void FitObjective::setChiSquaredModule ( const IChiSquaredModule module)

Definition at line 244 of file FitObjective.cpp.

245 {
246  std::cout << "Warning in FitObjective::setChiSquaredModule: setChiSquaredModule is deprecated "
247  "and will be removed in future versions. Please use "
248  "FitObjective::setObjectiveMetric instead."
249  << std::endl;
250 
251  std::unique_ptr<IChiSquaredModule> chi_module(module.clone());
252  m_metric_module = std::make_unique<ChiModuleWrapper>(std::move(chi_module));
253 }
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 260 of file FitObjective.cpp.

261 {
262  m_metric_module = std::make_unique<ObjectiveMetricWrapper>(
264 }
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 266 of file FitObjective.cpp.

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

References ObjectiveMetricUtils::createMetric(), and m_metric_module.

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

274 {
275  return dataPair(i_item).containsUncertainties();
276 }
bool containsUncertainties() const
Definition: SimDataPair.cpp:81

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

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

280 {
281  bool result = true;
282  for (size_t i = 0, size = fitObjectCount(); i < size; ++i)
283  result = result && dataPair(i).containsUncertainties();
284  return result;
285 }
unsigned fitObjectCount() 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 288 of file FitObjective.cpp.

289 {
291 }
std::string availableMetricOptions()
Prints available metric options.

References ObjectiveMetricUtils::availableMetricOptions().

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

171 {
172  return m_fit_objects[check_index(i_item)];
173 }
size_t check_index(size_t index) const

References check_index(), and m_fit_objects.

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

Here is the call graph for this function:

◆ initPlot() [2/2]

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

Definition at line 180 of file FitObjective.cpp.

181 {
182  m_fit_status->addObserver(every_nth, observer);
183 }

References m_fit_status.

◆ isCompleted()

bool FitObjective::isCompleted ( ) const

Definition at line 191 of file FitObjective.cpp.

192 {
193  return m_fit_status->isCompleted();
194 }

References m_fit_status.

Referenced by FitPrintService::print().

◆ interruptFitting()

void FitObjective::interruptFitting ( )

Definition at line 216 of file FitObjective.cpp.

217 {
218  m_fit_status->setInterrupted();
219 }

References m_fit_status.

◆ isInterrupted()

bool FitObjective::isInterrupted ( ) const

Definition at line 221 of file FitObjective.cpp.

222 {
223  return m_fit_status->isInterrupted();
224 }

References m_fit_status.

◆ isFirstIteration()

bool FitObjective::isFirstIteration ( ) const

Definition at line 226 of file FitObjective.cpp.

227 {
228  return iterationInfo().iterationCount() == 1;
229 }
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:

◆ setObjectiveMetric() [3/3]

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

Definition at line 255 of file FitObjective.cpp.

256 {
257  m_metric_module = std::make_unique<ObjectiveMetricWrapper>(std::move(metric));
258 }

References m_metric_module.

◆ composeArray()

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

Definition at line 293 of file FitObjective.cpp.

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

◆ check_index()

size_t FitObjective::check_index ( size_t  index) const
private

Definition at line 310 of file FitObjective.cpp.

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

References m_fit_objects.

Referenced by dataPair().

Member Data Documentation

◆ m_fit_objects

std::vector<SimDataPair> FitObjective::m_fit_objects
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().

◆ m_fit_status

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

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