/*
* File: StudentizedRangeDistributionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright May 10, 2011, 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.matrix.Vector;
import gov.sandia.cognition.statistics.ClosedFormUnivariateDistributionTestHarness;
import static org.junit.Assert.*;
/**
* Tests for class StudentizedRangeDistributionTest.
* @author krdixon
*/
public class StudentizedRangeDistributionTest
extends ClosedFormUnivariateDistributionTestHarness<Double>
{
/**
* Default Constructor
*/
public StudentizedRangeDistributionTest()
{
super( "StudentizedRangeDistributionTest" );
this.NUM_SAMPLES = 1000;
}
/**
* Tests the constructors of class ${name}.
*/
@Override
public void testDistributionConstructors()
{
System.out.println( "Constructors" );
StudentizedRangeDistribution instance = new StudentizedRangeDistribution();
assertEquals( StudentizedRangeDistribution.DEFAULT_DEGREES_OF_FREEDOM, instance.getDegreesOfFreedom(), TOLERANCE );
assertEquals( StudentizedRangeDistribution.DEFAULT_TREATMENT_COUNT, instance.getTreatmentCount() );
double dof = RANDOM.nextDouble() + 1.0;
int num = RANDOM.nextInt(100) + 1;
instance = new StudentizedRangeDistribution( num, dof );
assertEquals( dof, instance.getDegreesOfFreedom(), TOLERANCE );
assertEquals( num, instance.getTreatmentCount() );
StudentizedRangeDistribution i2 = new StudentizedRangeDistribution( instance );
assertNotSame( instance, i2 );
assertEquals( instance.getDegreesOfFreedom(), i2.getDegreesOfFreedom(), TOLERANCE );
assertEquals( instance.getTreatmentCount(), i2.getTreatmentCount() );
try
{
instance = new StudentizedRangeDistribution( 1, dof );
fail( "numTreatments must be > 1" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
instance = new StudentizedRangeDistribution( num, 0.0 );
fail( "DOF must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public void testCDFConstructors()
{
System.out.println( "CDF Constructors" );
StudentizedRangeDistribution.CDF instance = new StudentizedRangeDistribution.CDF();
assertEquals( StudentizedRangeDistribution.DEFAULT_DEGREES_OF_FREEDOM, instance.getDegreesOfFreedom(), TOLERANCE );
assertEquals( StudentizedRangeDistribution.DEFAULT_TREATMENT_COUNT, instance.getTreatmentCount() );
double dof = RANDOM.nextDouble() + 1.0;
int num = RANDOM.nextInt(100) + 1;
instance = new StudentizedRangeDistribution.CDF( num, dof );
assertEquals( dof, instance.getDegreesOfFreedom(), TOLERANCE );
assertEquals( num, instance.getTreatmentCount() );
StudentizedRangeDistribution.CDF i2 = new StudentizedRangeDistribution.CDF( instance );
assertNotSame( instance, i2 );
assertEquals( instance.getDegreesOfFreedom(), i2.getDegreesOfFreedom(), TOLERANCE );
assertEquals( instance.getTreatmentCount(), i2.getTreatmentCount() );
}
@Override
public StudentizedRangeDistribution createInstance()
{
return new StudentizedRangeDistribution( 5, 20.0 );
}
@Override
public void testCDFBoundaryConditions()
{
double temp = TOLERANCE;
TOLERANCE = 1e-3;
super.testCDFBoundaryConditions();
TOLERANCE = temp;
}
@Override
public void testCDFKnownValues()
{
System.out.println( "CDF Known Values" );
double result;
double expected;
TOLERANCE = 1e-3;
//http://cse.niaes.affrc.go.jp/miwa/probcalc/s-range/srng_tbl.html
StudentizedRangeDistribution.CDF cdf = new StudentizedRangeDistribution.CDF( 20, 20 );
expected = 1.0-0.10;
result = cdf.evaluate(5.205);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 1.0-0.05;
result = cdf.evaluate(5.714);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 1.0-0.01;
result = cdf.evaluate(6.823);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
cdf = new StudentizedRangeDistribution.CDF( 10, Double.POSITIVE_INFINITY );
expected = 1.0-0.1;
result = cdf.evaluate(4.129);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 1.0-0.05;
result = cdf.evaluate(4.474);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 1.0-0.01;
result = cdf.evaluate(5.157);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
}
public void testCDFInverseKnownValues()
{
System.out.println( "CDF Inverse Known Values" );
double result;
double expected;
TOLERANCE = 1e-1;
StudentizedRangeDistribution.CDF cdf = new StudentizedRangeDistribution.CDF( 2, Double.POSITIVE_INFINITY );
//http://cse.niaes.affrc.go.jp/miwa/probcalc/s-range/srng_tbl.html
expected = 1.960;
result = cdf.inverse(1.0-0.05)/Math.sqrt(2);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 1.645;
result = cdf.inverse(1.0-0.10)/Math.sqrt(2);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 2.728;
cdf = new StudentizedRangeDistribution.CDF( 5, Double.POSITIVE_INFINITY );
result = cdf.inverse(1.0-0.05)/Math.sqrt(2);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 2.459;
result = cdf.inverse(1.0-0.10)/Math.sqrt(2);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 3.164;
cdf = new StudentizedRangeDistribution.CDF( 10, Double.POSITIVE_INFINITY );
result = cdf.inverse(1.0-0.05)/Math.sqrt(2);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 2.920;
result = cdf.inverse(1.0-0.10)/Math.sqrt(2);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
expected = 5.205;
cdf = new StudentizedRangeDistribution.CDF( 20, 20 );
result = cdf.inverse(1.0-0.10);
System.out.println( "Expected: " + expected + ", Result: " + result );
assertEquals( expected, result, TOLERANCE );
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "Known convert to vector" );
double dof = RANDOM.nextDouble() + 1.0;
int num = RANDOM.nextInt(100) + 2;
StudentizedRangeDistribution instance =
new StudentizedRangeDistribution( num, dof );
Vector p = instance.convertToVector();
assertEquals( 2, p.getDimensionality() );
assertEquals( num, p.getElement(0), TOLERANCE );
assertEquals( dof, p.getElement(1), TOLERANCE );
}
@Override
public void testCDFConvertFromVector()
{
// super.testCDFConvertFromVector();
}
@Override
public void testDistributionGetMeanAsDouble()
{
TOLERANCE = 1e-1;
super.testDistributionGetMeanAsDouble();
}
}