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