8 #include <catch2/catch_all.hpp>
23 #include "tools_for_tests/directories.h"
34 extern std::unique_ptr<std::mt19937_64>
mersenne;
35 std::string
const input =
"cameraman256";
41 auto const psi = sopt::linear_transform<Scalar>(wavelet, image.rows(), image.cols());
42 size_t nmeasure =
static_cast<size_t>(image.size() * 0.5);
44 double constexpr snr = 30.0;
45 std::shared_ptr<sopt::LinearTransform<Vector>> Phi =
46 std::make_shared<sopt::LinearTransform<Vector>>(
48 Vector y = (*Phi) * Vector::Map(image.data(), image.size());
50 auto sigma = y.stableNorm() / std::sqrt(y.size()) * std::pow(10.0, -(snr / 20.0));
55 std::unique_ptr<std::mt19937_64> *m = &
mersenne;
56 std::function<std::shared_ptr<sopt::IterationState<Vector>>()> random_updater = [&image, m,
sigma, nmeasure](){
57 double constexpr snr = 30.0;
58 std::shared_ptr<sopt::LinearTransform<Vector>> Phi =
59 std::make_shared<sopt::LinearTransform<Vector>>(sopt::linear_transform<Scalar>(
sopt::Sampling(image.size(), nmeasure, **m)));
60 Vector y = (*Phi) * Vector::Map(image.data(), image.size());
62 std::normal_distribution<> gaussian_dist(0,
sigma);
65 return std::make_shared<sopt::IterationState<Vector>>(y, Phi);
72 .regulariser_strength(regulariser_strength)
73 .relative_variation(1e-3)
74 .residual_tolerance(0)
79 auto gp = std::make_shared<sopt::algorithm::L1GProximal<Scalar>>(
false);
80 gp->l1_proximal_tolerance(1e-4)
82 .l1_proximal_itermax(50)
83 .l1_proximal_positivity_constraint(
true)
84 .l1_proximal_real_constraint(
true)
90 auto const diagnostic = fb();
92 CHECK(diagnostic.good);
93 CHECK(diagnostic.niters < 500);
99 Eigen::Map<const Eigen::VectorXd> flat_image(image.data(), image.size());
100 auto mse = (flat_image - diagnostic.x).array().square().sum() / image.size();
An operator that samples a set of measurements.
std::unique_ptr< std::mt19937_64 > mersenne(new std::mt19937_64(0))
Wavelet factory(const std::string &name, t_uint nlevels)
Creates a wavelet transform object.
int t_int
Root of the type hierarchy for signed integers.
double t_real
Root of the type hierarchy for real numbers.
Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic > Image
A 2-dimensional list of elements of given type.
Eigen::Matrix< T, Eigen::Dynamic, 1 > Vector
A vector of a given type.
real_type< T >::type sigma(sopt::LinearTransform< Vector< T >> const &sampling, sopt::Image< T > const &image)
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > Matrix
A matrix of a given type.
sopt::Vector< Scalar > Vector
sopt::Matrix< Scalar > Matrix
sopt::Image< Scalar > Image