Read concatenate layer from file
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(concat_layer_type), | intent(inout) | :: | this |
Instance of the concatenate layer |
||
| integer, | intent(in) | :: | unit |
Unit number |
||
| integer, | intent(in), | optional | :: | verbose |
Verbosity level |
subroutine read_concat(this, unit, verbose) !! Read concatenate layer from file use athena__tools_infile, only: assign_val, assign_vec, get_val use coreutils, only: to_lower, to_upper, icount implicit none ! Arguments class(concat_layer_type), intent(inout) :: this !! Instance of the concatenate layer integer, intent(in) :: unit !! Unit number integer, optional, intent(in) :: verbose !! Verbosity level ! Local variables integer :: stat, verbose_ = 0 !! File status and verbosity level integer :: itmp1 = 0 !! Temporary integer integer :: input_rank = 0 !! Input rank integer, dimension(:), allocatable :: input_shape, input_layer_ids !! Input shape character(256) :: buffer, tag, err_msg !! Buffer, tag, and error message ! Initialise optional arguments !--------------------------------------------------------------------------- if(present(verbose)) verbose_ = verbose ! Loop over tags in layer card !--------------------------------------------------------------------------- tag_loop: do ! Check for end of file !------------------------------------------------------------------------ read(unit,'(A)',iostat=stat) buffer if(stat.ne.0)then write(err_msg,'("file encountered error (EoF?) before END ",A)') & to_upper(this%name) call stop_program(err_msg) return end if if(trim(adjustl(buffer)).eq."") cycle tag_loop ! Check for end of layer card !------------------------------------------------------------------------ if(trim(adjustl(buffer)).eq."END "//to_upper(trim(this%name)))then backspace(unit) exit tag_loop end if tag=trim(adjustl(buffer)) if(scan(buffer,"=").ne.0) tag=trim(tag(:scan(tag,"=")-1)) ! Read parameters from file !------------------------------------------------------------------------ select case(trim(tag)) case("INPUT_SHAPE") itmp1 = icount(get_val(buffer)) allocate(input_shape(itmp1), source=0) call assign_vec(buffer, input_shape, itmp1) case("INPUT_RANK") call assign_val(buffer, input_rank, itmp1) case("INPUT_LAYER_IDS") itmp1 = icount(get_val(buffer)) allocate(input_layer_ids(itmp1), source=0) call assign_vec(buffer, input_layer_ids, itmp1) case default ! Don't look for "e" due to scientific notation of numbers ! ... i.e. exponent (E+00) if(scan(to_lower(trim(adjustl(buffer))),& 'abcdfghijklmnopqrstuvwxyz').eq.0)then cycle tag_loop elseif(tag(:3).eq.'END')then cycle tag_loop end if write(err_msg,'("Unrecognised line in input file: ",A)') & trim(adjustl(buffer)) call stop_program(err_msg) return end select end do tag_loop if(allocated(input_shape))then if(input_rank.eq.0)then input_rank = size(input_shape) elseif(input_rank.ne.size(input_shape))then write(err_msg,'("input_rank (",I0,") does not match input_shape (",I0,")")') & input_rank, size(input_shape) call stop_program(err_msg) return end if elseif(input_rank.eq.0)then write(err_msg,'("input_rank must be provided if input_shape is not")') call stop_program(err_msg) return end if ! Set hyperparameters and initialise layer !--------------------------------------------------------------------------- call this%set_hyperparams( & input_layer_ids = input_layer_ids, & input_rank = input_rank, & verbose = verbose_ & ) call this%init(input_shape = input_shape) ! Check for end of layer card !--------------------------------------------------------------------------- read(unit,'(A)') buffer if(trim(adjustl(buffer)).ne."END "//to_upper(trim(this%name)))then write(0,*) trim(adjustl(buffer)) write(err_msg,'("END ",A," not where expected")') to_upper(this%name) call stop_program(err_msg) return end if end subroutine read_concat