write_json_initialisers Subroutine

public subroutine write_json_initialisers(unit, inits, num_inits)

Write initialisers array to JSON with base64-encoded rawData

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: unit

Output unit receiving the JSON text

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

Initialiser collection to serialise

integer, intent(in) :: num_inits

Number of populated initialisers in the collection


Source Code

  subroutine write_json_initialisers(unit, inits, num_inits)
    !! Write initialisers array to JSON with base64-encoded rawData
    implicit none

    ! Arguments
    integer, intent(in) :: unit
    !! Output unit receiving the JSON text
    type(onnx_initialiser_type), intent(in), dimension(:) :: inits
    !! Initialiser collection to serialise
    integer, intent(in) :: num_inits
    !! Number of populated initialisers in the collection

    ! Local variables
    integer :: i, j, n
    !! Initialiser index, dimension index, and raw element count
    character(:), allocatable :: raw_b64
    !! Base64-encoded raw tensor payload

    write(unit, '(A)') '    "initializer": ['
    do i = 1, num_inits
       write(unit, '(A)') '      {'
       ! Dims
       if(allocated(inits(i)%dims))then
          write(unit, '(A)', advance='no') '        "dims": ['
          do j = 1, size(inits(i)%dims)
             if(j .gt. 1) write(unit, '(A)', advance='no') ', '
             write(unit, '("""",I0,"""")' , advance='no') inits(i)%dims(j)
          end do
          write(unit, '(A)') '],'
       end if
       ! Data type
       write(unit, '(A,I0,A)') '        "dataType": ', inits(i)%data_type, ','
       ! Name
       write(unit, '(A,A,A)') '        "name": "', &
            trim(adjustl(inits(i)%name)), '",'
       ! Raw data (base64 encoded)
       if(allocated(inits(i)%data))then
          n = size(inits(i)%data)
          call encode_float32_base64_alloc(inits(i)%data, n, raw_b64)
          write(unit, '(A,A,A)') '        "rawData": "', raw_b64, '"'
       else if(allocated(inits(i)%int_data))then
          n = size(inits(i)%int_data)
          call encode_int64_base64_alloc(inits(i)%int_data, n, raw_b64)
          write(unit, '(A,A,A)') '        "rawData": "', raw_b64, '"'
       else
          write(unit, '(A)') '        "rawData": ""'
       end if
       if(i .lt. num_inits)then
          write(unit, '(A)') '      },'
       else
          write(unit, '(A)') '      }'
       end if
    end do
    write(unit, '(A)') '    ]'

  end subroutine write_json_initialisers