You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2013/01/04 13:28:44 UTC

svn commit: r1428822 - in /commons/proper/math/trunk/src: main/java/org/apache/commons/math3/random/BitsStreamGenerator.java test/java/org/apache/commons/math3/distribution/RealDistributionAbstractTest.java

Author: erans
Date: Fri Jan  4 12:28:44 2013
New Revision: 1428822

URL: http://svn.apache.org/viewvc?rev=1428822&view=rev
Log:
MATH-927
Made "BitsStreamGenerator" class "Serializable" to allow cloning of
subclasses. Added cloning test for all "RealDistribution" classes.
Thanks to Dennis Hendriks.

Modified:
    commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/BitsStreamGenerator.java
    commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/RealDistributionAbstractTest.java

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/BitsStreamGenerator.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/BitsStreamGenerator.java?rev=1428822&r1=1428821&r2=1428822&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/BitsStreamGenerator.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/BitsStreamGenerator.java Fri Jan  4 12:28:44 2013
@@ -16,21 +16,26 @@
  */
 package org.apache.commons.math3.random;
 
+import java.io.Serializable;
+
 import org.apache.commons.math3.exception.NotStrictlyPositiveException;
 import org.apache.commons.math3.util.FastMath;
 
 /** Base class for random number generators that generates bits streams.
-
+ *
  * @version $Id$
  * @since 2.0
-
  */
-public abstract class BitsStreamGenerator implements RandomGenerator {
-
+public abstract class BitsStreamGenerator
+    implements RandomGenerator,
+               Serializable {
+    /** Serializable version identifier */
+    private static final long serialVersionUID = 20130104L;
     /** Next gaussian. */
     private double nextGaussian;
 
-    /** Creates a new random number generator.
+    /**
+     * Creates a new random number generator.
      */
     public BitsStreamGenerator() {
         nextGaussian = Double.NaN;

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/RealDistributionAbstractTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/RealDistributionAbstractTest.java?rev=1428822&r1=1428821&r2=1428822&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/RealDistributionAbstractTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/distribution/RealDistributionAbstractTest.java Fri Jan  4 12:28:44 2013
@@ -19,6 +19,11 @@ package org.apache.commons.math3.distrib
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 
 import org.apache.commons.math3.TestUtils;
 import org.apache.commons.math3.util.FastMath;
@@ -371,6 +376,24 @@ public abstract class RealDistributionAb
          
     }
 
+    @Test
+    public void testDistributionClone()
+        throws IOException,
+               ClassNotFoundException {
+        // Construct a distribution and initialize its internal random
+        // generator, using a fixed seed for deterministic results.
+        distribution.reseedRandomGenerator(123);
+        distribution.sample();
+
+        // Clone the distribution.
+        final RealDistribution cloned = deepClone();
+
+        // Make sure they still produce the same samples.
+        final double s1 = distribution.sample();
+        final double s2 = cloned.sample();
+        Assert.assertEquals(s1, s2, 0d);
+    }
+
     //------------------ Getters / Setters for test instance data -----------
     /**
      * @return Returns the cumulativeTestPoints.
@@ -464,4 +487,24 @@ public abstract class RealDistributionAb
         this.tolerance = tolerance;
     }
 
+    /**
+     * Serialization and deserialization loop of the {@link #distribution}.
+     */
+    private RealDistribution deepClone()
+        throws IOException,
+               ClassNotFoundException {
+        // Serialize to byte array.
+        final ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        final ObjectOutputStream oOut = new ObjectOutputStream(bOut);
+        oOut.writeObject(distribution);
+        final byte[] data = bOut.toByteArray();
+
+        // Deserialize from byte array.
+        final ByteArrayInputStream bIn = new ByteArrayInputStream(data);
+        final ObjectInputStream oIn = new ObjectInputStream(bIn);
+        final Object clone = oIn.readObject();
+        oIn.close();
+
+        return (RealDistribution) clone;
+    }
 }