sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
use sciforge::hub::prelude::*;

#[test]
fn first_derivative_x_squared() {
    let exp = Experiment::new(DomainType::Maths, "first_derivative")
        .param("f", ParameterValue::Vector(vec![0.0, 1.0, 4.0, 9.0, 16.0]))
        .param("dx", ParameterValue::Scalar(1.0));
    let out = ExperimentRunner::new().run(&exp).unwrap();
    if let RunOutput::Vector(v) = out {
        assert!(v.len() == 5);
        assert!((v[2] - 4.0).abs() < 1e-10, "d/dx(x²) at x=2 ≈ 4");
    } else {
        panic!("expected Vector, got {:?}", out);
    }
}

#[test]
fn second_derivative_x_squared() {
    let exp = Experiment::new(DomainType::Maths, "second_derivative")
        .param(
            "f",
            ParameterValue::Vector(vec![0.0, 1.0, 4.0, 9.0, 16.0, 25.0]),
        )
        .param("dx", ParameterValue::Scalar(1.0));
    let out = ExperimentRunner::new().run(&exp).unwrap();
    if let RunOutput::Vector(v) = out {
        for &val in &v[1..v.len() - 1] {
            assert!((val - 2.0).abs() < 1e-10, "d²/dx²(x²) = 2");
        }
    } else {
        panic!("expected Vector, got {:?}", out);
    }
}

#[test]
fn stat_binomial_pmf() {
    let exp = Experiment::new(DomainType::Maths, "stat_binomial_pmf")
        .param("k", ParameterValue::Scalar(3.0))
        .param("n", ParameterValue::Scalar(5.0))
        .param("p", ParameterValue::Scalar(0.5));
    let out = ExperimentRunner::new().run(&exp).unwrap();
    if let RunOutput::Scalar(v) = out {
        let expected = 10.0 * 0.5_f64.powi(5);
        assert!((v - expected).abs() < 1e-10);
    } else {
        panic!("expected Scalar, got {:?}", out);
    }
}

#[test]
fn rising_factorial() {
    let exp = Experiment::new(DomainType::Maths, "rising_factorial")
        .param("x", ParameterValue::Scalar(3.0))
        .param("n", ParameterValue::Scalar(4.0));
    let out = ExperimentRunner::new().run(&exp).unwrap();
    if let RunOutput::Scalar(v) = out {
        assert!((v - 360.0).abs() < 1e-8, "3*4*5*6 = 360, got {v}");
    } else {
        panic!("expected Scalar, got {:?}", out);
    }
}

#[test]
fn falling_factorial() {
    let exp = Experiment::new(DomainType::Maths, "falling_factorial")
        .param("x", ParameterValue::Scalar(5.0))
        .param("n", ParameterValue::Scalar(3.0));
    let out = ExperimentRunner::new().run(&exp).unwrap();
    if let RunOutput::Scalar(v) = out {
        assert!((v - 60.0).abs() < 1e-8, "5*4*3 = 60, got {v}");
    } else {
        panic!("expected Scalar, got {:?}", out);
    }
}