changeset 260:de770971a628

Rename and reorder args of at and slice functions in matrix and vector for consistency with std module equivalents
author Chris Cannam
date Wed, 22 May 2013 13:54:15 +0100
parents fae62dca8048
children 53ff481f1a41
files yetilab/matrix/matrix.yeti yetilab/matrix/test/test_matrix.yeti yetilab/stream/channels.yeti yetilab/stream/filter.yeti yetilab/stream/framer.yeti yetilab/stream/syntheticstream.yeti yetilab/vamp/vamppost.yeti yetilab/vector/blockfuncs.yeti yetilab/vector/test/test_vector.yeti yetilab/vector/vector.yeti
diffstat 10 files changed, 56 insertions(+), 75 deletions(-) [+]
line wrap: on
line diff
--- a/yetilab/matrix/matrix.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/matrix/matrix.yeti	Wed May 22 13:54:15 2013 +0100
@@ -84,7 +84,7 @@
     var v = 0;
     for [0..length slice.indices - 1] do i:
         if slice.indices[i] == m then
-            v := vec.at i slice.values;
+            v := vec.at slice.values i;
         fi
     done;
     v);
@@ -93,14 +93,14 @@
    (slice = sparseSlice n d;
     dslice = new double[d.extent];
     for [0..length slice.indices - 1] do i:
-        dslice[slice.indices[i]] := vec.at i slice.values;
+        dslice[slice.indices[i]] := vec.at slice.values i;
     done;
     vec.vector dslice);
 
-getAt row col m =
+at' m row col =
     case m of
-    DenseRows rows: r = rows[row]; vec.at col r;
-    DenseCols cols: c = cols[col]; vec.at row c;
+    DenseRows rows: r = rows[row]; vec.at r col;
+    DenseCols cols: c = cols[col]; vec.at c row;
     SparseCSR data: fromSlice row col data;
     SparseCSC data: fromSlice col row data;
     esac;
@@ -109,14 +109,14 @@
     case m of
     DenseCols cols: cols[j];
     SparseCSC data: filledSlice j data;
-    _: vec.fromList (map do i: getAt i j m done [0..height m - 1]);
+    _: vec.fromList (map do i: at' m i j done [0..height m - 1]);
     esac;
 
 getRow i m =
     case m of
     DenseRows rows: rows[i];
     SparseCSR data: filledSlice i data; 
-    _: vec.fromList (map do j: getAt i j m done [0..width m - 1]);
+    _: vec.fromList (map do j: at' m i j done [0..width m - 1]);
     esac;
 
 asRows m =
@@ -282,10 +282,10 @@
         fi
     else
         if isRowMajor? m then
-            generate do row col: getAt row col m done (size m);
+            generate do row col: at' m row col done (size m);
         else
             transposed
-               (generate do row col: getAt col row m done
+               (generate do row col: at' m col row done
                 { rows = (width m), columns = (height m) });
         fi
     fi;
@@ -448,7 +448,7 @@
     for [0..size.columns - 1] do j':
         c = getColumn j' m2;
         for e do { v, i, j }:
-            data[j'][i] := data[j'][i] + v * (vec.at j c);
+            data[j'][i] := data[j'][i] + v * (vec.at c j);
         done;
     done;
     DenseCols (array (map vec.vector (list data))));
@@ -459,7 +459,7 @@
     for [0..size.rows - 1] do i':
         r = getRow i' m1;
         for e do { v, i, j }:
-            data[i'][j] := data[i'][j] + v * (vec.at i r);
+            data[i'][j] := data[i'][j] + v * (vec.at r i);
         done;
     done;
     DenseRows (array (map vec.vector (list data))));
@@ -472,7 +472,7 @@
            (map do j':
                 cs = sparseSlice j' d;
                 hin = mapIntoHash
-                   (at cs.indices) ((flip vec.at) cs.values)
+                   (at cs.indices) (vec.at cs.values)
                    [0..length cs.indices - 1];
                 hout = [:];
                 for e do { v, i, j }:
@@ -563,7 +563,6 @@
     fi);
 
 concat direction mm = //!!! doc: storage order is taken from first matrix in sequence
-    //!!! would this be better as separate concatHorizontal/concatVertical functions?
     case length mm of
     0: zeroSizeMatrix ();
     1: head mm;
@@ -591,21 +590,23 @@
         fi;
     esac;
 
-//!!! inconsistent with std.slice which has start..end not start+count (see also vec.slice/rangeOf)
-rowSlice start count m = //!!! doc: storage order same as input
+//!!! doc note: argument order chosen for consistency with std module slice
+rowSlice m start end = //!!! doc: storage order same as input
     if isRowMajor? m then
-        DenseRows (array (map ((flip getRow) m) [start .. start + count - 1]))
+        DenseRows (array (map ((flip getRow) m) [start .. end - 1]))
     else 
-        DenseCols (array (map (vec.rangeOf start count) (asColumns m)))
+        DenseCols (array (map do v: vec.slice v start end done (asColumns m)))
     fi;
 
-columnSlice start count m = //!!! doc: storage order same as input
+//!!! doc note: argument order chosen for consistency with std module slice
+columnSlice m start end = //!!! doc: storage order same as input
     if not isRowMajor? m then
-        DenseCols (array (map ((flip getColumn) m) [start .. start + count - 1]))
+        DenseCols (array (map ((flip getColumn) m) [start .. end - 1]))
     else 
-        DenseRows (array (map (vec.rangeOf start count) (asRows m)))
+        DenseRows (array (map do v: vec.slice v start end done (asRows m)))
     fi;
 
+//!!! needs sparse version
 resizedTo newsize m =
    (if newsize == (size m) then
         m
@@ -617,13 +618,13 @@
         rowm = isRowMajor? m;
         resizedTo newsize
             if rowm and growrows < 0 then
-                rowSlice 0 newsize.rows m
+                rowSlice m 0 newsize.rows
             elif (not rowm) and growcols < 0 then 
-                columnSlice 0 newsize.columns m
+                columnSlice m 0 newsize.columns
             elif growrows < 0 then 
-                rowSlice 0 newsize.rows m
+                rowSlice m 0 newsize.rows
             elif growcols < 0 then 
-                columnSlice 0 newsize.columns m
+                columnSlice m 0 newsize.columns
             else
                 if growrows > 0 then
                     concat (Vertical ())
@@ -641,7 +642,7 @@
     height,
     density,
     nonZeroValues,
-    getAt,
+    at = at',
     getColumn,
     getRow,
     isRowMajor?,
@@ -687,7 +688,7 @@
     height is matrix -> number,
     density is matrix -> number,
     nonZeroValues is matrix -> number,
-    getAt is number -> number -> matrix -> number,
+    at is matrix -> number -> number -> number,
     getColumn is number -> matrix -> vector,
     getRow is number -> matrix -> vector,
     isRowMajor? is matrix -> boolean,
@@ -717,8 +718,8 @@
     filter is (number -> boolean) -> matrix -> matrix,
     product is matrix -> matrix -> matrix,
     concat is (Horizontal () | Vertical ()) -> list<matrix> -> matrix,
-    rowSlice is number -> number -> matrix -> matrix, 
-    columnSlice is number -> number -> matrix -> matrix,
+    rowSlice is matrix -> number -> number -> matrix, 
+    columnSlice is matrix -> number -> number -> matrix,
     newMatrix is (ColumnMajor () | RowMajor ()) -> list<vector> -> matrix, 
     newRowVector is vector -> matrix, 
     newColumnVector is vector -> matrix,
--- a/yetilab/matrix/test/test_matrix.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/matrix/test/test_matrix.yeti	Wed May 22 13:54:15 2013 +0100
@@ -115,12 +115,12 @@
         not mat.equalUnder do a b: a % 2 == b % 2 done p t
 ),
 
-"getAt-\(name)": \(
+"at-\(name)": \(
     generator row col = row * 10 + col;
     m = generate generator { rows = 2, columns = 3 };
     all id
        (map do row: all id
-           (map do col: mat.getAt row col m == generator row col done [0..2])
+           (map do col: mat.at m row col == generator row col done [0..2])
             done [0..1])
 ),
 
@@ -140,8 +140,8 @@
     m' = mat.transposed m;
     all id
        (map do row: all id
-           // like getAt test, but with col/row flipped
-           (map do col: mat.getAt col row m' == generator row col done [0..2])
+           // like at test, but with col/row flipped
+           (map do col: mat.at m' col row == generator row col done [0..2])
             done [0..1])
 ),
 
@@ -432,13 +432,13 @@
 
 "rowSlice-\(name)": \(
     compareMatrices
-       (mat.rowSlice 1 2 (newMatrix (RowMajor ()) [[1,0],[3,4],[0,6],[7,8]]))
+       (mat.rowSlice (newMatrix (RowMajor ()) [[1,0],[3,4],[0,6],[7,8]]) 1 3)
        (newMatrix (RowMajor ()) [[3,4],[0,6]])
 ),
 
 "columnSlice-\(name)": \(
     compareMatrices
-       (mat.columnSlice 1 2 (newMatrix (RowMajor ()) [[1,0,3,4],[0,6,7,8]]))
+       (mat.columnSlice (newMatrix (RowMajor ()) [[1,0,3,4],[0,6,7,8]]) 1 3)
        (newMatrix (RowMajor ()) [[0,3],[6,7]])
 ),
 
--- a/yetilab/stream/channels.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/stream/channels.yeti	Wed May 22 13:54:15 2013 +0100
@@ -21,7 +21,7 @@
         v = new double[columns * rows];
         for [0..rows-1] do row:
             for [0..columns-1] do col:
-                v[col * rows + row] := mat.getAt row col m;
+                v[col * rows + row] := mat.at m row col;
             done;
         done;
         vec.vector v;
@@ -47,7 +47,7 @@
     v = new double[columns];
     for [0..rows-1] do row:
         for [0..columns-1] do col:
-            v[col] := v[col] + mat.getAt row col m;
+            v[col] := v[col] + mat.at m row col;
         done;
     done;
     vec.vector v);
--- a/yetilab/stream/filter.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/stream/filter.yeti	Wed May 22 13:54:15 2013 +0100
@@ -164,10 +164,10 @@
             avail = (mat.width cache) - start;
             if avail >= count then
                 pos := pos + count;
-                [mat.columnSlice start count cache]
+                [mat.columnSlice cache start (start + count)]
             else
                 pos := pos + avail;
-                mat.columnSlice start avail cache ::
+                mat.columnSlice cache start (start + avail) ::
                     cachedPartsFor (count - avail);
             fi);
         readFromCache count =
--- a/yetilab/stream/framer.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/stream/framer.yeti	Wed May 22 13:54:15 2013 +0100
@@ -34,7 +34,7 @@
     buffer = map2
         do buf row:
             vec.concat
-               [vec.rangeOf hop (size-hop) buf,
+               [vec.slice buf hop size,
                 vec.resizedTo hop (mat.getRow row m)];
         done buffer [0..stream.channels-1];
 
--- a/yetilab/stream/syntheticstream.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/stream/syntheticstream.yeti	Wed May 22 13:54:15 2013 +0100
@@ -46,7 +46,7 @@
         get finished? () = not (n > position),
         read count = ch.deinterleaved 1
            (rc = min count (n - position);
-            result = vec.rangeOf position rc data;
+            result = vec.slice data position (position + rc);
             position := position + rc;
             result),
         close = \(),
--- a/yetilab/vamp/vamppost.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/vamp/vamppost.yeti	Wed May 22 13:54:15 2013 +0100
@@ -76,14 +76,14 @@
         {
             start = t0,
             step = t1 - t0,
-            values = map do f: vec.at 0 f.values done features;
+            values = map do f: vec.at f.values 0 done features;
         }
     fi;
 
 structureCurve features =
     map do f: {
         time = timeOf f,
-        value = vec.at 0 f.values,
+        value = vec.at f.values 0,
         label = f.label
     } done features;
 
@@ -96,7 +96,7 @@
 structureSegmentation features =
     map do f: {
         time = timeOf f,
-        type = vec.at 0 f.values,
+        type = vec.at f.values 0,
         label = f.label
     } done features;
 
@@ -104,7 +104,7 @@
     map do f: {
         time = timeOf f,
         duration = f.duration,
-        pitch = vec.at 0 f.values, //!!! no, might be empty
+        pitch = vec.at f.values 0, //!!! no, might be empty
         otherValues = array (tail (vec.list f.values)), //!!! no, might be empty
         label = f.label
     } done features;
--- a/yetilab/vector/blockfuncs.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/vector/blockfuncs.yeti	Wed May 22 13:54:15 2013 +0100
@@ -96,12 +96,12 @@
 fftshift v =
    (len = vec.length v;
     half = int(len/2 + 0.5); // round up for odd-length sequences
-    vec.concat [vec.rangeOf half (len-half) v, vec.rangeOf 0 half v]);
+    vec.concat [vec.slice v half len, vec.slice v 0 half]);
 
 ifftshift v =
    (len = vec.length v;
     half = int(len/2); // round down for odd-length sequences
-    vec.concat [vec.rangeOf half (len-half) v, vec.rangeOf 0 half v]);
+    vec.concat [vec.slice v half len, vec.slice v 0 half]);
 
 {
 sum is vector -> number = sum',
--- a/yetilab/vector/test/test_vector.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/vector/test/test_vector.yeti	Wed May 22 13:54:15 2013 +0100
@@ -75,24 +75,11 @@
     w'' = vec.ones 3;
     vec.equal v w and not vec.equal v w' and not vec.equal v w'';
 ),
-/*
-"copyOf-empty": \(
-    vec.equal (vec.fromList []) (vec.copyOf (vec.fromList []))
-),
 
-"copyOf": \(
+"slice": \(
     v = vec.fromList [1,2,3,4];
-    w = vec.copyOf v;
-    vec.equal v w and (
-        v[0] := 0; // check result is not aliasing inputs
-        not vec.equal v w
-    );
-),
-*/
-"rangeOf": \(
-    v = vec.fromList [1,2,3,4];
-    vec.equal (vec.rangeOf 0 4 v) v and (
-        vec.equal (vec.rangeOf 2 2 v) (vec.fromList [3,4])
+    vec.equal (vec.slice v 0 4) v and (
+        vec.equal (vec.slice v 2 4) (vec.fromList [3,4])
     )
 ),
 
@@ -109,9 +96,6 @@
     x = vec.concat [v, w];
     x' = vec.fromList [1,2,3,4,5,6];
     vec.equal x x' and
-/*       (v[0] := 0; // check result is not aliasing inputs
-        w[0] := 0;
-        vec.equal x x') and */
         vec.equal x' (vec.concat [x', vec.fromList []]) and
         vec.equal x' (vec.concat [vec.fromList [], x'])
 ),
--- a/yetilab/vector/vector.yeti	Wed May 22 09:22:10 2013 +0100
+++ b/yetilab/vector/vector.yeti	Wed May 22 13:54:15 2013 +0100
@@ -40,8 +40,8 @@
 empty?' =
     empty? . list';
 
-//!!! this is reversed from std.at, fix
-at' n v is number -> ~double[] -> number =
+//!!! doc note: argument order chosen for consistency with std module function
+at' v n is ~double[] -> number -> number =
     v[n];
 
 floats a is ~double[] -> ~float[] =
@@ -70,11 +70,9 @@
 copyOf v is ~double[] -> ~double[] =
     Arrays#copyOf(v, list' v |> length);
 
-rangeOf start len v is number -> number -> ~double[] -> ~double[] =
-    Arrays#copyOfRange(v, start, start + len);
-
+//!!! doc note: argument order chosen for consistency with std module function
 slice v start end is ~double[] -> number -> number -> ~double[] =
-    rangeOf start (end - start) v;
+    Arrays#copyOfRange(v, start, end);
 
 resizedTo n v is number -> ~double[] -> ~double[] =
     Arrays#copyOf(v, n);
@@ -106,7 +104,6 @@
     at = at',
     equal,
     equalUnder,
-    rangeOf,
     slice,
     resizedTo,
     concat,
@@ -123,11 +120,10 @@
     array is vector -> array<number>,
     length is vector -> number,
     empty? is vector -> boolean,
-    at is number -> vector -> number,
+    at is vector -> number -> number,
     equal is vector -> vector -> boolean,
     equalUnder is (number -> number -> boolean) -> vector -> vector -> boolean,
-    rangeOf is number -> number -> vector -> vector, //!!! not well-named now vector arg is at the end
-    slice is vector -> number -> number -> vector, //!!! duplication with rangeOf (std module function on arrays is called slice though)
+    slice is vector -> number -> number -> vector,
     resizedTo is number -> vector -> vector,
     concat is list?<vector> -> vector,
 }