use super::*;
#[test]
fn new_rejects_bad_statistics() {
assert!(matches!(
LatentNorm::new(vec![0.0, 0.0], vec![1.0], LatentNorm::DEFAULT_EPS),
Err(Error::Validation(_))
));
assert!(matches!(
LatentNorm::new(
Vec::<f32>::new(),
Vec::<f32>::new(),
LatentNorm::DEFAULT_EPS
),
Err(Error::Validation(_))
));
assert_eq!(
LatentNorm::new(vec![0.0], vec![0.0], LatentNorm::DEFAULT_EPS)
.unwrap()
.std()[0],
LatentNorm::DEFAULT_EPS
);
assert!(matches!(
LatentNorm::new(vec![f32::NAN], vec![1.0], LatentNorm::DEFAULT_EPS),
Err(Error::Validation(_))
));
assert!(matches!(
LatentNorm::new(vec![0.0], vec![f32::NAN], LatentNorm::DEFAULT_EPS),
Err(Error::Validation(_))
));
}
#[test]
fn new_and_fit_reject_bad_eps() {
let latent = seq(2, 1, vec![0.0, 1.0]);
for bad in [0.0, -1.0, f32::NAN, f32::INFINITY] {
assert!(matches!(
LatentNorm::new(vec![0.0], vec![1.0], bad),
Err(Error::Validation(_))
));
assert!(matches!(
LatentNorm::fit([&latent], bad),
Err(Error::Validation(_))
));
}
}
#[test]
fn fit_rejects_empty_set() {
let none: [&FrameSeq; 0] = [];
assert!(matches!(
LatentNorm::fit(none, LatentNorm::DEFAULT_EPS),
Err(Error::Validation(_))
));
let empty = seq(0, 2, vec![]);
assert!(matches!(
LatentNorm::fit([&empty], LatentNorm::DEFAULT_EPS),
Err(Error::Validation(_))
));
}
#[test]
fn fit_rejects_bad_eps_before_consuming_latents() {
struct PanicOnPoll;
impl Iterator for PanicOnPoll {
type Item = &'static FrameSeq;
fn next(&mut self) -> Option<Self::Item> {
panic!("fit polled the latent iterator despite an invalid eps");
}
}
for bad in [0.0, -1.0, f32::NAN, f32::INFINITY] {
assert!(matches!(
LatentNorm::fit(PanicOnPoll, bad),
Err(Error::Validation(_))
));
}
}
#[test]
fn fit_rejects_dim_mismatch() {
let a = seq(1, 2, vec![0.0, 0.0]);
let b = seq(1, 3, vec![0.0, 0.0, 0.0]);
assert!(matches!(
LatentNorm::fit([&a, &b], LatentNorm::DEFAULT_EPS),
Err(Error::Shape { expected, actual }) if expected == vec![1, 2] && actual == vec![1, 3]
));
}
#[test]
fn apply_rejects_mismatched_dim() {
let norm = LatentNorm::new(vec![0.0, 0.0], vec![1.0, 1.0], LatentNorm::DEFAULT_EPS).unwrap();
let wrong_dim = seq(1, 3, vec![0.0, 0.0, 0.0]);
assert!(matches!(
norm.standardize(&wrong_dim),
Err(Error::Shape { expected, actual }) if expected == vec![1, 2] && actual == vec![1, 3]
));
assert!(matches!(
norm.unstandardize(&wrong_dim),
Err(Error::Shape { expected, actual }) if expected == vec![1, 2] && actual == vec![1, 3]
));
}