native_neural_network 0.1.6

Lib no_std Rust for native neural network (.rnn)
Documentation
use super::NormError;

pub fn layer_norm_in_place(
    x: &mut [f32],
    gamma: &[f32],
    beta: &[f32],
    eps: f32,
) -> Result<(), NormError> {
    if x.is_empty() {
        return Err(NormError::Empty);
    }
    if gamma.len() != x.len() || beta.len() != x.len() {
        return Err(NormError::ShapeMismatch);
    }
    if !eps.is_finite() || eps <= 0.0 {
        return Err(NormError::InvalidEps);
    }

    let mean = x.iter().copied().sum::<f32>() / x.len() as f32;
    let mut var = 0.0f32;
    for v in x.iter() {
        let d = *v - mean;
        var += d * d;
    }
    var /= x.len() as f32;
    let inv_std = 1.0 / crate::math::sqrtf(var + eps);

    for i in 0..x.len() {
        let n = (x[i] - mean) * inv_std;
        x[i] = n * gamma[i] + beta[i];
    }

    Ok(())
}

pub fn layer_norm(
    input: &[f32],
    gamma: &[f32],
    beta: &[f32],
    eps: f32,
    out: &mut [f32],
) -> Result<(), NormError> {
    if out.len() != input.len() {
        return Err(NormError::ShapeMismatch);
    }
    out.copy_from_slice(input);
    layer_norm_in_place(out, gamma, beta, eps)
}