You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by gs...@apache.org on 2009/06/13 14:33:07 UTC

svn commit: r784383 - in /lucene/mahout/trunk/core/src: main/java/org/apache/mahout/matrix/ test/java/org/apache/mahout/matrix/

Author: gsingers
Date: Sat Jun 13 12:33:07 2009
New Revision: 784383

URL: http://svn.apache.org/viewvc?rev=784383&view=rev
Log:
MAHOUT-131: vector improvements

Modified:
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/DenseVector.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/SparseVector.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/VectorView.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/TestVectorView.java
    lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/VectorTest.java

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java?rev=784383&r1=784382&r2=784383&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/AbstractVector.java Sat Jun 13 12:33:07 2009
@@ -307,4 +307,29 @@
     return result;
   }
 
+  /**
+   * Compare whether two Vector implementations are the same, regardless of the implementation.
+   * Two Vectors are the same if they have the same cardinality and all of their values are the same.
+   *
+   *
+   * @param left The left hand Vector to compare
+   * @param right The right hand Vector
+   * @return true if the two Vectors have the same cardinality and the same values
+   */
+  public static boolean equivalent(Vector left, Vector right){
+    boolean result = true;
+    int leftCardinality = left.cardinality();
+    if (leftCardinality == right.cardinality()){
+      for (int i = 0; i < leftCardinality; i++){
+        if (left.getQuick(i) != right.getQuick(i)){
+          return false;
+        }
+
+      }
+    } else {
+      return false;
+    }
+    return result;
+  }
+
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/DenseVector.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/DenseVector.java?rev=784383&r1=784382&r2=784383&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/DenseVector.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/DenseVector.java Sat Jun 13 12:33:07 2009
@@ -24,6 +24,7 @@
 import java.io.DataOutput;
 import java.io.IOException;
 import java.util.NoSuchElementException;
+import java.util.Arrays;
 
 /**
  * Implements vector as an array of doubles
@@ -212,4 +213,28 @@
     }
     this.values = values;
   }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (!(o instanceof Vector)) return false;
+
+    Vector that = (Vector) o;
+    if (this.cardinality() != that.cardinality()) return false;
+
+    if (that instanceof DenseVector) {
+      if (!Arrays.equals(values, ((DenseVector) that).values)) return false;
+    } else {
+      return equivalent(this, that);
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    int result = (values != null ? values.hashCode() : 0);
+    result = 31 * result + values.length;
+    return result;
+  }
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/SparseVector.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/SparseVector.java?rev=784383&r1=784382&r2=784383&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/SparseVector.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/SparseVector.java Sat Jun 13 12:33:07 2009
@@ -194,17 +194,22 @@
 
   @Override
   public boolean equals(Object o) {
-    if (this == o)
-      return true;
-    if (o == null || getClass() != o.getClass())
-      return false;
+    if (this == o) return true;
+    if (!(o instanceof Vector)) return false;
 
-    SparseVector that = (SparseVector) o;
+    Vector that = (Vector) o;
+    if (this.cardinality() != that.cardinality()) return false;
+
+    if (that instanceof SparseVector) {
+      return (values == null ? ((SparseVector) that).values == null : values.equals(((SparseVector) that).values));
+    } else {
+      return equivalent(this, that);
+    }
 
-    return cardinality == that.cardinality
-        && (values == null ? that.values == null : values.equals(that.values));
   }
 
+
+
   @Override
   public int hashCode() {
     int result = (values != null ? values.hashCode() : 0);

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/VectorView.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/VectorView.java?rev=784383&r1=784382&r2=784383&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/VectorView.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/matrix/VectorView.java Sat Jun 13 12:33:07 2009
@@ -64,7 +64,7 @@
   @Override
   public String asFormatString() {
     StringBuilder out = new StringBuilder();
-    out.append('[');
+    out.append("[, ");
     for (int i = offset; i < offset + cardinality; i++)
       out.append(getQuick(i)).append(", ");
     out.append("] ");
@@ -238,4 +238,19 @@
     this.cardinality = cardinality;
     this.vector = vector;
   }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    return o instanceof Vector && equivalent(this, (Vector) o);
+
+  }
+
+  @Override
+  public int hashCode() {
+    int result = vector.hashCode();
+    result = 31 * result + offset;
+    result = 31 * result + cardinality;
+    return result;
+  }
 }

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/TestVectorView.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/TestVectorView.java?rev=784383&r1=784382&r2=784383&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/TestVectorView.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/TestVectorView.java Sat Jun 13 12:33:07 2009
@@ -35,7 +35,7 @@
 
   public void testAsFormatString() {
     String formatString = test.asWritableComparable().toString();
-    assertEquals("format", "[2.2, 3.3, 4.4, ] ", formatString);
+    assertEquals("format", "[, 2.2, 3.3, 4.4, ] ", formatString);
   }
 
   public void testCardinality() {

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/VectorTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/VectorTest.java?rev=784383&r1=784382&r2=784383&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/VectorTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/matrix/VectorTest.java Sat Jun 13 12:33:07 2009
@@ -34,6 +34,69 @@
     doTestVectors(vec1, vec2);
   }
 
+  public void testEquivalent() throws Exception {
+    SparseVector left = new SparseVector(3);
+    DenseVector right = new DenseVector(3);
+    left.setQuick(0, 1);
+    left.setQuick(1, 2);
+    left.setQuick(2, 3);
+    right.setQuick(0, 1);
+    right.setQuick(1, 2);
+    right.setQuick(2, 3);
+    assertTrue("equivalent didn't work", AbstractVector.equivalent(left, right));
+    assertTrue("equals didn't work", left.equals(right));
+    right.setQuick(2, 4);
+    assertTrue("equivalent didn't work", AbstractVector.equivalent(left, right)  == false);
+    assertTrue("equals didn't work", left.equals(right)  == false);
+    right = new DenseVector(4);
+    right.setQuick(0, 1);
+    right.setQuick(1, 2);
+    right.setQuick(2, 3);
+    right.setQuick(3, 3);
+    assertTrue("equivalent didn't work", AbstractVector.equivalent(left, right)  == false);
+    assertTrue("equals didn't work", left.equals(right) == false);
+    left = new SparseVector(2);
+    left.setQuick(0, 1);
+    left.setQuick(1, 2);
+    assertTrue("equivalent didn't work", AbstractVector.equivalent(left, right)  == false);
+    assertTrue("equals didn't work", left.equals(right) == false);
+
+    DenseVector dense = new DenseVector(3);
+    right = new DenseVector(3);
+    right.setQuick(0, 1);
+    right.setQuick(1, 2);
+    right.setQuick(2, 3);
+    dense.setQuick(0, 1);
+    dense.setQuick(1, 2);
+    dense.setQuick(2, 3);
+    assertTrue("equivalent didn't work", AbstractVector.equivalent(dense, right)  == true);
+    assertTrue("equals didn't work", dense.equals(right) == true);
+
+    SparseVector sparse = new SparseVector(3);
+    left = new SparseVector(3);
+    sparse.setQuick(0, 1);
+    sparse.setQuick(1, 2);
+    sparse.setQuick(2, 3);
+    left.setQuick(0, 1);
+    left.setQuick(1, 2);
+    left.setQuick(2, 3);
+    assertTrue("equivalent didn't work", AbstractVector.equivalent(sparse, left)  == true);
+    assertTrue("equals didn't work", left.equals(sparse) == true);
+
+    VectorView v1 = new VectorView(left, 0, 2);
+    VectorView v2 = new VectorView(right, 0, 2);
+    assertTrue("equivalent didn't work", AbstractVector.equivalent(v1, v2)  == true);
+    assertTrue("equals didn't work", v1.equals(v2) == true);
+    sparse = new SparseVector(2);
+    sparse.setQuick(0, 1);
+    sparse.setQuick(1, 2);
+    assertTrue("equivalent didn't work", AbstractVector.equivalent(v1, sparse)  == true);
+    assertTrue("equals didn't work", v1.equals(sparse) == true);
+
+
+  }
+
+
   private static void doTestVectors(Vector left, Vector right) {
     left.setQuick(0, 1);
     left.setQuick(1, 2);
@@ -43,6 +106,11 @@
     right.setQuick(2, 6);
     double result = left.dot(right);
     assertEquals(result + " does not equal: " + 32, 32.0, result);
+    String formattedString = left.asFormatString();
+    System.out.println("Vec: " + formattedString);
+    Vector vec = AbstractVector.decodeVector(formattedString);
+    assertTrue("vec is null and it shouldn't be", vec != null);
+    assertTrue("Vector could not be decoded from the formatString", AbstractVector.equivalent(vec, left));
   }
 
   public void testNormalize() throws Exception {