Build a network containing GNN layers from parsed JSON data.
Metadata layer creation is delegated to the registered creator in list_of_onnx_meta_layer_creators, keyed by the subtype stored in the metadata value string. Standard (non-GNN) layer creation is delegated to the registered creator in list_of_onnx_layer_creators, keyed by the ONNX op_type.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(network_type), | intent(inout) | :: | network |
Network to populate from parsed ONNX content |
||
| type(onnx_node_type), | intent(in) | :: | nodes(:) |
Parsed ONNX nodes |
||
| integer, | intent(in) | :: | num_nodes |
Number of valid entries in nodes |
||
| type(onnx_initialiser_type), | intent(in) | :: | inits(:) |
Parsed ONNX initialisers |
||
| integer, | intent(in) | :: | num_inits |
Number of valid entries in inits |
||
| type(onnx_tensor_type), | intent(in) | :: | inputs(:) |
Parsed graph input tensors |
||
| integer, | intent(in) | :: | num_inputs |
Number of valid entries in inputs |
||
| type(onnx_tensor_type), | intent(in) | :: | outputs(:) |
Parsed graph output tensors |
||
| integer, | intent(in) | :: | num_outputs |
Number of valid entries in outputs |
||
| character(len=256), | intent(in) | :: | meta_keys(:) |
Metadata keys and values from metadataProps |
||
| character(len=256), | intent(in) | :: | meta_values(:) |
Metadata keys and values from metadataProps |
||
| integer, | intent(in) | :: | num_meta |
Number of valid metadata entries |
||
| integer, | intent(in) | :: | verbose_ |
Effective verbosity level |
subroutine build_network_from_json_gnn( & network, nodes, num_nodes, inits, num_inits, & inputs, num_inputs, outputs, num_outputs, & meta_keys, meta_values, num_meta, verbose_) !! Build a network containing GNN layers from parsed JSON data. !! !! Metadata layer creation is delegated to the registered creator in !! list_of_onnx_meta_layer_creators, keyed by the subtype stored in !! the metadata value string. !! Standard (non-GNN) layer creation is delegated to the registered !! creator in list_of_onnx_layer_creators, keyed by the ONNX op_type. use athena__base_layer, only: base_layer_type use athena__container_layer, only: list_of_onnx_meta_layer_creators, & allocate_list_of_onnx_meta_layer_creators, & list_of_onnx_layer_creators, & allocate_list_of_onnx_layer_creators implicit none ! Arguments type(network_type), intent(inout) :: network !! Network to populate from parsed ONNX content type(onnx_node_type), intent(in) :: nodes(:) !! Parsed ONNX nodes integer, intent(in) :: num_nodes !! Number of valid entries in nodes type(onnx_initialiser_type), intent(in) :: inits(:) !! Parsed ONNX initialisers integer, intent(in) :: num_inits !! Number of valid entries in inits type(onnx_tensor_type), intent(in) :: inputs(:) !! Parsed graph input tensors integer, intent(in) :: num_inputs !! Number of valid entries in inputs type(onnx_tensor_type), intent(in) :: outputs(:) !! Parsed graph output tensors integer, intent(in) :: num_outputs !! Number of valid entries in outputs character(256), intent(in) :: meta_keys(:), meta_values(:) !! Metadata keys and values from metadataProps integer, intent(in) :: num_meta !! Number of valid metadata entries integer, intent(in) :: verbose_ !! Effective verbosity level ! Local variables integer, allocatable :: ordered_layer_ids(:) !! Sorted unique layer ids discovered from metadata and node names integer :: i, layer_id, meta_index, node_index !! Loop index and per-layer lookup indices if(.not.allocated(list_of_onnx_meta_layer_creators))then call allocate_list_of_onnx_meta_layer_creators() end if if(.not.allocated(list_of_onnx_layer_creators))then call allocate_list_of_onnx_layer_creators() end if allocate(ordered_layer_ids(0)) do i = 1, num_meta call append_unique_layer_id_from_meta_key( & meta_keys(i), ordered_layer_ids) end do do i = 1, num_nodes call append_unique_primary_layer_id(nodes(i)%name, ordered_layer_ids) end do call sort_int_array(ordered_layer_ids) do i = 1, size(ordered_layer_ids) layer_id = ordered_layer_ids(i) meta_index = find_metadata_for_layer_id(meta_keys, num_meta, layer_id) if(meta_index .gt. 0)then call add_gnn_layer_from_metadata( & network, meta_keys(meta_index), meta_values(meta_index), & inits, num_inits, verbose_) cycle end if node_index = find_primary_node_for_layer_id(nodes, num_nodes, layer_id) if(node_index .le. 0) cycle call add_standard_layer_from_onnx( & network, layer_id, node_index, nodes, num_nodes, & inits, num_inits, verbose_) end do if(allocated(ordered_layer_ids)) deallocate(ordered_layer_ids) if(verbose_ .gt. 0)then write(*,*) 'Network built with ', network%num_layers, ' layers' end if end subroutine build_network_from_json_gnn