36 MnPrint print(
"NegativeG2LineSearch");
45 print.
Info(
"Doing a NegativeG2LineSearch since one of the G2 component is negative");
51 unsigned int iter = 0;
57 print.
Error(
"Input gradient to NG2LS must have G2 already computed");
63 for (
unsigned int i = 0; i <
n; i++) {
65 if (dgrad.
G2()(i) <= 0) {
69 if (std::fabs(dgrad.
Vec()(i)) < prec.
Eps() && std::fabs(dgrad.
G2()(i)) < prec.
Eps())
79 if (dgrad.
Vec()(i) < 0)
80 step(i) = (hasGStep) ? dgrad.
Gstep()(i) : 1;
82 step(i) = (hasGStep) ? -dgrad.
Gstep()(i) : -1;
84 double gdel = step(i) * dgrad.
Vec()(i);
89 print.
Debug(
"Iter", iter,
"param", i, pa.
Vec()(i),
"grad2", dgrad.
G2()(i),
"grad",
90 dgrad.
Vec()(i),
"grad step", step(i),
" gdel ", gdel);
92 auto pp = lsearch(fcn, pa, step, gdel, prec);
94 print.
Debug(
"Line search result", pp.X(),
"f(0)", pa.
Fval(),
"f(1)", pp.Y());
99 dgrad = gc(pa, dgrad);
101 if (!dgrad.
HasG2()) {
103 print.
Debug(
"Compute G2 at the new point", pa.
Vec());
105 bool ret = gc.
G2(pa,g2);
107 print.
Error(
"Cannot compute G2");
115 print.
Debug(
"New result after Line search - iter", iter,
"param", i, pa.
Vec()(i),
"step", step(i),
"new grad2",
116 dgrad.
G2()(i),
"new grad", dgrad.
Vec()(i));
122 }
while (iter++ < 2 *
n &&
iterate);
125 print.
Debug(
"Approximate new covariance after NegativeG2LS using only G2");
127 for (
unsigned int i = 0; i <
n; i++) {
128 mat(i, i) = std::fabs(dgrad.
G2()(i)) > prec.
Eps() ? 1. / dgrad.
G2()(i) :
146 for (
unsigned int i = 0; i < grad.
Vec().
size(); i++)
148 if (grad.
G2()(i) <= 0) {
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
bool IsAnalytical() const
const MnAlgebraicVector & Gstep() const
const MnAlgebraicVector & Grad() const
const MnAlgebraicVector & Vec() const
const MnAlgebraicVector & G2() const
interface class for gradient calculators
virtual bool G2(const MinimumParameters &, MnAlgebraicVector &) const
unsigned int size() const
MinimumError keeps the inv.
const MnAlgebraicVector & Vec() const
MinimumState keeps the information (position, Gradient, 2nd deriv, etc) after one minimization step (...
const MinimumParameters & Parameters() const
const FunctionGradient & Gradient() const
Wrapper class to FCNBase interface used internally by Minuit.
unsigned int NumOfCalls() const
Implements a 1-dimensional minimization along a given direction (i.e.
Sets the relative floating point (double) arithmetic precision.
double Eps() const
eps returns the smallest possible number so that 1.+eps > 1.
void Debug(const Ts &... args)
void Error(const Ts &... args)
void Info(const Ts &... args)
bool HasNegativeG2(const FunctionGradient &, const MnMachinePrecision &) const
MinimumState operator()(const MnFcn &, const MinimumState &, const GradientCalculator &, const MnMachinePrecision &) const
double Estimate(const FunctionGradient &, const MinimumError &) const
int iterate(rng_state_t *X)
LAVector MnAlgebraicVector
LASymMatrix MnAlgebraicSymMatrix