14 #if defined(DEBUG) || defined(WARNINGMSG)
24 MnUserCovariance MnCovarianceSqueeze::operator()(
const MnUserCovariance& cov,
unsigned int n)
const {
28 assert(cov.Nrow() > 0);
29 assert(n < cov.Nrow());
31 MnAlgebraicSymMatrix hess(cov.Nrow());
32 for(
unsigned int i = 0; i < cov.Nrow(); i++) {
33 for(
unsigned int j = i; j < cov.Nrow(); j++) {
38 int ifail = Invert(hess);
42 MN_INFO_MSG(
"MnUserCovariance inversion failed; return diagonal matrix;");
44 MnUserCovariance result(cov.Nrow() - 1);
45 for(
unsigned int i = 0, j =0; i < cov.Nrow(); i++) {
47 result(j,j) = cov(i,i);
53 MnAlgebraicSymMatrix squeezed = (*this)(hess, n);
55 ifail = Invert(squeezed);
58 MN_INFO_MSG(
"MnUserCovariance back-inversion failed; return diagonal matrix;");
60 MnUserCovariance result(squeezed.Nrow());
61 for(
unsigned int i = 0; i < squeezed.Nrow(); i++) {
62 result(i,i) = 1./squeezed(i,i);
67 return MnUserCovariance(std::vector<double>(squeezed.Data(), squeezed.Data() + squeezed.size()), squeezed.Nrow());
70 MinimumError MnCovarianceSqueeze::operator()(
const MinimumError& err,
unsigned int n)
const {
74 MnAlgebraicSymMatrix hess = err.Hessian();
75 MnAlgebraicSymMatrix squeezed = (*this)(hess, n);
76 int ifail = Invert(squeezed);
79 MN_INFO_MSG(
"MnCovarianceSqueeze: MinimumError inversion fails; return diagonal matrix.");
81 MnAlgebraicSymMatrix tmp(squeezed.Nrow());
82 for(
unsigned int i = 0; i < squeezed.Nrow(); i++) {
83 tmp(i,i) = 1./squeezed(i,i);
85 return MinimumError(tmp, MinimumError::MnInvertFailed());
88 return MinimumError(squeezed, err.Dcovar());
91 MnAlgebraicSymMatrix MnCovarianceSqueeze::operator()(
const MnAlgebraicSymMatrix& hess,
unsigned int n)
const {
93 assert(hess.Nrow() > 0);
94 assert(n < hess.Nrow());
96 MnAlgebraicSymMatrix hs(hess.Nrow() - 1);
97 for(
unsigned int i = 0, j = 0; i < hess.Nrow(); i++) {
99 for(
unsigned int k = i, l = j; k < hess.Nrow(); k++) {