17 #if defined(DEBUG) || defined(WARNINGMSG) 
   28 double inner_product(
const LAVector&, 
const LAVector&);
 
   29 double similarity(
const LAVector&, 
const LASymMatrix&);
 
   30 double sum_of_elements(
const LASymMatrix&);
 
   32 MinimumError DavidonErrorUpdator::Update(
const MinimumState& s0,
 
   33                                          const MinimumParameters& p1,
 
   34                                          const FunctionGradient& g1)
 const {
 
   40    const MnAlgebraicSymMatrix& v0 = s0.Error().InvHessian();
 
   41    MnAlgebraicVector dx = p1.Vec() - s0.Vec();
 
   42    MnAlgebraicVector dg = g1.Vec() - s0.Gradient().Vec();
 
   44    double delgam = inner_product(dx, dg);
 
   45    double gvg = similarity(dg, v0);
 
   49    std::cout << 
"dx = " << dx << std::endl;
 
   50    std::cout << 
"dg = " << dg << std::endl;
 
   51    std::cout<<
"delgam= "<<delgam<<
" gvg= "<<gvg<<std::endl;
 
   56       MN_INFO_MSG(
"DavidonErrorUpdator: delgam = 0 : cannot update - return same matrix ");
 
   61    if (delgam < 0)  MN_INFO_MSG(
"DavidonErrorUpdator: delgam < 0 : first derivatives increasing along search line");
 
   67       MN_INFO_MSG(
"DavidonErrorUpdator: gvg <= 0 : cannot update - return same matrix ");
 
   73    MnAlgebraicVector vg = v0*dg;
 
   75    MnAlgebraicSymMatrix vUpd = Outer_product(dx)/delgam - Outer_product(vg)/gvg;
 
   79       vUpd += gvg*Outer_product(MnAlgebraicVector(dx/delgam - vg/gvg));
 
   82    double sum_upd = sum_of_elements(vUpd);
 
   85    double dcov = 0.5*(s0.Error().Dcovar() + sum_upd/sum_of_elements(vUpd));
 
   87    return MinimumError(vUpd, dcov);