build_network_from_json_gnn Subroutine

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.

Arguments

Type IntentOptional 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


Source Code

  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