alpaqa dll
Nonconvex constrained optimization
Loading...
Searching...
No Matches
casadi-external-function.cpp
Go to the documentation of this file.
3#include <guanaqo/dl.hpp>
4
5namespace alpaqa {
6
7using guanaqo::DynamicLoadFlags;
8
10namespace casadi {
11
12void Function::load(void *so_handle, const std::string &func_name) {
13 functions = {
14 .incref = fname_incref::load(so_handle, func_name),
15 .decref = fname_decref::load(so_handle, func_name),
16 .n_in = fname_n_in::load(so_handle, func_name),
17 .n_out = fname_n_out::load(so_handle, func_name),
18 .name_in = fname_name_in::load(so_handle, func_name),
19 .name_out = fname_name_out::load(so_handle, func_name),
20 .sparsity_in = fname_sparsity_in::load(so_handle, func_name),
21 .sparsity_out = fname_sparsity_out::load(so_handle, func_name),
22 .alloc_mem = fname_alloc_mem::load(so_handle, func_name),
23 .init_mem = fname_init_mem::load(so_handle, func_name),
24 .free_mem = fname_free_mem::load(so_handle, func_name),
25 .work = fname_work::load(so_handle, func_name),
26 .call = fname::load(so_handle, func_name),
27 };
28 functions.incref();
29}
30
32 if (work)
33 return;
34 mem = functions.alloc_mem();
35 functions.init_mem(mem); // TODO: what to do upon failure?
36 casadi_int sz_arg, sz_res, sz_iw, sz_w;
37 functions.work(&sz_arg, &sz_res, &sz_iw, &sz_w);
38 auto &w = work.emplace();
39 w.arg.resize(static_cast<size_t>(sz_arg));
40 w.res.resize(static_cast<size_t>(sz_res));
41 w.iw.resize(static_cast<size_t>(sz_iw));
42 w.w.resize(static_cast<size_t>(sz_w));
43}
44
45Function::Function() = default;
46Function::Function(std::shared_ptr<void> so_handle,
47 const std::string &func_name)
48 : so_handle{std::move(so_handle)} {
49 load(this->so_handle.get(), func_name);
50}
51static char no_handle;
53 : so_handle{&no_handle, [](void *) {}}, functions{functions} {
54 functions.incref();
55}
61 : so_handle{std::move(o.so_handle)}, functions{o.functions},
62 work{std::move(o.work)}, mem{std::exchange(o.mem, 0)} {}
64 if (so_handle) {
65 if (work)
66 functions.free_mem(mem);
67 functions.decref();
68 }
69}
70
71casadi_int Function::n_in() const { return functions.n_in(); }
72casadi_int Function::n_out() const { return functions.n_out(); }
73std::pair<casadi_int, casadi_int> Function::size_in(casadi_int n) const {
74 return sparsity_in(n).size();
75}
76std::pair<casadi_int, casadi_int> Function::size_out(casadi_int n) const {
77 return sparsity_out(n).size();
78}
92 return Sparsity{functions.sparsity_in(n)};
93}
95 return Sparsity{functions.sparsity_out(n)};
96}
97
98Function external(const std::string &name, const std::string &bin_name,
99 DynamicLoadFlags flags) {
100 auto lib_handle = guanaqo::load_lib(std::filesystem::path{bin_name}, flags);
101 return Function{std::move(lib_handle), name};
102}
103
104} // namespace casadi
106} // namespace alpaqa
#define BEGIN_ALPAQA_CASADI_LOADER_NAMESPACE
#define END_ALPAQA_CASADI_LOADER_NAMESPACE
std::pair< casadi_int, casadi_int > size() const
Class that loads and calls pre-compiled CasADi functions in a DLL/SO file.
casadi_int size1_out(casadi_int) const
std::pair< casadi_int, casadi_int > size_in(casadi_int) const
void load(void *so_handle, const std::string &func_name)
std::pair< casadi_int, casadi_int > size_out(casadi_int) const
Sparsity sparsity_in(casadi_int) const
casadi_int size2_out(casadi_int) const
Sparsity sparsity_out(casadi_int) const
casadi_int size1_in(casadi_int) const
casadi_int size2_in(casadi_int) const
Function external(const std::string &name, const std::string &bin_name, DynamicLoadFlags dl_flags)
Load the given CasADi function from the given DLL/SO file.
long long int casadi_int
static signature_t * load(void *handle, std::string fname)