/* * File: EvaluatorToCategorizerAdapterTest.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright Jun 30, 2009, 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.evaluator.Evaluator; import gov.sandia.cognition.learning.algorithm.SupervisedBatchLearner; import gov.sandia.cognition.learning.algorithm.nearest.KNearestNeighborExhaustive; import gov.sandia.cognition.learning.data.DefaultInputOutputPair; import gov.sandia.cognition.learning.data.InputOutputPair; import gov.sandia.cognition.learning.function.scalar.ThresholdFunction; import gov.sandia.cognition.math.Metric; import gov.sandia.cognition.math.NumberAverager; import gov.sandia.cognition.util.AbstractCloneableSerializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Set; import java.util.TreeSet; /** * Unit tests for EvaluatorToCategorizerAdapterTest. * * @author krdixon */ public class EvaluatorToCategorizerAdapterTest extends CategorizerTestHarness<Double,Double> { /** * Tests for class EvaluatorToCategorizerAdapterTest. * @param testName Name of the test. */ public EvaluatorToCategorizerAdapterTest( String testName) { super(testName); } /** * Tests the constructors of class EvaluatorToCategorizerAdapterTest. */ public void testConstructors() { System.out.println( "Constructors" ); EvaluatorToCategorizerAdapter<?,?> a = new EvaluatorToCategorizerAdapter<Double,Double>(); assertNotNull( a ); assertNull( a.getEvaluator() ); assertNotNull( a.getCategories() ); assertEquals( 0, a.getCategories().size() ); a = this.createInstance(); assertNotNull( a ); assertNotNull( a.getEvaluator() ); assertNotNull( a.getCategories() ); } /** * Test of getEvaluator method, of class EvaluatorToCategorizerAdapter. */ public void testGetEvaluator() { System.out.println("getEvaluator"); EvaluatorToCategorizerAdapter<?,?> instance = this.createInstance(); assertNotNull( instance.getEvaluator() ); } /** * Test of setEvaluator method, of class EvaluatorToCategorizerAdapter. */ public void testSetEvaluator() { System.out.println("setEvaluator"); EvaluatorToCategorizerAdapter<Double,Double> instance = this.createInstance(); Evaluator<? super Double,? extends Double> f = instance.getEvaluator(); instance.setEvaluator(null); assertNull( instance.getEvaluator() ); instance.setEvaluator(f); assertSame( f, instance.getEvaluator() ); } /** * Test of setCategories method, of class EvaluatorToCategorizerAdapter. */ public void testSetCategories() { System.out.println("setCategories"); EvaluatorToCategorizerAdapter<Double,Double> instance = this.createInstance(); Set<Double> categories = instance.getCategories(); instance.setCategories(null); assertNull( instance.getCategories() ); instance.setCategories(categories); assertSame( categories, instance.getCategories() ); } @Override public EvaluatorToCategorizerAdapter<Double, Double> createInstance() { ThresholdFunction f = new ThresholdFunction(); return new EvaluatorToCategorizerAdapter<Double, Double>( f, new TreeSet<Double>( Arrays.asList( f.getLowValue(), f.getHighValue() ) ) ); } @Override public Double createRandomInput() { return RANDOM.nextGaussian(); } @Override public void testKnownValues() { EvaluatorToCategorizerAdapter<Double,Double> instance = this.createInstance(); ThresholdFunction f = (ThresholdFunction) instance.getEvaluator(); Double inputLow = f.getThreshold() - 1.0; Double inputHigh = f.getThreshold() + 1.0; assertEquals( f.getLowValue(), instance.evaluate(inputLow) ); assertEquals( f.getHighValue(), instance.evaluate(inputHigh) ); } public static class EuclideanScalarMetric extends AbstractCloneableSerializable implements Metric<Double> { public double evaluate(Double first, Double second) { double delta = first - second; return Math.abs(delta); } } public EvaluatorToCategorizerAdapter.Learner<Double,Double> createLearnerInstance() { SupervisedBatchLearner<Double,Double,KNearestNeighborExhaustive<Double,Double>> knn = new KNearestNeighborExhaustive.Learner<Double,Double>(1, new EuclideanScalarMetric(), new NumberAverager() ); return new EvaluatorToCategorizerAdapter.Learner<Double,Double>( knn ); } public void testLearnerConstructors() { System.out.println( "Learner.constructors" ); EvaluatorToCategorizerAdapter.Learner<Double,Double> learner = new EvaluatorToCategorizerAdapter.Learner<Double,Double>(); assertNotNull( learner ); assertNull( learner.getLearner() ); learner = this.createLearnerInstance(); assertNotNull( learner ); assertNotNull( learner.getLearner() ); } public void testLearnerLearn() { System.out.println( "Learner.learn" ); Collection<InputOutputPair<Double,Double>>data = new ArrayList<InputOutputPair<Double,Double>>( 2 ); data.add( new DefaultInputOutputPair<Double,Double>( RANDOM.nextGaussian(), RANDOM.nextGaussian() ) ); data.add( new DefaultInputOutputPair<Double,Double>( RANDOM.nextGaussian(), RANDOM.nextGaussian() ) ); EvaluatorToCategorizerAdapter.Learner<Double,Double> learner = this.createLearnerInstance(); EvaluatorToCategorizerAdapter<Double,Double> f = learner.learn(data); assertNotNull( f ); assertNotNull( f.getEvaluator() ); assertEquals( 2, f.getCategories().size() ); } }