Chris@97: Chris@97: module yetilab.matrix.test.test_matrix; Chris@97: Chris@97: mat = load yetilab.matrix.matrix; Chris@222: vec = load yetilab.vector.vector; Chris@97: Chris@222: load yetilab.vector.vectortype; Chris@220: load yetilab.matrix.matrixtype; Chris@220: Chris@98: import yeti.lang: FailureException; Chris@98: Chris@158: { compare, compareUsing } = load yetilab.test.test; Chris@97: Chris@158: compareMatrices = compareUsing mat.equal; Chris@99: Chris@99: makeTests name flipper = Chris@99: (constMatrix n s = flipper (mat.constMatrix n s); Chris@99: zeroMatrix s = flipper (mat.zeroMatrix s); Chris@99: randomMatrix s = flipper (mat.randomMatrix s); Chris@99: identityMatrix s = flipper (mat.identityMatrix s); Chris@99: generate f s = flipper (mat.generate f s); Chris@218: newMatrix t d = flipper (mat.newMatrix t (map vec.fromList d)); Chris@97: [ Chris@97: Chris@99: "constMatrixEmpty-\(name)": \( Chris@99: m = constMatrix 2 { rows = 0, columns = 0 }; Chris@210: compare (mat.size m) { columns = 0, rows = 0 } Chris@97: ), Chris@97: Chris@99: "constMatrixEmpty2-\(name)": \( Chris@210: compare (mat.size (constMatrix 2 { rows = 0, columns = 4 })) { columns = 0, rows = 0 } and Chris@210: compare (mat.size (constMatrix 2 { rows = 4, columns = 0 })) { columns = 0, rows = 0 } Chris@97: ), Chris@97: Chris@99: "constMatrix-\(name)": \( Chris@99: m = constMatrix 2 { rows = 3, columns = 4 }; Chris@210: compare (mat.size m) { columns = 4, rows = 3 } and Chris@218: all id (map do row: compare (vec.list (mat.getRow row m)) [2,2,2,2] done [0..2]) and Chris@218: all id (map do col: compare (vec.list (mat.getColumn col m)) [2,2,2] done [0..3]) Chris@97: ), Chris@97: Chris@99: "randomMatrixEmpty-\(name)": \( Chris@99: m = randomMatrix { rows = 0, columns = 0 }; Chris@210: compare (mat.size m) { columns = 0, rows = 0 } Chris@97: ), Chris@97: Chris@99: "randomMatrix-\(name)": \( Chris@99: m = randomMatrix { rows = 3, columns = 4 }; Chris@210: compare (mat.size m) { columns = 4, rows = 3 } Chris@97: ), Chris@97: Chris@99: "zeroMatrixEmpty-\(name)": \( Chris@99: m = zeroMatrix { rows = 0, columns = 0 }; Chris@210: compare (mat.size m) { columns = 0, rows = 0 } Chris@97: ), Chris@97: Chris@99: "zeroMatrix-\(name)": \( Chris@99: m = zeroMatrix { rows = 3, columns = 4 }; Chris@210: compare (mat.size m) { columns = 4, rows = 3 } and Chris@218: all id (map do row: compare (vec.list (mat.getRow row m)) [0,0,0,0] done [0..2]) and Chris@218: all id (map do col: compare (vec.list (mat.getColumn col m)) [0,0,0] done [0..3]) Chris@97: ), Chris@97: Chris@99: "identityMatrixEmpty-\(name)": \( Chris@99: m = identityMatrix { rows = 0, columns = 0 }; Chris@210: compare (mat.size m) { columns = 0, rows = 0 } Chris@97: ), Chris@97: Chris@99: "identityMatrix-\(name)": \( Chris@99: m = identityMatrix { rows = 3, columns = 4 }; Chris@210: compare (mat.size m) { columns = 4, rows = 3 } and Chris@218: all id (map do row: compare (vec.list (mat.getRow row m)) [1,1,1,1] done [0..2]) and Chris@218: all id (map do col: compare (vec.list (mat.getColumn col m)) [1,1,1] done [0..3]) Chris@97: ), Chris@97: Chris@99: "generateEmpty-\(name)": \( Chris@99: m = generate do row col: 0 done { rows = 0, columns = 0 }; Chris@210: compare (mat.size m) { columns = 0, rows = 0 } Chris@97: ), Chris@97: Chris@99: "generate-\(name)": \( Chris@99: m = generate do row col: row * 10 + col done { rows = 2, columns = 3 }; Chris@218: compare (vec.list (mat.getRow 0 m)) [0,1,2] and Chris@218: compare (vec.list (mat.getRow 1 m)) [10,11,12] Chris@97: ), Chris@97: Chris@99: "widthAndHeight-\(name)": \( Chris@99: m = constMatrix 2 { rows = 3, columns = 4 }; Chris@210: compare (mat.size m) { columns = mat.width m, rows = mat.height m } Chris@97: ), Chris@97: Chris@99: "equal-\(name)": \( Chris@241: m = newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]]; Chris@100: n = m; Chris@241: p = newMatrix (RowMajor ()) [[1,0,3],[4,5,6]]; Chris@241: q = newMatrix (ColumnMajor ()) [[1,0,3],[4,5,6]]; Chris@241: r = newMatrix (ColumnMajor ()) [[1,4],[0,5]]; Chris@100: compareMatrices m n and Chris@100: compareMatrices m p and Chris@100: compareMatrices n p and Chris@159: not mat.equal m q and Chris@159: not mat.equal m r Chris@97: ), Chris@97: Chris@229: "equalUnder-\(name)": \( Chris@229: p = newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]]; Chris@229: q = newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]]; Chris@229: r = newMatrix (ColumnMajor ()) [[4,3,1],[3,1,2]]; Chris@241: s = newMatrix (ColumnMajor ()) [[1,4,5],[6,7,8]]; Chris@241: t = newMatrix (ColumnMajor ()) [[1,4,5],[6,7,9]]; Chris@229: mat.equalUnder (==) p p and Chris@229: mat.equalUnder (==) p q and Chris@229: mat.equalUnder (!=) p r and Chris@229: mat.equalUnder do a b: a % 2 == b % 2 done p s and Chris@229: not mat.equalUnder do a b: a % 2 == b % 2 done p t Chris@229: ), Chris@229: Chris@99: "getAt-\(name)": \( Chris@97: generator row col = row * 10 + col; Chris@99: m = generate generator { rows = 2, columns = 3 }; Chris@97: all id Chris@97: (map do row: all id Chris@210: (map do col: mat.getAt row col m == generator row col done [0..2]) Chris@97: done [0..1]) Chris@97: ), Chris@97: Chris@99: "transposedEmpty-\(name)": \( Chris@210: compare (mat.size (mat.transposed (constMatrix 2 { rows = 0, columns = 0 }))) { columns = 0, rows = 0 } and Chris@210: compare (mat.size (mat.transposed (constMatrix 2 { rows = 0, columns = 4 }))) { columns = 0, rows = 0 } and Chris@210: compare (mat.size (mat.transposed (constMatrix 2 { rows = 4, columns = 0 }))) { columns = 0, rows = 0 } Chris@97: ), Chris@97: Chris@99: "transposedSize-\(name)": \( Chris@210: compare (mat.size (mat.transposed (constMatrix 2 { rows = 3, columns = 4 }))) { columns = 3, rows = 4 } Chris@97: ), Chris@97: Chris@99: "transposed-\(name)": \( Chris@97: generator row col = row * 10 + col; Chris@99: m = generate generator { rows = 2, columns = 3 }; Chris@97: m' = mat.transposed m; Chris@97: all id Chris@97: (map do row: all id Chris@97: // like getAt test, but with col/row flipped Chris@210: (map do col: mat.getAt col row m' == generator row col done [0..2]) Chris@97: done [0..1]) Chris@97: ), Chris@97: Chris@100: "transposed-back-\(name)": \( Chris@100: m = newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]; Chris@100: compareMatrices m (mat.transposed (mat.transposed m)) and Chris@100: not mat.equal m (mat.transposed m); Chris@100: ), Chris@100: Chris@100: "flipped-\(name)": \( Chris@241: m = newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]]; Chris@99: m' = mat.flipped m; Chris@241: m'' = newMatrix (RowMajor ()) [[1,0,3],[4,5,6]]; Chris@100: compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m''; Chris@98: ), Chris@98: Chris@100: "flipped-back-\(name)": \( Chris@241: m = newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]]; Chris@100: compareMatrices m (mat.flipped (mat.flipped m)); Chris@100: ), Chris@100: Chris@100: "flipped-empty-\(name)": \( Chris@99: m = constMatrix 2 { rows = 0, columns = 4 }; Chris@99: compareMatrices (mat.flipped m) (mat.flipped (constMatrix 0 { rows = 0, columns = 0 })); Chris@98: ), Chris@98: Chris@161: "toRowMajor-\(name)": \( Chris@241: m = newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]]; Chris@161: m' = mat.toRowMajor m; Chris@241: m'' = newMatrix (RowMajor ()) [[1,0,3],[4,5,6]]; Chris@161: m''' = mat.toRowMajor m''; Chris@161: compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m'' Chris@161: and compareMatrices m m'''; Chris@161: ), Chris@161: Chris@161: "toColumnMajor-\(name)": \( Chris@241: m = newMatrix (RowMajor ()) [[1,4],[0,5],[3,6]]; Chris@161: m' = mat.toColumnMajor m; Chris@241: m'' = newMatrix (ColumnMajor ()) [[1,0,3],[4,5,6]]; Chris@161: m''' = mat.toColumnMajor m''; Chris@161: compareMatrices m m' and compareMatrices m m'' and compareMatrices m' m'' Chris@161: and compareMatrices m m'''; Chris@161: ), Chris@161: Chris@99: "scaled-\(name)": \( Chris@99: compareMatrices Chris@99: (mat.scaled 0.5 (constMatrix 2 { rows = 3, columns = 4 })) Chris@99: (constMatrix 1 { rows = 3, columns = 4 }) and Chris@99: compareMatrices Chris@99: (mat.scaled 0.5 (constMatrix (-3) { rows = 3, columns = 4 })) Chris@99: (constMatrix (-1.5) { rows = 3, columns = 4 }) and Chris@99: compareMatrices Chris@99: (mat.scaled 0.5 (constMatrix 2 { rows = 0, columns = 2 })) Chris@99: (constMatrix 5 { rows = 0, columns = 0 }) Chris@99: ), Chris@99: Chris@99: "sum-\(name)": \( Chris@99: compareMatrices Chris@99: (mat.sum (constMatrix 2 { rows = 3, columns = 4 }) Chris@99: (constMatrix 1 { rows = 3, columns = 4 })) Chris@99: (constMatrix 3 { rows = 3, columns = 4 }) Chris@99: ), Chris@99: Chris@99: "sumFail-\(name)": \( Chris@98: try Chris@99: \() (mat.sum (constMatrix 2 { rows = 3, columns = 4 }) Chris@99: (constMatrix 1 { rows = 3, columns = 5 })); Chris@98: false; Chris@98: catch FailureException e: Chris@98: true Chris@98: yrt Chris@98: ), Chris@98: Chris@229: "difference-\(name)": \( Chris@229: compareMatrices Chris@229: (mat.difference (constMatrix 2 { rows = 3, columns = 4 }) Chris@229: (constMatrix 1 { rows = 3, columns = 4 })) Chris@229: (constMatrix 1 { rows = 3, columns = 4 }) Chris@229: ), Chris@229: Chris@229: "differenceFail-\(name)": \( Chris@229: try Chris@229: \() (mat.difference (constMatrix 2 { rows = 3, columns = 4 }) Chris@229: (constMatrix 1 { rows = 3, columns = 5 })); Chris@229: false; Chris@229: catch FailureException e: Chris@229: true Chris@229: yrt Chris@229: ), Chris@229: Chris@229: "abs-\(name)": \( Chris@229: compareMatrices Chris@229: (mat.abs (newMatrix (ColumnMajor ()) [[-1,4],[2,-5],[-3,0]])) Chris@229: (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,0]]) Chris@229: ), Chris@229: Chris@99: "product-\(name)": \( Chris@99: compareMatrices Chris@99: (mat.product (constMatrix 2 { rows = 4, columns = 2 }) Chris@99: (constMatrix 3 { rows = 2, columns = 3 })) Chris@99: (constMatrix 12 { rows = 4, columns = 3 }) and Chris@99: compareMatrices Chris@99: (mat.product (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]]) Chris@99: (newMatrix (ColumnMajor ()) [[7,9,11],[8,10,12]])) Chris@99: (newMatrix (ColumnMajor ()) [[58,139],[64,154]]) Chris@98: ), Chris@98: Chris@99: "productFail-\(name)": \( Chris@99: try Chris@99: \() (mat.product (constMatrix 2 { rows = 4, columns = 2 }) Chris@99: (constMatrix 3 { rows = 3, columns = 2 })); Chris@99: false; Chris@99: catch FailureException e: Chris@99: true Chris@99: yrt Chris@99: ), Chris@97: Chris@158: "resizedTo-\(name)": \( Chris@158: compareMatrices Chris@158: (mat.resizedTo { rows = 2, columns = 2 } Chris@158: (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])) Chris@159: (newMatrix (ColumnMajor ()) [[1,4],[2,5]]) and Chris@158: compareMatrices Chris@158: (mat.resizedTo { rows = 3, columns = 4 } Chris@158: (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])) Chris@158: (newMatrix (ColumnMajor ()) [[1,4,0],[2,5,0],[3,6,0],[0,0,0]]) and Chris@158: compareMatrices Chris@158: (mat.resizedTo { rows = 1, columns = 1 } Chris@158: (newMatrix (ColumnMajor ()) [[1,4],[2,5],[3,6]])) Chris@202: (newMatrix (RowMajor ()) [[1]]) and Chris@202: compareMatrices Chris@202: (mat.resizedTo { rows = 2, columns = 3 } Chris@202: (mat.zeroSizeMatrix ())) Chris@202: (newMatrix (RowMajor ()) [[0,0,0],[0,0,0]]) Chris@158: ), Chris@158: Chris@158: "zeroSizeMatrix-\(name)": \( Chris@158: compareMatrices Chris@158: (mat.zeroSizeMatrix ()) Chris@158: (newMatrix (ColumnMajor ()) []) Chris@158: ), Chris@158: Chris@161: "asRows-\(name)": \( Chris@161: compare Chris@218: (map vec.list Chris@241: (mat.asRows (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]]))) Chris@241: [[1,0,3],[4,5,6]]; Chris@161: ), Chris@161: Chris@161: "asColumns-\(name)": \( Chris@161: compare Chris@218: (map vec.list Chris@241: (mat.asColumns (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]]))) Chris@241: [[1,4],[0,5],[3,6]]; Chris@161: ), Chris@161: Chris@178: "concat-horiz-\(name)": \( Chris@177: compareMatrices Chris@177: (mat.concat (Horizontal ()) Chris@241: [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]), Chris@177: (newMatrix (RowMajor ()) [[3],[6]])]) Chris@241: (newMatrix (ColumnMajor ()) [[1,4],[0,5],[3,6]]) Chris@177: ), Chris@177: Chris@178: "concatFail-horiz-\(name)": \( Chris@178: try Chris@178: \() (mat.concat (Horizontal ()) Chris@241: [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]), Chris@178: (newMatrix (ColumnMajor ()) [[3],[6]])]); Chris@178: false Chris@178: catch FailureException e: Chris@178: true Chris@178: yrt Chris@178: ), Chris@178: Chris@178: "concat-vert-\(name)": \( Chris@178: compareMatrices Chris@178: (mat.concat (Vertical ()) Chris@241: [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]), Chris@178: (newMatrix (RowMajor ()) [[3,6]])]) Chris@241: (newMatrix (ColumnMajor ()) [[1,4,3],[0,5,6]]) Chris@178: ), Chris@178: Chris@178: "concatFail-vert-\(name)": \( Chris@178: try Chris@178: \() (mat.concat (Vertical ()) Chris@241: [(newMatrix (ColumnMajor ()) [[1,4],[0,5]]), Chris@178: (newMatrix (RowMajor ()) [[3],[6]])]); Chris@178: false Chris@178: catch FailureException e: Chris@178: true Chris@178: yrt Chris@178: ), Chris@178: Chris@187: "rowSlice-\(name)": \( Chris@187: compareMatrices Chris@241: (mat.rowSlice 1 2 (newMatrix (RowMajor ()) [[1,0],[3,4],[0,6],[7,8]])) Chris@241: (newMatrix (RowMajor ()) [[3,4],[0,6]]) Chris@187: ), Chris@187: Chris@187: "columnSlice-\(name)": \( Chris@187: compareMatrices Chris@241: (mat.columnSlice 1 2 (newMatrix (RowMajor ()) [[1,0,3,4],[0,6,7,8]])) Chris@241: (newMatrix (RowMajor ()) [[0,3],[6,7]]) Chris@187: ), Chris@187: Chris@247: "density-\(name)": \( Chris@247: compare (mat.density (newMatrix (ColumnMajor ()) [[1,2,0],[0,5,0]])) (3/6) and Chris@247: compare (mat.density (newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]])) (6/6) and Chris@247: compare (mat.density (newMatrix (ColumnMajor ()) [[0,0,0],[0,0,0]])) 0 Chris@242: ), Chris@242: Chris@243: "toSparse-\(name)": \( Chris@243: m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]]; Chris@243: compareMatrices (mat.toSparse m) m and Chris@243: compareMatrices (mat.toDense (mat.toSparse m)) m and Chris@247: compare (mat.density (mat.toSparse m)) (6/9) Chris@243: ), Chris@243: Chris@243: "toDense-\(name)": \( Chris@243: m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]]; Chris@243: compareMatrices (mat.toDense m) m and Chris@243: compareMatrices (mat.toSparse (mat.toDense m)) m Chris@243: ), Chris@243: Chris@243: "thresholded-\(name)": \( Chris@243: m = newMatrix (ColumnMajor ()) [[1,2,0],[-1,-4,6],[0,0,3]]; Chris@243: compareMatrices Chris@243: (mat.thresholded 2 m) Chris@243: (newMatrix (ColumnMajor ()) [[0,0,0],[0,-4,6],[0,0,3]]) and Chris@247: compare (mat.density (mat.thresholded 2 m)) (3/9) Chris@243: ), Chris@243: Chris@99: ]); Chris@99: Chris@238: colhash = makeTests "column-dense" id; Chris@238: rowhash = makeTests "row-dense" mat.flipped; Chris@243: sparsecolhash = makeTests "column-sparse" mat.toSparse; Chris@241: Chris@241: // there are two possible orders for constructing a sparse row-major Chris@241: // matrix from a dense col-major one, so test them both: Chris@243: sparserowhash1 = makeTests "row-sparse-a" (mat.toSparse . mat.flipped); Chris@243: sparserowhash2 = makeTests "row-sparse-b" (mat.flipped . mat.toSparse); Chris@99: Chris@99: all = [:]; Chris@241: for [ colhash, rowhash, sparsecolhash, sparserowhash1, sparserowhash2 ] do h: Chris@238: for (keys h) do k: all[k] := h[k] done; Chris@238: done; Chris@99: Chris@99: all is hash boolean>; Chris@99: Chris@99: