helena 0.1.0

Core types and component interfaces for helena, a latent data-to-waveform generation platform.
Documentation
use super::*;

#[test]
fn collapsed_samples_have_zero_dispersion() {
    let mean = latent([2, 2], vec![1.0, -2.0, 3.0, 0.5]);
    let samples = vec![mean.clone(), mean.clone(), mean];
    assert_eq!(sample_dispersion(&samples).unwrap(), 0.0);
}

#[test]
fn varied_samples_have_positive_dispersion() {
    let samples = vec![
        latent([1, 2], vec![0.0, 0.0]),
        latent([1, 2], vec![2.0, 0.0]),
    ];
    assert!(sample_dispersion(&samples).unwrap() > 0.0);
}

#[test]
fn sample_dispersion_matches_hand_computed_variance() {
    let samples = vec![
        latent([1, 2], vec![0.0, 5.0]),
        latent([1, 2], vec![2.0, 5.0]),
    ];
    assert!((sample_dispersion(&samples).unwrap() - 0.5).abs() < 1e-6);
}

#[test]
fn single_sample_is_total_and_zero() {
    let samples = vec![latent([2, 1], vec![1.0, 2.0])];
    assert_eq!(sample_dispersion(&samples).unwrap(), 0.0);
}

#[test]
fn rejects_empty_set() {
    assert!(matches!(sample_dispersion(&[]), Err(Error::Validation(_))));
}

// The old `rejects_tokens` and `rejects_non_finite_values` cases are gone: a
// `Latent<Continuous>` cannot hold tokens, and a `FrameSeq` cannot hold a NaN or
// infinity, so both former rejections are unrepresentable rather than validated.

#[test]
fn rejects_shape_mismatch() {
    let samples = vec![
        latent([1, 2], vec![0.0, 0.0]),
        latent([2, 1], vec![0.0, 0.0]),
    ];
    assert!(matches!(
        sample_dispersion(&samples),
        Err(Error::Validation(_))
    ));
}

#[test]
fn rejects_zero_element_latents() {
    let samples = vec![latent([0, 2], vec![]), latent([0, 2], vec![])];
    assert!(matches!(
        sample_dispersion(&samples),
        Err(Error::Validation(_))
    ));
}