/* * File: PerceptronTest.java * Authors: Justin Basilico * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright August 13, 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.algorithm.perceptron; import gov.sandia.cognition.evaluator.Evaluator; import gov.sandia.cognition.learning.data.DefaultInputOutputPair; import gov.sandia.cognition.math.matrix.mtj.SparseVectorFactoryMTJ; import gov.sandia.cognition.learning.data.InputOutputPair; import gov.sandia.cognition.math.matrix.VectorFactory; import gov.sandia.cognition.math.matrix.mtj.Vector2; import java.util.ArrayList; import junit.framework.TestCase; /** * This class implements JUnit tests for the following classes: * * Perceptron * * @author Justin Basilico * @since 2.0 */ public class PerceptronTest extends TestCase { public PerceptronTest( String testName ) { super( testName ); } public void testConstnats() { assertEquals( 100, Perceptron.DEFAULT_MAX_ITERATIONS ); assertEquals( 0.0, Perceptron.DEFAULT_MARGIN_POSITIVE ); assertEquals( 0.0, Perceptron.DEFAULT_MARGIN_NEGATIVE ); } public void testConstructors() { Perceptron instance = new Perceptron(); assertEquals( Perceptron.DEFAULT_MAX_ITERATIONS, instance.getMaxIterations() ); assertEquals( Perceptron.DEFAULT_MARGIN_POSITIVE, instance.getMarginPositive() ); assertEquals( Perceptron.DEFAULT_MARGIN_NEGATIVE, instance.getMarginNegative() ); assertSame( VectorFactory.getDefault(), instance.getVectorFactory() ); int maxIterations = Perceptron.DEFAULT_MAX_ITERATIONS + 10; instance = new Perceptron( maxIterations ); assertEquals( maxIterations, instance.getMaxIterations() ); assertEquals( Perceptron.DEFAULT_MARGIN_POSITIVE, instance.getMarginPositive() ); assertEquals( Perceptron.DEFAULT_MARGIN_NEGATIVE, instance.getMarginNegative() ); assertSame( VectorFactory.getDefault(), instance.getVectorFactory() ); double marginPositive = Math.random(); double marginNegative = Math.random(); instance = new Perceptron( maxIterations, marginPositive, marginNegative ); assertEquals( maxIterations, instance.getMaxIterations() ); assertEquals( marginPositive, instance.getMarginPositive() ); assertEquals( marginNegative, instance.getMarginNegative() ); assertSame( VectorFactory.getDefault(), instance.getVectorFactory() ); VectorFactory<?> factory = new SparseVectorFactoryMTJ(); instance = new Perceptron( maxIterations, marginPositive, marginNegative, factory ); assertEquals( maxIterations, instance.getMaxIterations() ); assertEquals( marginPositive, instance.getMarginPositive() ); assertEquals( marginNegative, instance.getMarginNegative() ); assertSame( factory, instance.getVectorFactory() ); } public void testLearn() { Perceptron instance = new Perceptron(); 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<Vector2, Boolean>> examples = new ArrayList<InputOutputPair<Vector2, Boolean>>(); for (Vector2 example : positives) { examples.add( new DefaultInputOutputPair<Vector2, Boolean>( example, true ) ); } for (Vector2 example : negatives) { examples.add( new DefaultInputOutputPair<Vector2, Boolean>( example, false ) ); } Evaluator<? super Vector2,Boolean> result = instance.learn( examples ); assertEquals( 0, instance.getErrorCount() ); assertEquals( result, instance.getResult() ); for (Vector2 example : positives) { assertTrue( result.evaluate( example ) ); } for (Vector2 example : negatives) { assertFalse( result.evaluate( example ) ); } instance.setMargin( 10.0 ); instance.setMaxIterations( 1000 ); result = instance.learn( examples ); assertEquals( 0, instance.getErrorCount() ); assertEquals( result, instance.getResult() ); for (Vector2 example : positives) { assertTrue( result.evaluate( example ) ); } for (Vector2 example : negatives) { assertFalse( result.evaluate( example ) ); } instance.setMaxIterations( instance.getIteration() / 2 ); result = instance.learn( examples ); assertTrue( instance.getErrorCount() > 0 ); examples = new ArrayList<InputOutputPair<Vector2, Boolean>>(); result = instance.learn( examples ); assertNull( result ); result = instance.learn( null ); assertNull( result ); } /** * Test of setMargin method, of class gov.sandia.cognition.learning.perceptron.Perceptron. */ public void testSetMargin() { Perceptron instance = new Perceptron(); double margin = Math.random(); instance.setMargin( margin ); assertEquals( margin, instance.getMarginPositive() ); assertEquals( margin, instance.getMarginNegative() ); } /** * Test of getMarginPositive method, of class gov.sandia.cognition.learning.perceptron.Perceptron. */ public void testGetMarginPositive() { this.testSetMarginPositive(); } /** * Test of setMarginPositive method, of class gov.sandia.cognition.learning.perceptron.Perceptron. */ public void testSetMarginPositive() { Perceptron instance = new Perceptron(); assertEquals( Perceptron.DEFAULT_MARGIN_POSITIVE, instance.getMarginPositive() ); double margin = Math.random(); instance.setMarginPositive( margin ); assertEquals( margin, instance.getMarginPositive() ); margin = 0.0; instance.setMarginPositive( margin ); assertEquals( margin, instance.getMarginPositive() ); margin = -1.0; instance.setMarginPositive( margin ); assertEquals( margin, instance.getMarginPositive() ); } /** * Test of getMarginNegative method, of class gov.sandia.cognition.learning.perceptron.Perceptron. */ public void testGetMarginNegative() { this.testSetMarginNegative(); } /** * Test of setMarginNegative method, of class gov.sandia.cognition.learning.perceptron.Perceptron. */ public void testSetMarginNegative() { Perceptron instance = new Perceptron(); assertEquals( Perceptron.DEFAULT_MARGIN_NEGATIVE, instance.getMarginNegative() ); double margin = Math.random(); instance.setMarginNegative( margin ); assertEquals( margin, instance.getMarginNegative() ); margin = 0.0; instance.setMarginNegative( margin ); assertEquals( margin, instance.getMarginNegative() ); margin = -1.0; instance.setMarginNegative( margin ); assertEquals( margin, instance.getMarginNegative() ); } /** * Test of getVectorFactory method, of class gov.sandia.cognition.learning.perceptron.Perceptron. */ public void testGetVectorFactory() { this.testSetVectorFactory(); } /** * Test of setVectorFactory method, of class gov.sandia.cognition.learning.perceptron.Perceptron. */ public void testSetVectorFactory() { Perceptron instance = new Perceptron(); assertSame( VectorFactory.getDefault(), instance.getVectorFactory() ); VectorFactory<?> factory = new SparseVectorFactoryMTJ(); instance.setVectorFactory( factory ); assertSame( factory, instance.getVectorFactory() ); instance.setVectorFactory( null ); assertNull( instance.getVectorFactory() ); } /** * Test of getResult method, of class gov.sandia.cognition.learning.perceptron.Perceptron. */ public void testGetResult() { // Tested by learn. } /** * Test of getErrorCount method, of class gov.sandia.cognition.learning.perceptron.Perceptron. */ public void testGetErrorCount() { // Tested by learn. } }