23 const double kEps = 1.0E-9;
30 : m_datasize(0), m_fcn(func), m_parameters(parameters)
33 auto residuals =
m_fcn(parameters);
40 std::vector<double>& gradients) {
56 for (
size_t i_par = 0; i_par < pars.size(); ++i_par)
62 for (
size_t i_par = 0; i_par < pars.size(); ++i_par) {
63 std::vector<double> pars_deriv = pars;
64 pars_deriv[i_par] +=
kEps;
68 for (
size_t i_data = 0; i_data <
m_datasize; ++i_data)
69 m_gradients[i_par][i_data] = (residuals2[i_data] - residuals[i_data]) /
kEps;
76 std::ostringstream ostr;
77 ostr <<
"ResidualFunctionAdapter::residuals() -> Error. Number of fit parameters "
78 <<
"has changed in the course of minimization. Initially was " <<
m_parameters.
size()
79 <<
" become " << pars.size() <<
"\n";
80 throw std::runtime_error(ostr.str());
87 std::ostringstream ostr;
88 ostr <<
"ResidualFunctionAdapter::residuals() -> Error. Size of data "
89 <<
"has changed in the course of minimization. Initial length " <<
m_datasize
90 <<
" new length " << result.size() <<
"\n";
91 throw std::runtime_error(ostr.str());
101 unsigned int index, std::vector<double>& gradients)
107 if (!gradients.empty()) {
109 if (pars.size() != gradients.size())
110 throw std::runtime_error(
"ResidualFunctionAdapter::element_residual() -> Error. "
111 "Number of gradients doesn't match number of fit parameters.");
114 for (
size_t i_par = 0; i_par < pars.size(); ++i_par)
131 throw std::runtime_error(
"ResidualFunctionAdapter::chi2() -> Error. Normalization is 0");
133 return result / fnorm;
std::function< double(const std::vector< double > &)> scalar_function_t
std::function< std::vector< double >(const Fit::Parameters &)> fcn_residual_t
std::function< double(const std::vector< double > &, unsigned int, std::vector< double > &)> gradient_function_t
Defines class ResidualFunctionAdapter.
Declares class RootResidualFunction.
int m_number_of_gradient_calls
A collection of fit parameters.
void setValues(const std::vector< double > &values)
size_t freeParameterCount() const
Returns number of free parameters.
const RootResidualFunction * rootResidualFunction()
fcn_residual_t m_fcn
user function to minimize
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::vector< double > get_residuals(const std::vector< double > &pars)
std::vector< std::vector< double > > m_gradients
void calculate_gradients(const std::vector< double > &pars)
double chi2(const std::vector< double > &pars)
Evaluate chi2.
ResidualFunctionAdapter(fcn_residual_t func, const Parameters ¶meters)
size_t m_datasize
Length of vector with residuals, should stay the same during minimization.
std::unique_ptr< RootResidualFunction > m_root_objective
std::vector< double > m_residuals
Minimizer function with access to single data element residuals, required by Fumili2 and GSLMultiMin ...
Objective function types.