GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_avgpool3d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 102 147 69.4%
Functions: 0 0 -%
Branches: 531 1073 49.5%

Line Branch Exec Source
1 !!!#############################################################################
2 !!! Code written by Ned Thaddeus Taylor
3 !!! Code part of the ATHENA library - a feedforward neural network library
4 !!!#############################################################################
5 !!! module contains implementation of a 3D average pooling layer
6 !!!#############################################################################
7 module avgpool3d_layer
8 use constants, only: real12
9 use base_layer, only: pool_layer_type
10 implicit none
11
12
13 type, extends(pool_layer_type) :: avgpool3d_layer_type
14 real(real12), allocatable, dimension(:,:,:,:,:) :: output
15 real(real12), allocatable, dimension(:,:,:,:,:) :: di ! gradient of input (i.e. delta)
16 contains
17 procedure, pass(this) :: get_output => get_output_avgpool3d
18 procedure, pass(this) :: init => init_avgpool3d
19 procedure, pass(this) :: set_batch_size => set_batch_size_avgpool3d
20 procedure, pass(this) :: print => print_avgpool3d
21 procedure, pass(this) :: forward => forward_rank
22 procedure, pass(this) :: backward => backward_rank
23 procedure, private, pass(this) :: forward_5d
24 procedure, private, pass(this) :: backward_5d
25 end type avgpool3d_layer_type
26
27
28 interface avgpool3d_layer_type
29 module function layer_setup( &
30 input_shape, batch_size, &
31 pool_size, stride) result(layer)
32 integer, dimension(:), optional, intent(in) :: input_shape
33 integer, optional, intent(in) :: batch_size
34 integer, dimension(..), optional, intent(in) :: pool_size
35 integer, dimension(..), optional, intent(in) :: stride
36 type(avgpool3d_layer_type) :: layer
37 end function layer_setup
38 end interface avgpool3d_layer_type
39
40
41 private
42 public :: avgpool3d_layer_type
43 public :: read_avgpool3d_layer
44
45
46 contains
47
48 !!!#############################################################################
49 !!! get layer outputs
50 !!!#############################################################################
51 4 pure subroutine get_output_avgpool3d(this, output)
52 implicit none
53 class(avgpool3d_layer_type), intent(in) :: this
54 real(real12), allocatable, dimension(..), intent(out) :: output
55
56 select rank(output)
57 rank(1)
58
7/10
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
7 output = reshape(this%output, [size(this%output)])
59 rank(2)
60 output = &
61
11/18
✗ 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.
✓ Branch 12 taken 4 times.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
7 reshape(this%output, [product(this%output_shape),this%batch_size])
62 rank(5)
63
42/84
✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 2 times.
✗ 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 taken 2 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 2 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 2 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 2 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 2 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 2 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 2 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 2 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 2 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 2 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 2 times.
✗ Branch 93 not taken.
✓ Branch 94 taken 2 times.
✓ Branch 95 taken 2 times.
✓ Branch 96 taken 6 times.
✓ Branch 97 taken 2 times.
✓ Branch 98 taken 18 times.
✓ Branch 99 taken 6 times.
✓ Branch 100 taken 54 times.
✓ Branch 101 taken 18 times.
✓ Branch 102 taken 162 times.
✓ Branch 103 taken 54 times.
244 output = this%output
64 end select
65
66 4 end subroutine get_output_avgpool3d
67 !!!#############################################################################
68
69
70 !!!##########################################################################!!!
71 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
72 !!!##########################################################################!!!
73
74
75 !!!#############################################################################
76 !!! forward propagation assumed rank handler
77 !!!#############################################################################
78 2 pure subroutine forward_rank(this, input)
79 implicit none
80 class(avgpool3d_layer_type), intent(inout) :: this
81 real(real12), dimension(..), intent(in) :: input
82
83 select rank(input); rank(5)
84 2 call forward_5d(this, input)
85 end select
86 2 end subroutine forward_rank
87 !!!#############################################################################
88
89
90 !!!#############################################################################
91 !!! backward propagation assumed rank handler
92 !!!#############################################################################
93 1 pure subroutine backward_rank(this, input, gradient)
94 implicit none
95 class(avgpool3d_layer_type), intent(inout) :: this
96 real(real12), dimension(..), intent(in) :: input
97 real(real12), dimension(..), intent(in) :: gradient
98
99 select rank(input); rank(5)
100 1 select rank(gradient); rank(5)
101 1 call backward_5d(this, input, gradient)
102 end select
103 end select
104 1 end subroutine backward_rank
105 !!!#############################################################################
106
107
108 !!!##########################################################################!!!
109 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
110 !!!##########################################################################!!!
111
112
113 !!!#############################################################################
114 !!! set up layer
115 !!!#############################################################################
116 #if defined(GFORTRAN)
117 module function layer_setup( &
118 input_shape, batch_size, &
119 pool_size, stride) result(layer)
120 implicit none
121 integer, dimension(:), optional, intent(in) :: input_shape
122 integer, optional, intent(in) :: batch_size
123 integer, dimension(..), optional, intent(in) :: pool_size
124 integer, dimension(..), optional, intent(in) :: stride
125
126 type(avgpool3d_layer_type) :: layer
127 #else
128
0/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4 module procedure layer_setup
129 implicit none
130 #endif
131
132
133
3/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
4 layer%name = "avgpool3d"
134 4 layer%input_rank = 4
135 allocate( &
136 layer%pool(layer%input_rank-1), &
137
16/32
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 4 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✓ Branch 18 taken 4 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 4 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 4 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 4 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 4 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 4 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 4 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 4 times.
4 layer%strd(layer%input_rank-1) )
138 !!-----------------------------------------------------------------------
139 !! set up pool size
140 !!-----------------------------------------------------------------------
141
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 if(present(pool_size))then
142 4 select rank(pool_size)
143 rank(0)
144
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
8 layer%pool = pool_size
145 rank(1)
146
3/6
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
2 layer%pool(1) = pool_size(1)
147
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
4 if(size(pool_size,dim=1).eq.1)then
148
8/14
✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 1 times.
3 layer%pool(2:) = pool_size(1)
149
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 elseif(size(pool_size,dim=1).eq.3)then
150
11/20
✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 1 times.
3 layer%pool(2:) = pool_size(2:)
151 end if
152 end select
153 else
154 layer%pool = 2
155 end if
156
157
158 !!-----------------------------------------------------------------------
159 !! set up stride
160 !!-----------------------------------------------------------------------
161
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 if(present(stride))then
162 4 select rank(stride)
163 rank(0)
164
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
8 layer%strd = stride
165 rank(1)
166
3/6
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
2 layer%strd(1) = stride(1)
167
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
4 if(size(stride,dim=1).eq.1)then
168
8/14
✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 1 times.
3 layer%strd(2:) = stride(1)
169
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 elseif(size(stride,dim=1).eq.3)then
170
11/20
✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 1 times.
3 layer%strd(2:) = stride(2:)
171 end if
172 end select
173 else
174 layer%strd = 2
175 end if
176
177
178 !!--------------------------------------------------------------------------
179 !! initialise batch size
180 !!--------------------------------------------------------------------------
181
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if(present(batch_size)) layer%batch_size = batch_size
182
183
184 !!--------------------------------------------------------------------------
185 !! initialise layer shape
186 !!--------------------------------------------------------------------------
187
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 4 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.
4 if(present(input_shape)) call layer%init(input_shape=input_shape)
188
189 #if defined(GFORTRAN)
190 end function layer_setup
191 #else
192
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
8 end procedure layer_setup
193 #endif
194 !!!#############################################################################
195
196
197 !!!#############################################################################
198 !!! initialise layer
199 !!!#############################################################################
200
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 subroutine init_avgpool3d(this, input_shape, batch_size, verbose)
201 implicit none
202 class(avgpool3d_layer_type), intent(inout) :: this
203 integer, dimension(:), intent(in) :: input_shape
204 integer, optional, intent(in) :: batch_size
205 integer, optional, intent(in) :: verbose
206
207 integer :: verbose_ = 0
208
209
210 !!--------------------------------------------------------------------------
211 !! initialise optional arguments
212 !!--------------------------------------------------------------------------
213
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(present(verbose)) verbose_ = verbose
214
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(present(batch_size)) this%batch_size = batch_size
215
216
217 !!--------------------------------------------------------------------------
218 !! initialise input shape
219 !!--------------------------------------------------------------------------
220
4/8
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ 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.
1 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
221
222
223 !!-----------------------------------------------------------------------
224 !! set up number of channels, width, height
225 !!-----------------------------------------------------------------------
226
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 this%num_channels = this%input_shape(4)
227
3/6
✗ 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.
1 allocate(this%output_shape(4))
228
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_shape(4) = this%input_shape(4)
229 5 this%output_shape(:3) = &
230
22/42
✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✓ Branch 57 taken 3 times.
✓ Branch 58 taken 1 times.
✓ Branch 59 taken 3 times.
✗ Branch 60 not taken.
4 floor( (this%input_shape(:3) - this%pool)/real(this%strd)) + 1
231
232
233 !!--------------------------------------------------------------------------
234 !! initialise batch size-dependent arrays
235 !!--------------------------------------------------------------------------
236
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(this%batch_size.gt.0) call this%set_batch_size(this%batch_size)
237
238 1 end subroutine init_avgpool3d
239 !!!#############################################################################
240
241
242 !!!#############################################################################
243 !!! set batch size
244 !!!#############################################################################
245 1 subroutine set_batch_size_avgpool3d(this, batch_size, verbose)
246 implicit none
247 class(avgpool3d_layer_type), intent(inout) :: this
248 integer, intent(in) :: batch_size
249 integer, optional, intent(in) :: verbose
250
251 integer :: verbose_ = 0
252
253
254 !!--------------------------------------------------------------------------
255 !! initialise optional arguments
256 !!--------------------------------------------------------------------------
257
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(present(verbose)) verbose_ = verbose
258 1 this%batch_size = batch_size
259
260
261 !!--------------------------------------------------------------------------
262 !! allocate arrays
263 !!--------------------------------------------------------------------------
264
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(allocated(this%input_shape))then
265
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1 if(allocated(this%output)) deallocate(this%output)
266 allocate(this%output( &
267 2 this%output_shape(1), &
268 2 this%output_shape(2), &
269 2 this%output_shape(3), this%num_channels, &
270 this%batch_size), &
271
51/92
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 1 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 1 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 1 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 1 times.
✓ Branch 110 taken 1 times.
✓ Branch 111 taken 1 times.
✓ Branch 112 taken 3 times.
✓ Branch 113 taken 1 times.
✓ Branch 114 taken 9 times.
✓ Branch 115 taken 3 times.
✓ Branch 116 taken 27 times.
✓ Branch 117 taken 9 times.
✓ Branch 118 taken 81 times.
✓ Branch 119 taken 27 times.
122 source=0._real12)
272
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1 if(allocated(this%di)) deallocate(this%di)
273 allocate(this%di( &
274 2 this%input_shape(1), &
275 2 this%input_shape(2), &
276 2 this%input_shape(3), &
277 2 this%input_shape(4), &
278 this%batch_size), &
279
53/96
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 1 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 1 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 1 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 110 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 1 times.
✓ Branch 116 taken 1 times.
✓ Branch 117 taken 1 times.
✓ Branch 118 taken 3 times.
✓ Branch 119 taken 1 times.
✓ Branch 120 taken 27 times.
✓ Branch 121 taken 3 times.
✓ Branch 122 taken 243 times.
✓ Branch 123 taken 27 times.
✓ Branch 124 taken 2187 times.
✓ Branch 125 taken 243 times.
2462 source=0._real12)
280 end if
281
282 1 end subroutine set_batch_size_avgpool3d
283 !!!#############################################################################
284
285
286 !!!##########################################################################!!!
287 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
288 !!!##########################################################################!!!
289
290
291 !!!#############################################################################
292 !!! print layer to file
293 !!!#############################################################################
294 subroutine print_avgpool3d(this, file)
295 implicit none
296 class(avgpool3d_layer_type), intent(in) :: this
297 character(*), intent(in) :: file
298
299 integer :: unit
300
301 !! open file with new unit
302 !!--------------------------------------------------------------------------
303 open(newunit=unit, file=trim(file), access='append')
304
305 !! write convolution initial parameters
306 !!--------------------------------------------------------------------------
307 write(unit,'("AVGPOOL3D")')
308 write(unit,'(3X,"INPUT_SHAPE = ",3(1X,I0))') this%input_shape
309 if(all(this%pool.eq.this%pool(1)))then
310 write(unit,'(3X,"POOL_SIZE =",1X,I0)') this%pool(1)
311 else
312 write(unit,'(3X,"POOL_SIZE =",3(1X,I0))') this%pool
313 end if
314 if(all(this%strd.eq.this%strd(1)))then
315 write(unit,'(3X,"STRIDE =",1X,I0)') this%strd(1)
316 else
317 write(unit,'(3X,"STRIDE =",3(1X,I0))') this%strd
318 end if
319 write(unit,'("END AVGPOOL3D")')
320
321 !! close unit
322 !!--------------------------------------------------------------------------
323 close(unit)
324
325 end subroutine print_avgpool3d
326 !!!#############################################################################
327
328
329 !!!#############################################################################
330 !!! read layer from file
331 !!!#############################################################################
332 function read_avgpool3d_layer(unit) result(layer)
333 use infile_tools, only: assign_val, assign_vec
334 use misc, only: to_lower, icount
335 implicit none
336 integer, intent(in) :: unit
337
338 class(avgpool3d_layer_type), allocatable :: layer
339
340 integer :: stat
341 integer :: itmp1
342 integer, dimension(3) :: pool_size, stride
343 integer, dimension(4) :: input_shape
344 character(256) :: buffer, tag
345
346
347 !! loop over tags in layer card
348 tag_loop: do
349
350 !! check for end of file
351 read(unit,'(A)',iostat=stat) buffer
352 if(stat.ne.0)then
353 write(0,*) "ERROR: file encountered error (EoF?) before END AVGPOOL3D"
354 stop "Exiting..."
355 end if
356 if(trim(adjustl(buffer)).eq."") cycle tag_loop
357
358 !! check for end of convolution card
359 if(trim(adjustl(buffer)).eq."END AVGPOOL3D")then
360 backspace(unit)
361 exit tag_loop
362 end if
363
364 tag=trim(adjustl(buffer))
365 if(scan(buffer,"=").ne.0) tag=trim(tag(:scan(tag,"=")-1))
366
367 !! read parameters from save file
368 select case(trim(tag))
369 case("INPUT_SHAPE")
370 call assign_vec(buffer, input_shape, itmp1)
371 case("POOL_SIZE")
372 call assign_vec(buffer, pool_size, itmp1)
373 case("STRIDE")
374 call assign_vec(buffer, stride, itmp1)
375 case default
376 !! don't look for "e" due to scientific notation of numbers
377 !! ... i.e. exponent (E+00)
378 if(scan(to_lower(trim(adjustl(buffer))),&
379 'abcdfghijklmnopqrstuvwxyz').eq.0)then
380 cycle tag_loop
381 elseif(tag(:3).eq.'END')then
382 cycle tag_loop
383 end if
384 stop "Unrecognised line in input file: "//trim(adjustl(buffer))
385 end select
386 end do tag_loop
387
388 !! set transfer activation function
389
390 layer = avgpool3d_layer_type( input_shape=input_shape, &
391 pool_size = pool_size, stride = stride &
392 )
393
394 !! check for end of layer card
395 read(unit,'(A)') buffer
396 if(trim(adjustl(buffer)).ne."END AVGPOOL3D")then
397 write(*,*) trim(adjustl(buffer))
398 stop "ERROR: END AVGPOOL3D not where expected"
399 end if
400
401 end function read_avgpool3d_layer
402 !!!#############################################################################
403
404
405 !!!##########################################################################!!!
406 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
407 !!!##########################################################################!!!
408
409
410 !!!#############################################################################
411 !!! forward propagation
412 !!!#############################################################################
413 14 pure subroutine forward_5d(this, input)
414 implicit none
415 class(avgpool3d_layer_type), intent(inout) :: this
416
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 real(real12), dimension( &
417
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 this%input_shape(1), &
418
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 this%input_shape(2), &
419 this%input_shape(3), &
420 this%num_channels, &
421 this%batch_size), &
422 intent(in) :: input
423
424 integer :: i, j, k, m, s
425 integer, dimension(3) :: stride_idx
426
427
428
10/10
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 54 times.
✓ Branch 7 taken 18 times.
✓ Branch 8 taken 162 times.
✓ Branch 9 taken 54 times.
244 this%output = 0._real12
429 !! perform the pooling operation
430 do concurrent(&
431 s = 1:this%batch_size, &
432 m = 1:this%num_channels, &
433 4 k = 1:this%output_shape(3), &
434 4 j = 1:this%output_shape(2), &
435
6/12
✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
2 i = 1:this%output_shape(1))
436 #if defined(GFORTRAN)
437 stride_idx = ([i,j,k] - 1) * this%strd + 1
438 #else
439
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 162 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 162 times.
162 stride_idx(1) = (i-1) * this%strd(1) + 1
440
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 162 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 162 times.
162 stride_idx(2) = (j-1) * this%strd(2) + 1
441
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 162 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 162 times.
162 stride_idx(3) = (k-1) * this%strd(3) + 1
442 #endif
443 1620 this%output(i, j, k, m, s) = sum(&
444
2/4
✗ Branch 13 not taken.
✓ Branch 14 taken 162 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 162 times.
324 input( &
445 324 stride_idx(1):stride_idx(1)+this%pool(1)-1, &
446 324 stride_idx(2):stride_idx(2)+this%pool(2)-1, &
447 324 stride_idx(3):stride_idx(3)+this%pool(3)-1, m, s)) / &
448
52/86
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 54 times.
✓ Branch 5 taken 18 times.
✓ Branch 6 taken 162 times.
✓ Branch 7 taken 54 times.
✓ Branch 8 taken 162 times.
✓ Branch 9 taken 162 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 162 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 162 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 162 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 162 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 162 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 162 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 162 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 162 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 162 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 162 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 162 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 162 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 162 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 162 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 162 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 162 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 162 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 162 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 162 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 162 times.
✓ Branch 56 taken 486 times.
✓ Branch 57 taken 162 times.
✓ Branch 58 taken 1458 times.
✓ Branch 59 taken 486 times.
✓ Branch 60 taken 4374 times.
✓ Branch 61 taken 1458 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 162 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 162 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 162 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 162 times.
✓ Branch 74 taken 486 times.
✓ Branch 75 taken 162 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 162 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 162 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 162 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 162 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 162 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 162 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 162 times.
✗ Branch 97 not taken.
✓ Branch 98 taken 162 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 162 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 162 times.
7532 product(this%pool)
449 end do
450
451 2 end subroutine forward_5d
452 !!!#############################################################################
453
454
455 !!!#############################################################################
456 !!! backward propagation
457 !!!#############################################################################
458 7 pure subroutine backward_5d(this, input, gradient)
459 implicit none
460 class(avgpool3d_layer_type), intent(inout) :: this
461 real(real12), dimension( &
462 this%input_shape(1), &
463 this%input_shape(2), &
464 this%input_shape(3), &
465 this%num_channels, &
466 this%batch_size), &
467 intent(in) :: input
468 real(real12), &
469
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 dimension(&
470
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 this%output_shape(1), &
471
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 this%output_shape(2), &
472 this%output_shape(3), &
473 this%num_channels, &
474 this%batch_size), &
475 intent(in) :: gradient
476
477 integer :: i, j, k, m, s
478 integer, dimension(3) :: stride_idx
479
480
481
10/10
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 243 times.
✓ Branch 7 taken 27 times.
✓ Branch 8 taken 2187 times.
✓ Branch 9 taken 243 times.
2462 this%di = 0._real12
482 !! compute gradients for input feature map
483 do concurrent( &
484 s = 1:this%batch_size, &
485 m = 1:this%num_channels, &
486 2 k = 1:this%output_shape(3), &
487 2 j = 1:this%output_shape(2), &
488
6/12
✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
1 i = 1:this%output_shape(1))
489 #if defined(GFORTRAN)
490 stride_idx = ([i,j,k] - 1) * this%strd
491 #else
492
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 81 times.
81 stride_idx(1) = (i-1) * this%strd(1)
493
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 81 times.
81 stride_idx(2) = (j-1) * this%strd(2)
494
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 81 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 81 times.
81 stride_idx(3) = (k-1) * this%strd(3)
495 #endif
496 !! compute gradients for input feature map
497 1539 this%di( &
498 162 stride_idx(1)+1:stride_idx(1)+this%pool(1), &
499 162 stride_idx(2)+1:stride_idx(2)+this%pool(2), &
500 162 stride_idx(3)+1:stride_idx(3)+this%pool(3), m, s) = &
501 1296 this%di( &
502 162 stride_idx(1)+1:stride_idx(1)+this%pool(1), &
503 162 stride_idx(2)+1:stride_idx(2)+this%pool(2), &
504 162 stride_idx(3)+1:stride_idx(3)+this%pool(3), m, s) + &
505
79/140
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 9 times.
✓ Branch 6 taken 81 times.
✓ Branch 7 taken 27 times.
✓ Branch 8 taken 81 times.
✓ Branch 9 taken 81 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 81 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 81 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 81 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 81 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 81 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 81 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 81 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 81 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 81 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 81 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 81 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 81 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 81 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 81 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 81 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 81 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 81 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 81 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 81 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 81 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 81 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 81 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 81 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 81 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 81 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 81 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 81 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 81 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 81 times.
✗ Branch 97 not taken.
✓ Branch 98 taken 81 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 81 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 81 times.
✗ Branch 106 not taken.
✓ Branch 107 taken 81 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 81 times.
✗ Branch 112 not taken.
✓ Branch 113 taken 81 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 81 times.
✗ Branch 118 not taken.
✓ Branch 119 taken 81 times.
✗ Branch 121 not taken.
✓ Branch 122 taken 81 times.
✗ Branch 124 not taken.
✓ Branch 125 taken 81 times.
✗ Branch 127 not taken.
✓ Branch 128 taken 81 times.
✗ Branch 130 not taken.
✓ Branch 131 taken 81 times.
✗ Branch 133 not taken.
✓ Branch 134 taken 81 times.
✗ Branch 136 not taken.
✓ Branch 137 taken 81 times.
✗ Branch 139 not taken.
✓ Branch 140 taken 81 times.
✗ Branch 142 not taken.
✓ Branch 143 taken 81 times.
✗ Branch 145 not taken.
✓ Branch 146 taken 81 times.
✗ Branch 148 not taken.
✓ Branch 149 taken 81 times.
✗ Branch 151 not taken.
✓ Branch 152 taken 81 times.
✗ Branch 154 not taken.
✓ Branch 155 taken 81 times.
✗ Branch 157 not taken.
✓ Branch 158 taken 81 times.
✗ Branch 160 not taken.
✓ Branch 161 taken 81 times.
✗ Branch 163 not taken.
✓ Branch 164 taken 81 times.
✗ Branch 166 not taken.
✓ Branch 167 taken 81 times.
✓ Branch 169 taken 243 times.
✓ Branch 170 taken 81 times.
✗ Branch 171 not taken.
✓ Branch 172 taken 81 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 81 times.
✗ Branch 177 not taken.
✓ Branch 178 taken 81 times.
✗ Branch 180 not taken.
✓ Branch 181 taken 81 times.
✗ Branch 183 not taken.
✓ Branch 184 taken 81 times.
✗ Branch 186 not taken.
✓ Branch 187 taken 81 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 81 times.
✗ Branch 192 not taken.
✓ Branch 193 taken 81 times.
✓ Branch 195 taken 243 times.
✓ Branch 196 taken 81 times.
✓ Branch 197 taken 729 times.
✓ Branch 198 taken 243 times.
✓ Branch 199 taken 2187 times.
✓ Branch 200 taken 729 times.
3604 gradient(i, j, k, m, s) / product(this%pool)
506
507 end do
508
509 1 end subroutine backward_5d
510 !!!#############################################################################
511
512
53/87
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 4 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 4 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 2 times.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✓ Branch 37 taken 2 times.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✓ Branch 45 taken 3 times.
✓ Branch 46 taken 3 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 3 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ 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 3 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✓ Branch 70 taken 3 times.
✓ Branch 71 taken 3 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 2 times.
✓ Branch 74 taken 1 times.
✓ Branch 75 taken 3 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 2 times.
✓ Branch 78 taken 1 times.
✓ Branch 79 taken 3 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 82 taken 3 times.
✓ Branch 83 taken 3 times.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✓ Branch 86 taken 3 times.
✓ Branch 87 taken 3 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 2 times.
✓ Branch 90 taken 1 times.
✓ Branch 91 taken 3 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 2 times.
✓ Branch 94 taken 1 times.
36 end module avgpool3d_layer
513 !!!#############################################################################
514