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