36 if (
err.size() == 1 &&
err(0, 0) < prec.
Eps()) {
40 if (
err.size() == 1 &&
err(0, 0) > prec.
Eps()) {
45 double epspdf = std::max(1.e-12, prec.
Eps2());
46 double dgmin =
err(0, 0);
48 for (
unsigned int i = 0; i <
err.Nrow(); i++) {
50 print.
Warn(
"non-positive diagonal element in covariance matrix[", i,
"] =",
err(i, i));
52 if (
err(i, i) < dgmin)
58 dg = 0.5 + epspdf - dgmin;
61 print.
Warn(
"Added to diagonal of Error matrix a value", dg);
68 for (
unsigned int i = 0; i <
err.Nrow(); i++) {
72 s(i) = 1. / std::sqrt(
err(i, i));
73 for (
unsigned int j = 0; j <= i; j++) {
74 p(i, j) =
err(i, j) * s(i) * s(j);
80 double pmin = eval(0);
81 double pmax = eval(eval.
size() - 1);
83 pmax = std::max(std::fabs(pmax), 1.);
84 if (pmin > epspdf * pmax)
87 double pAdd = 0.001 * pmax - pmin;
89 for (
unsigned int i = 0; i <
err.Nrow(); i++)
90 err(i, i) *= (1. + pAdd);
92 print.
Debug([&](std::ostream &os) {
94 for (
unsigned i = 0; i <
err.Nrow(); ++i)
95 os <<
"\n " << eval(i);
100 print.
Warn(
"Matrix forced pos-def by adding to diagonal", pAdd);
unsigned int size() const
MinimumError keeps the inv.
MinimumState keeps the information (position, Gradient, 2nd deriv, etc) after one minimization step (...
const MinimumError & Error() const
const MinimumParameters & Parameters() const
const FunctionGradient & Gradient() const
Sets the relative floating point (double) arithmetic precision.
double Eps() const
eps returns the smallest possible number so that 1.+eps > 1.
double Eps2() const
eps2 returns 2*sqrt(eps)
MinimumState operator()(const MinimumState &, const MnMachinePrecision &) const
void Debug(const Ts &... args)
void Warn(const Ts &... args)
LAVector eigenvalues(const LASymMatrix &)
LAVector MnAlgebraicVector
LASymMatrix MnAlgebraicSymMatrix