11template <
class InnerSolver>
15 typename ALMSolver::Params alm_param;
16 alm_param.max_iter = 200;
17 alm_param.tolerance = 1e-8;
18 alm_param.dual_tolerance = 1e-8;
19 alm_param.print_interval = 1;
20 alm_param.print_precision = 1;
22 return ALMSolver{alm_param, std::forward<InnerSolver>(inner_solver)};
27template <
class InnerSolver>
30 typename InnerSolver::Params solver_param;
31 solver_param.max_iter = 50'000;
32 solver_param.print_interval = 0;
36 if constexpr (
requires {
typename InnerSolver::Direction; }) {
38 using Direction =
typename InnerSolver::Direction;
39 typename Direction::DirectionParams dir_param;
40 typename Direction::AcceleratorParams accel_param;
46 .accelerator = accel_param,
47 .direction = dir_param,
51 return InnerSolver{solver_param};
55template <
class Solver>
57 std::ostream &os,
unsigned N_exp) {
63 vec Σ = vec::Constant(problem.
problem.
get_m(), alpaqa::NaN<config_t>);
66 auto stats = solver(problem.
problem, x, y, Σ);
72 auto avg_duration = stats.elapsed_time;
73 os.setstate(std::ios_base::badbit);
74 for (
unsigned i = 0; i < N_exp; ++i) {
77 auto s = solver(problem.
problem, x, y);
80 os <<
"\rInterrupted after " << i <<
" runs" << std::endl;
84 avg_duration += s.elapsed_time;
87 avg_duration /= (N_exp + 1);
89 solver.os = &std::cout;
92 real_t final_γ = 0, final_h = 0;
93 if constexpr (
requires { stats.inner.final_γ; })
94 final_γ = stats.inner.final_γ;
95 if constexpr (
requires { stats.inner.final_h; })
96 final_h = stats.inner.final_h;
98 if constexpr (
requires { stats.inner.linesearch_failures; })
100 "linesearch_failures",
101 static_cast<index_t
>(stats.inner.linesearch_failures));
102 if constexpr (
requires { stats.inner.linesearch_backtracks; })
104 "linesearch_backtracks",
105 static_cast<index_t
>(stats.inner.linesearch_backtracks));
106 if constexpr (
requires { stats.inner.stepsize_backtracks; })
108 "stepsize_backtracks",
109 static_cast<index_t
>(stats.inner.stepsize_backtracks));
110 if constexpr (
requires { stats.inner.lbfgs_failures; })
111 extra.emplace_back(
"lbfgs_failures",
112 static_cast<index_t
>(stats.inner.lbfgs_failures));
113 if constexpr (
requires { stats.inner.lbfgs_rejected; })
114 extra.emplace_back(
"lbfgs_rejected",
115 static_cast<index_t
>(stats.inner.lbfgs_rejected));
116 if constexpr (
requires { stats.inner.accelerated_step_rejected; })
118 "accelerated_step_rejected",
119 static_cast<index_t
>(stats.inner.accelerated_step_rejected));
120 if constexpr (
requires { stats.inner.direction_failures; })
122 "direction_failures",
123 static_cast<index_t
>(stats.inner.direction_failures));
124 if constexpr (
requires { stats.inner.direction_update_rejected; })
126 "direction_update_rejected",
127 static_cast<index_t
>(stats.inner.direction_update_rejected));
132 .duration = avg_duration,
133 .solver = solver.get_name(),
138 .Σ = stats.norm_penalty,
141 .multipliers_bounds = vec(0),
143 .outer_iter =
static_cast<index_t
>(stats.outer_iterations),
144 .inner_iter =
static_cast<index_t
>(stats.inner.iterations),
145 .extra = std::move(extra),
auto make_inner_solver(Options &opts)
SolverResults run_alm_solver(LoadedProblem &problem, Solver &solver, std::ostream &os, unsigned N_exp)
auto make_alm_solver(InnerSolver &&inner_solver, Options &opts)
Augmented Lagrangian Method solver.
length_t get_m() const
[Required] Number of constraints.
#define USING_ALPAQA_CONFIG(Conf)
std::string_view enum_name(Ipopt::ApplicationReturnStatus s)
@ ProjGradUnitNorm
∞-norm of the projected gradient with unit step size:
@ Interrupted
Solver was interrupted by the user.
@ Converged
Converged and reached given tolerance.
decltype(auto) set_params(T &t, std::string_view prefix, Options &opts)
vec initial_guess_y
Unknowns.
alpaqa::TypeErasedProblem< config_t > problem
std::shared_ptr< alpaqa::EvalCounter > evaluations
std::vector< std::pair< std::string, any_stat_t > > extra
Double-precision double configuration.