13 #ifndef ROOT_Math_WrappedParamFunction
14 #define ROOT_Math_WrappedParamFunction
29 typedef double( * FreeParamMultiFunctionPtr ) (
const double *,
const double * );
40 template<
typename FuncPtr = FreeParamMultiFunctionPtr >
41 class WrappedParamFunction :
public IParamMultiFunction {
49 WrappedParamFunction (FuncPtr func,
unsigned int dim = 1,
unsigned int npar = 0,
double * par = 0) :
52 fParams(std::vector<double>(npar) )
54 if (par != 0) std::copy(par,par+npar,fParams.begin() );
74 template<
class Iterator>
75 WrappedParamFunction (FuncPtr func,
unsigned int dim, Iterator begin, Iterator end) :
78 fParams(std::vector<double>(begin,end) )
93 IMultiGenFunction * Clone()
const {
94 return new WrappedParamFunction(fFunc, fDim, fParams.begin(), fParams.end());
97 const double * Parameters()
const {
98 return fParams.empty() ?
nullptr : &fParams.front();
101 void SetParameters(
const double * p) {
102 std::copy(p, p+NPar(), fParams.begin() );
105 unsigned int NPar()
const {
return fParams.size(); }
107 unsigned int NDim()
const {
return fDim; }
113 double DoEvalPar(
const double * x,
const double * p)
const {
114 return (*fFunc)( x, p );
120 std::vector<double> fParams;
127 typedef double( * FreeMultiFunctionPtr ) (
const double *);
139 template<
typename FuncPtr = FreeMultiFunctionPtr >
140 class WrappedParamFunctionGen :
public IParamMultiFunction {
149 WrappedParamFunctionGen (
const FuncPtr & func,
unsigned int dim,
unsigned int npar,
const double * par,
const unsigned int * idx) :
152 fParams(std::vector<double>(par,par+npar) ),
153 fParIndices(std::vector<unsigned int>(idx, idx + npar) ),
154 fX(std::vector<double>(npar+dim) )
163 WrappedParamFunctionGen (FuncPtr & func,
unsigned int dim,
unsigned int npar,
const double * par,
const unsigned int * idx) :
166 fParams(std::vector<double>(par,par+npar) ),
167 fParIndices(std::vector<unsigned int>(idx, idx + npar) ),
168 fX(std::vector<double>(npar+dim) )
174 IMultiGenFunction * Clone()
const {
175 return new WrappedParamFunctionGen(fFunc, fDim, fParams.size(), fParams.empty() ?
nullptr : &fParams.front(), fParIndices.empty() ?
nullptr : &fParIndices.front());
180 WrappedParamFunctionGen(
const WrappedParamFunctionGen &);
181 WrappedParamFunctionGen & operator=(
const WrappedParamFunctionGen &);
185 const double * Parameters()
const {
186 return fParams.empty() ?
nullptr : &fParams.front();
189 void SetParameters(
const double * p) {
190 unsigned int npar = NPar();
191 std::copy(p, p+ npar, fParams.begin() );
192 SetParValues(npar, p);
195 unsigned int NPar()
const {
return fParams.size(); }
197 unsigned int NDim()
const {
return fDim; }
210 double DoEval(
const double * x)
const {
220 for (
unsigned int i = 0; i < fDim; ++i) {
221 unsigned int j = fVarIndices[i];
222 assert ( j < NPar() + fDim);
230 return (*fFunc)( fX.empty() ?
nullptr : &fX.front() );
237 double DoEvalPar(
const double * x,
const double * p )
const {
238 SetParValues(NPar(), p);
245 fVarIndices.reserve(fDim);
246 unsigned int npar = NPar();
247 for (
unsigned int i = 0; i < npar + fDim; ++i) {
249 for (
unsigned int j = 0; j < npar; ++j) {
250 if (fParIndices[j] == i) {
255 if (isVar) fVarIndices.push_back(i);
257 assert ( fVarIndices.size() == fDim);
267 SetParValues(npar, fParams.empty() ?
nullptr : &fParams.front());
268 for (
unsigned int i = 0; i < npar; ++i) {
269 unsigned int j = fParIndices[i];
270 assert ( j < npar + fDim);
278 void SetParValues(
unsigned int npar,
const double * p)
const {
279 for (
unsigned int i = 0; i < npar; ++i) {
280 unsigned int j = fParIndices[i];
281 assert ( j < npar + fDim);
287 mutable FuncPtr fFunc;
289 std::vector<double> fParams;
290 std::vector<unsigned int> fVarIndices;
291 std::vector<unsigned int> fParIndices;
292 mutable std::vector<double> fX;