/*
* File: ClusterDistortionMeasureTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Oct 20, 2008, 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.cost;
import gov.sandia.cognition.learning.algorithm.clustering.cluster.CentroidCluster;
import gov.sandia.cognition.learning.algorithm.clustering.divergence.CentroidClusterDivergenceFunction;
import gov.sandia.cognition.learning.algorithm.clustering.divergence.ClusterDivergenceFunction;
import gov.sandia.cognition.learning.function.distance.EuclideanDistanceMetric;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.VectorFactory;
import java.util.LinkedList;
import java.util.Random;
import junit.framework.TestCase;
/**
* JUnit tests for class ClusterDistortionMeasureTest
* @author Kevin R. Dixon
*/
public class ClusterDistortionMeasureTest
extends TestCase
{
private static Random random = new Random( 1 );
/**
* Entry point for JUnit tests for class ClusterDistortionMeasureTest
* @param testName name of this test
*/
public ClusterDistortionMeasureTest(
String testName)
{
super(testName);
}
public ClusterDistortionMeasure<Vector,CentroidCluster<Vector>> createInstance()
{
return new ClusterDistortionMeasure<Vector,CentroidCluster<Vector>>(
new CentroidClusterDivergenceFunction<Vector>( new EuclideanDistanceMetric() ) );
}
public CentroidCluster<Vector> createRandomCluster()
{
int N = 3;
double r = 2.0;
Vector centroid = VectorFactory.getDefault().createUniformRandom( N, -r, r, random);
int num = random.nextInt( 100 );
LinkedList<Vector> members = new LinkedList<Vector>();
for( int i = 0; i < num; i++ )
{
members.add( VectorFactory.getDefault().createUniformRandom( N, -r, r, random) );
}
return new CentroidCluster<Vector>( centroid, members );
}
public void testConstructors()
{
System.out.println( "Constructors" );
ClusterDistortionMeasure<?,?> instance = this.createInstance();
assertNotNull( instance );
assertNotNull( instance.getCostParameters() );
instance = new ClusterDistortionMeasure<Vector,CentroidCluster<Vector>>();
assertNull( instance.getCostParameters() );
}
/**
* Test of clone method, of class ClusterDistortionMeasure.
*/
public void testClone()
{
System.out.println( "clone" );
ClusterDistortionMeasure<?,?> instance = this.createInstance();
ClusterDistortionMeasure<?,?> clone = instance.clone();
assertNotSame( instance, clone );
assertSame( instance.getCostParameters(), clone.getCostParameters() );
}
/**
* Test of evaluate method, of class ClusterDistortionMeasure.
*/
@SuppressWarnings("unchecked")
public void testEvaluate_Collection()
{
System.out.println( "evaluate" );
ClusterDistortionMeasure<Vector,CentroidCluster<Vector>> instance = this.createInstance();
LinkedList<CentroidCluster<Vector>> clusters = new LinkedList<CentroidCluster<Vector>>();
int num = random.nextInt( 10 );
double expected = 0.0;
for( int i = 0; i < num; i++ )
{
CentroidCluster<Vector> cluster = this.createRandomCluster();
expected += instance.evaluate( cluster );
clusters.add( cluster );
}
assertEquals( expected, instance.evaluate( clusters ) );
}
/**
* Test of evaluate method, of class ClusterDistortionMeasure.
*/
public void testEvaluate_Cluster()
{
System.out.println( "evaluate" );
Vector centroid = VectorFactory.getDefault().copyValues( 1.0 );
LinkedList<Vector> members = new LinkedList<Vector>();
members.add( VectorFactory.getDefault().copyValues( 0.0 ) );
members.add( VectorFactory.getDefault().copyValues( 2.0 ) );
members.add( VectorFactory.getDefault().copyValues( -1.0 ) );
CentroidCluster<Vector> cluster = new CentroidCluster<Vector>( centroid, members );
ClusterDistortionMeasure<Vector, CentroidCluster<Vector>> instance = this.createInstance();
@SuppressWarnings("unchecked")
Double y = instance.evaluate( cluster );
double expected = 1.0 + 1.0 + 2.0;
assertEquals( expected, y );
}
/**
* Test of getCostParameters method, of class ClusterDistortionMeasure.
*/
public void testGetCostParameters()
{
System.out.println( "getCostParameters" );
ClusterDistortionMeasure<?,?> instance = this.createInstance();
assertNotNull( instance.getCostParameters() );
}
/**
* Test of setCostParameters method, of class ClusterDistortionMeasure.
*/
@SuppressWarnings("unchecked")
public void testSetCostParameters()
{
System.out.println( "setCostParameters" );
ClusterDistortionMeasure<Vector,CentroidCluster<Vector>> instance = this.createInstance();
ClusterDivergenceFunction<? super CentroidCluster<Vector>, ? super Vector> div = instance.getCostParameters();
assertNotNull( div );
instance.setCostParameters( null );
assertNull( instance.getCostParameters() );
instance.setCostParameters( div );
assertSame( div, instance.getCostParameters() );
}
}