1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#![feature(const_trait_impl)]
#![feature(associated_type_bounds)]
#![feature(const_option_ext)]
//#![feature(effects)]
#![feature(const_option)]
#![feature(const_refs_to_cell)]
#![feature(const_mut_refs)]

#![feature(generic_const_exprs)]
#![feature(const_closures)]

pub use array__ops::*;

moddef::moddef!(
    flat(pub) mod {
        array_math_,
        matrix_math,
        square_matrix_math
    }
);

#[cfg(test)]
mod test
{
    use super::*;

    #[test]
    fn test()
    {
        type T = u8;
        let a: [T; 3] = [1, 2, 3];
    
        let avg: T = a.avg();
    
        println!("{}", avg)
    }
    
    #[test]
    fn test_matrix_solve()
    {
        let a = [
            [1.0, 3.0],
            [2.0, 8.0]
        ];
        let b = [
            6.0,
            -12.0
        ];

        let x = a.solve_matrix(&b);
        println!("x = {:?}", x);
    }

    #[test]
    fn test_lu()
    {
        use array__ops::ArrayNdOps;

        let a = [
            [0, 3, -1, 2],
            [3, 8, 1, -4],
            [-1, 1, 4, -1],
            [-1, 1, 4, -2],
        ].map_nd(|a: i8| a as f32);

        let (l, u, p) = crate::lup_matrix(&a);
        
        println!("P = {:?}", p);
        println!("L = {:?}", l);
        println!("U = {:?}", u);

        let lu = crate::mul_matrix(&l, &u);
        let pa = crate::mul_matrix(&p, &a);

        println!("LU = {:?}", lu);
        println!("PA = {:?}", pa);

        let det_a = crate::det_matrix(&a);
        
        println!("det(A) = {:?}", det_a);

        if let Some(inv_a) = crate::inv_matrix(&a)
        {
            println!("A^(-1) = {:?}", inv_a);
            
            println!("A^(-1)*A = {:?}", crate::mul_matrix(&inv_a, &a));
            println!("A*A^(-1) = {:?}", crate::mul_matrix(&a, &inv_a));
        }
    }
}