GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_conv3d_layer.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 233 352 66.2%
Functions: 0 0 -%
Branches: 2058 4110 50.1%

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