stdlib_specialfunctions.fypp Source File


Source Code

#: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