package mil.nga.giat.geowave.analytic.kmeans; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import mil.nga.giat.geowave.analytic.AnalyticItemWrapper; import mil.nga.giat.geowave.analytic.clustering.CentroidPairing; import mil.nga.giat.geowave.analytic.clustering.LongCentroid; import mil.nga.giat.geowave.analytic.distance.DistanceFn; import mil.nga.giat.geowave.analytic.kmeans.AssociationNotification; import mil.nga.giat.geowave.analytic.kmeans.CentroidAssociationFn; import org.junit.Assert; import org.junit.Test; public class CentroidAssociationFnTest { private static Set<CentroidPairing<Long>> expectedPairings = new HashSet<CentroidPairing<Long>>(); private static double expectedCost = 0; static { expectedPairings.add(new CentroidPairing<Long>( new LongCentroid( 10, "", 0), new LongCentroid( 345, "", 0), 335)); expectedPairings.add(new CentroidPairing<Long>( new LongCentroid( 1000, "", 0), new LongCentroid( 764, "", 0), 236)); expectedPairings.add(new CentroidPairing<Long>( new LongCentroid( 10, "", 0), new LongCentroid( 89, "", 0), 79)); expectedPairings.add(new CentroidPairing<Long>( new LongCentroid( 1000, "", 0), new LongCentroid( 900, "", 0), 100)); for (final CentroidPairing<Long> pairing : expectedPairings) { expectedCost += pairing.getDistance(); } } @Test public void test() { final CentroidAssociationFn<Long> fn = new CentroidAssociationFn<Long>(); fn.setDistanceFunction(new DistanceFn<Long>() { /** * */ private static final long serialVersionUID = 1L; @Override public double measure( final Long x, final Long y ) { return Math.abs(x.longValue() - y.longValue()); } }); final List<AnalyticItemWrapper<Long>> dataSet = Arrays.asList( (AnalyticItemWrapper<Long>) new LongCentroid( 345, "", 0), new LongCentroid( 764, "", 0), new LongCentroid( 89, "", 0), new LongCentroid( 900, "", 0)); final List<AnalyticItemWrapper<Long>> centroidSet = Arrays.asList( (AnalyticItemWrapper<Long>) new LongCentroid( 10, "", 0), (AnalyticItemWrapper<Long>) new LongCentroid( 1000, "", 0)); final double cost = fn.compute( dataSet, centroidSet, new AssociationNotification<Long>() { @Override public void notify( final CentroidPairing<Long> pairing ) { Assert.assertTrue(expectedPairings.contains(pairing)); } }); Assert.assertEquals( expectedCost, cost, 0.0001); } }