SOPT
Sparse OPTimisation
Typedefs | Functions | Variables
sdmm_warm_start.cc File Reference
#include <catch2/catch_all.hpp>
#include <random>
#include <Eigen/Dense>
#include "sopt/proximal.h"
#include "sopt/sdmm.h"
#include "sopt/types.h"
+ Include dependency graph for sdmm_warm_start.cc:

Go to the source code of this file.

Typedefs

using Scalar = sopt::t_real
 
using t_Vector = sopt::Vector< Scalar >
 
using t_Matrix = sopt::Matrix< Scalar >
 

Functions

 SCENARIO ("SDMM with warm start", "[sdmm][integration]")
 

Variables

constexpr auto N = 30
 

Typedef Documentation

◆ Scalar

Definition at line 10 of file sdmm_warm_start.cc.

◆ t_Matrix

Definition at line 12 of file sdmm_warm_start.cc.

◆ t_Vector

Definition at line 11 of file sdmm_warm_start.cc.

Function Documentation

◆ SCENARIO()

SCENARIO ( "SDMM with warm start"  ,
""  [sdmm][integration] 
)

Definition at line 15 of file sdmm_warm_start.cc.

15  {
16  using namespace sopt;
17 
18  GIVEN("An SDMM instance with its input") {
19  t_Matrix const Id = t_Matrix::Identity(N, N).eval();
20  t_Vector const target0 = t_Vector::Random(N);
21  t_Vector target1 = t_Vector::Random(N) * 4;
22 
23  auto convergence = [&target1, &target0](t_Vector const &x) -> bool {
24  t_Vector const segment = (target1 - target0).normalized();
25  t_real const alpha = (x - target0).transpose() * segment;
26  return alpha >= 0e0 and (target1 - target0).transpose() * segment >= alpha and
27  (x - target0 - alpha * segment).stableNorm() < 1e-8;
28  };
29 
30  auto sdmm = algorithm::SDMM<Scalar>()
31  .is_converged(convergence)
32  .itermax(5000)
33  .gamma(1)
34  .conjugate_gradient(std::numeric_limits<t_uint>::max(), 1e-12)
35  .append(proximal::translate(proximal::EuclidianNorm(), -target0), Id)
36  .append(proximal::translate(proximal::EuclidianNorm(), -target1), Id);
37  t_Vector const input = t_Vector::Random(N);
38 
39  WHEN("the algorithms runs") {
40  auto const full = sdmm(input);
41  THEN("it converges") {
42  CHECK(full.niters > 20);
43  CHECK(full.good);
44  }
45 
46  WHEN("It is set to stop before convergence") {
47  auto const first_half = sdmm.itermax(full.niters - 5)(input);
48  THEN("It is not converged") { CHECK(not first_half.good); }
49 
50  WHEN("A warm restart is attempted") {
51  auto const second_half = sdmm.itermax(5000)(first_half);
52  THEN("The warm restart is validated by the fast convergence") {
53  CHECK(second_half.niters < 10);
54  }
55  }
56  }
57  }
58  }
59 }
sopt::Vector< Scalar > t_Vector
sopt::Matrix< Scalar > t_Matrix
bool is_converged(t_Vector const &x) const
Forwards to convergence function parameter.
Definition: sdmm.h:172
Proximal of euclidian norm.
Definition: proximal.h:18
Translation< FUNCTION, VECTOR > translate(FUNCTION const &func, VECTOR const &translation)
Translates given proximal by given vector.
Definition: proximal.h:362
double t_real
Root of the type hierarchy for real numbers.
Definition: types.h:17
constexpr auto N

References sopt::algorithm::SDMM< SCALAR >::is_converged(), N, and sopt::proximal::translate().

Variable Documentation

◆ N

constexpr auto N = 30
constexpr

Definition at line 14 of file sdmm_warm_start.cc.

Referenced by SCENARIO().