alpaqa 1.0.0a8
Nonconvex constrained optimization
Loading...
Searching...
No Matches
dl-problem.hpp
Go to the documentation of this file.
1#pragma once
2
7
8#include <memory>
9#include <stdexcept>
10#include <string>
11#include <string_view>
12#include <type_traits>
13
14namespace alpaqa::dl {
15
16class DLLoader {
17 protected:
18 /// Load a shared library.
20 /// Filename of the shared library to load.
21 std::string so_filename,
22 /// Prefix of the symbols in the library.
23 std::string symbol_prefix);
24
25 protected:
26 std::string so_filename;
27 std::string symbol_prefix;
28
29 using dl_handle_t = std::shared_ptr<void>;
30 /// Handle to the shared library (returned by `dlopen`).
32
33 /// An associative array of additional functions exposed by the problem.
34 std::shared_ptr<function_dict_t> extra_functions;
35
36 /// Open the shared library using `dlopen`
37 [[nodiscard]] std::shared_ptr<void> load_lib() const;
38 /// Load a function with signature @p F from the library using `dlsym`.
39 template <class F>
40 [[nodiscard]] F *load_func(std::string_view name) const;
41
42 template <class Signature>
43 requires std::is_function_v<Signature>
44 const std::function<Signature> &extra_func(const std::string &name) const {
45 if (!extra_functions)
46 throw std::out_of_range("DLProblem: no extra functions");
47 auto it = extra_functions->dict.find(name);
48 if (it == extra_functions->dict.end())
49 throw std::out_of_range("DLProblem: no extra function named \"" +
50 name + '"');
51 try {
52 return std::any_cast<const std::function<Signature> &>(it->second);
53 } catch (const std::bad_any_cast &e) {
54 throw std::logic_error(
55 "DLProblem: incorrect type for extra function \"" + name +
56 "\" (stored type: " + demangled_typename(it->second.type()) +
57 ')');
58 }
59 }
60
61 public:
62 /// Unique type for calling an extra function that is a member function.
63 struct instance_t;
64
65 protected:
66 template <class Func>
67 struct FuncTag {};
68
69 template <class Ret, class... FArgs, class... Args>
70 decltype(auto)
71 call_extra_func_helper(const void *instance,
72 FuncTag<Ret(const instance_t *, FArgs...)>,
73 const std::string &name, Args &&...args) const {
74 return extra_func<Ret(const void *, FArgs...)>(name)(
75 instance, std::forward<Args>(args)...);
76 }
77
78 template <class Ret, class... FArgs, class... Args>
79 decltype(auto)
80 call_extra_func_helper(void *instance, FuncTag<Ret(instance_t *, FArgs...)>,
81 const std::string &name, Args &&...args) {
82 return extra_func<Ret(void *, FArgs...)>(name)(
83 instance, std::forward<Args>(args)...);
84 }
85
86 template <class Ret, class... FArgs, class... Args>
87 decltype(auto) call_extra_func_helper(const void *, FuncTag<Ret(FArgs...)>,
88 const std::string &name,
89 Args &&...args) const {
90 return extra_func<Ret(FArgs...)>(name)(std::forward<Args>(args)...);
91 }
92};
93
94/// Class that loads a problem using `dlopen`.
95///
96/// The shared library should export a C function with the name
97/// `<symbol_prefix>_register` that accepts a void pointer with user data, and
98/// returns a struct of type @ref alpaqa_problem_register_t that contains all
99/// data to represent the problem, as well as function pointers for all
100/// required operations. See @ref C++/DLProblem/main.cpp
101///
102/// @note Copies are shallow, they all share the same problem instance, take
103/// that into account when using multiple threads.
104///
105/// @ingroup grp_Problems
106/// @see @ref TypeErasedProblem
107class DLProblem : private DLLoader, public BoxConstrProblem<DefaultConfig> {
108 public:
110
111 /// Load a problem from a shared library.
112 DLProblem(
113 /// Filename of the shared library to load.
114 std::string so_filename,
115 /// Prefix of the registration function.
116 std::string symbol_prefix = "alpaqa_problem",
117 /// Pointer to custom user data to pass to the registration function.
118 void *user_param = nullptr);
119
120 private:
121 /// Problem instance created by the registration function, including the
122 /// deleter to destroy it.
123 std::shared_ptr<void> instance;
124 /// Pointer to the struct of function pointers for evaluating the objective,
125 /// constraints, their gradients, etc.
127
128 public:
129 // clang-format off
130 real_t eval_prox_grad_step(real_t γ, crvec x, crvec grad_ψ, rvec x̂, rvec p) const;
131 real_t eval_f(crvec x) const;
132 void eval_grad_f(crvec x, rvec grad_fx) const;
133 void eval_g(crvec x, rvec gx) const;
134 void eval_grad_g_prod(crvec x, crvec y, rvec grad_gxy) const;
135 void eval_jac_g(crvec x, rindexvec inner_idx, rindexvec outer_ptr, rvec J_values) const;
137 void eval_grad_gi(crvec x, index_t i, rvec grad_gi) const;
138 void eval_hess_L_prod(crvec x, crvec y, real_t scale, crvec v, rvec Hv) const;
139 void eval_hess_L(crvec x, crvec y, real_t scale, rindexvec inner_idx, rindexvec outer_ptr, rvec H_values) const;
141 void eval_hess_ψ_prod(crvec x, crvec y, crvec Σ, real_t scale, crvec v, rvec Hv) const;
142 void eval_hess_ψ(crvec x, crvec y, crvec Σ, real_t scale, rindexvec inner_idx, rindexvec outer_ptr, rvec H_values) const;
144 real_t eval_f_grad_f(crvec x, rvec grad_fx) const;
145 real_t eval_f_g(crvec x, rvec g) const;
146 void eval_grad_f_grad_g_prod(crvec x, crvec y, rvec grad_f, rvec grad_gxy) const;
147 void eval_grad_L(crvec x, crvec y, rvec grad_L, rvec work_n) const;
148 real_t eval_ψ(crvec x, crvec y, crvec Σ, rvec ŷ) const;
149 void eval_grad_ψ(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const;
150 real_t eval_ψ_grad_ψ(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const;
151
152 [[nodiscard]] bool provides_eval_f() const;
153 [[nodiscard]] bool provides_eval_grad_f() const;
154 [[nodiscard]] bool provides_eval_g() const;
155 [[nodiscard]] bool provides_eval_grad_g_prod() const;
156 [[nodiscard]] bool provides_eval_jac_g() const;
157 [[nodiscard]] bool provides_get_jac_g_num_nonzeros() const;
158 [[nodiscard]] bool provides_eval_grad_gi() const;
159 [[nodiscard]] bool provides_eval_hess_L_prod() const;
160 [[nodiscard]] bool provides_eval_hess_L() const;
161 [[nodiscard]] bool provides_get_hess_L_num_nonzeros() const;
162 [[nodiscard]] bool provides_eval_hess_ψ_prod() const;
163 [[nodiscard]] bool provides_eval_hess_ψ() const;
164 [[nodiscard]] bool provides_get_hess_ψ_num_nonzeros() const;
165 [[nodiscard]] bool provides_eval_f_grad_f() const;
166 [[nodiscard]] bool provides_eval_f_g() const;
167 [[nodiscard]] bool provides_eval_grad_f_grad_g_prod() const;
168 [[nodiscard]] bool provides_eval_grad_L() const;
169 [[nodiscard]] bool provides_eval_ψ() const;
170 [[nodiscard]] bool provides_eval_grad_ψ() const;
171 [[nodiscard]] bool provides_eval_ψ_grad_ψ() const;
172 [[nodiscard]] bool provides_get_box_C() const;
173 // clang-format on
174
175 using instance_t = DLLoader::instance_t;
176
177 template <class Signature, class... Args>
178 decltype(auto) call_extra_func(const std::string &name,
179 Args &&...args) const {
180 return extra_func_helper(instance.get(), FuncTag<Signature>{}, name,
181 std::forward<Args>(args)...);
182 }
183
184 template <class Signature, class... Args>
185 decltype(auto) call_extra_func(const std::string &name, Args &&...args) {
187 name, std::forward<Args>(args)...);
188 }
189};
190
191#if ALPAQA_WITH_OCP
192
193/// Class that loads an optimal control problem using `dlopen`.
194///
195/// The shared library should export a C function with the name
196/// `<symbol_prefix>_register` that accepts a void pointer with user data, and
197/// returns a struct of type @ref alpaqa_control_problem_register_t that
198/// contains all data to represent the problem, as well as function pointers for
199/// all required operations. See @ref C++/DLProblem/main.cpp
200///
201/// @note Copies are shallow, they all share the same problem instance, take
202/// that into account when using multiple threads.
203///
204/// @ingroup grp_Problems
205/// @see @ref TypeErasedControlProblem
206class DLControlProblem : private DLLoader {
207 public:
210
211 /// Load a problem from a shared library.
213 /// Filename of the shared library to load.
214 std::string so_filename,
215 /// Prefix of the registration function.
216 std::string symbol_prefix = "alpaqa_control_problem",
217 /// Pointer to custom user data to pass to the registration function.
218 void *user_param = nullptr);
219
220 private:
221 /// Problem instance created by the registration function, including the
222 /// deleter to destroy it.
223 std::shared_ptr<void> instance;
224 /// Pointer to the struct of function pointers for evaluating the objective,
225 /// constraints, their gradients, etc.
227
228 public:
229 length_t get_N() const { return functions->N; }
230 length_t get_nx() const { return functions->nx; }
231 length_t get_nu() const { return functions->nu; }
232 length_t get_nh() const { return functions->nh; }
233 length_t get_nh_N() const { return functions->nh_N; }
234 length_t get_nc() const { return functions->nc; }
235 length_t get_nc_N() const { return functions->nc_N; }
236
237 void check() const {} // TODO
238
239 // clang-format off
240 void get_U(Box &U) const;
241 void get_D(Box &D) const;
242 void get_D_N(Box &D) const;
243 void get_x_init(rvec x_init) const;
244 void eval_f(index_t timestep, crvec x, crvec u, rvec fxu) const;
245 void eval_jac_f(index_t timestep, crvec x, crvec u, rmat J_fxu) const;
246 void eval_grad_f_prod(index_t timestep, crvec x, crvec u, crvec p, rvec grad_fxu_p) const;
247 void eval_h(index_t timestep, crvec x, crvec u, rvec h) const;
248 void eval_h_N(crvec x, rvec h) const;
249 [[nodiscard]] real_t eval_l(index_t timestep, crvec h) const;
250 [[nodiscard]] real_t eval_l_N(crvec h) const;
251 void eval_qr(index_t timestep, crvec xu, crvec h, rvec qr) const;
252 void eval_q_N(crvec x, crvec h, rvec q) const;
253 void eval_add_Q(index_t timestep, crvec xu, crvec h, rmat Q) const;
254 void eval_add_Q_N(crvec x, crvec h, rmat Q) const;
255 void eval_add_R_masked(index_t timestep, crvec xu, crvec h, crindexvec mask, rmat R, rvec work) const;
256 void eval_add_S_masked(index_t timestep, crvec xu, crvec h, crindexvec mask, rmat S, rvec work) const;
257 void eval_add_R_prod_masked(index_t timestep, crvec xu, crvec h, crindexvec mask_J, crindexvec mask_K, crvec v, rvec out, rvec work) const;
258 void eval_add_S_prod_masked(index_t timestep, crvec xu, crvec h, crindexvec mask_K, crvec v, rvec out, rvec work) const;
259 [[nodiscard]] length_t get_R_work_size() const;
260 [[nodiscard]] length_t get_S_work_size() const;
261 void eval_constr(index_t timestep, crvec x, rvec c) const;
262 void eval_constr_N(crvec x, rvec c) const;
263 void eval_grad_constr_prod(index_t timestep, crvec x, crvec p, rvec grad_cx_p) const;
264 void eval_grad_constr_prod_N(crvec x, crvec p, rvec grad_cx_p) const;
265 void eval_add_gn_hess_constr(index_t timestep, crvec x, crvec M, rmat out) const;
266 void eval_add_gn_hess_constr_N(crvec x, crvec M, rmat out) const;
267
268 [[nodiscard]] bool provides_get_D() const;
269 [[nodiscard]] bool provides_get_D_N() const;
270 [[nodiscard]] bool provides_eval_add_Q_N() const;
271 [[nodiscard]] bool provides_eval_add_R_prod_masked() const;
272 [[nodiscard]] bool provides_eval_add_S_prod_masked() const;
273 [[nodiscard]] bool provides_get_R_work_size() const;
274 [[nodiscard]] bool provides_get_S_work_size() const;
275 [[nodiscard]] bool provides_eval_constr() const;
276 [[nodiscard]] bool provides_eval_constr_N() const;
277 [[nodiscard]] bool provides_eval_grad_constr_prod() const;
278 [[nodiscard]] bool provides_eval_grad_constr_prod_N() const;
279 [[nodiscard]] bool provides_eval_add_gn_hess_constr() const;
280 [[nodiscard]] bool provides_eval_add_gn_hess_constr_N() const;
281 // clang-format on
282
283 using instance_t = DLLoader::instance_t;
284
285 template <class Signature, class... Args>
286 decltype(auto) call_extra_func(const std::string &name,
287 Args &&...args) const {
288 return extra_func_helper(instance.get(), FuncTag<Signature>{}, name,
289 std::forward<Args>(args)...);
290 }
291
292 template <class Signature, class... Args>
293 decltype(auto) call_extra_func(const std::string &name, Args &&...args) {
295 name, std::forward<Args>(args)...);
296 }
297};
298
299#endif
300
301} // namespace alpaqa::dl
Implements common problem functions for minimization problems with box constraints.
Class that loads an optimal control problem using dlopen.
Definition: dl-problem.hpp:206
void eval_add_S_masked(index_t timestep, crvec xu, crvec h, crindexvec mask, rmat S, rvec work) const
Definition: dl-problem.cpp:177
bool provides_eval_grad_constr_prod() const
Definition: dl-problem.cpp:198
void eval_add_Q_N(crvec x, crvec h, rmat Q) const
Definition: dl-problem.cpp:175
bool provides_eval_add_gn_hess_constr() const
Definition: dl-problem.cpp:200
void eval_q_N(crvec x, crvec h, rvec q) const
Definition: dl-problem.cpp:173
void eval_add_gn_hess_constr(index_t timestep, crvec x, crvec M, rmat out) const
Definition: dl-problem.cpp:186
void eval_grad_constr_prod(index_t timestep, crvec x, crvec p, rvec grad_cx_p) const
Definition: dl-problem.cpp:184
void eval_add_R_prod_masked(index_t timestep, crvec xu, crvec h, crindexvec mask_J, crindexvec mask_K, crvec v, rvec out, rvec work) const
Definition: dl-problem.cpp:178
bool provides_eval_add_R_prod_masked() const
Definition: dl-problem.cpp:192
length_t get_S_work_size() const
Definition: dl-problem.cpp:181
void eval_constr_N(crvec x, rvec c) const
Definition: dl-problem.cpp:183
void get_D_N(Box &D) const
Definition: dl-problem.cpp:163
DLLoader::instance_t instance_t
Definition: dl-problem.hpp:283
bool provides_get_S_work_size() const
Definition: dl-problem.cpp:195
void eval_grad_f_prod(index_t timestep, crvec x, crvec u, crvec p, rvec grad_fxu_p) const
Definition: dl-problem.cpp:167
bool provides_eval_add_Q_N() const
Definition: dl-problem.cpp:191
std::shared_ptr< void > instance
Problem instance created by the registration function, including the deleter to destroy it.
Definition: dl-problem.hpp:223
void eval_jac_f(index_t timestep, crvec x, crvec u, rmat J_fxu) const
Definition: dl-problem.cpp:166
real_t eval_l_N(crvec h) const
Definition: dl-problem.cpp:171
void eval_h_N(crvec x, rvec h) const
Definition: dl-problem.cpp:169
real_t eval_l(index_t timestep, crvec h) const
Definition: dl-problem.cpp:170
void eval_grad_constr_prod_N(crvec x, crvec p, rvec grad_cx_p) const
Definition: dl-problem.cpp:185
control_problem_functions_t * functions
Pointer to the struct of function pointers for evaluating the objective, constraints,...
Definition: dl-problem.hpp:226
decltype(auto) call_extra_func(const std::string &name, Args &&...args) const
Definition: dl-problem.hpp:286
void eval_add_gn_hess_constr_N(crvec x, crvec M, rmat out) const
Definition: dl-problem.cpp:187
void get_U(Box &U) const
Definition: dl-problem.cpp:161
void eval_f(index_t timestep, crvec x, crvec u, rvec fxu) const
Definition: dl-problem.cpp:165
bool provides_eval_grad_constr_prod_N() const
Definition: dl-problem.cpp:199
length_t get_R_work_size() const
Definition: dl-problem.cpp:180
void eval_add_S_prod_masked(index_t timestep, crvec xu, crvec h, crindexvec mask_K, crvec v, rvec out, rvec work) const
Definition: dl-problem.cpp:179
bool provides_eval_add_S_prod_masked() const
Definition: dl-problem.cpp:193
void get_x_init(rvec x_init) const
Definition: dl-problem.cpp:164
void eval_h(index_t timestep, crvec x, crvec u, rvec h) const
Definition: dl-problem.cpp:168
decltype(auto) call_extra_func(const std::string &name, Args &&...args)
Definition: dl-problem.hpp:293
void eval_add_R_masked(index_t timestep, crvec xu, crvec h, crindexvec mask, rmat R, rvec work) const
Definition: dl-problem.cpp:176
void eval_qr(index_t timestep, crvec xu, crvec h, rvec qr) const
Definition: dl-problem.cpp:172
void get_D(Box &D) const
Definition: dl-problem.cpp:162
bool provides_eval_constr_N() const
Definition: dl-problem.cpp:197
void eval_add_Q(index_t timestep, crvec xu, crvec h, rmat Q) const
Definition: dl-problem.cpp:174
bool provides_get_R_work_size() const
Definition: dl-problem.cpp:194
bool provides_eval_add_gn_hess_constr_N() const
Definition: dl-problem.cpp:201
void eval_constr(index_t timestep, crvec x, rvec c) const
Definition: dl-problem.cpp:182
decltype(auto) call_extra_func_helper(const void *instance, FuncTag< Ret(const instance_t *, FArgs...)>, const std::string &name, Args &&...args) const
Definition: dl-problem.hpp:71
decltype(auto) call_extra_func_helper(void *instance, FuncTag< Ret(instance_t *, FArgs...)>, const std::string &name, Args &&...args)
Definition: dl-problem.hpp:80
const std::function< Signature > & extra_func(const std::string &name) const
Definition: dl-problem.hpp:44
std::shared_ptr< function_dict_t > extra_functions
An associative array of additional functions exposed by the problem.
Definition: dl-problem.hpp:34
decltype(auto) call_extra_func_helper(const void *, FuncTag< Ret(FArgs...)>, const std::string &name, Args &&...args) const
Definition: dl-problem.hpp:87
F * load_func(std::string_view name) const
Load a function with signature F from the library using dlsym.
Definition: dl-problem.cpp:22
std::string symbol_prefix
Definition: dl-problem.hpp:27
std::string so_filename
Definition: dl-problem.hpp:26
std::shared_ptr< void > load_lib() const
Open the shared library using dlopen
Definition: dl-problem.cpp:12
dl_handle_t handle
Handle to the shared library (returned by dlopen).
Definition: dl-problem.hpp:31
std::shared_ptr< void > dl_handle_t
Definition: dl-problem.hpp:29
Class that loads a problem using dlopen.
Definition: dl-problem.hpp:107
bool provides_eval_hess_L() const
Definition: dl-problem.cpp:128
real_t eval_prox_grad_step(real_t γ, crvec x, crvec grad_ψ, rvec x̂, rvec p) const
Definition: dl-problem.cpp:90
real_t eval_ψ_grad_ψ(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const
Definition: dl-problem.cpp:118
void eval_grad_gi(crvec x, index_t i, rvec grad_gi) const
Definition: dl-problem.cpp:103
void eval_hess_L_prod(crvec x, crvec y, real_t scale, crvec v, rvec Hv) const
Definition: dl-problem.cpp:106
bool provides_eval_hess_ψ_prod() const
Definition: dl-problem.cpp:130
void eval_hess_ψ_prod(crvec x, crvec y, crvec Σ, real_t scale, crvec v, rvec Hv) const
Definition: dl-problem.cpp:109
bool provides_eval_ψ_grad_ψ() const
Definition: dl-problem.cpp:139
bool provides_get_box_C() const
Definition: dl-problem.cpp:140
real_t eval_f_g(crvec x, rvec g) const
Definition: dl-problem.cpp:113
bool provides_get_hess_L_num_nonzeros() const
Definition: dl-problem.cpp:129
void eval_hess_L(crvec x, crvec y, real_t scale, rindexvec inner_idx, rindexvec outer_ptr, rvec H_values) const
Definition: dl-problem.cpp:107
void eval_grad_f(crvec x, rvec grad_fx) const
Definition: dl-problem.cpp:100
bool provides_get_jac_g_num_nonzeros() const
Definition: dl-problem.cpp:125
bool provides_eval_jac_g() const
Definition: dl-problem.cpp:124
void eval_grad_f_grad_g_prod(crvec x, crvec y, rvec grad_f, rvec grad_gxy) const
Definition: dl-problem.cpp:114
DLLoader::instance_t instance_t
Definition: dl-problem.hpp:175
real_t eval_ψ(crvec x, crvec y, crvec Σ, rvec ŷ) const
Definition: dl-problem.cpp:116
std::shared_ptr< void > instance
Problem instance created by the registration function, including the deleter to destroy it.
Definition: dl-problem.hpp:123
bool provides_eval_g() const
Definition: dl-problem.cpp:122
void eval_grad_ψ(crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m) const
Definition: dl-problem.cpp:117
bool provides_eval_grad_f_grad_g_prod() const
Definition: dl-problem.cpp:135
decltype(auto) call_extra_func(const std::string &name, Args &&...args) const
Definition: dl-problem.hpp:178
bool provides_eval_f() const
Definition: dl-problem.cpp:120
bool provides_eval_hess_L_prod() const
Definition: dl-problem.cpp:127
bool provides_eval_grad_g_prod() const
Definition: dl-problem.cpp:123
bool provides_get_hess_ψ_num_nonzeros() const
Definition: dl-problem.cpp:132
real_t eval_f_grad_f(crvec x, rvec grad_fx) const
Definition: dl-problem.cpp:112
bool provides_eval_f_grad_f() const
Definition: dl-problem.cpp:133
bool provides_eval_grad_f() const
Definition: dl-problem.cpp:121
bool provides_eval_grad_gi() const
Definition: dl-problem.cpp:126
bool provides_eval_f_g() const
Definition: dl-problem.cpp:134
problem_functions_t * functions
Pointer to the struct of function pointers for evaluating the objective, constraints,...
Definition: dl-problem.hpp:126
real_t eval_f(crvec x) const
Definition: dl-problem.cpp:99
void eval_jac_g(crvec x, rindexvec inner_idx, rindexvec outer_ptr, rvec J_values) const
Definition: dl-problem.cpp:104
bool provides_eval_grad_L() const
Definition: dl-problem.cpp:136
void eval_grad_g_prod(crvec x, crvec y, rvec grad_gxy) const
Definition: dl-problem.cpp:102
bool provides_eval_grad_ψ() const
Definition: dl-problem.cpp:138
decltype(auto) call_extra_func(const std::string &name, Args &&...args)
Definition: dl-problem.hpp:185
length_t get_jac_g_num_nonzeros() const
Definition: dl-problem.cpp:105
bool provides_eval_hess_ψ() const
Definition: dl-problem.cpp:131
void eval_grad_L(crvec x, crvec y, rvec grad_L, rvec work_n) const
Definition: dl-problem.cpp:115
void eval_g(crvec x, rvec gx) const
Definition: dl-problem.cpp:101
void eval_hess_ψ(crvec x, crvec y, crvec Σ, real_t scale, rindexvec inner_idx, rindexvec outer_ptr, rvec H_values) const
Definition: dl-problem.cpp:110
bool provides_eval_ψ() const
Definition: dl-problem.cpp:137
length_t get_hess_ψ_num_nonzeros() const
Definition: dl-problem.cpp:111
length_t get_hess_L_num_nonzeros() const
Definition: dl-problem.cpp:108
#define USING_ALPAQA_CONFIG(Conf)
Definition: config.hpp:42
std::string demangled_typename(const std::type_info &t)
Get the pretty name of the given type as a string.
typename Conf::rmat rmat
Definition: config.hpp:60
typename Conf::real_t real_t
Definition: config.hpp:51
typename Conf::rindexvec rindexvec
Definition: config.hpp:65
typename Conf::index_t index_t
Definition: config.hpp:63
typename Conf::length_t length_t
Definition: config.hpp:62
typename Conf::rvec rvec
Definition: config.hpp:55
typename Conf::crvec crvec
Definition: config.hpp:56
typename Conf::crindexvec crindexvec
Definition: config.hpp:66