/* * File: AffinityPropagationTest.java * Authors: Justin Basilico * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright August 7, 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.clustering; import gov.sandia.cognition.learning.algorithm.clustering.cluster.CentroidCluster; import gov.sandia.cognition.learning.function.distance.EuclideanDistanceMetric; import gov.sandia.cognition.learning.function.distance.EuclideanDistanceSquaredMetric; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.Vectorizable; import gov.sandia.cognition.math.matrix.mtj.Vector2; import java.util.ArrayList; import java.util.Arrays; import gov.sandia.cognition.math.DivergenceFunction; import java.util.Collection; import junit.framework.TestCase; /** * This class implements JUnit tests for the following classes: * * AffinityPropagation * * @author Justin Basilico * @since 2.0 */ public class AffinityPropagationTest extends TestCase { public AffinityPropagationTest( String testName ) { super( testName ); } public void testConstructors() { AffinityPropagation<Vectorizable> instance = new AffinityPropagation<Vectorizable>(); assertNull( instance.getDivergence() ); assertEquals( AffinityPropagation.DEFAULT_SELF_DIVERGENCE, instance.getSelfDivergence() ); assertEquals( AffinityPropagation.DEFAULT_DAMPING_FACTOR, instance.getDampingFactor() ); assertEquals( AffinityPropagation.DEFAULT_MAX_ITERATIONS, instance.getMaxIterations() ); EuclideanDistanceSquaredMetric metric = EuclideanDistanceSquaredMetric.INSTANCE; double selfDivergence = 4.7; instance = new AffinityPropagation<Vectorizable>( metric, selfDivergence ); assertSame( metric, instance.getDivergence() ); assertEquals( selfDivergence, instance.getSelfDivergence() ); assertEquals( AffinityPropagation.DEFAULT_DAMPING_FACTOR, instance.getDampingFactor() ); assertEquals( AffinityPropagation.DEFAULT_MAX_ITERATIONS, instance.getMaxIterations() ); double dampingFactor = 0.47; instance = new AffinityPropagation<Vectorizable>( metric, selfDivergence, dampingFactor ); assertSame( metric, instance.getDivergence() ); assertEquals( selfDivergence, instance.getSelfDivergence() ); assertEquals( dampingFactor, instance.getDampingFactor() ); assertEquals( AffinityPropagation.DEFAULT_MAX_ITERATIONS, instance.getMaxIterations() ); int maxIterations = 4774; instance = new AffinityPropagation<Vectorizable>( metric, selfDivergence, dampingFactor, maxIterations ); assertSame( metric, instance.getDivergence() ); assertEquals( selfDivergence, instance.getSelfDivergence() ); assertEquals( dampingFactor, instance.getDampingFactor() ); assertEquals( maxIterations, instance.getMaxIterations() ); } public void testLearn() { Vector[] data = new Vector[]{ new Vector2( -2.341500, 3.696800 ), new Vector2( -1.109200, 3.111700 ), new Vector2( -1.566900, 1.835100 ), new Vector2( -2.658500, 0.664900 ), new Vector2( -4.031700, 2.845700 ), new Vector2( -3.081000, 2.101100 ), new Vector2( 2.588000, 1.781900 ), new Vector2( 3.292300, 3.058500 ), new Vector2( 4.031700, 1.622300 ), new Vector2( 3.081000, -0.611700 ), new Vector2( 0.264100, 0.398900 ), new Vector2( 1.320400, 2.207400 ), new Vector2( 0.193700, 3.643600 ), new Vector2( 1.954200, -0.505300 ), new Vector2( 1.637300, 1.409600 ), new Vector2( -0.123200, -1.516000 ), new Vector2( -1.355600, -3.058500 ), new Vector2( 0.017600, -4.016000 ), new Vector2( 1.003500, -3.590400 ), new Vector2( 0.017600, -2.420200 ), new Vector2( -1.531700, -0.930900 ), new Vector2( -1.144400, 0.505300 ), new Vector2( 0.616200, -1.516000 ), new Vector2( 1.707700, -2.207400 ), new Vector2( 2.095100, 3.430900 ) }; ArrayList<Vector> exemplars = new ArrayList<Vector>(); exemplars.add( data[2] ); exemplars.add( data[6] ); exemplars.add( data[19] ); int[] membershipCounts = new int[]{9, 8, 8}; double selfDivergence = 15.561256; AffinityPropagation<Vectorizable> instance = new AffinityPropagation<Vectorizable>( EuclideanDistanceSquaredMetric.INSTANCE, selfDivergence, 0.5, 100 ); Collection<CentroidCluster<Vectorizable>> clusters = instance.learn( Arrays.asList( data ) ); assertEquals( 3, clusters.size() ); for (CentroidCluster<Vectorizable> cluster : clusters) { int index = exemplars.indexOf( cluster.getCentroid() ); assertTrue( index >= 0 ); assertEquals( membershipCounts[index], cluster.getMembers().size() ); } } /** * Test of getLearned method, of class gov.sandia.cognition.learning.clustering.AffinityPropagation. */ public void testGetResult() { AffinityPropagation<Vectorizable> instance = new AffinityPropagation<Vectorizable>(); assertNull( instance.getResult() ); } /** * Test of getDivergence method, of class gov.sandia.cognition.learning.clustering.AffinityPropagation. */ public void testGetDivergence() { this.testSetDivergence(); } /** * Test of setDivergence method, of class gov.sandia.cognition.learning.clustering.AffinityPropagation. */ public void testSetDivergence() { AffinityPropagation<Vectorizable> instance = new AffinityPropagation<Vectorizable>(); assertNull( instance.getDivergence() ); DivergenceFunction<Vectorizable,Vectorizable> metric = EuclideanDistanceSquaredMetric.INSTANCE; instance.setDivergence( metric ); assertSame( metric, instance.getDivergence() ); metric = EuclideanDistanceMetric.INSTANCE; instance.setDivergence( metric ); assertSame( metric, instance.getDivergence() ); instance.setDivergence( null ); assertNull( instance.getDivergence() ); } /** * Test of getDampingFactor method, of class gov.sandia.cognition.learning.clustering.AffinityPropagation. */ public void testGetDampingFactor() { this.testSetDampingFactor(); } /** * Test of setDampingFactor method, of class gov.sandia.cognition.learning.clustering.AffinityPropagation. */ public void testSetDampingFactor() { AffinityPropagation<Vectorizable> instance = new AffinityPropagation<Vectorizable>(); assertEquals( AffinityPropagation.DEFAULT_DAMPING_FACTOR, instance.getDampingFactor() ); double dampingFactor = Math.random(); instance.setDampingFactor( dampingFactor ); assertEquals( dampingFactor, instance.getDampingFactor() ); dampingFactor = 0.0; instance.setDampingFactor( dampingFactor ); assertEquals( dampingFactor, instance.getDampingFactor() ); dampingFactor = 1.0; instance.setDampingFactor( dampingFactor ); assertEquals( dampingFactor, instance.getDampingFactor() ); boolean exceptionThrown = false; try { instance.setDampingFactor( -1.0 ); } catch (IllegalArgumentException e) { exceptionThrown = true; } finally { assertTrue( exceptionThrown ); } exceptionThrown = false; try { instance.setDampingFactor( 2.0 ); } catch (IllegalArgumentException e) { exceptionThrown = true; } finally { assertTrue( exceptionThrown ); } } /** * Test of getSelfDivergence method, of class gov.sandia.cognition.learning.clustering.AffinityPropagation. */ public void testGetSelfDivergence() { this.testSetSelfDivergence(); } /** * Test of setSelfDivergence method, of class gov.sandia.cognition.learning.clustering.AffinityPropagation. */ public void testSetSelfDivergence() { AffinityPropagation<Vectorizable> instance = new AffinityPropagation<Vectorizable>(); assertEquals( AffinityPropagation.DEFAULT_SELF_DIVERGENCE, instance.getSelfDivergence() ); double selfDivergence = Math.random(); instance.setSelfDivergence( selfDivergence ); assertEquals( selfDivergence, instance.getSelfDivergence() ); selfDivergence = 0.0; instance.setSelfDivergence( selfDivergence ); assertEquals( selfDivergence, instance.getSelfDivergence() ); selfDivergence = 1.0; instance.setSelfDivergence( selfDivergence ); assertEquals( selfDivergence, instance.getSelfDivergence() ); } /** * Test of getChangedCount method, of class gov.sandia.cognition.learning.clustering.AffinityPropagation. */ public void testGetChangedCount() { AffinityPropagation<Vectorizable> instance = new AffinityPropagation<Vectorizable>(); assertEquals( 0, instance.getChangedCount() ); } }