13 #ifndef GSL_MULTIMIN_WRAP_H_KJBLIB_UARIZONAVISION
14 #define GSL_MULTIMIN_WRAP_H_KJBLIB_UARIZONAVISION
20 #include <boost/function/function1.hpp>
23 #include "gsl/gsl_multimin.h"
25 #warning "Gnu Scientific Library is absent, yet essential to this program."
32 #define gsl_multimin_fdfminimizer_conjugate_pr ((void*)0)
33 #define gsl_multimin_fdfminimizer_vector_bfgs2 ((void*)0)
34 #define gsl_multimin_fdfminimizer_alloc(x,z) 0
35 #define gsl_set_error_handler_off() (0)
45 #define gsl_multimin_fminimizer_nmsimplex ((void*)0)
46 #define gsl_multimin_fminimizer_nmsimplex2 ((void*)0)
47 #define gsl_multimin_fminimizer_alloc(x,z) 0
52 #define GSL_NAN (1.0/0.0)
86 struct basic_Gsl_Multimin_fdf {
89 basic_Gsl_Multimin_fdf(
95 ETX_2( 0 == dim,
"basic_Gsl_Multimin_fdf(): Zero dimensions" );
96 ETX_2( 00 == p,
"basic_Gsl_Multimin_fdf(): Memory alloc failed" );
99 ~basic_Gsl_Multimin_fdf()
101 gsl_multimin_fdfminimizer_free( p );
104 void swap( basic_Gsl_Multimin_fdf& that )
112 basic_Gsl_Multimin_fdf(
const basic_Gsl_Multimin_fdf& );
113 basic_Gsl_Multimin_fdf();
114 basic_Gsl_Multimin_fdf& operator=(
const basic_Gsl_Multimin_fdf& );
117 basic_Gsl_Multimin_fdf m_min;
154 : m_min( type, x0 ? x0 -> size : 0 ),
157 GSL_ETX( gsl_multimin_fdfminimizer_set( m_min.p, fdf, x0, step_size,
177 int rc = gsl_multimin_fdfminimizer_iterate( m_min.p );
187 return gsl_multimin_fdfminimizer_x( m_min.p );
195 return gsl_multimin_fdfminimizer_minimum( m_min.p );
203 return gsl_multimin_fdfminimizer_gradient( m_min.p );
211 return gsl_multimin_fdfminimizer_name( m_min.p );
223 return gsl_multimin_test_gradient( m_min.p ->
gradient, epsabs );
243 GSL_ETX( gsl_multimin_fdfminimizer_restart( m_min.p ) );
261 m_min.swap( that.m_min );
263 swap( m_verbose, that.m_verbose );
275 bool oldv = m_verbose;
306 struct basic_Gsl_Multimin_f {
310 basic_Gsl_Multimin_f(
317 ETX_2( 0 == dimension,
"basic_Gsl_Multimin_f(): Zero dimensions" );
318 ETX_2( 00 == p,
"basic_Gsl_Multimin_f(): Memory alloc failed" );
321 ~basic_Gsl_Multimin_f()
323 gsl_multimin_fminimizer_free( p );
326 void swap( basic_Gsl_Multimin_f& that )
334 basic_Gsl_Multimin_f(
const basic_Gsl_Multimin_f& );
335 basic_Gsl_Multimin_f& operator=(
const basic_Gsl_Multimin_f& );
338 basic_Gsl_Multimin_f m_min;
343 boost::function1<double, const gsl_vector*> boost_f_;
378 : m_min( type, x0 ? x0 -> size : 0 ),
394 : m_min( type, size),
412 GSL_ETX( gsl_multimin_fminimizer_set( m_min.p, f, x0, step_size ) );
413 m_initialized =
true;
440 int rc = gsl_multimin_fminimizer_iterate( m_min.p );
450 return gsl_multimin_fminimizer_x( m_min.p );
455 virtual double min()
const
458 return gsl_multimin_fminimizer_minimum( m_min.p );
466 return gsl_multimin_fminimizer_name( m_min.p );
481 double size = gsl_multimin_fminimizer_size(m_min.p);
482 return gsl_multimin_test_size( size, epsabs );
501 m_min.swap( that.m_min );
503 swap( m_verbose, that.m_verbose );
515 bool oldv = m_verbose;
526 typedef boost::function1<double, const gsl_vector*> Func_type;
527 Func_type* f =
static_cast<Func_type*
>(params);
539 typedef boost::function2<void, const gsl_vector*, T&>
From_gsl;
542 typedef boost::function2<void, const T&, gsl_vector*>
To_gsl;
557 template <
class Eval_type>
558 struct gsl_adapter_func
563 bool negate =
false) :
583 bool negate =
false) :
594 from_gsl_(x, workspace_);
596 return -f_(workspace_);
598 return f_(workspace_);
603 mutable T workspace_;
617 negate_evaluator_(false)
620 template <
class Eval_type,
class VectorType>
624 const VectorType& step_size,
625 bool negate_evaluator =
false)
627 negate_evaluator_ = negate_evaluator;
629 size_t num_dimensions =
dim();
636 boost::shared_ptr<T> tmp(
new T(guess));
640 boost_f_ = gsl_adapter_func<Eval_type>(e, from_gsl_, *reference_, negate_evaluator);
642 gsl_f_.
n = num_dimensions;
643 gsl_f_.
params =
static_cast<void*
>(&boost_f_);
647 to_gsl_(guess, gsl_guess);
649 Gsl_Vector gsl_step_size(step_size.begin(), step_size.end());
661 from_gsl_(
argmin(), *reference_);
671 return (negate_evaluator_ ? -result : result);
678 boost::function1<double, const gsl_vector*> boost_f_;
682 bool negate_evaluator_;
683 mutable boost::shared_ptr<T> reference_;
Definition: gsl_vector.h:35
size_t size
Definition: gsl_vector.h:36
boost::function1< double, T > Evaluator
Definition: gsl_multimin.h:536
const char * name() const
access a string describing the algorithm
Definition: gsl_multimin.h:463
double gsl_evaluate_Nd_boost_function(const gsl_vector *v, void *params)
Definition: gsl_multimin.h:524
void * params
Definition: gsl_multimin.h:49
Gsl_Multimin_fdf(const gsl_multimin_fdfminimizer_type *type, gsl_multimin_function_fdf *fdf, const gsl_vector *x0, double step_size, double tol, bool verbosity=true)
ctor builds the minimizer by allocating and setting up params
Definition: gsl_multimin.h:145
Object thrown when an argument is of the wrong size or dimensions.
Definition: l_exception.h:426
void(* fdf)(const gsl_vector *, void *, double *, gsl_vector *)
Definition: gsl_multimin.h:40
#define gsl_multimin_fminimizer_nmsimplex2
Definition: gsl_multimin.h:46
int n
Definition: gsl_multimin.h:37
int iterate()
Perform one iteration of the minimizer.
Definition: gsl_multimin.h:174
void swap(Gsl_Multimin_fdf &that)
Swap the contents of this minimizer and another (fast).
Definition: gsl_multimin.h:254
void gsl_multimin_fminimizer_type
Definition: gsl_multimin.h:43
#define KJB_THROW(ex)
Definition: l_exception.h:46
GSL utility stuff to help those using the C++ wrapper on GSL code.
#define gsl_multimin_fminimizer_alloc(x, z)
Definition: gsl_multimin.h:47
void(* df)(const gsl_vector *, void *, gsl_vector *)
Definition: gsl_multimin.h:39
size_t dim() const
Definition: gsl_multimin.h:417
int iterate()
Perform one iteration of the minimizer.
Definition: gsl_multimin.h:432
int test_size(double epsabs) const
check the magnitude the minimizer specific characteristic size against the tolerance epsabs...
Definition: gsl_multimin.h:477
Definition: gsl_multimin.h:48
Gsl_Multimin_f(size_t size, const gsl_multimin_fminimizer_type *type=gsl_multimin_fminimizer_nmsimplex2)
Definition: gsl_multimin.h:390
Wrapper for GSL's multidimensional minimizer, when you have gradient.
Definition: gsl_multimin.h:69
void gsl_iterate_EPE(int gsl_error_code)
On error, print a GSL iteration error message (like EPE)
Definition: gsl_util.cpp:40
size_t n
Definition: gsl_multimin.h:49
x
Definition: APPgetLargeConnectedEdges.m:100
int test_gradient(double epsabs) const
check the magnitude the gradient of the function now
Definition: gsl_multimin.h:220
#define GSL_ETX(gsl_expr)
Definition: gsl_util.h:37
double(* f)(const gsl_vector *, void *)
Definition: gsl_multimin.h:50
const char * name() const
access a string describing the algorithm
Definition: gsl_multimin.h:208
double min() const
query the current best min value of the function to be minimized
Definition: gsl_multimin.h:666
double min() const
query the current best min value of the function to be minimized
Definition: gsl_multimin.h:192
Wrapper for GSL's multidimensional minimizer, without using gradient.
Definition: gsl_multimin.h:289
void initialize(gsl_multimin_function *f, const gsl_vector *x0, const gsl_vector *step_size)
Definition: gsl_multimin.h:404
RAII wrapper for GSL vector objects.
Definition: gsl_vector.h:78
#define KJB_THROW_2(ex, msg)
Definition: l_exception.h:48
#define gsl_multimin_fdfminimizer_alloc(x, z)
Definition: gsl_multimin.h:34
bool verbosity(bool v)
Alter the verbosity attribute of the object.
Definition: gsl_multimin.h:513
void swap(kjb::Gsl_Multimin_fdf &m1, kjb::Gsl_Multimin_fdf &m2)
Swap two wrapped multimin objects.
Definition: gsl_multimin.h:693
void gsl_multimin_fdfminimizer_type
Definition: gsl_multimin.h:30
Gsl_Multimin_f(const gsl_multimin_fminimizer_type *type, gsl_multimin_function *f, const gsl_vector *x0, const gsl_vector *step_size, bool verbosity=true)
ctor builds the minimizer by allocating and setting up params
Definition: gsl_multimin.h:370
#define ETX_2(a, msg)
Definition: l_exception.h:78
void initialize(const Eval_type &e, const T &guess, const VectorType &step_size, bool negate_evaluator=false)
Definition: gsl_multimin.h:621
gsl_vector * argmin() const
query the current best argmin of the minimizer
Definition: gsl_multimin.h:447
Definition: gsl_multimin.h:36
virtual double min() const
query the current best min value of the function to be minimized
Definition: gsl_multimin.h:455
gsl_vector * argmin() const
query the current best argmin of the minimizer
Definition: gsl_multimin.h:184
boost::function2< void, const gsl_vector *, T & > From_gsl
Definition: gsl_multimin.h:539
bool verbosity(bool v)
Alter the verbosity attribute of the object.
Definition: gsl_multimin.h:273
C++ wrapper on GSL vector class to prevent resource leaks.
void restart()
Restart the minimizer at the current argmin value.
Definition: gsl_multimin.h:240
boost::function2< void, const T &, gsl_vector * > To_gsl
Definition: gsl_multimin.h:542
Definition: gsl_multimin.h:533
gsl_vector * gradient() const
query the gradient of the function at the current location
Definition: gsl_multimin.h:200
void gsl_multimin_fdfminimizer
Definition: gsl_multimin.h:31
void swap(Gsl_Multimin_f &that)
Swap the contents of this minimizer and another (fast).
Definition: gsl_multimin.h:494
void * params
Definition: gsl_multimin.h:37
Support for error handling exception classes in libKJB.
Object thrown when a program lacks required resources or libraries.
Definition: l_exception.h:539
Object thrown when computation fails somehow during execution.
Definition: l_exception.h:321
Generic_multimin(size_t size, const To_gsl &to_gsl, const From_gsl &from_gsl, const gsl_multimin_fminimizer_type *type=gsl_multimin_fminimizer_nmsimplex2)
Definition: gsl_multimin.h:607
void gsl_multimin_fminimizer
Definition: gsl_multimin.h:44
double(* f)(const gsl_vector *, void *)
Definition: gsl_multimin.h:38