Author: smarthi
Date: Wed May 29 10:26:06 2013
New Revision: 1487432

URL: http://svn.apache.org/r1487432
Log:
MAHOUT-1230: SparceMatrix.clone() is not deep copy

Modified:
    mahout/trunk/CHANGELOG
    mahout/trunk/math/src/main/java/org/apache/mahout/math/PivotedMatrix.java
    mahout/trunk/math/src/main/java/org/apache/mahout/math/SparseMatrix.java
    
mahout/trunk/math/src/main/java/org/apache/mahout/math/random/Multinomial.java
    mahout/trunk/math/src/test/java/org/apache/mahout/math/MatrixTest.java
    mahout/trunk/math/src/test/java/org/apache/mahout/math/TestSparseMatrix.java
    
mahout/trunk/math/src/test/java/org/apache/mahout/math/random/MultinomialTest.java

Modified: mahout/trunk/CHANGELOG
URL: 
http://svn.apache.org/viewvc/mahout/trunk/CHANGELOG?rev=1487432&r1=1487431&r2=1487432&view=diff
==============================================================================
--- mahout/trunk/CHANGELOG (original)
+++ mahout/trunk/CHANGELOG Wed May 29 10:26:06 2013
@@ -2,6 +2,8 @@ Mahout Change Log
 
 Release 0.8 - unreleased
 
+  MAHOUT-1230: SparceMatrix.clone() is not deep copy (Maysam Yabandeh via 
tdunning)
+  
   MAHOUT-1232: VectorHelper.topEntries() throws a NPE when number of NonZero 
elements in vector < maxEntries (smarthi)
 
   MAHOUT-1229: Conf directory content from Mahout distribution archives cannot 
be unpacked (Stevo Slavic via smarthi)

Modified: 
mahout/trunk/math/src/main/java/org/apache/mahout/math/PivotedMatrix.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/PivotedMatrix.java?rev=1487432&r1=1487431&r2=1487432&view=diff
==============================================================================
--- mahout/trunk/math/src/main/java/org/apache/mahout/math/PivotedMatrix.java 
(original)
+++ mahout/trunk/math/src/main/java/org/apache/mahout/math/PivotedMatrix.java 
Wed May 29 10:26:06 2013
@@ -24,11 +24,11 @@ import com.google.common.base.Preconditi
  */
 public class PivotedMatrix extends AbstractMatrix {
 
-  private final Matrix base;
-  private final int[] rowPivot;
-  private final int[] rowUnpivot;
-  private final int[] columnPivot;
-  private final int[] columnUnpivot;
+  private Matrix base;
+  private int[] rowPivot;
+  private int[] rowUnpivot;
+  private int[] columnPivot;
+  private int[] columnUnpivot;
 
   public PivotedMatrix(Matrix base, int[] pivot) {
     this(base, pivot, java.util.Arrays.copyOf(pivot, pivot.length));
@@ -177,6 +177,21 @@ public class PivotedMatrix extends Abstr
     return new PivotedMatrix(base.like());
   }
 
+
+  @Override
+  public Matrix clone() {
+    PivotedMatrix clone = (PivotedMatrix) super.clone();
+
+    base = base.clone();
+    rowPivot = rowPivot.clone();
+    rowUnpivot = rowUnpivot.clone();
+    columnPivot = columnPivot.clone();
+    columnUnpivot = columnUnpivot.clone();
+
+    return clone;
+  }
+
+
   /**
    * Returns an empty matrix of the same underlying class as the receiver and 
of the specified
    * size.

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=1487432&r1=1487431&r2=1487432&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 
Wed May 29 10:26:06 2013
@@ -57,6 +57,9 @@ public class SparseMatrix extends Abstra
   public Matrix clone() {
     SparseMatrix clone = (SparseMatrix) super.clone();
     clone.rowVectors = rowVectors.clone();
+    for (int i = 0; i < numRows(); i++) {
+      clone.rowVectors.put(i, rowVectors.get(i).clone());
+    }
     return clone;
   }
 

Modified: 
mahout/trunk/math/src/main/java/org/apache/mahout/math/random/Multinomial.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/random/Multinomial.java?rev=1487432&r1=1487431&r2=1487432&view=diff
==============================================================================
--- 
mahout/trunk/math/src/main/java/org/apache/mahout/math/random/Multinomial.java 
(original)
+++ 
mahout/trunk/math/src/main/java/org/apache/mahout/math/random/Multinomial.java 
Wed May 29 10:26:06 2013
@@ -165,8 +165,8 @@ public final class Multinomial<T> implem
   /**
    * Exposed for testing only.  Returns a list of the leaf weights.  These are 
in an
    * order such that probing just before and after the cumulative sum of these 
weights
-   * will touch every element of the tree twice and thus will make every 
possible left/right
-   * decision in navigating the tree.
+   * will touch every element of the tree twice and thus will make it possible 
to test
+   * every possible left/right decision in navigating the tree.
    */
   List<Double> getWeights() {
     List<Double> r = Lists.newArrayList();

Modified: mahout/trunk/math/src/test/java/org/apache/mahout/math/MatrixTest.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/test/java/org/apache/mahout/math/MatrixTest.java?rev=1487432&r1=1487431&r2=1487432&view=diff
==============================================================================
--- mahout/trunk/math/src/test/java/org/apache/mahout/math/MatrixTest.java 
(original)
+++ mahout/trunk/math/src/test/java/org/apache/mahout/math/MatrixTest.java Wed 
May 29 10:26:06 2013
@@ -68,6 +68,19 @@ public abstract class MatrixTest extends
   }
 
   @Test
+  public void testClone() {
+    double oldValue = 1.23;
+    double newValue = 2.34;
+    double[][] values = {{oldValue, 3}, {3, 5}, {7, 9}};
+    Matrix matrix = matrixFactory(values);
+    Matrix clone = matrix.clone();
+    clone.set(0, 0, newValue);
+    //test whether the update in the clone is reflected in the original matrix
+    assertEquals("Matrix clone is not independent of the original",
+      oldValue, matrix.get(0, 0), EPSILON);
+  }
+
+  @Test
   public void testIterate() {
     Iterator<MatrixSlice> it = test.iterator();
     MatrixSlice m;
@@ -528,6 +541,14 @@ public abstract class MatrixTest extends
   public void testViewRow() {
     Vector row = test.viewRow(1);
     assertEquals("row size", 2, row.getNumNondefaultElements());
+
+    //create a matrix with an unassigned row 0
+    Matrix matrix = new SparseMatrix(1, 1);
+    Vector view = matrix.viewRow(0);
+    final double value = 1.23;
+    view.assign(value);
+    //test whether the update in the view is reflected in the matrix
+    assertEquals("Matrix value", view.getQuick(0), matrix.getQuick(0, 0), 
EPSILON);
   }
 
   @Test(expected = IndexException.class)

Modified: 
mahout/trunk/math/src/test/java/org/apache/mahout/math/TestSparseMatrix.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/test/java/org/apache/mahout/math/TestSparseMatrix.java?rev=1487432&r1=1487431&r2=1487432&view=diff
==============================================================================
--- 
mahout/trunk/math/src/test/java/org/apache/mahout/math/TestSparseMatrix.java 
(original)
+++ 
mahout/trunk/math/src/test/java/org/apache/mahout/math/TestSparseMatrix.java 
Wed May 29 10:26:06 2013
@@ -31,16 +31,4 @@ public final class TestSparseMatrix exte
     }
     return matrix;
   }
-
-  @Test
-  public void testViewRow() {
-    //create a matrix with an unassigned row 0
-    Matrix matrix = new SparseMatrix(1, 1);
-    Vector view = matrix.viewRow(0);
-    final double value = 1.23;
-    view.assign(value);
-    //test whether the update in the view is reflected in the matrix
-    assertEquals("Matrix value", view.getQuick(0), matrix.getQuick(0, 0), 
EPSILON);
-  }
-
 }

Modified: 
mahout/trunk/math/src/test/java/org/apache/mahout/math/random/MultinomialTest.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/test/java/org/apache/mahout/math/random/MultinomialTest.java?rev=1487432&r1=1487431&r2=1487432&view=diff
==============================================================================
--- 
mahout/trunk/math/src/test/java/org/apache/mahout/math/random/MultinomialTest.java
 (original)
+++ 
mahout/trunk/math/src/test/java/org/apache/mahout/math/random/MultinomialTest.java
 Wed May 29 10:26:06 2013
@@ -245,7 +245,7 @@ public class MultinomialTest extends Mah
         double totalWeight = table.getWeight();
 
         double p = 0;
-        int[] k = new int[10];
+        int[] k = new int[weights.size()];
         for (double weight : weights) {
             if (weight > 0) {
                 if (p > 0) {
@@ -258,9 +258,11 @@ public class MultinomialTest extends Mah
         k[table.sample(p - 1.0e-9)]++;
         assertEquals(1, p, 1.0e-9);
 
-        for (int i = 0; i < 10; i++) {
+        for (int i = 0; i < weights.size(); i++) {
             if (table.getWeight(i) > 0) {
                 assertEquals(2, k[i]);
+            } else {
+                assertEquals(0, k[i]);
             }
         }
     }


Reply via email to