/*
* File: LearnerRepeatExperimentTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry Learning Core
*
* Copyright March 14, 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.
*/
package gov.sandia.cognition.learning.experiment;
import java.util.Random;
import gov.sandia.cognition.learning.algorithm.perceptron.Perceptron;
import gov.sandia.cognition.learning.data.DefaultInputOutputPair;
import gov.sandia.cognition.math.matrix.mtj.Vector2;
import gov.sandia.cognition.evaluator.Evaluator;
import gov.sandia.cognition.learning.data.InputOutputPair;
import gov.sandia.cognition.learning.performance.MeanZeroOneErrorEvaluator;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.statistics.method.ConfidenceInterval;
import gov.sandia.cognition.statistics.method.StudentTConfidence;
import gov.sandia.cognition.learning.algorithm.ensemble.BinaryBaggingLearner;
import gov.sandia.cognition.learning.data.PartitionedDataset;
import gov.sandia.cognition.learning.data.RandomDataPartitioner;
import gov.sandia.cognition.math.UnivariateStatisticsUtil;
import java.util.ArrayList;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Unit tests for LearnerRepeatExperiment.
*
* @author Justin Basilico
* @since 3.1.1
*/
public class LearnerRepeatExperimentTest
{
/** Random number generator. */
protected Random random = new Random(211);
/**
* Creates a new test.
*/
public LearnerRepeatExperimentTest()
{
}
/**
* Test of constructors of class LearnerRepeatExperiment.
*/
public void testConstructors()
{
int numTrials = LearnerRepeatExperiment.DEFAULT_NUM_TRIALS;
LearnerRepeatExperiment
<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, ? extends Boolean>, Double, ConfidenceInterval>
instance = new LearnerRepeatExperiment<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, ? extends Boolean>, Double, ConfidenceInterval>();
assertEquals(numTrials, instance.getNumTrials());
assertNull(instance.getPerformanceEvaluator());
assertNull(instance.getSummarizer());
numTrials = 211;
MeanZeroOneErrorEvaluator<Vector, Boolean> measure = new MeanZeroOneErrorEvaluator<Vector, Boolean>();
StudentTConfidence.Summary summarizer = new StudentTConfidence.Summary(0.95);
instance = new LearnerRepeatExperiment
<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, ? extends Boolean>, Double, ConfidenceInterval>(
numTrials, measure, summarizer);
assertEquals(numTrials, instance.getNumTrials());
assertSame(measure, instance.getPerformanceEvaluator());
assertSame(summarizer, instance.getSummarizer());
}
/**
* Test of evaluatePerformance method, of class LearnerRepeatExperiment.
*/
@Test
public void testEvaluatePerformance()
{
int numTrials = 15;
MeanZeroOneErrorEvaluator<Vector, Boolean> measure =
new MeanZeroOneErrorEvaluator<Vector, Boolean>();
StudentTConfidence.Summary summarizer = new StudentTConfidence.Summary(0.95);
LearnerRepeatExperiment<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, ? extends Boolean>, Double, ConfidenceInterval>
instance = new LearnerRepeatExperiment<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, ? extends Boolean>, Double, ConfidenceInterval>(
numTrials, measure, summarizer);
Vector2[] positives = new Vector2[]
{
new Vector2(1.00, 1.00),
new Vector2(1.00, 3.00),
new Vector2(0.25, 4.00),
new Vector2(2.00, 1.00),
new Vector2(5.00, -3.00)
};
Vector2[] negatives = new Vector2[]
{
new Vector2(2.00, 3.00),
new Vector2(2.00, 4.00),
new Vector2(3.00, 2.00),
new Vector2(4.25, 3.75),
new Vector2(4.00, 7.00),
new Vector2(7.00, 4.00)
};
ArrayList<InputOutputPair<Vector, Boolean>> examples =
new ArrayList<InputOutputPair<Vector, Boolean>>();
for ( Vector2 example : positives )
{
examples.add(new DefaultInputOutputPair<Vector, Boolean>(example, true));
}
for ( Vector2 example : negatives )
{
examples.add(new DefaultInputOutputPair<Vector, Boolean>(example, false));
}
PartitionedDataset<InputOutputPair<Vector, Boolean>> dataset =
RandomDataPartitioner.createPartition(
examples, 0.5, random);
BinaryBaggingLearner<Vector> learner = new BinaryBaggingLearner<Vector>(
new Perceptron(), 10, random);
ConfidenceInterval result = instance.evaluatePerformance(learner, dataset);
assertSame(learner, instance.getLearner());
assertNotNull(result);
assertTrue(result.getCentralValue() > 0.0);
assertEquals(UnivariateStatisticsUtil.computeMean(instance.getStatistics()),
result.getCentralValue(), 1e-10);
assertEquals(numTrials, instance.getNumTrials());
assertEquals(numTrials, instance.getStatistics().size());
assertSame(result, instance.getSummary());
}
/**
* Test of getLearner method, of class LearnerRepeatExperiment.
*/
@Test
public void testGetLearner()
{
// Tested by evaluate.
}
/**
* Test of getStatistics method, of class LearnerRepeatExperiment.
*/
@Test
public void testGetStatistics()
{
// Tested by evaluate.
}
/**
* Test of getSummary method, of class LearnerRepeatExperiment.
*/
@Test
public void testGetSummary()
{
// Tested by evaluate.
}
/**
* Test of getPerformanceEvaluator method, of class LearnerRepeatExperiment.
*/
@Test
public void testGetPerformanceEvaluator()
{
this.testSetPerformanceEvaluator();
}
/**
* Test of setPerformanceEvaluator method, of class LearnerRepeatExperiment.
*/
@Test
public void testSetPerformanceEvaluator()
{
LearnerRepeatExperiment<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, ? extends Boolean>, Double, ConfidenceInterval>
instance = new LearnerRepeatExperiment<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, ? extends Boolean>, Double, ConfidenceInterval>();
assertNull(instance.getPerformanceEvaluator());
MeanZeroOneErrorEvaluator<Vector, Boolean> measure = new MeanZeroOneErrorEvaluator<Vector, Boolean>();
instance.setPerformanceEvaluator(measure);
assertSame(measure, instance.getPerformanceEvaluator());
instance.setPerformanceEvaluator(null);
assertNull(instance.getPerformanceEvaluator());
}
/**
* Test of getSummarizer method, of class LearnerRepeatExperiment.
*/
@Test
public void testGetSummarizer()
{
this.testSetSummarizer();
}
/**
* Test of setSummarizer method, of class LearnerRepeatExperiment.
*/
@Test
public void testSetSummarizer()
{
LearnerRepeatExperiment
<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, Boolean>, Double, ConfidenceInterval>
instance = new LearnerRepeatExperiment<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, Boolean>, Double, ConfidenceInterval>();
assertNull(instance.getSummarizer());
StudentTConfidence.Summary summarizer = new StudentTConfidence.Summary(0.95);
instance.setSummarizer(summarizer);
assertSame(summarizer, instance.getSummarizer());
instance.setSummarizer(null);
assertNull(instance.getSummarizer());
}
/**
* Test of getNumTrials method, of class LearnerRepeatExperiment.
*/
@Test
public void testGetNumTrials()
{
this.testSetNumTrials();
}
/**
* Test of setNumTrials method, of class LearnerRepeatExperiment.
*/
@Test
public void testSetNumTrials()
{
int numTrials = LearnerRepeatExperiment.DEFAULT_NUM_TRIALS;
LearnerRepeatExperiment
<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, Boolean>, Double, ConfidenceInterval>
instance = new LearnerRepeatExperiment<InputOutputPair<Vector, Boolean>, Evaluator<? super Vector, Boolean>, Double, ConfidenceInterval>();
assertEquals(numTrials, instance.getNumTrials());
numTrials = 1;
instance.setNumTrials(numTrials);
assertEquals(numTrials, instance.getNumTrials());
numTrials = 2;
instance.setNumTrials(numTrials);
assertEquals(numTrials, instance.getNumTrials());
numTrials = 7;
instance.setNumTrials(numTrials);
assertEquals(numTrials, instance.getNumTrials());
int[] badValues = {0, -1, -2, -(1 + random.nextInt(1000))};
for (int badValue : badValues)
{
boolean exceptionThrown = false;
try
{
instance.setNumTrials(badValue);
}
catch (IllegalArgumentException e)
{
exceptionThrown = true;
}
finally
{
assertTrue("" + badValue, exceptionThrown);
}
assertEquals(numTrials, instance.getNumTrials());
}
}
}