@thi.ng/matrices 2.1.32 → 2.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dev/numeric.js DELETED
@@ -1,5021 +0,0 @@
1
- "use strict";
2
-
3
- var numeric = typeof exports === "undefined" ? function numeric() {} : exports;
4
- if (typeof global !== "undefined") {
5
- global.numeric = numeric;
6
- }
7
-
8
- numeric.version = "1.2.6";
9
-
10
- // 1. Utility functions
11
- numeric.bench = function bench(f, interval) {
12
- var t1, t2, n, i;
13
- if (typeof interval === "undefined") {
14
- interval = 15;
15
- }
16
- n = 0.5;
17
- t1 = new Date();
18
- while (1) {
19
- n *= 2;
20
- for (i = n; i > 3; i -= 4) {
21
- f();
22
- f();
23
- f();
24
- f();
25
- }
26
- while (i > 0) {
27
- f();
28
- i--;
29
- }
30
- t2 = new Date();
31
- if (t2 - t1 > interval) break;
32
- }
33
- for (i = n; i > 3; i -= 4) {
34
- f();
35
- f();
36
- f();
37
- f();
38
- }
39
- while (i > 0) {
40
- f();
41
- i--;
42
- }
43
- t2 = new Date();
44
- return (1000 * (3 * n - 1)) / (t2 - t1);
45
- };
46
-
47
- numeric._myIndexOf = function _myIndexOf(w) {
48
- var n = this.length,
49
- k;
50
- for (k = 0; k < n; ++k) if (this[k] === w) return k;
51
- return -1;
52
- };
53
- numeric.myIndexOf = Array.prototype.indexOf
54
- ? Array.prototype.indexOf
55
- : numeric._myIndexOf;
56
-
57
- numeric.Function = Function;
58
- numeric.precision = 4;
59
- numeric.largeArray = 50;
60
-
61
- numeric.prettyPrint = function prettyPrint(x) {
62
- function fmtnum(x) {
63
- if (x === 0) {
64
- return "0";
65
- }
66
- if (isNaN(x)) {
67
- return "NaN";
68
- }
69
- if (x < 0) {
70
- return "-" + fmtnum(-x);
71
- }
72
- if (isFinite(x)) {
73
- var scale = Math.floor(Math.log(x) / Math.log(10));
74
- var normalized = x / Math.pow(10, scale);
75
- var basic = normalized.toPrecision(numeric.precision);
76
- if (parseFloat(basic) === 10) {
77
- scale++;
78
- normalized = 1;
79
- basic = normalized.toPrecision(numeric.precision);
80
- }
81
- return parseFloat(basic).toString() + "e" + scale.toString();
82
- }
83
- return "Infinity";
84
- }
85
- var ret = [];
86
- function foo(x) {
87
- var k;
88
- if (typeof x === "undefined") {
89
- ret.push(Array(numeric.precision + 8).join(" "));
90
- return false;
91
- }
92
- if (typeof x === "string") {
93
- ret.push('"' + x + '"');
94
- return false;
95
- }
96
- if (typeof x === "boolean") {
97
- ret.push(x.toString());
98
- return false;
99
- }
100
- if (typeof x === "number") {
101
- var a = fmtnum(x);
102
- var b = x.toPrecision(numeric.precision);
103
- var c = parseFloat(x.toString()).toString();
104
- var d = [
105
- a,
106
- b,
107
- c,
108
- parseFloat(b).toString(),
109
- parseFloat(c).toString(),
110
- ];
111
- for (k = 1; k < d.length; k++) {
112
- if (d[k].length < a.length) a = d[k];
113
- }
114
- ret.push(Array(numeric.precision + 8 - a.length).join(" ") + a);
115
- return false;
116
- }
117
- if (x === null) {
118
- ret.push("null");
119
- return false;
120
- }
121
- if (typeof x === "function") {
122
- ret.push(x.toString());
123
- var flag = false;
124
- for (k in x) {
125
- if (x.hasOwnProperty(k)) {
126
- if (flag) ret.push(",\n");
127
- else ret.push("\n{");
128
- flag = true;
129
- ret.push(k);
130
- ret.push(": \n");
131
- foo(x[k]);
132
- }
133
- }
134
- if (flag) ret.push("}\n");
135
- return true;
136
- }
137
- if (x instanceof Array) {
138
- if (x.length > numeric.largeArray) {
139
- ret.push("...Large Array...");
140
- return true;
141
- }
142
- var flag = false;
143
- ret.push("[");
144
- for (k = 0; k < x.length; k++) {
145
- if (k > 0) {
146
- ret.push(",");
147
- if (flag) ret.push("\n ");
148
- }
149
- flag = foo(x[k]);
150
- }
151
- ret.push("]");
152
- return true;
153
- }
154
- ret.push("{");
155
- var flag = false;
156
- for (k in x) {
157
- if (x.hasOwnProperty(k)) {
158
- if (flag) ret.push(",\n");
159
- flag = true;
160
- ret.push(k);
161
- ret.push(": \n");
162
- foo(x[k]);
163
- }
164
- }
165
- ret.push("}");
166
- return true;
167
- }
168
- foo(x);
169
- return ret.join("");
170
- };
171
-
172
- numeric.parseDate = function parseDate(d) {
173
- function foo(d) {
174
- if (typeof d === "string") {
175
- return Date.parse(d.replace(/-/g, "/"));
176
- }
177
- if (!(d instanceof Array)) {
178
- throw new Error("parseDate: parameter must be arrays of strings");
179
- }
180
- var ret = [],
181
- k;
182
- for (k = 0; k < d.length; k++) {
183
- ret[k] = foo(d[k]);
184
- }
185
- return ret;
186
- }
187
- return foo(d);
188
- };
189
-
190
- numeric.parseFloat = function parseFloat_(d) {
191
- function foo(d) {
192
- if (typeof d === "string") {
193
- return parseFloat(d);
194
- }
195
- if (!(d instanceof Array)) {
196
- throw new Error("parseFloat: parameter must be arrays of strings");
197
- }
198
- var ret = [],
199
- k;
200
- for (k = 0; k < d.length; k++) {
201
- ret[k] = foo(d[k]);
202
- }
203
- return ret;
204
- }
205
- return foo(d);
206
- };
207
-
208
- numeric.parseCSV = function parseCSV(t) {
209
- var foo = t.split("\n");
210
- var j, k;
211
- var ret = [];
212
- var pat = /(([^'",]*)|('[^']*')|("[^"]*")),/g;
213
- var patnum =
214
- /^\s*(([+-]?[0-9]+(\.[0-9]*)?(e[+-]?[0-9]+)?)|([+-]?[0-9]*(\.[0-9]+)?(e[+-]?[0-9]+)?))\s*$/;
215
- var stripper = function (n) {
216
- return n.substr(0, n.length - 1);
217
- };
218
- var count = 0;
219
- for (k = 0; k < foo.length; k++) {
220
- var bar = (foo[k] + ",").match(pat),
221
- baz;
222
- if (bar.length > 0) {
223
- ret[count] = [];
224
- for (j = 0; j < bar.length; j++) {
225
- baz = stripper(bar[j]);
226
- if (patnum.test(baz)) {
227
- ret[count][j] = parseFloat(baz);
228
- } else ret[count][j] = baz;
229
- }
230
- count++;
231
- }
232
- }
233
- return ret;
234
- };
235
-
236
- numeric.toCSV = function toCSV(A) {
237
- var s = numeric.dim(A);
238
- var i, j, m, n, row, ret;
239
- m = s[0];
240
- n = s[1];
241
- ret = [];
242
- for (i = 0; i < m; i++) {
243
- row = [];
244
- for (j = 0; j < m; j++) {
245
- row[j] = A[i][j].toString();
246
- }
247
- ret[i] = row.join(", ");
248
- }
249
- return ret.join("\n") + "\n";
250
- };
251
-
252
- numeric.getURL = function getURL(url) {
253
- var client = new XMLHttpRequest();
254
- client.open("GET", url, false);
255
- client.send();
256
- return client;
257
- };
258
-
259
- numeric.imageURL = function imageURL(img) {
260
- function base64(A) {
261
- var n = A.length,
262
- i,
263
- x,
264
- y,
265
- z,
266
- p,
267
- q,
268
- r,
269
- s;
270
- var key =
271
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
272
- var ret = "";
273
- for (i = 0; i < n; i += 3) {
274
- x = A[i];
275
- y = A[i + 1];
276
- z = A[i + 2];
277
- p = x >> 2;
278
- q = ((x & 3) << 4) + (y >> 4);
279
- r = ((y & 15) << 2) + (z >> 6);
280
- s = z & 63;
281
- if (i + 1 >= n) {
282
- r = s = 64;
283
- } else if (i + 2 >= n) {
284
- s = 64;
285
- }
286
- ret +=
287
- key.charAt(p) + key.charAt(q) + key.charAt(r) + key.charAt(s);
288
- }
289
- return ret;
290
- }
291
- function crc32Array(a, from, to) {
292
- if (typeof from === "undefined") {
293
- from = 0;
294
- }
295
- if (typeof to === "undefined") {
296
- to = a.length;
297
- }
298
- var table = [
299
- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
300
- 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
301
- 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
302
- 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
303
- 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
304
- 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
305
- 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
306
- 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
307
- 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
308
- 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
309
- 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
310
- 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
311
- 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
312
- 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
313
- 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
314
- 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
315
- 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
316
- 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
317
- 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
318
- 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
319
- 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
320
- 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
321
- 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
322
- 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
323
- 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
324
- 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
325
- 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
326
- 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
327
- 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
328
- 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
329
- 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
330
- 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
331
- 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
332
- 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
333
- 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
334
- 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
335
- 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
336
- 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
337
- 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
338
- 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
339
- 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
340
- 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
341
- 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
342
- 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
343
- 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
344
- 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
345
- 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
346
- 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
347
- 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
348
- 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
349
- 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
350
- 0x2d02ef8d,
351
- ];
352
-
353
- var crc = -1,
354
- y = 0,
355
- n = a.length,
356
- i;
357
-
358
- for (i = from; i < to; i++) {
359
- y = (crc ^ a[i]) & 0xff;
360
- crc = (crc >>> 8) ^ table[y];
361
- }
362
-
363
- return crc ^ -1;
364
- }
365
-
366
- var h = img[0].length,
367
- w = img[0][0].length,
368
- s1,
369
- s2,
370
- next,
371
- k,
372
- length,
373
- a,
374
- b,
375
- i,
376
- j,
377
- adler32,
378
- crc32;
379
- var stream = [
380
- 137,
381
- 80,
382
- 78,
383
- 71,
384
- 13,
385
- 10,
386
- 26,
387
- 10, // 0: PNG signature
388
- 0,
389
- 0,
390
- 0,
391
- 13, // 8: IHDR Chunk length
392
- 73,
393
- 72,
394
- 68,
395
- 82, // 12: "IHDR"
396
- (w >> 24) & 255,
397
- (w >> 16) & 255,
398
- (w >> 8) & 255,
399
- w & 255, // 16: Width
400
- (h >> 24) & 255,
401
- (h >> 16) & 255,
402
- (h >> 8) & 255,
403
- h & 255, // 20: Height
404
- 8, // 24: bit depth
405
- 2, // 25: RGB
406
- 0, // 26: deflate
407
- 0, // 27: no filter
408
- 0, // 28: no interlace
409
- -1,
410
- -2,
411
- -3,
412
- -4, // 29: CRC
413
- -5,
414
- -6,
415
- -7,
416
- -8, // 33: IDAT Chunk length
417
- 73,
418
- 68,
419
- 65,
420
- 84, // 37: "IDAT"
421
- // RFC 1950 header starts here
422
- 8, // 41: RFC1950 CMF
423
- 29, // 42: RFC1950 FLG
424
- ];
425
- crc32 = crc32Array(stream, 12, 29);
426
- stream[29] = (crc32 >> 24) & 255;
427
- stream[30] = (crc32 >> 16) & 255;
428
- stream[31] = (crc32 >> 8) & 255;
429
- stream[32] = crc32 & 255;
430
- s1 = 1;
431
- s2 = 0;
432
- for (i = 0; i < h; i++) {
433
- if (i < h - 1) {
434
- stream.push(0);
435
- } else {
436
- stream.push(1);
437
- }
438
- a = (3 * w + 1 + (i === 0)) & 255;
439
- b = ((3 * w + 1 + (i === 0)) >> 8) & 255;
440
- stream.push(a);
441
- stream.push(b);
442
- stream.push(~a & 255);
443
- stream.push(~b & 255);
444
- if (i === 0) stream.push(0);
445
- for (j = 0; j < w; j++) {
446
- for (k = 0; k < 3; k++) {
447
- a = img[k][i][j];
448
- if (a > 255) a = 255;
449
- else if (a < 0) a = 0;
450
- else a = Math.round(a);
451
- s1 = (s1 + a) % 65521;
452
- s2 = (s2 + s1) % 65521;
453
- stream.push(a);
454
- }
455
- }
456
- stream.push(0);
457
- }
458
- adler32 = (s2 << 16) + s1;
459
- stream.push((adler32 >> 24) & 255);
460
- stream.push((adler32 >> 16) & 255);
461
- stream.push((adler32 >> 8) & 255);
462
- stream.push(adler32 & 255);
463
- length = stream.length - 41;
464
- stream[33] = (length >> 24) & 255;
465
- stream[34] = (length >> 16) & 255;
466
- stream[35] = (length >> 8) & 255;
467
- stream[36] = length & 255;
468
- crc32 = crc32Array(stream, 37);
469
- stream.push((crc32 >> 24) & 255);
470
- stream.push((crc32 >> 16) & 255);
471
- stream.push((crc32 >> 8) & 255);
472
- stream.push(crc32 & 255);
473
- stream.push(0);
474
- stream.push(0);
475
- stream.push(0);
476
- stream.push(0);
477
- // a = stream.length;
478
- stream.push(73); // I
479
- stream.push(69); // E
480
- stream.push(78); // N
481
- stream.push(68); // D
482
- stream.push(174); // CRC1
483
- stream.push(66); // CRC2
484
- stream.push(96); // CRC3
485
- stream.push(130); // CRC4
486
- return "data:image/png;base64," + base64(stream);
487
- };
488
-
489
- // 2. Linear algebra with Arrays.
490
- numeric._dim = function _dim(x) {
491
- var ret = [];
492
- while (typeof x === "object") {
493
- ret.push(x.length);
494
- x = x[0];
495
- }
496
- return ret;
497
- };
498
-
499
- numeric.dim = function dim(x) {
500
- var y, z;
501
- if (typeof x === "object") {
502
- y = x[0];
503
- if (typeof y === "object") {
504
- z = y[0];
505
- if (typeof z === "object") {
506
- return numeric._dim(x);
507
- }
508
- return [x.length, y.length];
509
- }
510
- return [x.length];
511
- }
512
- return [];
513
- };
514
-
515
- numeric.mapreduce = function mapreduce(body, init) {
516
- return Function(
517
- "x",
518
- "accum",
519
- "_s",
520
- "_k",
521
- 'if(typeof accum === "undefined") accum = ' +
522
- init +
523
- ";\n" +
524
- 'if(typeof x === "number") { var xi = x; ' +
525
- body +
526
- "; return accum; }\n" +
527
- 'if(typeof _s === "undefined") _s = numeric.dim(x);\n' +
528
- 'if(typeof _k === "undefined") _k = 0;\n' +
529
- "var _n = _s[_k];\n" +
530
- "var i,xi;\n" +
531
- "if(_k < _s.length-1) {\n" +
532
- " for(i=_n-1;i>=0;i--) {\n" +
533
- " accum = arguments.callee(x[i],accum,_s,_k+1);\n" +
534
- " }" +
535
- " return accum;\n" +
536
- "}\n" +
537
- "for(i=_n-1;i>=1;i-=2) { \n" +
538
- " xi = x[i];\n" +
539
- " " +
540
- body +
541
- ";\n" +
542
- " xi = x[i-1];\n" +
543
- " " +
544
- body +
545
- ";\n" +
546
- "}\n" +
547
- "if(i === 0) {\n" +
548
- " xi = x[i];\n" +
549
- " " +
550
- body +
551
- "\n" +
552
- "}\n" +
553
- "return accum;"
554
- );
555
- };
556
- numeric.mapreduce2 = function mapreduce2(body, setup) {
557
- return Function(
558
- "x",
559
- "var n = x.length;\n" +
560
- "var i,xi;\n" +
561
- setup +
562
- ";\n" +
563
- "for(i=n-1;i!==-1;--i) { \n" +
564
- " xi = x[i];\n" +
565
- " " +
566
- body +
567
- ";\n" +
568
- "}\n" +
569
- "return accum;"
570
- );
571
- };
572
-
573
- numeric.same = function same(x, y) {
574
- var i, n;
575
- if (!(x instanceof Array) || !(y instanceof Array)) {
576
- return false;
577
- }
578
- n = x.length;
579
- if (n !== y.length) {
580
- return false;
581
- }
582
- for (i = 0; i < n; i++) {
583
- if (x[i] === y[i]) {
584
- continue;
585
- }
586
- if (typeof x[i] === "object") {
587
- if (!same(x[i], y[i])) return false;
588
- } else {
589
- return false;
590
- }
591
- }
592
- return true;
593
- };
594
-
595
- numeric.rep = function rep(s, v, k) {
596
- if (typeof k === "undefined") {
597
- k = 0;
598
- }
599
- var n = s[k],
600
- ret = Array(n),
601
- i;
602
- if (k === s.length - 1) {
603
- for (i = n - 2; i >= 0; i -= 2) {
604
- ret[i + 1] = v;
605
- ret[i] = v;
606
- }
607
- if (i === -1) {
608
- ret[0] = v;
609
- }
610
- return ret;
611
- }
612
- for (i = n - 1; i >= 0; i--) {
613
- ret[i] = numeric.rep(s, v, k + 1);
614
- }
615
- return ret;
616
- };
617
-
618
- numeric.dotMMsmall = function dotMMsmall(x, y) {
619
- var i, j, k, p, q, r, ret, foo, bar, woo, i0, k0, p0, r0;
620
- p = x.length;
621
- q = y.length;
622
- r = y[0].length;
623
- ret = Array(p);
624
- for (i = p - 1; i >= 0; i--) {
625
- foo = Array(r);
626
- bar = x[i];
627
- for (k = r - 1; k >= 0; k--) {
628
- woo = bar[q - 1] * y[q - 1][k];
629
- for (j = q - 2; j >= 1; j -= 2) {
630
- i0 = j - 1;
631
- woo += bar[j] * y[j][k] + bar[i0] * y[i0][k];
632
- }
633
- if (j === 0) {
634
- woo += bar[0] * y[0][k];
635
- }
636
- foo[k] = woo;
637
- }
638
- ret[i] = foo;
639
- }
640
- return ret;
641
- };
642
- numeric._getCol = function _getCol(A, j, x) {
643
- var n = A.length,
644
- i;
645
- for (i = n - 1; i > 0; --i) {
646
- x[i] = A[i][j];
647
- --i;
648
- x[i] = A[i][j];
649
- }
650
- if (i === 0) x[0] = A[0][j];
651
- };
652
- numeric.dotMMbig = function dotMMbig(x, y) {
653
- var gc = numeric._getCol,
654
- p = y.length,
655
- v = Array(p);
656
- var m = x.length,
657
- n = y[0].length,
658
- A = new Array(m),
659
- xj;
660
- var VV = numeric.dotVV;
661
- var i, j, k, z;
662
- --p;
663
- --m;
664
- for (i = m; i !== -1; --i) A[i] = Array(n);
665
- --n;
666
- for (i = n; i !== -1; --i) {
667
- gc(y, i, v);
668
- for (j = m; j !== -1; --j) {
669
- z = 0;
670
- xj = x[j];
671
- A[j][i] = VV(xj, v);
672
- }
673
- }
674
- return A;
675
- };
676
-
677
- numeric.dotMV = function dotMV(x, y) {
678
- var p = x.length,
679
- q = y.length,
680
- i;
681
- var ret = Array(p),
682
- dotVV = numeric.dotVV;
683
- for (i = p - 1; i >= 0; i--) {
684
- ret[i] = dotVV(x[i], y);
685
- }
686
- return ret;
687
- };
688
-
689
- numeric.dotVM = function dotVM(x, y) {
690
- var i,
691
- j,
692
- k,
693
- p,
694
- q,
695
- r,
696
- ret,
697
- foo,
698
- bar,
699
- woo,
700
- i0,
701
- k0,
702
- p0,
703
- r0,
704
- s1,
705
- s2,
706
- s3,
707
- baz,
708
- accum;
709
- p = x.length;
710
- q = y[0].length;
711
- ret = Array(q);
712
- for (k = q - 1; k >= 0; k--) {
713
- woo = x[p - 1] * y[p - 1][k];
714
- for (j = p - 2; j >= 1; j -= 2) {
715
- i0 = j - 1;
716
- woo += x[j] * y[j][k] + x[i0] * y[i0][k];
717
- }
718
- if (j === 0) {
719
- woo += x[0] * y[0][k];
720
- }
721
- ret[k] = woo;
722
- }
723
- return ret;
724
- };
725
-
726
- numeric.dotVV = function dotVV(x, y) {
727
- var i,
728
- n = x.length,
729
- i1,
730
- ret = x[n - 1] * y[n - 1];
731
- for (i = n - 2; i >= 1; i -= 2) {
732
- i1 = i - 1;
733
- ret += x[i] * y[i] + x[i1] * y[i1];
734
- }
735
- if (i === 0) {
736
- ret += x[0] * y[0];
737
- }
738
- return ret;
739
- };
740
-
741
- numeric.dot = function dot(x, y) {
742
- var d = numeric.dim;
743
- switch (d(x).length * 1000 + d(y).length) {
744
- case 2002:
745
- if (y.length < 10) return numeric.dotMMsmall(x, y);
746
- else return numeric.dotMMbig(x, y);
747
- case 2001:
748
- return numeric.dotMV(x, y);
749
- case 1002:
750
- return numeric.dotVM(x, y);
751
- case 1001:
752
- return numeric.dotVV(x, y);
753
- case 1000:
754
- return numeric.mulVS(x, y);
755
- case 1:
756
- return numeric.mulSV(x, y);
757
- case 0:
758
- return x * y;
759
- default:
760
- throw new Error("numeric.dot only works on vectors and matrices");
761
- }
762
- };
763
-
764
- numeric.diag = function diag(d) {
765
- var i,
766
- i1,
767
- j,
768
- n = d.length,
769
- A = Array(n),
770
- Ai;
771
- for (i = n - 1; i >= 0; i--) {
772
- Ai = Array(n);
773
- i1 = i + 2;
774
- for (j = n - 1; j >= i1; j -= 2) {
775
- Ai[j] = 0;
776
- Ai[j - 1] = 0;
777
- }
778
- if (j > i) {
779
- Ai[j] = 0;
780
- }
781
- Ai[i] = d[i];
782
- for (j = i - 1; j >= 1; j -= 2) {
783
- Ai[j] = 0;
784
- Ai[j - 1] = 0;
785
- }
786
- if (j === 0) {
787
- Ai[0] = 0;
788
- }
789
- A[i] = Ai;
790
- }
791
- return A;
792
- };
793
- numeric.getDiag = function (A) {
794
- var n = Math.min(A.length, A[0].length),
795
- i,
796
- ret = Array(n);
797
- for (i = n - 1; i >= 1; --i) {
798
- ret[i] = A[i][i];
799
- --i;
800
- ret[i] = A[i][i];
801
- }
802
- if (i === 0) {
803
- ret[0] = A[0][0];
804
- }
805
- return ret;
806
- };
807
-
808
- numeric.identity = function identity(n) {
809
- return numeric.diag(numeric.rep([n], 1));
810
- };
811
- numeric.pointwise = function pointwise(params, body, setup) {
812
- if (typeof setup === "undefined") {
813
- setup = "";
814
- }
815
- var fun = [];
816
- var k;
817
- var avec = /\[i\]$/,
818
- p,
819
- thevec = "";
820
- var haveret = false;
821
- for (k = 0; k < params.length; k++) {
822
- if (avec.test(params[k])) {
823
- p = params[k].substring(0, params[k].length - 3);
824
- thevec = p;
825
- } else {
826
- p = params[k];
827
- }
828
- if (p === "ret") haveret = true;
829
- fun.push(p);
830
- }
831
- fun[params.length] = "_s";
832
- fun[params.length + 1] = "_k";
833
- fun[params.length + 2] =
834
- 'if(typeof _s === "undefined") _s = numeric.dim(' +
835
- thevec +
836
- ");\n" +
837
- 'if(typeof _k === "undefined") _k = 0;\n' +
838
- "var _n = _s[_k];\n" +
839
- "var i" +
840
- (haveret ? "" : ", ret = Array(_n)") +
841
- ";\n" +
842
- "if(_k < _s.length-1) {\n" +
843
- " for(i=_n-1;i>=0;i--) ret[i] = arguments.callee(" +
844
- params.join(",") +
845
- ",_s,_k+1);\n" +
846
- " return ret;\n" +
847
- "}\n" +
848
- setup +
849
- "\n" +
850
- "for(i=_n-1;i!==-1;--i) {\n" +
851
- " " +
852
- body +
853
- "\n" +
854
- "}\n" +
855
- "return ret;";
856
- return Function.apply(null, fun);
857
- };
858
- numeric.pointwise2 = function pointwise2(params, body, setup) {
859
- if (typeof setup === "undefined") {
860
- setup = "";
861
- }
862
- var fun = [];
863
- var k;
864
- var avec = /\[i\]$/,
865
- p,
866
- thevec = "";
867
- var haveret = false;
868
- for (k = 0; k < params.length; k++) {
869
- if (avec.test(params[k])) {
870
- p = params[k].substring(0, params[k].length - 3);
871
- thevec = p;
872
- } else {
873
- p = params[k];
874
- }
875
- if (p === "ret") haveret = true;
876
- fun.push(p);
877
- }
878
- fun[params.length] =
879
- "var _n = " +
880
- thevec +
881
- ".length;\n" +
882
- "var i" +
883
- (haveret ? "" : ", ret = Array(_n)") +
884
- ";\n" +
885
- setup +
886
- "\n" +
887
- "for(i=_n-1;i!==-1;--i) {\n" +
888
- body +
889
- "\n" +
890
- "}\n" +
891
- "return ret;";
892
- return Function.apply(null, fun);
893
- };
894
- numeric._biforeach = function _biforeach(x, y, s, k, f) {
895
- if (k === s.length - 1) {
896
- f(x, y);
897
- return;
898
- }
899
- var i,
900
- n = s[k];
901
- for (i = n - 1; i >= 0; i--) {
902
- _biforeach(
903
- typeof x === "object" ? x[i] : x,
904
- typeof y === "object" ? y[i] : y,
905
- s,
906
- k + 1,
907
- f
908
- );
909
- }
910
- };
911
- numeric._biforeach2 = function _biforeach2(x, y, s, k, f) {
912
- if (k === s.length - 1) {
913
- return f(x, y);
914
- }
915
- var i,
916
- n = s[k],
917
- ret = Array(n);
918
- for (i = n - 1; i >= 0; --i) {
919
- ret[i] = _biforeach2(
920
- typeof x === "object" ? x[i] : x,
921
- typeof y === "object" ? y[i] : y,
922
- s,
923
- k + 1,
924
- f
925
- );
926
- }
927
- return ret;
928
- };
929
- numeric._foreach = function _foreach(x, s, k, f) {
930
- if (k === s.length - 1) {
931
- f(x);
932
- return;
933
- }
934
- var i,
935
- n = s[k];
936
- for (i = n - 1; i >= 0; i--) {
937
- _foreach(x[i], s, k + 1, f);
938
- }
939
- };
940
- numeric._foreach2 = function _foreach2(x, s, k, f) {
941
- if (k === s.length - 1) {
942
- return f(x);
943
- }
944
- var i,
945
- n = s[k],
946
- ret = Array(n);
947
- for (i = n - 1; i >= 0; i--) {
948
- ret[i] = _foreach2(x[i], s, k + 1, f);
949
- }
950
- return ret;
951
- };
952
-
953
- /*numeric.anyV = numeric.mapreduce('if(xi) return true;','false');
954
- numeric.allV = numeric.mapreduce('if(!xi) return false;','true');
955
- numeric.any = function(x) { if(typeof x.length === "undefined") return x; return numeric.anyV(x); }
956
- numeric.all = function(x) { if(typeof x.length === "undefined") return x; return numeric.allV(x); }*/
957
-
958
- numeric.ops2 = {
959
- add: "+",
960
- sub: "-",
961
- mul: "*",
962
- div: "/",
963
- mod: "%",
964
- and: "&&",
965
- or: "||",
966
- eq: "===",
967
- neq: "!==",
968
- lt: "<",
969
- gt: ">",
970
- leq: "<=",
971
- geq: ">=",
972
- band: "&",
973
- bor: "|",
974
- bxor: "^",
975
- lshift: "<<",
976
- rshift: ">>",
977
- rrshift: ">>>",
978
- };
979
- numeric.opseq = {
980
- addeq: "+=",
981
- subeq: "-=",
982
- muleq: "*=",
983
- diveq: "/=",
984
- modeq: "%=",
985
- lshifteq: "<<=",
986
- rshifteq: ">>=",
987
- rrshifteq: ">>>=",
988
- bandeq: "&=",
989
- boreq: "|=",
990
- bxoreq: "^=",
991
- };
992
- numeric.mathfuns = [
993
- "abs",
994
- "acos",
995
- "asin",
996
- "atan",
997
- "ceil",
998
- "cos",
999
- "exp",
1000
- "floor",
1001
- "log",
1002
- "round",
1003
- "sin",
1004
- "sqrt",
1005
- "tan",
1006
- "isNaN",
1007
- "isFinite",
1008
- ];
1009
- numeric.mathfuns2 = ["atan2", "pow", "max", "min"];
1010
- numeric.ops1 = {
1011
- neg: "-",
1012
- not: "!",
1013
- bnot: "~",
1014
- clone: "",
1015
- };
1016
- numeric.mapreducers = {
1017
- any: ["if(xi) return true;", "var accum = false;"],
1018
- all: ["if(!xi) return false;", "var accum = true;"],
1019
- sum: ["accum += xi;", "var accum = 0;"],
1020
- prod: ["accum *= xi;", "var accum = 1;"],
1021
- norm2Squared: ["accum += xi*xi;", "var accum = 0;"],
1022
- norminf: [
1023
- "accum = max(accum,abs(xi));",
1024
- "var accum = 0, max = Math.max, abs = Math.abs;",
1025
- ],
1026
- norm1: ["accum += abs(xi)", "var accum = 0, abs = Math.abs;"],
1027
- sup: ["accum = max(accum,xi);", "var accum = -Infinity, max = Math.max;"],
1028
- inf: ["accum = min(accum,xi);", "var accum = Infinity, min = Math.min;"],
1029
- };
1030
-
1031
- (function () {
1032
- var i, o;
1033
- for (i = 0; i < numeric.mathfuns2.length; ++i) {
1034
- o = numeric.mathfuns2[i];
1035
- numeric.ops2[o] = o;
1036
- }
1037
- for (i in numeric.ops2) {
1038
- if (numeric.ops2.hasOwnProperty(i)) {
1039
- o = numeric.ops2[i];
1040
- var code,
1041
- codeeq,
1042
- setup = "";
1043
- if (numeric.myIndexOf.call(numeric.mathfuns2, i) !== -1) {
1044
- setup = "var " + o + " = Math." + o + ";\n";
1045
- code = function (r, x, y) {
1046
- return r + " = " + o + "(" + x + "," + y + ")";
1047
- };
1048
- codeeq = function (x, y) {
1049
- return x + " = " + o + "(" + x + "," + y + ")";
1050
- };
1051
- } else {
1052
- code = function (r, x, y) {
1053
- return r + " = " + x + " " + o + " " + y;
1054
- };
1055
- if (numeric.opseq.hasOwnProperty(i + "eq")) {
1056
- codeeq = function (x, y) {
1057
- return x + " " + o + "= " + y;
1058
- };
1059
- } else {
1060
- codeeq = function (x, y) {
1061
- return x + " = " + x + " " + o + " " + y;
1062
- };
1063
- }
1064
- }
1065
- numeric[i + "VV"] = numeric.pointwise2(
1066
- ["x[i]", "y[i]"],
1067
- code("ret[i]", "x[i]", "y[i]"),
1068
- setup
1069
- );
1070
- numeric[i + "SV"] = numeric.pointwise2(
1071
- ["x", "y[i]"],
1072
- code("ret[i]", "x", "y[i]"),
1073
- setup
1074
- );
1075
- numeric[i + "VS"] = numeric.pointwise2(
1076
- ["x[i]", "y"],
1077
- code("ret[i]", "x[i]", "y"),
1078
- setup
1079
- );
1080
- numeric[i] = Function(
1081
- "var n = arguments.length, i, x = arguments[0], y;\n" +
1082
- "var VV = numeric." +
1083
- i +
1084
- "VV, VS = numeric." +
1085
- i +
1086
- "VS, SV = numeric." +
1087
- i +
1088
- "SV;\n" +
1089
- "var dim = numeric.dim;\n" +
1090
- "for(i=1;i!==n;++i) { \n" +
1091
- " y = arguments[i];\n" +
1092
- ' if(typeof x === "object") {\n' +
1093
- ' if(typeof y === "object") x = numeric._biforeach2(x,y,dim(x),0,VV);\n' +
1094
- " else x = numeric._biforeach2(x,y,dim(x),0,VS);\n" +
1095
- ' } else if(typeof y === "object") x = numeric._biforeach2(x,y,dim(y),0,SV);\n' +
1096
- " else " +
1097
- codeeq("x", "y") +
1098
- "\n" +
1099
- "}\nreturn x;\n"
1100
- );
1101
- numeric[o] = numeric[i];
1102
- numeric[i + "eqV"] = numeric.pointwise2(
1103
- ["ret[i]", "x[i]"],
1104
- codeeq("ret[i]", "x[i]"),
1105
- setup
1106
- );
1107
- numeric[i + "eqS"] = numeric.pointwise2(
1108
- ["ret[i]", "x"],
1109
- codeeq("ret[i]", "x"),
1110
- setup
1111
- );
1112
- numeric[i + "eq"] = Function(
1113
- "var n = arguments.length, i, x = arguments[0], y;\n" +
1114
- "var V = numeric." +
1115
- i +
1116
- "eqV, S = numeric." +
1117
- i +
1118
- "eqS\n" +
1119
- "var s = numeric.dim(x);\n" +
1120
- "for(i=1;i!==n;++i) { \n" +
1121
- " y = arguments[i];\n" +
1122
- ' if(typeof y === "object") numeric._biforeach(x,y,s,0,V);\n' +
1123
- " else numeric._biforeach(x,y,s,0,S);\n" +
1124
- "}\nreturn x;\n"
1125
- );
1126
- }
1127
- }
1128
- for (i = 0; i < numeric.mathfuns2.length; ++i) {
1129
- o = numeric.mathfuns2[i];
1130
- delete numeric.ops2[o];
1131
- }
1132
- for (i = 0; i < numeric.mathfuns.length; ++i) {
1133
- o = numeric.mathfuns[i];
1134
- numeric.ops1[o] = o;
1135
- }
1136
- for (i in numeric.ops1) {
1137
- if (numeric.ops1.hasOwnProperty(i)) {
1138
- setup = "";
1139
- o = numeric.ops1[i];
1140
- if (numeric.myIndexOf.call(numeric.mathfuns, i) !== -1) {
1141
- if (Math.hasOwnProperty(o))
1142
- setup = "var " + o + " = Math." + o + ";\n";
1143
- }
1144
- numeric[i + "eqV"] = numeric.pointwise2(
1145
- ["ret[i]"],
1146
- "ret[i] = " + o + "(ret[i]);",
1147
- setup
1148
- );
1149
- numeric[i + "eq"] = Function(
1150
- "x",
1151
- 'if(typeof x !== "object") return ' +
1152
- o +
1153
- "x\n" +
1154
- "var i;\n" +
1155
- "var V = numeric." +
1156
- i +
1157
- "eqV;\n" +
1158
- "var s = numeric.dim(x);\n" +
1159
- "numeric._foreach(x,s,0,V);\n" +
1160
- "return x;\n"
1161
- );
1162
- numeric[i + "V"] = numeric.pointwise2(
1163
- ["x[i]"],
1164
- "ret[i] = " + o + "(x[i]);",
1165
- setup
1166
- );
1167
- numeric[i] = Function(
1168
- "x",
1169
- 'if(typeof x !== "object") return ' +
1170
- o +
1171
- "(x)\n" +
1172
- "var i;\n" +
1173
- "var V = numeric." +
1174
- i +
1175
- "V;\n" +
1176
- "var s = numeric.dim(x);\n" +
1177
- "return numeric._foreach2(x,s,0,V);\n"
1178
- );
1179
- }
1180
- }
1181
- for (i = 0; i < numeric.mathfuns.length; ++i) {
1182
- o = numeric.mathfuns[i];
1183
- delete numeric.ops1[o];
1184
- }
1185
- for (i in numeric.mapreducers) {
1186
- if (numeric.mapreducers.hasOwnProperty(i)) {
1187
- o = numeric.mapreducers[i];
1188
- numeric[i + "V"] = numeric.mapreduce2(o[0], o[1]);
1189
- numeric[i] = Function(
1190
- "x",
1191
- "s",
1192
- "k",
1193
- o[1] +
1194
- 'if(typeof x !== "object") {' +
1195
- " xi = x;\n" +
1196
- o[0] +
1197
- ";\n" +
1198
- " return accum;\n" +
1199
- "}" +
1200
- 'if(typeof s === "undefined") s = numeric.dim(x);\n' +
1201
- 'if(typeof k === "undefined") k = 0;\n' +
1202
- "if(k === s.length-1) return numeric." +
1203
- i +
1204
- "V(x);\n" +
1205
- "var xi;\n" +
1206
- "var n = x.length, i;\n" +
1207
- "for(i=n-1;i!==-1;--i) {\n" +
1208
- " xi = arguments.callee(x[i]);\n" +
1209
- o[0] +
1210
- ";\n" +
1211
- "}\n" +
1212
- "return accum;\n"
1213
- );
1214
- }
1215
- }
1216
- })();
1217
-
1218
- numeric.truncVV = numeric.pointwise(
1219
- ["x[i]", "y[i]"],
1220
- "ret[i] = round(x[i]/y[i])*y[i];",
1221
- "var round = Math.round;"
1222
- );
1223
- numeric.truncVS = numeric.pointwise(
1224
- ["x[i]", "y"],
1225
- "ret[i] = round(x[i]/y)*y;",
1226
- "var round = Math.round;"
1227
- );
1228
- numeric.truncSV = numeric.pointwise(
1229
- ["x", "y[i]"],
1230
- "ret[i] = round(x/y[i])*y[i];",
1231
- "var round = Math.round;"
1232
- );
1233
- numeric.trunc = function trunc(x, y) {
1234
- if (typeof x === "object") {
1235
- if (typeof y === "object") return numeric.truncVV(x, y);
1236
- return numeric.truncVS(x, y);
1237
- }
1238
- if (typeof y === "object") return numeric.truncSV(x, y);
1239
- return Math.round(x / y) * y;
1240
- };
1241
-
1242
- numeric.inv = function inv(x) {
1243
- var s = numeric.dim(x),
1244
- abs = Math.abs,
1245
- m = s[0],
1246
- n = s[1];
1247
- var A = numeric.clone(x),
1248
- Ai,
1249
- Aj;
1250
- var I = numeric.identity(m),
1251
- Ii,
1252
- Ij;
1253
- var i, j, k, x;
1254
- for (j = 0; j < n; ++j) {
1255
- var i0 = -1;
1256
- var v0 = -1;
1257
- for (i = j; i !== m; ++i) {
1258
- k = abs(A[i][j]);
1259
- if (k > v0) {
1260
- i0 = i;
1261
- v0 = k;
1262
- }
1263
- }
1264
- console.log("swap rows", i0, j);
1265
- console.log("pre", A);
1266
- Aj = A[i0];
1267
- A[i0] = A[j];
1268
- A[j] = Aj;
1269
- console.log("post", A);
1270
- Ij = I[i0];
1271
- I[i0] = I[j];
1272
- I[j] = Ij;
1273
- x = Aj[j];
1274
- console.log("Aj[j]", x);
1275
- for (k = j; k !== n; ++k) Aj[k] /= x;
1276
- for (k = n - 1; k !== -1; --k) Ij[k] /= x;
1277
- console.log("post mulNS", A);
1278
- for (i = m - 1; i !== -1; --i) {
1279
- if (i !== j) {
1280
- Ai = A[i];
1281
- Ii = I[i];
1282
- x = Ai[j];
1283
- console.log(i, j, x);
1284
- for (k = j + 1; k !== n; ++k) Ai[k] -= Aj[k] * x;
1285
- for (k = n - 1; k > 0; --k) {
1286
- Ii[k] -= Ij[k] * x;
1287
- --k;
1288
- Ii[k] -= Ij[k] * x;
1289
- }
1290
- if (k === 0) Ii[0] -= Ij[0] * x;
1291
- }
1292
- }
1293
- }
1294
- return I;
1295
- };
1296
-
1297
- numeric.det = function det(x) {
1298
- var s = numeric.dim(x);
1299
- if (s.length !== 2 || s[0] !== s[1]) {
1300
- throw new Error("numeric: det() only works on square matrices");
1301
- }
1302
- var n = s[0],
1303
- ret = 1,
1304
- i,
1305
- j,
1306
- k,
1307
- A = numeric.clone(x),
1308
- Aj,
1309
- Ai,
1310
- alpha,
1311
- temp,
1312
- k1,
1313
- k2,
1314
- k3;
1315
- for (j = 0; j < n - 1; j++) {
1316
- k = j;
1317
- for (i = j + 1; i < n; i++) {
1318
- if (Math.abs(A[i][j]) > Math.abs(A[k][j])) {
1319
- k = i;
1320
- }
1321
- }
1322
- if (k !== j) {
1323
- temp = A[k];
1324
- A[k] = A[j];
1325
- A[j] = temp;
1326
- ret *= -1;
1327
- }
1328
- Aj = A[j];
1329
- for (i = j + 1; i < n; i++) {
1330
- Ai = A[i];
1331
- alpha = Ai[j] / Aj[j];
1332
- for (k = j + 1; k < n - 1; k += 2) {
1333
- k1 = k + 1;
1334
- Ai[k] -= Aj[k] * alpha;
1335
- Ai[k1] -= Aj[k1] * alpha;
1336
- }
1337
- if (k !== n) {
1338
- Ai[k] -= Aj[k] * alpha;
1339
- }
1340
- }
1341
- if (Aj[j] === 0) {
1342
- return 0;
1343
- }
1344
- ret *= Aj[j];
1345
- }
1346
- return ret * A[j][j];
1347
- };
1348
-
1349
- numeric.transpose = function transpose(x) {
1350
- var i,
1351
- j,
1352
- m = x.length,
1353
- n = x[0].length,
1354
- ret = Array(n),
1355
- A0,
1356
- A1,
1357
- Bj;
1358
- for (j = 0; j < n; j++) ret[j] = Array(m);
1359
- for (i = m - 1; i >= 1; i -= 2) {
1360
- A1 = x[i];
1361
- A0 = x[i - 1];
1362
- for (j = n - 1; j >= 1; --j) {
1363
- Bj = ret[j];
1364
- Bj[i] = A1[j];
1365
- Bj[i - 1] = A0[j];
1366
- --j;
1367
- Bj = ret[j];
1368
- Bj[i] = A1[j];
1369
- Bj[i - 1] = A0[j];
1370
- }
1371
- if (j === 0) {
1372
- Bj = ret[0];
1373
- Bj[i] = A1[0];
1374
- Bj[i - 1] = A0[0];
1375
- }
1376
- }
1377
- if (i === 0) {
1378
- A0 = x[0];
1379
- for (j = n - 1; j >= 1; --j) {
1380
- ret[j][0] = A0[j];
1381
- --j;
1382
- ret[j][0] = A0[j];
1383
- }
1384
- if (j === 0) {
1385
- ret[0][0] = A0[0];
1386
- }
1387
- }
1388
- return ret;
1389
- };
1390
- numeric.negtranspose = function negtranspose(x) {
1391
- var i,
1392
- j,
1393
- m = x.length,
1394
- n = x[0].length,
1395
- ret = Array(n),
1396
- A0,
1397
- A1,
1398
- Bj;
1399
- for (j = 0; j < n; j++) ret[j] = Array(m);
1400
- for (i = m - 1; i >= 1; i -= 2) {
1401
- A1 = x[i];
1402
- A0 = x[i - 1];
1403
- for (j = n - 1; j >= 1; --j) {
1404
- Bj = ret[j];
1405
- Bj[i] = -A1[j];
1406
- Bj[i - 1] = -A0[j];
1407
- --j;
1408
- Bj = ret[j];
1409
- Bj[i] = -A1[j];
1410
- Bj[i - 1] = -A0[j];
1411
- }
1412
- if (j === 0) {
1413
- Bj = ret[0];
1414
- Bj[i] = -A1[0];
1415
- Bj[i - 1] = -A0[0];
1416
- }
1417
- }
1418
- if (i === 0) {
1419
- A0 = x[0];
1420
- for (j = n - 1; j >= 1; --j) {
1421
- ret[j][0] = -A0[j];
1422
- --j;
1423
- ret[j][0] = -A0[j];
1424
- }
1425
- if (j === 0) {
1426
- ret[0][0] = -A0[0];
1427
- }
1428
- }
1429
- return ret;
1430
- };
1431
-
1432
- numeric._random = function _random(s, k) {
1433
- var i,
1434
- n = s[k],
1435
- ret = Array(n),
1436
- rnd;
1437
- if (k === s.length - 1) {
1438
- rnd = Math.random;
1439
- for (i = n - 1; i >= 1; i -= 2) {
1440
- ret[i] = rnd();
1441
- ret[i - 1] = rnd();
1442
- }
1443
- if (i === 0) {
1444
- ret[0] = rnd();
1445
- }
1446
- return ret;
1447
- }
1448
- for (i = n - 1; i >= 0; i--) ret[i] = _random(s, k + 1);
1449
- return ret;
1450
- };
1451
- numeric.random = function random(s) {
1452
- return numeric._random(s, 0);
1453
- };
1454
-
1455
- numeric.norm2 = function norm2(x) {
1456
- return Math.sqrt(numeric.norm2Squared(x));
1457
- };
1458
-
1459
- numeric.linspace = function linspace(a, b, n) {
1460
- if (typeof n === "undefined") n = Math.max(Math.round(b - a) + 1, 1);
1461
- if (n < 2) {
1462
- return n === 1 ? [a] : [];
1463
- }
1464
- var i,
1465
- ret = Array(n);
1466
- n--;
1467
- for (i = n; i >= 0; i--) {
1468
- ret[i] = (i * b + (n - i) * a) / n;
1469
- }
1470
- return ret;
1471
- };
1472
-
1473
- numeric.getBlock = function getBlock(x, from, to) {
1474
- var s = numeric.dim(x);
1475
- function foo(x, k) {
1476
- var i,
1477
- a = from[k],
1478
- n = to[k] - a,
1479
- ret = Array(n);
1480
- if (k === s.length - 1) {
1481
- for (i = n; i >= 0; i--) {
1482
- ret[i] = x[i + a];
1483
- }
1484
- return ret;
1485
- }
1486
- for (i = n; i >= 0; i--) {
1487
- ret[i] = foo(x[i + a], k + 1);
1488
- }
1489
- return ret;
1490
- }
1491
- return foo(x, 0);
1492
- };
1493
-
1494
- numeric.setBlock = function setBlock(x, from, to, B) {
1495
- var s = numeric.dim(x);
1496
- function foo(x, y, k) {
1497
- var i,
1498
- a = from[k],
1499
- n = to[k] - a;
1500
- if (k === s.length - 1) {
1501
- for (i = n; i >= 0; i--) {
1502
- x[i + a] = y[i];
1503
- }
1504
- }
1505
- for (i = n; i >= 0; i--) {
1506
- foo(x[i + a], y[i], k + 1);
1507
- }
1508
- }
1509
- foo(x, B, 0);
1510
- return x;
1511
- };
1512
-
1513
- numeric.getRange = function getRange(A, I, J) {
1514
- var m = I.length,
1515
- n = J.length;
1516
- var i, j;
1517
- var B = Array(m),
1518
- Bi,
1519
- AI;
1520
- for (i = m - 1; i !== -1; --i) {
1521
- B[i] = Array(n);
1522
- Bi = B[i];
1523
- AI = A[I[i]];
1524
- for (j = n - 1; j !== -1; --j) Bi[j] = AI[J[j]];
1525
- }
1526
- return B;
1527
- };
1528
-
1529
- numeric.blockMatrix = function blockMatrix(X) {
1530
- var s = numeric.dim(X);
1531
- if (s.length < 4) return numeric.blockMatrix([X]);
1532
- var m = s[0],
1533
- n = s[1],
1534
- M,
1535
- N,
1536
- i,
1537
- j,
1538
- Xij;
1539
- M = 0;
1540
- N = 0;
1541
- for (i = 0; i < m; ++i) M += X[i][0].length;
1542
- for (j = 0; j < n; ++j) N += X[0][j][0].length;
1543
- var Z = Array(M);
1544
- for (i = 0; i < M; ++i) Z[i] = Array(N);
1545
- var I = 0,
1546
- J,
1547
- ZI,
1548
- k,
1549
- l,
1550
- Xijk;
1551
- for (i = 0; i < m; ++i) {
1552
- J = N;
1553
- for (j = n - 1; j !== -1; --j) {
1554
- Xij = X[i][j];
1555
- J -= Xij[0].length;
1556
- for (k = Xij.length - 1; k !== -1; --k) {
1557
- Xijk = Xij[k];
1558
- ZI = Z[I + k];
1559
- for (l = Xijk.length - 1; l !== -1; --l) ZI[J + l] = Xijk[l];
1560
- }
1561
- }
1562
- I += X[i][0].length;
1563
- }
1564
- return Z;
1565
- };
1566
-
1567
- numeric.tensor = function tensor(x, y) {
1568
- if (typeof x === "number" || typeof y === "number")
1569
- return numeric.mul(x, y);
1570
- var s1 = numeric.dim(x),
1571
- s2 = numeric.dim(y);
1572
- if (s1.length !== 1 || s2.length !== 1) {
1573
- throw new Error("numeric: tensor product is only defined for vectors");
1574
- }
1575
- var m = s1[0],
1576
- n = s2[0],
1577
- A = Array(m),
1578
- Ai,
1579
- i,
1580
- j,
1581
- xi;
1582
- for (i = m - 1; i >= 0; i--) {
1583
- Ai = Array(n);
1584
- xi = x[i];
1585
- for (j = n - 1; j >= 3; --j) {
1586
- Ai[j] = xi * y[j];
1587
- --j;
1588
- Ai[j] = xi * y[j];
1589
- --j;
1590
- Ai[j] = xi * y[j];
1591
- --j;
1592
- Ai[j] = xi * y[j];
1593
- }
1594
- while (j >= 0) {
1595
- Ai[j] = xi * y[j];
1596
- --j;
1597
- }
1598
- A[i] = Ai;
1599
- }
1600
- return A;
1601
- };
1602
-
1603
- // 3. The Tensor type T
1604
- numeric.T = function T(x, y) {
1605
- this.x = x;
1606
- this.y = y;
1607
- };
1608
- numeric.t = function t(x, y) {
1609
- return new numeric.T(x, y);
1610
- };
1611
-
1612
- numeric.Tbinop = function Tbinop(rr, rc, cr, cc, setup) {
1613
- var io = numeric.indexOf;
1614
- if (typeof setup !== "string") {
1615
- var k;
1616
- setup = "";
1617
- for (k in numeric) {
1618
- if (
1619
- numeric.hasOwnProperty(k) &&
1620
- (rr.indexOf(k) >= 0 ||
1621
- rc.indexOf(k) >= 0 ||
1622
- cr.indexOf(k) >= 0 ||
1623
- cc.indexOf(k) >= 0) &&
1624
- k.length > 1
1625
- ) {
1626
- setup += "var " + k + " = numeric." + k + ";\n";
1627
- }
1628
- }
1629
- }
1630
- return Function(
1631
- ["y"],
1632
- "var x = this;\n" +
1633
- "if(!(y instanceof numeric.T)) { y = new numeric.T(y); }\n" +
1634
- setup +
1635
- "\n" +
1636
- "if(x.y) {" +
1637
- " if(y.y) {" +
1638
- " return new numeric.T(" +
1639
- cc +
1640
- ");\n" +
1641
- " }\n" +
1642
- " return new numeric.T(" +
1643
- cr +
1644
- ");\n" +
1645
- "}\n" +
1646
- "if(y.y) {\n" +
1647
- " return new numeric.T(" +
1648
- rc +
1649
- ");\n" +
1650
- "}\n" +
1651
- "return new numeric.T(" +
1652
- rr +
1653
- ");\n"
1654
- );
1655
- };
1656
-
1657
- numeric.T.prototype.add = numeric.Tbinop(
1658
- "add(x.x,y.x)",
1659
- "add(x.x,y.x),y.y",
1660
- "add(x.x,y.x),x.y",
1661
- "add(x.x,y.x),add(x.y,y.y)"
1662
- );
1663
- numeric.T.prototype.sub = numeric.Tbinop(
1664
- "sub(x.x,y.x)",
1665
- "sub(x.x,y.x),neg(y.y)",
1666
- "sub(x.x,y.x),x.y",
1667
- "sub(x.x,y.x),sub(x.y,y.y)"
1668
- );
1669
- numeric.T.prototype.mul = numeric.Tbinop(
1670
- "mul(x.x,y.x)",
1671
- "mul(x.x,y.x),mul(x.x,y.y)",
1672
- "mul(x.x,y.x),mul(x.y,y.x)",
1673
- "sub(mul(x.x,y.x),mul(x.y,y.y)),add(mul(x.x,y.y),mul(x.y,y.x))"
1674
- );
1675
-
1676
- numeric.T.prototype.reciprocal = function reciprocal() {
1677
- var mul = numeric.mul,
1678
- div = numeric.div;
1679
- if (this.y) {
1680
- var d = numeric.add(mul(this.x, this.x), mul(this.y, this.y));
1681
- return new numeric.T(div(this.x, d), div(numeric.neg(this.y), d));
1682
- }
1683
- return new T(div(1, this.x));
1684
- };
1685
- numeric.T.prototype.div = function div(y) {
1686
- if (!(y instanceof numeric.T)) y = new numeric.T(y);
1687
- if (y.y) {
1688
- return this.mul(y.reciprocal());
1689
- }
1690
- var div = numeric.div;
1691
- if (this.y) {
1692
- return new numeric.T(div(this.x, y.x), div(this.y, y.x));
1693
- }
1694
- return new numeric.T(div(this.x, y.x));
1695
- };
1696
- numeric.T.prototype.dot = numeric.Tbinop(
1697
- "dot(x.x,y.x)",
1698
- "dot(x.x,y.x),dot(x.x,y.y)",
1699
- "dot(x.x,y.x),dot(x.y,y.x)",
1700
- "sub(dot(x.x,y.x),dot(x.y,y.y)),add(dot(x.x,y.y),dot(x.y,y.x))"
1701
- );
1702
- numeric.T.prototype.transpose = function transpose() {
1703
- var t = numeric.transpose,
1704
- x = this.x,
1705
- y = this.y;
1706
- if (y) {
1707
- return new numeric.T(t(x), t(y));
1708
- }
1709
- return new numeric.T(t(x));
1710
- };
1711
- numeric.T.prototype.transjugate = function transjugate() {
1712
- var t = numeric.transpose,
1713
- x = this.x,
1714
- y = this.y;
1715
- if (y) {
1716
- return new numeric.T(t(x), numeric.negtranspose(y));
1717
- }
1718
- return new numeric.T(t(x));
1719
- };
1720
- numeric.Tunop = function Tunop(r, c, s) {
1721
- if (typeof s !== "string") {
1722
- s = "";
1723
- }
1724
- return Function(
1725
- "var x = this;\n" +
1726
- s +
1727
- "\n" +
1728
- "if(x.y) {" +
1729
- " " +
1730
- c +
1731
- ";\n" +
1732
- "}\n" +
1733
- r +
1734
- ";\n"
1735
- );
1736
- };
1737
-
1738
- numeric.T.prototype.exp = numeric.Tunop(
1739
- "return new numeric.T(ex)",
1740
- "return new numeric.T(mul(cos(x.y),ex),mul(sin(x.y),ex))",
1741
- "var ex = numeric.exp(x.x), cos = numeric.cos, sin = numeric.sin, mul = numeric.mul;"
1742
- );
1743
- numeric.T.prototype.conj = numeric.Tunop(
1744
- "return new numeric.T(x.x);",
1745
- "return new numeric.T(x.x,numeric.neg(x.y));"
1746
- );
1747
- numeric.T.prototype.neg = numeric.Tunop(
1748
- "return new numeric.T(neg(x.x));",
1749
- "return new numeric.T(neg(x.x),neg(x.y));",
1750
- "var neg = numeric.neg;"
1751
- );
1752
- numeric.T.prototype.sin = numeric.Tunop(
1753
- "return new numeric.T(numeric.sin(x.x))",
1754
- "return x.exp().sub(x.neg().exp()).div(new numeric.T(0,2));"
1755
- );
1756
- numeric.T.prototype.cos = numeric.Tunop(
1757
- "return new numeric.T(numeric.cos(x.x))",
1758
- "return x.exp().add(x.neg().exp()).div(2);"
1759
- );
1760
- numeric.T.prototype.abs = numeric.Tunop(
1761
- "return new numeric.T(numeric.abs(x.x));",
1762
- "return new numeric.T(numeric.sqrt(numeric.add(mul(x.x,x.x),mul(x.y,x.y))));",
1763
- "var mul = numeric.mul;"
1764
- );
1765
- numeric.T.prototype.log = numeric.Tunop(
1766
- "return new numeric.T(numeric.log(x.x));",
1767
- "var theta = new numeric.T(numeric.atan2(x.y,x.x)), r = x.abs();\n" +
1768
- "return new numeric.T(numeric.log(r.x),theta.x);"
1769
- );
1770
- numeric.T.prototype.norm2 = numeric.Tunop(
1771
- "return numeric.norm2(x.x);",
1772
- "var f = numeric.norm2Squared;\n" + "return Math.sqrt(f(x.x)+f(x.y));"
1773
- );
1774
- numeric.T.prototype.inv = function inv() {
1775
- var A = this;
1776
- if (typeof A.y === "undefined") {
1777
- return new numeric.T(numeric.inv(A.x));
1778
- }
1779
- var n = A.x.length,
1780
- i,
1781
- j,
1782
- k;
1783
- var Rx = numeric.identity(n),
1784
- Ry = numeric.rep([n, n], 0);
1785
- var Ax = numeric.clone(A.x),
1786
- Ay = numeric.clone(A.y);
1787
- var Aix, Aiy, Ajx, Ajy, Rix, Riy, Rjx, Rjy;
1788
- var i, j, k, d, d1, ax, ay, bx, by, temp;
1789
- for (i = 0; i < n; i++) {
1790
- ax = Ax[i][i];
1791
- ay = Ay[i][i];
1792
- d = ax * ax + ay * ay;
1793
- k = i;
1794
- for (j = i + 1; j < n; j++) {
1795
- ax = Ax[j][i];
1796
- ay = Ay[j][i];
1797
- d1 = ax * ax + ay * ay;
1798
- if (d1 > d) {
1799
- k = j;
1800
- d = d1;
1801
- }
1802
- }
1803
- if (k !== i) {
1804
- temp = Ax[i];
1805
- Ax[i] = Ax[k];
1806
- Ax[k] = temp;
1807
- temp = Ay[i];
1808
- Ay[i] = Ay[k];
1809
- Ay[k] = temp;
1810
- temp = Rx[i];
1811
- Rx[i] = Rx[k];
1812
- Rx[k] = temp;
1813
- temp = Ry[i];
1814
- Ry[i] = Ry[k];
1815
- Ry[k] = temp;
1816
- }
1817
- Aix = Ax[i];
1818
- Aiy = Ay[i];
1819
- Rix = Rx[i];
1820
- Riy = Ry[i];
1821
- ax = Aix[i];
1822
- ay = Aiy[i];
1823
- for (j = i + 1; j < n; j++) {
1824
- bx = Aix[j];
1825
- by = Aiy[j];
1826
- Aix[j] = (bx * ax + by * ay) / d;
1827
- Aiy[j] = (by * ax - bx * ay) / d;
1828
- }
1829
- for (j = 0; j < n; j++) {
1830
- bx = Rix[j];
1831
- by = Riy[j];
1832
- Rix[j] = (bx * ax + by * ay) / d;
1833
- Riy[j] = (by * ax - bx * ay) / d;
1834
- }
1835
- for (j = i + 1; j < n; j++) {
1836
- Ajx = Ax[j];
1837
- Ajy = Ay[j];
1838
- Rjx = Rx[j];
1839
- Rjy = Ry[j];
1840
- ax = Ajx[i];
1841
- ay = Ajy[i];
1842
- for (k = i + 1; k < n; k++) {
1843
- bx = Aix[k];
1844
- by = Aiy[k];
1845
- Ajx[k] -= bx * ax - by * ay;
1846
- Ajy[k] -= by * ax + bx * ay;
1847
- }
1848
- for (k = 0; k < n; k++) {
1849
- bx = Rix[k];
1850
- by = Riy[k];
1851
- Rjx[k] -= bx * ax - by * ay;
1852
- Rjy[k] -= by * ax + bx * ay;
1853
- }
1854
- }
1855
- }
1856
- for (i = n - 1; i > 0; i--) {
1857
- Rix = Rx[i];
1858
- Riy = Ry[i];
1859
- for (j = i - 1; j >= 0; j--) {
1860
- Rjx = Rx[j];
1861
- Rjy = Ry[j];
1862
- ax = Ax[j][i];
1863
- ay = Ay[j][i];
1864
- for (k = n - 1; k >= 0; k--) {
1865
- bx = Rix[k];
1866
- by = Riy[k];
1867
- Rjx[k] -= ax * bx - ay * by;
1868
- Rjy[k] -= ax * by + ay * bx;
1869
- }
1870
- }
1871
- }
1872
- return new numeric.T(Rx, Ry);
1873
- };
1874
- numeric.T.prototype.get = function get(i) {
1875
- var x = this.x,
1876
- y = this.y,
1877
- k = 0,
1878
- ik,
1879
- n = i.length;
1880
- if (y) {
1881
- while (k < n) {
1882
- ik = i[k];
1883
- x = x[ik];
1884
- y = y[ik];
1885
- k++;
1886
- }
1887
- return new numeric.T(x, y);
1888
- }
1889
- while (k < n) {
1890
- ik = i[k];
1891
- x = x[ik];
1892
- k++;
1893
- }
1894
- return new numeric.T(x);
1895
- };
1896
- numeric.T.prototype.set = function set(i, v) {
1897
- var x = this.x,
1898
- y = this.y,
1899
- k = 0,
1900
- ik,
1901
- n = i.length,
1902
- vx = v.x,
1903
- vy = v.y;
1904
- if (n === 0) {
1905
- if (vy) {
1906
- this.y = vy;
1907
- } else if (y) {
1908
- this.y = undefined;
1909
- }
1910
- this.x = x;
1911
- return this;
1912
- }
1913
- if (vy) {
1914
- if (y) {
1915
- /* ok */
1916
- } else {
1917
- y = numeric.rep(numeric.dim(x), 0);
1918
- this.y = y;
1919
- }
1920
- while (k < n - 1) {
1921
- ik = i[k];
1922
- x = x[ik];
1923
- y = y[ik];
1924
- k++;
1925
- }
1926
- ik = i[k];
1927
- x[ik] = vx;
1928
- y[ik] = vy;
1929
- return this;
1930
- }
1931
- if (y) {
1932
- while (k < n - 1) {
1933
- ik = i[k];
1934
- x = x[ik];
1935
- y = y[ik];
1936
- k++;
1937
- }
1938
- ik = i[k];
1939
- x[ik] = vx;
1940
- if (vx instanceof Array) y[ik] = numeric.rep(numeric.dim(vx), 0);
1941
- else y[ik] = 0;
1942
- return this;
1943
- }
1944
- while (k < n - 1) {
1945
- ik = i[k];
1946
- x = x[ik];
1947
- k++;
1948
- }
1949
- ik = i[k];
1950
- x[ik] = vx;
1951
- return this;
1952
- };
1953
- numeric.T.prototype.getRows = function getRows(i0, i1) {
1954
- var n = i1 - i0 + 1,
1955
- j;
1956
- var rx = Array(n),
1957
- ry,
1958
- x = this.x,
1959
- y = this.y;
1960
- for (j = i0; j <= i1; j++) {
1961
- rx[j - i0] = x[j];
1962
- }
1963
- if (y) {
1964
- ry = Array(n);
1965
- for (j = i0; j <= i1; j++) {
1966
- ry[j - i0] = y[j];
1967
- }
1968
- return new numeric.T(rx, ry);
1969
- }
1970
- return new numeric.T(rx);
1971
- };
1972
- numeric.T.prototype.setRows = function setRows(i0, i1, A) {
1973
- var j;
1974
- var rx = this.x,
1975
- ry = this.y,
1976
- x = A.x,
1977
- y = A.y;
1978
- for (j = i0; j <= i1; j++) {
1979
- rx[j] = x[j - i0];
1980
- }
1981
- if (y) {
1982
- if (!ry) {
1983
- ry = numeric.rep(numeric.dim(rx), 0);
1984
- this.y = ry;
1985
- }
1986
- for (j = i0; j <= i1; j++) {
1987
- ry[j] = y[j - i0];
1988
- }
1989
- } else if (ry) {
1990
- for (j = i0; j <= i1; j++) {
1991
- ry[j] = numeric.rep([x[j - i0].length], 0);
1992
- }
1993
- }
1994
- return this;
1995
- };
1996
- numeric.T.prototype.getRow = function getRow(k) {
1997
- var x = this.x,
1998
- y = this.y;
1999
- if (y) {
2000
- return new numeric.T(x[k], y[k]);
2001
- }
2002
- return new numeric.T(x[k]);
2003
- };
2004
- numeric.T.prototype.setRow = function setRow(i, v) {
2005
- var rx = this.x,
2006
- ry = this.y,
2007
- x = v.x,
2008
- y = v.y;
2009
- rx[i] = x;
2010
- if (y) {
2011
- if (!ry) {
2012
- ry = numeric.rep(numeric.dim(rx), 0);
2013
- this.y = ry;
2014
- }
2015
- ry[i] = y;
2016
- } else if (ry) {
2017
- ry = numeric.rep([x.length], 0);
2018
- }
2019
- return this;
2020
- };
2021
-
2022
- numeric.T.prototype.getBlock = function getBlock(from, to) {
2023
- var x = this.x,
2024
- y = this.y,
2025
- b = numeric.getBlock;
2026
- if (y) {
2027
- return new numeric.T(b(x, from, to), b(y, from, to));
2028
- }
2029
- return new numeric.T(b(x, from, to));
2030
- };
2031
- numeric.T.prototype.setBlock = function setBlock(from, to, A) {
2032
- if (!(A instanceof numeric.T)) A = new numeric.T(A);
2033
- var x = this.x,
2034
- y = this.y,
2035
- b = numeric.setBlock,
2036
- Ax = A.x,
2037
- Ay = A.y;
2038
- if (Ay) {
2039
- if (!y) {
2040
- this.y = numeric.rep(numeric.dim(this), 0);
2041
- y = this.y;
2042
- }
2043
- b(x, from, to, Ax);
2044
- b(y, from, to, Ay);
2045
- return this;
2046
- }
2047
- b(x, from, to, Ax);
2048
- if (y) b(y, from, to, numeric.rep(numeric.dim(Ax), 0));
2049
- };
2050
- numeric.T.rep = function rep(s, v) {
2051
- var T = numeric.T;
2052
- if (!(v instanceof T)) v = new T(v);
2053
- var x = v.x,
2054
- y = v.y,
2055
- r = numeric.rep;
2056
- if (y) return new T(r(s, x), r(s, y));
2057
- return new T(r(s, x));
2058
- };
2059
- numeric.T.diag = function diag(d) {
2060
- if (!(d instanceof numeric.T)) d = new numeric.T(d);
2061
- var x = d.x,
2062
- y = d.y,
2063
- diag = numeric.diag;
2064
- if (y) return new numeric.T(diag(x), diag(y));
2065
- return new numeric.T(diag(x));
2066
- };
2067
- numeric.T.eig = function eig() {
2068
- if (this.y) {
2069
- throw new Error("eig: not implemented for complex matrices.");
2070
- }
2071
- return numeric.eig(this.x);
2072
- };
2073
- numeric.T.identity = function identity(n) {
2074
- return new numeric.T(numeric.identity(n));
2075
- };
2076
- numeric.T.prototype.getDiag = function getDiag() {
2077
- var n = numeric;
2078
- var x = this.x,
2079
- y = this.y;
2080
- if (y) {
2081
- return new n.T(n.getDiag(x), n.getDiag(y));
2082
- }
2083
- return new n.T(n.getDiag(x));
2084
- };
2085
-
2086
- // 4. Eigenvalues of real matrices
2087
-
2088
- numeric.house = function house(x) {
2089
- var v = numeric.clone(x);
2090
- var s = x[0] >= 0 ? 1 : -1;
2091
- var alpha = s * numeric.norm2(x);
2092
- v[0] += alpha;
2093
- var foo = numeric.norm2(v);
2094
- if (foo === 0) {
2095
- /* this should not happen */ throw new Error("eig: internal error");
2096
- }
2097
- return numeric.div(v, foo);
2098
- };
2099
-
2100
- numeric.toUpperHessenberg = function toUpperHessenberg(me) {
2101
- var s = numeric.dim(me);
2102
- if (s.length !== 2 || s[0] !== s[1]) {
2103
- throw new Error(
2104
- "numeric: toUpperHessenberg() only works on square matrices"
2105
- );
2106
- }
2107
- var m = s[0],
2108
- i,
2109
- j,
2110
- k,
2111
- x,
2112
- v,
2113
- A = numeric.clone(me),
2114
- B,
2115
- C,
2116
- Ai,
2117
- Ci,
2118
- Q = numeric.identity(m),
2119
- Qi;
2120
- for (j = 0; j < m - 2; j++) {
2121
- x = Array(m - j - 1);
2122
- for (i = j + 1; i < m; i++) {
2123
- x[i - j - 1] = A[i][j];
2124
- }
2125
- if (numeric.norm2(x) > 0) {
2126
- v = numeric.house(x);
2127
- B = numeric.getBlock(A, [j + 1, j], [m - 1, m - 1]);
2128
- C = numeric.tensor(v, numeric.dot(v, B));
2129
- for (i = j + 1; i < m; i++) {
2130
- Ai = A[i];
2131
- Ci = C[i - j - 1];
2132
- for (k = j; k < m; k++) Ai[k] -= 2 * Ci[k - j];
2133
- }
2134
- B = numeric.getBlock(A, [0, j + 1], [m - 1, m - 1]);
2135
- C = numeric.tensor(numeric.dot(B, v), v);
2136
- for (i = 0; i < m; i++) {
2137
- Ai = A[i];
2138
- Ci = C[i];
2139
- for (k = j + 1; k < m; k++) Ai[k] -= 2 * Ci[k - j - 1];
2140
- }
2141
- B = Array(m - j - 1);
2142
- for (i = j + 1; i < m; i++) B[i - j - 1] = Q[i];
2143
- C = numeric.tensor(v, numeric.dot(v, B));
2144
- for (i = j + 1; i < m; i++) {
2145
- Qi = Q[i];
2146
- Ci = C[i - j - 1];
2147
- for (k = 0; k < m; k++) Qi[k] -= 2 * Ci[k];
2148
- }
2149
- }
2150
- }
2151
- return { H: A, Q: Q };
2152
- };
2153
-
2154
- numeric.epsilon = 2.220446049250313e-16;
2155
-
2156
- numeric.QRFrancis = function (H, maxiter) {
2157
- if (typeof maxiter === "undefined") {
2158
- maxiter = 10000;
2159
- }
2160
- H = numeric.clone(H);
2161
- var H0 = numeric.clone(H);
2162
- var s = numeric.dim(H),
2163
- m = s[0],
2164
- x,
2165
- v,
2166
- a,
2167
- b,
2168
- c,
2169
- d,
2170
- det,
2171
- tr,
2172
- Hloc,
2173
- Q = numeric.identity(m),
2174
- Qi,
2175
- Hi,
2176
- B,
2177
- C,
2178
- Ci,
2179
- i,
2180
- j,
2181
- k,
2182
- iter;
2183
- if (m < 3) {
2184
- return { Q: Q, B: [[0, m - 1]] };
2185
- }
2186
- var epsilon = numeric.epsilon;
2187
- for (iter = 0; iter < maxiter; iter++) {
2188
- for (j = 0; j < m - 1; j++) {
2189
- if (
2190
- Math.abs(H[j + 1][j]) <
2191
- epsilon * (Math.abs(H[j][j]) + Math.abs(H[j + 1][j + 1]))
2192
- ) {
2193
- var QH1 = numeric.QRFrancis(
2194
- numeric.getBlock(H, [0, 0], [j, j]),
2195
- maxiter
2196
- );
2197
- var QH2 = numeric.QRFrancis(
2198
- numeric.getBlock(H, [j + 1, j + 1], [m - 1, m - 1]),
2199
- maxiter
2200
- );
2201
- B = Array(j + 1);
2202
- for (i = 0; i <= j; i++) {
2203
- B[i] = Q[i];
2204
- }
2205
- C = numeric.dot(QH1.Q, B);
2206
- for (i = 0; i <= j; i++) {
2207
- Q[i] = C[i];
2208
- }
2209
- B = Array(m - j - 1);
2210
- for (i = j + 1; i < m; i++) {
2211
- B[i - j - 1] = Q[i];
2212
- }
2213
- C = numeric.dot(QH2.Q, B);
2214
- for (i = j + 1; i < m; i++) {
2215
- Q[i] = C[i - j - 1];
2216
- }
2217
- return { Q: Q, B: QH1.B.concat(numeric.add(QH2.B, j + 1)) };
2218
- }
2219
- }
2220
- a = H[m - 2][m - 2];
2221
- b = H[m - 2][m - 1];
2222
- c = H[m - 1][m - 2];
2223
- d = H[m - 1][m - 1];
2224
- tr = a + d;
2225
- det = a * d - b * c;
2226
- Hloc = numeric.getBlock(H, [0, 0], [2, 2]);
2227
- if (tr * tr >= 4 * det) {
2228
- var s1, s2;
2229
- s1 = 0.5 * (tr + Math.sqrt(tr * tr - 4 * det));
2230
- s2 = 0.5 * (tr - Math.sqrt(tr * tr - 4 * det));
2231
- Hloc = numeric.add(
2232
- numeric.sub(
2233
- numeric.dot(Hloc, Hloc),
2234
- numeric.mul(Hloc, s1 + s2)
2235
- ),
2236
- numeric.diag(numeric.rep([3], s1 * s2))
2237
- );
2238
- } else {
2239
- Hloc = numeric.add(
2240
- numeric.sub(numeric.dot(Hloc, Hloc), numeric.mul(Hloc, tr)),
2241
- numeric.diag(numeric.rep([3], det))
2242
- );
2243
- }
2244
- x = [Hloc[0][0], Hloc[1][0], Hloc[2][0]];
2245
- v = numeric.house(x);
2246
- B = [H[0], H[1], H[2]];
2247
- C = numeric.tensor(v, numeric.dot(v, B));
2248
- for (i = 0; i < 3; i++) {
2249
- Hi = H[i];
2250
- Ci = C[i];
2251
- for (k = 0; k < m; k++) Hi[k] -= 2 * Ci[k];
2252
- }
2253
- B = numeric.getBlock(H, [0, 0], [m - 1, 2]);
2254
- C = numeric.tensor(numeric.dot(B, v), v);
2255
- for (i = 0; i < m; i++) {
2256
- Hi = H[i];
2257
- Ci = C[i];
2258
- for (k = 0; k < 3; k++) Hi[k] -= 2 * Ci[k];
2259
- }
2260
- B = [Q[0], Q[1], Q[2]];
2261
- C = numeric.tensor(v, numeric.dot(v, B));
2262
- for (i = 0; i < 3; i++) {
2263
- Qi = Q[i];
2264
- Ci = C[i];
2265
- for (k = 0; k < m; k++) Qi[k] -= 2 * Ci[k];
2266
- }
2267
- var J;
2268
- for (j = 0; j < m - 2; j++) {
2269
- for (k = j; k <= j + 1; k++) {
2270
- if (
2271
- Math.abs(H[k + 1][k]) <
2272
- epsilon * (Math.abs(H[k][k]) + Math.abs(H[k + 1][k + 1]))
2273
- ) {
2274
- var QH1 = numeric.QRFrancis(
2275
- numeric.getBlock(H, [0, 0], [k, k]),
2276
- maxiter
2277
- );
2278
- var QH2 = numeric.QRFrancis(
2279
- numeric.getBlock(H, [k + 1, k + 1], [m - 1, m - 1]),
2280
- maxiter
2281
- );
2282
- B = Array(k + 1);
2283
- for (i = 0; i <= k; i++) {
2284
- B[i] = Q[i];
2285
- }
2286
- C = numeric.dot(QH1.Q, B);
2287
- for (i = 0; i <= k; i++) {
2288
- Q[i] = C[i];
2289
- }
2290
- B = Array(m - k - 1);
2291
- for (i = k + 1; i < m; i++) {
2292
- B[i - k - 1] = Q[i];
2293
- }
2294
- C = numeric.dot(QH2.Q, B);
2295
- for (i = k + 1; i < m; i++) {
2296
- Q[i] = C[i - k - 1];
2297
- }
2298
- return { Q: Q, B: QH1.B.concat(numeric.add(QH2.B, k + 1)) };
2299
- }
2300
- }
2301
- J = Math.min(m - 1, j + 3);
2302
- x = Array(J - j);
2303
- for (i = j + 1; i <= J; i++) {
2304
- x[i - j - 1] = H[i][j];
2305
- }
2306
- v = numeric.house(x);
2307
- B = numeric.getBlock(H, [j + 1, j], [J, m - 1]);
2308
- C = numeric.tensor(v, numeric.dot(v, B));
2309
- for (i = j + 1; i <= J; i++) {
2310
- Hi = H[i];
2311
- Ci = C[i - j - 1];
2312
- for (k = j; k < m; k++) Hi[k] -= 2 * Ci[k - j];
2313
- }
2314
- B = numeric.getBlock(H, [0, j + 1], [m - 1, J]);
2315
- C = numeric.tensor(numeric.dot(B, v), v);
2316
- for (i = 0; i < m; i++) {
2317
- Hi = H[i];
2318
- Ci = C[i];
2319
- for (k = j + 1; k <= J; k++) Hi[k] -= 2 * Ci[k - j - 1];
2320
- }
2321
- B = Array(J - j);
2322
- for (i = j + 1; i <= J; i++) B[i - j - 1] = Q[i];
2323
- C = numeric.tensor(v, numeric.dot(v, B));
2324
- for (i = j + 1; i <= J; i++) {
2325
- Qi = Q[i];
2326
- Ci = C[i - j - 1];
2327
- for (k = 0; k < m; k++) Qi[k] -= 2 * Ci[k];
2328
- }
2329
- }
2330
- }
2331
- throw new Error(
2332
- "numeric: eigenvalue iteration does not converge -- increase maxiter?"
2333
- );
2334
- };
2335
-
2336
- numeric.eig = function eig(A, maxiter) {
2337
- var QH = numeric.toUpperHessenberg(A);
2338
- var QB = numeric.QRFrancis(QH.H, maxiter);
2339
- var T = numeric.T;
2340
- var n = A.length,
2341
- i,
2342
- k,
2343
- flag = false,
2344
- B = QB.B,
2345
- H = numeric.dot(QB.Q, numeric.dot(QH.H, numeric.transpose(QB.Q)));
2346
- var Q = new T(numeric.dot(QB.Q, QH.Q)),
2347
- Q0;
2348
- var m = B.length,
2349
- j;
2350
- var a, b, c, d, p1, p2, disc, x, y, p, q, n1, n2;
2351
- var sqrt = Math.sqrt;
2352
- for (k = 0; k < m; k++) {
2353
- i = B[k][0];
2354
- if (i === B[k][1]) {
2355
- // nothing
2356
- } else {
2357
- j = i + 1;
2358
- a = H[i][i];
2359
- b = H[i][j];
2360
- c = H[j][i];
2361
- d = H[j][j];
2362
- if (b === 0 && c === 0) continue;
2363
- p1 = -a - d;
2364
- p2 = a * d - b * c;
2365
- disc = p1 * p1 - 4 * p2;
2366
- if (disc >= 0) {
2367
- if (p1 < 0) x = -0.5 * (p1 - sqrt(disc));
2368
- else x = -0.5 * (p1 + sqrt(disc));
2369
- n1 = (a - x) * (a - x) + b * b;
2370
- n2 = c * c + (d - x) * (d - x);
2371
- if (n1 > n2) {
2372
- n1 = sqrt(n1);
2373
- p = (a - x) / n1;
2374
- q = b / n1;
2375
- } else {
2376
- n2 = sqrt(n2);
2377
- p = c / n2;
2378
- q = (d - x) / n2;
2379
- }
2380
- Q0 = new T([
2381
- [q, -p],
2382
- [p, q],
2383
- ]);
2384
- Q.setRows(i, j, Q0.dot(Q.getRows(i, j)));
2385
- } else {
2386
- x = -0.5 * p1;
2387
- y = 0.5 * sqrt(-disc);
2388
- n1 = (a - x) * (a - x) + b * b;
2389
- n2 = c * c + (d - x) * (d - x);
2390
- if (n1 > n2) {
2391
- n1 = sqrt(n1 + y * y);
2392
- p = (a - x) / n1;
2393
- q = b / n1;
2394
- x = 0;
2395
- y /= n1;
2396
- } else {
2397
- n2 = sqrt(n2 + y * y);
2398
- p = c / n2;
2399
- q = (d - x) / n2;
2400
- x = y / n2;
2401
- y = 0;
2402
- }
2403
- Q0 = new T(
2404
- [
2405
- [q, -p],
2406
- [p, q],
2407
- ],
2408
- [
2409
- [x, y],
2410
- [y, -x],
2411
- ]
2412
- );
2413
- Q.setRows(i, j, Q0.dot(Q.getRows(i, j)));
2414
- }
2415
- }
2416
- }
2417
- var R = Q.dot(A).dot(Q.transjugate()),
2418
- n = A.length,
2419
- E = numeric.T.identity(n);
2420
- for (j = 0; j < n; j++) {
2421
- if (j > 0) {
2422
- for (k = j - 1; k >= 0; k--) {
2423
- var Rk = R.get([k, k]),
2424
- Rj = R.get([j, j]);
2425
- if (numeric.neq(Rk.x, Rj.x) || numeric.neq(Rk.y, Rj.y)) {
2426
- x = R.getRow(k).getBlock([k], [j - 1]);
2427
- y = E.getRow(j).getBlock([k], [j - 1]);
2428
- E.set(
2429
- [j, k],
2430
- R.get([k, j]).neg().sub(x.dot(y)).div(Rk.sub(Rj))
2431
- );
2432
- } else {
2433
- E.setRow(j, E.getRow(k));
2434
- continue;
2435
- }
2436
- }
2437
- }
2438
- }
2439
- for (j = 0; j < n; j++) {
2440
- x = E.getRow(j);
2441
- E.setRow(j, x.div(x.norm2()));
2442
- }
2443
- E = E.transpose();
2444
- E = Q.transjugate().dot(E);
2445
- return { lambda: R.getDiag(), E: E };
2446
- };
2447
-
2448
- // 5. Compressed Column Storage matrices
2449
- numeric.ccsSparse = function ccsSparse(A) {
2450
- var m = A.length,
2451
- n,
2452
- foo,
2453
- i,
2454
- j,
2455
- counts = [];
2456
- for (i = m - 1; i !== -1; --i) {
2457
- foo = A[i];
2458
- for (j in foo) {
2459
- j = parseInt(j);
2460
- while (j >= counts.length) counts[counts.length] = 0;
2461
- if (foo[j] !== 0) counts[j]++;
2462
- }
2463
- }
2464
- var n = counts.length;
2465
- var Ai = Array(n + 1);
2466
- Ai[0] = 0;
2467
- for (i = 0; i < n; ++i) Ai[i + 1] = Ai[i] + counts[i];
2468
- var Aj = Array(Ai[n]),
2469
- Av = Array(Ai[n]);
2470
- for (i = m - 1; i !== -1; --i) {
2471
- foo = A[i];
2472
- for (j in foo) {
2473
- if (foo[j] !== 0) {
2474
- counts[j]--;
2475
- Aj[Ai[j] + counts[j]] = i;
2476
- Av[Ai[j] + counts[j]] = foo[j];
2477
- }
2478
- }
2479
- }
2480
- return [Ai, Aj, Av];
2481
- };
2482
- numeric.ccsFull = function ccsFull(A) {
2483
- var Ai = A[0],
2484
- Aj = A[1],
2485
- Av = A[2],
2486
- s = numeric.ccsDim(A),
2487
- m = s[0],
2488
- n = s[1],
2489
- i,
2490
- j,
2491
- j0,
2492
- j1,
2493
- k;
2494
- var B = numeric.rep([m, n], 0);
2495
- for (i = 0; i < n; i++) {
2496
- j0 = Ai[i];
2497
- j1 = Ai[i + 1];
2498
- for (j = j0; j < j1; ++j) {
2499
- B[Aj[j]][i] = Av[j];
2500
- }
2501
- }
2502
- return B;
2503
- };
2504
- numeric.ccsTSolve = function ccsTSolve(A, b, x, bj, xj) {
2505
- var Ai = A[0],
2506
- Aj = A[1],
2507
- Av = A[2],
2508
- m = Ai.length - 1,
2509
- max = Math.max,
2510
- n = 0;
2511
- if (typeof bj === "undefined") x = numeric.rep([m], 0);
2512
- if (typeof bj === "undefined") bj = numeric.linspace(0, x.length - 1);
2513
- if (typeof xj === "undefined") xj = [];
2514
- function dfs(j) {
2515
- var k;
2516
- if (x[j] !== 0) return;
2517
- x[j] = 1;
2518
- for (k = Ai[j]; k < Ai[j + 1]; ++k) dfs(Aj[k]);
2519
- xj[n] = j;
2520
- ++n;
2521
- }
2522
- var i, j, j0, j1, k, l, l0, l1, a;
2523
- for (i = bj.length - 1; i !== -1; --i) {
2524
- dfs(bj[i]);
2525
- }
2526
- xj.length = n;
2527
- for (i = xj.length - 1; i !== -1; --i) {
2528
- x[xj[i]] = 0;
2529
- }
2530
- for (i = bj.length - 1; i !== -1; --i) {
2531
- j = bj[i];
2532
- x[j] = b[j];
2533
- }
2534
- for (i = xj.length - 1; i !== -1; --i) {
2535
- j = xj[i];
2536
- j0 = Ai[j];
2537
- j1 = max(Ai[j + 1], j0);
2538
- for (k = j0; k !== j1; ++k) {
2539
- if (Aj[k] === j) {
2540
- x[j] /= Av[k];
2541
- break;
2542
- }
2543
- }
2544
- a = x[j];
2545
- for (k = j0; k !== j1; ++k) {
2546
- l = Aj[k];
2547
- if (l !== j) x[l] -= a * Av[k];
2548
- }
2549
- }
2550
- return x;
2551
- };
2552
- numeric.ccsDFS = function ccsDFS(n) {
2553
- this.k = Array(n);
2554
- this.k1 = Array(n);
2555
- this.j = Array(n);
2556
- };
2557
- numeric.ccsDFS.prototype.dfs = function dfs(J, Ai, Aj, x, xj, Pinv) {
2558
- var m = 0,
2559
- foo,
2560
- n = xj.length;
2561
- var k = this.k,
2562
- k1 = this.k1,
2563
- j = this.j,
2564
- km,
2565
- k11;
2566
- if (x[J] !== 0) return;
2567
- x[J] = 1;
2568
- j[0] = J;
2569
- k[0] = km = Ai[J];
2570
- k1[0] = k11 = Ai[J + 1];
2571
- while (1) {
2572
- if (km >= k11) {
2573
- xj[n] = j[m];
2574
- if (m === 0) return;
2575
- ++n;
2576
- --m;
2577
- km = k[m];
2578
- k11 = k1[m];
2579
- } else {
2580
- foo = Pinv[Aj[km]];
2581
- if (x[foo] === 0) {
2582
- x[foo] = 1;
2583
- k[m] = km;
2584
- ++m;
2585
- j[m] = foo;
2586
- km = Ai[foo];
2587
- k1[m] = k11 = Ai[foo + 1];
2588
- } else ++km;
2589
- }
2590
- }
2591
- };
2592
- numeric.ccsLPSolve = function ccsLPSolve(A, B, x, xj, I, Pinv, dfs) {
2593
- var Ai = A[0],
2594
- Aj = A[1],
2595
- Av = A[2],
2596
- m = Ai.length - 1,
2597
- n = 0;
2598
- var Bi = B[0],
2599
- Bj = B[1],
2600
- Bv = B[2];
2601
-
2602
- var i, i0, i1, j, J, j0, j1, k, l, l0, l1, a;
2603
- i0 = Bi[I];
2604
- i1 = Bi[I + 1];
2605
- xj.length = 0;
2606
- for (i = i0; i < i1; ++i) {
2607
- dfs.dfs(Pinv[Bj[i]], Ai, Aj, x, xj, Pinv);
2608
- }
2609
- for (i = xj.length - 1; i !== -1; --i) {
2610
- x[xj[i]] = 0;
2611
- }
2612
- for (i = i0; i !== i1; ++i) {
2613
- j = Pinv[Bj[i]];
2614
- x[j] = Bv[i];
2615
- }
2616
- for (i = xj.length - 1; i !== -1; --i) {
2617
- j = xj[i];
2618
- j0 = Ai[j];
2619
- j1 = Ai[j + 1];
2620
- for (k = j0; k < j1; ++k) {
2621
- if (Pinv[Aj[k]] === j) {
2622
- x[j] /= Av[k];
2623
- break;
2624
- }
2625
- }
2626
- a = x[j];
2627
- for (k = j0; k < j1; ++k) {
2628
- l = Pinv[Aj[k]];
2629
- if (l !== j) x[l] -= a * Av[k];
2630
- }
2631
- }
2632
- return x;
2633
- };
2634
- numeric.ccsLUP1 = function ccsLUP1(A, threshold) {
2635
- var m = A[0].length - 1;
2636
- var L = [numeric.rep([m + 1], 0), [], []],
2637
- U = [numeric.rep([m + 1], 0), [], []];
2638
- var Li = L[0],
2639
- Lj = L[1],
2640
- Lv = L[2],
2641
- Ui = U[0],
2642
- Uj = U[1],
2643
- Uv = U[2];
2644
- var x = numeric.rep([m], 0),
2645
- xj = numeric.rep([m], 0);
2646
- var i, j, k, j0, j1, a, e, c, d, K;
2647
- var sol = numeric.ccsLPSolve,
2648
- max = Math.max,
2649
- abs = Math.abs;
2650
- var P = numeric.linspace(0, m - 1),
2651
- Pinv = numeric.linspace(0, m - 1);
2652
- var dfs = new numeric.ccsDFS(m);
2653
- if (typeof threshold === "undefined") {
2654
- threshold = 1;
2655
- }
2656
- for (i = 0; i < m; ++i) {
2657
- sol(L, A, x, xj, i, Pinv, dfs);
2658
- a = -1;
2659
- e = -1;
2660
- for (j = xj.length - 1; j !== -1; --j) {
2661
- k = xj[j];
2662
- if (k <= i) continue;
2663
- c = abs(x[k]);
2664
- if (c > a) {
2665
- e = k;
2666
- a = c;
2667
- }
2668
- }
2669
- if (abs(x[i]) < threshold * a) {
2670
- j = P[i];
2671
- a = P[e];
2672
- P[i] = a;
2673
- Pinv[a] = i;
2674
- P[e] = j;
2675
- Pinv[j] = e;
2676
- a = x[i];
2677
- x[i] = x[e];
2678
- x[e] = a;
2679
- }
2680
- a = Li[i];
2681
- e = Ui[i];
2682
- d = x[i];
2683
- Lj[a] = P[i];
2684
- Lv[a] = 1;
2685
- ++a;
2686
- for (j = xj.length - 1; j !== -1; --j) {
2687
- k = xj[j];
2688
- c = x[k];
2689
- xj[j] = 0;
2690
- x[k] = 0;
2691
- if (k <= i) {
2692
- Uj[e] = k;
2693
- Uv[e] = c;
2694
- ++e;
2695
- } else {
2696
- Lj[a] = P[k];
2697
- Lv[a] = c / d;
2698
- ++a;
2699
- }
2700
- }
2701
- Li[i + 1] = a;
2702
- Ui[i + 1] = e;
2703
- }
2704
- for (j = Lj.length - 1; j !== -1; --j) {
2705
- Lj[j] = Pinv[Lj[j]];
2706
- }
2707
- return { L: L, U: U, P: P, Pinv: Pinv };
2708
- };
2709
- numeric.ccsDFS0 = function ccsDFS0(n) {
2710
- this.k = Array(n);
2711
- this.k1 = Array(n);
2712
- this.j = Array(n);
2713
- };
2714
- numeric.ccsDFS0.prototype.dfs = function dfs(J, Ai, Aj, x, xj, Pinv, P) {
2715
- var m = 0,
2716
- foo,
2717
- n = xj.length;
2718
- var k = this.k,
2719
- k1 = this.k1,
2720
- j = this.j,
2721
- km,
2722
- k11;
2723
- if (x[J] !== 0) return;
2724
- x[J] = 1;
2725
- j[0] = J;
2726
- k[0] = km = Ai[Pinv[J]];
2727
- k1[0] = k11 = Ai[Pinv[J] + 1];
2728
- while (1) {
2729
- if (isNaN(km)) throw new Error("Ow!");
2730
- if (km >= k11) {
2731
- xj[n] = Pinv[j[m]];
2732
- if (m === 0) return;
2733
- ++n;
2734
- --m;
2735
- km = k[m];
2736
- k11 = k1[m];
2737
- } else {
2738
- foo = Aj[km];
2739
- if (x[foo] === 0) {
2740
- x[foo] = 1;
2741
- k[m] = km;
2742
- ++m;
2743
- j[m] = foo;
2744
- foo = Pinv[foo];
2745
- km = Ai[foo];
2746
- k1[m] = k11 = Ai[foo + 1];
2747
- } else ++km;
2748
- }
2749
- }
2750
- };
2751
- numeric.ccsLPSolve0 = function ccsLPSolve0(A, B, y, xj, I, Pinv, P, dfs) {
2752
- var Ai = A[0],
2753
- Aj = A[1],
2754
- Av = A[2],
2755
- m = Ai.length - 1,
2756
- n = 0;
2757
- var Bi = B[0],
2758
- Bj = B[1],
2759
- Bv = B[2];
2760
-
2761
- var i, i0, i1, j, J, j0, j1, k, l, l0, l1, a;
2762
- i0 = Bi[I];
2763
- i1 = Bi[I + 1];
2764
- xj.length = 0;
2765
- for (i = i0; i < i1; ++i) {
2766
- dfs.dfs(Bj[i], Ai, Aj, y, xj, Pinv, P);
2767
- }
2768
- for (i = xj.length - 1; i !== -1; --i) {
2769
- j = xj[i];
2770
- y[P[j]] = 0;
2771
- }
2772
- for (i = i0; i !== i1; ++i) {
2773
- j = Bj[i];
2774
- y[j] = Bv[i];
2775
- }
2776
- for (i = xj.length - 1; i !== -1; --i) {
2777
- j = xj[i];
2778
- l = P[j];
2779
- j0 = Ai[j];
2780
- j1 = Ai[j + 1];
2781
- for (k = j0; k < j1; ++k) {
2782
- if (Aj[k] === l) {
2783
- y[l] /= Av[k];
2784
- break;
2785
- }
2786
- }
2787
- a = y[l];
2788
- for (k = j0; k < j1; ++k) y[Aj[k]] -= a * Av[k];
2789
- y[l] = a;
2790
- }
2791
- };
2792
- numeric.ccsLUP0 = function ccsLUP0(A, threshold) {
2793
- var m = A[0].length - 1;
2794
- var L = [numeric.rep([m + 1], 0), [], []],
2795
- U = [numeric.rep([m + 1], 0), [], []];
2796
- var Li = L[0],
2797
- Lj = L[1],
2798
- Lv = L[2],
2799
- Ui = U[0],
2800
- Uj = U[1],
2801
- Uv = U[2];
2802
- var y = numeric.rep([m], 0),
2803
- xj = numeric.rep([m], 0);
2804
- var i, j, k, j0, j1, a, e, c, d, K;
2805
- var sol = numeric.ccsLPSolve0,
2806
- max = Math.max,
2807
- abs = Math.abs;
2808
- var P = numeric.linspace(0, m - 1),
2809
- Pinv = numeric.linspace(0, m - 1);
2810
- var dfs = new numeric.ccsDFS0(m);
2811
- if (typeof threshold === "undefined") {
2812
- threshold = 1;
2813
- }
2814
- for (i = 0; i < m; ++i) {
2815
- sol(L, A, y, xj, i, Pinv, P, dfs);
2816
- a = -1;
2817
- e = -1;
2818
- for (j = xj.length - 1; j !== -1; --j) {
2819
- k = xj[j];
2820
- if (k <= i) continue;
2821
- c = abs(y[P[k]]);
2822
- if (c > a) {
2823
- e = k;
2824
- a = c;
2825
- }
2826
- }
2827
- if (abs(y[P[i]]) < threshold * a) {
2828
- j = P[i];
2829
- a = P[e];
2830
- P[i] = a;
2831
- Pinv[a] = i;
2832
- P[e] = j;
2833
- Pinv[j] = e;
2834
- }
2835
- a = Li[i];
2836
- e = Ui[i];
2837
- d = y[P[i]];
2838
- Lj[a] = P[i];
2839
- Lv[a] = 1;
2840
- ++a;
2841
- for (j = xj.length - 1; j !== -1; --j) {
2842
- k = xj[j];
2843
- c = y[P[k]];
2844
- xj[j] = 0;
2845
- y[P[k]] = 0;
2846
- if (k <= i) {
2847
- Uj[e] = k;
2848
- Uv[e] = c;
2849
- ++e;
2850
- } else {
2851
- Lj[a] = P[k];
2852
- Lv[a] = c / d;
2853
- ++a;
2854
- }
2855
- }
2856
- Li[i + 1] = a;
2857
- Ui[i + 1] = e;
2858
- }
2859
- for (j = Lj.length - 1; j !== -1; --j) {
2860
- Lj[j] = Pinv[Lj[j]];
2861
- }
2862
- return { L: L, U: U, P: P, Pinv: Pinv };
2863
- };
2864
- numeric.ccsLUP = numeric.ccsLUP0;
2865
-
2866
- numeric.ccsDim = function ccsDim(A) {
2867
- return [numeric.sup(A[1]) + 1, A[0].length - 1];
2868
- };
2869
- numeric.ccsGetBlock = function ccsGetBlock(A, i, j) {
2870
- var s = numeric.ccsDim(A),
2871
- m = s[0],
2872
- n = s[1];
2873
- if (typeof i === "undefined") {
2874
- i = numeric.linspace(0, m - 1);
2875
- } else if (typeof i === "number") {
2876
- i = [i];
2877
- }
2878
- if (typeof j === "undefined") {
2879
- j = numeric.linspace(0, n - 1);
2880
- } else if (typeof j === "number") {
2881
- j = [j];
2882
- }
2883
- var p,
2884
- p0,
2885
- p1,
2886
- P = i.length,
2887
- q,
2888
- Q = j.length,
2889
- r,
2890
- jq,
2891
- ip;
2892
- var Bi = numeric.rep([n], 0),
2893
- Bj = [],
2894
- Bv = [],
2895
- B = [Bi, Bj, Bv];
2896
- var Ai = A[0],
2897
- Aj = A[1],
2898
- Av = A[2];
2899
- var x = numeric.rep([m], 0),
2900
- count = 0,
2901
- flags = numeric.rep([m], 0);
2902
- for (q = 0; q < Q; ++q) {
2903
- jq = j[q];
2904
- var q0 = Ai[jq];
2905
- var q1 = Ai[jq + 1];
2906
- for (p = q0; p < q1; ++p) {
2907
- r = Aj[p];
2908
- flags[r] = 1;
2909
- x[r] = Av[p];
2910
- }
2911
- for (p = 0; p < P; ++p) {
2912
- ip = i[p];
2913
- if (flags[ip]) {
2914
- Bj[count] = p;
2915
- Bv[count] = x[i[p]];
2916
- ++count;
2917
- }
2918
- }
2919
- for (p = q0; p < q1; ++p) {
2920
- r = Aj[p];
2921
- flags[r] = 0;
2922
- }
2923
- Bi[q + 1] = count;
2924
- }
2925
- return B;
2926
- };
2927
-
2928
- numeric.ccsDot = function ccsDot(A, B) {
2929
- var Ai = A[0],
2930
- Aj = A[1],
2931
- Av = A[2];
2932
- var Bi = B[0],
2933
- Bj = B[1],
2934
- Bv = B[2];
2935
- var sA = numeric.ccsDim(A),
2936
- sB = numeric.ccsDim(B);
2937
- var m = sA[0],
2938
- n = sA[1],
2939
- o = sB[1];
2940
- var x = numeric.rep([m], 0),
2941
- flags = numeric.rep([m], 0),
2942
- xj = Array(m);
2943
- var Ci = numeric.rep([o], 0),
2944
- Cj = [],
2945
- Cv = [],
2946
- C = [Ci, Cj, Cv];
2947
- var i, j, k, j0, j1, i0, i1, l, p, a, b;
2948
- for (k = 0; k !== o; ++k) {
2949
- j0 = Bi[k];
2950
- j1 = Bi[k + 1];
2951
- p = 0;
2952
- for (j = j0; j < j1; ++j) {
2953
- a = Bj[j];
2954
- b = Bv[j];
2955
- i0 = Ai[a];
2956
- i1 = Ai[a + 1];
2957
- for (i = i0; i < i1; ++i) {
2958
- l = Aj[i];
2959
- if (flags[l] === 0) {
2960
- xj[p] = l;
2961
- flags[l] = 1;
2962
- p = p + 1;
2963
- }
2964
- x[l] = x[l] + Av[i] * b;
2965
- }
2966
- }
2967
- j0 = Ci[k];
2968
- j1 = j0 + p;
2969
- Ci[k + 1] = j1;
2970
- for (j = p - 1; j !== -1; --j) {
2971
- b = j0 + j;
2972
- i = xj[j];
2973
- Cj[b] = i;
2974
- Cv[b] = x[i];
2975
- flags[i] = 0;
2976
- x[i] = 0;
2977
- }
2978
- Ci[k + 1] = Ci[k] + p;
2979
- }
2980
- return C;
2981
- };
2982
-
2983
- numeric.ccsLUPSolve = function ccsLUPSolve(LUP, B) {
2984
- var L = LUP.L,
2985
- U = LUP.U,
2986
- P = LUP.P;
2987
- var Bi = B[0];
2988
- var flag = false;
2989
- if (typeof Bi !== "object") {
2990
- B = [[0, B.length], numeric.linspace(0, B.length - 1), B];
2991
- Bi = B[0];
2992
- flag = true;
2993
- }
2994
- var Bj = B[1],
2995
- Bv = B[2];
2996
- var n = L[0].length - 1,
2997
- m = Bi.length - 1;
2998
- var x = numeric.rep([n], 0),
2999
- xj = Array(n);
3000
- var b = numeric.rep([n], 0),
3001
- bj = Array(n);
3002
- var Xi = numeric.rep([m + 1], 0),
3003
- Xj = [],
3004
- Xv = [];
3005
- var sol = numeric.ccsTSolve;
3006
- var i,
3007
- j,
3008
- j0,
3009
- j1,
3010
- k,
3011
- J,
3012
- N = 0;
3013
- for (i = 0; i < m; ++i) {
3014
- k = 0;
3015
- j0 = Bi[i];
3016
- j1 = Bi[i + 1];
3017
- for (j = j0; j < j1; ++j) {
3018
- J = LUP.Pinv[Bj[j]];
3019
- bj[k] = J;
3020
- b[J] = Bv[j];
3021
- ++k;
3022
- }
3023
- bj.length = k;
3024
- sol(L, b, x, bj, xj);
3025
- for (j = bj.length - 1; j !== -1; --j) b[bj[j]] = 0;
3026
- sol(U, x, b, xj, bj);
3027
- if (flag) return b;
3028
- for (j = xj.length - 1; j !== -1; --j) x[xj[j]] = 0;
3029
- for (j = bj.length - 1; j !== -1; --j) {
3030
- J = bj[j];
3031
- Xj[N] = J;
3032
- Xv[N] = b[J];
3033
- b[J] = 0;
3034
- ++N;
3035
- }
3036
- Xi[i + 1] = N;
3037
- }
3038
- return [Xi, Xj, Xv];
3039
- };
3040
-
3041
- numeric.ccsbinop = function ccsbinop(body, setup) {
3042
- if (typeof setup === "undefined") setup = "";
3043
- return Function(
3044
- "X",
3045
- "Y",
3046
- "var Xi = X[0], Xj = X[1], Xv = X[2];\n" +
3047
- "var Yi = Y[0], Yj = Y[1], Yv = Y[2];\n" +
3048
- "var n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\n" +
3049
- "var Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\n" +
3050
- "var x = numeric.rep([m],0),y = numeric.rep([m],0);\n" +
3051
- "var xk,yk,zk;\n" +
3052
- "var i,j,j0,j1,k,p=0;\n" +
3053
- setup +
3054
- "for(i=0;i<n;++i) {\n" +
3055
- " j0 = Xi[i]; j1 = Xi[i+1];\n" +
3056
- " for(j=j0;j!==j1;++j) {\n" +
3057
- " k = Xj[j];\n" +
3058
- " x[k] = 1;\n" +
3059
- " Zj[p] = k;\n" +
3060
- " ++p;\n" +
3061
- " }\n" +
3062
- " j0 = Yi[i]; j1 = Yi[i+1];\n" +
3063
- " for(j=j0;j!==j1;++j) {\n" +
3064
- " k = Yj[j];\n" +
3065
- " y[k] = Yv[j];\n" +
3066
- " if(x[k] === 0) {\n" +
3067
- " Zj[p] = k;\n" +
3068
- " ++p;\n" +
3069
- " }\n" +
3070
- " }\n" +
3071
- " Zi[i+1] = p;\n" +
3072
- " j0 = Xi[i]; j1 = Xi[i+1];\n" +
3073
- " for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n" +
3074
- " j0 = Zi[i]; j1 = Zi[i+1];\n" +
3075
- " for(j=j0;j!==j1;++j) {\n" +
3076
- " k = Zj[j];\n" +
3077
- " xk = x[k];\n" +
3078
- " yk = y[k];\n" +
3079
- body +
3080
- "\n" +
3081
- " Zv[j] = zk;\n" +
3082
- " }\n" +
3083
- " j0 = Xi[i]; j1 = Xi[i+1];\n" +
3084
- " for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n" +
3085
- " j0 = Yi[i]; j1 = Yi[i+1];\n" +
3086
- " for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n" +
3087
- "}\n" +
3088
- "return [Zi,Zj,Zv];"
3089
- );
3090
- };
3091
-
3092
- (function () {
3093
- var k, A, B, C;
3094
- for (k in numeric.ops2) {
3095
- if (isFinite(eval("1" + numeric.ops2[k] + "0")))
3096
- A = "[Y[0],Y[1],numeric." + k + "(X,Y[2])]";
3097
- else A = "NaN";
3098
- if (isFinite(eval("0" + numeric.ops2[k] + "1")))
3099
- B = "[X[0],X[1],numeric." + k + "(X[2],Y)]";
3100
- else B = "NaN";
3101
- if (
3102
- isFinite(eval("1" + numeric.ops2[k] + "0")) &&
3103
- isFinite(eval("0" + numeric.ops2[k] + "1"))
3104
- )
3105
- C = "numeric.ccs" + k + "MM(X,Y)";
3106
- else C = "NaN";
3107
- numeric["ccs" + k + "MM"] = numeric.ccsbinop(
3108
- "zk = xk " + numeric.ops2[k] + "yk;"
3109
- );
3110
- numeric["ccs" + k] = Function(
3111
- "X",
3112
- "Y",
3113
- 'if(typeof X === "number") return ' +
3114
- A +
3115
- ";\n" +
3116
- 'if(typeof Y === "number") return ' +
3117
- B +
3118
- ";\n" +
3119
- "return " +
3120
- C +
3121
- ";\n"
3122
- );
3123
- }
3124
- })();
3125
-
3126
- numeric.ccsScatter = function ccsScatter(A) {
3127
- var Ai = A[0],
3128
- Aj = A[1],
3129
- Av = A[2];
3130
- var n = numeric.sup(Aj) + 1,
3131
- m = Ai.length;
3132
- var Ri = numeric.rep([n], 0),
3133
- Rj = Array(m),
3134
- Rv = Array(m);
3135
- var counts = numeric.rep([n], 0),
3136
- i;
3137
- for (i = 0; i < m; ++i) counts[Aj[i]]++;
3138
- for (i = 0; i < n; ++i) Ri[i + 1] = Ri[i] + counts[i];
3139
- var ptr = Ri.slice(0),
3140
- k,
3141
- Aii;
3142
- for (i = 0; i < m; ++i) {
3143
- Aii = Aj[i];
3144
- k = ptr[Aii];
3145
- Rj[k] = Ai[i];
3146
- Rv[k] = Av[i];
3147
- ptr[Aii] = ptr[Aii] + 1;
3148
- }
3149
- return [Ri, Rj, Rv];
3150
- };
3151
-
3152
- numeric.ccsGather = function ccsGather(A) {
3153
- var Ai = A[0],
3154
- Aj = A[1],
3155
- Av = A[2];
3156
- var n = Ai.length - 1,
3157
- m = Aj.length;
3158
- var Ri = Array(m),
3159
- Rj = Array(m),
3160
- Rv = Array(m);
3161
- var i, j, j0, j1, p;
3162
- p = 0;
3163
- for (i = 0; i < n; ++i) {
3164
- j0 = Ai[i];
3165
- j1 = Ai[i + 1];
3166
- for (j = j0; j !== j1; ++j) {
3167
- Rj[p] = i;
3168
- Ri[p] = Aj[j];
3169
- Rv[p] = Av[j];
3170
- ++p;
3171
- }
3172
- }
3173
- return [Ri, Rj, Rv];
3174
- };
3175
-
3176
- // The following sparse linear algebra routines are deprecated.
3177
-
3178
- numeric.sdim = function dim(A, ret, k) {
3179
- if (typeof ret === "undefined") {
3180
- ret = [];
3181
- }
3182
- if (typeof A !== "object") return ret;
3183
- if (typeof k === "undefined") {
3184
- k = 0;
3185
- }
3186
- if (!(k in ret)) {
3187
- ret[k] = 0;
3188
- }
3189
- if (A.length > ret[k]) ret[k] = A.length;
3190
- var i;
3191
- for (i in A) {
3192
- if (A.hasOwnProperty(i)) dim(A[i], ret, k + 1);
3193
- }
3194
- return ret;
3195
- };
3196
-
3197
- numeric.sclone = function clone(A, k, n) {
3198
- if (typeof k === "undefined") {
3199
- k = 0;
3200
- }
3201
- if (typeof n === "undefined") {
3202
- n = numeric.sdim(A).length;
3203
- }
3204
- var i,
3205
- ret = Array(A.length);
3206
- if (k === n - 1) {
3207
- for (i in A) {
3208
- if (A.hasOwnProperty(i)) ret[i] = A[i];
3209
- }
3210
- return ret;
3211
- }
3212
- for (i in A) {
3213
- if (A.hasOwnProperty(i)) ret[i] = clone(A[i], k + 1, n);
3214
- }
3215
- return ret;
3216
- };
3217
-
3218
- numeric.sdiag = function diag(d) {
3219
- var n = d.length,
3220
- i,
3221
- ret = Array(n),
3222
- i1,
3223
- i2,
3224
- i3;
3225
- for (i = n - 1; i >= 1; i -= 2) {
3226
- i1 = i - 1;
3227
- ret[i] = [];
3228
- ret[i][i] = d[i];
3229
- ret[i1] = [];
3230
- ret[i1][i1] = d[i1];
3231
- }
3232
- if (i === 0) {
3233
- ret[0] = [];
3234
- ret[0][0] = d[i];
3235
- }
3236
- return ret;
3237
- };
3238
-
3239
- numeric.sidentity = function identity(n) {
3240
- return numeric.sdiag(numeric.rep([n], 1));
3241
- };
3242
-
3243
- numeric.stranspose = function transpose(A) {
3244
- var ret = [],
3245
- n = A.length,
3246
- i,
3247
- j,
3248
- Ai;
3249
- for (i in A) {
3250
- if (!A.hasOwnProperty(i)) continue;
3251
- Ai = A[i];
3252
- for (j in Ai) {
3253
- if (!Ai.hasOwnProperty(j)) continue;
3254
- if (typeof ret[j] !== "object") {
3255
- ret[j] = [];
3256
- }
3257
- ret[j][i] = Ai[j];
3258
- }
3259
- }
3260
- return ret;
3261
- };
3262
-
3263
- numeric.sLUP = function LUP(A, tol) {
3264
- throw new Error(
3265
- "The function numeric.sLUP had a bug in it and has been removed. Please use the new numeric.ccsLUP function instead."
3266
- );
3267
- };
3268
-
3269
- numeric.sdotMM = function dotMM(A, B) {
3270
- var p = A.length,
3271
- q = B.length,
3272
- BT = numeric.stranspose(B),
3273
- r = BT.length,
3274
- Ai,
3275
- BTk;
3276
- var i, j, k, accum;
3277
- var ret = Array(p),
3278
- reti;
3279
- for (i = p - 1; i >= 0; i--) {
3280
- reti = [];
3281
- Ai = A[i];
3282
- for (k = r - 1; k >= 0; k--) {
3283
- accum = 0;
3284
- BTk = BT[k];
3285
- for (j in Ai) {
3286
- if (!Ai.hasOwnProperty(j)) continue;
3287
- if (j in BTk) {
3288
- accum += Ai[j] * BTk[j];
3289
- }
3290
- }
3291
- if (accum) reti[k] = accum;
3292
- }
3293
- ret[i] = reti;
3294
- }
3295
- return ret;
3296
- };
3297
-
3298
- numeric.sdotMV = function dotMV(A, x) {
3299
- var p = A.length,
3300
- Ai,
3301
- i,
3302
- j;
3303
- var ret = Array(p),
3304
- accum;
3305
- for (i = p - 1; i >= 0; i--) {
3306
- Ai = A[i];
3307
- accum = 0;
3308
- for (j in Ai) {
3309
- if (!Ai.hasOwnProperty(j)) continue;
3310
- if (x[j]) accum += Ai[j] * x[j];
3311
- }
3312
- if (accum) ret[i] = accum;
3313
- }
3314
- return ret;
3315
- };
3316
-
3317
- numeric.sdotVM = function dotMV(x, A) {
3318
- var i, j, Ai, alpha;
3319
- var ret = [],
3320
- accum;
3321
- for (i in x) {
3322
- if (!x.hasOwnProperty(i)) continue;
3323
- Ai = A[i];
3324
- alpha = x[i];
3325
- for (j in Ai) {
3326
- if (!Ai.hasOwnProperty(j)) continue;
3327
- if (!ret[j]) {
3328
- ret[j] = 0;
3329
- }
3330
- ret[j] += alpha * Ai[j];
3331
- }
3332
- }
3333
- return ret;
3334
- };
3335
-
3336
- numeric.sdotVV = function dotVV(x, y) {
3337
- var i,
3338
- ret = 0;
3339
- for (i in x) {
3340
- if (x[i] && y[i]) ret += x[i] * y[i];
3341
- }
3342
- return ret;
3343
- };
3344
-
3345
- numeric.sdot = function dot(A, B) {
3346
- var m = numeric.sdim(A).length,
3347
- n = numeric.sdim(B).length;
3348
- var k = m * 1000 + n;
3349
- switch (k) {
3350
- case 0:
3351
- return A * B;
3352
- case 1001:
3353
- return numeric.sdotVV(A, B);
3354
- case 2001:
3355
- return numeric.sdotMV(A, B);
3356
- case 1002:
3357
- return numeric.sdotVM(A, B);
3358
- case 2002:
3359
- return numeric.sdotMM(A, B);
3360
- default:
3361
- throw new Error(
3362
- "numeric.sdot not implemented for tensors of order " +
3363
- m +
3364
- " and " +
3365
- n
3366
- );
3367
- }
3368
- };
3369
-
3370
- numeric.sscatter = function scatter(V) {
3371
- var n = V[0].length,
3372
- Vij,
3373
- i,
3374
- j,
3375
- m = V.length,
3376
- A = [],
3377
- Aj;
3378
- for (i = n - 1; i >= 0; --i) {
3379
- if (!V[m - 1][i]) continue;
3380
- Aj = A;
3381
- for (j = 0; j < m - 2; j++) {
3382
- Vij = V[j][i];
3383
- if (!Aj[Vij]) Aj[Vij] = [];
3384
- Aj = Aj[Vij];
3385
- }
3386
- Aj[V[j][i]] = V[j + 1][i];
3387
- }
3388
- return A;
3389
- };
3390
-
3391
- numeric.sgather = function gather(A, ret, k) {
3392
- if (typeof ret === "undefined") ret = [];
3393
- if (typeof k === "undefined") k = [];
3394
- var n, i, Ai;
3395
- n = k.length;
3396
- for (i in A) {
3397
- if (A.hasOwnProperty(i)) {
3398
- k[n] = parseInt(i);
3399
- Ai = A[i];
3400
- if (typeof Ai === "number") {
3401
- if (Ai) {
3402
- if (ret.length === 0) {
3403
- for (i = n + 1; i >= 0; --i) ret[i] = [];
3404
- }
3405
- for (i = n; i >= 0; --i) ret[i].push(k[i]);
3406
- ret[n + 1].push(Ai);
3407
- }
3408
- } else gather(Ai, ret, k);
3409
- }
3410
- }
3411
- if (k.length > n) k.pop();
3412
- return ret;
3413
- };
3414
-
3415
- // 6. Coordinate matrices
3416
- numeric.cLU = function LU(A) {
3417
- var I = A[0],
3418
- J = A[1],
3419
- V = A[2];
3420
- var p = I.length,
3421
- m = 0,
3422
- i,
3423
- j,
3424
- k,
3425
- a,
3426
- b,
3427
- c;
3428
- for (i = 0; i < p; i++) if (I[i] > m) m = I[i];
3429
- m++;
3430
- var L = Array(m),
3431
- U = Array(m),
3432
- left = numeric.rep([m], Infinity),
3433
- right = numeric.rep([m], -Infinity);
3434
- var Ui, Uj, alpha;
3435
- for (k = 0; k < p; k++) {
3436
- i = I[k];
3437
- j = J[k];
3438
- if (j < left[i]) left[i] = j;
3439
- if (j > right[i]) right[i] = j;
3440
- }
3441
- for (i = 0; i < m - 1; i++) {
3442
- if (right[i] > right[i + 1]) right[i + 1] = right[i];
3443
- }
3444
- for (i = m - 1; i >= 1; i--) {
3445
- if (left[i] < left[i - 1]) left[i - 1] = left[i];
3446
- }
3447
- var countL = 0,
3448
- countU = 0;
3449
- for (i = 0; i < m; i++) {
3450
- U[i] = numeric.rep([right[i] - left[i] + 1], 0);
3451
- L[i] = numeric.rep([i - left[i]], 0);
3452
- countL += i - left[i] + 1;
3453
- countU += right[i] - i + 1;
3454
- }
3455
- for (k = 0; k < p; k++) {
3456
- i = I[k];
3457
- U[i][J[k] - left[i]] = V[k];
3458
- }
3459
- for (i = 0; i < m - 1; i++) {
3460
- a = i - left[i];
3461
- Ui = U[i];
3462
- for (j = i + 1; left[j] <= i && j < m; j++) {
3463
- b = i - left[j];
3464
- c = right[i] - i;
3465
- Uj = U[j];
3466
- alpha = Uj[b] / Ui[a];
3467
- if (alpha) {
3468
- for (k = 1; k <= c; k++) {
3469
- Uj[k + b] -= alpha * Ui[k + a];
3470
- }
3471
- L[j][i - left[j]] = alpha;
3472
- }
3473
- }
3474
- }
3475
- var Ui = [],
3476
- Uj = [],
3477
- Uv = [],
3478
- Li = [],
3479
- Lj = [],
3480
- Lv = [];
3481
- var p, q, foo;
3482
- p = 0;
3483
- q = 0;
3484
- for (i = 0; i < m; i++) {
3485
- a = left[i];
3486
- b = right[i];
3487
- foo = U[i];
3488
- for (j = i; j <= b; j++) {
3489
- if (foo[j - a]) {
3490
- Ui[p] = i;
3491
- Uj[p] = j;
3492
- Uv[p] = foo[j - a];
3493
- p++;
3494
- }
3495
- }
3496
- foo = L[i];
3497
- for (j = a; j < i; j++) {
3498
- if (foo[j - a]) {
3499
- Li[q] = i;
3500
- Lj[q] = j;
3501
- Lv[q] = foo[j - a];
3502
- q++;
3503
- }
3504
- }
3505
- Li[q] = i;
3506
- Lj[q] = i;
3507
- Lv[q] = 1;
3508
- q++;
3509
- }
3510
- return { U: [Ui, Uj, Uv], L: [Li, Lj, Lv] };
3511
- };
3512
-
3513
- numeric.cLUsolve = function LUsolve(lu, b) {
3514
- var L = lu.L,
3515
- U = lu.U,
3516
- ret = numeric.clone(b);
3517
- var Li = L[0],
3518
- Lj = L[1],
3519
- Lv = L[2];
3520
- var Ui = U[0],
3521
- Uj = U[1],
3522
- Uv = U[2];
3523
- var p = Ui.length,
3524
- q = Li.length;
3525
- var m = ret.length,
3526
- i,
3527
- j,
3528
- k;
3529
- k = 0;
3530
- for (i = 0; i < m; i++) {
3531
- while (Lj[k] < i) {
3532
- ret[i] -= Lv[k] * ret[Lj[k]];
3533
- k++;
3534
- }
3535
- k++;
3536
- }
3537
- k = p - 1;
3538
- for (i = m - 1; i >= 0; i--) {
3539
- while (Uj[k] > i) {
3540
- ret[i] -= Uv[k] * ret[Uj[k]];
3541
- k--;
3542
- }
3543
- ret[i] /= Uv[k];
3544
- k--;
3545
- }
3546
- return ret;
3547
- };
3548
-
3549
- numeric.cgrid = function grid(n, shape) {
3550
- if (typeof n === "number") n = [n, n];
3551
- var ret = numeric.rep(n, -1);
3552
- var i, j, count;
3553
- if (typeof shape !== "function") {
3554
- switch (shape) {
3555
- case "L":
3556
- shape = function (i, j) {
3557
- return i >= n[0] / 2 || j < n[1] / 2;
3558
- };
3559
- break;
3560
- default:
3561
- shape = function (i, j) {
3562
- return true;
3563
- };
3564
- break;
3565
- }
3566
- }
3567
- count = 0;
3568
- for (i = 1; i < n[0] - 1; i++)
3569
- for (j = 1; j < n[1] - 1; j++)
3570
- if (shape(i, j)) {
3571
- ret[i][j] = count;
3572
- count++;
3573
- }
3574
- return ret;
3575
- };
3576
-
3577
- numeric.cdelsq = function delsq(g) {
3578
- var dir = [
3579
- [-1, 0],
3580
- [0, -1],
3581
- [0, 1],
3582
- [1, 0],
3583
- ];
3584
- var s = numeric.dim(g),
3585
- m = s[0],
3586
- n = s[1],
3587
- i,
3588
- j,
3589
- k,
3590
- p,
3591
- q;
3592
- var Li = [],
3593
- Lj = [],
3594
- Lv = [];
3595
- for (i = 1; i < m - 1; i++)
3596
- for (j = 1; j < n - 1; j++) {
3597
- if (g[i][j] < 0) continue;
3598
- for (k = 0; k < 4; k++) {
3599
- p = i + dir[k][0];
3600
- q = j + dir[k][1];
3601
- if (g[p][q] < 0) continue;
3602
- Li.push(g[i][j]);
3603
- Lj.push(g[p][q]);
3604
- Lv.push(-1);
3605
- }
3606
- Li.push(g[i][j]);
3607
- Lj.push(g[i][j]);
3608
- Lv.push(4);
3609
- }
3610
- return [Li, Lj, Lv];
3611
- };
3612
-
3613
- numeric.cdotMV = function dotMV(A, x) {
3614
- var ret,
3615
- Ai = A[0],
3616
- Aj = A[1],
3617
- Av = A[2],
3618
- k,
3619
- p = Ai.length,
3620
- N;
3621
- N = 0;
3622
- for (k = 0; k < p; k++) {
3623
- if (Ai[k] > N) N = Ai[k];
3624
- }
3625
- N++;
3626
- ret = numeric.rep([N], 0);
3627
- for (k = 0; k < p; k++) {
3628
- ret[Ai[k]] += Av[k] * x[Aj[k]];
3629
- }
3630
- return ret;
3631
- };
3632
-
3633
- // 7. Splines
3634
-
3635
- numeric.Spline = function Spline(x, yl, yr, kl, kr) {
3636
- this.x = x;
3637
- this.yl = yl;
3638
- this.yr = yr;
3639
- this.kl = kl;
3640
- this.kr = kr;
3641
- };
3642
- numeric.Spline.prototype._at = function _at(x1, p) {
3643
- var x = this.x;
3644
- var yl = this.yl;
3645
- var yr = this.yr;
3646
- var kl = this.kl;
3647
- var kr = this.kr;
3648
- var x1, a, b, t;
3649
- var add = numeric.add,
3650
- sub = numeric.sub,
3651
- mul = numeric.mul;
3652
- a = sub(mul(kl[p], x[p + 1] - x[p]), sub(yr[p + 1], yl[p]));
3653
- b = add(mul(kr[p + 1], x[p] - x[p + 1]), sub(yr[p + 1], yl[p]));
3654
- t = (x1 - x[p]) / (x[p + 1] - x[p]);
3655
- var s = t * (1 - t);
3656
- return add(
3657
- add(add(mul(1 - t, yl[p]), mul(t, yr[p + 1])), mul(a, s * (1 - t))),
3658
- mul(b, s * t)
3659
- );
3660
- };
3661
- numeric.Spline.prototype.at = function at(x0) {
3662
- if (typeof x0 === "number") {
3663
- var x = this.x;
3664
- var n = x.length;
3665
- var p,
3666
- q,
3667
- mid,
3668
- floor = Math.floor,
3669
- a,
3670
- b,
3671
- t;
3672
- p = 0;
3673
- q = n - 1;
3674
- while (q - p > 1) {
3675
- mid = floor((p + q) / 2);
3676
- if (x[mid] <= x0) p = mid;
3677
- else q = mid;
3678
- }
3679
- return this._at(x0, p);
3680
- }
3681
- var n = x0.length,
3682
- i,
3683
- ret = Array(n);
3684
- for (i = n - 1; i !== -1; --i) ret[i] = this.at(x0[i]);
3685
- return ret;
3686
- };
3687
- numeric.Spline.prototype.diff = function diff() {
3688
- var x = this.x;
3689
- var yl = this.yl;
3690
- var yr = this.yr;
3691
- var kl = this.kl;
3692
- var kr = this.kr;
3693
- var n = yl.length;
3694
- var i, dx, dy;
3695
- var zl = kl,
3696
- zr = kr,
3697
- pl = Array(n),
3698
- pr = Array(n);
3699
- var add = numeric.add,
3700
- mul = numeric.mul,
3701
- div = numeric.div,
3702
- sub = numeric.sub;
3703
- for (i = n - 1; i !== -1; --i) {
3704
- dx = x[i + 1] - x[i];
3705
- dy = sub(yr[i + 1], yl[i]);
3706
- pl[i] = div(
3707
- add(mul(dy, 6), mul(kl[i], -4 * dx), mul(kr[i + 1], -2 * dx)),
3708
- dx * dx
3709
- );
3710
- pr[i + 1] = div(
3711
- add(mul(dy, -6), mul(kl[i], 2 * dx), mul(kr[i + 1], 4 * dx)),
3712
- dx * dx
3713
- );
3714
- }
3715
- return new numeric.Spline(x, zl, zr, pl, pr);
3716
- };
3717
- numeric.Spline.prototype.roots = function roots() {
3718
- function sqr(x) {
3719
- return x * x;
3720
- }
3721
- function heval(y0, y1, k0, k1, x) {
3722
- var A = k0 * 2 - (y1 - y0);
3723
- var B = -k1 * 2 + (y1 - y0);
3724
- var t = (x + 1) * 0.5;
3725
- var s = t * (1 - t);
3726
- return (1 - t) * y0 + t * y1 + A * s * (1 - t) + B * s * t;
3727
- }
3728
- var ret = [];
3729
- var x = this.x,
3730
- yl = this.yl,
3731
- yr = this.yr,
3732
- kl = this.kl,
3733
- kr = this.kr;
3734
- if (typeof yl[0] === "number") {
3735
- yl = [yl];
3736
- yr = [yr];
3737
- kl = [kl];
3738
- kr = [kr];
3739
- }
3740
- var m = yl.length,
3741
- n = x.length - 1,
3742
- i,
3743
- j,
3744
- k,
3745
- y,
3746
- s,
3747
- t;
3748
- var ai,
3749
- bi,
3750
- ci,
3751
- di,
3752
- ret = Array(m),
3753
- ri,
3754
- k0,
3755
- k1,
3756
- y0,
3757
- y1,
3758
- A,
3759
- B,
3760
- D,
3761
- dx,
3762
- cx,
3763
- stops,
3764
- z0,
3765
- z1,
3766
- zm,
3767
- t0,
3768
- t1,
3769
- tm;
3770
- var sqrt = Math.sqrt;
3771
- for (i = 0; i !== m; ++i) {
3772
- ai = yl[i];
3773
- bi = yr[i];
3774
- ci = kl[i];
3775
- di = kr[i];
3776
- ri = [];
3777
- for (j = 0; j !== n; j++) {
3778
- if (j > 0 && bi[j] * ai[j] < 0) ri.push(x[j]);
3779
- dx = x[j + 1] - x[j];
3780
- cx = x[j];
3781
- y0 = ai[j];
3782
- y1 = bi[j + 1];
3783
- k0 = ci[j] / dx;
3784
- k1 = di[j + 1] / dx;
3785
- D = sqr(k0 - k1 + 3 * (y0 - y1)) + 12 * k1 * y0;
3786
- A = k1 + 3 * y0 + 2 * k0 - 3 * y1;
3787
- B = 3 * (k1 + k0 + 2 * (y0 - y1));
3788
- if (D <= 0) {
3789
- z0 = A / B;
3790
- if (z0 > x[j] && z0 < x[j + 1]) stops = [x[j], z0, x[j + 1]];
3791
- else stops = [x[j], x[j + 1]];
3792
- } else {
3793
- z0 = (A - sqrt(D)) / B;
3794
- z1 = (A + sqrt(D)) / B;
3795
- stops = [x[j]];
3796
- if (z0 > x[j] && z0 < x[j + 1]) stops.push(z0);
3797
- if (z1 > x[j] && z1 < x[j + 1]) stops.push(z1);
3798
- stops.push(x[j + 1]);
3799
- }
3800
- t0 = stops[0];
3801
- z0 = this._at(t0, j);
3802
- for (k = 0; k < stops.length - 1; k++) {
3803
- t1 = stops[k + 1];
3804
- z1 = this._at(t1, j);
3805
- if (z0 === 0) {
3806
- ri.push(t0);
3807
- t0 = t1;
3808
- z0 = z1;
3809
- continue;
3810
- }
3811
- if (z1 === 0 || z0 * z1 > 0) {
3812
- t0 = t1;
3813
- z0 = z1;
3814
- continue;
3815
- }
3816
- var side = 0;
3817
- while (1) {
3818
- tm = (z0 * t1 - z1 * t0) / (z0 - z1);
3819
- if (tm <= t0 || tm >= t1) {
3820
- break;
3821
- }
3822
- zm = this._at(tm, j);
3823
- if (zm * z1 > 0) {
3824
- t1 = tm;
3825
- z1 = zm;
3826
- if (side === -1) z0 *= 0.5;
3827
- side = -1;
3828
- } else if (zm * z0 > 0) {
3829
- t0 = tm;
3830
- z0 = zm;
3831
- if (side === 1) z1 *= 0.5;
3832
- side = 1;
3833
- } else break;
3834
- }
3835
- ri.push(tm);
3836
- t0 = stops[k + 1];
3837
- z0 = this._at(t0, j);
3838
- }
3839
- if (z1 === 0) ri.push(t1);
3840
- }
3841
- ret[i] = ri;
3842
- }
3843
- if (typeof this.yl[0] === "number") return ret[0];
3844
- return ret;
3845
- };
3846
- numeric.spline = function spline(x, y, k1, kn) {
3847
- var n = x.length,
3848
- b = [],
3849
- dx = [],
3850
- dy = [];
3851
- var i;
3852
- var sub = numeric.sub,
3853
- mul = numeric.mul,
3854
- add = numeric.add;
3855
- for (i = n - 2; i >= 0; i--) {
3856
- dx[i] = x[i + 1] - x[i];
3857
- dy[i] = sub(y[i + 1], y[i]);
3858
- }
3859
- if (typeof k1 === "string" || typeof kn === "string") {
3860
- k1 = kn = "periodic";
3861
- }
3862
- // Build sparse tridiagonal system
3863
- var T = [[], [], []];
3864
- switch (typeof k1) {
3865
- case "undefined":
3866
- b[0] = mul(3 / (dx[0] * dx[0]), dy[0]);
3867
- T[0].push(0, 0);
3868
- T[1].push(0, 1);
3869
- T[2].push(2 / dx[0], 1 / dx[0]);
3870
- break;
3871
- case "string":
3872
- b[0] = add(
3873
- mul(3 / (dx[n - 2] * dx[n - 2]), dy[n - 2]),
3874
- mul(3 / (dx[0] * dx[0]), dy[0])
3875
- );
3876
- T[0].push(0, 0, 0);
3877
- T[1].push(n - 2, 0, 1);
3878
- T[2].push(1 / dx[n - 2], 2 / dx[n - 2] + 2 / dx[0], 1 / dx[0]);
3879
- break;
3880
- default:
3881
- b[0] = k1;
3882
- T[0].push(0);
3883
- T[1].push(0);
3884
- T[2].push(1);
3885
- break;
3886
- }
3887
- for (i = 1; i < n - 1; i++) {
3888
- b[i] = add(
3889
- mul(3 / (dx[i - 1] * dx[i - 1]), dy[i - 1]),
3890
- mul(3 / (dx[i] * dx[i]), dy[i])
3891
- );
3892
- T[0].push(i, i, i);
3893
- T[1].push(i - 1, i, i + 1);
3894
- T[2].push(1 / dx[i - 1], 2 / dx[i - 1] + 2 / dx[i], 1 / dx[i]);
3895
- }
3896
- switch (typeof kn) {
3897
- case "undefined":
3898
- b[n - 1] = mul(3 / (dx[n - 2] * dx[n - 2]), dy[n - 2]);
3899
- T[0].push(n - 1, n - 1);
3900
- T[1].push(n - 2, n - 1);
3901
- T[2].push(1 / dx[n - 2], 2 / dx[n - 2]);
3902
- break;
3903
- case "string":
3904
- T[1][T[1].length - 1] = 0;
3905
- break;
3906
- default:
3907
- b[n - 1] = kn;
3908
- T[0].push(n - 1);
3909
- T[1].push(n - 1);
3910
- T[2].push(1);
3911
- break;
3912
- }
3913
- if (typeof b[0] !== "number") b = numeric.transpose(b);
3914
- else b = [b];
3915
- var k = Array(b.length);
3916
- if (typeof k1 === "string") {
3917
- for (i = k.length - 1; i !== -1; --i) {
3918
- k[i] = numeric.ccsLUPSolve(
3919
- numeric.ccsLUP(numeric.ccsScatter(T)),
3920
- b[i]
3921
- );
3922
- k[i][n - 1] = k[i][0];
3923
- }
3924
- } else {
3925
- for (i = k.length - 1; i !== -1; --i) {
3926
- k[i] = numeric.cLUsolve(numeric.cLU(T), b[i]);
3927
- }
3928
- }
3929
- if (typeof y[0] === "number") k = k[0];
3930
- else k = numeric.transpose(k);
3931
- return new numeric.Spline(x, y, y, k, k);
3932
- };
3933
-
3934
- // 8. FFT
3935
- numeric.fftpow2 = function fftpow2(x, y) {
3936
- var n = x.length;
3937
- if (n === 1) return;
3938
- var cos = Math.cos,
3939
- sin = Math.sin,
3940
- i,
3941
- j;
3942
- var xe = Array(n / 2),
3943
- ye = Array(n / 2),
3944
- xo = Array(n / 2),
3945
- yo = Array(n / 2);
3946
- j = n / 2;
3947
- for (i = n - 1; i !== -1; --i) {
3948
- --j;
3949
- xo[j] = x[i];
3950
- yo[j] = y[i];
3951
- --i;
3952
- xe[j] = x[i];
3953
- ye[j] = y[i];
3954
- }
3955
- fftpow2(xe, ye);
3956
- fftpow2(xo, yo);
3957
- j = n / 2;
3958
- var t,
3959
- k = -6.2831853071795864769252867665590057683943387987502116419 / n,
3960
- ci,
3961
- si;
3962
- for (i = n - 1; i !== -1; --i) {
3963
- --j;
3964
- if (j === -1) j = n / 2 - 1;
3965
- t = k * i;
3966
- ci = cos(t);
3967
- si = sin(t);
3968
- x[i] = xe[j] + ci * xo[j] - si * yo[j];
3969
- y[i] = ye[j] + ci * yo[j] + si * xo[j];
3970
- }
3971
- };
3972
- numeric._ifftpow2 = function _ifftpow2(x, y) {
3973
- var n = x.length;
3974
- if (n === 1) return;
3975
- var cos = Math.cos,
3976
- sin = Math.sin,
3977
- i,
3978
- j;
3979
- var xe = Array(n / 2),
3980
- ye = Array(n / 2),
3981
- xo = Array(n / 2),
3982
- yo = Array(n / 2);
3983
- j = n / 2;
3984
- for (i = n - 1; i !== -1; --i) {
3985
- --j;
3986
- xo[j] = x[i];
3987
- yo[j] = y[i];
3988
- --i;
3989
- xe[j] = x[i];
3990
- ye[j] = y[i];
3991
- }
3992
- _ifftpow2(xe, ye);
3993
- _ifftpow2(xo, yo);
3994
- j = n / 2;
3995
- var t,
3996
- k = 6.2831853071795864769252867665590057683943387987502116419 / n,
3997
- ci,
3998
- si;
3999
- for (i = n - 1; i !== -1; --i) {
4000
- --j;
4001
- if (j === -1) j = n / 2 - 1;
4002
- t = k * i;
4003
- ci = cos(t);
4004
- si = sin(t);
4005
- x[i] = xe[j] + ci * xo[j] - si * yo[j];
4006
- y[i] = ye[j] + ci * yo[j] + si * xo[j];
4007
- }
4008
- };
4009
- numeric.ifftpow2 = function ifftpow2(x, y) {
4010
- numeric._ifftpow2(x, y);
4011
- numeric.diveq(x, x.length);
4012
- numeric.diveq(y, y.length);
4013
- };
4014
- numeric.convpow2 = function convpow2(ax, ay, bx, by) {
4015
- numeric.fftpow2(ax, ay);
4016
- numeric.fftpow2(bx, by);
4017
- var i,
4018
- n = ax.length,
4019
- axi,
4020
- bxi,
4021
- ayi,
4022
- byi;
4023
- for (i = n - 1; i !== -1; --i) {
4024
- axi = ax[i];
4025
- ayi = ay[i];
4026
- bxi = bx[i];
4027
- byi = by[i];
4028
- ax[i] = axi * bxi - ayi * byi;
4029
- ay[i] = axi * byi + ayi * bxi;
4030
- }
4031
- numeric.ifftpow2(ax, ay);
4032
- };
4033
- numeric.T.prototype.fft = function fft() {
4034
- var x = this.x,
4035
- y = this.y;
4036
- var n = x.length,
4037
- log = Math.log,
4038
- log2 = log(2),
4039
- p = Math.ceil(log(2 * n - 1) / log2),
4040
- m = Math.pow(2, p);
4041
- var cx = numeric.rep([m], 0),
4042
- cy = numeric.rep([m], 0),
4043
- cos = Math.cos,
4044
- sin = Math.sin;
4045
- var k,
4046
- c = -3.14159265358979323846264338327950288419716939937510582 / n,
4047
- t;
4048
- var a = numeric.rep([m], 0),
4049
- b = numeric.rep([m], 0),
4050
- nhalf = Math.floor(n / 2);
4051
- for (k = 0; k < n; k++) a[k] = x[k];
4052
- if (typeof y !== "undefined") for (k = 0; k < n; k++) b[k] = y[k];
4053
- cx[0] = 1;
4054
- for (k = 1; k <= m / 2; k++) {
4055
- t = c * k * k;
4056
- cx[k] = cos(t);
4057
- cy[k] = sin(t);
4058
- cx[m - k] = cos(t);
4059
- cy[m - k] = sin(t);
4060
- }
4061
- var X = new numeric.T(a, b),
4062
- Y = new numeric.T(cx, cy);
4063
- X = X.mul(Y);
4064
- numeric.convpow2(X.x, X.y, numeric.clone(Y.x), numeric.neg(Y.y));
4065
- X = X.mul(Y);
4066
- X.x.length = n;
4067
- X.y.length = n;
4068
- return X;
4069
- };
4070
- numeric.T.prototype.ifft = function ifft() {
4071
- var x = this.x,
4072
- y = this.y;
4073
- var n = x.length,
4074
- log = Math.log,
4075
- log2 = log(2),
4076
- p = Math.ceil(log(2 * n - 1) / log2),
4077
- m = Math.pow(2, p);
4078
- var cx = numeric.rep([m], 0),
4079
- cy = numeric.rep([m], 0),
4080
- cos = Math.cos,
4081
- sin = Math.sin;
4082
- var k,
4083
- c = 3.14159265358979323846264338327950288419716939937510582 / n,
4084
- t;
4085
- var a = numeric.rep([m], 0),
4086
- b = numeric.rep([m], 0),
4087
- nhalf = Math.floor(n / 2);
4088
- for (k = 0; k < n; k++) a[k] = x[k];
4089
- if (typeof y !== "undefined") for (k = 0; k < n; k++) b[k] = y[k];
4090
- cx[0] = 1;
4091
- for (k = 1; k <= m / 2; k++) {
4092
- t = c * k * k;
4093
- cx[k] = cos(t);
4094
- cy[k] = sin(t);
4095
- cx[m - k] = cos(t);
4096
- cy[m - k] = sin(t);
4097
- }
4098
- var X = new numeric.T(a, b),
4099
- Y = new numeric.T(cx, cy);
4100
- X = X.mul(Y);
4101
- numeric.convpow2(X.x, X.y, numeric.clone(Y.x), numeric.neg(Y.y));
4102
- X = X.mul(Y);
4103
- X.x.length = n;
4104
- X.y.length = n;
4105
- return X.div(n);
4106
- };
4107
-
4108
- //9. Unconstrained optimization
4109
- numeric.gradient = function gradient(f, x) {
4110
- var n = x.length;
4111
- var f0 = f(x);
4112
- if (isNaN(f0)) throw new Error("gradient: f(x) is a NaN!");
4113
- var max = Math.max;
4114
- var i,
4115
- x0 = numeric.clone(x),
4116
- f1,
4117
- f2,
4118
- J = Array(n);
4119
- var div = numeric.div,
4120
- sub = numeric.sub,
4121
- errest,
4122
- roundoff,
4123
- max = Math.max,
4124
- eps = 1e-3,
4125
- abs = Math.abs,
4126
- min = Math.min;
4127
- var t0,
4128
- t1,
4129
- t2,
4130
- it = 0,
4131
- d1,
4132
- d2,
4133
- N;
4134
- for (i = 0; i < n; i++) {
4135
- var h = max(1e-6 * f0, 1e-8);
4136
- while (1) {
4137
- ++it;
4138
- if (it > 20) {
4139
- throw new Error("Numerical gradient fails");
4140
- }
4141
- x0[i] = x[i] + h;
4142
- f1 = f(x0);
4143
- x0[i] = x[i] - h;
4144
- f2 = f(x0);
4145
- x0[i] = x[i];
4146
- if (isNaN(f1) || isNaN(f2)) {
4147
- h /= 16;
4148
- continue;
4149
- }
4150
- J[i] = (f1 - f2) / (2 * h);
4151
- t0 = x[i] - h;
4152
- t1 = x[i];
4153
- t2 = x[i] + h;
4154
- d1 = (f1 - f0) / h;
4155
- d2 = (f0 - f2) / h;
4156
- N = max(
4157
- abs(J[i]),
4158
- abs(f0),
4159
- abs(f1),
4160
- abs(f2),
4161
- abs(t0),
4162
- abs(t1),
4163
- abs(t2),
4164
- 1e-8
4165
- );
4166
- errest = min(
4167
- max(abs(d1 - J[i]), abs(d2 - J[i]), abs(d1 - d2)) / N,
4168
- h / N
4169
- );
4170
- if (errest > eps) {
4171
- h /= 16;
4172
- } else break;
4173
- }
4174
- }
4175
- return J;
4176
- };
4177
-
4178
- numeric.uncmin = function uncmin(
4179
- f,
4180
- x0,
4181
- tol,
4182
- gradient,
4183
- maxit,
4184
- callback,
4185
- options
4186
- ) {
4187
- var grad = numeric.gradient;
4188
- if (typeof options === "undefined") {
4189
- options = {};
4190
- }
4191
- if (typeof tol === "undefined") {
4192
- tol = 1e-8;
4193
- }
4194
- if (typeof gradient === "undefined") {
4195
- gradient = function (x) {
4196
- return grad(f, x);
4197
- };
4198
- }
4199
- if (typeof maxit === "undefined") maxit = 1000;
4200
- x0 = numeric.clone(x0);
4201
- var n = x0.length;
4202
- var f0 = f(x0),
4203
- f1,
4204
- df0;
4205
- if (isNaN(f0)) throw new Error("uncmin: f(x0) is a NaN!");
4206
- var max = Math.max,
4207
- norm2 = numeric.norm2;
4208
- tol = max(tol, numeric.epsilon);
4209
- var step,
4210
- g0,
4211
- g1,
4212
- H1 = options.Hinv || numeric.identity(n);
4213
- var dot = numeric.dot,
4214
- inv = numeric.inv,
4215
- sub = numeric.sub,
4216
- add = numeric.add,
4217
- ten = numeric.tensor,
4218
- div = numeric.div,
4219
- mul = numeric.mul;
4220
- var all = numeric.all,
4221
- isfinite = numeric.isFinite,
4222
- neg = numeric.neg;
4223
- var it = 0,
4224
- i,
4225
- s,
4226
- x1,
4227
- y,
4228
- Hy,
4229
- Hs,
4230
- ys,
4231
- i0,
4232
- t,
4233
- nstep,
4234
- t1,
4235
- t2;
4236
- var msg = "";
4237
- g0 = gradient(x0);
4238
- while (it < maxit) {
4239
- if (typeof callback === "function") {
4240
- if (callback(it, x0, f0, g0, H1)) {
4241
- msg = "Callback returned true";
4242
- break;
4243
- }
4244
- }
4245
- if (!all(isfinite(g0))) {
4246
- msg = "Gradient has Infinity or NaN";
4247
- break;
4248
- }
4249
- step = neg(dot(H1, g0));
4250
- if (!all(isfinite(step))) {
4251
- msg = "Search direction has Infinity or NaN";
4252
- break;
4253
- }
4254
- nstep = norm2(step);
4255
- if (nstep < tol) {
4256
- msg = "Newton step smaller than tol";
4257
- break;
4258
- }
4259
- t = 1;
4260
- df0 = dot(g0, step);
4261
- // line search
4262
- x1 = x0;
4263
- while (it < maxit) {
4264
- if (t * nstep < tol) {
4265
- break;
4266
- }
4267
- s = mul(step, t);
4268
- x1 = add(x0, s);
4269
- f1 = f(x1);
4270
- if (f1 - f0 >= 0.1 * t * df0 || isNaN(f1)) {
4271
- t *= 0.5;
4272
- ++it;
4273
- continue;
4274
- }
4275
- break;
4276
- }
4277
- if (t * nstep < tol) {
4278
- msg = "Line search step size smaller than tol";
4279
- break;
4280
- }
4281
- if (it === maxit) {
4282
- msg = "maxit reached during line search";
4283
- break;
4284
- }
4285
- g1 = gradient(x1);
4286
- y = sub(g1, g0);
4287
- ys = dot(y, s);
4288
- Hy = dot(H1, y);
4289
- H1 = sub(
4290
- add(H1, mul((ys + dot(y, Hy)) / (ys * ys), ten(s, s))),
4291
- div(add(ten(Hy, s), ten(s, Hy)), ys)
4292
- );
4293
- x0 = x1;
4294
- f0 = f1;
4295
- g0 = g1;
4296
- ++it;
4297
- }
4298
- return {
4299
- solution: x0,
4300
- f: f0,
4301
- gradient: g0,
4302
- invHessian: H1,
4303
- iterations: it,
4304
- message: msg,
4305
- };
4306
- };
4307
-
4308
- // 10. Ode solver (Dormand-Prince)
4309
- numeric.Dopri = function Dopri(x, y, f, ymid, iterations, msg, events) {
4310
- this.x = x;
4311
- this.y = y;
4312
- this.f = f;
4313
- this.ymid = ymid;
4314
- this.iterations = iterations;
4315
- this.events = events;
4316
- this.message = msg;
4317
- };
4318
- numeric.Dopri.prototype._at = function _at(xi, j) {
4319
- function sqr(x) {
4320
- return x * x;
4321
- }
4322
- var sol = this;
4323
- var xs = sol.x;
4324
- var ys = sol.y;
4325
- var k1 = sol.f;
4326
- var ymid = sol.ymid;
4327
- var n = xs.length;
4328
- var x0, x1, xh, y0, y1, yh, xi;
4329
- var floor = Math.floor,
4330
- h;
4331
- var c = 0.5;
4332
- var add = numeric.add,
4333
- mul = numeric.mul,
4334
- sub = numeric.sub,
4335
- p,
4336
- q,
4337
- w;
4338
- x0 = xs[j];
4339
- x1 = xs[j + 1];
4340
- y0 = ys[j];
4341
- y1 = ys[j + 1];
4342
- h = x1 - x0;
4343
- xh = x0 + c * h;
4344
- yh = ymid[j];
4345
- p = sub(k1[j], mul(y0, 1 / (x0 - xh) + 2 / (x0 - x1)));
4346
- q = sub(k1[j + 1], mul(y1, 1 / (x1 - xh) + 2 / (x1 - x0)));
4347
- w = [
4348
- (sqr(xi - x1) * (xi - xh)) / sqr(x0 - x1) / (x0 - xh),
4349
- (sqr(xi - x0) * sqr(xi - x1)) / sqr(x0 - xh) / sqr(x1 - xh),
4350
- (sqr(xi - x0) * (xi - xh)) / sqr(x1 - x0) / (x1 - xh),
4351
- ((xi - x0) * sqr(xi - x1) * (xi - xh)) / sqr(x0 - x1) / (x0 - xh),
4352
- ((xi - x1) * sqr(xi - x0) * (xi - xh)) / sqr(x0 - x1) / (x1 - xh),
4353
- ];
4354
- return add(
4355
- add(
4356
- add(add(mul(y0, w[0]), mul(yh, w[1])), mul(y1, w[2])),
4357
- mul(p, w[3])
4358
- ),
4359
- mul(q, w[4])
4360
- );
4361
- };
4362
- numeric.Dopri.prototype.at = function at(x) {
4363
- var i,
4364
- j,
4365
- k,
4366
- floor = Math.floor;
4367
- if (typeof x !== "number") {
4368
- var n = x.length,
4369
- ret = Array(n);
4370
- for (i = n - 1; i !== -1; --i) {
4371
- ret[i] = this.at(x[i]);
4372
- }
4373
- return ret;
4374
- }
4375
- var x0 = this.x;
4376
- i = 0;
4377
- j = x0.length - 1;
4378
- while (j - i > 1) {
4379
- k = floor(0.5 * (i + j));
4380
- if (x0[k] <= x) i = k;
4381
- else j = k;
4382
- }
4383
- return this._at(x, i);
4384
- };
4385
-
4386
- numeric.dopri = function dopri(x0, x1, y0, f, tol, maxit, event) {
4387
- if (typeof tol === "undefined") {
4388
- tol = 1e-6;
4389
- }
4390
- if (typeof maxit === "undefined") {
4391
- maxit = 1000;
4392
- }
4393
- var xs = [x0],
4394
- ys = [y0],
4395
- k1 = [f(x0, y0)],
4396
- k2,
4397
- k3,
4398
- k4,
4399
- k5,
4400
- k6,
4401
- k7,
4402
- ymid = [];
4403
- var A2 = 1 / 5;
4404
- var A3 = [3 / 40, 9 / 40];
4405
- var A4 = [44 / 45, -56 / 15, 32 / 9];
4406
- var A5 = [19372 / 6561, -25360 / 2187, 64448 / 6561, -212 / 729];
4407
- var A6 = [9017 / 3168, -355 / 33, 46732 / 5247, 49 / 176, -5103 / 18656];
4408
- var b = [35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84];
4409
- var bm = [
4410
- (0.5 * 6025192743) / 30085553152,
4411
- 0,
4412
- (0.5 * 51252292925) / 65400821598,
4413
- (0.5 * -2691868925) / 45128329728,
4414
- (0.5 * 187940372067) / 1594534317056,
4415
- (0.5 * -1776094331) / 19743644256,
4416
- (0.5 * 11237099) / 235043384,
4417
- ];
4418
- var c = [1 / 5, 3 / 10, 4 / 5, 8 / 9, 1, 1];
4419
- var e = [
4420
- -71 / 57600,
4421
- 0,
4422
- 71 / 16695,
4423
- -71 / 1920,
4424
- 17253 / 339200,
4425
- -22 / 525,
4426
- 1 / 40,
4427
- ];
4428
- var i = 0,
4429
- er,
4430
- j;
4431
- var h = (x1 - x0) / 10;
4432
- var it = 0;
4433
- var add = numeric.add,
4434
- mul = numeric.mul,
4435
- y1,
4436
- erinf;
4437
- var max = Math.max,
4438
- min = Math.min,
4439
- abs = Math.abs,
4440
- norminf = numeric.norminf,
4441
- pow = Math.pow;
4442
- var any = numeric.any,
4443
- lt = numeric.lt,
4444
- and = numeric.and,
4445
- sub = numeric.sub;
4446
- var e0, e1, ev;
4447
- var ret = new numeric.Dopri(xs, ys, k1, ymid, -1, "");
4448
- if (typeof event === "function") e0 = event(x0, y0);
4449
- while (x0 < x1 && it < maxit) {
4450
- ++it;
4451
- if (x0 + h > x1) h = x1 - x0;
4452
- k2 = f(x0 + c[0] * h, add(y0, mul(A2 * h, k1[i])));
4453
- k3 = f(
4454
- x0 + c[1] * h,
4455
- add(add(y0, mul(A3[0] * h, k1[i])), mul(A3[1] * h, k2))
4456
- );
4457
- k4 = f(
4458
- x0 + c[2] * h,
4459
- add(
4460
- add(add(y0, mul(A4[0] * h, k1[i])), mul(A4[1] * h, k2)),
4461
- mul(A4[2] * h, k3)
4462
- )
4463
- );
4464
- k5 = f(
4465
- x0 + c[3] * h,
4466
- add(
4467
- add(
4468
- add(add(y0, mul(A5[0] * h, k1[i])), mul(A5[1] * h, k2)),
4469
- mul(A5[2] * h, k3)
4470
- ),
4471
- mul(A5[3] * h, k4)
4472
- )
4473
- );
4474
- k6 = f(
4475
- x0 + c[4] * h,
4476
- add(
4477
- add(
4478
- add(
4479
- add(add(y0, mul(A6[0] * h, k1[i])), mul(A6[1] * h, k2)),
4480
- mul(A6[2] * h, k3)
4481
- ),
4482
- mul(A6[3] * h, k4)
4483
- ),
4484
- mul(A6[4] * h, k5)
4485
- )
4486
- );
4487
- y1 = add(
4488
- add(
4489
- add(
4490
- add(add(y0, mul(k1[i], h * b[0])), mul(k3, h * b[2])),
4491
- mul(k4, h * b[3])
4492
- ),
4493
- mul(k5, h * b[4])
4494
- ),
4495
- mul(k6, h * b[5])
4496
- );
4497
- k7 = f(x0 + h, y1);
4498
- er = add(
4499
- add(
4500
- add(
4501
- add(
4502
- add(mul(k1[i], h * e[0]), mul(k3, h * e[2])),
4503
- mul(k4, h * e[3])
4504
- ),
4505
- mul(k5, h * e[4])
4506
- ),
4507
- mul(k6, h * e[5])
4508
- ),
4509
- mul(k7, h * e[6])
4510
- );
4511
- if (typeof er === "number") erinf = abs(er);
4512
- else erinf = norminf(er);
4513
- if (erinf > tol) {
4514
- // reject
4515
- h = 0.2 * h * pow(tol / erinf, 0.25);
4516
- if (x0 + h === x0) {
4517
- ret.msg = "Step size became too small";
4518
- break;
4519
- }
4520
- continue;
4521
- }
4522
- ymid[i] = add(
4523
- add(
4524
- add(
4525
- add(
4526
- add(add(y0, mul(k1[i], h * bm[0])), mul(k3, h * bm[2])),
4527
- mul(k4, h * bm[3])
4528
- ),
4529
- mul(k5, h * bm[4])
4530
- ),
4531
- mul(k6, h * bm[5])
4532
- ),
4533
- mul(k7, h * bm[6])
4534
- );
4535
- ++i;
4536
- xs[i] = x0 + h;
4537
- ys[i] = y1;
4538
- k1[i] = k7;
4539
- if (typeof event === "function") {
4540
- var yi,
4541
- xl = x0,
4542
- xr = x0 + 0.5 * h,
4543
- xi;
4544
- e1 = event(xr, ymid[i - 1]);
4545
- ev = and(lt(e0, 0), lt(0, e1));
4546
- if (!any(ev)) {
4547
- xl = xr;
4548
- xr = x0 + h;
4549
- e0 = e1;
4550
- e1 = event(xr, y1);
4551
- ev = and(lt(e0, 0), lt(0, e1));
4552
- }
4553
- if (any(ev)) {
4554
- var xc, yc, en, ei;
4555
- var side = 0,
4556
- sl = 1.0,
4557
- sr = 1.0;
4558
- while (1) {
4559
- if (typeof e0 === "number")
4560
- xi =
4561
- (sr * e1 * xl - sl * e0 * xr) / (sr * e1 - sl * e0);
4562
- else {
4563
- xi = xr;
4564
- for (j = e0.length - 1; j !== -1; --j) {
4565
- if (e0[j] < 0 && e1[j] > 0)
4566
- xi = min(
4567
- xi,
4568
- (sr * e1[j] * xl - sl * e0[j] * xr) /
4569
- (sr * e1[j] - sl * e0[j])
4570
- );
4571
- }
4572
- }
4573
- if (xi <= xl || xi >= xr) break;
4574
- yi = ret._at(xi, i - 1);
4575
- ei = event(xi, yi);
4576
- en = and(lt(e0, 0), lt(0, ei));
4577
- if (any(en)) {
4578
- xr = xi;
4579
- e1 = ei;
4580
- ev = en;
4581
- sr = 1.0;
4582
- if (side === -1) sl *= 0.5;
4583
- else sl = 1.0;
4584
- side = -1;
4585
- } else {
4586
- xl = xi;
4587
- e0 = ei;
4588
- sl = 1.0;
4589
- if (side === 1) sr *= 0.5;
4590
- else sr = 1.0;
4591
- side = 1;
4592
- }
4593
- }
4594
- y1 = ret._at(0.5 * (x0 + xi), i - 1);
4595
- ret.f[i] = f(xi, yi);
4596
- ret.x[i] = xi;
4597
- ret.y[i] = yi;
4598
- ret.ymid[i - 1] = y1;
4599
- ret.events = ev;
4600
- ret.iterations = it;
4601
- return ret;
4602
- }
4603
- }
4604
- x0 += h;
4605
- y0 = y1;
4606
- e0 = e1;
4607
- h = min(0.8 * h * pow(tol / erinf, 0.25), 4 * h);
4608
- }
4609
- ret.iterations = it;
4610
- return ret;
4611
- };
4612
-
4613
- // 11. Ax = b
4614
- numeric.LU = function (A, fast) {
4615
- fast = fast || false;
4616
-
4617
- var abs = Math.abs;
4618
- var i, j, k, absAjk, Akk, Ak, Pk, Ai;
4619
- var max;
4620
- var n = A.length,
4621
- n1 = n - 1;
4622
- var P = new Array(n);
4623
- if (!fast) A = numeric.clone(A);
4624
-
4625
- for (k = 0; k < n; ++k) {
4626
- Pk = k;
4627
- Ak = A[k];
4628
- max = abs(Ak[k]);
4629
- for (j = k + 1; j < n; ++j) {
4630
- absAjk = abs(A[j][k]);
4631
- if (max < absAjk) {
4632
- max = absAjk;
4633
- Pk = j;
4634
- }
4635
- }
4636
- P[k] = Pk;
4637
-
4638
- if (Pk != k) {
4639
- A[k] = A[Pk];
4640
- A[Pk] = Ak;
4641
- Ak = A[k];
4642
- }
4643
-
4644
- Akk = Ak[k];
4645
-
4646
- for (i = k + 1; i < n; ++i) {
4647
- A[i][k] /= Akk;
4648
- }
4649
-
4650
- for (i = k + 1; i < n; ++i) {
4651
- Ai = A[i];
4652
- for (j = k + 1; j < n1; ++j) {
4653
- Ai[j] -= Ai[k] * Ak[j];
4654
- ++j;
4655
- Ai[j] -= Ai[k] * Ak[j];
4656
- }
4657
- if (j === n1) Ai[j] -= Ai[k] * Ak[j];
4658
- }
4659
- }
4660
-
4661
- return {
4662
- LU: A,
4663
- P: P,
4664
- };
4665
- };
4666
-
4667
- numeric.LUsolve = function LUsolve(LUP, b) {
4668
- var i, j;
4669
- var LU = LUP.LU;
4670
- var n = LU.length;
4671
- var x = numeric.clone(b);
4672
- var P = LUP.P;
4673
- var Pi, LUi, LUii, tmp;
4674
-
4675
- for (i = n - 1; i !== -1; --i) x[i] = b[i];
4676
- for (i = 0; i < n; ++i) {
4677
- Pi = P[i];
4678
- if (P[i] !== i) {
4679
- tmp = x[i];
4680
- x[i] = x[Pi];
4681
- x[Pi] = tmp;
4682
- }
4683
-
4684
- LUi = LU[i];
4685
- for (j = 0; j < i; ++j) {
4686
- x[i] -= x[j] * LUi[j];
4687
- }
4688
- }
4689
-
4690
- for (i = n - 1; i >= 0; --i) {
4691
- LUi = LU[i];
4692
- for (j = i + 1; j < n; ++j) {
4693
- x[i] -= x[j] * LUi[j];
4694
- }
4695
-
4696
- x[i] /= LUi[i];
4697
- }
4698
-
4699
- return x;
4700
- };
4701
-
4702
- numeric.solve = function solve(A, b, fast) {
4703
- return numeric.LUsolve(numeric.LU(A, fast), b);
4704
- };
4705
-
4706
- // 12. Linear programming
4707
- numeric.echelonize = function echelonize(A) {
4708
- var s = numeric.dim(A),
4709
- m = s[0],
4710
- n = s[1];
4711
- var I = numeric.identity(m);
4712
- var P = Array(m);
4713
- var i, j, k, l, Ai, Ii, Z, a;
4714
- var abs = Math.abs;
4715
- var diveq = numeric.diveq;
4716
- A = numeric.clone(A);
4717
- for (i = 0; i < m; ++i) {
4718
- k = 0;
4719
- Ai = A[i];
4720
- Ii = I[i];
4721
- for (j = 1; j < n; ++j) if (abs(Ai[k]) < abs(Ai[j])) k = j;
4722
- P[i] = k;
4723
- diveq(Ii, Ai[k]);
4724
- diveq(Ai, Ai[k]);
4725
- for (j = 0; j < m; ++j)
4726
- if (j !== i) {
4727
- Z = A[j];
4728
- a = Z[k];
4729
- for (l = n - 1; l !== -1; --l) Z[l] -= Ai[l] * a;
4730
- Z = I[j];
4731
- for (l = m - 1; l !== -1; --l) Z[l] -= Ii[l] * a;
4732
- }
4733
- }
4734
- return { I: I, A: A, P: P };
4735
- };
4736
-
4737
- numeric.__solveLP = function __solveLP(c, A, b, tol, maxit, x, flag) {
4738
- var sum = numeric.sum,
4739
- log = numeric.log,
4740
- mul = numeric.mul,
4741
- sub = numeric.sub,
4742
- dot = numeric.dot,
4743
- div = numeric.div,
4744
- add = numeric.add;
4745
- var m = c.length,
4746
- n = b.length,
4747
- y;
4748
- var unbounded = false,
4749
- cb,
4750
- i0 = 0;
4751
- var alpha = 1.0;
4752
- var f0,
4753
- df0,
4754
- AT = numeric.transpose(A),
4755
- svd = numeric.svd,
4756
- transpose = numeric.transpose,
4757
- leq = numeric.leq,
4758
- sqrt = Math.sqrt,
4759
- abs = Math.abs;
4760
- var muleq = numeric.muleq;
4761
- var norm = numeric.norminf,
4762
- any = numeric.any,
4763
- min = Math.min;
4764
- var all = numeric.all,
4765
- gt = numeric.gt;
4766
- var p = Array(m),
4767
- A0 = Array(n),
4768
- e = numeric.rep([n], 1),
4769
- H;
4770
- var solve = numeric.solve,
4771
- z = sub(b, dot(A, x)),
4772
- count;
4773
- var dotcc = dot(c, c);
4774
- var g;
4775
- for (count = i0; count < maxit; ++count) {
4776
- var i, j, d;
4777
- for (i = n - 1; i !== -1; --i) A0[i] = div(A[i], z[i]);
4778
- var A1 = transpose(A0);
4779
- for (i = m - 1; i !== -1; --i) p[i] = /*x[i]+*/ sum(A1[i]);
4780
- alpha = 0.25 * abs(dotcc / dot(c, p));
4781
- var a1 = 100 * sqrt(dotcc / dot(p, p));
4782
- if (!isFinite(alpha) || alpha > a1) alpha = a1;
4783
- g = add(c, mul(alpha, p));
4784
- H = dot(A1, A0);
4785
- for (i = m - 1; i !== -1; --i) H[i][i] += 1;
4786
- d = solve(H, div(g, alpha), true);
4787
- var t0 = div(z, dot(A, d));
4788
- var t = 1.0;
4789
- for (i = n - 1; i !== -1; --i)
4790
- if (t0[i] < 0) t = min(t, -0.999 * t0[i]);
4791
- y = sub(x, mul(d, t));
4792
- z = sub(b, dot(A, y));
4793
- if (!all(gt(z, 0)))
4794
- return { solution: x, message: "", iterations: count };
4795
- x = y;
4796
- if (alpha < tol) return { solution: y, message: "", iterations: count };
4797
- if (flag) {
4798
- var s = dot(c, g),
4799
- Ag = dot(A, g);
4800
- unbounded = true;
4801
- for (i = n - 1; i !== -1; --i)
4802
- if (s * Ag[i] < 0) {
4803
- unbounded = false;
4804
- break;
4805
- }
4806
- } else {
4807
- if (x[m - 1] >= 0) unbounded = false;
4808
- else unbounded = true;
4809
- }
4810
- if (unbounded)
4811
- return { solution: y, message: "Unbounded", iterations: count };
4812
- }
4813
- return {
4814
- solution: x,
4815
- message: "maximum iteration count exceeded",
4816
- iterations: count,
4817
- };
4818
- };
4819
-
4820
- numeric._solveLP = function _solveLP(c, A, b, tol, maxit) {
4821
- var m = c.length,
4822
- n = b.length,
4823
- y;
4824
- var sum = numeric.sum,
4825
- log = numeric.log,
4826
- mul = numeric.mul,
4827
- sub = numeric.sub,
4828
- dot = numeric.dot,
4829
- div = numeric.div,
4830
- add = numeric.add;
4831
- var c0 = numeric.rep([m], 0).concat([1]);
4832
- var J = numeric.rep([n, 1], -1);
4833
- var A0 = numeric.blockMatrix([[A, J]]);
4834
- var b0 = b;
4835
- var y = numeric
4836
- .rep([m], 0)
4837
- .concat(Math.max(0, numeric.sup(numeric.neg(b))) + 1);
4838
- var x0 = numeric.__solveLP(c0, A0, b0, tol, maxit, y, false);
4839
- var x = numeric.clone(x0.solution);
4840
- x.length = m;
4841
- var foo = numeric.inf(sub(b, dot(A, x)));
4842
- if (foo < 0) {
4843
- return {
4844
- solution: NaN,
4845
- message: "Infeasible",
4846
- iterations: x0.iterations,
4847
- };
4848
- }
4849
- var ret = numeric.__solveLP(c, A, b, tol, maxit - x0.iterations, x, true);
4850
- ret.iterations += x0.iterations;
4851
- return ret;
4852
- };
4853
-
4854
- numeric.solveLP = function solveLP(c, A, b, Aeq, beq, tol, maxit) {
4855
- if (typeof maxit === "undefined") maxit = 1000;
4856
- if (typeof tol === "undefined") tol = numeric.epsilon;
4857
- if (typeof Aeq === "undefined")
4858
- return numeric._solveLP(c, A, b, tol, maxit);
4859
- var m = Aeq.length,
4860
- n = Aeq[0].length,
4861
- o = A.length;
4862
- var B = numeric.echelonize(Aeq);
4863
- var flags = numeric.rep([n], 0);
4864
- var P = B.P;
4865
- var Q = [];
4866
- var i;
4867
- for (i = P.length - 1; i !== -1; --i) flags[P[i]] = 1;
4868
- for (i = n - 1; i !== -1; --i) if (flags[i] === 0) Q.push(i);
4869
- var g = numeric.getRange;
4870
- var I = numeric.linspace(0, m - 1),
4871
- J = numeric.linspace(0, o - 1);
4872
- var Aeq2 = g(Aeq, I, Q),
4873
- A1 = g(A, J, P),
4874
- A2 = g(A, J, Q),
4875
- dot = numeric.dot,
4876
- sub = numeric.sub;
4877
- var A3 = dot(A1, B.I);
4878
- var A4 = sub(A2, dot(A3, Aeq2)),
4879
- b4 = sub(b, dot(A3, beq));
4880
- var c1 = Array(P.length),
4881
- c2 = Array(Q.length);
4882
- for (i = P.length - 1; i !== -1; --i) c1[i] = c[P[i]];
4883
- for (i = Q.length - 1; i !== -1; --i) c2[i] = c[Q[i]];
4884
- var c4 = sub(c2, dot(c1, dot(B.I, Aeq2)));
4885
- var S = numeric._solveLP(c4, A4, b4, tol, maxit);
4886
- var x2 = S.solution;
4887
- if (x2 !== x2) return S;
4888
- var x1 = dot(B.I, sub(beq, dot(Aeq2, x2)));
4889
- var x = Array(c.length);
4890
- for (i = P.length - 1; i !== -1; --i) x[P[i]] = x1[i];
4891
- for (i = Q.length - 1; i !== -1; --i) x[Q[i]] = x2[i];
4892
- return { solution: x, message: S.message, iterations: S.iterations };
4893
- };
4894
-
4895
- numeric.MPStoLP = function MPStoLP(MPS) {
4896
- if (MPS instanceof String) {
4897
- MPS.split("\n");
4898
- }
4899
- var state = 0;
4900
- var states = [
4901
- "Initial state",
4902
- "NAME",
4903
- "ROWS",
4904
- "COLUMNS",
4905
- "RHS",
4906
- "BOUNDS",
4907
- "ENDATA",
4908
- ];
4909
- var n = MPS.length;
4910
- var i,
4911
- j,
4912
- z,
4913
- N = 0,
4914
- rows = {},
4915
- sign = [],
4916
- rl = 0,
4917
- vars = {},
4918
- nv = 0;
4919
- var name;
4920
- var c = [],
4921
- A = [],
4922
- b = [];
4923
- function err(e) {
4924
- throw new Error(
4925
- "MPStoLP: " +
4926
- e +
4927
- "\nLine " +
4928
- i +
4929
- ": " +
4930
- MPS[i] +
4931
- "\nCurrent state: " +
4932
- states[state] +
4933
- "\n"
4934
- );
4935
- }
4936
- for (i = 0; i < n; ++i) {
4937
- z = MPS[i];
4938
- var w0 = z.match(/\S*/g);
4939
- var w = [];
4940
- for (j = 0; j < w0.length; ++j) if (w0[j] !== "") w.push(w0[j]);
4941
- if (w.length === 0) continue;
4942
- for (j = 0; j < states.length; ++j)
4943
- if (z.substr(0, states[j].length) === states[j]) break;
4944
- if (j < states.length) {
4945
- state = j;
4946
- if (j === 1) {
4947
- name = w[1];
4948
- }
4949
- if (j === 6)
4950
- return {
4951
- name: name,
4952
- c: c,
4953
- A: numeric.transpose(A),
4954
- b: b,
4955
- rows: rows,
4956
- vars: vars,
4957
- };
4958
- continue;
4959
- }
4960
- switch (state) {
4961
- case 0:
4962
- case 1:
4963
- err("Unexpected line");
4964
- case 2:
4965
- switch (w[0]) {
4966
- case "N":
4967
- if (N === 0) N = w[1];
4968
- else err("Two or more N rows");
4969
- break;
4970
- case "L":
4971
- rows[w[1]] = rl;
4972
- sign[rl] = 1;
4973
- b[rl] = 0;
4974
- ++rl;
4975
- break;
4976
- case "G":
4977
- rows[w[1]] = rl;
4978
- sign[rl] = -1;
4979
- b[rl] = 0;
4980
- ++rl;
4981
- break;
4982
- case "E":
4983
- rows[w[1]] = rl;
4984
- sign[rl] = 0;
4985
- b[rl] = 0;
4986
- ++rl;
4987
- break;
4988
- default:
4989
- err("Parse error " + numeric.prettyPrint(w));
4990
- }
4991
- break;
4992
- case 3:
4993
- if (!vars.hasOwnProperty(w[0])) {
4994
- vars[w[0]] = nv;
4995
- c[nv] = 0;
4996
- A[nv] = numeric.rep([rl], 0);
4997
- ++nv;
4998
- }
4999
- var p = vars[w[0]];
5000
- for (j = 1; j < w.length; j += 2) {
5001
- if (w[j] === N) {
5002
- c[p] = parseFloat(w[j + 1]);
5003
- continue;
5004
- }
5005
- var q = rows[w[j]];
5006
- A[p][q] = (sign[q] < 0 ? -1 : 1) * parseFloat(w[j + 1]);
5007
- }
5008
- break;
5009
- case 4:
5010
- for (j = 1; j < w.length; j += 2)
5011
- b[rows[w[j]]] =
5012
- (sign[rows[w[j]]] < 0 ? -1 : 1) * parseFloat(w[j + 1]);
5013
- break;
5014
- case 5:
5015
- /*FIXME*/ break;
5016
- case 6:
5017
- err("Internal error");
5018
- }
5019
- }
5020
- err("Reached end of file without ENDATA");
5021
- };