5#include <guanaqo/demangled-typename.hpp>
6#include <guanaqo/string-util.hpp>
22#include <guanaqo/dl-flags.hpp>
37using namespace std::string_view_literals;
51 auto pfx = std::string_view{s.
full_key.begin(), s.
key.begin()};
52 return {.leaf =
true, .prefix = pfx, .members = {}};
60 auto [key, remainder] = guanaqo::split(s.
key,
".");
61 auto it = m.find(key);
63 auto pfx = std::string_view{s.
full_key.begin(), s.
key.begin()};
64 if (key.end() != s.
key.end() || s.
value)
65 return {.leaf =
false, .prefix = pfx, .members = {}};
66 auto members = std::views::transform(m, [](
const auto &e) {
70 .suffix = e.second.leaf ?
'=' :
'.',
76 .members = {members.begin(), members.end()},
80 recurse.
key = remainder;
81 return it->second.get(recurse);
89 auto pfx = std::string_view{s.
full_key.begin(), s.
key.begin()};
90 auto members = std::views::transform(m, [](
const auto &e) {
94 .suffix = std::nullopt,
100 .members = {members.begin(), members.end()},
111 .members = {{.name =
"true"}, {.name =
"false"}},
126#if ALPAQA_WITH_LBFGSB
134 PARAMS_MEMBER(sol,
"Folder to write the solutions and statistics to"),
137 "Initial guess for the general constraint multipliers"),
139 "Initial guess for the bound constraint multipliers"),
140 PARAMS_MEMBER(num_exp,
"Number of times to repeat the experiment"),
141 PARAMS_MEMBER(extra_stats,
"Log more per-iteration solver statistics"),
142 PARAMS_MEMBER(show_funcs,
"Print the provided problem functions"),
158 for (
auto &e : r.members)
164 auto [key, remainder] = guanaqo::split(s.
key,
".");
166 recurse.
key = remainder;
176 if (key.end() != s.
key.end() || s.
value)
177 return {.leaf =
false, .prefix =
"", .members = {}};
181 .members = {{.name =
"alm",
182 .doc =
"Options for the augmented Lagrangian method",
185 .doc =
"Options for the inner solver",
188 .doc =
"Options for the direction provider",
191 .doc =
"Options for the accelerator",
198 auto [key, remainder] = guanaqo::split(s.
key,
".");
200 recurse.
key = remainder;
206 if (key.end() != s.
key.end() || s.
value)
207 return {.leaf =
false, .prefix =
"", .members = {}};
211 .members = {{.name =
"alm",
212 .doc =
"Options for the augmented Lagrangian method",
215 .doc =
"Options for the inner solver",
222 auto [key, remainder] = guanaqo::split(s.
key,
".");
224 recurse.
key = remainder;
230 if (key.end() != s.
key.end() || s.
value)
231 return {.leaf =
false, .prefix =
"", .members = {}};
235 .members = {{.name =
"alm",
236 .doc =
"Options for the augmented Lagrangian method",
239 .doc =
"Options for the inner solver",
250using dict_t = std::map<std::string_view, Method>;
268 #if ALPAQA_WITH_LBFGSB
277 if (s.
key ==
"method") {
278 auto members = std::views::transform(
methods, [](
const auto &e) {
282 .suffix = std::nullopt,
288 .members = {members.begin(), members.end()},
295 const auto &m =
methods.at(method);
296 auto result = m.func(s);
297 if (result.members.empty())
299 else if (result.prefix.empty())
302 }
catch (std::out_of_range &) {
308 auto [key, value] = guanaqo::split(params,
"=");
309 bool has_value = key.end() != params.end();
313 .value = has_value ? std::make_optional(value) : std::nullopt,
316 if (!result.members.empty()) {
317 std::cout <<
"_prefix:" << result.prefix;
318 if (!result.prefix.empty() && result.prefix.back() !=
'.')
319 std::cout << (result.leaf ?
'=' :
'.');
320 std::cout <<
"\n_suffix:";
325 std::accumulate(result.members.begin(), result.members.end(),
326 size_t{0}, [](
size_t acc,
const auto &m) {
327 return std::max(acc, m.name.size());
329 for (
const auto &member : result.members) {
330 auto name = member.name;
331 std::string padding(max_len - std::min(max_len, name.size()),
' ');
334 std::cout << *member.suffix;
335 std::cout <<
':' << name;
337 auto doc = member.doc->empty() ?
"(undocumented)" : *member.doc;
338 std::cout << padding <<
" -- " << doc <<
" ";
#define USING_ALPAQA_CONFIG(Conf)
Result get_members(const MemberGetter &s)
Catch-all.
std::string_view key
The subkey to resolve next.
std::string_view full_key
Full key string, used for diagnostics.
Result get_members< bool >(const MemberGetter &s)
True/false.
std::optional< std::string_view > value
The value of the parameter to store.
guanaqo::DynamicLoadFlags dl_flags
Specialize this type to define the attribute name to attribute setters dictionaries for a struct type...
Specialize this type to define the enumerator name to value dictionaries for an enum type T.
EigenConfigd DefaultConfig
Result get_results_lbfgsb(const MemberGetter &s)
Result get_results(std::string_view method, const MemberGetter &s)
Result get_results_fista_like(const MemberGetter &s)
Result(const MemberGetter &) func_t
std::map< std::string_view, Method > dict_t
Result get_results_panoc_like(const MemberGetter &s)
Result get_members(const MemberGetter &s)
Catch-all.
void print_completion(std::string_view method, std::string_view params)
void add_root_opts(std::vector< Result::Member > &v)
#define PARAMS_MEMBER(name,...)
Helper macro to easily initialize a attribute_table_t.
#define PARAMS_TABLE(type_,...)
Helper macro to easily specialize attribute_table.