GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_avgpool3d_layer.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 80 115 69.6%
Functions: 0 0 -%
Branches: 226 667 33.9%

Line Branch Exec Source
1 module athena__avgpool3d_layer
2 !! Module containing implementation of a 3D average pooling layer
3 !!
4 !! This module implements 3D average pooling for downsampling volumetric data
5 !! by computing mean values within 3D pooling windows.
6 !!
7 !! Mathematical operation:
8 !! output[i,j,k,c] = (1/V) * sum_{l,m,n} input[i*s+l, j*s+m, k*s+n, c]
9 !!
10 !! where:
11 !! (i,j,k) are output spatial coordinates
12 !! c is the channel index
13 !! (l,m,n) iterate over the 3D pooling window
14 !! V = pool_size^3 is the window volume
15 !! s is stride in each dimension
16 !!
17 !! Smoother downsampling for volumetric/video data than max pooling.
18 !! Shape: (W,H,D,C) -> (W//stride,H//stride,D//stride,C)
19 use coreutils, only: real32, stop_program
20 use athena__base_layer, only: pool_layer_type, base_layer_type
21 use athena__pad3d_layer, only: pad3d_layer_type
22 use diffstruc, only: array_type
23 use athena__misc_types, only: &
24 onnx_node_type, onnx_initialiser_type, onnx_tensor_type
25 use athena__diffstruc_extd, only: avgpool3d
26 implicit none
27
28
29 private
30
31 public :: avgpool3d_layer_type
32 public :: read_avgpool3d_layer
33
34
35 type, extends(pool_layer_type) :: avgpool3d_layer_type
36 !! Type for 3D average pooling layer with overloaded procedures
37 contains
38 procedure, pass(this) :: set_hyperparams => set_hyperparams_avgpool3d
39 !! Set hyperparameters for 3D average pooling layer
40 procedure, pass(this) :: read => read_avgpool3d
41 !! Read 3D average pooling layer from file
42
43 procedure, pass(this) :: forward => forward_avgpool3d
44 !! Forward propagation derived type handler
45
46 end type avgpool3d_layer_type
47
48 interface avgpool3d_layer_type
49 !! Interface for setting up the 3D average pooling layer
50 module function layer_setup( input_shape, &
51 pool_size, stride, padding, verbose ) result(layer)
52 !! Set up the 3D average pooling layer
53 integer, dimension(:), optional, intent(in) :: input_shape
54 !! Input shape
55 integer, dimension(..), optional, intent(in) :: pool_size
56 !! Pool size
57 integer, dimension(..), optional, intent(in) :: stride
58 !! Stride
59 character(*), optional, intent(in) :: padding
60 !! Padding
61 integer, optional, intent(in) :: verbose
62 !! Verbosity level
63 type(avgpool3d_layer_type) :: layer
64 !! Instance of the 3D average pooling layer
65 end function layer_setup
66 end interface avgpool3d_layer_type
67
68
69
70 contains
71
72 !###############################################################################
73 7 module function layer_setup( &
74
0/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7 input_shape, &
75 7 pool_size, stride, padding, verbose) result(layer)
76 !! Set up the 3D average pooling layer
77 implicit none
78
79 ! Arguments
80 integer, dimension(:), optional, intent(in) :: input_shape
81 !! Input shape
82 integer, dimension(..), optional, intent(in) :: pool_size
83 !! Pool size
84 integer, dimension(..), optional, intent(in) :: stride
85 !! Stride
86 character(*), optional, intent(in) :: padding
87 !! Padding
88 integer, optional, intent(in) :: verbose
89 !! Verbosity level
90
91 type(avgpool3d_layer_type) :: layer
92 !! Instance of the 3D average pooling layer
93
94 ! Local variables
95 integer :: verbose_ = 0
96 !! Verbosity level
97 integer, dimension(3) :: pool_size_, stride_
98 !! Pool size and stride
99 character(len=20) :: padding_
100 !! Padding
101
102
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if(present(verbose)) verbose_ = verbose
103
104 !---------------------------------------------------------------------------
105 ! Set up pool size
106 !---------------------------------------------------------------------------
107
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
7 if(present(pool_size))then
108 6 select rank(pool_size)
109 rank(0)
110
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
8 pool_size_ = pool_size
111 rank(1)
112
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
4 pool_size_(1) = pool_size(1)
113
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
8 if(size(pool_size,dim=1).eq.1)then
114
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 1 times.
3 pool_size_(2:) = pool_size(1)
115
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 elseif(size(pool_size,dim=1).eq.3)then
116
7/12
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✓ Branch 15 taken 6 times.
✓ Branch 16 taken 3 times.
9 pool_size_(2:) = pool_size(2:)
117 end if
118 end select
119 else
120
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 pool_size_ = 2
121 end if
122
123
124 !---------------------------------------------------------------------------
125 ! Set up stride
126 !---------------------------------------------------------------------------
127
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
7 if(present(stride))then
128 6 select rank(stride)
129 rank(0)
130
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
8 stride_ = stride
131 rank(1)
132
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
4 stride_(1) = stride(1)
133
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
8 if(size(stride,dim=1).eq.1)then
134
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 1 times.
3 stride_(2:) = stride(1)
135
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 elseif(size(stride,dim=1).eq.3)then
136
7/12
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✓ Branch 15 taken 6 times.
✓ Branch 16 taken 3 times.
9 stride_(2:) = stride(2:)
137 end if
138 end select
139 else
140
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 stride_ = 2
141 end if
142
143
144 !---------------------------------------------------------------------------
145 ! Set up padding
146 !---------------------------------------------------------------------------
147
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
7 if(present(padding))then
148
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 padding_ = padding
149 else
150 5 padding_ = "valid"
151 end if
152
153
154 !---------------------------------------------------------------------------
155 ! Set hyperparameters
156 !---------------------------------------------------------------------------
157 call layer%set_hyperparams( &
158 pool_size=pool_size_, stride=stride_, &
159 padding=padding_, verbose=verbose_ &
160 7 )
161
162
163 !---------------------------------------------------------------------------
164 ! Initialise layer shape
165 !---------------------------------------------------------------------------
166
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
7 if(present(input_shape)) call layer%init(input_shape=input_shape)
167
168
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
14 end function layer_setup
169 !###############################################################################
170
171
172 !###############################################################################
173 8 subroutine set_hyperparams_avgpool3d( &
174 this, pool_size, stride, padding, verbose &
175 )
176 !! Set hyperparameters for 3D average pooling layer
177 use coreutils, only: to_lower
178 implicit none
179
180 ! Arguments
181 class(avgpool3d_layer_type), intent(inout) :: this
182 !! Instance of the 3D average pooling layer
183 integer, dimension(3), intent(in) :: pool_size
184 !! Pool size
185 integer, dimension(3), intent(in) :: stride
186 !! Stride
187 character(*), optional, intent(in) :: padding
188 !! Padding
189 integer, optional, intent(in) :: verbose
190 !! Verbosity level
191
192 ! Local variables
193 character(len=20) :: padding_
194
195
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
8 this%name = "avgpool3d"
196 8 this%type = "pool"
197 8 this%subtype = "avg"
198 8 this%input_rank = 4
199 8 this%output_rank = 4
200
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
8 if(allocated(this%pool)) deallocate(this%pool)
201
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
8 if(allocated(this%strd)) deallocate(this%strd)
202 allocate( &
203 this%pool(this%input_rank-1), &
204 this%strd(this%input_rank-1) &
205
16/32
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✓ Branch 18 taken 8 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 8 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 8 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 8 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 8 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 8 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 8 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 8 times.
8 )
206
4/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 24 times.
✓ Branch 7 taken 8 times.
40 this%pool = pool_size
207
4/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 24 times.
✓ Branch 7 taken 8 times.
40 this%strd = stride
208
209 ! Handle padding
210
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1 times.
8 if(present(padding))then
211
2/4
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
7 padding_ = trim(adjustl(padding))
212 else
213 1 padding_ = "valid"
214 end if
215
216 23 select case(trim(adjustl(to_lower(padding_))))
217 case("valid", "none", "")
218 case default
219 this%pad_layer = pad3d_layer_type( &
220 4 padding = [ (this%pool-1)/2 ], &
221 method = padding_ &
222
32/96
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 25 taken 3 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✓ Branch 29 taken 3 times.
✓ Branch 30 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✓ Branch 81 taken 1 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 1 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 1 times.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✓ Branch 92 taken 1 times.
✗ Branch 93 not taken.
✓ Branch 94 taken 1 times.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 3 times.
✓ Branch 100 taken 1 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 3 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 3 times.
✗ Branch 105 not taken.
✓ Branch 106 taken 3 times.
34 )
223 end select
224
225
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1 times.
8 end subroutine set_hyperparams_avgpool3d
226 !###############################################################################
227
228
229 !##############################################################################!
230 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !
231 !##############################################################################!
232
233
234 !###############################################################################
235 1 subroutine read_avgpool3d(this, unit, verbose)
236 !! Read 3D average pooling layer from file
237 use athena__tools_infile, only: assign_val, assign_vec
238 use coreutils, only: to_lower, to_upper, icount
239 implicit none
240
241 ! Arguments
242 class(avgpool3d_layer_type), intent(inout) :: this
243 !! Instance of the 3D average pooling layer
244 integer, intent(in) :: unit
245 !! File unit
246 integer, optional, intent(in) :: verbose
247 !! Verbosity level
248
249 ! Local variables
250 integer :: verbose_ = 0
251 !! Verbosity level
252 integer :: stat
253 !! File status
254 integer :: itmp1
255 !! Temporary integer
256 integer, dimension(3) :: pool_size, stride
257 !! Pool size and stride
258 integer, dimension(4) :: input_shape
259 !! Input shape
260 character(256) :: buffer, tag, err_msg
261 !! Buffer for reading lines, tag for identifying lines, error message
262
263
264 ! Initialise optional arguments
265 !---------------------------------------------------------------------------
266
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(present(verbose)) verbose_ = verbose
267
268
269 ! Loop over tags in layer card
270 !---------------------------------------------------------------------------
271 3 tag_loop: do
272
273 ! Check for end of file
274 !------------------------------------------------------------------------
275 4 read(unit,'(A)',iostat=stat) buffer
276
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if(stat.ne.0)then
277 call stop_program( &
278 "file encountered error (EoF?) before END AVGPOOL3D" &
279 )
280 return
281 end if
282
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
4 if(trim(adjustl(buffer)).eq."") cycle tag_loop
283
284 ! Check for end of layer card
285 !------------------------------------------------------------------------
286
4/6
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 3 times.
8 if(trim(adjustl(buffer)).eq."END "//to_upper(trim(this%name)))then
287 1 backspace(unit)
288 4 exit tag_loop
289 end if
290
291
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 tag=trim(adjustl(buffer))
292
5/10
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
3 if(scan(buffer,"=").ne.0) tag=trim(tag(:scan(tag,"=")-1))
293
294 ! Read parameters from save file
295 !------------------------------------------------------------------------
296 6 select case(trim(tag))
297 case("INPUT_SHAPE")
298 1 call assign_vec(buffer, input_shape, itmp1)
299 case("POOL_SIZE")
300 1 call assign_vec(buffer, pool_size, itmp1)
301 case("STRIDE")
302 1 call assign_vec(buffer, stride, itmp1)
303 case default
304 ! Don't look for "e" due to scientific notation of numbers
305 ! ... i.e. exponent (E+00)
306 if(scan(to_lower(trim(adjustl(buffer))),&
307 'abcdfghijklmnopqrstuvwxyz').eq.0)then
308 cycle tag_loop
309 elseif(tag(:3).eq.'END')then
310 cycle tag_loop
311 end if
312 write(err_msg,'("Unrecognised line in input file: ",A)') &
313 trim(adjustl(buffer))
314 call stop_program(err_msg)
315
4/6
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
6 return
316 end select
317 end do tag_loop
318
319
320 ! Set hyperparameters and initialise layer
321 !---------------------------------------------------------------------------
322 1 call this%set_hyperparams(pool_size=pool_size, stride=stride)
323 1 call this%init(input_shape = input_shape)
324
325
326 ! Check for end of layer card
327 !---------------------------------------------------------------------------
328 1 read(unit,'(A)') buffer
329
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
2 if(trim(adjustl(buffer)).ne."END "//to_upper(trim(this%name)))then
330 write(0,*) trim(adjustl(buffer))
331 write(err_msg,'("END ",A," not where expected")') to_upper(this%name)
332 call stop_program(err_msg)
333 1 return
334 end if
335
336 end subroutine read_avgpool3d
337 !###############################################################################
338
339
340 !###############################################################################
341 1 function read_avgpool3d_layer(unit, verbose) result(layer)
342 !! Read 3D average pooling layer from file and return layer
343 implicit none
344
345 ! Arguments
346 integer, intent(in) :: unit
347 !! File unit
348 integer, optional, intent(in) :: verbose
349 !! Verbosity level
350 class(base_layer_type), allocatable :: layer
351 !! Instance of the 3D average pooling layer
352
353 ! Local variables
354 integer :: verbose_ = 0
355 !! Verbosity level
356
357
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(present(verbose)) verbose_ = verbose
358
12/128
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
2 allocate(layer, source=avgpool3d_layer_type())
359 1 call layer%read(unit, verbose=verbose_)
360
361 2 end function read_avgpool3d_layer
362 !###############################################################################
363
364
365 !###############################################################################
366 subroutine build_from_onnx_avgpool3d( &
367 this, node, initialisers, value_info, verbose &
368 )
369 !! Read ONNX attributes for 3D average pooling layer
370 implicit none
371
372 ! Arguments
373 class(avgpool3d_layer_type), intent(inout) :: this
374 !! Instance of the 3D average pooling layer
375 type(onnx_node_type), intent(in) :: node
376 !! ONNX node information
377 type(onnx_initialiser_type), dimension(:), intent(in) :: initialisers
378 !! ONNX initialiser information
379 type(onnx_tensor_type), dimension(:), intent(in) :: value_info
380 !! ONNX value info
381 integer, intent(in) :: verbose
382 !! Verbosity level
383
384 ! Local variables
385 integer :: i
386 !! Loop index
387 integer, dimension(3) :: stride, pool_size, padding
388 !! Stride, kernel size, and padding
389 character(256) :: val
390 !! Attribute value
391 character(20) :: padding_method
392 !! Padding method
393
394 ! Set default values
395 stride = 1
396 pool_size = 2
397 padding = 0
398
399 do i = 1, size(node%attributes)
400 val = node%attributes(i)%val
401 select case(trim(adjustl(node%attributes(i)%name)))
402 case("kernel_shape")
403 read(val,*) pool_size
404 case("strides")
405 read(val,*) stride
406 case("pads")
407 read(val,*) padding
408 case default
409 ! Do nothing
410 write(0,*) "WARNING: Unrecognised attribute in ONNX AVGPOOL3D ", &
411 "layer: ", trim(adjustl(node%attributes(i)%name))
412 end select
413 end do
414
415 ! Check size of initialisers is zero
416 if(size(initialisers).ne.0)then
417 write(0,*) "WARNING: initialisers not used for ONNX AVGPOOL3D layer"
418 end if
419
420 ! Convert integer padding to character method
421 if(any(padding.gt.0))then
422 padding_method = "constant"
423 else
424 padding_method = "valid"
425 end if
426
427 call this%set_hyperparams( &
428 stride = stride, &
429 pool_size = pool_size, &
430 padding = padding_method &
431 )
432
433 end subroutine build_from_onnx_avgpool3d
434 !###############################################################################
435
436
437 !##############################################################################!
438 ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !
439 !##############################################################################!
440
441
442 !###############################################################################
443
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 subroutine forward_avgpool3d(this, input)
444 !! Forward propagation
445 implicit none
446
447 ! Arguments
448 class(avgpool3d_layer_type), intent(inout) :: this
449 !! Instance of the 3D average pooling layer
450 class(array_type), dimension(:,:), intent(in) :: input
451 !! Input values
452
453 ! Local variables
454 type(array_type), pointer :: ptr
455 !! Pointer array
456
457
458
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
2 call this%output(1,1)%zero_grad()
459 2 select case(allocated(this%pad_layer))
460 case(.true.)
461 call this%pad_layer%forward(input)
462 ptr => avgpool3d(this%pad_layer%output(1,1), this%pool, this%strd)
463 case default
464
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
2 ptr => avgpool3d(input(1,1), this%pool, this%strd)
465 end select
466
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
2 call this%output(1,1)%assign_and_deallocate_source(ptr)
467
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
2 this%output(1,1)%is_temporary = .false.
468
469 2 end subroutine forward_avgpool3d
470 !###############################################################################
471
472
52/135
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 12 times.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 4 times.
✓ Branch 14 taken 4 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✓ Branch 37 taken 7 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✓ Branch 40 taken 6 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✓ Branch 43 taken 6 times.
✓ Branch 44 taken 1 times.
✓ Branch 45 taken 7 times.
✓ Branch 46 taken 6 times.
✓ Branch 47 taken 1 times.
✓ Branch 48 taken 13 times.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 7 times.
✓ Branch 51 taken 8 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 8 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✓ Branch 56 taken 7 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✓ Branch 67 taken 6 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✓ Branch 70 taken 6 times.
✓ Branch 71 taken 6 times.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✓ Branch 74 taken 6 times.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✓ Branch 109 taken 6 times.
✗ Branch 110 not taken.
✓ Branch 111 taken 6 times.
✗ Branch 112 not taken.
✓ Branch 113 taken 4 times.
✓ Branch 114 taken 2 times.
✓ Branch 115 taken 2 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 6 times.
✗ Branch 119 not taken.
✓ Branch 120 taken 4 times.
✓ Branch 121 taken 2 times.
✓ Branch 122 taken 6 times.
✗ Branch 123 not taken.
✓ Branch 124 taken 4 times.
✓ Branch 125 taken 2 times.
✓ Branch 126 taken 6 times.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✓ Branch 129 taken 6 times.
✓ Branch 130 taken 6 times.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✓ Branch 133 taken 6 times.
✓ Branch 134 taken 6 times.
✗ Branch 135 not taken.
✓ Branch 136 taken 5 times.
✓ Branch 137 taken 1 times.
✓ Branch 138 taken 1 times.
✗ Branch 139 not taken.
56 end module athena__avgpool3d_layer
473