/*
* File: ScalarDataDistributionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Jan 27, 2009, 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.collection.CollectionUtil;
import gov.sandia.cognition.statistics.UnivariateDistributionTestHarness;
import gov.sandia.cognition.math.UnivariateStatisticsUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* JUnit tests for class ScalarDataDistributionTest
* @author Kevin R. Dixon
*/
public class ScalarDataDistributionTest
extends UnivariateDistributionTestHarness<Double>
{
/**
* Entry point for JUnit tests for class ScalarDataDistributionTest
* @param testName name of this test
*/
public ScalarDataDistributionTest(
String testName)
{
super(testName);
}
@Override
public ScalarDataDistribution createInstance()
{
return new ScalarDataDistribution( Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0, 3.0 ) );
}
@Override
public void testDistributionConstructors()
{
System.out.println( "Constructors" );
ScalarDataDistribution d =
new ScalarDataDistribution( new ArrayList<Double>( 1 ) );
System.out.println( d );
assertEquals( 0.0, d.getTotal() );
d = new ScalarDataDistribution(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 5.0, d.getTotal() );
assertEquals( 3, d.getDomain().size() );
assertEquals( 1.0, d.get(0.0) );
assertEquals( 2.0, d.get(1.0) );
assertEquals( 2.0, d.get(2.0) );
assertEquals( 0.0, d.get(-1.0) );
assertEquals( 0.0, d.get(3.0) );
System.out.println( d );
ScalarDataDistribution d2 = new ScalarDataDistribution( d );
assertEquals( d.getTotal(), d2.getTotal() );
assertEquals( d.getDomain().size(), d2.getDomain().size() );
assertEquals( 3, d2.getDomain().size() );
for( Double value : d.getDomain() )
{
assertEquals( d.get(value), d2.get(value) );
}
d2.increment( -1.0, 1 );
assertEquals( 6.0, d2.getTotal() );
assertEquals( 5.0, d.getTotal() );
assertEquals( 1.0, d2.get(-1.0) );
assertEquals( 0.0, d.get(-1.0) );
}
@Override
public void testCDFConstructors()
{
System.out.println( "CDF Constructors" );
ScalarDataDistribution.CDF d =
new ScalarDataDistribution.CDF( new ArrayList<Double>( 1 ) );
System.out.println( d );
assertEquals( 0.0, d.getTotal() );
d = new ScalarDataDistribution.CDF( Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 5.0, d.getTotal() );
assertEquals( 3, d.getDomain().size() );
assertEquals( 1.0, d.get(0.0) );
assertEquals( 2.0, d.get(1.0) );
assertEquals( 2.0, d.get(2.0) );
assertEquals( 0.0, d.get(-1.0) );
assertEquals( 0.0, d.get(3.0) );
System.out.println( d );
ScalarDataDistribution.CDF d2 = new ScalarDataDistribution.CDF( d );
assertEquals( d.getTotal(), d2.getTotal() );
assertEquals( d.getDomain().size(), d2.getDomain().size() );
assertEquals( 3, d2.getDomain().size() );
for( Double value : d.getDomain() )
{
assertEquals( d.get(value), d2.get(value) );
}
d2.increment( -1.0, 1 );
assertEquals( 6.0, d2.getTotal() );
assertEquals( 5.0, d.getTotal() );
assertEquals( 1.0, d2.get(-1.0) );
assertEquals( 0.0, d.get(-1.0) );
}
/**
* PMF constructors
*/
public void testPMFConstructors()
{
System.out.println( "PMF Constructors" );
ScalarDataDistribution.PMF d =
new ScalarDataDistribution.PMF( new ArrayList<Double>( 1 ) );
System.out.println( d );
assertEquals( 0.0, d.getTotal() );
d = new ScalarDataDistribution.PMF( Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 5.0, d.getTotal() );
assertEquals( 3, d.getDomain().size() );
assertEquals( 1.0, d.get(0.0) );
assertEquals( 2.0, d.get(1.0) );
assertEquals( 2.0, d.get(2.0) );
assertEquals( 0.0, d.get(-1.0) );
assertEquals( 0.0, d.get(3.0) );
System.out.println( d );
ScalarDataDistribution.PMF d2 = new ScalarDataDistribution.PMF( d );
assertEquals( d.getTotal(), d2.getTotal() );
assertEquals( d.getDomain().size(), d2.getDomain().size() );
assertEquals( 3, d2.getDomain().size() );
for( Double value : d.getDomain() )
{
assertEquals( d.get(value), d2.get(value) );
}
d2.increment( -1.0, 1 );
assertEquals( 6.0, d2.getTotal() );
assertEquals( 5.0, d.getTotal() );
assertEquals( 1.0, d2.get(-1.0) );
assertEquals( 0.0, d.get(-1.0) );
}
/**
* Test of getEntropy method, of class ScalarDataDistribution.
*/
public void testGetEntropy()
{
System.out.println( "getEntropy" );
ScalarDataDistribution.PMF instance = new ScalarDataDistribution.PMF(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 1.521928, instance.getEntropy(), TOLERANCE );
}
/**
* Test of getDomain method, of class ScalarDataDistribution.
*/
public void testKnownGetDomain()
{
System.out.println( "getDomain" );
List<Double> values = Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 );
ScalarDataDistribution instance =
new ScalarDataDistribution( values );
assertNotNull( instance.getDomain() );
assertNotSame( values, instance.getDomain() );
assertEquals( 2.0, CollectionUtil.getElement( instance.getDomain(), 0 ) );
assertEquals( 1.0, CollectionUtil.getElement( instance.getDomain(), 1 ) );
assertEquals( 0.0, CollectionUtil.getElement( instance.getDomain(), 2 ) );
}
/**
* Test of getMean method, of class ScalarDataDistribution.
*/
public void testGetMean()
{
System.out.println( "getMean" );
ScalarDataDistribution instance = new ScalarDataDistribution(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 1.2, instance.getMean() );
instance = new ScalarDataDistribution( new LinkedList<Double>() );
assertEquals( 0.0, instance.getMean() );
}
/**
* getVariance
*/
public void testGetVariance()
{
System.out.println( "getVariance" );
ScalarDataDistribution instance = new ScalarDataDistribution(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 0.56, instance.getVariance(), TOLERANCE );
instance = new ScalarDataDistribution();
assertEquals( 0.0, instance.getVariance() );
}
/**
* Test of sample method, of class ScalarDataDistribution.
*/
public void testSample()
{
System.out.println( "sample" );
ScalarDataDistribution instance = new ScalarDataDistribution(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
double standardError = Math.sqrt( instance.getVariance() / NUM_SAMPLES );
ArrayList<Double> result = instance.sample( RANDOM, NUM_SAMPLES );
double sampleMean = UnivariateStatisticsUtil.computeMean( result );
assertEquals( instance.getMean(), sampleMean, standardError*2.0 );
}
/**
* evaluate
*/
public void testPMFKnownValues()
{
System.out.println( "PMF.evaluate()" );
ScalarDataDistribution.PMF instance = new ScalarDataDistribution.PMF(
new LinkedList<Double>() );
assertEquals( 0.0, instance.evaluate( 2.0 ) );
instance = new ScalarDataDistribution.PMF(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 0.2, instance.evaluate( 0.0 ) );
assertEquals( 0.4, instance.evaluate( 1.0 ) );
assertEquals( 0.4, instance.evaluate( 2.0 ) );
assertEquals( 0.0, instance.evaluate( 1.5 ) );
}
@Override
public void testCDFKnownValues()
{
System.out.println( "CDF.evaluate()" );
ScalarDataDistribution.CDF instance = new ScalarDataDistribution.CDF();
assertEquals( 0.0, instance.evaluate( 2.0 ) );
instance = new ScalarDataDistribution.CDF(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 0.2, instance.evaluate( 0.0 ) );
assertEquals( 0.6, instance.evaluate( 1.0 ) );
assertEquals( 1.0, instance.evaluate( 2.0 ) );
assertEquals( 0.0, instance.evaluate( -1.5 ) );
assertEquals( 0.6, instance.evaluate( 1.5 ) );
assertEquals( 1.0, instance.evaluate( 10.0 ) );
}
/**
* add
*/
public void testCDFAdd()
{
System.out.println( "CDF.increment()" );
ScalarDataDistribution.CDF instance = new ScalarDataDistribution.CDF(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 0.2, instance.evaluate( 0.0 ) );
assertEquals( 0.6, instance.evaluate( 1.0 ) );
assertEquals( 1.0, instance.evaluate( 2.0 ) );
instance.increment( 1.0 );
assertEquals( 1.0/6.0, instance.evaluate( 0.0 ) );
assertEquals( 4.0/6.0, instance.evaluate( 1.0 ) );
assertEquals( 1.0, instance.evaluate( 2.0 ) );
}
/**
* remove
*/
public void testCDFDecrement()
{
System.out.println( "CDF.decrement()" );
ScalarDataDistribution.CDF instance = new ScalarDataDistribution.CDF(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
assertEquals( 0.2, instance.evaluate( 0.0 ) );
assertEquals( 0.6, instance.evaluate( 1.0 ) );
assertEquals( 1.0, instance.evaluate( 2.0 ) );
instance.decrement( 1.0 );
assertEquals( 1.0/4.0, instance.evaluate( 0.0 ) );
assertEquals( 2.0/4.0, instance.evaluate( 1.0 ) );
assertEquals( 1.0, instance.evaluate( 2.0 ) );
instance.decrement( 2.0, 2 );
assertEquals( 0.5, instance.evaluate( 0.0 ) );
assertEquals( 1.0, instance.evaluate( 1.0 ) );
assertEquals( 1.0, instance.evaluate( 2.0 ) );
}
/**
* logEvaluate
*/
public void testLogEvaluate()
{
System.out.println( "logEvaluate" );
ScalarDataDistribution.PMF instance = new ScalarDataDistribution.PMF(
Arrays.asList( 2.0, 1.0, 2.0, 1.0, 0.0 ) );
for( Double value : instance.getDomain() )
{
double p = instance.evaluate(value);
double plog = instance.logEvaluate(value);
double phat = Math.exp( plog );
assertEquals( p, phat, TOLERANCE );
}
}
@Override
public void testCDFSample_Random_int()
{
// super.testCDFSample_Random_int();
}
@Override
public void testDistributionGetCDF()
{
// super.testDistributionGetCDF();
}
}