25 const double kEps = 1.0E-9;
34 , m_fcn(std::move(func))
35 , m_parameters(parameters)
38 auto residuals =
m_fcn(parameters);
45 std::vector<double>& gradients) {
51 m_root_objective = std::make_unique<RootResidualFunction>(objective_fun, gradient_fun,
61 for (
size_t i_par = 0; i_par < pars.size(); ++i_par)
67 for (
size_t i_par = 0; i_par < pars.size(); ++i_par) {
68 std::vector<double> pars_deriv = pars;
69 pars_deriv[i_par] += kEps;
73 for (
size_t i_data = 0; i_data <
m_datasize; ++i_data)
74 m_gradients[i_par][i_data] = (residuals2[i_data] - residuals[i_data]) / kEps;
81 std::ostringstream ostr;
82 ostr <<
"ResidualFunctionAdapter::residuals() -> Error. Number of fit parameters "
83 <<
"has changed in the course of minimization. Initially was " <<
m_parameters.
size()
84 <<
" become " << pars.size() <<
"\n";
85 throw std::runtime_error(ostr.str());
92 std::ostringstream ostr;
93 ostr <<
"ResidualFunctionAdapter::residuals() -> Error. Size of data "
94 <<
"has changed in the course of minimization. Initial length " <<
m_datasize
95 <<
" new length " << result.size() <<
"\n";
96 throw std::runtime_error(ostr.str());
106 unsigned int index, std::vector<double>& gradients)
111 if (!gradients.empty()) {
113 if (pars.size() != gradients.size())
114 throw std::runtime_error(
"ResidualFunctionAdapter::element_residual() -> Error. "
115 "Number of gradients doesn't match number of fit parameters.");
118 for (
size_t i_par = 0; i_par < pars.size(); ++i_par)
135 throw std::runtime_error(
"ResidualFunctionAdapter::chi2() -> Error. Normalization is 0");
137 return result / fnorm;
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
Defines class ResidualFunctionAdapter.
Declares class RootResidualFunction.
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.