Skip to content

Commit ada5b51

Browse files
committed
[Minuit2] Migrate InitialGradientCalculator to free function
1 parent 42ace90 commit ada5b51

6 files changed

+23
-60
lines changed

math/minuit2/inc/Minuit2/InitialGradientCalculator.h

+1-22
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,9 @@ namespace ROOT {
1616

1717
namespace Minuit2 {
1818

19-
class MnFcn;
2019
class MnUserTransformation;
21-
class MnMachinePrecision;
2220

23-
/**
24-
Class to calculate an initial estimate of the gradient
25-
*/
26-
class InitialGradientCalculator : public GradientCalculator {
27-
28-
public:
29-
InitialGradientCalculator(const MnFcn &fcn, const MnUserTransformation &par) : fFcn(fcn), fTransformation(par) {}
30-
31-
FunctionGradient operator()(const MinimumParameters &) const override;
32-
33-
FunctionGradient operator()(const MinimumParameters &, const FunctionGradient &) const override;
34-
35-
const MnFcn &Fcn() const { return fFcn; }
36-
const MnUserTransformation &Trafo() const { return fTransformation; }
37-
const MnMachinePrecision &Precision() const;
38-
39-
private:
40-
const MnFcn &fFcn;
41-
const MnUserTransformation &fTransformation;
42-
};
21+
FunctionGradient calculateInitialGradient(const MinimumParameters &, const MnUserTransformation &, double errorDef);
4322

4423
} // namespace Minuit2
4524

math/minuit2/inc/Minuit2/Numerical2PGradientCalculator.h

-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ class Numerical2PGradientCalculator : public GradientCalculator {
4343

4444
FunctionGradient operator()(const MinimumParameters &, const FunctionGradient &) const override;
4545

46-
const MnFcn &Fcn() const { return fFcn; }
4746
const MnUserTransformation &Trafo() const { return fTransformation; }
4847
const MnMachinePrecision &Precision() const;
4948
const MnStrategy &Strategy() const { return fStrategy; }

math/minuit2/src/HessianGradientCalculator.cxx

+1-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ namespace Minuit2 {
2828
FunctionGradient HessianGradientCalculator::operator()(const MinimumParameters &par) const
2929
{
3030
// use initial gradient as starting point
31-
InitialGradientCalculator gc(fFcn, fTransformation);
32-
FunctionGradient gra = gc(par);
31+
FunctionGradient gra = calculateInitialGradient(par, fTransformation, fFcn.ErrorDef());
3332

3433
return (*this)(par, gra);
3534
}

math/minuit2/src/InitialGradientCalculator.cxx

+19-31
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ namespace ROOT {
2222

2323
namespace Minuit2 {
2424

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)
2628
{
27-
// initial rough estimate of the gradient using the parameter step size
28-
2929
assert(par.IsValid());
3030

31-
unsigned int n = Trafo().VariableParameters();
31+
unsigned int n = trafo.VariableParameters();
3232
assert(n == par.Vec().size());
3333

3434
MnPrint print("InitialGradientCalculator");
@@ -38,58 +38,46 @@ FunctionGradient InitialGradientCalculator::operator()(const MinimumParameters &
3838
MnAlgebraicVector gr(n), gr2(n), gst(n);
3939

4040
for (unsigned int i = 0; i < n; i++) {
41-
unsigned int exOfIn = Trafo().ExtOfInt(i);
41+
unsigned int exOfIn = trafo.ExtOfInt(i);
4242

4343
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);
4646
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();
5050
}
51-
double var2 = Trafo().Ext2int(exOfIn, save2);
51+
double var2 = trafo.Ext2int(exOfIn, save2);
5252
double vplu = var2 - var;
5353
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();
5757
}
58-
var2 = Trafo().Ext2int(exOfIn, save2);
58+
var2 = trafo.Ext2int(exOfIn, save2);
5959
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());
6161
// protect against very small step sizes which can cause dirin to zero and then nan values in grd
6262
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);
6464
double gstep = std::max(gsmin, 0.1 * dirin);
6565
double grd = g2 * dirin;
66-
if (Trafo().Parameter(exOfIn).HasLimits()) {
66+
if (trafo.Parameter(exOfIn).HasLimits()) {
6767
if (gstep > 0.5)
6868
gstep = 0.5;
6969
}
7070
gr(i) = grd;
7171
gr2(i) = g2;
7272
gst(i) = gstep;
7373

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,
7575
"]", "dirin", dirin, "grd", grd, "g2", g2);
7676
}
7777

7878
return FunctionGradient(gr, gr2, gst);
7979
}
8080

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-
9381
} // namespace Minuit2
9482

9583
} // namespace ROOT

math/minuit2/src/Numerical2PGradientCalculator.cxx

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ FunctionGradient Numerical2PGradientCalculator::operator()(const MinimumParamete
3737
{
3838
// calculate gradient using Initial gradient calculator and from MinimumParameters object
3939

40-
InitialGradientCalculator gc(fFcn, fTransformation);
41-
FunctionGradient gra = gc(par);
40+
FunctionGradient gra = calculateInitialGradient(par, fTransformation, fFcn.ErrorDef());
4241

4342
return (*this)(par, gra);
4443
}

math/minuit2/src/SimplexSeedGenerator.cxx

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ operator()(const MnFcn &fcn, const GradientCalculator &, const MnUserParameterSt
3333
x(i) = st.IntParameters()[i];
3434
double fcnmin = fcn(x);
3535
MinimumParameters pa(x, fcnmin);
36-
InitialGradientCalculator igc(fcn, st.Trafo());
37-
FunctionGradient dgrad = igc(pa);
36+
FunctionGradient dgrad = calculateInitialGradient(pa, st.Trafo(), fcn.ErrorDef());
3837
MnAlgebraicSymMatrix mat(n);
3938
double dcovar = 1.;
4039
for (unsigned int i = 0; i < n; i++)

0 commit comments

Comments
 (0)