49 ErrorCBL((GSLroutine !=
par::defaultString) ?
"the error has been raised by the gsl routine "+GSLroutine+
" used in "+CBLfunction+
": "+
string(gsl_strerror(status)):
"Error in "+CBLfunction+
": "+
string(gsl_strerror(status)),
"check_GSL_fail",
"GSLwrapper.cpp");
53 WarningMsgCBL(
"The gsl routine "+GSLroutine+
" used in "+CBLfunction+
" exited with status "+
string(gsl_strerror(status)),
"check_GSL_fail",
"GSLwrapper.cpp");
62 gsl::STR_generic_func_GSL *pp = (gsl::STR_generic_func_GSL *) params;
72 gsl::STR_generic_func_GSL *pp = (gsl::STR_generic_func_GSL *) params;
73 return pp->f(xx)-pp->xx0;
83 for (
size_t i=0; i<xx->size; i++)
84 _xx.push_back(gsl_vector_get(xx, i));
86 gsl::STR_generic_func_GSL *pp = (gsl::STR_generic_func_GSL *) params;
87 pp->parameters_return = _xx;
99 for (
size_t i=0; i<xx->size; i++)
100 _xx.push_back(gsl_vector_get(xx, i));
102 gsl::STR_generic_func_GSL *pp = (gsl::STR_generic_func_GSL *) params;
104 double val = pp->fmin_return(_xx);
105 pp->parameters_return = _xx;
116 gsl_set_error_handler_off();
120 int status = gsl_deriv_central(&Func, xx, hh, &Deriv, &error);
121 check_GSL_fail(status,
true,
"GSL_derivative",
"gsl_deriv_central");
123 return (Deriv!=0 && error/Deriv<prec) ? Deriv :
ErrorCBL(
"error/Deriv = "+
conv(error/Deriv,
par::fDP6)+
" > prec = "+
conv(prec,
par::fDP3),
"GSL_derivative",
"GSLwrapper.cpp");
132 #if GSL_VERSION_OK==1
133 gsl_set_error_handler_off();
135 gsl_integration_romberg_workspace * ws = gsl_integration_romberg_alloc(npoints);
140 int status = gsl_integration_romberg(&Func, a, b, eps_abs, eps_rel, &Int, &nevals, ws);
142 gsl_integration_romberg_free(ws);
144 check_GSL_fail(status,
true,
"GSL_integrate_romberg",
"gsl_integration_romberg");
149 (void)Func; (void)a; (void)b; (void)npoints; (void)eps_rel; (void)eps_abs;
150 ErrorCBL(
"Romberg integration is available with GSL version >=2.5",
"GSL_integrate_romberg",
"GSLwrapper.cpp");
161 gsl_set_error_handler_off();
165 gsl_integration_cquad_workspace *ww = gsl_integration_cquad_workspace_alloc(nevals);
167 int status = gsl_integration_cquad(&Func, a, b, abs_err, rel_err, ww, &Int, &error, &nn);
169 gsl_integration_cquad_workspace_free(ww);
171 check_GSL_fail(status,
true,
"GSL_integrate_cquad",
"gsl_integration_cquad");
182 gsl_set_error_handler_off();
185 gsl_integration_workspace *ww = gsl_integration_workspace_alloc(limit_size);
187 int status = gsl_integration_qag(&Func, a, b, abs_err, rel_err, limit_size, rule, ww, &Int, &error);
189 check_GSL_fail(status,
true,
"GSL_integrate_qag",
"gsl_integrate_qag");
191 gsl_integration_workspace_free(ww);
202 gsl_set_error_handler_off();
205 gsl_integration_workspace *ww = gsl_integration_workspace_alloc(limit_size);
207 int status = gsl_integration_qags(&Func, a, b, abs_err, rel_err, limit_size, ww, &Int, &error);
209 check_GSL_fail(status,
true,
"GSL_integrate_qags",
"gsl_integrate_qags");
211 gsl_integration_workspace_free(ww);
222 gsl_set_error_handler_off();
225 gsl_integration_workspace *ww = gsl_integration_workspace_alloc(limit_size);
227 int status = gsl_integration_qagiu(&Func, a, abs_err, rel_err, limit_size, ww, &Int, &error);
229 check_GSL_fail(status,
true,
"GSL_integrate_qagiu",
"gsl_integrate_qagiu");
231 gsl_integration_workspace_free(ww);
240 double cbl::wrapper::gsl::GSL_integrate_qaws (gsl_function Func,
const double a,
const double b,
const double alpha,
const double beta,
const int mu,
const int nu,
const double rel_err,
const double abs_err,
const int limit_size)
242 gsl_set_error_handler_off();
244 gsl_integration_qaws_table *T = gsl_integration_qaws_table_alloc(
alpha, beta, mu, nu);
247 gsl_integration_workspace *ww = gsl_integration_workspace_alloc(limit_size);
249 int status = gsl_integration_qaws (&Func, a, b, T, abs_err, rel_err, limit_size, ww, &Int, &error);
251 check_GSL_fail(status,
true,
"GSL_integrate_qaws",
"gsl_integrate_qaws");
253 gsl_integration_workspace_free(ww);
254 gsl_integration_qaws_table_free(T);
265 STR_generic_func_GSL params;
270 Func.params = ¶ms;
281 STR_generic_func_GSL params;
286 Func.params = ¶ms;
297 STR_generic_func_GSL params;
302 Func.params = ¶ms;
313 STR_generic_func_GSL params;
318 Func.params = ¶ms;
329 STR_generic_func_GSL params;
334 Func.params = ¶ms;
345 STR_generic_func_GSL params;
350 Func.params = ¶ms;
361 STR_generic_func_GSL params;
366 Func.params = ¶ms;
377 function<double(
double)> func_bind = bind(func, placeholders::_1, pp, par);
388 function<double(
double)> func_bind = bind(func, placeholders::_1, pp, par);
399 function<double(
double)> func_bind = bind(func, placeholders::_1, pp, par);
410 function<double(
double)> func_bind = bind(func, placeholders::_1, pp, par);
419 double cbl::wrapper::gsl::GSL_integrate_qaws (
FunctionDoubleDoublePtrVectorRef func,
const std::shared_ptr<void> pp,
const std::vector<double> par,
const double a,
const double b,
const double alpha,
const double beta,
const int mu,
const int nu,
const double rel_err,
const double abs_err,
const int limit_size)
421 function<double(
double)> func_bind = bind(func, placeholders::_1, pp, par);
432 gsl_set_error_handler_off();
434 int status = 0, iter = 0, max_iter = 10000;
435 const gsl_root_fsolver_type *T;
439 T = gsl_root_fsolver_brent;
440 s = gsl_root_fsolver_alloc(T);
442 double x_lo = low_guess;
443 double x_hi = up_guess;
445 gsl_root_fsolver_set(s, &Func, x_lo, x_hi);
450 status = gsl_root_fsolver_iterate(s);
452 if ((status!=GSL_SUCCESS) && (status!=GSL_CONTINUE))
453 check_GSL_fail(status,
true,
"GSL_root_brent",
"gsl_root_fsolver_iterate");
455 r = gsl_root_fsolver_root(s);
456 x_lo = gsl_root_fsolver_x_lower(s);
457 x_hi = gsl_root_fsolver_x_upper(s);
459 status = gsl_root_test_interval(x_lo, x_hi, abs_err, rel_err);
461 if ((status!=GSL_SUCCESS) && (status!=GSL_CONTINUE))
462 check_GSL_fail(status,
true,
"GSL_root_brent",
"gsl_root_test_interval");
465 while (status==GSL_CONTINUE && iter<max_iter);
467 gsl_root_fsolver_free(s);
480 gsl_set_error_handler_off();
482 STR_generic_func_GSL params;
488 Func.params = ¶ms;
490 return GSL_root_brent(Func, low_guess, up_guess, rel_err, abs_err);
499 if (ranges.size() != start.size() && ranges.size() != 0)
500 ErrorCBL(
"vector of ranges must have the same size of start vector!",
"GSL_minimize_nD",
"GSLwrapper.cpp");
501 gsl_set_error_handler_off();
503 size_t npar = start.size();
505 STR_generic_func_GSL params;
506 params.fmin_return = (ranges.size() == start.size()) ? [&] (vector<double> par) {
return (
inRange(par, ranges)) ? func(par) :
par::defaultDouble; } : func;
508 const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex2;
509 gsl_multimin_fminimizer *s = NULL;
511 gsl_multimin_function minex_func;
519 x = gsl_vector_alloc(npar);
520 ss = gsl_vector_alloc(npar);
522 for (
size_t i=0; i<npar; i++) {
523 gsl_vector_set(x, i, start[i]);
524 double val = ((ranges.size()>0) && (start[i]+epsilon>ranges[i][1])) ? ranges[i][1]*0.999-start[i] : epsilon;
525 gsl_vector_set(ss, i, val);
532 minex_func.params = ¶ms;
534 s = gsl_multimin_fminimizer_alloc (T, npar);
535 gsl_multimin_fminimizer_set (s, &minex_func, x, ss);
540 status = gsl_multimin_fminimizer_iterate(s);
542 if ((status!=GSL_SUCCESS) && (status!=GSL_CONTINUE))
543 check_GSL_fail(status,
true,
"GSL_minimize_nD",
"gsl_multimin_fminimizer_iterate");
545 size = gsl_multimin_fminimizer_size(s);
547 status = gsl_multimin_test_size(size, tol);
549 if ((status!=GSL_SUCCESS) && (status!=GSL_CONTINUE))
550 check_GSL_fail(status,
true,
"GSL_minimize_nD",
"gsl_multimin_fminimizer_iterate");
552 coutCBL << std::fixed <<
"\r" <<
"Iteration " << iter << std::scientific << std::setprecision(2) <<
" " <<
"Size= " << size <<
", Tol = "<< tol <<
"\r"<<std::fixed; cout.flush();
555 while (status==GSL_CONTINUE && iter<max_iter);
559 gsl_multimin_fminimizer_free(s);
561 if (status==GSL_SUCCESS)
562 coutCBL <<
"Converged to a minimum at iteration " << iter <<
" (<" << max_iter <<
")" << endl;
563 else if (status==GSL_CONTINUE)
564 ErrorCBL(
"Minimization has not converged. Try with lower tolerance or larger number of iterations",
"GSL_minimize_nD",
"GSLwrapper.cpp");
568 return params.parameters_return;
577 if (ranges.size()!=start.size() && ranges.size()!=0)
578 ErrorCBL(
"vector of ranges must have the same size of start vector!",
"GSL_minimize_nD",
"GSLwrapper.cpp");
579 gsl_set_error_handler_off();
581 size_t npar = start.size();
583 STR_generic_func_GSL params;
584 params.fmin_return = (ranges.size() == start.size()) ? [&] (vector<double> &par) {
return (
inRange(par, ranges)) ? func(par) : -
par::defaultDouble; } : func;
586 const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex;
587 gsl_multimin_fminimizer *s = NULL;
589 gsl_multimin_function minex_func;
598 x = gsl_vector_alloc(npar);
599 ss = gsl_vector_alloc(npar);
601 for (
size_t i=0; i<npar; i++) {
602 gsl_vector_set(x, i, start[i]);
603 double val = ((ranges.size()>0) && (start[i]+epsilon>ranges[i][1])) ? ranges[i][1]*0.999-start[i] : epsilon;
604 gsl_vector_set(ss, i, val);
612 minex_func.params = ¶ms;
614 s = gsl_multimin_fminimizer_alloc(T, npar);
615 gsl_multimin_fminimizer_set(s, &minex_func, x, ss);
618 if (gsl_multimin_fminimizer_size(s)<tol)
619 ErrorCBL(
"The simplex size is smaller than requested tolerance, "+
conv(gsl_multimin_fminimizer_size(s),
par::fDP6)+
"<"+
conv(tol,
par::fDP6)+
", check your inputs!",
"GSL_minimize_nD",
"GSLwrapper.cpp");
624 if ((status != GSL_SUCCESS) && (status!=GSL_CONTINUE))
625 check_GSL_fail(status,
true,
"GSL_minimize_nD",
"gsl_multimin_test_size");
627 status = gsl_multimin_fminimizer_iterate(s);
629 size = gsl_multimin_fminimizer_size(s);
631 status = gsl_multimin_test_size(size, tol);
633 if ((status!=GSL_SUCCESS) && (status!=GSL_CONTINUE))
634 check_GSL_fail(status,
true,
"GSL_minimize_nD",
"gsl_multimin_test_size");
636 coutCBL << std::fixed <<
"\r" <<
"Iteration " << iter << std::scientific << std::setprecision(2) <<
" " <<
"Size= " << size <<
", Tol = "<< tol <<
"\r"<<std::fixed; cout.flush();
638 while (status==GSL_CONTINUE && iter<max_iter);
642 gsl_multimin_fminimizer_free(s);
644 if (status==GSL_SUCCESS)
645 coutCBL <<
"Converged to a minimum at iteration " << iter <<
" (<" << max_iter <<
")" << endl;
646 else if (status==GSL_CONTINUE)
647 ErrorCBL(
"Minimization has not converged. Try with lower tolerance or larger number of iterations",
"GSL_minimize_nD",
"GSLwrapper.cpp");
651 return params.parameters_return;
661 gsl_set_error_handler_off();
663 const gsl_min_fminimizer_type *T = gsl_min_fminimizer_brent;
664 gsl_min_fminimizer *s = gsl_min_fminimizer_alloc(T);
670 STR_generic_func_GSL params;
677 gsl_min_fminimizer_set(s, &F, m, min, max);
682 status = gsl_min_fminimizer_iterate(s);
684 if ((status != GSL_SUCCESS) && (status != GSL_CONTINUE))
685 check_GSL_fail(status,
true,
"GSL_minimize_1D",
"gsl_min_fminimizer_iterate");
687 m = gsl_min_fminimizer_x_minimum(s);
688 min = gsl_min_fminimizer_x_lower(s);
689 max = gsl_min_fminimizer_x_upper(s);
691 status = gsl_min_test_interval(min, max, 0.001, 0.0);
693 if ((status != GSL_SUCCESS) && (status != GSL_CONTINUE))
694 check_GSL_fail(status,
true,
"GSL_minimize_1D",
"gsl_min_test_interval");
697 while (status==GSL_CONTINUE && iter<max_iter);
699 gsl_min_fminimizer_free(s);
701 if (status==GSL_SUCCESS)
702 coutCBL <<
"Converged to a minimum at iteration " << iter <<
" (<" << max_iter <<
")" << endl;
703 else if (status==GSL_CONTINUE)
704 ErrorCBL(
"Minimization has not converged. Try with lower tolerance or larger number of iterations",
"GSL_minimize_1D",
"GSLwrapper.cpp");
717 (void)fixed_parameters;
718 return gsl_poly_eval(coeff.data(), coeff.size(), x);
727 gsl_set_error_handler_off();
729 size_t size = coeff.size();
730 size_t root_size = 2*(size-1);
731 double *z =
new double[root_size];
733 gsl_poly_complex_workspace *w = gsl_poly_complex_workspace_alloc(size);
735 int status = gsl_poly_complex_solve(coeff.data(), size, w, z);
737 check_GSL_fail(status,
true,
"GSL_polynomial",
"gsl_poly_complex_solve");
739 gsl_poly_complex_workspace_free(w);
740 root.resize(size-1,vector<double>(2,0));
742 for (
size_t i=0; i<size-1; i++) {
744 root[i][1] = z[2*i+1];
functions that wrap GSL routines for integration, root finding and minimization
#define coutCBL
CBL print message.
static const char fDP6[]
conversion symbol for: double -> std::string
static const char fDP3[]
conversion symbol for: double -> std::string
static const std::string defaultString
default std::string value
static const double defaultDouble
default double value
static const double alpha
: the fine-structure constant
double GSL_minimize_1D(FunctionDoubleDouble func, const double start, double min=par::defaultDouble, double max=-par::defaultDouble, const int max_iter=1000, const bool verbose=false)
minimize the provided function using GSL procedure
double generic_function(const double xx, void *params)
function used to integrate interpolated function
double generic_roots(double xx, void *params)
generic roots
std::vector< double > GSL_minimize_nD(FunctionDoubleVector func, const std::vector< double > start, const std::vector< std::vector< double >> ranges, const unsigned int max_iter=1000, const double tol=1.e-6, const double epsilon=0.1)
minimize the provided function using GSL procedure
double generic_minimizer(const gsl_vector *xx, void *params)
generic roots
double GSL_derivative(gsl_function Func, const double xx, const double hh, const double prec=1.e-2)
the derivative of a function
double GSL_integrate_qagiu(gsl_function Func, const double a, const double rel_err=1.e-3, const double abs_err=0, const int limit_size=1000)
integral, computed using the GSL qagiu method
void GSL_polynomial_root(const std::vector< double > coeff, std::vector< std::vector< double >> &root)
find polynomial roots
double GSL_integrate_qags(gsl_function Func, const double a, const double b, const double rel_err=1.e-3, const double abs_err=0, const int limit_size=1000)
integral, computed using the GSL qags method
double GSL_integrate_romberg(gsl_function Func, const double a, const double b, const int npoints, const double eps_rel=1.e-4, const double eps_abs=1.e-12)
integral, using the gsl romberg method
double GSL_integrate_cquad(gsl_function func, const double a, const double b, const double rel_err=1.e-3, const double abs_err=0, const int nevals=100)
integral, using the gsl cquad method
void check_GSL_fail(const int status, const bool exit, const std::string CBLfunction, const std::string GSLroutine)
Function used to check output of the wrapped GSL routines.
double generic_minimizer_return(const gsl_vector *xx, void *params)
generic roots
double GSL_integrate_qaws(gsl_function Func, const double a, const double b, const double alpha=0, const double beta=0, const int mu=1, const int nu=0, const double rel_err=1.e-3, const double abs_err=0, const int limit_size=1000)
integral, computed using the GSL qaws method
double GSL_polynomial_eval(const double x, const std::shared_ptr< void > fixed_parameters, const std::vector< double > coeff)
evaluate a polynomial
double GSL_root_brent(gsl_function Func, const double low_guess, const double up_guess, const double rel_err=1.e-3, const double abs_err=0)
function to find roots using GSL qag method
double GSL_integrate_qag(gsl_function Func, const double a, const double b, const double rel_err=1.e-3, const double abs_err=0, const int limit_size=1000, const int rule=6)
integral, computed using the GSL qag method
The global namespace of the CosmoBolognaLib
std::string conv(const T val, const char *fact)
convert a number to a std::string
std::function< double(std::vector< double >)> FunctionDoubleVector
typedef of a function returning a double with a vector in input
int ErrorCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL, const cbl::glob::ExitCode exitCode=cbl::glob::ExitCode::_error_)
throw an exception: it is used for handling exceptions inside the CosmoBolognaLib
bool inRange(T value, T min, T max, bool include_limits=true)
return false value outside the range; true value inside the range
std::function< double(double)> FunctionDoubleDouble
typedef of a function returning a double with a double in input
std::function< double(double, std::shared_ptr< void >, std::vector< double > &)> FunctionDoubleDoublePtrVectorRef
typedef of a function returning a double with a double, a pointer and a vector reference in input
std::function< double(std::vector< double > &)> FunctionDoubleVectorRef
typedef of a function returning a double with a vector reference in input
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message