changeset 226:c00d8f7e2708

Add equalUnder to compare vectors or matrices using a particular number comparator
author Chris Cannam
date Sun, 12 May 2013 14:50:03 +0100
parents 8e04d298741b
children 055a0a5500d7
files yetilab/matrix/matrix.yeti yetilab/vector/vector.yeti
diffstat 2 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/yetilab/matrix/matrix.yeti	Sun May 12 13:31:49 2013 +0100
+++ b/yetilab/matrix/matrix.yeti	Sun May 12 14:50:03 2013 +0100
@@ -122,19 +122,24 @@
 toColumnMajor m =
     if not isRowMajor? m then m else flipped m fi;
 
-// Matrices with different storage order but the same contents are
-// equal (but comparing them is slow)
-equal m1 m2 =
-    if size m1 != size m2 then false
-    elif isRowMajor? m1 != isRowMajor? m2 then equal (flipped m1) m2;
+// Compare matrices using the given comparator for individual cells.
+// Note that matrices with different storage order but the same
+// contents are equal, although comparing them is slow.
+equalUnder comparator m1 m2 =
+    if size m1 != size m2 then 
+        false
+    elif isRowMajor? m1 != isRowMajor? m2 then
+        equalUnder comparator (flipped m1) m2;
     else
-        compare d1 d2 = all id (map2 vec.equal d1 d2);
+        compare d1 d2 = all id (map2 (vec.equalUnder comparator) d1 d2);
         case m1 of
         RowM d1: case m2 of RowM d2: compare d1 d2; _: false; esac;
         ColM d1: case m2 of ColM d2: compare d1 d2; _: false; esac;
         esac
     fi;
 
+equal = equalUnder (==);
+
 /*!!! not needed now it's immutable?
 copyOf m =
    (copyOfData d = (array (map vec.copyOf d));
@@ -287,6 +292,7 @@
     identityMatrix,
     zeroSizeMatrix,
     equal,
+    equalUnder,
 //    copyOf,
     transposed,
     flipped,
@@ -324,6 +330,7 @@
     identityMatrix is { .rows is number, .columns is number } -> matrix, 
     zeroSizeMatrix is () -> matrix,
     equal is matrix -> matrix -> boolean,
+    equalUnder is (number -> number -> boolean) -> matrix -> matrix -> boolean,
 //    copyOf is matrix -> matrix,
     transposed is matrix -> matrix,
     flipped is matrix -> matrix, 
--- a/yetilab/vector/vector.yeti	Sun May 12 13:31:49 2013 +0100
+++ b/yetilab/vector/vector.yeti	Sun May 12 14:50:03 2013 +0100
@@ -62,6 +62,10 @@
 equal v1 v2 =
     list' v1 == list' v2;
 
+equalUnder comparator v1 v2 =
+    length' v1 == length' v2 and
+        all id (map2 comparator (list' v1) (list' v2));
+
 copyOf v is ~double[] -> ~double[] =
     Arrays#copyOf(v, list' v |> length);
 
@@ -97,6 +101,7 @@
     empty? = empty?',
     at = at',
     equal,
+    equalUnder,
     rangeOf,
     resizedTo,
     concat,
@@ -115,6 +120,7 @@
     empty? is vector -> boolean,
     at is number -> vector -> 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
     resizedTo is number -> vector -> vector,
     concat is list?<vector> -> vector,