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