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

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.

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. Calls computeFromArrays internally. More...
 
double computeFromArrays (std::vector< double > sim_data, std::vector< double > exp_data, std::vector< double > exp_stdv, std::vector< double > weight_factors) const override
 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. 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. 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. 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
 

Constructor & Destructor Documentation

◆ RQ4Metric()

RQ4Metric::RQ4Metric ( )

Definition at line 240 of file ObjectiveMetric.cpp.

241  : Chi2Metric()
242 {
243 }

Member Function Documentation

◆ clone()

RQ4Metric * RQ4Metric::clone ( ) const
overridevirtual

Reimplemented from Chi2Metric.

Definition at line 245 of file ObjectiveMetric.cpp.

246 {
247  return copyMetric(*this);
248 }

◆ 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 250 of file ObjectiveMetric.cpp.

251 {
252  if (use_weights)
253  return Chi2Metric::compute(data_pair, use_weights);
254 
255  // fetching data in RQ4 form
256  const std::vector<double> sim_vec = data_pair.simulationResult().flatVector(Coords::RQ4);
257  const std::vector<double> exp_vec = data_pair.experimentalData().flatVector(Coords::RQ4);
258 
259  return computeFromArrays(sim_vec, exp_vec, data_pair.user_weights_array());
260 }
double computeFromArrays(std::vector< double > sim_data, std::vector< double > exp_data, std::vector< double > exp_stdv, std::vector< double > weight_factors) const override
Computes metric value from data arrays. Negative values in exp_data are ignored as well as non-positi...
virtual double compute(const SimDataPair &data_pair, bool use_weights) const
Computes metric value from SimDataPair object. Calls computeFromArrays internally.
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.
std::vector< double > flatVector(Coords units=Coords::UNDEFINED) const

References ObjectiveMetric::compute(), Chi2Metric::computeFromArrays(), SimDataPair::experimentalData(), SimulationResult::flatVector(), RQ4, 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 >  exp_stdv,
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.
exp_stdvarray with experimental data uncertainties.
weight_factorsuser-defined weighting factors. Used linearly, no matter which norm is chosen.

Implements ObjectiveMetric.

Definition at line 96 of file ObjectiveMetric.cpp.

99 {
100  checkIntegrity(sim_data, exp_data, exp_stdv, weight_factors);
101 
102  double result = 0.0;
103  auto norm_fun = norm();
104  for (size_t i = 0, sim_size = sim_data.size(); i < sim_size; ++i)
105  if (exp_data[i] >= 0.0 && weight_factors[i] > 0.0 && exp_stdv[i] > 0.0)
106  result += norm_fun((exp_data[i] - sim_data[i]) / exp_stdv[i]) * weight_factors[i];
107 
108  return std::isfinite(result) ? result : double_max;
109 }
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 meanRelativeDifferenceMetric, and PoissonLikeMetric.

Definition at line 111 of file ObjectiveMetric.cpp.

113 {
114  checkIntegrity(sim_data, exp_data, weight_factors);
115 
116  auto norm_fun = norm();
117  double result = 0.0;
118  for (size_t i = 0, sim_size = sim_data.size(); i < sim_size; ++i)
119  if (exp_data[i] >= 0.0 && weight_factors[i] > 0.0)
120  result += norm_fun(exp_data[i] - sim_data[i]) * weight_factors[i];
121 
122  return std::isfinite(result) ? result : double_max;
123 }

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 LogMetric::computeFromArrays(), Chi2Metric::computeFromArrays(), PoissonLikeMetric::computeFromArrays(), meanRelativeDifferenceMetric::computeFromArrays(), and ObjectiveMetric::setNorm().

◆ setNorm()

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

Definition at line 79 of file ObjectiveMetric.cpp.

80 {
81  m_norm = std::move(norm);
82 }

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 32 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: