32 typename InnerSolver::Params solver_param;
33 solver_param.max_iter = 50'000;
34 solver_param.print_interval = 0;
38 if constexpr (
requires {
typename InnerSolver::Direction; }) {
40 using Direction =
typename InnerSolver::Direction;
41 typename Direction::DirectionParams dir_param;
42 typename Direction::AcceleratorParams accel_param;
48 .accelerator = accel_param,
49 .direction = dir_param,
53 return InnerSolver{solver_param};
59 std::ostream &os,
unsigned N_exp) {
69 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;
95 real_t final_γ = 0, final_h = 0;
96 if constexpr (
requires { stats.inner.final_γ; })
97 final_γ = stats.inner.final_γ;
98 if constexpr (
requires { stats.inner.final_h; })
99 final_h = stats.inner.final_h;
101 if constexpr (
requires { stats.inner.linesearch_failures; })
103 "linesearch_failures",
104 static_cast<index_t>(stats.inner.linesearch_failures));
105 if constexpr (
requires { stats.inner.linesearch_backtracks; })
107 "linesearch_backtracks",
108 static_cast<index_t>(stats.inner.linesearch_backtracks));
109 if constexpr (
requires { stats.inner.stepsize_backtracks; })
111 "stepsize_backtracks",
112 static_cast<index_t>(stats.inner.stepsize_backtracks));
113 if constexpr (
requires { stats.inner.direction_failures; })
115 "direction_failures",
116 static_cast<index_t>(stats.inner.direction_failures));
117 if constexpr (
requires { stats.inner.direction_update_rejected; })
119 "direction_update_rejected",
120 static_cast<index_t>(stats.inner.direction_update_rejected));
121 if constexpr (
requires { stats.inner.accelerated_step_rejected; })
123 "accelerated_step_rejected",
124 static_cast<index_t>(stats.inner.accelerated_step_rejected));
125 if constexpr (
requires { stats.inner.direction_failures; })
127 "direction_failures",
128 static_cast<index_t>(stats.inner.direction_failures));
129 if constexpr (
requires { stats.inner.direction_update_rejected; })
131 "direction_update_rejected",
132 static_cast<index_t>(stats.inner.direction_update_rejected));
137 .duration = avg_duration,
138 .solver = solver.get_name(),
143 .Σ = stats.norm_penalty,
146 .multipliers_bounds =
vec(0),
148 .outer_iter =
static_cast<index_t>(stats.outer_iterations),
149 .inner_iter =
static_cast<index_t>(stats.inner.iterations),
150 .extra = std::move(extra),