| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | module athena__onnx_creators | ||
| 2 | !! Module containing ONNX layer creator functions | ||
| 3 | use coreutils, only: real32, stop_program, icount | ||
| 4 | use athena__base_layer, only: base_layer_type | ||
| 5 | use athena__avgpool1d_layer, only: avgpool1d_layer_type | ||
| 6 | use athena__avgpool2d_layer, only: avgpool2d_layer_type | ||
| 7 | use athena__avgpool3d_layer, only: avgpool3d_layer_type | ||
| 8 | use athena__batchnorm1d_layer, only: batchnorm1d_layer_type | ||
| 9 | use athena__batchnorm2d_layer, only: batchnorm2d_layer_type | ||
| 10 | use athena__batchnorm3d_layer, only: batchnorm3d_layer_type | ||
| 11 | use athena__conv1d_layer, only: conv1d_layer_type | ||
| 12 | use athena__conv2d_layer, only: conv2d_layer_type | ||
| 13 | use athena__conv3d_layer, only: conv3d_layer_type | ||
| 14 | use athena__pad1d_layer, only: pad1d_layer_type | ||
| 15 | use athena__pad2d_layer, only: pad2d_layer_type | ||
| 16 | use athena__pad3d_layer, only: pad3d_layer_type | ||
| 17 | use athena__maxpool1d_layer, only: maxpool1d_layer_type | ||
| 18 | use athena__maxpool2d_layer, only: maxpool2d_layer_type | ||
| 19 | use athena__maxpool3d_layer, only: maxpool3d_layer_type | ||
| 20 | |||
| 21 | use athena__misc_types, only: & | ||
| 22 | onnx_node_type, onnx_initialiser_type, onnx_tensor_type | ||
| 23 | use athena__onnx_nop_utils, only: parse_nop_metadata, extract_nop_prefix, & | ||
| 24 | load_nop_param_from_inits, find_onnx_expanded_node_by_suffix, & | ||
| 25 | find_node_initialiser_index, detect_onnx_expanded_nop_activation, & | ||
| 26 | load_onnx_expanded_matrix_param | ||
| 27 | use athena__onnx_utils, only: row_to_col_major_2d, & | ||
| 28 | parse_space_separated_ints | ||
| 29 | implicit none | ||
| 30 | |||
| 31 | |||
| 32 | private | ||
| 33 | |||
| 34 | public :: create_from_onnx_avgpool_layer | ||
| 35 | public :: create_from_onnx_batchnorm_layer | ||
| 36 | public :: create_from_onnx_conv_layer | ||
| 37 | public :: create_from_onnx_maxpool_layer | ||
| 38 | public :: create_from_onnx_pad_layer | ||
| 39 | public :: create_from_onnx_duvenaud_layer | ||
| 40 | public :: create_from_onnx_kipf_layer | ||
| 41 | public :: create_from_onnx_dynamic_lno_layer | ||
| 42 | public :: create_from_onnx_fixed_lno_layer | ||
| 43 | public :: create_from_onnx_neural_operator_layer | ||
| 44 | public :: create_from_onnx_orthogonal_nop_layer | ||
| 45 | public :: create_from_onnx_orthogonal_attention_layer | ||
| 46 | public :: classify_dynamic_lno_onnx_expanded_nop | ||
| 47 | public :: build_dynamic_lno_onnx_expanded_nop | ||
| 48 | public :: classify_fixed_lno_onnx_expanded_nop | ||
| 49 | public :: build_fixed_lno_onnx_expanded_nop | ||
| 50 | public :: classify_neural_operator_onnx_expanded_nop | ||
| 51 | public :: build_neural_operator_onnx_expanded_nop | ||
| 52 | public :: classify_spectral_filter_onnx_expanded_nop | ||
| 53 | public :: build_spectral_filter_onnx_expanded_nop | ||
| 54 | public :: classify_kipf_onnx_expanded_gnn | ||
| 55 | public :: build_kipf_onnx_expanded_gnn | ||
| 56 | public :: classify_duvenaud_onnx_expanded_gnn | ||
| 57 | public :: build_duvenaud_onnx_expanded_gnn | ||
| 58 | |||
| 59 | |||
| 60 | |||
| 61 | contains | ||
| 62 | |||
| 63 | !############################################################################### | ||
| 64 | ✗ | function create_from_onnx_avgpool_layer( & | |
| 65 | ✗ | node, initialisers, value_info, verbose & | |
| 66 | ✗ | ) result(layer) | |
| 67 | !! Build avgpool layer from attributes and return layer | ||
| 68 | implicit none | ||
| 69 | |||
| 70 | ! Arguments | ||
| 71 | type(onnx_node_type), intent(in) :: node | ||
| 72 | !! ONNX node information | ||
| 73 | type(onnx_initialiser_type), dimension(:), intent(in) :: initialisers | ||
| 74 | !! ONNX initialiser information | ||
| 75 | type(onnx_tensor_type), dimension(:), intent(in) :: value_info | ||
| 76 | !! ONNX value info information | ||
| 77 | integer, optional, intent(in) :: verbose | ||
| 78 | !! Verbosity level | ||
| 79 | class(base_layer_type), allocatable :: layer | ||
| 80 | !! Instance of the 2D convolutional layer | ||
| 81 | |||
| 82 | ! Local variables | ||
| 83 | integer :: i, dim | ||
| 84 | !! Loop variable and data rank | ||
| 85 | integer :: verbose_ = 0 | ||
| 86 | !! Verbosity level | ||
| 87 | |||
| 88 | ✗ | if(present(verbose)) verbose_ = verbose | |
| 89 | ✗ | dim = size(value_info(1)%dims) - 2 | |
| 90 | |||
| 91 | ✗ | select case(dim) | |
| 92 | case(1) | ||
| 93 | ✗ | allocate(layer, source=avgpool1d_layer_type()) | |
| 94 | case(2) | ||
| 95 | ✗ | allocate(layer, source=avgpool2d_layer_type()) | |
| 96 | case(3) | ||
| 97 | ✗ | allocate(layer, source=avgpool3d_layer_type()) | |
| 98 | case default | ||
| 99 | call stop_program("create_from_onnx_avgpool_layer: " // & | ||
| 100 | ✗ | "unsupported pooling dimension") | |
| 101 | end select | ||
| 102 | ✗ | call layer%build_from_onnx(node, initialisers, value_info, verbose=verbose_) | |
| 103 | |||
| 104 | ✗ | end function create_from_onnx_avgpool_layer | |
| 105 | !############################################################################### | ||
| 106 | |||
| 107 | |||
| 108 | !############################################################################### | ||
| 109 | ✗ | function create_from_onnx_batchnorm_layer( & | |
| 110 | ✗ | node, initialisers, value_info, verbose & | |
| 111 | ✗ | ) result(layer) | |
| 112 | !! Build batchnorm layer from attributes and return layer | ||
| 113 | implicit none | ||
| 114 | |||
| 115 | ! Arguments | ||
| 116 | type(onnx_node_type), intent(in) :: node | ||
| 117 | !! ONNX node information | ||
| 118 | type(onnx_initialiser_type), dimension(:), intent(in) :: initialisers | ||
| 119 | !! ONNX initialiser information | ||
| 120 | type(onnx_tensor_type), dimension(:), intent(in) :: value_info | ||
| 121 | !! ONNX value info information | ||
| 122 | integer, optional, intent(in) :: verbose | ||
| 123 | !! Verbosity level | ||
| 124 | class(base_layer_type), allocatable :: layer | ||
| 125 | !! Instance of the batch normalisation layer | ||
| 126 | |||
| 127 | ! Local variables | ||
| 128 | integer :: i, dim | ||
| 129 | !! Loop variable and data rank | ||
| 130 | integer :: verbose_ = 0 | ||
| 131 | !! Verbosity level | ||
| 132 | |||
| 133 | ✗ | if(present(verbose)) verbose_ = verbose | |
| 134 | ✗ | dim = size(value_info(1)%dims) - 2 | |
| 135 | |||
| 136 | ✗ | select case(dim) | |
| 137 | case(0) | ||
| 138 | ✗ | allocate(layer, source=batchnorm1d_layer_type()) | |
| 139 | case(2) | ||
| 140 | ✗ | allocate(layer, source=batchnorm2d_layer_type()) | |
| 141 | case(3) | ||
| 142 | ✗ | allocate(layer, source=batchnorm3d_layer_type()) | |
| 143 | case default | ||
| 144 | call stop_program("create_from_onnx_batchnorm_layer: " // & | ||
| 145 | ✗ | "unsupported batchnorm dimension") | |
| 146 | end select | ||
| 147 | ✗ | call layer%build_from_onnx(node, initialisers, value_info, verbose=verbose_) | |
| 148 | |||
| 149 | ✗ | end function create_from_onnx_batchnorm_layer | |
| 150 | !############################################################################### | ||
| 151 | |||
| 152 | |||
| 153 | !############################################################################### | ||
| 154 | 1 | function create_from_onnx_conv_layer( & | |
| 155 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | node, initialisers, value_info, verbose & |
| 156 | 1 | ) result(layer) | |
| 157 | !! Build conv layer from attributes and return layer | ||
| 158 | implicit none | ||
| 159 | |||
| 160 | ! Arguments | ||
| 161 | type(onnx_node_type), intent(in) :: node | ||
| 162 | !! ONNX node information | ||
| 163 | type(onnx_initialiser_type), dimension(:), intent(in) :: initialisers | ||
| 164 | !! ONNX initialiser information | ||
| 165 | type(onnx_tensor_type), dimension(:), intent(in) :: value_info | ||
| 166 | !! ONNX value info information | ||
| 167 | integer, optional, intent(in) :: verbose | ||
| 168 | !! Verbosity level | ||
| 169 | class(base_layer_type), allocatable :: layer | ||
| 170 | !! Instance of the 2D convolutional layer | ||
| 171 | |||
| 172 | ! Local variables | ||
| 173 | integer :: i, dim | ||
| 174 | !! Loop variable and data rank | ||
| 175 | integer :: verbose_ = 0 | ||
| 176 | !! Verbosity level | ||
| 177 | |||
| 178 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(present(verbose)) verbose_ = verbose |
| 179 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | dim = size(value_info(1)%dims) - 2 |
| 180 | |||
| 181 | ✗ | select case(dim) | |
| 182 | case(1) | ||
| 183 | ✗ | allocate(layer, source=conv1d_layer_type()) | |
| 184 | case(2) | ||
| 185 |
25/172✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 times.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 72 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 1 times.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 79 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 1 times.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 99 not taken.
✓ Branch 100 taken 1 times.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✓ Branch 169 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 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
|
1 | allocate(layer, source=conv2d_layer_type()) |
| 186 | case(3) | ||
| 187 | ✗ | allocate(layer, source=conv3d_layer_type()) | |
| 188 | case default | ||
| 189 | call stop_program("create_from_onnx_conv_layer: " // & | ||
| 190 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1 | "unsupported convolution dimension") |
| 191 | end select | ||
| 192 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
|
1 | call layer%build_from_onnx(node, initialisers, value_info, verbose=verbose_) |
| 193 | |||
| 194 | 1 | end function create_from_onnx_conv_layer | |
| 195 | !############################################################################### | ||
| 196 | |||
| 197 | |||
| 198 | !############################################################################### | ||
| 199 | 1 | function create_from_onnx_maxpool_layer( & | |
| 200 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | node, initialisers, value_info, verbose & |
| 201 | 1 | ) result(layer) | |
| 202 | !! Build maxpool layer from attributes and return layer | ||
| 203 | implicit none | ||
| 204 | |||
| 205 | ! Arguments | ||
| 206 | type(onnx_node_type), intent(in) :: node | ||
| 207 | !! ONNX node information | ||
| 208 | type(onnx_initialiser_type), dimension(:), intent(in) :: initialisers | ||
| 209 | !! ONNX initialiser information | ||
| 210 | type(onnx_tensor_type), dimension(:), intent(in) :: value_info | ||
| 211 | !! ONNX value info information | ||
| 212 | integer, optional, intent(in) :: verbose | ||
| 213 | !! Verbosity level | ||
| 214 | class(base_layer_type), allocatable :: layer | ||
| 215 | !! Instance of the 2D convolutional layer | ||
| 216 | |||
| 217 | ! Local variables | ||
| 218 | integer :: i, dim | ||
| 219 | !! Loop variable and data rank | ||
| 220 | integer :: verbose_ = 0 | ||
| 221 | !! Verbosity level | ||
| 222 | |||
| 223 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(present(verbose)) verbose_ = verbose |
| 224 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | dim = size(value_info(1)%dims) - 2 |
| 225 | |||
| 226 | ✗ | select case(dim) | |
| 227 | case(1) | ||
| 228 | ✗ | allocate(layer, source=maxpool1d_layer_type()) | |
| 229 | case(2) | ||
| 230 |
12/128✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✓ Branch 57 taken 1 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
|
1 | allocate(layer, source=maxpool2d_layer_type()) |
| 231 | case(3) | ||
| 232 | ✗ | allocate(layer, source=maxpool3d_layer_type()) | |
| 233 | case default | ||
| 234 | call stop_program("create_from_onnx_maxpool_layer: " // & | ||
| 235 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1 | "unsupported pooling dimension") |
| 236 | end select | ||
| 237 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
|
1 | call layer%build_from_onnx(node, initialisers, value_info, verbose=verbose_) |
| 238 | |||
| 239 | 1 | end function create_from_onnx_maxpool_layer | |
| 240 | !############################################################################### | ||
| 241 | |||
| 242 | |||
| 243 | !############################################################################### | ||
| 244 | ✗ | function create_from_onnx_pad_layer( & | |
| 245 | ✗ | node, initialisers, value_info, verbose & | |
| 246 | ✗ | ) result(layer) | |
| 247 | !! Build pad layer from attributes and return layer | ||
| 248 | implicit none | ||
| 249 | |||
| 250 | ! Arguments | ||
| 251 | type(onnx_node_type), intent(in) :: node | ||
| 252 | !! ONNX node information | ||
| 253 | type(onnx_initialiser_type), dimension(:), intent(in) :: initialisers | ||
| 254 | !! ONNX initialiser information | ||
| 255 | type(onnx_tensor_type), dimension(:), intent(in) :: value_info | ||
| 256 | !! ONNX value info information | ||
| 257 | integer, optional, intent(in) :: verbose | ||
| 258 | !! Verbosity level | ||
| 259 | class(base_layer_type), allocatable :: layer | ||
| 260 | !! Instance of the pad layer | ||
| 261 | |||
| 262 | ! Local variables | ||
| 263 | integer :: i, dim | ||
| 264 | !! Loop variable and data rank | ||
| 265 | integer :: verbose_ = 0 | ||
| 266 | !! Verbosity level | ||
| 267 | |||
| 268 | ✗ | if(present(verbose)) verbose_ = verbose | |
| 269 | ✗ | dim = size(value_info(1)%dims) - 2 | |
| 270 | |||
| 271 | ✗ | select case(dim) | |
| 272 | case(1) | ||
| 273 | ✗ | allocate(layer, source=pad1d_layer_type(padding=[0], method="valid")) | |
| 274 | case(2) | ||
| 275 | ✗ | allocate(layer, source=pad2d_layer_type(padding=[0], method="valid")) | |
| 276 | case(3) | ||
| 277 | ✗ | allocate(layer, source=pad3d_layer_type(padding=[0], method="valid")) | |
| 278 | case default | ||
| 279 | call stop_program("create_from_onnx_pad_layer: " // & | ||
| 280 | ✗ | "unsupported pad dimension") | |
| 281 | end select | ||
| 282 | ✗ | call layer%build_from_onnx(node, initialisers, value_info, verbose=verbose_) | |
| 283 | |||
| 284 | ✗ | end function create_from_onnx_pad_layer | |
| 285 | !############################################################################### | ||
| 286 | |||
| 287 | |||
| 288 | !############################################################################### | ||
| 289 | 1 | function create_from_onnx_duvenaud_layer( & | |
| 290 | 1 | meta_key, meta_value, inits, verbose & | |
| 291 | 1 | ) result(layer) | |
| 292 | !! Build Duvenaud message-passing layer from ONNX metadata and return layer | ||
| 293 | use athena__duvenaud_msgpass_layer, only: duvenaud_msgpass_layer_type | ||
| 294 | use athena__onnx_utils, only: row_to_col_major_2d, & | ||
| 295 | parse_space_separated_ints | ||
| 296 | implicit none | ||
| 297 | |||
| 298 | ! Arguments | ||
| 299 | character(*), intent(in) :: meta_key | ||
| 300 | !! GNN metadata key (e.g. "athena_gnn_node_1") | ||
| 301 | character(*), intent(in) :: meta_value | ||
| 302 | !! Semicolon-separated GNN metadata value string | ||
| 303 | type(onnx_initialiser_type), dimension(:), intent(in) :: inits | ||
| 304 | !! ONNX initialisers (valid entries only) | ||
| 305 | integer, optional, intent(in) :: verbose | ||
| 306 | !! Verbosity level | ||
| 307 | class(base_layer_type), allocatable :: layer | ||
| 308 | !! Constructed Duvenaud message-passing layer | ||
| 309 | |||
| 310 | ! Local variables | ||
| 311 | integer :: nts, n_out, min_deg, max_deg, num_deg | ||
| 312 | 1 | integer, allocatable :: nv_arr(:), ne_arr(:) | |
| 313 | character(64) :: msg_activation | ||
| 314 | character(128) :: gnn_prefix | ||
| 315 | integer :: t, k, pos, pos2, verbose_ | ||
| 316 | character(256) :: meta_str, token, key, val | ||
| 317 | character(128) :: init_prefix | ||
| 318 | 1 | real(real32), allocatable :: col_data(:) | |
| 319 | |||
| 320 | 1 | verbose_ = 0 | |
| 321 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(present(verbose)) verbose_ = verbose |
| 322 | |||
| 323 | ! Parse hyperparameters from the metadata value string | ||
| 324 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | meta_str = meta_value |
| 325 | 1 | nts = 1 | |
| 326 | 1 | min_deg = 1 | |
| 327 | 1 | max_deg = 10 | |
| 328 | 1 | n_out = 1 | |
| 329 | 1 | msg_activation = 'sigmoid' | |
| 330 | |||
| 331 | 1 | pos = 1 | |
| 332 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8 times.
|
9 | do while(pos .le. len_trim(meta_str)) |
| 333 |
2/4✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
|
8 | pos2 = index(meta_str(pos:), ';') |
| 334 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
|
8 | if(pos2 .eq. 0)then |
| 335 |
5/10✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
|
1 | token = meta_str(pos:len_trim(meta_str)) |
| 336 | 1 | pos = len_trim(meta_str) + 1 | |
| 337 | else | ||
| 338 |
5/10✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 7 times.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
|
7 | token = meta_str(pos:pos+pos2-2) |
| 339 | 7 | pos = pos + pos2 | |
| 340 | end if | ||
| 341 | 8 | k = index(token, '=') | |
| 342 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | if(k .eq. 0) cycle |
| 343 |
4/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
|
8 | key = trim(adjustl(token(1:k-1))) |
| 344 |
4/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
|
8 | val = trim(adjustl(token(k+1:))) |
| 345 | 16 | select case(trim(key)) | |
| 346 | case('num_time_steps') | ||
| 347 | 1 | read(val, *) nts | |
| 348 | case('min_vertex_degree') | ||
| 349 | 1 | read(val, *) min_deg | |
| 350 | case('max_vertex_degree') | ||
| 351 | 1 | read(val, *) max_deg | |
| 352 | case('num_vertex_features') | ||
| 353 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | call parse_space_separated_ints(val, nv_arr) |
| 354 | case('num_edge_features') | ||
| 355 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | call parse_space_separated_ints(val, ne_arr) |
| 356 | case('num_outputs') | ||
| 357 | 1 | read(val, *) n_out | |
| 358 | case('message_activation') | ||
| 359 |
11/14✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 1 times.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
16 | msg_activation = trim(val) |
| 360 | end select | ||
| 361 | end do | ||
| 362 | |||
| 363 |
1/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | if(.not.allocated(nv_arr)) allocate(nv_arr(1), source=1) |
| 364 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
1 | if(.not.allocated(ne_arr)) allocate(ne_arr(1), source=0) |
| 365 | 1 | num_deg = max_deg - min_deg + 1 | |
| 366 | |||
| 367 | ! Derive initialiser name prefix from the metadata key | ||
| 368 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | gnn_prefix = trim(meta_key) |
| 369 | 1 | pos = index(gnn_prefix, 'athena_gnn_') | |
| 370 |
4/8✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
1 | if(pos .gt. 0) gnn_prefix = gnn_prefix(pos+11:) |
| 371 | |||
| 372 | 1 | block | |
| 373 | 1 | type(duvenaud_msgpass_layer_type) :: duvenaud_layer | |
| 374 | |||
| 375 | duvenaud_layer = duvenaud_msgpass_layer_type( & | ||
| 376 | num_vertex_features = nv_arr, & | ||
| 377 | num_edge_features = ne_arr, & | ||
| 378 | num_time_steps = nts, & | ||
| 379 | num_outputs = n_out, & | ||
| 380 | min_vertex_degree = min_deg, & | ||
| 381 | max_vertex_degree = max_deg, & | ||
| 382 | message_activation = msg_activation & | ||
| 383 |
64/380✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✓ Branch 117 taken 1 times.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✓ Branch 135 taken 1 times.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✓ Branch 138 taken 1 times.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✓ Branch 169 taken 1 times.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✓ Branch 172 taken 1 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 1 times.
✓ Branch 177 taken 1 times.
✓ Branch 178 taken 1 times.
✓ Branch 180 taken 1 times.
✗ Branch 181 not taken.
✓ Branch 182 taken 1 times.
✗ Branch 183 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✓ Branch 187 taken 1 times.
✓ Branch 188 taken 1 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 4 times.
✓ Branch 191 taken 1 times.
✓ Branch 192 taken 4 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 4 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 2 times.
✓ Branch 197 taken 2 times.
✗ Branch 198 not taken.
✓ Branch 199 taken 4 times.
✗ Branch 200 not taken.
✓ Branch 201 taken 4 times.
✗ Branch 202 not taken.
✓ Branch 203 taken 4 times.
✓ Branch 204 taken 1 times.
✗ Branch 205 not taken.
✗ Branch 207 not taken.
✓ Branch 208 taken 1 times.
✓ Branch 210 taken 1 times.
✗ Branch 211 not taken.
✓ Branch 213 taken 1 times.
✗ Branch 214 not taken.
✓ Branch 215 taken 1 times.
✗ Branch 216 not taken.
✓ Branch 217 taken 1 times.
✗ Branch 218 not taken.
✓ Branch 219 taken 1 times.
✗ Branch 220 not taken.
✗ Branch 222 not taken.
✓ Branch 223 taken 1 times.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
✓ Branch 239 taken 1 times.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✗ Branch 242 not taken.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✓ Branch 255 taken 1 times.
✗ Branch 256 not taken.
✓ Branch 257 taken 1 times.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✗ Branch 260 not taken.
✗ Branch 261 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 264 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 267 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✗ Branch 286 not taken.
✗ Branch 287 not taken.
✗ Branch 288 not taken.
✗ Branch 289 not taken.
✗ Branch 290 not taken.
✗ Branch 291 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 294 not taken.
✓ Branch 295 taken 1 times.
✗ Branch 296 not taken.
✗ Branch 297 not taken.
✗ Branch 298 not taken.
✗ Branch 299 not taken.
✗ Branch 300 not taken.
✗ Branch 301 not taken.
✗ Branch 302 not taken.
✗ Branch 303 not taken.
✗ Branch 304 not taken.
✗ Branch 305 not taken.
✗ Branch 306 not taken.
✗ Branch 307 not taken.
✗ Branch 308 not taken.
✗ Branch 309 not taken.
✗ Branch 310 not taken.
✗ Branch 311 not taken.
✗ Branch 312 not taken.
✓ Branch 313 taken 1 times.
✗ Branch 314 not taken.
✓ Branch 315 taken 1 times.
✗ Branch 316 not taken.
✓ Branch 317 taken 1 times.
✗ Branch 318 not taken.
✓ Branch 319 taken 1 times.
✗ Branch 320 not taken.
✓ Branch 321 taken 1 times.
✗ Branch 322 not taken.
✗ Branch 323 not taken.
✗ Branch 324 not taken.
✗ Branch 325 not taken.
✗ Branch 326 not taken.
✗ Branch 327 not taken.
✗ Branch 328 not taken.
✗ Branch 329 not taken.
✗ Branch 330 not taken.
✗ Branch 331 not taken.
✗ Branch 332 not taken.
✗ Branch 333 not taken.
✗ Branch 334 not taken.
✗ Branch 335 not taken.
✗ Branch 336 not taken.
✗ Branch 337 not taken.
✗ Branch 338 not taken.
✓ Branch 339 taken 1 times.
✗ Branch 340 not taken.
✓ Branch 341 taken 1 times.
✗ Branch 342 not taken.
✓ Branch 343 taken 1 times.
✗ Branch 344 not taken.
✓ Branch 345 taken 1 times.
✗ Branch 346 not taken.
✓ Branch 347 taken 1 times.
✗ Branch 348 not taken.
✓ Branch 349 taken 1 times.
✗ Branch 350 not taken.
✓ Branch 351 taken 1 times.
✗ Branch 352 not taken.
✓ Branch 353 taken 1 times.
✗ Branch 354 not taken.
✗ Branch 355 not taken.
✗ Branch 356 not taken.
✗ Branch 357 not taken.
✗ Branch 358 not taken.
✗ Branch 359 not taken.
✗ Branch 360 not taken.
✗ Branch 361 not taken.
✗ Branch 362 not taken.
✗ Branch 363 not taken.
✗ Branch 364 not taken.
✗ Branch 365 not taken.
✗ Branch 366 not taken.
✗ Branch 367 not taken.
✗ Branch 368 not taken.
✗ Branch 369 not taken.
✗ Branch 370 not taken.
✓ Branch 371 taken 1 times.
✗ Branch 372 not taken.
✗ Branch 373 not taken.
✗ Branch 374 not taken.
✗ Branch 375 not taken.
✗ Branch 376 not taken.
✗ Branch 377 not taken.
✗ Branch 378 not taken.
✗ Branch 379 not taken.
✗ Branch 380 not taken.
✗ Branch 381 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 384 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 387 not taken.
|
8 | ) |
| 384 | |||
| 385 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | do t = 1, nts |
| 386 | ! Message weight: node_X_t{t}_W | ||
| 387 |
1/2✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
|
2 | write(init_prefix, '(A,"_t",I0,"_W")') trim(gnn_prefix), t |
| 388 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
|
3 | do k = 1, size(inits) |
| 389 |
6/10✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 1 times.
|
3 | if(trim(inits(k)%name) .eq. trim(init_prefix))then |
| 390 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
2 | if(allocated(inits(k)%data) .and. & |
| 391 | allocated(duvenaud_layer%params))then | ||
| 392 |
9/18✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
|
2 | allocate(col_data(size(inits(k)%data))) |
| 393 | block | ||
| 394 | integer :: d, slice_size | ||
| 395 |
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 | slice_size = nv_arr(t+1) * (nv_arr(t) + ne_arr(1)) |
| 396 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
|
10 | do d = 1, num_deg |
| 397 | call row_to_col_major_2d( & | ||
| 398 |
2/4✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
|
16 | inits(k)%data((d-1)*slice_size+1:d*slice_size), & |
| 399 | ✗ | col_data((d-1)*slice_size+1:d*slice_size), & | |
| 400 |
16/32✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 8 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 8 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 8 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 8 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 8 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 8 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 8 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 8 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 8 times.
|
26 | nv_arr(t+1), nv_arr(t) + ne_arr(1)) |
| 401 | end do | ||
| 402 | end block | ||
| 403 |
15/28✗ 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 taken 48 times.
✓ Branch 40 taken 2 times.
|
50 | duvenaud_layer%params(t)%val(:,1) = col_data |
| 404 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | deallocate(col_data) |
| 405 | end if | ||
| 406 | 2 | exit | |
| 407 | end if | ||
| 408 | end do | ||
| 409 | |||
| 410 | ! Readout weight: node_X_ro_t{t}_R | ||
| 411 |
1/2✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
|
2 | write(init_prefix, '(A,"_ro_t",I0,"_R")') trim(gnn_prefix), t |
| 412 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
|
8 | do k = 1, size(inits) |
| 413 |
6/10✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 5 times.
|
7 | if(trim(inits(k)%name) .eq. trim(init_prefix))then |
| 414 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
2 | if(allocated(inits(k)%data) .and. & |
| 415 | allocated(duvenaud_layer%params))then | ||
| 416 |
9/18✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
|
2 | allocate(col_data(size(inits(k)%data))) |
| 417 | call row_to_col_major_2d( & | ||
| 418 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
|
2 | inits(k)%data, col_data, n_out, nv_arr(t+1)) |
| 419 |
15/28✗ 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 taken 12 times.
✓ Branch 40 taken 2 times.
|
14 | duvenaud_layer%params(nts + t)%val(:,1) = col_data |
| 420 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
4 | deallocate(col_data) |
| 421 | end if | ||
| 422 | 2 | exit | |
| 423 | end if | ||
| 424 | end do | ||
| 425 | end do | ||
| 426 | |||
| 427 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocate(layer, source=duvenaud_layer) |
| 428 | end block | ||
| 429 | |||
| 430 |
4/8✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
2 | end function create_from_onnx_duvenaud_layer |
| 431 | !############################################################################### | ||
| 432 | |||
| 433 | |||
| 434 | !############################################################################### | ||
| 435 | 3 | function create_from_onnx_kipf_layer( & | |
| 436 | 3 | meta_key, meta_value, inits, verbose & | |
| 437 | 3 | ) result(layer) | |
| 438 | !! Build Kipf GCN layer from ONNX metadata and return layer | ||
| 439 | use athena__kipf_msgpass_layer, only: kipf_msgpass_layer_type | ||
| 440 | use athena__onnx_utils, only: row_to_col_major_2d, & | ||
| 441 | parse_space_separated_ints | ||
| 442 | implicit none | ||
| 443 | |||
| 444 | ! Arguments | ||
| 445 | character(*), intent(in) :: meta_key | ||
| 446 | !! GNN metadata key (e.g. "athena_gnn_node_1") | ||
| 447 | character(*), intent(in) :: meta_value | ||
| 448 | !! Semicolon-separated GNN metadata value string | ||
| 449 | type(onnx_initialiser_type), dimension(:), intent(in) :: inits | ||
| 450 | !! ONNX initialisers (valid entries only) | ||
| 451 | integer, optional, intent(in) :: verbose | ||
| 452 | !! Verbosity level | ||
| 453 | class(base_layer_type), allocatable :: layer | ||
| 454 | !! Constructed Kipf GCN layer | ||
| 455 | |||
| 456 | ! Local variables | ||
| 457 | integer :: nts | ||
| 458 | 3 | integer, allocatable :: nv_arr(:) | |
| 459 | character(64) :: msg_activation | ||
| 460 | character(128) :: gnn_prefix | ||
| 461 | integer :: t, k, pos, pos2, verbose_ | ||
| 462 | character(256) :: meta_str, token, key, val | ||
| 463 | character(128) :: init_prefix | ||
| 464 | 3 | real(real32), allocatable :: col_data(:) | |
| 465 | |||
| 466 | 3 | verbose_ = 0 | |
| 467 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | if(present(verbose)) verbose_ = verbose |
| 468 | |||
| 469 | ! Parse hyperparameters from the metadata value string | ||
| 470 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
3 | meta_str = meta_value |
| 471 | 3 | nts = 1 | |
| 472 | 3 | msg_activation = 'sigmoid' | |
| 473 | |||
| 474 | 3 | pos = 1 | |
| 475 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 12 times.
|
15 | do while(pos .le. len_trim(meta_str)) |
| 476 |
2/4✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
|
12 | pos2 = index(meta_str(pos:), ';') |
| 477 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 9 times.
|
12 | if(pos2 .eq. 0)then |
| 478 |
5/10✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
|
3 | token = meta_str(pos:len_trim(meta_str)) |
| 479 | 3 | pos = len_trim(meta_str) + 1 | |
| 480 | else | ||
| 481 |
5/10✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 9 times.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
|
9 | token = meta_str(pos:pos+pos2-2) |
| 482 | 9 | pos = pos + pos2 | |
| 483 | end if | ||
| 484 | 12 | k = index(token, '=') | |
| 485 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
|
12 | if(k .eq. 0) cycle |
| 486 |
4/8✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 12 times.
✗ Branch 10 not taken.
|
12 | key = trim(adjustl(token(1:k-1))) |
| 487 |
4/8✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 12 times.
✗ Branch 10 not taken.
|
12 | val = trim(adjustl(token(k+1:))) |
| 488 | 24 | select case(trim(key)) | |
| 489 | case('num_time_steps') | ||
| 490 | 3 | read(val, *) nts | |
| 491 | case('num_vertex_features') | ||
| 492 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
3 | call parse_space_separated_ints(val, nv_arr) |
| 493 | case('message_activation') | ||
| 494 |
7/10✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
|
24 | msg_activation = trim(val) |
| 495 | end select | ||
| 496 | end do | ||
| 497 | |||
| 498 |
1/18✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
3 | if(.not.allocated(nv_arr)) allocate(nv_arr(1), source=1) |
| 499 | |||
| 500 | ! Derive initialiser name prefix from the metadata key | ||
| 501 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
|
3 | gnn_prefix = trim(meta_key) |
| 502 | 3 | pos = index(gnn_prefix, 'athena_gnn_') | |
| 503 |
4/8✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
3 | if(pos .gt. 0) gnn_prefix = gnn_prefix(pos+11:) |
| 504 | |||
| 505 | 66 | block | |
| 506 | 3 | type(kipf_msgpass_layer_type) :: kipf_layer | |
| 507 | |||
| 508 | kipf_layer = kipf_msgpass_layer_type( & | ||
| 509 | num_vertex_features = nv_arr, & | ||
| 510 | num_time_steps = nts, & | ||
| 511 | activation = trim(msg_activation) & | ||
| 512 |
82/320✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 3 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 3 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 3 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 3 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 3 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 3 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 71 not taken.
✓ Branch 72 taken 3 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 3 times.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✓ Branch 79 taken 3 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 3 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 3 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 3 times.
✓ Branch 86 taken 3 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 3 times.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✓ Branch 91 taken 3 times.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✓ Branch 123 taken 3 times.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✓ Branch 133 taken 3 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 3 times.
✗ Branch 136 not taken.
✓ Branch 137 taken 3 times.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✓ Branch 140 taken 3 times.
✓ Branch 141 taken 3 times.
✗ Branch 142 not taken.
✓ Branch 143 taken 3 times.
✓ Branch 144 taken 3 times.
✓ Branch 145 taken 3 times.
✗ Branch 146 not taken.
✓ Branch 147 taken 3 times.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✓ Branch 150 taken 3 times.
✗ Branch 151 not taken.
✓ Branch 152 taken 3 times.
✗ Branch 153 not taken.
✓ Branch 154 taken 3 times.
✗ Branch 155 not taken.
✓ Branch 156 taken 3 times.
✓ Branch 157 taken 3 times.
✗ Branch 158 not taken.
✗ Branch 160 not taken.
✓ Branch 161 taken 3 times.
✓ Branch 163 taken 3 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 3 times.
✗ Branch 167 not taken.
✓ Branch 168 taken 3 times.
✗ Branch 169 not taken.
✓ Branch 170 taken 3 times.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✓ Branch 173 taken 3 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 3 times.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✓ Branch 213 taken 3 times.
✗ Branch 215 not taken.
✓ Branch 216 taken 3 times.
✗ Branch 217 not taken.
✓ Branch 218 taken 3 times.
✗ Branch 219 not taken.
✓ Branch 220 taken 3 times.
✗ Branch 221 not taken.
✓ Branch 222 taken 3 times.
✗ Branch 223 not taken.
✓ Branch 224 taken 3 times.
✗ Branch 225 not taken.
✓ Branch 226 taken 3 times.
✗ Branch 228 not taken.
✓ Branch 229 taken 3 times.
✗ Branch 230 not taken.
✓ Branch 231 taken 3 times.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 235 not taken.
✓ Branch 236 taken 3 times.
✗ Branch 237 not taken.
✓ Branch 238 taken 3 times.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 242 not taken.
✓ Branch 243 taken 3 times.
✗ Branch 244 not taken.
✓ Branch 245 taken 3 times.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 249 not taken.
✓ Branch 250 taken 3 times.
✗ Branch 251 not taken.
✓ Branch 252 taken 3 times.
✗ Branch 253 not taken.
✓ Branch 254 taken 3 times.
✗ Branch 255 not taken.
✓ Branch 256 taken 3 times.
✓ Branch 257 taken 3 times.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✓ Branch 260 taken 3 times.
✗ Branch 261 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 264 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 267 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✗ Branch 286 not taken.
✗ Branch 287 not taken.
✗ Branch 288 not taken.
✗ Branch 289 not taken.
✗ Branch 290 not taken.
✗ Branch 291 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 294 not taken.
✗ Branch 295 not taken.
✗ Branch 296 not taken.
✗ Branch 297 not taken.
✓ Branch 298 taken 3 times.
✗ Branch 300 not taken.
✓ Branch 301 taken 3 times.
✓ Branch 302 taken 3 times.
✗ Branch 303 not taken.
✓ Branch 304 taken 3 times.
✗ Branch 305 not taken.
✓ Branch 306 taken 3 times.
✗ Branch 307 not taken.
✗ Branch 308 not taken.
✓ Branch 309 taken 3 times.
✓ Branch 310 taken 3 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 3 times.
✗ Branch 314 not taken.
✓ Branch 315 taken 3 times.
✗ Branch 316 not taken.
✗ Branch 317 not taken.
✓ Branch 318 taken 3 times.
✓ Branch 320 taken 3 times.
✗ Branch 321 not taken.
✗ Branch 322 not taken.
✓ Branch 323 taken 3 times.
✗ Branch 324 not taken.
✗ Branch 325 not taken.
✗ Branch 327 not taken.
✓ Branch 328 taken 3 times.
✓ Branch 329 taken 3 times.
✗ Branch 330 not taken.
✗ Branch 331 not taken.
✓ Branch 332 taken 3 times.
✓ Branch 334 taken 3 times.
✗ Branch 335 not taken.
✓ Branch 336 taken 3 times.
✗ Branch 337 not taken.
✓ Branch 338 taken 3 times.
✗ Branch 339 not taken.
✓ Branch 340 taken 3 times.
✗ Branch 341 not taken.
|
9 | ) |
| 513 | |||
| 514 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
6 | do t = 1, nts |
| 515 | ! Message weight: node_X_t{t}_W | ||
| 516 |
1/2✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
|
3 | write(init_prefix, '(A,"_t",I0,"_W")') trim(gnn_prefix), t |
| 517 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 9 taken 6 times.
✗ Branch 10 not taken.
|
9 | do k = 1, size(inits) |
| 518 |
6/10✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✓ Branch 13 taken 3 times.
|
6 | if(trim(inits(k)%name) .eq. trim(init_prefix))then |
| 519 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
|
3 | if(allocated(inits(k)%data) .and. & |
| 520 | allocated(kipf_layer%params))then | ||
| 521 |
9/18✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
|
3 | allocate(col_data(size(inits(k)%data))) |
| 522 | call row_to_col_major_2d( & | ||
| 523 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
|
3 | inits(k)%data, col_data, nv_arr(t+1), nv_arr(t)) |
| 524 |
15/28✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✓ Branch 39 taken 26 times.
✓ Branch 40 taken 3 times.
|
29 | kipf_layer%params(t)%val(:,1) = col_data |
| 525 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
6 | deallocate(col_data) |
| 526 | end if | ||
| 527 | 3 | exit | |
| 528 | end if | ||
| 529 | end do | ||
| 530 | end do | ||
| 531 | |||
| 532 |
23/84✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 3 times.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✓ Branch 53 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 3 times.
✓ Branch 58 taken 3 times.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 3 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 3 times.
✓ Branch 67 taken 3 times.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✓ Branch 71 taken 3 times.
✓ Branch 72 taken 3 times.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✓ Branch 77 taken 3 times.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✓ Branch 80 taken 3 times.
✓ Branch 81 taken 3 times.
✗ Branch 82 not taken.
✗ Branch 84 not taken.
✓ Branch 85 taken 3 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 3 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 3 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 3 times.
|
69 | allocate(layer, source=kipf_layer) |
| 533 | end block | ||
| 534 | |||
| 535 |
3/6✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
|
6 | end function create_from_onnx_kipf_layer |
| 536 | !############################################################################### | ||
| 537 | |||
| 538 | |||
| 539 | !############################################################################### | ||
| 540 | ! NOP ONNX creators | ||
| 541 | !############################################################################### | ||
| 542 | |||
| 543 | |||
| 544 | !############################################################################### | ||
| 545 | 1 | function create_from_onnx_dynamic_lno_layer( & | |
| 546 | 1 | meta_key, meta_value, inits, verbose & | |
| 547 | 1 | ) result(layer) | |
| 548 | !! Build dynamic LNO layer from ONNX metadata and return layer | ||
| 549 | use athena__dynamic_lno_layer, only: dynamic_lno_layer_type | ||
| 550 | implicit none | ||
| 551 | |||
| 552 | ! Arguments | ||
| 553 | character(*), intent(in) :: meta_key, meta_value | ||
| 554 | !! NOP metadata key/value pair | ||
| 555 | type(onnx_initialiser_type), dimension(:), intent(in) :: inits | ||
| 556 | !! ONNX initialisers containing parameter tensors | ||
| 557 | integer, optional, intent(in) :: verbose | ||
| 558 | !! Verbosity level | ||
| 559 | class(base_layer_type), allocatable :: layer | ||
| 560 | !! Constructed dynamic LNO layer | ||
| 561 | |||
| 562 | ! Local variables | ||
| 563 | integer :: num_inputs, num_outputs, num_modes, verbose_ | ||
| 564 | !! Parsed layer dimensions and effective verbosity level | ||
| 565 | logical :: use_bias | ||
| 566 | !! Whether the imported layer uses bias | ||
| 567 | character(64) :: activation_name, nop_prefix | ||
| 568 | |||
| 569 | 1 | verbose_ = 0 | |
| 570 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(present(verbose)) verbose_ = verbose |
| 571 | |||
| 572 | 1 | num_inputs = 0 | |
| 573 | 1 | num_outputs = 0 | |
| 574 | 1 | num_modes = 0 | |
| 575 | 1 | use_bias = .true. | |
| 576 | 1 | activation_name = 'none' | |
| 577 | |||
| 578 | call parse_nop_metadata(meta_value, & | ||
| 579 | 1 | num_inputs, num_outputs, num_modes, use_bias, activation_name) | |
| 580 | |||
| 581 | 1 | nop_prefix = extract_nop_prefix(meta_key) | |
| 582 | |||
| 583 | 1 | block | |
| 584 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
2 | type(dynamic_lno_layer_type) :: lno_layer |
| 585 | |||
| 586 | lno_layer = dynamic_lno_layer_type( & | ||
| 587 | num_outputs = num_outputs, & | ||
| 588 | num_modes = num_modes, & | ||
| 589 | num_inputs = num_inputs, & | ||
| 590 | use_bias = use_bias, & | ||
| 591 | activation = trim(activation_name) & | ||
| 592 |
70/296✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✓ Branch 92 taken 1 times.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✓ Branch 106 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 1 times.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✓ Branch 146 taken 1 times.
✗ Branch 148 not taken.
✓ Branch 149 taken 1 times.
✓ Branch 151 taken 1 times.
✓ Branch 152 taken 1 times.
✓ Branch 154 taken 1 times.
✗ Branch 155 not taken.
✓ Branch 156 taken 1 times.
✗ Branch 157 not taken.
✓ Branch 158 taken 1 times.
✗ Branch 159 not taken.
✓ Branch 160 taken 1 times.
✗ Branch 161 not taken.
✓ Branch 162 taken 1 times.
✗ Branch 163 not taken.
✓ Branch 164 taken 4 times.
✓ Branch 165 taken 1 times.
✓ Branch 166 taken 4 times.
✗ Branch 167 not taken.
✓ Branch 168 taken 4 times.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✓ Branch 171 taken 4 times.
✗ Branch 172 not taken.
✓ Branch 173 taken 4 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 4 times.
✗ Branch 176 not taken.
✓ Branch 177 taken 4 times.
✓ Branch 178 taken 1 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 1 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 1 times.
✓ Branch 188 taken 1 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 1 times.
✗ Branch 191 not taken.
✓ Branch 192 taken 1 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 1 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 1 times.
✗ Branch 197 not taken.
✓ Branch 198 taken 1 times.
✗ Branch 199 not taken.
✓ Branch 200 taken 1 times.
✗ Branch 201 not taken.
✓ Branch 202 taken 1 times.
✗ Branch 203 not taken.
✓ Branch 204 taken 1 times.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✓ Branch 242 taken 1 times.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✓ Branch 260 taken 1 times.
✗ Branch 261 not taken.
✓ Branch 262 taken 1 times.
✗ Branch 263 not taken.
✓ Branch 264 taken 1 times.
✗ Branch 265 not taken.
✓ Branch 266 taken 1 times.
✗ Branch 267 not taken.
✓ Branch 268 taken 1 times.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✓ Branch 286 taken 1 times.
✗ Branch 287 not taken.
✓ Branch 288 taken 1 times.
✗ Branch 289 not taken.
✓ Branch 290 taken 1 times.
✓ Branch 291 taken 1 times.
✓ Branch 292 taken 1 times.
✗ Branch 293 not taken.
✓ Branch 294 taken 1 times.
✗ Branch 295 not taken.
✓ Branch 296 taken 1 times.
✗ Branch 297 not taken.
✓ Branch 298 taken 1 times.
✗ Branch 299 not taken.
✓ Branch 300 taken 1 times.
✗ Branch 301 not taken.
✓ Branch 302 taken 1 times.
✗ Branch 303 not taken.
✓ Branch 304 taken 1 times.
|
11 | ) |
| 593 | |||
| 594 | ! Load params: (1) mu, (2) beta, (3) W, (4) b | ||
| 595 | call load_nop_param_from_inits( & | ||
| 596 | ✗ | lno_layer%params(1), nop_prefix, '_param1', & | |
| 597 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_modes, 1]) |
| 598 | call load_nop_param_from_inits( & | ||
| 599 | ✗ | lno_layer%params(2), nop_prefix, '_param2', & | |
| 600 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_modes, 1]) |
| 601 | call load_nop_param_from_inits( & | ||
| 602 | ✗ | lno_layer%params(3), nop_prefix, '_param3', & | |
| 603 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_outputs, num_inputs]) |
| 604 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(use_bias)then |
| 605 | call load_nop_param_from_inits( & | ||
| 606 | ✗ | lno_layer%params(4), nop_prefix, '_param4', & | |
| 607 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_outputs, 1]) |
| 608 | end if | ||
| 609 | |||
| 610 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocate(layer, source=lno_layer) |
| 611 | end block | ||
| 612 | |||
| 613 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2 | end function create_from_onnx_dynamic_lno_layer |
| 614 | !############################################################################### | ||
| 615 | |||
| 616 | |||
| 617 | !############################################################################### | ||
| 618 | 1 | function create_from_onnx_fixed_lno_layer( & | |
| 619 | 1 | meta_key, meta_value, inits, verbose & | |
| 620 | 1 | ) result(layer) | |
| 621 | !! Build fixed LNO layer from ONNX metadata and return layer | ||
| 622 | use athena__fixed_lno_layer, only: fixed_lno_layer_type | ||
| 623 | implicit none | ||
| 624 | |||
| 625 | ! Arguments | ||
| 626 | character(*), intent(in) :: meta_key, meta_value | ||
| 627 | !! NOP metadata key/value pair | ||
| 628 | type(onnx_initialiser_type), dimension(:), intent(in) :: inits | ||
| 629 | !! ONNX initialisers containing parameter tensors | ||
| 630 | integer, optional, intent(in) :: verbose | ||
| 631 | !! Verbosity level | ||
| 632 | class(base_layer_type), allocatable :: layer | ||
| 633 | !! Constructed fixed LNO layer | ||
| 634 | |||
| 635 | ! Local variables | ||
| 636 | integer :: num_inputs, num_outputs, num_modes, verbose_ | ||
| 637 | !! Parsed layer dimensions and effective verbosity level | ||
| 638 | logical :: use_bias | ||
| 639 | !! Whether the imported layer uses bias | ||
| 640 | character(64) :: activation_name, nop_prefix | ||
| 641 | |||
| 642 | 1 | verbose_ = 0 | |
| 643 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(present(verbose)) verbose_ = verbose |
| 644 | |||
| 645 | 1 | num_inputs = 0; num_outputs = 0; num_modes = 0 | |
| 646 | 1 | use_bias = .true.; activation_name = 'none' | |
| 647 | |||
| 648 | call parse_nop_metadata(meta_value, & | ||
| 649 | 1 | num_inputs, num_outputs, num_modes, use_bias, activation_name) | |
| 650 | |||
| 651 | 1 | nop_prefix = extract_nop_prefix(meta_key) | |
| 652 | |||
| 653 | 1 | block | |
| 654 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
2 | type(fixed_lno_layer_type) :: lno_layer |
| 655 | |||
| 656 | lno_layer = fixed_lno_layer_type( & | ||
| 657 | num_outputs = num_outputs, & | ||
| 658 | num_modes = num_modes, & | ||
| 659 | num_inputs = num_inputs, & | ||
| 660 | use_bias = use_bias, & | ||
| 661 | activation = trim(activation_name) & | ||
| 662 |
192/654✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 107 taken 1 times.
✗ Branch 108 not taken.
✓ Branch 109 taken 1 times.
✗ Branch 110 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 113 taken 1 times.
✗ Branch 114 not taken.
✓ Branch 115 taken 1 times.
✓ Branch 116 taken 1 times.
✓ Branch 117 taken 1 times.
✗ Branch 118 not taken.
✓ Branch 119 taken 1 times.
✗ Branch 120 not taken.
✓ Branch 121 taken 1 times.
✗ Branch 122 not taken.
✓ Branch 123 taken 1 times.
✗ Branch 124 not taken.
✓ Branch 125 taken 1 times.
✗ Branch 126 not taken.
✓ Branch 127 taken 1 times.
✗ Branch 128 not taken.
✓ Branch 129 taken 1 times.
✓ Branch 130 taken 1 times.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✓ Branch 133 taken 1 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 1 times.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✓ Branch 167 taken 1 times.
✗ Branch 168 not taken.
✗ Branch 169 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 177 not taken.
✓ Branch 178 taken 1 times.
✗ Branch 179 not taken.
✓ Branch 180 taken 1 times.
✗ Branch 181 not taken.
✓ Branch 182 taken 1 times.
✗ Branch 183 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✓ Branch 186 taken 1 times.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✓ Branch 202 taken 1 times.
✗ Branch 204 not taken.
✓ Branch 205 taken 1 times.
✗ Branch 207 not taken.
✓ Branch 208 taken 1 times.
✗ Branch 210 not taken.
✓ Branch 211 taken 1 times.
✗ Branch 212 not taken.
✓ Branch 213 taken 1 times.
✗ Branch 214 not taken.
✓ Branch 215 taken 1 times.
✗ Branch 216 not taken.
✓ Branch 217 taken 1 times.
✗ Branch 218 not taken.
✓ Branch 219 taken 1 times.
✗ Branch 220 not taken.
✓ Branch 221 taken 1 times.
✗ Branch 222 not taken.
✓ Branch 223 taken 1 times.
✗ Branch 224 not taken.
✓ Branch 225 taken 1 times.
✗ Branch 226 not taken.
✓ Branch 227 taken 1 times.
✗ Branch 228 not taken.
✓ Branch 229 taken 1 times.
✗ Branch 230 not taken.
✓ Branch 231 taken 1 times.
✗ Branch 232 not taken.
✓ Branch 233 taken 1 times.
✓ Branch 234 taken 1 times.
✓ Branch 235 taken 1 times.
✗ Branch 236 not taken.
✓ Branch 237 taken 1 times.
✗ Branch 238 not taken.
✓ Branch 239 taken 1 times.
✗ Branch 240 not taken.
✓ Branch 241 taken 1 times.
✗ Branch 242 not taken.
✓ Branch 243 taken 1 times.
✗ Branch 244 not taken.
✓ Branch 245 taken 1 times.
✗ Branch 246 not taken.
✓ Branch 247 taken 1 times.
✗ Branch 248 not taken.
✓ Branch 249 taken 1 times.
✗ Branch 250 not taken.
✓ Branch 251 taken 1 times.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✗ Branch 260 not taken.
✗ Branch 261 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 264 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 267 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✗ Branch 286 not taken.
✗ Branch 287 not taken.
✗ Branch 288 not taken.
✓ Branch 289 taken 1 times.
✗ Branch 290 not taken.
✗ Branch 291 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 294 not taken.
✗ Branch 295 not taken.
✗ Branch 296 not taken.
✗ Branch 297 not taken.
✗ Branch 298 not taken.
✗ Branch 299 not taken.
✗ Branch 300 not taken.
✗ Branch 301 not taken.
✗ Branch 302 not taken.
✗ Branch 303 not taken.
✗ Branch 304 not taken.
✗ Branch 305 not taken.
✗ Branch 306 not taken.
✓ Branch 307 taken 1 times.
✗ Branch 308 not taken.
✓ Branch 309 taken 1 times.
✗ Branch 310 not taken.
✓ Branch 311 taken 1 times.
✗ Branch 312 not taken.
✓ Branch 313 taken 1 times.
✗ Branch 314 not taken.
✓ Branch 315 taken 1 times.
✗ Branch 316 not taken.
✗ Branch 317 not taken.
✗ Branch 318 not taken.
✗ Branch 319 not taken.
✗ Branch 320 not taken.
✗ Branch 321 not taken.
✗ Branch 322 not taken.
✗ Branch 323 not taken.
✗ Branch 324 not taken.
✗ Branch 325 not taken.
✗ Branch 326 not taken.
✗ Branch 327 not taken.
✗ Branch 328 not taken.
✗ Branch 329 not taken.
✗ Branch 330 not taken.
✗ Branch 331 not taken.
✗ Branch 332 not taken.
✓ Branch 333 taken 1 times.
✗ Branch 334 not taken.
✓ Branch 335 taken 1 times.
✗ Branch 336 not taken.
✓ Branch 337 taken 1 times.
✗ Branch 338 not taken.
✓ Branch 339 taken 1 times.
✗ Branch 340 not taken.
✓ Branch 341 taken 1 times.
✗ Branch 342 not taken.
✓ Branch 343 taken 1 times.
✗ Branch 344 not taken.
✓ Branch 345 taken 1 times.
✗ Branch 346 not taken.
✓ Branch 347 taken 1 times.
✗ Branch 348 not taken.
✓ Branch 349 taken 1 times.
✗ Branch 350 not taken.
✓ Branch 351 taken 1 times.
✗ Branch 352 not taken.
✓ Branch 353 taken 1 times.
✗ Branch 354 not taken.
✓ Branch 355 taken 1 times.
✗ Branch 356 not taken.
✓ Branch 357 taken 1 times.
✗ Branch 358 not taken.
✓ Branch 359 taken 1 times.
✗ Branch 360 not taken.
✓ Branch 361 taken 1 times.
✓ Branch 362 taken 1 times.
✓ Branch 363 taken 1 times.
✗ Branch 364 not taken.
✓ Branch 365 taken 1 times.
✗ Branch 366 not taken.
✓ Branch 367 taken 1 times.
✗ Branch 368 not taken.
✓ Branch 369 taken 1 times.
✗ Branch 370 not taken.
✓ Branch 371 taken 1 times.
✗ Branch 372 not taken.
✓ Branch 373 taken 1 times.
✗ Branch 374 not taken.
✓ Branch 375 taken 1 times.
✓ Branch 377 taken 1 times.
✗ Branch 378 not taken.
✗ Branch 379 not taken.
✓ Branch 380 taken 1 times.
✗ Branch 381 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 384 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 387 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✗ Branch 390 not taken.
✗ Branch 391 not taken.
✗ Branch 392 not taken.
✗ Branch 393 not taken.
✗ Branch 394 not taken.
✗ Branch 395 not taken.
✗ Branch 396 not taken.
✗ Branch 397 not taken.
✗ Branch 398 not taken.
✗ Branch 399 not taken.
✗ Branch 400 not taken.
✗ Branch 401 not taken.
✗ Branch 402 not taken.
✗ Branch 403 not taken.
✗ Branch 404 not taken.
✗ Branch 405 not taken.
✗ Branch 406 not taken.
✗ Branch 407 not taken.
✗ Branch 408 not taken.
✗ Branch 409 not taken.
✗ Branch 410 not taken.
✓ Branch 411 taken 1 times.
✗ Branch 412 not taken.
✗ Branch 413 not taken.
✓ Branch 414 taken 1 times.
✗ Branch 416 not taken.
✓ Branch 417 taken 1 times.
✓ Branch 419 taken 1 times.
✓ Branch 420 taken 1 times.
✓ Branch 422 taken 1 times.
✗ Branch 423 not taken.
✓ Branch 424 taken 1 times.
✗ Branch 425 not taken.
✓ Branch 426 taken 1 times.
✗ Branch 427 not taken.
✓ Branch 428 taken 1 times.
✗ Branch 429 not taken.
✓ Branch 430 taken 1 times.
✗ Branch 431 not taken.
✓ Branch 432 taken 3 times.
✓ Branch 433 taken 1 times.
✓ Branch 434 taken 3 times.
✗ Branch 435 not taken.
✓ Branch 436 taken 3 times.
✗ Branch 437 not taken.
✗ Branch 438 not taken.
✓ Branch 439 taken 3 times.
✗ Branch 440 not taken.
✓ Branch 441 taken 3 times.
✗ Branch 442 not taken.
✓ Branch 443 taken 3 times.
✗ Branch 444 not taken.
✓ Branch 445 taken 3 times.
✓ Branch 446 taken 1 times.
✗ Branch 447 not taken.
✓ Branch 449 taken 1 times.
✗ Branch 450 not taken.
✓ Branch 452 taken 1 times.
✗ Branch 453 not taken.
✓ Branch 455 taken 1 times.
✗ Branch 456 not taken.
✓ Branch 457 taken 1 times.
✗ Branch 458 not taken.
✗ Branch 459 not taken.
✓ Branch 460 taken 1 times.
✗ Branch 461 not taken.
✓ Branch 462 taken 1 times.
✗ Branch 463 not taken.
✓ Branch 464 taken 1 times.
✗ Branch 465 not taken.
✓ Branch 466 taken 1 times.
✓ Branch 467 taken 1 times.
✗ Branch 468 not taken.
✓ Branch 469 taken 1 times.
✗ Branch 470 not taken.
✗ Branch 471 not taken.
✓ Branch 472 taken 1 times.
✗ Branch 473 not taken.
✓ Branch 474 taken 1 times.
✗ Branch 475 not taken.
✓ Branch 476 taken 1 times.
✗ Branch 477 not taken.
✓ Branch 478 taken 1 times.
✓ Branch 479 taken 1 times.
✓ Branch 480 taken 1 times.
✗ Branch 481 not taken.
✓ Branch 482 taken 1 times.
✗ Branch 483 not taken.
✓ Branch 484 taken 1 times.
✗ Branch 485 not taken.
✓ Branch 486 taken 1 times.
✗ Branch 487 not taken.
✓ Branch 488 taken 1 times.
✗ Branch 489 not taken.
✓ Branch 490 taken 1 times.
✗ Branch 491 not taken.
✓ Branch 492 taken 1 times.
✗ Branch 493 not taken.
✓ Branch 494 taken 1 times.
✗ Branch 495 not taken.
✓ Branch 496 taken 1 times.
✗ Branch 497 not taken.
✗ Branch 498 not taken.
✗ Branch 499 not taken.
✗ Branch 500 not taken.
✗ Branch 501 not taken.
✗ Branch 502 not taken.
✗ Branch 503 not taken.
✗ Branch 504 not taken.
✗ Branch 505 not taken.
✗ Branch 506 not taken.
✗ Branch 507 not taken.
✗ Branch 508 not taken.
✗ Branch 509 not taken.
✗ Branch 510 not taken.
✗ Branch 511 not taken.
✗ Branch 512 not taken.
✗ Branch 513 not taken.
✗ Branch 514 not taken.
✗ Branch 515 not taken.
✗ Branch 516 not taken.
✗ Branch 517 not taken.
✗ Branch 518 not taken.
✗ Branch 519 not taken.
✗ Branch 520 not taken.
✗ Branch 521 not taken.
✗ Branch 522 not taken.
✗ Branch 523 not taken.
✗ Branch 524 not taken.
✗ Branch 525 not taken.
✗ Branch 526 not taken.
✗ Branch 527 not taken.
✗ Branch 528 not taken.
✗ Branch 529 not taken.
✗ Branch 530 not taken.
✗ Branch 531 not taken.
✗ Branch 532 not taken.
✗ Branch 533 not taken.
✓ Branch 534 taken 1 times.
✗ Branch 535 not taken.
✗ Branch 536 not taken.
✗ Branch 537 not taken.
✗ Branch 538 not taken.
✗ Branch 539 not taken.
✗ Branch 540 not taken.
✗ Branch 541 not taken.
✗ Branch 542 not taken.
✗ Branch 543 not taken.
✗ Branch 544 not taken.
✗ Branch 545 not taken.
✗ Branch 546 not taken.
✗ Branch 547 not taken.
✗ Branch 548 not taken.
✗ Branch 549 not taken.
✗ Branch 550 not taken.
✗ Branch 551 not taken.
✓ Branch 552 taken 1 times.
✗ Branch 553 not taken.
✓ Branch 554 taken 1 times.
✗ Branch 555 not taken.
✓ Branch 556 taken 1 times.
✗ Branch 557 not taken.
✓ Branch 558 taken 1 times.
✗ Branch 559 not taken.
✓ Branch 560 taken 1 times.
✗ Branch 561 not taken.
✗ Branch 562 not taken.
✗ Branch 563 not taken.
✗ Branch 564 not taken.
✗ Branch 565 not taken.
✗ Branch 566 not taken.
✗ Branch 567 not taken.
✗ Branch 568 not taken.
✗ Branch 569 not taken.
✗ Branch 570 not taken.
✗ Branch 571 not taken.
✗ Branch 572 not taken.
✗ Branch 573 not taken.
✗ Branch 574 not taken.
✗ Branch 575 not taken.
✗ Branch 576 not taken.
✗ Branch 577 not taken.
✓ Branch 578 taken 1 times.
✗ Branch 579 not taken.
✓ Branch 580 taken 1 times.
✗ Branch 581 not taken.
✓ Branch 582 taken 1 times.
✗ Branch 583 not taken.
✓ Branch 584 taken 1 times.
✗ Branch 585 not taken.
✓ Branch 586 taken 1 times.
✗ Branch 587 not taken.
✓ Branch 588 taken 1 times.
✗ Branch 589 not taken.
✓ Branch 590 taken 1 times.
✗ Branch 591 not taken.
✓ Branch 592 taken 1 times.
✗ Branch 593 not taken.
✓ Branch 594 taken 1 times.
✗ Branch 595 not taken.
✓ Branch 596 taken 1 times.
✗ Branch 597 not taken.
✓ Branch 598 taken 1 times.
✗ Branch 599 not taken.
✓ Branch 600 taken 1 times.
✗ Branch 601 not taken.
✓ Branch 602 taken 1 times.
✗ Branch 603 not taken.
✓ Branch 604 taken 1 times.
✗ Branch 605 not taken.
✓ Branch 606 taken 1 times.
✓ Branch 607 taken 1 times.
✓ Branch 608 taken 1 times.
✗ Branch 609 not taken.
✓ Branch 610 taken 1 times.
✗ Branch 611 not taken.
✓ Branch 612 taken 1 times.
✗ Branch 613 not taken.
✓ Branch 614 taken 1 times.
✗ Branch 615 not taken.
✓ Branch 616 taken 1 times.
✗ Branch 617 not taken.
✓ Branch 618 taken 1 times.
✗ Branch 619 not taken.
✓ Branch 620 taken 1 times.
✓ Branch 622 taken 1 times.
✗ Branch 623 not taken.
✓ Branch 624 taken 1 times.
✗ Branch 625 not taken.
✗ Branch 626 not taken.
✓ Branch 627 taken 1 times.
✗ Branch 628 not taken.
✓ Branch 629 taken 1 times.
✗ Branch 630 not taken.
✓ Branch 631 taken 1 times.
✗ Branch 632 not taken.
✓ Branch 633 taken 1 times.
✓ Branch 634 taken 1 times.
✗ Branch 635 not taken.
✓ Branch 636 taken 1 times.
✗ Branch 637 not taken.
✗ Branch 638 not taken.
✓ Branch 639 taken 1 times.
✗ Branch 640 not taken.
✓ Branch 641 taken 1 times.
✗ Branch 642 not taken.
✓ Branch 643 taken 1 times.
✗ Branch 644 not taken.
✓ Branch 645 taken 1 times.
✓ Branch 647 taken 1 times.
✗ Branch 648 not taken.
✓ Branch 649 taken 1 times.
✗ Branch 650 not taken.
✗ Branch 651 not taken.
✓ Branch 652 taken 1 times.
✗ Branch 653 not taken.
✓ Branch 654 taken 1 times.
✗ Branch 655 not taken.
✓ Branch 656 taken 1 times.
✗ Branch 657 not taken.
✓ Branch 658 taken 1 times.
✓ Branch 659 taken 1 times.
✗ Branch 660 not taken.
✓ Branch 661 taken 1 times.
✗ Branch 662 not taken.
✗ Branch 663 not taken.
✓ Branch 664 taken 1 times.
✗ Branch 665 not taken.
✓ Branch 666 taken 1 times.
✗ Branch 667 not taken.
✓ Branch 668 taken 1 times.
✗ Branch 669 not taken.
✓ Branch 670 taken 1 times.
|
12 | ) |
| 663 | |||
| 664 | ! params: (1) R [modes x modes], (2) W [n_out x n_in], (3) b [n_out] | ||
| 665 | call load_nop_param_from_inits( & | ||
| 666 | ✗ | lno_layer%params(1), nop_prefix, '_param1', & | |
| 667 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_modes, num_modes]) |
| 668 | call load_nop_param_from_inits( & | ||
| 669 | ✗ | lno_layer%params(2), nop_prefix, '_param2', & | |
| 670 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_outputs, num_inputs]) |
| 671 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(use_bias)then |
| 672 | call load_nop_param_from_inits( & | ||
| 673 | ✗ | lno_layer%params(3), nop_prefix, '_param3', & | |
| 674 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_outputs, 1]) |
| 675 | end if | ||
| 676 | |||
| 677 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocate(layer, source=lno_layer) |
| 678 | end block | ||
| 679 | |||
| 680 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2 | end function create_from_onnx_fixed_lno_layer |
| 681 | !############################################################################### | ||
| 682 | |||
| 683 | |||
| 684 | !############################################################################### | ||
| 685 | 1 | function create_from_onnx_neural_operator_layer( & | |
| 686 | 1 | meta_key, meta_value, inits, verbose & | |
| 687 | 1 | ) result(layer) | |
| 688 | !! Build neural_operator layer from ONNX metadata and return layer | ||
| 689 | use athena__neural_operator_layer, only: neural_operator_layer_type | ||
| 690 | implicit none | ||
| 691 | |||
| 692 | ! Arguments | ||
| 693 | character(*), intent(in) :: meta_key, meta_value | ||
| 694 | !! NOP metadata key/value pair | ||
| 695 | type(onnx_initialiser_type), dimension(:), intent(in) :: inits | ||
| 696 | !! ONNX initialisers containing parameter tensors | ||
| 697 | integer, optional, intent(in) :: verbose | ||
| 698 | !! Verbosity level | ||
| 699 | class(base_layer_type), allocatable :: layer | ||
| 700 | !! Constructed neural operator layer | ||
| 701 | |||
| 702 | ! Local variables | ||
| 703 | integer :: num_inputs, num_outputs, num_modes, verbose_ | ||
| 704 | !! Parsed layer dimensions and effective verbosity level | ||
| 705 | logical :: use_bias | ||
| 706 | !! Whether the imported layer uses bias | ||
| 707 | character(64) :: activation_name, nop_prefix | ||
| 708 | |||
| 709 | 1 | verbose_ = 0 | |
| 710 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(present(verbose)) verbose_ = verbose |
| 711 | |||
| 712 | 1 | num_inputs = 0; num_outputs = 0; num_modes = 0 | |
| 713 | 1 | use_bias = .true.; activation_name = 'none' | |
| 714 | |||
| 715 | call parse_nop_metadata(meta_value, & | ||
| 716 | 1 | num_inputs, num_outputs, num_modes, use_bias, activation_name) | |
| 717 | |||
| 718 | 1 | nop_prefix = extract_nop_prefix(meta_key) | |
| 719 | |||
| 720 | 1 | block | |
| 721 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
2 | type(neural_operator_layer_type) :: nop_layer |
| 722 | |||
| 723 | nop_layer = neural_operator_layer_type( & | ||
| 724 | num_outputs = num_outputs, & | ||
| 725 | num_inputs = num_inputs, & | ||
| 726 | use_bias = use_bias, & | ||
| 727 | activation = trim(activation_name) & | ||
| 728 |
70/296✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✓ Branch 92 taken 1 times.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✓ Branch 106 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 1 times.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✓ Branch 146 taken 1 times.
✗ Branch 148 not taken.
✓ Branch 149 taken 1 times.
✓ Branch 151 taken 1 times.
✓ Branch 152 taken 1 times.
✓ Branch 154 taken 1 times.
✗ Branch 155 not taken.
✓ Branch 156 taken 1 times.
✗ Branch 157 not taken.
✓ Branch 158 taken 1 times.
✗ Branch 159 not taken.
✓ Branch 160 taken 1 times.
✗ Branch 161 not taken.
✓ Branch 162 taken 1 times.
✗ Branch 163 not taken.
✓ Branch 164 taken 3 times.
✓ Branch 165 taken 1 times.
✓ Branch 166 taken 3 times.
✗ Branch 167 not taken.
✓ Branch 168 taken 3 times.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✓ Branch 171 taken 3 times.
✗ Branch 172 not taken.
✓ Branch 173 taken 3 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 3 times.
✗ Branch 176 not taken.
✓ Branch 177 taken 3 times.
✓ Branch 178 taken 1 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 1 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 1 times.
✓ Branch 188 taken 1 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 1 times.
✗ Branch 191 not taken.
✓ Branch 192 taken 1 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 1 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 1 times.
✗ Branch 197 not taken.
✓ Branch 198 taken 1 times.
✗ Branch 199 not taken.
✓ Branch 200 taken 1 times.
✗ Branch 201 not taken.
✓ Branch 202 taken 1 times.
✗ Branch 203 not taken.
✓ Branch 204 taken 1 times.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✓ Branch 242 taken 1 times.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✓ Branch 260 taken 1 times.
✗ Branch 261 not taken.
✓ Branch 262 taken 1 times.
✗ Branch 263 not taken.
✓ Branch 264 taken 1 times.
✗ Branch 265 not taken.
✓ Branch 266 taken 1 times.
✗ Branch 267 not taken.
✓ Branch 268 taken 1 times.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✓ Branch 286 taken 1 times.
✗ Branch 287 not taken.
✓ Branch 288 taken 1 times.
✗ Branch 289 not taken.
✓ Branch 290 taken 1 times.
✓ Branch 291 taken 1 times.
✓ Branch 292 taken 1 times.
✗ Branch 293 not taken.
✓ Branch 294 taken 1 times.
✗ Branch 295 not taken.
✓ Branch 296 taken 1 times.
✗ Branch 297 not taken.
✓ Branch 298 taken 1 times.
✗ Branch 299 not taken.
✓ Branch 300 taken 1 times.
✗ Branch 301 not taken.
✓ Branch 302 taken 1 times.
✗ Branch 303 not taken.
✓ Branch 304 taken 1 times.
|
10 | ) |
| 729 | |||
| 730 | ! params: (1) W [n_out x n_in], (2) W_k [n_out], (3) b [n_out] | ||
| 731 | call load_nop_param_from_inits( & | ||
| 732 | ✗ | nop_layer%params(1), nop_prefix, '_param1', & | |
| 733 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_outputs, num_inputs]) |
| 734 | call load_nop_param_from_inits( & | ||
| 735 | ✗ | nop_layer%params(2), nop_prefix, '_param2', & | |
| 736 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_outputs, 1]) |
| 737 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(use_bias)then |
| 738 | call load_nop_param_from_inits( & | ||
| 739 | ✗ | nop_layer%params(3), nop_prefix, '_param3', & | |
| 740 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_outputs, 1]) |
| 741 | end if | ||
| 742 | |||
| 743 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocate(layer, source=nop_layer) |
| 744 | end block | ||
| 745 | |||
| 746 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2 | end function create_from_onnx_neural_operator_layer |
| 747 | !############################################################################### | ||
| 748 | |||
| 749 | |||
| 750 | !############################################################################### | ||
| 751 | 1 | function create_from_onnx_orthogonal_nop_layer( & | |
| 752 | 1 | meta_key, meta_value, inits, verbose & | |
| 753 | 1 | ) result(layer) | |
| 754 | !! Build orthogonal NOP block from ONNX metadata and return layer | ||
| 755 | use athena__orthogonal_nop_block, only: orthogonal_nop_block_type | ||
| 756 | implicit none | ||
| 757 | |||
| 758 | ! Arguments | ||
| 759 | character(*), intent(in) :: meta_key, meta_value | ||
| 760 | !! NOP metadata key/value pair | ||
| 761 | type(onnx_initialiser_type), dimension(:), intent(in) :: inits | ||
| 762 | !! ONNX initialisers containing parameter tensors | ||
| 763 | integer, optional, intent(in) :: verbose | ||
| 764 | !! Verbosity level | ||
| 765 | class(base_layer_type), allocatable :: layer | ||
| 766 | !! Constructed orthogonal NOP layer | ||
| 767 | |||
| 768 | ! Local variables | ||
| 769 | integer :: num_inputs, num_outputs, num_modes, verbose_ | ||
| 770 | !! Parsed layer dimensions and effective verbosity level | ||
| 771 | logical :: use_bias | ||
| 772 | !! Whether the imported layer uses bias | ||
| 773 | character(64) :: activation_name, nop_prefix | ||
| 774 | |||
| 775 | 1 | verbose_ = 0 | |
| 776 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(present(verbose)) verbose_ = verbose |
| 777 | |||
| 778 | 1 | num_inputs = 0; num_outputs = 0; num_modes = 0 | |
| 779 | 1 | use_bias = .true.; activation_name = 'none' | |
| 780 | |||
| 781 | call parse_nop_metadata(meta_value, & | ||
| 782 | 1 | num_inputs, num_outputs, num_modes, use_bias, activation_name) | |
| 783 | |||
| 784 | 1 | nop_prefix = extract_nop_prefix(meta_key) | |
| 785 | |||
| 786 | 1 | block | |
| 787 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
2 | type(orthogonal_nop_block_type) :: ono_layer |
| 788 | |||
| 789 | ono_layer = orthogonal_nop_block_type( & | ||
| 790 | num_outputs = num_outputs, & | ||
| 791 | num_basis = num_modes, & | ||
| 792 | num_inputs = num_inputs, & | ||
| 793 | use_bias = use_bias, & | ||
| 794 | activation = trim(activation_name) & | ||
| 795 |
70/296✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✓ Branch 92 taken 1 times.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✓ Branch 106 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 1 times.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✓ Branch 146 taken 1 times.
✗ Branch 148 not taken.
✓ Branch 149 taken 1 times.
✓ Branch 151 taken 1 times.
✓ Branch 152 taken 1 times.
✓ Branch 154 taken 1 times.
✗ Branch 155 not taken.
✓ Branch 156 taken 1 times.
✗ Branch 157 not taken.
✓ Branch 158 taken 1 times.
✗ Branch 159 not taken.
✓ Branch 160 taken 1 times.
✗ Branch 161 not taken.
✓ Branch 162 taken 1 times.
✗ Branch 163 not taken.
✓ Branch 164 taken 4 times.
✓ Branch 165 taken 1 times.
✓ Branch 166 taken 4 times.
✗ Branch 167 not taken.
✓ Branch 168 taken 4 times.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✓ Branch 171 taken 4 times.
✗ Branch 172 not taken.
✓ Branch 173 taken 4 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 4 times.
✗ Branch 176 not taken.
✓ Branch 177 taken 4 times.
✓ Branch 178 taken 1 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 1 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 1 times.
✓ Branch 188 taken 1 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 1 times.
✗ Branch 191 not taken.
✓ Branch 192 taken 1 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 1 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 1 times.
✗ Branch 197 not taken.
✓ Branch 198 taken 1 times.
✗ Branch 199 not taken.
✓ Branch 200 taken 1 times.
✗ Branch 201 not taken.
✓ Branch 202 taken 1 times.
✗ Branch 203 not taken.
✓ Branch 204 taken 1 times.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✓ Branch 242 taken 1 times.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✓ Branch 260 taken 1 times.
✗ Branch 261 not taken.
✓ Branch 262 taken 1 times.
✗ Branch 263 not taken.
✓ Branch 264 taken 1 times.
✗ Branch 265 not taken.
✓ Branch 266 taken 1 times.
✗ Branch 267 not taken.
✓ Branch 268 taken 1 times.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✓ Branch 286 taken 1 times.
✗ Branch 287 not taken.
✓ Branch 288 taken 1 times.
✗ Branch 289 not taken.
✓ Branch 290 taken 1 times.
✓ Branch 291 taken 1 times.
✓ Branch 292 taken 1 times.
✗ Branch 293 not taken.
✓ Branch 294 taken 1 times.
✗ Branch 295 not taken.
✓ Branch 296 taken 1 times.
✗ Branch 297 not taken.
✓ Branch 298 taken 1 times.
✗ Branch 299 not taken.
✓ Branch 300 taken 1 times.
✗ Branch 301 not taken.
✓ Branch 302 taken 1 times.
✗ Branch 303 not taken.
✓ Branch 304 taken 1 times.
|
11 | ) |
| 796 | |||
| 797 | ! params: (1) R [nb x nb], (2) B [n_in x nb], (3) W [n_out x n_in], | ||
| 798 | ! (4) b [n_out] | ||
| 799 | call load_nop_param_from_inits( & | ||
| 800 | ✗ | ono_layer%params(1), nop_prefix, '_param1', & | |
| 801 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_modes, num_modes]) |
| 802 | call load_nop_param_from_inits( & | ||
| 803 | ✗ | ono_layer%params(2), nop_prefix, '_param2', & | |
| 804 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_inputs, num_modes]) |
| 805 | call load_nop_param_from_inits( & | ||
| 806 | ✗ | ono_layer%params(3), nop_prefix, '_param3', & | |
| 807 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_outputs, num_inputs]) |
| 808 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(use_bias)then |
| 809 | call load_nop_param_from_inits( & | ||
| 810 | ✗ | ono_layer%params(4), nop_prefix, '_param4', & | |
| 811 |
10/18✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 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 taken 2 times.
✓ Branch 23 taken 1 times.
|
3 | inits, size(inits), [num_outputs, 1]) |
| 812 | end if | ||
| 813 | |||
| 814 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocate(layer, source=ono_layer) |
| 815 | end block | ||
| 816 | |||
| 817 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2 | end function create_from_onnx_orthogonal_nop_layer |
| 818 | !############################################################################### | ||
| 819 | |||
| 820 | |||
| 821 | !############################################################################### | ||
| 822 | ✗ | function create_from_onnx_orthogonal_attention_layer( & | |
| 823 | ✗ | meta_key, meta_value, inits, verbose & | |
| 824 | ✗ | ) result(layer) | |
| 825 | !! Build orthogonal attention layer from ONNX metadata and return layer | ||
| 826 | use athena__orthogonal_attention_layer, only: & | ||
| 827 | orthogonal_attention_layer_type | ||
| 828 | implicit none | ||
| 829 | |||
| 830 | ! Arguments | ||
| 831 | character(*), intent(in) :: meta_key, meta_value | ||
| 832 | !! NOP metadata key/value pair | ||
| 833 | type(onnx_initialiser_type), dimension(:), intent(in) :: inits | ||
| 834 | !! ONNX initialisers containing parameter tensors | ||
| 835 | integer, optional, intent(in) :: verbose | ||
| 836 | !! Verbosity level | ||
| 837 | class(base_layer_type), allocatable :: layer | ||
| 838 | !! Constructed orthogonal attention layer | ||
| 839 | |||
| 840 | ! Local variables | ||
| 841 | integer :: num_inputs, num_outputs, num_modes, key_dim, verbose_ | ||
| 842 | !! Parsed layer dimensions, key dimension and effective verbosity level | ||
| 843 | logical :: use_bias | ||
| 844 | !! Whether the imported layer uses bias | ||
| 845 | character(64) :: activation_name, nop_prefix | ||
| 846 | integer :: k, pos, pos2 | ||
| 847 | !! Parsing indices | ||
| 848 | character(256) :: token, key, val | ||
| 849 | |||
| 850 | ✗ | verbose_ = 0 | |
| 851 | ✗ | if(present(verbose)) verbose_ = verbose | |
| 852 | |||
| 853 | ✗ | num_inputs = 0; num_outputs = 0; num_modes = 0; key_dim = 0 | |
| 854 | ✗ | use_bias = .true.; activation_name = 'none' | |
| 855 | |||
| 856 | call parse_nop_metadata(meta_value, & | ||
| 857 | ✗ | num_inputs, num_outputs, num_modes, use_bias, activation_name) | |
| 858 | |||
| 859 | ! Also parse key_dim | ||
| 860 | ✗ | pos = 1 | |
| 861 | ✗ | do while(pos .le. len_trim(meta_value)) | |
| 862 | ✗ | pos2 = index(meta_value(pos:), ';') | |
| 863 | ✗ | if(pos2 .eq. 0)then | |
| 864 | ✗ | token = meta_value(pos:len_trim(meta_value)) | |
| 865 | ✗ | pos = len_trim(meta_value) + 1 | |
| 866 | else | ||
| 867 | ✗ | token = meta_value(pos:pos+pos2-2) | |
| 868 | ✗ | pos = pos + pos2 | |
| 869 | end if | ||
| 870 | ✗ | k = index(token, '=') | |
| 871 | ✗ | if(k .eq. 0) cycle | |
| 872 | ✗ | key = trim(adjustl(token(1:k-1))) | |
| 873 | ✗ | val = trim(adjustl(token(k+1:))) | |
| 874 | ✗ | if(trim(key) .eq. 'key_dim') read(val, *) key_dim | |
| 875 | end do | ||
| 876 | |||
| 877 | ✗ | nop_prefix = extract_nop_prefix(meta_key) | |
| 878 | |||
| 879 | ✗ | block | |
| 880 | ✗ | type(orthogonal_attention_layer_type) :: attn_layer | |
| 881 | |||
| 882 | attn_layer = orthogonal_attention_layer_type( & | ||
| 883 | num_outputs = num_outputs, & | ||
| 884 | num_basis = num_modes, & | ||
| 885 | key_dim = key_dim, & | ||
| 886 | num_inputs = num_inputs, & | ||
| 887 | use_bias = use_bias, & | ||
| 888 | activation = trim(activation_name) & | ||
| 889 | ✗ | ) | |
| 890 | |||
| 891 | ! params: (1) W_Q, (2) W_K, (3) W_V, (4) B, (5) W, (6) b | ||
| 892 | call load_nop_param_from_inits( & | ||
| 893 | ✗ | attn_layer%params(1), nop_prefix, '_param1', & | |
| 894 | ✗ | inits, size(inits), [key_dim, num_inputs]) | |
| 895 | call load_nop_param_from_inits( & | ||
| 896 | ✗ | attn_layer%params(2), nop_prefix, '_param2', & | |
| 897 | ✗ | inits, size(inits), [key_dim, num_inputs]) | |
| 898 | call load_nop_param_from_inits( & | ||
| 899 | ✗ | attn_layer%params(3), nop_prefix, '_param3', & | |
| 900 | ✗ | inits, size(inits), [num_outputs, num_inputs]) | |
| 901 | call load_nop_param_from_inits( & | ||
| 902 | ✗ | attn_layer%params(4), nop_prefix, '_param4', & | |
| 903 | ✗ | inits, size(inits), [num_inputs, num_modes]) | |
| 904 | call load_nop_param_from_inits( & | ||
| 905 | ✗ | attn_layer%params(5), nop_prefix, '_param5', & | |
| 906 | ✗ | inits, size(inits), [num_outputs, num_inputs]) | |
| 907 | ✗ | if(use_bias)then | |
| 908 | call load_nop_param_from_inits( & | ||
| 909 | ✗ | attn_layer%params(6), nop_prefix, '_param6', & | |
| 910 | ✗ | inits, size(inits), [num_outputs, 1]) | |
| 911 | end if | ||
| 912 | |||
| 913 | ✗ | allocate(layer, source=attn_layer) | |
| 914 | end block | ||
| 915 | |||
| 916 | ✗ | end function create_from_onnx_orthogonal_attention_layer | |
| 917 | !############################################################################### | ||
| 918 | |||
| 919 | |||
| 920 | !############################################################################### | ||
| 921 | ! Expanded-ONNX NOP layer classifiers and builders | ||
| 922 | !############################################################################### | ||
| 923 | |||
| 924 | |||
| 925 | !############################################################################### | ||
| 926 | 6 | function classify_dynamic_lno_onnx_expanded_nop(prefix, nodes, & | |
| 927 | num_nodes) result(is_dynamic_lno) | ||
| 928 | !! Return true when the expanded-ONNX node cluster | ||
| 929 | !! for prefix is a dynamic LNO. | ||
| 930 | implicit none | ||
| 931 | |||
| 932 | ! Arguments | ||
| 933 | character(*), intent(in) :: prefix | ||
| 934 | !! Expanded-ONNX layer prefix (e.g. "layer1") | ||
| 935 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 936 | !! Parsed ONNX nodes | ||
| 937 | integer, intent(in) :: num_nodes | ||
| 938 | !! Number of valid node entries | ||
| 939 | |||
| 940 | logical :: is_dynamic_lno | ||
| 941 | !! Return value | ||
| 942 | |||
| 943 | is_dynamic_lno = & | ||
| 944 | find_onnx_expanded_node_by_suffix( & | ||
| 945 | ✗ | nodes, num_nodes, prefix, 'Exp') .gt. 0 & | |
| 946 | .and. & | ||
| 947 | find_onnx_expanded_node_by_suffix( & | ||
| 948 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
|
6 | nodes, num_nodes, prefix, 'Exp_1') .gt. 0 |
| 949 | |||
| 950 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
12 | end function classify_dynamic_lno_onnx_expanded_nop |
| 951 | !############################################################################### | ||
| 952 | |||
| 953 | |||
| 954 | !############################################################################### | ||
| 955 | 1 | function build_dynamic_lno_onnx_expanded_nop( & | |
| 956 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | prefix, nodes, num_nodes, inits, num_inits) result(layer) |
| 957 | !! Build one dynamic LNO layer from an expanded-ONNX node cluster. | ||
| 958 | use athena__dynamic_lno_layer, only: dynamic_lno_layer_type | ||
| 959 | use athena__onnx_nop_utils, only: infer_dynamic_lno_poles | ||
| 960 | implicit none | ||
| 961 | |||
| 962 | ! Arguments | ||
| 963 | character(*), intent(in) :: prefix | ||
| 964 | !! Layer node prefix (e.g. layer1) | ||
| 965 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 966 | !! Parsed ONNX nodes | ||
| 967 | integer, intent(in) :: num_nodes | ||
| 968 | !! Number of valid node entries | ||
| 969 | type(onnx_initialiser_type), intent(in) :: inits(:) | ||
| 970 | !! Parsed ONNX initialisers | ||
| 971 | integer, intent(in) :: num_inits | ||
| 972 | !! Number of valid initialiser entries | ||
| 973 | class(base_layer_type), allocatable :: layer | ||
| 974 | !! Constructed dynamic LNO layer | ||
| 975 | |||
| 976 | ! Local variables | ||
| 977 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
2 | type(dynamic_lno_layer_type) :: typed_layer |
| 978 | !! Concrete layer object before up-casting | ||
| 979 | integer :: exp_idx, exp1_idx, mul_idx, matmul2_idx, add1_idx | ||
| 980 | !! Node indices for the dynamic LNO decomposition | ||
| 981 | integer :: e_idx, d_idx, beta_idx, w_idx, b_idx | ||
| 982 | !! Initialiser indices used to populate the layer parameters | ||
| 983 | integer :: num_inputs, num_outputs, num_modes | ||
| 984 | !! Reconstructed layer dimensions | ||
| 985 | logical :: use_bias | ||
| 986 | !! Whether the graph includes a bias add | ||
| 987 | character(64) :: activation_name | ||
| 988 | !! Activation reconstructed from the tail of the graph | ||
| 989 | 1 | real(real32), allocatable :: poles(:) | |
| 990 | !! Dynamic poles reconstructed from exported encoder/decoder arguments | ||
| 991 | |||
| 992 | ✗ | exp_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 993 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'Exp') |
| 994 | ✗ | exp1_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 995 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'Exp_1') |
| 996 | ✗ | mul_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 997 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'Mul') |
| 998 | ✗ | matmul2_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 999 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'MatMul_2') |
| 1000 | ✗ | add1_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1001 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'Add_1') |
| 1002 | |||
| 1003 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(exp_idx .le. 0 .or. exp1_idx .le. 0 .or. mul_idx .le. 0 .or. & |
| 1004 | matmul2_idx .le. 0)then | ||
| 1005 | call stop_program('Dynamic LNO ONNX cluster is incomplete for ' // & | ||
| 1006 | ✗ | trim(prefix)) | |
| 1007 | end if | ||
| 1008 | |||
| 1009 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | e_idx = find_node_initialiser_index(nodes(exp_idx), inits, num_inits) |
| 1010 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | d_idx = find_node_initialiser_index(nodes(exp1_idx), inits, num_inits) |
| 1011 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | beta_idx = find_node_initialiser_index(nodes(mul_idx), inits, num_inits) |
| 1012 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | w_idx = find_node_initialiser_index(nodes(matmul2_idx), inits, num_inits) |
| 1013 | |||
| 1014 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(min(e_idx, d_idx, beta_idx, w_idx) .le. 0)then |
| 1015 | call stop_program('Dynamic LNO ONNX parameters are missing for ' // & | ||
| 1016 | ✗ | trim(prefix)) | |
| 1017 | end if | ||
| 1018 | |||
| 1019 |
4/8✗ 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.
|
1 | num_modes = inits(beta_idx)%dims(1) |
| 1020 |
4/8✗ 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.
|
1 | num_outputs = inits(w_idx)%dims(1) |
| 1021 |
4/8✗ 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.
|
1 | num_inputs = inits(w_idx)%dims(2) |
| 1022 | 1 | use_bias = add1_idx .gt. 0 | |
| 1023 | activation_name = detect_onnx_expanded_nop_activation( & | ||
| 1024 |
3/6✗ 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.
|
1 | prefix, nodes, num_nodes) |
| 1025 | |||
| 1026 | typed_layer = dynamic_lno_layer_type( & | ||
| 1027 | num_outputs=num_outputs, num_modes=num_modes, & | ||
| 1028 | num_inputs=num_inputs, use_bias=use_bias, & | ||
| 1029 |
70/296✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✓ Branch 92 taken 1 times.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✓ Branch 106 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 1 times.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✓ Branch 146 taken 1 times.
✗ Branch 148 not taken.
✓ Branch 149 taken 1 times.
✓ Branch 151 taken 1 times.
✓ Branch 152 taken 1 times.
✓ Branch 154 taken 1 times.
✗ Branch 155 not taken.
✓ Branch 156 taken 1 times.
✗ Branch 157 not taken.
✓ Branch 158 taken 1 times.
✗ Branch 159 not taken.
✓ Branch 160 taken 1 times.
✗ Branch 161 not taken.
✓ Branch 162 taken 1 times.
✗ Branch 163 not taken.
✓ Branch 164 taken 4 times.
✓ Branch 165 taken 1 times.
✓ Branch 166 taken 4 times.
✗ Branch 167 not taken.
✓ Branch 168 taken 4 times.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✓ Branch 171 taken 4 times.
✗ Branch 172 not taken.
✓ Branch 173 taken 4 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 4 times.
✗ Branch 176 not taken.
✓ Branch 177 taken 4 times.
✓ Branch 178 taken 1 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 1 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 1 times.
✓ Branch 188 taken 1 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 1 times.
✗ Branch 191 not taken.
✓ Branch 192 taken 1 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 1 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 1 times.
✗ Branch 197 not taken.
✓ Branch 198 taken 1 times.
✗ Branch 199 not taken.
✓ Branch 200 taken 1 times.
✗ Branch 201 not taken.
✓ Branch 202 taken 1 times.
✗ Branch 203 not taken.
✓ Branch 204 taken 1 times.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✓ Branch 242 taken 1 times.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✓ Branch 260 taken 1 times.
✗ Branch 261 not taken.
✓ Branch 262 taken 1 times.
✗ Branch 263 not taken.
✓ Branch 264 taken 1 times.
✗ Branch 265 not taken.
✓ Branch 266 taken 1 times.
✗ Branch 267 not taken.
✓ Branch 268 taken 1 times.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✓ Branch 286 taken 1 times.
✗ Branch 287 not taken.
✓ Branch 288 taken 1 times.
✗ Branch 289 not taken.
✓ Branch 290 taken 1 times.
✓ Branch 291 taken 1 times.
✓ Branch 292 taken 1 times.
✗ Branch 293 not taken.
✓ Branch 294 taken 1 times.
✗ Branch 295 not taken.
✓ Branch 296 taken 1 times.
✗ Branch 297 not taken.
✓ Branch 298 taken 1 times.
✗ Branch 299 not taken.
✓ Branch 300 taken 1 times.
✗ Branch 301 not taken.
✓ Branch 302 taken 1 times.
✗ Branch 303 not taken.
✓ Branch 304 taken 1 times.
|
11 | activation=trim(activation_name)) |
| 1030 | |||
| 1031 |
7/14✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
1 | allocate(poles(num_modes)) |
| 1032 | call infer_dynamic_lno_poles( & | ||
| 1033 |
4/8✗ 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.
|
1 | inits(e_idx), inits(d_idx), num_inputs, num_outputs, poles) |
| 1034 |
15/28✗ 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 taken 6 times.
✓ Branch 40 taken 1 times.
|
7 | typed_layer%params(1)%val(:,1) = poles |
| 1035 |
17/32✗ 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 taken 6 times.
✓ Branch 46 taken 1 times.
|
7 | typed_layer%params(2)%val(:,1) = inits(beta_idx)%data |
| 1036 | call load_onnx_expanded_matrix_param( & | ||
| 1037 |
4/8✗ 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.
|
1 | typed_layer%params(3), inits(w_idx), num_outputs, num_inputs) |
| 1038 | |||
| 1039 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(use_bias)then |
| 1040 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | b_idx = find_node_initialiser_index(nodes(add1_idx), inits, num_inits) |
| 1041 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(b_idx .le. 0)then |
| 1042 | call stop_program('Dynamic LNO bias initialiser missing for ' // & | ||
| 1043 | ✗ | trim(prefix)) | |
| 1044 | end if | ||
| 1045 |
17/32✗ 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 taken 18 times.
✓ Branch 46 taken 1 times.
|
19 | typed_layer%params(4)%val(:,1) = inits(b_idx)%data |
| 1046 | end if | ||
| 1047 | |||
| 1048 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocate(layer, source=typed_layer) |
| 1049 | |||
| 1050 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
4 | end function build_dynamic_lno_onnx_expanded_nop |
| 1051 | !############################################################################### | ||
| 1052 | |||
| 1053 | |||
| 1054 | !############################################################################### | ||
| 1055 | 4 | function classify_fixed_lno_onnx_expanded_nop(prefix, nodes, & | |
| 1056 | num_nodes) result(is_fixed_lno) | ||
| 1057 | !! Return true when the expanded-ONNX node cluster | ||
| 1058 | !! for prefix is a fixed LNO. | ||
| 1059 | implicit none | ||
| 1060 | |||
| 1061 | ! Arguments | ||
| 1062 | character(*), intent(in) :: prefix | ||
| 1063 | !! Expanded-ONNX layer prefix (e.g. "layer2") | ||
| 1064 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1065 | !! Parsed ONNX nodes | ||
| 1066 | integer, intent(in) :: num_nodes | ||
| 1067 | !! Number of valid node entries | ||
| 1068 | |||
| 1069 | logical :: is_fixed_lno | ||
| 1070 | !! Return value | ||
| 1071 | |||
| 1072 | !! Fixed LNO has MatMul_3 but not the Exp/Exp_1 pair of dynamic LNO | ||
| 1073 | is_fixed_lno = & | ||
| 1074 | find_onnx_expanded_node_by_suffix( & | ||
| 1075 | ✗ | nodes, num_nodes, prefix, 'MatMul_3') .gt. 0 & | |
| 1076 | .and. & | ||
| 1077 | find_onnx_expanded_node_by_suffix( & | ||
| 1078 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
|
4 | nodes, num_nodes, prefix, 'Exp') .le. 0 |
| 1079 | |||
| 1080 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
8 | end function classify_fixed_lno_onnx_expanded_nop |
| 1081 | !############################################################################### | ||
| 1082 | |||
| 1083 | |||
| 1084 | !############################################################################### | ||
| 1085 | 1 | function build_fixed_lno_onnx_expanded_nop( & | |
| 1086 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | prefix, nodes, num_nodes, inits, num_inits) result(layer) |
| 1087 | !! Build one fixed LNO layer from an expanded-ONNX node cluster. | ||
| 1088 | use athena__fixed_lno_layer, only: fixed_lno_layer_type | ||
| 1089 | implicit none | ||
| 1090 | |||
| 1091 | ! Arguments | ||
| 1092 | character(*), intent(in) :: prefix | ||
| 1093 | !! Layer node prefix (e.g. layer2) | ||
| 1094 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1095 | !! Parsed ONNX nodes | ||
| 1096 | integer, intent(in) :: num_nodes | ||
| 1097 | !! Number of valid node entries | ||
| 1098 | type(onnx_initialiser_type), intent(in) :: inits(:) | ||
| 1099 | !! Parsed ONNX initialisers | ||
| 1100 | integer, intent(in) :: num_inits | ||
| 1101 | !! Number of valid initialiser entries | ||
| 1102 | class(base_layer_type), allocatable :: layer | ||
| 1103 | !! Constructed fixed LNO layer | ||
| 1104 | |||
| 1105 | ! Local variables | ||
| 1106 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
2 | type(fixed_lno_layer_type) :: typed_layer |
| 1107 | !! Concrete layer object before up-casting | ||
| 1108 | integer :: matmul1_idx, matmul3_idx, add1_idx | ||
| 1109 | !! Node indices for learnable parameters in the fixed LNO decomposition | ||
| 1110 | integer :: r_idx, w_idx, b_idx | ||
| 1111 | !! Initialiser indices used to populate the layer parameters | ||
| 1112 | integer :: num_inputs, num_outputs, num_modes | ||
| 1113 | !! Reconstructed layer dimensions | ||
| 1114 | logical :: use_bias | ||
| 1115 | !! Whether the graph includes a bias add | ||
| 1116 | character(64) :: activation_name | ||
| 1117 | !! Activation reconstructed from the tail of the graph | ||
| 1118 | |||
| 1119 | ✗ | matmul1_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1120 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'MatMul_1') |
| 1121 | ✗ | matmul3_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1122 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'MatMul_3') |
| 1123 | ✗ | add1_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1124 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'Add_1') |
| 1125 | |||
| 1126 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(matmul1_idx .le. 0 .or. matmul3_idx .le. 0)then |
| 1127 | call stop_program('Fixed LNO ONNX cluster is incomplete for ' // & | ||
| 1128 | ✗ | trim(prefix)) | |
| 1129 | end if | ||
| 1130 | |||
| 1131 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | r_idx = find_node_initialiser_index(nodes(matmul1_idx), inits, num_inits) |
| 1132 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | w_idx = find_node_initialiser_index(nodes(matmul3_idx), inits, num_inits) |
| 1133 | |||
| 1134 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(min(r_idx, w_idx) .le. 0)then |
| 1135 | call stop_program('Fixed LNO ONNX parameters are missing for ' // & | ||
| 1136 | ✗ | trim(prefix)) | |
| 1137 | end if | ||
| 1138 | |||
| 1139 |
4/8✗ 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.
|
1 | num_modes = inits(r_idx)%dims(1) |
| 1140 |
4/8✗ 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.
|
1 | num_outputs = inits(w_idx)%dims(1) |
| 1141 |
4/8✗ 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.
|
1 | num_inputs = inits(w_idx)%dims(2) |
| 1142 | 1 | use_bias = add1_idx .gt. 0 | |
| 1143 | activation_name = detect_onnx_expanded_nop_activation( & | ||
| 1144 |
3/6✗ 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.
|
1 | prefix, nodes, num_nodes) |
| 1145 | |||
| 1146 | typed_layer = fixed_lno_layer_type( & | ||
| 1147 | num_outputs=num_outputs, num_modes=num_modes, & | ||
| 1148 | num_inputs=num_inputs, use_bias=use_bias, & | ||
| 1149 |
192/654✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 107 taken 1 times.
✗ Branch 108 not taken.
✓ Branch 109 taken 1 times.
✗ Branch 110 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 113 taken 1 times.
✗ Branch 114 not taken.
✓ Branch 115 taken 1 times.
✓ Branch 116 taken 1 times.
✓ Branch 117 taken 1 times.
✗ Branch 118 not taken.
✓ Branch 119 taken 1 times.
✗ Branch 120 not taken.
✓ Branch 121 taken 1 times.
✗ Branch 122 not taken.
✓ Branch 123 taken 1 times.
✗ Branch 124 not taken.
✓ Branch 125 taken 1 times.
✗ Branch 126 not taken.
✓ Branch 127 taken 1 times.
✗ Branch 128 not taken.
✓ Branch 129 taken 1 times.
✓ Branch 130 taken 1 times.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✓ Branch 133 taken 1 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 1 times.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✓ Branch 167 taken 1 times.
✗ Branch 168 not taken.
✗ Branch 169 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 177 not taken.
✓ Branch 178 taken 1 times.
✗ Branch 179 not taken.
✓ Branch 180 taken 1 times.
✗ Branch 181 not taken.
✓ Branch 182 taken 1 times.
✗ Branch 183 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✓ Branch 186 taken 1 times.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✓ Branch 202 taken 1 times.
✗ Branch 204 not taken.
✓ Branch 205 taken 1 times.
✗ Branch 207 not taken.
✓ Branch 208 taken 1 times.
✗ Branch 210 not taken.
✓ Branch 211 taken 1 times.
✗ Branch 212 not taken.
✓ Branch 213 taken 1 times.
✗ Branch 214 not taken.
✓ Branch 215 taken 1 times.
✗ Branch 216 not taken.
✓ Branch 217 taken 1 times.
✗ Branch 218 not taken.
✓ Branch 219 taken 1 times.
✗ Branch 220 not taken.
✓ Branch 221 taken 1 times.
✗ Branch 222 not taken.
✓ Branch 223 taken 1 times.
✗ Branch 224 not taken.
✓ Branch 225 taken 1 times.
✗ Branch 226 not taken.
✓ Branch 227 taken 1 times.
✗ Branch 228 not taken.
✓ Branch 229 taken 1 times.
✗ Branch 230 not taken.
✓ Branch 231 taken 1 times.
✗ Branch 232 not taken.
✓ Branch 233 taken 1 times.
✓ Branch 234 taken 1 times.
✓ Branch 235 taken 1 times.
✗ Branch 236 not taken.
✓ Branch 237 taken 1 times.
✗ Branch 238 not taken.
✓ Branch 239 taken 1 times.
✗ Branch 240 not taken.
✓ Branch 241 taken 1 times.
✗ Branch 242 not taken.
✓ Branch 243 taken 1 times.
✗ Branch 244 not taken.
✓ Branch 245 taken 1 times.
✗ Branch 246 not taken.
✓ Branch 247 taken 1 times.
✗ Branch 248 not taken.
✓ Branch 249 taken 1 times.
✗ Branch 250 not taken.
✓ Branch 251 taken 1 times.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✗ Branch 260 not taken.
✗ Branch 261 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 264 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 267 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✗ Branch 286 not taken.
✗ Branch 287 not taken.
✗ Branch 288 not taken.
✓ Branch 289 taken 1 times.
✗ Branch 290 not taken.
✗ Branch 291 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 294 not taken.
✗ Branch 295 not taken.
✗ Branch 296 not taken.
✗ Branch 297 not taken.
✗ Branch 298 not taken.
✗ Branch 299 not taken.
✗ Branch 300 not taken.
✗ Branch 301 not taken.
✗ Branch 302 not taken.
✗ Branch 303 not taken.
✗ Branch 304 not taken.
✗ Branch 305 not taken.
✗ Branch 306 not taken.
✓ Branch 307 taken 1 times.
✗ Branch 308 not taken.
✓ Branch 309 taken 1 times.
✗ Branch 310 not taken.
✓ Branch 311 taken 1 times.
✗ Branch 312 not taken.
✓ Branch 313 taken 1 times.
✗ Branch 314 not taken.
✓ Branch 315 taken 1 times.
✗ Branch 316 not taken.
✗ Branch 317 not taken.
✗ Branch 318 not taken.
✗ Branch 319 not taken.
✗ Branch 320 not taken.
✗ Branch 321 not taken.
✗ Branch 322 not taken.
✗ Branch 323 not taken.
✗ Branch 324 not taken.
✗ Branch 325 not taken.
✗ Branch 326 not taken.
✗ Branch 327 not taken.
✗ Branch 328 not taken.
✗ Branch 329 not taken.
✗ Branch 330 not taken.
✗ Branch 331 not taken.
✗ Branch 332 not taken.
✓ Branch 333 taken 1 times.
✗ Branch 334 not taken.
✓ Branch 335 taken 1 times.
✗ Branch 336 not taken.
✓ Branch 337 taken 1 times.
✗ Branch 338 not taken.
✓ Branch 339 taken 1 times.
✗ Branch 340 not taken.
✓ Branch 341 taken 1 times.
✗ Branch 342 not taken.
✓ Branch 343 taken 1 times.
✗ Branch 344 not taken.
✓ Branch 345 taken 1 times.
✗ Branch 346 not taken.
✓ Branch 347 taken 1 times.
✗ Branch 348 not taken.
✓ Branch 349 taken 1 times.
✗ Branch 350 not taken.
✓ Branch 351 taken 1 times.
✗ Branch 352 not taken.
✓ Branch 353 taken 1 times.
✗ Branch 354 not taken.
✓ Branch 355 taken 1 times.
✗ Branch 356 not taken.
✓ Branch 357 taken 1 times.
✗ Branch 358 not taken.
✓ Branch 359 taken 1 times.
✗ Branch 360 not taken.
✓ Branch 361 taken 1 times.
✓ Branch 362 taken 1 times.
✓ Branch 363 taken 1 times.
✗ Branch 364 not taken.
✓ Branch 365 taken 1 times.
✗ Branch 366 not taken.
✓ Branch 367 taken 1 times.
✗ Branch 368 not taken.
✓ Branch 369 taken 1 times.
✗ Branch 370 not taken.
✓ Branch 371 taken 1 times.
✗ Branch 372 not taken.
✓ Branch 373 taken 1 times.
✗ Branch 374 not taken.
✓ Branch 375 taken 1 times.
✓ Branch 377 taken 1 times.
✗ Branch 378 not taken.
✗ Branch 379 not taken.
✓ Branch 380 taken 1 times.
✗ Branch 381 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 384 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 387 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✗ Branch 390 not taken.
✗ Branch 391 not taken.
✗ Branch 392 not taken.
✗ Branch 393 not taken.
✗ Branch 394 not taken.
✗ Branch 395 not taken.
✗ Branch 396 not taken.
✗ Branch 397 not taken.
✗ Branch 398 not taken.
✗ Branch 399 not taken.
✗ Branch 400 not taken.
✗ Branch 401 not taken.
✗ Branch 402 not taken.
✗ Branch 403 not taken.
✗ Branch 404 not taken.
✗ Branch 405 not taken.
✗ Branch 406 not taken.
✗ Branch 407 not taken.
✗ Branch 408 not taken.
✗ Branch 409 not taken.
✗ Branch 410 not taken.
✓ Branch 411 taken 1 times.
✗ Branch 412 not taken.
✗ Branch 413 not taken.
✓ Branch 414 taken 1 times.
✗ Branch 416 not taken.
✓ Branch 417 taken 1 times.
✓ Branch 419 taken 1 times.
✓ Branch 420 taken 1 times.
✓ Branch 422 taken 1 times.
✗ Branch 423 not taken.
✓ Branch 424 taken 1 times.
✗ Branch 425 not taken.
✓ Branch 426 taken 1 times.
✗ Branch 427 not taken.
✓ Branch 428 taken 1 times.
✗ Branch 429 not taken.
✓ Branch 430 taken 1 times.
✗ Branch 431 not taken.
✓ Branch 432 taken 3 times.
✓ Branch 433 taken 1 times.
✓ Branch 434 taken 3 times.
✗ Branch 435 not taken.
✓ Branch 436 taken 3 times.
✗ Branch 437 not taken.
✗ Branch 438 not taken.
✓ Branch 439 taken 3 times.
✗ Branch 440 not taken.
✓ Branch 441 taken 3 times.
✗ Branch 442 not taken.
✓ Branch 443 taken 3 times.
✗ Branch 444 not taken.
✓ Branch 445 taken 3 times.
✓ Branch 446 taken 1 times.
✗ Branch 447 not taken.
✓ Branch 449 taken 1 times.
✗ Branch 450 not taken.
✓ Branch 452 taken 1 times.
✗ Branch 453 not taken.
✓ Branch 455 taken 1 times.
✗ Branch 456 not taken.
✓ Branch 457 taken 1 times.
✗ Branch 458 not taken.
✗ Branch 459 not taken.
✓ Branch 460 taken 1 times.
✗ Branch 461 not taken.
✓ Branch 462 taken 1 times.
✗ Branch 463 not taken.
✓ Branch 464 taken 1 times.
✗ Branch 465 not taken.
✓ Branch 466 taken 1 times.
✓ Branch 467 taken 1 times.
✗ Branch 468 not taken.
✓ Branch 469 taken 1 times.
✗ Branch 470 not taken.
✗ Branch 471 not taken.
✓ Branch 472 taken 1 times.
✗ Branch 473 not taken.
✓ Branch 474 taken 1 times.
✗ Branch 475 not taken.
✓ Branch 476 taken 1 times.
✗ Branch 477 not taken.
✓ Branch 478 taken 1 times.
✓ Branch 479 taken 1 times.
✓ Branch 480 taken 1 times.
✗ Branch 481 not taken.
✓ Branch 482 taken 1 times.
✗ Branch 483 not taken.
✓ Branch 484 taken 1 times.
✗ Branch 485 not taken.
✓ Branch 486 taken 1 times.
✗ Branch 487 not taken.
✓ Branch 488 taken 1 times.
✗ Branch 489 not taken.
✓ Branch 490 taken 1 times.
✗ Branch 491 not taken.
✓ Branch 492 taken 1 times.
✗ Branch 493 not taken.
✓ Branch 494 taken 1 times.
✗ Branch 495 not taken.
✓ Branch 496 taken 1 times.
✗ Branch 497 not taken.
✗ Branch 498 not taken.
✗ Branch 499 not taken.
✗ Branch 500 not taken.
✗ Branch 501 not taken.
✗ Branch 502 not taken.
✗ Branch 503 not taken.
✗ Branch 504 not taken.
✗ Branch 505 not taken.
✗ Branch 506 not taken.
✗ Branch 507 not taken.
✗ Branch 508 not taken.
✗ Branch 509 not taken.
✗ Branch 510 not taken.
✗ Branch 511 not taken.
✗ Branch 512 not taken.
✗ Branch 513 not taken.
✗ Branch 514 not taken.
✗ Branch 515 not taken.
✗ Branch 516 not taken.
✗ Branch 517 not taken.
✗ Branch 518 not taken.
✗ Branch 519 not taken.
✗ Branch 520 not taken.
✗ Branch 521 not taken.
✗ Branch 522 not taken.
✗ Branch 523 not taken.
✗ Branch 524 not taken.
✗ Branch 525 not taken.
✗ Branch 526 not taken.
✗ Branch 527 not taken.
✗ Branch 528 not taken.
✗ Branch 529 not taken.
✗ Branch 530 not taken.
✗ Branch 531 not taken.
✗ Branch 532 not taken.
✗ Branch 533 not taken.
✓ Branch 534 taken 1 times.
✗ Branch 535 not taken.
✗ Branch 536 not taken.
✗ Branch 537 not taken.
✗ Branch 538 not taken.
✗ Branch 539 not taken.
✗ Branch 540 not taken.
✗ Branch 541 not taken.
✗ Branch 542 not taken.
✗ Branch 543 not taken.
✗ Branch 544 not taken.
✗ Branch 545 not taken.
✗ Branch 546 not taken.
✗ Branch 547 not taken.
✗ Branch 548 not taken.
✗ Branch 549 not taken.
✗ Branch 550 not taken.
✗ Branch 551 not taken.
✓ Branch 552 taken 1 times.
✗ Branch 553 not taken.
✓ Branch 554 taken 1 times.
✗ Branch 555 not taken.
✓ Branch 556 taken 1 times.
✗ Branch 557 not taken.
✓ Branch 558 taken 1 times.
✗ Branch 559 not taken.
✓ Branch 560 taken 1 times.
✗ Branch 561 not taken.
✗ Branch 562 not taken.
✗ Branch 563 not taken.
✗ Branch 564 not taken.
✗ Branch 565 not taken.
✗ Branch 566 not taken.
✗ Branch 567 not taken.
✗ Branch 568 not taken.
✗ Branch 569 not taken.
✗ Branch 570 not taken.
✗ Branch 571 not taken.
✗ Branch 572 not taken.
✗ Branch 573 not taken.
✗ Branch 574 not taken.
✗ Branch 575 not taken.
✗ Branch 576 not taken.
✗ Branch 577 not taken.
✓ Branch 578 taken 1 times.
✗ Branch 579 not taken.
✓ Branch 580 taken 1 times.
✗ Branch 581 not taken.
✓ Branch 582 taken 1 times.
✗ Branch 583 not taken.
✓ Branch 584 taken 1 times.
✗ Branch 585 not taken.
✓ Branch 586 taken 1 times.
✗ Branch 587 not taken.
✓ Branch 588 taken 1 times.
✗ Branch 589 not taken.
✓ Branch 590 taken 1 times.
✗ Branch 591 not taken.
✓ Branch 592 taken 1 times.
✗ Branch 593 not taken.
✓ Branch 594 taken 1 times.
✗ Branch 595 not taken.
✓ Branch 596 taken 1 times.
✗ Branch 597 not taken.
✓ Branch 598 taken 1 times.
✗ Branch 599 not taken.
✓ Branch 600 taken 1 times.
✗ Branch 601 not taken.
✓ Branch 602 taken 1 times.
✗ Branch 603 not taken.
✓ Branch 604 taken 1 times.
✗ Branch 605 not taken.
✓ Branch 606 taken 1 times.
✓ Branch 607 taken 1 times.
✓ Branch 608 taken 1 times.
✗ Branch 609 not taken.
✓ Branch 610 taken 1 times.
✗ Branch 611 not taken.
✓ Branch 612 taken 1 times.
✗ Branch 613 not taken.
✓ Branch 614 taken 1 times.
✗ Branch 615 not taken.
✓ Branch 616 taken 1 times.
✗ Branch 617 not taken.
✓ Branch 618 taken 1 times.
✗ Branch 619 not taken.
✓ Branch 620 taken 1 times.
✓ Branch 622 taken 1 times.
✗ Branch 623 not taken.
✓ Branch 624 taken 1 times.
✗ Branch 625 not taken.
✗ Branch 626 not taken.
✓ Branch 627 taken 1 times.
✗ Branch 628 not taken.
✓ Branch 629 taken 1 times.
✗ Branch 630 not taken.
✓ Branch 631 taken 1 times.
✗ Branch 632 not taken.
✓ Branch 633 taken 1 times.
✓ Branch 634 taken 1 times.
✗ Branch 635 not taken.
✓ Branch 636 taken 1 times.
✗ Branch 637 not taken.
✗ Branch 638 not taken.
✓ Branch 639 taken 1 times.
✗ Branch 640 not taken.
✓ Branch 641 taken 1 times.
✗ Branch 642 not taken.
✓ Branch 643 taken 1 times.
✗ Branch 644 not taken.
✓ Branch 645 taken 1 times.
✓ Branch 647 taken 1 times.
✗ Branch 648 not taken.
✓ Branch 649 taken 1 times.
✗ Branch 650 not taken.
✗ Branch 651 not taken.
✓ Branch 652 taken 1 times.
✗ Branch 653 not taken.
✓ Branch 654 taken 1 times.
✗ Branch 655 not taken.
✓ Branch 656 taken 1 times.
✗ Branch 657 not taken.
✓ Branch 658 taken 1 times.
✓ Branch 659 taken 1 times.
✗ Branch 660 not taken.
✓ Branch 661 taken 1 times.
✗ Branch 662 not taken.
✗ Branch 663 not taken.
✓ Branch 664 taken 1 times.
✗ Branch 665 not taken.
✓ Branch 666 taken 1 times.
✗ Branch 667 not taken.
✓ Branch 668 taken 1 times.
✗ Branch 669 not taken.
✓ Branch 670 taken 1 times.
|
12 | activation=trim(activation_name)) |
| 1150 | |||
| 1151 | call load_onnx_expanded_matrix_param( & | ||
| 1152 |
4/8✗ 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.
|
1 | typed_layer%params(1), inits(r_idx), num_modes, num_modes) |
| 1153 | call load_onnx_expanded_matrix_param( & | ||
| 1154 |
4/8✗ 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.
|
1 | typed_layer%params(2), inits(w_idx), num_outputs, num_inputs) |
| 1155 | |||
| 1156 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(use_bias)then |
| 1157 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | b_idx = find_node_initialiser_index(nodes(add1_idx), inits, num_inits) |
| 1158 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(b_idx .le. 0)then |
| 1159 | call stop_program('Fixed LNO bias initialiser missing for ' // & | ||
| 1160 | ✗ | trim(prefix)) | |
| 1161 | end if | ||
| 1162 |
17/32✗ 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 taken 12 times.
✓ Branch 46 taken 1 times.
|
13 | typed_layer%params(3)%val(:,1) = inits(b_idx)%data |
| 1163 | end if | ||
| 1164 | |||
| 1165 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocate(layer, source=typed_layer) |
| 1166 | |||
| 1167 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
4 | end function build_fixed_lno_onnx_expanded_nop |
| 1168 | !############################################################################### | ||
| 1169 | |||
| 1170 | |||
| 1171 | !############################################################################### | ||
| 1172 | 2 | function classify_neural_operator_onnx_expanded_nop(prefix, nodes, & | |
| 1173 | num_nodes) result(is_neural_operator) | ||
| 1174 | !! Return true when the expanded-ONNX node cluster | ||
| 1175 | !! for prefix is a neural operator. | ||
| 1176 | implicit none | ||
| 1177 | |||
| 1178 | ! Arguments | ||
| 1179 | character(*), intent(in) :: prefix | ||
| 1180 | !! Expanded-ONNX layer prefix (e.g. "layer3") | ||
| 1181 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1182 | !! Parsed ONNX nodes | ||
| 1183 | integer, intent(in) :: num_nodes | ||
| 1184 | !! Number of valid node entries | ||
| 1185 | |||
| 1186 | logical :: is_neural_operator | ||
| 1187 | !! Return value | ||
| 1188 | |||
| 1189 | !! Neural operator has ReduceMean but not Exp/Exp_1 or MatMul_3 | ||
| 1190 | is_neural_operator = & | ||
| 1191 | find_onnx_expanded_node_by_suffix( & | ||
| 1192 |
3/6✗ 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.
|
2 | nodes, num_nodes, prefix, 'ReduceMean') .gt. 0 |
| 1193 | |||
| 1194 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4 | end function classify_neural_operator_onnx_expanded_nop |
| 1195 | !############################################################################### | ||
| 1196 | |||
| 1197 | |||
| 1198 | !############################################################################### | ||
| 1199 | 1 | function build_neural_operator_onnx_expanded_nop( & | |
| 1200 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | prefix, nodes, num_nodes, inits, num_inits) result(layer) |
| 1201 | !! Build one neural operator layer from an expanded-ONNX node cluster. | ||
| 1202 | use athena__neural_operator_layer, only: neural_operator_layer_type | ||
| 1203 | implicit none | ||
| 1204 | |||
| 1205 | ! Arguments | ||
| 1206 | character(*), intent(in) :: prefix | ||
| 1207 | !! Layer node prefix (e.g. layer3) | ||
| 1208 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1209 | !! Parsed ONNX nodes | ||
| 1210 | integer, intent(in) :: num_nodes | ||
| 1211 | !! Number of valid node entries | ||
| 1212 | type(onnx_initialiser_type), intent(in) :: inits(:) | ||
| 1213 | !! Parsed ONNX initialisers | ||
| 1214 | integer, intent(in) :: num_inits | ||
| 1215 | !! Number of valid initialiser entries | ||
| 1216 | class(base_layer_type), allocatable :: layer | ||
| 1217 | !! Constructed neural operator layer | ||
| 1218 | |||
| 1219 | ! Local variables | ||
| 1220 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
2 | type(neural_operator_layer_type) :: typed_layer |
| 1221 | !! Concrete layer object before up-casting | ||
| 1222 | integer :: matmul_idx, mul_idx, add1_idx | ||
| 1223 | !! Node indices for the neural operator decomposition | ||
| 1224 | integer :: w_idx, wk_idx, b_idx | ||
| 1225 | !! Initialiser indices used to populate the layer parameters | ||
| 1226 | integer :: num_inputs, num_outputs | ||
| 1227 | !! Reconstructed layer dimensions | ||
| 1228 | logical :: use_bias | ||
| 1229 | !! Whether the graph includes a bias add | ||
| 1230 | character(64) :: activation_name | ||
| 1231 | !! Activation reconstructed from the tail of the graph | ||
| 1232 | |||
| 1233 | ✗ | matmul_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1234 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'MatMul') |
| 1235 | ✗ | mul_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1236 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'Mul') |
| 1237 | ✗ | add1_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1238 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | 'Add_1') |
| 1239 | |||
| 1240 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(matmul_idx .le. 0 .or. mul_idx .le. 0)then |
| 1241 | call stop_program('Neural operator ONNX cluster is incomplete for ' // & | ||
| 1242 | ✗ | trim(prefix)) | |
| 1243 | end if | ||
| 1244 | |||
| 1245 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | w_idx = find_node_initialiser_index(nodes(matmul_idx), inits, num_inits) |
| 1246 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | wk_idx = find_node_initialiser_index(nodes(mul_idx), inits, num_inits) |
| 1247 | |||
| 1248 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(min(w_idx, wk_idx) .le. 0)then |
| 1249 | call stop_program('Neural operator ONNX parameters are missing for ' // & | ||
| 1250 | ✗ | trim(prefix)) | |
| 1251 | end if | ||
| 1252 | |||
| 1253 |
4/8✗ 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.
|
1 | num_outputs = inits(w_idx)%dims(1) |
| 1254 |
4/8✗ 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.
|
1 | num_inputs = inits(w_idx)%dims(2) |
| 1255 | 1 | use_bias = add1_idx .gt. 0 | |
| 1256 | activation_name = detect_onnx_expanded_nop_activation( & | ||
| 1257 |
3/6✗ 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.
|
1 | prefix, nodes, num_nodes) |
| 1258 | |||
| 1259 | typed_layer = neural_operator_layer_type( & | ||
| 1260 | num_outputs=num_outputs, num_inputs=num_inputs, & | ||
| 1261 |
70/296✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✓ Branch 92 taken 1 times.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 100 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 1 times.
✓ Branch 106 taken 1 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 1 times.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 times.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✓ Branch 146 taken 1 times.
✗ Branch 148 not taken.
✓ Branch 149 taken 1 times.
✓ Branch 151 taken 1 times.
✓ Branch 152 taken 1 times.
✓ Branch 154 taken 1 times.
✗ Branch 155 not taken.
✓ Branch 156 taken 1 times.
✗ Branch 157 not taken.
✓ Branch 158 taken 1 times.
✗ Branch 159 not taken.
✓ Branch 160 taken 1 times.
✗ Branch 161 not taken.
✓ Branch 162 taken 1 times.
✗ Branch 163 not taken.
✓ Branch 164 taken 3 times.
✓ Branch 165 taken 1 times.
✓ Branch 166 taken 3 times.
✗ Branch 167 not taken.
✓ Branch 168 taken 3 times.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✓ Branch 171 taken 3 times.
✗ Branch 172 not taken.
✓ Branch 173 taken 3 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 3 times.
✗ Branch 176 not taken.
✓ Branch 177 taken 3 times.
✓ Branch 178 taken 1 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 1 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 1 times.
✓ Branch 188 taken 1 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 1 times.
✗ Branch 191 not taken.
✓ Branch 192 taken 1 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 1 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 1 times.
✗ Branch 197 not taken.
✓ Branch 198 taken 1 times.
✗ Branch 199 not taken.
✓ Branch 200 taken 1 times.
✗ Branch 201 not taken.
✓ Branch 202 taken 1 times.
✗ Branch 203 not taken.
✓ Branch 204 taken 1 times.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✓ Branch 242 taken 1 times.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✓ Branch 260 taken 1 times.
✗ Branch 261 not taken.
✓ Branch 262 taken 1 times.
✗ Branch 263 not taken.
✓ Branch 264 taken 1 times.
✗ Branch 265 not taken.
✓ Branch 266 taken 1 times.
✗ Branch 267 not taken.
✓ Branch 268 taken 1 times.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✓ Branch 286 taken 1 times.
✗ Branch 287 not taken.
✓ Branch 288 taken 1 times.
✗ Branch 289 not taken.
✓ Branch 290 taken 1 times.
✓ Branch 291 taken 1 times.
✓ Branch 292 taken 1 times.
✗ Branch 293 not taken.
✓ Branch 294 taken 1 times.
✗ Branch 295 not taken.
✓ Branch 296 taken 1 times.
✗ Branch 297 not taken.
✓ Branch 298 taken 1 times.
✗ Branch 299 not taken.
✓ Branch 300 taken 1 times.
✗ Branch 301 not taken.
✓ Branch 302 taken 1 times.
✗ Branch 303 not taken.
✓ Branch 304 taken 1 times.
|
10 | use_bias=use_bias, activation=trim(activation_name)) |
| 1262 | |||
| 1263 | call load_onnx_expanded_matrix_param( & | ||
| 1264 |
4/8✗ 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.
|
1 | typed_layer%params(1), inits(w_idx), num_outputs, num_inputs) |
| 1265 |
17/32✗ 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 taken 8 times.
✓ Branch 46 taken 1 times.
|
9 | typed_layer%params(2)%val(:,1) = inits(wk_idx)%data |
| 1266 | |||
| 1267 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(use_bias)then |
| 1268 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
1 | b_idx = find_node_initialiser_index(nodes(add1_idx), inits, num_inits) |
| 1269 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(b_idx .le. 0)then |
| 1270 | call stop_program('Neural operator bias initialiser missing for ' // & | ||
| 1271 | ✗ | trim(prefix)) | |
| 1272 | end if | ||
| 1273 |
17/32✗ 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 taken 8 times.
✓ Branch 46 taken 1 times.
|
9 | typed_layer%params(3)%val(:,1) = inits(b_idx)%data |
| 1274 | end if | ||
| 1275 | |||
| 1276 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocate(layer, source=typed_layer) |
| 1277 | |||
| 1278 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | end function build_neural_operator_onnx_expanded_nop |
| 1279 | !############################################################################### | ||
| 1280 | |||
| 1281 | |||
| 1282 | !############################################################################### | ||
| 1283 | ✗ | function classify_spectral_filter_onnx_expanded_nop(prefix, nodes, & | |
| 1284 | num_nodes) result(is_spectral_filter) | ||
| 1285 | !! Return true when the expanded-ONNX node cluster | ||
| 1286 | !! for prefix is a spectral filter. | ||
| 1287 | implicit none | ||
| 1288 | |||
| 1289 | ! Arguments | ||
| 1290 | character(*), intent(in) :: prefix | ||
| 1291 | !! Expanded-ONNX layer prefix (e.g. "layer4") | ||
| 1292 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1293 | !! Parsed ONNX nodes | ||
| 1294 | integer, intent(in) :: num_nodes | ||
| 1295 | !! Number of valid node entries | ||
| 1296 | |||
| 1297 | logical :: is_spectral_filter | ||
| 1298 | !! Return value | ||
| 1299 | |||
| 1300 | !! Spectral filter has Mul but not Exp/Exp_1 or ReduceMean or MatMul_3 | ||
| 1301 | is_spectral_filter = & | ||
| 1302 | find_onnx_expanded_node_by_suffix( & | ||
| 1303 | ✗ | nodes, num_nodes, prefix, 'Mul') .gt. 0 & | |
| 1304 | .and. & | ||
| 1305 | find_onnx_expanded_node_by_suffix( & | ||
| 1306 | ✗ | nodes, num_nodes, prefix, 'Exp') .le. 0 & | |
| 1307 | .and. & | ||
| 1308 | find_onnx_expanded_node_by_suffix( & | ||
| 1309 | ✗ | nodes, num_nodes, prefix, 'ReduceMean') .le. 0 & | |
| 1310 | .and. & | ||
| 1311 | find_onnx_expanded_node_by_suffix( & | ||
| 1312 | ✗ | nodes, num_nodes, prefix, 'MatMul_3') .le. 0 | |
| 1313 | |||
| 1314 | ✗ | end function classify_spectral_filter_onnx_expanded_nop | |
| 1315 | !############################################################################### | ||
| 1316 | |||
| 1317 | |||
| 1318 | !############################################################################### | ||
| 1319 | ✗ | function build_spectral_filter_onnx_expanded_nop( & | |
| 1320 | ✗ | prefix, nodes, num_nodes, inits, num_inits) result(layer) | |
| 1321 | !! Build one spectral filter layer from an expanded-ONNX node cluster. | ||
| 1322 | use athena__spectral_filter_layer, only: spectral_filter_layer_type | ||
| 1323 | implicit none | ||
| 1324 | |||
| 1325 | ! Arguments | ||
| 1326 | character(*), intent(in) :: prefix | ||
| 1327 | !! Layer node prefix (e.g. layer4) | ||
| 1328 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1329 | !! Parsed ONNX nodes | ||
| 1330 | integer, intent(in) :: num_nodes | ||
| 1331 | !! Number of valid node entries | ||
| 1332 | type(onnx_initialiser_type), intent(in) :: inits(:) | ||
| 1333 | !! Parsed ONNX initialisers | ||
| 1334 | integer, intent(in) :: num_inits | ||
| 1335 | !! Number of valid initialiser entries | ||
| 1336 | class(base_layer_type), allocatable :: layer | ||
| 1337 | !! Constructed spectral filter layer | ||
| 1338 | |||
| 1339 | ! Local variables | ||
| 1340 | ✗ | type(spectral_filter_layer_type) :: typed_layer | |
| 1341 | !! Concrete layer object before up-casting | ||
| 1342 | integer :: mul_idx, matmul_idx, add1_idx | ||
| 1343 | !! Node indices for the spectral filter decomposition | ||
| 1344 | integer :: ws_idx, w_idx, b_idx | ||
| 1345 | !! Initialiser indices used to populate the layer parameters | ||
| 1346 | integer :: num_inputs, num_outputs, num_modes | ||
| 1347 | !! Reconstructed layer dimensions | ||
| 1348 | logical :: use_bias | ||
| 1349 | !! Whether the graph includes a bias add | ||
| 1350 | character(64) :: activation_name | ||
| 1351 | !! Activation reconstructed from the tail of the graph | ||
| 1352 | |||
| 1353 | ✗ | mul_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1354 | ✗ | 'Mul') | |
| 1355 | ✗ | matmul_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1356 | ✗ | 'MatMul') | |
| 1357 | ✗ | add1_idx = find_onnx_expanded_node_by_suffix(nodes, num_nodes, prefix, & | |
| 1358 | ✗ | 'Add_1') | |
| 1359 | |||
| 1360 | ✗ | if(mul_idx .le. 0 .or. matmul_idx .le. 0)then | |
| 1361 | call stop_program('Spectral filter ONNX cluster is incomplete for ' // & | ||
| 1362 | ✗ | trim(prefix)) | |
| 1363 | end if | ||
| 1364 | |||
| 1365 | ✗ | ws_idx = find_node_initialiser_index(nodes(mul_idx), inits, num_inits) | |
| 1366 | ✗ | w_idx = find_node_initialiser_index(nodes(matmul_idx), inits, num_inits) | |
| 1367 | |||
| 1368 | ✗ | if(min(ws_idx, w_idx) .le. 0)then | |
| 1369 | call stop_program('Spectral filter ONNX parameters are missing for ' // & | ||
| 1370 | ✗ | trim(prefix)) | |
| 1371 | end if | ||
| 1372 | |||
| 1373 | ✗ | num_modes = inits(ws_idx)%dims(1) | |
| 1374 | ✗ | num_outputs = inits(w_idx)%dims(1) | |
| 1375 | ✗ | num_inputs = inits(w_idx)%dims(2) | |
| 1376 | ✗ | use_bias = add1_idx .gt. 0 | |
| 1377 | activation_name = detect_onnx_expanded_nop_activation( & | ||
| 1378 | ✗ | prefix, nodes, num_nodes) | |
| 1379 | |||
| 1380 | typed_layer = spectral_filter_layer_type( & | ||
| 1381 | num_outputs=num_outputs, num_modes=num_modes, & | ||
| 1382 | num_inputs=num_inputs, use_bias=use_bias, & | ||
| 1383 | ✗ | activation=trim(activation_name)) | |
| 1384 | |||
| 1385 | ✗ | typed_layer%params(1)%val(:,1) = inits(ws_idx)%data | |
| 1386 | call load_onnx_expanded_matrix_param( & | ||
| 1387 | ✗ | typed_layer%params(2), inits(w_idx), num_outputs, num_inputs) | |
| 1388 | |||
| 1389 | ✗ | if(use_bias)then | |
| 1390 | ✗ | b_idx = find_node_initialiser_index(nodes(add1_idx), inits, num_inits) | |
| 1391 | ✗ | if(b_idx .le. 0)then | |
| 1392 | call stop_program('Spectral filter bias initialiser missing for ' // & | ||
| 1393 | ✗ | trim(prefix)) | |
| 1394 | end if | ||
| 1395 | ✗ | typed_layer%params(3)%val(:,1) = inits(b_idx)%data | |
| 1396 | end if | ||
| 1397 | |||
| 1398 | ✗ | allocate(layer, source=typed_layer) | |
| 1399 | |||
| 1400 | ✗ | end function build_spectral_filter_onnx_expanded_nop | |
| 1401 | !############################################################################### | ||
| 1402 | |||
| 1403 | |||
| 1404 | !############################################################################### | ||
| 1405 | ! Expanded-ONNX GNN layer classifiers and builders | ||
| 1406 | !############################################################################### | ||
| 1407 | |||
| 1408 | |||
| 1409 | !############################################################################### | ||
| 1410 | 12 | function find_gnn_node(nodes, num_nodes, name) result(idx) | |
| 1411 | !! Return the index of a node with exact name match, or zero. | ||
| 1412 | implicit none | ||
| 1413 | |||
| 1414 | ! Arguments | ||
| 1415 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1416 | !! Parsed ONNX nodes | ||
| 1417 | integer, intent(in) :: num_nodes | ||
| 1418 | !! Number of valid node entries | ||
| 1419 | character(*), intent(in) :: name | ||
| 1420 | !! Exact node name to search for | ||
| 1421 | |||
| 1422 | integer :: idx | ||
| 1423 | !! Return value: index of the matching node, or zero if not found | ||
| 1424 | |||
| 1425 | ! Local variables | ||
| 1426 | integer :: i | ||
| 1427 | |||
| 1428 | 12 | idx = 0 | |
| 1429 |
2/2✓ Branch 0 taken 394 times.
✓ Branch 1 taken 7 times.
|
401 | do i = 1, num_nodes |
| 1430 |
6/10✗ Branch 0 not taken.
✓ Branch 1 taken 394 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 394 times.
✓ Branch 8 taken 394 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 394 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 5 times.
✓ Branch 13 taken 389 times.
|
401 | if(trim(nodes(i)%name) .eq. trim(name))then |
| 1431 | 5 | idx = i | |
| 1432 | 5 | return | |
| 1433 | end if | ||
| 1434 | end do | ||
| 1435 | |||
| 1436 |
1/2✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
|
19 | end function find_gnn_node |
| 1437 | !############################################################################### | ||
| 1438 | |||
| 1439 | |||
| 1440 | !############################################################################### | ||
| 1441 | 4 | function detect_gnn_expanded_activation( & | |
| 1442 | 4 | prefix, nodes, num_nodes) result(name) | |
| 1443 | !! Detect the activation op used in a GNN layer cluster. | ||
| 1444 | use athena__onnx_utils, only: onnx_to_athena_activation | ||
| 1445 | implicit none | ||
| 1446 | |||
| 1447 | ! Arguments | ||
| 1448 | character(*), intent(in) :: prefix | ||
| 1449 | !! Layer node prefix (e.g. "node_2") | ||
| 1450 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1451 | !! Parsed ONNX nodes | ||
| 1452 | integer, intent(in) :: num_nodes | ||
| 1453 | !! Number of valid node entries | ||
| 1454 | character(64) :: name | ||
| 1455 | !! Detected ATHENA activation name | ||
| 1456 | |||
| 1457 | integer :: i | ||
| 1458 | character(128) :: check_prefix | ||
| 1459 | |||
| 1460 | 4 | name = 'none' | |
| 1461 |
1/2✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
|
4 | write(check_prefix, '(A,"_t")') trim(prefix) |
| 1462 | |||
| 1463 |
2/2✓ Branch 0 taken 391 times.
✓ Branch 1 taken 4 times.
|
395 | do i = 1, num_nodes |
| 1464 |
6/10✗ Branch 0 not taken.
✓ Branch 1 taken 391 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 391 times.
✓ Branch 8 taken 391 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 391 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 225 times.
✓ Branch 13 taken 166 times.
|
391 | if(index(trim(nodes(i)%name), & |
| 1465 | 225 | trim(check_prefix)) .ne. 1) cycle | |
| 1466 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 166 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 166 times.
|
336 | select case(trim(nodes(i)%op_type)) |
| 1467 | case('Relu', 'LeakyRelu', 'Sigmoid', & | ||
| 1468 | 'Tanh', 'Selu', 'Swish') | ||
| 1469 | name = onnx_to_athena_activation( & | ||
| 1470 |
6/10✓ Branch 0 taken 166 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 161 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 5 times.
✓ Branch 12 taken 5 times.
✗ Branch 13 not taken.
|
332 | trim(nodes(i)%op_type)) |
| 1471 | end select | ||
| 1472 | end do | ||
| 1473 | |||
| 1474 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
4 | end function detect_gnn_expanded_activation |
| 1475 | !############################################################################### | ||
| 1476 | |||
| 1477 | |||
| 1478 | !############################################################################### | ||
| 1479 | 11 | function classify_kipf_onnx_expanded_gnn( & | |
| 1480 | 11 | prefix, nodes, num_nodes) result(is_kipf) | |
| 1481 | !! Return true when the expanded-ONNX node cluster | ||
| 1482 | !! for prefix is a Kipf GCN layer. | ||
| 1483 | !! | ||
| 1484 | !! Kipf layers have Pow nodes for D^{-1/2} normalisation | ||
| 1485 | !! (named {prefix}_t1_pow_coeff). | ||
| 1486 | implicit none | ||
| 1487 | |||
| 1488 | ! Arguments | ||
| 1489 | character(*), intent(in) :: prefix | ||
| 1490 | !! Layer prefix (e.g. "node_2") | ||
| 1491 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1492 | !! Parsed ONNX nodes | ||
| 1493 | integer, intent(in) :: num_nodes | ||
| 1494 | !! Number of valid node entries | ||
| 1495 | |||
| 1496 | logical :: is_kipf | ||
| 1497 | !! Return value: true when the cluster matches the Kipf GCN pattern | ||
| 1498 | |||
| 1499 | |||
| 1500 | is_kipf = & | ||
| 1501 | ✗ | find_gnn_node(nodes, num_nodes, & | |
| 1502 | trim(prefix)//'_t1_pow_coeff') & | ||
| 1503 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 11 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 11 times.
✓ Branch 8 taken 11 times.
✗ Branch 9 not taken.
|
11 | .gt. 0 |
| 1504 | |||
| 1505 |
1/2✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
|
22 | end function classify_kipf_onnx_expanded_gnn |
| 1506 | !############################################################################### | ||
| 1507 | |||
| 1508 | |||
| 1509 | !############################################################################### | ||
| 1510 | 3 | function build_kipf_onnx_expanded_gnn( & | |
| 1511 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | prefix, nodes, num_nodes, inits, & |
| 1512 | num_inits, inputs, num_inputs) & | ||
| 1513 | 3 | result(layer) | |
| 1514 | !! Build a Kipf GCN layer from an expanded-ONNX cluster. | ||
| 1515 | use athena__kipf_msgpass_layer, only: & | ||
| 1516 | kipf_msgpass_layer_type | ||
| 1517 | use athena__onnx_nop_utils, only: & | ||
| 1518 | find_initialiser_by_name | ||
| 1519 | use athena__onnx_utils, only: row_to_col_major_2d | ||
| 1520 | implicit none | ||
| 1521 | |||
| 1522 | ! Arguments | ||
| 1523 | character(*), intent(in) :: prefix | ||
| 1524 | !! Layer node prefix (e.g. "node_2") | ||
| 1525 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1526 | !! Parsed ONNX nodes | ||
| 1527 | integer, intent(in) :: num_nodes | ||
| 1528 | !! Number of valid node entries | ||
| 1529 | type(onnx_initialiser_type), intent(in) :: inits(:) | ||
| 1530 | !! Parsed ONNX initialisers | ||
| 1531 | integer, intent(in) :: num_inits | ||
| 1532 | !! Number of valid initialiser entries | ||
| 1533 | type(onnx_tensor_type), intent(in) :: inputs(:) | ||
| 1534 | !! Parsed ONNX graph input tensors | ||
| 1535 | integer, intent(in) :: num_inputs | ||
| 1536 | !! Number of valid graph input entries | ||
| 1537 | class(base_layer_type), allocatable :: layer | ||
| 1538 | !! Constructed Kipf GCN layer | ||
| 1539 | |||
| 1540 | integer :: t, nts, idx | ||
| 1541 | 3 | integer, allocatable :: nv_arr(:) | |
| 1542 | character(128) :: init_name | ||
| 1543 | character(64) :: msg_activation | ||
| 1544 | 3 | real(real32), allocatable :: col_data(:) | |
| 1545 | |||
| 1546 | ! Count timesteps by scanning for _t{N}_W inits | ||
| 1547 | 3 | nts = 0 | |
| 1548 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | do t = 1, 99 |
| 1549 | write(init_name, '(A,"_t",I0,"_W")') & | ||
| 1550 |
1/2✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
|
6 | trim(prefix), t |
| 1551 | idx = find_initialiser_by_name( & | ||
| 1552 |
4/8✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
|
6 | trim(init_name), inits, num_inits) |
| 1553 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
6 | if(idx .le. 0) exit |
| 1554 | 3 | nts = nts + 1 | |
| 1555 | end do | ||
| 1556 | |||
| 1557 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
3 | if(nts .eq. 0)then |
| 1558 | call stop_program( & | ||
| 1559 | 'Kipf ONNX cluster has no weights for ' & | ||
| 1560 | ✗ | // trim(prefix)) | |
| 1561 | end if | ||
| 1562 | |||
| 1563 | ! Build vertex feature array from init dims | ||
| 1564 |
8/16✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
|
3 | allocate(nv_arr(nts + 1)) |
| 1565 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
6 | do t = 1, nts |
| 1566 | write(init_name, '(A,"_t",I0,"_W")') & | ||
| 1567 |
1/2✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
|
3 | trim(prefix), t |
| 1568 | idx = find_initialiser_by_name( & | ||
| 1569 |
4/8✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
|
3 | trim(init_name), inits, num_inits) |
| 1570 | ! Kipf weight: [nv_out, nv_in] | ||
| 1571 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
|
3 | nv_arr(t+1) = inits(idx)%dims(1) |
| 1572 |
7/14✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
|
6 | if(t .eq. 1) nv_arr(1) = inits(idx)%dims(2) |
| 1573 | end do | ||
| 1574 | |||
| 1575 | msg_activation = detect_gnn_expanded_activation( & | ||
| 1576 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
|
3 | prefix, nodes, num_nodes) |
| 1577 | |||
| 1578 | 66 | block | |
| 1579 | 3 | type(kipf_msgpass_layer_type) :: kipf_layer | |
| 1580 | |||
| 1581 | kipf_layer = kipf_msgpass_layer_type( & | ||
| 1582 | num_vertex_features = nv_arr, & | ||
| 1583 | num_time_steps = nts, & | ||
| 1584 | activation = trim(msg_activation) & | ||
| 1585 |
82/320✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✓ Branch 42 taken 3 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 3 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 3 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 3 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 3 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 3 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 3 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 3 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 71 not taken.
✓ Branch 72 taken 3 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 3 times.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✓ Branch 79 taken 3 times.
✗ Branch 80 not taken.
✓ Branch 81 taken 3 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 3 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 3 times.
✓ Branch 86 taken 3 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 3 times.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✓ Branch 91 taken 3 times.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✓ Branch 123 taken 3 times.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✓ Branch 133 taken 3 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 3 times.
✗ Branch 136 not taken.
✓ Branch 137 taken 3 times.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✓ Branch 140 taken 3 times.
✓ Branch 141 taken 3 times.
✗ Branch 142 not taken.
✓ Branch 143 taken 3 times.
✓ Branch 144 taken 3 times.
✓ Branch 145 taken 3 times.
✗ Branch 146 not taken.
✓ Branch 147 taken 3 times.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✓ Branch 150 taken 3 times.
✗ Branch 151 not taken.
✓ Branch 152 taken 3 times.
✗ Branch 153 not taken.
✓ Branch 154 taken 3 times.
✗ Branch 155 not taken.
✓ Branch 156 taken 3 times.
✓ Branch 157 taken 3 times.
✗ Branch 158 not taken.
✗ Branch 160 not taken.
✓ Branch 161 taken 3 times.
✓ Branch 163 taken 3 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 3 times.
✗ Branch 167 not taken.
✓ Branch 168 taken 3 times.
✗ Branch 169 not taken.
✓ Branch 170 taken 3 times.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✓ Branch 173 taken 3 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 3 times.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✓ Branch 213 taken 3 times.
✗ Branch 215 not taken.
✓ Branch 216 taken 3 times.
✗ Branch 217 not taken.
✓ Branch 218 taken 3 times.
✗ Branch 219 not taken.
✓ Branch 220 taken 3 times.
✗ Branch 221 not taken.
✓ Branch 222 taken 3 times.
✗ Branch 223 not taken.
✓ Branch 224 taken 3 times.
✗ Branch 225 not taken.
✓ Branch 226 taken 3 times.
✗ Branch 228 not taken.
✓ Branch 229 taken 3 times.
✗ Branch 230 not taken.
✓ Branch 231 taken 3 times.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 235 not taken.
✓ Branch 236 taken 3 times.
✗ Branch 237 not taken.
✓ Branch 238 taken 3 times.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 242 not taken.
✓ Branch 243 taken 3 times.
✗ Branch 244 not taken.
✓ Branch 245 taken 3 times.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 249 not taken.
✓ Branch 250 taken 3 times.
✗ Branch 251 not taken.
✓ Branch 252 taken 3 times.
✗ Branch 253 not taken.
✓ Branch 254 taken 3 times.
✗ Branch 255 not taken.
✓ Branch 256 taken 3 times.
✓ Branch 257 taken 3 times.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✓ Branch 260 taken 3 times.
✗ Branch 261 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 264 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 267 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✗ Branch 286 not taken.
✗ Branch 287 not taken.
✗ Branch 288 not taken.
✗ Branch 289 not taken.
✗ Branch 290 not taken.
✗ Branch 291 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 294 not taken.
✗ Branch 295 not taken.
✗ Branch 296 not taken.
✗ Branch 297 not taken.
✓ Branch 298 taken 3 times.
✗ Branch 300 not taken.
✓ Branch 301 taken 3 times.
✓ Branch 302 taken 3 times.
✗ Branch 303 not taken.
✓ Branch 304 taken 3 times.
✗ Branch 305 not taken.
✓ Branch 306 taken 3 times.
✗ Branch 307 not taken.
✗ Branch 308 not taken.
✓ Branch 309 taken 3 times.
✓ Branch 310 taken 3 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 3 times.
✗ Branch 314 not taken.
✓ Branch 315 taken 3 times.
✗ Branch 316 not taken.
✗ Branch 317 not taken.
✓ Branch 318 taken 3 times.
✓ Branch 320 taken 3 times.
✗ Branch 321 not taken.
✗ Branch 322 not taken.
✓ Branch 323 taken 3 times.
✗ Branch 324 not taken.
✗ Branch 325 not taken.
✗ Branch 327 not taken.
✓ Branch 328 taken 3 times.
✓ Branch 329 taken 3 times.
✗ Branch 330 not taken.
✗ Branch 331 not taken.
✓ Branch 332 taken 3 times.
✓ Branch 334 taken 3 times.
✗ Branch 335 not taken.
✓ Branch 336 taken 3 times.
✗ Branch 337 not taken.
✓ Branch 338 taken 3 times.
✗ Branch 339 not taken.
✓ Branch 340 taken 3 times.
✗ Branch 341 not taken.
|
9 | ) |
| 1586 | |||
| 1587 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
6 | do t = 1, nts |
| 1588 | write(init_name, '(A,"_t",I0,"_W")') & | ||
| 1589 |
1/2✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
|
3 | trim(prefix), t |
| 1590 | idx = find_initialiser_by_name( & | ||
| 1591 |
4/8✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
|
3 | trim(init_name), inits, num_inits) |
| 1592 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
|
3 | if(allocated(inits(idx)%data) .and. & |
| 1593 | 3 | allocated(kipf_layer%params))then | |
| 1594 |
9/18✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
|
3 | allocate(col_data(size(inits(idx)%data))) |
| 1595 | call row_to_col_major_2d( & | ||
| 1596 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
3 | inits(idx)%data, col_data, & |
| 1597 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
|
6 | nv_arr(t+1), nv_arr(t)) |
| 1598 |
15/28✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 3 times.
✓ Branch 39 taken 26 times.
✓ Branch 40 taken 3 times.
|
29 | kipf_layer%params(t)%val(:,1) = col_data |
| 1599 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
6 | deallocate(col_data) |
| 1600 | end if | ||
| 1601 | end do | ||
| 1602 | |||
| 1603 |
23/84✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 3 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 3 times.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✓ Branch 53 taken 3 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 3 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 3 times.
✓ Branch 58 taken 3 times.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 3 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 3 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 3 times.
✓ Branch 67 taken 3 times.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✓ Branch 71 taken 3 times.
✓ Branch 72 taken 3 times.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✓ Branch 77 taken 3 times.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✓ Branch 80 taken 3 times.
✓ Branch 81 taken 3 times.
✗ Branch 82 not taken.
✗ Branch 84 not taken.
✓ Branch 85 taken 3 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 3 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 3 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 3 times.
|
69 | allocate(layer, source=kipf_layer) |
| 1604 | end block | ||
| 1605 | |||
| 1606 |
3/6✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
|
6 | end function build_kipf_onnx_expanded_gnn |
| 1607 | !############################################################################### | ||
| 1608 | |||
| 1609 | |||
| 1610 | !############################################################################### | ||
| 1611 | 7 | function classify_duvenaud_onnx_expanded_gnn( & | |
| 1612 | 7 | prefix, nodes, num_nodes) result(is_duvenaud) | |
| 1613 | !! Return true when the expanded-ONNX node cluster | ||
| 1614 | !! for prefix is a Duvenaud message-passing layer. | ||
| 1615 | !! | ||
| 1616 | !! Duvenaud layers contain ReduceSum, Clip, and Div | ||
| 1617 | !! nodes within their subgraph. | ||
| 1618 | implicit none | ||
| 1619 | |||
| 1620 | ! Arguments | ||
| 1621 | character(*), intent(in) :: prefix | ||
| 1622 | !! Layer prefix (e.g. "node_2") | ||
| 1623 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1624 | !! Parsed ONNX nodes | ||
| 1625 | integer, intent(in) :: num_nodes | ||
| 1626 | !! Number of valid node entries | ||
| 1627 | |||
| 1628 | logical :: is_duvenaud | ||
| 1629 | !! Return value: true when the cluster matches the Duvenaud pattern | ||
| 1630 | |||
| 1631 | ! Local variables | ||
| 1632 | integer :: i | ||
| 1633 | character(128) :: cluster_prefix | ||
| 1634 | logical :: has_reducesum, has_clip, has_div | ||
| 1635 | |||
| 1636 | 7 | has_reducesum = .false. | |
| 1637 | 7 | has_clip = .false. | |
| 1638 | 7 | has_div = .false. | |
| 1639 |
1/2✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
|
7 | write(cluster_prefix, '(A,"_")') trim(prefix) |
| 1640 | |||
| 1641 |
2/2✓ Branch 0 taken 210 times.
✓ Branch 1 taken 5 times.
|
215 | do i = 1, num_nodes |
| 1642 |
6/10✗ Branch 0 not taken.
✓ Branch 1 taken 210 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 210 times.
✓ Branch 8 taken 210 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 210 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 37 times.
✓ Branch 13 taken 173 times.
|
210 | if(index(trim(nodes(i)%name), & |
| 1643 | 37 | trim(cluster_prefix)) .ne. 1) cycle | |
| 1644 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 173 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 173 times.
|
346 | select case(trim(nodes(i)%op_type)) |
| 1645 | case('ReduceSum') | ||
| 1646 | 2 | has_reducesum = .true. | |
| 1647 | case('Clip') | ||
| 1648 | 4 | has_clip = .true. | |
| 1649 | case('Div') | ||
| 1650 |
5/6✓ Branch 0 taken 173 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 163 times.
|
346 | has_div = .true. |
| 1651 | end select | ||
| 1652 | if(has_reducesum .and. has_clip & | ||
| 1653 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 171 times.
|
178 | .and. has_div) exit |
| 1654 | end do | ||
| 1655 | |||
| 1656 | is_duvenaud = & | ||
| 1657 | 7 | has_reducesum .and. has_clip .and. has_div | |
| 1658 | |||
| 1659 |
1/2✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
|
14 | end function classify_duvenaud_onnx_expanded_gnn |
| 1660 | !############################################################################### | ||
| 1661 | |||
| 1662 | |||
| 1663 | !############################################################################### | ||
| 1664 | 1 | function build_duvenaud_onnx_expanded_gnn( & | |
| 1665 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | prefix, nodes, num_nodes, inits, & |
| 1666 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | num_inits, inputs, num_inputs) & |
| 1667 | 1 | result(layer) | |
| 1668 | !! Build a Duvenaud layer from an expanded-ONNX cluster. | ||
| 1669 | use athena__duvenaud_msgpass_layer, only: & | ||
| 1670 | duvenaud_msgpass_layer_type | ||
| 1671 | use athena__onnx_nop_utils, only: & | ||
| 1672 | find_initialiser_by_name | ||
| 1673 | use athena__onnx_utils, only: row_to_col_major_2d | ||
| 1674 | implicit none | ||
| 1675 | |||
| 1676 | ! Arguments | ||
| 1677 | character(*), intent(in) :: prefix | ||
| 1678 | !! Layer node prefix (e.g. "node_2") | ||
| 1679 | type(onnx_node_type), intent(in) :: nodes(:) | ||
| 1680 | !! Parsed ONNX nodes | ||
| 1681 | integer, intent(in) :: num_nodes | ||
| 1682 | !! Number of valid node entries | ||
| 1683 | type(onnx_initialiser_type), intent(in) :: inits(:) | ||
| 1684 | !! Parsed ONNX initialisers | ||
| 1685 | integer, intent(in) :: num_inits | ||
| 1686 | !! Number of valid initialiser entries | ||
| 1687 | type(onnx_tensor_type), intent(in) :: inputs(:) | ||
| 1688 | !! Parsed ONNX graph input tensors | ||
| 1689 | integer, intent(in) :: num_inputs | ||
| 1690 | !! Number of valid graph input entries | ||
| 1691 | class(base_layer_type), allocatable :: layer | ||
| 1692 | !! Constructed Duvenaud layer | ||
| 1693 | |||
| 1694 | ! Local variables | ||
| 1695 | integer :: t, nts, idx, n_out | ||
| 1696 | integer :: num_deg, min_deg, max_deg | ||
| 1697 | integer :: ne_in, nv_in_first, total_in | ||
| 1698 | 1 | integer, allocatable :: nv_arr(:), ne_arr(:) | |
| 1699 | character(128) :: init_name, rename_name | ||
| 1700 | character(64) :: msg_activation | ||
| 1701 | 1 | real(real32), allocatable :: col_data(:) | |
| 1702 | integer :: i, rename_idx, slice_size, d | ||
| 1703 | |||
| 1704 | ! Count timesteps | ||
| 1705 | 1 | nts = 0 | |
| 1706 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | do t = 1, 99 |
| 1707 | write(init_name, '(A,"_t",I0,"_W")') & | ||
| 1708 |
1/2✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
|
3 | trim(prefix), t |
| 1709 | idx = find_initialiser_by_name( & | ||
| 1710 |
4/8✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
|
3 | trim(init_name), inits, num_inits) |
| 1711 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
|
3 | if(idx .le. 0) exit |
| 1712 | 2 | nts = nts + 1 | |
| 1713 | end do | ||
| 1714 | |||
| 1715 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(nts .eq. 0)then |
| 1716 | call stop_program( & | ||
| 1717 | 'Duvenaud ONNX cluster has no weights' & | ||
| 1718 | ✗ | // ' for ' // trim(prefix)) | |
| 1719 | end if | ||
| 1720 | |||
| 1721 | ! Get first weight init to extract dims | ||
| 1722 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | write(init_name, '(A,"_t1_W")') trim(prefix) |
| 1723 | idx = find_initialiser_by_name( & | ||
| 1724 |
4/8✗ 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 taken 1 times.
✗ Branch 11 not taken.
|
1 | trim(init_name), inits, num_inits) |
| 1725 | ! 3D shape: [num_deg, nv_out, nv_in+ne] | ||
| 1726 |
4/8✗ 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.
|
1 | num_deg = inits(idx)%dims(1) |
| 1727 |
4/8✗ 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.
|
1 | total_in = inits(idx)%dims(3) |
| 1728 | |||
| 1729 | ! Get degree bounds from constant inits | ||
| 1730 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | write(init_name, '(A,"_t1_min_deg")') trim(prefix) |
| 1731 | idx = find_initialiser_by_name( & | ||
| 1732 |
4/8✗ 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 taken 1 times.
✗ Branch 11 not taken.
|
1 | trim(init_name), inits, num_inits) |
| 1733 | 1 | min_deg = 1 | |
| 1734 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(idx .gt. 0)then |
| 1735 | ✗ | if(allocated(inits(idx)%data))then | |
| 1736 | ✗ | min_deg = nint(inits(idx)%data(1)) | |
| 1737 | end if | ||
| 1738 | end if | ||
| 1739 | |||
| 1740 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | write(init_name, '(A,"_t1_max_deg")') trim(prefix) |
| 1741 | idx = find_initialiser_by_name( & | ||
| 1742 |
4/8✗ 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 taken 1 times.
✗ Branch 11 not taken.
|
1 | trim(init_name), inits, num_inits) |
| 1743 | 1 | max_deg = min_deg + num_deg - 1 | |
| 1744 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(idx .gt. 0)then |
| 1745 | ✗ | if(allocated(inits(idx)%data))then | |
| 1746 | ✗ | max_deg = nint(inits(idx)%data(1)) | |
| 1747 | end if | ||
| 1748 | end if | ||
| 1749 | |||
| 1750 | ! Determine ne from graph inputs via the rename | ||
| 1751 | ! Identity node: {prefix}_rename_edge → input is | ||
| 1752 | ! the graph input tensor with edge feature dims | ||
| 1753 | 1 | ne_in = 0 | |
| 1754 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | rename_name = trim(prefix) // '_rename_edge' |
| 1755 | rename_idx = find_gnn_node( & | ||
| 1756 |
4/8✗ 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 10 taken 1 times.
✗ Branch 11 not taken.
|
1 | nodes, num_nodes, trim(rename_name)) |
| 1757 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(rename_idx .gt. 0 .and. & |
| 1758 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocated(nodes(rename_idx)%inputs))then |
| 1759 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | do i = 1, num_inputs |
| 1760 |
6/10✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 1 times.
|
4 | if(trim(inputs(i)%name) .eq. & |
| 1761 |
4/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
|
2 | trim(nodes(rename_idx)%inputs(1)))then |
| 1762 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
2 | if(allocated(inputs(i)%dims) .and. & |
| 1763 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | size(inputs(i)%dims) .ge. 2)then |
| 1764 |
4/8✗ 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.
|
1 | ne_in = inputs(i)%dims(2) |
| 1765 | end if | ||
| 1766 | 1 | exit | |
| 1767 | end if | ||
| 1768 | end do | ||
| 1769 | end if | ||
| 1770 | |||
| 1771 | ! Build vertex and edge feature arrays | ||
| 1772 |
8/16✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
|
1 | allocate(nv_arr(nts + 1)) |
| 1773 |
8/16✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
|
1 | allocate(ne_arr(nts + 1)) |
| 1774 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
|
4 | ne_arr = ne_in |
| 1775 | |||
| 1776 | ! First timestep: infer nv_in from total - ne | ||
| 1777 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | write(init_name, '(A,"_t1_W")') trim(prefix) |
| 1778 | idx = find_initialiser_by_name( & | ||
| 1779 |
4/8✗ 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 taken 1 times.
✗ Branch 11 not taken.
|
1 | trim(init_name), inits, num_inits) |
| 1780 | 1 | nv_in_first = total_in - ne_in | |
| 1781 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | nv_arr(1) = nv_in_first |
| 1782 | |||
| 1783 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | do t = 1, nts |
| 1784 | write(init_name, '(A,"_t",I0,"_W")') & | ||
| 1785 |
1/2✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
|
2 | trim(prefix), t |
| 1786 | idx = find_initialiser_by_name( & | ||
| 1787 |
4/8✗ 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.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
|
2 | trim(init_name), inits, num_inits) |
| 1788 |
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.
|
3 | nv_arr(t+1) = inits(idx)%dims(2) |
| 1789 | end do | ||
| 1790 | |||
| 1791 | ! Get num_outputs from readout weight | ||
| 1792 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | write(init_name, '(A,"_ro_t1_R")') trim(prefix) |
| 1793 | idx = find_initialiser_by_name( & | ||
| 1794 |
4/8✗ 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 taken 1 times.
✗ Branch 11 not taken.
|
1 | trim(init_name), inits, num_inits) |
| 1795 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(idx .gt. 0)then |
| 1796 |
4/8✗ 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.
|
1 | n_out = inits(idx)%dims(1) |
| 1797 | else | ||
| 1798 | ✗ | n_out = nv_arr(nts + 1) | |
| 1799 | end if | ||
| 1800 | |||
| 1801 | msg_activation = detect_gnn_expanded_activation( & | ||
| 1802 |
3/6✗ 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.
|
1 | prefix, nodes, num_nodes) |
| 1803 | |||
| 1804 | 1 | block | |
| 1805 | 1 | type(duvenaud_msgpass_layer_type) :: duv_layer | |
| 1806 | |||
| 1807 | duv_layer = duvenaud_msgpass_layer_type( & | ||
| 1808 | num_vertex_features = nv_arr, & | ||
| 1809 | num_edge_features = ne_arr, & | ||
| 1810 | num_time_steps = nts, & | ||
| 1811 | num_outputs = n_out, & | ||
| 1812 | min_vertex_degree = min_deg, & | ||
| 1813 | max_vertex_degree = max_deg, & | ||
| 1814 | message_activation = msg_activation & | ||
| 1815 |
64/380✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 87 taken 1 times.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 times.
✗ Branch 94 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 1 times.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✓ Branch 117 taken 1 times.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✓ Branch 135 taken 1 times.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✓ Branch 138 taken 1 times.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✓ Branch 169 taken 1 times.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✓ Branch 172 taken 1 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 1 times.
✓ Branch 177 taken 1 times.
✓ Branch 178 taken 1 times.
✓ Branch 180 taken 1 times.
✗ Branch 181 not taken.
✓ Branch 182 taken 1 times.
✗ Branch 183 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✓ Branch 187 taken 1 times.
✓ Branch 188 taken 1 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 4 times.
✓ Branch 191 taken 1 times.
✓ Branch 192 taken 4 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 4 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 2 times.
✓ Branch 197 taken 2 times.
✗ Branch 198 not taken.
✓ Branch 199 taken 4 times.
✗ Branch 200 not taken.
✓ Branch 201 taken 4 times.
✗ Branch 202 not taken.
✓ Branch 203 taken 4 times.
✓ Branch 204 taken 1 times.
✗ Branch 205 not taken.
✗ Branch 207 not taken.
✓ Branch 208 taken 1 times.
✓ Branch 210 taken 1 times.
✗ Branch 211 not taken.
✓ Branch 213 taken 1 times.
✗ Branch 214 not taken.
✓ Branch 215 taken 1 times.
✗ Branch 216 not taken.
✓ Branch 217 taken 1 times.
✗ Branch 218 not taken.
✓ Branch 219 taken 1 times.
✗ Branch 220 not taken.
✗ Branch 222 not taken.
✓ Branch 223 taken 1 times.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
✓ Branch 239 taken 1 times.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✗ Branch 242 not taken.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✓ Branch 255 taken 1 times.
✗ Branch 256 not taken.
✓ Branch 257 taken 1 times.
✗ Branch 258 not taken.
✗ Branch 259 not taken.
✗ Branch 260 not taken.
✗ Branch 261 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 264 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 267 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 270 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 285 not taken.
✗ Branch 286 not taken.
✗ Branch 287 not taken.
✗ Branch 288 not taken.
✗ Branch 289 not taken.
✗ Branch 290 not taken.
✗ Branch 291 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 294 not taken.
✓ Branch 295 taken 1 times.
✗ Branch 296 not taken.
✗ Branch 297 not taken.
✗ Branch 298 not taken.
✗ Branch 299 not taken.
✗ Branch 300 not taken.
✗ Branch 301 not taken.
✗ Branch 302 not taken.
✗ Branch 303 not taken.
✗ Branch 304 not taken.
✗ Branch 305 not taken.
✗ Branch 306 not taken.
✗ Branch 307 not taken.
✗ Branch 308 not taken.
✗ Branch 309 not taken.
✗ Branch 310 not taken.
✗ Branch 311 not taken.
✗ Branch 312 not taken.
✓ Branch 313 taken 1 times.
✗ Branch 314 not taken.
✓ Branch 315 taken 1 times.
✗ Branch 316 not taken.
✓ Branch 317 taken 1 times.
✗ Branch 318 not taken.
✓ Branch 319 taken 1 times.
✗ Branch 320 not taken.
✓ Branch 321 taken 1 times.
✗ Branch 322 not taken.
✗ Branch 323 not taken.
✗ Branch 324 not taken.
✗ Branch 325 not taken.
✗ Branch 326 not taken.
✗ Branch 327 not taken.
✗ Branch 328 not taken.
✗ Branch 329 not taken.
✗ Branch 330 not taken.
✗ Branch 331 not taken.
✗ Branch 332 not taken.
✗ Branch 333 not taken.
✗ Branch 334 not taken.
✗ Branch 335 not taken.
✗ Branch 336 not taken.
✗ Branch 337 not taken.
✗ Branch 338 not taken.
✓ Branch 339 taken 1 times.
✗ Branch 340 not taken.
✓ Branch 341 taken 1 times.
✗ Branch 342 not taken.
✓ Branch 343 taken 1 times.
✗ Branch 344 not taken.
✓ Branch 345 taken 1 times.
✗ Branch 346 not taken.
✓ Branch 347 taken 1 times.
✗ Branch 348 not taken.
✓ Branch 349 taken 1 times.
✗ Branch 350 not taken.
✓ Branch 351 taken 1 times.
✗ Branch 352 not taken.
✓ Branch 353 taken 1 times.
✗ Branch 354 not taken.
✗ Branch 355 not taken.
✗ Branch 356 not taken.
✗ Branch 357 not taken.
✗ Branch 358 not taken.
✗ Branch 359 not taken.
✗ Branch 360 not taken.
✗ Branch 361 not taken.
✗ Branch 362 not taken.
✗ Branch 363 not taken.
✗ Branch 364 not taken.
✗ Branch 365 not taken.
✗ Branch 366 not taken.
✗ Branch 367 not taken.
✗ Branch 368 not taken.
✗ Branch 369 not taken.
✗ Branch 370 not taken.
✓ Branch 371 taken 1 times.
✗ Branch 372 not taken.
✗ Branch 373 not taken.
✗ Branch 374 not taken.
✗ Branch 375 not taken.
✗ Branch 376 not taken.
✗ Branch 377 not taken.
✗ Branch 378 not taken.
✗ Branch 379 not taken.
✗ Branch 380 not taken.
✗ Branch 381 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 384 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 387 not taken.
|
8 | ) |
| 1816 | |||
| 1817 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | do t = 1, nts |
| 1818 | ! Message weight: [num_deg, nv_out, nv_in+ne] | ||
| 1819 | write(init_name, '(A,"_t",I0,"_W")') & | ||
| 1820 |
1/2✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
|
2 | trim(prefix), t |
| 1821 | idx = find_initialiser_by_name( & | ||
| 1822 |
4/8✗ 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.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
|
2 | trim(init_name), inits, num_inits) |
| 1823 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
2 | if(allocated(inits(idx)%data) .and. & |
| 1824 | allocated(duv_layer%params))then | ||
| 1825 |
9/18✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
|
2 | allocate(col_data(size(inits(idx)%data))) |
| 1826 | ✗ | slice_size = nv_arr(t+1) * & | |
| 1827 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
|
2 | (nv_arr(t) + ne_arr(1)) |
| 1828 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
|
10 | do d = 1, num_deg |
| 1829 | call row_to_col_major_2d( & | ||
| 1830 |
2/4✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
|
16 | inits(idx)%data( & |
| 1831 | (d-1)*slice_size+1 : & | ||
| 1832 | d*slice_size), & | ||
| 1833 | ✗ | col_data( & | |
| 1834 | (d-1)*slice_size+1 : & | ||
| 1835 | d*slice_size), & | ||
| 1836 | ✗ | nv_arr(t+1), & | |
| 1837 |
16/32✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 8 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 8 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 8 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 8 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 8 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 8 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 8 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 8 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 8 times.
|
26 | nv_arr(t) + ne_arr(1)) |
| 1838 | end do | ||
| 1839 |
15/28✗ 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 taken 48 times.
✓ Branch 40 taken 2 times.
|
50 | duv_layer%params(t)%val(:,1) = col_data |
| 1840 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | deallocate(col_data) |
| 1841 | end if | ||
| 1842 | |||
| 1843 | ! Readout weight: [n_out, nv_out] | ||
| 1844 | write(init_name, '(A,"_ro_t",I0,"_R")') & | ||
| 1845 |
1/2✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
|
2 | trim(prefix), t |
| 1846 | idx = find_initialiser_by_name( & | ||
| 1847 |
4/8✗ 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.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
|
2 | trim(init_name), inits, num_inits) |
| 1848 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3 | if(idx .gt. 0)then |
| 1849 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
2 | if(allocated(inits(idx)%data) .and. & |
| 1850 | allocated(duv_layer%params))then | ||
| 1851 | ✗ | allocate(col_data( & | |
| 1852 |
9/18✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
|
2 | size(inits(idx)%data))) |
| 1853 | call row_to_col_major_2d( & | ||
| 1854 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
2 | inits(idx)%data, col_data, & |
| 1855 |
3/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
|
4 | n_out, nv_arr(t+1)) |
| 1856 | ✗ | duv_layer%params(nts + t)%val(:,1) = & | |
| 1857 |
15/28✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 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 12 times.
✓ Branch 38 taken 2 times.
|
14 | col_data |
| 1858 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
4 | deallocate(col_data) |
| 1859 | end if | ||
| 1860 | end if | ||
| 1861 | end do | ||
| 1862 | |||
| 1863 |
2/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | allocate(layer, source=duv_layer) |
| 1864 | end block | ||
| 1865 | |||
| 1866 |
4/8✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
2 | end function build_duvenaud_onnx_expanded_gnn |
| 1867 | !############################################################################### | ||
| 1868 | |||
| 1869 | |||
| 1870 |
18/24✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 1 times.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✓ Branch 21 taken 1 times.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 1 times.
✓ Branch 28 taken 1 times.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
|
35 | end module athena__onnx_creators |
| 1871 |