PANOC-ALM  quadratic-penalty
Nonconvex constrained optimization
panoc-helpers.hpp
Go to the documentation of this file.
1 #pragma once
2 
7 
8 #include <stdexcept>
9 
10 namespace pa::detail {
11 
16 inline real_t calc_ψ_ŷ(const Problem &p,
17  crvec x,
18  crvec y,
19  crvec Σ,
20  rvec ŷ
21 ) {
22  // g(x)
23  p.g(x, ŷ);
24  // ζ = g(x) + Σ⁻¹y
25  ŷ += Σ.asDiagonal().inverse() * y;
26  // d = ζ - Π(ζ, D)
27  ŷ = projecting_difference(ŷ, p.D);
28  // dᵀŷ, ŷ = Σ d
29  real_t dᵀŷ = 0;
30  for (unsigned i = 0; i < p.m; ++i) {
31  dᵀŷ += ŷ(i) * Σ(i) * ŷ(i); // TODO: vectorize
32  ŷ(i) = Σ(i) * ŷ(i);
33  }
34  // ψ(x) = f(x) + ½ dᵀŷ
35  real_t ψ = p.f(x) + 0.5 * dᵀŷ;
36 
37  return ψ;
38 }
39 
44 inline real_t calc_ψ_ŷ(const ProblemFull &p,
45  crvec x,
46  crvec y,
47  crvec Σ1,
48  crvec Σ2,
49  rvec ŷ1,
50  rvec ŷ2
51 ) {
52  // g1(x)
53  p.g1(x, ŷ1);
54  // ζ = g1(x) + Σ1⁻¹y
55  ŷ1 += Σ1.asDiagonal().inverse() * y;
56  // d1 = ζ - Π(ζ, D1)
57  ŷ1 = projecting_difference(ŷ1, p.D1);
58  // dᵀŷ1, ŷ1 = Σ1 d1
59  real_t dᵀŷ1 = 0;
60  for (unsigned i = 0; i < p.m1; ++i) {
61  dᵀŷ1 += ŷ1(i) * Σ1(i) * ŷ1(i); // TODO: vectorize
62  ŷ1(i) = Σ1(i) * ŷ1(i);
63  }
64  // g2(x)
65  p.g2(x, ŷ2);
66  // d2 = g2(x) - Π(g2(x), D2)
67  ŷ2 = projecting_difference(ŷ2, p.D2);
68  // dᵀŷ2, ŷ2 = Σ2 d2
69  real_t dᵀŷ2 = 0;
70  for (unsigned i = 0; i < p.m2; ++i) {
71  dᵀŷ2 += ŷ2(i) * Σ2(i) * ŷ2(i); // TODO: vectorize
72  ŷ2(i) = Σ2(i) * ŷ2(i);
73  }
74  // ψ(x) = f(x) + ½ dᵀŷ
75  real_t ψ = p.f(x) + 0.5 * dᵀŷ1 + 0.5 * dᵀŷ2;
76 
77  return ψ;
78 }
79 
81 inline void calc_grad_ψ_from_ŷ(const Problem &p,
82  crvec x,
83  crvec ŷ,
84  rvec grad_ψ,
85  rvec work_n
86 ) {
87  // ∇ψ = ∇f(x) + ∇g(x) ŷ
88  p.grad_f(x, grad_ψ);
89  p.grad_g_prod(x, ŷ, work_n);
90  grad_ψ += work_n;
91 }
92 
94 inline void calc_grad_ψ_from_ŷ(const ProblemFull &p,
95  crvec x,
96  crvec ŷ1,
97  crvec ŷ2,
98  rvec grad_ψ,
99  rvec work_n
100 ) {
101  // ∇ψ = ∇f(x) + ∇g1(x) ŷ1 + ∇g2(x) ŷ2
102  p.grad_f(x, grad_ψ);
103  p.grad_g1_prod(x, ŷ1, work_n);
104  grad_ψ += work_n;
105  p.grad_g2_prod(x, ŷ2, work_n);
106  grad_ψ += work_n;
107 }
108 
114  crvec x,
115  crvec y,
116  crvec Σ,
117  rvec grad_ψ,
118  rvec work_n,
119  rvec work_m
120 ) {
121  // ψ(x) = f(x) + ½ dᵀŷ
122  real_t ψ = calc_ψ_ŷ(p, x, y, Σ, work_m);
123  // ∇ψ = ∇f(x) + ∇g(x) ŷ
124  calc_grad_ψ_from_ŷ(p, x, work_m, grad_ψ, work_n);
125  return ψ;
126 }
127 
133  crvec x,
134  crvec y,
135  crvec Σ1,
136  crvec Σ2,
137  rvec grad_ψ,
138  rvec work_n,
139  rvec work_m1,
140  rvec work_m2
141 ) {
142  // ψ(x) = f(x) + ½ dᵀŷ
143  real_t ψ = calc_ψ_ŷ(p, x, y, Σ1, Σ2, work_m1, work_m2);
144  // ∇ψ = ∇f(x) + ∇g(x) ŷ
145  calc_grad_ψ_from_ŷ(p, x, work_m1, work_m2, grad_ψ, work_n);
146  return ψ;
147 }
148 
151 inline void calc_grad_ψ(const Problem &p,
152  crvec x,
153  crvec y,
154  crvec Σ,
155  rvec grad_ψ,
156  rvec work_n,
157  rvec work_m
158 ) {
159  // g(x)
160  p.g(x, work_m);
161  // ζ = g(x) + Σ⁻¹y
162  work_m += (y.array() / Σ.array()).matrix();
163  // d = ζ - Π(ζ, D)
164  work_m = projecting_difference(work_m, p.D);
165  // ŷ = Σ d
166  work_m = Σ.asDiagonal() * work_m;
167 
168  // ∇ψ = ∇f(x) + ∇g(x) ŷ
169  p.grad_f(x, grad_ψ);
170  p.grad_g_prod(x, work_m, work_n);
171  grad_ψ += work_n;
172 }
173 
176 inline void calc_grad_ψ(const ProblemFull &p,
177  crvec x,
178  crvec y,
179  crvec Σ1,
180  crvec Σ2,
181  rvec grad_ψ,
182  rvec work_n,
183  rvec work_m1,
184  rvec work_m2
185 ) {
186  // g1(x)
187  p.g1(x, work_m1);
188  // ζ = g1(x) + Σ1⁻¹y
189  work_m1 += (y.array() / Σ1.array()).matrix();
190  // d1 = ζ - Π(ζ, D1)
191  work_m1 = projecting_difference(work_m1, p.D1);
192  // ŷ1 = Σ1 d1
193  work_m1 = Σ1.asDiagonal() * work_m1;
194 
195  // g2(x)
196  p.g2(x, work_m2);
197  // d1 = g2(x) - Π(g2(x), D2)
198  work_m2 = projecting_difference(work_m2, p.D2);
199  // ŷ2 = Σ2 d2
200  work_m2 = Σ2.asDiagonal() * work_m2;
201 
202  // ∇ψ = ∇f(x) + ∇g1(x) ŷ1 + ∇g2(x) ŷ2
203  p.grad_f(x, grad_ψ);
204  p.grad_g1_prod(x, work_m1, work_n);
205  grad_ψ += work_n;
206  p.grad_g2_prod(x, work_m2, work_n);
207  grad_ψ += work_n;
208 }
209 
212 inline void calc_err_z(const Problem &p,
213  crvec x̂,
214  crvec y,
215  crvec Σ,
216  rvec err_z
217 ) {
218  // g(x̂)
219  p.g(x̂, err_z);
220  // ζ = g(x̂) + Σ⁻¹y
221  // ẑ = Π(ζ, D)
222  // g(x) - ẑ
223  err_z = err_z - project(err_z + Σ.asDiagonal().inverse() * y, p.D);
224  // TODO: catastrophic cancellation?
225 }
226 
229 inline void calc_err_z(const ProblemFull &p,
230  crvec x̂,
231  crvec y,
232  crvec Σ1,
233  rvec err_z1,
234  rvec err_z2
235 ) {
236  // g1(x̂)
237  p.g1(x̂, err_z1);
238  // ζ = g1(x̂) + Σ1⁻¹y
239  // ẑ1 = Π(ζ, D)
240  // g1(x) - ẑ1
241  err_z1 = err_z1 - project(err_z1 + Σ1.asDiagonal().inverse() * y, p.D1);
242 
243  // g2(x̂)
244  p.g2(x̂, err_z2);
245  // ẑ2 = Π(g2(x̂), D2)
246  // g2(x) - ẑ2
247  err_z2 = err_z2 - project(err_z2, p.D2);
248 }
249 
258 inline auto
260  real_t γ,
261  crvec x,
262  crvec grad_ψ
263 ) {
264  using binary_real_f = real_t (*)(real_t, real_t);
265  return (-γ * grad_ψ)
266  .binaryExpr(C.lowerbound - x, binary_real_f(std::fmax))
267  .binaryExpr(C.upperbound - x, binary_real_f(std::fmin));
268 }
269 
270 template <typename ProblemT>
271 inline void calc_x̂(const ProblemT &prob,
272  real_t γ,
273  crvec x,
274  crvec grad_ψ,
275  rvec x̂,
276  rvec p
277 ) {
278  p = projected_gradient_step(prob.C, γ, x, grad_ψ);
279  x̂ = x + p;
280 }
281 
285  PANOCStopCrit crit,
286  crvec pₖ,
287  real_t γ,
288  crvec xₖ,
289  crvec grad_̂ψₖ,
290  crvec grad_ψₖ,
291  const Box &C
292 ) {
293  switch (crit) {
294  case PANOCStopCrit::ApproxKKT: {
295  auto err = (1 / γ) * pₖ + (grad_ψₖ - grad_̂ψₖ);
296  // These parentheses ^^^ ^^^ are important to
297  // prevent catastrophic cancellation when the step is small
298  auto ε = vec_util::norm_inf(err);
299  return ε;
300  }
301  case PANOCStopCrit::ProjGradUnitNorm: {
302  return vec_util::norm_inf(
303  projected_gradient_step(C, 1, xₖ, grad_ψₖ));
304  }
305  case PANOCStopCrit::ProjGradNorm: {
306  return vec_util::norm_inf(pₖ);
307  }
308  case PANOCStopCrit::FPRNorm: {
309  return vec_util::norm_inf(pₖ) / γ;
310  }
311  }
312  throw std::out_of_range("Invalid PANOCStopCrit");
313 }
314 
329  const Problem &problem,
335  real_t rounding_tolerance,
339  real_t L_max,
341  crvec xₖ,
343  real_t ψₖ,
345  crvec grad_ψₖ,
347  crvec y,
349  crvec Σ,
351  rvec x̂ₖ,
353  rvec pₖ,
355  rvec ŷx̂ₖ,
357  real_t &ψx̂ₖ,
359  real_t &norm_sq_pₖ,
361  real_t &grad_ψₖᵀpₖ,
363  real_t &Lₖ,
365  real_t &γₖ) {
366 
367  real_t old_γₖ = γₖ;
368  real_t margin = (1 + std::abs(ψₖ)) * rounding_tolerance;
369  while (ψx̂ₖ - ψₖ > grad_ψₖᵀpₖ + 0.5 * Lₖ * norm_sq_pₖ + margin) {
370  if (not(Lₖ * 2 <= L_max))
371  break;
372 
373  Lₖ *= 2;
374  γₖ /= 2;
375 
376  // Calculate x̂ₖ and pₖ (with new step size)
377  calc_x̂(problem, γₖ, xₖ, grad_ψₖ, /* in ⟹ out */ x̂ₖ, pₖ);
378  // Calculate ∇ψ(xₖ)ᵀpₖ and ‖pₖ‖²
379  grad_ψₖᵀpₖ = grad_ψₖ.dot(pₖ);
380  norm_sq_pₖ = pₖ.squaredNorm();
381 
382  // Calculate ψ(x̂ₖ) and ŷ(x̂ₖ)
383  ψx̂ₖ = calc_ψ_ŷ(problem, x̂ₖ, y, Σ, /* in ⟹ out */ ŷx̂ₖ);
384  }
385  return old_γₖ;
386 }
387 
402  const ProblemFull &problem,
408  real_t rounding_tolerance,
412  real_t L_max,
414  crvec xₖ,
416  real_t ψₖ,
418  crvec grad_ψₖ,
420  crvec y,
422  crvec Σ1,
424  crvec Σ2,
426  rvec x̂ₖ,
428  rvec pₖ,
430  rvec ŷx̂ₖ1,
432  rvec ŷx̂ₖ2,
434  real_t &ψx̂ₖ,
436  real_t &norm_sq_pₖ,
438  real_t &grad_ψₖᵀpₖ,
440  real_t &Lₖ,
442  real_t &γₖ) {
443 
444  real_t old_γₖ = γₖ;
445  real_t margin = (1 + std::abs(ψₖ)) * rounding_tolerance;
446  while (ψx̂ₖ - ψₖ > grad_ψₖᵀpₖ + 0.5 * Lₖ * norm_sq_pₖ + margin) {
447  if (not(Lₖ * 2 <= L_max))
448  break;
449 
450  Lₖ *= 2;
451  γₖ /= 2;
452 
453  // Calculate x̂ₖ and pₖ (with new step size)
454  calc_x̂(problem, γₖ, xₖ, grad_ψₖ, /* in ⟹ out */ x̂ₖ, pₖ);
455  // Calculate ∇ψ(xₖ)ᵀpₖ and ‖pₖ‖²
456  grad_ψₖᵀpₖ = grad_ψₖ.dot(pₖ);
457  norm_sq_pₖ = pₖ.squaredNorm();
458 
459  // Calculate ψ(x̂ₖ) and ŷ(x̂ₖ)
460  ψx̂ₖ = calc_ψ_ŷ(problem, x̂ₖ, y, Σ1, Σ2, /* in ⟹ out */ ŷx̂ₖ1, ŷx̂ₖ2);
461  }
462  return old_γₖ;
463 }
464 
468 template <class ParamsT, class DurationT>
471  const ParamsT &params,
473  DurationT time_elapsed,
475  unsigned iteration,
477  const AtomicStopSignal &stop_signal,
479  real_t ε,
481  real_t εₖ,
483  unsigned no_progress) {
484 
485  bool out_of_time = time_elapsed > params.max_time;
486  bool out_of_iter = iteration == params.max_iter;
487  bool interrupted = stop_signal.stop_requested();
488  bool not_finite = not std::isfinite(εₖ);
489  bool conv = εₖ <= ε;
490  bool max_no_progress = no_progress > params.max_no_progress;
491  return conv ? SolverStatus::Converged
492  : out_of_time ? SolverStatus::MaxTime
493  : out_of_iter ? SolverStatus::MaxIter
494  : not_finite ? SolverStatus::NotFinite
495  : max_no_progress ? SolverStatus::NoProgress
496  : interrupted ? SolverStatus::Interrupted
497  : SolverStatus::Unknown;
498 }
499 
506  const Problem &problem,
508  crvec xₖ,
510  crvec ŷxₖ,
512  crvec y,
514  crvec Σ,
516  rvec g,
518  mat &H,
520  rvec work_n) {
521 
522  // Compute the Hessian of the Lagrangian
523  problem.hess_L(xₖ, ŷxₖ, H);
524  // Compute the Hessian of the augmented Lagrangian
525  problem.g(xₖ, g);
526  for (vec::Index i = 0; i < problem.m; ++i) {
527  real_t ζ = g(i) + y(i) / Σ(i);
528  bool inactive =
529  problem.D.lowerbound(i) < ζ && ζ < problem.D.upperbound(i);
530  if (not inactive) {
531  problem.grad_gi(xₖ, i, work_n);
532  H += work_n * Σ(i) * work_n.transpose();
533  }
534  }
535 }
536 
543  const Problem &problem,
545  crvec xₖ,
547  crvec y,
549  crvec Σ,
551  crvec grad_ψ,
553  crvec v,
555  rvec Hv,
557  rvec work_n1,
559  rvec work_n2,
561  rvec work_m) {
562 
563  real_t cbrt_ε = std::cbrt(std::numeric_limits<real_t>::epsilon());
564  real_t h = cbrt_ε * (1 + xₖ.norm());
565  rvec xₖh = work_n1;
566  xₖh = xₖ + h * v;
567  calc_grad_ψ(problem, xₖh, y, Σ, Hv, work_n2, work_m);
568  Hv -= grad_ψ;
569  Hv /= h;
570 }
571 
576  const Problem &problem,
578  crvec xₖ,
580  crvec y,
582  crvec Σ,
584  real_t ε,
586  real_t δ,
588  real_t L_min,
590  real_t L_max,
592  real_t &ψ,
594  rvec grad_ψ,
596  rvec work_n1,
598  rvec work_n2,
600  rvec work_n3,
602  rvec work_m) {
603 
604  auto h = (xₖ * ε).cwiseAbs().cwiseMax(δ);
605  work_n1 = xₖ + h;
606  real_t norm_h = h.norm();
607  // Calculate ∇ψ(x₀ + h)
608  calc_grad_ψ(problem, work_n1, y, Σ, /* in ⟹ out */ work_n2, work_n3,
609  work_m);
610  // Calculate ψ(xₖ), ∇ψ(x₀)
611  ψ = calc_ψ_grad_ψ(problem, xₖ, y, Σ, /* in ⟹ out */ grad_ψ, work_n1,
612  work_m);
613 
614  // Estimate Lipschitz constant using finite differences
615  real_t L = (work_n2 - grad_ψ).norm() / norm_h;
616  return std::clamp(L, L_min, L_max);
617 }
618 
623  const Problem &problem,
625  crvec xₖ,
627  crvec y,
629  crvec Σ,
631  real_t ε,
633  real_t δ,
635  real_t L_min,
637  real_t L_max,
639  rvec grad_ψ,
641  rvec work_n1,
643  rvec work_n2,
645  rvec work_n3,
647  rvec work_m) {
648 
649  auto h = (xₖ * ε).cwiseAbs().cwiseMax(δ);
650  work_n1 = xₖ + h;
651  real_t norm_h = h.norm();
652  // Calculate ∇ψ(x₀ + h)
653  calc_grad_ψ(problem, work_n1, y, Σ, /* in ⟹ out */ work_n2, work_n3,
654  work_m);
655  // Calculate ∇ψ(x₀)
656  calc_grad_ψ(problem, xₖ, y, Σ, /* in ⟹ out */ grad_ψ, work_n1, work_m);
657 
658  // Estimate Lipschitz constant using finite differences
659  real_t L = (work_n2 - grad_ψ).norm() / norm_h;
660  return std::clamp(L, L_min, L_max);
661 }
662 
665  const ProblemFull &problem,
667  crvec xₖ,
669  crvec y,
671  crvec Σ1,
673  crvec Σ2,
675  real_t ε,
677  real_t δ,
679  real_t &ψ,
681  rvec grad_ψ,
683  rvec work_n1,
685  rvec work_n2,
687  rvec work_n3,
689  rvec work_m1,
691  rvec work_m2) {
692 
693  auto h = (xₖ * ε).cwiseAbs().cwiseMax(δ);
694  work_n1 = xₖ + h;
695  real_t norm_h = h.norm();
696  // Calculate ∇ψ(x₀ + h)
697  calc_grad_ψ(problem, work_n1, y, Σ1, Σ2, /* in ⟹ out */ work_n2, work_n3,
698  work_m1, work_m2);
699  // Calculate ψ(xₖ), ∇ψ(x₀)
700  ψ = calc_ψ_grad_ψ(problem, xₖ, y, Σ1, Σ2, /* in ⟹ out */ grad_ψ, work_n1,
701  work_m1, work_m2);
702 
703  // Estimate Lipschitz constant
704  real_t L = (work_n2 - grad_ψ).norm() / norm_h;
705  if (L < std::numeric_limits<real_t>::epsilon())
706  L = std::numeric_limits<real_t>::epsilon();
707  return L;
708 }
709 
710 } // namespace pa::detail
pa::AtomicStopSignal
Definition: atomic_stop_signal.hpp:7
pa::detail::calc_x̂
void calc_x̂(const ProblemT &prob, real_t γ, crvec x, crvec grad_ψ, rvec x̂, rvec p)
Definition: panoc-helpers.hpp:271
pa::AtomicStopSignal::stop_requested
bool stop_requested() const
Definition: atomic_stop_signal.hpp:16
pa::SolverStatus::Unknown
@ Unknown
Initial value.
pa::rvec
Eigen::Ref< vec > rvec
Default type for mutable references to vectors.
Definition: vec.hpp:16
panocpy.test.y
y
Definition: test.py:76
atomic_stop_signal.hpp
panocpy.test.err_z
err_z
Definition: test.py:76
pa::SolverStatus
SolverStatus
Exit status of a numerical solver such as ALM or PANOC.
Definition: solverstatus.hpp:7
panocpy.test.ε
int ε
Definition: test.py:71
pa::detail::calc_augmented_lagrangian_hessian
void calc_augmented_lagrangian_hessian(const Problem &problem, crvec xₖ, crvec ŷxₖ, crvec y, crvec Σ, rvec g, mat &H, rvec work_n)
Compute the Hessian matrix of the augmented Lagrangian function.
Definition: panoc-helpers.hpp:504
pa::project
auto project(const Vec &v, const Box &box)
Project a vector onto a box.
Definition: box.hpp:15
bicycle-obstacle-avoidance-mpc.prob
prob
Definition: bicycle-obstacle-avoidance-mpc.py:44
pa::detail
Definition: alm-helpers.hpp:6
pa::detail::projected_gradient_step
auto projected_gradient_step(const Box &C, real_t γ, crvec x, crvec grad_ψ)
Projected gradient step.
Definition: panoc-helpers.hpp:259
main.problem
problem
Definition: main.py:16
panocpy.test.v
v
Definition: test.py:42
pa::detail::calc_ψ_grad_ψ
real_t calc_ψ_grad_ψ(const Problem &p, crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m)
Calculate both ψ(x) and its gradient ∇ψ(x).
Definition: panoc-helpers.hpp:113
panocpy.test.x
x
Definition: test.py:40
pa::PANOCStopCrit
PANOCStopCrit
Definition: panoc-stop-crit.hpp:8
pa::detail::calc_grad_ψ
void calc_grad_ψ(const Problem &p, crvec x, crvec y, crvec Σ, rvec grad_ψ, rvec work_n, rvec work_m)
Calculate the gradient ∇ψ(x).
Definition: panoc-helpers.hpp:151
panoc-stop-crit.hpp
pa::detail::check_all_stop_conditions
SolverStatus check_all_stop_conditions(const ParamsT &params, DurationT time_elapsed, unsigned iteration, const AtomicStopSignal &stop_signal, real_t ε, real_t εₖ, unsigned no_progress)
Check all stop conditions (required tolerance reached, out of time, maximum number of iterations exce...
Definition: panoc-helpers.hpp:469
pa::detail::calc_ψ_ŷ
real_t calc_ψ_ŷ(const Problem &p, crvec x, crvec y, crvec Σ, rvec ŷ)
Calculate both ψ(x) and the vector ŷ that can later be used to compute ∇ψ.
Definition: panoc-helpers.hpp:16
pa::Box
Definition: box.hpp:7
pa::detail::calc_err_z
void calc_err_z(const Problem &p, crvec x̂, crvec y, crvec Σ, rvec err_z)
Calculate the error between ẑ and g(x).
Definition: panoc-helpers.hpp:212
pa::detail::calc_error_stop_crit
real_t calc_error_stop_crit(PANOCStopCrit crit, crvec pₖ, real_t γ, crvec xₖ, crvec grad_̂ψₖ, crvec grad_ψₖ, const Box &C)
Definition: panoc-helpers.hpp:284
panocpy.test.L
int L
Definition: test.py:47
pa::detail::descent_lemma
real_t descent_lemma(const Problem &problem, real_t rounding_tolerance, real_t L_max, crvec xₖ, real_t ψₖ, crvec grad_ψₖ, crvec y, crvec Σ, rvec x̂ₖ, rvec pₖ, rvec ŷx̂ₖ, real_t &ψx̂ₖ, real_t &norm_sq_pₖ, real_t &grad_ψₖᵀpₖ, real_t &Lₖ, real_t &γₖ)
Increase the estimate of the Lipschitz constant of the objective gradient and decrease the step size ...
Definition: panoc-helpers.hpp:327
pa::crvec
Eigen::Ref< const vec > crvec
Default type for immutable references to vectors.
Definition: vec.hpp:18
panocpy.test.params
params
Definition: test.py:217
pa::detail::calc_augmented_lagrangian_hessian_prod_fd
void calc_augmented_lagrangian_hessian_prod_fd(const Problem &problem, crvec xₖ, crvec y, crvec Σ, crvec grad_ψ, crvec v, rvec Hv, rvec work_n1, rvec work_n2, rvec work_m)
Compute the Hessian matrix of the augmented Lagrangian function multiplied by the given vector,...
Definition: panoc-helpers.hpp:541
panocpy.test.C
C
Definition: test.py:204
panocpy.test.Σ
int Σ
Definition: test.py:70
pa::mat
realmat mat
Default type for matrices.
Definition: vec.hpp:20
pa::detail::initial_lipschitz_estimate
real_t initial_lipschitz_estimate(const Problem &problem, crvec xₖ, crvec y, crvec Σ, real_t ε, real_t δ, real_t L_min, real_t L_max, real_t &ψ, rvec grad_ψ, rvec work_n1, rvec work_n2, rvec work_n3, rvec work_m)
Estimate the Lipschitz constant of the gradient using finite differences.
Definition: panoc-helpers.hpp:574
pa::vec_util::norm_inf
real_t norm_inf(const Vec &v)
Get the maximum or infinity-norm of the given vector.
Definition: vec.hpp:42
panocpy.test.g
g
Definition: test.py:51
pa::projecting_difference
auto projecting_difference(const Vec &v, const Box &box)
Get the difference between the given vector and its projection.
Definition: box.hpp:28
problem.hpp
pa::detail::calc_grad_ψ_from_ŷ
void calc_grad_ψ_from_ŷ(const Problem &p, crvec x, crvec ŷ, rvec grad_ψ, rvec work_n)
Calculate ∇ψ(x) using ŷ.
Definition: panoc-helpers.hpp:81
panocpy.test.p
p
Definition: test.py:57
pa::ProblemFull
Problem description for minimization problems.
Definition: include/panoc-alm/util/problem.hpp:213
pa::PANOCStopCrit::ApproxKKT
@ ApproxKKT
Find a ε-approximate KKT point.
pa::real_t
double real_t
Default floating point type.
Definition: vec.hpp:8
solverstatus.hpp
pa::Problem
Problem description for minimization problems.
Definition: include/panoc-alm/util/problem.hpp:24
main.H
H
Definition: main.py:8