emit_initialisers Subroutine

public subroutine emit_initialisers(layer, prefix, inits, num_inits, max_inits)

Emit initialisers for a learnable layer

Arguments

Type IntentOptional Attributes Name
class(learnable_layer_type), intent(in) :: layer

Learnable layer containing parameter tensors and shape metadata

character(len=*), intent(in) :: prefix

Name prefix used to generate exported initialiser names

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

Initialiser accumulator array

integer, intent(inout) :: num_inits

Current number of populated initialisers

integer, intent(in) :: max_inits

Maximum number of initialisers available in the accumulator


Source Code

  subroutine emit_initialisers(layer, prefix, inits, num_inits, max_inits)
    !! Emit initialisers for a learnable layer
    implicit none

    ! Arguments
    class(learnable_layer_type), intent(in) :: layer
    !! Learnable layer containing parameter tensors and shape metadata
    character(*), intent(in) :: prefix
    !! Name prefix used to generate exported initialiser names
    type(onnx_initialiser_type), intent(inout), dimension(:) :: inits
    !! Initialiser accumulator array
    integer, intent(inout) :: num_inits
    !! Current number of populated initialisers
    integer, intent(in) :: max_inits
    !! Maximum number of initialisers available in the accumulator

    ! Local variables
    integer :: i, j, n
    !! Parameter index, shape index, and flattened tensor size
    character(128) :: name
    !! Generated ONNX initialiser name for the current parameter tensor

    if(.not.allocated(layer%params)) return

    do i = 1, size(layer%params)
       n = size(layer%params(i)%val, 1)
       num_inits = num_inits + 1
       write(name, '(A,"_param",I0)') trim(prefix), i
       inits(num_inits)%name = trim(name)
       inits(num_inits)%data_type = 1

       ! Set dims from weight_shape
       if(allocated(layer%weight_shape))then
          if(i .le. size(layer%weight_shape, 2))then
             j = 0
             allocate(inits(num_inits)%dims(size(layer%weight_shape, 1)))
             inits(num_inits)%dims = 0
             do j = 1, size(layer%weight_shape, 1)
                if(layer%weight_shape(j,i) .gt. 0)then
                   inits(num_inits)%dims(j) = layer%weight_shape(j,i)
                end if
             end do
             ! Remove zero dims
             inits(num_inits)%dims = pack(inits(num_inits)%dims, &
                  inits(num_inits)%dims .gt. 0)
          else
             allocate(inits(num_inits)%dims(1))
             inits(num_inits)%dims = [n]
          end if
       else
          allocate(inits(num_inits)%dims(1))
          inits(num_inits)%dims = [n]
       end if

       allocate(inits(num_inits)%data(n))
       ! Convert column-major to row-major for 2D weight matrices
       if(allocated(layer%weight_shape))then
          if(i .le. size(layer%weight_shape, 2))then
             if(count(layer%weight_shape(:,i) .gt. 0) .eq. 2)then
                call col_to_row_major_2d( &
                     layer%params(i)%val(:,1), &
                     inits(num_inits)%data, &
                     layer%weight_shape(1,i), &
                     layer%weight_shape(2,i))
             else
                inits(num_inits)%data = layer%params(i)%val(:,1)
             end if
          else
             inits(num_inits)%data = layer%params(i)%val(:,1)
          end if
       else
          inits(num_inits)%data = layer%params(i)%val(:,1)
       end if
    end do

  end subroutine emit_initialisers