athena__dynamic_lno_layer Module

Module containing implementation of a Laplace Neural Operator layer

This module implements a Laplace Neural Operator (LNO) layer that approximates an integral kernel operator in the Laplace-transform domain. It combines a spectral pathway (encode → spectral mixing → decode) with a local affine bypass:

where: - is the discretised input - are learnable Laplace-domain poles that define dynamic bases via - is the pole-residue encoder: , - are learnable residues; replaces the former full mixing R - is the pole-residue decoder: , - are the local (bypass) weights - is the bias - is the activation function - = num_modes, the number of spectral poles

Bases and are rebuilt from the current poles at every forward call via \texttt{rebuild_bases}.

Number of parameters (learnable): without bias, with bias.



Interfaces

public interface dynamic_lno_layer_type

  • private module function layer_setup(num_outputs, num_modes, num_inputs, use_bias, activation, kernel_initialiser, bias_initialiser, verbose) result(layer)

    Arguments

    Type IntentOptional Attributes Name
    integer, intent(in) :: num_outputs
    integer, intent(in) :: num_modes
    integer, intent(in), optional :: num_inputs
    logical, intent(in), optional :: use_bias
    class(*), intent(in), optional :: activation
    class(*), intent(in), optional :: kernel_initialiser
    class(*), intent(in), optional :: bias_initialiser
    integer, intent(in), optional :: verbose

    Return Value type(dynamic_lno_layer_type)


Derived Types

type, public, extends(learnable_layer_type) ::  dynamic_lno_layer_type

Type for a pole-residue Laplace Neural Operator layer

Components

Type Visibility Attributes Name Initial
class(base_actv_type), public, allocatable :: activation

Activation function

class(base_init_type), public, allocatable :: bias_init

Initialisers for kernel and bias

character(len=14), public :: bias_initialiser = ''

Initialisers for kernel and bias

integer, public, allocatable, dimension(:) :: bias_shape

Shape of biases

type(graph_type), public, allocatable, dimension(:) :: graph

Graph structure of input data

integer, public :: id

Unique identifier

logical, public :: inference = .false.

Inference mode

integer, public :: input_rank = 0

Rank of input data

integer, public, allocatable, dimension(:) :: input_shape

Input shape

class(base_init_type), public, allocatable :: kernel_init

Initialisers for kernel and bias

character(len=14), public :: kernel_initialiser = ''

Initialisers for kernel and bias

character(len=:), public, allocatable :: name

Layer name

integer, public :: num_inputs

Number of inputs (discretisation points)

integer, public :: num_modes

Number of Laplace spectral modes

integer, public :: num_outputs

Number of outputs (discretisation points)

integer, public :: num_params = 0

Number of learnable parameters

class(array_type), public, allocatable, dimension(:,:) :: output

Output

integer, public :: output_rank = 0

Rank of output data

integer, public, allocatable, dimension(:) :: output_shape

Output shape

type(array_type), public, allocatable, dimension(:) :: params

Learnable parameters

character(len=20), public :: subtype = repeat(" ", 20)
character(len=4), public :: type = 'base'

Layer type

logical, public :: use_bias = .false.

Layer has bias

logical, public :: use_graph_input = .false.

Use graph input

logical, public :: use_graph_output = .false.

Use graph output

integer, public, allocatable, dimension(:,:) :: weight_shape

Shape of weights

type(array_type), public, dimension(1) :: z

Temporary array for pre-activation values

Constructor

private module function layer_setup (num_outputs, num_modes, num_inputs, use_bias, activation, kernel_initialiser, bias_initialiser, verbose)

Finalizations Procedures

final :: finalise_dynamic_lno

Type-Bound Procedures

procedure, public :: add_t_t => add_learnable

Add two layers

procedure, public, pass(this) :: build_from_onnx => build_from_onnx_base

Build layer from ONNX node and initialiser

procedure, public, pass(this) :: emit_onnx_graph_inputs => emit_onnx_graph_inputs_base

Emit graph input tensor declarations for this layer

procedure, public, pass(this) :: emit_onnx_nodes => emit_onnx_nodes_dynamic_lno
procedure, public, pass(this) :: extract_output => extract_output_base

Extract the output of the layer as a standard real array

procedure, public, pass(this) :: forward => forward_dynamic_lno
procedure, public, pass(this) :: forward_eval => forward_eval_base

Forward pass of layer and return output for evaluation

procedure, public, pass(this) :: get_attributes => get_attributes_dynamic_lno
procedure, public, pass(this) :: get_bases => get_bases_dynamic_lno
procedure, public, pass(this) :: get_gradients

Get parameter gradients of layer

procedure, public, pass(this) :: get_num_params => get_num_params_dynamic_lno
procedure, public, pass(this) :: get_params

Get learnable parameters of layer

procedure, public, pass(this) :: init => init_dynamic_lno
procedure, public, pass(this) :: nullify_graph => nullify_graph_base

Nullify the forward pass data of the layer to free memory

Read more…
generic, public :: operator(+) => add_t_t

Operator overloading for addition

procedure, public, pass(this) :: print => print_base

Print the layer to a file with additional information

procedure, public, pass(this) :: print_to_unit => print_to_unit_dynamic_lno
procedure, public, pass(this) :: read => read_dynamic_lno
procedure, public, pass(this) :: reduce => reduce_learnable

Merge another learnable layer into this one

procedure, public, pass(this) :: set_gradients

Set learnable parameters of layer

procedure, public, pass(this) :: set_graph => set_graph_base

Set the graph structure of the input data !! this is adjacency and edge weighting

procedure, public, pass(this) :: set_hyperparams => set_hyperparams_dynamic_lno
procedure, public, pass(this) :: set_params

Set learnable parameters of layer

procedure, public, pass(this) :: set_rank => set_rank_base

Set the input and output ranks of the layer

procedure, public, pass(this) :: set_shape => set_shape_base

Set the input shape of the layer


Functions

public function read_dynamic_lno_layer(unit, verbose) result(layer)

Read a dynamic LNO layer from file and return it

Arguments

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

Input unit number

integer, intent(in), optional :: verbose

Verbosity level

Return Value class(base_layer_type), allocatable

Allocated base-layer instance containing the result

private function get_attributes_dynamic_lno(this) result(attributes)

Return list of dynamic LNO attributes for ONNX export

Arguments

Type IntentOptional Attributes Name
class(dynamic_lno_layer_type), intent(in) :: this

Instance of the dynamic LNO layer

Return Value type(onnx_attribute_type), allocatable, dimension(:)

List of attributes for ONNX export

private function get_bases_dynamic_lno(this) result(bases)

Rebuild the dynamic Laplace encoder/decoder bases from the current learnable pole values (params(1)).

Read more…

Arguments

Type IntentOptional Attributes Name
class(dynamic_lno_layer_type), intent(in) :: this

Layer instance providing pole values

Return Value type(array_type), dimension(2)

Encoder and decoder basis tensors rebuilt from poles

private pure function get_num_params_dynamic_lno(this) result(num_params)

Return the number of learnable parameters for the layer

Arguments

Type IntentOptional Attributes Name
class(dynamic_lno_layer_type), intent(in) :: this

Layer instance

Return Value integer

Total number of learnable parameters

private module function layer_setup(num_outputs, num_modes, num_inputs, use_bias, activation, kernel_initialiser, bias_initialiser, verbose) result(layer)

Arguments

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

Number of output features

integer, intent(in) :: num_modes

Number of learnable spectral poles

integer, intent(in), optional :: num_inputs

Number of input features when known at construction time

logical, intent(in), optional :: use_bias

Whether to allocate a bias term

class(*), intent(in), optional :: activation

Activation function specification

class(*), intent(in), optional :: kernel_initialiser

Kernel and bias initialiser specifications

class(*), intent(in), optional :: bias_initialiser

Kernel and bias initialiser specifications

integer, intent(in), optional :: verbose

Verbosity level

Return Value type(dynamic_lno_layer_type)

Constructed dynamic LNO layer


Subroutines

private subroutine emit_onnx_nodes_dynamic_lno(this, prefix, nodes, num_nodes, max_nodes, inits, num_inits, max_inits, input_name, is_last_layer, format)

Emit decomposed standard ONNX nodes for a Dynamic LNO layer.

Read more…

Arguments

Type IntentOptional Attributes Name
class(dynamic_lno_layer_type), intent(in) :: this

Dynamic LNO layer instance

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

Layer name prefix (e.g. "layer1")

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

Node accumulator

integer, intent(inout) :: num_nodes

Node counter

integer, intent(in) :: max_nodes

Node limit

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

Initialiser accumulator

integer, intent(inout) :: num_inits

Initialiser counter

integer, intent(in) :: max_inits

Initialiser limit

character(len=*), intent(in), optional :: input_name

Name of the input tensor (e.g. "input" or previous layer output)

logical, intent(in), optional :: is_last_layer

Whether this is the last layer in the network

integer, intent(in), optional :: format

Export format selector

private subroutine finalise_dynamic_lno(this)

Finalise the dynamic Laplace neural operator layer

Arguments

Type IntentOptional Attributes Name
type(dynamic_lno_layer_type), intent(inout) :: this

Layer instance to release

private subroutine forward_dynamic_lno(this, input)

Forward propagation for the Laplace Neural Operator layer

Read more…

Arguments

Type IntentOptional Attributes Name
class(dynamic_lno_layer_type), intent(inout) :: this

Layer instance to execute

class(array_type), intent(in), dimension(:,:) :: input

Input batch tensor collection

private subroutine init_dynamic_lno(this, input_shape, verbose)

Initialise parameter storage and output buffers for the layer

Arguments

Type IntentOptional Attributes Name
class(dynamic_lno_layer_type), intent(inout) :: this

Layer instance to initialise

integer, intent(in), dimension(:) :: input_shape

Input shape used to infer num_inputs

integer, intent(in), optional :: verbose

Verbosity level

private subroutine print_to_unit_dynamic_lno(this, unit)

Print dynamic LNO settings and parameters to a unit

Arguments

Type IntentOptional Attributes Name
class(dynamic_lno_layer_type), intent(in) :: this

Layer instance to print

integer, intent(in) :: unit

Output unit number

private subroutine read_dynamic_lno(this, unit, verbose)

Arguments

Type IntentOptional Attributes Name
class(dynamic_lno_layer_type), intent(inout) :: this

Layer instance to populate from file data

integer, intent(in) :: unit

Input unit number

integer, intent(in), optional :: verbose

Verbosity level

private subroutine set_hyperparams_dynamic_lno(this, num_outputs, num_modes, use_bias, activation, kernel_initialiser, bias_initialiser, verbose)

Arguments

Type IntentOptional Attributes Name
class(dynamic_lno_layer_type), intent(inout) :: this

Layer instance to configure

integer, intent(in) :: num_outputs

Number of output features

integer, intent(in) :: num_modes

Number of learnable spectral poles

logical, intent(in) :: use_bias

Whether to use a bias term

class(base_actv_type), intent(in), allocatable :: activation

Activation function object

class(base_init_type), intent(in), allocatable :: kernel_initialiser

Kernel and bias initialiser objects

class(base_init_type), intent(in), allocatable :: bias_initialiser

Kernel and bias initialiser objects

integer, intent(in), optional :: verbose

Verbosity level