11 #include "gsl/gsl_vector.h"
12 #include "gsl/gsl_multimin.h"
13 #include "gsl/gsl_math.h"
14 #include "gsl/gsl_matrix.h"
15 #include "gsl/gsl_linalg.h"
16 #include "gsl/gsl_blas.h"
17 #include "gsl/gsl_errno.h"
26 using namespace CLHEP;
44 const size_t N = func.dimensionality () ;
46 for(
size_t i = 0 ;
i <
N ; ++
i )
48 Genfun::GENFUNCTION
fun = func.partial(
i);
49 m_grad.push_back (fun.clone());
65 const std::string& name,
68 , m_algType (
"conjugate_fr" )
70 , m_norm_gradient ( 1.0e-10 )
71 , m_step_size ( 0.01 )
89 using namespace Genfun;
91 double fun_gsl (
const gsl_vector* v ,
99 {
for (
unsigned int i = 0;
i < v->size; ++
i)
101 arg[
i] = gsl_vector_get (v,
i);
109 void dfun_gsl (
const gsl_vector* v ,
void * params,
117 {
for (
unsigned int i = 0;
i < v->size; ++
i)
119 arg[
i] = gsl_vector_get (v,
i);
123 {
for(
unsigned int i = 0 ;
i < df->size ; ++
i )
126 Genfun::GENFUNCTION f = *(grad[
i]);
127 gsl_vector_set ( df,
i, f(arg) );
135 void fdfun_gsl (
const gsl_vector* v ,
140 *f = fun_gsl( v , params );
141 dfun_gsl ( v , params, df);
155 using namespace Genfun;
157 gsl_vector_view vect = gsl_vector_view_array ( &arg[0] ,
163 gsl_multimin_function_fdf
function;
165 function.f = &fun_gsl;
166 function.df = &dfun_gsl;
167 function.fdf = &fdfun_gsl;
168 function.n = vect.vector.size;
169 function.params = (
void*) &local;
173 const gsl_multimin_fdfminimizer_type *T = m_type ;
175 gsl_multimin_fdfminimizer *
s;
177 s = gsl_multimin_fdfminimizer_alloc ( T, vect.vector.size);
179 gsl_multimin_fdfminimizer_set (
s, &
function,
180 &vect.vector, m_step_size, m_tol);
182 for( iter = 0 ; iter < m_max_iter ; ++iter )
184 status = gsl_multimin_fdfminimizer_iterate (
s);
189 (
"Error from gsl_multimin_fdfminimizer_iterate '"
190 + std::string(gsl_strerror(status)) +
"'") ;
193 status = gsl_multimin_test_gradient (
s->gradient,
197 if ( status != GSL_CONTINUE ) {
break; }
200 for (
unsigned int i = 0;
i < vect.vector.size; ++
i)
202 gsl_vector_set (&vect.vector,
i, gsl_vector_get (
s->x,
i));
205 if (status == GSL_SUCCESS)
208 <<
"We stopped in the method on the " << iter
209 <<
" iteration (we have maximum " << m_max_iter
210 <<
" iterations)" <<
endmsg;
212 log <<
"The Euclidean norm of gradient = "
213 << gsl_blas_dnrm2 (
s->gradient)
214 <<
" by the absolute tolerance = "
215 << m_norm_gradient <<
endmsg;
217 else if (status == GSL_CONTINUE && iter <= m_max_iter )
219 return Error (
"Method finished with '"
220 + std::string(gsl_strerror(status))
225 return Error (
"Method finished with '" +
226 std::string(gsl_strerror(status))
230 gsl_multimin_fdfminimizer_free (
s);
234 return Error (
"Method finished with '"
235 + std::string(gsl_strerror(status))
259 std::ostringstream buffer;
260 buffer <<
"MINIMUM IS NOT FOUND. StatusCode = '" << sc.
getCode() <<
'\'';
261 return Error (buffer.str(),
sc);
265 HepSymMatrix cov(arg.dimension(), 0);
266 for (
unsigned int i = 0;
i < arg.dimension(); ++
i)
268 Genfun::GENFUNCTION f = func.partial(
i);
269 for (
unsigned int j =
i; j < arg.dimension(); ++j)
271 Genfun::GENFUNCTION fij = f.partial(j);
272 cov(
i+1, j+1) = 0.5 * fij(arg);
277 covar = cov.inverse(inv);
281 (
"Matrix of Error is not complete successful");
299 return Error (
"Could not initialize base class GaudiTool", sc);
305 m_type = gsl_multimin_fdfminimizer_conjugate_fr ;
307 <<
"Minimization algorithm to be used: "
308 <<
"'gsl_multimin_fdfminimizer_conjugate_fr'"
313 m_type = gsl_multimin_fdfminimizer_conjugate_pr ;
315 <<
"Minimization algorithm to be used: "
316 <<
"'gsl_multimin_fdfminimizer_conjugate_pr'"
321 m_type = gsl_multimin_fdfminimizer_vector_bfgs ;
323 <<
"Minimization algorithm to be used: " <<
324 "'gsl_multimin_fdfminimizer_vector_bfgs'" <<
endmsg;
326 else if (
"steepest_descent" ==
m_algType )
328 m_type = gsl_multimin_fdfminimizer_steepest_descent ;
330 <<
"Minimization algorithm to be used: "
331 <<
"'gsl_multimin_fdfminimizer_steepest_descent'"
336 return Error(
" Unknown algorithm type '"
351 return Error(
"Could not finalize base class GaudiTool", sc);
Definition of the MsgStream class used to transmit messages.
virtual StatusCode minimum(const GenFunc &func, Arg &arg) const
Find minimum of the function "GenFunc".
unsigned long getCode() const
Get the status code by value.
Genfun::Argument Arg
Argument of function "GenFunc" (.
StatusCode Error(const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
Print the error message and return with the given StatusCode.
virtual StatusCode initialize()
Overriding initialize.
const Arg & argument() const
std::vector< const GenFunc * > Gradient
const GenFunc * equation() const
const gsl_multimin_fdfminimizer_type * m_type
bool isFailure() const
Test for a status code of FAILURE.
#define DECLARE_COMPONENT(type)
virtual ~FuncMinimum()
Destructor.
Genfun::AbsFunction GenFunc
Function which we minimize (.
This class is used for returning status codes from appropriate routines.
Definition of the basic interface.
Base class used to extend a class implementing other interfaces.
The simplest concrete implementation of IFuncMinimum interface.
const Gradient & gradient() const
CLHEP::HepSymMatrix Covariance
Covariance matrix (matrix of error) (.
double fun(const std::vector< double > &x)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
virtual StatusCode finalize()
standard finalization method
FuncMinimum()
default constructor is private