/*
* File: KernelBinaryCategorizerTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright August 10, 2007, 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.learning.function.categorization;
import gov.sandia.cognition.learning.function.kernel.LinearKernel;
import gov.sandia.cognition.math.matrix.DimensionalityMismatchException;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.mtj.Vector2;
import gov.sandia.cognition.math.matrix.mtj.Vector3;
import gov.sandia.cognition.util.DefaultWeightedValue;
import gov.sandia.cognition.util.WeightedValue;
import java.util.ArrayList;
import java.util.Random;
/**
* This class implements JUnit tests for the following classes:
*
* @author Justin Basilico
* @since 2.0
*/
public class KernelBinaryCategorizerTest
extends CategorizerTestHarness<Vector,Boolean>
{
public final Random RANDOM = new Random(1);
public KernelBinaryCategorizerTest(
String testName)
{
super(testName);
}
public void testConstants()
{
assertEquals(0.0, KernelBinaryCategorizer.DEFAULT_BIAS);
}
public void testConstructors()
{
KernelBinaryCategorizer<Vector, WeightedValue<Vector3>> instance =
new KernelBinaryCategorizer<Vector, WeightedValue<Vector3>>();
assertNull(instance.getKernel());
assertTrue(instance.getExamples().isEmpty());
assertEquals(KernelBinaryCategorizer.DEFAULT_BIAS, instance.getBias());
LinearKernel kernel = LinearKernel.getInstance();
instance = new KernelBinaryCategorizer<Vector, WeightedValue<Vector3>>(kernel);
assertSame(kernel, instance.getKernel());
assertTrue(instance.getExamples().isEmpty());
assertEquals(KernelBinaryCategorizer.DEFAULT_BIAS, instance.getBias());
ArrayList<WeightedValue<Vector3>> examples =
new ArrayList<WeightedValue<Vector3>>();
examples.add(
new DefaultWeightedValue<Vector3>(new Vector3(RANDOM.nextGaussian(), RANDOM.nextGaussian(), RANDOM.nextGaussian())) );
double bias = RANDOM.nextGaussian();
instance = new KernelBinaryCategorizer<Vector, WeightedValue<Vector3>>(kernel, examples, bias);
assertSame(kernel, instance.getKernel());
assertSame(examples, instance.getExamples());
assertEquals(bias, instance.getBias());
KernelBinaryCategorizer<Vector, WeightedValue<Vector3>> copy =
new KernelBinaryCategorizer<Vector, WeightedValue<Vector3>>(instance);
assertNotSame(kernel, copy.getKernel());
assertEquals(1, copy.getExamples().size());
assertNotSame(examples, copy.getExamples());
assertEquals(bias, copy.getBias());
}
/**
* Test of evaluate method, of class gov.sandia.cognition.learning.categorization.KernelBinaryCategorizer.
*/
public void testKnownValues()
{
LinearKernel kernel = LinearKernel.getInstance();
ArrayList<WeightedValue<Vector3>> examples =
new ArrayList<WeightedValue<Vector3>>();
examples.add(new DefaultWeightedValue<Vector3>(new Vector3(1.0, 0.0, 0.0),1.0));
examples.add(new DefaultWeightedValue<Vector3>(new Vector3(0.0, 1.0, 0.0),0.0));
examples.add(new DefaultWeightedValue<Vector3>(new Vector3(0.0, 0.0, 1.0),-2.0));
double bias = 4.0;
KernelBinaryCategorizer<Vector, WeightedValue<Vector3>> instance =
new KernelBinaryCategorizer<Vector, WeightedValue<Vector3>>(kernel, examples, bias);
Vector input = new Vector3(1.0, 1.0, 1.0);
Boolean output = true;
assertEquals(output, instance.evaluate(input));
input = new Vector3(0.0, 7.0, 3.0);
output = false;
assertEquals(output, instance.evaluate(input));
input = new Vector3(0.0, 0.0, 0.0);
output = true;
assertEquals(output, instance.evaluate(input));
boolean exceptionThrown = false;
try
{
instance.evaluate(null);
}
catch ( NullPointerException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
instance.evaluate(new Vector2(1.0, 2.0));
}
catch ( DimensionalityMismatchException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
}
/**
* Test of evaluateAsDouble method, of class gov.sandia.cognition.learning.categorization.KernelBinaryCategorizer.
*/
public void testEvaluateAsDouble()
{
LinearKernel kernel = LinearKernel.getInstance();
ArrayList<WeightedValue<Vector3>> examples =
new ArrayList<WeightedValue<Vector3>>();
examples.add(new DefaultWeightedValue<Vector3>(new Vector3(1.0, 0.0, 0.0),1.0));
examples.add(new DefaultWeightedValue<Vector3>(new Vector3(0.0, 1.0, 0.0),0.0));
examples.add(new DefaultWeightedValue<Vector3>(new Vector3(0.0, 0.0, 1.0),-2.0));
double bias = 4.0;
KernelBinaryCategorizer<Vector, WeightedValue<Vector3>> instance =
new KernelBinaryCategorizer<Vector, WeightedValue<Vector3>>(kernel, examples, bias);
Vector input = new Vector3(1.0, 1.0, 1.0);
double output = 3.0;
assertEquals(output, instance.evaluateAsDouble(input));
input = new Vector3(0.0, 7.0, 3.0);
output = -2.0;
assertEquals(output, instance.evaluateAsDouble(input));
input = new Vector3(0.0, 0.0, 0.0);
output = 4.0;
assertEquals(output, instance.evaluateAsDouble(input));
boolean exceptionThrown = false;
try
{
instance.evaluateAsDouble(null);
}
catch ( NullPointerException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
instance.evaluateAsDouble(new Vector2(1.0, 2.0));
}
catch ( DimensionalityMismatchException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
}
/**
* Test of getExamples method, of class gov.sandia.cognition.learning.categorization.KernelBinaryCategorizer.
*/
public void testGetExamples()
{
this.testSetExamples();
}
/**
* Test of setExamples method, of class gov.sandia.cognition.learning.categorization.KernelBinaryCategorizer.
*/
public void testSetExamples()
{
KernelBinaryCategorizer<Vector, WeightedValue<Vector3>> instance =
new KernelBinaryCategorizer<Vector, WeightedValue<Vector3>>();
assertTrue(instance.getExamples().isEmpty());
ArrayList<WeightedValue<Vector3>> examples =
new ArrayList<WeightedValue<Vector3>>();
examples.add(
new DefaultWeightedValue<Vector3>(new Vector3(RANDOM.nextGaussian(), RANDOM.nextGaussian(), RANDOM.nextGaussian())) );
instance.setExamples(examples);
assertSame(examples, instance.getExamples());
instance.setExamples(null);
assertNull(instance.getExamples());
}
/**
* Test of getBias method, of class gov.sandia.cognition.learning.categorization.KernelBinaryCategorizer.
*/
public void testGetBias()
{
this.testSetBias();
}
/**
* Test of setBias method, of class gov.sandia.cognition.learning.categorization.KernelBinaryCategorizer.
*/
public void testSetBias()
{
KernelBinaryCategorizer<Vector, WeightedValue<Vector3>> instance =
new KernelBinaryCategorizer<Vector, WeightedValue<Vector3>>();
assertEquals(0.0, KernelBinaryCategorizer.DEFAULT_BIAS);
double bias = RANDOM.nextGaussian();
instance.setBias(bias);
assertEquals(bias, instance.getBias());
}
@Override
public KernelBinaryCategorizer<Vector, WeightedValue<Vector>> createInstance()
{
return new KernelBinaryCategorizer<Vector, WeightedValue<Vector>>( new LinearKernel() );
}
@Override
public Vector createRandomInput()
{
return Vector3.createRandom(RANDOM);
}
}