GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_dropblock2d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 73 112 65.2%
Functions: 0 0 -%
Branches: 404 847 47.7%

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