Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 34 additions & 11 deletions hist/hist/inc/TF1.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,10 @@
#include "TAttFill.h"
#include "TAttMarker.h"
#include "TMath.h"

#include "Math/Math_vectypes.hxx"
#include "Math/ParamFunctor.h"


class TF1;
class TH1;
class TAxis;
Expand Down Expand Up @@ -250,15 +251,16 @@ class TF1 : public TNamed, public TAttLine, public TAttFill, public TAttMarker {
Bool_t fNormalized; //Normalization option (false by default)
Double_t fNormIntegral;//Integral of the function before being normalized
TF1FunctorPointer *fFunctor = nullptr; //! Functor object to wrap any C++ callable object
TF1FunctionPointer *fFunctp = nullptr; //! Pointer to vectorized function
TFormula *fFormula; //Pointer to TFormula in case when user define formula
TF1Parameters *fParams; //Pointer to Function parameters object (exusts only for not-formula functions)

public:

template<class T>
struct TF1FunctionPointerImpl: TF1FunctionPointer {
TF1FunctionPointerImpl(const std::function<T(const T *f, const Double_t *param)> &&func): fimpl(func) {};
std::function<T(const T *f, const Double_t *param)> fimpl;
TF1FunctionPointerImpl(const std::function<T(const T *f, const Double_t *param)> &&func) : fImpl(func){};
std::function<T(const T *f, const Double_t *param)> fImpl;
};


Expand All @@ -272,7 +274,6 @@ class TF1 : public TNamed, public TAttLine, public TAttFill, public TAttMarker {



TF1FunctionPointer *fFunctp = nullptr; //!Pointer to vectorized function

static std::atomic<Bool_t> fgAbsValue; //use absolute value of function when computing integral
static Bool_t fgRejectPoint; //True if point must be rejected in a fit
Expand Down Expand Up @@ -466,6 +467,9 @@ class TF1 : public TNamed, public TAttLine, public TAttFill, public TAttMarker {
virtual Double_t EvalPar(const Double_t *x, const Double_t *params = 0);
template<class T> T EvalPar(const T *x, const Double_t *params = 0);
template<class T> T EvalParVec(const T *data, const Double_t *params = 0);
#ifdef R__HAS_VECCORE
inline double EvalParVec(const Double_t *data, const Double_t *params);
#endif
virtual Double_t operator()(Double_t x, Double_t y = 0, Double_t z = 0, Double_t t = 0) const;
virtual Double_t operator()(const Double_t *x, const Double_t *params = 0);
template<class T> T operator()(const T *data, const Double_t *params);
Expand Down Expand Up @@ -814,19 +818,38 @@ T TF1::EvalPar(const T *x, const Double_t *params)
template<class T>
inline T TF1::EvalParVec(const T *data, const Double_t *params)
{
// if (fType != 3) {
// //This should throw an error
// return TF1::EvalPar((double *) data, params);
// }
assert(fType == 3);
if (fFunctor != nullptr)
assert(fType == 3);
if (!params) params = (Double_t *)fParams->GetParameters();
if (fFunctor)
return ((TF1FunctorPointerImpl<T> *)fFunctor)->fImpl(data, params);

if (fFunctp)
return ((TF1FunctionPointerImpl<T> *)fFunctp)->fImpl(data, params);

// this should throw an error
// we nned to implement a vectorized GetSave(x)
return TMath::SignalingNaN();
return TMath::SignalingNaN();
}

#ifdef R__HAS_VECCORE
inline double TF1::EvalParVec(const Double_t *data, const Double_t *params)
{
assert(fType == 3);
ROOT::Double_v d, res;

d = *data;

if (fFunctor) {
res = ((TF1FunctorPointerImpl<ROOT::Double_v> *)fFunctor)->fImpl(&d, params);
} else if (fFunctp) {
res = ((TF1FunctionPointerImpl<ROOT::Double_v> *)fFunctp)->fImpl(&d, params);
} else {
// res = GetSave(x);
return TMath::SignalingNaN();
}
return vecCore::Get<ROOT::Double_v>(res, 0);
}
#endif

inline void TF1::SetRange(Double_t xmin, Double_t, Double_t xmax, Double_t)
{
Expand Down
4 changes: 2 additions & 2 deletions hist/hist/src/HFitImpl.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ TFitResultPtr HFit::Fit(FitObject * h1, TF1 *f1 , Foption_t & fitOption , const
fitConfig.SetWeightCorrection(weight);
bool extended = ((fitOption.Like & 4 ) != 4 );
//if (!extended) Info("HFitImpl","Do a not -extended binned fit");
fitok = fitter->LikelihoodFit(*fitdata, extended);
fitok = fitter->LikelihoodFit(*fitdata, extended, fitOption.ExecPolicy);
}
else{ // standard least square fit
fitok = fitter->Fit(*fitdata, fitOption.ExecPolicy);
Expand Down Expand Up @@ -893,7 +893,7 @@ TFitResultPtr ROOT::Fit::UnBinFit(ROOT::Fit::UnBinData * data, TF1 * fitfunc, Fo
bool extended = (fitOption.Like & 1) == 1;

bool fitok = false;
fitok = fitter->LikelihoodFit(fitdata, extended);
fitok = fitter->LikelihoodFit(fitdata, extended, fitOption.ExecPolicy);
if ( !fitok && !fitOption.Quiet )
Warning("UnBinFit","Abnormal termination of minimization.");

Expand Down
2 changes: 1 addition & 1 deletion hist/hist/src/TF1.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -1259,7 +1259,7 @@ Double_t TF1::EvalPar(const Double_t *x, const Double_t *params)
}

if (fType == 3) {
if (fFunctor) {
if (fFunctor || fFunctp) {
if (params) result = EvalParVec(x, params);
else result = EvalParVec(x, (Double_t *) fParams->GetParameters());
}
Expand Down
14 changes: 0 additions & 14 deletions math/mathcore/inc/Fit/Chi2FCN.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,21 +120,13 @@ class Chi2FCN : public BasicFCN<DerivFunType, ModelFunType, BinData> {
/// i-th chi-square residual
virtual double DataElement(const double *x, unsigned int i, double *g) const {
if (i==0) this->UpdateNCalls();
#ifdef R__HAS_VECCORE
return FitUtil::Evaluate<T>::EvalChi2Residual(BaseFCN::ModelFunction(), BaseFCN::Data(), x, i, g);
#else
return FitUtil::EvaluateChi2Residual(BaseFCN::ModelFunction(), BaseFCN::Data(), x, i, g);
#endif
}

// need to be virtual to be instantiated
virtual void Gradient(const double *x, double *g) const {
// evaluate the chi2 gradient
#ifdef R__HAS_VECCORE
FitUtil::Evaluate<T>::EvalChi2Gradient(BaseFCN::ModelFunction(), BaseFCN::Data(), x, g, fNEffPoints);
#else
FitUtil::EvaluateChi2Gradient(BaseFCN::ModelFunction(), BaseFCN::Data(), x, g, fNEffPoints);
#endif
}

/// get type of fit method function
Expand All @@ -154,15 +146,9 @@ class Chi2FCN : public BasicFCN<DerivFunType, ModelFunType, BinData> {
virtual double DoEval (const double * x) const {
this->UpdateNCalls();
if (BaseFCN::Data().HaveCoordErrors() || BaseFCN::Data().HaveAsymErrors())
#ifdef R__HAS_VECCORE
return FitUtil::Evaluate<T>::EvalChi2Effective(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints);
else
return FitUtil::Evaluate<T>::EvalChi2(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints, fExecutionPolicy);
#else
return FitUtil::EvaluateChi2Effective(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints);
else
return FitUtil::EvaluateChi2(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints, fExecutionPolicy);
#endif
}

// for derivatives
Expand Down
Loading