2 |
26 Feb 07 |
jari |
1 |
/* |
2 |
26 Feb 07 |
jari |
Copyright @ 1999-2004, The Institute for Genomic Research (TIGR). |
2 |
26 Feb 07 |
jari |
All rights reserved. |
2 |
26 Feb 07 |
jari |
4 |
*/ |
2 |
26 Feb 07 |
jari |
5 |
/* |
2 |
26 Feb 07 |
jari |
* $RCSfile: HCL.java,v $ |
2 |
26 Feb 07 |
jari |
* $Revision: 1.1 $ |
2 |
26 Feb 07 |
jari |
* $Date: 2006/02/08 18:17:16 $ |
2 |
26 Feb 07 |
jari |
* $Author: caliente $ |
2 |
26 Feb 07 |
jari |
* $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 |
//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 |
// System.out.println(""); |
2 |
26 Feb 07 |
jari |
// String[] names = data.getClusterNames(); //************************************ |
2 |
26 Feb 07 |
jari |
// for (int x = 0; x < names.length; x++) |
2 |
26 Feb 07 |
jari |
// System.out.println(names[x]); |
2 |
26 Feb 07 |
jari |
50 |
// |
2 |
26 Feb 07 |
jari |
// System.out.println("HCL 50"); |
2 |
26 Feb 07 |
jari |
// for (int x = 0; x < expMatrix.getRowDimension(); x ++) { //************************************ |
2 |
26 Feb 07 |
jari |
// for(int y = 0; y < expMatrix.getColumnDimension(); y ++) |
2 |
26 Feb 07 |
jari |
// System.out.print(expMatrix.get(x,y)+" "); |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
56 |
// } |
2 |
26 Feb 07 |
jari |
57 |
// |
2 |
26 Feb 07 |
jari |
AlgorithmParameters map = data.getParams(); |
2 |
26 Feb 07 |
jari |
59 |
|
2 |
26 Feb 07 |
jari |
int function = map.getInt("hcl-distance-function", EUCLIDEAN); |
2 |
26 Feb 07 |
jari |
float factor; // = map.getFloat("distance-factor", 1.0f); |
2 |
26 Feb 07 |
jari |
boolean absolute = map.getBoolean("hcl-distance-absolute", false); |
2 |
26 Feb 07 |
jari |
boolean genes = map.getBoolean("calculate-genes", true); |
2 |
26 Feb 07 |
jari |
int method = map.getInt("method-linkage", 0); |
2 |
26 Feb 07 |
jari |
65 |
|
2 |
26 Feb 07 |
jari |
// System.out.println("HCL 65"); |
2 |
26 Feb 07 |
jari |
// System.out.println("function = "+ function); |
2 |
26 Feb 07 |
jari |
// System.out.println("absolute = "+ absolute); |
2 |
26 Feb 07 |
jari |
// System.out.println("genes = "+ genes); |
2 |
26 Feb 07 |
jari |
// System.out.println("method = "+ method); |
2 |
26 Feb 07 |
jari |
71 |
|
2 |
26 Feb 07 |
jari |
//============= Init ==================== |
2 |
26 Feb 07 |
jari |
73 |
|
2 |
26 Feb 07 |
jari |
int n; |
2 |
26 Feb 07 |
jari |
if (genes) { |
2 |
26 Feb 07 |
jari |
n = expMatrix.getRowDimension(); |
2 |
26 Feb 07 |
jari |
} else { |
2 |
26 Feb 07 |
jari |
n = expMatrix.getColumnDimension(); |
2 |
26 Feb 07 |
jari |
79 |
} |
2 |
26 Feb 07 |
jari |
80 |
|
2 |
26 Feb 07 |
jari |
int two_n = 2*n; |
2 |
26 Feb 07 |
jari |
Assigned = n; |
2 |
26 Feb 07 |
jari |
parentless = n; |
2 |
26 Feb 07 |
jari |
84 |
|
2 |
26 Feb 07 |
jari |
TreeHeight = 0; |
2 |
26 Feb 07 |
jari |
double MaxCorrelation = 0; |
2 |
26 Feb 07 |
jari |
87 |
|
2 |
26 Feb 07 |
jari |
float[] Height = new float[two_n]; |
2 |
26 Feb 07 |
jari |
89 |
|
2 |
26 Feb 07 |
jari |
int[] Parent = new int[two_n]; |
2 |
26 Feb 07 |
jari |
int[] Child1 = new int[two_n]; |
2 |
26 Feb 07 |
jari |
int[] Child2 = new int[two_n]; |
2 |
26 Feb 07 |
jari |
int[] NodeHeight = new int[two_n]; |
2 |
26 Feb 07 |
jari |
int[] NodeOrder = new int[n]; |
2 |
26 Feb 07 |
jari |
int[] NumberOfChildren = new int[two_n]; |
2 |
26 Feb 07 |
jari |
96 |
|
2 |
26 Feb 07 |
jari |
for (int i=0; i<two_n; ++i) { |
2 |
26 Feb 07 |
jari |
Height[i] = 0.0f; |
2 |
26 Feb 07 |
jari |
Parent[i] = -1; |
2 |
26 Feb 07 |
jari |
Child1[i] = -1; |
2 |
26 Feb 07 |
jari |
Child2[i] = -1; |
2 |
26 Feb 07 |
jari |
NodeHeight[i] = 0; |
2 |
26 Feb 07 |
jari |
103 |
} |
2 |
26 Feb 07 |
jari |
104 |
|
2 |
26 Feb 07 |
jari |
for (int i=0; i<n; ++i) { |
2 |
26 Feb 07 |
jari |
NodeOrder[i]=-1; |
2 |
26 Feb 07 |
jari |
NumberOfChildren[i]=1; |
2 |
26 Feb 07 |
jari |
108 |
} |
2 |
26 Feb 07 |
jari |
109 |
|
2 |
26 Feb 07 |
jari |
//======== Init ========= |
2 |
26 Feb 07 |
jari |
float[][] SimilarityMatrix = new float[n][]; |
2 |
26 Feb 07 |
jari |
float[] Min = new float[n]; |
2 |
26 Feb 07 |
jari |
int[] MinIndex = new int[n]; |
2 |
26 Feb 07 |
jari |
final int UNITS = 200; |
2 |
26 Feb 07 |
jari |
115 |
|
2 |
26 Feb 07 |
jari |
AlgorithmEvent event = null; |
2 |
26 Feb 07 |
jari |
event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, UNITS, "Creating similarity matrix"); |
2 |
26 Feb 07 |
jari |
// set progress limit |
2 |
26 Feb 07 |
jari |
fireValueChanged(event); |
2 |
26 Feb 07 |
jari |
event.setId(AlgorithmEvent.PROGRESS_VALUE); |
2 |
26 Feb 07 |
jari |
event.setIntValue(0); |
2 |
26 Feb 07 |
jari |
// set zero position |
2 |
26 Feb 07 |
jari |
fireValueChanged(event); |
2 |
26 Feb 07 |
jari |
int i; |
2 |
26 Feb 07 |
jari |
int CurrentProgress = 0; |
2 |
26 Feb 07 |
jari |
int OldCurrentProgress = 0; |
2 |
26 Feb 07 |
jari |
double Factor=UNITS/(double)n; |
2 |
26 Feb 07 |
jari |
128 |
|
2 |
26 Feb 07 |
jari |
factor = (float)1.0; //factor is used as an optional scaling factor |
2 |
26 Feb 07 |
jari |
130 |
|
2 |
26 Feb 07 |
jari |
for (i=1; i<n; ++i) { |
2 |
26 Feb 07 |
jari |
CurrentProgress=(int)(i*Factor); |
2 |
26 Feb 07 |
jari |
133 |
|
2 |
26 Feb 07 |
jari |
if (CurrentProgress>OldCurrentProgress) { |
2 |
26 Feb 07 |
jari |
event.setIntValue(CurrentProgress); |
2 |
26 Feb 07 |
jari |
fireValueChanged(event); |
2 |
26 Feb 07 |
jari |
OldCurrentProgress=CurrentProgress; |
2 |
26 Feb 07 |
jari |
138 |
} |
2 |
26 Feb 07 |
jari |
SimilarityMatrix[i] = new float[i]; |
2 |
26 Feb 07 |
jari |
Min[i] = Float.POSITIVE_INFINITY; |
2 |
26 Feb 07 |
jari |
141 |
|
2 |
26 Feb 07 |
jari |
for (int j=0; j<i; ++j) { |
2 |
26 Feb 07 |
jari |
if (stop) { |
2 |
26 Feb 07 |
jari |
throw new AbortException(); |
2 |
26 Feb 07 |
jari |
145 |
} |
2 |
26 Feb 07 |
jari |
if (genes) { |
2 |
26 Feb 07 |
jari |
SimilarityMatrix[i][j] = ExperimentUtil.geneDistance(expMatrix, null, i, j, |
2 |
26 Feb 07 |
jari |
function, factor, absolute);//ExpMatrix.GeneDistance(i,j,null); |
2 |
26 Feb 07 |
jari |
} else { |
2 |
26 Feb 07 |
jari |
SimilarityMatrix[i][j] = ExperimentUtil.distance(expMatrix, i, j, |
2 |
26 Feb 07 |
jari |
function, factor, absolute); //ExpMatrix.ExperimentDistance(i,j); |
2 |
26 Feb 07 |
jari |
152 |
} |
2 |
26 Feb 07 |
jari |
153 |
|
2 |
26 Feb 07 |
jari |
if (SimilarityMatrix[i][j] < Min[i]) { |
2 |
26 Feb 07 |
jari |
Min[i] = SimilarityMatrix[i][j]; |
2 |
26 Feb 07 |
jari |
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 |
// for (int k = 0; k < n; k++) { |
2 |
26 Feb 07 |
jari |
// System.out.print(Min[k]+" "); |
2 |
26 Feb 07 |
jari |
162 |
// } |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
// for (int k = 0; k < n; k++) { |
2 |
26 Feb 07 |
jari |
// System.out.print(MinIndex[k]+" "); |
2 |
26 Feb 07 |
jari |
167 |
// } |
2 |
26 Feb 07 |
jari |
168 |
|
2 |
26 Feb 07 |
jari |
// for (int z=0; z<SimilarityMatrix.length; z++) { |
2 |
26 Feb 07 |
jari |
// if (SimilarityMatrix[z] == null) { |
2 |
26 Feb 07 |
jari |
// System.out.println("["+z+"]=null"); |
2 |
26 Feb 07 |
jari |
// } else { |
2 |
26 Feb 07 |
jari |
// System.out.print("["+z+"]="+SimilarityMatrix[z]+" --> "); |
2 |
26 Feb 07 |
jari |
// for (int y=0; y<SimilarityMatrix[z].length; y++) { |
2 |
26 Feb 07 |
jari |
// System.out.print(" "+SimilarityMatrix[z][y]); |
2 |
26 Feb 07 |
jari |
176 |
// } |
2 |
26 Feb 07 |
jari |
// 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 |
if (stop) { |
2 |
26 Feb 07 |
jari |
throw new AbortException(); |
2 |
26 Feb 07 |
jari |
186 |
} |
2 |
26 Feb 07 |
jari |
187 |
|
2 |
26 Feb 07 |
jari |
event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, UNITS, "Calculating tree"); |
2 |
26 Feb 07 |
jari |
// set progress limit |
2 |
26 Feb 07 |
jari |
fireValueChanged(event); |
2 |
26 Feb 07 |
jari |
event.setId(AlgorithmEvent.PROGRESS_VALUE); |
2 |
26 Feb 07 |
jari |
event.setIntValue(0); |
2 |
26 Feb 07 |
jari |
// set zero position |
2 |
26 Feb 07 |
jari |
fireValueChanged(event); |
2 |
26 Feb 07 |
jari |
195 |
|
2 |
26 Feb 07 |
jari |
long CalculatedNodes=0; |
2 |
26 Feb 07 |
jari |
CurrentProgress=0; |
2 |
26 Feb 07 |
jari |
OldCurrentProgress=0; |
2 |
26 Feb 07 |
jari |
Factor=UNITS/(double)n; |
2 |
26 Feb 07 |
jari |
int j,k,p; |
2 |
26 Feb 07 |
jari |
int NodeCounter = 0; |
2 |
26 Feb 07 |
jari |
double MaxDistance=0; |
2 |
26 Feb 07 |
jari |
double MinDistance=Double.POSITIVE_INFINITY; |
2 |
26 Feb 07 |
jari |
MaxCorrelation=Double.POSITIVE_INFINITY; |
2 |
26 Feb 07 |
jari |
double MinCorrelation=Double.POSITIVE_INFINITY; |
2 |
26 Feb 07 |
jari |
int owner[] = new int[n]; |
2 |
26 Feb 07 |
jari |
207 |
|
2 |
26 Feb 07 |
jari |
for (i=0; i<n; i++) |
2 |
26 Feb 07 |
jari |
owner[i] = i; |
2 |
26 Feb 07 |
jari |
210 |
|
2 |
26 Feb 07 |
jari |
while (parentless > 1) { //parentless initialized to be the number of genes |
2 |
26 Feb 07 |
jari |
if (stop) { |
2 |
26 Feb 07 |
jari |
throw new AbortException(); |
2 |
26 Feb 07 |
jari |
214 |
} |
2 |
26 Feb 07 |
jari |
CurrentProgress=(int)(CalculatedNodes*Factor); |
2 |
26 Feb 07 |
jari |
216 |
|
2 |
26 Feb 07 |
jari |
if (CurrentProgress>OldCurrentProgress) { |
2 |
26 Feb 07 |
jari |
event.setIntValue(CurrentProgress); |
2 |
26 Feb 07 |
jari |
fireValueChanged(event); |
2 |
26 Feb 07 |
jari |
OldCurrentProgress=CurrentProgress; |
2 |
26 Feb 07 |
jari |
221 |
} |
2 |
26 Feb 07 |
jari |
CalculatedNodes++; |
2 |
26 Feb 07 |
jari |
223 |
|
2 |
26 Feb 07 |
jari |
double close_d = Double.POSITIVE_INFINITY; // first find the closest pair |
2 |
26 Feb 07 |
jari |
double test_d = Double.POSITIVE_INFINITY; |
2 |
26 Feb 07 |
jari |
int test_i = -2; |
2 |
26 Feb 07 |
jari |
int test_j = -2; |
2 |
26 Feb 07 |
jari |
228 |
|
2 |
26 Feb 07 |
jari |
for (i=1; i<n; ++i) { |
2 |
26 Feb 07 |
jari |
if (owner[i] != -1) { |
2 |
26 Feb 07 |
jari |
if (Min[i] < test_d) { |
2 |
26 Feb 07 |
jari |
test_d = Min[i]; |
2 |
26 Feb 07 |
jari |
test_i = i; |
2 |
26 Feb 07 |
jari |
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 |
i = test_i; |
2 |
26 Feb 07 |
jari |
j = test_j; |
2 |
26 Feb 07 |
jari |
close_d = test_d; |
2 |
26 Feb 07 |
jari |
double height_k = close_d; |
2 |
26 Feb 07 |
jari |
243 |
|
2 |
26 Feb 07 |
jari |
//was close_d/2.0 ???????? |
2 |
26 Feb 07 |
jari |
if ((Math.abs(close_d) > 0) && (Math.abs(close_d) < MinDistance)) |
2 |
26 Feb 07 |
jari |
MinDistance=Math.abs(close_d); |
2 |
26 Feb 07 |
jari |
if ((close_d!=1) && (close_d < MaxCorrelation)) |
2 |
26 Feb 07 |
jari |
MaxCorrelation=close_d; |
2 |
26 Feb 07 |
jari |
if ((close_d > MaxCorrelation) && (close_d < MinCorrelation)) |
2 |
26 Feb 07 |
jari |
MinCorrelation=close_d; |
2 |
26 Feb 07 |
jari |
if (close_d > MaxDistance) |
2 |
26 Feb 07 |
jari |
MaxDistance=close_d; |
2 |
26 Feb 07 |
jari |
253 |
|
2 |
26 Feb 07 |
jari |
try { |
2 |
26 Feb 07 |
jari |
//System.out.println(" owner["+i+"]="+owner[i]); |
2 |
26 Feb 07 |
jari |
if (owner[i]>=n && Height[owner[i]]>height_k) { // Gene1 already assignd to a node, was >= ?! |
2 |
26 Feb 07 |
jari |
k = owner[i]; |
2 |
26 Feb 07 |
jari |
AssertParentage(Parent, NumberOfChildren, Child1, Child2, owner[j], k); |
2 |
26 Feb 07 |
jari |
} else if (owner[j]>=n && Height[owner[j]]>height_k) { // Gene2 already assignd to node was >= ?! |
2 |
26 Feb 07 |
jari |
k = owner[j]; |
2 |
26 Feb 07 |
jari |
AssertParentage(Parent, NumberOfChildren, Child1, Child2, owner[i], k); |
2 |
26 Feb 07 |
jari |
} else { |
2 |
26 Feb 07 |
jari |
k = NewNode(Height, height_k); |
2 |
26 Feb 07 |
jari |
AssertParentage(Parent, NumberOfChildren,Child1, Child2,owner[i], k); |
2 |
26 Feb 07 |
jari |
AssertParentage(Parent, NumberOfChildren,Child1, Child2,owner[j], k); |
2 |
26 Feb 07 |
jari |
266 |
} |
2 |
26 Feb 07 |
jari |
NodeOrder[NodeCounter]=k; |
2 |
26 Feb 07 |
jari |
NodeHeight[k]=Math.max(NodeHeight[Child1[k]]+1,NodeHeight[Child2[k]]+1); |
2 |
26 Feb 07 |
jari |
269 |
|
2 |
26 Feb 07 |
jari |
} catch (Exception e) { |
2 |
26 Feb 07 |
jari |
e.printStackTrace(); |
2 |
26 Feb 07 |
jari |
fireValueChanged(new AlgorithmEvent(this, AlgorithmEvent.WARNING, 0, "Error: "+e.toString()+" - Height("+String.valueOf(height_k)+","+")")); |
2 |
26 Feb 07 |
jari |
k=0; |
2 |
26 Feb 07 |
jari |
274 |
} |
2 |
26 Feb 07 |
jari |
275 |
|
2 |
26 Feb 07 |
jari |
NodeCounter++; |
2 |
26 Feb 07 |
jari |
owner[i] = k; |
2 |
26 Feb 07 |
jari |
owner[j] = -1; |
2 |
26 Feb 07 |
jari |
279 |
|
2 |
26 Feb 07 |
jari |
if (method == -1) { // minimum method |
2 |
26 Feb 07 |
jari |
for (p=0; p<j; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[i][p] = (float)Math.min(SimilarityMatrix[i][p],SimilarityMatrix[j][p]); |
2 |
26 Feb 07 |
jari |
for (p=j+1; p<i; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[i][p] = (float)Math.min(SimilarityMatrix[i][p],SimilarityMatrix[p][j]); |
2 |
26 Feb 07 |
jari |
for (p=i+1; p<n; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[p][i] = (float)Math.min(SimilarityMatrix[p][i],SimilarityMatrix[p][j]); |
2 |
26 Feb 07 |
jari |
} else if (method == +1) { // maximum method |
2 |
26 Feb 07 |
jari |
for (p=0; p<j; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[i][p] = (float)Math.max(SimilarityMatrix[i][p],SimilarityMatrix[j][p]); |
2 |
26 Feb 07 |
jari |
for (p=j+1; p<i; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[i][p] = (float)Math.max(SimilarityMatrix[i][p],SimilarityMatrix[p][j]); |
2 |
26 Feb 07 |
jari |
for (p=i+1; p<n; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[p][i] = (float)Math.max(SimilarityMatrix[p][i],SimilarityMatrix[p][j]); |
2 |
26 Feb 07 |
jari |
} else if (method == 2) { // average method |
2 |
26 Feb 07 |
jari |
// int schrott=NumberOfChildren[owner[j]]+NumberOfChildren[owner[i]]; |
2 |
26 Feb 07 |
jari |
// System.out.println(NumberOfChildren[owner[i]]); |
2 |
26 Feb 07 |
jari |
for (p=0; p<j; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[i][p] = (float)((SimilarityMatrix[i][p]*NumberOfChildren[owner[i]] + |
2 |
26 Feb 07 |
jari |
SimilarityMatrix[j][p]*NumberOfChildren[owner[j]])/ |
2 |
26 Feb 07 |
jari |
(2.0*Math.min(NumberOfChildren[owner[i]],NumberOfChildren[owner[j]]))); |
2 |
26 Feb 07 |
jari |
for (p=j+1; p<i; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[i][p] = (float)((SimilarityMatrix[i][p]*NumberOfChildren[owner[i]] + |
2 |
26 Feb 07 |
jari |
SimilarityMatrix[p][j]*NumberOfChildren[owner[j]])/ |
2 |
26 Feb 07 |
jari |
(2.0*Math.min(NumberOfChildren[owner[i]],NumberOfChildren[owner[j]]))); |
2 |
26 Feb 07 |
jari |
for (p=i+1; p<n; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[p][i] = (float)((SimilarityMatrix[p][i]*NumberOfChildren[owner[i]] + |
2 |
26 Feb 07 |
jari |
SimilarityMatrix[p][j]*NumberOfChildren[owner[j]])/ |
2 |
26 Feb 07 |
jari |
(2.0*Math.min(NumberOfChildren[owner[i]],NumberOfChildren[owner[j]]))); |
2 |
26 Feb 07 |
jari |
} else if (method == 0) { // average method |
2 |
26 Feb 07 |
jari |
for (p=0; p<j; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[i][p] = (float)((SimilarityMatrix[i][p] + SimilarityMatrix[j][p])/2.0); |
2 |
26 Feb 07 |
jari |
for (p=j+1; p<i; ++p) |
2 |
26 Feb 07 |
jari |
if (owner[p] != -1) SimilarityMatrix[i][p] = (float)((SimilarityMatrix[i][p] + SimilarityMatrix[p][j])/2.0); |
2 |
26 Feb 07 |
jari |
for (p=i+1; p<n; ++p) |
2 |
26 Feb 07 |
jari |
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 |
for (p=j; p<n; p++) { |
2 |
26 Feb 07 |
jari |
if (owner[p]!=-1 && ((MinIndex[p]==j) || (MinIndex[p]==i))) { |
2 |
26 Feb 07 |
jari |
Min[p]=Float.POSITIVE_INFINITY; |
2 |
26 Feb 07 |
jari |
for (int l=0; l<p; l++) { |
2 |
26 Feb 07 |
jari |
if (owner[l] != -1 && SimilarityMatrix[p][l]<Min[p]) { |
2 |
26 Feb 07 |
jari |
Min[p]= SimilarityMatrix[p][l]; |
2 |
26 Feb 07 |
jari |
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 |
// for (int z=0; z<SimilarityMatrix.length; z++) { //************************ |
2 |
26 Feb 07 |
jari |
// if (SimilarityMatrix[z] == null) { |
2 |
26 Feb 07 |
jari |
// System.out.println("["+z+"]=null"); |
2 |
26 Feb 07 |
jari |
// } else { |
2 |
26 Feb 07 |
jari |
// System.out.print("["+z+"]="+SimilarityMatrix[z]+" --> "); |
2 |
26 Feb 07 |
jari |
// for (int y=0; y<SimilarityMatrix[z].length; y++) { |
2 |
26 Feb 07 |
jari |
// System.out.print(" "+SimilarityMatrix[z][y]); |
2 |
26 Feb 07 |
jari |
338 |
// } |
2 |
26 Feb 07 |
jari |
// 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 |
AlgorithmData result = new AlgorithmData(); |
2 |
26 Feb 07 |
jari |
//FloatMatrix similarity_matrix = new FloatMatrix(0, 0); |
2 |
26 Feb 07 |
jari |
//similarity_matrix.A = SimilarityMatrix; |
2 |
26 Feb 07 |
jari |
//result.addMatrix("similarity-matrix", similarity_matrix); |
2 |
26 Feb 07 |
jari |
//result.addIntArray("parent-array", Parent); |
2 |
26 Feb 07 |
jari |
348 |
|
2 |
26 Feb 07 |
jari |
// System.out.println("HCL 345"); |
2 |
26 Feb 07 |
jari |
// System.out.println("Child1 array"); //********************************** |
2 |
26 Feb 07 |
jari |
// for (int x = 0; x < Child1.length; x++) { |
2 |
26 Feb 07 |
jari |
// System.out.print(Child1[x]+" "); |
2 |
26 Feb 07 |
jari |
353 |
// } |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
// System.out.println("Child 2 array"); |
2 |
26 Feb 07 |
jari |
// for (int x = 0; x < Child2.length; x++) { |
2 |
26 Feb 07 |
jari |
// System.out.print(Child2[x]+" "); |
2 |
26 Feb 07 |
jari |
358 |
// } |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
// System.out.println("node-order"); |
2 |
26 Feb 07 |
jari |
// for (int x = 0; x < NodeOrder.length; x++) { |
2 |
26 Feb 07 |
jari |
// System.out.print(NodeOrder[x]+" "); |
2 |
26 Feb 07 |
jari |
363 |
// } |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
// System.out.println("child1 of nodeOrder "+ NodeOrder[0]+" = " + Child1[NodeOrder[0]]); |
2 |
26 Feb 07 |
jari |
// System.out.println("child2 of nodeOrder "+ NodeOrder[0]+" = " + Child2[NodeOrder[0]]); |
2 |
26 Feb 07 |
jari |
// System.out.println("Size of child1 array = "+Child1.length); |
2 |
26 Feb 07 |
jari |
// System.out.println("Size of child2 array = "+Child2.length); |
2 |
26 Feb 07 |
jari |
// System.out.println("NodeOrder array = "+NodeOrder.length); |
2 |
26 Feb 07 |
jari |
370 |
|
2 |
26 Feb 07 |
jari |
result.addIntArray("child-1-array", Child1); |
2 |
26 Feb 07 |
jari |
result.addIntArray("child-2-array", Child2); |
2 |
26 Feb 07 |
jari |
result.addIntArray("node-order", NodeOrder); |
2 |
26 Feb 07 |
jari |
result.addMatrix("height", new FloatMatrix(Height, Height.length)); |
2 |
26 Feb 07 |
jari |
375 |
|
2 |
26 Feb 07 |
jari |
return result; |
2 |
26 Feb 07 |
jari |
377 |
} |
2 |
26 Feb 07 |
jari |
378 |
|
2 |
26 Feb 07 |
jari |
public void AssertParentage(int[] Parent, int[] NumberOfChildren, int[] Child1, |
2 |
26 Feb 07 |
jari |
int[] Child2, int child, int paren) { |
2 |
26 Feb 07 |
jari |
try { |
2 |
26 Feb 07 |
jari |
if (Parent[child] == -1) { |
2 |
26 Feb 07 |
jari |
Parent[child] = paren; |
2 |
26 Feb 07 |
jari |
parentless--; // global |
2 |
26 Feb 07 |
jari |
Child2[paren]=Child1[paren]; |
2 |
26 Feb 07 |
jari |
Child1[paren] = child; |
2 |
26 Feb 07 |
jari |
NumberOfChildren[paren]+=NumberOfChildren[child]; |
2 |
26 Feb 07 |
jari |
388 |
} |
2 |
26 Feb 07 |
jari |
} catch (Exception e) { |
2 |
26 Feb 07 |
jari |
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 |
public int NewNode(float[] Height, double h) { |
2 |
26 Feb 07 |
jari |
Height[Assigned] = (float)h; //assigned is initialized to be the number of genes |
2 |
26 Feb 07 |
jari |
if (h > TreeHeight) |
2 |
26 Feb 07 |
jari |
TreeHeight = h; // global |
2 |
26 Feb 07 |
jari |
++parentless; // global |
2 |
26 Feb 07 |
jari |
return Assigned++; // global |
2 |
26 Feb 07 |
jari |
400 |
} |
2 |
26 Feb 07 |
jari |
401 |
} |