File indexing completed on 2025-01-18 10:10:20
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef ROOT_Math_MultiDimParamFunctionAdapter
0014 #define ROOT_Math_MultiDimParamFunctionAdapter
0015
0016 #include "Math/IFunction.h"
0017 #include "Math/IParamFunction.h"
0018
0019 #include "Math/WrappedFunction.h"
0020
0021 namespace ROOT {
0022
0023 namespace Math {
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 class MultiDimParamFunctionAdapter : public IParametricFunctionMultiDimTempl<double> {
0042
0043 public:
0044
0045 typedef IParamMultiFunction::BaseFunc BaseFunc;
0046
0047
0048
0049
0050
0051
0052 MultiDimParamFunctionAdapter(const IParamFunction &f) :
0053 fOwn(true)
0054 {
0055 fFunc = dynamic_cast<IParamFunction *>(f.Clone());
0056 }
0057
0058
0059
0060
0061
0062 MultiDimParamFunctionAdapter(IParamFunction &f) :
0063 fOwn(false),
0064 fFunc(&f)
0065 { }
0066
0067
0068
0069
0070
0071 MultiDimParamFunctionAdapter(const MultiDimParamFunctionAdapter &rhs) :
0072 BaseFunc(),
0073 IParamMultiFunction(),
0074 fOwn(rhs.fOwn),
0075 fFunc(nullptr)
0076 {
0077 if (fOwn)
0078 fFunc = dynamic_cast<IParamFunction *>((rhs.fFunc)->Clone());
0079 }
0080
0081
0082
0083
0084 ~MultiDimParamFunctionAdapter() override
0085 {
0086 if (fOwn && fFunc) delete fFunc;
0087 }
0088
0089
0090
0091
0092
0093 MultiDimParamFunctionAdapter &operator=(const MultiDimParamFunctionAdapter &rhs)
0094 {
0095 fOwn = rhs.fOwn;
0096 if (fOwn) {
0097 if (fFunc) delete fFunc;
0098 fFunc = dynamic_cast<IParamFunction *>((rhs.fFunc)->Clone());
0099 } else
0100 fFunc = rhs.fFunc;
0101
0102 return *this;
0103 }
0104
0105
0106
0107
0108 BaseFunc *Clone() const override
0109 {
0110 return new MultiDimParamFunctionAdapter(*this);
0111 }
0112
0113 public:
0114
0115
0116 const double *Parameters() const override
0117 {
0118 return fFunc->Parameters();
0119 }
0120
0121 void SetParameters(const double *p) override
0122 {
0123 fFunc->SetParameters(p);
0124 }
0125
0126 unsigned int NPar() const override
0127 {
0128 return fFunc->NPar();
0129 }
0130
0131 unsigned int NDim() const override
0132 {
0133 return 1;
0134 }
0135
0136
0137 private:
0138
0139
0140 double DoEvalPar(const double *x, const double *p) const override
0141 {
0142 return (*fFunc)(*x, p);
0143 }
0144
0145
0146 private:
0147
0148 bool fOwn;
0149 IParamFunction *fFunc;
0150
0151 };
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172 class MultiDimParamGradFunctionAdapter : public IParamMultiGradFunction {
0173
0174 public:
0175
0176 typedef IParamMultiGradFunction::BaseFunc BaseFunc;
0177
0178
0179
0180
0181
0182
0183 MultiDimParamGradFunctionAdapter(const IParamGradFunction &f) :
0184 fOwn(true)
0185 {
0186 fFunc = dynamic_cast<IParamGradFunction *>(f.Clone());
0187 }
0188
0189
0190
0191
0192
0193 MultiDimParamGradFunctionAdapter(IParamGradFunction &f) :
0194 fOwn(false),
0195 fFunc(&f)
0196 { }
0197
0198
0199
0200
0201
0202 MultiDimParamGradFunctionAdapter(const MultiDimParamGradFunctionAdapter &rhs) :
0203 BaseFunc(),
0204 IParamMultiGradFunction(),
0205 fOwn(rhs.fOwn),
0206 fFunc(rhs.fFunc)
0207 {
0208 if (fOwn)
0209 fFunc = dynamic_cast<IParamGradFunction *>((rhs.fFunc)->Clone());
0210 }
0211
0212
0213
0214
0215 ~MultiDimParamGradFunctionAdapter() override
0216 {
0217 if (fOwn && fFunc) delete fFunc;
0218 }
0219
0220
0221
0222
0223
0224 MultiDimParamGradFunctionAdapter &operator=(const MultiDimParamGradFunctionAdapter &rhs)
0225 {
0226 fOwn = rhs.fOwn;
0227 if (fOwn) {
0228 if (fFunc) delete fFunc;
0229 fFunc = dynamic_cast<IParamGradFunction *>((rhs.fFunc)->Clone());
0230 } else
0231 fFunc = rhs.fFunc;
0232
0233 return *this;
0234 }
0235
0236
0237
0238
0239 BaseFunc *Clone() const override
0240 {
0241 return new MultiDimParamGradFunctionAdapter(*this);
0242 }
0243
0244 public:
0245
0246
0247 const double *Parameters() const override
0248 {
0249 return fFunc->Parameters();
0250 }
0251
0252 void SetParameters(const double *p) override
0253 {
0254 fFunc->SetParameters(p);
0255 }
0256
0257 unsigned int NPar() const override
0258 {
0259 return fFunc->NPar();
0260 }
0261
0262 unsigned int NDim() const override
0263 {
0264 return 1;
0265 }
0266
0267
0268
0269
0270
0271 void ParameterGradient(const double *x, const double *p, double *grad) const override
0272 {
0273 fFunc->ParameterGradient(*x, p, grad);
0274 }
0275
0276
0277
0278 private:
0279
0280
0281 double DoEvalPar(const double *x, const double *p) const override
0282 {
0283 return (*fFunc)(*x, p);
0284 }
0285
0286
0287
0288
0289
0290 double DoParameterDerivative(const double *x, const double *p, unsigned int ipar) const override
0291 {
0292 return fFunc->ParameterDerivative(*x, p, ipar);
0293 }
0294
0295 private:
0296
0297 bool fOwn;
0298 IParamGradFunction *fFunc;
0299
0300 };
0301
0302
0303
0304
0305 }
0306
0307 }
0308
0309
0310 #endif