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)};
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};
57 std::ostream &os,
unsigned N_exp) {
68 auto stats = solver(problem.
problem, x, y, Σ);
71 auto avg_duration = stats.elapsed_time;
72 os.setstate(std::ios_base::badbit);
73 for (
unsigned i = 0; i < N_exp; ++i) {
76 auto s = solver(problem.
problem, x, y);
79 os <<
"\rInterrupted after " << i <<
" runs" << std::endl;
83 avg_duration += s.elapsed_time;
86 avg_duration /= (N_exp + 1);
88 solver.os = &std::cout;
94 real_t final_γ = 0, final_h = 0;
95 if constexpr (
requires { stats.inner.final_γ; })
96 final_γ = stats.inner.final_γ;
97 if constexpr (
requires { stats.inner.final_h; })
98 final_h = stats.inner.final_h;
100 if constexpr (
requires { stats.inner.linesearch_failures; })
102 "linesearch_failures",
103 static_cast<index_t
>(stats.inner.linesearch_failures));
104 if constexpr (
requires { stats.inner.linesearch_backtracks; })
106 "linesearch_backtracks",
107 static_cast<index_t
>(stats.inner.linesearch_backtracks));
108 if constexpr (
requires { stats.inner.stepsize_backtracks; })
110 "stepsize_backtracks",
111 static_cast<index_t
>(stats.inner.stepsize_backtracks));
112 if constexpr (
requires { stats.inner.direction_failures; })
114 "direction_failures",
115 static_cast<index_t
>(stats.inner.direction_failures));
116 if constexpr (
requires { stats.inner.direction_update_rejected; })
118 "direction_update_rejected",
119 static_cast<index_t
>(stats.inner.direction_update_rejected));
120 if constexpr (
requires { stats.inner.accelerated_step_rejected; })
122 "accelerated_step_rejected",
123 static_cast<index_t
>(stats.inner.accelerated_step_rejected));
124 if constexpr (
requires { stats.inner.direction_failures; })
126 "direction_failures",
127 static_cast<index_t
>(stats.inner.direction_failures));
128 if constexpr (
requires { stats.inner.direction_update_rejected; })
130 "direction_update_rejected",
131 static_cast<index_t
>(stats.inner.direction_update_rejected));
136 .duration = avg_duration,
137 .solver = solver.get_name(),
142 .Σ = stats.norm_penalty,
145 .multipliers_bounds = vec(0),
147 .outer_iter =
static_cast<index_t
>(stats.outer_iterations),
148 .inner_iter =
static_cast<index_t
>(stats.inner.iterations),
149 .extra = std::move(extra),