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]); } } }