GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_dropblock3d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 77 122 63.1%
Functions: 0 0 -%
Branches: 455 1033 44.0%

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