annotate yetilab/matrix/test/speedtest.yeti @ 249:1ea5bf6e76b6 sparse

A reasonable sparse multiply, and a bit quicker dense one
author Chris Cannam
date Mon, 20 May 2013 22:17:19 +0100
parents 586d46f64902
children 9fe3192cce38
rev   line source
Chris@248 1
Chris@248 2 program yetilab.matrix.test.speedtest;
Chris@248 3
Chris@248 4 mat = load yetilab.matrix.matrix;
Chris@248 5 vec = load yetilab.vector.vector;
Chris@248 6
Chris@249 7 { compare, compareUsing } = load yetilab.test.test;
Chris@249 8
Chris@249 9 compareMatrices = compareUsing mat.equal;
Chris@249 10
Chris@248 11 time f =
Chris@248 12 (start = System#currentTimeMillis();
Chris@248 13 result = f ();
Chris@248 14 end = System#currentTimeMillis();
Chris@248 15 println " \(end-start)ms";
Chris@248 16 result);
Chris@248 17
Chris@248 18 makeMatrices sz sparsity =
Chris@248 19 (print "Making \(sz) * \(sz) random matrix...";
Chris@248 20 m = time \(mat.randomMatrix { rows = sz, columns = sz });
Chris@248 21 makeSparse () =
Chris@248 22 (print "Making \(sparsity * 100)% sparse version (as dense matrix)...";
Chris@248 23 t = time \(mat.thresholded sparsity m);
Chris@249 24 println "Reported density: \(mat.density t) (non-zero values: \(mat.nonZeroValues t))";
Chris@248 25 print "Converting to sparse matrix...";
Chris@248 26 s = time \(mat.toSparse t);
Chris@249 27 println "Reported density: \(mat.density s) (non-zero values: \(mat.nonZeroValues s))";
Chris@248 28 s);
Chris@248 29 s = makeSparse ();
Chris@248 30 println "Making types:";
Chris@248 31 print "Col-major dense...";
Chris@248 32 cmd = time \(mat.toColumnMajor m);
Chris@248 33 print "Row-major dense...";
Chris@248 34 rmd = time \(mat.toRowMajor m);
Chris@248 35 print "Col-major sparse...";
Chris@248 36 cms = time \(mat.toColumnMajor s);
Chris@248 37 print "Row-major sparse...";
Chris@248 38 rms = time \(mat.toRowMajor s);
Chris@248 39 println "";
Chris@248 40 { cmd, rmd, cms, rms });
Chris@248 41
Chris@248 42 println "\nR * M multiplies:\n";
Chris@248 43
Chris@248 44 sz = 2000;
Chris@249 45 sparsity = 0.98;
Chris@248 46
Chris@249 47 { cmd, rmd, cms, rms } = makeMatrices sz sparsity;
Chris@248 48
Chris@248 49 row = mat.newRowVector (vec.fromList (map \(Math#random()) [1..sz]));
Chris@248 50 col = mat.newColumnVector (vec.fromList (map \(Math#random()) [1..sz]));
Chris@248 51
Chris@248 52 print "R * CMD... ";
Chris@249 53 a = (time \(mat.product row cmd));
Chris@248 54
Chris@248 55 print "R * RMD... ";
Chris@249 56 b = (time \(mat.product row rmd));
Chris@248 57
Chris@248 58 print "R * CMS... ";
Chris@249 59 c = (time \(mat.product row cms));
Chris@248 60
Chris@248 61 print "R * RMS... ";
Chris@249 62 d = (time \(mat.product row rms));
Chris@249 63
Chris@249 64 println "\nChecking results: \(compareMatrices a b) \(compareMatrices c d)";
Chris@248 65
Chris@248 66 println "\nM * C multiplies:\n";
Chris@248 67
Chris@248 68 print "CMD * C... ";
Chris@249 69 a = (time \(mat.product cmd col));
Chris@248 70
Chris@248 71 print "RMD * C... ";
Chris@249 72 b = (time \(mat.product rmd col));
Chris@248 73
Chris@248 74 print "CMS * C... ";
Chris@249 75 c = (time \(mat.product cms col));
Chris@248 76
Chris@248 77 print "RMS * C... ";
Chris@249 78 d = (time \(mat.product rms col));
Chris@248 79
Chris@249 80 println "\nChecking results: \(compareMatrices a b) \(compareMatrices c d)";
Chris@248 81
Chris@248 82 println "\nM * M multiplies:\n";
Chris@248 83
Chris@248 84 sz = 500;
Chris@248 85
Chris@249 86 { cmd, rmd, cms, rms } = makeMatrices sz sparsity;
Chris@248 87
Chris@248 88 print "CMS * CMD... ";
Chris@248 89 \() (time \(mat.product cms cmd));
Chris@248 90
Chris@248 91 print "CMS * RMD... ";
Chris@248 92 \() (time \(mat.product cms rmd));
Chris@248 93
Chris@248 94 print "RMS * CMD... ";
Chris@248 95 \() (time \(mat.product rms cmd));
Chris@248 96
Chris@248 97 print "RMS * RMD... ";
Chris@248 98 \() (time \(mat.product rms rmd));
Chris@248 99
Chris@248 100 println "";
Chris@248 101
Chris@248 102 print "CMD * CMS... ";
Chris@248 103 \() (time \(mat.product cmd cms));
Chris@248 104
Chris@248 105 print "CMD * RMS... ";
Chris@248 106 \() (time \(mat.product cmd rms));
Chris@248 107
Chris@248 108 print "RMD * CMS... ";
Chris@248 109 \() (time \(mat.product rmd cms));
Chris@248 110
Chris@248 111 print "RMD * RMS... ";
Chris@248 112 \() (time \(mat.product rmd rms));
Chris@248 113
Chris@248 114 println "";
Chris@248 115
Chris@248 116 print "CMS * CMS... ";
Chris@248 117 \() (time \(mat.product cms cms));
Chris@248 118
Chris@248 119 print "CMS * RMS... ";
Chris@248 120 \() (time \(mat.product cms rms));
Chris@248 121
Chris@248 122 print "RMS * CMS... ";
Chris@248 123 \() (time \(mat.product rms cms));
Chris@248 124
Chris@248 125 print "RMS * RMS... ";
Chris@248 126 \() (time \(mat.product rms rms));
Chris@248 127
Chris@249 128 println "";
Chris@249 129
Chris@249 130 print "CMD * CMD... ";
Chris@249 131 \() (time \(mat.product cmd cmd));
Chris@249 132
Chris@249 133 print "CMD * RMD... ";
Chris@249 134 \() (time \(mat.product cmd rmd));
Chris@249 135
Chris@249 136 print "RMD * CMD... ";
Chris@249 137 \() (time \(mat.product rmd cmd));
Chris@249 138
Chris@249 139 print "RMD * RMD... ";
Chris@249 140 \() (time \(mat.product rmd rmd));
Chris@249 141
Chris@248 142 ();