You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2012/09/10 16:47:19 UTC

svn commit: r1382902 - /commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/EmpiricalDistribution.java

Author: luc
Date: Mon Sep 10 14:47:19 2012
New Revision: 1382902

URL: http://svn.apache.org/viewvc?rev=1382902&view=rev
Log:
Replaced factory using Object with type-safe version.

Only two types of adapters were used: double array and stream, in a
private internal factory. This has been suppressed so each adapter is
bioth type safe and returns only the exceptions it can trigger.

Modified:
    commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/EmpiricalDistribution.java

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/EmpiricalDistribution.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/EmpiricalDistribution.java?rev=1382902&r1=1382901&r2=1382902&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/EmpiricalDistribution.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/EmpiricalDistribution.java Mon Sep 10 14:47:19 2012
@@ -27,7 +27,6 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.math3.exception.MathIllegalArgumentException;
 import org.apache.commons.math3.exception.MathIllegalStateException;
 import org.apache.commons.math3.exception.NullArgumentException;
 import org.apache.commons.math3.exception.ZeroException;
@@ -188,12 +187,14 @@ public class EmpiricalDistribution imple
      *
      * @param in the input data array
      * @exception NullArgumentException if in is null
+     * @throws MathIllegalStateException if an IOException occurs
      */
-    public void load(double[] in) throws NullArgumentException {
+    public void load(double[] in) throws NullArgumentException, MathIllegalStateException {
         DataAdapter da = new ArrayDataAdapter(in);
         try {
             da.computeStats();
-            fillBinStats(in);
+            // new adapter for the second pass
+            fillBinStats(new ArrayDataAdapter(in));
         } catch (IOException e) {
             throw new MathIllegalStateException(e, LocalizedFormats.SIMPLE_MESSAGE, e.getLocalizedMessage());
         }
@@ -207,8 +208,9 @@ public class EmpiricalDistribution imple
      *
      * @throws IOException if an IO error occurs
      * @throws NullArgumentException if url is null
+     * @throws ZeroException if URL contains no data
      */
-    public void load(URL url) throws IOException, NullArgumentException {
+    public void load(URL url) throws IOException, NullArgumentException, ZeroException {
         MathUtils.checkNotNull(url);
         BufferedReader in =
             new BufferedReader(new InputStreamReader(url.openStream()));
@@ -218,8 +220,9 @@ public class EmpiricalDistribution imple
             if (sampleStats.getN() == 0) {
                 throw new ZeroException(LocalizedFormats.URL_CONTAINS_NO_DATA, url);
             }
+            // new adapter for the second pass
             in = new BufferedReader(new InputStreamReader(url.openStream()));
-            fillBinStats(in);
+            fillBinStats(new StreamDataAdapter(in));
             loaded = true;
         } finally {
            try {
@@ -243,8 +246,9 @@ public class EmpiricalDistribution imple
         try {
             DataAdapter da = new StreamDataAdapter(in);
             da.computeStats();
+            // new adapter for second pass
             in = new BufferedReader(new FileReader(file));
-            fillBinStats(in);
+            fillBinStats(new StreamDataAdapter(in));
             loaded = true;
         } finally {
             try {
@@ -278,33 +282,6 @@ public class EmpiricalDistribution imple
     }
 
     /**
-     * Factory of <code>DataAdapter</code> objects. For every supported source
-     * of data (array of doubles, file, etc.) an instance of the proper object
-     * is returned.
-     */
-    private class DataAdapterFactory{
-        /**
-         * Creates a DataAdapter from a data object
-         *
-         * @param in object providing access to the data
-         * @return DataAdapter instance
-         */
-        public DataAdapter getAdapter(Object in) {
-            if (in instanceof BufferedReader) {
-                BufferedReader inputStream = (BufferedReader) in;
-                return new StreamDataAdapter(inputStream);
-            } else if (in instanceof double[]) {
-                double[] inputArray = (double[]) in;
-                return new ArrayDataAdapter(inputArray);
-            } else {
-                throw new MathIllegalArgumentException(
-                      LocalizedFormats.INPUT_DATA_FROM_UNSUPPORTED_DATASOURCE,
-                      in.getClass().getName(),
-                      BufferedReader.class.getName(), double[].class.getName());
-            }
-        }
-    }
-    /**
      * <code>DataAdapter</code> for data provided through some input stream
      */
     private class StreamDataAdapter extends DataAdapter{
@@ -398,7 +375,8 @@ public class EmpiricalDistribution imple
      * @param in object providing access to the data
      * @throws IOException  if an IO error occurs
      */
-    private void fillBinStats(Object in) throws IOException {
+    private void fillBinStats(final DataAdapter da)
+        throws IOException {
         // Set up grid
         min = sampleStats.getMin();
         max = sampleStats.getMax();
@@ -414,8 +392,6 @@ public class EmpiricalDistribution imple
         }
 
         // Filling data in binStats Array
-        DataAdapterFactory aFactory = new DataAdapterFactory();
-        DataAdapter da = aFactory.getAdapter(in);
         da.computeBinStats();
 
         // Assign upperBounds based on bin counts
@@ -455,7 +431,7 @@ public class EmpiricalDistribution imple
         }
 
         // Start with a uniformly distributed random number in (0,1)
-        double x = randomData.nextUniform(0,1);
+        final double x = randomData.nextUniform(0,1);
 
         // Use this to select the bin and generate a Gaussian within the bin
         for (int i = 0; i < binCount; i++) {
@@ -463,8 +439,8 @@ public class EmpiricalDistribution imple
                SummaryStatistics stats = binStats.get(i);
                if (stats.getN() > 0) {
                    if (stats.getStandardDeviation() > 0) {  // more than one obs
-                        return randomData.nextGaussian
-                            (stats.getMean(),stats.getStandardDeviation());
+                       return randomData.nextGaussian(stats.getMean(),
+                                                      stats.getStandardDeviation());
                    } else {
                        return stats.getMean(); // only one obs in bin
                    }