14 #ifndef ROOT_Math_MinimTransformFunction
15 #define ROOT_Math_MinimTransformFunction
39 class MinimTransformFunction :
public IMultiGradFunction {
43 typedef ROOT::Math::IMultiGradFunction BaseGradFunc;
44 typedef ROOT::Math::IMultiGradFunction::BaseFunc BaseFunc;
53 MinimTransformFunction (
const IMultiGradFunction * f,
const std::vector<ROOT::Math::EMinimVariableType> & types,
const std::vector<double> & values,
54 const std::map<
unsigned int, std::pair<double, double> > & bounds);
60 ~MinimTransformFunction () {
61 if (fFunc)
delete fFunc;
67 unsigned int NDim()
const {
return fIndex.size(); }
69 unsigned int NTot()
const {
return fFunc->NDim(); }
72 IMultiGenFunction * Clone()
const {
79 const double * Transformation(
const double * x)
const {
80 Transformation(x, &fX[0]);
86 void Transformation(
const double * xint,
double * xext)
const;
89 void InvTransformation(
const double * xext,
double * xint)
const;
92 void InvStepTransformation(
const double * x,
const double * sext,
double * sint)
const;
95 void GradientTransformation(
const double * x,
const double *gExt,
double * gInt)
const;
99 void MatrixTransformation(
const double * x,
const double *covInt,
double * covExt)
const;
102 const IMultiGradFunction *OriginalFunction()
const {
return fFunc; }
108 virtual double DoEval(
const double * x)
const {
109 #ifndef DO_THREADSAFE
110 return (*fFunc)(Transformation(x));
112 std::vector<double> xext(fVariables.size() );
113 Transformation(x, &xext[0]);
114 return (*fFunc)(&xext[0]);
119 virtual double DoDerivative (
const double * x,
unsigned int icoord )
const {
120 const MinimTransformVariable & var = fVariables[ fIndex[icoord] ];
121 double dExtdInt = (var.IsLimited() ) ? var.DerivativeIntToExt( x[icoord] ) : 1.0;
122 double deriv = fFunc->Derivative( Transformation(x) , fIndex[icoord] );
124 return deriv * dExtdInt;
128 MinimTransformFunction(
const MinimTransformFunction & ) :
129 BaseFunc(), BaseGradFunc()
133 MinimTransformFunction & operator= (
const MinimTransformFunction & ) {
141 mutable std::vector<double> fX;
142 std::vector<MinimTransformVariable> fVariables;
143 std::vector<unsigned int> fIndex;
144 const IMultiGradFunction * fFunc;