use crate::Float;
const SELU_LAMBDA: Float = 1.0507;
const SELU_ALPHA: Float = 1.6733;
#[inline]
pub fn linear(x: Float) -> Float {
x
}
#[inline]
pub fn relu(x: Float) -> Float {
x.max(0.0)
}
#[inline]
pub fn lrelu(x: Float, factor: Float) -> Float {
if x < 0.0 {
factor * x
} else {
x
}
}
#[inline]
pub fn elu(x: Float) -> Float {
if x < 0.0 {
x.exp_m1()
} else {
x
}
}
#[inline]
pub fn pelu(x: Float, a: Float, b: Float) -> Float {
if x < 0.0 {
a * (x / b).exp() - a
} else {
(a / b) * x
}
}
#[inline]
pub fn selu(x: Float) -> Float {
SELU_LAMBDA * if x < 0.0 { SELU_ALPHA * x.exp() - SELU_ALPHA } else { x }
}
#[inline]
pub fn sigmoid(x: Float) -> Float {
1.0 / (1.0 + (-x).exp())
}
#[inline]
pub fn tanh(x: Float) -> Float {
x.tanh()
}
#[inline]
pub fn abs(x: Float) -> Float {
x.abs()
}
#[inline]
pub fn quadratic(x: Float) -> Float {
x * x
}
#[inline]
pub fn cubic(x: Float) -> Float {
x * x * x
}
#[inline]
pub fn clip_linear(x: Float) -> Float {
x.min(1.0).max(-1.0)
}
#[inline]
pub fn gaussian(x: Float) -> Float {
(-x * x).exp()
}
#[inline]
pub fn softplus(x: Float) -> Float {
x.exp().ln_1p()
}
#[inline]
pub fn softmax(arr: &mut [Float]) {
let norm: Float = arr.iter().map(|x| x.exp()).sum();
for val in arr.iter_mut() {
*val = val.exp() / norm;
}
}