/*
* File: UniformIntegerDistributionTest.java
* Authors: Justin Basilico
* Project: Cognitive Foundry
*
* Copyright 2015 Cognitive Foundry. All rights reserved.
*/
package gov.sandia.cognition.statistics.distribution;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.mtj.Vector1;
import gov.sandia.cognition.math.matrix.mtj.Vector2;
import gov.sandia.cognition.math.matrix.mtj.Vector3;
import gov.sandia.cognition.statistics.ClosedFormIntegerDistributionTestHarness;
/**
* Unit tests for class {@link UniformIntegerDistribution}.
*
* @author Justin Basilico
* @since 3.4.3
*/
public class UniformIntegerDistributionTest
extends ClosedFormIntegerDistributionTestHarness
{
/**
* Creates a new test.
*
* @param testName The test name.
*/
public UniformIntegerDistributionTest(
final String testName)
{
super(testName);
NUM_SAMPLES = 2000;
}
@Override
public UniformIntegerDistribution createInstance()
{
int l = RANDOM.nextInt(20) - 10;
int u = l + RANDOM.nextInt(10);
return new UniformIntegerDistribution(l, u);
}
@Override
public void testKnownGetDomain()
{
for (int i = 0; i < 100; i++)
{
UniformIntegerDistribution instance =
this.createInstance();
int a = instance.getMinSupport();
int b = instance.getMaxSupport();
int expected = a;
for (Number x : instance.getDomain())
{
assertEquals(expected, x);
expected++;
}
assertEquals(b + 1, expected);
}
}
@Override
public void testPMFKnownValues()
{
for (int i = 0; i < 100; i++)
{
UniformIntegerDistribution.PMF pmf =
this.createInstance().getProbabilityFunction();
int a = pmf.getMinSupport();
int b = pmf.getMaxSupport();
assertEquals(0.0, pmf.evaluateAsDouble(a - 1), 0.0);
assertEquals(0.0, pmf.evaluateAsDouble(b + 1), 0.0);
double expected = 1.0 / (b - a + 1);
for (int x = a; x <= b; x++)
{
assertEquals(expected, pmf.evaluate(x), 0.0);
assertEquals(expected, pmf.evaluateAsDouble(x), 0.0);
assertEquals(expected, pmf.evaluate(x + RANDOM.nextDouble() * Math.signum(x)), 0.0);
}
}
}
@Override
public void testKnownConvertToVector()
{
this.testConvertToVector();
this.testConvertFromVector();
}
@Override
public void testDistributionConstructors()
{
int minSupport = 0;
int maxSupport = 0;
UniformIntegerDistribution instance = new UniformIntegerDistribution();
assertEquals(minSupport, (int) instance.getMinSupport());
assertEquals(maxSupport, (int) instance.getMaxSupport());
minSupport = -10;
maxSupport = 33;
instance = new UniformIntegerDistribution(minSupport, maxSupport);
instance = new UniformIntegerDistribution(instance);
assertEquals(minSupport, (int) instance.getMinSupport());
assertEquals(maxSupport, (int) instance.getMaxSupport());
}
@Override
public void testPMFConstructors()
{
int minSupport = 0;
int maxSupport = 0;
UniformIntegerDistribution.PMF instance = new UniformIntegerDistribution.PMF();
assertEquals(minSupport, (int) instance.getMinSupport());
assertEquals(maxSupport, (int) instance.getMaxSupport());
minSupport = RANDOM.nextInt(20);
maxSupport = minSupport + RANDOM.nextInt(20);
instance = new UniformIntegerDistribution.PMF(minSupport, maxSupport);
instance = new UniformIntegerDistribution.PMF(instance);
assertEquals(minSupport, (int) instance.getMinSupport());
assertEquals(maxSupport, (int) instance.getMaxSupport());
}
@Override
public void testCDFConstructors()
{
int minSupport = 0;
int maxSupport = 0;
UniformIntegerDistribution.CDF instance = new UniformIntegerDistribution.CDF();
assertEquals(minSupport, (int) instance.getMinSupport());
assertEquals(maxSupport, (int) instance.getMaxSupport());
minSupport = RANDOM.nextInt(20);
maxSupport = minSupport + RANDOM.nextInt(20);
instance = new UniformIntegerDistribution.CDF(minSupport, maxSupport);
instance = new UniformIntegerDistribution.CDF(instance);
assertEquals(minSupport, (int) instance.getMinSupport());
assertEquals(maxSupport, (int) instance.getMaxSupport());
}
@Override
public void testCDFKnownValues()
{
for (int i = 0; i < 100; i++)
{
UniformIntegerDistribution.CDF cdf =
this.createInstance().getCDF();
int a = cdf.getMinSupport();
int b = cdf.getMaxSupport();
assertEquals(0.0, cdf.evaluateAsDouble(a - 1), 0.0);
assertEquals(1.0, cdf.evaluateAsDouble(b + 1), 0.0);
double expected = 1.0 / (b - a + 1);
double sum = expected;
for (int x = a; x <= b; x++)
{
assertEquals(sum, cdf.evaluate(x), TOLERANCE);
assertEquals(sum, cdf.evaluateAsDouble(x), TOLERANCE);
assertEquals(sum, cdf.evaluate(x + RANDOM.nextDouble() * Math.signum(x)), TOLERANCE);
sum += expected;
}
}
}
/**
* Test of clone method, of class UniformIntegerDistribution.
*/
public void testClone()
{
UniformIntegerDistribution instance = this.createInstance();
UniformIntegerDistribution clone = instance.clone();
assertEquals(instance.getMinSupport(), clone.getMinSupport());
assertEquals(instance.getMaxSupport(), clone.getMaxSupport());
assertNotSame(instance, clone);
assertNotSame(clone, instance.clone());
}
/**
* Test of getProbabilityFunction method, of class UniformIntegerDistribution.
*/
public void testGetProbabilityFunction()
{
UniformIntegerDistribution instance = this.createInstance();
UniformIntegerDistribution.PMF result = instance.getProbabilityFunction();
assertEquals(instance.getMinSupport(), result.getMinSupport());
assertEquals(instance.getMaxSupport(), result.getMaxSupport());
}
/**
* Test of getCDF method, of class UniformIntegerDistribution.
*/
public void testGetCDF()
{
UniformIntegerDistribution instance = this.createInstance();
UniformIntegerDistribution.CDF result = instance.getCDF();
assertEquals(instance.getMinSupport(), result.getMinSupport());
assertEquals(instance.getMaxSupport(), result.getMaxSupport());
}
/**
* Test of getMean method, of class UniformIntegerDistribution.
*/
public void testGetMean()
{
UniformIntegerDistribution instance = new UniformIntegerDistribution();
assertEquals(0.0, (double) instance.getMean(), 0.0);
instance.setMinSupport(5);
instance.setMaxSupport(9);
assertEquals(7.0, (double) instance.getMean());
instance.setMaxSupport(6);
assertEquals(5.5, (double) instance.getMean());
}
/**
* Test of convertToVector method, of class UniformIntegerDistribution.
*/
public void testConvertToVector()
{
UniformIntegerDistribution instance = new UniformIntegerDistribution();
assertEquals(new Vector2(), instance.convertToVector());
instance = new UniformIntegerDistribution(
9, 12);
assertEquals(new Vector2(9, 12), instance.convertToVector());
}
/**
* Test of convertFromVector method, of class UniformIntegerDistribution.
*/
public void testConvertFromVector()
{
UniformIntegerDistribution base = this.createInstance();
Vector parameters = base.convertToVector();
UniformIntegerDistribution instance = new UniformIntegerDistribution();
instance.convertFromVector(parameters);
assertEquals(base.getMinSupport(), instance.getMinSupport());
assertEquals(base.getMaxSupport(), instance.getMaxSupport());
}
/**
* Test of getMinSupport method, of class UniformIntegerDistribution.
*/
public void testGetMinSupport()
{
this.testSetMinSupport();
}
/**
* Test of setMinSupport method, of class UniformIntegerDistribution.
*/
public void testSetMinSupport()
{
int minSupport = 0;
UniformIntegerDistribution instance = new UniformIntegerDistribution();
assertEquals(minSupport, (int) instance.getMinSupport());
minSupport = 8;
instance.setMinSupport(minSupport);
assertEquals(minSupport, (int) instance.getMinSupport());
}
/**
* Test of getMaxSupport method, of class UniformIntegerDistribution.
*/
public void testGetMaxSupport()
{
this.testSetMaxSupport();
}
/**
* Test of setMaxSupport method, of class UniformIntegerDistribution.
*/
public void testSetMaxSupport()
{
int maxSupport = 0;
UniformIntegerDistribution instance = new UniformIntegerDistribution();
assertEquals(maxSupport, (int) instance.getMaxSupport());
maxSupport = 12;
instance.setMaxSupport(maxSupport);
assertEquals(maxSupport, (int) instance.getMaxSupport());
}
/**
* Test of getMeanAsDouble method, of class UniformIntegerDistribution.
*/
public void testGetMeanAsDouble()
{
UniformIntegerDistribution instance = new UniformIntegerDistribution();
assertEquals(0.0, instance.getMeanAsDouble(), 0.0);
instance.setMinSupport(5);
instance.setMaxSupport(9);
assertEquals(7.0, instance.getMeanAsDouble());
instance.setMaxSupport(6);
assertEquals(5.5, instance.getMeanAsDouble());
}
/**
* Test of getEstimator method, of class UniformIntegerDistribution.
*/
public void testGetEstimator()
{
UniformIntegerDistribution instance = new UniformIntegerDistribution();
assertNotNull(instance.getEstimator());
}
@Override
public void testCDFConvertFromVector()
{
UniformIntegerDistribution cdf = this.createInstance();
Vector x1 = cdf.convertToVector();
assertNotNull(x1);
int d = x1.getDimensionality();
Vector y1 = new Vector2(RANDOM.nextInt(10), 10 + RANDOM.nextInt(20));
cdf.convertFromVector(y1);
Vector y2 = cdf.convertToVector();
assertNotSame(y1, y2);
assertEquals(y1, y2);
cdf.convertFromVector(x1);
Vector x2 = cdf.convertToVector();
assertNotSame(x1, x2);
assertEquals(x1, x2);
boolean exceptionThrown = false;
try
{
cdf.convertFromVector(null);
}
catch (Exception e)
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
cdf.convertFromVector(new Vector3());
}
catch (Exception e)
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
cdf.convertFromVector(new Vector1());
}
catch (Exception e)
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
}
public void testMaximumLikelihoodEstimator()
{
UniformIntegerDistribution.MaximumLikelihoodEstimator learner =
new UniformIntegerDistribution.MaximumLikelihoodEstimator();
this.distributionEstimatorTest(learner);
}
}