JAL-1807 test
[jalviewjs.git] / bin / jalview / math / Matrix.js
1 Clazz.declarePackage ("jalview.math");
2 Clazz.load (null, "jalview.math.Matrix", ["jalview.util.Format", "$.MessageManager", "java.lang.Exception"], function () {
3 c$ = Clazz.decorateAsClass (function () {
4 this.value = null;
5 this.rows = 0;
6 this.cols = 0;
7 this.d = null;
8 this.e = null;
9 this.maxIter = 45;
10 Clazz.instantialize (this, arguments);
11 }, jalview.math, "Matrix");
12 Clazz.makeConstructor (c$, 
13 function (value, rows, cols) {
14 this.rows = rows;
15 this.cols = cols;
16 this.value = value;
17 }, "~A,~N,~N");
18 Clazz.defineMethod (c$, "transpose", 
19 function () {
20 var out =  Clazz.newDoubleArray (this.cols, this.rows, 0);
21 for (var i = 0; i < this.cols; i++) {
22 for (var j = 0; j < this.rows; j++) {
23 out[i][j] = this.value[j][i];
24 }
25 }
26 return  new jalview.math.Matrix (out, this.cols, this.rows);
27 });
28 Clazz.defineMethod (c$, "print", 
29 function (ps) {
30 for (var i = 0; i < this.rows; i++) {
31 for (var j = 0; j < this.cols; j++) {
32 jalview.util.Format.printDouble (ps, "%8.2f", this.value[i][j]);
33 }
34 ps.println ();
35 }
36 }, "java.io.PrintStream");
37 Clazz.defineMethod (c$, "preMultiply", 
38 function ($in) {
39 var tmp =  Clazz.newDoubleArray ($in.rows, this.cols, 0);
40 for (var i = 0; i < $in.rows; i++) {
41 for (var j = 0; j < this.cols; j++) {
42 tmp[i][j] = 0.0;
43 for (var k = 0; k < $in.cols; k++) {
44 tmp[i][j] += ($in.value[i][k] * this.value[k][j]);
45 }
46 }
47 }
48 return  new jalview.math.Matrix (tmp, $in.rows, this.cols);
49 }, "jalview.math.Matrix");
50 Clazz.defineMethod (c$, "vectorPostMultiply", 
51 function ($in) {
52 var out =  Clazz.newDoubleArray ($in.length, 0);
53 for (var i = 0; i < $in.length; i++) {
54 out[i] = 0.0;
55 for (var k = 0; k < $in.length; k++) {
56 out[i] += (this.value[i][k] * $in[k]);
57 }
58 }
59 return out;
60 }, "~A");
61 Clazz.defineMethod (c$, "postMultiply", 
62 function ($in) {
63 var out =  Clazz.newDoubleArray (this.rows, $in.cols, 0);
64 for (var i = 0; i < this.rows; i++) {
65 for (var j = 0; j < $in.cols; j++) {
66 out[i][j] = 0.0;
67 for (var k = 0; k < this.rows; k++) {
68 out[i][j] = out[i][j] + (this.value[i][k] * $in.value[k][j]);
69 }
70 }
71 }
72 return  new jalview.math.Matrix (out, this.cols, $in.rows);
73 }, "jalview.math.Matrix");
74 Clazz.defineMethod (c$, "copy", 
75 function () {
76 var newmat =  Clazz.newDoubleArray (this.rows, this.cols, 0);
77 for (var i = 0; i < this.rows; i++) {
78 for (var j = 0; j < this.cols; j++) {
79 newmat[i][j] = this.value[i][j];
80 }
81 }
82 return  new jalview.math.Matrix (newmat, this.rows, this.cols);
83 });
84 Clazz.defineMethod (c$, "tred", 
85 function () {
86 var n = this.rows;
87 var l;
88 var k;
89 var j;
90 var i;
91 var scale;
92 var hh;
93 var h;
94 var g;
95 var f;
96 this.d =  Clazz.newDoubleArray (this.rows, 0);
97 this.e =  Clazz.newDoubleArray (this.rows, 0);
98 for (i = n; i >= 2; i--) {
99 l = i - 1;
100 h = 0.0;
101 scale = 0.0;
102 if (l > 1) {
103 for (k = 1; k <= l; k++) {
104 scale += Math.abs (this.value[i - 1][k - 1]);
105 }
106 if (scale == 0.0) {
107 this.e[i - 1] = this.value[i - 1][l - 1];
108 } else {
109 for (k = 1; k <= l; k++) {
110 this.value[i - 1][k - 1] /= scale;
111 h += (this.value[i - 1][k - 1] * this.value[i - 1][k - 1]);
112 }
113 f = this.value[i - 1][l - 1];
114 if (f > 0) {
115 g = -1.0 * Math.sqrt (h);
116 } else {
117 g = Math.sqrt (h);
118 }this.e[i - 1] = scale * g;
119 h -= (f * g);
120 this.value[i - 1][l - 1] = f - g;
121 f = 0.0;
122 for (j = 1; j <= l; j++) {
123 this.value[j - 1][i - 1] = this.value[i - 1][j - 1] / h;
124 g = 0.0;
125 for (k = 1; k <= j; k++) {
126 g += (this.value[j - 1][k - 1] * this.value[i - 1][k - 1]);
127 }
128 for (k = j + 1; k <= l; k++) {
129 g += (this.value[k - 1][j - 1] * this.value[i - 1][k - 1]);
130 }
131 this.e[j - 1] = g / h;
132 f += (this.e[j - 1] * this.value[i - 1][j - 1]);
133 }
134 hh = f / (h + h);
135 for (j = 1; j <= l; j++) {
136 f = this.value[i - 1][j - 1];
137 g = this.e[j - 1] - (hh * f);
138 this.e[j - 1] = g;
139 for (k = 1; k <= j; k++) {
140 this.value[j - 1][k - 1] -= ((f * this.e[k - 1]) + (g * this.value[i - 1][k - 1]));
141 }
142 }
143 }} else {
144 this.e[i - 1] = this.value[i - 1][l - 1];
145 }this.d[i - 1] = h;
146 }
147 this.d[0] = 0.0;
148 this.e[0] = 0.0;
149 for (i = 1; i <= n; i++) {
150 l = i - 1;
151 if (this.d[i - 1] != 0.0) {
152 for (j = 1; j <= l; j++) {
153 g = 0.0;
154 for (k = 1; k <= l; k++) {
155 g += (this.value[i - 1][k - 1] * this.value[k - 1][j - 1]);
156 }
157 for (k = 1; k <= l; k++) {
158 this.value[k - 1][j - 1] -= (g * this.value[k - 1][i - 1]);
159 }
160 }
161 }this.d[i - 1] = this.value[i - 1][i - 1];
162 this.value[i - 1][i - 1] = 1.0;
163 for (j = 1; j <= l; j++) {
164 this.value[j - 1][i - 1] = 0.0;
165 this.value[i - 1][j - 1] = 0.0;
166 }
167 }
168 });
169 Clazz.defineMethod (c$, "tqli", 
170 function () {
171 var n = this.rows;
172 var m;
173 var l;
174 var iter;
175 var i;
176 var k;
177 var s;
178 var r;
179 var p;
180 ;var g;
181 var f;
182 var dd;
183 var c;
184 var b;
185 for (i = 2; i <= n; i++) {
186 this.e[i - 2] = this.e[i - 1];
187 }
188 this.e[n - 1] = 0.0;
189 for (l = 1; l <= n; l++) {
190 iter = 0;
191 do {
192 for (m = l; m <= (n - 1); m++) {
193 dd = Math.abs (this.d[m - 1]) + Math.abs (this.d[m]);
194 if ((Math.abs (this.e[m - 1]) + dd) == dd) {
195 break;
196 }}
197 if (m != l) {
198 iter++;
199 if (iter == this.maxIter) {
200 throw  new Exception (jalview.util.MessageManager.formatMessage ("exception.matrix_too_many_iteration",  Clazz.newArray (-1, ["tqli", Integer.$valueOf (this.maxIter).toString ()])));
201 } else {
202 }g = (this.d[l] - this.d[l - 1]) / (2.0 * this.e[l - 1]);
203 r = Math.sqrt ((g * g) + 1.0);
204 g = this.d[m - 1] - this.d[l - 1] + (this.e[l - 1] / (g + this.sign (r, g)));
205 c = 1.0;
206 s = c;
207 p = 0.0;
208 for (i = m - 1; i >= l; i--) {
209 f = s * this.e[i - 1];
210 b = c * this.e[i - 1];
211 if (Math.abs (f) >= Math.abs (g)) {
212 c = g / f;
213 r = Math.sqrt ((c * c) + 1.0);
214 this.e[i] = f * r;
215 s = 1.0 / r;
216 c *= s;
217 } else {
218 s = f / g;
219 r = Math.sqrt ((s * s) + 1.0);
220 this.e[i] = g * r;
221 c = 1.0 / r;
222 s *= c;
223 }g = this.d[i] - p;
224 r = ((this.d[i - 1] - g) * s) + (2.0 * c * b);
225 p = s * r;
226 this.d[i] = g + p;
227 g = (c * r) - b;
228 for (k = 1; k <= n; k++) {
229 f = this.value[k - 1][i];
230 this.value[k - 1][i] = (s * this.value[k - 1][i - 1]) + (c * f);
231 this.value[k - 1][i - 1] = (c * this.value[k - 1][i - 1]) - (s * f);
232 }
233 }
234 this.d[l - 1] = this.d[l - 1] - p;
235 this.e[l - 1] = g;
236 this.e[m - 1] = 0.0;
237 }} while (m != l);
238 }
239 });
240 Clazz.defineMethod (c$, "tred2", 
241 function () {
242 var n = this.rows;
243 var l;
244 var k;
245 var j;
246 var i;
247 var scale;
248 var hh;
249 var h;
250 var g;
251 var f;
252 this.d =  Clazz.newDoubleArray (this.rows, 0);
253 this.e =  Clazz.newDoubleArray (this.rows, 0);
254 for (i = n - 1; i >= 1; i--) {
255 l = i - 1;
256 h = 0.0;
257 scale = 0.0;
258 if (l > 0) {
259 for (k = 0; k < l; k++) {
260 scale += Math.abs (this.value[i][k]);
261 }
262 if (scale == 0.0) {
263 this.e[i] = this.value[i][l];
264 } else {
265 for (k = 0; k < l; k++) {
266 this.value[i][k] /= scale;
267 h += (this.value[i][k] * this.value[i][k]);
268 }
269 f = this.value[i][l];
270 if (f > 0) {
271 g = -1.0 * Math.sqrt (h);
272 } else {
273 g = Math.sqrt (h);
274 }this.e[i] = scale * g;
275 h -= (f * g);
276 this.value[i][l] = f - g;
277 f = 0.0;
278 for (j = 0; j < l; j++) {
279 this.value[j][i] = this.value[i][j] / h;
280 g = 0.0;
281 for (k = 0; k < j; k++) {
282 g += (this.value[j][k] * this.value[i][k]);
283 }
284 for (k = j; k < l; k++) {
285 g += (this.value[k][j] * this.value[i][k]);
286 }
287 this.e[j] = g / h;
288 f += (this.e[j] * this.value[i][j]);
289 }
290 hh = f / (h + h);
291 for (j = 0; j < l; j++) {
292 f = this.value[i][j];
293 g = this.e[j] - (hh * f);
294 this.e[j] = g;
295 for (k = 0; k < j; k++) {
296 this.value[j][k] -= ((f * this.e[k]) + (g * this.value[i][k]));
297 }
298 }
299 }} else {
300 this.e[i] = this.value[i][l];
301 }this.d[i] = h;
302 }
303 this.d[0] = 0.0;
304 this.e[0] = 0.0;
305 for (i = 0; i < n; i++) {
306 l = i - 1;
307 if (this.d[i] != 0.0) {
308 for (j = 0; j < l; j++) {
309 g = 0.0;
310 for (k = 0; k < l; k++) {
311 g += (this.value[i][k] * this.value[k][j]);
312 }
313 for (k = 0; k < l; k++) {
314 this.value[k][j] -= (g * this.value[k][i]);
315 }
316 }
317 }this.d[i] = this.value[i][i];
318 this.value[i][i] = 1.0;
319 for (j = 0; j < l; j++) {
320 this.value[j][i] = 0.0;
321 this.value[i][j] = 0.0;
322 }
323 }
324 });
325 Clazz.defineMethod (c$, "tqli2", 
326 function () {
327 var n = this.rows;
328 var m;
329 var l;
330 var iter;
331 var i;
332 var k;
333 var s;
334 var r;
335 var p;
336 ;var g;
337 var f;
338 var dd;
339 var c;
340 var b;
341 for (i = 2; i <= n; i++) {
342 this.e[i - 2] = this.e[i - 1];
343 }
344 this.e[n - 1] = 0.0;
345 for (l = 1; l <= n; l++) {
346 iter = 0;
347 do {
348 for (m = l; m <= (n - 1); m++) {
349 dd = Math.abs (this.d[m - 1]) + Math.abs (this.d[m]);
350 if ((Math.abs (this.e[m - 1]) + dd) == dd) {
351 break;
352 }}
353 if (m != l) {
354 iter++;
355 if (iter == this.maxIter) {
356 throw  new Exception (jalview.util.MessageManager.formatMessage ("exception.matrix_too_many_iteration",  Clazz.newArray (-1, ["tqli2", Integer.$valueOf (this.maxIter).toString ()])));
357 } else {
358 }g = (this.d[l] - this.d[l - 1]) / (2.0 * this.e[l - 1]);
359 r = Math.sqrt ((g * g) + 1.0);
360 g = this.d[m - 1] - this.d[l - 1] + (this.e[l - 1] / (g + this.sign (r, g)));
361 c = 1.0;
362 s = c;
363 p = 0.0;
364 for (i = m - 1; i >= l; i--) {
365 f = s * this.e[i - 1];
366 b = c * this.e[i - 1];
367 if (Math.abs (f) >= Math.abs (g)) {
368 c = g / f;
369 r = Math.sqrt ((c * c) + 1.0);
370 this.e[i] = f * r;
371 s = 1.0 / r;
372 c *= s;
373 } else {
374 s = f / g;
375 r = Math.sqrt ((s * s) + 1.0);
376 this.e[i] = g * r;
377 c = 1.0 / r;
378 s *= c;
379 }g = this.d[i] - p;
380 r = ((this.d[i - 1] - g) * s) + (2.0 * c * b);
381 p = s * r;
382 this.d[i] = g + p;
383 g = (c * r) - b;
384 for (k = 1; k <= n; k++) {
385 f = this.value[k - 1][i];
386 this.value[k - 1][i] = (s * this.value[k - 1][i - 1]) + (c * f);
387 this.value[k - 1][i - 1] = (c * this.value[k - 1][i - 1]) - (s * f);
388 }
389 }
390 this.d[l - 1] = this.d[l - 1] - p;
391 this.e[l - 1] = g;
392 this.e[m - 1] = 0.0;
393 }} while (m != l);
394 }
395 });
396 Clazz.defineMethod (c$, "sign", 
397 function (a, b) {
398 if (b < 0) {
399 return -Math.abs (a);
400 } else {
401 return Math.abs (a);
402 }}, "~N,~N");
403 Clazz.defineMethod (c$, "getColumn", 
404 function (n) {
405 var out =  Clazz.newDoubleArray (this.rows, 0);
406 for (var i = 0; i < this.rows; i++) {
407 out[i] = this.value[i][n];
408 }
409 return out;
410 }, "~N");
411 Clazz.defineMethod (c$, "printD", 
412 function (ps) {
413 for (var j = 0; j < this.rows; j++) {
414 jalview.util.Format.printDouble (ps, "%15.4e", this.d[j]);
415 }
416 }, "java.io.PrintStream");
417 Clazz.defineMethod (c$, "printE", 
418 function (ps) {
419 for (var j = 0; j < this.rows; j++) {
420 jalview.util.Format.printDouble (ps, "%15.4e", this.e[j]);
421 }
422 }, "java.io.PrintStream");
423 });