PURIFY
Next-generation radio interferometric imaging
Functions
time_w_algos.cc File Reference
#include "purify/config.h"
#include "purify/types.h"
#include <ctime>
#include "purify/directories.h"
#include "purify/logging.h"
#include "purify/measurement_operator_factory.h"
#include "purify/utilities.h"
+ Include dependency graph for time_w_algos.cc:

Go to the source code of this file.

Functions

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

Function Documentation

◆ main()

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

Definition at line 11 of file time_w_algos.cc.

11  {
12  auto const session = sopt::mpi::init(nargs, args);
13  auto const world = sopt::mpi::Communicator::World();
15  t_int const conj = (nargs > 1) ? std::stod(static_cast<std::string>(args[1])) : 0;
16  const t_int iters = (nargs > 2) ? std::stod(static_cast<std::string>(args[2])) : 1;
17  // Gridding example
18  auto const oversample_ratio = 2;
19  auto const Ju = 4;
20  auto const Jw = 100;
21  const t_real FoV = 25 * 60 * 60;
22  std::string const results = output_filename("times_" + std::to_string(world.size()) +
23  ((static_cast<bool>(conj)) ? "_conj" : "") + ".txt");
24  std::ofstream out(world.is_root() ? results : output_filename("empty.txt"));
25  if (world.is_root()) {
26  out.precision(13);
27  }
28  for (t_int nvis_iters = 6; nvis_iters < 9; nvis_iters++) {
29  for (t_int w_iter = 1; w_iter < 4; w_iter++) {
30  for (t_int cell_iters = 8; cell_iters < 13; cell_iters++) {
31  t_int const number_of_vis = std::pow(10, nvis_iters);
32  const t_real rms_w = 50. * w_iter; // lambda
33  t_int const imsizex = std::pow(2, cell_iters);
34  t_int const imsizey = imsizex;
35  const t_real cell = FoV / static_cast<t_real>(imsizex);
36  auto const kernel = "kb";
37 
38  t_uint const number_of_pixels = imsizex * imsizey;
39  // Generating random uv(w) coverage
40  t_real const sigma_m = constant::pi / 3;
41  auto uv_data = utilities::random_sample_density(std::floor(number_of_vis / world.size()), 0,
42  sigma_m, rms_w);
43  if (static_cast<bool>(conj)) uv_data = utilities::conjugate_w(uv_data);
44  const auto cost = [](t_real x) -> t_real { return std::abs(x * x); };
45  uv_data = utilities::w_stacking(uv_data, world, 100, cost, 1e-3);
46  uv_data.units = utilities::vis_units::radians;
47  const Vector<t_complex> image = Vector<t_complex>::Random(number_of_pixels);
48  t_real con_time = 0;
49  t_real app_time = 0;
50  for (t_int i = 0; i < iters; i++) {
51  auto begin = std::chrono::high_resolution_clock::now();
52  const auto measure_op = factory::measurement_operator_factory<Vector<t_complex>>(
53  factory::distributed_measurement_operator::mpi_distribute_image, uv_data, imsizey,
54  imsizex, cell, cell, oversample_ratio, kernels::kernel_from_string.at(kernel), Ju, Jw,
55  true, 1e-6, 1e-6, dde_type::wkernel_radial);
56  auto end = std::chrono::high_resolution_clock::now();
57  con_time += world.all_reduce<t_real>(
58  std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() * 1e-9,
59  MPI_MAX); // total time for construction to run in seconds
60  world.barrier();
61  begin = std::chrono::high_resolution_clock::now();
62  Vector<t_complex> const measurements =
63  measure_op->adjoint() * (*measure_op * image).eval();
64  end = std::chrono::high_resolution_clock::now();
65  app_time += world.all_reduce<t_real>(
66  std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() * 1e-9,
67  MPI_MAX); // total time for application to run in seconds
68  }
69  con_time /= static_cast<t_real>(iters);
70  app_time /= static_cast<t_real>(iters);
71  if (world.is_root()) {
72  out << number_of_vis << " " << rms_w << " " << imsizex << " " << con_time << " "
73  << app_time << std::endl; // in seconds
74  PURIFY_LOW_LOG("Mean Construction Time: {}, Mean Application Time: {}", con_time,
75  app_time);
76  }
77  }
78  }
79  }
80  out.close();
81 }
#define PURIFY_LOW_LOG(...)
Low priority message.
Definition: logging.h:207
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 w_stacking(utilities::vis_params const &params, sopt::mpi::Communicator const &comm, const t_int iters, const std::function< t_real(t_real)> &cost, const t_real k_means_rel_diff)
utilities::vis_params conjugate_w(const utilities::vis_params &uv_vis)
reflects visibilities into the w >= 0 domain
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.
std::string output_filename(std::string const &filename)
Test output file.

References purify::utilities::conjugate_w(), purify::kernels::kernel_from_string, purify::factory::mpi_distribute_image, purify::output_filename(), purify::constant::pi, PURIFY_LOW_LOG, purify::utilities::radians, purify::utilities::random_sample_density(), purify::logging::set_level(), purify::utilities::w_stacking(), and purify::wkernel_radial.