use super::*;
#[test]
fn cosine_schedule_spans_signal_to_noise() {
let schedule = CosineSchedule::default();
assert!((schedule.signal_variance(0.0).unwrap() - 1.0).abs() < 1e-6);
assert!(schedule.signal_variance(1.0).unwrap() < 1e-5);
assert!(schedule.level(0.0).unwrap().signal() > 0.999);
assert!(schedule.level(1.0).unwrap().noise() > 0.999);
}
#[test]
fn cosine_schedule_is_monotone_decreasing() {
let schedule = CosineSchedule::default();
let mut prev = schedule.signal_variance(0.0).unwrap();
for i in 1..=20 {
let g = schedule.signal_variance(i as f32 / 20.0).unwrap();
assert!(g <= prev, "gamma rose: {prev} -> {g}");
prev = g;
}
}
#[test]
fn schedule_new_bounds_offset() {
for bad in [
-1.0,
-0.0001,
f32::NAN,
f32::INFINITY,
CosineSchedule::MAX_OFFSET + 0.001,
1.0e7,
] {
assert!(matches!(
CosineSchedule::new(bad),
Err(Error::Validation(_))
));
}
assert!(CosineSchedule::new(0.0).is_ok());
assert!(CosineSchedule::new(CosineSchedule::MAX_OFFSET).is_ok());
}
#[test]
fn schedule_time_must_be_in_range() {
let schedule = CosineSchedule::default();
for bad in [-0.1, 1.1, f32::NAN, f32::INFINITY] {
assert!(matches!(
schedule.signal_variance(bad),
Err(Error::Validation(_))
));
assert!(matches!(schedule.level(bad), Err(Error::Validation(_))));
}
}