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