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

Implementation of relative difference metric. More...

Inheritance diagram for RQ4Metric:
[legend]
Collaboration diagram for RQ4Metric:
[legend]

Public Member Functions

 RQ4Metric ()
 
RQ4Metricclone () const override
 
double compute (const SimDataPair &data_pair, bool use_weights) const override
 Computes metric value from SimDataPair object. More...
 
double computeFromArrays (std::vector< double > sim_data, std::vector< double > exp_data, std::vector< double > uncertainties, std::vector< double > weight_factors) const override
 Computes metric value from data arrays. More...
 
double computeFromArrays (std::vector< double > sim_data, std::vector< double > exp_data, std::vector< double > weight_factors) const override
 Computes metric value from data arrays. More...
 
auto norm () const
 Returns a copy of the normalization function used. More...
 
void setNorm (std::function< double(double)> norm)
 
virtual void transferToCPP ()
 Used for Python overriding of clone (see swig/tweaks.py) More...
 

Private Attributes

std::function< double(double)> m_norm
 

Detailed Description

Implementation of relative difference metric.

With default L2 norm and weighting off corresponds to the formula

\[Result = \sum (I \cdot Q^4 - D \cdot Q^4)^2\]

where $Q$ is the scattering vector magnitude. If weighting is on, coincides with the metric provided by Chi2Metric class.

Definition at line 191 of file ObjectiveMetric.h.

Constructor & Destructor Documentation

◆ RQ4Metric()

RQ4Metric::RQ4Metric ( )

Definition at line 223 of file ObjectiveMetric.cpp.

223 : Chi2Metric() {}

Member Function Documentation

◆ clone()

RQ4Metric * RQ4Metric::clone ( ) const
overridevirtual

Reimplemented from Chi2Metric.

Definition at line 225 of file ObjectiveMetric.cpp.

226 {
227  return copyMetric(*this);
228 }

◆ compute()

double RQ4Metric::compute ( const SimDataPair data_pair,
bool  use_weights 
) const
overridevirtual

Computes metric value from SimDataPair object.

Calls computeFromArrays internally.

Parameters
data_pairSimDataPair object. Can optionally contain data uncertainties
use_weightsboolean, defines if data uncertainties should be taken into account

Reimplemented from ObjectiveMetric.

Definition at line 230 of file ObjectiveMetric.cpp.

231 {
232  if (use_weights)
233  return Chi2Metric::compute(data_pair, use_weights);
234 
235  // fetching data in RQ4 form
236  auto sim_data = data_pair.simulationResult().data(Axes::Units::RQ4);
237  auto exp_data = data_pair.experimentalData().data(Axes::Units::RQ4);
238 
239  return computeFromArrays(sim_data->getRawDataVector(), exp_data->getRawDataVector(),
240  data_pair.user_weights_array());
241 }
double computeFromArrays(std::vector< double > sim_data, std::vector< double > exp_data, std::vector< double > uncertainties, std::vector< double > weight_factors) const override
Computes metric value from data arrays.
virtual double compute(const SimDataPair &data_pair, bool use_weights) const
Computes metric value from SimDataPair object.
std::vector< double > user_weights_array() const
Returns a flat array of user weights cut to the ROI area.
SimulationResult experimentalData() const
Returns the experimental data cut to the ROI area.
SimulationResult simulationResult() const
Returns the result of last computed simulation.
Definition: SimDataPair.cpp:96
std::unique_ptr< OutputData< double > > data(Axes::Units units=Axes::Units::DEFAULT) const

References ObjectiveMetric::compute(), Chi2Metric::computeFromArrays(), SimulationResult::data(), SimDataPair::experimentalData(), SimDataPair::simulationResult(), and SimDataPair::user_weights_array().

Here is the call graph for this function:

◆ computeFromArrays() [1/2]

double Chi2Metric::computeFromArrays ( std::vector< double >  sim_data,
std::vector< double >  exp_data,
std::vector< double >  uncertainties,
std::vector< double >  weight_factors 
) const
overridevirtualinherited

Computes metric value from data arrays.

Negative values in exp_data are ignored as well as non-positive weight_factors and uncertainties. All arrays involved in the computation must be of the same size.

Parameters
sim_dataarray with simulated intensities.
exp_dataarray with intensity values obtained from an experiment.
uncertaintiesarray with experimental data uncertainties.
weight_factorsuser-defined weighting factors. Used linearly, no matter which norm is chosen.

Implements ObjectiveMetric.

Definition at line 88 of file ObjectiveMetric.cpp.

91 {
92  checkIntegrity(sim_data, exp_data, uncertainties, weight_factors);
93 
94  double result = 0.0;
95  auto norm_fun = norm();
96  for (size_t i = 0, sim_size = sim_data.size(); i < sim_size; ++i)
97  if (exp_data[i] >= 0.0 && weight_factors[i] > 0.0 && uncertainties[i] > 0.0)
98  result += norm_fun((exp_data[i] - sim_data[i]) / uncertainties[i]) * weight_factors[i];
99 
100  return std::isfinite(result) ? result : double_max;
101 }
auto norm() const
Returns a copy of the normalization function used.

Referenced by compute().

◆ computeFromArrays() [2/2]

double Chi2Metric::computeFromArrays ( std::vector< double >  sim_data,
std::vector< double >  exp_data,
std::vector< double >  weight_factors 
) const
overridevirtualinherited

Computes metric value from data arrays.

Negative values in exp_data are ignored as well as non-positive weight_factors. All arrays involved in the computation must be of the same size.

Parameters
sim_dataarray with simulated intensities.
exp_dataarray with intensity values obtained from an experiment.
weight_factorsuser-defined weighting factors. Used linearly, no matter which norm is chosen.

Implements ObjectiveMetric.

Reimplemented in RelativeDifferenceMetric, and PoissonLikeMetric.

Definition at line 103 of file ObjectiveMetric.cpp.

105 {
106  checkIntegrity(sim_data, exp_data, weight_factors);
107 
108  auto norm_fun = norm();
109  double result = 0.0;
110  for (size_t i = 0, sim_size = sim_data.size(); i < sim_size; ++i)
111  if (exp_data[i] >= 0.0 && weight_factors[i] > 0.0)
112  result += norm_fun(exp_data[i] - sim_data[i]) * weight_factors[i];
113 
114  return std::isfinite(result) ? result : double_max;
115 }

References ObjectiveMetric::norm().

Here is the call graph for this function:

◆ norm()

auto ObjectiveMetric::norm ( ) const
inlineinherited

Returns a copy of the normalization function used.

Definition at line 67 of file ObjectiveMetric.h.

67 { return m_norm; }
std::function< double(double)> m_norm

References ObjectiveMetric::m_norm.

Referenced by PoissonLikeMetric::computeFromArrays(), LogMetric::computeFromArrays(), Chi2Metric::computeFromArrays(), RelativeDifferenceMetric::computeFromArrays(), and ObjectiveMetric::setNorm().

◆ setNorm()

void ObjectiveMetric::setNorm ( std::function< double(double)>  norm)
inherited

Definition at line 74 of file ObjectiveMetric.cpp.

75 {
76  m_norm = std::move(norm);
77 }

References ObjectiveMetric::m_norm, and ObjectiveMetric::norm().

Here is the call graph for this function:

◆ transferToCPP()

virtual void ICloneable::transferToCPP ( )
inlinevirtualinherited

Used for Python overriding of clone (see swig/tweaks.py)

Definition at line 34 of file ICloneable.h.

Member Data Documentation

◆ m_norm

std::function<double(double)> ObjectiveMetric::m_norm
privateinherited

Definition at line 70 of file ObjectiveMetric.h.

Referenced by ObjectiveMetric::norm(), and ObjectiveMetric::setNorm().


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