JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / bin / javajs / util / Eigen.js
1 Clazz.declarePackage ("javajs.util");\r
2 Clazz.load (["javajs.api.EigenInterface"], "javajs.util.Eigen", ["javajs.util.V3"], function () {\r
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.n = 3;\r
5 this.d = null;\r
6 this.e = null;\r
7 this.V = null;\r
8 Clazz.instantialize (this, arguments);\r
9 }, javajs.util, "Eigen", null, javajs.api.EigenInterface);\r
10 Clazz.makeConstructor (c$, \r
11 function () {\r
12 });\r
13 Clazz.defineMethod (c$, "set", \r
14 function (n) {\r
15 this.n = n;\r
16 this.V =  Clazz.newDoubleArray (n, n, 0);\r
17 this.d =  Clazz.newDoubleArray (n, 0);\r
18 this.e =  Clazz.newDoubleArray (n, 0);\r
19 return this;\r
20 }, "~N");\r
21 Clazz.overrideMethod (c$, "setM", \r
22 function (m) {\r
23 this.set (m.length);\r
24 this.calc (m);\r
25 return this;\r
26 }, "~A");\r
27 Clazz.overrideMethod (c$, "getEigenvalues", \r
28 function () {\r
29 return this.d;\r
30 });\r
31 Clazz.overrideMethod (c$, "fillFloatArrays", \r
32 function (eigenVectors, eigenValues) {\r
33 for (var i = 0; i < 3; i++) {\r
34 if (eigenVectors != null) {\r
35 if (eigenVectors[i] == null) eigenVectors[i] =  new javajs.util.V3 ();\r
36 eigenVectors[i].set (this.V[0][i], this.V[1][i], this.V[2][i]);\r
37 }if (eigenValues != null) eigenValues[i] = this.d[i];\r
38 }\r
39 }, "~A,~A");\r
40 Clazz.overrideMethod (c$, "getEigenvectorsFloatTransposed", \r
41 function () {\r
42 var f =  Clazz.newFloatArray (this.n, this.n, 0);\r
43 for (var i = this.n; --i >= 0; ) for (var j = this.n; --j >= 0; ) f[j][i] = this.V[i][j];\r
44 \r
45 \r
46 return f;\r
47 });\r
48 Clazz.defineMethod (c$, "calc", \r
49 function (A) {\r
50 for (var i = 0; i < this.n; i++) {\r
51 for (var j = 0; j < this.n; j++) {\r
52 this.V[i][j] = A[i][j];\r
53 }\r
54 }\r
55 this.tred2 ();\r
56 this.tql2 ();\r
57 }, "~A");\r
58 Clazz.defineMethod (c$, "getRealEigenvalues", \r
59 function () {\r
60 return this.d;\r
61 });\r
62 Clazz.defineMethod (c$, "getImagEigenvalues", \r
63 function () {\r
64 return this.e;\r
65 });\r
66 Clazz.defineMethod (c$, "tred2", \r
67 ($fz = function () {\r
68 for (var j = 0; j < this.n; j++) {\r
69 this.d[j] = this.V[this.n - 1][j];\r
70 }\r
71 for (var i = this.n - 1; i > 0; i--) {\r
72 var scale = 0.0;\r
73 var h = 0.0;\r
74 for (var k = 0; k < i; k++) {\r
75 scale = scale + Math.abs (this.d[k]);\r
76 }\r
77 if (scale == 0.0) {\r
78 this.e[i] = this.d[i - 1];\r
79 for (var j = 0; j < i; j++) {\r
80 this.d[j] = this.V[i - 1][j];\r
81 this.V[i][j] = 0.0;\r
82 this.V[j][i] = 0.0;\r
83 }\r
84 } else {\r
85 for (var k = 0; k < i; k++) {\r
86 this.d[k] /= scale;\r
87 h += this.d[k] * this.d[k];\r
88 }\r
89 var f = this.d[i - 1];\r
90 var g = Math.sqrt (h);\r
91 if (f > 0) {\r
92 g = -g;\r
93 }this.e[i] = scale * g;\r
94 h = h - f * g;\r
95 this.d[i - 1] = f - g;\r
96 for (var j = 0; j < i; j++) {\r
97 this.e[j] = 0.0;\r
98 }\r
99 for (var j = 0; j < i; j++) {\r
100 f = this.d[j];\r
101 this.V[j][i] = f;\r
102 g = this.e[j] + this.V[j][j] * f;\r
103 for (var k = j + 1; k <= i - 1; k++) {\r
104 g += this.V[k][j] * this.d[k];\r
105 this.e[k] += this.V[k][j] * f;\r
106 }\r
107 this.e[j] = g;\r
108 }\r
109 f = 0.0;\r
110 for (var j = 0; j < i; j++) {\r
111 this.e[j] /= h;\r
112 f += this.e[j] * this.d[j];\r
113 }\r
114 var hh = f / (h + h);\r
115 for (var j = 0; j < i; j++) {\r
116 this.e[j] -= hh * this.d[j];\r
117 }\r
118 for (var j = 0; j < i; j++) {\r
119 f = this.d[j];\r
120 g = this.e[j];\r
121 for (var k = j; k <= i - 1; k++) {\r
122 this.V[k][j] -= (f * this.e[k] + g * this.d[k]);\r
123 }\r
124 this.d[j] = this.V[i - 1][j];\r
125 this.V[i][j] = 0.0;\r
126 }\r
127 }this.d[i] = h;\r
128 }\r
129 for (var i = 0; i < this.n - 1; i++) {\r
130 this.V[this.n - 1][i] = this.V[i][i];\r
131 this.V[i][i] = 1.0;\r
132 var h = this.d[i + 1];\r
133 if (h != 0.0) {\r
134 for (var k = 0; k <= i; k++) {\r
135 this.d[k] = this.V[k][i + 1] / h;\r
136 }\r
137 for (var j = 0; j <= i; j++) {\r
138 var g = 0.0;\r
139 for (var k = 0; k <= i; k++) {\r
140 g += this.V[k][i + 1] * this.V[k][j];\r
141 }\r
142 for (var k = 0; k <= i; k++) {\r
143 this.V[k][j] -= g * this.d[k];\r
144 }\r
145 }\r
146 }for (var k = 0; k <= i; k++) {\r
147 this.V[k][i + 1] = 0.0;\r
148 }\r
149 }\r
150 for (var j = 0; j < this.n; j++) {\r
151 this.d[j] = this.V[this.n - 1][j];\r
152 this.V[this.n - 1][j] = 0.0;\r
153 }\r
154 this.V[this.n - 1][this.n - 1] = 1.0;\r
155 this.e[0] = 0.0;\r
156 }, $fz.isPrivate = true, $fz));\r
157 Clazz.defineMethod (c$, "tql2", \r
158 ($fz = function () {\r
159 for (var i = 1; i < this.n; i++) {\r
160 this.e[i - 1] = this.e[i];\r
161 }\r
162 this.e[this.n - 1] = 0.0;\r
163 var f = 0.0;\r
164 var tst1 = 0.0;\r
165 var eps = Math.pow (2.0, -52.0);\r
166 for (var l = 0; l < this.n; l++) {\r
167 tst1 = Math.max (tst1, Math.abs (this.d[l]) + Math.abs (this.e[l]));\r
168 var m = l;\r
169 while (m < this.n) {\r
170 if (Math.abs (this.e[m]) <= eps * tst1) {\r
171 break;\r
172 }m++;\r
173 }\r
174 if (m > l) {\r
175 var iter = 0;\r
176 do {\r
177 iter = iter + 1;\r
178 var g = this.d[l];\r
179 var p = (this.d[l + 1] - g) / (2.0 * this.e[l]);\r
180 var r = javajs.util.Eigen.hypot (p, 1.0);\r
181 if (p < 0) {\r
182 r = -r;\r
183 }this.d[l] = this.e[l] / (p + r);\r
184 this.d[l + 1] = this.e[l] * (p + r);\r
185 var dl1 = this.d[l + 1];\r
186 var h = g - this.d[l];\r
187 for (var i = l + 2; i < this.n; i++) {\r
188 this.d[i] -= h;\r
189 }\r
190 f = f + h;\r
191 p = this.d[m];\r
192 var c = 1.0;\r
193 var c2 = c;\r
194 var c3 = c;\r
195 var el1 = this.e[l + 1];\r
196 var s = 0.0;\r
197 var s2 = 0.0;\r
198 for (var i = m - 1; i >= l; i--) {\r
199 c3 = c2;\r
200 c2 = c;\r
201 s2 = s;\r
202 g = c * this.e[i];\r
203 h = c * p;\r
204 r = javajs.util.Eigen.hypot (p, this.e[i]);\r
205 this.e[i + 1] = s * r;\r
206 s = this.e[i] / r;\r
207 c = p / r;\r
208 p = c * this.d[i] - s * g;\r
209 this.d[i + 1] = h + s * (c * g + s * this.d[i]);\r
210 for (var k = 0; k < this.n; k++) {\r
211 h = this.V[k][i + 1];\r
212 this.V[k][i + 1] = s * this.V[k][i] + c * h;\r
213 this.V[k][i] = c * this.V[k][i] - s * h;\r
214 }\r
215 }\r
216 p = -s * s2 * c3 * el1 * this.e[l] / dl1;\r
217 this.e[l] = s * p;\r
218 this.d[l] = c * p;\r
219 } while (Math.abs (this.e[l]) > eps * tst1);\r
220 }this.d[l] = this.d[l] + f;\r
221 this.e[l] = 0.0;\r
222 }\r
223 for (var i = 0; i < this.n - 1; i++) {\r
224 var k = i;\r
225 var p = this.d[i];\r
226 for (var j = i + 1; j < this.n; j++) {\r
227 if (this.d[j] < p) {\r
228 k = j;\r
229 p = this.d[j];\r
230 }}\r
231 if (k != i) {\r
232 this.d[k] = this.d[i];\r
233 this.d[i] = p;\r
234 for (var j = 0; j < this.n; j++) {\r
235 p = this.V[j][i];\r
236 this.V[j][i] = this.V[j][k];\r
237 this.V[j][k] = p;\r
238 }\r
239 }}\r
240 }, $fz.isPrivate = true, $fz));\r
241 c$.hypot = Clazz.defineMethod (c$, "hypot", \r
242 ($fz = function (a, b) {\r
243 var r;\r
244 if (Math.abs (a) > Math.abs (b)) {\r
245 r = b / a;\r
246 r = Math.abs (a) * Math.sqrt (1 + r * r);\r
247 } else if (b != 0) {\r
248 r = a / b;\r
249 r = Math.abs (b) * Math.sqrt (1 + r * r);\r
250 } else {\r
251 r = 0.0;\r
252 }return r;\r
253 }, $fz.isPrivate = true, $fz), "~N,~N");\r
254 });\r