On 12/14/12 12:58 PM, Gilles Sadowski wrote: > On Fri, Dec 14, 2012 at 12:14:45PM -0800, Phil Steitz wrote: >> On 12/14/12 11:59 AM, Gilles Sadowski wrote: >>> On Fri, Dec 14, 2012 at 10:03:14AM -0800, Phil Steitz wrote: >>>> On 12/14/12 9:43 AM, Phil Steitz wrote: >>>>> On 12/14/12 8:52 AM, Gilles Sadowski wrote: >>>>>> On Fri, Dec 14, 2012 at 04:28:25PM -0000, pste...@apache.org wrote: >>>>>>> Author: psteitz >>>>>>> Date: Fri Dec 14 16:28:23 2012 >>>>>>> New Revision: 1421968 >>>>>>> >>>>>>> URL: http://svn.apache.org/viewvc?rev=1421968&view=rev >>>>>>> Log: >>>>>>> Reverted incompatible changes made in r1420006. >>>>>> I don't understand why you did that. >>>>>> You nullified my changes that fixed (IIUC) the problem while still >>>>>> providing users a smooth upgrade path to using RandomDataGenerator >>>>>> (which it seems was your goal). >>>>> I was basically reverting my original commit, which caused the >>>>> problem. I started with a revert back to before r1420006. Then I >>>>> just added some deprecations. I should not have introduced new >>>>> constructors or RandomDataGenerator at all at this point. >>>> Sorry. Misspoke there. What I meant was I should not have >>>> introduced a constructor using RandomDataGenerator. I *did* >>>> introduce one using RandomGenerator, which is what should be used. >>>> Sorry for the bad communication and somewhat convoluted naming on >>>> this. Hopefully this makes sense. >>> Si, ultimately, there will be neither a "RandomDataImpl" nor a >>> "RandomDataGenerator" (as I suggested in the comments to MATH-915)? >> Right, there will be no *constructor* taking one of those. There >> will be a member variable, constructed from a RandomGenerator, which >> will change from being a RandomDataImpl to a RandomDataGenerator. > I don't understand why "EmpiricalDistribution" would need a > "RandomDataGenerator" at all. That duplicates the "random source" readily > available from the parent class.
RandomDataGenerator extends the capabilities of RandomGenerator and EmpiricalDistribution uses the extended capabilities. > [That was part of my comment to MATH-915.] > The "randomData" field is only actually used in "getNextValue" where the > code could directly use "UniformRealDistribution" and "NormalDistribution" > variables instead (as my overwritten fix was doing). Your version was using RandomDataGenerator / RandomDataImpl instances to do the work. In theory, you could use distribution instances to do this; but this is precisely the kind of use case that RandomDataImpl was created to address - direct access to data generation methods following common parametric distributions. > >> We could make that change now if RandomDataImpl exposed a >> getDelegate method to deliver the wrapped RandomDataGenerator. > It does. That was one of my changes to fix MATH-916. Great. We think alike (sometimes :) Given that, we could s/RandomDataImpl/RandomDataGenerator in the private field. Phil > > Gilles > >> Then the current member variable could be changed to a >> RandomDataGenerator and the (now deprecated) constructor taking a >> RandomDataImpl could convert it. That is a little more work to >> implement and probably not worth the hassle for 3.1 as the member >> field is private. >> >> Phil >>> Gilles >>> >>>> Phil >>>>> I am >>>>> sorry I did a bad job explaining what was going on there. >>>>> Basically, EmpiricalDistibution needs a RandomDataGenerator / >>>>> RandomDataImpl to generate data following certain distributions. >>>>> What should be provided as a constructor argument for this class >>>>> (and ValueServer) is a RandomGenerator, which is the underlying >>>>> source of random data. The RandomDataImpl constructors are really >>>>> legacy, going back to the days before RandomGenerator existed. Does >>>>> this make sense? >>>>> >>>>> Phil >>>>>> Gilles >>>>>> >>>>>>> Fixed javadoc error in EmpiricalDistribution class javadoc. >>>>>>> Deprecated constructors taking RandomDataImpl instances in >>>>>>> EmpiricalDistribution, ValueServer. These constructors predate >>>>>>> RandomGenerator, which should be used directly as the source of random >>>>>>> data for these classes. >>>>>>> >>>>>>> Modified: >>>>>>> >>>>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/EmpiricalDistribution.java >>>>>>> >>>>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/ValueServer.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=1421968&r1=1421967&r2=1421968&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 >>>>>>> Fri Dec 14 16:28:23 2012 >>>>>>> @@ -29,8 +29,8 @@ import java.util.ArrayList; >>>>>>> import java.util.List; >>>>>>> >>>>>>> import org.apache.commons.math3.distribution.AbstractRealDistribution; >>>>>>> -import org.apache.commons.math3.distribution.RealDistribution; >>>>>>> import org.apache.commons.math3.distribution.NormalDistribution; >>>>>>> +import org.apache.commons.math3.distribution.RealDistribution; >>>>>>> import org.apache.commons.math3.exception.MathIllegalStateException; >>>>>>> import org.apache.commons.math3.exception.MathInternalError; >>>>>>> import org.apache.commons.math3.exception.NullArgumentException; >>>>>>> @@ -134,18 +134,14 @@ public class EmpiricalDistribution exten >>>>>>> /** upper bounds of subintervals in (0,1) "belonging" to the bins >>>>>>> */ >>>>>>> private double[] upperBounds = null; >>>>>>> >>>>>>> - /** Data generator. */ >>>>>>> - private final RandomDataGenerator randomDataGen; >>>>>>> - /** >>>>>>> - * XXX Enable backward-compatibility (to be removed in 4.0). >>>>>>> - */ >>>>>>> - private final boolean useRandomDataImpl; >>>>>>> + /** RandomDataImpl instance to use in repeated calls to getNext() >>>>>>> */ >>>>>>> + private final RandomDataImpl randomData; >>>>>>> >>>>>>> /** >>>>>>> * Creates a new EmpiricalDistribution with the default bin count. >>>>>>> */ >>>>>>> public EmpiricalDistribution() { >>>>>>> - this(DEFAULT_BIN_COUNT); >>>>>>> + this(DEFAULT_BIN_COUNT, new RandomDataImpl()); >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> @@ -154,7 +150,7 @@ public class EmpiricalDistribution exten >>>>>>> * @param binCount number of bins >>>>>>> */ >>>>>>> public EmpiricalDistribution(int binCount) { >>>>>>> - this(binCount, (RandomGenerator) null); >>>>>>> + this(binCount, new RandomDataImpl()); >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> @@ -162,82 +158,52 @@ public class EmpiricalDistribution exten >>>>>>> * provided {@link RandomGenerator} as the source of random data. >>>>>>> * >>>>>>> * @param binCount number of bins >>>>>>> - * @param randomData random data generator (may be null, resulting >>>>>>> in a default generator) >>>>>>> - * @deprecated As of 3.1. To be removed in 4.0. Please use >>>>>>> - * {@link #EmpiricalDistribution(int,RandomDataGenerator)} instead. >>>>>>> + * @param generator random data generator (may be null, resulting >>>>>>> in default JDK generator) >>>>>>> + * @since 3.0 >>>>>>> */ >>>>>>> - @Deprecated >>>>>>> - public EmpiricalDistribution(int binCount, RandomDataImpl >>>>>>> randomData) { >>>>>>> + public EmpiricalDistribution(int binCount, RandomGenerator >>>>>>> generator) { >>>>>>> this.binCount = binCount; >>>>>>> - this.randomData = randomData == null ? >>>>>>> - new RandomDataImpl() : >>>>>>> - randomData; >>>>>>> + randomData = new RandomDataImpl(generator); >>>>>>> binStats = new ArrayList<SummaryStatistics>(); >>>>>>> - useRandomDataImpl = true; >>>>>>> - randomDataGen = null; >>>>>>> - } >>>>>>> - /** >>>>>>> - * Creates a new EmpiricalDistribution with the specified bin >>>>>>> count using the >>>>>>> - * provided {@link RandomGenerator} as the source of random data. >>>>>>> - * >>>>>>> - * @param randomData random data generator (may be null, resulting >>>>>>> in a default generator) >>>>>>> - * @deprecated As of 3.1. To be removed in 4.0. Please use >>>>>>> - * {@link #EmpiricalDistribution(RandomDataGenerator)} instead. >>>>>>> - */ >>>>>>> - @Deprecated >>>>>>> - public EmpiricalDistribution(RandomDataImpl randomData) { >>>>>>> - this(DEFAULT_BIN_COUNT, randomData); >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> - * Creates a new EmpiricalDistribution with the specified bin >>>>>>> count using the >>>>>>> - * provided {@link RandomGenerator} as the source of random data. >>>>>>> - * >>>>>>> - * @param binCount number of bins >>>>>>> - * @param randomData random data generator (may be null, resulting >>>>>>> in a default generator) >>>>>>> - */ >>>>>>> - public EmpiricalDistribution(int binCount, RandomDataGenerator >>>>>>> randomData) { >>>>>>> - this.binCount = binCount; >>>>>>> - this.randomDataGen = randomData == null ? >>>>>>> - new RandomDataGenerator() : >>>>>>> - randomData; >>>>>>> - binStats = new ArrayList<SummaryStatistics>(); >>>>>>> - useRandomDataImpl = false; // XXX Remove in 4.0 >>>>>>> - } >>>>>>> - /** >>>>>>> - * Creates a new EmpiricalDistribution with the specified bin >>>>>>> count using the >>>>>>> + * Creates a new EmpiricalDistribution with default bin count >>>>>>> using the >>>>>>> * provided {@link RandomGenerator} as the source of random data. >>>>>>> * >>>>>>> - * @param randomData random data generator (may be null, resulting >>>>>>> in a default generator) >>>>>>> + * @param generator random data generator (may be null, resulting >>>>>>> in default JDK generator) >>>>>>> + * @since 3.0 >>>>>>> */ >>>>>>> - public EmpiricalDistribution(RandomDataGenerator randomData) { >>>>>>> - this(DEFAULT_BIN_COUNT, randomData); >>>>>>> + public EmpiricalDistribution(RandomGenerator generator) { >>>>>>> + this(DEFAULT_BIN_COUNT, generator); >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> * Creates a new EmpiricalDistribution with the specified bin >>>>>>> count using the >>>>>>> - * provided {@link RandomGenerator} as the source of random data. >>>>>>> + * provided {@link RandomDataImpl} instance as the source of >>>>>>> random data. >>>>>>> * >>>>>>> * @param binCount number of bins >>>>>>> - * @param generator random data generator (may be null, resulting >>>>>>> in a default generator) >>>>>>> + * @param randomData random data generator (may be null, resulting >>>>>>> in default JDK generator) >>>>>>> * @since 3.0 >>>>>>> */ >>>>>>> - public EmpiricalDistribution(int binCount, RandomGenerator >>>>>>> generator) { >>>>>>> - this(binCount, new RandomDataGenerator(generator)); >>>>>>> + public EmpiricalDistribution(int binCount, RandomDataImpl >>>>>>> randomData) { >>>>>>> + this.binCount = binCount; >>>>>>> + this.randomData = randomData; >>>>>>> + binStats = new ArrayList<SummaryStatistics>(); >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> * Creates a new EmpiricalDistribution with default bin count >>>>>>> using the >>>>>>> - * provided {@link RandomGenerator} as the source of random data. >>>>>>> + * provided {@link RandomDataImpl} as the source of random data. >>>>>>> * >>>>>>> - * @param generator random data generator (may be null, resulting >>>>>>> in default generator) >>>>>>> + * @param randomData random data generator (may be null, resulting >>>>>>> in default JDK generator) >>>>>>> * @since 3.0 >>>>>>> */ >>>>>>> - public EmpiricalDistribution(RandomGenerator generator) { >>>>>>> - this(DEFAULT_BIN_COUNT, generator); >>>>>>> + public EmpiricalDistribution(RandomDataImpl randomData) { >>>>>>> + this(DEFAULT_BIN_COUNT, randomData); >>>>>>> } >>>>>>> >>>>>>> - /** >>>>>>> + /** >>>>>>> * Computes the empirical distribution from the provided >>>>>>> * array of numbers. >>>>>>> * >>>>>>> @@ -288,7 +254,7 @@ public class EmpiricalDistribution exten >>>>>>> } finally { >>>>>>> try { >>>>>>> in.close(); >>>>>>> - } catch (IOException ex) { // NOPMD >>>>>>> + } catch (IOException ex) { >>>>>>> // ignore >>>>>>> } >>>>>>> } >>>>>>> @@ -320,7 +286,7 @@ public class EmpiricalDistribution exten >>>>>>> } finally { >>>>>>> try { >>>>>>> in.close(); >>>>>>> - } catch (IOException ex) { // NOPMD >>>>>>> + } catch (IOException ex) { >>>>>>> // ignore >>>>>>> } >>>>>>> } >>>>>>> @@ -497,41 +463,22 @@ public class EmpiricalDistribution exten >>>>>>> throw new >>>>>>> MathIllegalStateException(LocalizedFormats.DISTRIBUTION_NOT_LOADED); >>>>>>> } >>>>>>> >>>>>>> - if (useRandomDataImpl) { >>>>>>> - // XXX backward compatibility. >>>>>>> - // Start with a uniformly distributed random number in (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++) { >>>>>>> - if (x <= upperBounds[i]) { >>>>>>> - SummaryStatistics stats = binStats.get(i); >>>>>>> - if (stats.getN() > 0) { >>>>>>> - if (stats.getStandardDeviation() > 0) { // >>>>>>> more than one obs >>>>>>> - return >>>>>>> randomData.nextGaussian(stats.getMean(), >>>>>>> - >>>>>>> stats.getStandardDeviation()); >>>>>>> - } else { >>>>>>> - return stats.getMean(); // only one obs in >>>>>>> bin >>>>>>> - } >>>>>>> - } >>>>>>> - } >>>>>>> - } >>>>>>> - } else { >>>>>>> - // Start with a uniformly distributed random number in (0, >>>>>>> 1) >>>>>>> - final double x = randomDataGen.nextUniform(0, 1); >>>>>>> - // Use this to select the bin and generate a Gaussian >>>>>>> within the bin >>>>>>> - for (int i = 0; i < binCount; i++) { >>>>>>> - if (x <= upperBounds[i]) { >>>>>>> - SummaryStatistics stats = binStats.get(i); >>>>>>> - if (stats.getN() > 0) { >>>>>>> - if (stats.getStandardDeviation() > 0) { // >>>>>>> more than one obs >>>>>>> - return >>>>>>> randomDataGen.nextGaussian(stats.getMean(), >>>>>>> - >>>>>>> stats.getStandardDeviation()); >>>>>>> - } else { >>>>>>> - return stats.getMean(); // only one obs in >>>>>>> bin >>>>>>> - } >>>>>>> - } >>>>>>> - } >>>>>>> - } >>>>>>> + // Start with a uniformly distributed random number in (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++) { >>>>>>> + if (x <= upperBounds[i]) { >>>>>>> + SummaryStatistics stats = binStats.get(i); >>>>>>> + if (stats.getN() > 0) { >>>>>>> + if (stats.getStandardDeviation() > 0) { // more >>>>>>> than one obs >>>>>>> + return randomData.nextGaussian(stats.getMean(), >>>>>>> + >>>>>>> stats.getStandardDeviation()); >>>>>>> + } else { >>>>>>> + return stats.getMean(); // only one obs in bin >>>>>>> + } >>>>>>> + } >>>>>>> + } >>>>>>> } >>>>>>> throw new >>>>>>> MathIllegalStateException(LocalizedFormats.NO_BIN_SELECTED); >>>>>>> } >>>>>>> @@ -624,12 +571,7 @@ public class EmpiricalDistribution exten >>>>>>> * @since 3.0 >>>>>>> */ >>>>>>> public void reSeed(long seed) { >>>>>>> - if (useRandomDataImpl) { >>>>>>> - // XXX backward compatibility. >>>>>>> - randomData.reSeed(seed); >>>>>>> - } else { >>>>>>> - randomDataGen.reSeed(seed); >>>>>>> - } >>>>>>> + randomData.reSeed(seed); >>>>>>> } >>>>>>> >>>>>>> // Distribution methods --------------------------- >>>>>>> @@ -819,7 +761,7 @@ public class EmpiricalDistribution exten >>>>>>> */ >>>>>>> @Override >>>>>>> public void reseedRandomGenerator(long seed) { >>>>>>> - reSeed(seed); >>>>>>> + randomData.reSeed(seed); >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> >>>>>>> Modified: >>>>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/ValueServer.java >>>>>>> URL: >>>>>>> http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/ValueServer.java?rev=1421968&r1=1421967&r2=1421968&view=diff >>>>>>> ============================================================================== >>>>>>> --- >>>>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/ValueServer.java >>>>>>> (original) >>>>>>> +++ >>>>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/ValueServer.java >>>>>>> Fri Dec 14 16:28:23 2012 >>>>>>> @@ -88,35 +88,36 @@ public class ValueServer { >>>>>>> private BufferedReader filePointer = null; >>>>>>> >>>>>>> /** RandomDataImpl to use for random data generation. */ >>>>>>> - private final RandomDataGenerator randomData; >>>>>>> + private final RandomDataImpl randomData; >>>>>>> >>>>>>> // Data generation modes ====================================== >>>>>>> >>>>>>> /** Creates new ValueServer */ >>>>>>> public ValueServer() { >>>>>>> - randomData = new RandomDataGenerator(); >>>>>>> + randomData = new RandomDataImpl(); >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> - * Construct a ValueServer instance using a RandomDataGenerator as >>>>>>> its source >>>>>>> + * Construct a ValueServer instance using a RandomDataImpl as its >>>>>>> source >>>>>>> * of random data. >>>>>>> * >>>>>>> - * @param randomData random data source >>>>>>> + * @param randomData the RandomDataImpl instance used to source >>>>>>> random data >>>>>>> * @since 3.0 >>>>>>> + * @deprecated use {@link #ValueServer(RandomGenerator)} >>>>>>> */ >>>>>>> - public ValueServer(RandomDataGenerator randomData) { >>>>>>> + public ValueServer(RandomDataImpl randomData) { >>>>>>> this.randomData = randomData; >>>>>>> } >>>>>>> + >>>>>>> /** >>>>>>> - * Construct a ValueServer instance using a RandomDataImpl as its >>>>>>> source >>>>>>> + * Construct a ValueServer instance using a RandomGenerator as its >>>>>>> source >>>>>>> * of random data. >>>>>>> * >>>>>>> - * @param randomData random data source >>>>>>> - * @deprecated As of 3.1. Use {@link >>>>>>> #ValueServer(RandomDataGenerator)} instead. >>>>>>> + * @since 3.1 >>>>>>> + * @param generator source of random data >>>>>>> */ >>>>>>> - @Deprecated >>>>>>> - public ValueServer(RandomDataImpl randomData) { >>>>>>> - this(randomData.getDelegate()); >>>>>>> + public ValueServer(RandomGenerator generator) { >>>>>>> + this.randomData = new RandomDataImpl(generator); >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> @@ -288,7 +289,7 @@ public class ValueServer { >>>>>>> try { >>>>>>> filePointer.close(); >>>>>>> filePointer = null; >>>>>>> - } catch (IOException ex) { // NOPMD >>>>>>> + } catch (IOException ex) { >>>>>>> // ignore >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>>>> >>>>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>> For additional commands, e-mail: dev-h...@commons.apache.org >>> >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> For additional commands, e-mail: dev-h...@commons.apache.org >> > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org