@@ -37,8 +37,6 @@ class FCNAdapter : public FCNBase {
3737public:
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 ;
0 commit comments