|
10 | 10 | #include "Minuit2/FumiliBuilder.h" |
11 | 11 | #include "Minuit2/FumiliStandardMaximumLikelihoodFCN.h" |
12 | 12 | #include "Minuit2/GradientCalculator.h" |
13 | | -//#include "Minuit2/Numerical2PGradientCalculator.h" |
14 | 13 | #include "Minuit2/MinimumState.h" |
15 | 14 | #include "Minuit2/MinimumError.h" |
16 | 15 | #include "Minuit2/FunctionGradient.h" |
@@ -237,6 +236,8 @@ FunctionMinimum FumiliBuilder::Minimum(const MnFcn &fcn, const GradientCalculato |
237 | 236 |
|
238 | 237 | double lambda = (doLineSearch) ? 0.001 : 0; |
239 | 238 |
|
| 239 | + MnFcnCaller fcnCaller{fcn}; |
| 240 | + |
240 | 241 | do { |
241 | 242 |
|
242 | 243 | // const MinimumState& s0 = result.back(); |
@@ -269,7 +270,7 @@ FunctionMinimum FumiliBuilder::Minimum(const MnFcn &fcn, const GradientCalculato |
269 | 270 | // take a full step |
270 | 271 |
|
271 | 272 | //evaluate function only if doing a line search |
272 | | - double fval2 = (doLineSearch) ? fcn(s0.Vec() + step) : 0; |
| 273 | + double fval2 = (doLineSearch) ? fcnCaller(s0.Vec() + step) : 0; |
273 | 274 | MinimumParameters p(s0.Vec() + step, fval2); |
274 | 275 |
|
275 | 276 | // check that taking the full step does not deteriorate minimum |
@@ -324,7 +325,7 @@ FunctionMinimum FumiliBuilder::Minimum(const MnFcn &fcn, const GradientCalculato |
324 | 325 |
|
325 | 326 | // if the proposed point (newton step) is inside the trust region radius accept it |
326 | 327 | if (norm <= delta) { |
327 | | - p = MinimumParameters(s0.Vec() + step, fcn(s0.Vec() + step)); |
| 328 | + p = MinimumParameters(s0.Vec() + step, fcnCaller(s0.Vec() + step)); |
328 | 329 | print.Debug("Accept full Newton step - it is inside TR ",delta); |
329 | 330 | } else { |
330 | 331 | //step = - (delta/norm) * step; |
@@ -403,7 +404,7 @@ FunctionMinimum FumiliBuilder::Minimum(const MnFcn &fcn, const GradientCalculato |
403 | 404 | } |
404 | 405 | print.Debug("New accepted step is ",step); |
405 | 406 |
|
406 | | - p = MinimumParameters(s0.Vec() + step, fcn(s0.Vec() + step)); |
| 407 | + p = MinimumParameters(s0.Vec() + step, fcnCaller(s0.Vec() + step)); |
407 | 408 | norm = delta; |
408 | 409 | gdel = inner_product(step, s0.Gradient().Grad()); |
409 | 410 | } |
|
0 commit comments