PURIFY
Next-generation radio interferometric imaging
wavelet_operator_factory.h
Go to the documentation of this file.
1 #ifndef WAVELET_OPERATOR_FACTORY_H
2 #define WAVELET_OPERATOR_FACTORY_H
3 
4 #include "purify/config.h"
5 
6 #include "purify/types.h"
7 #include "purify/logging.h"
8 
9 #include <vector>
10 #include <sopt/wavelets.h>
11 #include <sopt/wavelets/sara.h>
12 #ifdef PURIFY_MPI
13 #include <sopt/mpi/communicator.h>
14 #include <sopt/mpi/session.h>
15 #endif
16 namespace purify {
17 namespace factory {
20 template <class T>
21 std::shared_ptr<sopt::LinearTransform<T> const> wavelet_operator_factory(
22  const distributed_wavelet_operator distribute,
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());
26  switch (distribute) {
28  PURIFY_LOW_LOG("Using serial wavelet operator.");
29  sara_size = sara.size();
30  if (sara.size() == 0)
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));
38  }
39 #ifdef PURIFY_MPI
41  auto const comm = sopt::mpi::Communicator::World();
42  PURIFY_LOW_LOG("Using distributed image MPI wavelet operator.");
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));
47  }
48 #endif
49  default:
50  throw std::runtime_error(
51  "Distributed method not found for Wavelet Operator. Are you sure you compiled with MPI?");
52  }
53 }
54 template <class T>
55 std::shared_ptr<sopt::LinearTransform<T> const> wavelet_operator_factory(
56  const distributed_wavelet_operator distribute,
57  const std::vector<std::tuple<std::string, t_uint>>& wavelets, const t_uint imsizey,
58  const t_uint imsizex) {
59  t_uint size = 0;
60  return wavelet_operator_factory<T>(distribute, wavelets, imsizey, imsizex, size);
61 }
62 } // namespace factory
63 } // namespace purify
64 #endif
#define PURIFY_LOW_LOG(...)
Low priority message.
Definition: logging.h:207
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