Repository: commons-rng Updated Branches: refs/heads/master 6ec1d323e -> 71f4e2cd2
RNG-45: Usage example. Project: http://git-wip-us.apache.org/repos/asf/commons-rng/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-rng/commit/71f4e2cd Tree: http://git-wip-us.apache.org/repos/asf/commons-rng/tree/71f4e2cd Diff: http://git-wip-us.apache.org/repos/asf/commons-rng/diff/71f4e2cd Branch: refs/heads/master Commit: 71f4e2cd252b90bb2ab617b4480fd3f73acc8a63 Parents: 6ec1d32 Author: Gilles <[email protected]> Authored: Fri Jan 19 17:04:06 2018 +0100 Committer: Gilles <[email protected]> Committed: Fri Jan 19 17:04:06 2018 +0100 ---------------------------------------------------------------------- .../ProbabilityDensityApproximation.java | 199 +++++++++++++++++++ .../rng/examples/sampling/package-info.java | 27 +++ 2 files changed, 226 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-rng/blob/71f4e2cd/commons-rng-examples/src/main/java/org/apache/commons/rng/examples/sampling/ProbabilityDensityApproximation.java ---------------------------------------------------------------------- diff --git a/commons-rng-examples/src/main/java/org/apache/commons/rng/examples/sampling/ProbabilityDensityApproximation.java b/commons-rng-examples/src/main/java/org/apache/commons/rng/examples/sampling/ProbabilityDensityApproximation.java new file mode 100644 index 0000000..c28c33b --- /dev/null +++ b/commons-rng-examples/src/main/java/org/apache/commons/rng/examples/sampling/ProbabilityDensityApproximation.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.rng.examples.sampling; + +import java.io.PrintWriter; +import java.io.IOException; +import org.apache.commons.rng.UniformRandomProvider; +import org.apache.commons.rng.simple.RandomSource; +import org.apache.commons.rng.sampling.distribution.ZigguratNormalizedGaussianSampler; +import org.apache.commons.rng.sampling.distribution.MarsagliaNormalizedGaussianSampler; +import org.apache.commons.rng.sampling.distribution.BoxMullerNormalizedGaussianSampler; +import org.apache.commons.rng.sampling.distribution.ChengBetaSampler; +import org.apache.commons.rng.sampling.distribution.AhrensDieterExponentialSampler; +import org.apache.commons.rng.sampling.distribution.AhrensDieterMarsagliaTsangGammaSampler; +import org.apache.commons.rng.sampling.distribution.InverseTransformParetoSampler; +import org.apache.commons.rng.sampling.distribution.LogNormalSampler; +import org.apache.commons.rng.sampling.distribution.ContinuousUniformSampler; +import org.apache.commons.rng.sampling.distribution.GaussianSampler; +import org.apache.commons.rng.sampling.distribution.ContinuousSampler; + +/** + * Approximation of the probability density by the histogram of the sampler output. + */ +public class ProbabilityDensityApproximation { + /** Number of (equal-width) bins in the histogram. */ + private final int numBins; + /** Number of samples to be generated. */ + private final long numSamples; + + /** + * Application. + * + * @param numBins Number of "equal-width" bins. + * @param numSamples Number of samples. + */ + private ProbabilityDensityApproximation(int numBins, + long numSamples) { + this.numBins = numBins; + this.numSamples = numSamples; + } + + /** + * @param sampler Sampler. + * @param min Right abscissa of the first bin: every sample smaller + * than that value will increment an additional bin (of infinite width) + * placed before the first "equal-width" bin. + * @param Left abscissa of the last bin: every sample larger than or + * equal to that value will increment an additional bin (of infinite + * width) placed after the last "equal-width" bin. + * @param output Filename. + */ + private void createDensity(ContinuousSampler sampler, + double min, + double max, + String outputFile) + throws IOException { + final double binSize = (max - min) / numBins; + final long[] histogram = new long[numBins]; + + long n = 0; + long belowMin = 0; + long aboveMax = 0; + while (++n < numSamples) { + final double r = sampler.sample(); + + if (r < min) { + ++belowMin; + continue; + } + + if (r >= max) { + ++aboveMax; + continue; + } + + final int binIndex = (int) ((r - min) / binSize); + ++histogram[binIndex]; + } + + final double binHalfSize = 0.5 * binSize; + final double norm = 1 / (binSize * numSamples); + + final PrintWriter out = new PrintWriter(outputFile); + out.println("# Sampler: " + sampler); + out.println("# Number of bins: " + numBins); + out.println("# Min: " + min + " (fraction of samples below: " + (belowMin / (double) numSamples) + ")"); + out.println("# Max: " + max + " (fraction of samples above: " + (aboveMax / (double) numSamples) + ")"); + out.println("# Bin width: " + binSize); + out.println("# Histogram normalization factor: " + norm); + out.println("#"); + out.println("# " + (min - binHalfSize) + " " + (belowMin * norm)); + for (int i = 0; i < numBins; i++) { + out.println((min + (i + 1) * binSize - binHalfSize) + " " + (histogram[i] * norm)); + } + out.println("# " + (max + binHalfSize) + " " + (aboveMax * norm)); + out.close(); + } + + /** + * Program entry point. + * + * @params args Argument. They must be provided, in the following order: + * <ol> + * <li>Number of "equal-width" bins.</li> + * <li>Number of samples.</li> + * </ol> + */ + public static void main(String[] args) + throws IOException { + final int numBins = Integer.valueOf(args[0]); + final long numSamples = Long.valueOf(args[1]); + final ProbabilityDensityApproximation app = new ProbabilityDensityApproximation(numBins, numSamples); + + final UniformRandomProvider rng = RandomSource.create(RandomSource.XOR_SHIFT_1024_S); + + final double gaussMean = 1; + final double gaussSigma = 2; + final double gaussMin = -9; + final double gaussMax = 11; + app.createDensity(new GaussianSampler(new ZigguratNormalizedGaussianSampler(rng), + gaussMean, gaussSigma), + gaussMin, gaussMax, "gauss.ziggurat.txt"); + app.createDensity(new GaussianSampler(new MarsagliaNormalizedGaussianSampler(rng), + gaussMean, gaussSigma), + gaussMin, gaussMax, "gauss.marsaglia.txt"); + app.createDensity(new GaussianSampler(new BoxMullerNormalizedGaussianSampler(rng), + gaussMean, gaussSigma), + gaussMin, gaussMax, "gauss.boxmuller.txt"); + + final double alphaBeta = 4.3; + final double betaBeta = 2.1; + final double betaMin = 0; + final double betaMax = 1; + app.createDensity(new ChengBetaSampler(rng, alphaBeta, betaBeta), + betaMin, betaMax, "beta.case1.txt"); + final double alphaBetaAlt = 0.5678; + final double betaBetaAlt = 0.1234; + app.createDensity(new ChengBetaSampler(rng, alphaBetaAlt, betaBetaAlt), + betaMin, betaMax, "beta.case2.txt"); + + final double meanExp = 3.45; + final double expMin = 0; + final double expMax = 60; + app.createDensity(new AhrensDieterExponentialSampler(rng, meanExp), + expMin, expMax, "exp.txt"); + + final double thetaGammaSmallerThanOne = 0.1234; + final double alphaGamma = 3.456; + final double gammaMin = 0; + final double gammaMax1 = 40; + app.createDensity(new AhrensDieterMarsagliaTsangGammaSampler(rng, alphaGamma, thetaGammaSmallerThanOne), + gammaMin, gammaMax1, "gamma.case1.txt"); + final double thetaGammaLargerThanOne = 2.345; + final double gammaMax2 = 70; + app.createDensity(new AhrensDieterMarsagliaTsangGammaSampler(rng, alphaGamma, thetaGammaLargerThanOne), + gammaMin, gammaMax2, "gamma.case2.txt"); + + final double scalePareto = 23.45; + final double shapePareto = 0.789; + final double paretoMin = 23; + final double paretoMax = 400; + app.createDensity(new InverseTransformParetoSampler(rng, scalePareto, shapePareto), + paretoMin, paretoMax, "pareto.txt"); + + final double loUniform = -9.876; + final double hiUniform = 5.432; + app.createDensity(new ContinuousUniformSampler(rng, loUniform, hiUniform), + loUniform, hiUniform, "uniform.txt"); + + final double scaleLogNormal = 2.345; + final double shapeLogNormal = 0.1234; + final double logNormalMin = 5; + final double logNormalMax = 25; + app.createDensity(new LogNormalSampler(new ZigguratNormalizedGaussianSampler(rng), + scaleLogNormal, shapeLogNormal), + logNormalMin, logNormalMax, "lognormal.ziggurat.txt"); + app.createDensity(new LogNormalSampler(new MarsagliaNormalizedGaussianSampler(rng), + scaleLogNormal, shapeLogNormal), + logNormalMin, logNormalMax, "lognormal.marsaglia.txt"); + app.createDensity(new LogNormalSampler(new BoxMullerNormalizedGaussianSampler(rng), + scaleLogNormal, shapeLogNormal), + logNormalMin, logNormalMax, "lognormal.boxmuller.txt"); + } +} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/71f4e2cd/commons-rng-examples/src/main/java/org/apache/commons/rng/examples/sampling/package-info.java ---------------------------------------------------------------------- diff --git a/commons-rng-examples/src/main/java/org/apache/commons/rng/examples/sampling/package-info.java b/commons-rng-examples/src/main/java/org/apache/commons/rng/examples/sampling/package-info.java new file mode 100644 index 0000000..8f7a268 --- /dev/null +++ b/commons-rng-examples/src/main/java/org/apache/commons/rng/examples/sampling/package-info.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * <h3>Sampling</h3> + * + * <p> + * This package contains usage examples of the samplers provided in the + * <a href="http://commons.apache.org/rng">Commons RNG</a> library. + * </p> + */ + +package org.apache.commons.rng.examples.sampling;
