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