maptastic 2.0.2 → 3.1.0
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/README.md +91 -61
- package/dist/maptastic.js +1 -1
- package/dist/maptastic.js.map +1 -1
- package/package.json +26 -13
- package/src/maptastic.js +657 -477
- package/src/solve.js +164 -0
package/src/solve.js
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview A snippet from the {@link https://github.com/sloisel/numeric | numeric} project, as it is unmaintained and doesn't export correctly.
|
|
3
|
+
* @see {@link https://github.com/sloisel/numeric/blob/656fa1254be540f428710738ca9c1539625777f1/src/numeric.js#L3001-L3089 | Source}
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @see {@link https://github.com/sloisel/numeric/blob/master/src/numeric.js#L315-L329}
|
|
8
|
+
*/
|
|
9
|
+
function _foreach2(x, s, k, f) {
|
|
10
|
+
if (k === s.length - 1) {
|
|
11
|
+
return f(x);
|
|
12
|
+
}
|
|
13
|
+
var i, n = s[k], ret = Array(n);
|
|
14
|
+
for (i = n - 1; i >= 0; i--) {
|
|
15
|
+
ret[i] = _foreach2(x[i], s, k + 1, f);
|
|
16
|
+
}
|
|
17
|
+
return ret;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
function _dim(x) {
|
|
22
|
+
var ret = [];
|
|
23
|
+
while (typeof x === "object") {
|
|
24
|
+
ret.push(x.length);
|
|
25
|
+
x = x[0];
|
|
26
|
+
}
|
|
27
|
+
return ret;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @see {@link https://github.com/sloisel/numeric/blob/656fa1254be540f428710738ca9c1539625777f1/src/numeric.js#L309-L329}
|
|
32
|
+
* @param {*} x
|
|
33
|
+
*/
|
|
34
|
+
function dim(x) {
|
|
35
|
+
var y, z;
|
|
36
|
+
if (typeof x === "object") {
|
|
37
|
+
y = x[0];
|
|
38
|
+
if (typeof y === "object") {
|
|
39
|
+
z = y[0];
|
|
40
|
+
if (typeof z === "object") {
|
|
41
|
+
return _dim(x);
|
|
42
|
+
}
|
|
43
|
+
return [x.length, y.length];
|
|
44
|
+
}
|
|
45
|
+
return [x.length];
|
|
46
|
+
}
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
function cloneV(x) {
|
|
52
|
+
var _n = x.length;
|
|
53
|
+
var i, ret = Array(_n);
|
|
54
|
+
|
|
55
|
+
for (i = _n - 1; i !== -1; --i) {
|
|
56
|
+
ret[i] = (x[i]);
|
|
57
|
+
}
|
|
58
|
+
return ret;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function clone(x) {
|
|
62
|
+
if (typeof x !== "object") {
|
|
63
|
+
return (x);
|
|
64
|
+
}
|
|
65
|
+
var s = dim(x);
|
|
66
|
+
return _foreach2(x, s, 0, cloneV);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 11. Ax = b
|
|
70
|
+
/**
|
|
71
|
+
* @param {*} A
|
|
72
|
+
* @param {boolean} [fast=false]
|
|
73
|
+
* @returns {{ LU: *, P: * }}
|
|
74
|
+
*/
|
|
75
|
+
function LU(A, fast = false) {
|
|
76
|
+
var abs = Math.abs;
|
|
77
|
+
var i, j, k, absAjk, Akk, Ak, Pk, Ai;
|
|
78
|
+
var max;
|
|
79
|
+
var n = A.length, n1 = n - 1;
|
|
80
|
+
var P = new Array(n);
|
|
81
|
+
if (!fast) {
|
|
82
|
+
A = clone(A);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for (k = 0; k < n; ++k) {
|
|
86
|
+
Pk = k;
|
|
87
|
+
Ak = A[k];
|
|
88
|
+
max = abs(Ak[k]);
|
|
89
|
+
for (j = k + 1; j < n; ++j) {
|
|
90
|
+
absAjk = abs(A[j][k]);
|
|
91
|
+
if (max < absAjk) {
|
|
92
|
+
max = absAjk;
|
|
93
|
+
Pk = j;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
P[k] = Pk;
|
|
97
|
+
|
|
98
|
+
if (Pk != k) {
|
|
99
|
+
A[k] = A[Pk];
|
|
100
|
+
A[Pk] = Ak;
|
|
101
|
+
Ak = A[k];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
Akk = Ak[k];
|
|
105
|
+
|
|
106
|
+
for (i = k + 1; i < n; ++i) {
|
|
107
|
+
A[i][k] /= Akk;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
for (i = k + 1; i < n; ++i) {
|
|
111
|
+
Ai = A[i];
|
|
112
|
+
for (j = k + 1; j < n1; ++j) {
|
|
113
|
+
Ai[j] -= Ai[k] * Ak[j];
|
|
114
|
+
++j;
|
|
115
|
+
Ai[j] -= Ai[k] * Ak[j];
|
|
116
|
+
}
|
|
117
|
+
if (j === n1) Ai[j] -= Ai[k] * Ak[j];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
LU: A,
|
|
123
|
+
P: P
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function LUsolve(LUP, b) {
|
|
128
|
+
var i, j;
|
|
129
|
+
var LU = LUP.LU;
|
|
130
|
+
var n = LU.length;
|
|
131
|
+
var x = clone(b);
|
|
132
|
+
var P = LUP.P;
|
|
133
|
+
var Pi, LUi, tmp;
|
|
134
|
+
|
|
135
|
+
for (i = n - 1; i !== -1; --i) x[i] = b[i];
|
|
136
|
+
for (i = 0; i < n; ++i) {
|
|
137
|
+
Pi = P[i];
|
|
138
|
+
if (P[i] !== i) {
|
|
139
|
+
tmp = x[i];
|
|
140
|
+
x[i] = x[Pi];
|
|
141
|
+
x[Pi] = tmp;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
LUi = LU[i];
|
|
145
|
+
for (j = 0; j < i; ++j) {
|
|
146
|
+
x[i] -= x[j] * LUi[j];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
for (i = n - 1; i >= 0; --i) {
|
|
151
|
+
LUi = LU[i];
|
|
152
|
+
for (j = i + 1; j < n; ++j) {
|
|
153
|
+
x[i] -= x[j] * LUi[j];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
x[i] /= LUi[i];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return x;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export default function solve(A, b, fast) {
|
|
163
|
+
return LUsolve(LU(A, fast), b);
|
|
164
|
+
}
|