All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.venky.clustering.Cluster Maven / Gradle / Ivy

package com.venky.clustering;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

import com.venky.core.string.StringUtil;

public class Cluster {
	private Clusterer clusterer;
	private int id ;
    private static AtomicInteger fakeId = new AtomicInteger();

	public Cluster(Clusterer clusterer){
		this.clusterer = clusterer;
		this.id = fakeId.addAndGet(1);
	}
	
	public int hashCode(){
		return id;
	}
	public String toString(){
		return StringUtil.valueOf(id);
	}
	
	public boolean equals(Cluster cluster){
		return id == cluster.id;
	}
	
	private T centroid = null; 
	public T centroid(){
		if (centroid == null && clusterer.getCenterFinder() != null){
			centroid = clusterer.getCenterFinder().center(points);
		}
		return centroid;
	}
	
	
	private List points = new ArrayList();
	public void addPoint(T t){
		points.add(t);
		if (centroid != null){
			centroid = clusterer.getCenterFinder().center(centroid, points.size(), t);
		}
	}
	public double centroidDistance(T point){
		T centroid = centroid();
		if (centroid != null) { 
			return clusterer.getMetric().distance(centroid, point);
		}
		return Double.POSITIVE_INFINITY;
	}
	public double centroidDistance(Cluster cluster){
		T centroid = centroid();
		if (centroid != null) { 
			return clusterer.getMetric().distance(centroid, cluster.centroid());
		}
		return Double.POSITIVE_INFINITY;
	}
	public Distance distance(T point){
		Distance distance = new Distance();
		distance.distanceFromCentroid = centroidDistance(point);
		
		distance.minDistance = Double.POSITIVE_INFINITY; 
		distance.maxDistance = Double.NEGATIVE_INFINITY;
		for (T p: points){
			double d = clusterer.getMetric().distance(p, point);
			if (d < distance.minDistance){
				distance.minDistance = d;
			}
			if (d > distance.maxDistance){
				distance.maxDistance = d;
			}
		}
		return distance;
	}
	public List getPoints(){
		return points;
	}
	public Distance distance(Cluster cluster){
		Distance distance = new Distance();
		distance.distanceFromCentroid = centroidDistance(cluster);
		distance.minDistance = Double.POSITIVE_INFINITY; 
		distance.maxDistance = Double.NEGATIVE_INFINITY;
		
		for (T aPointInThisCluster: points){
			for (T aPointInOtherCluster: cluster.getPoints()){
				double d = clusterer.getMetric().distance(aPointInThisCluster, aPointInOtherCluster);
				if (d < distance.minDistance){
					distance.minDistance = d;
				}
				if (d > distance.maxDistance){
					distance.maxDistance = d;
				}
			}
		}
		
		return distance;
	}
	
	public static class Distance {
		private double distanceFromCentroid; 
		private double minDistance; 
		private double maxDistance;
		
		public double getDistanceFromCentroid() {
			return this.distanceFromCentroid;
		}
		public double getMinDistance() {
			return this.minDistance;
		}
		public double getMaxDistance() {
			return this.maxDistance;
		}
		
	}
	
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy