package mil.nga.giat.geowave.analytic.kmeans; import mil.nga.giat.geowave.analytic.AnalyticItemWrapper; import mil.nga.giat.geowave.analytic.clustering.CentroidPairing; import mil.nga.giat.geowave.analytic.distance.DistanceFn; /** * Compute the distance of a points to the closest centroid, providing the * resulting distance using a provided distance function. * */ public class CentroidAssociationFn<T> { private DistanceFn<T> distanceFunction; public DistanceFn<T> getDistanceFunction() { return distanceFunction; } public void setDistanceFunction( final DistanceFn<T> distanceFunction ) { this.distanceFunction = distanceFunction; } public double compute( final AnalyticItemWrapper<T> point, final Iterable<AnalyticItemWrapper<T>> targetSet, final AssociationNotification<T> associationNotification ) { final CentroidPairing<T> pairing = new CentroidPairing<T>( null, point, Double.POSITIVE_INFINITY); for (final AnalyticItemWrapper<T> y : targetSet) { final double distance = distanceFunction.measure( point.getWrappedItem(), y.getWrappedItem()); if (distance < pairing.getDistance()) { pairing.setDistance(distance); pairing.setCentroid(y); } } associationNotification.notify(pairing); return pairing.getDistance(); } public double compute( final Iterable<AnalyticItemWrapper<T>> pointSet, final Iterable<AnalyticItemWrapper<T>> targetSet, final AssociationNotification<T> associationNotification ) { double sum = 0.0; for (final AnalyticItemWrapper<T> point : pointSet) { sum += this.compute( point, targetSet, associationNotification); } return sum; } }