23 #if defined(DEBUG) || defined(WARNINGMSG)
34 double sum_of_elements(
const LASymMatrix&);
37 MinimumError FumiliErrorUpdator::Update(
const MinimumState& s0,
38 const MinimumParameters& p1,
39 const FunctionGradient& g1)
const {
46 return MinimumError(2);
50 MinimumError FumiliErrorUpdator::Update(
const MinimumState& s0,
51 const MinimumParameters& p1,
52 const GradientCalculator& gc ,
53 double lambda)
const {
61 FumiliGradientCalculator * fgc =
dynamic_cast< FumiliGradientCalculator *
>(
const_cast<GradientCalculator *
>(&gc) );
67 MnAlgebraicSymMatrix h = fgc->Hessian();
69 int nvar = p1.Vec().size();
72 double eps = 8*std::numeric_limits<double>::min();
73 for (
int j = 0; j < nvar; j++) {
74 h(j,j) *= (1. + lambda);
76 if ( fabs( h(j,j) ) < eps ) {
87 int ifail = Invert(h);
90 MN_INFO_MSG(
"FumiliErrorUpdator inversion fails; return diagonal matrix.");
92 for(
unsigned int i = 0; i < h.Nrow(); i++) {
98 const MnAlgebraicSymMatrix& v0 = s0.Error().InvHessian();
103 double dcov = 0.5*(s0.Error().Dcovar() + sum_of_elements(h-v0)/sum_of_elements(h));
107 return MinimumError(h, dcov);