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@97
|
9 { compare } = load yetilab.test.test;
|
Chris@97
|
10
|
Chris@99
|
11 compareMatrices obtained expected =
|
Chris@99
|
12 if mat.equal obtained expected then
|
Chris@99
|
13 true;
|
Chris@99
|
14 else
|
Chris@99
|
15 println "** expected: \(expected.data)\n obtained: \(obtained.data)";
|
Chris@99
|
16 false;
|
Chris@99
|
17 fi;
|
Chris@99
|
18
|
Chris@99
|
19 makeTests name flipper =
|
Chris@99
|
20 (constMatrix n s = flipper (mat.constMatrix n s);
|
Chris@99
|
21 zeroMatrix s = flipper (mat.zeroMatrix s);
|
Chris@99
|
22 randomMatrix s = flipper (mat.randomMatrix s);
|
Chris@99
|
23 identityMatrix s = flipper (mat.identityMatrix s);
|
Chris@99
|
24 generate f s = flipper (mat.generate f s);
|
Chris@99
|
25 newMatrix t d = flipper (mat.newMatrix t d);
|
Chris@97
|
26 [
|
Chris@97
|
27
|
Chris@99
|
28 "constMatrixEmpty-\(name)": \(
|
Chris@99
|
29 m = constMatrix 2 { rows = 0, columns = 0 };
|
Chris@97
|
30 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
31 ),
|
Chris@97
|
32
|
Chris@99
|
33 "constMatrixEmpty2-\(name)": \(
|
Chris@99
|
34 compare (constMatrix 2 { rows = 0, columns = 4 }).size { columns = 0, rows = 0 } and
|
Chris@99
|
35 compare (constMatrix 2 { rows = 4, columns = 0 }).size { columns = 0, rows = 0 }
|
Chris@97
|
36 ),
|
Chris@97
|
37
|
Chris@99
|
38 "constMatrix-\(name)": \(
|
Chris@99
|
39 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@97
|
40 compare m.size { columns = 4, rows = 3 } and
|
Chris@97
|
41 all id (map do row: compare (block.list (m.getRow row)) [2,2,2,2] done [0..2]) and
|
Chris@97
|
42 all id (map do col: compare (block.list (m.getColumn col)) [2,2,2] done [0..3])
|
Chris@97
|
43 ),
|
Chris@97
|
44
|
Chris@99
|
45 "randomMatrixEmpty-\(name)": \(
|
Chris@99
|
46 m = randomMatrix { rows = 0, columns = 0 };
|
Chris@97
|
47 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
48 ),
|
Chris@97
|
49
|
Chris@99
|
50 "randomMatrix-\(name)": \(
|
Chris@99
|
51 m = randomMatrix { rows = 3, columns = 4 };
|
Chris@97
|
52 compare m.size { columns = 4, rows = 3 }
|
Chris@97
|
53 ),
|
Chris@97
|
54
|
Chris@99
|
55 "zeroMatrixEmpty-\(name)": \(
|
Chris@99
|
56 m = zeroMatrix { rows = 0, columns = 0 };
|
Chris@97
|
57 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
58 ),
|
Chris@97
|
59
|
Chris@99
|
60 "zeroMatrix-\(name)": \(
|
Chris@99
|
61 m = zeroMatrix { rows = 3, columns = 4 };
|
Chris@97
|
62 compare m.size { columns = 4, rows = 3 } and
|
Chris@97
|
63 all id (map do row: compare (block.list (m.getRow row)) [0,0,0,0] done [0..2]) and
|
Chris@97
|
64 all id (map do col: compare (block.list (m.getColumn col)) [0,0,0] done [0..3])
|
Chris@97
|
65 ),
|
Chris@97
|
66
|
Chris@99
|
67 "identityMatrixEmpty-\(name)": \(
|
Chris@99
|
68 m = identityMatrix { rows = 0, columns = 0 };
|
Chris@97
|
69 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
70 ),
|
Chris@97
|
71
|
Chris@99
|
72 "identityMatrix-\(name)": \(
|
Chris@99
|
73 m = identityMatrix { rows = 3, columns = 4 };
|
Chris@97
|
74 compare m.size { columns = 4, rows = 3 } and
|
Chris@97
|
75 all id (map do row: compare (block.list (m.getRow row)) [1,1,1,1] done [0..2]) and
|
Chris@97
|
76 all id (map do col: compare (block.list (m.getColumn col)) [1,1,1] done [0..3])
|
Chris@97
|
77 ),
|
Chris@97
|
78
|
Chris@99
|
79 "generateEmpty-\(name)": \(
|
Chris@99
|
80 m = generate do row col: 0 done { rows = 0, columns = 0 };
|
Chris@97
|
81 compare m.size { columns = 0, rows = 0 }
|
Chris@97
|
82 ),
|
Chris@97
|
83
|
Chris@99
|
84 "generate-\(name)": \(
|
Chris@99
|
85 m = generate do row col: row * 10 + col done { rows = 2, columns = 3 };
|
Chris@97
|
86 compare (block.list (m.getRow 0)) [0,1,2] and
|
Chris@97
|
87 compare (block.list (m.getRow 1)) [10,11,12]
|
Chris@97
|
88 ),
|
Chris@97
|
89
|
Chris@99
|
90 "widthAndHeight-\(name)": \(
|
Chris@99
|
91 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@97
|
92 compare m.size { columns = mat.width m, rows = mat.height m }
|
Chris@97
|
93 ),
|
Chris@97
|
94
|
Chris@99
|
95 "equal-\(name)": \(
|
Chris@99
|
96 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@97
|
97 m' = m;
|
Chris@99
|
98 p = constMatrix 2 { rows = 4, columns = 3 };
|
Chris@99
|
99 q = constMatrix 3 { rows = 3, columns = 4 };
|
Chris@97
|
100 mat.equal m m' and mat.equal m m and
|
Chris@97
|
101 not mat.equal m p and not mat.equal m q and not mat.equal p q
|
Chris@97
|
102 ),
|
Chris@97
|
103
|
Chris@99
|
104 "getAt-\(name)": \(
|
Chris@97
|
105 generator row col = row * 10 + col;
|
Chris@99
|
106 m = generate generator { rows = 2, columns = 3 };
|
Chris@97
|
107 all id
|
Chris@97
|
108 (map do row: all id
|
Chris@97
|
109 (map do col: m.getAt row col == generator row col done [0..2])
|
Chris@97
|
110 done [0..1])
|
Chris@97
|
111 ),
|
Chris@97
|
112
|
Chris@99
|
113 "setAt-\(name)": \(
|
Chris@97
|
114 generator row col = row * 10 + col;
|
Chris@99
|
115 m = generate generator { rows = 2, columns = 3 };
|
Chris@97
|
116 m.setAt 1 2 16;
|
Chris@97
|
117 compare (m.getAt 1 2) 16 and
|
Chris@97
|
118 compare (m.getAt 1 1) 11 and
|
Chris@97
|
119 compare (m.getAt 0 2) 2
|
Chris@97
|
120 ),
|
Chris@97
|
121
|
Chris@99
|
122 "copyOfEqual-\(name)": \(
|
Chris@99
|
123 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@97
|
124 m'' = mat.copyOf m;
|
Chris@99
|
125 compareMatrices m'' m
|
Chris@97
|
126 ),
|
Chris@97
|
127
|
Chris@99
|
128 "copyOfAlias-\(name)": \(
|
Chris@99
|
129 m = constMatrix 2 { rows = 3, columns = 4 };
|
Chris@97
|
130 m' = m;
|
Chris@97
|
131 m'' = mat.copyOf m;
|
Chris@97
|
132 m.setAt 0 0 6;
|
Chris@99
|
133 compareMatrices m' m and not mat.equal m m'';
|
Chris@97
|
134 ),
|
Chris@97
|
135
|
Chris@99
|
136 "transposedEmpty-\(name)": \(
|
Chris@99
|
137 compare (mat.transposed (constMatrix 2 { rows = 0, columns = 0 })).size { columns = 0, rows = 0 } and
|
Chris@99
|
138 compare (mat.transposed (constMatrix 2 { rows = 0, columns = 4 })).size { columns = 0, rows = 0 } and
|
Chris@99
|
139 compare (mat.transposed (constMatrix 2 { rows = 4, columns = 0 })).size { columns = 0, rows = 0 }
|
Chris@97
|
140 ),
|
Chris@97
|
141
|
Chris@99
|
142 "transposedSize-\(name)": \(
|
Chris@99
|
143 compare (mat.transposed (constMatrix 2 { rows = 3, columns = 4 })).size { columns = 3, rows = 4 }
|
Chris@97
|
144 ),
|
Chris@97
|
145
|
Chris@99
|
146 "transposed-\(name)": \(
|
Chris@97
|
147 generator row col = row * 10 + col;
|
Chris@99
|
148 m = generate generator { rows = 2, columns = 3 };
|
Chris@97
|
149 m' = mat.transposed m;
|
Chris@97
|
150 all id
|
Chris@97
|
151 (map do row: all id
|
Chris@97
|
152 // like getAt test, but with col/row flipped
|
Chris@97
|
153 (map do col: m'.getAt col row == generator row col done [0..2])
|
Chris@97
|
154 done [0..1])
|
Chris@97
|
155 ),
|
Chris@97
|
156
|
Chris@99
|
157 "flipped": \(
|
Chris@99
|
158 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
|
Chris@99
|
159 m' = mat.flipped m;
|
Chris@99
|
160 m'' = newMatrix (RowMajor ()) [[1,2,3],[4,5,6]];
|
Chris@99
|
161 compareMatrices m' m'';
|
Chris@98
|
162 ),
|
Chris@98
|
163
|
Chris@99
|
164 "flipped-empty": \(
|
Chris@99
|
165 m = constMatrix 2 { rows = 0, columns = 4 };
|
Chris@99
|
166 compareMatrices (mat.flipped m) (mat.flipped (constMatrix 0 { rows = 0, columns = 0 }));
|
Chris@98
|
167 ),
|
Chris@98
|
168
|
Chris@99
|
169 "scaled-\(name)": \(
|
Chris@99
|
170 compareMatrices
|
Chris@99
|
171 (mat.scaled 0.5 (constMatrix 2 { rows = 3, columns = 4 }))
|
Chris@99
|
172 (constMatrix 1 { rows = 3, columns = 4 }) and
|
Chris@99
|
173 compareMatrices
|
Chris@99
|
174 (mat.scaled 0.5 (constMatrix (-3) { rows = 3, columns = 4 }))
|
Chris@99
|
175 (constMatrix (-1.5) { rows = 3, columns = 4 }) and
|
Chris@99
|
176 compareMatrices
|
Chris@99
|
177 (mat.scaled 0.5 (constMatrix 2 { rows = 0, columns = 2 }))
|
Chris@99
|
178 (constMatrix 5 { rows = 0, columns = 0 })
|
Chris@99
|
179 ),
|
Chris@99
|
180
|
Chris@99
|
181 "sum-\(name)": \(
|
Chris@99
|
182 compareMatrices
|
Chris@99
|
183 (mat.sum (constMatrix 2 { rows = 3, columns = 4 })
|
Chris@99
|
184 (constMatrix 1 { rows = 3, columns = 4 }))
|
Chris@99
|
185 (constMatrix 3 { rows = 3, columns = 4 })
|
Chris@99
|
186 ),
|
Chris@99
|
187
|
Chris@99
|
188 "sumFail-\(name)": \(
|
Chris@98
|
189 try
|
Chris@99
|
190 \() (mat.sum (constMatrix 2 { rows = 3, columns = 4 })
|
Chris@99
|
191 (constMatrix 1 { rows = 3, columns = 5 }));
|
Chris@98
|
192 false;
|
Chris@98
|
193 catch FailureException e:
|
Chris@98
|
194 true
|
Chris@98
|
195 yrt
|
Chris@98
|
196 ),
|
Chris@98
|
197
|
Chris@99
|
198 "product-\(name)": \(
|
Chris@99
|
199 compareMatrices
|
Chris@99
|
200 (mat.product (constMatrix 2 { rows = 4, columns = 2 })
|
Chris@99
|
201 (constMatrix 3 { rows = 2, columns = 3 }))
|
Chris@99
|
202 (constMatrix 12 { rows = 4, columns = 3 }) and
|
Chris@99
|
203 compareMatrices
|
Chris@99
|
204 (mat.product (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])
|
Chris@99
|
205 (newMatrix (ColumnMajor ()) [[7,9,11],[8,10,12]]))
|
Chris@99
|
206 (newMatrix (ColumnMajor ()) [[58,139],[64,154]])
|
Chris@98
|
207 ),
|
Chris@98
|
208
|
Chris@99
|
209 "productFail-\(name)": \(
|
Chris@99
|
210 try
|
Chris@99
|
211 \() (mat.product (constMatrix 2 { rows = 4, columns = 2 })
|
Chris@99
|
212 (constMatrix 3 { rows = 3, columns = 2 }));
|
Chris@99
|
213 false;
|
Chris@99
|
214 catch FailureException e:
|
Chris@99
|
215 true
|
Chris@99
|
216 yrt
|
Chris@99
|
217 ),
|
Chris@97
|
218
|
Chris@99
|
219 ]);
|
Chris@99
|
220
|
Chris@99
|
221 colhash = makeTests "column-major" id;
|
Chris@99
|
222 rowhash = makeTests "row-major" mat.flipped;
|
Chris@99
|
223
|
Chris@99
|
224 all = [:];
|
Chris@99
|
225 for (keys colhash) do k: all[k] := colhash[k] done;
|
Chris@99
|
226 for (keys rowhash) do k: all[k] := rowhash[k] done;
|
Chris@99
|
227
|
Chris@99
|
228 all is hash<string, () -> boolean>;
|
Chris@99
|
229
|
Chris@99
|
230
|