@thi.ng/matrices 2.0.8 → 2.1.2

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 ADDED
@@ -0,0 +1,5021 @@
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
+ };