/*
* File: NormalInverseGammaDistributionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Mar 16, 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.MultivariateStatisticsUtil;
import gov.sandia.cognition.math.matrix.Matrix;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.VectorFactory;
import gov.sandia.cognition.statistics.MultivariateClosedFormComputableDistributionTestHarness;
import gov.sandia.cognition.util.Pair;
import java.util.ArrayList;
/**
* Unit tests for NormalInverseGammaDistributionTest.
*
* @author krdixon
*/
public class NormalInverseGammaDistributionTest
extends MultivariateClosedFormComputableDistributionTestHarness<Vector>
{
/**
* Tests for class NormalInverseGammaDistributionTest.
* @param testName Name of the test.
*/
public NormalInverseGammaDistributionTest(
String testName)
{
super(testName);
}
/**
* Tests the constructors of class NormalInverseGammaDistributionTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
NormalInverseGammaDistribution instance =
new NormalInverseGammaDistribution();
assertEquals( NormalInverseGammaDistribution.DEFAULT_LOCATION, instance.getLocation() );
assertEquals( NormalInverseGammaDistribution.DEFAULT_PRECISION, instance.getPrecision() );
assertEquals( NormalInverseGammaDistribution.DEFAULT_SHAPE, instance.getShape() );
assertEquals( NormalInverseGammaDistribution.DEFAULT_SCALE, instance.getScale() );
double location = RANDOM.nextGaussian();
double precision = RANDOM.nextDouble();
double shape = RANDOM.nextDouble();
double scale = RANDOM.nextDouble();
instance = new NormalInverseGammaDistribution(
location, precision,shape, scale);
assertEquals( location, instance.getLocation() );
assertEquals( precision, instance.getPrecision() );
assertEquals( shape, instance.getShape() );
assertEquals( scale, instance.getScale() );
NormalInverseGammaDistribution i2 =
new NormalInverseGammaDistribution( instance );
assertNotSame( instance, i2 );
assertEquals( instance.getLocation(), i2.getLocation() );
assertEquals( instance.getPrecision(), i2.getPrecision() );
assertEquals( instance.getShape(), i2.getShape() );
assertEquals( instance.getScale(), i2.getScale() );
}
@Override
public void testProbabilityFunctionConstructors()
{
System.out.println( "PDF.Constructors" );
NormalInverseGammaDistribution.PDF instance =
new NormalInverseGammaDistribution.PDF();
assertEquals( NormalInverseGammaDistribution.DEFAULT_LOCATION, instance.getLocation() );
assertEquals( NormalInverseGammaDistribution.DEFAULT_PRECISION, instance.getPrecision() );
assertEquals( NormalInverseGammaDistribution.DEFAULT_SHAPE, instance.getShape() );
assertEquals( NormalInverseGammaDistribution.DEFAULT_SCALE, instance.getScale() );
double location = RANDOM.nextGaussian();
double precision = RANDOM.nextDouble();
double shape = RANDOM.nextDouble();
double scale = RANDOM.nextDouble();
instance = new NormalInverseGammaDistribution.PDF(
location, precision,shape, scale);
assertEquals( location, instance.getLocation() );
assertEquals( precision, instance.getPrecision() );
assertEquals( shape, instance.getShape() );
assertEquals( scale, instance.getScale() );
NormalInverseGammaDistribution.PDF i2 =
new NormalInverseGammaDistribution.PDF( instance );
assertNotSame( instance, i2 );
assertEquals( instance.getLocation(), i2.getLocation() );
assertEquals( instance.getPrecision(), i2.getPrecision() );
assertEquals( instance.getShape(), i2.getShape() );
assertEquals( instance.getScale(), i2.getScale() );
}
/**
* Test of getLocation method, of class NormalInverseGammaDistribution.
*/
public void testGetLocation()
{
System.out.println("getLocation");
double location = RANDOM.nextGaussian();
NormalInverseGammaDistribution instance = this.createInstance();
instance.setLocation(location);
assertEquals( location, instance.getLocation() );
}
/**
* Test of setLocation method, of class NormalInverseGammaDistribution.
*/
public void testSetLocation()
{
System.out.println("setLocation");
double location = RANDOM.nextGaussian();
NormalInverseGammaDistribution instance = this.createInstance();
instance.setLocation(location);
assertEquals( location, instance.getLocation() );
}
/**
* Test of getPrecision method, of class NormalInverseGammaDistribution.
*/
public void testGetPrecision()
{
System.out.println("getPrecision");
double precision = RANDOM.nextDouble() * 10.0;
NormalInverseGammaDistribution instance = this.createInstance();
instance.setPrecision(precision);
assertEquals( precision, instance.getPrecision() );
}
/**
* Test of setPrecision method, of class NormalInverseGammaDistribution.
*/
public void testSetPrecision()
{
System.out.println("setPrecision");
double precision = RANDOM.nextDouble() * 10.0;
NormalInverseGammaDistribution instance = this.createInstance();
instance.setPrecision(precision);
assertEquals( precision, instance.getPrecision() );
try
{
instance.setPrecision(0.0);
fail( "Precision must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of getShape method, of class NormalInverseGammaDistribution.
*/
public void testGetShape()
{
System.out.println("getShape");
double shape = RANDOM.nextDouble()*10.0;
NormalInverseGammaDistribution instance = this.createInstance();
instance.setShape(shape);
assertEquals( shape, instance.getShape() );
}
/**
* Test of setShape method, of class NormalInverseGammaDistribution.
*/
public void testSetShape()
{
System.out.println("setShape");
double shape = RANDOM.nextDouble()*10.0;
NormalInverseGammaDistribution instance = this.createInstance();
instance.setShape(shape);
assertEquals( shape, instance.getShape() );
try
{
instance.setShape(0.0);
fail( "Shape must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of getScale method, of class NormalInverseGammaDistribution.
*/
public void testGetScale()
{
System.out.println("getScale");
double scale = RANDOM.nextDouble() * 10.0;
NormalInverseGammaDistribution instance = this.createInstance();
instance.setScale(scale);
assertEquals( scale, instance.getScale() );
}
/**
* Test of setScale method, of class NormalInverseGammaDistribution.
*/
public void testSetScale()
{
System.out.println("setScale");
double scale = RANDOM.nextDouble() * 10.0;
NormalInverseGammaDistribution instance = this.createInstance();
instance.setScale(scale);
assertEquals( scale, instance.getScale() );
try
{
instance.setScale(0.0);
fail( "Scale must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public void testProbabilityFunctionKnownValues()
{
System.out.println( "PDF Known Values" );
NormalInverseGammaDistribution instance = this.createInstance();
NormalInverseGammaDistribution.PDF pdf = instance.getProbabilityFunction();
ArrayList<Vector> samples = instance.sample(RANDOM, NUM_SAMPLES);
for( Vector sample : samples )
{
double result = pdf.evaluate(sample);
UnivariateGaussian.PDF g = new UnivariateGaussian.PDF(
instance.getLocation(), sample.getElement(1)/instance.getPrecision() );
InverseGammaDistribution.PDF ig = new InverseGammaDistribution.PDF(
instance.getShape(), instance.getScale() );
double expected = g.evaluate( sample.getElement(0) ) * ig.evaluate( sample.getElement(1) );
assertEquals( expected, result, TOLERANCE );
}
Vector bad = VectorFactory.getDefault().createVector(3);
try
{
pdf.evaluate(bad);
fail( "Wrong dimensionality!" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public void testKnownValues()
{
System.out.println( "Known Values" );
}
@Override
public NormalInverseGammaDistribution createInstance()
{
double location = RANDOM.nextGaussian();
double precision = RANDOM.nextDouble() * 10.0;
double shape = RANDOM.nextDouble() * 3.0 + 2.0;
double scale = RANDOM.nextDouble() * 3.0 + 2.0;
return new NormalInverseGammaDistribution(
location, precision,shape, scale);
}
@Override
public void testGetMean()
{
double temp = TOLERANCE;
TOLERANCE = 1e-1;
super.testGetMean();
TOLERANCE = temp;
}
/**
* getCovariance
*/
public void testGetCovariance()
{
System.out.println( "getCovariance" );
NormalInverseGammaDistribution instance = this.createInstance();
ArrayList<Vector> samples = instance.sample(RANDOM, NUM_SAMPLES);
Pair<Vector,Matrix> pair =
MultivariateStatisticsUtil.computeMeanAndCovariance(samples);
System.out.println( "Instance: " + instance );
System.out.println( "Mean: " + pair.getFirst() );
System.out.println( "Covariance:\n" + pair.getSecond() );
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "Known convertToVector" );
NormalInverseGammaDistribution instance = this.createInstance();
Vector p = instance.convertToVector();
assertEquals( 4, p.getDimensionality() );
assertEquals( instance.getLocation(), p.getElement(0) );
assertEquals( instance.getPrecision(), p.getElement(1) );
assertEquals( instance.getShape(), p.getElement(2) ) ;
assertEquals( instance.getScale(), p.getElement(3) );
}
}