From 4bfa3078f5d7aed1a441f2a73e7e7b6c743e4dbb Mon Sep 17 00:00:00 2001 From: Jeremie Vandenplas Date: Sun, 21 Sep 2025 09:22:23 +0200 Subject: [PATCH 1/5] Removed unused dt --- src/nf/nf_dense_layer_submodule.f90 | 1 - src/nf/nf_embedding_layer_submodule.f90 | 1 - src/nf/nf_flatten_layer_submodule.f90 | 1 - src/nf/nf_multihead_attention_layer_submodule.f90 | 5 ++--- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/nf/nf_dense_layer_submodule.f90 b/src/nf/nf_dense_layer_submodule.f90 index 6108489b..c43edf69 100644 --- a/src/nf/nf_dense_layer_submodule.f90 +++ b/src/nf/nf_dense_layer_submodule.f90 @@ -1,7 +1,6 @@ submodule(nf_dense_layer) nf_dense_layer_submodule use nf_activation, only: activation_function - use nf_base_layer, only: base_layer use nf_random, only: random_normal implicit none diff --git a/src/nf/nf_embedding_layer_submodule.f90 b/src/nf/nf_embedding_layer_submodule.f90 index 83992b22..967ba688 100644 --- a/src/nf/nf_embedding_layer_submodule.f90 +++ b/src/nf/nf_embedding_layer_submodule.f90 @@ -3,7 +3,6 @@ #define ABSOLUTE 2 submodule(nf_embedding_layer) nf_embedding_layer_submodule - use nf_base_layer, only: base_layer implicit none contains module function embedding_layer_cons(vocab_size, model_dimension, positional) result(res) diff --git a/src/nf/nf_flatten_layer_submodule.f90 b/src/nf/nf_flatten_layer_submodule.f90 index 55e99485..f03c8414 100644 --- a/src/nf/nf_flatten_layer_submodule.f90 +++ b/src/nf/nf_flatten_layer_submodule.f90 @@ -4,7 +4,6 @@ !! It is used internally by the layer type. !! It is not intended to be used directly by the user. - use nf_base_layer, only: base_layer implicit none diff --git a/src/nf/nf_multihead_attention_layer_submodule.f90 b/src/nf/nf_multihead_attention_layer_submodule.f90 index f78abafd..cbc67b74 100644 --- a/src/nf/nf_multihead_attention_layer_submodule.f90 +++ b/src/nf/nf_multihead_attention_layer_submodule.f90 @@ -1,6 +1,5 @@ submodule(nf_multihead_attention_layer) nf_multihead_attention_layer_submodule use nf_activation, only: softmax - use nf_base_layer, only: base_layer use nf_linear2d_layer, only: linear2d_layer implicit none @@ -288,7 +287,7 @@ module subroutine init_base(self, input_shape) self % model_dimension = input_shape(2) if (mod(self % model_dimension, self % n_heads) /= 0) then - write(stderr, '(a)'), 'Number of heads must be divisible by model dimension' + write(stderr, '(a)') 'Number of heads must be divisible by model dimension' error stop end if self % head_size = self % model_dimension / self % n_heads @@ -335,4 +334,4 @@ module subroutine init_base(self, input_shape) allocate(self % jacobian, mold=self % d_sdpa) allocate(self % d_normalize, mold=self % attention_matrix) end subroutine init_base -end submodule nf_multihead_attention_layer_submodule \ No newline at end of file +end submodule nf_multihead_attention_layer_submodule From 5110fc6d7804ec81e94ddd085e5de06a9fb9bae5 Mon Sep 17 00:00:00 2001 From: Jeremie Vandenplas Date: Sun, 21 Sep 2025 09:35:20 +0200 Subject: [PATCH 2/5] Set get_activation by name to pure --- src/nf/nf_activation.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nf/nf_activation.f90 b/src/nf/nf_activation.f90 index caeab138..6509a7da 100644 --- a/src/nf/nf_activation.f90 +++ b/src/nf/nf_activation.f90 @@ -733,7 +733,7 @@ pure function eval_3d_celu_prime(self, x) result(res) end function eval_3d_celu_prime ! Utility Functions - function get_activation_by_name(activation_name) result(res) + pure function get_activation_by_name(activation_name) result(res) character(len=*), intent(in) :: activation_name class(activation_function), allocatable :: res @@ -815,4 +815,4 @@ pure function get_name(self) result(name) end select end function get_name -end module nf_activation \ No newline at end of file +end module nf_activation From 6ed81fd1b770a1e8bb7861476bbe1371600b8171 Mon Sep 17 00:00:00 2001 From: Jeremie Vandenplas Date: Sun, 21 Sep 2025 09:37:56 +0200 Subject: [PATCH 3/5] Addition of get_optimizer_by_name and of get_name for optimizer DT --- src/nf/nf_optimizers.f90 | 51 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/nf/nf_optimizers.f90 b/src/nf/nf_optimizers.f90 index 9a6b1e1f..269308b2 100644 --- a/src/nf/nf_optimizers.f90 +++ b/src/nf/nf_optimizers.f90 @@ -18,6 +18,7 @@ module nf_optimizers type, abstract :: optimizer_base_type real :: learning_rate = 0.01 contains + procedure :: get_name procedure(init), deferred :: init procedure(minimize), deferred :: minimize end type optimizer_base_type @@ -312,4 +313,52 @@ pure subroutine minimize_adagrad(self, param, gradient) end subroutine minimize_adagrad -end module nf_optimizers \ No newline at end of file + + ! Utility Functions + !! Returns the default optimizer corresponding to the provided name + pure function get_optimizer_by_name(optimizer_name) result(res) + character(len=*), intent(in) :: optimizer_name + class(optimizer_base_type), allocatable :: res + + select case(trim(optimizer_name)) + case('adagrad') + allocate ( res, source = adagrad() ) + + case('adam') + allocate ( res, source = adam() ) + + case('rmsprop') + allocate ( res, source = rmsprop() ) + + case('sgd') + allocate ( res, source = sgd() ) + + case default + error stop 'optimizer_name must be one of: ' // & + '"adagrad", "adam", "rmsprop", "sgd".' + end select + + end function get_optimizer_by_name + + + !! Returns the name of the optimizer + pure function get_name(self) result(name) + class(optimizer_base_type), intent(in) :: self + character(:), allocatable :: name + + select type (self) + class is (adagrad) + name = 'adagrad' + class is (adam) + name = 'adam' + class is (rmsprop) + name = 'rmsprop' + class is (sgd) + name = 'sgd' + class default + error stop 'Unknown optimizer type.' + end select + + end function get_name + +end module nf_optimizers From f02a6fd8ec320c6a9d2075744947e475a0c38b97 Mon Sep 17 00:00:00 2001 From: Jeremie Vandenplas Date: Sun, 21 Sep 2025 10:22:49 +0200 Subject: [PATCH 4/5] nf_dense_layer: removed unused set_params --- src/nf/nf_dense_layer.f90 | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/nf/nf_dense_layer.f90 b/src/nf/nf_dense_layer.f90 index eebf6b29..52764ea0 100644 --- a/src/nf/nf_dense_layer.f90 +++ b/src/nf/nf_dense_layer.f90 @@ -98,15 +98,6 @@ module subroutine get_gradients_ptr(self, dw_ptr, db_ptr) real, pointer, intent(out) :: db_ptr(:) end subroutine get_gradients_ptr - module subroutine set_params(self, params) - !! Set the parameters of this layer. - !! The parameters are ordered as weights first, biases second. - class(dense_layer), intent(in out) :: self - !! Dense layer instance - real, intent(in), target :: params(:) - !! Parameters of this layer - end subroutine set_params - module subroutine init(self, input_shape) !! Initialize the layer data structures. !! From 37cd2d90c2fdc0c47e152586e79aec36738586e8 Mon Sep 17 00:00:00 2001 From: Jeremie Vandenplas Date: Sun, 21 Sep 2025 11:41:04 +0200 Subject: [PATCH 5/5] Removed non-required use --- src/nf/nf_layer_constructors_submodule.f90 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/nf/nf_layer_constructors_submodule.f90 b/src/nf/nf_layer_constructors_submodule.f90 index 23bb2284..594575fe 100644 --- a/src/nf/nf_layer_constructors_submodule.f90 +++ b/src/nf/nf_layer_constructors_submodule.f90 @@ -1,6 +1,5 @@ submodule(nf_layer_constructors) nf_layer_constructors_submodule - use nf_layer, only: layer use nf_conv1d_layer, only: conv1d_layer use nf_conv2d_layer, only: conv2d_layer use nf_dense_layer, only: dense_layer @@ -18,7 +17,7 @@ use nf_self_attention_layer, only: self_attention_layer use nf_embedding_layer, only: embedding_layer use nf_layernorm_layer, only: layernorm_layer - use nf_activation, only: activation_function, relu, sigmoid + use nf_activation, only: relu, sigmoid implicit none