use crate::math;
const EPS: f32 = 1e-6;
pub fn zc_rms_norm(x: &mut [f32], scale: &[f32], d_model: usize) {
let seq_len = x.len() / d_model;
debug_assert_eq!(x.len(), seq_len * d_model);
debug_assert_eq!(scale.len(), d_model);
for t in 0..seq_len {
let row = &mut x[t * d_model..(t + 1) * d_model];
zc_rms_norm_vec(row, scale);
}
}
pub fn zc_rms_norm_vec(x: &mut [f32], scale: &[f32]) {
debug_assert_eq!(x.len(), scale.len());
let mean_sq = x.iter().map(|v| v * v).sum::<f32>() / x.len() as f32;
let inv = 1.0 / math::sqrt(mean_sq + EPS); for (xi, &si) in x.iter_mut().zip(scale.iter()) {
*xi = (1.0 + si) * (*xi) * inv;
}
}