13 #ifndef ROOT_Math_OneDimFunctionAdapter
14 #define ROOT_Math_OneDimFunctionAdapter
28 template<
class MultiFuncType>
29 struct EvaluatorOneDim {
31 static double F (MultiFuncType f,
const double * x,
const double * = 0 ) {
37 struct EvaluatorOneDim< const ROOT::Math::IParamMultiFunction &> {
38 static double F (
const ROOT::Math::IParamMultiFunction & f,
const double * x,
const double * p = 0 ) {
55 template <
class MultiFuncType = const ROOT::Math::IMultiGenFunction &>
56 class OneDimMultiFunctionAdapter :
public ROOT::Math::IGenFunction {
65 OneDimMultiFunctionAdapter (MultiFuncType f,
const double * x,
unsigned int icoord =0,
const double * p = 0 ) :
67 fX( const_cast<double *>(x) ),
81 OneDimMultiFunctionAdapter (MultiFuncType f,
unsigned int dim = 1,
unsigned int icoord =0,
const double * p = 0 ) :
95 virtual ~OneDimMultiFunctionAdapter () {
if (fOwn && fX)
delete [] fX; }
100 virtual OneDimMultiFunctionAdapter * Clone( )
const {
102 OneDimMultiFunctionAdapter * f =
new OneDimMultiFunctionAdapter( fFunc, fDim, fCoord, fParams);
103 std::copy(fX, fX+fDim, f->fX);
107 return new OneDimMultiFunctionAdapter( fFunc, fX, fCoord, fParams);
116 template<
class Iterator>
117 void SetX(Iterator begin, Iterator end) {
118 if (fOwn) std::copy(begin, end, fX);
125 void SetX(
double * x) {
132 void SetX(
const double * x) {
133 if (fOwn) std::copy(x, x+fDim, fX);
135 SetX( const_cast<double *>(x) );
139 void SetCoord(
int icoord) { fCoord=icoord;}
142 OneDimMultiFunctionAdapter(
const OneDimMultiFunctionAdapter & rhs) :
144 fParams(rhs.fParams),
150 fX =
new double[fDim];
151 std::copy( rhs.fX, rhs.fX+fDim, fX);
160 OneDimMultiFunctionAdapter & operator= (
const OneDimMultiFunctionAdapter & rhs) {
161 if (
this == &rhs)
return *
this;
169 double DoEval(
double x)
const {
172 return EvaluatorOneDim<MultiFuncType>::F( fFunc, fX, fParams );
178 double xprev = fX[fCoord];
180 double y = EvaluatorOneDim<MultiFuncType>::F( fFunc, fX, fParams );
192 const double * fParams;
212 template <
class ParamFuncType = ROOT::Math::IParamMultiFunction &>
213 class OneDimParamFunctionAdapter :
public ROOT::Math::IGenFunction {
221 OneDimParamFunctionAdapter (ParamFuncType f,
const double * x,
const double * p,
unsigned int ipar =0 ) :
228 assert(fParams != 0);
234 ~OneDimParamFunctionAdapter () {}
239 virtual OneDimParamFunctionAdapter * Clone( )
const {
240 return new OneDimParamFunctionAdapter(fFunc, fX, fParams, fIpar);
251 double DoEval(
double x)
const {
253 double * p =
const_cast<double *
>(fParams);
254 double pprev = fParams[fIpar];
256 double y = fFunc( fX, p );
266 const double * fParams;