/* * File: ProbabilityMassFunctionUtilTest.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright Feb 4, 2009, 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; import gov.sandia.cognition.learning.data.InputOutputPair; import gov.sandia.cognition.math.MathUtil; import gov.sandia.cognition.statistics.distribution.BinomialDistribution; import gov.sandia.cognition.statistics.distribution.ScalarDataDistribution; import java.util.ArrayList; import java.util.Random; import junit.framework.TestCase; /** * JUnit tests for class ProbabilityMassFunctionUtilTest * @author Kevin R. Dixon */ public class ProbabilityMassFunctionUtilTest extends TestCase { public Random random = new Random( 1 ); /** * Entry point for JUnit tests for class ProbabilityMassFunctionUtilTest * @param testName name of this test */ public ProbabilityMassFunctionUtilTest( String testName) { super(testName); } /** * Constructors */ public void testConstructors() { System.out.println( "Constructors" ); ProbabilityMassFunctionUtil instance = new ProbabilityMassFunctionUtil(); assertNotNull( instance ); } /** * Test of getEntropy method, of class ProbabilityMassFunctionUtil. */ public void testGetEntropy() { System.out.println( "getEntropy" ); ProbabilityMassFunction<Number> pmf = new BinomialDistribution.PMF( 10, random.nextDouble() ); double sum = 0.0; for( Number x : pmf.getDomain() ) { double p = pmf.evaluate( x ); sum -= p*MathUtil.log2( p ); } assertEquals( sum, ProbabilityMassFunctionUtil.getEntropy( pmf ) ); } /** * Test of sample method, of class ProbabilityMassFunctionUtil. */ public void testSample() { System.out.println( "sample" ); BinomialDistribution.PMF pmf = new BinomialDistribution.PMF( 10, random.nextDouble() ); int numSamples = 1000; Random random1a = new Random( 1 ); ArrayList<Number> r1a = ProbabilityMassFunctionUtil.sample( pmf, random1a, numSamples ); assertEquals( numSamples, r1a.size() ); Random random1b = new Random( 1 ); ArrayList<Number> r1b = ProbabilityMassFunctionUtil.sample( pmf, random1b, numSamples ); assertEquals( numSamples, r1b.size() ); for( int i = 0; i < numSamples; i++ ) { // assertNotSame( r1a.get(i), r1b.get(i) ); assertEquals( r1a.get(i), r1b.get(i) ); } ScalarDataDistribution.PMF s1a = new ScalarDataDistribution.PMF( r1a ); for( Number x : pmf.getDomain() ) { assertEquals( pmf.evaluate( x ), s1a.evaluate( x.doubleValue() ), Math.sqrt(numSamples/pmf.getVariance()) ); } } /** * Single sample */ public void testSingleSample() { System.out.println( "Single sample" ); BinomialDistribution.PMF pmf = new BinomialDistribution.PMF( 10, random.nextDouble() ); Random r1 = new Random(1); Random r2 = new Random(1); for( int n = 0; n < 100; n++ ) { assertEquals( ProbabilityMassFunctionUtil.sampleSingle(pmf, r1), ProbabilityMassFunctionUtil.sample(pmf, r2, 1).get(0) ); } int numSamples = 1000; ArrayList<Number> singleSamples = new ArrayList<Number>( numSamples ); for( int i = 0; i < numSamples; i++ ) { singleSamples.add( ProbabilityMassFunctionUtil.sampleSingle(pmf,r1) ); } ArrayList<Number> multiSamples = ProbabilityMassFunctionUtil.sampleMultiple(pmf, r2, numSamples); for( int i = 0; i < numSamples; i++ ) { assertEquals( singleSamples.get(i), multiSamples.get(i) ); } } /** * inverse */ public void testInverse() { System.out.println( "inverse" ); BinomialDistribution.CDF cdf = new BinomialDistribution.CDF( 10, random.nextDouble() ); int numSamples = 1000; ArrayList<Number> samples = cdf.sample(random, numSamples); for( int n = 0; n < samples.size(); n++ ) { double p = cdf.evaluate(samples.get(n)); InputOutputPair<Number,Double> result = ProbabilityMassFunctionUtil.inverse(cdf, p); Number xhat = result.getInput(); double phat = result.getOutput(); double pxhat = cdf.evaluate(xhat); assertEquals( pxhat, phat ); assertTrue( phat <= p ); Integer xhatp1 = xhat.intValue()+1; double phatp1 = cdf.evaluate(xhatp1); assertTrue( phatp1 >= p ); } } /** * computeCumulativeValue */ public void testComputeCumulativeValue() { System.out.println( "computeCumulativeValue" ); BinomialDistribution.CDF cdf = new BinomialDistribution.CDF( random.nextInt(10) + 10, random.nextDouble() ); for( Integer x : cdf.getDomain() ) { double phat = ProbabilityMassFunctionUtil.computeCumulativeValue(x,cdf); double p = cdf.evaluate(x); assertEquals( p, phat, 1e-5 ); } } }