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 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 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 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 let mp = sp_crs.prod(&sp).unwrap();
102 assert_eq!(mp.get(1, 2), 17.9632);
103
104 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 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}