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);