package org.seqcode.ml.clustering.hierarchical; import java.util.HashSet; import java.util.Set; import org.seqcode.ml.clustering.Cluster; /** * @author Timothy Danford * */ public class ClusterNode<X> implements Cluster<X> { private Cluster left, right; private double weight; public ClusterNode(Cluster l, Cluster r) { left = l; right = r; weight = 1.0; } public ClusterNode(double w, Cluster l, Cluster r) { left = l; right = r; weight = w; } public double getWeight() { return weight; } public Cluster getLeft() { return left; } public Cluster getRight() { return right; } public Cluster getLeftmost() { if(left instanceof ClusterNode) { return ((ClusterNode)left).getLeftmost(); } else { return left; } } public Cluster getRightmost() { if(right instanceof ClusterNode) { return ((ClusterNode)right).getRightmost(); } else { return right; } } /* (non-Javadoc) * @see org.seqcode.gse.clustering.Cluster#getElements() */ public Set<X> getElements() { HashSet<X> ce = new HashSet<X>(); ce.addAll(left.getElements()); ce.addAll(right.getElements()); return ce; } public int hashCode() { int code = 17; code += left.hashCode(); code *= 37; code += right.hashCode(); code *= 37; return code; } public boolean equals(Object o) { if(!(o instanceof ClusterNode)) { return false; } ClusterNode cn = (ClusterNode)o; if(!left.equals(cn.left)) { return false; } if(!right.equals(cn.right)) { return false; } return true; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("["); sb.append(left.toString()); sb.append(","); sb.append(right.toString()); sb.append("]"); return sb.toString(); } public int size() { return left.size() + right.size(); } public int depth() { int ld = 1; if(left instanceof ClusterNode) { ld = ((ClusterNode)left).depth(); } int rd = 1; if(right instanceof ClusterNode) { rd = ((ClusterNode)right).depth(); } return Math.max(ld, rd) + 1; } }