/* * File: ChiSquareDistributionTest.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright September 7, 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.statistics.SmoothUnivariateDistributionTestHarness; import java.util.Random; /** * Tests ChiSquareDistribution * @author Kevin R. Dixon */ public class ChiSquareDistributionTest extends SmoothUnivariateDistributionTestHarness { /** * Constructor * @param testName name */ public ChiSquareDistributionTest( String testName ) { super( testName ); } @Override public ChiSquareDistribution createInstance() { double dof = RANDOM.nextDouble() * 5 + 1; return new ChiSquareDistribution( dof ); } @Override public void testPDFKnownValues() { System.out.println( "PDF.evaluate" ); // I got these values from the chisquare_pdf() function in octave assertEquals( 0.2419707245, ChiSquareDistribution.PDF.evaluate( 1.0, 1.0 ), TOLERANCE ); assertEquals( 0.3032653299, ChiSquareDistribution.PDF.evaluate( 1.0, 2.0 ), TOLERANCE ); assertEquals( 0.4756147123, ChiSquareDistribution.PDF.evaluate( 0.1, 2.0 ), TOLERANCE ); assertEquals( 0.0040001298, ChiSquareDistribution.PDF.evaluate( 0.1, 5.0 ), TOLERANCE ); assertEquals( 0.0668009429, ChiSquareDistribution.PDF.evaluate( 5.0, 10.0 ), TOLERANCE ); try { ChiSquareDistribution.PDF.evaluate( RANDOM.nextDouble(), 0.0 ); fail( "DOF must be > 0.0" ); } catch (Exception e) { System.out.println( "Good: " + e ); } } /** * Test of getDegreesOfFreedom method, of class gov.sandia.cognition.learning.util.statistics.distribution.ChiSquareDistribution. */ public void testGetDegreesOfFreedom() { System.out.println( "getDegreesOfFreedom" ); double dof = RANDOM.nextDouble() * 10.0; ChiSquareDistribution.PDF instance = new ChiSquareDistribution.PDF( dof ); assertEquals( dof, instance.getDegreesOfFreedom() ); } /** * Test of setDegreesOfFreedom method, of class gov.sandia.cognition.learning.util.statistics.distribution.ChiSquareDistribution. */ public void testSetDegreesOfFreedom() { System.out.println( "setDegreesOfFreedom" ); double dof = RANDOM.nextDouble() * 10.0; ChiSquareDistribution.PDF instance = new ChiSquareDistribution.PDF( dof ); assertEquals( dof, instance.getDegreesOfFreedom() ); dof += RANDOM.nextDouble(); instance.setDegreesOfFreedom( dof ); assertEquals( dof, instance.getDegreesOfFreedom() ); try { instance.setDegreesOfFreedom( 0.0 ); fail( "DOF must be > 0.0" ); } catch (Exception e) { System.out.println( "Good: " + e ); } } @Override public void testCDFKnownValues() { System.out.println( "CDF.evaluate" ); // Checked using the chisquare_cdf() function in octave assertEquals( 0.6826894921, ChiSquareDistribution.CDF.evaluate( 1.0, 1.0 ), TOLERANCE ); assertEquals( 0.8427007929, ChiSquareDistribution.CDF.evaluate( 2.0, 1.0 ), TOLERANCE ); assertEquals( 0.9746526813, ChiSquareDistribution.CDF.evaluate( 5.0, 1.0 ), TOLERANCE ); assertEquals( 0.3934693403, ChiSquareDistribution.CDF.evaluate( 1.0, 2.0 ), TOLERANCE ); assertEquals( 0.6321205588, ChiSquareDistribution.CDF.evaluate( 2.0, 2.0 ), TOLERANCE ); assertEquals( 0.9179150014, ChiSquareDistribution.CDF.evaluate( 5.0, 2.0 ), TOLERANCE ); assertEquals( 0.0374342268, ChiSquareDistribution.CDF.evaluate( 1.0, 5.0 ), TOLERANCE ); assertEquals( 0.1508549639, ChiSquareDistribution.CDF.evaluate( 2.0, 5.0 ), TOLERANCE ); assertEquals( 0.5841198130, ChiSquareDistribution.CDF.evaluate( 5.0, 5.0 ), TOLERANCE ); } @Override public void testKnownConvertToVector() { System.out.println( "CDF.convertToVector" ); ChiSquareDistribution instance = this.createInstance(); Vector x = instance.convertToVector(); assertEquals( 1, x.getDimensionality() ); assertEquals( instance.getDegreesOfFreedom(), x.getElement( 0 ) ); } @Override public void testPDFConstructors() { System.out.println( "CDF Constructor" ); ChiSquareDistribution.PDF instance = new ChiSquareDistribution.PDF(); assertEquals( ChiSquareDistribution.DEFAULT_DEGREES_OF_FREEDOM, instance.getDegreesOfFreedom() ); double dof = Math.abs(RANDOM.nextGaussian()); instance = new ChiSquareDistribution.PDF( dof ); assertEquals( dof, instance.getDegreesOfFreedom() ); ChiSquareDistribution.PDF d2 = new ChiSquareDistribution.PDF( instance ); assertEquals( instance.getDegreesOfFreedom(), d2.getDegreesOfFreedom() ); } @Override public void testDistributionConstructors() { System.out.println( "Constructor" ); ChiSquareDistribution instance = new ChiSquareDistribution(); assertEquals( ChiSquareDistribution.DEFAULT_DEGREES_OF_FREEDOM, instance.getDegreesOfFreedom() ); double dof = Math.abs(RANDOM.nextGaussian()); instance = new ChiSquareDistribution( dof ); assertEquals( dof, instance.getDegreesOfFreedom() ); ChiSquareDistribution d2 = new ChiSquareDistribution( instance ); assertEquals( instance.getDegreesOfFreedom(), d2.getDegreesOfFreedom() ); } @Override public void testCDFConstructors() { System.out.println( "CDF Constructor" ); ChiSquareDistribution.CDF instance = new ChiSquareDistribution.CDF(); assertEquals( ChiSquareDistribution.DEFAULT_DEGREES_OF_FREEDOM, instance.getDegreesOfFreedom() ); double dof = Math.abs(RANDOM.nextGaussian()); instance = new ChiSquareDistribution.CDF( dof ); assertEquals( dof, instance.getDegreesOfFreedom() ); ChiSquareDistribution.CDF d2 = new ChiSquareDistribution.CDF( instance ); assertEquals( instance.getDegreesOfFreedom(), d2.getDegreesOfFreedom() ); } @Override public void testDistributionGetVariance() { RANDOM = new Random(2); super.testDistributionGetVariance(); } }