45 double error_level,
bool always_exactly_mimic_minuit2)
59 std::span<const ROOT::Fit::ParameterSettings> parameters)
61 assert(function !=
nullptr &&
"function is a nullptr");
66 std::copy(cx, cx + nDim,
fVx.data());
69 for (
unsigned i = 0; i < nDim; i++) {
83 std::span<const ROOT::Fit::ParameterSettings> parameters,
92 std::span<const ROOT::Fit::ParameterSettings> parameters,
97 double xtf =
fVx[i_component];
101 for (
unsigned int j = 0; j <
fNCycles; ++j) {
103 double step = std::max(optstp, std::abs(0.1 * deriv.
step_size));
105 if (parameters[i_component].IsBound()) {
110 double stpmax = 10. * std::abs(deriv.
step_size);
122 fVx[i_component] = xtf + step;
126 fVx[i_component] = xtf - step;
130 fVx[i_component] = xtf;
146 std::span<const ROOT::Fit::ParameterSettings> parameters,
152std::vector<DerivatorElement>
154 std::span<const ROOT::Fit::ParameterSettings> parameters,
155 std::span<const DerivatorElement> previous_gradient)
159 std::vector<DerivatorElement> gradient;
160 gradient.reserve(nDim);
162 for (
unsigned int ix = 0; ix < nDim; ++ix) {
225 std::vector<DerivatorElement> &gradient)
233 for (
auto parameter = parameters.begin(); parameter != parameters.end(); ++parameter, ++ix) {
235 double werr = parameter->StepSize();
239 double extParVal = parameter->Value();
242 double var =
Ext2int(*parameter, extParVal);
246 extParVal =
Int2ext(*parameter, var);
249 double extParVal2 = extParVal + werr;
251 if (parameter->HasUpperLimit() && extParVal2 > parameter->UpperLimit()) {
252 extParVal2 = parameter->UpperLimit();
255 double var2 =
Ext2int(*parameter, extParVal2);
256 double vplu = var2 - var;
258 extParVal2 = extParVal - werr;
260 if (parameter->HasLowerLimit() && extParVal2 < parameter->LowerLimit()) {
261 extParVal2 = parameter->LowerLimit();
264 var2 =
Ext2int(*parameter, extParVal2);
265 double vmin = var2 - var;
266 double gsmin = 8. * eps2 * (std::abs(var) + eps2);
268 double dirin = std::max(0.5 * (std::abs(vplu) + std::abs(vmin)), gsmin);
269 double g2 = 2.0 *
fUp / (dirin * dirin);
270 double gstep = std::max(gsmin, 0.1 * dirin);
271 double grd = g2 * dirin;
273 if (parameter->IsBound()) {
274 gstep = std::min(gstep, 0.5);
277 gradient[ix].derivative = grd;
278 gradient[ix].second_derivative = g2;
279 gradient[ix].step_size = gstep;
286 <<
", step_size: " << value.
step_size <<
")";
Class, describing value, limits and step size of the parameters Provides functionality also to set/re...
bool HasUpperLimit() const
check if parameter has upper limit
double LowerLimit() const
return lower limit value
bool HasLowerLimit() const
check if parameter has lower limit
double UpperLimit() const
return upper limit value
bool IsDoubleBound() const
check if is double bound (upper AND lower limit)
bool IsBound() const
check if is bound
Interface (abstract class) defining the function to be minimized, which has to be implemented by the ...
std::vector< double > fVxFValCache
bool fAlwaysExactlyMimicMinuit2
void SetInitialGradient(std::span< const ROOT::Fit::ParameterSettings > parameters, std::vector< DerivatorElement > &gradient)
This function was not implemented as in Minuit2.
double Int2ext(const ROOT::Fit::ParameterSettings ¶meter, double val) const
ROOT::Minuit2::SqrtUpParameterTransformation fUpperLimTrafo
ROOT::Minuit2::MnMachinePrecision fPrecision
NumericalDerivator(bool always_exactly_mimic_minuit2=true)
void SetupDifferentiate(unsigned int nDim, const FCNBase *function, const double *cx, std::span< const ROOT::Fit::ParameterSettings > parameters)
This function sets internal state based on input parameters.
double DInt2Ext(const ROOT::Fit::ParameterSettings ¶meter, double val) const
double Ext2int(const ROOT::Fit::ParameterSettings ¶meter, double val) const
DerivatorElement operator()(unsigned int nDim, const FCNBase *function, const double *x, std::span< const ROOT::Fit::ParameterSettings > parameters, unsigned int i_component, const DerivatorElement &previous)
std::vector< double > fVx
std::vector< DerivatorElement > Differentiate(unsigned int nDim, const FCNBase *function, const double *x, std::span< const ROOT::Fit::ParameterSettings > parameters, std::span< const DerivatorElement > previous_gradient)
ROOT::Minuit2::SinParameterTransformation fDoubleLimTrafo
DerivatorElement FastPartialDerivative(const FCNBase *function, std::span< const ROOT::Fit::ParameterSettings > parameters, unsigned int i_component, const DerivatorElement &previous)
ROOT::Minuit2::SqrtLowParameterTransformation fLowerLimTrafo
DerivatorElement PartialDerivative(unsigned int nDim, const FCNBase *function, const double *x, std::span< const ROOT::Fit::ParameterSettings > parameters, unsigned int i_component, DerivatorElement previous)
std::vector< double > fVxExternal
std::ostream & operator<<(std::ostream &, const LAVector &)