/* * File: BinomialDistribution.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright August 19, 2007, Sandia Corporation. Under the terms of Contract * DE-AC04-94AL85000, there is a non-exclusive license for use of this work by * or on behalf of the U.S. Government. Export of this program may require a * license from the United States Government. See CopyrightHistory.txt for * complete details. * */ package gov.sandia.cognition.statistics.distribution; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.VectorFactory; import gov.sandia.cognition.statistics.ClosedFormIntegerDistributionTestHarness; /** * * @author Kevin R. Dixon */ public class BinomialDistributionTest extends ClosedFormIntegerDistributionTestHarness { /** * Constructor * @param testName Tests */ public BinomialDistributionTest( String testName ) { super( testName ); } @Override public BinomialDistribution createInstance() { double p = RANDOM.nextDouble(); int N = RANDOM.nextInt( 10 ) + 5; return new BinomialDistribution( N, p ); } /** * Default constructor */ public void testDefaultConstructor() { System.out.println( "Default constructor" ); BinomialDistribution bi = new BinomialDistribution.PMF(); assertEquals( BinomialDistribution.DEFAULT_P, bi.getP() ); assertEquals( BinomialDistribution.DEFAULT_N, bi.getN() ); bi = new BinomialDistribution.CDF(); assertEquals( BinomialDistribution.DEFAULT_P, bi.getP() ); assertEquals( BinomialDistribution.DEFAULT_N, bi.getN() ); } @Override public void testPMFKnownValues() { System.out.println( "PMF.evaluate" ); // I got these values from octave's binomial_pdf() function assertEquals( 0.4782969000, BinomialDistribution.PMF.evaluate( 7, 0, 0.1 ), TOLERANCE ); assertEquals( 0.0025515000, BinomialDistribution.PMF.evaluate( 7, 4, 0.1 ), TOLERANCE ); assertEquals( 0.1384150213, BinomialDistribution.PMF.evaluate( 25, 4, 0.1 ), TOLERANCE ); assertEquals( 0.0572314020, BinomialDistribution.PMF.evaluate( 25, 4, 0.3 ), TOLERANCE ); } @Override public void testCDFKnownValues() { System.out.println( "CDF.evaluate" ); BinomialDistribution.CDF cdf = new BinomialDistribution.CDF( 10, 0.25 ); // I got these numbers from octave's function binomial_cdf(x,N,p) assertEquals( 0.244025, cdf.evaluate( 1.0 ), TOLERANCE ); assertEquals( 0.244025, cdf.evaluate( 1.5 ), TOLERANCE ); assertEquals( 0.980272, cdf.evaluate( 5.0 ), TOLERANCE ); assertEquals( 0.980272, cdf.evaluate( 5.9 ), TOLERANCE ); assertEquals( 0.999970, cdf.evaluate( 8.0 ), TOLERANCE ); assertEquals( 1.0, cdf.evaluate( 10.0 ), TOLERANCE ); } /** * Test of getN method, of class gov.sandia.cognition.learning.util.statistics.BinomialDistribution.CumulativeDistribution. */ public void testGetN() { System.out.println( "getN" ); int N = 10; double p = RANDOM.nextDouble(); BinomialDistribution.PMF instance = new BinomialDistribution.PMF( N, p ); assertEquals( N, instance.getN() ); } /** * Test of setN method, of class gov.sandia.cognition.learning.util.statistics.BinomialDistribution.CumulativeDistribution. */ public void testSetN() { System.out.println( "setN" ); int N = 10; double p = RANDOM.nextDouble(); BinomialDistribution.PMF instance = new BinomialDistribution.PMF( N, p ); assertEquals( N, instance.getN() ); int N2 = N + 1; instance.setN( N2 ); assertEquals( N2, instance.getN() ); instance.setN( 1 ); try { instance.setN( 0 ); fail( "N must be > 0" ); } catch (Exception e) { System.out.println( "Good: " + e ); } } /** * Test of getP method, of class gov.sandia.cognition.learning.util.statistics.BinomialDistribution.CumulativeDistribution. */ public void testGetP() { System.out.println( "getP" ); int N = 10; double p = RANDOM.nextDouble(); BinomialDistribution.CDF instance = new BinomialDistribution.CDF( N, p ); assertEquals( p, instance.getP() ); } /** * Test of setP method, of class gov.sandia.cognition.learning.util.statistics.BinomialDistribution.CumulativeDistribution. */ public void testSetP() { System.out.println( "setP" ); int N = 10; double p = RANDOM.nextDouble(); BinomialDistribution.CDF instance = new BinomialDistribution.CDF( N, p ); assertEquals( p, instance.getP() ); double p2 = p / 2.0; instance.setP( p2 ); assertEquals( p2, instance.getP() ); instance.setP( 1.0 ); instance.setP( 0.0 ); try { instance.setP( 1.1 ); fail( "P must be <= 1.0" ); } catch (Exception e) { System.out.println( "Good: " + e ); } try { instance.setP( -1.1 ); fail( "P must be >= 0.0" ); } catch (Exception e) { System.out.println( "Good: " + e ); } } /** * Test of getDomain method, of class BinomialDistribution. */ @Override public void testKnownGetDomain() { System.out.println( "getDomain" ); int N = 10; BinomialDistribution.PMF b = new BinomialDistribution.PMF( N, RANDOM.nextDouble() ); int index = 0; for (Number v : b.getDomain()) { assertEquals( index, v.intValue() ); index++; } assertEquals( N + 1, index ); } @Override public void testKnownConvertToVector() { System.out.println( "CDF.convertToVector" ); BinomialDistribution cdf = this.createInstance(); Vector x = cdf.convertToVector(); assertEquals( 2, x.getDimensionality() ); assertEquals( (double) cdf.getN(), x.getElement( 0 ) ); assertEquals( cdf.getP(), x.getElement( 1 ) ); } @Override public void testCDFConvertFromVector() { BinomialDistribution cdf = this.createInstance(); Vector x1 = cdf.convertToVector(); assertNotNull( x1 ); int N = x1.getDimensionality(); // Create a new parameterization of the CDF // (try using positive parameters as some distributions need // positive parameters) final double r = 2.0; Vector y1 = VectorFactory.getDefault().copyValues( RANDOM.nextInt( 10 ) + 1, RANDOM.nextDouble() ); cdf.convertFromVector( y1 ); Vector y2 = cdf.convertToVector(); assertNotNull( y2 ); assertNotSame( y1, y2 ); assertEquals( y1, y2 ); // Convert back to the original parameterization cdf.convertFromVector( x1 ); Vector x2 = cdf.convertToVector(); assertNotNull( x2 ); assertNotSame( x1, x2 ); assertEquals( x1, x2 ); try { cdf.convertFromVector( null ); fail( "Cannot convert from null Vector" ); } catch (Exception e) { System.out.println( "Good: " + e ); } try { Vector z1 = VectorFactory.getDefault().createUniformRandom( N-1, r, r, RANDOM ); cdf.convertFromVector( z1 ); fail( "Cannot convert from a N-1 dimension Vector!" ); } catch (Exception e) { System.out.println( "Good: " + e ); } try { Vector z1 = VectorFactory.getDefault().createUniformRandom( N+1, r, r, RANDOM ); cdf.convertFromVector( z1 ); fail( "Cannot convert from a N+1 dimension Vector!" ); } catch (Exception e) { System.out.println( "Good: " + e ); } } @Override public void testPMFConstructors() { System.out.println( "PMF Constructors" ); BinomialDistribution.PMF instance = new BinomialDistribution.PMF(); assertEquals( BinomialDistribution.DEFAULT_P, instance.getP() ); assertEquals( BinomialDistribution.DEFAULT_N, instance.getN() ); double p = RANDOM.nextDouble(); int N = RANDOM.nextInt( 10 ) + 1; instance = new BinomialDistribution.PMF( N, p ); assertEquals( N, instance.getN() ); assertEquals( p, instance.getP() ); BinomialDistribution.PMF d2 = new BinomialDistribution.PMF( instance ); assertEquals( instance.getN(), d2.getN() ); assertEquals( instance.getP(), d2.getP() ); } @Override public void testDistributionConstructors() { System.out.println( "Constructors" ); BinomialDistribution instance = new BinomialDistribution(); assertEquals( BinomialDistribution.DEFAULT_P, instance.getP() ); assertEquals( BinomialDistribution.DEFAULT_N, instance.getN() ); double p = RANDOM.nextDouble(); int N = RANDOM.nextInt( 10 ) + 1; instance = new BinomialDistribution( N, p ); assertEquals( N, instance.getN() ); assertEquals( p, instance.getP() ); BinomialDistribution d2 = new BinomialDistribution( instance ); assertEquals( instance.getN(), d2.getN() ); assertEquals( instance.getP(), d2.getP() ); } @Override public void testCDFConstructors() { System.out.println( "CDF Constructors" ); BinomialDistribution.CDF instance = new BinomialDistribution.CDF(); assertEquals( BinomialDistribution.DEFAULT_P, instance.getP() ); assertEquals( BinomialDistribution.DEFAULT_N, instance.getN() ); double p = RANDOM.nextDouble(); int N = RANDOM.nextInt( 10 ) + 1; instance = new BinomialDistribution.CDF( N, p ); assertEquals( N, instance.getN() ); assertEquals( p, instance.getP() ); BinomialDistribution.CDF d2 = new BinomialDistribution.CDF( instance ); assertEquals( instance.getN(), d2.getN() ); assertEquals( instance.getP(), d2.getP() ); } }