    1   /*
    2    * Copyright 2004 The Apache Software Foundation.
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  package org.apache.commons.math.distribution;
    17
    18  /***
    19   * <code>PoissonDistributionTest</code>
    20   *
    21   * @version $Revision: 1.2 $ $Date: 2004/11/07 20:39:15 $
    22   */
    23  public class PoissonDistributionTest extends IntegerDistributionAbstractTest {
    24
    25      /***
    26       * Poisson parameter value for the test distribution.
    27       */
    28      private static final double DEFAULT_TEST_POISSON_PARAMETER = 4.0;
    29
    30      /***
    31       * Constructor.
    32       * @param name
    33       */
    34      public PoissonDistributionTest(String name) {
    35          super(name);
    36          setTolerance(1e-12);
    37      }
    38
    39      /***
    40       * Creates the default discrete distribution instance to use in tests.
    41       */
    42      public IntegerDistribution makeDistribution() {
    43          return DistributionFactory.newInstance().createPoissonDistribution
    44              (DEFAULT_TEST_POISSON_PARAMETER);
    45      }
    46
    47      /***
    48       * Creates the default probability density test input values.
    49       */
    50      public int[] makeDensityTestPoints() {
    51          return new int[] { -1, 0, 1, 2, 3, 4, 5, 10, 20};
    52      }
    53
    54      /***
    55       * Creates the default probability density test expected values.
    56       * These and all other test values are generated by R, version 1.8.1
    57       */
    58      public double[] makeDensityTestValues() {
    59          return new double[] { 0d, 0.0183156388887d,  0.073262555555d,
    60                  0.14652511111d, 0.195366814813d, 0.195366814813,
    61                  0.156293451851d, 0.00529247667642d, 8.27746364655e-09};
    62      }
    63
    64      /***
    65       * Creates the default cumulative probability density test input values.
    66       */
    67      public int[] makeCumulativeTestPoints() {
    68          return new int[] { -1, 0, 1, 2, 3, 4, 5, 10, 20 };
    69      }
    70
    71      /***
    72       * Creates the default cumulative probability density test expected values.
    73       */
    74      public double[] makeCumulativeTestValues() {
    75          return new double[] { 0d,  0.0183156388887d, 0.0915781944437d,
    76                  0.238103305554d, 0.433470120367d, 0.62883693518,
    77                  0.78513038703d,  0.99716023388d, 0.999999998077 };
    78      }
    79
    80      /***
    81       * Creates the default inverse cumulative probability test input values.
    82       * Increased 3rd and 7th values slightly as computed cumulative
    83       * probabilities for corresponding values exceeds the target value (still
    84       * within tolerance).
    85       */
    86      public double[] makeInverseCumulativeTestPoints() {
    87          return new double[] { 0d,  0.018315638889d, 0.0915781944437d,
    88                  0.238103305554d, 0.433470120367d, 0.62883693518,
    89                  0.78513038704d,  0.99716023388d, 0.999999998077 };
    90      }
    91
    92      /***
    93       * Creates the default inverse cumulative probability density test expected values.
    94       */
    95      public int[] makeInverseCumulativeTestValues() {
    96          return new int[] { -1, 0, 1, 2, 3, 4, 5, 10, 20};
    97      }
    98
    99      /***
    100      * Test the normal approximation of the Poisson distribution by
    101      * calculating P(90 &le; X &le; 110) for X = Po(100) and
    102      * P(9900 &le; X &le; 10200) for X  = Po(10000)
    103      */
    104     public void testNormalApproximateProbability() throws Exception {
    105         PoissonDistribution dist = new PoissonDistributionImpl(100);
    106         double result = dist.normalApproximateProbability(110)
    107                 - dist.normalApproximateProbability(89);
    108         assertEquals(0.706281887248, result, 1E-10);
    109         dist.setMean(10000);
    110         result = dist.normalApproximateProbability(10200)
    111         - dist.normalApproximateProbability(9899);
    112         assertEquals(0.820070051552, result, 1E-10);
    113     }
    114
    115     /***
    116      * Test the degenerate cases of a 0.0 and 1.0 inverse cumulative probability.
    117      * @throws Exception
    118      */
    119     public void testDegenerateInverseCumulativeProbability() throws Exception {
    120           PoissonDistribution dist = new PoissonDistributionImpl(
    121                     DEFAULT_TEST_POISSON_PARAMETER);
    122             assertEquals(Integer.MAX_VALUE, dist.inverseCumulativeProbability(1.0d));
    123             assertEquals(-1, dist.inverseCumulativeProbability(0d));
    124     }
    125 }