alpaqa 1.1.0a1
Nonconvex constrained optimization
Loading...
Searching...
No Matches
CasADiProblem.hpp
Go to the documentation of this file.
1#pragma once
2
8#include <guanaqo/copyable-unique_ptr.hpp>
9#include <guanaqo/dl-flags.hpp>
10#include <guanaqo/not-implemented.hpp>
11#include <filesystem>
12#include <map>
13#include <string>
14
15#if ALPAQA_WITH_EXTERNAL_CASADI
16// Forward declaration
17namespace casadi {
18class Function;
19} // namespace casadi
20#else
22#endif
23
24namespace alpaqa {
25
26using guanaqo::DynamicLoadFlags;
27using guanaqo::not_implemented_error;
28
30namespace casadi_loader {
31template <Config>
33} // namespace casadi_loader
34
35struct CASADI_LOADER_EXPORT SerializedCasADiFunctions {
36 std::map<std::string, std::string> functions;
37};
38
39struct CASADI_LOADER_EXPORT CasADiFunctions {
40 std::map<std::string, casadi::Function> functions;
42};
43
44/// Problem definition for a CasADi problem, loaded from a DLL.
45/// @ingroup grp_Problems
46template <Config Conf = EigenConfigd>
47class CasADiProblem : public BoxConstrProblem<Conf> {
48 public:
51 std::string name = "CasADiProblem";
52
53 /// Load a problem generated by CasADi (with parameters).
54 ///
55 /// @param filename
56 /// Filename of the shared library to load the functions from.
57 /// @param dl_flags
58 /// Flags passed to `dlopen` when loading the problem.
59 ///
60 /// The file should contain functions with the names `f`, `grad_f`, `g` and
61 /// `grad_g`. These functions evaluate the objective function, its gradient,
62 /// the constraints, and the constraint gradient times a vector respectively.
63 /// For second order solvers, additional functions `hess_L`, `hess_ψ`,
64 /// `hess_L_prod` and `hess_ψ_prod` can be provided to evaluate the
65 /// Hessian of the (augmented) Lagrangian and Hessian-vector products.
66 ///
67 /// @throws std::invalid_argument
68 /// The dimensions of the loaded functions do not match.
69 CasADiProblem(const std::string &filename, DynamicLoadFlags dl_flags = {});
70 /// Create a problem from a collection of serialized CasADi functions.
72 /// Create a problem from a collection of CasADi functions.
75
79 CasADiProblem &operator=(CasADiProblem &&) noexcept;
80
81 /// Load the numerical problem data (bounds and parameters) from a CSV file.
82 /// The file should contain 7 rows, with the following contents:
83 /// 1. @ref BoxConstrProblem::variable_bounds lower bound [n]
84 /// 2. @ref BoxConstrProblem::variable_bounds upper bound [n]
85 /// 3. @ref BoxConstrProblem::general_bounds lower bound [m]
86 /// 4. @ref BoxConstrProblem::general_bounds upper bound [m]
87 /// 5. @ref param [p]
88 /// 6. @ref BoxConstrProblem::l1_reg [0, 1 or n]
89 /// 7. @ref BoxConstrProblem::penalty_alm_split [1]
90 ///
91 /// Line endings are encoded using a single line feed (`\n`), and the column
92 /// separator can be specified using the @p sep argument.
93 void load_numerical_data(const std::filesystem::path &filepath,
94 char sep = ',');
95
96 // clang-format off
97 [[nodiscard]] real_t eval_objective(crvec x) const;
98 void eval_objective_gradient(crvec x, rvec grad_fx) const;
99 real_t eval_objective_and_gradient(crvec x, rvec grad_fx) const; // NOLINT(*nodiscard)
100 void eval_constraints(crvec x, rvec g) const;
101 void eval_constraints_gradient_product(crvec x, crvec y, rvec grad_gxy) const;
102 void eval_augmented_lagrangian_gradient(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const;
103 real_t eval_augmented_lagrangian_and_gradient(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const; // NOLINT(*nodiscard)
104 void eval_lagrangian_gradient(crvec x, crvec y, rvec grad_L, rvec work_n) const;
105 [[nodiscard]] real_t eval_augmented_lagrangian(crvec x, crvec y, crvec Σ, rvec ŷ) const;
106 void eval_grad_gi(crvec x, index_t i, rvec grad_i) const;
107 [[nodiscard]] Sparsity get_constraints_jacobian_sparsity() const;
108 void eval_constraints_jacobian(crvec x, rvec J_values) const;
109 void eval_lagrangian_hessian_product(crvec x, crvec y, real_t scale, crvec v, rvec Hv) const;
110 [[nodiscard]] Sparsity get_lagrangian_hessian_sparsity() const;
111 void eval_lagrangian_hessian(crvec x, crvec y, real_t scale, rvec H_values) const;
113 [[nodiscard]] Sparsity get_augmented_lagrangian_hessian_sparsity() const;
114 void eval_augmented_lagrangian_hessian(crvec x, crvec y, crvec Σ, real_t scale, rvec H_values) const;
115 // clang-format on
116
117 /// @see @ref TypeErasedProblem::provides_eval_lagrangian_gradient
118 [[nodiscard]] bool provides_eval_lagrangian_gradient() const;
119 /// @see @ref TypeErasedProblem::provides_eval_augmented_lagrangian
120 [[nodiscard]] bool provides_eval_augmented_lagrangian() const;
121 /// @see @ref TypeErasedProblem::provides_eval_augmented_lagrangian_gradient
122 [[nodiscard]] bool provides_eval_augmented_lagrangian_gradient() const;
123 /// @see @ref TypeErasedProblem::provides_eval_augmented_lagrangian_and_gradient
124 [[nodiscard]] bool provides_eval_augmented_lagrangian_and_gradient() const;
125 /// @see @ref TypeErasedProblem::provides_eval_grad_gi
126 [[nodiscard]] bool provides_eval_grad_gi() const;
127 /// @see @ref TypeErasedProblem::provides_eval_constraints_jacobian
128 [[nodiscard]] bool provides_eval_constraints_jacobian() const;
129 /// @see @ref TypeErasedProblem::provides_eval_lagrangian_hessian_product
130 [[nodiscard]] bool provides_eval_lagrangian_hessian_product() const;
131 /// @see @ref TypeErasedProblem::provides_eval_lagrangian_hessian
132 [[nodiscard]] bool provides_eval_lagrangian_hessian() const;
133 /// @see @ref TypeErasedProblem::provides_eval_augmented_lagrangian_hessian_product
134 [[nodiscard]] bool
136 /// @see @ref TypeErasedProblem::provides_eval_augmented_lagrangian_hessian
137 [[nodiscard]] bool provides_eval_augmented_lagrangian_hessian() const;
138
139 /// @see @ref TypeErasedProblem::get_name
140 [[nodiscard]] std::string get_name() const;
141
142 private:
143 using Functions = casadi_loader::CasADiFunctionsWithParam<Conf>;
144 guanaqo::copyable_unique_ptr<Functions> impl;
145};
146
148
150} // namespace alpaqa
#define CASADI_LOADER_EXPORT_EXTERN_TEMPLATE(strcls, name,...)
#define BEGIN_ALPAQA_CASADI_LOADER_NAMESPACE
#define END_ALPAQA_CASADI_LOADER_NAMESPACE
BoxConstrProblem(length_t num_variables, length_t num_constraints)
std::string get_name() const
bool provides_eval_constraints_jacobian() const
Sparsity get_lagrangian_hessian_sparsity() const
void eval_lagrangian_hessian_product(crvec x, crvec y, real_t scale, crvec v, rvec Hv) const
guanaqo::copyable_unique_ptr< Functions > impl
void eval_lagrangian_hessian(crvec x, crvec y, real_t scale, rvec H_values) const
bool provides_eval_augmented_lagrangian() const
real_t eval_objective_and_gradient(crvec x, rvec grad_fx) const
real_t eval_augmented_lagrangian(crvec x, crvec y, crvec Σ, rvec ŷ) const
bool provides_eval_augmented_lagrangian_and_gradient() const
void eval_constraints_jacobian(crvec x, rvec J_values) const
void load_numerical_data(const std::filesystem::path &filepath, char sep=',')
Load the numerical problem data (bounds and parameters) from a CSV file.
CasADiProblem & operator=(const CasADiProblem &)
real_t eval_objective(crvec x) const
void eval_augmented_lagrangian_hessian_product(crvec x, crvec y, crvec Σ, real_t scale, crvec v, rvec Hv) const
CasADiProblem(CasADiProblem &&) noexcept
bool provides_eval_lagrangian_hessian_product() const
casadi_loader::CasADiFunctionsWithParam< Conf > Functions
void eval_lagrangian_gradient(crvec x, crvec y, rvec grad_L, rvec work_n) const
CasADiProblem(const std::string &filename, DynamicLoadFlags dl_flags={})
Load a problem generated by CasADi (with parameters).
real_t eval_augmented_lagrangian_and_gradient(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const
Sparsity get_constraints_jacobian_sparsity() const
void eval_augmented_lagrangian_gradient(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const
void eval_augmented_lagrangian_hessian(crvec x, crvec y, crvec Σ, real_t scale, rvec H_values) const
bool provides_eval_augmented_lagrangian_hessian() const
bool provides_eval_augmented_lagrangian_gradient() const
void eval_constraints(crvec x, rvec g) const
bool provides_eval_grad_gi() const
void eval_objective_gradient(crvec x, rvec grad_fx) const
bool provides_eval_augmented_lagrangian_hessian_product() const
CasADiProblem(const CasADiProblem &)
void eval_grad_gi(crvec x, index_t i, rvec grad_i) const
bool provides_eval_lagrangian_hessian() const
void eval_constraints_gradient_product(crvec x, crvec y, rvec grad_gxy) const
Sparsity get_augmented_lagrangian_hessian_sparsity() const
bool provides_eval_lagrangian_gradient() const
#define USING_ALPAQA_CONFIG(Conf)
Definition config.hpp:77
typename Conf::real_t real_t
Definition config.hpp:86
typename Conf::index_t index_t
Definition config.hpp:104
typename Conf::rvec rvec
Definition config.hpp:91
typename Conf::crvec crvec
Definition config.hpp:92
typename Conf::vec vec
Definition config.hpp:88
std::map< std::string, std::string > functions
std::map< std::string, casadi::Function > functions
Double-precision double configuration.
Definition config.hpp:176