1 #include "purify/config.h"
4 #include "purify/directories.h"
11 #include <sopt/power_method.h>
15 int main(
int nargs,
char const **args) {
16 #define ARGS_MACRO(NAME, ARGN, VALUE, TYPE) \
18 static_cast<TYPE>((nargs > ARGN) ? std::stod(static_cast<std::string>(args[ARGN])) : VALUE);
26 auto const oversample_ratio = 2;
27 auto const power_iters = 1000;
28 auto const power_tol = 1e-6;
31 auto const imsizex = imsize;
32 auto const imsizey = imsize;
33 const t_real wval = w;
34 const t_int total = 10;
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;
45 M[i - 1] = number_of_vis;
47 while (trial < total) {
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,
57 auto end = std::chrono::high_resolution_clock::now();
59 std::chrono::duration_cast<std::chrono::duration<double>>(end - start).count() / total;
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)));
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,
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;
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)));
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,
79 end = std::chrono::high_resolution_clock::now();
81 std::chrono::duration_cast<std::chrono::duration<double>>(end - start).count() / total;
83 mop = std::get<2>(sopt::algorithm::normalise_operator<Vector<t_complex>>(
84 mop, power_iters, power_tol, Vector<t_complex>::Random(imsizex * imsizey)));
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);
91 [=](Vector<t_complex> &out,
const Vector<t_complex> &x) {
92 out = (mop_radial->adjoint() * x) - (mop_2d->adjoint() * x);
94 mop_radial->adjoint().sizes()},
95 power_iters, power_tol, Vector<t_complex>::Random(imsizex * imsizey))) /
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);
103 [=](Vector<t_complex> &out,
const Vector<t_complex> &x) {
104 out = (mop_2d->adjoint() * x) - (mop->adjoint() * x);
106 mop_2d->adjoint().sizes()},
107 power_iters, power_tol, Vector<t_complex>::Random(imsizex * imsizey))) /
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)
#define ARGS_MACRO(NAME, ARGN, VALUE, TYPE)
int main(int nargs, char const **args)
const t_real pi
mathematical constant
const std::map< std::string, kernel > kernel_from_string
void set_level(const std::string &level)
Method to set the logging level of the default Log object.
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.