GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_flatten1d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 34 36 94.4%
Functions: 0 0 -%
Branches: 138 311 44.4%

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 1D flattening layer
6 !!!#############################################################################
7 module flatten1d_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) :: flatten1d_layer_type
14 real(real12), allocatable, dimension(:,:,:) :: di
15 contains
16 procedure, pass(this) :: init => init_flatten1d
17 procedure, pass(this) :: set_batch_size => set_batch_size_flatten1d
18 procedure, pass(this) :: forward => forward_rank
19 procedure, pass(this) :: backward => backward_rank
20 end type flatten1d_layer_type
21
22 interface flatten1d_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(flatten1d_layer_type) :: layer
29 end function layer_setup
30 end interface flatten1d_layer_type
31
32
33 private
34 public :: flatten1d_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(flatten1d_layer_type), intent(inout) :: this
45 real(real12), dimension(..), intent(in) :: input
46
47 select rank(input); rank(3)
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 24 times.
✓ Branch 30 taken 1 times.
28 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(flatten1d_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
29/46
✗ 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 3 times.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 3 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 3 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 1 times.
✗ Branch 41 not taken.
✓ 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 not taken.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✓ Branch 51 taken 1 times.
✓ Branch 52 taken 3 times.
✓ Branch 53 taken 1 times.
✓ Branch 54 taken 24 times.
✓ Branch 55 taken 3 times.
60 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(flatten1d_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 = "flatten1d"
90 1 layer%input_rank = 2
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_flatten1d(this, input_shape, batch_size, verbose)
111 implicit none
112 class(flatten1d_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 2 times.
✓ Branch 13 taken 1 times.
3 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 1 end subroutine init_flatten1d
142 !!!#############################################################################
143
144
145 !!!#############################################################################
146 !!! set batch size
147 !!!#############################################################################
148 1 subroutine set_batch_size_flatten1d(this, batch_size, verbose)
149 implicit none
150 class(flatten1d_layer_type), intent(inout) :: this
151 integer, intent(in) :: batch_size
152 integer, optional, intent(in) :: verbose
153
154 integer :: verbose_ = 0
155
156
157 !!--------------------------------------------------------------------------
158 !! initialise optional arguments
159 !!--------------------------------------------------------------------------
160
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(present(verbose)) verbose_ = verbose
161 1 this%batch_size = batch_size
162
163
164 !!--------------------------------------------------------------------------
165 !! allocate arrays
166 !!--------------------------------------------------------------------------
167
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(allocated(this%input_shape))then
168
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)
169 allocate(this%output( &
170 (this%num_outputs + this%num_addit_outputs), this%batch_size ), &
171
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 24 times.
✓ Branch 47 taken 1 times.
26 source=0._real12)
172
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)
173 allocate(this%di( &
174 2 this%input_shape(1), &
175 2 this%input_shape(2), this%batch_size), &
176
33/60
✗ 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 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 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 taken 1 times.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 3 times.
✓ Branch 75 taken 1 times.
✓ Branch 76 taken 24 times.
✓ Branch 77 taken 3 times.
29 source=0._real12)
177 end if
178
179 1 end subroutine set_batch_size_flatten1d
180 !!!#############################################################################
181
182
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 flatten1d_layer
183 !!!#############################################################################
184