@@ -51,6 +51,34 @@ def test_paganin_filter_dist3(data):
5151 assert_allclose (np .sum (filtered_data ), - 24870786.0 , rtol = 1e-6 )
5252
5353
54+ @pytest .mark .parametrize (
55+ "test_case" ,
56+ [
57+ ("next_power_of_2" , None , - 6.725061 , - 6.367116 ),
58+ ("next_fast_length" , None , - 6.677313 , - 6.096187 ),
59+ ("use_pad_x_y" , (0 , 0 ), - 6.677313 , - 6.096187 ),
60+ ("use_pad_x_y" , (80 , 80 ), - 6.73193 , - 6.405338 ),
61+ ("use_pad_x_y" , (45 , 75 ), - 6.726483 , - 6.37466 ),
62+ ],
63+ )
64+ def test_paganin_filter_padding_options (data , test_case ):
65+ # --- testing the Paganin filter on tomo_standard ---#
66+ padding_method , pad_x_y , test_mean , test_max = test_case
67+ filtered_data = paganin_filter (
68+ data ,
69+ calculate_padding_value_method = padding_method ,
70+ pad_x_y = pad_x_y ,
71+ ).get ()
72+
73+ assert filtered_data .ndim == 3
74+ assert_allclose (np .mean (filtered_data ), test_mean , rtol = eps )
75+ assert_allclose (np .max (filtered_data ), test_max , rtol = eps )
76+
77+ #: make sure the output is float32
78+ assert filtered_data .dtype == np .float32
79+ assert filtered_data .flags .c_contiguous
80+
81+
5482@pytest .mark .perf
5583def test_paganin_filter_performance (ensure_clean_memory ):
5684 # Note: low/high and size values taken from sample2_medium.yaml real run
@@ -87,41 +115,77 @@ def test_paganin_filter_performance(ensure_clean_memory):
87115
88116@pytest .mark .parametrize ("slices" , [3 , 7 , 32 , 61 , 109 , 120 , 150 ])
89117@pytest .mark .parametrize ("dim_x" , [128 , 140 ])
90- def test_paganin_filter_calc_mem (slices , dim_x , ensure_clean_memory ):
118+ @pytest .mark .parametrize (
119+ "padding" ,
120+ [("next_power_of_2" , None ), ("next_fast_length" , None ), ("use_pad_x_y" , (45 , 45 ))],
121+ )
122+ def test_paganin_filter_calc_mem (slices , dim_x , padding , ensure_clean_memory ):
91123 dim_y = 159
124+ padding_method , pad_x_y = padding
125+
92126 data = cp .random .random_sample ((slices , dim_x , dim_y ), dtype = np .float32 )
93127 hook = MaxMemoryHook ()
94128 with hook :
95- paganin_filter (cp .copy (data ))
129+ paganin_filter (
130+ cp .copy (data ),
131+ calculate_padding_value_method = padding_method ,
132+ pad_x_y = pad_x_y ,
133+ )
96134 actual_mem_peak = hook .max_mem
97135
98136 try :
99- estimated_mem_peak = paganin_filter (data .shape , calc_peak_gpu_mem = True )
137+ estimated_mem_peak = paganin_filter (
138+ data .shape ,
139+ calculate_padding_value_method = padding_method ,
140+ pad_x_y = pad_x_y ,
141+ calc_peak_gpu_mem = True ,
142+ )
100143 except cp .cuda .memory .OutOfMemoryError :
101144 pytest .skip ("Not enough GPU memory to estimate memory peak" )
102145
103- assert actual_mem_peak * 0.99 <= estimated_mem_peak
104- assert estimated_mem_peak <= actual_mem_peak * 1.01
146+ assert actual_mem_peak == estimated_mem_peak
105147
106148
107149@pytest .mark .parametrize ("slices" , [38 , 177 , 268 , 320 , 490 , 607 , 803 , 859 , 902 , 951 ])
108150@pytest .mark .parametrize ("dims" , [(900 , 1280 ), (1801 , 1540 ), (1801 , 2560 )])
109- def test_paganin_filter_calc_mem_big (slices , dims , ensure_clean_memory ):
151+ @pytest .mark .parametrize (
152+ "padding" ,
153+ [
154+ ("next_power_of_2" , None ),
155+ ("next_fast_length" , None ),
156+ ("use_pad_x_y" , (145 , 122 )),
157+ ],
158+ )
159+ def test_paganin_filter_calc_mem_big (slices , dims , padding , ensure_clean_memory ):
110160 dim_y , dim_x = dims
111161 data_shape = (slices , dim_x , dim_y )
162+ padding_method , pad_x_y = padding
112163 try :
113- estimated_mem_peak = paganin_filter (data_shape , calc_peak_gpu_mem = True )
164+ estimated_mem_peak = paganin_filter (
165+ data_shape ,
166+ calculate_padding_value_method = padding_method ,
167+ pad_x_y = pad_x_y ,
168+ calc_peak_gpu_mem = True ,
169+ )
114170 except cp .cuda .memory .OutOfMemoryError :
115171 pytest .skip ("Not enough GPU memory to estimate memory peak" )
172+ except cp .cuda .cufft .CuFFTError as cufft_error :
173+ if cufft_error .result == 8 : # CUFFT_INVALID_SIZE
174+ pytest .skip ("Not usable FFT size" )
175+ else :
176+ raise
116177 av_mem = cp .cuda .Device ().mem_info [0 ]
117178 if av_mem < estimated_mem_peak :
118179 pytest .skip ("Not enough GPU memory to run this test" )
119180
120181 hook = MaxMemoryHook ()
121182 with hook :
122183 data = cp .random .random_sample (data_shape , dtype = np .float32 )
123- paganin_filter (data )
184+ paganin_filter (
185+ data ,
186+ calculate_padding_value_method = padding_method ,
187+ pad_x_y = pad_x_y ,
188+ )
124189 actual_mem_peak = hook .max_mem
125190
126- assert actual_mem_peak * 0.99 <= estimated_mem_peak
127- assert estimated_mem_peak <= actual_mem_peak * 1.01
191+ assert actual_mem_peak == estimated_mem_peak
0 commit comments