GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_flatten2d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 35 37 94.6%
Functions: 0 0 -%
Branches: 180 335 53.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 flattening layer
6 !!!#############################################################################
7 module flatten2d_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) :: flatten2d_layer_type
14 real(real12), allocatable, dimension(:,:,:,:) :: di
15 contains
16 procedure, pass(this) :: init => init_flatten2d
17 procedure, pass(this) :: set_batch_size => set_batch_size_flatten2d
18 procedure, pass(this) :: forward => forward_rank
19 procedure, pass(this) :: backward => backward_rank
20 end type flatten2d_layer_type
21
22 interface flatten2d_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(flatten2d_layer_type) :: layer
29 end function layer_setup
30 end interface flatten2d_layer_type
31
32
33 private
34 public :: flatten2d_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(flatten2d_layer_type), intent(inout) :: this
45 real(real12), dimension(..), intent(in) :: input
46
47 select rank(input); rank(4)
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 192 times.
✓ Branch 30 taken 1 times.
196 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(flatten2d_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
34/52
✗ 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 4 times.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 4 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 4 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 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ 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 not taken.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✓ Branch 55 taken 1 times.
✓ Branch 56 taken 3 times.
✓ Branch 57 taken 1 times.
✓ Branch 58 taken 24 times.
✓ Branch 59 taken 3 times.
✓ Branch 60 taken 192 times.
✓ Branch 61 taken 24 times.
445 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 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
3 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(flatten2d_layer_type) :: layer
87
88
89
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 = "flatten2d"
90 3 layer%input_rank = 3
91 !!--------------------------------------------------------------------------
92 !! initialise batch size
93 !!--------------------------------------------------------------------------
94
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
3 if(present(batch_size)) layer%batch_size = batch_size
95
96
97 !!--------------------------------------------------------------------------
98 !! initialise layer shape
99 !!--------------------------------------------------------------------------
100
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
3 if(present(num_addit_outputs)) layer%num_addit_outputs = num_addit_outputs
101
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)
102
103
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
6 end function layer_setup
104 !!!#############################################################################
105
106
107 !!!#############################################################################
108 !!! initialise layer
109 !!!#############################################################################
110
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 subroutine init_flatten2d(this, input_shape, batch_size, verbose)
111 implicit none
112 class(flatten2d_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_
118
119
120 !!--------------------------------------------------------------------------
121 !! initialise optional arguments
122 !!--------------------------------------------------------------------------
123
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if(present(verbose)) verbose_ = verbose
124
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if(present(batch_size)) this%batch_size = batch_size
125
126 !!--------------------------------------------------------------------------
127 !! initialise input shape
128 !!--------------------------------------------------------------------------
129
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)
130
131
6/10
✗ 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 taken 6 times.
✓ Branch 13 taken 2 times.
8 this%num_outputs = product(this%input_shape)
132
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
4 this%output_shape = [this%num_outputs]
133
134
135 !!--------------------------------------------------------------------------
136 !! initialise batch size-dependent arrays
137 !!--------------------------------------------------------------------------
138
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if(this%batch_size.gt.0) call this%set_batch_size(this%batch_size)
139
140 2 end subroutine init_flatten2d
141 !!!#############################################################################
142
143
144 !!!#############################################################################
145 !!! set batch size
146 !!!#############################################################################
147 1 subroutine set_batch_size_flatten2d(this, batch_size, verbose)
148 implicit none
149 class(flatten2d_layer_type), intent(inout) :: this
150 integer, intent(in) :: batch_size
151 integer, optional, intent(in) :: verbose
152
153 integer :: verbose_ = 0
154
155
156 !!--------------------------------------------------------------------------
157 !! initialise optional arguments
158 !!--------------------------------------------------------------------------
159
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(present(verbose)) verbose_ = verbose
160 1 this%batch_size = batch_size
161
162
163 !!--------------------------------------------------------------------------
164 !! allocate arrays
165 !!--------------------------------------------------------------------------
166
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(allocated(this%input_shape))then
167
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)
168 allocate(this%output( &
169 (this%num_outputs + this%num_addit_outputs), this%batch_size ), &
170
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 192 times.
✓ Branch 47 taken 1 times.
194 source=0._real12)
171
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)
172 allocate(this%di( &
173 2 this%input_shape(1), &
174 2 this%input_shape(2), &
175 2 this%input_shape(3), this%batch_size), &
176
43/78
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 1 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 1 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 1 times.
✓ Branch 94 taken 1 times.
✓ Branch 95 taken 1 times.
✓ Branch 96 taken 3 times.
✓ Branch 97 taken 1 times.
✓ Branch 98 taken 24 times.
✓ Branch 99 taken 3 times.
✓ Branch 100 taken 192 times.
✓ Branch 101 taken 24 times.
221 source=0._real12)
177 end if
178
179 1 end subroutine set_batch_size_flatten2d
180 !!!#############################################################################
181
182
28/71
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 3 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 3 times.
✗ 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 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✓ Branch 45 taken 3 times.
✓ Branch 46 taken 3 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 3 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✓ Branch 67 taken 3 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✓ Branch 70 taken 3 times.
✓ Branch 71 taken 3 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 2 times.
✓ Branch 75 taken 3 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 1 times.
✓ Branch 78 taken 2 times.
✓ Branch 79 taken 3 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 3 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 3 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 3 times.
✗ Branch 86 not taken.
20 end module flatten2d_layer
183 !!!#############################################################################
184