Author: srowen
Date: Mon Jun 27 16:09:10 2011
New Revision: 1140224

URL: http://svn.apache.org/viewvc?rev=1140224&view=rev
Log:
MAHOUT-744 iterate over SparseMatrix rows sparse-ly in iterate()

Modified:
    
mahout/trunk/core/src/test/java/org/apache/mahout/math/hadoop/TestDistributedRowMatrix.java
    mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java
    mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseMatrix.java

Modified: 
mahout/trunk/core/src/test/java/org/apache/mahout/math/hadoop/TestDistributedRowMatrix.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/math/hadoop/TestDistributedRowMatrix.java?rev=1140224&r1=1140223&r2=1140224&view=diff
==============================================================================
--- 
mahout/trunk/core/src/test/java/org/apache/mahout/math/hadoop/TestDistributedRowMatrix.java
 (original)
+++ 
mahout/trunk/core/src/test/java/org/apache/mahout/math/hadoop/TestDistributedRowMatrix.java
 Mon Jun 27 16:09:10 2011
@@ -17,6 +17,8 @@
 
 package org.apache.mahout.math.hadoop;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Iterators;
 import com.google.common.collect.Maps;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
@@ -329,28 +331,18 @@ public final class TestDistributedRowMat
   }
 
   private static DistributedRowMatrix saveToFs(final Matrix m, Path 
baseTmpDirPath) throws IOException {
-        Configuration conf = new Configuration();
+    Configuration conf = new Configuration();
     FileSystem fs = FileSystem.get(conf);
 
     ClusteringTestUtils.writePointsToFile(new Iterable<VectorWritable>() {
       @Override
       public Iterator<VectorWritable> iterator() {
-        final Iterator<MatrixSlice> it = m.iterator();
-        return new Iterator<VectorWritable>() {
-          @Override
-          public boolean hasNext() {
-            return it.hasNext();
-          }
-          @Override
-          public VectorWritable next() {
-            MatrixSlice slice = it.next();
-            return new VectorWritable(slice.vector());
-          }
+        return Iterators.transform(m.iterator(), new 
Function<MatrixSlice,VectorWritable>() {
           @Override
-          public void remove() {
-            it.remove();
+          public VectorWritable apply(MatrixSlice input) {
+            return new VectorWritable(input.vector());
           }
-        };
+        });
       }
     }, true, new Path(baseTmpDirPath, "distMatrix/part-00000"), fs, conf);
 

Modified: 
mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java?rev=1140224&r1=1140223&r2=1140224&view=diff
==============================================================================
--- mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java 
(original)
+++ mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractMatrix.java 
Mon Jun 27 16:09:10 2011
@@ -17,6 +17,7 @@
 
 package org.apache.mahout.math;
 
+import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.Maps;
 import org.apache.mahout.math.function.DoubleDoubleFunction;
 import org.apache.mahout.math.function.Functions;
@@ -26,7 +27,6 @@ import org.apache.mahout.math.function.V
 
 import java.util.Iterator;
 import java.util.Map;
-import java.util.NoSuchElementException;
 
 /** A few universal implementations of convenience functions */
 public abstract class AbstractMatrix implements Matrix {
@@ -59,27 +59,16 @@ public abstract class AbstractMatrix imp
 
   @Override
   public Iterator<MatrixSlice> iterateAll() {
-    return new Iterator<MatrixSlice>() {
+    return new AbstractIterator<MatrixSlice>() {
       private int slice;
-
-      @Override
-      public boolean hasNext() {
-        return slice < numSlices();
-      }
-
       @Override
-      public MatrixSlice next() {
+      protected MatrixSlice computeNext() {
         if (slice >= numSlices()) {
-          throw new NoSuchElementException();
+          return endOfData();
         }
         int i = slice++;
         return new MatrixSlice(slice(i), i);
       }
-
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException("remove() not supported for 
Matrix iterator");
-      }
     };
   }
 
@@ -642,25 +631,15 @@ public abstract class AbstractMatrix imp
 
     @Override
     public Iterator<Element> iterator() {
-      return new Iterator<Element>() {
+      return new AbstractIterator<Element>() {
         private int i;
         @Override
-        public boolean hasNext() {
-          return i < size();
-        }
-
-        @Override
-        public Element next() {
+        protected Element computeNext() {
           if (i >= size()) {
-            throw new NoSuchElementException();
+            return endOfData();
           }
           return getElement(i++);
         }
-
-        @Override
-        public void remove() {
-          throw new UnsupportedOperationException("Element removal not 
supported");
-        }
       };
     }
 

Modified: 
mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseMatrix.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseMatrix.java?rev=1140224&r1=1140223&r2=1140224&view=diff
==============================================================================
--- mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseMatrix.java 
(original)
+++ mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseMatrix.java 
Mon Jun 27 16:09:10 2011
@@ -17,12 +17,16 @@
 
 package org.apache.mahout.math;
 
+import com.google.common.collect.AbstractIterator;
+import org.apache.mahout.math.list.IntArrayList;
 import org.apache.mahout.math.map.OpenIntObjectHashMap;
 
+import java.util.Iterator;
 import java.util.Map;
 
 /** Doubly sparse matrix. Implemented as a Map of RandomAccessSparseVector 
rows */
 public class SparseMatrix extends AbstractMatrix {
+
   private OpenIntObjectHashMap<Vector> rows;
   
   public SparseMatrix() {
@@ -70,6 +74,25 @@ public class SparseMatrix extends Abstra
     clone.rows = rows.clone();
     return clone;
   }
+
+  @Override
+  public Iterator<MatrixSlice> iterator() {
+    final IntArrayList keys = new IntArrayList(rows.size());
+    rows.keys(keys);
+    return new AbstractIterator<MatrixSlice>() {
+      private int slice;
+      @Override
+      protected MatrixSlice computeNext() {
+        if (slice >= rows.size()) {
+          return endOfData();
+        }
+        int i = keys.get(slice);
+        Vector row = rows.get(i);
+        slice++;
+        return new MatrixSlice(row, i);
+      }
+    };
+  }
   
   @Override
   public double getQuick(int row, int column) {


Reply via email to