mev-4.0.01/source/org/tigr/microarray/mev/cluster/algorithm/impl/tease/HCL.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2004, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * $RCSfile: HCL.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.1 $
2 26 Feb 07 jari 8  * $Date: 2006/02/08 18:17:16 $
2 26 Feb 07 jari 9  * $Author: caliente $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 package org.tigr.microarray.mev.cluster.algorithm.impl.tease;
2 26 Feb 07 jari 14
2 26 Feb 07 jari 15 import org.tigr.microarray.mev.cluster.algorithm.AbortException;
2 26 Feb 07 jari 16 import org.tigr.microarray.mev.cluster.algorithm.AbstractAlgorithm;
2 26 Feb 07 jari 17 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 18 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 19 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 20 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 21 import org.tigr.microarray.mev.cluster.algorithm.impl.ExperimentUtil;
2 26 Feb 07 jari 22 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 23
2 26 Feb 07 jari 24 public class HCL extends AbstractAlgorithm {
2 26 Feb 07 jari 25     
2 26 Feb 07 jari 26     private boolean stop = false;
2 26 Feb 07 jari 27     
2 26 Feb 07 jari 28     private int parentless;
2 26 Feb 07 jari 29     private double TreeHeight;
2 26 Feb 07 jari 30     private int Assigned;
2 26 Feb 07 jari 31     
2 26 Feb 07 jari 32     public HCL() {}
2 26 Feb 07 jari 33     
2 26 Feb 07 jari 34     public void abort() {
2 26 Feb 07 jari 35       stop = true;
2 26 Feb 07 jari 36     }
2 26 Feb 07 jari 37     
2 26 Feb 07 jari 38     public AlgorithmData execute(AlgorithmData data) throws AlgorithmException {
2 26 Feb 07 jari 39   
2 26 Feb 07 jari 40     FloatMatrix expMatrix = data.getMatrix("experiment");
2 26 Feb 07 jari 41     //FloatMatrix matrix = data.getMatrix("expression");
2 26 Feb 07 jari 42
2 26 Feb 07 jari 43     if (expMatrix == null) {
2 26 Feb 07 jari 44         throw new AlgorithmException("Input data is absent.");
2 26 Feb 07 jari 45     }
2 26 Feb 07 jari 46 //    System.out.println("");
2 26 Feb 07 jari 47 //    String[] names = data.getClusterNames();            //************************************
2 26 Feb 07 jari 48 //    for (int x = 0; x < names.length; x++)
2 26 Feb 07 jari 49 //      System.out.println(names[x]);
2 26 Feb 07 jari 50 //    
2 26 Feb 07 jari 51 //    System.out.println("HCL 50");
2 26 Feb 07 jari 52 //    for (int x = 0; x < expMatrix.getRowDimension(); x ++) {  //************************************
2 26 Feb 07 jari 53 //      for(int y = 0; y < expMatrix.getColumnDimension(); y ++)
2 26 Feb 07 jari 54 //        System.out.print(expMatrix.get(x,y)+" ");
2 26 Feb 07 jari 55 //      System.out.println();
2 26 Feb 07 jari 56 //    }
2 26 Feb 07 jari 57 //    
2 26 Feb 07 jari 58     AlgorithmParameters map = data.getParams();
2 26 Feb 07 jari 59     
2 26 Feb 07 jari 60     int function = map.getInt("hcl-distance-function", EUCLIDEAN);
2 26 Feb 07 jari 61     float factor; // = map.getFloat("distance-factor", 1.0f);
2 26 Feb 07 jari 62     boolean absolute = map.getBoolean("hcl-distance-absolute", false);
2 26 Feb 07 jari 63     boolean genes = map.getBoolean("calculate-genes", true);
2 26 Feb 07 jari 64     int method = map.getInt("method-linkage", 0);
2 26 Feb 07 jari 65     
2 26 Feb 07 jari 66 //    System.out.println("HCL 65");
2 26 Feb 07 jari 67 //    System.out.println("function = "+ function);
2 26 Feb 07 jari 68 //    System.out.println("absolute = "+ absolute);
2 26 Feb 07 jari 69 //    System.out.println("genes = "+ genes);
2 26 Feb 07 jari 70 //    System.out.println("method = "+ method);
2 26 Feb 07 jari 71     
2 26 Feb 07 jari 72     //============= Init ====================
2 26 Feb 07 jari 73     
2 26 Feb 07 jari 74     int n;
2 26 Feb 07 jari 75     if (genes) {
2 26 Feb 07 jari 76         n = expMatrix.getRowDimension();
2 26 Feb 07 jari 77     } else {
2 26 Feb 07 jari 78         n = expMatrix.getColumnDimension();
2 26 Feb 07 jari 79     }
2 26 Feb 07 jari 80     
2 26 Feb 07 jari 81     int two_n = 2*n;
2 26 Feb 07 jari 82     Assigned = n;
2 26 Feb 07 jari 83     parentless = n;
2 26 Feb 07 jari 84     
2 26 Feb 07 jari 85     TreeHeight = 0;
2 26 Feb 07 jari 86     double MaxCorrelation = 0;
2 26 Feb 07 jari 87     
2 26 Feb 07 jari 88     float[] Height = new float[two_n];
2 26 Feb 07 jari 89     
2 26 Feb 07 jari 90     int[] Parent = new int[two_n];
2 26 Feb 07 jari 91     int[] Child1 = new int[two_n];
2 26 Feb 07 jari 92     int[] Child2 = new int[two_n];
2 26 Feb 07 jari 93     int[] NodeHeight = new int[two_n];
2 26 Feb 07 jari 94     int[] NodeOrder  = new int[n];
2 26 Feb 07 jari 95     int[] NumberOfChildren = new int[two_n];
2 26 Feb 07 jari 96     
2 26 Feb 07 jari 97     for (int i=0; i<two_n; ++i) {
2 26 Feb 07 jari 98         Height[i] = 0.0f;
2 26 Feb 07 jari 99         Parent[i] = -1;
2 26 Feb 07 jari 100         Child1[i] = -1;
2 26 Feb 07 jari 101         Child2[i] = -1;
2 26 Feb 07 jari 102         NodeHeight[i] = 0;
2 26 Feb 07 jari 103     }
2 26 Feb 07 jari 104     
2 26 Feb 07 jari 105     for (int i=0; i<n; ++i) {
2 26 Feb 07 jari 106         NodeOrder[i]=-1;
2 26 Feb 07 jari 107         NumberOfChildren[i]=1;
2 26 Feb 07 jari 108     }
2 26 Feb 07 jari 109     
2 26 Feb 07 jari 110     //======== Init =========
2 26 Feb 07 jari 111     float[][] SimilarityMatrix = new float[n][];
2 26 Feb 07 jari 112     float[] Min = new float[n];
2 26 Feb 07 jari 113     int[] MinIndex = new int[n];
2 26 Feb 07 jari 114     final int UNITS = 200;
2 26 Feb 07 jari 115     
2 26 Feb 07 jari 116     AlgorithmEvent event = null;
2 26 Feb 07 jari 117     event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, UNITS, "Creating similarity matrix");
2 26 Feb 07 jari 118     // set progress limit
2 26 Feb 07 jari 119     fireValueChanged(event);
2 26 Feb 07 jari 120     event.setId(AlgorithmEvent.PROGRESS_VALUE);
2 26 Feb 07 jari 121     event.setIntValue(0);
2 26 Feb 07 jari 122     // set zero position
2 26 Feb 07 jari 123     fireValueChanged(event);
2 26 Feb 07 jari 124     int i;
2 26 Feb 07 jari 125     int CurrentProgress = 0;
2 26 Feb 07 jari 126     int OldCurrentProgress = 0;
2 26 Feb 07 jari 127     double Factor=UNITS/(double)n;
2 26 Feb 07 jari 128     
2 26 Feb 07 jari 129     factor = (float)1.0;  //factor is used as an optional scaling factor
2 26 Feb 07 jari 130     
2 26 Feb 07 jari 131     for (i=1; i<n; ++i) {
2 26 Feb 07 jari 132         CurrentProgress=(int)(i*Factor);
2 26 Feb 07 jari 133         
2 26 Feb 07 jari 134         if (CurrentProgress>OldCurrentProgress) {
2 26 Feb 07 jari 135         event.setIntValue(CurrentProgress);
2 26 Feb 07 jari 136         fireValueChanged(event);
2 26 Feb 07 jari 137         OldCurrentProgress=CurrentProgress;
2 26 Feb 07 jari 138         }
2 26 Feb 07 jari 139         SimilarityMatrix[i] = new float[i];
2 26 Feb 07 jari 140         Min[i] = Float.POSITIVE_INFINITY;
2 26 Feb 07 jari 141         
2 26 Feb 07 jari 142         for (int j=0; j<i; ++j) {
2 26 Feb 07 jari 143         if (stop) {
2 26 Feb 07 jari 144             throw new AbortException();
2 26 Feb 07 jari 145         }
2 26 Feb 07 jari 146         if (genes) {
2 26 Feb 07 jari 147             SimilarityMatrix[i][j] = ExperimentUtil.geneDistance(expMatrix, null, i, j, 
2 26 Feb 07 jari 148                 function, factor, absolute);//ExpMatrix.GeneDistance(i,j,null);
2 26 Feb 07 jari 149         } else {
2 26 Feb 07 jari 150             SimilarityMatrix[i][j] = ExperimentUtil.distance(expMatrix, i, j, 
2 26 Feb 07 jari 151                 function, factor, absolute); //ExpMatrix.ExperimentDistance(i,j);
2 26 Feb 07 jari 152         }
2 26 Feb 07 jari 153         
2 26 Feb 07 jari 154         if (SimilarityMatrix[i][j] < Min[i]) {
2 26 Feb 07 jari 155             Min[i] = SimilarityMatrix[i][j];
2 26 Feb 07 jari 156             MinIndex[i] = j;
2 26 Feb 07 jari 157         }
2 26 Feb 07 jari 158         }
2 26 Feb 07 jari 159     }
2 26 Feb 07 jari 160   //  for (int k = 0; k < n; k++) {
2 26 Feb 07 jari 161   //    System.out.print(Min[k]+"  ");
2 26 Feb 07 jari 162   //  }
2 26 Feb 07 jari 163   //  System.out.println();
2 26 Feb 07 jari 164   //  System.out.println();  
2 26 Feb 07 jari 165   //  for (int k = 0; k < n; k++) {
2 26 Feb 07 jari 166   //    System.out.print(MinIndex[k]+"  ");
2 26 Feb 07 jari 167   //  }
2 26 Feb 07 jari 168     
2 26 Feb 07 jari 169   //    for (int z=0; z<SimilarityMatrix.length; z++) {
2 26 Feb 07 jari 170   //    if (SimilarityMatrix[z] == null) {
2 26 Feb 07 jari 171   //        System.out.println("["+z+"]=null");
2 26 Feb 07 jari 172   //    } else {
2 26 Feb 07 jari 173   //        System.out.print("["+z+"]="+SimilarityMatrix[z]+" --> ");
2 26 Feb 07 jari 174   //        for (int y=0; y<SimilarityMatrix[z].length; y++) {
2 26 Feb 07 jari 175   //           System.out.print(" "+SimilarityMatrix[z][y]);
2 26 Feb 07 jari 176   //        }
2 26 Feb 07 jari 177   //        System.out.println("");
2 26 Feb 07 jari 178   //    }
2 26 Feb 07 jari 179   //    }
2 26 Feb 07 jari 180   
2 26 Feb 07 jari 181     
2 26 Feb 07 jari 182     //========================================
2 26 Feb 07 jari 183     
2 26 Feb 07 jari 184     if (stop) {
2 26 Feb 07 jari 185         throw new AbortException();
2 26 Feb 07 jari 186     }
2 26 Feb 07 jari 187     
2 26 Feb 07 jari 188     event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, UNITS, "Calculating tree");
2 26 Feb 07 jari 189     // set progress limit
2 26 Feb 07 jari 190     fireValueChanged(event);
2 26 Feb 07 jari 191     event.setId(AlgorithmEvent.PROGRESS_VALUE);
2 26 Feb 07 jari 192     event.setIntValue(0);
2 26 Feb 07 jari 193     // set zero position
2 26 Feb 07 jari 194     fireValueChanged(event);
2 26 Feb 07 jari 195     
2 26 Feb 07 jari 196     long CalculatedNodes=0;
2 26 Feb 07 jari 197     CurrentProgress=0;
2 26 Feb 07 jari 198     OldCurrentProgress=0;
2 26 Feb 07 jari 199     Factor=UNITS/(double)n;
2 26 Feb 07 jari 200     int j,k,p;
2 26 Feb 07 jari 201     int NodeCounter = 0;
2 26 Feb 07 jari 202     double MaxDistance=0;
2 26 Feb 07 jari 203     double MinDistance=Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 204     MaxCorrelation=Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 205     double MinCorrelation=Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 206     int owner[] = new int[n];
2 26 Feb 07 jari 207     
2 26 Feb 07 jari 208     for (i=0; i<n; i++)
2 26 Feb 07 jari 209         owner[i] = i;
2 26 Feb 07 jari 210     
2 26 Feb 07 jari 211     while (parentless > 1) {  //parentless initialized to be the number of genes
2 26 Feb 07 jari 212         if (stop) {
2 26 Feb 07 jari 213           throw new AbortException();
2 26 Feb 07 jari 214         }
2 26 Feb 07 jari 215         CurrentProgress=(int)(CalculatedNodes*Factor);
2 26 Feb 07 jari 216         
2 26 Feb 07 jari 217         if (CurrentProgress>OldCurrentProgress) {
2 26 Feb 07 jari 218         event.setIntValue(CurrentProgress);
2 26 Feb 07 jari 219         fireValueChanged(event);
2 26 Feb 07 jari 220         OldCurrentProgress=CurrentProgress;
2 26 Feb 07 jari 221         }
2 26 Feb 07 jari 222         CalculatedNodes++;
2 26 Feb 07 jari 223         
2 26 Feb 07 jari 224         double close_d = Double.POSITIVE_INFINITY;        // first find the closest pair
2 26 Feb 07 jari 225         double test_d = Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 226         int test_i = -2;
2 26 Feb 07 jari 227         int test_j = -2;
2 26 Feb 07 jari 228
2 26 Feb 07 jari 229         for (i=1; i<n; ++i) {
2 26 Feb 07 jari 230         if (owner[i] != -1) {
2 26 Feb 07 jari 231             if (Min[i] < test_d) {
2 26 Feb 07 jari 232           test_d = Min[i];
2 26 Feb 07 jari 233           test_i = i;
2 26 Feb 07 jari 234           test_j = MinIndex[i];
2 26 Feb 07 jari 235             }
2 26 Feb 07 jari 236         }
2 26 Feb 07 jari 237         }
2 26 Feb 07 jari 238         
2 26 Feb 07 jari 239         i = test_i;
2 26 Feb 07 jari 240         j = test_j;
2 26 Feb 07 jari 241         close_d = test_d;  
2 26 Feb 07 jari 242         double height_k = close_d; 
2 26 Feb 07 jari 243         
2 26 Feb 07 jari 244               //was close_d/2.0 ????????
2 26 Feb 07 jari 245         if ((Math.abs(close_d) > 0) && (Math.abs(close_d) < MinDistance))
2 26 Feb 07 jari 246           MinDistance=Math.abs(close_d);
2 26 Feb 07 jari 247         if ((close_d!=1) && (close_d < MaxCorrelation))
2 26 Feb 07 jari 248           MaxCorrelation=close_d;
2 26 Feb 07 jari 249         if ((close_d > MaxCorrelation) && (close_d < MinCorrelation))
2 26 Feb 07 jari 250           MinCorrelation=close_d;
2 26 Feb 07 jari 251         if (close_d > MaxDistance)
2 26 Feb 07 jari 252           MaxDistance=close_d;
2 26 Feb 07 jari 253         
2 26 Feb 07 jari 254         try {
2 26 Feb 07 jari 255         //System.out.println(" owner["+i+"]="+owner[i]);
2 26 Feb 07 jari 256         if (owner[i]>=n && Height[owner[i]]>height_k) {        // Gene1 already assignd to a node, was >= ?!
2 26 Feb 07 jari 257             k = owner[i];
2 26 Feb 07 jari 258             AssertParentage(Parent, NumberOfChildren, Child1, Child2, owner[j], k);
2 26 Feb 07 jari 259         } else if (owner[j]>=n && Height[owner[j]]>height_k) { // Gene2 already assignd to node was >= ?!
2 26 Feb 07 jari 260             k = owner[j];
2 26 Feb 07 jari 261             AssertParentage(Parent, NumberOfChildren, Child1, Child2, owner[i], k);
2 26 Feb 07 jari 262         } else {
2 26 Feb 07 jari 263             k = NewNode(Height, height_k);
2 26 Feb 07 jari 264             AssertParentage(Parent, NumberOfChildren,Child1, Child2,owner[i], k);
2 26 Feb 07 jari 265             AssertParentage(Parent, NumberOfChildren,Child1, Child2,owner[j], k);
2 26 Feb 07 jari 266         }
2 26 Feb 07 jari 267         NodeOrder[NodeCounter]=k;
2 26 Feb 07 jari 268         NodeHeight[k]=Math.max(NodeHeight[Child1[k]]+1,NodeHeight[Child2[k]]+1);
2 26 Feb 07 jari 269         
2 26 Feb 07 jari 270         } catch (Exception e) {
2 26 Feb 07 jari 271         e.printStackTrace();
2 26 Feb 07 jari 272         fireValueChanged(new AlgorithmEvent(this, AlgorithmEvent.WARNING, 0, "Error: "+e.toString()+" - Height("+String.valueOf(height_k)+","+")"));
2 26 Feb 07 jari 273         k=0;
2 26 Feb 07 jari 274         }
2 26 Feb 07 jari 275   
2 26 Feb 07 jari 276         NodeCounter++;
2 26 Feb 07 jari 277         owner[i] = k;
2 26 Feb 07 jari 278         owner[j] = -1;
2 26 Feb 07 jari 279         
2 26 Feb 07 jari 280         if (method == -1) {       // minimum method
2 26 Feb 07 jari 281         for (p=0; p<j; ++p)
2 26 Feb 07 jari 282             if (owner[p] != -1) SimilarityMatrix[i][p] = (float)Math.min(SimilarityMatrix[i][p],SimilarityMatrix[j][p]);
2 26 Feb 07 jari 283         for (p=j+1; p<i; ++p)
2 26 Feb 07 jari 284             if (owner[p] != -1) SimilarityMatrix[i][p] = (float)Math.min(SimilarityMatrix[i][p],SimilarityMatrix[p][j]);
2 26 Feb 07 jari 285         for (p=i+1; p<n; ++p)
2 26 Feb 07 jari 286             if (owner[p] != -1) SimilarityMatrix[p][i] = (float)Math.min(SimilarityMatrix[p][i],SimilarityMatrix[p][j]);
2 26 Feb 07 jari 287         } else if (method == +1) {   // maximum method
2 26 Feb 07 jari 288         for (p=0; p<j; ++p)
2 26 Feb 07 jari 289             if (owner[p] != -1) SimilarityMatrix[i][p] = (float)Math.max(SimilarityMatrix[i][p],SimilarityMatrix[j][p]);
2 26 Feb 07 jari 290         for (p=j+1; p<i; ++p)
2 26 Feb 07 jari 291             if (owner[p] != -1) SimilarityMatrix[i][p] = (float)Math.max(SimilarityMatrix[i][p],SimilarityMatrix[p][j]);
2 26 Feb 07 jari 292         for (p=i+1; p<n; ++p)
2 26 Feb 07 jari 293             if (owner[p] != -1) SimilarityMatrix[p][i] = (float)Math.max(SimilarityMatrix[p][i],SimilarityMatrix[p][j]);
2 26 Feb 07 jari 294         } else if (method == 2) {             // average method
2 26 Feb 07 jari 295       //                int schrott=NumberOfChildren[owner[j]]+NumberOfChildren[owner[i]];
2 26 Feb 07 jari 296       //            System.out.println(NumberOfChildren[owner[i]]);
2 26 Feb 07 jari 297         for (p=0; p<j; ++p)
2 26 Feb 07 jari 298             if (owner[p] != -1) SimilarityMatrix[i][p] = (float)((SimilarityMatrix[i][p]*NumberOfChildren[owner[i]] +
2 26 Feb 07 jari 299             SimilarityMatrix[j][p]*NumberOfChildren[owner[j]])/
2 26 Feb 07 jari 300             (2.0*Math.min(NumberOfChildren[owner[i]],NumberOfChildren[owner[j]])));
2 26 Feb 07 jari 301         for (p=j+1; p<i; ++p)
2 26 Feb 07 jari 302             if (owner[p] != -1) SimilarityMatrix[i][p] = (float)((SimilarityMatrix[i][p]*NumberOfChildren[owner[i]] +
2 26 Feb 07 jari 303             SimilarityMatrix[p][j]*NumberOfChildren[owner[j]])/
2 26 Feb 07 jari 304             (2.0*Math.min(NumberOfChildren[owner[i]],NumberOfChildren[owner[j]])));
2 26 Feb 07 jari 305         for (p=i+1; p<n; ++p)
2 26 Feb 07 jari 306             if (owner[p] != -1) SimilarityMatrix[p][i] = (float)((SimilarityMatrix[p][i]*NumberOfChildren[owner[i]] +
2 26 Feb 07 jari 307             SimilarityMatrix[p][j]*NumberOfChildren[owner[j]])/
2 26 Feb 07 jari 308             (2.0*Math.min(NumberOfChildren[owner[i]],NumberOfChildren[owner[j]])));
2 26 Feb 07 jari 309         } else if (method == 0) {             // average method
2 26 Feb 07 jari 310         for (p=0; p<j; ++p)
2 26 Feb 07 jari 311             if (owner[p] != -1) SimilarityMatrix[i][p] = (float)((SimilarityMatrix[i][p] + SimilarityMatrix[j][p])/2.0);
2 26 Feb 07 jari 312         for (p=j+1; p<i; ++p)
2 26 Feb 07 jari 313             if (owner[p] != -1) SimilarityMatrix[i][p] = (float)((SimilarityMatrix[i][p] + SimilarityMatrix[p][j])/2.0);
2 26 Feb 07 jari 314         for (p=i+1; p<n; ++p)
2 26 Feb 07 jari 315             if (owner[p] != -1) SimilarityMatrix[p][i] = (float)((SimilarityMatrix[p][i] + SimilarityMatrix[p][j])/2.0);
2 26 Feb 07 jari 316         }
2 26 Feb 07 jari 317         
2 26 Feb 07 jari 318         for (p=j; p<n; p++) {
2 26 Feb 07 jari 319         if (owner[p]!=-1 && ((MinIndex[p]==j) || (MinIndex[p]==i))) {
2 26 Feb 07 jari 320           Min[p]=Float.POSITIVE_INFINITY;
2 26 Feb 07 jari 321           for (int l=0; l<p; l++) {
2 26 Feb 07 jari 322             if (owner[l] != -1 && SimilarityMatrix[p][l]<Min[p]) {
2 26 Feb 07 jari 323               Min[p]= SimilarityMatrix[p][l];
2 26 Feb 07 jari 324               MinIndex[p]=l;
2 26 Feb 07 jari 325             }
2 26 Feb 07 jari 326             }
2 26 Feb 07 jari 327         }
2 26 Feb 07 jari 328         }
2 26 Feb 07 jari 329   
2 26 Feb 07 jari 330     }
2 26 Feb 07 jari 331   //    for (int z=0; z<SimilarityMatrix.length; z++) {   //************************
2 26 Feb 07 jari 332   //    if (SimilarityMatrix[z] == null) {
2 26 Feb 07 jari 333   //        System.out.println("["+z+"]=null");
2 26 Feb 07 jari 334   //    } else {
2 26 Feb 07 jari 335   //        System.out.print("["+z+"]="+SimilarityMatrix[z]+" --> ");
2 26 Feb 07 jari 336   //        for (int y=0; y<SimilarityMatrix[z].length; y++) {
2 26 Feb 07 jari 337   //           System.out.print(" "+SimilarityMatrix[z][y]);
2 26 Feb 07 jari 338   //        }
2 26 Feb 07 jari 339   //        System.out.println("");
2 26 Feb 07 jari 340   //    }
2 26 Feb 07 jari 341   //    }
2 26 Feb 07 jari 342     //========================================
2 26 Feb 07 jari 343     AlgorithmData result = new AlgorithmData();
2 26 Feb 07 jari 344     //FloatMatrix similarity_matrix = new FloatMatrix(0, 0);
2 26 Feb 07 jari 345     //similarity_matrix.A = SimilarityMatrix;
2 26 Feb 07 jari 346     //result.addMatrix("similarity-matrix", similarity_matrix);
2 26 Feb 07 jari 347     //result.addIntArray("parent-array", Parent);
2 26 Feb 07 jari 348   
2 26 Feb 07 jari 349 //    System.out.println("HCL 345");
2 26 Feb 07 jari 350 //    System.out.println("Child1 array");   //**********************************
2 26 Feb 07 jari 351 //    for (int x = 0; x < Child1.length; x++) {
2 26 Feb 07 jari 352 //      System.out.print(Child1[x]+" ");
2 26 Feb 07 jari 353 //    }
2 26 Feb 07 jari 354 //    System.out.println();
2 26 Feb 07 jari 355 //    System.out.println("Child 2 array");
2 26 Feb 07 jari 356 //    for (int x = 0; x < Child2.length; x++) {
2 26 Feb 07 jari 357 //      System.out.print(Child2[x]+" ");
2 26 Feb 07 jari 358 //    }
2 26 Feb 07 jari 359 //    System.out.println();
2 26 Feb 07 jari 360 //    System.out.println("node-order");
2 26 Feb 07 jari 361 //    for (int x = 0; x < NodeOrder.length; x++) {
2 26 Feb 07 jari 362 //      System.out.print(NodeOrder[x]+" ");
2 26 Feb 07 jari 363 //    }
2 26 Feb 07 jari 364 //    System.out.println();
2 26 Feb 07 jari 365 //    System.out.println("child1 of nodeOrder "+ NodeOrder[0]+" = " + Child1[NodeOrder[0]]);
2 26 Feb 07 jari 366 //    System.out.println("child2 of nodeOrder "+ NodeOrder[0]+" = " + Child2[NodeOrder[0]]);
2 26 Feb 07 jari 367 //    System.out.println("Size of child1 array = "+Child1.length);
2 26 Feb 07 jari 368 //    System.out.println("Size of child2 array = "+Child2.length);
2 26 Feb 07 jari 369 //    System.out.println("NodeOrder array = "+NodeOrder.length);
2 26 Feb 07 jari 370       
2 26 Feb 07 jari 371     result.addIntArray("child-1-array", Child1);
2 26 Feb 07 jari 372     result.addIntArray("child-2-array", Child2);
2 26 Feb 07 jari 373     result.addIntArray("node-order", NodeOrder);
2 26 Feb 07 jari 374     result.addMatrix("height", new FloatMatrix(Height, Height.length));
2 26 Feb 07 jari 375   
2 26 Feb 07 jari 376     return result;
2 26 Feb 07 jari 377     }
2 26 Feb 07 jari 378     
2 26 Feb 07 jari 379     public void AssertParentage(int[] Parent, int[] NumberOfChildren, int[] Child1, 
2 26 Feb 07 jari 380         int[] Child2, int child, int paren) {
2 26 Feb 07 jari 381     try {
2 26 Feb 07 jari 382         if (Parent[child] == -1) {
2 26 Feb 07 jari 383         Parent[child] = paren;
2 26 Feb 07 jari 384         parentless--; // global
2 26 Feb 07 jari 385         Child2[paren]=Child1[paren];
2 26 Feb 07 jari 386         Child1[paren] = child;
2 26 Feb 07 jari 387         NumberOfChildren[paren]+=NumberOfChildren[child];
2 26 Feb 07 jari 388         }
2 26 Feb 07 jari 389     } catch (Exception e) {
2 26 Feb 07 jari 390         fireValueChanged(new AlgorithmEvent(this, AlgorithmEvent.WARNING, 0, "Error: "+e.toString()+" - AssertParentage("+String.valueOf(child)+","+String.valueOf(paren)+")"));
2 26 Feb 07 jari 391     }
2 26 Feb 07 jari 392     }
2 26 Feb 07 jari 393     
2 26 Feb 07 jari 394     public int NewNode(float[] Height, double h) {
2 26 Feb 07 jari 395     Height[Assigned] = (float)h;    //assigned is initialized to be the number of genes
2 26 Feb 07 jari 396     if (h > TreeHeight) 
2 26 Feb 07 jari 397       TreeHeight = h; // global
2 26 Feb 07 jari 398     ++parentless; // global
2 26 Feb 07 jari 399     return Assigned++; // global
2 26 Feb 07 jari 400     }
2 26 Feb 07 jari 401 }