4 #include "purify/directories.h"
10 #include <sopt/linear_transform.h>
17 int im_size_max = 4096;
18 int uv_size_max = 10000000;
20 for (
int i = 128; i <= im_size_max; i *= 2)
21 for (
int j = 1000000; j <= uv_size_max; j *= 10)
22 for (
int k = 2; k <= kernel_max; k *= 2)
23 if (k * k < i) b->Args({i, j, k});
26 double duration(std::chrono::high_resolution_clock::time_point start,
27 std::chrono::high_resolution_clock::time_point end) {
28 auto elapsed_seconds = std::chrono::duration_cast<std::chrono::duration<double>>(end - start);
29 return elapsed_seconds.count();
32 bool updateImage(t_uint newSize, Image<t_complex> &image, t_uint &sizex, t_uint &sizey) {
33 if (sizex == newSize) {
36 image = Image<t_complex>::Random(newSize, newSize);
39 t_real
const max = image.array().abs().maxCoeff();
40 image = image * 1. / max;
44 bool updateEmptyImage(t_uint newSize, Vector<t_complex> &image, t_uint &sizex, t_uint &sizey) {
45 if (sizex == newSize) {
48 image.resize(newSize * newSize);
55 if (data.
vis.size() == newSize) {
63 Image<t_complex> &image) {
64 if (data.
vis.size() == newSize && !newImage) {
68 const t_real cellsize = FoV / image.size() * 60. * 60.;
69 std::tuple<utilities::vis_params, t_real> temp =
71 data = std::get<0>(temp);
78 Image<t_complex>
const &ground_truth_image, t_uint number_of_vis, t_real snr,
79 const t_real &cellsize) {
82 auto measurement_op = measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
83 uv_data, ground_truth_image.rows(), ground_truth_image.cols(), cellsize, cellsize, 2,
86 uv_data.vis = (*measurement_op) *
87 Image<t_complex>::Map(ground_truth_image.data(), ground_truth_image.size(), 1);
93 return std::make_tuple(uv_data, sigma);
97 const bool cache_visibilities) {
100 std::stringstream filename;
101 filename <<
"random_" << size <<
"_";
102 filename << std::to_string(
id) <<
".vis";
104 std::ifstream vis_file_str(vis_file);
106 if (cache_visibilities and vis_file_str.good()) {
107 PURIFY_INFO(
"Reading random visibilities from file {}", vis_file);
115 if (cache_visibilities) {
124 if (comm.is_root()) {
127 if (comm.size() == 1)
return uv_data;
138 sopt::mpi::Communicator &comm) {
139 if (data.
vis.size() == newSize) {
142 comm = sopt::mpi::Communicator::World();
148 Image<t_complex> &image, sopt::mpi::Communicator &comm) {
149 if (data.
vis.size() == newSize && !newImage) {
152 comm = sopt::mpi::Communicator::World();
153 const t_real FoV = 1;
154 const t_real cellsize = FoV / image.size() * 60. * 60.;
155 std::tuple<utilities::vis_params, t_real> temp =
157 data = std::get<0>(temp);
162 double duration(std::chrono::high_resolution_clock::time_point start,
163 std::chrono::high_resolution_clock::time_point end,
164 sopt::mpi::Communicator
const &comm) {
165 auto elapsed_seconds =
duration(start, end);
168 return comm.all_reduce(elapsed_seconds, MPI_MAX);
171 Image<t_complex>
const &ground_truth_image, t_uint number_of_vis, t_real snr,
172 const t_real &cellsize, sopt::mpi::Communicator
const &comm) {
173 if (comm.size() == 1)
return dirty_measurements(ground_truth_image, number_of_vis, snr, cellsize);
174 if (comm.is_root()) {
176 comm.broadcast(std::get<1>(result));
182 auto const sigma = comm.broadcast<t_real>();
185 void update_comm(sopt::mpi::Communicator &comm) { comm = sopt::mpi::Communicator::World(); }
bool updateImage(t_uint newSize, Image< t_complex > &image, t_uint &sizex, t_uint &sizey)
std::tuple< utilities::vis_params, t_real > dirty_measurements(Image< t_complex > const &ground_truth_image, t_uint number_of_vis, t_real snr, const t_real &cellsize)
bool updateEmptyImage(t_uint newSize, Vector< t_complex > &image, t_uint &sizex, t_uint &sizey)
void Arguments(benchmark::internal::Benchmark *b)
bool updateMeasurements(t_uint newSize, utilities::vis_params &data, t_real &epsilon, bool newImage, Image< t_complex > &image)
double duration(std::chrono::high_resolution_clock::time_point start, std::chrono::high_resolution_clock::time_point end)
utilities::vis_params random_measurements(t_int size, const t_real max_w, const t_int id, const bool cache_visibilities)
const t_real pi
mathematical constant
std::vector< t_int > distribute_measurements(Vector< t_real > const &u, Vector< t_real > const &v, Vector< t_real > const &w, t_int const number_of_nodes, distribute::plan const distribution_plan, t_int const &grid_size)
Distribute visiblities into groups.
void write_visibility(const utilities::vis_params &uv_vis, const std::string &file_name, const bool w_term)
Writes visibilities to txt.
t_real SNR_to_standard_deviation(const Vector< t_complex > &y0, const t_real &SNR)
Converts SNR to RMS noise.
Vector< t_complex > add_noise(const Vector< t_complex > &y0, const t_complex &mean, const t_real &standard_deviation)
Add guassian noise to vector.
vis_params scatter_visibilities(vis_params const ¶ms, std::vector< t_int > const &sizes, sopt::mpi::Communicator const &comm)
vis_params regroup_and_scatter(vis_params const ¶ms, std::vector< t_int > const &groups, sopt::mpi::Communicator const &comm)
utilities::vis_params read_visibility(const std::vector< std::string > &names, const bool w_term)
Read visibility files from name of vector.
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.
t_real calculate_l2_radius(const t_uint y_size, const t_real &sigma, const t_real &n_sigma, const std::string distirbution)
A function that calculates the l2 ball radius for sopt.
std::string visibility_filename(std::string const &filename)
Visibility filename.