Skip to content

Commit 8b3836d

Browse files
committed
[Minuit2] Remove output buffers from FCNAdapter
The FCNBase interface requres returning `std::vector` by value, so the buffers would have to be copied anyway. Therefore, there is no benefit of using in-place output buffers.
1 parent 0ca5f48 commit 8b3836d

File tree

2 files changed

+20
-31
lines changed

2 files changed

+20
-31
lines changed

math/minuit2/inc/Minuit2/FCNAdapter.h

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ class FCNAdapter : public FCNBase {
3737
public:
3838
FCNAdapter(std::function<double(double const *)> f, double up = 1.) : fUp(up), fFunc(std::move(f)) {}
3939

40-
void SetGradientBufferSize(std::size_t n) { fGrad.resize(n); }
41-
4240
bool HasGradient() const override { return bool(fGradFunc); }
4341
bool HasG2() const override { return bool(fG2Func); }
4442
bool HasHessian() const override { return bool(fHessianFunc); }
@@ -49,65 +47,59 @@ class FCNAdapter : public FCNBase {
4947

5048
std::vector<double> Gradient(std::vector<double> const &v) const override
5149
{
52-
fGradFunc(v.data(), fGrad.data());
53-
return fGrad;
50+
std::vector<double> output(v.size());
51+
fGradFunc(v.data(), output.data());
52+
return output;
5453
}
5554
std::vector<double> GradientWithPrevResult(std::vector<double> const &v, double *previous_grad, double *previous_g2,
5655
double *previous_gstep) const override
5756
{
58-
fGradWithPrevResultFunc(v.data(), fGrad.data(), previous_grad, previous_g2, previous_gstep);
59-
return fGrad;
57+
std::vector<double> output(v.size());
58+
fGradWithPrevResultFunc(v.data(), output.data(), previous_grad, previous_g2, previous_gstep);
59+
return output;
6060
}
6161

6262
GradientParameterSpace gradParameterSpace() const override
6363
{
64-
if (fReturnsInMinuit2ParameterSpace) {
65-
return GradientParameterSpace::Internal;
66-
} else {
67-
return GradientParameterSpace::External;
68-
}
64+
return fReturnsInMinuit2ParameterSpace ? GradientParameterSpace::Internal : GradientParameterSpace::External;
6965
}
7066

7167
/// return second derivatives (diagonal of the Hessian matrix)
7268
std::vector<double> G2(std::vector<double> const &x) const override
7369
{
70+
std::vector<double> output;
7471
if (fG2Func)
7572
return fG2Func(x);
7673
if (fHessianFunc) {
77-
unsigned int n = fGrad.size();
78-
if (fG2Vec.empty())
79-
fG2Vec.resize(n);
74+
std::size_t n = x.size();
75+
output.resize(n);
8076
if (fHessian.empty())
8177
fHessian.resize(n * n);
8278
fHessianFunc(x, fHessian.data());
8379
if (!fHessian.empty()) {
8480
// get diagonal element of h
8581
for (unsigned int i = 0; i < n; i++)
86-
fG2Vec[i] = fHessian[i * n + i];
87-
} else
88-
fG2Vec.clear();
89-
} else if (!fG2Vec.empty())
90-
fG2Vec.clear();
91-
return fG2Vec;
82+
output[i] = fHessian[i * n + i];
83+
}
84+
}
85+
return output;
9286
}
9387

9488
/// compute Hessian. Return Hessian as a std::vector of size(n*n)
9589
std::vector<double> Hessian(std::vector<double> const &x) const override
9690
{
97-
unsigned int n = fGrad.size();
91+
std::vector<double> output;
9892
if (fHessianFunc) {
99-
if (fHessian.empty())
100-
fHessian.resize(n * n);
101-
bool ret = fHessianFunc(x, fHessian.data());
93+
std::size_t n = x.size();
94+
output.resize(n * n);
95+
bool ret = fHessianFunc(x, output.data());
10296
if (!ret) {
103-
fHessian.clear();
97+
output.clear();
10498
fHessianFunc = nullptr;
10599
}
106-
} else {
107-
fHessian.clear();
108100
}
109101

110-
return fHessian;
102+
return output;
111103
}
112104

113105
void SetReturnsInMinuit2ParameterSpace(bool flag) { fReturnsInMinuit2ParameterSpace = flag; }
@@ -134,9 +126,7 @@ class FCNAdapter : public FCNBase {
134126

135127
bool fReturnsInMinuit2ParameterSpace = false;
136128
double fUp = 1.;
137-
mutable std::vector<double> fGrad;
138129
mutable std::vector<double> fHessian;
139-
mutable std::vector<double> fG2Vec;
140130

141131
Function fFunc;
142132
GradFunction fGradFunc;

math/minuit2/src/Minuit2Minimizer.cxx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,6 @@ void Minuit2Minimizer::SetFunction(const ROOT::Math::IMultiGenFunction &func)
404404
gradFunc.GradientWithPrevResult(params, grad, previous_grad, previous_g2, previous_gstep);
405405
};
406406
adapter->SetGradientFunction(lambdaGrad);
407-
adapter->SetGradientBufferSize(func.NDim());
408407
adapter->SetGradWithPrevResultFunction(lambdaGradWithPrevResult);
409408
adapter->SetReturnsInMinuit2ParameterSpace(gradFunc.returnsInMinuit2ParameterSpace());
410409
}

0 commit comments

Comments
 (0)