GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_onnx_creators.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 444 612 72.5%
Functions: 0 0 -%
Branches: 2284 9850 23.2%

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