13#include <pybind11/detail/typeid.h>
14#include <pybind11/pybind11.h>
15namespace py = pybind11;
20 : py::cast_error(e),
from(std::move(
from)),
to(std::move(
to)) {}
25template <
class T,
class A>
27 return [attr](T &
t,
const py::handle &h) {
29 t.*attr = h.cast<
A>();
30 }
catch (
const py::cast_error &e) {
36template <
class T,
class A>
38 return [attr](
const T &
t) {
return py::cast(
t.*attr); };
48 std::function<void(T &,
const py::handle &)>
set;
49 std::function<py::object(
const T &)>
get;
60 const auto &
m = kwargs_to_struct_table<T>;
61 for (
auto &&[key, val] : kwargs) {
62 auto skey = key.template cast<std::string>();
63 auto it =
m.find(skey);
65 throw py::key_error(
"Unknown parameter " + skey);
67 it->second.set(
t, val);
69 throw std::runtime_error(
"Error converting parameter '" + skey +
70 "' from " + e.
from +
" to '" + e.
to +
72 }
catch (
const std::runtime_error &e) {
73 throw std::runtime_error(
"Error setting parameter '" + skey +
81 const auto &
m = kwargs_to_struct_table<T>;
83 for (
auto &&[key, val] :
m) {
84 py::object o = val.get(
t);
85 if (py::hasattr(o,
"to_dict"))
86 o = o.attr(
"to_dict")();
87 d[key.c_str()] = std::move(o);
101 return struct_to_dict_helper<T>(
t);
106 return std::holds_alternative<T>(
p)
108 : kwargs_to_struct<T>(std::get<py::dict>(
p));
115 kwargs_to_struct_table<alpaqa::PANOCParams>{
125 {
"quadratic_upperbound_tolerance_factor",
127 {
"update_lipschitz_in_linesearch",
129 {
"alternative_linesearch_cond",
136 kwargs_to_struct_table<alpaqa::LipschitzEstimateParams>{
147 kwargs_to_struct_table<alpaqa::PGAParams>{
155 {
"quadratic_upperbound_tolerance_factor",
163 kwargs_to_struct_table<alpaqa::GAAPGAParams>{
172 {
"quadratic_upperbound_tolerance_factor",
182 kwargs_to_struct_table<alpaqa::StructuredPANOCLBFGSParams>{
189 {
"nonmonotone_linesearch",
194 {
"quadratic_upperbound_tolerance_factor",
195 &alpaqa::StructuredPANOCLBFGSParams::
196 quadratic_upperbound_tolerance_factor},
197 {
"update_lipschitz_in_linesearch",
199 {
"alternative_linesearch_cond",
202 {
"hessian_vec_finite_differences",
204 {
"full_augmented_hessian",
206 {
"hessian_step_size_heuristic",
215 kwargs_to_struct_table<alpaqa::LBFGSParams>{
232 kwargs_to_struct_table<alpaqa::ALMParams>{
std::function< py::object(const T &)> get
attr_setter_fun_t(A T::*attr)
std::function< void(T &, const py::handle &)> set
py::dict struct_to_dict(const T &t)
void kwargs_to_struct_helper(T &t, const py::kwargs &kwargs)
std::map< std::string, attr_setter_fun_t< T > > kwargs_to_struct_table_t
kwargs_to_struct_table_t< T > kwargs_to_struct_table
auto attr_setter(A T::*attr)
T kwargs_to_struct(const py::kwargs &kwargs)
T var_kwargs_to_struct(const std::variant< T, py::dict > &p)
auto attr_getter(A T::*attr)
py::dict struct_to_dict_helper(const T &t)
real_t Δ_lower
Factor to reduce ALMParams::Δ when inner convergence fails.
real_t Σ_min
Minimum penalty factor (used during initialization).
LipschitzEstimateParams Lipschitz
Parameters related to the Lipschitz constant estimate and step size.
real_t ε₀_increase
Factor to increase the initial primal tolerance if convergence fails in the first iteration.
real_t θ
Error tolerance for penalty increase.
real_t ε₀
Initial primal tolerance.
unsigned max_total_num_retries
Combined limit for ALMParams::max_num_initial_retries and ALMParams::max_num_retries.
real_t Lγ_factor
Factor that relates step size γ and Lipschitz constant.
bool alternative_linesearch_cond
bool rescale_when_γ_changes
real_t Δ
Factor used in updating the penalty parameters.
unsigned limitedqr_mem
Length of the history to keep in the limited-memory QR algorithm.
real_t Σ₀_lower
Factor to reduce the initial penalty factor by if convergence fails in in the first iteration.
real_t δ
Minimum step size for initial finite difference Lipschitz estimate.
bool update_lipschitz_in_linesearch
unsigned max_no_progress
Maximum number of iterations without any progress before giving up.
real_t L_max
Maximum Lipschitz constant estimate.
real_t σ₀
Initial penalty parameter factor.
real_t ρ
Update factor for primal tolerance.
bool full_augmented_hessian
unsigned int max_iter
Maximum number of outer ALM iterations.
unsigned memory
Length of the history to keep.
std::chrono::microseconds max_time
Maximum duration.
unsigned max_num_retries
How many times can the penalty update factor ALMParams::Δ and the primal tolerance factor ALMParams::...
bool hessian_vec_finite_differences
real_t Σ₀
Initial penalty parameter.
bool full_flush_on_γ_change
real_t ε
Relative step size for initial finite difference Lipschitz estimate.
real_t L₀
Initial estimate of the Lipschitz constant of ∇ψ(x)
unsigned max_num_initial_retries
How many times can the initial penalty ALMParams::Σ₀ or ALMParams::σ₀ and the initial primal toleranc...
struct alpaqa::LBFGSParams::@0 cbfgs
Parameters in the cautious BFGS update condition.
real_t quadratic_upperbound_tolerance_factor
unsigned print_interval
When to print progress.
real_t τ_min
Minimum weight factor between Newton step and projected gradient step.
real_t L_min
Minimum Lipschitz constant estimate.
real_t ρ_increase
Factor to increase the primal tolerance update factor by if convergence fails.
LBFGSStepSize lbfgs_stepsize
bool preconditioning
Apply preconditioning to the problem, based on the gradients in the starting point.
unsigned max_iter
Maximum number of inner PANOC iterations.
PANOCStopCrit stop_crit
What stopping criterion to use.
bool single_penalty_factor
Use one penalty factor for all m constraints.
real_t Σ_max
Maximum penalty factor.
real_t M
Lagrange multiplier bound.
unsigned hessian_step_size_heuristic
real_t nonmonotone_linesearch
Factor used in update for exponentially weighted nonmonotone line search.
cast_error_with_types(const py::cast_error &e, std::string from, std::string to)