9#include <gsl/gsl_errno.h>
10#include <gsl/gsl_math.h>
11#include <gsl/gsl_multimin.h>
23 using FUN = std::function<double(
const std::array<double, dim> &)>;
80 using FUN = std::function<double(
const double)>;
81 using FUN_ARR = std::function<double(
const std::array<double, 1> &)>;
166 gsl_set_error_handler_off();
181 void set_x0(
const std::array<double, dim> &
x0) { this->x0 =
x0; }
183 static double gsl_wrap(
const gsl_vector *v,
void *params)
186 std::array<double, dim> x;
187 for (
int i = 0; i < dim; ++i)
188 x[i] = gsl_vector_get(v, i);
195 gsl_multimin_function gsl_f;
200 gsl_vector *x = gsl_vector_alloc(dim);
201 for (
int i = 0; i < dim; ++i)
202 gsl_vector_set(x, i,
x0[i]);
204 gsl_vector *init_step = gsl_vector_alloc(dim);
205 gsl_vector_set_all(init_step,
step_size);
207 const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex2;
208 gsl_multimin_fminimizer *s = gsl_multimin_fminimizer_alloc(T, dim);
210 gsl_multimin_fminimizer_set(s, &gsl_f, x, init_step);
216 status = gsl_multimin_fminimizer_iterate(s);
219 double size = gsl_multimin_fminimizer_size(s);
220 status = gsl_multimin_test_size(size, this->
abs_tol);
222 if (status == GSL_SUCCESS)
break;
226 if (status != GSL_SUCCESS)
throw std::runtime_error(
"Minimization failed.");
228 std::array<double, dim> result;
229 for (
int i = 0; i < dim; ++i)
230 result[i] = gsl_vector_get(s->x, i);
232 gsl_multimin_fminimizer_free(s);
238 std::array<double, dim>
x0;
260 gsl_set_error_handler_off();
308 const gsl_min_fminimizer_type *T;
311 T = gsl_min_fminimizer_goldensection;
314 T = gsl_min_fminimizer_brent;
317 T = gsl_min_fminimizer_quad_golden;
320 throw std::runtime_error(
"Unknown minimization method.");
323 gsl_min_fminimizer *s = gsl_min_fminimizer_alloc(T);
326 double x_lo = this->
min_x;
327 double x_hi = this->
max_x;
329 gsl_min_fminimizer_set(s, &gsl_f, x, x_lo, x_hi);
337 status = gsl_min_fminimizer_iterate(s);
339 x = gsl_min_fminimizer_x_minimum(s);
340 x_lo = gsl_min_fminimizer_x_lower(s);
341 x_hi = gsl_min_fminimizer_x_upper(s);
343 status = gsl_min_test_interval(x_lo, x_hi, this->
abs_tol, this->
rel_tol);
346 if (stuck > 3) std::runtime_error(
"Minimization got stuck at x = " + std::to_string(x));
351 if (status != GSL_SUCCESS)
throw std::runtime_error(
"Minimization failed.");
353 gsl_min_fminimizer_free(s);
361 return self->
f({{x}});
double minimize()
Perform the minimization.
Definition minimization.hh:134
uint iter
Definition minimization.hh:141
std::function< double(const std::array< double, 1 > &)> FUN_ARR
Definition minimization.hh:81
virtual std::array< double, 1 > minimize_impl()=0
void set_abs_tol(const double abs_tol)
Set the absolute tolerance for the minimization.
Definition minimization.hh:113
uint get_iter() const
Get the number of iterations used in the last minimization.
Definition minimization.hh:127
AbstractMinimizer(const FUN &f, const double abs_tol=1e-4, const int max_iter=1000)
Construct a new AbstractMinimizer object.
Definition minimization.hh:91
void set_max_iter(const uint max_iter)
Set the maximum number of iterations.
Definition minimization.hh:120
double abs_tol
Definition minimization.hh:139
AbstractMinimizer(const FUN_ARR &f, const double abs_tol=1e-4, const int max_iter=1000)
Construct a new AbstractMinimizer object.
Definition minimization.hh:103
FUN_ARR f
Definition minimization.hh:137
std::function< double(const double)> FUN
Definition minimization.hh:80
uint max_iter
Definition minimization.hh:140
Abstract class for minimization in arbitrary dimensions.
Definition minimization.hh:21
uint iter
Definition minimization.hh:71
void set_max_iter(const uint max_iter)
Set the maximum number of iterations.
Definition minimization.hh:50
uint max_iter
Definition minimization.hh:70
std::function< double(const std::array< double, dim > &)> FUN
Definition minimization.hh:23
FUN f
Definition minimization.hh:67
AbstractMinimizer(const FUN &f, const double abs_tol=1e-4, const int max_iter=1000)
Construct a new AbstractMinimizer object.
Definition minimization.hh:33
double abs_tol
Definition minimization.hh:69
uint get_iter() const
Get the number of iterations used in the last minimization.
Definition minimization.hh:57
void set_abs_tol(const double abs_tol)
Set the absolute tolerance for the minimization.
Definition minimization.hh:43
std::array< double, dim > minimize()
Perform the minimization.
Definition minimization.hh:64
virtual std::array< double, dim > minimize_impl()=0
Minimizer in 1D using either the golden section, Brent or quadratic method from GSL.
Definition minimization.hh:246
static double gsl_wrap(double x, void *params)
Definition minimization.hh:358
method
List of available minimization methods.
Definition minimization.hh:266
@ quadratic
Definition minimization.hh:266
@ brent
Definition minimization.hh:266
@ golden_section
Definition minimization.hh:266
void set_bounds(const double min_x, const double max_x)
Set the bounds for the minimization.
Definition minimization.hh:281
AbstractMinimizer< 1 >::FUN FUN
Definition minimization.hh:247
void set_x0(const double x0)
Set the initial guess for the minimization.
Definition minimization.hh:273
void set_rel_tol(const double rel_tol)
Set the relative tolerance for the minimization. Default is 0.
Definition minimization.hh:299
double max_x
Definition minimization.hh:365
GSLMinimizer1D(const FUN &f, const double abs_tol=1e-4, const int max_iter=1000)
Construct a new GSLMinimizer1D object.
Definition minimization.hh:257
method m
Definition minimization.hh:367
double x0
Definition minimization.hh:364
double min_x
Definition minimization.hh:365
virtual std::array< double, 1 > minimize_impl() override
Definition minimization.hh:302
void set_method(const method m)
Set the minimization method. Default is Brent.
Definition minimization.hh:292
double rel_tol
Definition minimization.hh:366
Minimizer using the Nelder-Mead simplex algorithm from GSL.
Definition minimization.hh:152
virtual std::array< double, dim > minimize_impl() override
Definition minimization.hh:193
AbstractMinimizer< dim >::FUN FUN
Definition minimization.hh:153
static double gsl_wrap(const gsl_vector *v, void *params)
Definition minimization.hh:183
void set_x0(const std::array< double, dim > &x0)
Set the initial guess for the minimization.
Definition minimization.hh:181
double step_size
Definition minimization.hh:239
std::array< double, dim > x0
Definition minimization.hh:238
GSLSimplexMinimizer(const FUN &f, const double abs_tol=1e-4, const int max_iter=1000)
Construct a new GSLSimplexMinimizer object.
Definition minimization.hh:163
void set_step_size(const double step_size)
Set the initial step size for the minimization.
Definition minimization.hh:174
Definition complex_math.hh:14
bool __forceinline__ __host__ __device__ is_close(T1 a, T2 b, T3 eps_)
Function to evaluate whether two floats are equal to numerical precision. Tests for both relative and...
Definition math.hh:160
unsigned int uint
Definition utils.hh:22