4#include <alpaqa/dl-loader-export.h>
8#include <guanaqo/demangled-typename.hpp>
9#include <guanaqo/dl-flags.hpp>
10#include <guanaqo/dl.hpp>
22using guanaqo::dynamic_load_error;
23using guanaqo::DynamicLoadFlags;
26 using dynamic_load_error::dynamic_load_error;
35 ExtraFuncs(std::shared_ptr<function_dict_t> &&extra_funcs)
41 template <
class Signature>
42 requires std::is_function_v<Signature>
43 const std::function<Signature> &
extra_func(
const std::string &name)
const {
45 throw std::out_of_range(
"DLProblem: no extra functions");
48 throw std::out_of_range(
"DLProblem: no extra function named \"" +
52 return std::any_cast<const func_t &>(it->second).
function;
53 }
catch (
const std::bad_any_cast &) {
54 throw std::logic_error(
55 "DLProblem: incorrect type for extra function \"" + name +
57 guanaqo::demangled_typename(it->second.type()) +
')');
64 template <
class Ret,
class... FArgs,
class... Args>
67 FuncTag<Ret(
const instance_t *, FArgs...)>,
68 const std::string &name, Args &&...args)
const {
69 return extra_func<Ret(
const void *, FArgs...)>(name)(
70 instance, std::forward<Args>(args)...);
73 template <
class Ret,
class... FArgs,
class... Args>
76 const std::string &name, Args &&...args) {
77 return extra_func<Ret(
void *, FArgs...)>(name)(
78 instance, std::forward<Args>(args)...);
81 template <
class Ret,
class... FArgs,
class... Args>
83 const std::string &name,
84 Args &&...args)
const {
85 return extra_func<Ret(FArgs...)>(name)(std::forward<Args>(args)...);
112 const std::filesystem::path &so_filename,
116 const std::string &function_name =
"register_alpaqa_problem",
120 DynamicLoadFlags dl_flags = {});
124 const std::filesystem::path &so_filename,
128 const std::string &function_name,
130 std::any &user_param,
132 DynamicLoadFlags dl_flags = {});
136 const std::filesystem::path &so_filename,
140 const std::string &function_name,
142 std::span<std::string_view> user_param,
144 DynamicLoadFlags dl_flags = {});
215 template <
class Signature,
class... Args>
217 Args &&...args)
const {
218 return call_extra_func_helper(
instance.get(),
220 std::forward<Args>(args)...);
223 template <
class Signature,
class... Args>
227 std::forward<Args>(args)...);
253 const std::filesystem::path &so_filename,
257 const std::string &function_name =
"register_alpaqa_control_problem",
261 DynamicLoadFlags dl_flags = {});
287 void get_U(
Box &U)
const;
288 void get_D(
Box &D)
const;
289 void get_D_N(
Box &D)
const;
290 void get_x_init(
rvec x_init)
const;
306 [[nodiscard]]
length_t get_R_work_size()
const;
307 [[nodiscard]]
length_t get_S_work_size()
const;
309 void eval_constr_N(
crvec x,
rvec c)
const;
311 void eval_grad_constr_prod_N(
crvec x,
crvec p,
rvec grad_cx_p)
const;
315 [[nodiscard]]
bool provides_get_D()
const;
316 [[nodiscard]]
bool provides_get_D_N()
const;
317 [[nodiscard]]
bool provides_eval_add_Q_N()
const;
318 [[nodiscard]]
bool provides_eval_add_R_prod_masked()
const;
319 [[nodiscard]]
bool provides_eval_add_S_prod_masked()
const;
320 [[nodiscard]]
bool provides_get_R_work_size()
const;
321 [[nodiscard]]
bool provides_get_S_work_size()
const;
322 [[nodiscard]]
bool provides_eval_constr()
const;
323 [[nodiscard]]
bool provides_eval_constr_N()
const;
324 [[nodiscard]]
bool provides_eval_grad_constr_prod()
const;
325 [[nodiscard]]
bool provides_eval_grad_constr_prod_N()
const;
326 [[nodiscard]]
bool provides_eval_add_gn_hess_constr()
const;
327 [[nodiscard]]
bool provides_eval_add_gn_hess_constr_N()
const;
332 template <
class Signature,
class... Args>
334 Args &&...args)
const {
337 std::forward<Args>(args)...);
340 template <
class Signature,
class... Args>
344 std::forward<Args>(args)...);
BoxConstrProblem(length_t num_variables, length_t num_constraints)
ExtraFuncs::instance_t instance_t
DLControlProblem(const std::filesystem::path &so_filename, const std::string &function_name="register_alpaqa_control_problem", alpaqa_register_arg_t user_param={}, DynamicLoadFlags dl_flags={})
Load a problem from a shared library.
std::shared_ptr< void > instance
Problem instance created by the registration function, including the deleter to destroy it.
length_t get_nc_N() const
control_problem_functions_t * functions
Pointer to the struct of function pointers for evaluating the objective, constraints,...
decltype(auto) call_extra_func(const std::string &name, Args &&...args) const
length_t get_nh_N() const
alpaqa::Box< config_t > Box
decltype(auto) call_extra_func(const std::string &name, Args &&...args)
std::shared_ptr< void > handle
Handle to the shared module defining the problem.
ExtraFuncs extra_funcs
Dictionary of extra functions that were registered by the problem.
bool provides_eval_constraints_jacobian() const
ExtraFuncs::instance_t instance_t
bool provides_eval_objective() const
void eval_projection_multipliers(rvec y, real_t M) const
void eval_grad_gi(crvec x, index_t i, rvec grad_gi) const
Sparsity get_lagrangian_hessian_sparsity() const
void eval_objective_gradient(crvec x, rvec grad_fx) const
void eval_constraints(crvec x, rvec gx) const
void eval_constraints_gradient_product(crvec x, crvec y, rvec grad_gxy) const
real_t eval_augmented_lagrangian_and_gradient(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const
bool provides_eval_augmented_lagrangian() const
real_t eval_objective_and_gradient(crvec x, rvec grad_fx) const
bool provides_eval_constraints_gradient_product() const
bool provides_eval_objective_and_gradient() const
bool provides_eval_augmented_lagrangian_and_gradient() const
bool provides_eval_inactive_indices_res_lna() const
void eval_objective_gradient_and_constraints_gradient_product(crvec x, crvec y, rvec grad_f, rvec grad_gxy) const
std::shared_ptr< void > instance
Problem instance created by the registration function, including the deleter to destroy it.
bool provides_eval_objective_gradient_and_constraints_gradient_product() const
bool provides_eval_objective_and_constraints() const
real_t eval_objective(crvec x) const
decltype(auto) call_extra_func(const std::string &name, Args &&...args) const
DLProblem(const std::filesystem::path &so_filename, const std::string &function_name="register_alpaqa_problem", alpaqa_register_arg_t user_param={}, DynamicLoadFlags dl_flags={})
Load a problem from a shared library.
bool provides_get_lagrangian_hessian_sparsity() const
index_t eval_inactive_indices_res_lna(real_t γ, crvec x, crvec grad_ψ, rindexvec J) const
bool provides_eval_lagrangian_hessian_product() const
bool provides_get_constraints_jacobian_sparsity() const
void eval_augmented_lagrangian_hessian(crvec x, crvec y, crvec Σ, real_t scale, rvec H_values) const
void eval_augmented_lagrangian_gradient(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const
Sparsity get_constraints_jacobian_sparsity() const
bool provides_eval_constraints() const
bool provides_eval_augmented_lagrangian_hessian() const
void eval_lagrangian_gradient(crvec x, crvec y, rvec grad_L, rvec work_n) const
void eval_constraints_jacobian(crvec x, rvec J_values) const
real_t eval_objective_and_constraints(crvec x, rvec g) const
bool provides_eval_augmented_lagrangian_gradient() const
bool provides_get_variable_bounds() const
bool provides_eval_grad_gi() const
std::filesystem::path file
Path to the shared module file.
problem_functions_t * functions
Pointer to the struct of function pointers for evaluating the objective, constraints,...
bool provides_eval_augmented_lagrangian_hessian_product() const
decltype(auto) call_extra_func(const std::string &name, Args &&...args)
bool provides_get_general_bounds() const
bool provides_eval_lagrangian_hessian() const
std::shared_ptr< void > handle
Handle to the shared module defining the problem.
void eval_lagrangian_hessian_product(crvec x, crvec y, real_t scale, crvec v, rvec Hv) const
ExtraFuncs extra_funcs
Dictionary of extra functions that were registered by the problem.
bool provides_get_augmented_lagrangian_hessian_sparsity() const
Sparsity get_augmented_lagrangian_hessian_sparsity() const
bool provides_eval_objective_gradient() const
real_t eval_augmented_lagrangian(crvec x, crvec y, crvec Σ, rvec ŷ) const
bool provides_eval_lagrangian_gradient() const
void eval_lagrangian_hessian(crvec x, crvec y, real_t scale, rvec H_values) const
void eval_projecting_difference_constraints(crvec z, rvec e) const
void eval_augmented_lagrangian_hessian_product(crvec x, crvec y, crvec Σ, real_t scale, crvec v, rvec Hv) const
std::string get_name() const
real_t eval_proximal_gradient_step(real_t γ, crvec x, crvec grad_ψ, rvec x̂, rvec p) const
#define USING_ALPAQA_CONFIG(Conf)
User-provided argument that is passed to the problem registration functions.
std::function< Signature > function
Custom type for which we can export the RTTI to support std::any across shared library boundaries whe...
alpaqa_problem_functions_t problem_functions_t
EigenConfigd DefaultConfig
typename Conf::real_t real_t
typename Conf::rindexvec rindexvec
typename Conf::index_t index_t
alpaqa_control_problem_functions_t control_problem_functions_t
typename Conf::length_t length_t
typename Conf::crvec crvec
typename Conf::crindexvec crindexvec
Result(const MemberGetter &) func_t