BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
mumufit::ResidualFunctionAdapter Class Reference

Provides RootResidualFunction which will be minimizer by ROOT. More...

Inheritance diagram for mumufit::ResidualFunctionAdapter:
[legend]
Collaboration diagram for mumufit::ResidualFunctionAdapter:
[legend]

Public Member Functions

 ResidualFunctionAdapter (fcn_residual_t func, const Parameters &parameters)
 
int numberOfCalls () const
 
int numberOfGradientCalls () const
 
const RootResidualFunctionrootResidualFunction ()
 

Protected Attributes

int m_number_of_calls
 
int m_number_of_gradient_calls
 

Private Member Functions

void calculate_gradients (const std::vector< double > &pars)
 
double chi2 (const std::vector< double > &pars)
 Evaluate chi2. More...
 
double element_residual (const std::vector< double > &pars, unsigned int index, std::vector< double > &gradients)
 evaluate method for gradients and residuals called directly from the minimizer More...
 
std::vector< double > get_residuals (const std::vector< double > &pars)
 

Private Attributes

size_t m_datasize
 Length of vector with residuals, should stay the same during minimization. More...
 
fcn_residual_t m_fcn
 user function to minimize More...
 
std::vector< std::vector< double > > m_gradients
 
Parameters m_parameters
 
std::vector< double > m_residuals
 
std::unique_ptr< RootResidualFunctionm_root_objective
 

Detailed Description

Provides RootResidualFunction which will be minimizer by ROOT.

Converts ROOT calls to the call of fcn_residual_t.

Definition at line 37 of file ResidualFunctionAdapter.h.

Constructor & Destructor Documentation

◆ ResidualFunctionAdapter()

ResidualFunctionAdapter::ResidualFunctionAdapter ( fcn_residual_t  func,
const Parameters parameters 
)

Definition at line 27 of file ResidualFunctionAdapter.cpp.

29  : m_datasize(0), m_fcn(func), m_parameters(parameters)
30 {
31  // single call of user function to get dataset size
32  auto residuals = m_fcn(parameters);
33  m_datasize = residuals.size();
34 }
size_t m_datasize
Length of vector with residuals, should stay the same during minimization.
fcn_residual_t m_fcn
user function to minimize

References m_datasize, and m_fcn.

Member Function Documentation

◆ calculate_gradients()

void ResidualFunctionAdapter::calculate_gradients ( const std::vector< double > &  pars)
private

Definition at line 51 of file ResidualFunctionAdapter.cpp.

52 {
53  m_gradients.clear();
54  m_gradients.resize(pars.size());
55  for (size_t i_par = 0; i_par < pars.size(); ++i_par)
56  m_gradients[i_par].resize(m_datasize, 0.0);
57 
58  auto residuals = get_residuals(pars);
60 
61  for (size_t i_par = 0; i_par < pars.size(); ++i_par) {
62  std::vector<double> pars_deriv = pars; // values of parameters for derivative calculation
63  pars_deriv[i_par] += kEps;
64 
65  auto residuals2 = get_residuals(pars_deriv);
66 
67  for (size_t i_data = 0; i_data < m_datasize; ++i_data)
68  m_gradients[i_par][i_data] = (residuals2[i_data] - residuals[i_data]) / kEps;
69  }
70 }
std::vector< std::vector< double > > m_gradients
std::vector< double > get_residuals(const std::vector< double > &pars)

References get_residuals(), m_datasize, m_gradients, and mumufit::IFunctionAdapter::m_number_of_gradient_calls.

Referenced by element_residual().

Here is the call graph for this function:

◆ chi2()

double ResidualFunctionAdapter::chi2 ( const std::vector< double > &  pars)
private

Evaluate chi2.

Definition at line 120 of file ResidualFunctionAdapter.cpp.

121 {
123 
124  double result(0.0);
125  for (auto x : get_residuals(pars))
126  result += x * x;
127 
128  int fnorm = static_cast<int>(m_datasize) - static_cast<int>(m_parameters.freeParameterCount());
129  if (fnorm <= 0)
130  throw std::runtime_error("ResidualFunctionAdapter::chi2() -> Error. Normalization is 0");
131 
132  return result / fnorm;
133 }
size_t freeParameterCount() const
Returns number of free parameters.
Definition: Parameters.cpp:132

References mumufit::Parameters::freeParameterCount(), get_residuals(), m_datasize, mumufit::IFunctionAdapter::m_number_of_calls, and m_parameters.

Referenced by rootResidualFunction().

Here is the call graph for this function:

◆ element_residual()

double ResidualFunctionAdapter::element_residual ( const std::vector< double > &  pars,
unsigned int  index,
std::vector< double > &  gradients 
)
private

evaluate method for gradients and residuals called directly from the minimizer

Returns residual for given data element index.

If gradients vector size is not empty, also calculates gradients. Actuall calculation is done for all data elements when index==0. If index!=0 - cached value of residuals/gradients will be used.

Definition at line 99 of file ResidualFunctionAdapter.cpp.

101 {
102  if (index == 0) {
103  m_residuals = get_residuals(pars);
104  }
105 
106  if (!gradients.empty()) {
107  // Non zero size means that minimizer wants to know gradients.
108  if (pars.size() != gradients.size())
109  throw std::runtime_error("ResidualFunctionAdapter::element_residual() -> Error. "
110  "Number of gradients doesn't match number of fit parameters.");
111  if (index == 0)
112  calculate_gradients(pars);
113  for (size_t i_par = 0; i_par < pars.size(); ++i_par)
114  gradients[i_par] = m_gradients[i_par][index];
115  }
116 
117  return m_residuals[index];
118 }
void calculate_gradients(const std::vector< double > &pars)

References calculate_gradients(), get_residuals(), m_gradients, and m_residuals.

Referenced by rootResidualFunction().

Here is the call graph for this function:

◆ get_residuals()

std::vector< double > ResidualFunctionAdapter::get_residuals ( const std::vector< double > &  pars)
private

Definition at line 72 of file ResidualFunctionAdapter.cpp.

73 {
74  if (pars.size() != m_parameters.size()) {
75  std::ostringstream ostr;
76  ostr << "ResidualFunctionAdapter::residuals() -> Error. Number of fit parameters "
77  << "has changed in the course of minimization. Initially was " << m_parameters.size()
78  << " become " << pars.size() << "\n";
79  throw std::runtime_error(ostr.str());
80  }
81 
82  m_parameters.setValues(pars);
83  auto result = m_fcn(m_parameters);
84 
85  if (result.size() != m_datasize) {
86  std::ostringstream ostr;
87  ostr << "ResidualFunctionAdapter::residuals() -> Error. Size of data "
88  << "has changed in the course of minimization. Initial length " << m_datasize
89  << " new length " << result.size() << "\n";
90  throw std::runtime_error(ostr.str());
91  }
92  return result;
93 }
void setValues(const std::vector< double > &values)
Definition: Parameters.cpp:64
size_t size() const
Definition: Parameters.cpp:51

References m_datasize, m_fcn, m_parameters, mumufit::Parameters::setValues(), and mumufit::Parameters::size().

Referenced by calculate_gradients(), chi2(), and element_residual().

Here is the call graph for this function:

◆ numberOfCalls()

int IFunctionAdapter::numberOfCalls ( ) const
inherited

Definition at line 23 of file IFunctionAdapter.cpp.

24 {
25  return m_number_of_calls;
26 }

References mumufit::IFunctionAdapter::m_number_of_calls.

◆ numberOfGradientCalls()

int IFunctionAdapter::numberOfGradientCalls ( ) const
inherited

Definition at line 28 of file IFunctionAdapter.cpp.

29 {
31 }

References mumufit::IFunctionAdapter::m_number_of_gradient_calls.

◆ rootResidualFunction()

const RootResidualFunction * ResidualFunctionAdapter::rootResidualFunction ( )

Definition at line 36 of file ResidualFunctionAdapter.cpp.

37 {
38  gradient_function_t gradient_fun = [&](const std::vector<double>& pars, unsigned int index,
39  std::vector<double>& gradients) {
40  return element_residual(pars, index, gradients);
41  };
42 
43  scalar_function_t objective_fun = [&](const std::vector<double>& pars) { return chi2(pars); };
44 
45  m_root_objective.reset(
46  new RootResidualFunction(objective_fun, gradient_fun, m_parameters.size(), m_datasize));
47 
48  return m_root_objective.get();
49 }
std::function< double(const std::vector< double > &)> scalar_function_t
Definition: Types.h:30
std::function< double(const std::vector< double > &, unsigned int, std::vector< double > &)> gradient_function_t
Definition: Types.h:33
Minimizer function with access to single data element residuals, required by Fumili2 and GSLMultiMin ...
double element_residual(const std::vector< double > &pars, unsigned int index, std::vector< double > &gradients)
evaluate method for gradients and residuals called directly from the minimizer
std::unique_ptr< RootResidualFunction > m_root_objective
double chi2(const std::vector< double > &pars)
Evaluate chi2.

References chi2(), element_residual(), m_datasize, m_parameters, m_root_objective, and mumufit::Parameters::size().

Here is the call graph for this function:

Member Data Documentation

◆ m_datasize

size_t mumufit::ResidualFunctionAdapter::m_datasize
private

Length of vector with residuals, should stay the same during minimization.

Definition at line 54 of file ResidualFunctionAdapter.h.

Referenced by ResidualFunctionAdapter(), calculate_gradients(), chi2(), get_residuals(), and rootResidualFunction().

◆ m_fcn

fcn_residual_t mumufit::ResidualFunctionAdapter::m_fcn
private

user function to minimize

Definition at line 55 of file ResidualFunctionAdapter.h.

Referenced by ResidualFunctionAdapter(), and get_residuals().

◆ m_gradients

std::vector<std::vector<double> > mumufit::ResidualFunctionAdapter::m_gradients
private

Definition at line 58 of file ResidualFunctionAdapter.h.

Referenced by calculate_gradients(), and element_residual().

◆ m_number_of_calls

int mumufit::IFunctionAdapter::m_number_of_calls
protectedinherited

◆ m_number_of_gradient_calls

int mumufit::IFunctionAdapter::m_number_of_gradient_calls
protectedinherited

◆ m_parameters

Parameters mumufit::ResidualFunctionAdapter::m_parameters
private

Definition at line 56 of file ResidualFunctionAdapter.h.

Referenced by chi2(), get_residuals(), and rootResidualFunction().

◆ m_residuals

std::vector<double> mumufit::ResidualFunctionAdapter::m_residuals
private

Definition at line 57 of file ResidualFunctionAdapter.h.

Referenced by element_residual().

◆ m_root_objective

std::unique_ptr<RootResidualFunction> mumufit::ResidualFunctionAdapter::m_root_objective
private

Definition at line 59 of file ResidualFunctionAdapter.h.

Referenced by rootResidualFunction().


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