70 double edm = seed.
State().Edm();
75 print.
Warn(
"No free parameters.");
80 print.
Error(
"Minimum seed invalid.");
85 print.
Error(
"Initial matrix not pos.def.");
91 std::vector<MinimumState>
result;
95 print.
Info(
"Start iterating until Edm is <",
edmval,
"with call limit =",
maxfcn);
111 print.
Debug(
ipass > 0 ?
"Continue" :
"Start",
"iterating...");
116 if (min.HasReachedCallLimit()) {
117 print.
Warn(
"FunctionMinimum is invalid, reached function call limit");
123 if (!min.IsValid()) {
124 print.
Warn(
"FunctionMinimum is invalid after second try");
130 edm =
result.back().Edm();
133 if ((
strategy.Strategy() >= 2) || (
strategy.Strategy() == 1 && min.Error().Dcovar() > 0.05)) {
135 print.
Debug(
"MnMigrad will verify convergence and Error matrix; dcov =", min.Error().Dcovar());
138 strat.SetHessianForcePosDef(1);
141 print.
Info(
"After Hessian");
146 print.
Warn(
"Invalid Hessian - exit the minimization");
161 print.
Info(
"Tolerance not sufficient, continue minimization; "
165 print.
Warn(
"Reached machine accuracy limit; Edm", edm,
"is smaller than machine limit",
machineLimit,
166 "while",
edmval,
"was requested");
188 print.
Warn(
"No convergence; Edm", edm,
"is above tolerance", 10 *
edmval);
189 }
else if (
latest.Error().HasReachedCallLimit()) {
192 }
else if (
latest.Error().IsAvailable()) {
194 if (min.IsAboveMaxEdm())
195 print.
Info(
"Edm has been re-computed after Hesse; Edm", edm,
"is now within tolerance");
199 print.
Debug(
"Minimum found", min);
240 step = -1. *
s0.Error().InvHessian() *
s0.Gradient().Vec();
242 print.
Debug(
"Iteration",
result.size(),
"Fval",
s0.Fval(),
"numOfCall",
fcn.NumOfCalls(),
243 "\n Internal parameters",
s0.Vec(),
"\n Newton step", step);
247 print.
Debug(
"all derivatives are zero - return current status");
255 print.
Warn(
"Matrix not pos.def, gdel =",
gdel,
"> 0");
259 step = -1. *
s0.Error().InvHessian() *
s0.Gradient().Vec();
278 if (std::fabs(pp.Y() -
s0.Fval()) <= std::fabs(
s0.Fval()) *
prec.Eps()) {
280 print.
Warn(
"No improvement in line search");
293 print.
Debug(
"Result after line search :",
"\n x =", pp.X(),
"\n Old Fval =",
s0.Fval(),
294 "\n New Fval =", pp.Y(),
"\n NFcalls =",
fcn.NumOfCalls());
302 if (std::isnan(edm)) {
303 print.
Warn(
"Edm is NaN; stop iterations");
309 print.
Warn(
"Matrix not pos.def., try to make pos.def.");
315 print.
Warn(
"Matrix still not pos.def.; stop iterations");
325 print.
Debug(
"Updated new point:",
"\n Parameter:",
p.Vec(),
"\n Gradient:",
g.Vec(),
326 "\n InvHessian:",
e.Matrix(),
"\n Edm:", edm);
337 edm *= (1. + 3. *
e.Dcovar());
339 print.
Debug(
"Dcovar =",
e.Dcovar(),
"\tCorrected edm =", edm);
347 if (!
result.back().IsValid())
351 print.
Warn(
"Call limit exceeded");
357 print.
Info(
"Edm is close to limit - return current minimum");
359 }
else if (edm < std::fabs(
prec.Eps2() *
result.back().Fval())) {
360 print.
Warn(
"Edm is limited by Machine accuracy - return current minimum");
363 print.
Warn(
"Iterations finish without convergence; Edm", edm,
"Requested",
edmval);
370 print.
Debug(
"Exiting successfully;",
"Ncalls",
fcn.NumOfCalls(),
"FCN",
result.back().Fval(),
"Edm", edm,
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void gc
class holding the full result of the minimization; both internal and external (MnUserParameterState) ...
interface class for gradient calculators
void TraceIteration(int iter, const MinimumState &state) const
MinimumError keeps the inv.
const MinimumParameters & Parameters() const
const MnMachinePrecision & Precision() const
const MinimumState & State() const
MinimumState keeps the information (position, Gradient, 2nd deriv, etc) after one minimization step (...
Wrapper class to FCNBase interface used internally by Minuit.
API class for calculating the numerical covariance matrix (== 2x Inverse Hessian == 2x Inverse 2nd de...
Implements a 1-dimensional minimization along a given direction (i.e.
Sets the relative floating point (double) arithmetic precision.
Force the covariance matrix to be positive defined by adding extra terms in the diagonal.
void Debug(const Ts &... args)
void Error(const Ts &... args)
void Info(const Ts &... args)
void Warn(const Ts &... args)
API class for defining four levels of strategies: low (0), medium (1), high (2), very high (>=3); act...
void AddResult(std::vector< MinimumState > &result, const MinimumState &state) const
FunctionMinimum Minimum(const MnFcn &, const GradientCalculator &, const MinimumSeed &, const MnStrategy &, unsigned int, double) const override
const VariableMetricEDMEstimator & Estimator() const
const MinimumErrorUpdator & ErrorUpdator() const
int iterate(rng_state_t *X)
double inner_product(const LAVector &, const LAVector &)
Namespace for new ROOT classes and functions.