helena 0.1.0

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

#[test]
fn accepts_valid_config() {
    valid_config().resolve().expect("valid config");
}

#[test]
fn rejects_zero_sample_rate() {
    let mut c = valid_config();
    c.sample_rate = 0;
    assert!(c.resolve().is_err());
}

#[test]
fn rejects_non_positive_clip_duration() {
    let mut c = valid_config();
    c.clip_duration_seconds = 0.0;
    assert!(c.clone().resolve().is_err());
    c.clip_duration_seconds = f32::NAN;
    assert!(c.resolve().is_err());
}

#[test]
fn rejects_empty_component_kind() {
    let mut c = valid_config();
    c.conditional_generator.kind = "  ".into();
    assert!(c.resolve().is_err());
}

#[test]
fn rejects_zero_latent_dim() {
    let mut c = valid_config();
    c.data_encoder.latent_dim = 0;
    assert!(c.resolve().is_err());
}

#[test]
fn rejects_overlap_not_smaller_than_window() {
    let mut c = valid_config();
    c.target_audio.segmentation.window_seconds = 4.0;
    c.target_audio.segmentation.overlap_seconds = 4.0;
    assert!(c.resolve().is_err());
}

#[test]
fn rejects_segmentation_that_rounds_to_zero_frames() {
    let mut c = valid_config();
    c.sample_rate = 1;
    c.target_audio.segmentation.window_seconds = 0.1;
    c.target_audio.segmentation.overlap_seconds = 0.0;
    assert!(c.resolve().is_err());
}

#[test]
fn rejects_overlap_that_rounds_up_to_window() {
    let mut c = valid_config();
    c.sample_rate = 1;
    c.target_audio.segmentation.window_seconds = 1.4;
    c.target_audio.segmentation.overlap_seconds = 0.6;
    assert!(c.resolve().is_err());
}

#[test]
fn rejects_non_positive_optimizer_settings() {
    let mut c = valid_config();
    c.training.batch_size = 0;
    assert!(c.resolve().is_err());

    let mut c = valid_config();
    c.training.max_steps = 0;
    assert!(c.resolve().is_err());

    let mut c = valid_config();
    c.training.learning_rate = 0.0;
    assert!(c.resolve().is_err());
}

#[test]
fn accepts_zero_temperature_but_rejects_negative() {
    // 0.0 temperature is the deterministic path: it resolves (to `None`), it
    // does not reject. A negative value still fails.
    let mut c = valid_config();
    c.generation.temperature = 0.0;
    let spec = c
        .clone()
        .resolve()
        .expect("zero temperature is the deterministic path");
    assert_eq!(spec.generation().temperature(), None);
    c.generation.temperature = -1.0;
    assert!(c.resolve().is_err());
}

#[test]
fn rejects_zero_candidates() {
    let mut c = valid_config();
    c.generation.num_candidates = 0;
    assert!(c.resolve().is_err());
}