From 229c782087d2eaef17d23682fcd8b36a73bb756b Mon Sep 17 00:00:00 2001 From: Phil Steitz Date: Sun, 30 May 2004 05:54:43 +0000 Subject: [PATCH] Modified to extend ContinuousDistributionAbstractTest, improved coverage. git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/math/trunk@141251 13f79535-47bb-0310-9956-ffa450edef68 --- .../distribution/NormalDistributionTest.java | 239 +++++++----------- 1 file changed, 97 insertions(+), 142 deletions(-) diff --git a/src/test/org/apache/commons/math/distribution/NormalDistributionTest.java b/src/test/org/apache/commons/math/distribution/NormalDistributionTest.java index 60fdfd262..fd94d31e1 100644 --- a/src/test/org/apache/commons/math/distribution/NormalDistributionTest.java +++ b/src/test/org/apache/commons/math/distribution/NormalDistributionTest.java @@ -16,149 +16,104 @@ package org.apache.commons.math.distribution; -import org.apache.commons.math.MathException; -import org.apache.commons.math.TestUtils; - -import junit.framework.TestCase; - /** - * Tests for NormalDistribution implementation + * Test cases for NormalDistribution. + * Extends ContinuousDistributionAbstractTest. See class javadoc for + * ContinuousDistributionAbstractTest for details. * - * "True" results are taken from R - the same as in Mathematica - * + * @version $Revision: 1.7 $ $Date: 2004/05/30 05:54:43 $ */ -public class NormalDistributionTest extends TestCase { - - private NormalDistribution z; - private static final double PRECISION = 10e-6; - private static final double M = 2.1; - private static final double SD = 1.4; - - /** - * Constructor for NormalDistributionTest. - * @param arg0 - */ - public NormalDistributionTest(String arg0) { - super(arg0); - } - - public static void main(String[] args) { - junit.swingui.TestRunner.run(NormalDistributionTest.class); - } - - protected void setUp() throws Exception { - super.setUp(); - z = DistributionFactory.newInstance().createNormalDistribution(M, SD); - } - - protected void tearDown() throws Exception { - super.tearDown(); - z = null; - } - - public void testCumulativeProbabilitydoubleM_MINUS_2SD() throws MathException { - testProbability(M - 2*SD, 0.02275013); - } - - public void testCumulativeProbabilitydoubleM_MINUS_SD() throws MathException { - testProbability(M - SD, 0.1586553); - } - - public void testCumulativeProbabilitydoubleM() throws MathException { - testProbability(M, 0.5); - } - - public void testCumulativeProbabilitydoubleM_PLUS_SD() throws MathException { - testProbability(M + SD, 0.8413447); - } - - public void testCumulativeProbabilitydoubleM_PLUS_2SD() throws MathException { - testProbability(M + 2*SD, 0.9772499); - } - - public void testCumulativeProbabilitydoubleM_PLUS_3SD() throws MathException { - testProbability(M + 3*SD, 0.9986501); - } - - public void testCumulativeProbabilitydoubleM_PLUS_4SD() throws MathException { - testProbability(M + 4*SD, 0.9999683); - } - - public void testCumulativeProbabilitydoubleM_PLUS_5SD() throws MathException { - testProbability(M + 5*SD, 0.9999997); - } - - public void testInverseCumulativeProbability001() throws MathException { - testValue(-2.226325, .001); - } - - public void testInverseCumulativeProbability010() throws MathException{ - testValue(-1.156887, .010); - } - - public void testInverseCumulativeProbability025() throws MathException{ - testValue(-0.6439496, .025); - } - - public void testInverseCumulativeProbability050() throws MathException{ - testValue(-0.2027951, .050); - } - - public void testInverseCumulativeProbability100() throws MathException{ - testValue(0.3058278, .100); - } - - public void testInverseCumulativeProbability900() throws MathException{ - testValue(3.894172, .900); - } - - public void testInverseCumulativeProbability950() throws MathException{ - testValue(4.402795, .950); - } - - public void testInverseCumulativeProbability975() throws MathException{ - testValue(4.84395, .975); - } - - public void testInverseCumulativeProbability990() throws MathException{ - testValue(5.356887, .990); - } - - public void testInverseCumulativeProbability999() throws MathException{ - testValue(6.426325, .999); - } - - public void testGetMean() { - assertEquals(M, z.getMean(), 0); - } - - public void testSetMean() throws MathException { - double mu = Math.random(); - z.setMean(mu); - assertEquals(mu, z.getMean(), 0); - assertEquals(0.5d, z.cumulativeProbability(mu), PRECISION); - } - - public void testGetStandardDeviation() { - assertEquals(SD, z.getStandardDeviation(), 0); - } - - public void testSetStandardDeviation() throws MathException{ - double sigma = 0.1d + Math.random(); - z.setStandardDeviation(sigma); - assertEquals(sigma, z.getStandardDeviation(), 0); - assertEquals(0.84134475, z.cumulativeProbability(z.getMean() + z.getStandardDeviation()), PRECISION ); - } - - private void testProbability(double x, double expected) throws MathException { - double actual = Double.NaN; - actual = z.cumulativeProbability(x); - assertEquals(expected, actual, PRECISION); - } - - private void testValue(double expected, double p) throws MathException { - double actual = z.inverseCumulativeProbability(p); - TestUtils.assertEquals(expected, actual, PRECISION); - } - +public class NormalDistributionTest extends ContinuousDistributionAbstractTest { + + /** + * Constructor for NormalDistributionTest. + * @param arg0 + */ + public NormalDistributionTest(String arg0) { + super(arg0); + } + + public static void main(String[] args) { + junit.swingui.TestRunner.run(NormalDistributionTest.class); + } + + //-------------- Implementations for abstract methods ----------------------- + + /** Creates the default continuous distribution instance to use in tests. */ + public ContinuousDistribution makeDistribution() { + return DistributionFactory.newInstance().createNormalDistribution(2.1, 1.4); + } + + /** Creates the default cumulative probability distribution test input values */ + public double[] makeCumulativeTestPoints() { + // quantiles computed using R + return new double[] {-2.226325d, -1.156887d, -0.6439496d, -0.2027951d, 0.3058278d, + 6.426325d, 5.356887d, 4.84395d, 4.402795d, 3.894172d}; + } + + /** Creates the default cumulative probability density test expected values */ + public double[] makeCumulativeTestValues() { + return new double[] {0.001d, 0.01d, 0.025d, 0.05d, 0.1d, 0.999d, + 0.990d, 0.975d, 0.950d, 0.900d}; + } + + // --------------------- Override tolerance -------------- + protected void setup() throws Exception { + super.setUp(); + setTolerance(1E-6); + } + + //---------------------------- Additional test cases ------------------------- + + private void verifyQuantiles() throws Exception { + NormalDistribution distribution = (NormalDistribution) getDistribution(); + double mu = distribution.getMean(); + double sigma = distribution.getStandardDeviation(); + setCumulativeTestPoints( new double[] {mu - 2 *sigma, mu - sigma, + mu, mu + sigma, mu +2 * sigma, mu +3 * sigma, mu + 4 * sigma, + mu + 5 * sigma}); + // Quantiles computed using R (same as Mathematica) + setCumulativeTestValues(new double[] {0.02275013, 0.1586553, 0.5, 0.8413447, + 0.9772499, 0.9986501, 0.9999683, 0.9999997}); + verifyCumulativeProbabilities(); + } + + public void testQuantiles() throws Exception { + verifyQuantiles(); + setDistribution(DistributionFactory.newInstance().createNormalDistribution(0, 1)); + verifyQuantiles(); + setDistribution(DistributionFactory.newInstance().createNormalDistribution(0, 0.1)); + verifyQuantiles(); + } + + public void testGetMean() { + NormalDistribution distribution = (NormalDistribution) getDistribution(); + assertEquals(2.1, distribution.getMean(), 0); + } + + public void testSetMean() throws Exception { + double mu = Math.random(); + NormalDistribution distribution = (NormalDistribution) getDistribution(); + distribution.setMean(mu); + verifyQuantiles(); + } + + public void testGetStandardDeviation() { + NormalDistribution distribution = (NormalDistribution) getDistribution(); + assertEquals(1.4, distribution.getStandardDeviation(), 0); + } + + public void testSetStandardDeviation() throws Exception { + double sigma = 0.1d + Math.random(); + NormalDistribution distribution = (NormalDistribution) getDistribution(); + distribution.setStandardDeviation(sigma); + assertEquals(sigma, distribution.getStandardDeviation(), 0); + verifyQuantiles(); + try { + distribution.setStandardDeviation(0); + fail("Expecting IllegalArgumentException for sd = 0"); + } catch (IllegalArgumentException ex) { + // Expected + } + } }