annotate yetilab/matrix/test/test_matrix.yeti @ 238:0c86d9284f20 sparse

Implement sparse matrix construction, add tests for sparse matrices (currently failing)
author Chris Cannam
date Mon, 20 May 2013 14:18:14 +0100
parents ac1373067054
children f22ae9bfe49f
rev   line source
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@100 93 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
Chris@100 94 n = m;
Chris@100 95 p = newMatrix (RowMajor ()) [[1,2,3],[4,5,6]];
Chris@100 96 q = newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]];
Chris@159 97 r = newMatrix (ColumnMajor ()) [[1,4],[2,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@229 109 s = newMatrix (ColumnMajor ()) [[1,2,5],[6,7,8]];
Chris@229 110 t = newMatrix (ColumnMajor ()) [[1,2,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@220 126 /*!!!
Chris@99 127 "setAt-\(name)": \(
Chris@97 128 generator row col = row * 10 + col;
Chris@99 129 m = generate generator { rows = 2, columns = 3 };
Chris@210 130 mat.setAt 1 2 16 m;
Chris@210 131 compare (mat.getAt 1 2 m) 16 and
Chris@210 132 compare (mat.getAt 1 1 m) 11 and
Chris@210 133 compare (mat.getAt 0 2 m) 2
Chris@97 134 ),
Chris@97 135
Chris@99 136 "copyOfEqual-\(name)": \(
Chris@99 137 m = constMatrix 2 { rows = 3, columns = 4 };
Chris@97 138 m'' = mat.copyOf m;
Chris@99 139 compareMatrices m'' m
Chris@97 140 ),
Chris@97 141
Chris@99 142 "copyOfAlias-\(name)": \(
Chris@99 143 m = constMatrix 2 { rows = 3, columns = 4 };
Chris@97 144 m' = m;
Chris@97 145 m'' = mat.copyOf m;
Chris@210 146 mat.setAt 0 0 6 m;
Chris@99 147 compareMatrices m' m and not mat.equal m m'';
Chris@97 148 ),
Chris@220 149 */
Chris@99 150 "transposedEmpty-\(name)": \(
Chris@210 151 compare (mat.size (mat.transposed (constMatrix 2 { rows = 0, columns = 0 }))) { columns = 0, rows = 0 } and
Chris@210 152 compare (mat.size (mat.transposed (constMatrix 2 { rows = 0, columns = 4 }))) { columns = 0, rows = 0 } and
Chris@210 153 compare (mat.size (mat.transposed (constMatrix 2 { rows = 4, columns = 0 }))) { columns = 0, rows = 0 }
Chris@97 154 ),
Chris@97 155
Chris@99 156 "transposedSize-\(name)": \(
Chris@210 157 compare (mat.size (mat.transposed (constMatrix 2 { rows = 3, columns = 4 }))) { columns = 3, rows = 4 }
Chris@97 158 ),
Chris@97 159
Chris@99 160 "transposed-\(name)": \(
Chris@97 161 generator row col = row * 10 + col;
Chris@99 162 m = generate generator { rows = 2, columns = 3 };
Chris@97 163 m' = mat.transposed m;
Chris@97 164 all id
Chris@97 165 (map do row: all id
Chris@97 166 // like getAt test, but with col/row flipped
Chris@210 167 (map do col: mat.getAt col row m' == generator row col done [0..2])
Chris@97 168 done [0..1])
Chris@97 169 ),
Chris@97 170
Chris@100 171 "transposed-back-\(name)": \(
Chris@100 172 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
Chris@100 173 compareMatrices m (mat.transposed (mat.transposed m)) and
Chris@100 174 not mat.equal m (mat.transposed m);
Chris@100 175 ),
Chris@100 176
Chris@100 177 "flipped-\(name)": \(
Chris@99 178 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
Chris@99 179 m' = mat.flipped m;
Chris@99 180 m'' = newMatrix (RowMajor ()) [[1,2,3],[4,5,6]];
Chris@100 181 compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m'';
Chris@98 182 ),
Chris@98 183
Chris@100 184 "flipped-back-\(name)": \(
Chris@100 185 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
Chris@100 186 compareMatrices m (mat.flipped (mat.flipped m));
Chris@100 187 ),
Chris@100 188
Chris@100 189 "flipped-empty-\(name)": \(
Chris@99 190 m = constMatrix 2 { rows = 0, columns = 4 };
Chris@99 191 compareMatrices (mat.flipped m) (mat.flipped (constMatrix 0 { rows = 0, columns = 0 }));
Chris@98 192 ),
Chris@98 193
Chris@161 194 "toRowMajor-\(name)": \(
Chris@161 195 m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]];
Chris@161 196 m' = mat.toRowMajor m;
Chris@161 197 m'' = newMatrix (RowMajor ()) [[1,2,3],[4,5,6]];
Chris@161 198 m''' = mat.toRowMajor m'';
Chris@161 199 compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m''
Chris@161 200 and compareMatrices m m''';
Chris@161 201 ),
Chris@161 202
Chris@161 203 "toColumnMajor-\(name)": \(
Chris@161 204 m = newMatrix (RowMajor ()) [[1,4],[2,5],[3,6]];
Chris@161 205 m' = mat.toColumnMajor m;
Chris@161 206 m'' = newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]];
Chris@161 207 m''' = mat.toColumnMajor m'';
Chris@161 208 compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m''
Chris@161 209 and compareMatrices m m''';
Chris@161 210 ),
Chris@161 211
Chris@99 212 "scaled-\(name)": \(
Chris@99 213 compareMatrices
Chris@99 214 (mat.scaled 0.5 (constMatrix 2 { rows = 3, columns = 4 }))
Chris@99 215 (constMatrix 1 { rows = 3, columns = 4 }) and
Chris@99 216 compareMatrices
Chris@99 217 (mat.scaled 0.5 (constMatrix (-3) { rows = 3, columns = 4 }))
Chris@99 218 (constMatrix (-1.5) { rows = 3, columns = 4 }) and
Chris@99 219 compareMatrices
Chris@99 220 (mat.scaled 0.5 (constMatrix 2 { rows = 0, columns = 2 }))
Chris@99 221 (constMatrix 5 { rows = 0, columns = 0 })
Chris@99 222 ),
Chris@99 223
Chris@99 224 "sum-\(name)": \(
Chris@99 225 compareMatrices
Chris@99 226 (mat.sum (constMatrix 2 { rows = 3, columns = 4 })
Chris@99 227 (constMatrix 1 { rows = 3, columns = 4 }))
Chris@99 228 (constMatrix 3 { rows = 3, columns = 4 })
Chris@99 229 ),
Chris@99 230
Chris@99 231 "sumFail-\(name)": \(
Chris@98 232 try
Chris@99 233 \() (mat.sum (constMatrix 2 { rows = 3, columns = 4 })
Chris@99 234 (constMatrix 1 { rows = 3, columns = 5 }));
Chris@98 235 false;
Chris@98 236 catch FailureException e:
Chris@98 237 true
Chris@98 238 yrt
Chris@98 239 ),
Chris@98 240
Chris@229 241 "difference-\(name)": \(
Chris@229 242 compareMatrices
Chris@229 243 (mat.difference (constMatrix 2 { rows = 3, columns = 4 })
Chris@229 244 (constMatrix 1 { rows = 3, columns = 4 }))
Chris@229 245 (constMatrix 1 { rows = 3, columns = 4 })
Chris@229 246 ),
Chris@229 247
Chris@229 248 "differenceFail-\(name)": \(
Chris@229 249 try
Chris@229 250 \() (mat.difference (constMatrix 2 { rows = 3, columns = 4 })
Chris@229 251 (constMatrix 1 { rows = 3, columns = 5 }));
Chris@229 252 false;
Chris@229 253 catch FailureException e:
Chris@229 254 true
Chris@229 255 yrt
Chris@229 256 ),
Chris@229 257
Chris@229 258 "abs-\(name)": \(
Chris@229 259 compareMatrices
Chris@229 260 (mat.abs (newMatrix (ColumnMajor ()) [[-1,4],[2,-5],[-3,0]]))
Chris@229 261 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,0]])
Chris@229 262 ),
Chris@229 263
Chris@99 264 "product-\(name)": \(
Chris@99 265 compareMatrices
Chris@99 266 (mat.product (constMatrix 2 { rows = 4, columns = 2 })
Chris@99 267 (constMatrix 3 { rows = 2, columns = 3 }))
Chris@99 268 (constMatrix 12 { rows = 4, columns = 3 }) and
Chris@99 269 compareMatrices
Chris@99 270 (mat.product (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])
Chris@99 271 (newMatrix (ColumnMajor ()) [[7,9,11],[8,10,12]]))
Chris@99 272 (newMatrix (ColumnMajor ()) [[58,139],[64,154]])
Chris@98 273 ),
Chris@98 274
Chris@99 275 "productFail-\(name)": \(
Chris@99 276 try
Chris@99 277 \() (mat.product (constMatrix 2 { rows = 4, columns = 2 })
Chris@99 278 (constMatrix 3 { rows = 3, columns = 2 }));
Chris@99 279 false;
Chris@99 280 catch FailureException e:
Chris@99 281 true
Chris@99 282 yrt
Chris@99 283 ),
Chris@97 284
Chris@158 285 "resizedTo-\(name)": \(
Chris@158 286 compareMatrices
Chris@158 287 (mat.resizedTo { rows = 2, columns = 2 }
Chris@158 288 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]))
Chris@159 289 (newMatrix (ColumnMajor ()) [[1,4],[2,5]]) and
Chris@158 290 compareMatrices
Chris@158 291 (mat.resizedTo { rows = 3, columns = 4 }
Chris@158 292 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]))
Chris@158 293 (newMatrix (ColumnMajor ()) [[1,4,0],[2,5,0],[3,6,0],[0,0,0]]) and
Chris@158 294 compareMatrices
Chris@158 295 (mat.resizedTo { rows = 1, columns = 1 }
Chris@158 296 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]))
Chris@202 297 (newMatrix (RowMajor ()) [[1]]) and
Chris@202 298 compareMatrices
Chris@202 299 (mat.resizedTo { rows = 2, columns = 3 }
Chris@202 300 (mat.zeroSizeMatrix ()))
Chris@202 301 (newMatrix (RowMajor ()) [[0,0,0],[0,0,0]])
Chris@158 302 ),
Chris@158 303
Chris@158 304 "zeroSizeMatrix-\(name)": \(
Chris@158 305 compareMatrices
Chris@158 306 (mat.zeroSizeMatrix ())
Chris@158 307 (newMatrix (ColumnMajor ()) [])
Chris@158 308 ),
Chris@158 309
Chris@161 310 "asRows-\(name)": \(
Chris@161 311 compare
Chris@218 312 (map vec.list
Chris@171 313 (mat.asRows (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])))
Chris@161 314 [[1,2,3],[4,5,6]];
Chris@161 315 ),
Chris@161 316
Chris@161 317 "asColumns-\(name)": \(
Chris@161 318 compare
Chris@218 319 (map vec.list
Chris@171 320 (mat.asColumns (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])))
Chris@161 321 [[1,4],[2,5],[3,6]];
Chris@161 322 ),
Chris@161 323
Chris@178 324 "concat-horiz-\(name)": \(
Chris@177 325 compareMatrices
Chris@177 326 (mat.concat (Horizontal ())
Chris@177 327 [(newMatrix (ColumnMajor ()) [[1,4],[2,5]]),
Chris@177 328 (newMatrix (RowMajor ()) [[3],[6]])])
Chris@177 329 (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])
Chris@177 330 ),
Chris@177 331
Chris@178 332 "concatFail-horiz-\(name)": \(
Chris@178 333 try
Chris@178 334 \() (mat.concat (Horizontal ())
Chris@178 335 [(newMatrix (ColumnMajor ()) [[1,4],[2,5]]),
Chris@178 336 (newMatrix (ColumnMajor ()) [[3],[6]])]);
Chris@178 337 false
Chris@178 338 catch FailureException e:
Chris@178 339 true
Chris@178 340 yrt
Chris@178 341 ),
Chris@178 342
Chris@178 343 "concat-vert-\(name)": \(
Chris@178 344 compareMatrices
Chris@178 345 (mat.concat (Vertical ())
Chris@178 346 [(newMatrix (ColumnMajor ()) [[1,4],[2,5]]),
Chris@178 347 (newMatrix (RowMajor ()) [[3,6]])])
Chris@178 348 (newMatrix (ColumnMajor ()) [[1,4,3],[2,5,6]])
Chris@178 349 ),
Chris@178 350
Chris@178 351 "concatFail-vert-\(name)": \(
Chris@178 352 try
Chris@178 353 \() (mat.concat (Vertical ())
Chris@178 354 [(newMatrix (ColumnMajor ()) [[1,4],[2,5]]),
Chris@178 355 (newMatrix (RowMajor ()) [[3],[6]])]);
Chris@178 356 false
Chris@178 357 catch FailureException e:
Chris@178 358 true
Chris@178 359 yrt
Chris@178 360 ),
Chris@178 361
Chris@187 362 "rowSlice-\(name)": \(
Chris@187 363 compareMatrices
Chris@187 364 (mat.rowSlice 1 2 (newMatrix (RowMajor ()) [[1,2],[3,4],[5,6],[7,8]]))
Chris@187 365 (newMatrix (RowMajor ()) [[3,4],[5,6]])
Chris@187 366 ),
Chris@187 367
Chris@187 368 "columnSlice-\(name)": \(
Chris@187 369 compareMatrices
Chris@187 370 (mat.columnSlice 1 2 (newMatrix (RowMajor ()) [[1,2,3,4],[5,6,7,8]]))
Chris@187 371 (newMatrix (RowMajor ()) [[2,3],[6,7]])
Chris@187 372 ),
Chris@187 373
Chris@99 374 ]);
Chris@99 375
Chris@238 376 colhash = makeTests "column-dense" id;
Chris@238 377 rowhash = makeTests "row-dense" mat.flipped;
Chris@238 378 sparsecolhash = makeTests "column-sparse" (mat.toSparse 0);
Chris@238 379 sparserowhash = makeTests "row-sparse" ((mat.toSparse 0) . (mat.flipped));
Chris@238 380 //sparserowhash2 = makeTests "row-sparse2" ((mat.flipped) . (mat.toSparse 0));
Chris@99 381
Chris@99 382 all = [:];
Chris@238 383 for [ colhash, rowhash, sparsecolhash, sparserowhash /*, sparserowhash2 */ ] do h:
Chris@238 384 for (keys h) do k: all[k] := h[k] done;
Chris@238 385 done;
Chris@99 386
Chris@99 387 all is hash<string, () -> boolean>;
Chris@99 388
Chris@99 389