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
pub mod matrix;
pub mod vector;

#[cfg(test)]
mod tests {
    use std::collections::HashMap;
    use crate::{matrix::{coo_mat::CooMat, csr_mat::CsrMat}, vector::Vector};

    #[test]
    fn create_coo_mat() {
        let mat = CooMat::new(3, 3);
        assert_eq!(mat, CooMat { rows : 3, columns : 3, values: HashMap::new() })
    }

    #[test]
    fn void_coo_to_csr() {
        let mat = CooMat::new(3, 3);
        assert_eq!(mat.to_csr(),CsrMat { rows : 3, columns : 3, values : vec![], columns_index : vec![], rows_index : vec![0] });
    }

    #[test]
    fn coo_to_csr() {
        let mut mat = CooMat::new(2, 2);
        mat.add(1, 0, 3.);
        mat.add(1, 1, 4.);
        mat.add(0, 0, 1.);
        mat.add(0, 1, 2.);
        assert_eq!(mat.to_csr(),CsrMat { rows : 2, columns : 2, values : vec![1., 2., 3., 4.], columns_index : vec![0,1,0,1], rows_index : vec![0,2,4] });
    }

    #[test]
    fn matrix_vector_product() {
        let mut mat = CooMat::new(2, 2);
        mat.add(0, 0, 1.);
        mat.add(0, 1, 2.);
        mat.add(1, 0, 3.);
        mat.add(1, 1, 4.);
        let csrmat = mat.to_csr();
        let res = &csrmat * &Vector { values : vec![0.,1.]};
        assert_eq!(res, Ok(Vector { values : vec![2., 4.]}))
    }

    #[test]
    fn add_vectors() {
        let vec1 = Vector {values : vec![1.,1.]};
        let vec2 = Vector {values : vec![1.,2.]};
        assert_eq!(&vec1 + &vec2, Ok(Vector{values : vec![2., 3.]}))
    }

    #[test]
    fn sub_vectors() {
        let vec1 = Vector {values : vec![1.,1.]};
        let vec2 = Vector {values : vec![1.,2.]};
        assert_eq!(&vec1 - &vec2, Ok(Vector{values : vec![0., -1.]}))
    }

    #[test]
    fn mul_vectors() {
        let vec1 = Vector {values : vec![1.,1.]};
        let vec2 = Vector {values : vec![1.,2.]};
        assert_eq!(&vec1 * &vec2, Ok(3.))
    }

    #[test]
    fn vector0() {
        assert_eq!(Vector::null(2), Vector { values : vec![0.;2] })
    }

    #[test]
    fn minres_solver() {
        let mut a = CooMat::new(1000000, 1000000);
        for i in 0..1000000{
            a.add(i, i, 2.);
        }
        let a = a.to_csr();
        let b = Vector { values : vec![1.;1000000] };
        let res = a.minres(b, 0.01);
        assert_eq!(res.unwrap(),Vector { values : vec![0.5;1000000] })
    }
}