/* * File: MultivariateDistributionTestHarness.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright Dec 14, 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; import gov.sandia.cognition.math.Ring; import gov.sandia.cognition.math.matrix.Vector; import java.util.ArrayList; /** * Unit tests for MultivariateDistributionTestHarness. * * @param <RingType> RingType * @author krdixon */ public abstract class MultivariateClosedFormComputableDistributionTestHarness<RingType extends Ring<RingType>> extends MultivariateClosedFormDistributionTestHarness<RingType> { /** * Tests for class MultivariateDistributionTestHarness. * @param testName Name of the test. */ public MultivariateClosedFormComputableDistributionTestHarness( String testName) { super(testName); } /** * Creates an instance * @return * Instance. */ abstract public ClosedFormComputableDistribution<RingType> createInstance(); /** * Tests the constructors of class MultivariateDistributionTestHarness. */ abstract public void testProbabilityFunctionConstructors(); /** * Tests against known values. */ abstract public void testProbabilityFunctionKnownValues(); /** * Tries to ensure that the PDF is nonnegative */ public void testProbabilityFunctionNonnegative() { System.out.println( "PDF.nonnegative" ); ProbabilityFunction<RingType> f = this.createInstance().getProbabilityFunction(); ArrayList<? extends RingType> data = f.sample(RANDOM,NUM_SAMPLES); for( RingType x : data ) { assertTrue( f.evaluate(x) >= 0.0 ); } } /** * Tests the clone of the PDF */ public void testProbabilityFunctionClone() { System.out.println( "PDF.clone" ); super.testClone(); ProbabilityFunction<RingType> f = this.createInstance().getProbabilityFunction(); @SuppressWarnings("unchecked") ProbabilityFunction<RingType> clone = (ProbabilityFunction<RingType>) f.clone(); Vector p1 = ((ClosedFormDistribution) f).convertToVector(); Vector p2 = ((ClosedFormDistribution) clone).convertToVector(); assertNotSame( p1, p2 ); assertEquals( p1, p2 ); } /** * logEvaluate */ public void testProbabilityFunctionLogEvaluate() { System.out.println( "logEvaluate" ); ProbabilityFunction<RingType> pdf = this.createInstance().getProbabilityFunction(); ArrayList<? extends RingType> samples = pdf.sample(RANDOM, NUM_SAMPLES); for( RingType sample : samples ) { double plog = pdf.logEvaluate(sample); double p = pdf.evaluate(sample); double phat = Math.exp(plog); assertEquals( p, phat, TOLERANCE ); } } /** * PDF.getDistributionFunction */ public void testProbabilityFunctionGetProbabilityFunction() { System.out.println( "PDF.getProbabilityFunction" ); ProbabilityFunction<RingType> pdf = this.createInstance().getProbabilityFunction(); assertSame( pdf, pdf.getProbabilityFunction() ); } /** * Distribution.getDistributionFunction */ public void testDistributionGetProbabilityFunction() { System.out.println( "Distribution.getProbabilityFunction" ); ClosedFormComputableDistribution<RingType> instance = this.createInstance(); ProbabilityFunction<RingType> pdf = instance.getProbabilityFunction(); assertNotSame( instance, pdf ); assertEquals( instance.convertToVector(), ((ClosedFormDistribution) pdf).convertToVector() ); } }