/*
* File: CompositeBatchLearnerPairTest.java
* Authors: Justin Basilico
* Project: Cognitive Foundry
*
* Copyright 2011 Cognitive Foundry. All rights reserved.
*/
package gov.sandia.cognition.learning.algorithm;
import java.util.Arrays;
import gov.sandia.cognition.learning.algorithm.baseline.ConstantLearner;
import gov.sandia.cognition.data.convert.vector.UniqueBooleanVectorEncoder;
import gov.sandia.cognition.evaluator.CompositeEvaluatorPair;
import gov.sandia.cognition.math.matrix.VectorEntry;
import gov.sandia.cognition.learning.algorithm.InputOutputTransformedBatchLearnerTest.UniqueStringEncoderLearner;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.evaluator.Evaluator;
import gov.sandia.cognition.statistics.DataDistribution;
import gov.sandia.cognition.statistics.distribution.DefaultDataDistribution;
import gov.sandia.cognition.util.AbstractCloneableSerializable;
import java.util.Collection;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Unit tests for class {@code CompositeBatchLearnerPair}.
*
* @author Justin Basilico
* @since 3.3.3
*/
public class CompositeBatchLearnerPairTest
extends Object
{
/**
* Creates a new test.
*/
public CompositeBatchLearnerPairTest()
{
super();
}
/**
* Test of constructors of class CompositeBatchLearnerPair.
*/
@Test
public void testConstructors()
{
BatchLearner<? super Collection<? extends String>, ? extends Evaluator<? super String, ? extends Vector>> firstLearner = null;
BatchLearner<? super Collection<? extends Vector>, ? extends Evaluator<? super Vector, ? extends Double>> secondLearner = null;
CompositeBatchLearnerPair<String, Vector, Double> instance =
new CompositeBatchLearnerPair<String, Vector, Double>();
assertSame(firstLearner, instance.getFirstLearner());
assertSame(secondLearner, instance.getSecondLearner());
firstLearner = new UniqueStringEncoderLearner();
secondLearner = new MostFrequentFeatureLearner();
instance = new CompositeBatchLearnerPair<String, Vector, Double>(
firstLearner, secondLearner);
assertSame(firstLearner, instance.getFirstLearner());
assertSame(secondLearner, instance.getSecondLearner());
}
/**
* Test of learn method, of class CompositeBatchLearnerPair.
*/
@Test
public void testLearn()
{
UniqueStringEncoderLearner firstLearner = new UniqueStringEncoderLearner();
MostFrequentFeatureLearner secondLearner = new MostFrequentFeatureLearner();
CompositeBatchLearnerPair<String, Vector, Double> instance =
CompositeBatchLearnerPair.create(firstLearner, secondLearner);
Collection<String> data = Arrays.asList("a", "b", "c", "b", "b", "b", "a");
CompositeEvaluatorPair<String, Vector, Double> result =
instance.learn(data);
assertTrue(result.getFirst() instanceof UniqueBooleanVectorEncoder);
assertTrue(result.getSecond() instanceof VectorIndexEvaluator);
assertEquals(-1.0, result.evaluate("a"), 0.0);
assertEquals(1.0, result.evaluate("b"), 0.0);
assertEquals(-1.0, result.evaluate("c"), 0.0);
assertNotSame(result, instance.learn(data));
assertNotNull(instance.learn(data));
}
/**
* Test of getFirst method, of class CompositeBatchLearnerPair.
*/
@Test
public void testGetFirst()
{
BatchLearner<? super Collection<? extends String>, ? extends Evaluator<? super String, ? extends Vector>> firstLearner = null;
CompositeBatchLearnerPair<String, Vector, Double> instance = new CompositeBatchLearnerPair<String, Vector, Double>();
assertSame(firstLearner, instance.getFirst());
firstLearner = new UniqueStringEncoderLearner();
instance.setFirstLearner(firstLearner);
assertSame(firstLearner, instance.getFirst());
}
/**
* Test of getSecond method, of class CompositeBatchLearnerPair.
*/
@Test
public void testGetSecond()
{
BatchLearner<? super Collection<? extends Vector>, ? extends Evaluator<? super Vector, ? extends Double>> secondLearner = null;
CompositeBatchLearnerPair<String, Vector, Double> instance = new CompositeBatchLearnerPair<String, Vector, Double>();
assertSame(secondLearner, instance.getSecond());
secondLearner = new MostFrequentFeatureLearner();
instance.setSecondLearner(secondLearner);
assertSame(secondLearner, instance.getSecond());
}
/**
* Test of getFirstLearner method, of class CompositeBatchLearnerPair.
*/
@Test
public void testGetFirstLearner()
{
this.testSetFirstLearner();;
}
/**
* Test of setFirstLearner method, of class CompositeBatchLearnerPair.
*/
@Test
public void testSetFirstLearner()
{
BatchLearner<? super Collection<? extends String>, ? extends Evaluator<? super String, ? extends Vector>> firstLearner = null;
CompositeBatchLearnerPair<String, Vector, Double> instance = new CompositeBatchLearnerPair<String, Vector, Double>();
assertSame(firstLearner, instance.getFirstLearner());
firstLearner = new UniqueStringEncoderLearner();
instance.setFirstLearner(firstLearner);
assertSame(firstLearner, instance.getFirstLearner());
}
/**
* Test of getSecondLearner method, of class CompositeBatchLearnerPair.
*/
@Test
public void testGetSecondLearner()
{
this.testSetSecondLearner();
}
/**
* Test of setSecondLearner method, of class CompositeBatchLearnerPair.
*/
@Test
public void testSetSecondLearner()
{
BatchLearner<? super Collection<? extends Vector>, ? extends Evaluator<? super Vector, ? extends Double>> secondLearner = null;
CompositeBatchLearnerPair<String, Vector, Double> instance = new CompositeBatchLearnerPair<String, Vector, Double>();
assertSame(secondLearner, instance.getSecondLearner());
secondLearner = new MostFrequentFeatureLearner();
instance.setSecondLearner(secondLearner);
assertSame(secondLearner, instance.getSecondLearner());
}
/**
* Test of create method, of class CompositeBatchLearnerPair.
*/
@Test
public void testCreate()
{
UniqueStringEncoderLearner firstLearner = new UniqueStringEncoderLearner();
MostFrequentFeatureLearner secondLearner = new MostFrequentFeatureLearner();
CompositeBatchLearnerPair<String, Vector, Double> instance =
CompositeBatchLearnerPair.create(firstLearner, secondLearner);
assertSame(firstLearner, instance.getFirstLearner());
assertSame(secondLearner, instance.getSecondLearner());
}
/**
* Test of createInputTransformed method, of class CompositeBatchLearnerPair.
*/
@Test
public void testCreateInputTransformed()
{
UniqueBooleanVectorEncoder<String> inputTransform = new UniqueBooleanVectorEncoder<String>(null, null);
MostFrequentFeatureLearner learner = new MostFrequentFeatureLearner();
CompositeBatchLearnerPair<String, Vector, Double> instance =
CompositeBatchLearnerPair.createInputTransformed(inputTransform, learner);
assertSame(inputTransform, ((ConstantLearner<?>) instance.getFirstLearner()).getValue());
assertSame(learner, instance.getSecondLearner());
}
/**
* Test of testCreateOutputTransformed method, of class CompositeBatchLearnerPair.
*/
@Test
public void testCreateOutputTransformed()
{
UniqueStringEncoderLearner learner = new UniqueStringEncoderLearner();
VectorIndexEvaluator outputTransform = new VectorIndexEvaluator(3);
CompositeBatchLearnerPair<String, Vector, Double> instance =
CompositeBatchLearnerPair.createOutputTransformed(learner, outputTransform);
assertSame(learner, instance.getFirstLearner());
assertSame(outputTransform, ((ConstantLearner<?>) instance.getSecondLearner()).getValue());
}
public static class VectorIndexEvaluator
extends AbstractCloneableSerializable
implements Evaluator<Vector, Double>
{
protected int index;
public VectorIndexEvaluator(
final int index)
{
super();
this.index = index;
}
@Override
public Double evaluate(
final Vector input)
{
return input.getElement(this.index);
}
}
public static class MostFrequentFeatureLearner
extends AbstractCloneableSerializable
implements BatchLearner<Collection<? extends Vector>, VectorIndexEvaluator>
{
public MostFrequentFeatureLearner()
{
super();
}
@Override
public VectorIndexEvaluator learn(
final Collection<? extends Vector> data)
{
final DataDistribution<Integer> featureCounts =
new DefaultDataDistribution<Integer>();
for (Vector input : data)
{
for (VectorEntry entry : input)
{
if (entry.getValue() > 0.0)
{
featureCounts.increment(entry.getIndex());
}
}
}
return new VectorIndexEvaluator(featureCounts.getMaxValueKey());
}
}
}