/* * File: GreedyClusterInitializerTest.java * Authors: Justin Basilico * Company: Sandia National Laboratories * Project: Cognitive Framework Lite * * Copyright March 16, 2006, 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.initializer; import gov.sandia.cognition.learning.algorithm.clustering.cluster.CentroidCluster; import gov.sandia.cognition.learning.function.distance.EuclideanDistanceMetric; import gov.sandia.cognition.learning.algorithm.clustering.cluster.VectorMeanCentroidClusterCreator; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.mtj.Vector2; import java.util.ArrayList; import java.util.Random; import junit.framework.*; /** * This class implements JUnit tests for the following classes: * * GreedyClusterInitializer * * @author Justin Basilico * @since 1.0 */ public class GreedyClusterInitializerTest extends TestCase { /** * Creates a new instance of GreedyClusterInitializerTest. * * @param testName The test name. */ public GreedyClusterInitializerTest( String testName) { super(testName); } /** * Tests the GreedyClusterInitializer class. * * If this test fails, contact Justin Basilico. */ public void testGreedyClusterInitializer() { // Create the initializer. EuclideanDistanceMetric metric = EuclideanDistanceMetric.INSTANCE; VectorMeanCentroidClusterCreator creator = VectorMeanCentroidClusterCreator.INSTANCE; Random random = new Random(); GreedyClusterInitializer<CentroidCluster<Vector>, Vector> init = new GreedyClusterInitializer<CentroidCluster<Vector>, Vector>( metric, creator, random); ArrayList<CentroidCluster<Vector>> clusters = null; ArrayList<Vector> elements = new ArrayList<Vector>(); // We will be looking at two clusters. CentroidCluster<Vector> cluster1 = null; CentroidCluster<Vector> cluster2 = null; // These are the three datapoints we will use. Vector2 v1 = new Vector2(-1.0, 1.0); Vector2 v2 = new Vector2( 1.0, -1.0); Vector2 v3 = new Vector2( 5.0, 5.0); // Make sure that the constructor worked properly. assertSame(metric, init.getDivergenceFunction()); assertSame(creator, init.getCreator()); assertSame(random, init.getRandom()); // Try calling it with no clusters to initialize. clusters = init.initializeClusters(0, elements); assertNotNull(clusters); assertEquals(0, clusters.size()); // Request a cluster but provide no elements. clusters = init.initializeClusters(1, elements); assertNotNull(clusters); assertEquals(0, clusters.size()); // Add a vector to the list of elements. elements.add(v1); // Try giving no clusters to create with a non-empty list of elements. clusters = init.initializeClusters(0, elements); assertNotNull(clusters); assertEquals(0, clusters.size()); // Try creating one cluster from one element. clusters = init.initializeClusters(1, elements); assertNotNull(clusters); assertEquals(1, clusters.size()); // The centroid should be equal to the given element. cluster1 = clusters.get(0); assertNotNull(cluster1); assertNotNull(cluster1.getCentroid()); assertEquals(cluster1.getCentroid(), v1); assertNotNull(cluster1.getMembers()); assertEquals(1, cluster1.getMembers().size()); assertTrue(cluster1.getMembers().contains(v1)); // Try creating two clusters from one element. Only one should be // returned. clusters = init.initializeClusters(2, elements); assertNotNull(clusters); assertEquals(1, clusters.size()); // Add a second element to the list. elements.add(v2); // Create 1 cluster. clusters = init.initializeClusters(1, elements); assertNotNull(clusters); assertEquals(1, clusters.size()); // Get the first cluster. cluster1 = clusters.get(0); // Make sure that the centroid is one of the two elements. assertNotNull(cluster1); assertNotNull(cluster1.getCentroid()); assertTrue(cluster1.getCentroid().equals(v1) || cluster1.getCentroid().equals(v2)); assertEquals(1, cluster1.getMembers().size()); // Create two clusters. clusters = init.initializeClusters(2, elements); assertNotNull(clusters); assertEquals(2, clusters.size()); cluster1 = clusters.get(0); cluster2 = clusters.get(1); // Make sure that the two clusters have different centroids. assertNotNull(cluster1); assertNotNull(cluster2); assertNotNull(cluster1.getCentroid()); assertNotNull(cluster2.getCentroid()); assertFalse(cluster1.getCentroid().equals(cluster2.getCentroid())); assertEquals(1, cluster1.getMembers().size()); assertEquals(1, cluster2.getMembers().size()); // Add a third element. elements.add(v3); // Create two clusters from three elements. clusters = init.initializeClusters(2, elements); assertNotNull(clusters); assertEquals(2, clusters.size()); // Test to make sure exceptions are thrown properly. boolean exceptionThrown = false; try { clusters = init.initializeClusters(-1, elements); } catch ( IllegalArgumentException iae ) { exceptionThrown = true; } finally { assertTrue(exceptionThrown); } } }