46 result.push_back(state);
53 MnPrint::PrintState(std::cout, result.back(),
"VariableMetric: Iteration # ",result.size()-1);
73 std::cout<<
"VariableMetricBuilder convergence when edm < "<<edmval<<std::endl;
88 MN_INFO_MSG(
"VariableMetricBuilder: initial matrix not pos.def.");
94 std::vector<MinimumState>
result;
103 std::cout <<
"VariableMetric: start iterating until Edm is < " << edmval << std::endl;
111 int maxfcn_eff = maxfcn;
120 std::cout <<
"start iterating... " << std::endl;
121 if (ipass > 0) std::cout <<
"continue iterating... " << std::endl;
124 min =
Minimum(fcn, gc, seed, result, maxfcn_eff, edmval);
127 if (
min.HasReachedCallLimit() ) {
129 MN_INFO_MSG(
"VariableMetricBuilder: FunctionMinimum is invalid, reached the function call limit");
138 MN_INFO_MSG(
"VariableMetricBuilder: FunctionMinimum is invalid after second try");
145 edm = result.back().Edm();
149 (strategy.
Strategy() == 1 &&
min.Error().Dcovar() > 0.05) ) {
152 std::cout<<
"MnMigrad will verify convergence and Error matrix. "<< std::endl;
153 std::cout<<
"dcov is = "<<
min.Error().Dcovar() << std::endl;
158 if (printLevel > 1) {
166 std::cout <<
"edm after Hesse calculation " << edm <<
" requested " << edmval << std::endl;
171 if (edm >= machineLimit) {
174 MN_INFO_MSG(
"VariableMetricBuilder: Tolerance is not sufficient, continue the minimization");
181 MN_INFO_MSG(
"VariableMetricBuilder: Stop the minimization - reached machine accuracy limit");
182 MN_INFO_VAL2(
"Edm is smaller than machine accuracy",machineLimit);
198 if (ipass == 0) maxfcn_eff = int(maxfcn*1.3);
205 if (edm > 10*edmval) {
208 MN_INFO_VAL2(
"VariableMetricBuilder: INVALID function minimum - edm is above tolerance,",edm);
209 MN_INFO_VAL2(
"VariableMetricBuilder: Required tolerance is 10 x edmval ",edmval);
215 if (
min.IsAboveMaxEdm() ) {
216 MN_INFO_MSG(
"VariableMetricBuilder: Edm has been re-computed after Hesse");
217 MN_INFO_VAL2(
"new value is now smaller than the required tolerance,",edm);
220 min.Add( result.back() );
224 std::cout <<
"Obtained function minimum " <<
min << std::endl;
246 double edm = initialState.
Edm();
250 std::cout <<
"\n\nDEBUG Variable Metric Builder \nInitial State: "
251 <<
" Parameter " << initialState.
Vec()
254 <<
" edm = " << initialState.
Edm() << std::endl;
273 step = -1.*s0.Error().InvHessian()*s0.Gradient().Vec();
276 std::cout <<
"\n\n---> Iteration - " << result.size()
277 <<
"\nFval = " << s0.Fval() <<
" numOfCall = " << fcn.
NumOfCalls()
278 <<
"\nInternal Parameter values " << s0.Vec()
279 <<
" Newton step " << step << std::endl;
283 if (
inner_product(s0.Gradient().Vec(),s0.Gradient().Vec() ) <= 0 ) {
285 std::cout <<
"VariableMetricBuilder: all derivatives are zero - return current status" << std::endl;
294 std::cout <<
" gdel = " << gdel << std::endl;
300 MN_INFO_MSG(
"VariableMetricBuilder: matrix not pos.def, gdel > 0");
323 if(
fabs(pp.
Y() - s0.Fval()) <=
fabs(s0.Fval())*prec.
Eps() ) {
325 MN_INFO_MSG(
"VariableMetricBuilder: no improvement in line search");
329 if (result.size() <= 1 )
341 std::cout <<
"Result after line search : \nx = " << pp.
X()
342 <<
"\nOld Fval = " << s0.Fval()
343 <<
"\nNew Fval = " << pp.
Y()
344 <<
"\nNFcalls = " << fcn.
NumOfCalls() << std::endl;
358 MN_INFO_MSG(
"VariableMetricBuilder: matrix not pos.def. : edm is < 0. Make pos def...");
365 MN_INFO_MSG(
"VariableMetricBuilder: matrix still not pos.def. : exit iterations ");
375 std::cout <<
"Updated new point: \n "
376 <<
" Parameter " << p.Vec()
377 <<
" Gradient " << g.Vec()
378 <<
" InvHessian " << e.
Matrix()
380 <<
" edm = " << edm << std::endl << std::endl;
392 edm *= (1. + 3.*e.
Dcovar());
395 std::cout <<
"Dcovar = " << e.
Dcovar() <<
"\tCorrected edm = " << edm << std::endl;
400 }
while(edm > edmval && fcn.
NumOfCalls() < maxfcn);
403 if ( ! result.back().IsValid() )
409 MN_INFO_MSG(
"VariableMetricBuilder: call limit exceeded.");
415 if(edm <
fabs(prec.
Eps2()*result.back().Fval())) {
417 MN_INFO_MSG(
"VariableMetricBuilder: machine accuracy limits further improvement.");
420 }
else if(edm < 10*edmval) {
424 MN_INFO_MSG(
"VariableMetricBuilder: iterations finish without convergence.");
434 std::cout <<
"Exiting successfully Variable Metric Builder \n"
436 <<
"\nFval = " << result.back().Fval()
437 <<
"\nedm = " << edm <<
" requested = " << edmval << std::endl;
#define MN_INFO_VAL2(loc, x)
static Vc_ALWAYS_INLINE int_v min(const int_v &x, const int_v &y)
void fcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag)
const MinimumParameters & Parameters() const
const MnMachinePrecision & Precision() const
Force the covariance matrix to be positive defined by adding extra terms in the diagonal.
unsigned int size() const
MinimumSeed contains the starting values for the minimization produced by the SeedGenerator.
double X() const
Accessor to the x (first) coordinate.
double inner_product(const LAVector &, const LAVector &)
const MinimumState & State() const
determines the relative floating point arithmetic precision.
const FunctionGradient & Gradient() const
const MinimumError & Error() const
double Y() const
Accessor to the y (second) coordinate.
class holding the full result of the minimization; both internal and external (MnUserParameterState) ...
const MnAlgebraicVector & Vec() const
API class for calculating the numerical covariance matrix (== 2x Inverse Hessian == 2x Inverse 2nd de...
static void PrintState(std::ostream &os, const MinimumState &state, const char *msg, int iter=-1)
Wrapper class to FCNBase interface used internally by Minuit.
const MnAlgebraicVector & Vec() const
VecExpr< UnaryOp< Fabs< T >, VecExpr< A, T, D >, T >, T, D > fabs(const VecExpr< A, T, D > &rhs)
MnAlgebraicSymMatrix Hessian() const
double Eps2() const
eps2 returns 2*sqrt(eps)
double Estimate(const FunctionGradient &, const MinimumError &) const
void AddResult(std::vector< MinimumState > &result, const MinimumState &state) const
virtual MinimumError Update(const MinimumState &, const MinimumParameters &, const FunctionGradient &) const
unsigned int Strategy() const
MnAlgebraicSymMatrix Matrix() const
const MnAlgebraicSymMatrix & InvHessian() const
virtual FunctionMinimum Minimum(const MnFcn &, const GradientCalculator &, const MinimumSeed &, const MnStrategy &, unsigned int, double) const
double Eps() const
eps returns the smallest possible number so that 1.+eps > 1.
const MnAlgebraicVector & Grad() const
void TraceIteration(int iter, const MinimumState &state) const
MinimumError keeps the inv.
const VariableMetricEDMEstimator & Estimator() const
unsigned int NumOfCalls() const
int iterate(rng_state_t *X)
MinimumState keeps the information (position, Gradient, 2nd deriv, etc) after one minimization step (...
const MnAlgebraicVector & Vec() const
API class for defining three levels of strategies: low (0), medium (1), high (>=2); acts on: Migrad (...
Implements a 1-dimensional minimization along a given direction (i.e.
const DavidonErrorUpdator & ErrorUpdator() const
interface class for gradient calculators