28 #ifndef ROOT_Math_GSLMultiRootSolver
29 #define ROOT_Math_GSLMultiRootSolver
31 #include "gsl/gsl_vector.h"
32 #include "gsl/gsl_matrix.h"
33 #include "gsl/gsl_multiroots.h"
34 #include "gsl/gsl_blas.h"
71 bool InitSolver(
const std::vector<ROOT::Math::IMultiGenFunction*> & funcVec,
const double *
x) {
74 unsigned int n = funcVec.size();
75 if (n == 0)
return false;
77 unsigned int ndim = funcVec[0]->NDim();
80 MATH_ERROR_MSGVAL(
"GSLMultiRootSolver::InitSolver",
"Wrong function dimension",ndim);
92 virtual std::string
Name()
const = 0;
98 const double *
X()
const {
105 gsl_vector *
f =
GetF();
110 const double *
Dx()
const {
111 gsl_vector * dx =
GetDx();
119 gsl_vector * dx =
GetDx();
120 if (x == 0 || dx == 0)
return -1;
121 return gsl_multiroot_test_delta(dx, x, absTol, relTol);
127 gsl_vector *
f =
GetF();
128 if (f == 0)
return -1;
129 return gsl_multiroot_test_residual(f, absTol);
137 virtual int SetSolver(
const std::vector<ROOT::Math::IMultiGenFunction*> & funcVec,
const double *
x) = 0;
139 virtual gsl_vector *
GetRoot()
const = 0;
141 virtual gsl_vector *
GetF()
const = 0;
143 virtual gsl_vector *
GetDx()
const = 0;
174 if (
fVec != 0) gsl_vector_free(
fVec);
189 if (
this == &rhs)
return *
this;
201 fSolver = gsl_multiroot_fsolver_alloc(type, n);
207 virtual int SetSolver(
const std::vector<ROOT::Math::IMultiGenFunction*> & funcVec,
const double *
x) {
211 unsigned int n = funcVec.size();
215 if (
fVec != 0) gsl_vector_free(
fVec);
216 fVec = gsl_vector_alloc( n);
217 std::copy(x,x+n,
fVec->data);
223 virtual std::string
Name()
const {
224 if (
fSolver == 0 )
return "undefined";
225 return std::string(gsl_multiroot_fsolver_name(
fSolver) );
230 return gsl_multiroot_fsolver_iterate(
fSolver);
236 return gsl_multiroot_fsolver_root(
fSolver);
240 virtual gsl_vector *
GetF()
const {
242 return gsl_multiroot_fsolver_f(
fSolver);
246 virtual gsl_vector *
GetDx()
const {
248 return gsl_multiroot_fsolver_dx(
fSolver);
286 if (
fVec != 0) gsl_vector_free(
fVec);
301 if (
this == &rhs)
return *
this;
320 virtual int SetSolver(
const std::vector<ROOT::Math::IMultiGenFunction*> & funcVec,
const double *
x) {
325 unsigned int n = funcVec.size();
327 for (
unsigned int i = 0; i <
n; ++i) {
330 MATH_ERROR_MSG(
"GSLMultiRootSolver::SetSolver",
"Function does not provide gradient interface");
338 if (
fVec != 0) gsl_vector_free(
fVec);
339 fVec = gsl_vector_alloc( n);
340 std::copy(x,x+n,
fVec->data);
345 virtual std::string
Name()
const {
347 return std::string(gsl_multiroot_fdfsolver_name(
fDerivSolver) );
362 virtual gsl_vector *
GetF()
const {
368 virtual gsl_vector *
GetDx()
const {
Interface (abstract class) for multi-dimensional functions providing a gradient calculation.
Namespace for new ROOT classes and functions.
int TestDelta(double absTol, double relTol) const
test using abs and relative tolerance |dx| < absTol + relTol*|x| for every component ...
virtual gsl_vector * GetDx() const
return function steps
virtual gsl_vector * GetF() const
return function values
GSLMultiRootBaseSolver, internal class for implementing GSL multi-root finders This is the base class...
virtual int SetSolver(const std::vector< ROOT::Math::IMultiGenFunction * > &funcVec, const double *x)
set the solver parameters for the case of derivative
GSLMultiRootSolver(const GSLMultiRootSolver &)
Copy constructor.
GSLMultiRootDerivSolver(const GSLMultiRootDerivSolver &)
Copy constructor.
gsl_multiroot_fsolver * fSolver
GSLMultiRootDerivSolver(const gsl_multiroot_fdfsolver_type *type, int n)
Constructor.
std::vector< ROOT::Math::IMultiGradFunction * > fGradFuncVec
#define MATH_ERROR_MSGVAL(loc, str, x)
int TestResidual(double absTol) const
test using abs tolerance Sum |f|_i < absTol
virtual ~GSLMultiRootSolver()
Destructor (no operations)
virtual gsl_vector * GetDx() const =0
virtual gsl_vector * GetRoot() const
solution values at the current iteration
virtual std::string Name() const
return name
wrapper to a multi-dim function without derivatives for multi roots algorithm
virtual gsl_vector * GetDx() const
return function steps
virtual ~GSLMultiRootBaseSolver()
virtual Destructor
virtual int Iterate()=0
perform an iteration
virtual gsl_vector * GetRoot() const =0
virtual ~GSLMultiRootDerivSolver()
Destructor (no operations)
const double * FVal() const
return function values
void SetFunctions(const FuncVector &f, unsigned int n)
Fill gsl function structure from a C++ function iterator and size and number of residuals.
#define MATH_ERROR_MSG(loc, str)
virtual std::string Name() const
return name
GSLMultiRootSolver & operator=(const GSLMultiRootSolver &rhs)
Assignment operator.
virtual int Iterate()
perform an iteration
GSLMultiRootDerivSolver & operator=(const GSLMultiRootDerivSolver &rhs)
Assignment operator.
GSLMultiRootSolver, internal class for implementing GSL multi-root finders not using derivatives...
virtual gsl_vector * GetRoot() const
solution values at the current iteration
GSLMultiRootFunctionWrapper fFunctions
void CreateSolver(const gsl_multiroot_fdfsolver_type *type, unsigned int n)
create the solver from the type and size of number of fitting points and number of parameters ...
void SetFunctions(const FuncVector &f, unsigned int n)
Fill gsl function structure from a C++ function iterator and size and number of residuals.
gsl_multiroot_function_fdf * GetFunctions()
const double * X() const
solution values at the current iteration
virtual std::string Name() const =0
return name
GSLMultiRootSolver(const gsl_multiroot_fsolver_type *type, int n)
Constructor from type and simension of system (number of functions)
double func(double *x, double *p)
virtual int SetSolver(const std::vector< ROOT::Math::IMultiGenFunction * > &funcVec, const double *x)
set the solver parameters
const double * Dx() const
return function steps
Namespace for new Math classes and functions.
wrapper to a multi-dim function with derivatives for multi roots algorithm
gsl_multiroot_fdfsolver * fDerivSolver
virtual int Iterate()
perform an iteration
GSLMultiRootDerivFunctionWrapper fDerivFunctions
GSLMultiRootDerivSolver, internal class for implementing GSL multi-root finders using derivatives...
void CreateSolver(const gsl_multiroot_fsolver_type *type, unsigned int n)
gsl_multiroot_function * GetFunctions()
virtual gsl_vector * GetF() const =0
bool InitSolver(const std::vector< ROOT::Math::IMultiGenFunction * > &funcVec, const double *x)
init the solver with function list and initial values
virtual gsl_vector * GetF() const
return function values
virtual int SetSolver(const std::vector< ROOT::Math::IMultiGenFunction * > &funcVec, const double *x)=0