alpaqa dll
Nonconvex constrained optimization
Loading...
Searching...
No Matches
CasADiLoader-util.hpp
Go to the documentation of this file.
1#pragma once
2
5#include <guanaqo/demangled-typename.hpp>
6#include <guanaqo/dl.hpp>
7
8#include <array>
9#include <optional>
10#include <stdexcept>
11#include <utility>
12
13#if ALPAQA_WITH_EXTERNAL_CASADI
14#include <casadi/core/casadi_types.hpp>
15#else
17#endif
18
19namespace alpaqa {
20
21using guanaqo::dynamic_load_error;
22
24namespace casadi_loader {
25
26template <class Loader, class F>
27auto wrap_load(Loader &&loader, const char *name, F f) {
28 try {
29 return f();
30 } catch (const invalid_argument_dimensions &e) {
31 throw std::invalid_argument(
32 "Unable to load function '" + loader.format_name(name) +
33 "': " + guanaqo::demangled_typename(typeid(e)) + ": " + e.what());
34 }
35}
36
37template <class T, class Loader, class... Args>
38auto wrapped_load(Loader &&loader, const char *name, Args &&...args) {
39 return wrap_load(loader, name, [&] {
40 return T(loader(name), std::forward<Args>(args)...);
41 });
42}
43
44template <class T, class Loader, class... Args>
45std::optional<T> try_load(Loader &&loader, const char *name, Args &&...args) {
46 try {
47 return std::make_optional(wrapped_load<T>(
48 std::forward<Loader>(loader), name, std::forward<Args>(args)...));
49#if ALPAQA_WITH_EXTERNAL_CASADI
50 } catch (casadi::CasadiException &) {
51 return std::nullopt;
52#else
53 } catch (dynamic_load_error &) {
54 return std::nullopt;
55#endif
56 } catch (std::out_of_range &) {
57 // TODO: can be made more robust against false positives
58 return std::nullopt;
59 }
60}
61
62using dim = std::pair<casadi_int, casadi_int>;
63inline constexpr auto dims(auto... a) {
64 if constexpr ((... && std::is_constructible_v<dim, decltype(a)>))
65 return std::array{a...};
66 else
67 return std::array{dim{a, 1}...};
68}
69
70} // namespace casadi_loader
72} // namespace alpaqa
#define BEGIN_ALPAQA_CASADI_LOADER_NAMESPACE
#define END_ALPAQA_CASADI_LOADER_NAMESPACE
auto wrapped_load(Loader &&loader, const char *name, Args &&...args)
std::optional< T > try_load(Loader &&loader, const char *name, Args &&...args)
constexpr auto dims(auto... a)
std::pair< casadi_int, casadi_int > dim
auto wrap_load(Loader &&loader, const char *name, F f)