write_onnx_json_file Subroutine

subroutine write_onnx_json_file(file, ifmt, nodes, num_nodes, inits, num_inits, graph_inputs, num_inputs, graph_outputs, num_outputs, gnn_metadata, num_gnn_meta)

Write the collected export data to disk.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: file

Output file name

integer, intent(in) :: ifmt

Export format selector

type(onnx_node_type), intent(in) :: nodes(:)

Exported ONNX nodes

integer, intent(in) :: num_nodes

Number of exported nodes

type(onnx_initialiser_type), intent(in) :: inits(:)

Exported ONNX initialisers

integer, intent(in) :: num_inits

Number of exported initialisers

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

Graph input tensor specifications

integer, intent(in) :: num_inputs

Number of graph inputs

type(onnx_tensor_type), intent(in) :: graph_outputs(:)

Graph output tensor specifications

integer, intent(in) :: num_outputs

Number of graph outputs

character(len=4096), intent(in) :: gnn_metadata(:)

GNN metadata strings

integer, intent(in) :: num_gnn_meta

Number of metadata entries


Source Code

  subroutine write_onnx_json_file( &
       file, ifmt, nodes, num_nodes, inits, num_inits, &
       graph_inputs, num_inputs, graph_outputs, num_outputs, &
       gnn_metadata, num_gnn_meta)
    !! Write the collected export data to disk.
    use athena__onnx_utils, only: write_json_nodes, write_json_initialisers, &
         write_json_tensors
    implicit none

    ! Arguments
    character(*), intent(in) :: file
    !! Output file name
    integer, intent(in) :: ifmt
    !! Export format selector
    type(onnx_node_type), intent(in) :: nodes(:)
    !! Exported ONNX nodes
    integer, intent(in) :: num_nodes
    !! Number of exported nodes
    type(onnx_initialiser_type), intent(in) :: inits(:)
    !! Exported ONNX initialisers
    integer, intent(in) :: num_inits
    !! Number of exported initialisers
    type(onnx_tensor_type), intent(in) :: graph_inputs(:)
    !! Graph input tensor specifications
    integer, intent(in) :: num_inputs
    !! Number of graph inputs
    type(onnx_tensor_type), intent(in) :: graph_outputs(:)
    !! Graph output tensor specifications
    integer, intent(in) :: num_outputs
    !! Number of graph outputs
    character(4096), intent(in) :: gnn_metadata(:)
    !! GNN metadata strings
    integer, intent(in) :: num_gnn_meta
    !! Number of metadata entries

    ! Local variables
    integer :: unit, i
    !! Output unit and loop index

    open(newunit=unit, file=file, status='replace')
    write(unit, '(A)') '{'
    if(ifmt .eq. 2)then
       write(unit, '(A)') '  "irVersion": "7",'
       write(unit, '(A)') '  "producerName": "pytorch",'
       write(unit, '(A)') '  "producerVersion": "2.7.1",'
    else
       write(unit, '(A)') '  "irVersion": "8",'
       write(unit, '(A)') '  "producerName": "Athena",'
       write(unit, '(A,A,A)') '  "producerVersion": "', &
            trim(athena__version__), '",'
    end if
    write(unit, '(A)') '  "graph": {'

    call write_json_nodes(unit, nodes, num_nodes)
    write(unit, '(A)') ','
    if(ifmt .eq. 2)then
       write(unit, '(A)') '    "name": "main_graph",'
    else
       write(unit, '(A)') '    "name": "athena_network",'
    end if
    call write_json_initialisers(unit, inits, num_inits)
    write(unit, '(A)') ','
    call write_json_tensors(unit, 'input', graph_inputs, num_inputs)
    write(unit, '(A)') ','
    call write_json_tensors(unit, 'output', graph_outputs, num_outputs)

    if(ifmt .ne. 2 .and. num_gnn_meta .gt. 0)then
       write(unit, '(A)') ','
       write(unit, '(A)') '    "metadataProps": ['
       do i = 1, num_gnn_meta
          if(i .gt. 1) write(unit, '(A)') ','
          write(unit, '(A)') trim(gnn_metadata(i))
       end do
       write(unit, '(A)') ''
       write(unit, '(A)') '    ]'
    end if

    write(unit, '(A)') '  },'
    write(unit, '(A)') '  "opsetImport": ['
    write(unit, '(A)') '    {'
    write(unit, '(A)') '      "version": "17"'
    write(unit, '(A)') '    }'
    write(unit, '(A)') '  ]'
    write(unit, '(A)') '}'
    close(unit)

  end subroutine write_onnx_json_file