rusty-machine 0.3.2

A machine learning library.
Documentation
use rm::linalg::matrix::Matrix;

#[test]
fn matrix_lup_decomp() {
    let a = Matrix::new(3, 3, vec![1., 3., 5., 2., 4., 7., 1., 1., 0.]);

    let (l, u, p) = a.lup_decomp();

    let l_true = vec![1., 0., 0., 0.5, 1., 0., 0.5, -1., 1.];
    let u_true = vec![2., 4., 7., 0., 1., 1.5, 0., 0., -2.];
    let p_true = vec![0., 1., 0., 1., 0., 0., 0., 0., 1.];

    assert_eq!(*p.data(), p_true);
    assert_eq!(*l.data(), l_true);
    assert_eq!(*u.data(), u_true);

    let e = Matrix::<f64>::new(5,
                               5,
                               vec![1., 2., 3., 4., 5., 3., 0., 4., 5., 6., 2., 1., 2., 3., 4.,
                                    0., 0., 0., 6., 5., 0., 0., 0., 5., 6.]);

    let (l, u, p) = e.lup_decomp();
    let k = p.transpose() * l * u;

    for i in 0..25 {
        assert_eq!(e.data()[i], k.data()[i]);
    }
}

#[test]
fn cholesky() {
    let a = Matrix::new(3, 3, vec![25., 15., -5., 15., 18., 0., -5., 0., 11.]);

    let l = a.cholesky();

    assert_eq!(*l.data(), vec![5., 0., 0., 3., 3., 0., -1., 1., 3.]);
}

#[test]
fn qr() {
    let a = Matrix::new(3, 3, vec![12., -51., 4., 6., 167., -68., -4., 24., -41.]);

    let (q, r) = a.qr_decomp();

    let tol = 1e-6;

    let true_q = Matrix::new(3,
                             3,
                             vec![-0.857143, 0.394286, 0.331429, -0.428571, -0.902857, -0.034286,
                                  0.285715, -0.171429, 0.942857]);
    let true_r = Matrix::new(3, 3, vec![-14., -21., 14., 0., -175., 70., 0., 0., -35.]);

    let q_diff = (q - true_q).into_vec();
    let r_diff = (r - true_r).into_vec();

    for val in q_diff {
        assert!(val < tol, format!("val is {0}", val));
    }


    for val in r_diff {
        assert!(val < tol, format!("val is {0}", val));
    }
}