PANOC-ALM  quadratic-penalty
Nonconvex constrained optimization
anderson-acceleration.hpp
Go to the documentation of this file.
1 #pragma once
2 
5 
6 namespace pa {
7 
12  public:
13  void resize(size_t n, size_t m) {
14  size_t m_AA = std::min(n, m); // TODO: support m > n?
15  qr.resize(n, m_AA);
16  G.resize(n, m_AA);
17  rₖ₋₁.resize(n);
18  γ_LS.resize(m_AA);
19  }
20 
21  void initialize(crvec g₀, crvec r₀) {
22  G.col(0) = g₀;
23  rₖ₋₁ = r₀;
24  }
25 
26  void compute(crvec gₖ, crvec rₖ, rvec xₖ_aa) {
27  minimize_update_anderson(qr, G, rₖ, rₖ₋₁, gₖ, γ_LS, xₖ_aa);
28  }
29 
30  std::string get_name() const { return "AndersonAccel"; }
31 
32  void reinitialize(real_t γₖ, real_t old_γₖ) {
33  reset();
34  // TODO: show mathematically that this is a sensible thing to do:
35  rₖ₋₁ *= γₖ / old_γₖ;
36  }
37 
38  void reset() {
39  size_t newest_g_idx = qr.ring_tail();
40  if (newest_g_idx != 0)
41  G.col(0) = G.col(newest_g_idx);
42  qr.reset();
43  }
44 
45  private:
47  mat G;
50 };
51 
52 template <>
54 
55  static void initialize(AndersonAccel &aa, crvec x₀, crvec x̂₀,
56  crvec p₀, crvec grad₀) {
57  aa.initialize(x̂₀, p₀);
58  (void)aa;
59  (void)x₀;
60  (void)grad₀;
61  }
62 
63  static bool update(AndersonAccel &aa, crvec xₖ, crvec xₖ₊₁,
64  crvec pₖ, crvec pₖ₊₁, crvec grad_new,
65  const Box &C, real_t γ_new) {
66  (void)aa;
67  (void)xₖ;
68  (void)xₖ₊₁;
69  (void)pₖ;
70  (void)pₖ₊₁;
71  (void)grad_new;
72  (void)C;
73  (void)γ_new;
74  return true;
75  }
76 
77  static bool apply(AndersonAccel &aa, crvec xₖ, crvec x̂ₖ,
78  crvec pₖ, real_t γ, rvec qₖ) {
79  (void)xₖ;
80  (void)x̂ₖ;
81  (void)γ;
82  qₖ = pₖ;
83  aa.compute(x̂ₖ, pₖ, qₖ);
84  return true;
85  }
86 
87  static void changed_γ(AndersonAccel &aa, real_t γₖ, real_t old_γₖ) {
88  // TODO: Do we really want to flush every time γ changes?
89  aa.reinitialize(γₖ, old_γₖ);
90  }
91 };
92 
93 } // namespace pa
pa::PANOCDirection< AndersonAccel >::update
static bool update(AndersonAccel &aa, crvec xₖ, crvec xₖ₊₁, crvec pₖ, crvec pₖ₊₁, crvec grad_new, const Box &C, real_t γ_new)
Definition: anderson-acceleration.hpp:63
pa::LimitedMemoryQR
Incremental QR factorization using modified Gram-Schmidt with reorthogonalization.
Definition: limited-memory-qr.hpp:14
pa::PANOCDirection< AndersonAccel >::apply
static bool apply(AndersonAccel &aa, crvec xₖ, crvec x̂ₖ, crvec pₖ, real_t γ, rvec qₖ)
Definition: anderson-acceleration.hpp:77
pa::rvec
Eigen::Ref< vec > rvec
Default type for mutable references to vectors.
Definition: vec.hpp:16
pa::vec
realvec vec
Default type for vectors.
Definition: vec.hpp:14
pa::AndersonAccel::reset
void reset()
Definition: anderson-acceleration.hpp:38
pa::AndersonAccel::resize
void resize(size_t n, size_t m)
Definition: anderson-acceleration.hpp:13
pa::minimize_update_anderson
void minimize_update_anderson(LimitedMemoryQR &qr, rmat G, crvec rₖ, crvec rₖ₋₁, crvec gₖ, rvec γ_LS, rvec xₖ_aa)
Solve one step of Anderson acceleration to find a fixed point of a function g(x):
Definition: anderson-helpers.hpp:30
pa::PANOCDirection< AndersonAccel >::initialize
static void initialize(AndersonAccel &aa, crvec x₀, crvec x̂₀, crvec p₀, crvec grad₀)
Definition: anderson-acceleration.hpp:55
pa::AndersonAccel::rₖ₋₁
vec rₖ₋₁
Definition: anderson-acceleration.hpp:48
pa
Definition: alm.hpp:10
pa::Box
Definition: box.hpp:7
pa::AndersonAccel::qr
LimitedMemoryQR qr
Definition: anderson-acceleration.hpp:46
pa::LimitedMemoryQR::resize
void resize(size_t n, size_t m)
Re-allocate storage for a problem with a different size.
Definition: limited-memory-qr.hpp:220
pa::AndersonAccel::initialize
void initialize(crvec g₀, crvec r₀)
Definition: anderson-acceleration.hpp:21
pa::crvec
Eigen::Ref< const vec > crvec
Default type for immutable references to vectors.
Definition: vec.hpp:18
panoc-direction-update.hpp
anderson-helpers.hpp
pa::LimitedMemoryQR::reset
void reset()
Reset all indices, clearing the Q and R matrices.
Definition: limited-memory-qr.hpp:211
panocpy.test.C
C
Definition: test.py:204
pa::AndersonAccel::γ_LS
vec γ_LS
Definition: anderson-acceleration.hpp:49
panocpy.test.m
int m
Definition: test.py:39
pa::LimitedMemoryQR::ring_tail
size_t ring_tail() const
Get the tail index of the circular buffer (points to one past the most recent element).
Definition: limited-memory-qr.hpp:233
pa::mat
realmat mat
Default type for matrices.
Definition: vec.hpp:20
pa::PANOCDirection
Definition: panoc-direction-update.hpp:8
pa::AndersonAccel::G
mat G
Definition: anderson-acceleration.hpp:47
pa::AndersonAccel::get_name
std::string get_name() const
Definition: anderson-acceleration.hpp:30
pa::AndersonAccel::compute
void compute(crvec gₖ, crvec rₖ, rvec xₖ_aa)
Definition: anderson-acceleration.hpp:26
pa::AndersonAccel::reinitialize
void reinitialize(real_t γₖ, real_t old_γₖ)
Definition: anderson-acceleration.hpp:32
pa::PANOCDirection< AndersonAccel >::changed_γ
static void changed_γ(AndersonAccel &aa, real_t γₖ, real_t old_γₖ)
Definition: anderson-acceleration.hpp:87
panocpy.test.n
int n
Definition: test.py:38
pa::real_t
double real_t
Default floating point type.
Definition: vec.hpp:8
pa::AndersonAccel
Anderson Acceleration.
Definition: anderson-acceleration.hpp:11