13 #ifndef ROOT_Fit_PoissonLikelihoodFCN
14 #define ROOT_Fit_PoissonLikelihoodFCN
47 template<
class DerivFunType,
class ModelFunType = ROOT::Math::IParamMultiFunction>
48 class PoissonLikelihoodFCN :
public BasicFCN<DerivFunType,ModelFunType,BinData> {
51 typedef typename ModelFunType::BackendType T;
52 typedef BasicFCN<DerivFunType,ModelFunType,BinData> BaseFCN;
54 typedef ::ROOT::Math::BasicFitMethodFunction<DerivFunType> BaseObjFunction;
55 typedef typename BaseObjFunction::BaseFunction BaseFunction;
57 typedef ::ROOT::Math::IParamMultiFunctionTempl<T> IModelFunction;
58 typedef typename BaseObjFunction::Type_t Type_t;
63 PoissonLikelihoodFCN (
const std::shared_ptr<BinData> & data,
const std::shared_ptr<IModelFunction> & func,
int weight = 0,
bool extended =
true, const ::ROOT::Fit::ExecutionPolicy &executionPolicy = ::ROOT::Fit::ExecutionPolicy::kSerial ) :
65 fIsExtended(extended),
68 fGrad ( std::vector<double> ( func->NPar() ) ),
69 fExecutionPolicy(executionPolicy)
75 PoissonLikelihoodFCN (
const BinData & data,
const IModelFunction & func,
int weight = 0,
bool extended =
true, const ::ROOT::Fit::ExecutionPolicy &executionPolicy = ::ROOT::Fit::ExecutionPolicy::kSerial ) :
76 BaseFCN(std::shared_ptr<BinData>(const_cast<BinData*>(&data), DummyDeleter<BinData>()), std::shared_ptr<IModelFunction>(dynamic_cast<IModelFunction*>(func.Clone() ) ) ),
77 fIsExtended(extended),
80 fGrad ( std::vector<double> ( func.NPar() ) ),
81 fExecutionPolicy(executionPolicy)
88 virtual ~PoissonLikelihoodFCN () {}
93 PoissonLikelihoodFCN(
const PoissonLikelihoodFCN & f) :
94 BaseFCN(f.DataPtr(), f.ModelFunctionPtr() ),
95 fIsExtended(f.fIsExtended ),
97 fNEffPoints( f.fNEffPoints ),
99 fExecutionPolicy(f.fExecutionPolicy)
105 PoissonLikelihoodFCN & operator = (
const PoissonLikelihoodFCN & rhs) {
106 SetData(rhs.DataPtr() );
107 SetModelFunction(rhs.ModelFunctionPtr() );
108 fNEffPoints = rhs.fNEffPoints;
110 fIsExtended = rhs.fIsExtended;
111 fWeight = rhs.fWeight;
112 fExecutionPolicy = rhs.fExecutionPolicy;
117 virtual BaseFunction * Clone()
const {
return new PoissonLikelihoodFCN(*
this); }
120 virtual unsigned int NFitPoints()
const {
return fNEffPoints; }
123 virtual double DataElement(
const double * x,
unsigned int i,
double * g)
const {
124 if (i==0) this->UpdateNCalls();
125 return FitUtil::Evaluate<typename BaseFCN::T>::EvalPoissonBinPdf(BaseFCN::ModelFunction(), BaseFCN::Data(), x, i, g);
129 virtual void Gradient(
const double *x,
double *g)
const
132 FitUtil::Evaluate<typename BaseFCN::T>::EvalPoissonLogLGradient(BaseFCN::ModelFunction(), BaseFCN::Data(), x, g,
133 fNEffPoints, fExecutionPolicy);
137 virtual typename BaseObjFunction::Type_t Type()
const {
return BaseObjFunction::kLogLikelihood; }
139 bool IsWeighted()
const {
return (fWeight != 0); }
142 void UseSumOfWeights() {
143 if (fWeight == 0)
return;
149 void UseSumOfWeightSquare(
bool on =
true) {
150 if (fWeight == 0)
return;
164 virtual double DoEval (
const double * x)
const {
165 this->UpdateNCalls();
166 return FitUtil::Evaluate<T>::EvalPoissonLogL(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fWeight, fIsExtended,
167 fNEffPoints, fExecutionPolicy);
171 virtual double DoDerivative(
const double * x,
unsigned int icoord )
const {
172 Gradient(x, &fGrad[0]);
173 return fGrad[icoord];
182 mutable unsigned int fNEffPoints;
184 mutable std::vector<double> fGrad;
186 ::ROOT::Fit::ExecutionPolicy fExecutionPolicy;
190 typedef PoissonLikelihoodFCN<ROOT::Math::IMultiGenFunction, ROOT::Math::IParamMultiFunction> PoissonLLFunction;
191 typedef PoissonLikelihoodFCN<ROOT::Math::IMultiGradFunction, ROOT::Math::IParamMultiFunction> PoissonLLGradFunction;