http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/main/java/org/apache/commons/math4/distribution/TriangularDistribution.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math4/distribution/TriangularDistribution.java b/src/main/java/org/apache/commons/math4/distribution/TriangularDistribution.java deleted file mode 100644 index 4013c47..0000000 --- a/src/main/java/org/apache/commons/math4/distribution/TriangularDistribution.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * 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.math4.distribution; - -import org.apache.commons.math4.exception.NumberIsTooLargeException; -import org.apache.commons.math4.exception.NumberIsTooSmallException; -import org.apache.commons.math4.exception.OutOfRangeException; -import org.apache.commons.math4.exception.util.LocalizedFormats; -import org.apache.commons.math4.util.FastMath; - -/** - * Implementation of the triangular real distribution. - * - * @see <a href="http://en.wikipedia.org/wiki/Triangular_distribution"> - * Triangular distribution (Wikipedia)</a> - * - * @since 3.0 - */ -public class TriangularDistribution extends AbstractRealDistribution { - /** Serializable version identifier. */ - private static final long serialVersionUID = 20160311L; - /** Lower limit of this distribution (inclusive). */ - private final double a; - /** Upper limit of this distribution (inclusive). */ - private final double b; - /** Mode of this distribution. */ - private final double c; - /** Inverse cumulative probability accuracy. */ - private final double solverAbsoluteAccuracy; - - /** - * Creates a distribution. - * - * @param a Lower limit of this distribution (inclusive). - * @param b Upper limit of this distribution (inclusive). - * @param c Mode of this distribution. - * @throws NumberIsTooLargeException if {@code a >= b} or if {@code c > b}. - * @throws NumberIsTooSmallException if {@code c < a}. - * @since 3.1 - */ - public TriangularDistribution(double a, - double c, - double b) - throws NumberIsTooLargeException, - NumberIsTooSmallException { - if (a >= b) { - throw new NumberIsTooLargeException( - LocalizedFormats.LOWER_BOUND_NOT_BELOW_UPPER_BOUND, - a, b, false); - } - if (c < a) { - throw new NumberIsTooSmallException( - LocalizedFormats.NUMBER_TOO_SMALL, c, a, true); - } - if (c > b) { - throw new NumberIsTooLargeException( - LocalizedFormats.NUMBER_TOO_LARGE, c, b, true); - } - - this.a = a; - this.c = c; - this.b = b; - solverAbsoluteAccuracy = FastMath.max(FastMath.ulp(a), FastMath.ulp(b)); - } - - /** - * Returns the mode {@code c} of this distribution. - * - * @return the mode {@code c} of this distribution - */ - public double getMode() { - return c; - } - - /** - * {@inheritDoc} - * - * <p> - * For this distribution, the returned value is not really meaningful, - * since exact formulas are implemented for the computation of the - * {@link #inverseCumulativeProbability(double)} (no solver is invoked). - * </p> - * <p> - * For lower limit {@code a} and upper limit {@code b}, the current - * implementation returns {@code max(ulp(a), ulp(b)}. - * </p> - */ - @Override - protected double getSolverAbsoluteAccuracy() { - return solverAbsoluteAccuracy; - } - - /** - * {@inheritDoc} - * - * For lower limit {@code a}, upper limit {@code b} and mode {@code c}, the - * PDF is given by - * <ul> - * <li>{@code 2 * (x - a) / [(b - a) * (c - a)]} if {@code a <= x < c},</li> - * <li>{@code 2 / (b - a)} if {@code x = c},</li> - * <li>{@code 2 * (b - x) / [(b - a) * (b - c)]} if {@code c < x <= b},</li> - * <li>{@code 0} otherwise. - * </ul> - */ - @Override - public double density(double x) { - if (x < a) { - return 0; - } - if (a <= x && x < c) { - double divident = 2 * (x - a); - double divisor = (b - a) * (c - a); - return divident / divisor; - } - if (x == c) { - return 2 / (b - a); - } - if (c < x && x <= b) { - double divident = 2 * (b - x); - double divisor = (b - a) * (b - c); - return divident / divisor; - } - return 0; - } - - /** - * {@inheritDoc} - * - * For lower limit {@code a}, upper limit {@code b} and mode {@code c}, the - * CDF is given by - * <ul> - * <li>{@code 0} if {@code x < a},</li> - * <li>{@code (x - a)^2 / [(b - a) * (c - a)]} if {@code a <= x < c},</li> - * <li>{@code (c - a) / (b - a)} if {@code x = c},</li> - * <li>{@code 1 - (b - x)^2 / [(b - a) * (b - c)]} if {@code c < x <= b},</li> - * <li>{@code 1} if {@code x > b}.</li> - * </ul> - */ - @Override - public double cumulativeProbability(double x) { - if (x < a) { - return 0; - } - if (a <= x && x < c) { - double divident = (x - a) * (x - a); - double divisor = (b - a) * (c - a); - return divident / divisor; - } - if (x == c) { - return (c - a) / (b - a); - } - if (c < x && x <= b) { - double divident = (b - x) * (b - x); - double divisor = (b - a) * (b - c); - return 1 - (divident / divisor); - } - return 1; - } - - /** - * {@inheritDoc} - * - * For lower limit {@code a}, upper limit {@code b}, and mode {@code c}, - * the mean is {@code (a + b + c) / 3}. - */ - @Override - public double getNumericalMean() { - return (a + b + c) / 3; - } - - /** - * {@inheritDoc} - * - * For lower limit {@code a}, upper limit {@code b}, and mode {@code c}, - * the variance is {@code (a^2 + b^2 + c^2 - a * b - a * c - b * c) / 18}. - */ - @Override - public double getNumericalVariance() { - return (a * a + b * b + c * c - a * b - a * c - b * c) / 18; - } - - /** - * {@inheritDoc} - * - * The lower bound of the support is equal to the lower limit parameter - * {@code a} of the distribution. - * - * @return lower bound of the support - */ - @Override - public double getSupportLowerBound() { - return a; - } - - /** - * {@inheritDoc} - * - * The upper bound of the support is equal to the upper limit parameter - * {@code b} of the distribution. - * - * @return upper bound of the support - */ - @Override - public double getSupportUpperBound() { - return b; - } - - /** - * {@inheritDoc} - * - * The support of this distribution is connected. - * - * @return {@code true} - */ - @Override - public boolean isSupportConnected() { - return true; - } - - /** {@inheritDoc} */ - @Override - public double inverseCumulativeProbability(double p) - throws OutOfRangeException { - if (p < 0 || p > 1) { - throw new OutOfRangeException(p, 0, 1); - } - if (p == 0) { - return a; - } - if (p == 1) { - return b; - } - if (p < (c - a) / (b - a)) { - return a + FastMath.sqrt(p * (b - a) * (c - a)); - } - return b - FastMath.sqrt((1 - p) * (b - a) * (b - c)); - } -}
http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/main/java/org/apache/commons/math4/distribution/UniformIntegerDistribution.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math4/distribution/UniformIntegerDistribution.java b/src/main/java/org/apache/commons/math4/distribution/UniformIntegerDistribution.java deleted file mode 100644 index 83ab4f2..0000000 --- a/src/main/java/org/apache/commons/math4/distribution/UniformIntegerDistribution.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * 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.math4.distribution; - -import org.apache.commons.math4.exception.NumberIsTooLargeException; -import org.apache.commons.math4.exception.util.LocalizedFormats; -import org.apache.commons.rng.UniformRandomProvider; -import org.apache.commons.rng.sampling.distribution.DiscreteSampler; -import org.apache.commons.rng.sampling.distribution.DiscreteUniformSampler; - -/** - * Implementation of the <a href="http://en.wikipedia.org/wiki/Uniform_distribution_(discrete)"> - * uniform integer distribution</a>. - * - * @since 3.0 - */ -public class UniformIntegerDistribution extends AbstractIntegerDistribution { - /** Serializable version identifier. */ - private static final long serialVersionUID = 20160308L; - /** Lower bound (inclusive) of this distribution. */ - private final int lower; - /** Upper bound (inclusive) of this distribution. */ - private final int upper; - /** "upper" + "lower" (to avoid overflow). */ - private final double upperPlusLower; - /** "upper" - "lower" (to avoid overflow). */ - private final double upperMinusLower; - - /** - * Creates a new uniform integer distribution using the given lower and - * upper bounds (both inclusive). - * - * @param lower Lower bound (inclusive) of this distribution. - * @param upper Upper bound (inclusive) of this distribution. - * @throws NumberIsTooLargeException if {@code lower > upper}. - */ - public UniformIntegerDistribution(int lower, - int upper) - throws NumberIsTooLargeException { - if (lower > upper) { - throw new NumberIsTooLargeException( - LocalizedFormats.LOWER_BOUND_NOT_BELOW_UPPER_BOUND, - lower, upper, true); - } - this.lower = lower; - this.upper = upper; - upperPlusLower = (double) upper + (double) lower; - upperMinusLower = (double) upper - (double) lower; - } - - /** {@inheritDoc} */ - @Override - public double probability(int x) { - if (x < lower || x > upper) { - return 0; - } - return 1.0 / (upperMinusLower + 1); - } - - /** {@inheritDoc} */ - @Override - public double cumulativeProbability(int x) { - if (x < lower) { - return 0; - } - if (x > upper) { - return 1; - } - return (x - lower + 1.0) / (upperMinusLower + 1.0); - } - - /** - * {@inheritDoc} - * - * For lower bound {@code lower} and upper bound {@code upper}, the mean is - * {@code 0.5 * (lower + upper)}. - */ - @Override - public double getNumericalMean() { - return 0.5 * upperPlusLower; - } - - /** - * {@inheritDoc} - * - * For lower bound {@code lower} and upper bound {@code upper}, and - * {@code n = upper - lower + 1}, the variance is {@code (n^2 - 1) / 12}. - */ - @Override - public double getNumericalVariance() { - double n = upperMinusLower + 1; - return (n * n - 1) / 12.0; - } - - /** - * {@inheritDoc} - * - * The lower bound of the support is equal to the lower bound parameter - * of the distribution. - * - * @return lower bound of the support - */ - @Override - public int getSupportLowerBound() { - return lower; - } - - /** - * {@inheritDoc} - * - * The upper bound of the support is equal to the upper bound parameter - * of the distribution. - * - * @return upper bound of the support - */ - @Override - public int getSupportUpperBound() { - return upper; - } - - /** - * {@inheritDoc} - * - * The support of this distribution is connected. - * - * @return {@code true} - */ - @Override - public boolean isSupportConnected() { - return true; - } - - /**{@inheritDoc} */ - @Override - public IntegerDistribution.Sampler createSampler(final UniformRandomProvider rng) { - return new IntegerDistribution.Sampler() { - /** - * Discrete uniform distribution sampler. - */ - private final DiscreteSampler sampler = - new DiscreteUniformSampler(rng, lower, upper); - - /**{@inheritDoc} */ - @Override - public int sample() { - return sampler.sample(); - } - }; - } -} http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/main/java/org/apache/commons/math4/distribution/UniformRealDistribution.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math4/distribution/UniformRealDistribution.java b/src/main/java/org/apache/commons/math4/distribution/UniformRealDistribution.java deleted file mode 100644 index be033e3..0000000 --- a/src/main/java/org/apache/commons/math4/distribution/UniformRealDistribution.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * 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.math4.distribution; - -import org.apache.commons.math4.exception.NumberIsTooLargeException; -import org.apache.commons.math4.exception.OutOfRangeException; -import org.apache.commons.math4.exception.util.LocalizedFormats; -import org.apache.commons.rng.UniformRandomProvider; -import org.apache.commons.rng.sampling.distribution.ContinuousSampler; -import org.apache.commons.rng.sampling.distribution.ContinuousUniformSampler; - -/** - * Implementation of the uniform real distribution. - * - * @see <a href="http://en.wikipedia.org/wiki/Uniform_distribution_(continuous)" - * >Uniform distribution (continuous), at Wikipedia</a> - * - * @since 3.0 - */ -public class UniformRealDistribution extends AbstractRealDistribution { - /** Serializable version identifier. */ - private static final long serialVersionUID = 20160311L; - /** Lower bound of this distribution (inclusive). */ - private final double lower; - /** Upper bound of this distribution (exclusive). */ - private final double upper; - - /** - * Create a standard uniform real distribution with lower bound (inclusive) - * equal to zero and upper bound (exclusive) equal to one. - */ - public UniformRealDistribution() { - this(0, 1); - } - - /** - * Creates a uniform distribution. - * - * @param lower Lower bound of this distribution (inclusive). - * @param upper Upper bound of this distribution (exclusive). - * @throws NumberIsTooLargeException if {@code lower >= upper}. - */ - public UniformRealDistribution(double lower, - double upper) - throws NumberIsTooLargeException { - if (lower >= upper) { - throw new NumberIsTooLargeException( - LocalizedFormats.LOWER_BOUND_NOT_BELOW_UPPER_BOUND, - lower, upper, false); - } - - this.lower = lower; - this.upper = upper; - } - - /** {@inheritDoc} */ - @Override - public double density(double x) { - if (x < lower || x > upper) { - return 0.0; - } - return 1 / (upper - lower); - } - - /** {@inheritDoc} */ - @Override - public double cumulativeProbability(double x) { - if (x <= lower) { - return 0; - } - if (x >= upper) { - return 1; - } - return (x - lower) / (upper - lower); - } - - /** {@inheritDoc} */ - @Override - public double inverseCumulativeProbability(final double p) - throws OutOfRangeException { - if (p < 0.0 || p > 1.0) { - throw new OutOfRangeException(p, 0, 1); - } - return p * (upper - lower) + lower; - } - - /** - * {@inheritDoc} - * - * For lower bound {@code lower} and upper bound {@code upper}, the mean is - * {@code 0.5 * (lower + upper)}. - */ - @Override - public double getNumericalMean() { - return 0.5 * (lower + upper); - } - - /** - * {@inheritDoc} - * - * For lower bound {@code lower} and upper bound {@code upper}, the - * variance is {@code (upper - lower)^2 / 12}. - */ - @Override - public double getNumericalVariance() { - double ul = upper - lower; - return ul * ul / 12; - } - - /** - * {@inheritDoc} - * - * The lower bound of the support is equal to the lower bound parameter - * of the distribution. - * - * @return lower bound of the support - */ - @Override - public double getSupportLowerBound() { - return lower; - } - - /** - * {@inheritDoc} - * - * The upper bound of the support is equal to the upper bound parameter - * of the distribution. - * - * @return upper bound of the support - */ - @Override - public double getSupportUpperBound() { - return upper; - } - - /** - * {@inheritDoc} - * - * The support of this distribution is connected. - * - * @return {@code true} - */ - @Override - public boolean isSupportConnected() { - return true; - } - - /** {@inheritDoc} */ - @Override - public RealDistribution.Sampler createSampler(final UniformRandomProvider rng) { - return new RealDistribution.Sampler() { - /** - * Uniform distribution sampler. - */ - private final ContinuousSampler sampler = - new ContinuousUniformSampler(rng, lower, upper); - - /**{@inheritDoc} */ - @Override - public double sample() { - return sampler.sample(); - } - }; - } -} http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/main/java/org/apache/commons/math4/distribution/WeibullDistribution.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math4/distribution/WeibullDistribution.java b/src/main/java/org/apache/commons/math4/distribution/WeibullDistribution.java deleted file mode 100644 index e0a9dbb..0000000 --- a/src/main/java/org/apache/commons/math4/distribution/WeibullDistribution.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * 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.math4.distribution; - -import org.apache.commons.math4.exception.NotStrictlyPositiveException; -import org.apache.commons.math4.exception.OutOfRangeException; -import org.apache.commons.math4.exception.util.LocalizedFormats; -import org.apache.commons.numbers.gamma.LogGamma; -import org.apache.commons.math4.util.FastMath; - -/** - * Implementation of the Weibull distribution. This implementation uses the - * two parameter form of the distribution defined by - * <a href="http://mathworld.wolfram.com/WeibullDistribution.html"> - * Weibull Distribution</a>, equations (1) and (2). - * - * @see <a href="http://en.wikipedia.org/wiki/Weibull_distribution">Weibull distribution (Wikipedia)</a> - * @see <a href="http://mathworld.wolfram.com/WeibullDistribution.html">Weibull distribution (MathWorld)</a> - * - * @since 1.1 - */ -public class WeibullDistribution extends AbstractRealDistribution { - /** - * Default inverse cumulative probability accuracy. - * @since 2.1 - */ - public static final double DEFAULT_INVERSE_ABSOLUTE_ACCURACY = 1e-9; - /** Serializable version identifier. */ - private static final long serialVersionUID = 20160311L; - /** The shape parameter. */ - private final double shape; - /** The scale parameter. */ - private final double scale; - /** Inverse cumulative probability accuracy. */ - private final double solverAbsoluteAccuracy; - /** Cached numerical mean */ - private double numericalMean = Double.NaN; - /** Whether or not the numerical mean has been calculated */ - private boolean numericalMeanIsCalculated = false; - /** Cached numerical variance */ - private double numericalVariance = Double.NaN; - /** Whether or not the numerical variance has been calculated */ - private boolean numericalVarianceIsCalculated = false; - - /** - * Creates a distribution. - * - * @param alpha Shape parameter. - * @param beta Scale parameter. - * @throws NotStrictlyPositiveException if {@code alpha <= 0} or - * {@code beta <= 0}. - */ - public WeibullDistribution(double alpha, double beta) - throws NotStrictlyPositiveException { - this(alpha, beta, DEFAULT_INVERSE_ABSOLUTE_ACCURACY); - } - - /** - * Creates a distribution. - * - * @param alpha Shape parameter. - * @param beta Scale parameter. - * @param inverseCumAccuracy Maximum absolute error in inverse - * cumulative probability estimates - * (defaults to {@link #DEFAULT_INVERSE_ABSOLUTE_ACCURACY}). - * @throws NotStrictlyPositiveException if {@code alpha <= 0} or {@code beta <= 0}. - */ - public WeibullDistribution(double alpha, - double beta, - double inverseCumAccuracy) - throws NotStrictlyPositiveException { - if (alpha <= 0) { - throw new NotStrictlyPositiveException(LocalizedFormats.SHAPE, - alpha); - } - if (beta <= 0) { - throw new NotStrictlyPositiveException(LocalizedFormats.SCALE, - beta); - } - scale = beta; - shape = alpha; - solverAbsoluteAccuracy = inverseCumAccuracy; - } - - /** - * Access the shape parameter, {@code alpha}. - * - * @return the shape parameter, {@code alpha}. - */ - public double getShape() { - return shape; - } - - /** - * Access the scale parameter, {@code beta}. - * - * @return the scale parameter, {@code beta}. - */ - public double getScale() { - return scale; - } - - /** {@inheritDoc} */ - @Override - public double density(double x) { - if (x < 0) { - return 0; - } - - final double xscale = x / scale; - final double xscalepow = FastMath.pow(xscale, shape - 1); - - /* - * FastMath.pow(x / scale, shape) = - * FastMath.pow(xscale, shape) = - * FastMath.pow(xscale, shape - 1) * xscale - */ - final double xscalepowshape = xscalepow * xscale; - - return (shape / scale) * xscalepow * FastMath.exp(-xscalepowshape); - } - - /** {@inheritDoc} */ - @Override - public double logDensity(double x) { - if (x < 0) { - return Double.NEGATIVE_INFINITY; - } - - final double xscale = x / scale; - final double logxscalepow = FastMath.log(xscale) * (shape - 1); - - /* - * FastMath.pow(x / scale, shape) = - * FastMath.pow(xscale, shape) = - * FastMath.pow(xscale, shape - 1) * xscale - */ - final double xscalepowshape = FastMath.exp(logxscalepow) * xscale; - - return FastMath.log(shape / scale) + logxscalepow - xscalepowshape; - } - - /** {@inheritDoc} */ - @Override - public double cumulativeProbability(double x) { - double ret; - if (x <= 0.0) { - ret = 0.0; - } else { - ret = 1.0 - FastMath.exp(-FastMath.pow(x / scale, shape)); - } - return ret; - } - - /** - * {@inheritDoc} - * - * Returns {@code 0} when {@code p == 0} and - * {@code Double.POSITIVE_INFINITY} when {@code p == 1}. - */ - @Override - public double inverseCumulativeProbability(double p) { - double ret; - if (p < 0.0 || p > 1.0) { - throw new OutOfRangeException(p, 0.0, 1.0); - } else if (p == 0) { - ret = 0.0; - } else if (p == 1) { - ret = Double.POSITIVE_INFINITY; - } else { - ret = scale * FastMath.pow(-FastMath.log1p(-p), 1.0 / shape); - } - return ret; - } - - /** - * Return the absolute accuracy setting of the solver used to estimate - * inverse cumulative probabilities. - * - * @return the solver absolute accuracy. - * @since 2.1 - */ - @Override - protected double getSolverAbsoluteAccuracy() { - return solverAbsoluteAccuracy; - } - - /** - * {@inheritDoc} - * - * The mean is {@code scale * Gamma(1 + (1 / shape))}, where {@code Gamma()} - * is the Gamma-function. - */ - @Override - public double getNumericalMean() { - if (!numericalMeanIsCalculated) { - numericalMean = calculateNumericalMean(); - numericalMeanIsCalculated = true; - } - return numericalMean; - } - - /** - * used by {@link #getNumericalMean()} - * - * @return the mean of this distribution - */ - protected double calculateNumericalMean() { - final double sh = getShape(); - final double sc = getScale(); - - return sc * FastMath.exp(LogGamma.value(1 + (1 / sh))); - } - - /** - * {@inheritDoc} - * - * The variance is {@code scale^2 * Gamma(1 + (2 / shape)) - mean^2} - * where {@code Gamma()} is the Gamma-function. - */ - @Override - public double getNumericalVariance() { - if (!numericalVarianceIsCalculated) { - numericalVariance = calculateNumericalVariance(); - numericalVarianceIsCalculated = true; - } - return numericalVariance; - } - - /** - * used by {@link #getNumericalVariance()} - * - * @return the variance of this distribution - */ - protected double calculateNumericalVariance() { - final double sh = getShape(); - final double sc = getScale(); - final double mn = getNumericalMean(); - - return (sc * sc) * FastMath.exp(LogGamma.value(1 + (2 / sh))) - - (mn * mn); - } - - /** - * {@inheritDoc} - * - * The lower bound of the support is always 0 no matter the parameters. - * - * @return lower bound of the support (always 0) - */ - @Override - public double getSupportLowerBound() { - return 0; - } - - /** - * {@inheritDoc} - * - * The upper bound of the support is always positive infinity - * no matter the parameters. - * - * @return upper bound of the support (always - * {@code Double.POSITIVE_INFINITY}) - */ - @Override - public double getSupportUpperBound() { - return Double.POSITIVE_INFINITY; - } - - /** - * {@inheritDoc} - * - * The support of this distribution is connected. - * - * @return {@code true} - */ - @Override - public boolean isSupportConnected() { - return true; - } -} - http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/main/java/org/apache/commons/math4/distribution/ZipfDistribution.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/math4/distribution/ZipfDistribution.java b/src/main/java/org/apache/commons/math4/distribution/ZipfDistribution.java deleted file mode 100644 index 17a95c2..0000000 --- a/src/main/java/org/apache/commons/math4/distribution/ZipfDistribution.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * 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.math4.distribution; - -import org.apache.commons.math4.exception.NotStrictlyPositiveException; -import org.apache.commons.math4.exception.util.LocalizedFormats; -import org.apache.commons.math4.util.FastMath; -import org.apache.commons.rng.UniformRandomProvider; -import org.apache.commons.rng.sampling.distribution.DiscreteSampler; -import org.apache.commons.rng.sampling.distribution.RejectionInversionZipfSampler; - -/** - * Implementation of the Zipf distribution. - * <p> - * <strong>Parameters:</strong> - * For a random variable {@code X} whose values are distributed according to this - * distribution, the probability mass function is given by - * <pre> - * P(X = k) = H(N,s) * 1 / k^s for {@code k = 1,2,...,N}. - * </pre> - * {@code H(N,s)} is the normalizing constant - * which corresponds to the generalized harmonic number of order N of s. - * <ul> - * <li>{@code N} is the number of elements</li> - * <li>{@code s} is the exponent</li> - * </ul> - * @see <a href="https://en.wikipedia.org/wiki/Zipf's_law">Zipf's law (Wikipedia)</a> - * @see <a href="https://en.wikipedia.org/wiki/Harmonic_number#Generalized_harmonic_numbers">Generalized harmonic numbers</a> - */ -public class ZipfDistribution extends AbstractIntegerDistribution { - /** Serializable version identifier. */ - private static final long serialVersionUID = 20150501L; - /** Number of elements. */ - private final int numberOfElements; - /** Exponent parameter of the distribution. */ - private final double exponent; - /** Cached values of the nth generalized harmonic. */ - private final double nthHarmonic; - /** Cached numerical mean */ - private double numericalMean = Double.NaN; - /** Whether or not the numerical mean has been calculated */ - private boolean numericalMeanIsCalculated = false; - /** Cached numerical variance */ - private double numericalVariance = Double.NaN; - /** Whether or not the numerical variance has been calculated */ - private boolean numericalVarianceIsCalculated = false; - - /** - * Creates a distribution. - * - * @param numberOfElements Number of elements. - * @param exponent Exponent. - * @exception NotStrictlyPositiveException if {@code numberOfElements <= 0} - * or {@code exponent <= 0}. - */ - public ZipfDistribution(int numberOfElements, - double exponent) - throws NotStrictlyPositiveException { - if (numberOfElements <= 0) { - throw new NotStrictlyPositiveException(LocalizedFormats.DIMENSION, - numberOfElements); - } - if (exponent <= 0) { - throw new NotStrictlyPositiveException(LocalizedFormats.EXPONENT, - exponent); - } - - this.numberOfElements = numberOfElements; - this.exponent = exponent; - this.nthHarmonic = generalizedHarmonic(numberOfElements, exponent); - } - - /** - * Get the number of elements (e.g. corpus size) for the distribution. - * - * @return the number of elements - */ - public int getNumberOfElements() { - return numberOfElements; - } - - /** - * Get the exponent characterizing the distribution. - * - * @return the exponent - */ - public double getExponent() { - return exponent; - } - - /** {@inheritDoc} */ - @Override - public double probability(final int x) { - if (x <= 0 || x > numberOfElements) { - return 0.0; - } - - return (1.0 / FastMath.pow(x, exponent)) / nthHarmonic; - } - - /** {@inheritDoc} */ - @Override - public double logProbability(int x) { - if (x <= 0 || x > numberOfElements) { - return Double.NEGATIVE_INFINITY; - } - - return -FastMath.log(x) * exponent - FastMath.log(nthHarmonic); - } - - /** {@inheritDoc} */ - @Override - public double cumulativeProbability(final int x) { - if (x <= 0) { - return 0.0; - } else if (x >= numberOfElements) { - return 1.0; - } - - return generalizedHarmonic(x, exponent) / nthHarmonic; - } - - /** - * {@inheritDoc} - * - * For number of elements {@code N} and exponent {@code s}, the mean is - * {@code Hs1 / Hs}, where - * <ul> - * <li>{@code Hs1 = generalizedHarmonic(N, s - 1)},</li> - * <li>{@code Hs = generalizedHarmonic(N, s)}.</li> - * </ul> - */ - @Override - public double getNumericalMean() { - if (!numericalMeanIsCalculated) { - numericalMean = calculateNumericalMean(); - numericalMeanIsCalculated = true; - } - return numericalMean; - } - - /** - * Used by {@link #getNumericalMean()}. - * - * @return the mean of this distribution - */ - protected double calculateNumericalMean() { - final int N = getNumberOfElements(); - final double s = getExponent(); - - final double Hs1 = generalizedHarmonic(N, s - 1); - final double Hs = nthHarmonic; - - return Hs1 / Hs; - } - - /** - * {@inheritDoc} - * - * For number of elements {@code N} and exponent {@code s}, the mean is - * {@code (Hs2 / Hs) - (Hs1^2 / Hs^2)}, where - * <ul> - * <li>{@code Hs2 = generalizedHarmonic(N, s - 2)},</li> - * <li>{@code Hs1 = generalizedHarmonic(N, s - 1)},</li> - * <li>{@code Hs = generalizedHarmonic(N, s)}.</li> - * </ul> - */ - @Override - public double getNumericalVariance() { - if (!numericalVarianceIsCalculated) { - numericalVariance = calculateNumericalVariance(); - numericalVarianceIsCalculated = true; - } - return numericalVariance; - } - - /** - * Used by {@link #getNumericalVariance()}. - * - * @return the variance of this distribution - */ - protected double calculateNumericalVariance() { - final int N = getNumberOfElements(); - final double s = getExponent(); - - final double Hs2 = generalizedHarmonic(N, s - 2); - final double Hs1 = generalizedHarmonic(N, s - 1); - final double Hs = nthHarmonic; - - return (Hs2 / Hs) - ((Hs1 * Hs1) / (Hs * Hs)); - } - - /** - * Calculates the Nth generalized harmonic number. See - * <a href="http://mathworld.wolfram.com/HarmonicSeries.html">Harmonic - * Series</a>. - * - * @param n Term in the series to calculate (must be larger than 1) - * @param m Exponent (special case {@code m = 1} is the harmonic series). - * @return the n<sup>th</sup> generalized harmonic number. - */ - private double generalizedHarmonic(final int n, final double m) { - double value = 0; - for (int k = n; k > 0; --k) { - value += 1.0 / FastMath.pow(k, m); - } - return value; - } - - /** - * {@inheritDoc} - * - * The lower bound of the support is always 1 no matter the parameters. - * - * @return lower bound of the support (always 1) - */ - @Override - public int getSupportLowerBound() { - return 1; - } - - /** - * {@inheritDoc} - * - * The upper bound of the support is the number of elements. - * - * @return upper bound of the support - */ - @Override - public int getSupportUpperBound() { - return getNumberOfElements(); - } - - /** - * {@inheritDoc} - * - * The support of this distribution is connected. - * - * @return {@code true} - */ - @Override - public boolean isSupportConnected() { - return true; - } - - /**{@inheritDoc} */ - @Override - public IntegerDistribution.Sampler createSampler(final UniformRandomProvider rng) { - return new IntegerDistribution.Sampler() { - /** - * Zipf distribution sampler. - */ - private final DiscreteSampler sampler = - new RejectionInversionZipfSampler(rng, numberOfElements, exponent); - - /**{@inheritDoc} */ - @Override - public int sample() { - return sampler.sample(); - } - }; - } -} http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/test/java/org/apache/commons/math4/distribution/BetaDistributionTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/distribution/BetaDistributionTest.java b/src/test/java/org/apache/commons/math4/distribution/BetaDistributionTest.java deleted file mode 100644 index bcf5865..0000000 --- a/src/test/java/org/apache/commons/math4/distribution/BetaDistributionTest.java +++ /dev/null @@ -1,386 +0,0 @@ -/* - * 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.math4.distribution; - -import java.util.Arrays; - -import org.apache.commons.statistics.distribution.ContinuousDistribution; -import org.apache.commons.rng.simple.RandomSource; -import org.apache.commons.rng.UniformRandomProvider; -import org.apache.commons.math4.stat.StatUtils; -import org.apache.commons.math4.stat.inference.KolmogorovSmirnovTest; -import org.apache.commons.math4.stat.inference.InferenceTestUtils; -import org.junit.Assert; -import org.junit.Test; - -public class BetaDistributionTest { - - static final double[] alphaBetas = {0.1, 1, 10, 100, 1000}; - static final double epsilon = StatUtils.min(alphaBetas); - - @Test - public void testCumulative() { - double[] x = new double[]{-0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1}; - // all test data computed using R 2.5 - checkCumulative(0.1, 0.1, - x, new double[]{ - 0.0000000000, 0.0000000000, 0.4063850939, 0.4397091902, 0.4628041861, - 0.4821200456, 0.5000000000, 0.5178799544, 0.5371958139, 0.5602908098, - 0.5936149061, 1.0000000000, 1.0000000000}); - checkCumulative(0.1, 0.5, - x, new double[]{ - 0.0000000000, 0.0000000000, 0.7048336221, 0.7593042194, 0.7951765304, - 0.8234948385, 0.8480017124, 0.8706034370, 0.8926585878, 0.9156406404, - 0.9423662883, 1.0000000000, 1.0000000000}); - checkCumulative(0.1, 1.0, - x, new double[]{ - 0.0000000000, 0.0000000000, 0.7943282347, 0.8513399225, 0.8865681506, - 0.9124435366, 0.9330329915, 0.9502002165, 0.9649610951, 0.9779327685, - 0.9895192582, 1.0000000000, 1.0000000000}); - checkCumulative(0.1, 2.0, - x, new double[]{ - 0.0000000000, 0.0000000000, 0.8658177758, 0.9194471163, 0.9486279211, - 0.9671901487, 0.9796846411, 0.9882082252, 0.9939099280, 0.9974914239, - 0.9994144508, 1.0000000000, 1.0000000000}); - checkCumulative(0.1, 4.0, - x, new double[]{ - 0.0000000000, 0.0000000000, 0.9234991121, 0.9661958941, 0.9842285085, - 0.9928444112, 0.9970040660, 0.9989112804, 0.9996895625, 0.9999440793, - 0.9999967829, 1.0000000000, 1.0000000000}); - checkCumulative(0.5, 0.1, - x, new double[]{ - 0.00000000000, 0.00000000000, 0.05763371168, 0.08435935962, - 0.10734141216, 0.12939656302, 0.15199828760, 0.17650516146, - 0.20482346963, 0.24069578055, 0.29516637795, 1.00000000000, 1.00000000000}); - - checkCumulative(0.5, 0.5, - x, new double[]{ - 0.0000000000, 0.0000000000, 0.2048327647, 0.2951672353, 0.3690101196, - 0.4359057832, 0.5000000000, 0.5640942168, 0.6309898804, 0.7048327647, - 0.7951672353, 1.0000000000, 1.0000000000}); - checkCumulative(0.5, 1.0, - x, new double[]{ - 0.0000000000, 0.0000000000, 0.3162277660, 0.4472135955, 0.5477225575, - 0.6324555320, 0.7071067812, 0.7745966692, 0.8366600265, 0.8944271910, - 0.9486832981, 1.0000000000, 1.0000000000}); - checkCumulative(0.5, 2.0, - x, new double[]{ - 0.0000000000, 0.0000000000, 0.4585302607, 0.6260990337, 0.7394254526, - 0.8221921916, 0.8838834765, 0.9295160031, 0.9621590305, 0.9838699101, - 0.9961174630, 1.0000000000, 1.0000000000}); - checkCumulative(0.5, 4.0, - x, new double[]{ - 0.0000000000, 0.0000000000, 0.6266250826, 0.8049844719, 0.8987784842, - 0.9502644369, 0.9777960959, 0.9914837366, 0.9974556254, 0.9995223859, - 0.9999714889, 1.0000000000, 1.0000000000}); - checkCumulative(1.0, 0.1, - x, new double[]{ - 0.00000000000, 0.00000000000, 0.01048074179, 0.02206723146, - 0.03503890488, 0.04979978349, 0.06696700846, 0.08755646344, - 0.11343184943, 0.14866007748, 0.20567176528, 1.00000000000, 1.00000000000}); - checkCumulative(1.0, 0.5, - x, new double[]{ - 0.00000000000, 0.00000000000, 0.05131670195, 0.10557280900, - 0.16333997347, 0.22540333076, 0.29289321881, 0.36754446797, - 0.45227744249, 0.55278640450, 0.68377223398, 1.00000000000, 1.00000000000}); - checkCumulative(1, 1, - x, new double[]{ - 0.0, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.0}); - checkCumulative(1, 2, - x, new double[]{ - 0.00, 0.00, 0.19, 0.36, 0.51, 0.64, 0.75, 0.84, 0.91, 0.96, 0.99, 1.00, 1.00}); - checkCumulative(1, 4, - x, new double[]{ - 0.0000, 0.0000, 0.3439, 0.5904, 0.7599, 0.8704, 0.9375, 0.9744, 0.9919, - 0.9984, 0.9999, 1.0000, 1.0000}); - checkCumulative(2.0, 0.1, - x, new double[]{ - 0.0000000000000, 0.0000000000000, 0.0005855492117, 0.0025085760862, - 0.0060900720266, 0.0117917748341, 0.0203153588864, 0.0328098512512, - 0.0513720788952, 0.0805528836776, 0.1341822241505, 1.0000000000000, 1.0000000000000}); - checkCumulative(2, 1, - x, new double[]{ - 0.00, 0.00, 0.01, 0.04, 0.09, 0.16, 0.25, 0.36, 0.49, 0.64, 0.81, 1.00, 1.00}); - checkCumulative(2.0, 0.5, - x, new double[]{ - 0.000000000000, 0.000000000000, 0.003882537047, 0.016130089900, - 0.037840969486, 0.070483996910, 0.116116523517, 0.177807808356, - 0.260574547368, 0.373900966300, 0.541469739276, 1.000000000000, 1.000000000000}); - checkCumulative(2, 2, - x, new double[]{ - 0.000, 0.000, 0.028, 0.104, 0.216, 0.352, 0.500, 0.648, 0.784, 0.896, 0.972, 1.000, 1.000}); - checkCumulative(2, 4, - x, new double[]{ - 0.00000, 0.00000, 0.08146, 0.26272, 0.47178, 0.66304, 0.81250, 0.91296, - 0.96922, 0.99328, 0.99954, 1.00000, 1.00000}); - checkCumulative(4.0, 0.1, - x, new double[]{ - 0.000000000e+00, 0.000000000e+00, 3.217128269e-06, 5.592070271e-05, - 3.104375474e-04, 1.088719595e-03, 2.995933981e-03, 7.155588777e-03, - 1.577149153e-02, 3.380410585e-02, 7.650088789e-02, 1.000000000e+00, 1.000000000e+00}); - checkCumulative(4.0, 0.5, - x, new double[]{ - 0.000000000e+00, 0.000000000e+00, 2.851114863e-05, 4.776140576e-04, - 2.544374616e-03, 8.516263371e-03, 2.220390414e-02, 4.973556312e-02, - 1.012215158e-01, 1.950155281e-01, 3.733749174e-01, 1.000000000e+00, 1.000000000e+00}); - checkCumulative(4, 1, - x, new double[]{ - 0.0000, 0.0000, 0.0001, 0.0016, 0.0081, 0.0256, 0.0625, 0.1296, 0.2401, - 0.4096, 0.6561, 1.0000, 1.0000}); - checkCumulative(4, 2, - x, new double[]{ - 0.00000, 0.00000, 0.00046, 0.00672, 0.03078, 0.08704, 0.18750, 0.33696, - 0.52822, 0.73728, 0.91854, 1.00000, 1.00000}); - checkCumulative(4, 4, - x, new double[]{ - 0.000000, 0.000000, 0.002728, 0.033344, 0.126036, 0.289792, 0.500000, - 0.710208, 0.873964, 0.966656, 0.997272, 1.000000, 1.000000}); - - } - - private void checkCumulative(double alpha, double beta, double[] x, double[] cumes) { - BetaDistribution d = new BetaDistribution(alpha, beta); - for (int i = 0; i < x.length; i++) { - Assert.assertEquals(cumes[i], d.cumulativeProbability(x[i]), 1e-8); - } - - for (int i = 1; i < x.length - 1; i++) { - Assert.assertEquals(x[i], d.inverseCumulativeProbability(cumes[i]), 1e-5); - } - } - - @Test - public void testDensity() { - double[] x = new double[]{1e-6, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9}; - checkDensity(0.1, 0.1, - x, new double[]{ - 12741.2357380649, 0.4429889586665234, 2.639378715e-01, 2.066393611e-01, - 1.832401831e-01, 1.766302780e-01, 1.832404579e-01, 2.066400696e-01, - 2.639396531e-01, 4.429925026e-01}); - checkDensity(0.1, 0.5, - x, new double[]{ - 2.218377102e+04, 7.394524202e-01, 4.203020268e-01, 3.119435533e-01, - 2.600787829e-01, 2.330648626e-01, 2.211408259e-01, 2.222728708e-01, - 2.414013907e-01, 3.070567405e-01}); - checkDensity(0.1, 1.0, - x, new double[]{ - 2.511886432e+04, 7.943210858e-01, 4.256680458e-01, 2.955218303e-01, - 2.281103709e-01, 1.866062624e-01, 1.583664652e-01, 1.378514078e-01, - 1.222414585e-01, 1.099464743e-01}); - checkDensity(0.1, 2.0, - x, new double[]{ - 2.763072312e+04, 7.863770012e-01, 3.745874120e-01, 2.275514842e-01, - 1.505525939e-01, 1.026332391e-01, 6.968107049e-02, 4.549081293e-02, - 2.689298641e-02, 1.209399123e-02}); - checkDensity(0.1, 4.0, - x, new double[]{ - 2.997927462e+04, 6.911058917e-01, 2.601128486e-01, 1.209774010e-01, - 5.880564714e-02, 2.783915474e-02, 1.209657335e-02, 4.442148268e-03, - 1.167143939e-03, 1.312171805e-04}); - checkDensity(0.5, 0.1, - x, new double[]{ - 88.3152184726, 0.3070542841, 0.2414007269, 0.2222727015, - 0.2211409364, 0.2330652355, 0.2600795198, 0.3119449793, - 0.4203052841, 0.7394649088}); - checkDensity(0.5, 0.5, - x, new double[]{ - 318.3100453389, 1.0610282383, 0.7957732234, 0.6946084565, - 0.6497470636, 0.6366197724, 0.6497476051, 0.6946097796, - 0.7957762075, 1.0610376697}); - checkDensity(0.5, 1.0, - x, new double[]{ - 500.0000000000, 1.5811309244, 1.1180311937, 0.9128694077, - 0.7905684268, 0.7071060741, 0.6454966865, 0.5976138778, - 0.5590166450, 0.5270459839}); - checkDensity(0.5, 2.0, - x, new double[]{ - 749.99925000000, 2.134537420613655, 1.34163575536, 0.95851150881, - 0.71151039830, 0.53032849490, 0.38729704363, 0.26892534859, - 0.16770415497, 0.07905610701}); - checkDensity(0.5, 4.0, - x, new double[]{ - 1.093746719e+03, 2.52142232809988, 1.252190241e+00, 6.849343920e-01, - 3.735417140e-01, 1.933481570e-01, 9.036885833e-02, 3.529621669e-02, - 9.782644546e-03, 1.152878503e-03}); - checkDensity(1.0, 0.1, - x, new double[]{ - 0.1000000900, 0.1099466942, 0.1222417336, 0.1378517623, 0.1583669403, - 0.1866069342, 0.2281113974, 0.2955236034, 0.4256718768, - 0.7943353837}); - checkDensity(1.0, 0.5, - x, new double[]{ - 0.5000002500, 0.5270465695, 0.5590173438, 0.5976147315, 0.6454977623, - 0.7071074883, 0.7905704033, 0.9128724506, - 1.1180367838, 1.5811467358}); - checkDensity(1, 1, - x, new double[]{ - 1, 1, 1, - 1, 1, 1, 1, - 1, 1, 1}); - checkDensity(1, 2, - x, new double[]{ - 1.999998, 1.799998, 1.599998, 1.399998, 1.199998, 0.999998, 0.799998, - 0.599998, 0.399998, - 0.199998}); - checkDensity(1, 4, - x, new double[]{ - 3.999988000012, 2.915990280011, 2.047992320010, 1.371994120008, - 0.863995680007, 0.499997000006, 0.255998080005, 0.107998920004, - 0.031999520002, 0.003999880001}); - checkDensity(2.0, 0.1, - x, new double[]{ - 1.100000990e-07, 1.209425730e-02, 2.689331586e-02, 4.549123318e-02, - 6.968162794e-02, 1.026340191e-01, 1.505537732e-01, 2.275534997e-01, - 3.745917198e-01, 7.863929037e-01}); - checkDensity(2.0, 0.5, - x, new double[]{ - 7.500003750e-07, 7.905777599e-02, 1.677060417e-01, 2.689275256e-01, - 3.872996256e-01, 5.303316769e-01, 7.115145488e-01, 9.585174425e-01, - 1.341645818e+00, 2.134537420613655}); - checkDensity(2, 1, - x, new double[]{ - 0.000002, 0.200002, 0.400002, 0.600002, 0.800002, 1.000002, 1.200002, - 1.400002, 1.600002, - 1.800002}); - checkDensity(2, 2, - x, new double[]{ - 5.9999940e-06, 5.4000480e-01, 9.6000360e-01, 1.2600024e+00, - 1.4400012e+00, 1.5000000e+00, 1.4399988e+00, 1.2599976e+00, - 9.5999640e-01, 5.3999520e-01}); - checkDensity(2, 4, - x, new double[]{ - 0.00001999994, 1.45800971996, 2.04800255997, 2.05799803998, - 1.72799567999, 1.24999500000, 0.76799552000, 0.37799676001, - 0.12799824001, 0.01799948000}); - checkDensity(4.0, 0.1, - x, new double[]{ - 1.193501074e-19, 1.312253162e-04, 1.167181580e-03, 4.442248535e-03, - 1.209679109e-02, 2.783958903e-02, 5.880649983e-02, 1.209791638e-01, - 2.601171405e-01, 6.911229392e-01}); - checkDensity(4.0, 0.5, - x, new double[]{ - 1.093750547e-18, 1.152948959e-03, 9.782950259e-03, 3.529697305e-02, - 9.037036449e-02, 1.933508639e-01, 3.735463833e-01, 6.849425461e-01, - 1.252205894e+00, 2.52142232809988}); - checkDensity(4, 1, - x, new double[]{ - 4.000000000e-18, 4.000120001e-03, 3.200048000e-02, 1.080010800e-01, - 2.560019200e-01, 5.000030000e-01, 8.640043200e-01, 1.372005880e+00, - 2.048007680e+00, 2.916009720e+00}); - checkDensity(4, 2, - x, new double[]{ - 1.999998000e-17, 1.800052000e-02, 1.280017600e-01, 3.780032400e-01, - 7.680044800e-01, 1.250005000e+00, 1.728004320e+00, 2.058001960e+00, - 2.047997440e+00, 1.457990280e+00}); - checkDensity(4, 4, - x, new double[]{ - 1.399995800e-16, 1.020627216e-01, 5.734464512e-01, 1.296547409e+00, - 1.935364838e+00, 2.187500000e+00, 1.935355162e+00, 1.296532591e+00, - 5.734335488e-01, 1.020572784e-01}); - - } - - @SuppressWarnings("boxing") - private void checkDensity(double alpha, double beta, double[] x, double[] expected) { - BetaDistribution d = new BetaDistribution(alpha, beta); - for (int i = 0; i < x.length; i++) { - Assert.assertEquals(String.format("density at x=%.1f for alpha=%.1f, beta=%.1f", x[i], alpha, beta), expected[i], d.density(x[i]), 1e-5); - } - } - - @Test - public void testMoments() { - final double tol = 1e-9; - BetaDistribution dist; - - dist = new BetaDistribution(1, 1); - Assert.assertEquals(dist.getNumericalMean(), 0.5, tol); - Assert.assertEquals(dist.getNumericalVariance(), 1.0 / 12.0, tol); - - dist = new BetaDistribution(2, 5); - Assert.assertEquals(dist.getNumericalMean(), 2.0 / 7.0, tol); - Assert.assertEquals(dist.getNumericalVariance(), 10.0 / (49.0 * 8.0), tol); - } - - @Test - public void testMomentsSampling() { - final UniformRandomProvider rng = RandomSource.create(RandomSource.WELL_1024_A, - 123456789L); - final int numSamples = 1000; - for (final double alpha : alphaBetas) { - for (final double beta : alphaBetas) { - final BetaDistribution betaDistribution = new BetaDistribution(alpha, beta); - final double[] observed = AbstractRealDistribution.sample(numSamples, - betaDistribution.createSampler(rng)); - Arrays.sort(observed); - - final String distribution = String.format("Beta(%.2f, %.2f)", alpha, beta); - Assert.assertEquals(String.format("E[%s]", distribution), - betaDistribution.getNumericalMean(), - StatUtils.mean(observed), epsilon); - Assert.assertEquals(String.format("Var[%s]", distribution), - betaDistribution.getNumericalVariance(), - StatUtils.variance(observed), epsilon); - } - } - } - - @Test - public void testGoodnessOfFit() { - final UniformRandomProvider rng = RandomSource.create(RandomSource.WELL_19937_A, - 123456789L); - final int numSamples = 1000; - final double level = 0.01; - for (final double alpha : alphaBetas) { - for (final double beta : alphaBetas) { - final org.apache.commons.statistics.distribution.BetaDistribution betaDistribution = - new org.apache.commons.statistics.distribution.BetaDistribution(alpha, beta); - - final ContinuousDistribution.Sampler sampler = betaDistribution.createSampler(rng); - final double[] observed = AbstractRealDistribution.sample(numSamples, sampler); - - Assert.assertFalse("G goodness-of-fit test rejected null at alpha = " + level, - gTest(betaDistribution, observed) < level); - Assert.assertFalse("KS goodness-of-fit test rejected null at alpha = " + level, - new KolmogorovSmirnovTest().kolmogorovSmirnovTest(betaDistribution, observed) < level); - } - } - } - - private double gTest(final ContinuousDistribution expectedDistribution, final double[] values) { - final int numBins = values.length / 30; - final double[] breaks = new double[numBins]; - for (int b = 0; b < breaks.length; b++) { - breaks[b] = expectedDistribution.inverseCumulativeProbability((double) b / numBins); - } - - final long[] observed = new long[numBins]; - for (final double value : values) { - int b = 0; - do { - b++; - } while (b < numBins && value >= breaks[b]); - - observed[b - 1]++; - } - - final double[] expected = new double[numBins]; - Arrays.fill(expected, (double) values.length / numBins); - - return InferenceTestUtils.gTest(expected, observed); - } -} http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/test/java/org/apache/commons/math4/distribution/BinomialDistributionTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/distribution/BinomialDistributionTest.java b/src/test/java/org/apache/commons/math4/distribution/BinomialDistributionTest.java deleted file mode 100644 index 27ac515..0000000 --- a/src/test/java/org/apache/commons/math4/distribution/BinomialDistributionTest.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * 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.math4.distribution; - -import org.apache.commons.math4.distribution.BinomialDistribution; -import org.apache.commons.math4.distribution.IntegerDistribution; -import org.junit.Assert; -import org.junit.Test; - -/** - * Test cases for BinomialDistribution. Extends IntegerDistributionAbstractTest. - * See class javadoc for IntegerDistributionAbstractTest for details. - * - */ -public class BinomialDistributionTest extends IntegerDistributionAbstractTest { - - /** - * Constructor to override default tolerance. - */ - public BinomialDistributionTest() { - setTolerance(1e-12); - } - - // -------------- Implementations for abstract methods - // ----------------------- - - /** Creates the default discrete distribution instance to use in tests. */ - @Override - public IntegerDistribution makeDistribution() { - return new BinomialDistribution(10, 0.70); - } - - /** Creates the default probability density test input values. */ - @Override - public int[] makeDensityTestPoints() { - return new int[] { -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - } - - /** - * Creates the default probability density test expected values. - * Reference values are from R, version 2.15.3. - */ - @Override - public double[] makeDensityTestValues() { - return new double[] { 0d, 0.0000059049d, 0.000137781d, 0.0014467005, - 0.009001692, 0.036756909, 0.1029193452, 0.200120949, 0.266827932, - 0.2334744405, 0.121060821, 0.0282475249, 0d }; - } - - /** Creates the default cumulative probability density test input values */ - @Override - public int[] makeCumulativeTestPoints() { - return makeDensityTestPoints(); - } - - /** - * Creates the default cumulative probability density test expected values. - * Reference values are from R, version 2.15.3. - */ - @Override - public double[] makeCumulativeTestValues() { - return new double[] { 0d, 5.9049e-06, 0.0001436859, 0.0015903864, 0.0105920784, 0.0473489874, - 0.1502683326, 0.3503892816, 0.6172172136, 0.8506916541, 0.9717524751, 1d, 1d }; - } - - /** Creates the default inverse cumulative probability test input values */ - @Override - public double[] makeInverseCumulativeTestPoints() { - return new double[] { 0, 0.001d, 0.010d, 0.025d, 0.050d, 0.100d, - 0.999d, 0.990d, 0.975d, 0.950d, 0.900d, 1 }; - } - - /** - * Creates the default inverse cumulative probability density test expected - * values - */ - @Override - public int[] makeInverseCumulativeTestValues() { - return new int[] { 0, 2, 3, 4, 5, 5, 10, 10, 10, 9, 9, 10 }; - } - - // ----------------- Additional test cases --------------------------------- - - /** Test degenerate case p = 0 */ - @Test - public void testDegenerate0() { - BinomialDistribution dist = new BinomialDistribution(5, 0.0d); - setDistribution(dist); - setCumulativeTestPoints(new int[] { -1, 0, 1, 5, 10 }); - setCumulativeTestValues(new double[] { 0d, 1d, 1d, 1d, 1d }); - setDensityTestPoints(new int[] { -1, 0, 1, 10, 11 }); - setDensityTestValues(new double[] { 0d, 1d, 0d, 0d, 0d }); - setInverseCumulativeTestPoints(new double[] { 0.1d, 0.5d }); - setInverseCumulativeTestValues(new int[] { 0, 0 }); - verifyDensities(); - verifyCumulativeProbabilities(); - verifyInverseCumulativeProbabilities(); - Assert.assertEquals(dist.getSupportLowerBound(), 0); - Assert.assertEquals(dist.getSupportUpperBound(), 0); - } - - /** Test degenerate case p = 1 */ - @Test - public void testDegenerate1() { - BinomialDistribution dist = new BinomialDistribution(5, 1.0d); - setDistribution(dist); - setCumulativeTestPoints(new int[] { -1, 0, 1, 2, 5, 10 }); - setCumulativeTestValues(new double[] { 0d, 0d, 0d, 0d, 1d, 1d }); - setDensityTestPoints(new int[] { -1, 0, 1, 2, 5, 10 }); - setDensityTestValues(new double[] { 0d, 0d, 0d, 0d, 1d, 0d }); - setInverseCumulativeTestPoints(new double[] { 0.1d, 0.5d }); - setInverseCumulativeTestValues(new int[] { 5, 5 }); - verifyDensities(); - verifyCumulativeProbabilities(); - verifyInverseCumulativeProbabilities(); - Assert.assertEquals(dist.getSupportLowerBound(), 5); - Assert.assertEquals(dist.getSupportUpperBound(), 5); - } - - /** Test degenerate case n = 0 */ - @Test - public void testDegenerate2() { - BinomialDistribution dist = new BinomialDistribution(0, 0.01d); - setDistribution(dist); - setCumulativeTestPoints(new int[] { -1, 0, 1, 2, 5, 10 }); - setCumulativeTestValues(new double[] { 0d, 1d, 1d, 1d, 1d, 1d }); - setDensityTestPoints(new int[] { -1, 0, 1, 2, 5, 10 }); - setDensityTestValues(new double[] { 0d, 1d, 0d, 0d, 0d, 0d }); - setInverseCumulativeTestPoints(new double[] { 0.1d, 0.5d }); - setInverseCumulativeTestValues(new int[] { 0, 0 }); - verifyDensities(); - verifyCumulativeProbabilities(); - verifyInverseCumulativeProbabilities(); - Assert.assertEquals(dist.getSupportLowerBound(), 0); - Assert.assertEquals(dist.getSupportUpperBound(), 0); - } - - @Test - public void testMoments() { - final double tol = 1e-9; - BinomialDistribution dist; - - dist = new BinomialDistribution(10, 0.5); - Assert.assertEquals(dist.getNumericalMean(), 10d * 0.5d, tol); - Assert.assertEquals(dist.getNumericalVariance(), 10d * 0.5d * 0.5d, tol); - - dist = new BinomialDistribution(30, 0.3); - Assert.assertEquals(dist.getNumericalMean(), 30d * 0.3d, tol); - Assert.assertEquals(dist.getNumericalVariance(), 30d * 0.3d * (1d - 0.3d), tol); - } - - @Test - public void testMath718() { - // for large trials the evaluation of ContinuedFraction was inaccurate - // do a sweep over several large trials to test if the current implementation is - // numerically stable. - - for (int trials = 500000; trials < 20000000; trials += 100000) { - BinomialDistribution dist = new BinomialDistribution(trials, 0.5); - int p = dist.inverseCumulativeProbability(0.5); - Assert.assertEquals(trials / 2, p); - } - } -} http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/test/java/org/apache/commons/math4/distribution/CauchyDistributionTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/distribution/CauchyDistributionTest.java b/src/test/java/org/apache/commons/math4/distribution/CauchyDistributionTest.java deleted file mode 100644 index 86bd0e4..0000000 --- a/src/test/java/org/apache/commons/math4/distribution/CauchyDistributionTest.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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.math4.distribution; - -import org.apache.commons.math4.distribution.CauchyDistribution; -import org.apache.commons.math4.distribution.NormalDistribution; -import org.apache.commons.math4.exception.NotStrictlyPositiveException; -import org.junit.Assert; -import org.junit.Test; - -/** - * Test cases for CauchyDistribution. - * Extends ContinuousDistributionAbstractTest. See class javadoc for - * ContinuousDistributionAbstractTest for details. - * - */ -public class CauchyDistributionTest extends RealDistributionAbstractTest { - - // --------------------- Override tolerance -------------- - protected double defaultTolerance = NormalDistribution.DEFAULT_INVERSE_ABSOLUTE_ACCURACY; - @Override - public void setUp() { - super.setUp(); - setTolerance(defaultTolerance); - } - - //-------------- Implementations for abstract methods ----------------------- - - /** Creates the default continuous distribution instance to use in tests. */ - @Override - public CauchyDistribution makeDistribution() { - return new CauchyDistribution(1.2, 2.1); - } - - /** Creates the default cumulative probability distribution test input values */ - @Override - public double[] makeCumulativeTestPoints() { - // quantiles computed using R 2.9.2 - return new double[] {-667.24856187, -65.6230835029, -25.4830299460, -12.0588781808, - -5.26313542807, 669.64856187, 68.0230835029, 27.8830299460, 14.4588781808, 7.66313542807}; - } - - /** Creates the default cumulative probability density test expected values */ - @Override - public double[] makeCumulativeTestValues() { - return new double[] {0.001, 0.01, 0.025, 0.05, 0.1, 0.999, - 0.990, 0.975, 0.950, 0.900}; - } - - /** Creates the default probability density test expected values */ - @Override - public double[] makeDensityTestValues() { - return new double[] {1.49599158008e-06, 0.000149550440335, 0.000933076881878, 0.00370933207799, 0.0144742330437, - 1.49599158008e-06, 0.000149550440335, 0.000933076881878, 0.00370933207799, 0.0144742330437}; - } - - //---------------------------- Additional test cases ------------------------- - - @Test - public void testInverseCumulativeProbabilityExtremes() { - setInverseCumulativeTestPoints(new double[] {0.0, 1.0}); - setInverseCumulativeTestValues( - new double[] {Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY}); - verifyInverseCumulativeProbabilities(); - } - - @Test - public void testMedian() { - CauchyDistribution distribution = (CauchyDistribution) getDistribution(); - Assert.assertEquals(1.2, distribution.getMedian(), 0.0); - } - - @Test - public void testScale() { - CauchyDistribution distribution = (CauchyDistribution) getDistribution(); - Assert.assertEquals(2.1, distribution.getScale(), 0.0); - } - - @Test - public void testPreconditions() { - try { - new CauchyDistribution(0, 0); - Assert.fail("Cannot have zero scale"); - } catch (NotStrictlyPositiveException ex) { - // Expected. - } - try { - new CauchyDistribution(0, -1); - Assert.fail("Cannot have negative scale"); - } catch (NotStrictlyPositiveException ex) { - // Expected. - } - } - - @Test - public void testMoments() { - CauchyDistribution dist; - - dist = new CauchyDistribution(10.2, 0.15); - Assert.assertTrue(Double.isNaN(dist.getNumericalMean())); - Assert.assertTrue(Double.isNaN(dist.getNumericalVariance())); - - dist = new CauchyDistribution(23.12, 2.12); - Assert.assertTrue(Double.isNaN(dist.getNumericalMean())); - Assert.assertTrue(Double.isNaN(dist.getNumericalVariance())); - } -} http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/test/java/org/apache/commons/math4/distribution/ChiSquaredDistributionTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/distribution/ChiSquaredDistributionTest.java b/src/test/java/org/apache/commons/math4/distribution/ChiSquaredDistributionTest.java deleted file mode 100644 index fc1ab85..0000000 --- a/src/test/java/org/apache/commons/math4/distribution/ChiSquaredDistributionTest.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * 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.math4.distribution; - -import org.apache.commons.math4.distribution.ChiSquaredDistribution; -import org.junit.Assert; -import org.junit.Test; - -/** - * Test cases for {@link ChiSquaredDistribution}. - * - * @see RealDistributionAbstractTest - */ -public class ChiSquaredDistributionTest extends RealDistributionAbstractTest { - - //-------------- Implementations for abstract methods ----------------------- - - /** Creates the default continuous distribution instance to use in tests. */ - @Override - public ChiSquaredDistribution makeDistribution() { - return new ChiSquaredDistribution(5.0); - } - - /** Creates the default cumulative probability distribution test input values */ - @Override - public double[] makeCumulativeTestPoints() { - // quantiles computed using R version 2.9.2 - return new double[] {0.210212602629, 0.554298076728, 0.831211613487, 1.14547622606, 1.61030798696, - 20.5150056524, 15.0862724694, 12.8325019940, 11.0704976935, 9.23635689978}; - } - - /** Creates the default cumulative probability density test expected values */ - @Override - public double[] makeCumulativeTestValues() { - return new double[] {0.001, 0.01, 0.025, 0.05, 0.1, 0.999, 0.990, 0.975, 0.950, 0.900}; - } - - /** Creates the default inverse cumulative probability test input values */ - @Override - public double[] makeInverseCumulativeTestPoints() { - return new double[] {0, 0.001d, 0.01d, 0.025d, 0.05d, 0.1d, 0.999d, - 0.990d, 0.975d, 0.950d, 0.900d, 1}; - } - - /** Creates the default inverse cumulative probability density test expected values */ - @Override - public double[] makeInverseCumulativeTestValues() { - return new double[] {0, 0.210212602629, 0.554298076728, 0.831211613487, 1.14547622606, 1.61030798696, - 20.5150056524, 15.0862724694, 12.8325019940, 11.0704976935, 9.23635689978, - Double.POSITIVE_INFINITY}; - } - - /** Creates the default probability density test expected values */ - @Override - public double[] makeDensityTestValues() { - return new double[] {0.0115379817652, 0.0415948507811, 0.0665060119842, 0.0919455953114, 0.121472591024, - 0.000433630076361, 0.00412780610309, 0.00999340341045, 0.0193246438937, 0.0368460089216}; - } - - // --------------------- Override tolerance -------------- - @Override - public void setUp() { - super.setUp(); - setTolerance(1e-9); - } - - //---------------------------- Additional test cases ------------------------- - - @Test - public void testSmallDf() { - setDistribution(new ChiSquaredDistribution(0.1d)); - setTolerance(1E-4); - // quantiles computed using R version 1.8.1 (linux version) - setCumulativeTestPoints(new double[] {1.168926E-60, 1.168926E-40, 1.063132E-32, - 1.144775E-26, 1.168926E-20, 5.472917, 2.175255, 1.13438, - 0.5318646, 0.1526342}); - setInverseCumulativeTestValues(getCumulativeTestPoints()); - setInverseCumulativeTestPoints(getCumulativeTestValues()); - verifyCumulativeProbabilities(); - verifyInverseCumulativeProbabilities(); - } - - @Test - public void testDfAccessors() { - ChiSquaredDistribution distribution = (ChiSquaredDistribution) getDistribution(); - Assert.assertEquals(5d, distribution.getDegreesOfFreedom(), Double.MIN_VALUE); - } - - @Test - public void testDensity() { - double[] x = new double[]{-0.1, 1e-6, 0.5, 1, 2, 5}; - //R 2.5: print(dchisq(x, df=1), digits=10) - checkDensity(1, x, new double[]{0.00000000000, 398.94208093034, 0.43939128947, 0.24197072452, 0.10377687436, 0.01464498256}); - //R 2.5: print(dchisq(x, df=0.1), digits=10) - checkDensity(0.1, x, new double[]{0.000000000e+00, 2.486453997e+04, 7.464238732e-02, 3.009077718e-02, 9.447299159e-03, 8.827199396e-04}); - //R 2.5: print(dchisq(x, df=2), digits=10) - checkDensity(2, x, new double[]{0.00000000000, 0.49999975000, 0.38940039154, 0.30326532986, 0.18393972059, 0.04104249931}); - //R 2.5: print(dchisq(x, df=10), digits=10) - checkDensity(10, x, new double[]{0.000000000e+00, 1.302082682e-27, 6.337896998e-05, 7.897534632e-04, 7.664155024e-03, 6.680094289e-02}); - } - - private void checkDensity(double df, double[] x, double[] expected) { - ChiSquaredDistribution d = new ChiSquaredDistribution(df); - for (int i = 0; i < x.length; i++) { - Assert.assertEquals(expected[i], d.density(x[i]), 1e-5); - } - } - - @Test - public void testMoments() { - final double tol = 1e-9; - ChiSquaredDistribution dist; - - dist = new ChiSquaredDistribution(1500); - Assert.assertEquals(dist.getNumericalMean(), 1500, tol); - Assert.assertEquals(dist.getNumericalVariance(), 3000, tol); - - dist = new ChiSquaredDistribution(1.12); - Assert.assertEquals(dist.getNumericalMean(), 1.12, tol); - Assert.assertEquals(dist.getNumericalVariance(), 2.24, tol); - } -} http://git-wip-us.apache.org/repos/asf/commons-math/blob/ef846813/src/test/java/org/apache/commons/math4/distribution/ConstantRealDistributionTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/distribution/ConstantRealDistributionTest.java b/src/test/java/org/apache/commons/math4/distribution/ConstantRealDistributionTest.java deleted file mode 100644 index a2c7706..0000000 --- a/src/test/java/org/apache/commons/math4/distribution/ConstantRealDistributionTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * 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.math4.distribution; - -import org.apache.commons.math4.distribution.ConstantRealDistribution; -import org.apache.commons.math4.distribution.RealDistribution; -import org.junit.Assert; -import org.junit.Test; - -/** - * Test cases for ConstantRealDistribution. - */ -public class ConstantRealDistributionTest extends RealDistributionAbstractTest { - - // --- Override tolerance ------------------------------------------------- - - @Override - public void setUp() { - super.setUp(); - setTolerance(0); - } - - //--- Implementations for abstract methods -------------------------------- - - /** Creates the default uniform real distribution instance to use in tests. */ - @Override - public ConstantRealDistribution makeDistribution() { - return new ConstantRealDistribution(1); - } - - /** Creates the default cumulative probability distribution test input values */ - @Override - public double[] makeCumulativeTestPoints() { - return new double[] {0, 0.5, 1}; - } - - /** Creates the default cumulative probability distribution test expected values */ - @Override - public double[] makeCumulativeTestValues() { - return new double[] {0, 0, 1}; - } - - /** Creates the default probability density test expected values */ - @Override - public double[] makeDensityTestValues() { - return new double[] {0, 0, 1}; - } - - /** Override default test, verifying that inverse cum is constant */ - @Override - @Test - public void testInverseCumulativeProbabilities() { - RealDistribution dist = getDistribution(); - for (double x : getCumulativeTestValues()) { - Assert.assertEquals(1,dist.inverseCumulativeProbability(x), 0); - } - } - - //--- Additional test cases ----------------------------------------------- - - @Test - public void testMeanVariance() { - ConstantRealDistribution dist; - - dist = new ConstantRealDistribution(-1); - Assert.assertEquals(dist.getNumericalMean(), -1, 0d); - Assert.assertEquals(dist.getNumericalVariance(), 0, 0d); - } - - @Test - @Override - public void testSampler() { - final double value = 12.345; - final RealDistribution.Sampler sampler = new ConstantRealDistribution(value).createSampler(null); - for (int i = 0; i < 10; i++) { - Assert.assertEquals(value, sampler.sample(), 0); - } - } -}
