GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_conv1d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 143 297 48.1%
Functions: 0 0 -%
Branches: 1116 2745 40.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 1D convolutional layer
6 !!!#############################################################################
7 !!! Attribution statement:
8 !!! The following procedures are based on code from the neural-fortran library
9 !!! https://github.com/modern-fortran/neural-fortran/blob/main/src/nf/nf_layer.f90
10 !!! procedures:
11 !!! - get_params*
12 !!! - set_params*
13 !!! - get_gradients*
14 !!! - set_gradients*
15 !!!#############################################################################
16 module conv1d_layer
17 use constants, only: real12
18 use base_layer, only: learnable_layer_type, conv_layer_type
19 use custom_types, only: initialiser_type
20 implicit none
21
22
23 type, extends(conv_layer_type) :: conv1d_layer_type
24 real(real12), allocatable, dimension(:,:,:) :: weight
25 real(real12), allocatable, dimension(:,:,:,:) :: dw ! weight gradient
26 real(real12), allocatable, dimension(:,:,:) :: output, z
27 real(real12), allocatable, dimension(:,:,:) :: di ! input gradient
28 contains
29 procedure, pass(this) :: get_params => get_params_conv1d
30 procedure, pass(this) :: set_params => set_params_conv1d
31 procedure, pass(this) :: get_gradients => get_gradients_conv1d
32 procedure, pass(this) :: set_gradients => set_gradients_conv1d
33 procedure, pass(this) :: get_output => get_output_conv1d
34
35 procedure, pass(this) :: init => init_conv1d
36 procedure, pass(this) :: set_batch_size => set_batch_size_conv1d
37 procedure, pass(this) :: print => print_conv1d
38
39 procedure, pass(this) :: forward => forward_rank
40 procedure, pass(this) :: backward => backward_rank
41 procedure, private, pass(this) :: forward_3d
42 procedure, private, pass(this) :: backward_3d
43
44 procedure, pass(this) :: reduce => layer_reduction
45 procedure, pass(this) :: merge => layer_merge
46 procedure :: add_t_t => layer_add !t = type, r = real, i = int
47 generic :: operator(+) => add_t_t !, public
48 end type conv1d_layer_type
49
50
51 !!!-----------------------------------------------------------------------------
52 !!! interface for layer set up
53 !!!-----------------------------------------------------------------------------
54 interface conv1d_layer_type
55 module function layer_setup( &
56 input_shape, batch_size, &
57 num_filters, kernel_size, stride, padding, &
58 activation_function, activation_scale, &
59 kernel_initialiser, bias_initialiser, &
60 calc_input_gradients) result(layer)
61 integer, dimension(:), optional, intent(in) :: input_shape
62 integer, optional, intent(in) :: batch_size
63 integer, optional, intent(in) :: num_filters
64 integer, dimension(..), optional, intent(in) :: kernel_size
65 integer, dimension(..), optional, intent(in) :: stride
66 real(real12), optional, intent(in) :: activation_scale
67 character(*), optional, intent(in) :: activation_function, &
68 kernel_initialiser, bias_initialiser, padding
69 logical, optional, intent(in) :: calc_input_gradients
70 type(conv1d_layer_type) :: layer
71 end function layer_setup
72 end interface conv1d_layer_type
73
74
75 private
76 public :: conv1d_layer_type
77 public :: read_conv1d_layer
78
79
80 contains
81
82 !!!#############################################################################
83 !!! layer reduction
84 !!!#############################################################################
85 1 subroutine layer_reduction(this, rhs)
86 implicit none
87 class(conv1d_layer_type), intent(inout) :: this
88 class(learnable_layer_type), intent(in) :: rhs
89
90 select type(rhs)
91 class is(conv1d_layer_type)
92
24/46
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ 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.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 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 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 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✓ Branch 61 taken 1 times.
✓ Branch 62 taken 1 times.
✓ Branch 63 taken 1 times.
3 this%db = this%db + rhs%db
93
50/94
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ 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.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 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 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 1 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 1 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 1 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 1 times.
✓ Branch 110 taken 1 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 1 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
✓ Branch 118 taken 1 times.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✓ Branch 122 taken 1 times.
✓ Branch 123 taken 1 times.
✓ Branch 124 taken 1 times.
✓ Branch 125 taken 1 times.
✓ Branch 126 taken 1 times.
✓ Branch 127 taken 1 times.
✓ Branch 128 taken 3 times.
✓ Branch 129 taken 1 times.
8 this%dw = this%dw + rhs%dw
94 end select
95
96 1 end subroutine layer_reduction
97 !!!#############################################################################
98
99
100 !!!#############################################################################
101 !!! layer addition
102 !!!#############################################################################
103 1 function layer_add(a, b) result(output)
104 implicit none
105 class(conv1d_layer_type), intent(in) :: a, b
106 type(conv1d_layer_type) :: output
107
108
33/66
✓ 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 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ 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 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 39 not taken.
✓ 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 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 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.
1 output = a
109
49/92
✗ 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 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 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 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 1 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 1 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✓ Branch 120 taken 1 times.
✓ Branch 121 taken 1 times.
✓ Branch 122 taken 1 times.
✓ Branch 123 taken 1 times.
✓ Branch 124 taken 1 times.
✓ Branch 125 taken 1 times.
✓ Branch 126 taken 3 times.
✓ Branch 127 taken 1 times.
7 output%dw = output%dw + b%dw
110
25/48
✗ 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 51 not taken.
✓ Branch 52 taken 1 times.
✓ 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 1 times.
✓ Branch 65 taken 1 times.
3 output%db = output%db + b%db
111
112
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 end function layer_add
113 !!!#############################################################################
114
115
116 !!!#############################################################################
117 !!! layer merge
118 !!!#############################################################################
119 1 subroutine layer_merge(this, input)
120 implicit none
121 class(conv1d_layer_type), intent(inout) :: this
122 class(learnable_layer_type), intent(in) :: input
123
124 select type(input)
125 class is(conv1d_layer_type)
126
48/90
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ 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.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 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 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 97 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 104 taken 1 times.
✓ Branch 106 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 1 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 1 times.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✓ Branch 118 taken 1 times.
✓ Branch 119 taken 1 times.
✓ Branch 120 taken 1 times.
✓ Branch 121 taken 1 times.
✓ Branch 122 taken 1 times.
✓ Branch 123 taken 1 times.
✓ Branch 124 taken 3 times.
✓ Branch 125 taken 1 times.
7 this%dw = this%dw + input%dw
127
26/50
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ 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.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 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 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✓ Branch 65 taken 1 times.
✓ Branch 66 taken 1 times.
✓ Branch 67 taken 1 times.
4 this%db = this%db + input%db
128 end select
129
130 1 end subroutine layer_merge
131 !!!#############################################################################
132
133
134 !!!##########################################################################!!!
135 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
136 !!!##########################################################################!!!
137
138
139 !!!#############################################################################
140 !!! get learnable parameters
141 !!! procedure modified from neural-fortran library
142 !!!#############################################################################
143 2 pure function get_params_conv1d(this) result(params)
144 implicit none
145 class(conv1d_layer_type), intent(in) :: this
146 real(real12), allocatable, dimension(:) :: params
147
148 params = [ reshape( &
149 this%weight, &
150 16 [ this%num_filters * this%num_channels * product(this%knl) ]), &
151
22/36
✗ 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 2 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✓ Branch 20 taken 6 times.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 2 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 2 times.
✓ Branch 37 taken 2 times.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 8 times.
✓ Branch 46 taken 2 times.
22 this%bias ]
152
153 2 end function get_params_conv1d
154 !!!#############################################################################
155
156
157 !!!#############################################################################
158 !!! set learnable parameters
159 !!! procedure modified from neural-fortran library
160 !!!#############################################################################
161
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 subroutine set_params_conv1d(this, params)
162 implicit none
163 class(conv1d_layer_type), intent(inout) :: this
164 real(real12), dimension(:), intent(in) :: params
165
166 this%weight = reshape( &
167 params(1:this%num_filters * this%num_channels * product(this%knl)), &
168
30/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 taken 1 times.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 3 times.
✓ Branch 21 taken 1 times.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 3 times.
✓ Branch 35 taken 1 times.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✓ Branch 47 taken 1 times.
✓ Branch 48 taken 1 times.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 3 times.
✓ Branch 51 taken 1 times.
15 shape(this%weight))
169 this%bias = params(&
170
14/26
✗ 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 1 times.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✓ Branch 29 taken 1 times.
4 this%num_filters * this%num_channels * product(this%knl) + 1 : )
171
172 1 end subroutine set_params_conv1d
173 !!!#############################################################################
174
175
176 !!!#############################################################################
177 !!! get sample-average gradients
178 !!! sum over batch dimension and divide by batch size
179 !!! procedure modified from neural-fortran library
180 !!!#############################################################################
181 3 pure function get_gradients_conv1d(this, clip_method) result(gradients)
182 use clipper, only: clip_type
183 implicit none
184 class(conv1d_layer_type), intent(in) :: this
185 type(clip_type), optional, intent(in) :: clip_method
186 real(real12), allocatable, dimension(:) :: gradients
187
188 gradients = [ reshape( &
189 48 sum(this%dw,dim=4)/this%batch_size, &
190 12 [ this%num_filters * this%num_channels * product(this%knl) ]), &
191
53/88
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 3 times.
✓ Branch 48 taken 3 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 3 times.
✓ Branch 51 taken 3 times.
✓ Branch 52 taken 3 times.
✓ Branch 53 taken 3 times.
✓ Branch 54 taken 9 times.
✓ Branch 55 taken 3 times.
✓ Branch 56 taken 9 times.
✓ Branch 57 taken 9 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 taken 3 times.
✓ Branch 71 taken 3 times.
✓ Branch 72 taken 3 times.
✓ Branch 73 taken 3 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 3 times.
✓ Branch 78 taken 9 times.
✓ Branch 79 taken 3 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 3 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 3 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 3 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 3 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 3 times.
✗ Branch 95 not taken.
✓ Branch 96 taken 3 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 3 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 3 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 3 times.
✓ Branch 107 taken 3 times.
✓ Branch 108 taken 3 times.
✓ Branch 109 taken 3 times.
✓ Branch 110 taken 3 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 3 times.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✓ Branch 115 taken 3 times.
✗ Branch 116 not taken.
✓ Branch 117 taken 12 times.
✓ Branch 118 taken 3 times.
60 sum(this%db,dim=2)/this%batch_size ]
192
193
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(present(clip_method)) call clip_method%apply(size(gradients),gradients)
194
195 3 end function get_gradients_conv1d
196 !!!#############################################################################
197
198
199 !!!#############################################################################
200 !!! set gradients
201 !!! procedure modified from neural-fortran library
202 !!!#############################################################################
203 2 subroutine set_gradients_conv1d(this, gradients)
204 implicit none
205 class(conv1d_layer_type), intent(inout) :: this
206 real(real12), dimension(..), intent(in) :: gradients
207
208 integer :: s
209
210 select rank(gradients)
211 rank(0)
212
8/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 1 times.
7 this%dw = gradients
213
4/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
4 this%db = gradients
214 rank(1)
215
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 do s=1,this%batch_size
216 this%dw(:,:,:,s) = reshape(gradients(:&
217 4 this%num_filters * this%num_channels * product(this%knl)), &
218
46/82
✗ 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 taken 1 times.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✗ 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 taken 3 times.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 3 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 3 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 3 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 3 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 3 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 3 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 3 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 3 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 3 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 3 times.
✗ Branch 93 not taken.
✓ Branch 94 taken 3 times.
✓ Branch 96 taken 3 times.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✓ Branch 99 taken 3 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 105 not taken.
✓ Branch 106 taken 1 times.
✓ Branch 108 taken 1 times.
✓ Branch 109 taken 1 times.
✓ Branch 110 taken 1 times.
✓ Branch 111 taken 1 times.
✓ Branch 112 taken 3 times.
✓ Branch 113 taken 1 times.
10 shape(this%dw(:,:,:,s)))
219 this%db(:,s) = gradients(&
220
19/34
✗ 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 1 times.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✓ Branch 43 taken 1 times.
✓ Branch 44 taken 1 times.
4 this%num_filters * this%num_channels * product(this%knl)+1:)
221 end do
222 end select
223
224 2 end subroutine set_gradients_conv1d
225 !!!#############################################################################
226
227
228 !!!#############################################################################
229 !!! get layer outputs
230 !!!#############################################################################
231 3 pure subroutine get_output_conv1d(this, output)
232 implicit none
233 class(conv1d_layer_type), intent(in) :: this
234 real(real12), allocatable, dimension(..), intent(out) :: output
235
236 select rank(output)
237 rank(1)
238
7/10
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 3 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.
5 output = reshape(this%output, [size(this%output)])
239 rank(2)
240 output = &
241
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 2 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.
5 reshape(this%output, [product(this%output_shape),this%batch_size])
242 rank(3)
243
26/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 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 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ 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 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 taken 1 times.
✓ Branch 60 taken 1 times.
✓ Branch 61 taken 1 times.
✓ Branch 62 taken 1 times.
✓ Branch 63 taken 1 times.
4 output = this%output
244 end select
245
246 3 end subroutine get_output_conv1d
247 !!!#############################################################################
248
249
250 !!!##########################################################################!!!
251 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
252 !!!##########################################################################!!!
253
254
255 !!!#############################################################################
256 !!! forward propagation assumed rank handler
257 !!!#############################################################################
258 1 pure subroutine forward_rank(this, input)
259 implicit none
260 class(conv1d_layer_type), intent(inout) :: this
261 real(real12), dimension(..), intent(in) :: input
262
263 select rank(input); rank(3)
264 1 call forward_3d(this, input)
265 end select
266 1 end subroutine forward_rank
267 !!!#############################################################################
268
269
270 !!!#############################################################################
271 !!! backward propagation assumed rank handler
272 !!!#############################################################################
273 pure subroutine backward_rank(this, input, gradient)
274 implicit none
275 class(conv1d_layer_type), intent(inout) :: this
276 real(real12), dimension(..), intent(in) :: input
277 real(real12), dimension(..), intent(in) :: gradient
278
279 select rank(input); rank(3)
280 select rank(gradient)
281 rank(1)
282 call backward_3d(this, input, gradient)
283 rank(2)
284 call backward_3d(this, input, gradient)
285 rank(3)
286 call backward_3d(this, input, gradient)
287 end select
288 end select
289 end subroutine backward_rank
290 !!!#############################################################################
291
292
293 !!!##########################################################################!!!
294 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
295 !!!##########################################################################!!!
296
297
298 !!!#############################################################################
299 !!! set up layer
300 !!!#############################################################################
301 7 module function layer_setup( &
302
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
7 input_shape, batch_size, &
303 num_filters, kernel_size, stride, padding, &
304 activation_function, activation_scale, &
305 kernel_initialiser, bias_initialiser, &
306 calc_input_gradients) result(layer)
307 !! add in dilation
308 use activation, only: activation_setup
309 use initialiser, only: get_default_initialiser
310 use misc_ml, only: set_padding
311 implicit none
312 integer, dimension(:), optional, intent(in) :: input_shape
313 integer, optional, intent(in) :: batch_size
314 integer, optional, intent(in) :: num_filters
315 integer, dimension(..), optional, intent(in) :: kernel_size
316 integer, dimension(..), optional, intent(in) :: stride
317 real(real12), optional, intent(in) :: activation_scale
318 character(*), optional, intent(in) :: activation_function, &
319 kernel_initialiser, bias_initialiser, padding
320 logical, optional, intent(in) :: calc_input_gradients
321
322 type(conv1d_layer_type) :: layer
323
324 integer :: i
325 real(real12) :: scale
326 character(len=10) :: activation_function_
327 character(len=20) :: padding_
328
329
330
3/8
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
7 layer%name = "conv1d"
331 7 layer%input_rank = 2
332 allocate( &
333 layer%knl(layer%input_rank-1), &
334 layer%stp(layer%input_rank-1), &
335 layer%hlf(layer%input_rank-1), &
336 layer%pad(layer%input_rank-1), &
337
40/80
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 7 times.
✓ Branch 18 taken 7 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 7 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 7 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 7 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 7 times.
✓ Branch 36 taken 7 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 7 times.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 7 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 7 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 7 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 7 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 7 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 7 times.
✓ Branch 54 taken 7 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 7 times.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 7 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 7 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 7 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 7 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 7 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 7 times.
✓ Branch 72 taken 7 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 7 times.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✓ Branch 77 taken 7 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 7 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 7 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 7 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 7 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 7 times.
7 layer%cen(layer%input_rank-1) )
338 !!--------------------------------------------------------------------------
339 !! initialise batch size
340 !!--------------------------------------------------------------------------
341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if(present(batch_size)) layer%batch_size = batch_size
342
343
344 !!--------------------------------------------------------------------------
345 !! determine whether to calculate input gradients
346 !!--------------------------------------------------------------------------
347
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if(present(calc_input_gradients))then
348 layer%calc_input_gradients = calc_input_gradients
349 write(*,*) "CONV1D input gradients turned off"
350 else
351 7 layer%calc_input_gradients = .true.
352 end if
353
354
355 !!--------------------------------------------------------------------------
356 !! set up number of filters
357 !!--------------------------------------------------------------------------
358
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2 times.
7 if(present(num_filters))then
359 5 layer%num_filters = num_filters
360 else
361 2 layer%num_filters = 32
362 end if
363
364
365 !!--------------------------------------------------------------------------
366 !! set up kernel size
367 !!--------------------------------------------------------------------------
368
2/4
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
7 if(present(kernel_size))then
369 7 select rank(kernel_size)
370 rank(0)
371
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10 layer%knl = kernel_size
372 rank(1)
373
4/8
✗ 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.
2 layer%knl(1) = kernel_size(1)
374 end select
375 else
376 layer%knl = 3
377 end if
378 !! odd or even kernel/filter size
379 !!--------------------------------------------------------------------------
380
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 7 times.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 7 times.
✓ Branch 19 taken 7 times.
14 layer%cen = 2 - mod(layer%knl, 2)
381
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 7 times.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 7 times.
✓ Branch 19 taken 7 times.
14 layer%hlf = (layer%knl-1)/2
382
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if(present(padding))then
384 padding_ = padding
385 else
386 7 padding_ = "valid"
387 end if
388
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 7 times.
7 call set_padding(layer%pad(1), layer%knl(1), padding_)
389
390
391 !!--------------------------------------------------------------------------
392 !! set up stride
393 !!--------------------------------------------------------------------------
394
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
7 if(present(stride))then
395 2 select rank(stride)
396 rank(0)
397 layer%stp = stride
398 rank(1)
399
4/8
✗ 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.
2 layer%stp(1) = stride(1)
400 end select
401 else
402
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10 layer%stp = 1
403 end if
404
405
406 !!--------------------------------------------------------------------------
407 !! set activation and derivative functions based on input name
408 !!--------------------------------------------------------------------------
409
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 3 times.
7 if(present(activation_function))then
410
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 activation_function_ = activation_function
411 else
412 3 activation_function_ = "none"
413 end if
414
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if(present(activation_scale))then
415 scale = activation_scale
416 else
417 7 scale = 1._real12
418 end if
419
1/2
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
7 write(*,'("CONV1D activation function: ",A)') trim(activation_function_)
420 allocate(layer%transfer, &
421
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 7 times.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
14 source=activation_setup(activation_function_, scale))
422
423
424 !!--------------------------------------------------------------------------
425 !! define weights (kernels) and biases initialisers
426 !!--------------------------------------------------------------------------
427
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
7 if(present(kernel_initialiser)) layer%kernel_initialiser =kernel_initialiser
428
4/4
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 1 times.
7 if(trim(layer%kernel_initialiser).eq.'') &
429
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 layer%kernel_initialiser=get_default_initialiser(activation_function_)
430
1/2
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
7 write(*,'("CONV1D kernel initialiser: ",A)') trim(layer%kernel_initialiser)
431
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7 if(present(bias_initialiser)) layer%bias_initialiser = bias_initialiser
432
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
7 if(trim(layer%bias_initialiser).eq.'') &
433 layer%bias_initialiser = get_default_initialiser(&
434
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 activation_function_, is_bias=.true.)
435
1/2
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
7 write(*,'("CONV1D bias initialiser: ",A)') trim(layer%bias_initialiser)
436
437
438 !!--------------------------------------------------------------------------
439 !! initialise layer shape
440 !!--------------------------------------------------------------------------
441
6/10
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
✓ 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.
7 if(present(input_shape)) call layer%init(input_shape=input_shape)
442
443
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
27 end function layer_setup
444 !!!#############################################################################
445
446
447 !!!#############################################################################
448 !!! initialise layer
449 !!!#############################################################################
450
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5 subroutine init_conv1d(this, input_shape, batch_size, verbose)
451 use initialiser, only: initialiser_setup
452 implicit none
453 class(conv1d_layer_type), intent(inout) :: this
454 integer, dimension(:), intent(in) :: input_shape
455 integer, optional, intent(in) :: batch_size
456 integer, optional, intent(in) :: verbose
457
458 integer :: verbose_ = 0
459 integer :: end_idx
460 9 class(initialiser_type), allocatable :: initialiser_
461
462
463 !!--------------------------------------------------------------------------
464 !! initialise optional arguments
465 !!--------------------------------------------------------------------------
466
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 if(present(verbose)) verbose_ = verbose
467
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2 times.
5 if(present(batch_size)) this%batch_size = batch_size
468
469
470 !!-------------------------------------------------------------------------
471 !! initialise input shape
472 !!--------------------------------------------------------------------------
473
4/8
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5 times.
5 if(.not.allocated(this%input_shape)) call this%set_shape(input_shape)
474
475
476 !!--------------------------------------------------------------------------
477 !! allocate output, activation, bias, and weight shapes
478 !!--------------------------------------------------------------------------
479 !! NOTE: INPUT SHAPE DOES NOT INCLUDE PADDING WIDTH
480 !! THIS IS HANDLED AUTOMATICALLY BY THE CODE
481 !! ... provide the initial input data shape and let us deal with the padding
482
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 this%num_channels = this%input_shape(2)
483
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
4 allocate(this%output_shape(2))
484
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 this%output_shape(2) = this%num_filters
485 8 this%output_shape(1) = floor(&
486 8 (this%input_shape(1) + &
487
11/22
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✓ Branch 30 taken 4 times.
✗ Branch 31 not taken.
4 2.0 * this%pad(1) - this%knl(1))/real(this%stp(1)) ) + 1
488
489
13/24
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 4 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 4 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 4 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 4 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 4 times.
✓ Branch 29 taken 35 times.
✓ Branch 30 taken 4 times.
39 allocate(this%bias(this%num_filters), source=0._real12)
490
491
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
4 end_idx = this%hlf(1) + (this%cen(1) - 1)
492 allocate(this%weight( &
493 8 -this%hlf(1):end_idx, &
494
31/56
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✓ Branch 14 taken 4 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 4 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 4 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 4 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 4 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 4 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 4 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 4 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 4 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 4 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 4 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 4 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 4 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 4 times.
✓ Branch 66 taken 35 times.
✓ Branch 67 taken 4 times.
✓ Branch 68 taken 99 times.
✓ Branch 69 taken 35 times.
✓ Branch 70 taken 297 times.
✓ Branch 71 taken 99 times.
435 this%num_channels,this%num_filters), source=0._real12)
495
496
497 !!--------------------------------------------------------------------------
498 !! initialise weights (kernels)
499 !!--------------------------------------------------------------------------
500
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
8 allocate(initialiser_, source=initialiser_setup(this%kernel_initialiser))
501 48 call initialiser_%initialise(this%weight, &
502
18/34
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 4 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 4 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 4 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 4 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 4 times.
✓ Branch 48 taken 4 times.
✓ Branch 49 taken 4 times.
8 fan_in=product(this%knl)+1, fan_out=1)
503
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 deallocate(initialiser_)
504
505 !! initialise biases
506 !!--------------------------------------------------------------------------
507
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
8 allocate(initialiser_, source=initialiser_setup(this%bias_initialiser))
508 16 call initialiser_%initialise(this%bias, &
509
10/18
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
✓ Branch 24 taken 4 times.
✓ Branch 25 taken 4 times.
8 fan_in=product(this%knl)+1, fan_out=1)
510
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 deallocate(initialiser_)
511
512
513 !!--------------------------------------------------------------------------
514 !! initialise batch size-dependent arrays
515 !!--------------------------------------------------------------------------
516
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 if(this%batch_size.gt.0) call this%set_batch_size(this%batch_size)
517
518
1/4
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
12 end subroutine init_conv1d
519 !!!#############################################################################
520
521
522 !!!#############################################################################
523 !!! set batch size
524 !!!#############################################################################
525 3 subroutine set_batch_size_conv1d(this, batch_size, verbose)
526 implicit none
527 class(conv1d_layer_type), intent(inout) :: this
528 integer, intent(in) :: batch_size
529 integer, optional, intent(in) :: verbose
530
531 integer :: verbose_ = 0
532
533
534 !!--------------------------------------------------------------------------
535 !! initialise optional arguments
536 !!--------------------------------------------------------------------------
537
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(present(verbose)) verbose_ = verbose
538 3 this%batch_size = batch_size
539
540
541 !!--------------------------------------------------------------------------
542 !! allocate arrays
543 !!--------------------------------------------------------------------------
544
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if(allocated(this%input_shape))then
545
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3 if(allocated(this%output)) deallocate(this%output)
546 allocate(this%output( &
547 6 this%output_shape(1), &
548 this%num_filters, &
549
31/56
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 3 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 3 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✓ Branch 66 taken 3 times.
✓ Branch 67 taken 3 times.
✓ Branch 68 taken 3 times.
✓ Branch 69 taken 3 times.
✓ Branch 70 taken 3 times.
✓ Branch 71 taken 3 times.
12 this%batch_size), source=0._real12)
550
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3 if(allocated(this%z)) deallocate(this%z)
551
44/82
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 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 3 times.
✓ Branch 107 taken 3 times.
✓ Branch 108 taken 3 times.
✓ Branch 109 taken 3 times.
✓ Branch 110 taken 3 times.
✓ Branch 111 taken 3 times.
12 allocate(this%z, source=this%output)
552
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3 if(allocated(this%di)) deallocate(this%di)
553 allocate(this%di( &
554 6 this%input_shape(1), &
555 6 this%input_shape(2), &
556
33/60
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 3 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 3 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 3 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 3 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 3 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 3 times.
✓ Branch 72 taken 3 times.
✓ Branch 73 taken 3 times.
✓ Branch 74 taken 3 times.
✓ Branch 75 taken 3 times.
✓ Branch 76 taken 9 times.
✓ Branch 77 taken 3 times.
18 this%batch_size), source=0._real12)
557
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3 if(allocated(this%dw)) deallocate(this%dw)
558 allocate(this%dw( &
559 lbound(this%weight,1):ubound(this%weight,1), &
560 this%num_channels, this%num_filters, &
561
42/76
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 3 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✓ Branch 36 taken 3 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 3 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 3 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 3 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 3 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 3 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 3 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 3 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 3 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 3 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 3 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 3 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 3 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 3 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 3 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 3 times.
✓ Branch 86 taken 3 times.
✓ Branch 87 taken 3 times.
✓ Branch 88 taken 3 times.
✓ Branch 89 taken 3 times.
✓ Branch 90 taken 3 times.
✓ Branch 91 taken 3 times.
✓ Branch 92 taken 9 times.
✓ Branch 93 taken 3 times.
21 this%batch_size), source=0._real12)
562
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3 if(allocated(this%db)) deallocate(this%db)
563
21/38
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✗ 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 taken 3 times.
✓ Branch 48 taken 3 times.
9 allocate(this%db(this%num_filters, this%batch_size), source=0._real12)
564 end if
565
566 3 end subroutine set_batch_size_conv1d
567 !!!#############################################################################
568
569
570 !!!##########################################################################!!!
571 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
572 !!!##########################################################################!!!
573
574
575 !!!#############################################################################
576 !!! print layer to file
577 !!!#############################################################################
578 subroutine print_conv1d(this, file)
579 implicit none
580 class(conv1d_layer_type), intent(in) :: this
581 character(*), intent(in) :: file
582
583 integer :: l, i
584 integer :: unit
585 character(:), allocatable :: padding_type
586
587
588 !! determine padding method
589 !!--------------------------------------------------------------------------
590 padding_type = ""
591 if(this%pad(1).eq.this%knl(1)-1)then
592 padding_type = "full"
593 elseif(this%pad(1).eq.0)then
594 padding_type = "valid"
595 else
596 padding_type = "same"
597 end if
598
599 !! open file with new unit
600 !!--------------------------------------------------------------------------
601 open(newunit=unit, file=trim(file), access='append')
602
603 !! write convolution initial parameters
604 !!--------------------------------------------------------------------------
605 write(unit,'("CONV1D")')
606 write(unit,'(3X,"INPUT_SHAPE = ",3(1X,I0))') this%input_shape
607 write(unit,'(3X,"NUM_FILTERS = ",I0)') this%num_filters
608 write(unit,'(3X,"KERNEL_SIZE =",1X,I0)') this%knl(1)
609 write(unit,'(3X,"STRIDE =",1X,I0)') this%stp(1)
610 write(unit,'(3X,"PADDING = ",A)') padding_type
611
612 write(unit,'(3X,"ACTIVATION = ",A)') trim(this%transfer%name)
613 write(unit,'(3X,"ACTIVATION_SCALE = ",F0.9)') this%transfer%scale
614
615 !! write convolution weights and biases
616 !!--------------------------------------------------------------------------
617 write(unit,'("WEIGHTS")')
618 do l=1,this%num_filters
619 write(unit,'(5(E16.8E2))', advance="no") this%weight(:,:,l)
620 if(mod(size(this%weight(:,:,l)),5).eq.0) write(unit,*)
621 write(unit,'(E16.8E2)') this%bias(l)
622 end do
623 write(unit,'("END WEIGHTS")')
624 write(unit,'("END CONV1D")')
625
626 !! close unit
627 !!--------------------------------------------------------------------------
628 close(unit)
629
630 end subroutine print_conv1d
631 !!!#############################################################################
632
633
634 !!!#############################################################################
635 !!! read layer from file
636 !!!#############################################################################
637 function read_conv1d_layer(unit, verbose) result(layer)
638 use infile_tools, only: assign_val, assign_vec
639 use misc, only: to_lower, icount
640 implicit none
641 integer, intent(in) :: unit
642 integer, optional, intent(in) :: verbose
643
644 class(conv1d_layer_type), allocatable :: layer
645
646 integer :: stat, verbose_ = 0
647 integer :: j, k, l, c, itmp1
648 integer :: num_filters, num_inputs
649 real(real12) :: activation_scale
650 logical :: found_weights = .false.
651 character(14) :: kernel_initialiser='', bias_initialiser=''
652 character(20) :: padding, activation_function
653 character(256) :: buffer, tag
654
655 integer, dimension(1) :: kernel_size, stride
656 integer, dimension(2) :: input_shape
657 real(real12), allocatable, dimension(:) :: data_list
658
659
660 !!--------------------------------------------------------------------------
661 !! initialise optional arguments
662 !!--------------------------------------------------------------------------
663 if(present(verbose)) verbose_ = verbose
664
665
666 !!--------------------------------------------------------------------------
667 !! loop over tags in layer card
668 !!--------------------------------------------------------------------------
669 tag_loop: do
670
671 !! check for end of file
672 !!-----------------------------------------------------------------------
673 read(unit,'(A)',iostat=stat) buffer
674 if(stat.ne.0)then
675 write(0,*) "ERROR: file encountered error (EoF?) before END CONV1D"
676 stop "Exiting..."
677 end if
678 if(trim(adjustl(buffer)).eq."") cycle tag_loop
679
680 !! check for end of layer card
681 !!-----------------------------------------------------------------------
682 if(trim(adjustl(buffer)).eq."END CONV1D")then
683 backspace(unit)
684 exit tag_loop
685 end if
686
687 tag=trim(adjustl(buffer))
688 if(scan(buffer,"=").ne.0) tag=trim(tag(:scan(tag,"=")-1))
689
690 !! read parameters from save file
691 !!-----------------------------------------------------------------------
692 select case(trim(tag))
693 case("INPUT_SHAPE")
694 call assign_vec(buffer, input_shape, itmp1)
695 case("NUM_FILTERS")
696 call assign_val(buffer, num_filters, itmp1)
697 case("KERNEL_SIZE")
698 call assign_vec(buffer, kernel_size, itmp1)
699 case("STRIDE")
700 call assign_vec(buffer, stride, itmp1)
701 case("PADDING")
702 call assign_val(buffer, padding, itmp1)
703 padding = to_lower(padding)
704 case("ACTIVATION")
705 call assign_val(buffer, activation_function, itmp1)
706 case("ACTIVATION_SCALE")
707 call assign_val(buffer, activation_scale, itmp1)
708 case("KERNEL_INITIALISER")
709 call assign_val(buffer, kernel_initialiser, itmp1)
710 case("BIAS_INITIALISER")
711 call assign_val(buffer, bias_initialiser, itmp1)
712 case("WEIGHTS")
713 found_weights = .true.
714 kernel_initialiser = 'zeros'
715 bias_initialiser = 'zeros'
716 exit tag_loop
717 case default
718 !! don't look for "e" due to scientific notation of numbers
719 !! ... i.e. exponent (E+00)
720 if(scan(to_lower(trim(adjustl(buffer))),&
721 'abcdfghijklmnopqrstuvwxyz').eq.0)then
722 cycle tag_loop
723 elseif(tag(:3).eq.'END')then
724 cycle tag_loop
725 end if
726 stop "Unrecognised line in input file: "//trim(adjustl(buffer))
727 end select
728 end do tag_loop
729
730
731 !!--------------------------------------------------------------------------
732 !! allocate layer
733 !!--------------------------------------------------------------------------
734 layer = conv1d_layer_type( &
735 input_shape = input_shape, &
736 num_filters = num_filters, &
737 kernel_size = kernel_size, stride = stride, &
738 padding = padding, &
739 activation_function = activation_function, &
740 activation_scale = activation_scale, &
741 kernel_initialiser = kernel_initialiser, &
742 bias_initialiser = bias_initialiser)
743
744
745 !!--------------------------------------------------------------------------
746 !! check if WEIGHTS card was found
747 !!--------------------------------------------------------------------------
748 if(.not.found_weights)then
749 write(0,*) "WARNING: WEIGHTS card in CONV1D not found"
750 else
751 do l=1,num_filters
752 num_inputs = product(layer%knl) + 1 !+1 for bias
753 allocate(data_list(num_inputs), source=0._real12)
754 c = 1
755 k = 1
756 data_concat_loop: do while(c.le.num_inputs)
757 read(unit,'(A)',iostat=stat) buffer
758 if(stat.ne.0) exit data_concat_loop
759 k = icount(buffer)
760 read(buffer,*,iostat=stat) (data_list(j),j=c,c+k-1)
761 c = c + k
762 end do data_concat_loop
763 layer%weight(:,:,l) = &
764 reshape(&
765 data_list(1:num_inputs-1),&
766 shape(layer%weight(:,:,l)))
767 layer%bias(l) = data_list(num_inputs)
768 deallocate(data_list)
769 end do
770
771 !! check for end of weights card
772 !!-----------------------------------------------------------------------
773 read(unit,'(A)') buffer
774 if(trim(adjustl(buffer)).ne."END WEIGHTS")then
775 write(*,*) trim(adjustl(buffer))
776 stop "ERROR: END WEIGHTS not where expected"
777 end if
778 end if
779
780
781 !!--------------------------------------------------------------------------
782 !! check for end of layer card
783 !!--------------------------------------------------------------------------
784 read(unit,'(A)') buffer
785 if(trim(adjustl(buffer)).ne."END CONV1D")then
786 write(*,*) trim(adjustl(buffer))
787 stop "ERROR: END CONV1D not where expected"
788 end if
789
790 end function read_conv1d_layer
791 !!!#############################################################################
792
793
794 !!!##########################################################################!!!
795 !!! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !!!
796 !!!##########################################################################!!!
797
798
799 !!!#############################################################################
800 !!! forward propagation
801 !!!#############################################################################
802 7 pure subroutine forward_3d(this, input)
803 implicit none
804 class(conv1d_layer_type), intent(inout) :: this
805 real(real12), &
806 dimension( &
807
6/12
✗ 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.
1 -this%pad(1)+1:this%input_shape(1)+this%pad(1), &
808 this%num_channels,this%batch_size), &
809 intent(in) :: input
810
811 integer :: i, l, s
812 integer :: stp_idx, start_idx, end_idx
813
814
815 !! perform the convolution operation
816 !!--------------------------------------------------------------------------
817
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 do concurrent(i=1:this%output_shape(1):1)
818
6/12
✗ 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.
1 stp_idx = (i-1)*this%stp(1) + 1 + (this%hlf(1) - this%pad(1))
819
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 start_idx = stp_idx - this%hlf(1)
820
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 end_idx = start_idx + this%knl(1) - 1
821
822 1 do concurrent(s=1:this%batch_size)
823
17/30
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✗ 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.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 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 taken 1 times.
✓ Branch 42 taken 1 times.
3 this%z(i,:,s) = this%bias(:)
824 end do
825
826
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 do concurrent(l=1:this%num_filters, s=1:this%batch_size)
827 12 this%z(i,l,s) = this%z(i,l,s) + &
828 sum( &
829
1/2
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
1 input( &
830 start_idx:end_idx,:,s) * &
831 12 this%weight(:,:,l) &
832
40/72
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✗ 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.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ 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 30 not taken.
✓ Branch 31 taken 1 times.
✗ 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 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 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 72 taken 1 times.
✓ Branch 74 taken 1 times.
✓ Branch 75 taken 1 times.
✓ Branch 76 taken 3 times.
✓ Branch 77 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.
7 )
833 end do
834 end do
835
836
837 !! apply activation function to activation values (z)
838 !!--------------------------------------------------------------------------
839
38/72
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ 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 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ 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 30 not taken.
✓ Branch 31 taken 1 times.
✗ 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 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 1 times.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✓ Branch 68 taken 1 times.
✓ Branch 69 taken 1 times.
✓ Branch 70 taken 1 times.
✓ Branch 71 taken 1 times.
✓ Branch 72 taken 1 times.
4 this%output = this%transfer%activate(this%z)
840
841 1 end subroutine forward_3d
842 !!!#############################################################################
843
844
845 !!!#############################################################################
846 !!! backward propagation
847 !!! method : gradient descent
848 !!!#############################################################################
849 pure subroutine backward_3d(this, input, gradient)
850 implicit none
851 class(conv1d_layer_type), intent(inout) :: this
852 real(real12), &
853 dimension( &
854 -this%pad(1)+1:this%input_shape(1)+this%pad(1), &
855 this%num_channels,this%batch_size), &
856 intent(in) :: input
857 real(real12), &
858 dimension( &
859 this%output_shape(1), &
860 this%num_filters,this%batch_size), &
861 intent(in) :: gradient
862
863 integer :: l, m, i, x, s
864 integer :: stp_idx, offset, adjust, end_idx, n_stp
865 integer, dimension(2) :: lim, lim_w, lim_g
866 real(real12), &
867 dimension( &
868 this%output_shape(1),this%num_filters, &
869 this%batch_size) :: grad_dz
870
871
872 real(real12), dimension(1) :: bias_diff
873 bias_diff = this%transfer%differentiate([1._real12])
874
875
876 !! get size of the input and output feature maps
877 !!--------------------------------------------------------------------------
878 end_idx = this%hlf(1) + (this%cen(1) - 1)
879 offset = 1 + this%hlf(1) - this%pad(1)
880 adjust = 2 * max(this%pad(1), this%hlf(1))
881
882
883 !! get gradient multiplied by differential of Z
884 !!--------------------------------------------------------------------------
885 grad_dz = 0._real12
886 grad_dz(&
887 1:this%output_shape(1),:,:) = gradient * &
888 this%transfer%differentiate(this%z)
889 do concurrent(l=1:this%num_filters, s=1:this%batch_size)
890 this%db(l,s) = this%db(l,s) + sum(grad_dz(:,l,s)) * bias_diff(1)
891 end do
892
893 !! apply convolution to compute weight gradients
894 !! offset applied as centre of kernel is 0 ...
895 !! ... whilst the starting index for input is 1
896 !!--------------------------------------------------------------------------
897 do concurrent( &
898 s=1:this%batch_size, &
899 l=1:this%num_filters, &
900 m=1:this%num_channels, &
901 x=-this%hlf(1):end_idx:1 &
902 )
903 this%dw(x,m,l,s) = this%dw(x,m,l,s) + &
904 sum(grad_dz(:,l,s) * &
905 input( &
906 x+offset:x+offset-1+size(input,1)-adjust:this%stp(1),m,s))
907 end do
908
909
910 !! apply strided convolution to obtain input gradients
911 !!--------------------------------------------------------------------------
912 if(this%calc_input_gradients)then
913 lim(1) = this%knl(1) - 1
914 lim(2) = (this%output_shape(1) - 1) * this%stp(1) + 1 + end_idx
915 n_stp = this%output_shape(1) * this%stp(1)
916 this%di = 0._real12
917 !! all elements of the output are separated by stride_x (stride_y)
918 do concurrent( &
919 s=1:this%batch_size, &
920 l=1:this%num_filters, &
921 m=1:this%num_channels, &
922 i=1:size(this%di,dim=1):1 &
923 )
924
925 !! set weight bounds
926 stp_idx = ( i - offset )/this%stp(1) + 1
927 !! max( ...
928 !! ... 1. offset of 1st o/p idx from centre of knl (lim)
929 !! ... 2. lwst o/p idx overlap with <<- knl idx (rpt. pattern)
930 !! ...)
931 lim_w(2) = max(lim(1)-i, -this%hlf(1) + &
932 mod(n_stp+this%knl(1)-i,this%stp(1)))
933 !! min( ...
934 !! ... 1. offset of last o/p idx from centre of knl (lim)
935 !! ... 2. hghst o/p idx overlap with ->> knl idx (rpt. pattern)
936 !! ...)
937 lim_w(1) = min(lim(2)-i, end_idx - mod(n_stp-1+i,this%stp(1)))
938 if(lim_w(2).gt.lim_w(1)) cycle
939
940 !! set gradient bounds
941 lim_g(1) = max(1, i - offset)
942 lim_g(2) = min(this%output_shape(1), i - offset + this%knl(1) - 1)
943
944 !! apply full convolution to compute input gradients
945 this%di(i,m,s) = &
946 this%di(i,m,s) + &
947 sum( &
948 grad_dz( &
949 lim_g(1):lim_g(2),l,s) * &
950 this%weight(&
951 lim_w(1):lim_w(2):-this%stp(1),m,l) )
952
953 end do
954 end if
955
956 end subroutine backward_3d
957 !!!#############################################################################
958
959
87/130
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 7 times.
✓ Branch 8 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 7 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 9 times.
✓ Branch 16 taken 1 times.
✓ Branch 17 taken 8 times.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 7 times.
✓ Branch 20 taken 1 times.
✓ Branch 21 taken 1 times.
✓ Branch 22 taken 7 times.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 7 times.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 6 times.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 6 times.
✓ Branch 29 taken 1 times.
✓ Branch 30 taken 6 times.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 6 times.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 6 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 40 taken 4 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 2 times.
✓ Branch 43 taken 9 times.
✓ Branch 44 taken 2 times.
✓ Branch 45 taken 4 times.
✓ Branch 46 taken 9 times.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 6 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✓ Branch 56 taken 2 times.
✗ Branch 57 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 4 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✓ Branch 70 taken 4 times.
✓ Branch 71 taken 4 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 2 times.
✓ Branch 74 taken 2 times.
✓ Branch 75 taken 4 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 2 times.
✓ Branch 78 taken 2 times.
✓ Branch 79 taken 4 times.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✓ Branch 82 taken 4 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 4 times.
✓ Branch 86 taken 4 times.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✓ Branch 89 taken 4 times.
✓ Branch 90 taken 4 times.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✓ Branch 93 taken 4 times.
✓ Branch 94 taken 4 times.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✓ Branch 97 taken 4 times.
✓ Branch 98 taken 4 times.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✓ Branch 101 taken 4 times.
✓ Branch 102 taken 4 times.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✓ Branch 105 taken 4 times.
✓ Branch 106 taken 4 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 2 times.
✓ Branch 109 taken 2 times.
✓ Branch 110 taken 4 times.
✗ Branch 111 not taken.
✓ Branch 112 taken 3 times.
✓ Branch 113 taken 1 times.
✓ Branch 114 taken 4 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 2 times.
✓ Branch 117 taken 2 times.
✓ Branch 118 taken 4 times.
✗ Branch 119 not taken.
✓ Branch 120 taken 3 times.
✓ Branch 121 taken 1 times.
✓ Branch 122 taken 4 times.
✗ Branch 123 not taken.
✓ Branch 124 taken 3 times.
✓ Branch 125 taken 1 times.
✓ Branch 126 taken 4 times.
✗ Branch 127 not taken.
✓ Branch 128 taken 3 times.
✓ Branch 129 taken 1 times.
✓ Branch 130 taken 4 times.
✗ Branch 131 not taken.
✓ Branch 132 taken 3 times.
✓ Branch 133 taken 1 times.
47 end module conv1d_layer
960 !!!#############################################################################
961