/*
* File: InverseWishartDistributionTest.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.MatrixFactory;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.VectorFactory;
import gov.sandia.cognition.statistics.MultivariateClosedFormComputableDistributionTestHarness;
/**
* Unit tests for InverseWishartDistributionTest.
*
* @author krdixon
*/
public class InverseWishartDistributionTest
extends MultivariateClosedFormComputableDistributionTestHarness<Matrix>
{
/**
* Tests for class InverseWishartDistributionTest.
* @param testName Name of the test.
*/
public InverseWishartDistributionTest(
String testName)
{
super(testName);
}
/**
* Tests the constructors of class InverseWishartDistributionTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
InverseWishartDistribution instance = new InverseWishartDistribution();
assertEquals( InverseWishartDistribution.DEFAULT_DIMENSIONALITY, instance.getInputDimensionality() );
assertEquals( InverseWishartDistribution.DEFAULT_DIMENSIONALITY+2, instance.getDegreesOfFreedom() );
Matrix sample = instance.sample(RANDOM);
int dof = RANDOM.nextInt(10) + sample.getNumRows() + 2;
instance = new InverseWishartDistribution( sample, dof );
assertSame( sample, instance.getInverseScale() );
assertEquals( dof, instance.getDegreesOfFreedom() );
InverseWishartDistribution i2 = new InverseWishartDistribution( instance );
assertEquals( instance.getDegreesOfFreedom(), i2.getDegreesOfFreedom() );
assertEquals( instance.getInverseScale(), i2.getInverseScale() );
assertNotSame( instance.getInverseScale(), i2.getInverseScale() );
}
@Override
public void testProbabilityFunctionConstructors()
{
System.out.println( "PDF Constructors" );
InverseWishartDistribution.PDF instance = new InverseWishartDistribution.PDF();
assertEquals( InverseWishartDistribution.DEFAULT_DIMENSIONALITY, instance.getInputDimensionality() );
assertEquals( InverseWishartDistribution.DEFAULT_DIMENSIONALITY+2, instance.getDegreesOfFreedom() );
Matrix sample = instance.sample(RANDOM);
int dof = RANDOM.nextInt(10) + sample.getNumRows() + 2;
instance = new InverseWishartDistribution.PDF( sample, dof );
assertSame( sample, instance.getInverseScale() );
assertEquals( dof, instance.getDegreesOfFreedom() );
InverseWishartDistribution.PDF i2 = new InverseWishartDistribution.PDF( instance );
assertEquals( instance.getDegreesOfFreedom(), i2.getDegreesOfFreedom() );
assertEquals( instance.getInverseScale(), i2.getInverseScale() );
assertNotSame( instance.getInverseScale(), i2.getInverseScale() );
}
/**
* Test of getInputDimensionality method, of class InverseWishartDistribution.
*/
public void testGetInputDimensionality()
{
System.out.println("getInputDimensionality");
InverseWishartDistribution instance = this.createInstance();
assertTrue( instance.getInputDimensionality() > 0 );
assertEquals( instance.getInverseScale().getNumRows(), instance.getInputDimensionality() );
}
/**
* Test of getInverseScale method, of class InverseWishartDistribution.
*/
public void testGetInverseScale()
{
System.out.println("getInverseScale");
InverseWishartDistribution instance = this.createInstance();
assertNotNull( instance.getInverseScale() );
}
/**
* Test of setInverseScale method, of class InverseWishartDistribution.
*/
public void testSetInverseScale()
{
System.out.println("setInverseScale");
InverseWishartDistribution instance = this.createInstance();
Matrix sample = instance.sample(RANDOM);
instance.setInverseScale(sample);
assertSame( sample, instance.getInverseScale() );
}
/**
* Test of getDegreesOfFreedom method, of class InverseWishartDistribution.
*/
public void testGetDegreesOfFreedom()
{
System.out.println("getDegreesOfFreedom");
InverseWishartDistribution instance = this.createInstance();
assertTrue( instance.getDegreesOfFreedom() > instance.getInputDimensionality() - 1 );
}
/**
* Test of setDegreesOfFreedom method, of class InverseWishartDistribution.
*/
public void testSetDegreesOfFreedom()
{
System.out.println("setDegreesOfFreedom");
InverseWishartDistribution instance = this.createInstance();
int dof = RANDOM.nextInt(10) + instance.getInputDimensionality() + 2;
instance.setDegreesOfFreedom(dof);
assertEquals( dof, instance.getDegreesOfFreedom() );
try
{
instance.setDegreesOfFreedom(instance.getInputDimensionality()-1);
fail( "DOF must be > dim-1" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public InverseWishartDistribution createInstance()
{
return new InverseWishartDistribution();
}
@Override
public void testProbabilityFunctionKnownValues()
{
System.out.println( "PDF Known Values" );
InverseWishartDistribution.PDF pdf =
this.createInstance().getProbabilityFunction();
Matrix x = pdf.getInverseScale();
assertEquals( 0.012972109294, pdf.evaluate(x), TOLERANCE );
}
@Override
public void testKnownValues()
{
System.out.println( "Known Values" );
}
@Override
public void testConvertFromVector()
{
InverseWishartDistribution f = this.createInstance();
Vector x1 = f.convertToVector();
assertNotNull( x1 );
int N = x1.getDimensionality();
Vector x2 = x1.scale(RANDOM.nextDouble());
f.convertFromVector(x2);
Vector x3 = f.convertToVector();
assertNotNull( x3 );
assertNotSame( x2, x3 );
// Convert back to the original parameterization
f.convertFromVector( x1 );
Vector x4 = f.convertToVector();
assertNotNull( x4 );
assertNotSame( x1, x4 );
assertEquals( x1, x4 );
try
{
f.convertFromVector( null );
fail( "Cannot convert from null Vector" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
final double r = 1.0;
try
{
Vector z1 = VectorFactory.getDefault().createUniformRandom( N-1, r, r, RANDOM );
f.convertFromVector( z1 );
fail( "Cannot convert from a N-1 dimension Vector!" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
Vector z1 = VectorFactory.getDefault().createUniformRandom( N+1, r, r, RANDOM );
f.convertFromVector( z1 );
fail( "Cannot convert from a N+1 dimension Vector!" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "Known convertToVector" );
InverseWishartDistribution instance = this.createInstance();
Vector p = instance.convertToVector();
int d = instance.getInputDimensionality();
assertEquals( 1+d*d, p.getDimensionality() );
assertEquals( instance.getDegreesOfFreedom(), (int) p.getElement(0) );
Vector ip = p.subVector(1, p.getDimensionality()-1);
Matrix IP = MatrixFactory.getDefault().createMatrix(d, d);
IP.convertFromVector(ip);
assertEquals( instance.getInverseScale(), IP );
}
@Override
public void testGetMean()
{
double temp = TOLERANCE;
TOLERANCE = 1.0;
super.testGetMean();
TOLERANCE = temp;
}
}