22 #if defined(DEBUG) || defined(WARNINGMSG)
33 FunctionGradient InitialGradientCalculator::operator()(
const MinimumParameters& par)
const {
36 assert(par.IsValid());
38 unsigned int n = Trafo().VariableParameters();
39 assert(n == par.Vec().size());
42 std::cout <<
"Initial gradient calculator - params " << par.Vec() << std::endl;
45 MnAlgebraicVector gr(n), gr2(n), gst(n);
47 for(
unsigned int i = 0; i < n; i++) {
48 unsigned int exOfIn = Trafo().ExtOfInt(i);
50 double var = par.Vec()(i);
51 double werr = Trafo().Parameter(exOfIn).Error();
52 double sav = Trafo().Int2ext(i, var);
53 double sav2 = sav + werr;
54 if(Trafo().Parameter(exOfIn).HasLimits()) {
55 if(Trafo().Parameter(exOfIn).HasUpperLimit() &&
56 sav2 > Trafo().Parameter(exOfIn).UpperLimit())
57 sav2 = Trafo().Parameter(exOfIn).UpperLimit();
59 double var2 = Trafo().Ext2int(exOfIn, sav2);
60 double vplu = var2 - var;
62 if(Trafo().Parameter(exOfIn).HasLimits()) {
63 if(Trafo().Parameter(exOfIn).HasLowerLimit() &&
64 sav2 < Trafo().Parameter(exOfIn).LowerLimit())
65 sav2 = Trafo().Parameter(exOfIn).LowerLimit();
67 var2 = Trafo().Ext2int(exOfIn, sav2);
68 double vmin = var2 - var;
69 double gsmin = 8.*Precision().Eps2()*(fabs(var) + Precision().Eps2());
71 double dirin = std::max(0.5*(fabs(vplu) + fabs(vmin)), gsmin );
72 double g2 = 2.0*fFcn.ErrorDef()/(dirin*dirin);
73 double gstep = std::max(gsmin, 0.1*dirin);
74 double grd = g2*dirin;
75 if(Trafo().Parameter(exOfIn).HasLimits()) {
76 if(gstep > 0.5) gstep = 0.5;
83 std::cout <<
"computing initial gradient for parameter " << Trafo().Name(exOfIn) <<
" value = " << var
84 <<
" [ " << vmin <<
" , " << vplu <<
" ] " <<
"dirin " << dirin <<
" grd " << grd <<
" g2 " << g2 << std::endl;
89 return FunctionGradient(gr, gr2, gst);
92 FunctionGradient InitialGradientCalculator::operator()(
const MinimumParameters& par,
const FunctionGradient&)
const {
97 const MnMachinePrecision& InitialGradientCalculator::Precision()
const {
99 return fTransformation.Precision();
102 unsigned int InitialGradientCalculator::Ncycle()
const {
104 return Strategy().GradientNCycles();
107 double InitialGradientCalculator::StepTolerance()
const {
109 return Strategy().GradientStepTolerance();
112 double InitialGradientCalculator::GradTolerance()
const {
114 return Strategy().GradientTolerance();