@@ -22,13 +22,13 @@ namespace ROOT {
22
22
23
23
namespace Minuit2 {
24
24
25
- FunctionGradient InitialGradientCalculator::operator ()(const MinimumParameters &par) const
25
+ // / Initial rough estimate of the gradient using the parameter step size.
26
+ FunctionGradient
27
+ calculateInitialGradient (const MinimumParameters &par, const MnUserTransformation &trafo, double errorDef)
26
28
{
27
- // initial rough estimate of the gradient using the parameter step size
28
-
29
29
assert (par.IsValid ());
30
30
31
- unsigned int n = Trafo () .VariableParameters ();
31
+ unsigned int n = trafo .VariableParameters ();
32
32
assert (n == par.Vec ().size ());
33
33
34
34
MnPrint print (" InitialGradientCalculator" );
@@ -38,58 +38,46 @@ FunctionGradient InitialGradientCalculator::operator()(const MinimumParameters &
38
38
MnAlgebraicVector gr (n), gr2 (n), gst (n);
39
39
40
40
for (unsigned int i = 0 ; i < n; i++) {
41
- unsigned int exOfIn = Trafo () .ExtOfInt (i);
41
+ unsigned int exOfIn = trafo .ExtOfInt (i);
42
42
43
43
double var = par.Vec ()(i);
44
- double werr = Trafo () .Parameter (exOfIn).Error ();
45
- double save1 = Trafo () .Int2ext (i, var);
44
+ double werr = trafo .Parameter (exOfIn).Error ();
45
+ double save1 = trafo .Int2ext (i, var);
46
46
double save2 = save1 + werr;
47
- if (Trafo () .Parameter (exOfIn).HasLimits ()) {
48
- if (Trafo () .Parameter (exOfIn).HasUpperLimit () && save2 > Trafo () .Parameter (exOfIn).UpperLimit ())
49
- save2 = Trafo () .Parameter (exOfIn).UpperLimit ();
47
+ if (trafo .Parameter (exOfIn).HasLimits ()) {
48
+ if (trafo .Parameter (exOfIn).HasUpperLimit () && save2 > trafo .Parameter (exOfIn).UpperLimit ())
49
+ save2 = trafo .Parameter (exOfIn).UpperLimit ();
50
50
}
51
- double var2 = Trafo () .Ext2int (exOfIn, save2);
51
+ double var2 = trafo .Ext2int (exOfIn, save2);
52
52
double vplu = var2 - var;
53
53
save2 = save1 - werr;
54
- if (Trafo () .Parameter (exOfIn).HasLimits ()) {
55
- if (Trafo () .Parameter (exOfIn).HasLowerLimit () && save2 < Trafo () .Parameter (exOfIn).LowerLimit ())
56
- save2 = Trafo () .Parameter (exOfIn).LowerLimit ();
54
+ if (trafo .Parameter (exOfIn).HasLimits ()) {
55
+ if (trafo .Parameter (exOfIn).HasLowerLimit () && save2 < trafo .Parameter (exOfIn).LowerLimit ())
56
+ save2 = trafo .Parameter (exOfIn).LowerLimit ();
57
57
}
58
- var2 = Trafo () .Ext2int (exOfIn, save2);
58
+ var2 = trafo .Ext2int (exOfIn, save2);
59
59
double vmin = var2 - var;
60
- double gsmin = 8 . * Precision ().Eps2 () * (std::fabs (var) + Precision ().Eps2 ());
60
+ double gsmin = 8 . * trafo. Precision ().Eps2 () * (std::fabs (var) + trafo. Precision ().Eps2 ());
61
61
// protect against very small step sizes which can cause dirin to zero and then nan values in grd
62
62
double dirin = std::max (0.5 * (std::fabs (vplu) + std::fabs (vmin)), gsmin);
63
- double g2 = 2.0 * fFcn . ErrorDef () / (dirin * dirin);
63
+ double g2 = 2.0 * errorDef / (dirin * dirin);
64
64
double gstep = std::max (gsmin, 0.1 * dirin);
65
65
double grd = g2 * dirin;
66
- if (Trafo () .Parameter (exOfIn).HasLimits ()) {
66
+ if (trafo .Parameter (exOfIn).HasLimits ()) {
67
67
if (gstep > 0.5 )
68
68
gstep = 0.5 ;
69
69
}
70
70
gr (i) = grd;
71
71
gr2 (i) = g2;
72
72
gst (i) = gstep;
73
73
74
- print.Trace (" Computed initial gradient for parameter" , Trafo () .Name (exOfIn), " value" , var, " [" , vmin, " ," , vplu,
74
+ print.Trace (" Computed initial gradient for parameter" , trafo .Name (exOfIn), " value" , var, " [" , vmin, " ," , vplu,
75
75
" ]" , " dirin" , dirin, " grd" , grd, " g2" , g2);
76
76
}
77
77
78
78
return FunctionGradient (gr, gr2, gst);
79
79
}
80
80
81
- FunctionGradient InitialGradientCalculator::operator ()(const MinimumParameters &par, const FunctionGradient &) const
82
- {
83
- // Base class interface
84
- return (*this )(par);
85
- }
86
-
87
- const MnMachinePrecision &InitialGradientCalculator::Precision () const
88
- {
89
- // return precision (is set in transformation class)
90
- return fTransformation .Precision ();
91
- }
92
-
93
81
} // namespace Minuit2
94
82
95
83
} // namespace ROOT
0 commit comments