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.3 $ |
2 |
26 Feb 07 |
jari |
* $Date: 2005/03/10 15:45:20 $ |
2 |
26 Feb 07 |
jari |
* $Author: braistedj $ |
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; |
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 |
//============= 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 |
//======== 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 |
// 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 |
// 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 |
/* if ((function==PEARSON) || |
2 |
26 Feb 07 |
jari |
(function==PEARSONUNCENTERED) || |
2 |
26 Feb 07 |
jari |
(function==PEARSONSQARED) || |
2 |
26 Feb 07 |
jari |
(function==COSINE) || |
2 |
26 Feb 07 |
jari |
(function==COVARIANCE) || |
2 |
26 Feb 07 |
jari |
(function==DOTPRODUCT) || |
2 |
26 Feb 07 |
jari |
(function==SPEARMANRANK) || |
2 |
26 Feb 07 |
jari |
(function==KENDALLSTAU)) { |
2 |
26 Feb 07 |
jari |
factor = -1.0f; |
2 |
26 Feb 07 |
jari |
} else { |
2 |
26 Feb 07 |
jari |
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 |
// 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 |
// 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 |
//JCB |
2 |
26 Feb 07 |
jari |
// if(i >= n || j >= n || i < 0 || j < 0) |
2 |
26 Feb 07 |
jari |
// 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 |
// 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 |
//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 |
// int schrott=NumberOfChildren[owner[j]]+NumberOfChildren[owner[i]]; |
2 |
26 Feb 07 |
jari |
// 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 |
//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 |
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 |
//result.addIntArray("node-height", NodeHeight); |
2 |
26 Feb 07 |
jari |
314 |
result.addMatrix("height", new FloatMatrix(Height, Height.length)); |
2 |
26 Feb 07 |
jari |
//result.addIntArray("number-of-children", NumberOfChildren); |
2 |
26 Feb 07 |
jari |
// if(!genes) |
2 |
26 Feb 07 |
jari |
// for(int q = 0; q < Height.length; q++){ |
2 |
26 Feb 07 |
jari |
// 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 |
// 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 |
/*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 |
353 |
} |
2 |
26 Feb 07 |
jari |
System.out.println(""); |
2 |
26 Feb 07 |
jari |
355 |
} |
2 |
26 Feb 07 |
jari |
356 |
}*/ |
2 |
26 Feb 07 |
jari |
357 |
} |