/*
* File: DivergencesEvaluatorTest.java
* Authors: Justin Basilico
* Project: Cognitive Foundry Learning Core
*
* Copyright 2011 Cognitive Foundry. All rights reserved.
*/
package gov.sandia.cognition.learning.function.distance;
import org.junit.Test;
import gov.sandia.cognition.learning.algorithm.clustering.KMeansFactory;
import gov.sandia.cognition.learning.algorithm.clustering.cluster.CentroidCluster;
import gov.sandia.cognition.math.DivergenceFunction;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.VectorFactory;
import gov.sandia.cognition.math.matrix.Vectorizable;
import gov.sandia.cognition.math.matrix.mtj.SparseVectorFactoryMTJ;
import gov.sandia.cognition.math.matrix.mtj.Vector2;
import gov.sandia.cognition.math.matrix.mtj.Vector3;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Random;
import static org.junit.Assert.*;
/**
* Unit tests for class DivergencesEvaluator.
*
* @author Justin Basilico
* @since 3.3.3
*/
public class DivergencesEvaluatorTest
{
/** Random number generator to use. */
protected Random random = new Random(211);
/**
* Creates a new test.
*/
public DivergencesEvaluatorTest()
{
}
/**
* Test of constructors of class DivergencesEvaluator.
*/
@Test
public void testConstructors()
{
DivergenceFunction<Vectorizable, Vectorizable> divergenceFunction = null;
Collection<Vector> values = null;
VectorFactory<?> vectorFactory = VectorFactory.getDefault();
DivergencesEvaluator<Vector, Vector> instance = new DivergencesEvaluator<Vector, Vector>();
assertSame(divergenceFunction, instance.getDivergenceFunction());
assertTrue(instance.getValues().isEmpty());
assertSame(vectorFactory, instance.getVectorFactory());
divergenceFunction = new ManhattanDistanceMetric();
values = new ArrayList<Vector>();
values.add(new Vector2());
instance = new DivergencesEvaluator<Vector, Vector>(
divergenceFunction, values);
assertSame(divergenceFunction, instance.getDivergenceFunction());
assertSame(values, instance.getValues());
assertSame(vectorFactory, instance.getVectorFactory());
vectorFactory = new SparseVectorFactoryMTJ();
instance = new DivergencesEvaluator<Vector, Vector>(
divergenceFunction, values, vectorFactory);
assertSame(divergenceFunction, instance.getDivergenceFunction());
assertSame(values, instance.getValues());
assertSame(vectorFactory, instance.getVectorFactory());
}
/**
* Test of clone method, of class DivergencesEvaluator.
*/
@Test
public void testClone()
{
DivergencesEvaluator<Vector, Vector> instance = new DivergencesEvaluator<Vector, Vector>();
DivergencesEvaluator<Vector, Vector> clone = instance.clone();
assertNotSame(clone, instance);
assertNotSame(clone, instance.clone());
}
/**
* Test of evaluate method, of class DivergencesEvaluator.
*/
@Test
public void testEvaluate()
{
DivergencesEvaluator<Vector, Vector3> instance =
DivergencesEvaluator.create(new ManhattanDistanceMetric(),
Arrays.asList(
new Vector3( 1.0, 0.0, 0.0),
new Vector3( 0.0, -3.0, 0.0),
new Vector3( 0.0, 0.0, 2.0),
new Vector3( 3.0, 2.0, 1.0)));
VectorFactory<?> vectorFactory = VectorFactory.getDenseDefault();
assertEquals(vectorFactory.copyValues(2.0, 4.0, 3.0, 5.0),
instance.evaluate(new Vector3(1.0, -1.0, 1.0)));
assertEquals(vectorFactory.copyValues(4.0, 0.0, 5.0, 9.0),
instance.evaluate(new Vector3(0.0, -3.0, 0.0)));
}
/**
* Test of getOutputDimensionality method, of class DivergencesEvaluator.
*/
@Test
public void testGetOutputDimensionality()
{
DivergencesEvaluator<Vector, Vector> instance =
new DivergencesEvaluator<Vector, Vector>();
assertEquals(0, instance.getOutputDimensionality());
instance.getValues().add(new Vector3());
assertEquals(1, instance.getOutputDimensionality());
instance.getValues().add(new Vector3());
assertEquals(2, instance.getOutputDimensionality());
instance.setValues(new LinkedHashSet<Vector>());
assertEquals(0, instance.getOutputDimensionality());
}
/**
* Test of getDivergenceFunction method, of class DivergencesEvaluator.
*/
@Test
public void testGetDivergenceFunction()
{
this.testSetDivergenceFunction();
}
/**
* Test of setDivergenceFunction method, of class DivergencesEvaluator.
*/
@Test
public void testSetDivergenceFunction()
{
DivergenceFunction<Vectorizable, Vectorizable> divergenceFunction = null;
DivergencesEvaluator<Vector, Vector> instance = new DivergencesEvaluator<Vector, Vector>();
assertSame(divergenceFunction, instance.getDivergenceFunction());
divergenceFunction = new ManhattanDistanceMetric();
instance.setDivergenceFunction(divergenceFunction);
assertSame(divergenceFunction, instance.getDivergenceFunction());
divergenceFunction = null;
instance.setDivergenceFunction(divergenceFunction);
assertSame(divergenceFunction, instance.getDivergenceFunction());
divergenceFunction = new EuclideanDistanceSquaredMetric();
instance.setDivergenceFunction(divergenceFunction);
assertSame(divergenceFunction, instance.getDivergenceFunction());
}
/**
* Test of getValues method, of class DivergencesEvaluator.
*/
@Test
public void testGetValues()
{
this.testSetValues();;
}
/**
* Test of setValues method, of class DivergencesEvaluator.
*/
@Test
public void testSetValues()
{
Collection<Vector> values = null;
DivergencesEvaluator<Vector, Vector> instance = new DivergencesEvaluator<Vector, Vector>();
assertTrue(instance.getValues().isEmpty());
values = new ArrayList<Vector>();
values.add(new Vector2());
instance.setValues(values);
assertSame(values, instance.getValues());
values = new HashSet<Vector>();
instance.setValues(values);
assertSame(values, instance.getValues());
}
/**
* Test of create method, of class DivergencesEvaluator.
*/
@Test
public void testCreate()
{
ManhattanDistanceMetric divergenceFunction =
new ManhattanDistanceMetric();
Collection<Vector> values = new ArrayList<Vector>();
values.add(new Vector2());
DivergencesEvaluator<?, Vector> instance =
DivergencesEvaluator.create(divergenceFunction, values);
assertSame(divergenceFunction, instance.getDivergenceFunction());
assertSame(values, instance.getValues());
}
/**
* Test of learn method, of class DivergencesEvaluator.Learner.
*/
@Test
public void testLearn()
{
VectorFactory<?> vectorFactory = VectorFactory.getDenseDefault();
DivergencesEvaluator.Learner<Collection<? extends Vector>, Vector, CentroidCluster<Vector>> instance =
DivergencesEvaluator.Learner.create(
KMeansFactory.create(2, random),
KMeansFactory.create(2, random).getDivergenceFunction());
Collection<Vector> data = new ArrayList<Vector>();
data.add(vectorFactory.copyValues( 0.0, 1.0, 0.0, 0.0));
data.add(vectorFactory.copyValues( 0.0, -1.0, 0.0, 0.0));
data.add(vectorFactory.copyValues( 0.0, 0.0, 3.0, 0.0));
data.add(vectorFactory.copyValues( 0.0, 0.0, 5.0, 0.0));
DivergencesEvaluator<Vector, ?> learned = instance.learn(data);
assertEquals(new Vector2(4.0, 0.0),
learned.evaluate(vectorFactory.copyValues(0.0, 0.0, 0.0, 0.0)));
assertEquals(new Vector2(0.0, 4.0),
learned.evaluate(vectorFactory.copyValues(0.0, 0.0, 4.0, 0.0)));
}
}