helena 0.1.0

Core types and component interfaces for helena, a latent data-to-waveform generation platform.
Documentation
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(_))));
    }
}