conspire 0.6.3

The Rust interface to conspire.
Documentation
use crate::{
    math::{
        Rank2, Scalar, Tensor,
        test::{TestError, assert_eq},
    },
    physics::{
        ROOM_TEMPERATURE,
        molecular::single_chain::{
            Ensemble, FreelyRotatingChain, MonteCarlo, MonteCarloInextensible,
        },
    },
};

const MODEL: FreelyRotatingChain = FreelyRotatingChain {
    link_angle: 0.4363323129985824,
    link_length: 1.0,
    number_of_links: 8,
    ensemble: Ensemble::Isometric(ROOM_TEMPERATURE),
};

#[test]
fn monte_carlo() {
    let (gamma, g) =
        MonteCarloInextensible::nondimensional_radial_distribution(&MODEL, 0.0, 333, 10_000, 1);
    gamma
        .into_iter()
        .zip(g)
        .for_each(|(gamma_i, g_i)| println!("[{gamma_i}, {g_i}],"));
}

#[test]
fn cosine_moments() -> Result<(), TestError> {
    let (cos, coscos, cos2, _) = MODEL.cosine_moments(3.3, 10_000, 1);
    let gamma_z = cos.iter().sum::<Scalar>() / MODEL.number_of_links as Scalar;
    assert!(gamma_z > 0.0 && gamma_z < 1.0);
    assert_eq(&coscos.transpose(), &coscos)?;
    coscos
        .into_iter()
        .zip(cos2)
        .enumerate()
        .try_for_each(|(i, (coscos_i, cos2_i))| assert_eq(&coscos_i[i], &cos2_i))
}