alpaqa 1.0.0a19
Nonconvex constrained optimization
Loading...
Searching...
No Matches
panoc.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <alpaqa/export.hpp>
12
13#include <chrono>
14#include <iostream>
15#include <limits>
16#include <stdexcept>
17#include <string>
18#include <type_traits>
19
20namespace alpaqa {
21
22/// Tuning parameters for the PANOC algorithm.
23/// @ingroup grp_Parameters
24template <Config Conf = DefaultConfig>
27
28 /// Parameters related to the Lipschitz constant estimate and step size.
30 /// Maximum number of inner PANOC iterations.
31 unsigned max_iter = 100;
32 /// Maximum duration.
33 std::chrono::nanoseconds max_time = std::chrono::minutes(5);
34 /// Minimum weight factor between Newton step and projected gradient step.
36 /// Factor to decrease the line search factor by after a line search
37 /// failure.
39 /// Ignore the line search condition and always accept the accelerated step.
40 /// (For testing purposes only).
41 bool force_linesearch = false;
42 /// Parameter β used in the line search (see Algorithm 2 in
43 /// @cite de_marchi_proximal_2022). @f$ 0 < \beta < 1 @f$
45 /// Minimum Lipschitz constant estimate.
47 /// Maximum Lipschitz constant estimate.
49 /// What stopping criterion to use.
51 /// Maximum number of iterations without any progress before giving up.
52 unsigned max_no_progress = 10;
53
54 /// When to print progress. If set to zero, nothing will be printed.
55 /// If set to N != 0, progress is printed every N iterations.
56 unsigned print_interval = 0;
57 /// The precision of the floating point values printed by the solver.
58 int print_precision = std::numeric_limits<real_t>::max_digits10 / 2;
59
60 /// Tolerance factor used in the quadratic upper bound condition that
61 /// determines the step size. Its goal is to account for numerical errors
62 /// in the function and gradient evaluations. If you notice that the step
63 /// size γ becomes very small, you may want to increase this factor.
65 10 * std::numeric_limits<real_t>::epsilon();
66 /// Tolerance factor used in the line search. Its goal is to account for
67 /// numerical errors in the function and gradient evaluations. If you notice
68 /// that accelerated steps are rejected (τ = 0) when getting closer to the
69 /// solution, you may want to increase this factor.
71 10 * std::numeric_limits<real_t>::epsilon();
72
73 /// Use the candidate point rather than the accepted point to update the
74 /// quasi-Newton direction.
76 /// If the step size changes, the direction buffer is flushed. The current
77 /// step will still be used to update the direction, but may still use the
78 /// old step size. If set to true, the current step will be recomputed with
79 /// the new step size as well, to match the step in the candidate iterate.
81 /// When evaluating ψ(x̂) in a candidate point, always evaluate ∇ψ(x̂) as
82 /// well. Can be beneficial if computing ∇ψ(x̂) is not much more expensive
83 /// than computing just ψ(x), and if ∇ψ(x̂) is required in the next iteration
84 /// (e.g. for the stopping criterion, or when using the NoopDirection).
85 bool eager_gradient_eval = false;
86};
87
88template <Config Conf = DefaultConfig>
89struct PANOCStats {
91
94 std::chrono::nanoseconds elapsed_time{};
95 std::chrono::nanoseconds time_progress_callback{};
96 unsigned iterations = 0;
97 unsigned linesearch_failures = 0;
99 unsigned stepsize_backtracks = 0;
100 unsigned lbfgs_failures = 0;
101 unsigned lbfgs_rejected = 0;
102 unsigned τ_1_accepted = 0;
103 unsigned count_τ = 0;
109};
110
111template <Config Conf = DefaultConfig>
138
139/// PANOC solver for ALM.
140/// @ingroup grp_InnerSolvers
141template <class DirectionT>
143 public:
144 USING_ALPAQA_CONFIG_TEMPLATE(DirectionT::config_t);
145
152
154 requires std::default_initializable<Direction>
155 : params(params) {}
160
161 Stats operator()(const Problem &problem, // in
162 const SolveOptions &opts, // in
163 rvec x, // inout
164 rvec y, // inout
165 crvec Σ, // in
166 rvec err_z); // out
167
168 template <class P>
169 Stats operator()(const P &problem, const SolveOptions &opts, rvec x, rvec y,
170 crvec Σ, rvec e) {
171 return operator()(Problem{&problem}, opts, x, y, Σ, e);
172 }
173
174 template <class P>
175 Stats operator()(const P &problem, const SolveOptions &opts, rvec x) {
176 if (problem.get_m() != 0)
177 throw std::invalid_argument("Missing arguments y, Σ, e");
178 mvec y{nullptr, 0}, Σ{nullptr, 0}, e{nullptr, 0};
179 return operator()(problem, opts, x, y, Σ, e);
180 }
181
182 /// Specify a callable that is invoked with some intermediate results on
183 /// each iteration of the algorithm.
184 /// @see @ref ProgressInfo
186 set_progress_callback(std::function<void(const ProgressInfo &)> cb) {
187 this->progress_cb = cb;
188 return *this;
189 }
190
191 std::string get_name() const;
192
193 void stop() { stop_signal.stop(); }
194
195 const Params &get_params() const { return params; }
196
197 private:
200 std::function<void(const ProgressInfo &)> progress_cb;
202
203 public:
205 std::ostream *os = &std::cout;
206};
207
208template <class InnerSolverStats>
210
211template <Config Conf>
214
215 /// Total elapsed time in the inner solver.
216 std::chrono::nanoseconds elapsed_time{};
217 /// Total time spent in the user-provided progress callback.
218 std::chrono::nanoseconds time_progress_callback{};
219 /// Total number of inner PANOC iterations.
220 unsigned iterations = 0;
221 /// Total number of PANOC line search failures.
222 unsigned linesearch_failures = 0;
223 /// Total number of PANOC line search backtracking steps.
224 unsigned linesearch_backtracks = 0;
225 /// Total number of PANOC step size reductions.
226 unsigned stepsize_backtracks = 0;
227 /// Total number of times that the L-BFGS direction was not finite.
228 unsigned lbfgs_failures = 0;
229 /// Total number of times that the L-BFGS update was rejected (i.e. it
230 /// could have resulted in a non-positive definite Hessian estimate).
231 unsigned lbfgs_rejected = 0;
232 /// Total number of times that a line search parameter of @f$ \tau = 1 @f$
233 /// was accepted (i.e. no backtracking necessary).
234 unsigned τ_1_accepted = 0;
235 /// The total number of line searches performed (used for computing the
236 /// average value of @f$ \tau @f$).
237 unsigned count_τ = 0;
238 /// The sum of the line search parameter @f$ \tau @f$ in all iterations
239 /// (used for computing the average value of @f$ \tau @f$).
240 real_t sum_τ = 0;
241 /// The final PANOC step size γ.
242 real_t final_γ = 0;
243 /// Final value of the smooth cost @f$ \psi(\hat x) @f$.
244 real_t final_ψ = 0;
245 /// Final value of the nonsmooth cost @f$ h(\hat x) @f$.
246 real_t final_h = 0;
247 /// Final value of the forward-backward envelope, @f$ \varphi_\gamma(x) @f$
248 /// (note that this is in the point @f$ x @f$, not @f$ \hat x @f$).
249 real_t final_φγ = 0;
250};
251
252template <Config Conf>
255 const PANOCStats<Conf> &s) {
257 acc.elapsed_time += s.elapsed_time;
258 acc.time_progress_callback += s.time_progress_callback;
259 acc.linesearch_failures += s.linesearch_failures;
260 acc.linesearch_backtracks += s.linesearch_backtracks;
261 acc.stepsize_backtracks += s.stepsize_backtracks;
262 acc.lbfgs_failures += s.lbfgs_failures;
263 acc.lbfgs_rejected += s.lbfgs_rejected;
264 acc.τ_1_accepted += s.τ_1_accepted;
265 acc.count_τ += s.count_τ;
266 acc.sum_τ += s.sum_τ;
267 acc.final_γ = s.final_γ;
268 acc.final_ψ = s.final_ψ;
269 acc.final_h = s.final_h;
270 acc.final_φγ = s.final_φγ;
271 return acc;
272}
273
274// clang-format off
275ALPAQA_EXPORT_EXTERN_TEMPLATE(struct, PANOCParams, EigenConfigd);
276ALPAQA_IF_FLOAT(ALPAQA_EXPORT_EXTERN_TEMPLATE(struct, PANOCParams, EigenConfigf);)
277ALPAQA_IF_LONGD(ALPAQA_EXPORT_EXTERN_TEMPLATE(struct, PANOCParams, EigenConfigl);)
279
280ALPAQA_EXPORT_EXTERN_TEMPLATE(struct, PANOCStats, EigenConfigd);
281ALPAQA_IF_FLOAT(ALPAQA_EXPORT_EXTERN_TEMPLATE(struct, PANOCStats, EigenConfigf);)
282ALPAQA_IF_LONGD(ALPAQA_EXPORT_EXTERN_TEMPLATE(struct, PANOCStats, EigenConfigl);)
284
285ALPAQA_EXPORT_EXTERN_TEMPLATE(struct, PANOCProgressInfo, EigenConfigd);
286ALPAQA_IF_FLOAT(ALPAQA_EXPORT_EXTERN_TEMPLATE(struct, PANOCProgressInfo, EigenConfigf);)
287ALPAQA_IF_LONGD(ALPAQA_EXPORT_EXTERN_TEMPLATE(struct, PANOCProgressInfo, EigenConfigl);)
289// clang-format on
290
291} // namespace alpaqa
PANOC solver for ALM.
Definition panoc.hpp:142
std::string get_name() const
Definition panoc.tpp:20
PANOCSolver(const Params &params, Direction &&direction)
Definition panoc.hpp:156
PANOCSolver(const Params &params)
Definition panoc.hpp:153
Stats operator()(const P &problem, const SolveOptions &opts, rvec x, rvec y, crvec Σ, rvec e)
Definition panoc.hpp:169
PANOCStats< config_t > Stats
Definition panoc.hpp:149
std::function< void(const ProgressInfo &)> progress_cb
Definition panoc.hpp:200
Stats operator()(const Problem &problem, const SolveOptions &opts, rvec x, rvec y, crvec Σ, rvec err_z)
Definition panoc.tpp:25
PANOCSolver & set_progress_callback(std::function< void(const ProgressInfo &)> cb)
Specify a callable that is invoked with some intermediate results on each iteration of the algorithm.
Definition panoc.hpp:186
Direction direction
Definition panoc.hpp:204
InnerSolveOptions< config_t > SolveOptions
Definition panoc.hpp:151
PANOCSolver(const Params &params, const Direction &direction)
Definition panoc.hpp:158
AtomicStopSignal stop_signal
Definition panoc.hpp:199
DirectionT Direction
Definition panoc.hpp:148
const Params & get_params() const
Definition panoc.hpp:195
Stats operator()(const P &problem, const SolveOptions &opts, rvec x)
Definition panoc.hpp:175
TypeErasedProblem< config_t > Problem
Definition panoc.hpp:146
std::ostream * os
Definition panoc.hpp:205
The main polymorphic minimization problem interface.
#define USING_ALPAQA_CONFIG(Conf)
Definition config.hpp:77
#define ALPAQA_IF_QUADF(...)
Definition config.hpp:221
#define ALPAQA_IF_LONGD(...)
Definition config.hpp:233
#define ALPAQA_IF_FLOAT(...)
Definition config.hpp:227
#define USING_ALPAQA_CONFIG_TEMPLATE(Conf)
Definition config.hpp:81
#define ALPAQA_EXPORT_EXTERN_TEMPLATE(...)
Definition export.hpp:21
real_t linesearch_tolerance_factor
Tolerance factor used in the line search.
Definition panoc.hpp:70
LipschitzEstimateParams< config_t > Lipschitz
Parameters related to the Lipschitz constant estimate and step size.
Definition panoc.hpp:29
unsigned max_no_progress
Maximum number of iterations without any progress before giving up.
Definition panoc.hpp:52
real_t L_max
Maximum Lipschitz constant estimate.
Definition panoc.hpp:48
bool recompute_last_prox_step_after_stepsize_change
If the step size changes, the direction buffer is flushed.
Definition panoc.hpp:80
real_t linesearch_coefficient_update_factor
Factor to decrease the line search factor by after a line search failure.
Definition panoc.hpp:38
real_t min_linesearch_coefficient
Minimum weight factor between Newton step and projected gradient step.
Definition panoc.hpp:35
std::chrono::nanoseconds max_time
Maximum duration.
Definition panoc.hpp:33
real_t quadratic_upperbound_tolerance_factor
Tolerance factor used in the quadratic upper bound condition that determines the step size.
Definition panoc.hpp:64
bool force_linesearch
Ignore the line search condition and always accept the accelerated step.
Definition panoc.hpp:41
real_t linesearch_strictness_factor
Parameter β used in the line search (see Algorithm 2 in ).
Definition panoc.hpp:44
unsigned print_interval
When to print progress.
Definition panoc.hpp:56
int print_precision
The precision of the floating point values printed by the solver.
Definition panoc.hpp:58
real_t L_min
Minimum Lipschitz constant estimate.
Definition panoc.hpp:46
bool update_direction_in_candidate
Use the candidate point rather than the accepted point to update the quasi-Newton direction.
Definition panoc.hpp:75
bool eager_gradient_eval
When evaluating ψ(x̂) in a candidate point, always evaluate ∇ψ(x̂) as well.
Definition panoc.hpp:85
unsigned max_iter
Maximum number of inner PANOC iterations.
Definition panoc.hpp:31
PANOCStopCrit stop_crit
What stopping criterion to use.
Definition panoc.hpp:50
Parameters for the estimation of the Lipschitz constant of the gradient of the smooth term of the cos...
Definition lipschitz.hpp:12
Tuning parameters for the PANOC algorithm.
Definition panoc.hpp:25
unsigned stepsize_backtracks
Definition panoc.hpp:99
unsigned lbfgs_rejected
Definition panoc.hpp:101
typename Conf::mvec mvec
Definition config.hpp:89
@ ApproxKKT
Find an ε-approximate KKT point in the ∞-norm:
unsigned τ_1_accepted
Definition panoc.hpp:102
unsigned lbfgs_failures
Definition panoc.hpp:100
const TypeErasedProblem< config_t > * problem
Definition panoc.hpp:135
const PANOCParams< config_t > * params
Definition panoc.hpp:136
SolverStatus
Exit status of a numerical solver such as ALM or PANOC.
@ Busy
In progress.
std::chrono::nanoseconds time_progress_callback
Definition panoc.hpp:95
std::chrono::nanoseconds elapsed_time
Definition panoc.hpp:94
typename Conf::real_t real_t
Definition config.hpp:86
unsigned linesearch_backtracks
Definition panoc.hpp:98
InnerStatsAccumulator< FISTAStats< Conf > > & operator+=(InnerStatsAccumulator< FISTAStats< Conf > > &acc, const FISTAStats< Conf > &s)
Definition fista.hpp:189
constexpr const auto inf
Definition config.hpp:112
typename Conf::rvec rvec
Definition config.hpp:91
typename Conf::crvec crvec
Definition config.hpp:92
unsigned linesearch_failures
Definition panoc.hpp:97
unsigned iterations
Definition panoc.hpp:96
SolverStatus status
Definition panoc.hpp:92
unsigned count_τ
Definition panoc.hpp:103