/*
* File: MultivariatePolyaDistributionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright May 15, 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.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.VectorFactory;
import gov.sandia.cognition.statistics.MultivariateClosedFormComputableDiscreteDistributionTestHarness;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Unit tests for MultivariatePolyaDistributionTest.
*
* @author krdixon
*/
public class MultivariatePolyaDistributionTest
extends MultivariateClosedFormComputableDiscreteDistributionTestHarness<Vector>
{
/**
* Tests for class MultivariatePolyaDistributionTest.
* @param testName Name of the test.
*/
public MultivariatePolyaDistributionTest(
String testName)
{
super(testName);
}
@Override
public MultivariatePolyaDistribution createInstance()
{
final double r = 10.0;
int N = 6;
Vector a = VectorFactory.getDefault().copyValues(
r*RANDOM.nextDouble(), r*RANDOM.nextDouble(), r*RANDOM.nextDouble() );
return new MultivariatePolyaDistribution( a, N );
}
/**
* Tests the constructors of class MultivariatePolyaDistributionTest.
*/
@Override
public void testConstructors()
{
System.out.println( "Constructors" );
MultivariatePolyaDistribution instance = new MultivariatePolyaDistribution();
assertEquals( MultivariatePolyaDistribution.DEFAULT_DIMENSIONALITY,
instance.getInputDimensionality() );
assertEquals( MultivariatePolyaDistribution.DEFAULT_NUM_TRIALS,
instance.getNumTrials() );
int dim = RANDOM.nextInt(100) + 10;
int numTrials = RANDOM.nextInt(100) + 10;
instance = new MultivariatePolyaDistribution( dim, numTrials );
assertEquals( dim, instance.getInputDimensionality() );
assertEquals( numTrials, instance.getNumTrials() );
Vector p = VectorFactory.getDefault().createUniformRandom(
dim, 0.0,10.0, RANDOM );
instance = new MultivariatePolyaDistribution( p, numTrials );
assertSame( p, instance.getParameters() );
assertEquals( numTrials, instance.getNumTrials() );
MultivariatePolyaDistribution i2 = new MultivariatePolyaDistribution(instance);
assertNotSame( i2.getParameters(), instance.getParameters() );
assertEquals( i2.getParameters(), instance.getParameters() );
assertEquals( i2.getNumTrials(), instance.getNumTrials() );
}
/**
* PMF constructors
*/
public void testProbabilityFunctionConstructors()
{
System.out.println( "PMF Constructors" );
MultivariatePolyaDistribution.PMF instance = new MultivariatePolyaDistribution.PMF();
assertEquals( MultivariatePolyaDistribution.DEFAULT_DIMENSIONALITY,
instance.getInputDimensionality() );
assertEquals( MultivariatePolyaDistribution.DEFAULT_NUM_TRIALS,
instance.getNumTrials() );
int dim = RANDOM.nextInt(100) + 10;
int numTrials = RANDOM.nextInt(100) + 10;
instance = new MultivariatePolyaDistribution.PMF( dim, numTrials );
assertEquals( dim, instance.getInputDimensionality() );
assertEquals( numTrials, instance.getNumTrials() );
Vector p = VectorFactory.getDefault().createUniformRandom(
dim, 0.0,10.0, RANDOM );
instance = new MultivariatePolyaDistribution.PMF( p, numTrials );
assertSame( p, instance.getParameters() );
assertEquals( numTrials, instance.getNumTrials() );
MultivariatePolyaDistribution.PMF i2 =
new MultivariatePolyaDistribution.PMF(instance);
assertNotSame( i2.getParameters(), instance.getParameters() );
assertEquals( i2.getParameters(), instance.getParameters() );
assertEquals( i2.getNumTrials(), instance.getNumTrials() );
}
/**
* Test of getNumTrials method, of class MultivariatePolyaDistribution.
*/
public void testGetNumTrials()
{
System.out.println("getNumTrials");
int numTrials = RANDOM.nextInt(100) + 1;
MultivariatePolyaDistribution instance = this.createInstance();
instance.setNumTrials(numTrials);
assertEquals( numTrials, instance.getNumTrials() );
}
@Override
public void testGetMean()
{
int temp = NUM_SAMPLES;
NUM_SAMPLES = 1000;
double t = TOLERANCE;
TOLERANCE = 1e-1;
super.testGetMean();
TOLERANCE = t;
NUM_SAMPLES = temp;
}
/**
* Test of setNumTrials method, of class MultivariatePolyaDistribution.
*/
public void testSetNumTrials()
{
System.out.println("setNumTrials");
int numTrials = RANDOM.nextInt(100) + 1;
MultivariatePolyaDistribution instance = this.createInstance();
instance.setNumTrials(numTrials);
assertEquals( numTrials, instance.getNumTrials() );
try
{
instance.setNumTrials(0);
fail( "numTrials must be > 0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of getInputDimensionality method, of class MultivariatePolyaDistribution.
*/
public void testGetInputDimensionality()
{
System.out.println("getInputDimensionality");
MultivariatePolyaDistribution instance = this.createInstance();
assertEquals( instance.getInputDimensionality(),
instance.getParameters().getDimensionality() );
}
/**
* Test of getParameters method, of class MultivariatePolyaDistribution.
*/
public void testGetParameters()
{
System.out.println("getParameters");
MultivariatePolyaDistribution instance = this.createInstance();
Vector p = instance.getParameters().scale( 2.0 );
instance.setParameters(p);
assertEquals( p, instance.getParameters() );
}
/**
* Test of setParameters method, of class MultivariatePolyaDistribution.
*/
public void testSetParameters()
{
System.out.println("setParameters");
MultivariatePolyaDistribution instance = this.createInstance();
Vector p = instance.getParameters().scale( 2.0 );
instance.setParameters(p);
assertEquals( p, instance.getParameters() );
p.setElement(0, 0.0);
try
{
instance.setParameters(p);
fail( "Parameters must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
instance.setParameters(null);
fail( "Cannot have null parameters" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
instance.setParameters(VectorFactory.getDefault().copyValues(1.0));
fail( "Must have dimensionality >= 2" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of getDomain method, of class MultivariatePolyaDistribution.
*/
public void testKnownGetDomain()
{
System.out.println("getDomain");
MultivariatePolyaDistribution instance = this.createInstance();
int count = 0;
MultinomialDistribution.Domain domain = instance.getDomain();
System.out.println( "Enumerating all subsets: " + domain.size() );
for( Vector subset : domain )
{
System.out.println( "Subset: " + subset );
count++;
}
assertEquals( count, domain.size() );
Iterator<Vector> iterator = domain.iterator();
try
{
iterator.remove();
fail( "Cannot remove" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
iterator = new MultinomialDistribution.Domain( 0, 10 ).iterator();
fail( "numClasses must be > 0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
iterator = new MultinomialDistribution.Domain( 3, -1 ).iterator();
fail( "numTrials must be >= 0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "Known convertToVector" );
MultivariatePolyaDistribution instance = this.createInstance();
Vector p = instance.convertToVector();
assertEquals( instance.getInputDimensionality(), p.getDimensionality() );
assertNotSame( p, instance.getParameters() );
assertEquals( p, instance.getParameters() );
}
@Override
public void testKnownValues()
{
}
/**
* Chi-Square
*/
public void testChiSquare()
{
System.out.println( "Chi-Square" );
MultivariatePolyaDistribution.PMF pmf =
new MultivariatePolyaDistribution.PMF(
VectorFactory.getDefault().copyValues(1.0, 200.0, 300.0 ), 100 );
ArrayList<Vector> samples = pmf.sample(RANDOM,NUM_SAMPLES);
MultinomialDistribution.PMF mnd =
new MultinomialDistribution.PMF( pmf.getParameters().scale( 1.0 / pmf.getParameters().norm1() ), pmf.getNumTrials() );
// for( int i = 0; i < samples.size(); i++ )
// {
// double p1 = pmf.evaluate(samples.get(i));
// double p2 = mnd.evaluate(samples.get(i));
// System.out.println( "Delta = " + (p1-p2) + ", P(" + samples.get(i) + ") = " + p1 + ", MND = " + p2 );
// }
// Vector bad = VectorFactory.getDefault().copyValues(4,40,56);
// System.out.println( "MPD: P(bad) = " + pmf.evaluate(bad) );
// System.out.println( "MND: P(bad) = " + mnd.evaluate(bad) );
// ChiSquareConfidence.Statistic chisquare =
// ChiSquareConfidence.evaluateNullHypothesis( Arrays.asList(bad), pmf );
// System.out.println( "Chi-Square: " + chisquare );
}
@Override
public void testProbabilityFunctionKnownValues()
{
// throw new UnsupportedOperationException("Not supported yet.");
}
}