annotate yetilab/matrix/test/test_matrix.yeti @ 277:678477bf617c

(clumsily) make slice functions handle out-of-range arguments properly
author Chris Cannam
date Sat, 25 May 2013 18:41:53 +0100
parents 2c3faf6a2820
children 7f000ae124db
rev   line source
Chris@97 1
Chris@97 2 module yetilab.matrix.test.test_matrix;
Chris@97 3
Chris@273 4 mat = load yetilab.matrix;
Chris@273 5 vec = load yetilab.vector;
Chris@97 6
Chris@273 7 load yetilab.vector.type;
Chris@273 8 load yetilab.matrix.type;
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@260 118 "at-\(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@260 123 (map do col: mat.at m row col == 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@260 143 // like at test, but with col/row flipped
Chris@260 144 (map do col: mat.at m' col row == 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@261 227 { i = 1, j = 1, v = -4 }, // NB this means [1,1] -> 0, sparse zero
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@261 240 ]) and
Chris@261 241 compare (mat.density tot) (4/6)
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@261 354 (newMatrix (RowMajor ()) [[0,0,0],[0,0,0]]) and
Chris@261 355 mat.isSparse?
Chris@261 356 (mat.resizedTo { rows = 1, columns = 1 }
Chris@261 357 (mat.toSparse (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])))
Chris@158 358 ),
Chris@158 359
Chris@158 360 "zeroSizeMatrix-\(name)": \(
Chris@158 361 compareMatrices
Chris@158 362 (mat.zeroSizeMatrix ())
Chris@275 363 (newMatrix (ColumnMajor ()) []) and
Chris@275 364 compareMatrices
Chris@275 365 (mat.zeroSizeMatrix ())
Chris@275 366 (newMatrix (ColumnMajor ()) [[]]) and
Chris@275 367 compareMatrices
Chris@275 368 (newMatrix (ColumnMajor ()) [[]])
Chris@275 369 (newMatrix (RowMajor ()) [[]]) and
Chris@275 370 compareMatrices
Chris@275 371 (mat.zeroSizeMatrix ())
Chris@275 372 (mat.newSparseMatrix (ColumnMajor ()) { rows = 0, columns = 1 } []) and
Chris@275 373 compareMatrices
Chris@275 374 (mat.zeroSizeMatrix ())
Chris@275 375 (mat.newSparseMatrix (ColumnMajor ()) { rows = 1, columns = 0 } [])
Chris@158 376 ),
Chris@158 377
Chris@161 378 "asRows-\(name)": \(
Chris@161 379 compare
Chris@218 380 (map vec.list
Chris@241 381 (mat.asRows (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]])))
Chris@241 382 [[1,0,3],[4,5,6]];
Chris@161 383 ),
Chris@161 384
Chris@161 385 "asColumns-\(name)": \(
Chris@161 386 compare
Chris@218 387 (map vec.list
Chris@241 388 (mat.asColumns (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]])))
Chris@241 389 [[1,4],[0,5],[3,6]];
Chris@161 390 ),
Chris@161 391
Chris@178 392 "concat-horiz-\(name)": \(
Chris@177 393 compareMatrices
Chris@177 394 (mat.concat (Horizontal ())
Chris@241 395 [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
Chris@177 396 (newMatrix (RowMajor ()) [[3],[6]])])
Chris@241 397 (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]])
Chris@177 398 ),
Chris@177 399
Chris@259 400 "sparseConcat-horiz-\(name)": \(
Chris@259 401 s = mat.concat (Horizontal ())
Chris@259 402 [mat.toSparse (newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
Chris@259 403 mat.toSparse (newMatrix (RowMajor ()) [[3],[6]])];
Chris@259 404 compareMatrices s (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]]) and
Chris@259 405 compare (mat.isSparse? s) true and
Chris@259 406 compare (mat.density s) (5/6)
Chris@259 407 ),
Chris@259 408
Chris@178 409 "concatFail-horiz-\(name)": \(
Chris@178 410 try
Chris@178 411 \() (mat.concat (Horizontal ())
Chris@241 412 [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
Chris@178 413 (newMatrix (ColumnMajor ()) [[3],[6]])]);
Chris@178 414 false
Chris@178 415 catch FailureException e:
Chris@178 416 true
Chris@178 417 yrt
Chris@178 418 ),
Chris@178 419
Chris@178 420 "concat-vert-\(name)": \(
Chris@178 421 compareMatrices
Chris@178 422 (mat.concat (Vertical ())
Chris@241 423 [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
Chris@178 424 (newMatrix (RowMajor ()) [[3,6]])])
Chris@241 425 (newMatrix (ColumnMajor ()) [[1,4,3],[0,5,6]])
Chris@178 426 ),
Chris@178 427
Chris@259 428 "sparseConcat-vert-\(name)": \(
Chris@259 429 s = mat.concat (Vertical ())
Chris@259 430 [mat.toSparse (newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
Chris@259 431 mat.toSparse (newMatrix (RowMajor ()) [[3,6]])];
Chris@259 432 compareMatrices s (newMatrix (ColumnMajor ()) [[1,4,3],[0,5,6]]) and
Chris@259 433 compare (mat.isSparse? s) true and
Chris@259 434 compare (mat.density s) (5/6)
Chris@259 435 ),
Chris@259 436
Chris@178 437 "concatFail-vert-\(name)": \(
Chris@178 438 try
Chris@178 439 \() (mat.concat (Vertical ())
Chris@241 440 [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]),
Chris@178 441 (newMatrix (RowMajor ()) [[3],[6]])]);
Chris@178 442 false
Chris@178 443 catch FailureException e:
Chris@178 444 true
Chris@178 445 yrt
Chris@178 446 ),
Chris@178 447
Chris@187 448 "rowSlice-\(name)": \(
Chris@187 449 compareMatrices
Chris@260 450 (mat.rowSlice (newMatrix (RowMajor ()) [[1,0],[3,4],[0,6],[7,8]]) 1 3)
Chris@277 451 (newMatrix (RowMajor ()) [[3,4],[0,6]]) and
Chris@277 452 compareMatrices
Chris@277 453 (mat.rowSlice (newMatrix (RowMajor ()) [[1,0],[3,4],[0,6],[7,8]]) 3 6)
Chris@277 454 (newMatrix (RowMajor ()) [[7,8]])
Chris@187 455 ),
Chris@187 456
Chris@187 457 "columnSlice-\(name)": \(
Chris@187 458 compareMatrices
Chris@260 459 (mat.columnSlice (newMatrix (RowMajor ()) [[1,0,3,4],[0,6,7,8]]) 1 3)
Chris@277 460 (newMatrix (RowMajor ()) [[0,3],[6,7]]) and
Chris@277 461 compareMatrices
Chris@277 462 (mat.columnSlice (newMatrix (RowMajor ()) [[1,0,3,4],[0,6,7,8]]) 2 5)
Chris@277 463 (newMatrix (RowMajor ()) [[3,4],[7,8]])
Chris@187 464 ),
Chris@187 465
Chris@247 466 "density-\(name)": \(
Chris@247 467 compare (mat.density (newMatrix (ColumnMajor ()) [[1,2,0],[0,5,0]])) (3/6) and
Chris@247 468 compare (mat.density (newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]])) (6/6) and
Chris@247 469 compare (mat.density (newMatrix (ColumnMajor ()) [[0,0,0],[0,0,0]])) 0
Chris@242 470 ),
Chris@242 471
Chris@249 472 "nonZeroValues-\(name)": \(
Chris@249 473 compare (mat.nonZeroValues (newMatrix (ColumnMajor ()) [[1,2,0],[0,5,0]])) 3 and
Chris@249 474 compare (mat.nonZeroValues (newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]])) 6 and
Chris@249 475 compare (mat.nonZeroValues (newMatrix (ColumnMajor ()) [[0,0,0],[0,0,0]])) 0
Chris@249 476 ),
Chris@249 477
Chris@243 478 "toSparse-\(name)": \(
Chris@243 479 m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]];
Chris@243 480 compareMatrices (mat.toSparse m) m and
Chris@243 481 compareMatrices (mat.toDense (mat.toSparse m)) m and
Chris@247 482 compare (mat.density (mat.toSparse m)) (6/9)
Chris@243 483 ),
Chris@243 484
Chris@243 485 "toDense-\(name)": \(
Chris@243 486 m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]];
Chris@243 487 compareMatrices (mat.toDense m) m and
Chris@243 488 compareMatrices (mat.toSparse (mat.toDense m)) m
Chris@243 489 ),
Chris@243 490
Chris@258 491 "filter-\(name)": \(
Chris@243 492 m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]];
Chris@243 493 compareMatrices
Chris@258 494 (mat.filter (> 2) m)
Chris@258 495 (newMatrix (ColumnMajor ()) [[0,0,0],[0,0,6],[0,0,3]]) and
Chris@258 496 compare (mat.density (mat.filter (> 2) m)) (2/9)
Chris@243 497 ),
Chris@243 498
Chris@255 499 "newSparseMatrix-\(name)": \(
Chris@255 500 s = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
Chris@255 501 { i = 0, j = 0, v = 1 },
Chris@255 502 { i = 0, j = 2, v = 2 },
Chris@255 503 { i = 1, j = 1, v = 4 },
Chris@255 504 ];
Chris@255 505 // If there are zeros in the entries list, they should not end up
Chris@255 506 // in the sparse data
Chris@255 507 t = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
Chris@255 508 { i = 0, j = 0, v = 1 },
Chris@255 509 { i = 0, j = 2, v = 0 },
Chris@255 510 { i = 1, j = 1, v = 4 },
Chris@255 511 ];
Chris@261 512 // Any out-of-range or non-integer i, j should be ignored too
Chris@261 513 u = mat.newSparseMatrix (ColumnMajor ()) { rows = 2, columns = 3 } [
Chris@261 514 { i = -1, j = 0, v = 1 },
Chris@261 515 { i = 0, j = 4, v = 3 },
Chris@261 516 { i = 1, j = 1.5, v = 4 },
Chris@261 517 ];
Chris@255 518 compare (mat.density s) (3/6) and
Chris@255 519 compare (mat.density t) (2/6) and
Chris@255 520 compareMatrices s (newMatrix (RowMajor ()) [[1,0,2],[0,4,0]]) and
Chris@261 521 compareMatrices t (newMatrix (RowMajor ()) [[1,0,0],[0,4,0]]) and
Chris@261 522 compareMatrices u (newMatrix (RowMajor ()) [[0,0,0],[0,0,0]])
Chris@255 523 ),
Chris@255 524
Chris@255 525 "enumerate-\(name)": \(
Chris@255 526 m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]];
Chris@255 527 all = [
Chris@255 528 { i = 0, j = 0, v = 1 },
Chris@255 529 { i = 1, j = 0, v = 2 },
Chris@255 530 { i = 2, j = 0, v = 0 },
Chris@255 531 { i = 0, j = 1, v = -1 },
Chris@255 532 { i = 1, j = 1, v = -4 },
Chris@255 533 { i = 2, j = 1, v = 6 },
Chris@255 534 { i = 0, j = 2, v = 0 },
Chris@255 535 { i = 1, j = 2, v = 0 },
Chris@255 536 { i = 2, j = 2, v = 3 },
Chris@255 537 ];
Chris@255 538 sortEntries =
Chris@255 539 sortBy do a b:
Chris@255 540 if a.i == b.i then a.j < b.j else a.i < b.i fi
Chris@255 541 done;
Chris@255 542 compare
Chris@255 543 (sortEntries (mat.enumerate m))
Chris@255 544 (sortEntries
Chris@255 545 (if mat.isSparse? m then filter do d: d.v != 0 done all else all fi));
Chris@255 546 ),
Chris@255 547
Chris@99 548 ]);
Chris@99 549
Chris@238 550 colhash = makeTests "column-dense" id;
Chris@238 551 rowhash = makeTests "row-dense" mat.flipped;
Chris@243 552 sparsecolhash = makeTests "column-sparse" mat.toSparse;
Chris@241 553
Chris@241 554 // there are two possible orders for constructing a sparse row-major
Chris@241 555 // matrix from a dense col-major one, so test them both:
Chris@243 556 sparserowhash1 = makeTests "row-sparse-a" (mat.toSparse . mat.flipped);
Chris@243 557 sparserowhash2 = makeTests "row-sparse-b" (mat.flipped . mat.toSparse);
Chris@99 558
Chris@99 559 all = [:];
Chris@241 560 for [ colhash, rowhash, sparsecolhash, sparserowhash1, sparserowhash2 ] do h:
Chris@238 561 for (keys h) do k: all[k] := h[k] done;
Chris@238 562 done;
Chris@99 563
Chris@99 564 all is hash<string, () -> boolean>;
Chris@99 565
Chris@99 566