/*
 * HCL.java
 *
 * Created on January 1, 2002, 1:27 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package medusa.georgios.ClusteringAlgorithms;


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

/**
 *
 * @author Georgios
 */
public class HCL {
    static float[][] matrix;
    static ArrayList labels;
    int INCREMENT;
    int x,y;
    ArrayList Stored_Nodes_Map = new ArrayList();
    Node Tree;
    float Infinite = -9999999;
     
     
    /** Creates a new instance of HCL */
    public HCL(float[][] Matrix,ArrayList labels ) {
        this.matrix=Matrix;
        this.labels=labels;
        
         for (int i = 0; i < Matrix.length; i++) {
            for (int j = i + 1; j < Matrix.length; j++) {
                Infinite = Math.max(Matrix[i][j], Infinite);
            }
        }Infinite++;
        //Infinite=Math.max(Infinite, 9999999);

        for (int i = 0; i < Matrix.length; i++) {
            for (int j = i + 1; j < Matrix.length; j++) {
                if (Matrix[i][j] == 0) 
                    Matrix[i][j]= Infinite;
                 Matrix[j][i]=Matrix[i][j] ;
            }
        }
        
        this.INCREMENT=labels.size();
       //  print_matrix();
        this.run_hierarchical_clustering();
        
    }
    
    
    
  void find_minimum()
{
    int i,j;
    
	float minimum=Infinite;
	for (i = 0; i < INCREMENT; i++)
        for (j = i+1; j < INCREMENT; j++) {
		  if(matrix[i][j]<=minimum)
		  {
                     minimum=matrix[i][j];
                     x=i;
                     y=j;
                  }
    }
        
      //  System.out.println("111111111111111111");
        
        for (i = 0; i <  this.INCREMENT; i++){
            matrix[x][i]=matrix[i][x]=Math.min(matrix[i][x],matrix[i][y]);
            if(matrix[x][i]==0) break;
        }
        for (i = 0; i <  this.INCREMENT; i++){
            matrix[y][i]=matrix[i][y]=Math.min(matrix[i][y],matrix[i][y]);
            if(matrix[y][i]==0) break;
        }
        
         for (j = 0; j <  this.INCREMENT; j++){
            matrix[j][x]=matrix[x][j]=Math.min(matrix[x][j],matrix[y][j]);
            if(matrix[j][x]==0) break;
         }
        for (j = 0; i <  this.INCREMENT; j++){
            matrix[y][j]=matrix[j][y]=Math.min(matrix[x][j],matrix[y][j]);
            if(matrix[y][j]==0) break;
        }
         
      
        
     //  System.out.println("2222222222222222\t"+ x+"\t"+y);
       matrix[x][y]=matrix[y][x]=Infinite;
   
  //  print_matrix();
}
  
   
  void print_matrix()
  {
      for (int i = 0; i < matrix.length; i++) {
          for (int j = 0; j < matrix.length; j++)
             if(i<=j)
             System.out.print(matrix[i][j]+"\t\t");
             else
                 System.out.print("\t\t");
          System.out.println("");
      }
  }
  
  
  
    void run_hierarchical_clustering()
{
        
   Tree = new Node(labels);     
   int i,counter=0, tree_nodes=INCREMENT;
   int roots_found=0; 
   Node node1,node2, source_parent,destination_parent1,destination_parent2;
 

   for(i=0;i 

Ads help maintain this website.