GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_base_layer_sub_init.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 106 119 89.1%
Functions: 0 0 -%
Branches: 500 996 50.2%

Line Branch Exec Source
1 submodule(athena__base_layer) athena__base_layer_submodule_init
2 !! Submodule containing the implementation of the base layer types
3 !!
4 !! This submodule contains the implementation of the base layer types
5 !! used in the ATHENA library. The base layer types are the abstract
6 !! types from which all other layer types are derived. The submodule
7 !! contains the implementation of the initialisation procedures
8 use coreutils, only: stop_program
9 use athena__diffstruc_extd, only: batchnorm_array_type
10
11 contains
12
13 !###############################################################################
14
1/2
✓ Branch 0 taken 43 times.
✗ Branch 1 not taken.
43 module subroutine init_pad(this, input_shape, verbose)
15 !! Initialise padding layer
16 implicit none
17
18 ! Arguments
19 class(pad_layer_type), intent(inout) :: this
20 !! Instance of the padding layer
21 integer, dimension(:), intent(in) :: input_shape
22 !! Input shape
23 integer, optional, intent(in) :: verbose
24 !! Verbosity level
25
26 ! Local variables
27 integer :: i
28 !! Loop index
29 integer :: verbose_ = 0
30 !! Verbosity level
31
32
33 !---------------------------------------------------------------------------
34 ! Initialise optional arguments
35 !---------------------------------------------------------------------------
36
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
43 if(present(verbose)) verbose_ = verbose
37
38
39 !---------------------------------------------------------------------------
40 ! Initialise input shape
41 !---------------------------------------------------------------------------
42
4/8
✓ Branch 0 taken 43 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 43 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 43 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 43 times.
43 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
43
1/2
✓ Branch 0 taken 43 times.
✗ Branch 1 not taken.
43 if(.not.allocated(this%orig_bound))then
44
8/16
✓ Branch 0 taken 43 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 43 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 43 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 43 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 43 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 43 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 43 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 43 times.
43 allocate(this%orig_bound(2,this%input_rank-1))
45
8/16
✓ Branch 0 taken 43 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 43 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 43 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 43 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 43 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 43 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 43 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 43 times.
43 allocate(this%dest_bound(2,this%input_rank-1))
46 end if
47
2/2
✓ Branch 0 taken 86 times.
✓ Branch 1 taken 43 times.
129 do i = 1, this%input_rank - 1
48
11/20
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 86 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 86 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 86 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 86 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 86 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 86 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 86 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 86 times.
✓ Branch 27 taken 172 times.
✓ Branch 28 taken 86 times.
258 this%orig_bound(:,i) = [ 1, this%input_shape(i) ]
49
13/24
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 86 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 86 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 86 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 86 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 86 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 86 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 86 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 86 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 86 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 86 times.
✓ Branch 33 taken 172 times.
✓ Branch 34 taken 86 times.
258 this%dest_bound(:,i) = [ 1, this%input_shape(i) + this%pad(i) * 2 ]
50 172 call this%facets(i)%setup_bounds( &
51 344 length = this%input_shape(:this%input_rank-1), &
52 pad = this%pad, &
53 imethod = this%imethod &
54
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 86 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 86 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 86 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 86 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 86 times.
129 )
55 end do
56
57
58 !---------------------------------------------------------------------------
59 ! Set up number of channels, width, height
60 !---------------------------------------------------------------------------
61
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 43 times.
43 this%num_channels = this%input_shape(this%input_rank)
62
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
43 if(allocated(this%output_shape)) deallocate(this%output_shape)
63
7/14
✓ Branch 0 taken 43 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 43 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 43 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 43 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 43 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 43 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 43 times.
43 allocate( this%output_shape(this%input_rank) )
64
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 43 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 43 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 43 times.
43 this%output_shape(this%input_rank) = this%input_shape(this%input_rank)
65 215 this%output_shape(:this%input_rank-1) = &
66
16/30
✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 43 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 43 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 43 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 43 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 43 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 43 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 43 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 43 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 43 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 43 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 43 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 43 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 43 times.
✓ Branch 42 taken 86 times.
✓ Branch 43 taken 43 times.
129 this%input_shape(:this%input_rank-1) + this%pad(:) * 2
67
68
69 !---------------------------------------------------------------------------
70 ! Allocate arrays
71 !---------------------------------------------------------------------------
72
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
43 if(this%use_graph_input)then
73 call stop_program("Graph input not supported for padding layer")
74 return
75 end if
76
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
43 if(allocated(this%output)) deallocate(this%output)
77
15/26
✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 43 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 43 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 43 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 43 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 43 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 43 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 43 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 43 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 43 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 43 times.
✓ Branch 33 taken 43 times.
✓ Branch 34 taken 43 times.
✓ Branch 35 taken 43 times.
✓ Branch 36 taken 43 times.
129 allocate( this%output(1,1) )
78
79 end subroutine init_pad
80 !###############################################################################
81
82
83 !###############################################################################
84
1/2
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
20 module subroutine init_pool(this, input_shape, verbose)
85 !! Initialise pooling layer
86 implicit none
87
88 ! Arguments
89 class(pool_layer_type), intent(inout) :: this
90 !! Instance of the pooling layer
91 integer, dimension(:), intent(in) :: input_shape
92 !! Input shape
93 integer, optional, intent(in) :: verbose
94 !! Verbosity level
95
96 ! Local variables
97 integer :: verbose_ = 0
98 !! Verbosity level
99
100
101 !---------------------------------------------------------------------------
102 ! Initialise optional arguments
103 !---------------------------------------------------------------------------
104
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 18 times.
20 if(present(verbose)) verbose_ = verbose
105
106
107 !---------------------------------------------------------------------------
108 ! Initialise input shape
109 !---------------------------------------------------------------------------
110
4/8
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 20 times.
20 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
111
112
113 !---------------------------------------------------------------------------
114 ! Set up number of channels, width, height
115 !---------------------------------------------------------------------------
116
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
20 this%num_channels = this%input_shape(this%input_rank)
117
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 if(allocated(this%output_shape)) deallocate(this%output_shape)
118
7/14
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 20 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 20 times.
20 allocate( this%output_shape(this%input_rank) )
119
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 20 times.
20 this%output_shape(this%input_rank) = this%input_shape(this%input_rank)
120 100 this%output_shape(:this%input_rank-1) = &
121 floor( &
122 80 ( &
123 100 this%input_shape(:this%input_rank-1) - this%pool &
124 100 ) / real(this%strd) &
125
22/42
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 20 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 20 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 20 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 20 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 20 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 20 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 20 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 20 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 20 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 20 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 20 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 20 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 20 times.
✓ Branch 57 taken 40 times.
✓ Branch 58 taken 20 times.
✓ Branch 59 taken 40 times.
✗ Branch 60 not taken.
60 ) + 1
126
127
128 !---------------------------------------------------------------------------
129 ! Allocate arrays
130 !---------------------------------------------------------------------------
131
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
20 if(this%use_graph_input)then
132 call stop_program( &
133 "Graph input not supported for pooling layer" &
134 )
135 return
136 end if
137
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
20 if(allocated(this%output)) deallocate(this%output)
138
15/26
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 20 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 20 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 20 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 20 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 20 times.
✓ Branch 33 taken 20 times.
✓ Branch 34 taken 20 times.
✓ Branch 35 taken 20 times.
✓ Branch 36 taken 20 times.
60 allocate( this%output(1,1) )
139
140 end subroutine init_pool
141 !###############################################################################
142
143
144 !###############################################################################
145
1/2
✓ Branch 0 taken 67 times.
✗ Branch 1 not taken.
67 module subroutine init_conv(this, input_shape, verbose)
146 !! Initialise convolutional layer
147 use athena__initialiser, only: initialiser_setup
148 use athena__misc_types, only: base_init_type
149 implicit none
150
151 ! Arguments
152 class(conv_layer_type), intent(inout) :: this
153 !! Instance of the layer
154 integer, dimension(:), intent(in) :: input_shape
155 !! Input shape
156
1/2
✓ Branch 0 taken 67 times.
✗ Branch 1 not taken.
67 integer, dimension(this%input_rank-1) :: pad_shape
157 integer, optional, intent(in) :: verbose
158 !! Verbosity level
159
160 ! Local variables
161 integer :: verbose_ = 0
162 !! Verbosity level
163
164
165 !---------------------------------------------------------------------------
166 ! initialise optional arguments
167 !---------------------------------------------------------------------------
168
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 63 times.
67 if(present(verbose)) verbose_ = verbose
169
170
171 !---------------------------------------------------------------------------
172 ! initialise input shape
173 !---------------------------------------------------------------------------
174
4/8
✓ Branch 0 taken 67 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 67 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 67 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 67 times.
67 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
175
176
177 !---------------------------------------------------------------------------
178 ! initialise padding layer, if allocated
179 !---------------------------------------------------------------------------
180
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
67 if(allocated(this%pad_layer))then
181 call this%pad_layer%init(this%input_shape, verbose_)
182 pad_shape = 2 * this%pad_layer%pad
183 else
184
5/8
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✓ Branch 9 taken 156 times.
✓ Branch 10 taken 67 times.
223 pad_shape = 0
185 end if
186
187
188 !---------------------------------------------------------------------------
189 ! allocate output, activation, bias, and weight shapes
190 !---------------------------------------------------------------------------
191 ! NOTE: INPUT SHAPE DOES NOT INCLUDE PADDING WIDTH
192 ! THIS IS HANDLED AUTOMATICALLY BY THE CODE
193 ! ... provide the initial input data shape and let us deal with the padding
194
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 this%num_channels = this%input_shape(this%input_rank)
195
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
67 if(allocated(this%output_shape)) deallocate(this%output_shape)
196
7/14
✓ Branch 0 taken 67 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 67 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 67 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 67 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 67 times.
67 allocate( this%output_shape(this%input_rank) )
197
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 this%output_shape(this%input_rank) = this%num_filters
198 335 this%output_shape(:this%input_rank-1) = floor( &
199 268 ( &
200 this%input_shape(:this%input_rank-1) + pad_shape - this%knl &
201 335 ) / real(this%stp) &
202
26/50
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 67 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 67 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 67 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 67 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 67 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 67 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 67 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 67 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 67 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 67 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 67 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 67 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 67 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 67 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 67 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 67 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 67 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 67 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 67 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 67 times.
✓ Branch 65 taken 156 times.
✓ Branch 66 taken 67 times.
✓ Branch 67 taken 156 times.
✗ Branch 68 not taken.
223 ) + 1
203 67 this%num_params = this%get_num_params()
204
8/16
✓ Branch 0 taken 67 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 67 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 67 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 67 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 67 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 67 times.
67 allocate(this%weight_shape(this%input_rank + 1,1))
205
15/26
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 67 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 67 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 67 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 67 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 67 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 67 times.
✓ Branch 26 taken 156 times.
✓ Branch 27 taken 67 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 67 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 67 times.
✓ Branch 34 taken 290 times.
✓ Branch 35 taken 67 times.
513 this%weight_shape(:,1) = [ this%knl, this%num_channels, this%num_filters ]
206
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 67 times.
✓ Branch 7 taken 67 times.
134 this%bias_shape = [this%num_filters]
207
208
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
67 if(allocated(this%params)) deallocate(this%params)
209
16/30
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 67 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 67 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 67 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 67 times.
✓ Branch 21 taken 134 times.
✓ Branch 22 taken 67 times.
✓ Branch 23 taken 134 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 134 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 134 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 134 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 134 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 134 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 134 times.
201 allocate(this%params(2))
210
14/24
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 67 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 67 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 67 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 67 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 67 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 67 times.
✓ Branch 27 taken 290 times.
✓ Branch 28 taken 67 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 67 times.
✓ Branch 31 taken 357 times.
✓ Branch 32 taken 67 times.
714 call this%params(1)%allocate([this%weight_shape(:,1), 1])
211
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 call this%params(1)%set_requires_grad(.true.)
212
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 this%params(1)%fix_pointer = .true.
213
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 this%params(1)%is_sample_dependent = .false.
214
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 this%params(1)%is_temporary = .false.
215
12/20
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 67 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 67 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 67 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 67 times.
✓ Branch 21 taken 67 times.
✓ Branch 22 taken 67 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 67 times.
✓ Branch 25 taken 134 times.
✓ Branch 26 taken 67 times.
268 call this%params(2)%allocate([this%bias_shape, 1])
216
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 call this%params(2)%set_requires_grad(.true.)
217
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 this%params(2)%fix_pointer = .true.
218
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 this%params(2)%is_sample_dependent = .false.
219
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
67 this%params(2)%is_temporary = .false.
220
221
222 !---------------------------------------------------------------------------
223 ! initialise weights (kernels)
224 !---------------------------------------------------------------------------
225 call this%kernel_init%initialise( &
226 670 this%params(1)%val(:,1), &
227 268 fan_in = product(this%knl)+1, fan_out = 1, &
228 268 spacing = [ this%knl, this%num_channels, this%num_filters ] &
229
26/46
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 67 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 67 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 67 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 67 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 67 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 67 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 67 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 67 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 67 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 67 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 67 times.
✓ Branch 42 taken 156 times.
✓ Branch 43 taken 67 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 67 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 67 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 67 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 67 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 67 times.
✓ Branch 59 taken 156 times.
✓ Branch 60 taken 67 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 67 times.
✓ Branch 63 taken 290 times.
✓ Branch 64 taken 67 times.
669 )
230
231 ! initialise biases
232 !---------------------------------------------------------------------------
233 call this%bias_init%initialise( &
234 670 this%params(2)%val(:,1), &
235 268 fan_in = product(this%knl)+1, fan_out = 1 &
236
16/30
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 67 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 67 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 67 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 67 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 67 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 67 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 67 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 67 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 67 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 67 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 67 times.
✓ Branch 42 taken 156 times.
✓ Branch 43 taken 67 times.
223 )
237
238
239 !---------------------------------------------------------------------------
240 ! Allocate arrays
241 !---------------------------------------------------------------------------
242
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
67 if(this%use_graph_input)then
243 call stop_program( &
244 "Graph input not supported for convolutional layer" &
245 )
246 return
247 end if
248
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
67 if(allocated(this%output)) deallocate(this%output)
249
15/26
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 67 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 67 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 67 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 67 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 67 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 67 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 67 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 67 times.
✓ Branch 33 taken 67 times.
✓ Branch 34 taken 67 times.
✓ Branch 35 taken 67 times.
✓ Branch 36 taken 67 times.
201 allocate( this%output(1,1) )
250
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
67 if(this%z(1)%allocated) call this%z(1)%deallocate()
251
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
67 if(this%z(2)%allocated) call this%z(2)%deallocate()
252
253 end subroutine init_conv
254 !###############################################################################
255
256
257 !###############################################################################
258
1/2
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
15 module subroutine init_batch(this, input_shape, verbose)
259 !! Initialise batch normalisation layer
260 use athena__initialiser, only: initialiser_setup
261 use athena__misc_types, only: base_init_type
262 implicit none
263
264 ! Arguments
265 class(batch_layer_type), intent(inout) :: this
266 !! Instance of the layer
267 integer, dimension(:), intent(in) :: input_shape
268 !! Input shape
269 integer, optional, intent(in) :: verbose
270 !! Verbosity level
271
272 integer :: verbose_ = 0
273
274
275 !---------------------------------------------------------------------------
276 ! initialise optional arguments
277 !---------------------------------------------------------------------------
278
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
15 if(present(verbose)) verbose_ = verbose
279
280
281 !---------------------------------------------------------------------------
282 ! initialise input shape
283 !---------------------------------------------------------------------------
284
4/8
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 15 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 15 times.
15 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
285
286
287 !---------------------------------------------------------------------------
288 ! set up number of channels, width, height
289 !---------------------------------------------------------------------------
290
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
15 if(allocated(this%output)) deallocate(this%output)
291
7/14
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 15 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 15 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 15 times.
15 allocate(this%output_shape(this%input_rank))
292
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
15 if(size(this%input_shape).eq.1)then
293 this%output_shape(1) = this%input_shape(1)
294 this%output_shape(2) = 1
295 else
296
8/20
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✓ Branch 12 taken 15 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 15 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 42 times.
✓ Branch 23 taken 15 times.
57 this%output_shape = this%input_shape
297 end if
298
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
15 this%num_channels = this%input_shape(this%input_rank)
299 15 this%num_params = this%get_num_params()
300
16/30
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 15 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 15 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 15 times.
✓ Branch 21 taken 15 times.
✓ Branch 22 taken 15 times.
✓ Branch 23 taken 15 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 15 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 15 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 15 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 15 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 15 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 15 times.
30 allocate(this%params(1))
301
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✓ Branch 6 taken 30 times.
✓ Branch 7 taken 15 times.
45 call this%params(1)%allocate([2 * this%num_channels, 1])
302
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
15 call this%params(1)%set_requires_grad(.true.)
303
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
15 allocate(this%weight_shape(1,1))
304
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 15 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 15 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 15 times.
✓ Branch 21 taken 15 times.
✓ Branch 22 taken 15 times.
30 this%weight_shape(:,1) = [ this%num_channels ]
305
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 15 times.
✓ Branch 7 taken 15 times.
30 this%bias_shape = [this%num_channels]
306
307
308 !---------------------------------------------------------------------------
309 ! allocate mean and variance
310 !---------------------------------------------------------------------------
311
13/24
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 15 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 15 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 15 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 15 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 15 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 15 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 15 times.
✓ Branch 29 taken 40 times.
✓ Branch 30 taken 15 times.
55 allocate(this%mean(this%num_channels), source=0._real32)
312
18/34
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 15 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 15 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 15 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 15 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 15 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 15 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 15 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 15 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 15 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 15 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 15 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 15 times.
✓ Branch 44 taken 40 times.
✓ Branch 45 taken 15 times.
55 allocate(this%variance, source=this%mean)
313
314
315 !---------------------------------------------------------------------------
316 ! initialise gamma
317 !---------------------------------------------------------------------------
318 150 call this%kernel_init%initialise(this%params(1)%val(1:this%num_channels,1), &
319 fan_in =this%num_channels, &
320
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 15 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 15 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 15 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 15 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 15 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 15 times.
15 fan_out=this%num_channels)
321
322 ! initialise beta
323 !---------------------------------------------------------------------------
324 150 call this%bias_init%initialise(this%params(1)%val(this%num_channels+1:,1), &
325 fan_in =this%num_channels, &
326
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 15 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 15 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 15 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 15 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 15 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 15 times.
15 fan_out=this%num_channels)
327
328
329 !---------------------------------------------------------------------------
330 ! initialise moving mean
331 !---------------------------------------------------------------------------
332 60 call this%moving_mean_init%initialise(this%mean, &
333 fan_in =this%num_channels, &
334
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
15 fan_out=this%num_channels)
335
336 ! initialise moving variance
337 !---------------------------------------------------------------------------
338 60 call this%moving_variance_init%initialise(this%variance, &
339 fan_in =this%num_channels, &
340
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
15 fan_out=this%num_channels)
341
342
343 !---------------------------------------------------------------------------
344 ! Allocate arrays
345 !---------------------------------------------------------------------------
346
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
15 if(this%use_graph_input)then
347 call stop_program( &
348 "Graph input not supported for batch normalisation layer" &
349 )
350 return
351 end if
352
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
15 if(allocated(this%output)) deallocate(this%output)
353
15/26
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 15 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 15 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 15 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 15 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 15 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 15 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 15 times.
✓ Branch 33 taken 15 times.
✓ Branch 34 taken 15 times.
✓ Branch 35 taken 15 times.
✓ Branch 36 taken 15 times.
45 allocate( batchnorm_array_type :: this%output(1,1) )
354
355 end subroutine init_batch
356 !###############################################################################
357
358 end submodule athena__base_layer_submodule_init
359