You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by jm...@apache.org on 2010/01/21 14:12:41 UTC
svn commit: r901692 - in
/lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math:
AbstractMatrix.java DenseMatrix.java DenseVector.java
SparseColumnMatrix.java SparseRowMatrix.java
Author: jmannix
Date: Thu Jan 21 13:12:40 2010
New Revision: 901692
URL: http://svn.apache.org/viewvc?rev=901692&view=rev
Log:
Fixes MAHOUT-211, adding some consistent view semantics to matrices, and adding a shallow (view) constructor for DenseVector.
Modified:
lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java
lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseMatrix.java
lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseVector.java
lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseColumnMatrix.java
lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseRowMatrix.java
Modified: lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java?rev=901692&r1=901691&r2=901692&view=diff
==============================================================================
--- lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java (original)
+++ lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java Thu Jan 21 13:12:40 2010
@@ -21,11 +21,9 @@
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
/** A few universal implementations of convenience functions */
@@ -460,4 +458,128 @@
return result;
}
+ protected class TransposeViewVector extends AbstractVector {
+
+ protected Matrix matrix;
+ protected int transposeOffset;
+ protected int numCols;
+ private boolean rowToColumn;
+
+ public TransposeViewVector(Matrix m, int offset) {
+ this(m, offset, true);
+ }
+
+ public TransposeViewVector(Matrix m, int offset, boolean rowToColumn) {
+ matrix = m;
+ this.transposeOffset = offset;
+ this.rowToColumn = rowToColumn;
+ numCols = rowToColumn ? m.numCols() : m.numRows();
+ size = rowToColumn ? m.numRows() : m.numCols();
+ }
+
+ @Override
+ public Vector clone() {
+ Vector v = new DenseVector(size);
+ addTo(v);
+ return v;
+ }
+
+ @Override
+ protected Matrix matrixLike(int rows, int columns) {
+ return matrix.like(rows, columns);
+ }
+
+ @Override
+ public Iterator<Element> iterateAll() {
+ return new Iterator<Element>() {
+ int i = 0;
+ @Override
+ public boolean hasNext() {
+ return i < size;
+ }
+
+ @Override
+ public Element next() {
+ return getElement(i++);
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException("Element removal not supported");
+ }
+ };
+ }
+
+ /**
+ * Currently delegates to iterateAll. TODO: This could be optimized to at least skip empty rows if there are
+ * many of them.
+ * @return an iterator (currently dense).
+ */
+ @Override
+ public Iterator<Element> iterateNonZero() {
+ return iterateAll();
+ }
+
+ @Override
+ public Element getElement(final int i) {
+ return new Element() {
+ @Override
+ public double get() {
+ return getQuick(i);
+ }
+
+ @Override
+ public int index() {
+ return i;
+ }
+
+ @Override
+ public void set(double value) {
+ setQuick(i, value);
+ }
+ };
+ }
+
+ @Override
+ public double getQuick(int index) {
+ Vector v = rowToColumn ? matrix.getRow(index) : matrix.getColumn(index);
+ return v == null ? 0 : v.getQuick(transposeOffset);
+ }
+
+ @Override
+ public void setQuick(int index, double value) {
+ Vector v = rowToColumn ? matrix.getRow(index) : matrix.getColumn(index);
+ if(v == null) {
+ v = newVector(numCols);
+ matrix.assignRow(index, v);
+ }
+ v.setQuick(transposeOffset, value);
+ }
+
+ protected Vector newVector(int cardinality)
+ {
+ return new DenseVector(cardinality);
+ }
+
+ @Override
+ public Vector like() {
+ return new DenseVector(size);
+ }
+
+ @Override
+ public Vector like(int cardinality) {
+ return new DenseVector(cardinality);
+ }
+
+ /**
+ * TODO: currently I don't know of an efficient way to get this value correctly.
+ *
+ * @return the number of nonzero entries
+ */
+ @Override
+ public int getNumNondefaultElements() {
+ return size;
+ }
+ }
+
}
Modified: lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseMatrix.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseMatrix.java?rev=901692&r1=901691&r2=901692&view=diff
==============================================================================
--- lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseMatrix.java (original)
+++ lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseMatrix.java Thu Jan 21 13:12:40 2010
@@ -136,11 +136,7 @@
if (column < 0 || column >= columnSize()) {
throw new IndexException();
}
- double[] col = new double[rowSize()];
- for (int row = 0; row < rowSize(); row++) {
- col[row] = values[row][column];
- }
- return new DenseVector(col);
+ return new TransposeViewVector(this, column);
}
@Override
@@ -148,7 +144,7 @@
if (row < 0 || row >= rowSize()) {
throw new IndexException();
}
- return new DenseVector(values[row]);
+ return new DenseVector(values[row], true);
}
}
Modified: lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseVector.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseVector.java?rev=901692&r1=901691&r2=901692&view=diff
==============================================================================
--- lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseVector.java (original)
+++ lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/DenseVector.java Thu Jan 21 13:12:40 2010
@@ -37,7 +37,11 @@
/** Construct a new instance using provided values */
public DenseVector(double[] values) {
- this.values = values.clone();
+ this(values, false);
+ }
+
+ public DenseVector(double[] values, boolean shallowCopy) {
+ this.values = shallowCopy ? values : values.clone();
}
public DenseVector(String name, double[] values) {
Modified: lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseColumnMatrix.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseColumnMatrix.java?rev=901692&r1=901691&r2=901692&view=diff
==============================================================================
--- lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseColumnMatrix.java (original)
+++ lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseColumnMatrix.java Thu Jan 21 13:12:40 2010
@@ -160,11 +160,7 @@
if (row < 0 || row >= cardinality[ROW]) {
throw new IndexException();
}
- double[] d = new double[cardinality[COL]];
- for (int col = 0; col < cardinality[COL]; col++) {
- d[col] = getQuick(row, col);
- }
- return new DenseVector(d);
+ return new TransposeViewVector(this, row, false);
}
}
Modified: lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseRowMatrix.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseRowMatrix.java?rev=901692&r1=901691&r2=901692&view=diff
==============================================================================
--- lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseRowMatrix.java (original)
+++ lucene/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseRowMatrix.java Thu Jan 21 13:12:40 2010
@@ -143,18 +143,29 @@
return this;
}
+ /**
+ *
+ * @param column an int column index
+ * @return a shallow view of the column of this row matrix.
+ */
@Override
public Vector getColumn(int column) {
if (column < 0 || column >= cardinality[COL]) {
throw new IndexException();
}
- double[] d = new double[cardinality[ROW]];
- for (int row = 0; row < cardinality[ROW]; row++) {
- d[row] = getQuick(row, column);
- }
- return new DenseVector(d);
+ return new TransposeViewVector(this, column) {
+ @Override
+ protected Vector newVector(int cardinality) {
+ return new RandomAccessSparseVector(cardinality, 10);
+ }
+ };
}
+ /**
+ *
+ * @param row an int row index
+ * @return a deep view of the Vector at specified row (ie you may mutate the original matrix using this row)
+ */
@Override
public Vector getRow(int row) {
if (row < 0 || row >= cardinality[ROW]) {