26namespace TestStatistics {
32 MinuitGradFunctor(MinuitFcnGrad
const &fcn,
double errorLevel) :
_fcn{fcn},
_up{errorLevel} {}
34 double operator()(std::vector<double>
const &
v)
const override {
return _fcn(
v.data()); }
35 double Up()
const override {
return _up; }
36 void SetErrorDef(
double val)
override {
_up = val; }
37 bool HasGradient()
const override {
return true; }
38 std::vector<double>
Gradient(std::vector<double>
const ¶ms)
const override
40 std::vector<double> grad(
_fcn.getNDim());
41 _fcn.Gradient(params.data(), grad.data());
47 using FCNBase::GradientWithPrevResult;
48 std::vector<double> GradientWithPrevResult(std::vector<double>
const &
v,
double *previous_grad,
double *previous_g2,
49 double *previous_gstep,
double fValAtV)
const override
51 std::vector<double> output(
v.size());
52 _fcn.GradientWithPrevResult(
v.data(), output.data(), previous_grad, previous_g2, previous_gstep, fValAtV);
62 bool SecondDerivativeAlwaysVanishes(
unsigned int ,
unsigned int )
const override {
return false; }
96 std::vector<ROOT::Fit::ParameterSettings> ¶meters,
LikelihoodMode likelihoodMode,
98 :
RooAbsMinimizerFcn(*absL->getParameters(), context), _minuitInternalX(getNDim(), 0), _minuitExternalX(getNDim(), 0)
100 synchronizeParameterSettings(parameters);
120 _gradient->synchronizeParameterSettingsImpl(parameters);
152 likelihoodHere.evaluate();
153 double fvalue = likelihoodHere.getResult().Sum();
156 fvalue = applyEvalErrorHandling(fvalue);
160 std::cout <<
"\nprevFCN" << (likelihoodHere.isOffsetting() ?
"-offset" :
"") <<
" = " << std::setprecision(10)
161 << fvalue << std::setprecision(4) <<
" ";
208 bool aParamWasUpdated =
false;
209 if (minuit_internal) {
211 throw std::logic_error(
"Updating Minuit-internal parameters only makes sense for (gradient) calculators that "
212 "are defined in Minuit-internal parameter space.");
215 for (std::size_t ix = 0; ix < getNDim(); ++ix) {
217 if (parameter_changed) {
220 aParamWasUpdated |= parameter_changed;
223 if (aParamWasUpdated) {
229 bool aParamIsMismatched =
false;
231 for (std::size_t ix = 0; ix < getNDim(); ++ix) {
235 SetPdfParamVal(ix,
x[ix]);
241 aParamWasUpdated |= parameter_changed;
242 aParamIsMismatched |= (floatableParam(ix).getVal() !=
_minuitExternalX[ix]);
247 if (aParamWasUpdated) {
253 return aParamWasUpdated;
266 double *previous_gstep,
double fValAtX)
const
271 _gradient->fillGradientWithPrevResult(grad, previous_grad, previous_g2, previous_gstep, fValAtX);
277 bool returnee = synchronizeParameterSettings(parameters);
279 _gradient->synchronizeParameterSettings(parameters);
281 applyToLikelihood([&](
auto &
l) {
l.synchronizeWithMinimizer(_context->fitter()->Config().MinimizerOptions()); });
282 _gradient->synchronizeWithMinimizer(_context->fitter()->Config().MinimizerOptions());
289 minuit.
SetFCN(getNDim(), std::make_unique<MinuitGradFunctor>(*
this, minim.
ErrorDef()));
MinuitFcnGrad const & _fcn
Abstract Minimizer class, defining the interface for the various minimizer (like Minuit2,...
Interface (abstract class) defining the function to be minimized, which has to be implemented by the ...
Minuit2Minimizer class implementing the ROOT::Math::Minimizer interface for Minuit2 minimization algo...
void SetFCN(unsigned int nDim, std::unique_ptr< ROOT::Minuit2::FCNBase > fcn)
To set the function directly to a Minuit 2 function.
static std::unique_ptr< LikelihoodGradientWrapper > create(LikelihoodGradientMode likelihoodGradientMode, std::shared_ptr< RooAbsL > likelihood, std::shared_ptr< WrapperCalculationCleanFlags > calculationIsClean, std::size_t nDim, RooMinimizer *minimizer, SharedOffset offset)
Factory method.
static std::unique_ptr< LikelihoodWrapper > create(LikelihoodMode likelihoodMode, std::shared_ptr< RooAbsL > likelihood, std::shared_ptr< WrapperCalculationCleanFlags > calculationIsClean, SharedOffset offset)
Factory method.
double operator()(const double *x) const
bool Synchronize(std::vector< ROOT::Fit::ParameterSettings > ¶meter_settings) override
Overridden from RooAbsMinimizerFcn to include gradient strategy synchronization.
void Gradient(const double *x, double *grad) const
IMultiGradFunction overrides necessary for Minuit.
std::vector< double > _minuitInternalX
std::shared_ptr< LikelihoodWrapper > _likelihood
bool syncParameterValuesFromMinuitCalls(const double *x, bool minuit_internal) const
Minuit calls (via FcnAdapters etc) DoEval or Gradient with a set of parameters x.
bool _minuitInternalRooFitXMismatch
std::unique_ptr< LikelihoodGradientWrapper > _gradient
void syncOffsets() const
Make sure the offsets are up to date.
std::shared_ptr< WrapperCalculationCleanFlags > _calculationIsClean
bool _calculatingGradient
std::vector< double > _minuitExternalX
void initMinimizer(ROOT::Math::Minimizer &, RooMinimizer *context) override
std::shared_ptr< LikelihoodWrapper > _likelihoodInGradient
void applyToLikelihood(Func &&func) const
void GradientWithPrevResult(const double *x, double *grad, double *previous_grad, double *previous_g2, double *previous_gstep, double fValAtX) const
MinuitFcnGrad(const std::shared_ptr< RooFit::TestStatistics::RooAbsL > &absL, RooMinimizer *context, std::vector< ROOT::Fit::ParameterSettings > ¶meters, LikelihoodMode likelihoodMode, LikelihoodGradientMode likelihoodGradientMode)
bool returnsInMinuit2ParameterSpace() const
Wrapper class around ROOT::Math::Minimizer that provides a seamless interface between the minimizer f...
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
T * Gradient(Long64_t n, T const *f, double h=1)
Calculate the one-dimensional finite gradient of an array with length n.