5#include <guanaqo/demangled-typename.hpp>
6#include <guanaqo/string-util.hpp>
22#include <guanaqo/dl-flags.hpp>
34using namespace std::string_view_literals;
48 auto pfx = std::string_view{s.
full_key.begin(), s.
key.begin()};
49 return {.leaf =
true, .prefix = pfx, .members = {}};
57 auto [key, remainder] = guanaqo::split(s.
key,
".");
58 auto it = m.find(key);
60 auto pfx = std::string_view{s.
full_key.begin(), s.
key.begin()};
61 if (key.end() != s.
key.end() || s.
value)
62 return {.leaf =
false, .prefix = pfx, .members = {}};
63 auto members = std::views::transform(m, [](
const auto &e) {
67 .suffix = e.second.leaf ?
'=' :
'.',
73 .members = {members.begin(), members.end()},
77 recurse.
key = remainder;
78 return it->second.get(recurse);
83 requires requires { enum_table<T, MemberGetter>::table; }
86 auto pfx = std::string_view{s.
full_key.begin(), s.
key.begin()};
87 auto members = std::views::transform(m, [](
const auto &e) {
91 .suffix = std::nullopt,
97 .members = {members.begin(), members.end()},
104 auto pfx = std::string_view{s.
full_key.begin(), s.
key.begin()};
108 .members = {{.name =
"true"}, {.name =
"false"}},
128 PARAMS_MEMBER(sol,
"Folder to write the solutions and statistics to"),
131 "Initial guess for the general constraint multipliers"),
133 "Initial guess for the bound constraint multipliers"),
134 PARAMS_MEMBER(num_exp,
"Number of times to repeat the experiment"),
135 PARAMS_MEMBER(extra_stats,
"Log more per-iteration solver statistics"),
136 PARAMS_MEMBER(show_funcs,
"Print the provided problem functions"),
152 for (
auto &e : r.members)
158 auto [key, remainder] = guanaqo::split(s.
key,
".");
160 recurse.
key = remainder;
171 return {.leaf =
false, .prefix =
"", .members = {}};
175 .members = {{.name =
"alm",
176 .doc =
"Options for the augmented Lagrangian method",
179 .doc =
"Options for the inner solver",
182 .doc =
"Options for the direction provider",
185 .doc =
"Options for the accelerator",
192 auto [key, remainder] = guanaqo::split(s.
key,
".");
194 recurse.
key = remainder;
200 if (key.end() != s.
key.end() || s.
value)
201 return {.leaf =
false, .prefix =
"", .members = {}};
205 .members = {{.name =
"alm",
206 .doc =
"Options for the augmented Lagrangian method",
209 .doc =
"Options for the inner solver",
220using dict_t = std::map<std::string_view, Method>;
242 if (s.
key ==
"method") {
243 auto members = std::views::transform(
methods, [](
const auto &e) {
247 .suffix = std::nullopt,
253 .members = {members.begin(), members.end()},
260 const auto &m =
methods.at(method);
261 auto result = m.func(s);
262 if (result.members.empty())
264 else if (result.prefix.empty())
267 }
catch (std::out_of_range &) {
273 auto [key, value] = guanaqo::split(params,
"=");
274 bool has_value = key.end() != params.end();
278 .value = has_value ? std::make_optional(value) : std::nullopt,
281 if (!result.members.empty()) {
282 std::cout <<
"_prefix:" << result.prefix;
283 if (!result.prefix.empty() && result.prefix.back() !=
'.')
284 std::cout << (result.leaf ?
'=' :
'.');
285 std::cout <<
"\n_suffix:";
290 std::accumulate(result.members.begin(), result.members.end(),
291 size_t{0}, [](
size_t acc,
const auto &m) {
292 return std::max(acc, m.name.size());
294 for (
const auto &member : result.members) {
295 auto name = member.name;
296 std::string padding(max_len - std::min(max_len, name.size()),
' ');
299 std::cout << *member.suffix;
300 std::cout <<
':' << name;
302 auto doc = member.doc->empty() ?
"(undocumented)" : *member.doc;
303 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(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.