27 #ifndef ROOT_Math_GSLMultiMinimizer
28 #define ROOT_Math_GSLMultiMinimizer
30 #include "gsl/gsl_vector.h"
31 #include "gsl/gsl_multimin.h"
32 #include "gsl/gsl_version.h"
53 class GSLMultiMinimizer {
60 GSLMultiMinimizer (ROOT::Math::EGSLMinimizerType type) :
67 case ROOT::Math::kConjugateFR :
68 fType = gsl_multimin_fdfminimizer_conjugate_fr;
70 case ROOT::Math::kConjugatePR :
71 fType = gsl_multimin_fdfminimizer_conjugate_pr;
73 case ROOT::Math::kVectorBFGS :
74 fType = gsl_multimin_fdfminimizer_vector_bfgs;
76 case ROOT::Math::kVectorBFGS2 :
77 #if (GSL_MAJOR_VERSION > 1) || ((GSL_MAJOR_VERSION == 1) && (GSL_MINOR_VERSION >= 9))
79 fType = gsl_multimin_fdfminimizer_vector_bfgs2;
81 MATH_INFO_MSG(
"GSLMultiMinimizer",
"minimizer BFSG2 does not exist with this GSL version , use BFGS");
82 fType = gsl_multimin_fdfminimizer_vector_bfgs;
85 case ROOT::Math::kSteepestDescent:
86 fType = gsl_multimin_fdfminimizer_steepest_descent;
89 fType = gsl_multimin_fdfminimizer_conjugate_fr;
98 ~GSLMultiMinimizer () {
99 if (fMinimizer != 0 ) gsl_multimin_fdfminimizer_free(fMinimizer);
101 if (fVec != 0) gsl_vector_free(fVec);
110 GSLMultiMinimizer(
const GSLMultiMinimizer &) {}
115 GSLMultiMinimizer & operator = (
const GSLMultiMinimizer & rhs) {
116 if (
this == &rhs)
return *
this;
126 int Set(
const ROOT::Math::IMultiGradFunction & func,
const double * x,
double stepSize,
double tol) {
128 fFunc.SetFunction(func);
130 unsigned int ndim = func.NDim();
131 CreateMinimizer( ndim );
133 if (fVec != 0) gsl_vector_free(fVec);
134 fVec = gsl_vector_alloc( ndim );
135 std::copy(x,x+ndim, fVec->data);
136 assert(fMinimizer != 0);
137 return gsl_multimin_fdfminimizer_set(fMinimizer, fFunc.GetFunc(), fVec, stepSize, tol);
141 void CreateMinimizer(
unsigned int n) {
142 if (fMinimizer) gsl_multimin_fdfminimizer_free(fMinimizer);
143 fMinimizer = gsl_multimin_fdfminimizer_alloc(fType, n);
146 std::string Name()
const {
147 if (fMinimizer == 0)
return "undefined";
148 return std::string(gsl_multimin_fdfminimizer_name(fMinimizer) );
152 if (fMinimizer == 0)
return -1;
153 return gsl_multimin_fdfminimizer_iterate(fMinimizer);
158 if (fMinimizer == 0)
return 0;
159 gsl_vector * x = gsl_multimin_fdfminimizer_x(fMinimizer);
164 double Minimum()
const {
165 if (fMinimizer == 0)
return 0;
166 return gsl_multimin_fdfminimizer_minimum(fMinimizer);
170 double * Gradient()
const {
171 if (fMinimizer == 0)
return 0;
172 gsl_vector * g = gsl_multimin_fdfminimizer_gradient(fMinimizer);
178 if (fMinimizer == 0)
return -1;
179 return gsl_multimin_fdfminimizer_restart(fMinimizer);
183 int TestGradient(
double absTol)
const {
184 if (fMinimizer == 0)
return -1;
185 gsl_vector * g = gsl_multimin_fdfminimizer_gradient(fMinimizer);
186 return gsl_multimin_test_gradient( g, absTol);
190 int TestGradient(
const double * g,
double absTol)
const {
191 if (fVec == 0 )
return -1;
192 unsigned int n = fVec->size;
193 if (n == 0 )
return -1;
194 std::copy(g,g+n, fVec->data);
195 return gsl_multimin_test_gradient( fVec, absTol);
201 gsl_multimin_fdfminimizer * fMinimizer;
202 GSLMultiMinDerivFunctionWrapper fFunc;
203 const gsl_multimin_fdfminimizer_type * fType;
205 mutable gsl_vector * fVec;