/* * File: AdaptiveRejectionSamplingTest.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright May 5, 2010, 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.bayesian; import gov.sandia.cognition.statistics.distribution.BetaDistribution; import gov.sandia.cognition.statistics.distribution.UnivariateGaussian; import gov.sandia.cognition.statistics.method.KolmogorovSmirnovConfidence; import java.io.IOException; import java.util.ArrayList; import junit.framework.TestCase; import java.util.Random; /** * Unit tests for AdaptiveRejectionSamplingTest. * * @author krdixon */ public class AdaptiveRejectionSamplingTest extends TestCase { /** * Random number generator to use for a fixed random seed. */ public Random RANDOM = new Random( 1 ); /** * Default tolerance of the regression tests, {@value}. */ public double TOLERANCE = 1e-5; /** * Number of samples to draw. */ public int NUM_SAMPLES = 1000; /** * Tests for class AdaptiveRejectionSamplingTest. * @param testName Name of the test. */ public AdaptiveRejectionSamplingTest( String testName) { super(testName); } /** * Creates an instance * @return * Instance */ public AdaptiveRejectionSampling createInstance() { AdaptiveRejectionSampling instance = new AdaptiveRejectionSampling(); BetaDistribution.PDF f = new BetaDistribution.PDF( 2, 2 ); instance.initialize( new AdaptiveRejectionSampling.PDFLogEvaluator(f), 0.0, 1.0, 0.2, 0.5, 0.6 ); return instance; } /** * Tests the constructors of class AdaptiveRejectionSamplingTest. */ public void testConstructors() { System.out.println( "Constructors" ); AdaptiveRejectionSampling instance = new AdaptiveRejectionSampling(); assertNotNull( instance ); } /** * Test of clone method, of class AdaptiveRejectionSampling. */ public void testClone() { System.out.println("clone"); AdaptiveRejectionSampling instance = this.createInstance(); AdaptiveRejectionSampling clone = instance.clone(); assertNotNull( clone ); assertNotSame( instance, clone ); assertNotSame( instance.getLogFunction(), clone.getLogFunction() ); assertNotSame( instance.upperEnvelope, clone.upperEnvelope ); assertNotSame( instance.lowerEnvelope, clone.lowerEnvelope ); assertEquals( instance.getMaxNumPoints(), clone.getMaxNumPoints() ); assertEquals( instance.getMinSupport(), clone.getMinSupport() ); assertEquals( instance.getMaxSupport(), clone.getMaxSupport() ); assertNotSame( instance.getPoints(), clone.getPoints() ); assertEquals( instance.getPoints().size(), clone.getPoints().size() ); Random r1 = new Random( 10 ); Random r2 = new Random( 10 ); ArrayList<Double> s1 = instance.sample(r1, NUM_SAMPLES); ArrayList<Double> s2 = clone.sample(r2, NUM_SAMPLES); assertEquals( s1.size(), s2.size() ); for( int i = 0; i < s1.size(); i++ ) { assertEquals( s1.get(i), s2.get(i) ); } } /** * Envelope */ public void testEnvelope() { System.out.println( "Envelope" ); AdaptiveRejectionSampling instance = new AdaptiveRejectionSampling(); BetaDistribution.PDF f = new BetaDistribution.PDF( 2, 2 ); instance.setMinSupport((double) f.getMinSupport()); instance.setMaxSupport((double) f.getMaxSupport()); double[] xs = { 0.8, 0.2, 0.55, 0.4 }; for( int i = 0; i < xs.length; i++ ) { double y = f.logEvaluate(xs[i]); instance.addPoint( xs[i], y ); } double lastX = -1; AdaptiveRejectionSampling.UpperEnvelope ue = instance.new UpperEnvelope(); AdaptiveRejectionSampling.LowerEnvelope le = instance.new LowerEnvelope(); for( AdaptiveRejectionSampling.Point p : instance.getPoints() ) { double x = p.getInput(); double ly = ue.logEvaluate(x); System.out.printf( "%f < log(f(%f)) = %f < %f\n", le.logEvaluate(x), x, p.getOutput(), ly); assertTrue( lastX < x ); lastX = x; } for( double x = 0.0; x <= 1.0; x += 0.01 ) { double ly = ue.logEvaluate(x); double lb = f.logEvaluate(x); double lenv = le.logEvaluate(x); if( !Double.isInfinite(ly) ) { assertTrue( lb-ly <= TOLERANCE ); } if( !Double.isInfinite(lenv) ) { // assertTrue( lenv-lb <= TOLERANCE ); } } } /** * computeSegments */ public void testComputeSegments() { System.out.println( "computeSegments" ); AdaptiveRejectionSampling instance = new AdaptiveRejectionSampling(); BetaDistribution.PDF f = new BetaDistribution.PDF( 2, 2 ); instance.setMinSupport((double) f.getMinSupport()); instance.setMaxSupport((double) f.getMaxSupport()); double[] xs = { 0.8, 0.2, 0.55, 0.4, 0.3, 0.7 }; for( int i = 0; i < xs.length; i++ ) { double y = f.logEvaluate(xs[i]); instance.addPoint(xs[i], y); } AdaptiveRejectionSampling.UpperEnvelope ue = instance.upperEnvelope; AdaptiveRejectionSampling.LowerEnvelope le = instance.lowerEnvelope; ArrayList<AdaptiveRejectionSampling.LineSegment> segments = ue.getLines(); for( int i = 0; i < segments.size(); i++ ) { AdaptiveRejectionSampling.LineSegment segment = segments.get(i); double weight = ue.segmentCDF[i]; System.out.printf( "y = %f*x+%f [%.3f,%.3f], int=%f\n", segment.getQ1(), segment.getQ0(), segment.left, segment.right, weight ); } } /** * Sample beta * @throws IOException */ public void testSampleBeta() throws IOException { System.out.println( "Sample Beta" ); BetaDistribution.PDF f = new BetaDistribution.PDF( 2, 2 ); long start = System.currentTimeMillis(); AdaptiveRejectionSampling instance = new AdaptiveRejectionSampling(); instance.setMaxNumPoints(10); instance.initialize( new AdaptiveRejectionSampling.PDFLogEvaluator(f), f.getMinSupport(), f.getMaxSupport(), 0.2, 0.5, 0.6); ArrayList<Double> samples = instance.sample(RANDOM, NUM_SAMPLES); long stop = System.currentTimeMillis(); System.out.println( "ARS Time = " + (stop-start)/1000.0); KolmogorovSmirnovConfidence.Statistic kstest = KolmogorovSmirnovConfidence.evaluateNullHypothesis(samples,f.getCDF()); System.out.println( "K-S test: " + kstest ); samples = null; start = System.currentTimeMillis(); samples = f.sample(RANDOM, NUM_SAMPLES); stop = System.currentTimeMillis(); System.out.println( "Beta Time = " + (stop-start)/1000.0); } /** * Sample Gaussian */ public void testSampleGaussian() { System.out.println( "sample Gaussian" ); UnivariateGaussian.PDF f = new UnivariateGaussian.PDF( 0, 1 ); long start = System.currentTimeMillis(); AdaptiveRejectionSampling instance = new AdaptiveRejectionSampling(); instance.setMaxNumPoints(10); instance.initialize( new AdaptiveRejectionSampling.PDFLogEvaluator(f), f.getMinSupport(), f.getMaxSupport(), -1.0, 0.0, 1.0); ArrayList<Double> samples = instance.sample(RANDOM, NUM_SAMPLES); long stop = System.currentTimeMillis(); System.out.println( "ARS Time = " + (stop-start)/1000.0); KolmogorovSmirnovConfidence.Statistic kstest = KolmogorovSmirnovConfidence.evaluateNullHypothesis(samples,f.getCDF()); System.out.println( "K-S test: " + kstest ); samples = null; start = System.currentTimeMillis(); samples = f.sample(RANDOM, NUM_SAMPLES); stop = System.currentTimeMillis(); System.out.println( "Gaussian Time = " + (stop-start)/1000.0); } /** * Upper Envelope */ public void testUpperEnvelope() { System.out.println( "Upper Envelope" ); AdaptiveRejectionSampling instance = this.createInstance(); AdaptiveRejectionSampling.UpperEnvelope ue = instance.upperEnvelope; double x = RANDOM.nextDouble(); assertEquals( ue.evaluate(x), Math.exp(ue.logEvaluate(x) )); assertSame( ue, ue.getProbabilityFunction() ); try { ue.getMean(); fail( "Can't get mean" ); } catch (Exception e) { System.out.println( "Good: " + e ); } } }