changeset 163:3fbaa25aad89

Make newMatrix/newRowVector/newColumnVector take block rather than list<number> args. Makes some uses simpler, some more complex, but most faster (sometimes by a lot).
author Chris Cannam
date Wed, 01 May 2013 21:42:03 +0100
parents 073641eba879
children 4bd7fb9542ff
files yetilab/block/block.yeti yetilab/block/fvector.yeti yetilab/matrix/matrix.yeti yetilab/matrix/test/test_matrix.yeti yetilab/stream/channels.yeti yetilab/stream/filter.yeti yetilab/stream/framer.yeti yetilab/stream/test/test_framer.yeti yetilab/vamp/test/test_vamp.yeti yetilab/vamp/vamppost.yeti
diffstat 10 files changed, 36 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/yetilab/block/block.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/block/block.yeti	Wed May 01 21:42:03 2013 +0100
@@ -17,6 +17,7 @@
     fromList l = vec.vector l,
     list = vec.list,
     length = vec.length,
+    empty? = vec.empty?,
     equal = vec.equal,
     copyOf = vec.copyOf,
     rangeOf = vec.rangeOf,
@@ -34,6 +35,7 @@
     fromList is list?<number> -> block,
     list is block -> list<number>,
     length is block -> number,
+    empty? is block -> boolean,
     equal is block -> block -> boolean,
     copyOf is block -> block,
     rangeOf is block -> number -> number -> block,
--- a/yetilab/block/fvector.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/block/fvector.yeti	Wed May 01 21:42:03 2013 +0100
@@ -29,6 +29,9 @@
 length' =
     length . list';
 
+empty?' =
+    empty? . list';
+
 floats a is ~double[] -> ~float[] =
    (len = length' a;
     f = new float[len];
@@ -72,6 +75,7 @@
 zeros, consts, ones,
 vector,
 length = length',
+empty? = empty?',
 list = list',
 floats, fromFloats,
 equal,
--- a/yetilab/matrix/matrix.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/matrix/matrix.yeti	Wed May 01 21:42:03 2013 +0100
@@ -125,18 +125,18 @@
         ColM d: ColM (copyOfData d);
         esac));
 
-newMatrix type data is RowMajor () | ColumnMajor () -> list?<list?<number>> -> 'a =
+newMatrix type data = //!!! NB does not copy data
    (tagger = case type of RowMajor (): RowM; ColumnMajor (): ColM esac;
-    if empty? data or empty? (head data)
+    if empty? data or block.empty? (head data)
     then zeroMatrix { rows = 0, columns = 0 }
-    else make (tagger (array (map vec.vector data)))
+    else make (tagger (array (map block.data data)))
     fi);
 
-newRowVector data = 
-    newMatrix (RowMajor ()) [data];
+newRowVector data = //!!! NB does not copy data
+    make (RowM (array [block.data data]));
 
-newColumnVector data = 
-    newMatrix (ColumnMajor ()) [data];
+newColumnVector data = //!!! NB does not copy data
+    make (ColM (array [block.data data]));
 
 scaled factor m =
     generate do row col: factor * m.getAt row col done m.size;
--- a/yetilab/matrix/test/test_matrix.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/matrix/test/test_matrix.yeti	Wed May 01 21:42:03 2013 +0100
@@ -16,7 +16,7 @@
     randomMatrix s = flipper (mat.randomMatrix s);
     identityMatrix s = flipper (mat.identityMatrix s);
     generate f s = flipper (mat.generate f s);
-    newMatrix t d = flipper (mat.newMatrix t d);
+    newMatrix t d = flipper (mat.newMatrix t (map block.fromList d));
 [
 
 "constMatrixEmpty-\(name)": \(
--- a/yetilab/stream/channels.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/stream/channels.yeti	Wed May 01 21:42:03 2013 +0100
@@ -15,11 +15,20 @@
     done;
     block.block v);
 
-deinterleaved channels b = //!!! should generate a RowMajor matrix for faster framing
-   (v = block.data b;
-    mat.generate do row col:
-        v[channels * col + row]
-    done { rows = channels, columns = ((vec.length v) / channels) });
+deinterleaved channels b =
+    if channels == 1 then
+        mat.newRowVector b
+    else
+        rows = (block.length b) / channels;
+        vv = array (map \(vec.zeros rows) [0..channels-1]);
+        v = block.data b;
+        for [0..rows-1] do row:
+            for [0..channels-1] do col:
+                vv[col][row] := v[channels * row + col];
+            done
+        done;
+        mat.newMatrix (RowMajor ()) (map block.block vv);
+    fi;
 
 mixedDown m =
    ({ columns, rows } = m.size;
--- a/yetilab/stream/filter.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/stream/filter.yeti	Wed May 01 21:42:03 2013 +0100
@@ -25,8 +25,8 @@
 
 {
     truncatedTo, 
-} as {
-    truncatedTo is number -> stream -> stream
+//!!!} as {
+//    truncatedTo is number -> stream -> stream
 }
 
 
--- a/yetilab/stream/framer.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/stream/framer.yeti	Wed May 01 21:42:03 2013 +0100
@@ -45,7 +45,7 @@
         stream.close ();
         [];
     else
-        mat.newMatrix (RowMajor ()) (map block.list buffer)
+        mat.newMatrix (RowMajor ()) buffer
             :. \(overlappingBlockList size hop stream remaining buffer);
     fi);
 
--- a/yetilab/stream/test/test_framer.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/stream/test/test_framer.yeti	Wed May 01 21:42:03 2013 +0100
@@ -9,7 +9,7 @@
 
 compareFrames frames1 frames2 =
     all id (map2 do f1 f2: compareUsing mat.equal f1 f2 done frames1
-       (map mat.newRowVector frames2));
+       (map (mat.newRowVector . block.fromList) frames2));
 
 [
 
--- a/yetilab/vamp/test/test_vamp.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/vamp/test/test_vamp.yeti	Wed May 01 21:42:03 2013 +0100
@@ -4,6 +4,7 @@
 synthetic = load yetilab.stream.syntheticstream;
 filter = load yetilab.stream.filter;
 mat = load yetilab.matrix.matrix;
+block = load yetilab.block.block;
 
 { compare, compareUsing } = load yetilab.test.test;
 
@@ -91,7 +92,7 @@
         compareUsing mat.equal g 
            (mat.newMatrix (ColumnMajor ())
                (map do x:
-                    floats (map do y:
+                   (block.fromList . floats) (map do y:
                         (x + y + 2) / 30
                         done [0..9])
                     done [0..19]));
@@ -105,7 +106,7 @@
         compareUsing mat.equal g 
            (mat.newMatrix (ColumnMajor ())
                (map do x:
-                    floats (map do y:
+                   (block.fromList . floats) (map do y:
                         (x + y + 2) / 20
                         done [0..9])
                     done [0..19]));
--- a/yetilab/vamp/vamppost.yeti	Wed May 01 16:20:07 2013 +0100
+++ b/yetilab/vamp/vamppost.yeti	Wed May 01 21:42:03 2013 +0100
@@ -58,8 +58,7 @@
     if empty? features then
         mat.zeroMatrix { rows = binCount, columns = 0 };
     else
-        mat.newMatrix (ColumnMajor ())
-           (map do f: list (bl.data f.values) done features);
+        mat.newMatrix (ColumnMajor ()) (map (.values) features);
     fi;
 
 timeOf f =