flow-gate-core 0.1.0

Pure-Rust implementation of the ISAC Gating-ML 2.0 gate evaluation engine — transforms, gates, and event matrices
Documentation
use flow_gate_core::{
    FASinhTransform, HyperlogTransform, LinearTransform, LogarithmicTransform, Transform,
};

#[test]
fn logarithmic_nonpositive_is_nan() {
    let t = LogarithmicTransform::new(262_144.0, 4.5).expect("valid transform");
    for i in -1000..=0 {
        let x = i as f64;
        assert!(
            t.apply(x).is_nan(),
            "expected NaN for x={x}, got {}",
            t.apply(x)
        );
    }
}

#[test]
fn logarithmic_t_maps_to_one() {
    let t = LogarithmicTransform::new(262_144.0, 4.5).expect("valid transform");
    assert!((t.apply(262_144.0) - 1.0).abs() <= 1e-15);
}

#[test]
fn linear_endpoints() {
    let t = LinearTransform::new(200.0, 50.0).expect("valid linear transform");
    assert!((t.apply(-50.0) - 0.0).abs() <= 1e-15);
    assert!((t.apply(200.0) - 1.0).abs() <= 1e-15);
}

#[test]
fn fasinh_roundtrip_sample() {
    let t = FASinhTransform::new(262_144.0, 4.5, 0.0).expect("valid fasinh transform");
    let points = [-200_000.0, -1_000.0, -1.0, 0.0, 1.0, 1_000.0, 200_000.0];
    for x in points {
        let y = t.apply(x);
        let x2 = t.invert(y);
        let rel = (x - x2).abs() / x.abs().max(1.0);
        assert!(
            rel < 1e-9,
            "round-trip rel error too large for x={x}: {rel:e}"
        );
    }
}

#[test]
fn fasinh_non_finite_is_nan() {
    let t = FASinhTransform::new(262_144.0, 4.5, 0.0).expect("valid fasinh transform");
    assert!(t.apply(f64::NAN).is_nan());
    assert!(t.apply(f64::INFINITY).is_nan());
    assert!(t.apply(f64::NEG_INFINITY).is_nan());
}

#[test]
fn hyperlog_roundtrip_sample() {
    let t = HyperlogTransform::new(262_144.0, 0.5, 4.5, 0.0).expect("valid hyperlog transform");
    let points = [-20_000.0, -500.0, -2.0, 0.0, 2.0, 500.0, 20_000.0];
    for x in points {
        let y = t.apply(x);
        let x2 = t.invert(y);
        let rel = (x - x2).abs() / x.abs().max(1.0);
        assert!(
            rel < 1e-6,
            "hyperlog round-trip rel error too large for x={x}: {rel:e}"
        );
    }
}