1 #ifndef WAVELET_OPERATOR_FACTORY_H
2 #define WAVELET_OPERATOR_FACTORY_H
4 #include "purify/config.h"
10 #include <sopt/wavelets.h>
11 #include <sopt/wavelets/sara.h>
13 #include <sopt/mpi/communicator.h>
14 #include <sopt/mpi/session.h>
23 const std::vector<std::tuple<std::string, t_uint>>& wavelets,
const t_uint imsizey,
24 const t_uint imsizex, t_uint& sara_size) {
25 const auto sara = sopt::wavelets::SARA(wavelets.begin(), wavelets.end());
29 sara_size = sara.size();
31 return std::make_shared<sopt::LinearTransform<T>
const>(
32 [imsizex, imsizey](T& out,
const T& x) { out = T::Zero(imsizey * imsizex); },
33 std::array<t_int, 3>{0, 1,
static_cast<t_int
>(imsizex * imsizey)},
34 [imsizex, imsizey](T& out,
const T& x) { out = T::Zero(imsizey * imsizex); },
35 std::array<t_int, 3>{0, 1,
static_cast<t_int
>(imsizey * imsizex)});
36 return std::make_shared<sopt::LinearTransform<T>>(
37 sopt::linear_transform<typename T::Scalar>(sara, imsizey, imsizex));
41 auto const comm = sopt::mpi::Communicator::World();
43 const auto dsara = sopt::wavelets::distribute_sara(sara, comm);
44 sara_size = dsara.size();
45 return std::make_shared<sopt::LinearTransform<T>>(
46 sopt::linear_transform<typename T::Scalar>(dsara, imsizey, imsizex, comm));
50 throw std::runtime_error(
51 "Distributed method not found for Wavelet Operator. Are you sure you compiled with MPI?");
57 const std::vector<std::tuple<std::string, t_uint>>& wavelets,
const t_uint imsizey,
58 const t_uint imsizex) {
60 return wavelet_operator_factory<T>(distribute, wavelets, imsizey, imsizex, size);
#define PURIFY_LOW_LOG(...)
Low priority message.
std::shared_ptr< sopt::LinearTransform< T > const > wavelet_operator_factory(const distributed_wavelet_operator distribute, const std::vector< std::tuple< std::string, t_uint >> &wavelets, const t_uint imsizey, const t_uint imsizex, t_uint &sara_size)
construct sara wavelet operator
distributed_wavelet_operator