GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_flatten4d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 37 39 94.9%
Functions: 0 0 -%
Branches: 183 383 47.8%

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 4D flattening layer
6 !!!#############################################################################
7 module flatten4d_layer
8 use constants, only: real12
9 use base_layer, only: flatten_layer_type
10 implicit none
11
12
13 type, extends(flatten_layer_type) :: flatten4d_layer_type
14 real(real12), allocatable, dimension(:,:,:,:,:,:) :: di
15 contains
16 procedure, pass(this) :: init => init_flatten4d
17 procedure, pass(this) :: set_batch_size => set_batch_size_flatten4d
18 procedure, pass(this) :: forward => forward_rank
19 procedure, pass(this) :: backward => backward_rank
20 end type flatten4d_layer_type
21
22 interface flatten4d_layer_type
23 module function layer_setup(input_shape, batch_size, num_addit_outputs) &
24 result(layer)
25 integer, dimension(:), optional, intent(in) :: input_shape
26 integer, optional, intent(in) :: batch_size
27 integer, optional, intent(in) :: num_addit_outputs
28 type(flatten4d_layer_type) :: layer
29 end function layer_setup
30 end interface flatten4d_layer_type
31
32
33 private
34 public :: flatten4d_layer_type
35
36
37 contains
38
39 !!!#############################################################################
40 !!! forward propagation assumed rank handler
41 !!!#############################################################################
42 1 pure subroutine forward_rank(this, input)
43 implicit none
44 class(flatten4d_layer_type), intent(inout) :: this
45 real(real12), dimension(..), intent(in) :: input
46
47 select rank(input); rank(6)
48 8 this%output(:this%num_outputs, :this%batch_size) = &
49
14/22
✗ 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 2 times.
✓ Branch 25 taken 1 times.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✓ Branch 29 taken 12288 times.
✓ Branch 30 taken 1 times.
12292 reshape(input, [this%num_outputs, this%batch_size])
50 end select
51 1 end subroutine forward_rank
52 !!!#############################################################################
53
54
55 !!!#############################################################################
56 !!! backward propagation assumed rank handler
57 !!!#############################################################################
58 1 pure subroutine backward_rank(this, input, gradient)
59 implicit none
60 class(flatten4d_layer_type), intent(inout) :: this
61 real(real12), dimension(..), intent(in) :: input
62 real(real12), dimension(..), intent(in) :: gradient
63
64 select rank(gradient); rank(2)
65
44/64
✗ 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 6 times.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 6 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 6 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✓ Branch 35 taken 1 times.
✓ Branch 36 taken 3 times.
✓ Branch 37 taken 1 times.
✓ Branch 38 taken 24 times.
✓ Branch 39 taken 3 times.
✓ Branch 40 taken 192 times.
✓ Branch 41 taken 24 times.
✓ Branch 42 taken 1536 times.
✓ Branch 43 taken 192 times.
✓ Branch 44 taken 12288 times.
✓ Branch 45 taken 1536 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✓ Branch 63 taken 1 times.
✓ Branch 64 taken 3 times.
✓ Branch 65 taken 1 times.
✓ Branch 66 taken 24 times.
✓ Branch 67 taken 3 times.
✓ Branch 68 taken 192 times.
✓ Branch 69 taken 24 times.
✓ Branch 70 taken 1536 times.
✓ Branch 71 taken 192 times.
✓ Branch 72 taken 12288 times.
✓ Branch 73 taken 1536 times.
28095 this%di = reshape(gradient(:this%num_outputs,:), shape(this%di))
66 end select
67 1 end subroutine backward_rank
68 !!!#############################################################################
69
70
71 !!!##########################################################################!!!
72 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
73 !!!##########################################################################!!!
74
75
76 !!!#############################################################################
77 !!! set up layer
78 !!!#############################################################################
79
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 module function layer_setup(input_shape, batch_size, num_addit_outputs) &
80 result(layer)
81 implicit none
82 integer, dimension(:), optional, intent(in) :: input_shape
83 integer, optional, intent(in) :: batch_size
84 integer, optional, intent(in) :: num_addit_outputs
85
86 type(flatten4d_layer_type) :: layer
87
88
89
3/8
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1 layer%name = "flatten4d"
90 1 layer%input_rank = 5
91 !!--------------------------------------------------------------------------
92 !! initialise batch size
93 !!--------------------------------------------------------------------------
94
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(present(batch_size)) layer%batch_size = batch_size
95
96
97 !!--------------------------------------------------------------------------
98 !! initialise layer shape
99 !!--------------------------------------------------------------------------
100
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(present(num_addit_outputs)) layer%num_addit_outputs = num_addit_outputs
101
5/10
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
1 if(present(input_shape)) call layer%init(input_shape=input_shape)
102
103
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 end function layer_setup
104 !!!#############################################################################
105
106
107 !!!#############################################################################
108 !!! initialise layer
109 !!!#############################################################################
110
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 subroutine init_flatten4d(this, input_shape, batch_size, verbose)
111 implicit none
112 class(flatten4d_layer_type), intent(inout) :: this
113 integer, dimension(:), intent(in) :: input_shape
114 integer, optional, intent(in) :: batch_size
115 integer, optional, intent(in) :: verbose
116
117 integer :: verbose_ = 0
118
119
120 !!--------------------------------------------------------------------------
121 !! initialise optional arguments
122 !!--------------------------------------------------------------------------
123
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(present(verbose)) verbose_ = verbose
124
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(present(batch_size)) this%batch_size = batch_size
125
126
127 !!--------------------------------------------------------------------------
128 !! initialise input shape
129 !!--------------------------------------------------------------------------
130
4/8
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
1 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
131
132
6/10
✗ 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 5 times.
✓ Branch 13 taken 1 times.
6 this%num_outputs = product(this%input_shape)
133
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
2 this%output_shape = [this%num_outputs]
134
135
136 !!--------------------------------------------------------------------------
137 !! initialise batch size-dependent arrays
138 !!--------------------------------------------------------------------------
139
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(this%batch_size.gt.0) call this%set_batch_size(this%batch_size)
140
141
142 1 end subroutine init_flatten4d
143 !!!#############################################################################
144
145
146 !!!#############################################################################
147 !!! set batch size
148 !!!#############################################################################
149 1 subroutine set_batch_size_flatten4d(this, batch_size, verbose)
150 implicit none
151 class(flatten4d_layer_type), intent(inout) :: this
152 integer, intent(in) :: batch_size
153 integer, optional, intent(in) :: verbose
154
155 integer :: verbose_ = 0
156
157
158 !!--------------------------------------------------------------------------
159 !! initialise optional arguments
160 !!--------------------------------------------------------------------------
161
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(present(verbose)) verbose_ = verbose
162 1 this%batch_size = batch_size
163
164
165 !!--------------------------------------------------------------------------
166 !! allocate arrays
167 !!--------------------------------------------------------------------------
168
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(allocated(this%input_shape))then
169
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1 if(allocated(this%output)) deallocate(this%output)
170 allocate(this%output( &
171 (this%num_outputs + this%num_addit_outputs), this%batch_size ), &
172
21/38
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✓ Branch 44 taken 1 times.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 12288 times.
✓ Branch 47 taken 1 times.
12290 source=0._real12)
173
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1 if(allocated(this%di)) deallocate(this%di)
174 allocate(this%di( &
175 2 this%input_shape(1), &
176 2 this%input_shape(2), &
177 2 this%input_shape(3), &
178 2 this%input_shape(4), &
179 2 this%input_shape(5), this%batch_size), &
180
63/114
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✓ Branch 53 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 93 not taken.
✓ Branch 94 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 100 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 105 not taken.
✓ Branch 106 taken 1 times.
✗ Branch 108 not taken.
✓ Branch 109 taken 1 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 114 not taken.
✓ Branch 115 taken 1 times.
✗ Branch 117 not taken.
✓ Branch 118 taken 1 times.
✗ Branch 120 not taken.
✓ Branch 121 taken 1 times.
✗ Branch 123 not taken.
✓ Branch 124 taken 1 times.
✗ Branch 126 not taken.
✓ Branch 127 taken 1 times.
✗ Branch 129 not taken.
✓ Branch 130 taken 1 times.
✗ Branch 132 not taken.
✓ Branch 133 taken 1 times.
✗ Branch 135 not taken.
✓ Branch 136 taken 1 times.
✓ Branch 138 taken 1 times.
✓ Branch 139 taken 1 times.
✓ Branch 140 taken 3 times.
✓ Branch 141 taken 1 times.
✓ Branch 142 taken 24 times.
✓ Branch 143 taken 3 times.
✓ Branch 144 taken 192 times.
✓ Branch 145 taken 24 times.
✓ Branch 146 taken 1536 times.
✓ Branch 147 taken 192 times.
✓ Branch 148 taken 12288 times.
✓ Branch 149 taken 1536 times.
14045 source=0._real12)
181 end if
182
183 1 end subroutine set_batch_size_flatten4d
184 !!!#############################################################################
185
186
6/71
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ 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 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 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 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
2 end module flatten4d_layer
187 !!!#############################################################################
188