#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_quantize_activations_q8_0_negative() {
let activations = vec![-127.0f32; 32];
let (scales, quants) = quantize_activations_q8_0(&activations);
assert_eq!(scales.len(), 1);
for q in &quants {
assert_eq!(*q, -127);
}
}
#[test]
fn test_quantize_activations_q8_0_mixed() {
let activations: Vec<f32> = (0..64).map(|i| (i as f32 - 32.0) * 2.0).collect();
let (scales, quants) = quantize_activations_q8_0(&activations);
assert_eq!(scales.len(), 2); assert_eq!(quants.len(), 64);
assert!(quants.iter().all(|_| true)); }
#[test]
fn test_quantize_activations_q8_0_partial_block() {
let activations: Vec<f32> = (0..40).map(|i| i as f32).collect();
let (scales, quants) = quantize_activations_q8_0(&activations);
assert_eq!(scales.len(), 2); assert_eq!(quants.len(), 64);
for q in &quants[40..] {
assert_eq!(*q, 0);
}
}
#[test]
fn test_quantize_activations_q8_0_roundtrip_approximate() {
let activations: Vec<f32> = (0..32).map(|i| (i as f32) * 4.0).collect();
let (scales, quants) = quantize_activations_q8_0(&activations);
let dequant: Vec<f32> = quants.iter().map(|&q| scales[0] * q as f32).collect();
for i in 0..32 {
let diff = (activations[i] - dequant[i]).abs();
let tolerance = scales[0]; assert!(
diff <= tolerance,
"at {}: original={} dequant={} diff={}",
i,
activations[i],
dequant[i],
diff
);
}
}
include!("activation_quantize_rmsnorm.rs");
}