18 #ifndef BUBBLEPROFILER_GSL_ROOT_FINDER_HPP_INCLUDED 19 #define BUBBLEPROFILER_GSL_ROOT_FINDER_HPP_INCLUDED 26 #include <gsl/gsl_multiroots.h> 57 using Function = std::function<Function_value(const Function_argument&)>;
72 static int gsl_function(
const gsl_vector*,
void*, gsl_vector*);
77 const gsl_vector* x,
void* parameters, gsl_vector* f)
79 const std::size_t length = x->size;
80 for (std::size_t i = 0; i < length; ++i) {
81 if (!std::isfinite(gsl_vector_get(x, i))) {
82 gsl_vector_set_all(f, std::numeric_limits<double>::max());
90 result.setConstant(std::numeric_limits<double>::max());
92 int status = GSL_SUCCESS;
94 result = (*func)(arg);
95 bool finite_result =
true;
96 for (std::size_t i = 0; i < length; ++i) {
97 finite_result = finite_result && std::isfinite(result(i));
99 status = finite_result ? GSL_SUCCESS : GSL_EDOM;
100 }
catch (
const Error&) {
104 for (std::size_t i = 0; i < length; ++i) {
105 gsl_vector_set(f, i, result(i));
117 "invalid function provided");
120 n_dims = initial_guess.size();
124 void* parameters = &
function;
127 gsl_multiroot_fsolver* solver
134 const auto handler = gsl_set_error_handler_off();
137 [solver, handler]() {
138 gsl_multiroot_fsolver_free(solver);
139 gsl_set_error_handler(handler);
142 gsl_vector* guess = gsl_vector_alloc(
n_dims);
150 gsl_vector_free(guess);
153 for (std::size_t i = 0; i <
n_dims; ++i) {
154 gsl_vector_set(guess, i, initial_guess(i));
157 gsl_multiroot_fsolver_set(solver, &func, guess);
159 std::size_t iterations = 0;
164 status = gsl_multiroot_fsolver_iterate(solver);
171 status = gsl_multiroot_test_residual(solver->f,
abs_err);
173 status = gsl_multiroot_test_delta(solver->dx, solver->x,
178 for (std::size_t i = 0; i <
n_dims; ++i) {
179 solution(i) = gsl_vector_get(solver->x, i);
194 throw Setup_error(
"GSL_root_finder::get_gsl_solver: " 195 "unrecognized solver type");
void set_absolute_error(double e)
const gsl_multiroot_fsolver_type * get_gsl_solver_type() const
void set_algorithm(Algorithm a)
std::size_t max_iterations
Eigen::Matrix< double, N, 1 > Function_value
virtual Root_finder_status solve(const Function &, const Function_argument &) override
Exception indicating that memory allocation failed.
Algorithm solver_algorithm
void set_relative_error(double e)
static int gsl_function(const gsl_vector *, void *, gsl_vector *)
Function_argument solution
bool use_stepsize_convergence
constexpr RAII_guard< F > make_raii_guard(F f)
void set_max_iterations(std::size_t i)
virtual ~GSL_root_finder()=default
Eigen::Matrix< double, N, 1 > Function_argument
virtual const Function_argument & get_solution() const override
std::function< Function_value(const Function_argument &)> Function
Exception indicating general setup error.
void set_use_stepsize_convergence_check(bool flag)