conspire 0.6.0

The Rust interface to conspire.
Documentation
use super::{E, inverse_langevin, lambert_w, langevin, rosenbrock, rosenbrock_derivative};
use crate::math::{
    Vector,
    test::{TestError, assert_eq, assert_eq_within_tols},
};

const LENGTH: usize = 10_000;

mod inverse_langevin {
    use super::*;
    #[test]
    #[should_panic]
    fn above_one() {
        inverse_langevin(1.3);
    }
    #[test]
    #[should_panic]
    fn one() {
        inverse_langevin(1.0);
    }
    #[test]
    fn range() -> Result<(), TestError> {
        let mut x = -1.0;
        let dx = 2.0 / ((LENGTH + 1) as f64);
        (0..LENGTH).try_for_each(|_| {
            x += dx;
            assert_eq_within_tols(&langevin(inverse_langevin(x)), &x)
        })
    }
    #[test]
    fn zero() -> Result<(), TestError> {
        assert_eq(&inverse_langevin(0.0), &0.0)
    }
}

mod lambert_w {
    use super::*;
    #[test]
    fn end() -> Result<(), TestError> {
        assert_eq(&lambert_w(-1.0 / E), &-1.0)
    }
    #[test]
    fn euler() -> Result<(), TestError> {
        assert_eq(&lambert_w(E), &1.0)
    }
    #[test]
    #[should_panic]
    fn panic() {
        let _ = lambert_w(-10.0);
    }
    #[test]
    fn range() -> Result<(), TestError> {
        let mut x = -1.0 / E;
        let dx = (6.0 - x) / ((LENGTH + 1) as f64);
        let mut w = 0.0;
        (0..LENGTH).try_for_each(|_| {
            x += dx;
            w = lambert_w(x);
            assert_eq_within_tols(&(w * w.exp()), &x)
        })
    }
    #[test]
    fn zero() -> Result<(), TestError> {
        assert_eq(&lambert_w(0.0), &0.0)
    }
}

mod langevin {
    use super::*;
    #[test]
    fn zero() -> Result<(), TestError> {
        assert_eq(&langevin(0.0), &0.0)
    }
}

mod rosenbrock {
    use super::*;
    #[test]
    fn zero() -> Result<(), TestError> {
        assert_eq(&rosenbrock(&Vector::from([1.0; 3]), 1.0, 1.0), &0.0)
    }
    mod derivative {
        use super::*;
        #[test]
        fn zero() -> Result<(), TestError> {
            assert_eq(
                &rosenbrock_derivative(&Vector::from([1.0; 3]), 1.0, 1.0),
                &Vector::from([0.0; 3]),
            )
        }
    }
}