View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.math4.legacy.distribution;
18  
19  import org.junit.Assert;
20  import org.junit.Test;
21  
22  /**
23   * Test cases for AbstractIntegerDistribution default implementations.
24   *
25   */
26  public class AbstractIntegerDistributionTest {
27      protected final DiceDistribution diceDistribution = new DiceDistribution();
28      protected final double p = diceDistribution.probability(1);
29  
30      @Test
31      public void testInverseCumulativeProbabilityMethod() {
32          double precision = 0.000000000000001;
33          Assert.assertEquals(1, diceDistribution.inverseCumulativeProbability(0));
34          Assert.assertEquals(1, diceDistribution.inverseCumulativeProbability((1d-Double.MIN_VALUE)/6d));
35          Assert.assertEquals(2, diceDistribution.inverseCumulativeProbability((1d+precision)/6d));
36          Assert.assertEquals(2, diceDistribution.inverseCumulativeProbability((2d-Double.MIN_VALUE)/6d));
37          Assert.assertEquals(3, diceDistribution.inverseCumulativeProbability((2d+precision)/6d));
38          Assert.assertEquals(3, diceDistribution.inverseCumulativeProbability((3d-Double.MIN_VALUE)/6d));
39          Assert.assertEquals(4, diceDistribution.inverseCumulativeProbability((3d+precision)/6d));
40          Assert.assertEquals(4, diceDistribution.inverseCumulativeProbability((4d-Double.MIN_VALUE)/6d));
41          Assert.assertEquals(5, diceDistribution.inverseCumulativeProbability((4d+precision)/6d));
42          Assert.assertEquals(5, diceDistribution.inverseCumulativeProbability((5d-precision)/6d));//Can't use Double.MIN
43          Assert.assertEquals(6, diceDistribution.inverseCumulativeProbability((5d+precision)/6d));
44          Assert.assertEquals(6, diceDistribution.inverseCumulativeProbability((6d-precision)/6d));//Can't use Double.MIN
45          Assert.assertEquals(6, diceDistribution.inverseCumulativeProbability(6d/6d));
46      }
47  
48      @Test
49      public void testCumulativeProbabilitiesSingleArguments() {
50          for (int i = 1; i < 7; i++) {
51              Assert.assertEquals(p * i,
52                      diceDistribution.cumulativeProbability(i), Double.MIN_VALUE);
53          }
54          Assert.assertEquals(0.0,
55                  diceDistribution.cumulativeProbability(0), Double.MIN_VALUE);
56          Assert.assertEquals(1.0,
57                  diceDistribution.cumulativeProbability(7), Double.MIN_VALUE);
58      }
59  
60      @Test
61      public void testProbabilitiesRangeArguments() {
62          int lower = 0;
63          int upper = 6;
64          for (int i = 0; i < 2; i++) {
65              // cum(0,6) = p(0 < X <= 6) = 1, cum(1,5) = 4/6, cum(2,4) = 2/6
66              Assert.assertEquals(1 - p * 2 * i,
67                      diceDistribution.probability(lower, upper), 1E-12);
68              lower++;
69              upper--;
70          }
71          for (int i = 0; i < 6; i++) {
72              Assert.assertEquals(p, diceDistribution.probability(i, i+1), 1E-12);
73          }
74      }
75  
76      /**
77       * Simple distribution modeling a 6-sided die
78       */
79      class DiceDistribution extends AbstractIntegerDistribution {
80          public static final long serialVersionUID = 23734213;
81  
82          private final double p = 1d/6d;
83  
84          @Override
85          public double probability(int x) {
86              if (x < 1 || x > 6) {
87                  return 0;
88              } else {
89                  return p;
90              }
91          }
92  
93          @Override
94          public double cumulativeProbability(int x) {
95              if (x < 1) {
96                  return 0;
97              } else if (x >= 6) {
98                  return 1;
99              } else {
100                 return p * x;
101             }
102         }
103 
104         @Override
105         public double getMean() {
106             return 3.5;
107         }
108 
109         @Override
110         public double getVariance() {
111             return 70/24;  // E(X^2) - E(X)^2
112         }
113 
114         @Override
115         public int getSupportLowerBound() {
116             return 1;
117         }
118 
119         @Override
120         public int getSupportUpperBound() {
121             return 6;
122         }
123     }
124 }