26 class TFormulaFunction
34 const char * GetName()
const {
return fName.Data(); }
35 const char * GetBody()
const {
return fBody.Data(); }
36 Int_t GetNargs()
const {
return fNargs;}
37 Bool_t IsFuncCall()
const {
return fFuncCall;}
39 TFormulaFunction(
const TString &name,
const TString &body,
int numArgs)
40 : fName(name),fBody(body),fNargs(numArgs),fFound(false),fFuncCall(true) {}
41 TFormulaFunction(
const TString& name)
42 : fName(name),fBody(
""),fNargs(0),fFound(false),fFuncCall(false){}
43 Bool_t operator<(
const TFormulaFunction &rhv)
const
46 if ( fName.Length() < rhv.fName.Length() )
48 else if ( fName.Length() > rhv.fName.Length() )
51 return fName < rhv.fName && fBody < rhv.fBody;
53 Bool_t operator==(
const TFormulaFunction &rhv)
const
55 return fName == rhv.fName && fBody == rhv.fBody && fNargs == rhv.fNargs;
59 class TFormulaVariable
66 const char * GetName()
const {
return fName.Data(); }
67 Double_t GetInitialValue()
const {
return fValue; }
68 Int_t GetArrayPos()
const {
return fArrayPos; }
69 TFormulaVariable():fName(
""),fValue(-1),fArrayPos(-1),fFound(false){}
70 TFormulaVariable(
const TString &name, Double_t value, Int_t pos)
71 : fName(name), fValue(value), fArrayPos(pos),fFound(false) {}
72 Bool_t operator<(
const TFormulaVariable &rhv)
const
74 return fName < rhv.fName;
78 struct TFormulaParamOrder {
79 bool operator() (
const TString& a,
const TString& b)
const;
83 class TFormula :
public TNamed
90 std::vector<Double_t> fClingVariables;
91 std::vector<Double_t> fClingParameters;
92 Bool_t fReadyToExecute;
93 Bool_t fClingInitialized;
94 Bool_t fAllParametersSetted;
95 Bool_t fLazyInitialization = kFALSE;
97 std::unique_ptr<TMethodCall> fGradMethod;
99 std::string fSavedInputFormula;
101 using CallFuncSignature = TInterpreter::CallFuncIFacePtr_t::Generic_t;
102 std::string fGradGenerationInput;
103 CallFuncSignature fFuncPtr =
nullptr;
104 CallFuncSignature fGradFuncPtr =
nullptr;
105 void * fLambdaPtr =
nullptr;
106 static bool fIsCladRuntimeIncluded;
108 void InputFormulaIntoCling();
109 Bool_t PrepareEvalMethod();
111 void HandlePolN(TString &formula);
112 void HandleParametrizedFunctions(TString &formula);
113 void HandleParamRanges(TString &formula);
114 void HandleFunctionArguments(TString &formula);
115 void HandleExponentiation(TString &formula);
116 void HandleLinear(TString &formula);
117 Bool_t InitLambdaExpression(
const char * formula);
118 static Bool_t IsDefaultVariableName(
const TString &name);
119 void ReplaceAllNames(TString &formula, std::map<TString, TString> &substitutions);
120 void FillParametrizedFunctions(std::map<std::pair<TString, Int_t>, std::pair<TString, TString>> &functions);
121 void FillVecFunctionsShurtCuts();
122 void ReInitializeEvalMethod();
123 std::string GetGradientFuncName()
const {
124 assert(fClingName.Length() &&
"TFormula is not initialized yet!");
125 return std::string(fClingName.Data()) +
"_grad";
127 bool HasGradientGenerationFailed()
const {
128 return !fGradMethod && !fGradGenerationInput.empty();
133 std::list<TFormulaFunction> fFuncs;
134 std::map<TString,TFormulaVariable> fVars;
135 std::map<TString,Int_t,TFormulaParamOrder> fParams;
136 std::map<TString,Double_t> fConsts;
137 std::map<TString,TString> fFunctionsShortcuts;
142 std::vector<TObject*> fLinearParts;
143 Bool_t fVectorized =
false;
146 static Bool_t IsOperator(
const char c);
147 static Bool_t IsBracket(
const char c);
148 static Bool_t IsFunctionNameChar(
const char c);
149 static Bool_t IsScientificNotation(
const TString & formula,
int ipos);
150 static Bool_t IsHexadecimal(
const TString & formula,
int ipos);
151 static Bool_t IsAParameterName(
const TString & formula,
int ipos);
152 void ExtractFunctors(TString &formula);
153 void PreProcessFormula(TString &formula);
154 void ProcessFormula(TString &formula);
155 Bool_t PrepareFormula(TString &formula);
156 void ReplaceParamName(TString &formula,
const TString & oldname,
const TString & name);
157 void DoAddParameter(
const TString &name, Double_t value,
bool processFormula);
158 void DoSetParameters(
const Double_t * p, Int_t size);
159 void SetPredefinedParamNames();
161 Double_t DoEval(
const Double_t * x,
const Double_t * p =
nullptr)
const;
162 #ifdef R__HAS_VECCORE
163 ROOT::Double_v DoEvalVec(
const ROOT::Double_v *x,
const Double_t *p =
nullptr)
const;
169 kNotGlobal = BIT(10),
170 kNormalized = BIT(14),
174 using GradientStorage = std::vector<Double_t>;
178 TFormula& operator=(
const TFormula &rhs);
179 TFormula(
const char *name,
const char * formula =
"",
bool addToGlobList =
true,
bool vectorize =
false);
180 TFormula(
const char *name,
const char * formula,
int ndim,
int npar,
bool addToGlobList =
true);
181 TFormula(
const TFormula &formula);
184 void AddParameter(
const TString &name, Double_t value = 0) { DoAddParameter(name,value,
true); }
185 void AddVariable(
const TString &name, Double_t value = 0);
186 void AddVariables(
const TString *vars,
const Int_t size);
187 Int_t Compile(
const char *expression=
"");
188 virtual void Copy(TObject &f1)
const;
189 virtual void Clear(Option_t * option=
"");
190 Double_t Eval(Double_t x)
const;
191 Double_t Eval(Double_t x, Double_t y)
const;
192 Double_t Eval(Double_t x, Double_t y , Double_t z)
const;
193 Double_t Eval(Double_t x, Double_t y , Double_t z , Double_t t )
const;
194 Double_t EvalPar(
const Double_t *x,
const Double_t *params=0)
const;
198 bool GenerateGradientPar();
205 void GradientPar(
const Double_t *x, TFormula::GradientStorage& result);
207 void GradientPar(
const Double_t *x, Double_t *result);
212 T EvalPar(
const T *x,
const Double_t *params = 0)
const {
213 return EvalParVec(x, params);
215 #ifdef R__HAS_VECCORE
216 ROOT::Double_v EvalParVec(
const ROOT::Double_v *x,
const Double_t *params = 0)
const;
218 TString GetExpFormula(Option_t *option=
"")
const;
219 TString GetGradientFormula()
const;
220 const TObject *GetLinearPart(Int_t i)
const;
221 Int_t GetNdim()
const {
return fNdim;}
222 Int_t GetNpar()
const {
return fNpar;}
223 Int_t GetNumber()
const {
return fNumber; }
224 const char * GetParName(Int_t ipar)
const;
225 Int_t GetParNumber(
const char * name)
const;
226 Double_t GetParameter(
const char * name)
const;
227 Double_t GetParameter(Int_t param)
const;
228 Double_t* GetParameters()
const;
229 void GetParameters(Double_t *params)
const;
230 Double_t GetVariable(
const char *name)
const;
231 Int_t GetVarNumber(
const char *name)
const;
232 TString GetVarName(Int_t ivar)
const;
233 Bool_t IsValid()
const {
return fReadyToExecute && fClingInitialized; }
234 Bool_t IsVectorized()
const {
return fVectorized; }
235 Bool_t IsLinear()
const {
return TestBit(kLinear); }
236 void Print(Option_t *option =
"")
const;
237 void SetName(
const char* name);
238 void SetParameter(
const char* name, Double_t value);
239 void SetParameter(Int_t param, Double_t value);
240 void SetParameters(
const Double_t *params);
242 void SetParameters(Double_t p0,Double_t p1,Double_t p2=0,Double_t p3=0,Double_t p4=0,
243 Double_t p5=0,Double_t p6=0,Double_t p7=0,Double_t p8=0,
244 Double_t p9=0,Double_t p10=0);
245 void SetParName(Int_t ipar,
const char *name);
246 void SetParNames(
const char *name0=
"p0",
const char *name1=
"p1",
const char
247 *name2=
"p2",
const char *name3=
"p3",
const char
248 *name4=
"p4",
const char *name5=
"p5",
const char *name6=
"p6",
const char *name7=
"p7",
const char
249 *name8=
"p8",
const char *name9=
"p9",
const char *name10=
"p10");
250 void SetVariable(
const TString &name, Double_t value);
251 void SetVariables(
const std::pair<TString,Double_t> *vars,
const Int_t size);
252 void SetVectorized(Bool_t vectorized);
254 ClassDef(TFormula,12)