1212#include < vector>
1313
1414
15+ template <typename T>
16+ T compute_median (std::vector<T>& input) {
17+ std::sort (input.begin (), input.end ());
18+ const auto n = input.size ();
19+ return (n % 2 == 0 ) ? (input[n/2 - 1 ] + input[n/2 ]) / 2 : input[n/2 ];
20+ }
21+
22+ template <typename T>
23+ T compute_min (std::vector<T>& input){
24+ return *std::min_element (input.begin (), input.end ());
25+
26+ }
27+
1528namespace FilterTestHelpers {
1629
1730 template <typename InputType, typename StencilType, typename OutputType>
@@ -23,7 +36,8 @@ namespace FilterTestHelpers {
2336
2437 template <typename InputType, typename OutputType>
2538 void compute_generic_filter_gt (APR& apr,
26- const ParticleData<InputType>& input_particles,
39+ ParticleData<InputType>& input_particles,
40+ ParticleData<OutputType>& tree_particles,
2741 ParticleData<OutputType>& output_particles,
2842 int size_y,
2943 int size_x,
@@ -32,23 +46,31 @@ namespace FilterTestHelpers {
3246 OutputType filter (std::vector<OutputType>&));
3347
3448
35- template <typename T>
36- T median (std::vector<T>& input) {
37- std::sort (input.begin (), input.end ());
38- const auto n = input.size ();
39- return (n % 2 == 0 ) ? (input[n/2 - 1 ] + input[n/2 ]) / 2 : input[n/2 ];
40- }
41-
42-
4349 template <typename InputType, typename OutputType>
4450 void compute_median_filter_gt (APR& apr,
45- const ParticleData<InputType>& input_particles,
51+ ParticleData<InputType>& input_particles,
4652 ParticleData<OutputType>& output_particles,
4753 int size_y,
4854 int size_x,
4955 int size_z) {
5056
51- compute_generic_filter_gt (apr, input_particles, output_particles, size_y, size_x, size_z, true , FilterTestHelpers::median);
57+ ParticleData<OutputType> tree_particles;
58+ APRTreeNumerics::fill_tree_mean (apr, input_particles, tree_particles);
59+ compute_generic_filter_gt (apr, input_particles, tree_particles, output_particles, size_y, size_x, size_z, true , compute_median);
60+ }
61+
62+
63+ template <typename InputType, typename OutputType>
64+ void compute_min_filter_gt (APR& apr,
65+ ParticleData<InputType>& input_particles,
66+ ParticleData<OutputType>& output_particles,
67+ int size_y,
68+ int size_x,
69+ int size_z) {
70+
71+ ParticleData<OutputType> tree_particles;
72+ APRTreeNumerics::fill_tree_min (apr, input_particles, tree_particles);
73+ compute_generic_filter_gt (apr, input_particles, tree_particles, output_particles, size_y, size_x, size_z, true , compute_min);
5274 }
5375
5476}
@@ -152,7 +174,8 @@ void FilterTestHelpers::compute_convolution_gt(APR &apr,
152174
153175
154176template <typename InputType, typename OutputType>
155- void FilterTestHelpers::compute_generic_filter_gt (APR &apr, const ParticleData<InputType> &input_particles,
177+ void FilterTestHelpers::compute_generic_filter_gt (APR &apr, ParticleData<InputType> &input_particles,
178+ ParticleData<OutputType> &tree_particles,
156179 ParticleData<OutputType> &output_particles, const int size_y,
157180 const int size_x, const int size_z, const bool reflect_boundary,
158181 OutputType filter (std::vector<OutputType>&)) {
@@ -166,7 +189,7 @@ void FilterTestHelpers::compute_generic_filter_gt(APR &apr, const ParticleData<I
166189 ReconPatch patch_spec;
167190 patch_spec.level_delta = level - apr.level_max ();
168191 PixelData<OutputType> by_level_recon;
169- APRReconstruction::reconstruct_constant (apr, by_level_recon, input_particles, patch_spec);
192+ APRReconstruction::reconstruct_constant (apr, by_level_recon, input_particles, tree_particles, patch_spec);
170193
171194 // iteration over particles - at each location compute filter output using the reconstructed image
172195 for (int z = 0 ; z < apr_it.z_num (level); ++z) {
0 commit comments