diff --git a/roofit/roofitcore/src/RooMinimizerFcn.cxx b/roofit/roofitcore/src/RooMinimizerFcn.cxx index d5b3f7d08a7e2..1a077f86405a0 100644 --- a/roofit/roofitcore/src/RooMinimizerFcn.cxx +++ b/roofit/roofitcore/src/RooMinimizerFcn.cxx @@ -78,6 +78,27 @@ void RooMinimizerFcn::setOptimizeConstOnFunction(RooAbsArg::ConstOpCode opcode, /// Evaluate function given the parameters in `x`. double RooMinimizerFcn::operator()(const double *x) const { + unsigned nDim = getNDim(); + int nChanged = 0; + for (unsigned i = 0; i < _cachedInput.size(); ++i) { + if (_cachedInput[i] != x[i]) ++nChanged; + _cachedInput[i] = x[i]; + } + + if(_cachedInput.empty()) { + _cachedInput.resize(nDim); + for (unsigned i = 0; i < nDim; i++) { + _cachedInput[i] = x[i]; + } + } + + // TODO: doc + const bool shouldDirtyInhibit = nChanged > 2; + + if (shouldDirtyInhibit) { + RooAbsArg::setDirtyInhibit(true); + } + // Set the parameter values for this iteration for (unsigned index = 0; index < getNDim(); index++) { if (_logfile) @@ -90,6 +111,10 @@ double RooMinimizerFcn::operator()(const double *x) const double fvalue = _funct->getVal(); RooAbsReal::setHideOffset(true); + if (shouldDirtyInhibit) { + RooAbsArg::setDirtyInhibit(false); + } + fvalue = applyEvalErrorHandling(fvalue); // Optional logging diff --git a/roofit/roofitcore/src/RooMinimizerFcn.h b/roofit/roofitcore/src/RooMinimizerFcn.h index f05009aba68f7..4ba2194cd2b04 100644 --- a/roofit/roofitcore/src/RooMinimizerFcn.h +++ b/roofit/roofitcore/src/RooMinimizerFcn.h @@ -53,6 +53,7 @@ class RooMinimizerFcn : public RooAbsMinimizerFcn { RooAbsReal *_funct = nullptr; std::unique_ptr _multiGenFcn; mutable std::vector _gradientOutput; + mutable std::vector _cachedInput; }; #endif