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