/*
* File: NegativeBinomialDistributionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Mar 23, 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.distribution;
import gov.sandia.cognition.collection.CollectionUtil;
import gov.sandia.cognition.collection.IntegerSpan;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.VectorFactory;
import gov.sandia.cognition.statistics.ClosedFormIntegerDistributionTestHarness;
/**
* Unit tests for NegativeBinomialDistributionTest.
*
* @author krdixon
*/
public class NegativeBinomialDistributionTest
extends ClosedFormIntegerDistributionTestHarness
{
/**
* Tests for class NegativeBinomialDistributionTest.
* @param testName Name of the test.
*/
public NegativeBinomialDistributionTest(
String testName)
{
super(testName);
}
/**
* Test of getP method, of class NegativeBinomialDistribution.
*/
public void testGetP()
{
System.out.println("getP");
NegativeBinomialDistribution instance = this.createInstance();
assertTrue( 0.0 <= instance.getP() );
assertTrue( instance.getP() <= 1.0 );
}
/**
* Test of setP method, of class NegativeBinomialDistribution.
*/
public void testSetP()
{
System.out.println("setP");
NegativeBinomialDistribution instance = this.createInstance();
double p = RANDOM.nextDouble();
instance.setP(p);
assertEquals( p, instance.getP() );
p = 1.0;
instance.setP(p);
assertEquals( p, instance.getP() );
p = 0.0;
instance.setP(p);
assertEquals( p, instance.getP() );
try
{
instance.setP(-1.0);
fail( "P must be [0,1]" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
instance.setP(2.0);
fail( "P must be [0,1]" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of getR method, of class NegativeBinomialDistribution.
*/
public void testGetR()
{
System.out.println("getR");
NegativeBinomialDistribution instance = this.createInstance();
assertTrue( instance.getR() > 0 );
}
/**
* Test of setR method, of class NegativeBinomialDistribution.
*/
public void testSetR()
{
System.out.println("setR");
NegativeBinomialDistribution instance = this.createInstance();
double r = RANDOM.nextDouble() * 10.0 + 10.0;
instance.setR(r);
assertEquals( r, instance.getR() );
try
{
instance.setR(0);
fail( "R must be > 0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public NegativeBinomialDistribution createInstance()
{
double p = RANDOM.nextDouble();
double r = RANDOM.nextDouble() * 10.0 + 5.0;
return new NegativeBinomialDistribution( r, p );
}
@Override
public void testPMFConstructors()
{
System.out.println( "PMF Constructors" );
NegativeBinomialDistribution.PMF instance =
new NegativeBinomialDistribution.PMF();
assertEquals( NegativeBinomialDistribution.DEFAULT_R, instance.getR() );
assertEquals( NegativeBinomialDistribution.DEFAULT_P, instance.getP() );
double p = RANDOM.nextDouble();
double r = RANDOM.nextDouble()*10.0 + 1;
instance = new NegativeBinomialDistribution.PMF( r, p );
assertEquals( r, instance.getR() );
assertEquals( p, instance.getP() );
NegativeBinomialDistribution.PMF i2 =
new NegativeBinomialDistribution.PMF( instance );
assertEquals( instance.getR(), i2.getR() );
assertEquals( instance.getP(), i2.getP() );
}
@Override
public void testKnownGetDomain()
{
System.out.println( "Known getDomain" );
NegativeBinomialDistribution.CDF cdf = this.createInstance().getCDF();
IntegerSpan domain = cdf.getDomain();
assertEquals( 0, CollectionUtil.getFirst(domain).intValue() );
assertEquals( 1.0, cdf.evaluate( CollectionUtil.getElement(domain, domain.size()-1) ), TOLERANCE );
}
@Override
public void testPMFKnownValues()
{
System.out.println( "PMF Known Values" );
NegativeBinomialDistribution.PMF pmf =
new NegativeBinomialDistribution.PMF( 10, 0.4 );
assertEquals( 0.12395856317, pmf.evaluate(6), TOLERANCE );
assertEquals( 0.11067728855, pmf.evaluate(4), TOLERANCE );
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "Known convertToVector" );
NegativeBinomialDistribution instance = this.createInstance();
Vector parameters = instance.convertToVector();
assertEquals( 2, parameters.getDimensionality() );
assertEquals( instance.getR(), parameters.getElement(0) );
assertEquals( instance.getP(), parameters.getElement(1) );
}
@Override
public void testDistributionConstructors()
{
System.out.println( "Distribution Constructors" );
NegativeBinomialDistribution instance = new NegativeBinomialDistribution();
assertEquals( NegativeBinomialDistribution.DEFAULT_R, instance.getR() );
assertEquals( NegativeBinomialDistribution.DEFAULT_P, instance.getP() );
double p = RANDOM.nextDouble();
double r = RANDOM.nextDouble()*10.0 + 1;
instance = new NegativeBinomialDistribution( r, p );
assertEquals( r, instance.getR() );
assertEquals( p, instance.getP() );
NegativeBinomialDistribution i2 = new NegativeBinomialDistribution( instance );
assertEquals( instance.getR(), i2.getR() );
assertEquals( instance.getP(), i2.getP() );
}
@Override
public void testCDFConstructors()
{
System.out.println( "CDF Constructors" );
NegativeBinomialDistribution.CDF instance =
new NegativeBinomialDistribution.CDF();
assertEquals( NegativeBinomialDistribution.DEFAULT_R, instance.getR() );
assertEquals( NegativeBinomialDistribution.DEFAULT_P, instance.getP() );
double p = RANDOM.nextDouble();
double r = RANDOM.nextDouble()*10.0 + 1;
instance = new NegativeBinomialDistribution.CDF( r, p );
assertEquals( r, instance.getR() );
assertEquals( p, instance.getP() );
NegativeBinomialDistribution.CDF i2 =
new NegativeBinomialDistribution.CDF( instance );
assertEquals( instance.getR(), i2.getR() );
assertEquals( instance.getP(), i2.getP() );
}
@Override
public void testCDFKnownValues()
{
System.out.println( "CDF Known Values" );
NegativeBinomialDistribution.CDF cdf =
new NegativeBinomialDistribution.CDF( 10, 0.4 );
assertEquals( 0.527174272325658, cdf.evaluate(6), TOLERANCE );
assertEquals( 0.27925698723913767, cdf.evaluate(4), TOLERANCE );
}
@Override
public void testCDFConvertFromVector()
{
System.out.println( "CDF.convertToVector" );
NegativeBinomialDistribution instance = this.createInstance();
int r = RANDOM.nextInt(10) + 1;
double p = RANDOM.nextDouble();
instance.setR(r);
instance.setP(p);
Vector parameters = instance.convertToVector();
parameters.setElement(0, r);
parameters.setElement(1, p);
instance.convertFromVector(parameters);
Vector p2 = instance.convertToVector();
assertEquals( parameters, p2 );
try
{
instance.convertFromVector(null);
System.out.println( "Cannot have null parameters" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
Vector p3 = VectorFactory.getDefault().copyValues(1.0, 0.5, 1.0 );
instance.convertFromVector(p3);
fail( "Wrong dimensions!" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Learner
*/
public void testLearner()
{
System.out.println( "Learner" );
this.distributionEstimatorTest( new NegativeBinomialDistribution.MaximumLikelihoodEstimator() );
}
}