1 #include "purify/config.h"
5 #include <benchmark/benchmark.h>
8 #include "purify/directories.h"
15 #include <sopt/imaging_padmm.h>
16 #include <sopt/mpi/communicator.h>
17 #include <sopt/mpi/session.h>
18 #include <sopt/power_method.h>
19 #include <sopt/relative_variation.h>
20 #include <sopt/utilities.h>
21 #include <sopt/wavelets.h>
22 #include <sopt/wavelets/sara.h>
32 void SetUp(const ::benchmark::State &state) {
33 m_imsizex = state.range(0);
34 m_imsizey = state.range(0);
36 m_sigma = 0.016820222945913496 * std::sqrt(2);
37 m_beta = m_sigma * m_sigma;
42 m_input_data_path =
data_filename(
"expected/fb/input_data.h5");
44 m_world = sopt::mpi::Communicator::World();
47 void TearDown(const ::benchmark::State &state) {}
62 std::vector<std::tuple<std::string, t_uint>>
const m_sara{
63 std::make_tuple(
"Dirac", 3u), std::make_tuple(
"DB1", 3u), std::make_tuple(
"DB2", 3u),
64 std::make_tuple(
"DB3", 3u), std::make_tuple(
"DB4", 3u), std::make_tuple(
"DB5", 3u),
65 std::make_tuple(
"DB6", 3u), std::make_tuple(
"DB7", 3u), std::make_tuple(
"DB8", 3u)};
70 std::function<std::shared_ptr<sopt::IterationState<Vector<t_complex>>>()>
random_updater =
75 auto phi = factory::measurement_operator_factory<Vector<t_complex>>(
79 auto const power_method_stuff = sopt::algorithm::power_method<Vector<t_complex>>(
81 m_world.broadcast(Vector<t_complex>::Ones(m_imsizex * m_imsizey).eval()));
83 const t_real op_norm = std::get<0>(power_method_stuff);
84 phi->set_norm(op_norm);
86 return std::make_shared<sopt::IterationState<Vector<t_complex>>>(uv_data.
vis, phi);
90 auto const wavelets = factory::wavelet_operator_factory<Vector<t_complex>>(
94 sopt::algorithm::ImagingForwardBackward<t_complex> fb(
random_updater);
95 fb.itermax(state.range(2))
96 .step_size(m_beta * sqrt(2))
97 .sigma(m_sigma * sqrt(2))
98 .regulariser_strength(m_gamma)
99 .relative_variation(1e-3)
100 .residual_tolerance(0)
104 auto gp = std::make_shared<sopt::algorithm::L1GProximal<t_complex>>(
false);
105 gp->l1_proximal_tolerance(1e-4)
107 .l1_proximal_itermax(50)
108 .l1_proximal_positivity_constraint(
true)
109 .l1_proximal_real_constraint(
true)
115 while (state.KeepRunning()) {
116 auto start = std::chrono::high_resolution_clock::now();
118 auto end = std::chrono::high_resolution_clock::now();
125 std::function<std::shared_ptr<sopt::IterationState<Vector<t_complex>>>()>
random_updater =
130 auto phi = factory::measurement_operator_factory<Vector<t_complex>>(
135 static auto const power_method_stuff = sopt::algorithm::power_method<Vector<t_complex>>(
137 m_world.broadcast(Vector<t_complex>::Ones(m_imsizex * m_imsizey).eval()));
139 static const t_real op_norm = std::get<0>(power_method_stuff);
142 phi->set_norm(op_norm);
144 return std::make_shared<sopt::IterationState<Vector<t_complex>>>(uv_data.
vis, phi);
148 auto const wavelets = factory::wavelet_operator_factory<Vector<t_complex>>(
152 sopt::algorithm::ImagingForwardBackward<t_complex> fb(
random_updater);
153 fb.itermax(state.range(2))
154 .step_size(m_beta * sqrt(2))
155 .sigma(m_sigma * sqrt(2))
156 .regulariser_strength(m_gamma)
157 .relative_variation(1e-3)
158 .residual_tolerance(0)
162 auto gp = std::make_shared<sopt::algorithm::L1GProximal<t_complex>>(
false);
163 gp->l1_proximal_tolerance(1e-4)
165 .l1_proximal_itermax(50)
166 .l1_proximal_positivity_constraint(
true)
167 .l1_proximal_real_constraint(
true)
173 while (state.KeepRunning()) {
174 auto start = std::chrono::high_resolution_clock::now();
176 auto end = std::chrono::high_resolution_clock::now();
182 ->Args({128, 10000, 10})
187 ->Unit(benchmark::kMillisecond);
190 ->Args({128, 10000, 10})
195 ->Unit(benchmark::kMillisecond);
std::string m_input_data_path
void SetUp(const ::benchmark::State &state)
void TearDown(const ::benchmark::State &state)
sopt::mpi::Communicator m_world
Purify interface class to handle HDF5 input files.
double duration(std::chrono::high_resolution_clock::time_point start, std::chrono::high_resolution_clock::time_point end)
utilities::vis_params stochread_visibility(H5Handler &file, const size_t N, const bool w_term)
Stochastically reads dataset slices from the supplied HDF5-file handler, constructs a vis_params obje...
const std::map< std::string, kernel > kernel_from_string
std::function< bool()> random_updater(const sopt::mpi::Communicator &comm, const t_int total, const t_int update_size, const std::shared_ptr< bool > update_pointer, const std::string &update_name)
std::string data_filename(std::string const &filename)
Holds data and such.
BENCHMARK_DEFINE_F(StochasticAlgoFixture, ForwardBackward)(benchmark