Set the hyperparameters for the message passing layer
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(kipf_msgpass_layer_type), | intent(inout) | :: | this |
Instance of the message passing layer |
||
| integer, | intent(in), | dimension(:) | :: | num_vertex_features |
Number of vertex features |
|
| integer, | intent(in) | :: | num_time_steps |
Number of time steps |
||
| class(base_actv_type), | intent(in), | allocatable | :: | activation |
Activation function |
|
| class(base_init_type), | intent(in), | allocatable | :: | kernel_initialiser |
Kernel initialiser |
|
| integer, | intent(in), | optional | :: | verbose |
Verbosity level |
subroutine set_hyperparams_kipf( & this, & num_vertex_features, & num_time_steps, & activation, & kernel_initialiser, & verbose & ) !! Set the hyperparameters for the message passing layer use athena__activation, only: activation_setup use athena__initialiser, only: get_default_initialiser, initialiser_setup implicit none ! Arguments class(kipf_msgpass_layer_type), intent(inout) :: this !! Instance of the message passing layer integer, dimension(:), intent(in) :: num_vertex_features !! Number of vertex features integer, intent(in) :: num_time_steps !! Number of time steps class(base_actv_type), allocatable, intent(in) :: activation !! Activation function class(base_init_type), allocatable, intent(in) :: kernel_initialiser !! Kernel initialiser integer, optional, intent(in) :: verbose !! Verbosity level ! Local variables integer :: t !! Loop index character(len=256) :: buffer this%name = 'kipf' this%type = 'msgp' this%input_rank = 2 this%output_rank = 2 this%use_graph_output = .true. this%num_time_steps = num_time_steps if(allocated(this%num_vertex_features)) & deallocate(this%num_vertex_features) if(allocated(this%num_edge_features)) & deallocate(this%num_edge_features) if(size(num_vertex_features, 1) .eq. 1)then allocate( & this%num_vertex_features(0:num_time_steps), & source = num_vertex_features(1) & ) elseif(size(num_vertex_features, 1) .eq. num_time_steps + 1)then allocate( & this%num_vertex_features(0:this%num_time_steps), & source = num_vertex_features & ) else call stop_program( & "Error: num_vertex_features must be a scalar or a vector of length & &num_time_steps + 1" & ) end if allocate( this%num_edge_features(0:this%num_time_steps), source = 0 ) this%use_graph_input = .true. if(allocated(this%activation)) deallocate(this%activation) if(.not.allocated(activation))then this%activation = activation_setup("none") else allocate(this%activation, source=activation) end if if(allocated(this%kernel_init)) deallocate(this%kernel_init) if(.not.allocated(kernel_initialiser))then buffer = get_default_initialiser(this%activation%name) this%kernel_init = initialiser_setup(buffer) else allocate(this%kernel_init, source=kernel_initialiser) end if if(present(verbose))then if(abs(verbose).gt.0)then write(*,'("KIPF activation function: ",A)') & trim(this%activation%name) write(*,'("KIPF kernel initialiser: ",A)') & trim(this%kernel_init%name) end if end if if(allocated(this%num_params_msg)) deallocate(this%num_params_msg) allocate(this%num_params_msg(1:this%num_time_steps)) do t = 1, this%num_time_steps this%num_params_msg(t) = & this%num_vertex_features(t-1) * this%num_vertex_features(t) end do if(allocated(this%input_shape)) deallocate(this%input_shape) if(allocated(this%output_shape)) deallocate(this%output_shape) end subroutine set_hyperparams_kipf