30class MinuitGradFunctor :
public ROOT::Minuit2::FCNBase {
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());
44 std::vector<double> GradientWithPrevResult(std::vector<double>
const &
v,
double *previous_grad,
double *previous_g2,
45 double *previous_gstep)
const override
47 std::vector<double> output(
v.size());
48 _fcn.GradientWithPrevResult(
v.data(), output.data(), previous_grad, previous_g2, previous_gstep);
58 MinuitFcnGrad
const &_fcn;
89 std::vector<ROOT::Fit::ParameterSettings> ¶meters,
LikelihoodMode likelihoodMode,
93 synchronizeParameterSettings(parameters,
true);
113 _gradient->synchronizeParameterSettingsImpl(parameters);
145 likelihoodHere.evaluate();
146 double fvalue = likelihoodHere.getResult().Sum();
149 fvalue = applyEvalErrorHandling(fvalue);
153 std::cout <<
"\nprevFCN" << (likelihoodHere.isOffsetting() ?
"-offset" :
"") <<
" = " << std::setprecision(10)
154 << fvalue << std::setprecision(4) <<
" ";
201 bool aParamWasUpdated =
false;
202 if (minuit_internal) {
204 throw std::logic_error(
"Updating Minuit-internal parameters only makes sense for (gradient) calculators that "
205 "are defined in Minuit-internal parameter space.");
208 for (std::size_t ix = 0; ix < getNDim(); ++ix) {
210 if (parameter_changed) {
213 aParamWasUpdated |= parameter_changed;
216 if (aParamWasUpdated) {
222 bool aParamIsMismatched =
false;
224 for (std::size_t ix = 0; ix < getNDim(); ++ix) {
228 SetPdfParamVal(ix,
x[ix]);
234 aParamWasUpdated |= parameter_changed;
235 aParamIsMismatched |= (floatableParam(ix).getVal() !=
_minuitExternalX[ix]);
240 if (aParamWasUpdated) {
246 return aParamWasUpdated;
259 double *previous_gstep)
const
264 _gradient->fillGradientWithPrevResult(grad, previous_grad, previous_g2, previous_gstep);
270 bool returnee = synchronizeParameterSettings(parameters, _optConst);
272 _gradient->synchronizeParameterSettings(parameters);
274 applyToLikelihood([&](
auto &
l) {
l.synchronizeWithMinimizer(_context->fitter()->Config().MinimizerOptions()); });
275 _gradient->synchronizeWithMinimizer(_context->fitter()->Config().MinimizerOptions());
282 minuit.
SetFCN(getNDim(), std::make_unique<MinuitGradFunctor>(*
this, minim.
ErrorDef()));
TRObject operator()(const T1 &t1) const
Abstract Minimizer class, defining the interface for the various minimizer (like Minuit2,...
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.
void GradientWithPrevResult(const double *x, double *grad, double *previous_grad, double *previous_g2, double *previous_gstep) const
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
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...
Namespace for new RooFit test statistic calculation.
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
T * Gradient(Long64_t n, T *f, double h=1)
Calculate the one-dimensional gradient of an array with length n.