/*
* File: NormalInverseWishartDistributionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Mar 25, 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.Matrix;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.statistics.MultivariateClosedFormComputableDistributionTestHarness;
/**
* Unit tests for NormalInverseWishartDistributionTest.
*
* @author krdixon
*/
public class NormalInverseWishartDistributionTest
extends MultivariateClosedFormComputableDistributionTestHarness<Matrix>
{
/**
* Tests for class NormalInverseWishartDistributionTest.
* @param testName Name of the test.
*/
public NormalInverseWishartDistributionTest(
String testName)
{
super(testName);
}
/**
* Tests the constructors of class NormalInverseWishartDistributionTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
NormalInverseWishartDistribution instance =
new NormalInverseWishartDistribution();
assertEquals( NormalInverseWishartDistribution.DEFAULT_DIMENSIONALITY, instance.getInputDimensionality() );
assertEquals( NormalInverseWishartDistribution.DEFAULT_COVARIANCE_DIVISOR, instance.getCovarianceDivisor() );
int dim = RANDOM.nextInt(10) + 2;
double divisor = RANDOM.nextDouble();
instance = new NormalInverseWishartDistribution( dim, divisor );
assertEquals( dim, instance.getInputDimensionality() );
assertEquals( divisor, instance.getCovarianceDivisor() );
MultivariateGaussian g = instance.getGaussian();
InverseWishartDistribution iw = instance.getInverseWishart();
divisor = instance.getCovarianceDivisor();
instance = new NormalInverseWishartDistribution( g, iw, divisor );
assertSame( g, instance.getGaussian() );
assertSame( iw, instance.getInverseWishart() );
assertEquals( divisor, instance.getCovarianceDivisor() );
NormalInverseWishartDistribution i2 =
new NormalInverseWishartDistribution( instance );
assertEquals( instance.convertToVector(), i2.convertToVector() );
}
@Override
public void testProbabilityFunctionConstructors()
{
System.out.println( "PDF Constructor" );
NormalInverseWishartDistribution.PDF instance =
new NormalInverseWishartDistribution.PDF();
assertEquals( NormalInverseWishartDistribution.DEFAULT_DIMENSIONALITY, instance.getInputDimensionality() );
assertEquals( NormalInverseWishartDistribution.DEFAULT_COVARIANCE_DIVISOR, instance.getCovarianceDivisor() );
int dim = RANDOM.nextInt(10) + 2;
double divisor = RANDOM.nextDouble();
instance = new NormalInverseWishartDistribution.PDF( dim, divisor );
assertEquals( dim, instance.getInputDimensionality() );
assertEquals( divisor, instance.getCovarianceDivisor() );
MultivariateGaussian g = instance.getGaussian();
InverseWishartDistribution iw = instance.getInverseWishart();
divisor = instance.getCovarianceDivisor();
instance = new NormalInverseWishartDistribution.PDF( g, iw, divisor );
assertSame( g, instance.getGaussian() );
assertSame( iw, instance.getInverseWishart() );
assertEquals( divisor, instance.getCovarianceDivisor() );
NormalInverseWishartDistribution.PDF i2 =
new NormalInverseWishartDistribution.PDF( instance );
assertEquals( instance.convertToVector(), i2.convertToVector() );
}
/**
* Test of getGaussian method, of class NormalInverseWishartDistribution.
*/
public void testGetGaussian()
{
System.out.println("getGaussian");
NormalInverseWishartDistribution instance = this.createInstance();
MultivariateGaussian g = instance.getGaussian();
assertNotNull( g );
}
/**
* Test of setGaussian method, of class NormalInverseWishartDistribution.
*/
public void testSetGaussian()
{
System.out.println("setGaussian");
NormalInverseWishartDistribution instance = this.createInstance();
MultivariateGaussian g = instance.getGaussian();
assertNotNull( g );
instance.setGaussian(null);
assertNull( instance.getGaussian() );
instance.setGaussian(g);
assertSame( g, instance.getGaussian() );
}
/**
* Test of getInverseWishart method, of class NormalInverseWishartDistribution.
*/
public void testGetInverseWishart()
{
System.out.println("getInverseWishart");
NormalInverseWishartDistribution instance = this.createInstance();
InverseWishartDistribution iw = instance.getInverseWishart();
assertNotNull( iw );
}
/**
* Test of setInverseWishart method, of class NormalInverseWishartDistribution.
*/
public void testSetInverseWishart()
{
System.out.println("setInverseWishart");
NormalInverseWishartDistribution instance = this.createInstance();
InverseWishartDistribution iw = instance.getInverseWishart();
assertNotNull( iw );
instance.setInverseWishart(null);
assertNull( instance.getInverseWishart() );
instance.setInverseWishart(iw);
assertSame( iw, instance.getInverseWishart() );
}
/**
* Test of getCovarianceDivisor method, of class NormalInverseWishartDistribution.
*/
public void testGetCovarianceDivisor()
{
System.out.println("getCovarianceDivisor");
NormalInverseWishartDistribution instance = this.createInstance();
assertTrue( instance.getCovarianceDivisor() > 0.0 );
}
/**
* Test of setCovarianceDivisor method, of class NormalInverseWishartDistribution.
*/
public void testSetCovarianceDivisor()
{
System.out.println("setCovarianceDivisor");
double covarianceDivisor = RANDOM.nextDouble();
NormalInverseWishartDistribution instance = this.createInstance();
instance.setCovarianceDivisor(covarianceDivisor);
assertEquals( covarianceDivisor, instance.getCovarianceDivisor() );
try
{
instance.setCovarianceDivisor(0.0);
fail( "covarianceDivisor must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of getInputDimensionality method, of class NormalInverseWishartDistribution.
*/
public void testGetInputDimensionality()
{
System.out.println("getInputDimensionality");
NormalInverseWishartDistribution instance = this.createInstance();
assertEquals( instance.getGaussian().getInputDimensionality(), instance.getInputDimensionality() );
}
@Override
public NormalInverseWishartDistribution createInstance()
{
return new NormalInverseWishartDistribution();
}
@Override
public void testProbabilityFunctionKnownValues()
{
System.out.println( "PDF Known Values" );
NormalInverseWishartDistribution.PDF pdf = this.createInstance().getProbabilityFunction();
Matrix xmean = pdf.getMean();
double pmean = pdf.evaluate(xmean);
assertEquals( 0.00206457531653, pmean, TOLERANCE );
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "Known convertToVector" );
NormalInverseWishartDistribution instance = this.createInstance();
final int d = instance.getInputDimensionality();
Vector p = instance.convertToVector();
assertEquals( 1+d + 1+d*d, p.getDimensionality() );
assertEquals( instance.getCovarianceDivisor(), p.getElement(0) );
assertEquals( instance.getGaussian().getMean(), p.subVector(1,d) );
assertEquals( instance.getInverseWishart().getDegreesOfFreedom(), (int) p.getElement(d+1) );
}
@Override
public void testKnownValues()
{
}
@Override
public void testGetMean()
{
double temp = TOLERANCE;
TOLERANCE = 1.0;
super.testGetMean();
TOLERANCE = temp;
}
}