/*
* File: MonteCarloSamplerTestHarness.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Feb 11, 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.montecarlo;
import gov.sandia.cognition.collection.CollectionUtil;
import gov.sandia.cognition.evaluator.Evaluator;
import gov.sandia.cognition.statistics.ClosedFormComputableDistribution;
import gov.sandia.cognition.statistics.ProbabilityFunction;
import gov.sandia.cognition.statistics.distribution.UnivariateGaussian;
import gov.sandia.cognition.statistics.method.ConfidenceInterval;
import gov.sandia.cognition.statistics.method.StudentTConfidence;
import gov.sandia.cognition.util.WeightedValue;
import java.util.ArrayList;
import junit.framework.TestCase;
import java.util.Random;
/**
* Unit tests for MonteCarloSamplerTestHarness.
*
* @param <DataType> Data type
* @param <SampleType> Sample type
* @param <FunctionType> Function type
* @author krdixon
*/
public abstract class MonteCarloSamplerTestHarness<DataType extends Number,SampleType,FunctionType extends Evaluator<DataType,Double>>
extends TestCase
{
/**
* Random number generator to use for a fixed random seed.
*/
public final Random RANDOM = new Random( 17011 );
/**
* Number of samples.
*/
public static int NUM_SAMPLES = 1000;
/**
* Default tolerance of the regression tests, {@value}.
*/
public final double TOLERANCE = 1e-5;
/**
* Tests for class MonteCarloSamplerTestHarness.
* @param testName Name of the test.
*/
public MonteCarloSamplerTestHarness(
String testName)
{
super(testName);
}
/**
* Creates a sampler instance
* @return
* Sampler instance
*/
public abstract MonteCarloSampler<DataType,SampleType,? super FunctionType> createInstance();
/**
* Creates a target function
* @return
* Target function
*/
public abstract ClosedFormComputableDistribution<Double> createTargetFunctionInstance();
/**
* Tests constructors.
*/
public abstract void testConstructors();
/**
* Tests against known values.
*/
public abstract void testKnownValues();
/**
* Clone.
*/
@SuppressWarnings("unchecked")
public void testClone()
{
System.out.println( "clone" );
ProbabilityFunction<Double> f =this.createTargetFunctionInstance().getProbabilityFunction();
MonteCarloSampler<DataType,SampleType,? super FunctionType> instance =
this.createInstance();
MonteCarloSampler<DataType,SampleType,? super FunctionType> clone =
(MonteCarloSampler<DataType, SampleType,? super FunctionType>) instance.clone();
Random r1 = new Random(1);
Random r2 = new Random(1);
ArrayList<? extends SampleType> s1 = instance.sample( (FunctionType) f, r1, NUM_SAMPLES);
ArrayList<? extends SampleType> s2 = clone.sample( (FunctionType) f, r2, NUM_SAMPLES);
double m1;
double m2;
if( CollectionUtil.getFirst(s1) instanceof Number )
{
m1 = UnivariateMonteCarloIntegrator.INSTANCE.getMean(
(ArrayList<? extends Double>) s1 ).getMean();
m2 = UnivariateMonteCarloIntegrator.INSTANCE.getMean(
(ArrayList<? extends Double>) s2 ).getMean();
}
else
{
m1 = UnivariateMonteCarloIntegrator.INSTANCE.getMean(
(ArrayList<? extends WeightedValue<? extends Double>>) s1 ).getMean();
m2 = UnivariateMonteCarloIntegrator.INSTANCE.getMean(
(ArrayList<? extends WeightedValue<? extends Double>>) s2 ).getMean();
}
assertEquals( m1, m2 );
}
/**
* Test of sample method, of class MonteCarloSampler.
*/
@SuppressWarnings("unchecked")
public void testSample()
{
System.out.println("sample");
ClosedFormComputableDistribution<Double> f =this.createTargetFunctionInstance();
MonteCarloSampler<DataType,SampleType,? super FunctionType> instance =
this.createInstance();
ArrayList<? extends SampleType> samples =
instance.sample( (FunctionType) f, RANDOM, NUM_SAMPLES );
assertEquals( NUM_SAMPLES, samples.size() );
UnivariateGaussian.PDF pdf;
if( CollectionUtil.getFirst(samples) instanceof Number )
{
pdf = UnivariateGaussian.MaximumLikelihoodEstimator.learn(
(ArrayList<? extends Double>) samples, 0.0);
}
else
{
pdf = UnivariateGaussian.WeightedMaximumLikelihoodEstimator.learn(
(ArrayList<? extends WeightedValue<? extends Double>>) samples, 0.0);
}
double mean = f.getMean();
System.out.println( "Mean: " + mean );
System.out.println( "Monte Carlo: " + pdf );
ConfidenceInterval ci = StudentTConfidence.INSTANCE.computeConfidenceInterval(
pdf.getMean(), pdf.getVariance(), samples.size(), 0.95 );
System.out.println( "Interval: " + ci );
assertTrue( ci.withinInterval(mean) );
}
}