Chris@97
|
1
|
Chris@97
|
2 module yetilab.matrix.test.test_matrix;
|
Chris@97
|
3
|
Chris@97
|
4 mat = load yetilab.matrix.matrix;
|
Chris@97
|
5 block = load yetilab.block.block;
|
Chris@97
|
6
|
Chris@98
|
7 import yeti.lang: FailureException;
|
Chris@98
|
8
|
Chris@158
|
9 { compare, compareUsing } = load yetilab.test.test;
|
Chris@97
|
10
|
Chris@158
|
11 compareMatrices = compareUsing mat.equal;
|
Chris@99
|
12
|
Chris@99
|
13 makeTests name flipper =
|
Chris@99
|
14 (constMatrix n s = flipper (mat.constMatrix n s);
|
Chris@99
|
15 zeroMatrix s = flipper (mat.zeroMatrix s);
|
Chris@99
|
16 randomMatrix s = flipper (mat.randomMatrix s);
|
Chris@99
|
17 identityMatrix s = flipper (mat.identityMatrix s);
|
Chris@99
|
18 generate f s = flipper (mat.generate f s);
|
Chris@163
|
19 newMatrix t d = flipper (mat.newMatrix t (map block.fromList d));
|
Chris@97
|
20 [
|
Chris@97
|
21
|
Chris@99
|
22 "constMatrixEmpty-\(name)": \(
|
Chris@99
|
23 m = constMatrix 2 { rows = 0, columns = 0 };
|
Chris@97
|
24 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
25 ),
|
Chris@97
|
26
|
Chris@99
|
27 "constMatrixEmpty2-\(name)": \(
|
Chris@99
|
28 compare (constMatrix 2 { rows = 0, columns = 4 }).size { columns = 0, rows = 0 } and
|
Chris@99
|
29 compare (constMatrix 2 { rows = 4, columns = 0 }).size { columns = 0, rows = 0 }
|
Chris@97
|
30 ),
|
Chris@97
|
31
|
Chris@99
|
32 "constMatrix-\(name)": \(
|
Chris@99
|
33 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@97
|
34 compare m.size { columns = 4, rows = 3 } and
|
Chris@97
|
35 all id (map do row: compare (block.list (m.getRow row)) [2,2,2,2] done [0..2]) and
|
Chris@97
|
36 all id (map do col: compare (block.list (m.getColumn col)) [2,2,2] done [0..3])
|
Chris@97
|
37 ),
|
Chris@97
|
38
|
Chris@99
|
39 "randomMatrixEmpty-\(name)": \(
|
Chris@99
|
40 m = randomMatrix { rows = 0, columns = 0 };
|
Chris@97
|
41 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
42 ),
|
Chris@97
|
43
|
Chris@99
|
44 "randomMatrix-\(name)": \(
|
Chris@99
|
45 m = randomMatrix { rows = 3, columns = 4 };
|
Chris@97
|
46 compare m.size { columns = 4, rows = 3 }
|
Chris@97
|
47 ),
|
Chris@97
|
48
|
Chris@99
|
49 "zeroMatrixEmpty-\(name)": \(
|
Chris@99
|
50 m = zeroMatrix { rows = 0, columns = 0 };
|
Chris@97
|
51 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
52 ),
|
Chris@97
|
53
|
Chris@99
|
54 "zeroMatrix-\(name)": \(
|
Chris@99
|
55 m = zeroMatrix { rows = 3, columns = 4 };
|
Chris@97
|
56 compare m.size { columns = 4, rows = 3 } and
|
Chris@97
|
57 all id (map do row: compare (block.list (m.getRow row)) [0,0,0,0] done [0..2]) and
|
Chris@97
|
58 all id (map do col: compare (block.list (m.getColumn col)) [0,0,0] done [0..3])
|
Chris@97
|
59 ),
|
Chris@97
|
60
|
Chris@99
|
61 "identityMatrixEmpty-\(name)": \(
|
Chris@99
|
62 m = identityMatrix { rows = 0, columns = 0 };
|
Chris@97
|
63 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
64 ),
|
Chris@97
|
65
|
Chris@99
|
66 "identityMatrix-\(name)": \(
|
Chris@99
|
67 m = identityMatrix { rows = 3, columns = 4 };
|
Chris@97
|
68 compare m.size { columns = 4, rows = 3 } and
|
Chris@97
|
69 all id (map do row: compare (block.list (m.getRow row)) [1,1,1,1] done [0..2]) and
|
Chris@97
|
70 all id (map do col: compare (block.list (m.getColumn col)) [1,1,1] done [0..3])
|
Chris@97
|
71 ),
|
Chris@97
|
72
|
Chris@99
|
73 "generateEmpty-\(name)": \(
|
Chris@99
|
74 m = generate do row col: 0 done { rows = 0, columns = 0 };
|
Chris@97
|
75 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
76 ),
|
Chris@97
|
77
|
Chris@99
|
78 "generate-\(name)": \(
|
Chris@99
|
79 m = generate do row col: row * 10 + col done { rows = 2, columns = 3 };
|
Chris@97
|
80 compare (block.list (m.getRow 0)) [0,1,2] and
|
Chris@97
|
81 compare (block.list (m.getRow 1)) [10,11,12]
|
Chris@97
|
82 ),
|
Chris@97
|
83
|
Chris@99
|
84 "widthAndHeight-\(name)": \(
|
Chris@99
|
85 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@97
|
86 compare m.size { columns = mat.width m, rows = mat.height m }
|
Chris@97
|
87 ),
|
Chris@97
|
88
|
Chris@99
|
89 "equal-\(name)": \(
|
Chris@100
|
90 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
|
Chris@100
|
91 n = m;
|
Chris@100
|
92 p = newMatrix (RowMajor ()) [[1,2,3],[4,5,6]];
|
Chris@100
|
93 q = newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]];
|
Chris@159
|
94 r = newMatrix (ColumnMajor ()) [[1,4],[2,5]];
|
Chris@100
|
95 compareMatrices m n and
|
Chris@100
|
96 compareMatrices m p and
|
Chris@100
|
97 compareMatrices n p and
|
Chris@159
|
98 not mat.equal m q and
|
Chris@159
|
99 not mat.equal m r
|
Chris@97
|
100 ),
|
Chris@97
|
101
|
Chris@99
|
102 "getAt-\(name)": \(
|
Chris@97
|
103 generator row col = row * 10 + col;
|
Chris@99
|
104 m = generate generator { rows = 2, columns = 3 };
|
Chris@97
|
105 all id
|
Chris@97
|
106 (map do row: all id
|
Chris@97
|
107 (map do col: m.getAt row col == generator row col done [0..2])
|
Chris@97
|
108 done [0..1])
|
Chris@97
|
109 ),
|
Chris@97
|
110
|
Chris@99
|
111 "setAt-\(name)": \(
|
Chris@97
|
112 generator row col = row * 10 + col;
|
Chris@99
|
113 m = generate generator { rows = 2, columns = 3 };
|
Chris@97
|
114 m.setAt 1 2 16;
|
Chris@97
|
115 compare (m.getAt 1 2) 16 and
|
Chris@97
|
116 compare (m.getAt 1 1) 11 and
|
Chris@97
|
117 compare (m.getAt 0 2) 2
|
Chris@97
|
118 ),
|
Chris@97
|
119
|
Chris@99
|
120 "copyOfEqual-\(name)": \(
|
Chris@99
|
121 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@97
|
122 m'' = mat.copyOf m;
|
Chris@99
|
123 compareMatrices m'' m
|
Chris@97
|
124 ),
|
Chris@97
|
125
|
Chris@99
|
126 "copyOfAlias-\(name)": \(
|
Chris@99
|
127 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@97
|
128 m' = m;
|
Chris@97
|
129 m'' = mat.copyOf m;
|
Chris@97
|
130 m.setAt 0 0 6;
|
Chris@99
|
131 compareMatrices m' m and not mat.equal m m'';
|
Chris@97
|
132 ),
|
Chris@97
|
133
|
Chris@99
|
134 "transposedEmpty-\(name)": \(
|
Chris@99
|
135 compare (mat.transposed (constMatrix 2 { rows = 0, columns = 0 })).size { columns = 0, rows = 0 } and
|
Chris@99
|
136 compare (mat.transposed (constMatrix 2 { rows = 0, columns = 4 })).size { columns = 0, rows = 0 } and
|
Chris@99
|
137 compare (mat.transposed (constMatrix 2 { rows = 4, columns = 0 })).size { columns = 0, rows = 0 }
|
Chris@97
|
138 ),
|
Chris@97
|
139
|
Chris@99
|
140 "transposedSize-\(name)": \(
|
Chris@99
|
141 compare (mat.transposed (constMatrix 2 { rows = 3, columns = 4 })).size { columns = 3, rows = 4 }
|
Chris@97
|
142 ),
|
Chris@97
|
143
|
Chris@99
|
144 "transposed-\(name)": \(
|
Chris@97
|
145 generator row col = row * 10 + col;
|
Chris@99
|
146 m = generate generator { rows = 2, columns = 3 };
|
Chris@97
|
147 m' = mat.transposed m;
|
Chris@97
|
148 all id
|
Chris@97
|
149 (map do row: all id
|
Chris@97
|
150 // like getAt test, but with col/row flipped
|
Chris@97
|
151 (map do col: m'.getAt col row == generator row col done [0..2])
|
Chris@97
|
152 done [0..1])
|
Chris@97
|
153 ),
|
Chris@97
|
154
|
Chris@100
|
155 "transposed-back-\(name)": \(
|
Chris@100
|
156 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
|
Chris@100
|
157 compareMatrices m (mat.transposed (mat.transposed m)) and
|
Chris@100
|
158 not mat.equal m (mat.transposed m);
|
Chris@100
|
159 ),
|
Chris@100
|
160
|
Chris@100
|
161 "flipped-\(name)": \(
|
Chris@99
|
162 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
|
Chris@99
|
163 m' = mat.flipped m;
|
Chris@99
|
164 m'' = newMatrix (RowMajor ()) [[1,2,3],[4,5,6]];
|
Chris@100
|
165 compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m'';
|
Chris@98
|
166 ),
|
Chris@98
|
167
|
Chris@100
|
168 "flipped-back-\(name)": \(
|
Chris@100
|
169 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
|
Chris@100
|
170 compareMatrices m (mat.flipped (mat.flipped m));
|
Chris@100
|
171 ),
|
Chris@100
|
172
|
Chris@100
|
173 "flipped-empty-\(name)": \(
|
Chris@99
|
174 m = constMatrix 2 { rows = 0, columns = 4 };
|
Chris@99
|
175 compareMatrices (mat.flipped m) (mat.flipped (constMatrix 0 { rows = 0, columns = 0 }));
|
Chris@98
|
176 ),
|
Chris@98
|
177
|
Chris@161
|
178 "toRowMajor-\(name)": \(
|
Chris@161
|
179 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
|
Chris@161
|
180 m' = mat.toRowMajor m;
|
Chris@161
|
181 m'' = newMatrix (RowMajor ()) [[1,2,3],[4,5,6]];
|
Chris@161
|
182 m''' = mat.toRowMajor m'';
|
Chris@161
|
183 compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m''
|
Chris@161
|
184 and compareMatrices m m''';
|
Chris@161
|
185 ),
|
Chris@161
|
186
|
Chris@161
|
187 "toColumnMajor-\(name)": \(
|
Chris@161
|
188 m = newMatrix (RowMajor ()) [[1,4],[2,5],[3,6]];
|
Chris@161
|
189 m' = mat.toColumnMajor m;
|
Chris@161
|
190 m'' = newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]];
|
Chris@161
|
191 m''' = mat.toColumnMajor m'';
|
Chris@161
|
192 compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m''
|
Chris@161
|
193 and compareMatrices m m''';
|
Chris@161
|
194 ),
|
Chris@161
|
195
|
Chris@99
|
196 "scaled-\(name)": \(
|
Chris@99
|
197 compareMatrices
|
Chris@99
|
198 (mat.scaled 0.5 (constMatrix 2 { rows = 3, columns = 4 }))
|
Chris@99
|
199 (constMatrix 1 { rows = 3, columns = 4 }) and
|
Chris@99
|
200 compareMatrices
|
Chris@99
|
201 (mat.scaled 0.5 (constMatrix (-3) { rows = 3, columns = 4 }))
|
Chris@99
|
202 (constMatrix (-1.5) { rows = 3, columns = 4 }) and
|
Chris@99
|
203 compareMatrices
|
Chris@99
|
204 (mat.scaled 0.5 (constMatrix 2 { rows = 0, columns = 2 }))
|
Chris@99
|
205 (constMatrix 5 { rows = 0, columns = 0 })
|
Chris@99
|
206 ),
|
Chris@99
|
207
|
Chris@99
|
208 "sum-\(name)": \(
|
Chris@99
|
209 compareMatrices
|
Chris@99
|
210 (mat.sum (constMatrix 2 { rows = 3, columns = 4 })
|
Chris@99
|
211 (constMatrix 1 { rows = 3, columns = 4 }))
|
Chris@99
|
212 (constMatrix 3 { rows = 3, columns = 4 })
|
Chris@99
|
213 ),
|
Chris@99
|
214
|
Chris@99
|
215 "sumFail-\(name)": \(
|
Chris@98
|
216 try
|
Chris@99
|
217 \() (mat.sum (constMatrix 2 { rows = 3, columns = 4 })
|
Chris@99
|
218 (constMatrix 1 { rows = 3, columns = 5 }));
|
Chris@98
|
219 false;
|
Chris@98
|
220 catch FailureException e:
|
Chris@98
|
221 true
|
Chris@98
|
222 yrt
|
Chris@98
|
223 ),
|
Chris@98
|
224
|
Chris@99
|
225 "product-\(name)": \(
|
Chris@99
|
226 compareMatrices
|
Chris@99
|
227 (mat.product (constMatrix 2 { rows = 4, columns = 2 })
|
Chris@99
|
228 (constMatrix 3 { rows = 2, columns = 3 }))
|
Chris@99
|
229 (constMatrix 12 { rows = 4, columns = 3 }) and
|
Chris@99
|
230 compareMatrices
|
Chris@99
|
231 (mat.product (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])
|
Chris@99
|
232 (newMatrix (ColumnMajor ()) [[7,9,11],[8,10,12]]))
|
Chris@99
|
233 (newMatrix (ColumnMajor ()) [[58,139],[64,154]])
|
Chris@98
|
234 ),
|
Chris@98
|
235
|
Chris@99
|
236 "productFail-\(name)": \(
|
Chris@99
|
237 try
|
Chris@99
|
238 \() (mat.product (constMatrix 2 { rows = 4, columns = 2 })
|
Chris@99
|
239 (constMatrix 3 { rows = 3, columns = 2 }));
|
Chris@99
|
240 false;
|
Chris@99
|
241 catch FailureException e:
|
Chris@99
|
242 true
|
Chris@99
|
243 yrt
|
Chris@99
|
244 ),
|
Chris@97
|
245
|
Chris@158
|
246 "resizedTo-\(name)": \(
|
Chris@158
|
247 compareMatrices
|
Chris@158
|
248 (mat.resizedTo { rows = 2, columns = 2 }
|
Chris@158
|
249 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]))
|
Chris@159
|
250 (newMatrix (ColumnMajor ()) [[1,4],[2,5]]) and
|
Chris@158
|
251 compareMatrices
|
Chris@158
|
252 (mat.resizedTo { rows = 3, columns = 4 }
|
Chris@158
|
253 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]))
|
Chris@158
|
254 (newMatrix (ColumnMajor ()) [[1,4,0],[2,5,0],[3,6,0],[0,0,0]]) and
|
Chris@158
|
255 compareMatrices
|
Chris@158
|
256 (mat.resizedTo { rows = 1, columns = 1 }
|
Chris@158
|
257 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]))
|
Chris@159
|
258 (newMatrix (RowMajor ()) [[1]])
|
Chris@158
|
259 ),
|
Chris@158
|
260
|
Chris@158
|
261 "zeroSizeMatrix-\(name)": \(
|
Chris@158
|
262 compareMatrices
|
Chris@158
|
263 (mat.zeroSizeMatrix ())
|
Chris@158
|
264 (newMatrix (ColumnMajor ()) [])
|
Chris@158
|
265 ),
|
Chris@158
|
266
|
Chris@161
|
267 "asRows-\(name)": \(
|
Chris@161
|
268 compare
|
Chris@171
|
269 (map block.list
|
Chris@171
|
270 (mat.asRows (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])))
|
Chris@161
|
271 [[1,2,3],[4,5,6]];
|
Chris@161
|
272 ),
|
Chris@161
|
273
|
Chris@161
|
274 "asColumns-\(name)": \(
|
Chris@161
|
275 compare
|
Chris@171
|
276 (map block.list
|
Chris@171
|
277 (mat.asColumns (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])))
|
Chris@161
|
278 [[1,4],[2,5],[3,6]];
|
Chris@161
|
279 ),
|
Chris@161
|
280
|
Chris@178
|
281 "concat-horiz-\(name)": \(
|
Chris@177
|
282 compareMatrices
|
Chris@177
|
283 (mat.concat (Horizontal ())
|
Chris@177
|
284 [(newMatrix (ColumnMajor ()) [[1,4],[2,5]]),
|
Chris@177
|
285 (newMatrix (RowMajor ()) [[3],[6]])])
|
Chris@177
|
286 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])
|
Chris@177
|
287 ),
|
Chris@177
|
288
|
Chris@178
|
289 "concatFail-horiz-\(name)": \(
|
Chris@178
|
290 try
|
Chris@178
|
291 \() (mat.concat (Horizontal ())
|
Chris@178
|
292 [(newMatrix (ColumnMajor ()) [[1,4],[2,5]]),
|
Chris@178
|
293 (newMatrix (ColumnMajor ()) [[3],[6]])]);
|
Chris@178
|
294 false
|
Chris@178
|
295 catch FailureException e:
|
Chris@178
|
296 true
|
Chris@178
|
297 yrt
|
Chris@178
|
298 ),
|
Chris@178
|
299
|
Chris@178
|
300 "concat-vert-\(name)": \(
|
Chris@178
|
301 compareMatrices
|
Chris@178
|
302 (mat.concat (Vertical ())
|
Chris@178
|
303 [(newMatrix (ColumnMajor ()) [[1,4],[2,5]]),
|
Chris@178
|
304 (newMatrix (RowMajor ()) [[3,6]])])
|
Chris@178
|
305 (newMatrix (ColumnMajor ()) [[1,4,3],[2,5,6]])
|
Chris@178
|
306 ),
|
Chris@178
|
307
|
Chris@178
|
308 "concatFail-vert-\(name)": \(
|
Chris@178
|
309 try
|
Chris@178
|
310 \() (mat.concat (Vertical ())
|
Chris@178
|
311 [(newMatrix (ColumnMajor ()) [[1,4],[2,5]]),
|
Chris@178
|
312 (newMatrix (RowMajor ()) [[3],[6]])]);
|
Chris@178
|
313 false
|
Chris@178
|
314 catch FailureException e:
|
Chris@178
|
315 true
|
Chris@178
|
316 yrt
|
Chris@178
|
317 ),
|
Chris@178
|
318
|
Chris@187
|
319 "rowSlice-\(name)": \(
|
Chris@187
|
320 compareMatrices
|
Chris@187
|
321 (mat.rowSlice 1 2 (newMatrix (RowMajor ()) [[1,2],[3,4],[5,6],[7,8]]))
|
Chris@187
|
322 (newMatrix (RowMajor ()) [[3,4],[5,6]])
|
Chris@187
|
323 ),
|
Chris@187
|
324
|
Chris@187
|
325 "columnSlice-\(name)": \(
|
Chris@187
|
326 compareMatrices
|
Chris@187
|
327 (mat.columnSlice 1 2 (newMatrix (RowMajor ()) [[1,2,3,4],[5,6,7,8]]))
|
Chris@187
|
328 (newMatrix (RowMajor ()) [[2,3],[6,7]])
|
Chris@187
|
329 ),
|
Chris@187
|
330
|
Chris@99
|
331 ]);
|
Chris@99
|
332
|
Chris@99
|
333 colhash = makeTests "column-major" id;
|
Chris@99
|
334 rowhash = makeTests "row-major" mat.flipped;
|
Chris@99
|
335
|
Chris@99
|
336 all = [:];
|
Chris@99
|
337 for (keys colhash) do k: all[k] := colhash[k] done;
|
Chris@99
|
338 for (keys rowhash) do k: all[k] := rowhash[k] done;
|
Chris@99
|
339
|
Chris@99
|
340 all is hash<string, () -> boolean>;
|
Chris@99
|
341
|
Chris@99
|
342
|