Author: srowen
Date: Wed Nov 28 09:53:56 2012
New Revision: 1414618
URL: http://svn.apache.org/viewvc?rev=1414618&view=rev
Log:
Oops, fix tests for last change to sampling
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIterator.java
mahout/trunk/core/src/main/java/org/apache/mahout/common/iterator/SamplingIterator.java
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIteratorTest.java
mahout/trunk/core/src/test/java/org/apache/mahout/common/iterator/TestSamplingIterator.java
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIterator.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIterator.java?rev=1414618&r1=1414617&r2=1414618&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIterator.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIterator.java
Wed Nov 28 09:53:56 2012
@@ -19,6 +19,7 @@ package org.apache.mahout.cf.taste.impl.
import java.util.NoSuchElementException;
+import com.google.common.base.Preconditions;
import org.apache.commons.math.MathException;
import org.apache.commons.math.distribution.PascalDistributionImpl;
@@ -34,6 +35,8 @@ public final class SamplingLongPrimitive
private boolean hasNext;
public SamplingLongPrimitiveIterator(LongPrimitiveIterator delegate, double
samplingRate) {
+ Preconditions.checkNotNull(delegate);
+ Preconditions.checkArgument(samplingRate > 0.0 && samplingRate <= 1.0);
// Geometric distribution is special case of negative binomial (aka
Pascal) with r=1:
geometricDistribution = new PascalDistributionImpl(1, samplingRate);
this.delegate = delegate;
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/common/iterator/SamplingIterator.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/common/iterator/SamplingIterator.java?rev=1414618&r1=1414617&r2=1414618&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/common/iterator/SamplingIterator.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/common/iterator/SamplingIterator.java
Wed Nov 28 09:53:56 2012
@@ -19,6 +19,7 @@ package org.apache.mahout.common.iterato
import java.util.Iterator;
+import com.google.common.base.Preconditions;
import com.google.common.collect.AbstractIterator;
import org.apache.commons.math.MathException;
import org.apache.commons.math.distribution.PascalDistributionImpl;
@@ -34,6 +35,8 @@ public final class SamplingIterator<T> e
private final Iterator<? extends T> delegate;
public SamplingIterator(Iterator<? extends T> delegate, double samplingRate)
{
+ Preconditions.checkNotNull(delegate);
+ Preconditions.checkArgument(samplingRate > 0.0 && samplingRate <= 1.0);
// Geometric distribution is special case of negative binomial (aka
Pascal) with r=1:
geometricDistribution = new PascalDistributionImpl(1, samplingRate);
this.delegate = delegate;
Modified:
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIteratorTest.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIteratorTest.java?rev=1414618&r1=1414617&r2=1414618&view=diff
==============================================================================
---
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIteratorTest.java
(original)
+++
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/SamplingLongPrimitiveIteratorTest.java
Wed Nov 28 09:53:56 2012
@@ -20,40 +20,70 @@ package org.apache.mahout.cf.taste.impl.
import org.apache.mahout.cf.taste.impl.TasteTestCase;
import org.junit.Test;
-import java.util.NoSuchElementException;
-
public final class SamplingLongPrimitiveIteratorTest extends TasteTestCase {
- @Test(expected = NoSuchElementException.class)
- public void testEmpty() {
- LongPrimitiveArrayIterator it = new LongPrimitiveArrayIterator(new
long[0]);
- LongPrimitiveIterator sample = new SamplingLongPrimitiveIterator(it, 0.5);
- assertFalse(sample.hasNext());
- sample.next();
- }
-
- @Test(expected = NoSuchElementException.class)
- public void testNext() {
- LongPrimitiveArrayIterator it = new LongPrimitiveArrayIterator(new long[]
{5,4,3,2,1});
- LongPrimitiveIterator sample = new SamplingLongPrimitiveIterator(it, 0.5);
- assertTrue(sample.hasNext());
- assertEquals(4, (long) sample.next());
- assertTrue(sample.hasNext());
- assertEquals(2, sample.nextLong());
- assertTrue(sample.hasNext());
- assertEquals(1, (long) sample.next());
- assertFalse(sample.hasNext());
- it.nextLong();
+ @Test
+ public void testEmptyCase() {
+ assertFalse(new SamplingLongPrimitiveIterator(
+ countingIterator(0), 0.9999).hasNext());
+ assertFalse(new SamplingLongPrimitiveIterator(
+ countingIterator(0), 1).hasNext());
+ }
+
+ @Test
+ public void testSmallInput() {
+ SamplingLongPrimitiveIterator t = new SamplingLongPrimitiveIterator(
+ countingIterator(1), 0.9999);
+ assertTrue(t.hasNext());
+ assertEquals(0L, t.nextLong());
+ assertFalse(t.hasNext());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testBadRate1() {
+ new SamplingLongPrimitiveIterator(countingIterator(1), 0.0);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testBadRate2() {
+ new SamplingLongPrimitiveIterator(countingIterator(1), 1.1);
}
@Test
- public void testPeekSkip() {
- LongPrimitiveArrayIterator it = new LongPrimitiveArrayIterator(new long[]
{8,7,6,5,4,3,2,1});
- LongPrimitiveIterator sample = new SamplingLongPrimitiveIterator(it, 0.5);
- assertEquals(7, sample.peek());
- sample.skip(1);
- assertEquals(4, sample.peek());
- assertTrue(sample.hasNext());
+ public void testExactSizeMatch() {
+ SamplingLongPrimitiveIterator t = new SamplingLongPrimitiveIterator(
+ countingIterator(10), 1);
+ for (int i = 0; i < 10; i++) {
+ assertTrue(t.hasNext());
+ assertEquals(i, t.next().intValue());
+ }
+ assertFalse(t.hasNext());
+ }
+
+ @Test
+ public void testSample() {
+ for (int i = 0; i < 1000; i++) {
+ SamplingLongPrimitiveIterator t = new SamplingLongPrimitiveIterator(
+ countingIterator(1000), 0.1);
+ int k = 0;
+ while (t.hasNext()) {
+ long v = t.nextLong();
+ k++;
+ assertTrue(v >= 0L);
+ assertTrue(v < 1000L);
+ }
+ double sd = Math.sqrt(0.9 * 0.1 * 1000);
+ assertTrue(k >= 100 - 4 * sd);
+ assertTrue(k <= 100 + 4 * sd);
+ }
+ }
+
+ private static LongPrimitiveArrayIterator countingIterator(int to) {
+ long[] data = new long[to];
+ for (int i = 0; i < to; i++) {
+ data[i] = i;
+ }
+ return new LongPrimitiveArrayIterator(data);
}
}
\ No newline at end of file
Modified:
mahout/trunk/core/src/test/java/org/apache/mahout/common/iterator/TestSamplingIterator.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/common/iterator/TestSamplingIterator.java?rev=1414618&r1=1414617&r2=1414618&view=diff
==============================================================================
---
mahout/trunk/core/src/test/java/org/apache/mahout/common/iterator/TestSamplingIterator.java
(original)
+++
mahout/trunk/core/src/test/java/org/apache/mahout/common/iterator/TestSamplingIterator.java
Wed Nov 28 09:53:56 2012
@@ -28,7 +28,6 @@ public final class TestSamplingIterator
public void testEmptyCase() {
assertFalse(new SamplingIterator<Integer>(new CountingIterator(0),
0.9999).hasNext());
assertFalse(new SamplingIterator<Integer>(new CountingIterator(0),
1).hasNext());
- assertFalse(new SamplingIterator<Integer>(new CountingIterator(0),
2).hasNext());
}
@Test
@@ -39,10 +38,14 @@ public final class TestSamplingIterator
assertFalse(t.hasNext());
}
- @Test
- public void testAbsurdSampleRate() {
- Iterator<Integer> t = new SamplingIterator<Integer>(new
CountingIterator(2), 0);
- assertFalse(t.hasNext());
+ @Test(expected = IllegalArgumentException.class)
+ public void testBadRate1() {
+ new SamplingIterator<Integer>(new CountingIterator(1), 0.0);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testBadRate2() {
+ new SamplingIterator<Integer>(new CountingIterator(1), 1.1);
}
@Test
@@ -57,7 +60,7 @@ public final class TestSamplingIterator
@Test
public void testSample() {
- for (int i = 0; i < 100; i++) {
+ for (int i = 0; i < 1000; i++) {
Iterator<Integer> t = new SamplingIterator<Integer>(new
CountingIterator(1000), 0.1);
int k = 0;
while (t.hasNext()) {
@@ -67,8 +70,8 @@ public final class TestSamplingIterator
assertTrue(v < 1000);
}
double sd = Math.sqrt(0.9 * 0.1 * 1000);
- assertTrue(k >= 100 - 3 * sd);
- assertTrue(k <= 100 + 3 * sd);
+ assertTrue(k >= 100 - 4 * sd);
+ assertTrue(k <= 100 + 4 * sd);
}
}
}