PURIFY
Next-generation radio interferometric imaging
Macros | Functions
compare_wprojection.cc File Reference
#include "purify/config.h"
#include "purify/types.h"
#include <chrono>
#include "purify/directories.h"
#include "purify/logging.h"
#include "purify/operators.h"
#include "purify/pfitsio.h"
#include "purify/utilities.h"
#include "purify/wide_field_utilities.h"
#include "purify/wproj_operators.h"
#include <sopt/power_method.h>
+ Include dependency graph for compare_wprojection.cc:

Go to the source code of this file.

Macros

#define ARGS_MACRO(NAME, ARGN, VALUE, TYPE)
 

Functions

int main (int nargs, char const **args)
 

Macro Definition Documentation

◆ ARGS_MACRO

#define ARGS_MACRO (   NAME,
  ARGN,
  VALUE,
  TYPE 
)
Value:
auto const NAME = \
static_cast<TYPE>((nargs > ARGN) ? std::stod(static_cast<std::string>(args[ARGN])) : VALUE);

Function Documentation

◆ main()

int main ( int  nargs,
char const **  args 
)

Definition at line 15 of file compare_wprojection.cc.

15  {
16 #define ARGS_MACRO(NAME, ARGN, VALUE, TYPE) \
17  auto const NAME = \
18  static_cast<TYPE>((nargs > ARGN) ? std::stod(static_cast<std::string>(args[ARGN])) : VALUE);
19 
20  ARGS_MACRO(w, 1, 10, t_real)
21  ARGS_MACRO(imsize, 2, 256, t_uint)
22  ARGS_MACRO(cell, 3, 2400, t_real)
23 #undef ARGS_MACRO
25  // Gridding example
26  auto const oversample_ratio = 2;
27  auto const power_iters = 1000;
28  auto const power_tol = 1e-6;
29  auto const Ju = 4;
30  auto const Jv = 4;
31  auto const imsizex = imsize;
32  auto const imsizey = imsize;
33  const t_real wval = w;
34  const t_int total = 10;
35  auto const kernel = "kb";
36  std::vector<t_real> M(10);
37  std::vector<t_real> ctor_mop_wr(10);
38  std::vector<t_real> ctor_mop_w2d(10);
39  std::vector<t_real> ctor_mop(10);
40  std::vector<t_real> diff_wr_w2d(10);
41  std::vector<t_real> diff_mop_w2d(10);
42  for (t_int i = 1; i < M.size() + 1; i++) {
43  t_uint const number_of_vis = 100 * i;
44  t_uint trial = 0;
45  M[i - 1] = number_of_vis;
46  // Generating random uv(w) coverage
47  while (trial < total) {
48  t_real const sigma_m = constant::pi / 3;
49  auto uv_vis = utilities::random_sample_density(number_of_vis, 0, sigma_m, wval);
50  uv_vis.units = utilities::vis_units::radians;
51 
52  auto start = std::chrono::high_resolution_clock::now();
53  auto mop_radial = measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
54  uv_vis, imsizey, imsizex, cell, cell, oversample_ratio,
55  kernels::kernel_from_string.at(kernel), Ju, 40, false, 1e-6, 1e-6,
56  dde_type::wkernel_radial);
57  auto end = std::chrono::high_resolution_clock::now();
58  ctor_mop_wr[i - 1] +=
59  std::chrono::duration_cast<std::chrono::duration<double>>(end - start).count() / total;
60  // normalise operator
61  mop_radial = std::get<2>(sopt::algorithm::normalise_operator<Vector<t_complex>>(
62  mop_radial, power_iters, power_tol, Vector<t_complex>::Random(imsizex * imsizey)));
63 
64  start = std::chrono::high_resolution_clock::now();
65  auto mop_2d = measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
66  uv_vis, imsizey, imsizex, cell, cell, oversample_ratio,
67  kernels::kernel_from_string.at(kernel), Ju, 40, false, 1e-6, 1e-6, dde_type::wkernel_2d);
68  end = std::chrono::high_resolution_clock::now();
69  ctor_mop_w2d[i - 1] +=
70  std::chrono::duration_cast<std::chrono::duration<double>>(end - start).count() / total;
71  // normalise operator
72  mop_2d = std::get<2>(sopt::algorithm::normalise_operator<Vector<t_complex>>(
73  mop_2d, power_iters, power_tol, Vector<t_complex>::Random(imsizex * imsizey)));
74 
75  start = std::chrono::high_resolution_clock::now();
76  auto mop = measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
77  uv_vis, imsizey, imsizex, cell, cell, oversample_ratio,
78  kernels::kernel_from_string.at(kernel), Ju, Ju, false);
79  end = std::chrono::high_resolution_clock::now();
80  ctor_mop[i - 1] +=
81  std::chrono::duration_cast<std::chrono::duration<double>>(end - start).count() / total;
82  // normalise operator
83  mop = std::get<2>(sopt::algorithm::normalise_operator<Vector<t_complex>>(
84  mop, power_iters, power_tol, Vector<t_complex>::Random(imsizex * imsizey)));
85  diff_wr_w2d[i - 1] +=
86  std::get<0>(sopt::algorithm::power_method<Vector<t_complex>>(
87  {[=](Vector<t_complex> &out, const Vector<t_complex> &x) {
88  out = ((*mop_radial) * x) - ((*mop_2d) * x);
89  },
90  mop_radial->sizes(),
91  [=](Vector<t_complex> &out, const Vector<t_complex> &x) {
92  out = (mop_radial->adjoint() * x) - (mop_2d->adjoint() * x);
93  },
94  mop_radial->adjoint().sizes()},
95  power_iters, power_tol, Vector<t_complex>::Random(imsizex * imsizey))) /
96  total;
97  diff_mop_w2d[i - 1] +=
98  std::get<0>(sopt::algorithm::power_method<Vector<t_complex>>(
99  {[=](Vector<t_complex> &out, const Vector<t_complex> &x) {
100  out = ((*mop_2d) * x) - ((*mop) * x);
101  },
102  mop_2d->sizes(),
103  [=](Vector<t_complex> &out, const Vector<t_complex> &x) {
104  out = (mop_2d->adjoint() * x) - (mop->adjoint() * x);
105  },
106  mop_2d->adjoint().sizes()},
107  power_iters, power_tol, Vector<t_complex>::Random(imsizex * imsizey))) /
108  total;
109  trial++;
110  }
111  }
112  for (t_uint i = 0; i < M.size(); i++)
113  std::cout << M.at(i) << " " << ctor_mop_wr.at(i) << " " << ctor_mop_w2d.at(i) << " "
114  << ctor_mop.at(i) << " " << diff_wr_w2d.at(i) << " " << diff_mop_w2d.at(i)
115  << std::endl;
116 }
#define ARGS_MACRO(NAME, ARGN, VALUE, TYPE)
const t_real pi
mathematical constant
Definition: types.h:70
const std::map< std::string, kernel > kernel_from_string
Definition: kernels.h:16
void set_level(const std::string &level)
Method to set the logging level of the default Log object.
Definition: logging.h:137
utilities::vis_params random_sample_density(const t_int vis_num, const t_real mean, const t_real standard_deviation, const t_real rms_w)
Generates a random visibility coverage.

References ARGS_MACRO, purify::kernels::kernel_from_string, purify::constant::pi, purify::utilities::radians, purify::utilities::random_sample_density(), purify::logging::set_level(), purify::wkernel_2d, and purify::wkernel_radial.