13 #ifndef ROOT_Fit_LogLikelihoodFCN
14 #define ROOT_Fit_LogLikelihoodFCN
40 template<
class DerivFunType,
class ModelFunType = ROOT::Math::IParamMultiFunction>
41 class LogLikelihoodFCN :
public BasicFCN<DerivFunType,ModelFunType,UnBinData> {
45 typedef typename ModelFunType::BackendType T;
46 typedef BasicFCN<DerivFunType,ModelFunType,UnBinData> BaseFCN;
48 typedef ::ROOT::Math::BasicFitMethodFunction<DerivFunType> BaseObjFunction;
49 typedef typename BaseObjFunction::BaseFunction BaseFunction;
51 typedef ::ROOT::Math::IParamMultiFunctionTempl<T> IModelFunction;
52 typedef typename BaseObjFunction::Type_t Type_t;
58 LogLikelihoodFCN (
const std::shared_ptr<UnBinData> & data,
const std::shared_ptr<IModelFunction> & func,
int weight = 0,
bool extended =
false, const ::ROOT::Fit::ExecutionPolicy &executionPolicy = ::ROOT::Fit::ExecutionPolicy::kSerial) :
60 fIsExtended(extended),
63 fGrad ( std::vector<double> ( func->NPar() ) ),
64 fExecutionPolicy(executionPolicy)
70 LogLikelihoodFCN (
const UnBinData & data,
const IModelFunction & func,
int weight = 0,
bool extended =
false, const ::ROOT::Fit::ExecutionPolicy &executionPolicy = ::ROOT::Fit::ExecutionPolicy::kSerial) :
71 BaseFCN(std::shared_ptr<UnBinData>(const_cast<UnBinData*>(&data), DummyDeleter<UnBinData>()), std::shared_ptr<IModelFunction>(dynamic_cast<IModelFunction*>(func.Clone() ) ) ),
72 fIsExtended(extended),
75 fGrad ( std::vector<double> ( func.NPar() ) ),
76 fExecutionPolicy(executionPolicy)
82 virtual ~LogLikelihoodFCN () {}
87 LogLikelihoodFCN(
const LogLikelihoodFCN & f) :
88 BaseFCN(f.DataPtr(), f.ModelFunctionPtr() ),
89 fIsExtended(f.fIsExtended ),
91 fNEffPoints( f.fNEffPoints ),
93 fExecutionPolicy(f.fExecutionPolicy)
100 LogLikelihoodFCN & operator = (
const LogLikelihoodFCN & rhs) {
101 SetData(rhs.DataPtr() );
102 SetModelFunction(rhs.ModelFunctionPtr() );
103 fNEffPoints = rhs.fNEffPoints;
105 fIsExtended = rhs.fIsExtended;
106 fWeight = rhs.fWeight;
107 fExecutionPolicy = rhs.fExecutionPolicy;
113 virtual BaseFunction * Clone()
const {
return new LogLikelihoodFCN(*
this); }
119 virtual unsigned int NFitPoints()
const {
return fNEffPoints; }
122 virtual double DataElement(
const double * x,
unsigned int i,
double * g)
const {
123 if (i==0) this->UpdateNCalls();
124 return FitUtil::EvaluatePdf(BaseFCN::ModelFunction(), BaseFCN::Data(), x, i, g);
128 virtual void Gradient(
const double *x,
double *g)
const {
130 FitUtil::Evaluate<typename BaseFCN::T>::EvalLogLGradient(BaseFCN::ModelFunction(), BaseFCN::Data(), x, g,
131 fNEffPoints, fExecutionPolicy);
135 virtual typename BaseObjFunction::Type_t Type()
const {
return BaseObjFunction::kLogLikelihood; }
140 void UseSumOfWeightSquare(
bool on =
true) {
141 if (fWeight == 0)
return;
156 virtual double DoEval (
const double * x)
const {
157 this->UpdateNCalls();
158 return FitUtil::Evaluate<T>::EvalLogL(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fWeight, fIsExtended, fNEffPoints, fExecutionPolicy);
162 virtual double DoDerivative(
const double * x,
unsigned int icoord )
const {
163 Gradient(x, &fGrad[0]);
164 return fGrad[icoord];
173 mutable unsigned int fNEffPoints;
175 mutable std::vector<double> fGrad;
177 ::ROOT::Fit::ExecutionPolicy fExecutionPolicy;
181 typedef LogLikelihoodFCN<ROOT::Math::IMultiGenFunction, ROOT::Math::IParamMultiFunction> LogLikelihoodFunction;
182 typedef LogLikelihoodFCN<ROOT::Math::IMultiGradFunction, ROOT::Math::IParamMultiFunction> LogLikelihoodGradFunction;