#:include "common.fypp" #:set RANKS = range(2, MAXRANK + 1) module stdlib_specialfunctions use stdlib_kinds, only: int8, int16, int32, int64, sp, dp, xdp, qp implicit none private interface legendre !! version: experimental !! !! Legendre polynomial pure elemental module function legendre_fp64(n,x) result(leg) integer, intent(in) :: n real(dp), intent(in) :: x real(dp) :: leg end function end interface public :: legendre interface dlegendre !! version: experimental !! !! First derivative Legendre polynomial pure elemental module function dlegendre_fp64(n,x) result(dleg) integer, intent(in) :: n real(dp), intent(in) :: x real(dp) :: dleg end function end interface public :: dlegendre interface gaussian !! Version: experimental !! !! gaussian function !> ([Specification](../page/specs/stdlib_specialfunctions.html#gaussian)) #:for rk, rt in REAL_KINDS_TYPES elemental module function gaussian_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: gaussian interface gaussian_grad !! Version: experimental !! !! gradient of the gaussian function !> ([Specification](../page/specs/stdlib_specialfunctions.html#gaussian_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function gaussian_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: gaussian_grad interface elu !! Version: experimental !! !! exponential linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#elu)) #:for rk, rt in REAL_KINDS_TYPES elemental module function elu_${rk}$( x , a ) result( y ) ${rt}$, intent(in) :: x ${rt}$, intent(in) :: a ${rt}$ :: y end function #:endfor end interface public :: elu interface elu_grad !! Version: experimental !! !! gradient of the exponential linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#elu_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function elu_grad_${rk}$( x , a ) result( y ) ${rt}$, intent(in) :: x ${rt}$, intent(in) :: a ${rt}$ :: y end function #:endfor end interface public :: elu_grad interface relu !! Version: experimental !! !! Rectified linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#relu)) #:for rk, rt in REAL_KINDS_TYPES elemental module function relu_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: relu interface relu_grad !! Version: experimental !! !! Gradient rectified linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#relu_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function relu_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: relu_grad interface leaky_relu !! Version: experimental !! !! leaky Rectified linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#leaky_relu)) #:for rk, rt in REAL_KINDS_TYPES elemental module function leaky_relu_${rk}$( x , a ) result( y ) ${rt}$, intent(in) :: x ${rt}$, intent(in) :: a ${rt}$ :: y end function #:endfor end interface public :: leaky_relu interface leaky_relu_grad !! Version: experimental !! !! Gradient of the leaky Rectified linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#leaky_relu_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function leaky_relu_grad_${rk}$( x , a ) result( y ) ${rt}$, intent(in) :: x ${rt}$, intent(in) :: a ${rt}$ :: y end function #:endfor end interface public :: leaky_relu_grad interface gelu !! Version: experimental !! !! Gaussian error linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#gelu)) #:for rk, rt in REAL_KINDS_TYPES elemental module function gelu_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: gelu interface gelu_grad !! Version: experimental !! !! Gradient of the gaussian error linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#gelu_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function gelu_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: gelu_grad interface gelu_approx !! Version: experimental !! !! Approximated gaussian error linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#gelu_approx)) #:for rk, rt in REAL_KINDS_TYPES elemental module function gelu_approx_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: gelu_approx interface gelu_approx_grad !! Version: experimental !! !! Gradient of the approximated gaussian error linear unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#gelu_approx_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function gelu_approx_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: gelu_approx_grad interface selu !! Version: experimental !! !! Scaled Exponential Linear Unit !> ([Specification](../page/specs/stdlib_specialfunctions.html#selu)) #:for rk, rt in REAL_KINDS_TYPES elemental module function selu_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: selu interface selu_grad !! Version: experimental !! !! Scaled Exponential Linear Unit !> ([Specification](../page/specs/stdlib_specialfunctions.html#selu_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function selu_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: selu_grad interface sigmoid !! Version: experimental !! !! Sigmoid function !> ([Specification](../page/specs/stdlib_specialfunctions.html#sigmoid)) #:for rk, rt in REAL_KINDS_TYPES elemental module function sigmoid_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: sigmoid interface sigmoid_grad !! Version: experimental !! !! Gradient of the sigmoid function !> ([Specification](../page/specs/stdlib_specialfunctions.html#sigmoid_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function sigmoid_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: sigmoid_grad interface silu !! Version: experimental !! !! Sigmoid Linear Unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#silu)) #:for rk, rt in REAL_KINDS_TYPES elemental module function silu_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: silu interface silu_grad !! Version: experimental !! !! Gradient of the Sigmoid Linear Unit function !> ([Specification](../page/specs/stdlib_specialfunctions.html#silu_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function silu_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: silu_grad interface step !! Version: experimental !! !! Step function !> ([Specification](../page/specs/stdlib_specialfunctions.html#step)) #:for rk, rt in REAL_KINDS_TYPES elemental module function step_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: step interface step_grad !! Version: experimental !! !! Gradient of the step function !> ([Specification](../page/specs/stdlib_specialfunctions.html#step_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function step_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: step_grad interface softmax !! Version: experimental !! !! softmax function. Available for ranks 1 to 4 !> ([Specification](../page/specs/stdlib_specialfunctions.html#softmax)) #:for rk, rt in REAL_KINDS_TYPES pure module function softmax_r1_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x(:) ${rt}$ :: y(size(x)) end function #:for rank in RANKS pure module function softmax_r${rank}$_${rk}$( x , dim ) result( y ) ${rt}$, intent(in) :: x${ranksuffix(rank)}$ ${rt}$ :: y${shape_from_array_size('x', rank)}$ integer, intent(in), optional :: dim end function #:endfor #:endfor end interface public :: softmax interface softmax_grad !! Version: experimental !! !! Gradient of the softmax function. Available for ranks 1 to 4 !> ([Specification](../page/specs/stdlib_specialfunctions.html#softmax_grad)) #:for rk, rt in REAL_KINDS_TYPES pure module function softmax_grad_r1_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x(:) ${rt}$ :: y(size(x)) end function #:for rank in RANKS pure module function softmax_grad_r${rank}$_${rk}$( x , dim ) result( y ) ${rt}$, intent(in) :: x${ranksuffix(rank)}$ ${rt}$ :: y${shape_from_array_size('x', rank)}$ integer, intent(in), optional :: dim end function #:endfor #:endfor end interface public :: softmax_grad interface logsoftmax !! Version: experimental !! !! softmax function. Available for ranks 1 to 4 !> ([Specification](../page/specs/stdlib_specialfunctions.html#logsoftmax)) #:for rk, rt in REAL_KINDS_TYPES pure module function logsoftmax_r1_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x(:) ${rt}$ :: y(size(x)) end function #:for rank in RANKS pure module function logsoftmax_r${rank}$_${rk}$( x , dim ) result( y ) ${rt}$, intent(in) :: x${ranksuffix(rank)}$ ${rt}$ :: y${shape_from_array_size('x', rank)}$ integer, intent(in), optional :: dim end function #:endfor #:endfor end interface public :: logsoftmax interface softplus !! Version: experimental !! !! softplus function !> ([Specification](../page/specs/stdlib_specialfunctions.html#softplus)) #:for rk, rt in REAL_KINDS_TYPES elemental module function softplus_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: softplus interface softplus_grad !! Version: experimental !! !! Gradient of the softplus function !> ([Specification](../page/specs/stdlib_specialfunctions.html#softplus_grad)) #:for rk, rt in REAL_KINDS_TYPES elemental module function softplus_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: softplus_grad interface fast_tanh !! Version: experimental !! !! Fast approximation of the tanh function #:for rk, rt in REAL_KINDS_TYPES elemental module function fast_tanh_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: fast_tanh interface fast_tanh_grad !! Version: experimental !! !! gradient of the hyperbolic tangent function #:for rk, rt in REAL_KINDS_TYPES elemental module function fast_tanh_grad_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: fast_tanh_grad interface fast_erf !! Version: experimental !! !! Fast approximation of the erf function #:for rk, rt in REAL_KINDS_TYPES elemental module function fast_erf_${rk}$( x ) result( y ) ${rt}$, intent(in) :: x ${rt}$ :: y end function #:endfor end interface public :: fast_erf end module stdlib_specialfunctions