build_graph_inputs Subroutine

subroutine build_graph_inputs(network, ifmt, graph_inputs, num_inputs)

Build the ONNX graph input tensor specifications.

Arguments

Type IntentOptional Attributes Name
class(network_type), intent(in) :: network

Instance of the network

integer, intent(in) :: ifmt

Export format selector

type(onnx_tensor_type), intent(inout) :: graph_inputs(:)

Graph input tensor specifications

integer, intent(inout) :: num_inputs

Number of graph inputs


Source Code

  subroutine build_graph_inputs(network, ifmt, graph_inputs, num_inputs)
    !! Build the ONNX graph input tensor specifications.
    implicit none

    ! Arguments
    class(network_type), intent(in) :: network
    !! Instance of the network
    integer, intent(in) :: ifmt
    !! Export format selector
    type(onnx_tensor_type), intent(inout) :: graph_inputs(:)
    !! Graph input tensor specifications
    integer, intent(inout) :: num_inputs
    !! Number of graph inputs

    ! Local variables
    integer :: i, j, layer_id
    !! Loop indices and current layer identifier

    if(ifmt .eq. 2)then
       do i = 1, network%auto_graph%num_vertices
          layer_id = network%auto_graph%vertex(network%vertex_order(i))%id
          if(trim(network%model(layer_id)%layer%type) .ne. 'inpt') cycle
          num_inputs = 1
          graph_inputs(1)%name = 'input'
          graph_inputs(1)%elem_type = 1
          allocate(graph_inputs(1)%dims(2))
          graph_inputs(1)%dims = [ &
               1, network%model(layer_id)%layer%input_shape(1)]
          return
       end do
       return
    end if

    do i = 1, size(network%root_vertices, dim=1)
       layer_id = network%auto_graph%vertex(network%root_vertices(i))%id

       if(network%model(layer_id)%layer%use_graph_output)then
          num_inputs = num_inputs + 1
          write(graph_inputs(num_inputs)%name, '("input_",I0,"_vertex")') &
               network%model(layer_id)%layer%id
          graph_inputs(num_inputs)%elem_type = 1
          allocate(graph_inputs(num_inputs)%dims(2))
          allocate(graph_inputs(num_inputs)%dim_params(2))
          graph_inputs(num_inputs)%dim_params(1) = 'num_nodes'
          graph_inputs(num_inputs)%dims(1) = -1
          graph_inputs(num_inputs)%dim_params(2) = ''
          graph_inputs(num_inputs)%dims(2) = &
               network%model(layer_id)%layer%input_shape(1)

          if(network%model(layer_id)%layer%input_shape(2) .gt. 0)then
             num_inputs = num_inputs + 1
             write(graph_inputs(num_inputs)%name, '("input_",I0,"_edge")') &
                  network%model(layer_id)%layer%id
             graph_inputs(num_inputs)%elem_type = 1
             allocate(graph_inputs(num_inputs)%dims(2))
             allocate(graph_inputs(num_inputs)%dim_params(2))
             graph_inputs(num_inputs)%dim_params(1) = 'num_edges'
             graph_inputs(num_inputs)%dims(1) = -1
             graph_inputs(num_inputs)%dim_params(2) = ''
             graph_inputs(num_inputs)%dims(2) = &
                  network%model(layer_id)%layer%input_shape(2)
          end if

          num_inputs = num_inputs + 1
          write(graph_inputs(num_inputs)%name, &
               '("input_",I0,"_edge_index")') &
               network%model(layer_id)%layer%id
          graph_inputs(num_inputs)%elem_type = 7
          allocate(graph_inputs(num_inputs)%dims(2))
          allocate(graph_inputs(num_inputs)%dim_params(2))
          graph_inputs(num_inputs)%dim_params(1) = ''
          graph_inputs(num_inputs)%dims(1) = 3
          graph_inputs(num_inputs)%dim_params(2) = 'num_csr_entries'
          graph_inputs(num_inputs)%dims(2) = -1

          num_inputs = num_inputs + 1
          write(graph_inputs(num_inputs)%name, '("input_",I0,"_degree")') &
               network%model(layer_id)%layer%id
          graph_inputs(num_inputs)%elem_type = 7
          allocate(graph_inputs(num_inputs)%dims(1))
          allocate(graph_inputs(num_inputs)%dim_params(1))
          graph_inputs(num_inputs)%dim_params(1) = 'num_nodes'
          graph_inputs(num_inputs)%dims(1) = -1
       else
          num_inputs = num_inputs + 1
          write(graph_inputs(num_inputs)%name, '("input_",I0)') &
               network%model(layer_id)%layer%id
          graph_inputs(num_inputs)%elem_type = 1
          allocate(graph_inputs(num_inputs)%dims( &
               size(network%model(layer_id)%layer%input_shape) + 1))
          allocate(graph_inputs(num_inputs)%dim_params( &
               size(network%model(layer_id)%layer%input_shape) + 1))
          graph_inputs(num_inputs)%dim_params(1) = 'batch_size'
          graph_inputs(num_inputs)%dims(1) = -1

          do j = 1, size(network%model(layer_id)%layer%input_shape)
             graph_inputs(num_inputs)%dim_params(j+1) = ''
             graph_inputs(num_inputs)%dims(j+1) = &
                  network%model(layer_id)%layer%input_shape(j)
          end do
       end if
    end do

  end subroutine build_graph_inputs