PURIFY
Next-generation radio interferometric imaging
measurement_factory.cc
Go to the documentation of this file.
1 #include "catch2/catch_all.hpp"
2 #include "purify/logging.h"
4 #include "purify/utilities.h"
5 #include <sopt/power_method.h>
6 using namespace purify;
7 
8 TEST_CASE("Serial vs Distributed Operator") {
10 
11  auto const N = 100;
12  auto uv_serial = utilities::random_sample_density(N, 0, constant::pi / 3);
13 
14  auto const over_sample = 2;
15  auto const J = 4;
16  auto const kernel = kernels::kernel::kb;
17  auto const width = 128;
18  auto const height = 128;
19  const auto op_serial = purify::measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
20  uv_serial.u, uv_serial.v, uv_serial.w, uv_serial.weights, height, width, over_sample);
21  const auto op = factory::measurement_operator_factory<Vector<t_complex>>(
22  factory::distributed_measurement_operator::serial, uv_serial.u, uv_serial.v, uv_serial.w,
23  uv_serial.weights, height, width, over_sample);
24 
25  SECTION("Degridding") {
26  Vector<t_complex> const image = Vector<t_complex>::Random(width * height);
27 
28  auto uv_degrid = uv_serial;
29  uv_degrid.vis = *op_serial * image;
30  Vector<t_complex> const degridded = *op * image;
31  REQUIRE(degridded.size() == uv_degrid.vis.size());
32  REQUIRE(degridded.isApprox(uv_degrid.vis, 1e-4));
33  }
34  SECTION("Gridding") {
35  Vector<t_complex> const gridded = op->adjoint() * uv_serial.vis;
36  Vector<t_complex> const gridded_serial = op_serial->adjoint() * uv_serial.vis;
37  REQUIRE(gridded.size() == gridded_serial.size());
38  REQUIRE(gridded.isApprox(gridded_serial, 1e-4));
39  }
40 }
41 
42 TEST_CASE("GPU Serial vs Distributed Operator") {
43  auto const N = 100;
44  auto uv_serial = utilities::random_sample_density(N, 0, constant::pi / 3);
45 
46  auto const over_sample = 2;
47  auto const J = 4;
48  auto const kernel = kernels::kernel::kb;
49  auto const width = 128;
50  auto const height = 128;
51  const auto op_serial = purify::measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
52  uv_serial.u, uv_serial.v, uv_serial.w, uv_serial.weights, height, width, over_sample);
53 #ifndef PURIFY_ARRAYFIRE
54  REQUIRE_THROWS(factory::measurement_operator_factory<Vector<t_complex>>(
55  factory::distributed_measurement_operator::gpu_serial, uv_serial.u, uv_serial.v, uv_serial.w,
56  uv_serial.weights, height, width, over_sample));
57 #else
58  const auto op = factory::measurement_operator_factory<Vector<t_complex>>(
59  factory::distributed_measurement_operator::gpu_serial, uv_serial.u, uv_serial.v, uv_serial.w,
60  uv_serial.weights, height, width, over_sample);
61 
62  SECTION("Degridding") {
63  Vector<t_complex> const image = Vector<t_complex>::Random(width * height);
64 
65  auto uv_degrid = uv_serial;
66  uv_degrid.vis = *op_serial * image;
67  Vector<t_complex> const degridded = *op * image;
68  REQUIRE(degridded.size() == uv_degrid.vis.size());
69  REQUIRE(degridded.isApprox(uv_degrid.vis, 1e-4));
70  }
71  SECTION("Gridding") {
72  Vector<t_complex> const gridded = op->adjoint() * uv_serial.vis;
73  Vector<t_complex> const gridded_serial = op_serial->adjoint() * uv_serial.vis;
74  REQUIRE(gridded.size() == gridded_serial.size());
75  REQUIRE(gridded.isApprox(gridded_serial, 1e-4));
76  }
77 #endif
78 }
TEST_CASE("Serial vs Distributed Operator")
const t_real pi
mathematical constant
Definition: types.h:70
std::shared_ptr< sopt::LinearTransform< T > > measurement_operator_factory(const distributed_measurement_operator distribute, ARGS &&...args)
distributed measurement operator factory
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.