13 #ifndef ROOT_Math_IParamFunction
14 #define ROOT_Math_IParamFunction
56 virtual ~IBaseParam() {}
62 virtual const double *Parameters()
const = 0;
71 virtual void SetParameters(
const double *p) = 0;
77 virtual unsigned int NPar()
const = 0;
83 virtual std::string ParameterName(
unsigned int i)
const
86 return "Par_" + Util::ToString(i);
104 class IParametricFunctionMultiDimTempl:
virtual public IBaseFunctionMultiDimTempl<T>,
105 virtual public IBaseParam {
108 typedef IBaseFunctionMultiDimTempl<T> BaseFunc;
120 T operator()(
const T *x,
const double *p)
const
122 return DoEvalPar(x, p);
125 T operator()(
const T *x)
const
135 virtual T DoEvalPar(
const T *x,
const double *p)
const = 0;
140 virtual T DoEval(
const T *x)
const
142 return DoEvalPar(x, Parameters());
156 class IParametricFunctionOneDim :
157 virtual public IBaseFunctionOneDim,
163 typedef IBaseFunctionOneDim BaseFunc;
166 using BaseFunc::operator();
175 double operator()(
double x,
const double *p)
const
177 return DoEvalPar(x, p);
184 double operator()(
const double *x,
const double *p)
const
186 return DoEvalPar(*x, p);
195 virtual double DoEvalPar(
double x,
const double *p)
const = 0;
200 virtual double DoEval(
double x)
const
202 return DoEvalPar(x, Parameters());
224 class IParametricGradFunctionMultiDimTempl:
virtual public IParametricFunctionMultiDimTempl<T>,
virtual public IBaseParam {
227 using BaseParamFunc = IParametricFunctionMultiDimTempl<T>;
228 using BaseGradFunc = IGradientFunctionMultiDimTempl<T>;
229 using BaseFunc =
typename IParametricFunctionMultiDimTempl<T>::BaseFunc;
235 virtual ~IParametricGradFunctionMultiDimTempl() {}
240 T operator()(
const T *x,
const double *p)
const
242 return DoEvalPar(x, p);
245 T operator()(
const T *x)
const
254 virtual void ParameterGradient(
const T *x,
const double *p, T *grad)
const
256 unsigned int npar = NPar();
257 for (
unsigned int ipar = 0; ipar < npar; ++ipar)
258 grad[ipar] = DoParameterDerivative(x, p, ipar);
264 T ParameterDerivative(
const T *x,
const double *p,
unsigned int ipar = 0)
const
266 return DoParameterDerivative(x, p, ipar);
272 void ParameterGradient(
const T *x, T *grad)
const {
return ParameterGradient(x, Parameters(), grad); }
276 T ParameterDerivative(
const T *x,
unsigned int ipar = 0)
const
278 return DoParameterDerivative(x, Parameters() , ipar);
286 virtual T DoParameterDerivative(
const T *x,
const double *p,
unsigned int ipar)
const = 0;
287 virtual T DoEvalPar(
const T *x,
const double *p)
const = 0;
288 virtual T DoEval(
const T *x)
const
290 return DoEvalPar(x, Parameters());
308 class IParametricGradFunctionOneDim :
309 public IParametricFunctionOneDim
315 typedef IParametricFunctionOneDim BaseParamFunc;
316 typedef IGradientFunctionOneDim BaseGradFunc;
317 typedef IParametricFunctionOneDim::BaseFunc BaseFunc;
323 virtual ~IParametricGradFunctionOneDim() {}
326 using BaseParamFunc::operator();
332 virtual void ParameterGradient(
double x ,
const double *p,
double *grad)
const
334 unsigned int npar = NPar();
335 for (
unsigned int ipar = 0; ipar < npar; ++ipar)
336 grad[ipar] = DoParameterDerivative(x, p, ipar);
342 void ParameterGradient(
double x ,
double *grad)
const
344 return ParameterGradient(x, Parameters(), grad);
350 void ParameterGradient(
const double *x ,
const double *p,
double *grad)
const
352 ParameterGradient(*x, p, grad);
358 void ParameterGradient(
const double *x ,
double *grad)
const
360 return ParameterGradient(*x, Parameters(), grad);
367 double ParameterDerivative(
double x,
const double *p,
unsigned int ipar = 0)
const
369 return DoParameterDerivative(x, p, ipar);
375 double ParameterDerivative(
double x,
unsigned int ipar = 0)
const
377 return DoParameterDerivative(x, Parameters() , ipar);
384 double ParameterDerivative(
const double *x,
const double *p,
unsigned int ipar = 0)
const
386 return DoParameterDerivative(*x, p, ipar);
393 double ParameterDerivative(
const double *x,
unsigned int ipar = 0)
const
395 return DoParameterDerivative(*x, Parameters() , ipar);
406 virtual double DoParameterDerivative(
double x,
const double *p,
unsigned int ipar)
const = 0;