/*
* File: DBSCANClustererTest.java
* Authors: Quinn McNamara
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright August 16, 2016, 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.DefaultCluster;
import gov.sandia.cognition.learning.algorithm.clustering.cluster.DefaultClusterCreator;
import gov.sandia.cognition.learning.function.distance.EuclideanDistanceMetric;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.mtj.Vector2;
import java.util.ArrayList;
import java.util.Collection;
import junit.framework.TestCase;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertNotNull;
import static junit.framework.TestCase.assertSame;
/**
* This class implements JUnit tests for the following classes:
*
* DBSCANClusterer
*
* @author Quinn McNamara
* @since 1.0
*/
public class DBSCANClustererTest
extends TestCase
{
/**
* The distance metric used in tests.
*/
protected EuclideanDistanceMetric metric = null;
/**
* The cluster creator used in tests.
*/
protected DefaultClusterCreator<Vector> creator = null;
/**
* Creates a new instance of KMeansClustererTest.
*
* @param testName The test name.
*/
public DBSCANClustererTest(
String testName)
{
super(testName);
this.metric = EuclideanDistanceMetric.INSTANCE;
this.creator = new DefaultClusterCreator<Vector>();
}
/**
* Creates a new clusterer to test.
*
* @return A new cluster to test.
*/
public DBSCANClusterer<Vector, DefaultCluster<Vector>> createClusterer()
{
return new DBSCANClusterer<Vector, DefaultCluster<Vector>>(
1.0, 1, this.metric, this.creator);
}
/**
* Tests the creation of a spatial index
*
* If this test fails, contact Quinn McNamara.
*/
public void testSpatialIndex()
{
DBSCANClusterer<Vector, DefaultCluster<Vector>> dbscan
= this.createClusterer();
ArrayList<Vector> elements = new ArrayList<Vector>();
elements.add(new Vector2(1.0, 1.0));
Collection<DefaultCluster<Vector>> clusters = dbscan.learn(elements);
// We are using Euclidean distance and Vectors,
// so the spatial index should be used.
assertNotNull(dbscan.getSpatialIndex());
}
/**
* Tests the creation of a KMeansClusterer.
*
* If this test fails, contact Quinn McNamara.
*/
public void testCreation()
{
DBSCANClusterer<Vector, DefaultCluster<Vector>> dbscan
= this.createClusterer();
assertEquals(0, dbscan.getClusterCount());
assertSame(this.creator, dbscan.getCreator());
}
/**
* Tests the clustering of a KMeansClusterer.
*
* If this test fails, contact Quinn McNamara.
*/
public void testClustering()
{
DBSCANClusterer<Vector, DefaultCluster<Vector>> dbscan
= this.createClusterer();
ArrayList<Vector> elements = new ArrayList<Vector>();
Collection<DefaultCluster<Vector>> clusters = null;
ArrayList<DefaultCluster<Vector>> clustersList = null;
Vector2 v1 = new Vector2(1.0, 1.0);
Vector2 v2 = new Vector2(1.0, 1.2);
Vector2 v3 = new Vector2(-1.0, 4.0);
Vector2 v4 = new Vector2(-1.0, 4.2);
clusters = dbscan.learn(elements);
assertNull(clusters);
// Add a vector to the list of elements.
elements.add(v1);
// Should give a noise cluster and a cluster with the single point.
clusters = dbscan.learn(elements);
assertNotNull(clusters);
assertEquals(2, clusters.size());
// Add some more elements.
elements.add(v2);
elements.add(v3);
elements.add(v4);
// Should give two content clusters and one noise cluster
clusters = dbscan.learn(elements);
assertNotNull(clusters);
assertEquals(3, clusters.size());
DefaultCluster<Vector> cluster1 = dbscan.getCluster(0);
DefaultCluster<Vector> cluster2 = dbscan.getCluster(1);
DefaultCluster<Vector> cluster3 = dbscan.getCluster(1);
// v1 and v2 should be clustered, v3 and v4 should be clustered
assertNotNull(cluster1);
assertNotNull(cluster2);
assertNotNull(cluster3);
assertEquals(0, cluster1.getMembers().size());
assertEquals(2, cluster2.getMembers().size());
assertEquals(2, cluster3.getMembers().size());
}
/**
* Tests for NullPointerExceptions
*
* If this test fails, contact Quinn McNamara
*/
public void testClusteringAvoidNulls()
{
DBSCANClusterer<Vector, DefaultCluster<Vector>> instance
= this.createClusterer();
ArrayList<Vector> data = new ArrayList<Vector>();
Vector2 v1 = new Vector2(1.0, 1.0);
Vector2 v2 = new Vector2(2.0, 2.0);
data.add(v1.clone());
data.add(v1.clone());
data.add(v2.clone());
data.add(v1.clone());
data.add(v2.clone());
data.add(v2.clone());
Collection<DefaultCluster<Vector>> result = instance.learn(data);
}
}