mini-matrix 0.1.6

A mini linear algebra library implemented in Rust.
Documentation
#[cfg(test)]
mod vector_tests {
    use mini_matrix::Vector;

    #[test]
    fn test_from() {
        let u = Vector::from([2., 3.]);
        assert_eq!(u.store, [2., 3.]);

        let v = Vector::from([5., 7., 9., 11.]);
        assert_eq!(v.store, [5., 7., 9., 11.]);
    }

    #[test]
    fn test_size() {
        let u = Vector::from([2., 3.]);
        assert_eq!(u.size(), 2);

        let v = Vector::from([5., 7., 9., 11.]);
        assert_eq!(v.size(), 4);
    }

    #[test]
    fn test_zero() {
        let u = Vector::<f32, 3>::zero();
        assert_eq!(u.store, [0., 0., 0.]);

        let v = Vector::<i32, 5>::zero();
        assert_eq!(v.store, [0, 0, 0, 0, 0]);
    }

    #[test]
    fn test_add() {
        let mut u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        u.add(&v);
        assert_eq!(u.store, [7., 10.]);
    }

    #[test]
    fn test_add_subject() {
        let v1 = Vector::from([0, 0]);
        let v2 = Vector::from([0, 0]);
        assert_eq!(v1 + v2, Vector::from([0, 0]));

        let v1 = Vector::from([1, 0]);
        let v2 = Vector::from([0, 1]);
        assert_eq!(v1 + v2, Vector::from([1, 1]));

        let v1 = Vector::from([1, 1]);
        let v2 = Vector::from([1, 1]);
        assert_eq!(v1 + v2, Vector::from([2, 2]));

        let v1 = Vector::from([21, 21]);
        let v2 = Vector::from([21, 21]);
        assert_eq!(v1 + v2, Vector::from([42, 42]));

        let v1 = Vector::from([-21, 21]);
        let v2 = Vector::from([21, -21]);
        assert_eq!(v1 + v2, Vector::from([0, 0]));

        let v1 = Vector::from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
        let v2 = Vector::from([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]);
        assert_eq!(v1 + v2, Vector::from([9, 9, 9, 9, 9, 9, 9, 9, 9, 9]));
    }

    #[test]
    fn test_sub() {
        let mut u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        u.sub(&v);
        assert_eq!(u.store, [-3., -4.]);
    }

    #[test]
    fn test_sub_subject() {
        assert_eq!(
            Vector::from([0, 0]) - Vector::from([0, 0]),
            Vector::from([0, 0])
        );

        assert_eq!(
            Vector::from([1, 0]) - Vector::from([0, 1]),
            Vector::from([1, -1])
        );

        assert_eq!(
            Vector::from([1, 1]) - Vector::from([1, 1]),
            Vector::from([0, 0])
        );

        assert_eq!(
            Vector::from([21, 21]) - Vector::from([21, 21]),
            Vector::from([0, 0])
        );

        assert_eq!(
            Vector::from([-21, 21]) - Vector::from([21, -21]),
            Vector::from([-42, 42])
        );

        assert_eq!(
            Vector::from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
                - Vector::from([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]),
            Vector::from([-9, -7, -5, -3, -1, 1, 3, 5, 7, 9])
        );
    }

    #[test]
    fn test_scl() {
        let mut u = Vector::from([2., 3.]);
        u.scl(3.);
        assert_eq!(u.store, [6., 9.]);
    }

    #[test]
    fn test_scl_subject() {
        let mut v0 = Vector::from([0.0, 0.0]);
        let mut v1 = Vector::from([1.0, 0.0]);
        let mut v2 = Vector::from([1.0, 1.0]);
        let mut v3 = Vector::from([21.0, 21.0]);
        let mut v4 = Vector::from([42.0, 42.0]);

        v0.scl(1.0);
        v1.scl(1.0);
        v2.scl(2.0);
        v3.scl(2.0);
        v4.scl(0.5);
        assert_eq!(v0, Vector::from([0.0, 0.0]));
        assert_eq!(v1, Vector::from([1.0, 0.0]));
        assert_eq!(v2, Vector::from([2.0, 2.0]));
        assert_eq!(v3, Vector::from([42.0, 42.0]));
        assert_eq!(v4, Vector::from([21.0, 21.0]));
    }

    #[test]
    fn test_dot() {
        let u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        assert_eq!(u.dot(&v), 31.);
    }

    #[test]
    fn test_dot_product_subject() {
        let v1 = Vector::from([0, 0]);
        let v2 = Vector::from([0, 0]);
        assert_eq!(v1.dot(&v2), 0);

        let v3 = Vector::from([1, 0]);
        let v4 = Vector::from([0, 0]);
        assert_eq!(v3.dot(&v4), 0);

        let v5 = Vector::from([1, 0]);
        let v6 = Vector::from([1, 0]);
        assert_eq!(v5.dot(&v6), 1);

        let v7 = Vector::from([1, 0]);
        let v8 = Vector::from([0, 1]);
        assert_eq!(v7.dot(&v8), 0);

        let v9 = Vector::from([1, 1]);
        let v10 = Vector::from([1, 1]);
        assert_eq!(v9.dot(&v10), 2);

        let v11 = Vector::from([4, 2]);
        let v12 = Vector::from([2, 1]);
        assert_eq!(v11.dot(&v12), 10);
    }

    #[test]
    fn test_norm1() {
        let u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        assert_eq!(u.norm_1(), 5.);
        assert_eq!(v.norm_1(), 12.);
    }

    #[test]
    fn test_norm() {
        let u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        assert_eq!(u.norm(), 13_f32.sqrt());
        assert_eq!(v.norm(), 74_f32.sqrt());
    }

    #[test]
    fn test_norm_inf() {
        let u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        assert_eq!(u.norm_inf(), 3.);
        assert_eq!(v.norm_inf(), 7.);
    }

    #[test]
    fn test_norm1_subject() {
        let v1 = Vector::from([0.0]);
        assert_eq!(v1.norm_1(), 0.0);

        let v2 = Vector::from([1.0]);
        assert_eq!(v2.norm_1(), 1.0);

        let v3 = Vector::from([0.0, 0.0]);
        assert_eq!(v3.norm_1(), 0.0);

        let v4 = Vector::from([1.0, 0.0]);
        assert_eq!(v4.norm_1(), 1.0);

        let v5 = Vector::from([2.0, 1.0]);
        assert_eq!(v5.norm_1(), 3.0);

        let v6 = Vector::from([4.0, 2.0]);
        assert_eq!(v6.norm_1(), 6.0);

        let v7 = Vector::from([-4.0, -2.0]);
        assert_eq!(v7.norm_1(), 6.0);
    }

    #[test]
    fn test_norm_subject() {
        let v1 = Vector::from([0.0]);
        assert_eq!(v1.norm(), 0.0);

        let v2 = Vector::from([1.0]);
        assert_eq!(v2.norm(), 1.0);

        let v3 = Vector::from([0.0, 0.0]);
        assert_eq!(v3.norm(), 0.0);

        let v4 = Vector::from([1.0, 0.0]);
        assert_eq!(v4.norm(), 1.0);

        let v5 = Vector::from([2.0, 1.0]);
        assert_eq!(v5.norm(), 2.23606797749979);

        let v6 = Vector::from([4.0, 2.0]);
        assert_eq!(v6.norm(), 4.47213595499958);

        let v7 = Vector::from([-4.0, -2.0]);
        assert_eq!(v7.norm(), 4.47213595499958);
    }

    #[test]
    fn test_norm_inf_subject() {
        let v1 = Vector::from([0.0]);
        assert_eq!(v1.norm_inf(), 0.0);

        let v2 = Vector::from([1.0]);
        assert_eq!(v2.norm_inf(), 1.0);

        let v3 = Vector::from([0.0, 0.0]);
        assert_eq!(v3.norm_inf(), 0.0);

        let v4 = Vector::from([1.0, 0.0]);
        assert_eq!(v4.norm_inf(), 1.0);

        let v5 = Vector::from([2.0, 1.0]);
        assert_eq!(v5.norm_inf(), 2.0);

        let v6 = Vector::from([4.0, 2.0]);
        assert_eq!(v6.norm_inf(), 4.0);

        let v7 = Vector::from([-4.0, -2.0]);
        assert_eq!(v7.norm_inf(), 4.0);
    }

    #[test]
    fn test_neg_trait() {
        let u = Vector::from([2., 3.]);
        let v = -u;
        assert_eq!(v.store, [-2., -3.]);
    }

    #[test]
    fn test_add_trait() {
        let u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        let w = u + v;
        assert_eq!(w.store, [7., 10.]);
    }

    #[test]
    fn test_add_assign_trait() {
        let mut u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        u += v;
        assert_eq!(u.store, [7., 10.]);
    }

    #[test]
    fn test_sub_trait() {
        let u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        let w = u - v;
        assert_eq!(w.store, [-3., -4.]);
    }

    #[test]
    fn test_sub_assign_trait() {
        let mut u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        u -= v;
        assert_eq!(u.store, [-3., -4.]);
    }

    #[test]
    fn test_mul_with_number_trait() {
        let u = Vector::from([2., 3.]);
        let r = u * 3.;
        assert_eq!(r.store, [6., 9.]);
    }

    #[test]
    fn test_mul_with_vector_trait() {
        let u = Vector::from([2., 3.]);
        let v = Vector::from([5., 7.]);
        assert_eq!(u * v, 31.);
    }

    #[test]
    fn test_index() {
        let u = Vector::from([2., 3.]);
        assert_eq!(u[0], 2.);
        assert_eq!(u[1], 3.);
    }

    #[test]
    #[should_panic]
    fn test_index_out_of_bounds() {
        let u = Vector::from([2., 3.]);
        let _ = u[2];
    }

    #[test]
    fn test_index_mut() {
        let mut u = Vector::from([2., 3.]);
        u[0] = 5.;
        u[1] = 7.;
        assert_eq!(u.store, [5., 7.]);
    }

    #[test]
    #[should_panic]
    fn test_index_mut_out_of_bounds() {
        let mut u = Vector::from([2., 3.]);
        u[2] = 5.;
    }

    #[test]
    fn test_display() {
        let u = Vector::from([2., 3.]);
        assert_eq!(format!("{}", u), "//-> [2.0, 3.0]\n");
    }

    #[test]
    fn test_deref() {
        let u = Vector::from([2., 3.]);
        assert_eq!(*u, [2., 3.]);
    }

    #[test]
    fn test_deref_mut() {
        let mut u = Vector::from([2., 3.]);
        *u = [5., 7.];
        assert_eq!(u.store, [5., 7.]);
    }
}