changeset 242:0ac8672d12b2 sparse

Add and test sparsity
author Chris Cannam
date Mon, 20 May 2013 16:22:17 +0100
parents e777a713027b
children 1313764cb89c
files yetilab/matrix/matrix.yeti yetilab/matrix/test/test_matrix.yeti
diffstat 2 files changed, 23 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/yetilab/matrix/matrix.yeti	Mon May 20 16:01:43 2013 +0100
+++ b/yetilab/matrix/matrix.yeti	Mon May 20 16:22:17 2013 +0100
@@ -46,6 +46,21 @@
 width m = (size m).columns;
 height m = (size m).rows;
 
+sparsity m =
+   ({ rows, columns } = size m;
+    cells = rows * columns;
+    nonZeroCells d =
+        sum
+           (map do v:
+                sum (map do n: if n == 0 then 0 else 1 fi done (vec.list v))
+                done d);
+    case m of 
+    DenseRows d: (nonZeroCells d) / cells;
+    DenseCols d: (nonZeroCells d) / cells;
+    SparseCSR d: (vec.length d.values) / cells;
+    SparseCSC d: (vec.length d.values) / cells;
+    esac);
+
 sparseSlice n d =
    (start = d.pointers[n];
     end = d.pointers[n+1];
@@ -444,6 +459,7 @@
     size,
     width,
     height,
+    sparsity,
     getAt,
     getColumn,
     getRow,
@@ -485,6 +501,7 @@
     size is matrix -> { .rows is number, .columns is number },
     width is matrix -> number,
     height is matrix -> number,
+    sparsity is matrix -> number,
     getAt is number -> number -> matrix -> number,
     getColumn is number -> matrix -> vector,
     getRow is number -> matrix -> vector,
--- a/yetilab/matrix/test/test_matrix.yeti	Mon May 20 16:01:43 2013 +0100
+++ b/yetilab/matrix/test/test_matrix.yeti	Mon May 20 16:22:17 2013 +0100
@@ -348,6 +348,12 @@
        (newMatrix (RowMajor ()) [[0,3],[6,7]])
 ),
 
+"sparsity-\(name)": \(
+    compare (mat.sparsity (newMatrix (ColumnMajor ()) [[1,2,0],[0,5,0]])) (3/6) and
+        compare (mat.sparsity (newMatrix (ColumnMajor ()) [[1,2,3],[4,5,6]])) (6/6) and
+        compare (mat.sparsity (newMatrix (ColumnMajor ()) [[0,0,0],[0,0,0]])) 0
+),
+
 ]);
 
 colhash = makeTests "column-dense" id;