use super::*;
#[test]
fn test_wavenet_model_allocation() {
let model = build_tiny_wavenet();
assert_eq!(model.array1.layers.len(), 3);
assert_eq!(model.array2.layers.len(), 3);
assert_eq!(model.array1.head_outputs.len(), 2 * WAVENET_MAX_NUM_FRAMES); assert_eq!(model.array2.head_outputs.len(), WAVENET_MAX_NUM_FRAMES); assert!((model.head_scale - 0.02).abs() < 1e-6);
}
#[test]
fn test_wavenet_prewarm_no_nan() {
let mut model = build_tiny_wavenet();
model.prewarm();
for state in &model.array1.states {
for &v in state.layer_buffer.iter() {
assert!(v.is_finite(), "NaN/Inf detected in array1 after prewarm");
}
}
for state in &model.array2.states {
for &v in state.layer_buffer.iter() {
assert!(v.is_finite(), "NaN/Inf detected in array2 after prewarm");
}
}
}
#[test]
fn test_wavenet_process_zeros() {
let mut model = build_tiny_wavenet();
model.prewarm();
let input = [0.0f32; 16];
let mut output = [0.0f32; 16];
model.process(&input, &mut output);
for (i, &v) in output.iter().enumerate() {
assert!(v.is_finite(), "Output sample [{}] is NaN/Inf: {}", i, v);
}
}
#[test]
fn test_wavenet_process_deterministic() {
let mut model_a = build_tiny_wavenet();
let mut model_b = build_tiny_wavenet();
model_a.prewarm();
model_b.prewarm();
let input = [0.1f32; 8];
let mut out_a = [0.0f32; 8];
let mut out_b = [0.0f32; 8];
model_a.process(&input, &mut out_a);
model_b.process(&input, &mut out_b);
for i in 0..8 {
assert!(
(out_a[i] - out_b[i]).abs() < 1e-6,
"Non-deterministic result at sample [{}]: {} vs {}",
i,
out_a[i],
out_b[i]
);
}
}