/*
* File: MultivariateClosedFormComputableDiscreteDistributionTestHarness.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright May 19, 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;
import gov.sandia.cognition.math.MathUtil;
import gov.sandia.cognition.math.Ring;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.VectorInputEvaluator;
import gov.sandia.cognition.statistics.method.ChiSquareConfidence;
import java.util.Collection;
/**
* Test harness for MultivariateClosedFormComputableDiscreteDistribution
* @param <RingType> Type of Ring
* @author Kevin R. Dixon
* @since 3.0
*/
public abstract class MultivariateClosedFormComputableDiscreteDistributionTestHarness<RingType extends Ring<RingType>>
extends MultivariateClosedFormComputableDistributionTestHarness<RingType>
{
/**
* Creates a new instance of MultivariateClosedFormComputableDiscreteDistributionTestHarness
* @param testName
* Test Name
*/
public MultivariateClosedFormComputableDiscreteDistributionTestHarness(
String testName)
{
super(testName);
}
@Override
public abstract ClosedFormComputableDiscreteDistribution<RingType> createInstance();
/**
* Tests the distribution against a known domain.
*/
public abstract void testKnownGetDomain();
/**
* Tests that a PMF abides by the rules of being a PMF:
* - nonnegative
* - less than or equal to 1.0
* - sums to 1.0
*/
public void testPMFEvaluate()
{
System.out.println( "PMF.evaluate" );
DiscreteDistribution<RingType> instance = this.createInstance();
ProbabilityMassFunction<RingType> pmf = instance.getProbabilityFunction();
double sum = 0.0;
for( RingType value : pmf.getDomain() )
{
double prob = pmf.evaluate( value );
assertTrue( "prob: " + prob + " must be [0,1]", 0.0 <= prob );
assertTrue( "prob: " + prob + " must be [0,1]", prob <= 1.0 );
sum += prob;
}
assertEquals( 1.0, sum, TOLERANCE );
}
/**
* Tests getEntropy()
*/
public void testPMFGetEntropy()
{
System.out.println( "PMF.getEntropy" );
DiscreteDistribution<RingType> instance = this.createInstance();
ProbabilityMassFunction<RingType> pmf = instance.getProbabilityFunction();
double sum = 0.0;
for( RingType value : pmf.getDomain() )
{
double p = pmf.evaluate( value );
if( p > 0.0 )
{
sum -= p*MathUtil.log2( p );
}
}
assertEquals( sum, pmf.getEntropy(), TOLERANCE );
}
/**
* PMF.getDomain
*/
public void testPMFGetDomain()
{
System.out.println( "PMF.getDomain" );
DiscreteDistribution<RingType> instance = this.createInstance();
ProbabilityMassFunction<RingType> pmf = instance.getProbabilityFunction();
Collection<? extends RingType> d1 = instance.getDomain();
Collection<? extends RingType> d2 = pmf.getDomain();
assertEquals( d1.size(), d2.size() );
}
/**
* PMF.getInputDimensionality()
*/
public void testPMFGetInputDimensionality()
{
System.out.println( "PMF.getInputDimensionality" );
DiscreteDistribution<?> instance = this.createInstance();
@SuppressWarnings("unchecked")
ProbabilityMassFunction<Vector> pmf =
(ProbabilityMassFunction<Vector>) instance.getProbabilityFunction();
if( pmf instanceof VectorInputEvaluator )
{
Vector sample = pmf.sample(RANDOM);
assertEquals( sample.getDimensionality(), ((VectorInputEvaluator) pmf).getInputDimensionality() );
}
else
{
throw new IllegalArgumentException(
"PMF should extend VectorInputEvaluator with appropriate dim!" );
}
}
/**
* PMF Chi Square test
*/
public void testPMFChiSquare()
{
System.out.println( "PMF Chi-Square Test" );
ProbabilityMassFunction<RingType> pdf =
this.createInstance().getProbabilityFunction();
Collection<? extends RingType> samples = pdf.sample(RANDOM, NUM_SAMPLES);
ChiSquareConfidence.Statistic chisquare =
ChiSquareConfidence.evaluateNullHypothesis(samples, pdf);
System.out.println( "Chi-Square Test: " + chisquare );
assertEquals( 1.0, chisquare.getNullHypothesisProbability(), CONFIDENCE );
}
}