emit_constant_int64 Subroutine

public subroutine emit_constant_int64(name, values, dims, nodes, num_nodes, inits, num_inits)

Emit a Constant node producing an int64 tensor

Arguments

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

Constant node and output tensor name

integer, intent(in) :: values(:)

Constant values and tensor dimensions

integer, intent(in) :: dims(:)

Constant values and tensor dimensions

type(onnx_node_type), intent(inout), dimension(:) :: nodes

Node accumulator array

integer, intent(inout) :: num_nodes

Current number of populated nodes

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

Initialiser accumulator array (unused, kept for interface symmetry)

integer, intent(inout) :: num_inits

Current number of populated initialisers (unused)


Source Code

  subroutine emit_constant_int64(name, values, dims, &
       nodes, num_nodes, inits, num_inits)
    !! Emit a Constant node producing an int64 tensor
    implicit none

    ! Arguments
    character(*), intent(in) :: name
    !! Constant node and output tensor name
    integer, intent(in) :: values(:), dims(:)
    !! Constant values and tensor dimensions
    type(onnx_node_type), intent(inout), dimension(:) :: nodes
    !! Node accumulator array
    integer, intent(inout) :: num_nodes
    !! Current number of populated nodes
    type(onnx_initialiser_type), intent(inout), dimension(:) :: inits
    !! Initialiser accumulator array (unused, kept for interface symmetry)
    integer, intent(inout) :: num_inits
    !! Current number of populated initialisers (unused)

    ! Local variables
    character(4096) :: attr_str
    !! Serialized ONNX attribute JSON for the constant payload
    character(256) :: raw_b64
    !! Base64-encoded raw tensor data
    integer :: i
    !! Dimension loop index

    ! Encode int64 values as base64
    call encode_int64_base64(values, raw_b64)

    ! Build dims string
    attr_str = '        "attribute": [{"name": "value", "t": {'
    if(size(dims) .gt. 0)then
       attr_str = trim(attr_str) // '"dims": ['
       do i = 1, size(dims)
          if(i .gt. 1) attr_str = trim(attr_str) // ', '
          write(attr_str, '(A,"""",I0,"""")') trim(attr_str), dims(i)
       end do
       attr_str = trim(attr_str) // '], '
    end if
    attr_str = trim(attr_str) // '"dataType": 7, "rawData": "' // &
         trim(raw_b64) // '"}, "type": "TENSOR"}]'

    num_nodes = num_nodes + 1
    nodes(num_nodes)%name = trim(name)
    nodes(num_nodes)%op_type = 'Constant'
    allocate(nodes(num_nodes)%inputs(0))
    allocate(nodes(num_nodes)%outputs(1))
    nodes(num_nodes)%outputs(1) = trim(name)
    nodes(num_nodes)%attributes_json = trim(attr_str)

  end subroutine emit_constant_int64