PURIFY
Next-generation radio interferometric imaging
Functions
measurement_factory.cc File Reference
#include "catch2/catch_all.hpp"
#include "purify/logging.h"
#include "purify/measurement_operator_factory.h"
#include "purify/utilities.h"
#include <sopt/power_method.h>
+ Include dependency graph for measurement_factory.cc:

Go to the source code of this file.

Functions

 TEST_CASE ("Serial vs Distributed Operator")
 
 TEST_CASE ("GPU Serial vs Distributed Operator")
 

Function Documentation

◆ TEST_CASE() [1/2]

TEST_CASE ( "GPU Serial vs Distributed Operator"  )

Definition at line 42 of file measurement_factory.cc.

42  {
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 }
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
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 purify::factory::gpu_serial, purify::kernels::kb, purify::factory::measurement_operator_factory(), purify::constant::pi, and purify::utilities::random_sample_density().

◆ TEST_CASE() [2/2]

TEST_CASE ( "Serial vs Distributed Operator"  )

Definition at line 8 of file measurement_factory.cc.

8  {
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 }
void set_level(const std::string &level)
Method to set the logging level of the default Log object.
Definition: logging.h:137

References purify::kernels::kb, purify::constant::pi, purify::utilities::random_sample_density(), purify::factory::serial, and purify::logging::set_level().