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 {