18 #ifndef ROOT_Math_IFunction
19 #define ROOT_Math_IFunction
62 class IBaseFunctionMultiDimTempl {
66 typedef T BackendType;
67 typedef IBaseFunctionMultiDimTempl<T> BaseFunc;
70 IBaseFunctionMultiDimTempl() {}
75 virtual ~IBaseFunctionMultiDimTempl() {}
81 virtual IBaseFunctionMultiDimTempl<T> *Clone()
const = 0;
86 virtual unsigned int NDim()
const = 0;
92 T operator()(
const T *x)
const
102 template <
class Iterator>
103 T operator()(
const Iterator it)
const
105 return DoEval(&(*it));
116 virtual T DoEval(
const T *x)
const = 0;
135 class IBaseFunctionOneDim {
139 typedef IBaseFunctionOneDim BaseFunc;
141 IBaseFunctionOneDim() {}
146 virtual ~IBaseFunctionOneDim() {}
152 virtual IBaseFunctionOneDim *Clone()
const = 0;
158 double operator()(
double x)
const
167 double operator()(
const double *x)
const
179 virtual double DoEval(
double x)
const = 0;
201 class IGradientMultiDimTempl {
206 virtual ~IGradientMultiDimTempl() {}
212 virtual void Gradient(
const T *x, T *grad)
const = 0;
217 T Derivative(
const T *x,
unsigned int icoord = 0)
const {
return DoDerivative(x, icoord); }
226 virtual void FdF(
const T *x, T &f, T *df)
const = 0;
234 virtual T DoDerivative(
const T *x,
unsigned int icoord)
const = 0;
247 class IGradientOneDim {
252 virtual ~IGradientOneDim() {}
258 double Derivative(
double x)
const
260 return DoDerivative(x);
271 virtual void FdF(
double x,
double &f,
double &df)
const = 0;
277 double Derivative(
const double *x)
const
279 return DoDerivative(*x);
285 void Gradient(
const double *x,
double *g)
const
287 g[0] = DoDerivative(*x);
293 void FdF(
const double *x,
double &f,
double *df)
const
306 virtual double DoDerivative(
double x)
const = 0;
326 class IGradientFunctionMultiDimTempl :
virtual public IBaseFunctionMultiDimTempl<T>,
327 public IGradientMultiDimTempl<T> {
330 typedef IBaseFunctionMultiDimTempl<T> BaseFunc;
331 typedef IGradientMultiDimTempl<T> BaseGrad;
336 virtual ~IGradientFunctionMultiDimTempl() {}
342 virtual void Gradient(
const T *x, T *grad)
const
344 unsigned int ndim = NDim();
345 for (
unsigned int icoord = 0; icoord < ndim; ++icoord)
346 grad[icoord] = BaseGrad::Derivative(x, icoord);
349 using BaseFunc::NDim;
357 virtual void FdF(
const T *x, T &f, T *df)
const
359 f = BaseFunc::operator()(x);
381 class IGradientFunctionOneDim :
382 virtual public IBaseFunctionOneDim ,
383 public IGradientOneDim {
388 typedef IBaseFunctionOneDim BaseFunc;
389 typedef IGradientOneDim BaseGrad;
395 virtual ~IGradientFunctionOneDim() {}
405 virtual void FdF(
double x,
double &f,
double &df)
const