GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_maxpool1d_layer.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 72 108 66.7%
Functions: 0 0 -%
Branches: 212 655 32.4%

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