22 const double kEps = 1.0E-9;
29 : m_datasize(0), m_fcn(func), m_parameters(parameters)
32 auto residuals =
m_fcn(parameters);
39 std::vector<double>& gradients) {
55 for (
size_t i_par = 0; i_par < pars.size(); ++i_par)
61 for (
size_t i_par = 0; i_par < pars.size(); ++i_par) {
62 std::vector<double> pars_deriv = pars;
63 pars_deriv[i_par] += kEps;
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;
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());
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());
100 unsigned int index, std::vector<double>& gradients)
106 if (!gradients.empty()) {
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.");
113 for (
size_t i_par = 0; i_par < pars.size(); ++i_par)
130 throw std::runtime_error(
"ResidualFunctionAdapter::chi2() -> Error. Normalization is 0");
132 return result / fnorm;
Defines class ResidualFunctionAdapter.
Declares class RootResidualFunction.
std::function< double(const std::vector< double > &)> scalar_function_t
std::function< double(const std::vector< double > &, unsigned int, std::vector< double > &)> gradient_function_t
std::function< std::vector< double >(const mumufit::Parameters &)> fcn_residual_t
Minimizer function with access to single data element residuals, required by Fumili2 and GSLMultiMin ...
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()
std::vector< std::vector< double > > m_gradients
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::unique_ptr< RootResidualFunction > m_root_objective
void calculate_gradients(const std::vector< double > &pars)
size_t m_datasize
Length of vector with residuals, should stay the same during minimization.
std::vector< double > m_residuals
double chi2(const std::vector< double > &pars)
Evaluate chi2.
ResidualFunctionAdapter(fcn_residual_t func, const Parameters ¶meters)
fcn_residual_t m_fcn
user function to minimize
The multi-library, multi-algorithm fit wrapper library.