1 #include <catch2/catch_all.hpp>
14 auto constexpr
N = 30;
15 SCENARIO(
"ProximalADMM with warm start",
"[padmm][integration]") {
18 GIVEN(
"A ProximalADMM instance with its input") {
19 t_Vector const target0 = t_Vector::Random(
N);
20 t_Vector const target1 = t_Vector::Random(
N) * 4;
23 t_Matrix const mId = -t_Matrix::Identity(
N,
N);
25 auto convergence = [&target1, &target0](
t_Vector const &x) ->
bool {
26 t_Vector const segment = (target1 - target0).normalized();
27 t_real const alpha = (x - target0).transpose() * segment;
28 SOPT_TRACE(
" {} {}", alpha, (x - target0 - alpha * segment).stableNorm());
29 return alpha >= 0e0 and (target1 - target0).transpose() * segment >= alpha and
30 (x - target0 - alpha * segment).stableNorm() < 1e-8;
36 .regulariser_strength(0.5)
39 WHEN(
"the algorithms runs") {
40 auto const full = padmm();
41 THEN(
"it converges") {
42 CHECK(full.niters > 20);
46 WHEN(
"It is set to stop before convergence") {
47 auto const first_half = padmm.itermax(full.niters - 5)();
48 THEN(
"It is not converged") { CHECK(not first_half.good); }
50 WHEN(
"A warm restart is attempted") {
51 auto const second_half = padmm.itermax(5000)(first_half);
52 THEN(
"The warm restart is validated by the fast convergence") {
53 CHECK(second_half.niters < 10);
sopt::Vector< Scalar > t_Vector
sopt::Matrix< Scalar > t_Matrix
Proximal Alternate Direction method of mutltipliers.
ProximalADMM< Scalar > & is_converged(std::function< bool(t_Vector const &x)> const &func)
Convergence function that takes only the output as argument.
ProximalADMM &::type Phi(ARGS &&... args)
Proximal of euclidian norm.
Translation< FUNCTION, VECTOR > translate(FUNCTION const &func, VECTOR const &translation)
Translates given proximal by given vector.
double t_real
Root of the type hierarchy for real numbers.
Eigen::Matrix< T, Eigen::Dynamic, 1 > Vector
A vector of a given type.
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > Matrix
A matrix of a given type.
SCENARIO("ProximalADMM with warm start", "[padmm][integration]")