sparsemat/
lib.rs

1pub mod types;
2pub mod indexlist;
3#[macro_use]
4pub mod sparsematrix;
5pub mod sparsemat_indexlist;
6pub mod sparsemat_crs;
7pub mod sparsemat_rowvec;
8pub mod sparsemat_par;
9#[macro_use]
10pub mod vector;
11pub mod densevec;
12pub mod sparsevec;
13pub mod linearsolver;
14
15pub use self::sparsematrix::*;
16pub use self::sparsemat_indexlist::*;
17pub use self::sparsemat_crs::*;
18pub use self::sparsemat_rowvec::*;
19pub use self::sparsevec::*;
20pub use self::vector::*;
21pub use self::densevec::*;
22
23#[cfg(test)]
24mod tests {
25    use crate::sparsematrix::*;
26    use crate::sparsemat_indexlist::*;
27    use crate::sparsemat_crs::*;
28    use crate::sparsemat_rowvec::*;
29    use crate::sparsemat_par::*;
30    use crate::indexlist::*;
31    use crate::sparsevec::*;
32    use crate::vector::*;
33    use crate::densevec::*;
34    use crate::linearsolver::*;
35
36    #[test]
37    fn check_cg<'a>() {
38        let mut mat = SparseMatIndexList::<f64, u32>::new();
39        mat.set(0, 0, 4.0);
40        mat.set(0, 1, 1.0);
41        mat.set(1, 0, 1.0);
42        mat.set(1, 1, 3.0);
43        let mut b = DenseVec::<f64>::new();
44        b.set(0, 1.0);
45        b.set(1, 2.0);
46        let mut x = DenseVec::<f64>::new();
47        x.set(0, 2.0);
48        x.set(1, 1.0);
49        let cg = ConjugateGradient::default();
50        cg.solve(&mat, &b, &mut x);
51        assert_eq!((x.get(0) * 10000f64).floor() / 10000f64, 0.0909);
52    }
53
54    #[test]
55    fn check_sparsemat_indexlist() {
56        //check_mat::<SparseMatIndexList<f32, u32>>();
57        let mut sp = SparseMatIndexList::<f32, u32>::with_capacity(3);
58        sp.add_to(0, 1, 4.2);
59        sp.add_to(1, 2, 4.12);
60        sp.add_to(2, 2, 2.12);
61        sp.add_to(1, 1, 1.12);
62        *sp.get_mut(1, 1) += 1.12;
63        *sp.get_mut(0, 2) += 0.12;
64        *sp.get_mut(0, 0) = 8.12;
65        sp.set(0, 0, 7.12);
66        assert_eq!(sp.get(0, 0), 7.12);
67        let mut iter = sp.iter();
68        assert_eq!(iter.next(), Some((0, 1, &4.2)));
69        assert_eq!(iter.next(), Some((0, 2, &0.12)));
70        assert_eq!(iter.next(), Some((0, 0, &7.12)));
71        assert_eq!(iter.next(), Some((1, 2, &4.12)));
72        let mut iter_row = sp.iter_row(2);
73        assert_eq!(iter_row.next(), Some((&2, &2.12)));
74        let sum = sp.clone() + sp.clone();
75        assert_eq!(sum.get(0, 0), 14.24);
76        let sub = sum.clone() - sp.clone();
77        assert_eq!(sub.get(0, 0), sp.get(0, 0));
78        let mul = sp.clone() * 2.0;
79        assert_eq!(mul.get(0, 0), sum.get(0, 0));
80        let v = DenseVec::from_vec(vec![2.0, 4.8, 1.2]);
81        let mvp = sp.clone() * v;
82        assert_eq!(mvp.get(0), 34.544);
83        assert_eq!(sp.density(), 6.0 / 9.0);
84
85        // Test column iter
86        sp.assemble_column_info();
87        let mut iter_col = sp.iter_col(2).unwrap();
88        assert_eq!(iter_col.next(), Some((&1, &4.12)));
89        assert_eq!(iter_col.next(), Some((&2, &2.12)));
90        assert_eq!(iter_col.next(), Some((&0, &0.12)));
91        assert_eq!(iter_col.next(), None);
92
93        // Test sorting functionality and conversion to CRS
94        let sp_crs = sp.to_crs();
95        let row_str = sp.to_string_row(1);
96        assert_eq!(row_str, "0 2.24 4.12 ");
97        let row_str = sp_crs.to_string_row(1);
98        assert_eq!(row_str, "0 2.24 4.12 ");
99
100        // Test matrix product
101        let mp = sp_crs.prod(&sp).unwrap();
102        assert_eq!(mp.get(1, 2), 17.9632);
103
104        // Add different matrix type
105        sp.add(&sp_crs);
106        let row_str = sp.to_string_row(1);
107        assert_eq!(row_str, "0 4.48 8.24 ");
108
109        sp.sort();
110        sp.sort_row(1);
111        sp.to_pbm("test.pbm".to_string());
112    }
113
114    #[test]
115    fn check_sparsemat_crs() {
116        let mut sp_crs = SparseMatCRS::<f32, u32>::with_capacity(3);
117        sp_crs.add_to(0, 1, 4.2);
118        sp_crs.add_to(2, 2, 2.12);
119        sp_crs.add_to(1, 2, 4.12);
120        sp_crs.add_to(3, 2, 1.12);
121        sp_crs.add_to(3, 3, 5.12);
122        let mut iter = sp_crs.iter();
123        assert_eq!(iter.next(), Some((0, 1, &4.2)));
124        assert_eq!(iter.next(), Some((1, 2, &4.12)));
125        assert_eq!(iter.next(), Some((2, 2, &2.12)));
126        assert_eq!(iter.next(), Some((3, 3, &5.12)));
127        assert_eq!(iter.next(), Some((3, 2, &1.12)));
128        assert_eq!(iter.next(), None);
129        //let mut iter_all = sp_crs.iter_all();
130        //assert_eq!(iter_all.next(), Some((0, 1, &4.2)));
131        //assert_eq!(iter_all.next(), Some((1, 2, &4.12)));
132        //assert_eq!(iter_all.next(), Some((2, 2, &2.12)));
133        //assert_eq!(iter_all.next(), Some((3, 3, &5.12)));
134        //assert_eq!(iter_all.next(), Some((3, 2, &1.12)));
135        //assert_eq!(iter_all.next(), None);
136
137        // Test column iter
138        sp_crs.assemble_column_info();
139        let mut iter_col = sp_crs.iter_col(2).unwrap();
140        assert_eq!(iter_col.next(), Some((&1, &4.12)));
141        assert_eq!(iter_col.next(), Some((&2, &2.12)));
142        assert_eq!(iter_col.next(), Some((&3, &1.12)));
143        assert_eq!(iter_col.next(), None);
144
145        let mut iter_row = sp_crs.iter_row(0);
146        assert_eq!(iter_row.next(), Some((&1, &4.2)));
147        assert_eq!(iter_row.next(), None);
148        let mut iter_row = sp_crs.iter_row(5);
149        assert_eq!(iter_row.next(), None);
150        let v = DenseVec::from_vec(vec![2.0, 4.8, 1.2, 3.4]);
151        let mvp = sp_crs.clone() * v;
152        assert_eq!(mvp.get(0), 20.16);
153        assert_eq!(sp_crs.density(), 5.0 / 16.0);
154    }
155
156    #[test]
157    fn check_sparsemat_rowvec() {
158        let mut sp = SparseMatRowVec::<f32, u32>::with_capacity(3);
159        sp.add_to(0, 1, 4.2);
160        sp.add_to(1, 2, 4.12);
161        sp.add_to(2, 2, 2.12);
162        sp.add_to(1, 1, 1.12);
163        *sp.get_mut(1, 1) += 1.12;
164        *sp.get_mut(0, 2) += 0.12;
165        *sp.get_mut(0, 0) = 8.12;
166        sp.set(0, 0, 7.12);
167        assert_eq!(sp.get(0, 0), 7.12);
168        assert_eq!(sp.get(0, 1), 4.2);
169        let mut iter = sp.iter();
170        assert_eq!(iter.next(), Some((0, 1, &4.2)));
171        assert_eq!(iter.next(), Some((0, 2, &0.12)));
172        assert_eq!(iter.next(), Some((0, 0, &7.12)));
173        assert_eq!(iter.next(), Some((1, 2, &4.12)));
174        let v = DenseVec::from_vec(vec![2.0, 4.8, 1.2]);
175        let mvp = sp.mvp(&v);
176        assert_eq!(mvp.get(0), 34.544);
177        assert_eq!(sp.density(), 6.0 / 9.0);
178    }
179
180    #[test]
181    fn check_sparsemat_par() {
182        let mut mat_par = SparseMatPar::<SparseMatIndexList::<f32, u32>>::with_sub_matrices(4, 16);
183        mat_par.add_to(0, 1, 4.2);
184        mat_par.add_to(1, 2, 4.12);
185        mat_par.add_to(2, 2, 2.12);
186        mat_par.add_to(1, 1, 1.12);
187        *mat_par.get_mut(1, 1) += 1.12;
188        *mat_par.get_mut(0, 2) += 0.12;
189        *mat_par.get_mut(0, 0) = 8.12;
190        mat_par.set(0, 0, 7.12);
191        assert_eq!(mat_par.get(0, 0), 7.12);
192        assert_eq!(mat_par.get(0, 1), 4.2);
193        let mut iter = mat_par.iter();
194        assert_eq!(iter.next(), Some((0, 1, &4.2)));
195        assert_eq!(iter.next(), Some((0, 2, &0.12)));
196        assert_eq!(iter.next(), Some((0, 0, &7.12)));
197        assert_eq!(iter.next(), Some((1, 2, &4.12)));
198        let v = DenseVec::from_vec(vec![2.0, 4.8, 1.2]);
199        let mvp = mat_par.mvp(&v);
200        assert_eq!(mvp.get(0), 34.544);
201        assert_eq!(mat_par.density(), 6.0 / 9.0);
202    }
203
204    #[test]
205    fn check_indexlist() {
206        let mut list = IndexList::<u16>::new();
207        list.push(1);
208        list.push(1);
209        list.push(2);
210        list.push(4);
211        list.push(1);
212        assert_eq!(list.iter_row(0).next(), None);
213        assert_eq!(list.n_entries(), 5);
214        let mut iter = list.iter_row(1);
215        assert_eq!(iter.next(), Some(0));
216        assert_eq!(iter.next(), Some(1));
217        assert_eq!(iter.next(), Some(4));
218    }
219
220    #[test]
221    fn check_sparsevec() {
222        let mut sv = SparseVec::<f64, u16>::new();
223        sv.set(8, 6.0);
224        sv.set(80, 6.4);
225        sv.set(55, 8.2);
226        sv.set(4, 4.0);
227        let mut iter = sv.iter_sparse();
228        assert_eq!(iter.next(), Some((&8, &6.0)));
229        assert_eq!(iter.next(), Some((&80, &6.4)));
230        assert_eq!(sv.get(4), 4.0);
231    }
232}