Chris@97
|
1
|
Chris@97
|
2 module yetilab.matrix.test.test_matrix;
|
Chris@97
|
3
|
Chris@97
|
4 mat = load yetilab.matrix.matrix;
|
Chris@222
|
5 vec = load yetilab.vector.vector;
|
Chris@97
|
6
|
Chris@222
|
7 load yetilab.vector.vectortype;
|
Chris@220
|
8 load yetilab.matrix.matrixtype;
|
Chris@220
|
9
|
Chris@98
|
10 import yeti.lang: FailureException;
|
Chris@98
|
11
|
Chris@158
|
12 { compare, compareUsing } = load yetilab.test.test;
|
Chris@97
|
13
|
Chris@158
|
14 compareMatrices = compareUsing mat.equal;
|
Chris@99
|
15
|
Chris@99
|
16 makeTests name flipper =
|
Chris@99
|
17 (constMatrix n s = flipper (mat.constMatrix n s);
|
Chris@99
|
18 zeroMatrix s = flipper (mat.zeroMatrix s);
|
Chris@99
|
19 randomMatrix s = flipper (mat.randomMatrix s);
|
Chris@99
|
20 identityMatrix s = flipper (mat.identityMatrix s);
|
Chris@99
|
21 generate f s = flipper (mat.generate f s);
|
Chris@218
|
22 newMatrix t d = flipper (mat.newMatrix t (map vec.fromList d));
|
Chris@97
|
23 [
|
Chris@97
|
24
|
Chris@99
|
25 "constMatrixEmpty-\(name)": \(
|
Chris@99
|
26 m = constMatrix 2 { rows = 0, columns = 0 };
|
Chris@210
|
27 compare (mat.size m) { columns = 0, rows = 0 }
|
Chris@97
|
28 ),
|
Chris@97
|
29
|
Chris@99
|
30 "constMatrixEmpty2-\(name)": \(
|
Chris@210
|
31 compare (mat.size (constMatrix 2 { rows = 0, columns = 4 })) { columns = 0, rows = 0 } and
|
Chris@210
|
32 compare (mat.size (constMatrix 2 { rows = 4, columns = 0 })) { columns = 0, rows = 0 }
|
Chris@97
|
33 ),
|
Chris@97
|
34
|
Chris@99
|
35 "constMatrix-\(name)": \(
|
Chris@99
|
36 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@210
|
37 compare (mat.size m) { columns = 4, rows = 3 } and
|
Chris@218
|
38 all id (map do row: compare (vec.list (mat.getRow row m)) [2,2,2,2] done [0..2]) and
|
Chris@218
|
39 all id (map do col: compare (vec.list (mat.getColumn col m)) [2,2,2] done [0..3])
|
Chris@97
|
40 ),
|
Chris@97
|
41
|
Chris@99
|
42 "randomMatrixEmpty-\(name)": \(
|
Chris@99
|
43 m = randomMatrix { rows = 0, columns = 0 };
|
Chris@210
|
44 compare (mat.size m) { columns = 0, rows = 0 }
|
Chris@97
|
45 ),
|
Chris@97
|
46
|
Chris@99
|
47 "randomMatrix-\(name)": \(
|
Chris@99
|
48 m = randomMatrix { rows = 3, columns = 4 };
|
Chris@210
|
49 compare (mat.size m) { columns = 4, rows = 3 }
|
Chris@97
|
50 ),
|
Chris@97
|
51
|
Chris@99
|
52 "zeroMatrixEmpty-\(name)": \(
|
Chris@99
|
53 m = zeroMatrix { rows = 0, columns = 0 };
|
Chris@210
|
54 compare (mat.size m) { columns = 0, rows = 0 }
|
Chris@97
|
55 ),
|
Chris@97
|
56
|
Chris@99
|
57 "zeroMatrix-\(name)": \(
|
Chris@99
|
58 m = zeroMatrix { rows = 3, columns = 4 };
|
Chris@210
|
59 compare (mat.size m) { columns = 4, rows = 3 } and
|
Chris@218
|
60 all id (map do row: compare (vec.list (mat.getRow row m)) [0,0,0,0] done [0..2]) and
|
Chris@218
|
61 all id (map do col: compare (vec.list (mat.getColumn col m)) [0,0,0] done [0..3])
|
Chris@97
|
62 ),
|
Chris@97
|
63
|
Chris@99
|
64 "identityMatrixEmpty-\(name)": \(
|
Chris@99
|
65 m = identityMatrix { rows = 0, columns = 0 };
|
Chris@210
|
66 compare (mat.size m) { columns = 0, rows = 0 }
|
Chris@97
|
67 ),
|
Chris@97
|
68
|
Chris@99
|
69 "identityMatrix-\(name)": \(
|
Chris@99
|
70 m = identityMatrix { rows = 3, columns = 4 };
|
Chris@210
|
71 compare (mat.size m) { columns = 4, rows = 3 } and
|
Chris@218
|
72 all id (map do row: compare (vec.list (mat.getRow row m)) [1,1,1,1] done [0..2]) and
|
Chris@218
|
73 all id (map do col: compare (vec.list (mat.getColumn col m)) [1,1,1] done [0..3])
|
Chris@97
|
74 ),
|
Chris@97
|
75
|
Chris@99
|
76 "generateEmpty-\(name)": \(
|
Chris@99
|
77 m = generate do row col: 0 done { rows = 0, columns = 0 };
|
Chris@210
|
78 compare (mat.size m) { columns = 0, rows = 0 }
|
Chris@97
|
79 ),
|
Chris@97
|
80
|
Chris@99
|
81 "generate-\(name)": \(
|
Chris@99
|
82 m = generate do row col: row * 10 + col done { rows = 2, columns = 3 };
|
Chris@218
|
83 compare (vec.list (mat.getRow 0 m)) [0,1,2] and
|
Chris@218
|
84 compare (vec.list (mat.getRow 1 m)) [10,11,12]
|
Chris@97
|
85 ),
|
Chris@97
|
86
|
Chris@99
|
87 "widthAndHeight-\(name)": \(
|
Chris@99
|
88 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@210
|
89 compare (mat.size m) { columns = mat.width m, rows = mat.height m }
|
Chris@97
|
90 ),
|
Chris@97
|
91
|
Chris@99
|
92 "equal-\(name)": \(
|
Chris@241
|
93 m = newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]];
|
Chris@100
|
94 n = m;
|
Chris@241
|
95 p = newMatrix (RowMajor ()) [[1,0,3],[4,5,6]];
|
Chris@241
|
96 q = newMatrix (ColumnMajor ()) [[1,0,3],[4,5,6]];
|
Chris@241
|
97 r = newMatrix (ColumnMajor ()) [[1,4],[0,5]];
|
Chris@100
|
98 compareMatrices m n and
|
Chris@100
|
99 compareMatrices m p and
|
Chris@100
|
100 compareMatrices n p and
|
Chris@159
|
101 not mat.equal m q and
|
Chris@159
|
102 not mat.equal m r
|
Chris@97
|
103 ),
|
Chris@97
|
104
|
Chris@229
|
105 "equalUnder-\(name)": \(
|
Chris@229
|
106 p = newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]];
|
Chris@229
|
107 q = newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]];
|
Chris@229
|
108 r = newMatrix (ColumnMajor ()) [[4,3,1],[3,1,2]];
|
Chris@241
|
109 s = newMatrix (ColumnMajor ()) [[1,4,5],[6,7,8]];
|
Chris@241
|
110 t = newMatrix (ColumnMajor ()) [[1,4,5],[6,7,9]];
|
Chris@229
|
111 mat.equalUnder (==) p p and
|
Chris@229
|
112 mat.equalUnder (==) p q and
|
Chris@229
|
113 mat.equalUnder (!=) p r and
|
Chris@229
|
114 mat.equalUnder do a b: a % 2 == b % 2 done p s and
|
Chris@229
|
115 not mat.equalUnder do a b: a % 2 == b % 2 done p t
|
Chris@229
|
116 ),
|
Chris@229
|
117
|
Chris@99
|
118 "getAt-\(name)": \(
|
Chris@97
|
119 generator row col = row * 10 + col;
|
Chris@99
|
120 m = generate generator { rows = 2, columns = 3 };
|
Chris@97
|
121 all id
|
Chris@97
|
122 (map do row: all id
|
Chris@210
|
123 (map do col: mat.getAt row col m == generator row col done [0..2])
|
Chris@97
|
124 done [0..1])
|
Chris@97
|
125 ),
|
Chris@97
|
126
|
Chris@99
|
127 "transposedEmpty-\(name)": \(
|
Chris@210
|
128 compare (mat.size (mat.transposed (constMatrix 2 { rows = 0, columns = 0 }))) { columns = 0, rows = 0 } and
|
Chris@210
|
129 compare (mat.size (mat.transposed (constMatrix 2 { rows = 0, columns = 4 }))) { columns = 0, rows = 0 } and
|
Chris@210
|
130 compare (mat.size (mat.transposed (constMatrix 2 { rows = 4, columns = 0 }))) { columns = 0, rows = 0 }
|
Chris@97
|
131 ),
|
Chris@97
|
132
|
Chris@99
|
133 "transposedSize-\(name)": \(
|
Chris@210
|
134 compare (mat.size (mat.transposed (constMatrix 2 { rows = 3, columns = 4 }))) { columns = 3, rows = 4 }
|
Chris@97
|
135 ),
|
Chris@97
|
136
|
Chris@99
|
137 "transposed-\(name)": \(
|
Chris@97
|
138 generator row col = row * 10 + col;
|
Chris@99
|
139 m = generate generator { rows = 2, columns = 3 };
|
Chris@97
|
140 m' = mat.transposed m;
|
Chris@97
|
141 all id
|
Chris@97
|
142 (map do row: all id
|
Chris@97
|
143 // like getAt test, but with col/row flipped
|
Chris@210
|
144 (map do col: mat.getAt col row m' == generator row col done [0..2])
|
Chris@97
|
145 done [0..1])
|
Chris@97
|
146 ),
|
Chris@97
|
147
|
Chris@100
|
148 "transposed-back-\(name)": \(
|
Chris@100
|
149 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
|
Chris@100
|
150 compareMatrices m (mat.transposed (mat.transposed m)) and
|
Chris@100
|
151 not mat.equal m (mat.transposed m);
|
Chris@100
|
152 ),
|
Chris@100
|
153
|
Chris@100
|
154 "flipped-\(name)": \(
|
Chris@241
|
155 m = newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]];
|
Chris@99
|
156 m' = mat.flipped m;
|
Chris@241
|
157 m'' = newMatrix (RowMajor ()) [[1,0,3],[4,5,6]];
|
Chris@100
|
158 compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m'';
|
Chris@98
|
159 ),
|
Chris@98
|
160
|
Chris@100
|
161 "flipped-back-\(name)": \(
|
Chris@241
|
162 m = newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]];
|
Chris@100
|
163 compareMatrices m (mat.flipped (mat.flipped m));
|
Chris@100
|
164 ),
|
Chris@100
|
165
|
Chris@100
|
166 "flipped-empty-\(name)": \(
|
Chris@99
|
167 m = constMatrix 2 { rows = 0, columns = 4 };
|
Chris@99
|
168 compareMatrices (mat.flipped m) (mat.flipped (constMatrix 0 { rows = 0, columns = 0 }));
|
Chris@98
|
169 ),
|
Chris@98
|
170
|
Chris@161
|
171 "toRowMajor-\(name)": \(
|
Chris@241
|
172 m = newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]];
|
Chris@161
|
173 m' = mat.toRowMajor m;
|
Chris@241
|
174 m'' = newMatrix (RowMajor ()) [[1,0,3],[4,5,6]];
|
Chris@161
|
175 m''' = mat.toRowMajor m'';
|
Chris@161
|
176 compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m''
|
Chris@161
|
177 and compareMatrices m m''';
|
Chris@161
|
178 ),
|
Chris@161
|
179
|
Chris@161
|
180 "toColumnMajor-\(name)": \(
|
Chris@241
|
181 m = newMatrix (RowMajor ()) [[1,4],[0,5],[3,6]];
|
Chris@161
|
182 m' = mat.toColumnMajor m;
|
Chris@241
|
183 m'' = newMatrix (ColumnMajor ()) [[1,0,3],[4,5,6]];
|
Chris@161
|
184 m''' = mat.toColumnMajor m'';
|
Chris@161
|
185 compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m''
|
Chris@161
|
186 and compareMatrices m m''';
|
Chris@161
|
187 ),
|
Chris@161
|
188
|
Chris@99
|
189 "scaled-\(name)": \(
|
Chris@99
|
190 compareMatrices
|
Chris@99
|
191 (mat.scaled 0.5 (constMatrix 2 { rows = 3, columns = 4 }))
|
Chris@99
|
192 (constMatrix 1 { rows = 3, columns = 4 }) and
|
Chris@99
|
193 compareMatrices
|
Chris@99
|
194 (mat.scaled 0.5 (constMatrix (-3) { rows = 3, columns = 4 }))
|
Chris@99
|
195 (constMatrix (-1.5) { rows = 3, columns = 4 }) and
|
Chris@99
|
196 compareMatrices
|
Chris@99
|
197 (mat.scaled 0.5 (constMatrix 2 { rows = 0, columns = 2 }))
|
Chris@99
|
198 (constMatrix 5 { rows = 0, columns = 0 })
|
Chris@99
|
199 ),
|
Chris@99
|
200
|
Chris@99
|
201 "sum-\(name)": \(
|
Chris@99
|
202 compareMatrices
|
Chris@99
|
203 (mat.sum (constMatrix 2 { rows = 3, columns = 4 })
|
Chris@99
|
204 (constMatrix 1 { rows = 3, columns = 4 }))
|
Chris@99
|
205 (constMatrix 3 { rows = 3, columns = 4 })
|
Chris@99
|
206 ),
|
Chris@99
|
207
|
Chris@99
|
208 "sumFail-\(name)": \(
|
Chris@98
|
209 try
|
Chris@99
|
210 \() (mat.sum (constMatrix 2 { rows = 3, columns = 4 })
|
Chris@99
|
211 (constMatrix 1 { rows = 3, columns = 5 }));
|
Chris@98
|
212 false;
|
Chris@98
|
213 catch FailureException e:
|
Chris@98
|
214 true
|
Chris@98
|
215 yrt
|
Chris@98
|
216 ),
|
Chris@98
|
217
|
Chris@257
|
218 "sparseSum-\(name)": \(
|
Chris@257
|
219 s = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
|
Chris@257
|
220 { i = 0, j = 0, v = 1 },
|
Chris@257
|
221 { i = 0, j = 2, v = 2 },
|
Chris@257
|
222 { i = 1, j = 1, v = 4 },
|
Chris@257
|
223 ];
|
Chris@257
|
224 t = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
|
Chris@257
|
225 { i = 0, j = 1, v = 7 },
|
Chris@257
|
226 { i = 1, j = 0, v = 5 },
|
Chris@257
|
227 { i = 1, j = 1, v = 6 },
|
Chris@257
|
228 ];
|
Chris@257
|
229 tot = mat.sum s t;
|
Chris@257
|
230 mat.isSparse? tot and
|
Chris@257
|
231 compareMatrices tot (mat.sum (mat.toDense s) t) and
|
Chris@257
|
232 compareMatrices tot (mat.sum (mat.toDense s) (mat.toDense t)) and
|
Chris@257
|
233 compareMatrices tot (mat.sum s (mat.toDense t)) and
|
Chris@257
|
234 compareMatrices tot
|
Chris@257
|
235 (mat.newSparseMatrix (RowMajor ()) { rows = 2, columns = 3 } [
|
Chris@257
|
236 { i = 0, j = 0, v = 1 },
|
Chris@257
|
237 { i = 0, j = 1, v = 7 },
|
Chris@257
|
238 { i = 0, j = 2, v = 2 },
|
Chris@257
|
239 { i = 1, j = 0, v = 5 },
|
Chris@257
|
240 { i = 1, j = 1, v = 10 },
|
Chris@257
|
241 ])
|
Chris@257
|
242 ),
|
Chris@257
|
243
|
Chris@229
|
244 "difference-\(name)": \(
|
Chris@229
|
245 compareMatrices
|
Chris@229
|
246 (mat.difference (constMatrix 2 { rows = 3, columns = 4 })
|
Chris@229
|
247 (constMatrix 1 { rows = 3, columns = 4 }))
|
Chris@229
|
248 (constMatrix 1 { rows = 3, columns = 4 })
|
Chris@229
|
249 ),
|
Chris@229
|
250
|
Chris@229
|
251 "differenceFail-\(name)": \(
|
Chris@229
|
252 try
|
Chris@229
|
253 \() (mat.difference (constMatrix 2 { rows = 3, columns = 4 })
|
Chris@229
|
254 (constMatrix 1 { rows = 3, columns = 5 }));
|
Chris@229
|
255 false;
|
Chris@229
|
256 catch FailureException e:
|
Chris@229
|
257 true
|
Chris@229
|
258 yrt
|
Chris@229
|
259 ),
|
Chris@229
|
260
|
Chris@257
|
261 "sparseDifference-\(name)": \(
|
Chris@257
|
262 s = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
|
Chris@257
|
263 { i = 0, j = 0, v = 1 },
|
Chris@257
|
264 { i = 0, j = 2, v = 2 },
|
Chris@257
|
265 { i = 1, j = 1, v = 4 },
|
Chris@257
|
266 ];
|
Chris@257
|
267 t = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
|
Chris@257
|
268 { i = 0, j = 1, v = 7 },
|
Chris@257
|
269 { i = 1, j = 0, v = 5 },
|
Chris@257
|
270 { i = 1, j = 1, v = 6 },
|
Chris@257
|
271 ];
|
Chris@257
|
272 diff = mat.difference s t;
|
Chris@257
|
273 mat.isSparse? diff and
|
Chris@257
|
274 compareMatrices diff (mat.difference (mat.toDense s) t) and
|
Chris@257
|
275 compareMatrices diff (mat.difference (mat.toDense s) (mat.toDense t)) and
|
Chris@257
|
276 compareMatrices diff (mat.difference s (mat.toDense t)) and
|
Chris@257
|
277 compareMatrices diff
|
Chris@257
|
278 (mat.newSparseMatrix (RowMajor ()) { rows = 2, columns = 3 } [
|
Chris@257
|
279 { i = 0, j = 0, v = 1 },
|
Chris@257
|
280 { i = 0, j = 1, v = -7 },
|
Chris@257
|
281 { i = 0, j = 2, v = 2 },
|
Chris@257
|
282 { i = 1, j = 0, v = -5 },
|
Chris@257
|
283 { i = 1, j = 1, v = -2 },
|
Chris@257
|
284 ])
|
Chris@257
|
285 ),
|
Chris@257
|
286
|
Chris@229
|
287 "abs-\(name)": \(
|
Chris@229
|
288 compareMatrices
|
Chris@229
|
289 (mat.abs (newMatrix (ColumnMajor ()) [[-1,4],[2,-5],[-3,0]]))
|
Chris@229
|
290 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,0]])
|
Chris@229
|
291 ),
|
Chris@229
|
292
|
Chris@99
|
293 "product-\(name)": \(
|
Chris@99
|
294 compareMatrices
|
Chris@99
|
295 (mat.product (constMatrix 2 { rows = 4, columns = 2 })
|
Chris@99
|
296 (constMatrix 3 { rows = 2, columns = 3 }))
|
Chris@99
|
297 (constMatrix 12 { rows = 4, columns = 3 }) and
|
Chris@99
|
298 compareMatrices
|
Chris@99
|
299 (mat.product (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])
|
Chris@99
|
300 (newMatrix (ColumnMajor ()) [[7,9,11],[8,10,12]]))
|
Chris@99
|
301 (newMatrix (ColumnMajor ()) [[58,139],[64,154]])
|
Chris@98
|
302 ),
|
Chris@98
|
303
|
Chris@251
|
304 "sparseProduct-\(name)": \(
|
Chris@251
|
305 s = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
|
Chris@251
|
306 { i = 0, j = 0, v = 1 },
|
Chris@251
|
307 { i = 0, j = 2, v = 2 },
|
Chris@251
|
308 { i = 1, j = 1, v = 4 },
|
Chris@251
|
309 ];
|
Chris@251
|
310 t = mat.newSparseMatrix (ColumnMajor ()) { rows = 3, columns = 2 } [
|
Chris@251
|
311 { i = 0, j = 1, v = 7 },
|
Chris@251
|
312 { i = 1, j = 0, v = 5 },
|
Chris@251
|
313 { i = 2, j = 0, v = 6 },
|
Chris@251
|
314 ];
|
Chris@251
|
315 prod = mat.product s t;
|
Chris@251
|
316 mat.isSparse? prod and
|
Chris@251
|
317 compareMatrices prod (mat.product (mat.toDense s) t) and
|
Chris@251
|
318 compareMatrices prod (mat.product (mat.toDense s) (mat.toDense t)) and
|
Chris@251
|
319 compareMatrices prod (mat.product s (mat.toDense t)) and
|
Chris@251
|
320 compareMatrices prod
|
Chris@251
|
321 (mat.newSparseMatrix (RowMajor ()) { rows = 2, columns = 2 } [
|
Chris@251
|
322 { i = 0, j = 0, v = 12 },
|
Chris@251
|
323 { i = 0, j = 1, v = 7 },
|
Chris@251
|
324 { i = 1, j = 0, v = 20 },
|
Chris@251
|
325 ])
|
Chris@251
|
326 ),
|
Chris@251
|
327
|
Chris@99
|
328 "productFail-\(name)": \(
|
Chris@99
|
329 try
|
Chris@99
|
330 \() (mat.product (constMatrix 2 { rows = 4, columns = 2 })
|
Chris@99
|
331 (constMatrix 3 { rows = 3, columns = 2 }));
|
Chris@99
|
332 false;
|
Chris@99
|
333 catch FailureException e:
|
Chris@99
|
334 true
|
Chris@99
|
335 yrt
|
Chris@99
|
336 ),
|
Chris@97
|
337
|
Chris@158
|
338 "resizedTo-\(name)": \(
|
Chris@158
|
339 compareMatrices
|
Chris@158
|
340 (mat.resizedTo { rows = 2, columns = 2 }
|
Chris@158
|
341 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]))
|
Chris@159
|
342 (newMatrix (ColumnMajor ()) [[1,4],[2,5]]) and
|
Chris@158
|
343 compareMatrices
|
Chris@158
|
344 (mat.resizedTo { rows = 3, columns = 4 }
|
Chris@158
|
345 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]))
|
Chris@158
|
346 (newMatrix (ColumnMajor ()) [[1,4,0],[2,5,0],[3,6,0],[0,0,0]]) and
|
Chris@158
|
347 compareMatrices
|
Chris@158
|
348 (mat.resizedTo { rows = 1, columns = 1 }
|
Chris@158
|
349 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]))
|
Chris@202
|
350 (newMatrix (RowMajor ()) [[1]]) and
|
Chris@202
|
351 compareMatrices
|
Chris@202
|
352 (mat.resizedTo { rows = 2, columns = 3 }
|
Chris@202
|
353 (mat.zeroSizeMatrix ()))
|
Chris@202
|
354 (newMatrix (RowMajor ()) [[0,0,0],[0,0,0]])
|
Chris@158
|
355 ),
|
Chris@158
|
356
|
Chris@158
|
357 "zeroSizeMatrix-\(name)": \(
|
Chris@158
|
358 compareMatrices
|
Chris@158
|
359 (mat.zeroSizeMatrix ())
|
Chris@158
|
360 (newMatrix (ColumnMajor ()) [])
|
Chris@158
|
361 ),
|
Chris@158
|
362
|
Chris@161
|
363 "asRows-\(name)": \(
|
Chris@161
|
364 compare
|
Chris@218
|
365 (map vec.list
|
Chris@241
|
366 (mat.asRows (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]])))
|
Chris@241
|
367 [[1,0,3],[4,5,6]];
|
Chris@161
|
368 ),
|
Chris@161
|
369
|
Chris@161
|
370 "asColumns-\(name)": \(
|
Chris@161
|
371 compare
|
Chris@218
|
372 (map vec.list
|
Chris@241
|
373 (mat.asColumns (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]])))
|
Chris@241
|
374 [[1,4],[0,5],[3,6]];
|
Chris@161
|
375 ),
|
Chris@161
|
376
|
Chris@178
|
377 "concat-horiz-\(name)": \(
|
Chris@177
|
378 compareMatrices
|
Chris@177
|
379 (mat.concat (Horizontal ())
|
Chris@241
|
380 [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
|
Chris@177
|
381 (newMatrix (RowMajor ()) [[3],[6]])])
|
Chris@241
|
382 (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]])
|
Chris@177
|
383 ),
|
Chris@177
|
384
|
Chris@178
|
385 "concatFail-horiz-\(name)": \(
|
Chris@178
|
386 try
|
Chris@178
|
387 \() (mat.concat (Horizontal ())
|
Chris@241
|
388 [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
|
Chris@178
|
389 (newMatrix (ColumnMajor ()) [[3],[6]])]);
|
Chris@178
|
390 false
|
Chris@178
|
391 catch FailureException e:
|
Chris@178
|
392 true
|
Chris@178
|
393 yrt
|
Chris@178
|
394 ),
|
Chris@178
|
395
|
Chris@178
|
396 "concat-vert-\(name)": \(
|
Chris@178
|
397 compareMatrices
|
Chris@178
|
398 (mat.concat (Vertical ())
|
Chris@241
|
399 [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
|
Chris@178
|
400 (newMatrix (RowMajor ()) [[3,6]])])
|
Chris@241
|
401 (newMatrix (ColumnMajor ()) [[1,4,3],[0,5,6]])
|
Chris@178
|
402 ),
|
Chris@178
|
403
|
Chris@178
|
404 "concatFail-vert-\(name)": \(
|
Chris@178
|
405 try
|
Chris@178
|
406 \() (mat.concat (Vertical ())
|
Chris@241
|
407 [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
|
Chris@178
|
408 (newMatrix (RowMajor ()) [[3],[6]])]);
|
Chris@178
|
409 false
|
Chris@178
|
410 catch FailureException e:
|
Chris@178
|
411 true
|
Chris@178
|
412 yrt
|
Chris@178
|
413 ),
|
Chris@178
|
414
|
Chris@187
|
415 "rowSlice-\(name)": \(
|
Chris@187
|
416 compareMatrices
|
Chris@241
|
417 (mat.rowSlice 1 2 (newMatrix (RowMajor ()) [[1,0],[3,4],[0,6],[7,8]]))
|
Chris@241
|
418 (newMatrix (RowMajor ()) [[3,4],[0,6]])
|
Chris@187
|
419 ),
|
Chris@187
|
420
|
Chris@187
|
421 "columnSlice-\(name)": \(
|
Chris@187
|
422 compareMatrices
|
Chris@241
|
423 (mat.columnSlice 1 2 (newMatrix (RowMajor ()) [[1,0,3,4],[0,6,7,8]]))
|
Chris@241
|
424 (newMatrix (RowMajor ()) [[0,3],[6,7]])
|
Chris@187
|
425 ),
|
Chris@187
|
426
|
Chris@247
|
427 "density-\(name)": \(
|
Chris@247
|
428 compare (mat.density (newMatrix (ColumnMajor ()) [[1,2,0],[0,5,0]])) (3/6) and
|
Chris@247
|
429 compare (mat.density (newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]])) (6/6) and
|
Chris@247
|
430 compare (mat.density (newMatrix (ColumnMajor ()) [[0,0,0],[0,0,0]])) 0
|
Chris@242
|
431 ),
|
Chris@242
|
432
|
Chris@249
|
433 "nonZeroValues-\(name)": \(
|
Chris@249
|
434 compare (mat.nonZeroValues (newMatrix (ColumnMajor ()) [[1,2,0],[0,5,0]])) 3 and
|
Chris@249
|
435 compare (mat.nonZeroValues (newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]])) 6 and
|
Chris@249
|
436 compare (mat.nonZeroValues (newMatrix (ColumnMajor ()) [[0,0,0],[0,0,0]])) 0
|
Chris@249
|
437 ),
|
Chris@249
|
438
|
Chris@243
|
439 "toSparse-\(name)": \(
|
Chris@243
|
440 m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]];
|
Chris@243
|
441 compareMatrices (mat.toSparse m) m and
|
Chris@243
|
442 compareMatrices (mat.toDense (mat.toSparse m)) m and
|
Chris@247
|
443 compare (mat.density (mat.toSparse m)) (6/9)
|
Chris@243
|
444 ),
|
Chris@243
|
445
|
Chris@243
|
446 "toDense-\(name)": \(
|
Chris@243
|
447 m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]];
|
Chris@243
|
448 compareMatrices (mat.toDense m) m and
|
Chris@243
|
449 compareMatrices (mat.toSparse (mat.toDense m)) m
|
Chris@243
|
450 ),
|
Chris@243
|
451
|
Chris@258
|
452 "filter-\(name)": \(
|
Chris@243
|
453 m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]];
|
Chris@243
|
454 compareMatrices
|
Chris@258
|
455 (mat.filter (> 2) m)
|
Chris@258
|
456 (newMatrix (ColumnMajor ()) [[0,0,0],[0,0,6],[0,0,3]]) and
|
Chris@258
|
457 compare (mat.density (mat.filter (> 2) m)) (2/9)
|
Chris@243
|
458 ),
|
Chris@243
|
459
|
Chris@255
|
460 "newSparseMatrix-\(name)": \(
|
Chris@255
|
461 s = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
|
Chris@255
|
462 { i = 0, j = 0, v = 1 },
|
Chris@255
|
463 { i = 0, j = 2, v = 2 },
|
Chris@255
|
464 { i = 1, j = 1, v = 4 },
|
Chris@255
|
465 ];
|
Chris@255
|
466 // If there are zeros in the entries list, they should not end up
|
Chris@255
|
467 // in the sparse data
|
Chris@255
|
468 t = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
|
Chris@255
|
469 { i = 0, j = 0, v = 1 },
|
Chris@255
|
470 { i = 0, j = 2, v = 0 },
|
Chris@255
|
471 { i = 1, j = 1, v = 4 },
|
Chris@255
|
472 ];
|
Chris@255
|
473 compare (mat.density s) (3/6) and
|
Chris@255
|
474 compare (mat.density t) (2/6) and
|
Chris@255
|
475 compareMatrices s (newMatrix (RowMajor ()) [[1,0,2],[0,4,0]]) and
|
Chris@255
|
476 compareMatrices t (newMatrix (RowMajor ()) [[1,0,0],[0,4,0]])
|
Chris@255
|
477 ),
|
Chris@255
|
478
|
Chris@255
|
479 "enumerate-\(name)": \(
|
Chris@255
|
480 m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]];
|
Chris@255
|
481 all = [
|
Chris@255
|
482 { i = 0, j = 0, v = 1 },
|
Chris@255
|
483 { i = 1, j = 0, v = 2 },
|
Chris@255
|
484 { i = 2, j = 0, v = 0 },
|
Chris@255
|
485 { i = 0, j = 1, v = -1 },
|
Chris@255
|
486 { i = 1, j = 1, v = -4 },
|
Chris@255
|
487 { i = 2, j = 1, v = 6 },
|
Chris@255
|
488 { i = 0, j = 2, v = 0 },
|
Chris@255
|
489 { i = 1, j = 2, v = 0 },
|
Chris@255
|
490 { i = 2, j = 2, v = 3 },
|
Chris@255
|
491 ];
|
Chris@255
|
492 sortEntries =
|
Chris@255
|
493 sortBy do a b:
|
Chris@255
|
494 if a.i == b.i then a.j < b.j else a.i < b.i fi
|
Chris@255
|
495 done;
|
Chris@255
|
496 compare
|
Chris@255
|
497 (sortEntries (mat.enumerate m))
|
Chris@255
|
498 (sortEntries
|
Chris@255
|
499 (if mat.isSparse? m then filter do d: d.v != 0 done all else all fi));
|
Chris@255
|
500 ),
|
Chris@255
|
501
|
Chris@99
|
502 ]);
|
Chris@99
|
503
|
Chris@238
|
504 colhash = makeTests "column-dense" id;
|
Chris@238
|
505 rowhash = makeTests "row-dense" mat.flipped;
|
Chris@243
|
506 sparsecolhash = makeTests "column-sparse" mat.toSparse;
|
Chris@241
|
507
|
Chris@241
|
508 // there are two possible orders for constructing a sparse row-major
|
Chris@241
|
509 // matrix from a dense col-major one, so test them both:
|
Chris@243
|
510 sparserowhash1 = makeTests "row-sparse-a" (mat.toSparse . mat.flipped);
|
Chris@243
|
511 sparserowhash2 = makeTests "row-sparse-b" (mat.flipped . mat.toSparse);
|
Chris@99
|
512
|
Chris@99
|
513 all = [:];
|
Chris@241
|
514 for [ colhash, rowhash, sparsecolhash, sparserowhash1, sparserowhash2 ] do h:
|
Chris@238
|
515 for (keys h) do k: all[k] := h[k] done;
|
Chris@238
|
516 done;
|
Chris@99
|
517
|
Chris@99
|
518 all is hash<string, () -> boolean>;
|
Chris@99
|
519
|
Chris@99
|
520
|