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.