@danielsimonjr/mathts-functions 0.49.0 → 0.51.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/dist/geometry/alpha-shape.d.ts +36 -0
- package/dist/geometry/alpha-shape.d.ts.map +1 -0
- package/dist/geometry/delaunay.d.ts +33 -0
- package/dist/geometry/delaunay.d.ts.map +1 -0
- package/dist/geometry/hull.d.ts +53 -0
- package/dist/geometry/hull.d.ts.map +1 -0
- package/dist/geometry/spherical-voronoi.d.ts +40 -0
- package/dist/geometry/spherical-voronoi.d.ts.map +1 -0
- package/dist/geometry/voronoi.d.ts +44 -0
- package/dist/geometry/voronoi.d.ts.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +888 -139
- package/dist/numeric/solveODE.d.ts +26 -1
- package/dist/numeric/solveODE.d.ts.map +1 -1
- package/dist/typed/geometry.d.ts +7 -3
- package/dist/typed/geometry.d.ts.map +1 -1
- package/dist/typed/numeric.d.ts +8 -2
- package/dist/typed/numeric.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -112,7 +112,7 @@ __export(typed_exports, {
|
|
|
112
112
|
cond: () => cond,
|
|
113
113
|
conj: () => conj,
|
|
114
114
|
connectedComponents: () => connectedComponents,
|
|
115
|
-
|
|
115
|
+
convexHull2D: () => convexHull2D,
|
|
116
116
|
convexHull3D: () => convexHull3D,
|
|
117
117
|
convolve: () => convolve,
|
|
118
118
|
coordinateTransform: () => coordinateTransform,
|
|
@@ -2281,9 +2281,9 @@ var mean = mathTyped2("mean", {
|
|
|
2281
2281
|
return result.result;
|
|
2282
2282
|
}
|
|
2283
2283
|
});
|
|
2284
|
-
function varianceFromM2(m2, n,
|
|
2284
|
+
function varianceFromM2(m2, n, norm5) {
|
|
2285
2285
|
if (n === 0) return NaN;
|
|
2286
|
-
switch (
|
|
2286
|
+
switch (norm5) {
|
|
2287
2287
|
case "biased":
|
|
2288
2288
|
return m2 / (n + 1);
|
|
2289
2289
|
case "uncorrected":
|
|
@@ -2298,31 +2298,31 @@ function m2OfArray(arr10) {
|
|
|
2298
2298
|
}
|
|
2299
2299
|
var variance = mathTyped2("variance", {
|
|
2300
2300
|
Array: (arr10) => varianceFromM2(m2OfArray(arr10), arr10.length, "unbiased"),
|
|
2301
|
-
"Array, string": (arr10,
|
|
2301
|
+
"Array, string": (arr10, norm5) => varianceFromM2(m2OfArray(arr10), arr10.length, norm5),
|
|
2302
2302
|
// Parallel Float64Array variance. computePool returns POPULATION variance
|
|
2303
2303
|
// (sum2/n); recover sum2 = pop·n and renormalize for the requested convention.
|
|
2304
2304
|
Float64Array: async (a) => {
|
|
2305
2305
|
const result = await computePool.variance(a);
|
|
2306
2306
|
return varianceFromM2(result.result.variance * a.length, a.length, "unbiased");
|
|
2307
2307
|
},
|
|
2308
|
-
"Float64Array, string": async (a,
|
|
2308
|
+
"Float64Array, string": async (a, norm5) => {
|
|
2309
2309
|
const result = await computePool.variance(a);
|
|
2310
|
-
return varianceFromM2(result.result.variance * a.length, a.length,
|
|
2310
|
+
return varianceFromM2(result.result.variance * a.length, a.length, norm5);
|
|
2311
2311
|
}
|
|
2312
2312
|
});
|
|
2313
2313
|
var std = mathTyped2("std", {
|
|
2314
2314
|
Array: (arr10) => Math.sqrt(varianceFromM2(m2OfArray(arr10), arr10.length, "unbiased")),
|
|
2315
|
-
"Array, string": (arr10,
|
|
2315
|
+
"Array, string": (arr10, norm5) => Math.sqrt(varianceFromM2(m2OfArray(arr10), arr10.length, norm5)),
|
|
2316
2316
|
// Parallel Float64Array std — derive from the (renormalized) variance so the
|
|
2317
2317
|
// convention matches the Array path and parallelStatStd.
|
|
2318
2318
|
Float64Array: async (a) => {
|
|
2319
2319
|
const result = await computePool.variance(a);
|
|
2320
2320
|
return Math.sqrt(varianceFromM2(result.result.variance * a.length, a.length, "unbiased"));
|
|
2321
2321
|
},
|
|
2322
|
-
"Float64Array, string": async (a,
|
|
2322
|
+
"Float64Array, string": async (a, norm5) => {
|
|
2323
2323
|
const result = await computePool.variance(a);
|
|
2324
2324
|
return Math.sqrt(
|
|
2325
|
-
varianceFromM2(result.result.variance * a.length, a.length,
|
|
2325
|
+
varianceFromM2(result.result.variance * a.length, a.length, norm5)
|
|
2326
2326
|
);
|
|
2327
2327
|
}
|
|
2328
2328
|
});
|
|
@@ -3589,8 +3589,8 @@ function welchPSDJS(samples, frameLength, overlap, windowType) {
|
|
|
3589
3589
|
start += hop;
|
|
3590
3590
|
}
|
|
3591
3591
|
if (numFrames === 0) return new Float64Array(0);
|
|
3592
|
-
const
|
|
3593
|
-
for (let k = 0; k < psdLen; k++) psd[k] /=
|
|
3592
|
+
const norm5 = numFrames * frameLength * winPower;
|
|
3593
|
+
for (let k = 0; k < psdLen; k++) psd[k] /= norm5;
|
|
3594
3594
|
for (let k = 1; k < psdLen - 1; k++) psd[k] *= 2;
|
|
3595
3595
|
return psd;
|
|
3596
3596
|
}
|
|
@@ -8551,18 +8551,18 @@ import { computePool as computePool7 } from "@danielsimonjr/mathts-parallel";
|
|
|
8551
8551
|
var GEOMETRY_WASM_THRESHOLD = 32;
|
|
8552
8552
|
var HULL3D_WASM_THRESHOLD = 1024;
|
|
8553
8553
|
function angle2D(v1, v2) {
|
|
8554
|
-
const
|
|
8554
|
+
const dot9 = v1[0] * v2[0] + v1[1] * v2[1];
|
|
8555
8555
|
const mag1 = Math.sqrt(v1[0] ** 2 + v1[1] ** 2);
|
|
8556
8556
|
const mag2 = Math.sqrt(v2[0] ** 2 + v2[1] ** 2);
|
|
8557
8557
|
if (mag1 === 0 || mag2 === 0) return NaN;
|
|
8558
|
-
return Math.acos(Math.max(-1, Math.min(1,
|
|
8558
|
+
return Math.acos(Math.max(-1, Math.min(1, dot9 / (mag1 * mag2))));
|
|
8559
8559
|
}
|
|
8560
8560
|
function angle3D(v1, v2) {
|
|
8561
|
-
const
|
|
8561
|
+
const dot9 = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
|
|
8562
8562
|
const mag1 = Math.sqrt(v1[0] ** 2 + v1[1] ** 2 + v1[2] ** 2);
|
|
8563
8563
|
const mag2 = Math.sqrt(v2[0] ** 2 + v2[1] ** 2 + v2[2] ** 2);
|
|
8564
8564
|
if (mag1 === 0 || mag2 === 0) return NaN;
|
|
8565
|
-
return Math.acos(Math.max(-1, Math.min(1,
|
|
8565
|
+
return Math.acos(Math.max(-1, Math.min(1, dot9 / (mag1 * mag2))));
|
|
8566
8566
|
}
|
|
8567
8567
|
function cross3D(a, b) {
|
|
8568
8568
|
return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
|
|
@@ -8584,7 +8584,7 @@ function polygonArea(vertices) {
|
|
|
8584
8584
|
}
|
|
8585
8585
|
return Math.abs(area2) / 2;
|
|
8586
8586
|
}
|
|
8587
|
-
function
|
|
8587
|
+
function convexHull2D(points) {
|
|
8588
8588
|
const n = points.length;
|
|
8589
8589
|
if (n <= 1) return points.slice();
|
|
8590
8590
|
if (n === 2) return points.slice();
|
|
@@ -8606,12 +8606,12 @@ function convexHull(points) {
|
|
|
8606
8606
|
} else {
|
|
8607
8607
|
sorted = points.slice().sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
8608
8608
|
}
|
|
8609
|
-
function
|
|
8609
|
+
function cross4(o, a, b) {
|
|
8610
8610
|
return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
|
|
8611
8611
|
}
|
|
8612
8612
|
const lower = [];
|
|
8613
8613
|
for (const p of sorted) {
|
|
8614
|
-
while (lower.length >= 2 &&
|
|
8614
|
+
while (lower.length >= 2 && cross4(lower[lower.length - 2], lower[lower.length - 1], p) <= 0) {
|
|
8615
8615
|
lower.pop();
|
|
8616
8616
|
}
|
|
8617
8617
|
lower.push(p);
|
|
@@ -8619,7 +8619,7 @@ function convexHull(points) {
|
|
|
8619
8619
|
const upper = [];
|
|
8620
8620
|
for (let i = sorted.length - 1; i >= 0; i--) {
|
|
8621
8621
|
const p = sorted[i];
|
|
8622
|
-
while (upper.length >= 2 &&
|
|
8622
|
+
while (upper.length >= 2 && cross4(upper[upper.length - 2], upper[upper.length - 1], p) <= 0) {
|
|
8623
8623
|
upper.pop();
|
|
8624
8624
|
}
|
|
8625
8625
|
upper.push(p);
|
|
@@ -8667,14 +8667,14 @@ function reflectVector(v, normal) {
|
|
|
8667
8667
|
const mag = Math.sqrt(normal.reduce((s, c) => s + c * c, 0));
|
|
8668
8668
|
if (mag === 0) return v.slice();
|
|
8669
8669
|
const n = normal.map((c) => c / mag);
|
|
8670
|
-
const
|
|
8671
|
-
return v.map((c, i) => c - 2 *
|
|
8670
|
+
const dot9 = v.reduce((s, c, i) => s + c * n[i], 0);
|
|
8671
|
+
return v.map((c, i) => c - 2 * dot9 * n[i]);
|
|
8672
8672
|
}
|
|
8673
8673
|
function projectVector(v, onto) {
|
|
8674
|
-
const
|
|
8674
|
+
const dot9 = v.reduce((s, c, i) => s + c * onto[i], 0);
|
|
8675
8675
|
const magSq = onto.reduce((s, c) => s + c * c, 0);
|
|
8676
8676
|
if (magSq === 0) return onto.map(() => 0);
|
|
8677
|
-
const scale4 =
|
|
8677
|
+
const scale4 = dot9 / magSq;
|
|
8678
8678
|
return onto.map((c) => c * scale4);
|
|
8679
8679
|
}
|
|
8680
8680
|
function distance2D(a, b) {
|
|
@@ -8750,10 +8750,10 @@ function centroid(vertices) {
|
|
|
8750
8750
|
let cy = 0;
|
|
8751
8751
|
for (let i = 0; i < n; i++) {
|
|
8752
8752
|
const j = (i + 1) % n;
|
|
8753
|
-
const
|
|
8754
|
-
signedArea +=
|
|
8755
|
-
cx += (vertices[i][0] + vertices[j][0]) *
|
|
8756
|
-
cy += (vertices[i][1] + vertices[j][1]) *
|
|
8753
|
+
const cross4 = vertices[i][0] * vertices[j][1] - vertices[j][0] * vertices[i][1];
|
|
8754
|
+
signedArea += cross4;
|
|
8755
|
+
cx += (vertices[i][0] + vertices[j][0]) * cross4;
|
|
8756
|
+
cy += (vertices[i][1] + vertices[j][1]) * cross4;
|
|
8757
8757
|
}
|
|
8758
8758
|
signedArea /= 2;
|
|
8759
8759
|
cx /= 6 * signedArea;
|
|
@@ -8840,37 +8840,6 @@ function minkowskiDistance(a, b, p) {
|
|
|
8840
8840
|
function delaunayTriangulation(points) {
|
|
8841
8841
|
const n = points.length;
|
|
8842
8842
|
if (n < 3) return [];
|
|
8843
|
-
if (n >= GEOMETRY_WASM_THRESHOLD) {
|
|
8844
|
-
const wasm = wasmLoader.getModule();
|
|
8845
|
-
if (wasm) {
|
|
8846
|
-
try {
|
|
8847
|
-
const flat = new Float64Array(n * 2);
|
|
8848
|
-
for (let i = 0; i < n; i++) {
|
|
8849
|
-
flat[i * 2] = points[i][0];
|
|
8850
|
-
flat[i * 2 + 1] = points[i][1];
|
|
8851
|
-
}
|
|
8852
|
-
const ptsAlloc = wasmLoader.allocateFloat64Array(flat);
|
|
8853
|
-
const maxTris = 2 * n;
|
|
8854
|
-
const trisAlloc = wasmLoader.allocateInt32ArrayEmpty(maxTris * 3);
|
|
8855
|
-
try {
|
|
8856
|
-
const numTris = wasm.delaunay_wasm(ptsAlloc.ptr, n, trisAlloc.ptr);
|
|
8857
|
-
const result = [];
|
|
8858
|
-
for (let i = 0; i < numTris; i++) {
|
|
8859
|
-
result.push([
|
|
8860
|
-
trisAlloc.array[i * 3],
|
|
8861
|
-
trisAlloc.array[i * 3 + 1],
|
|
8862
|
-
trisAlloc.array[i * 3 + 2]
|
|
8863
|
-
]);
|
|
8864
|
-
}
|
|
8865
|
-
return result;
|
|
8866
|
-
} finally {
|
|
8867
|
-
wasmLoader.free(ptsAlloc.ptr);
|
|
8868
|
-
wasmLoader.free(trisAlloc.ptr);
|
|
8869
|
-
}
|
|
8870
|
-
} catch {
|
|
8871
|
-
}
|
|
8872
|
-
}
|
|
8873
|
-
}
|
|
8874
8843
|
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
8875
8844
|
for (const p of points) {
|
|
8876
8845
|
minX = Math.min(minX, p[0]);
|
|
@@ -12230,6 +12199,446 @@ function rodasSolve(f, tspan, y0raw, options = {}) {
|
|
|
12230
12199
|
}
|
|
12231
12200
|
return { t: tOut, y: yOut };
|
|
12232
12201
|
}
|
|
12202
|
+
var _EPS = Number.EPSILON;
|
|
12203
|
+
function _rms(v) {
|
|
12204
|
+
let s = 0;
|
|
12205
|
+
for (let i = 0; i < v.length; i++) s += v[i] * v[i];
|
|
12206
|
+
return Math.sqrt(s / v.length);
|
|
12207
|
+
}
|
|
12208
|
+
function _selectInitialStep(f, t0, y0, tf, maxStep, f0, dir, order, rtol, atol) {
|
|
12209
|
+
const interval2 = Math.abs(tf - t0);
|
|
12210
|
+
if (interval2 === 0) return 0;
|
|
12211
|
+
const scale4 = y0.map((yi) => atol + Math.abs(yi) * rtol);
|
|
12212
|
+
const d0 = _rms(y0.map((yi, i) => yi / scale4[i]));
|
|
12213
|
+
const d1 = _rms(f0.map((fi, i) => fi / scale4[i]));
|
|
12214
|
+
let h0 = d0 < 1e-5 || d1 < 1e-5 ? 1e-6 : 0.01 * (d0 / d1);
|
|
12215
|
+
h0 = Math.min(h0, interval2);
|
|
12216
|
+
const y1 = y0.map((yi, i) => yi + h0 * dir * f0[i]);
|
|
12217
|
+
const f1 = _fArr(f, t0 + h0 * dir, y1);
|
|
12218
|
+
const d2 = _rms(f1.map((v, i) => (v - f0[i]) / scale4[i])) / h0;
|
|
12219
|
+
const h1 = d1 <= 1e-15 && d2 <= 1e-15 ? Math.max(1e-6, h0 * 1e-3) : Math.pow(0.01 / Math.max(d1, d2), 1 / (order + 1));
|
|
12220
|
+
return Math.min(100 * h0, h1, interval2, maxStep);
|
|
12221
|
+
}
|
|
12222
|
+
function _newtonTol(rtol) {
|
|
12223
|
+
return Math.max(10 * _EPS / rtol, Math.min(0.03, Math.sqrt(rtol)));
|
|
12224
|
+
}
|
|
12225
|
+
function _minStep(t) {
|
|
12226
|
+
return 10 * _EPS * Math.max(1, Math.abs(t));
|
|
12227
|
+
}
|
|
12228
|
+
function _matMul(A, B) {
|
|
12229
|
+
const m = A.length;
|
|
12230
|
+
const p = B[0].length;
|
|
12231
|
+
const q = B.length;
|
|
12232
|
+
const out = Array.from({ length: m }, () => new Array(p).fill(0));
|
|
12233
|
+
for (let i = 0; i < m; i++) {
|
|
12234
|
+
for (let k = 0; k < q; k++) {
|
|
12235
|
+
const aik = A[i][k];
|
|
12236
|
+
if (aik === 0) continue;
|
|
12237
|
+
for (let j = 0; j < p; j++) out[i][j] += aik * B[k][j];
|
|
12238
|
+
}
|
|
12239
|
+
}
|
|
12240
|
+
return out;
|
|
12241
|
+
}
|
|
12242
|
+
var BDF_MAX_ORDER = 5;
|
|
12243
|
+
var BDF_NEWTON_MAXITER = 4;
|
|
12244
|
+
var BDF_MIN_FACTOR = 0.2;
|
|
12245
|
+
var BDF_MAX_FACTOR = 10;
|
|
12246
|
+
var BDF_KAPPA = [0, -0.185, -1 / 9, -0.0823, -0.0415, 0];
|
|
12247
|
+
var BDF_GAMMA = (() => {
|
|
12248
|
+
const g = [0];
|
|
12249
|
+
let acc = 0;
|
|
12250
|
+
for (let i = 1; i <= BDF_MAX_ORDER; i++) {
|
|
12251
|
+
acc += 1 / i;
|
|
12252
|
+
g.push(acc);
|
|
12253
|
+
}
|
|
12254
|
+
return g;
|
|
12255
|
+
})();
|
|
12256
|
+
var BDF_ALPHA = BDF_KAPPA.map((k, i) => (1 - k) * BDF_GAMMA[i]);
|
|
12257
|
+
var BDF_ERROR_CONST = BDF_KAPPA.map((k, i) => k * BDF_GAMMA[i] + 1 / (i + 1));
|
|
12258
|
+
function _bdfComputeR(order, factor2) {
|
|
12259
|
+
const M = Array.from(
|
|
12260
|
+
{ length: order + 1 },
|
|
12261
|
+
() => new Array(order + 1).fill(0)
|
|
12262
|
+
);
|
|
12263
|
+
for (let j = 0; j <= order; j++) M[0][j] = 1;
|
|
12264
|
+
for (let i = 1; i <= order; i++) {
|
|
12265
|
+
for (let j = 1; j <= order; j++) M[i][j] = (i - 1 - factor2 * j) / i;
|
|
12266
|
+
}
|
|
12267
|
+
for (let j = 0; j <= order; j++) {
|
|
12268
|
+
for (let i = 1; i <= order; i++) M[i][j] *= M[i - 1][j];
|
|
12269
|
+
}
|
|
12270
|
+
return M;
|
|
12271
|
+
}
|
|
12272
|
+
function _bdfChangeD(D, order, factor2) {
|
|
12273
|
+
const R = _bdfComputeR(order, factor2);
|
|
12274
|
+
const U = _bdfComputeR(order, 1);
|
|
12275
|
+
const RU = _matMul(R, U);
|
|
12276
|
+
const n = D[0].length;
|
|
12277
|
+
const newTop = Array.from({ length: order + 1 }, () => new Array(n).fill(0));
|
|
12278
|
+
for (let i = 0; i <= order; i++) {
|
|
12279
|
+
for (let j = 0; j <= order; j++) {
|
|
12280
|
+
const c = RU[j][i];
|
|
12281
|
+
if (c === 0) continue;
|
|
12282
|
+
const Dj = D[j];
|
|
12283
|
+
const row2 = newTop[i];
|
|
12284
|
+
for (let k = 0; k < n; k++) row2[k] += c * Dj[k];
|
|
12285
|
+
}
|
|
12286
|
+
}
|
|
12287
|
+
for (let i = 0; i <= order; i++) D[i] = newTop[i];
|
|
12288
|
+
}
|
|
12289
|
+
function _bdfNewton(f, tNew, yPredict, c, psi, solveW, scale4, tol) {
|
|
12290
|
+
const n = yPredict.length;
|
|
12291
|
+
const d = new Array(n).fill(0);
|
|
12292
|
+
const y = yPredict.slice();
|
|
12293
|
+
let dyNormOld = null;
|
|
12294
|
+
let converged = false;
|
|
12295
|
+
let k = 0;
|
|
12296
|
+
for (; k < BDF_NEWTON_MAXITER; k++) {
|
|
12297
|
+
const fv = _fArr(f, tNew, y);
|
|
12298
|
+
if (!fv.every((v) => Number.isFinite(v))) break;
|
|
12299
|
+
const rhs = fv.map((v, i) => c * v - psi[i] - d[i]);
|
|
12300
|
+
const dy = solveW(rhs);
|
|
12301
|
+
const dyNorm = _rms(dy.map((v, i) => v / scale4[i]));
|
|
12302
|
+
const rate = dyNormOld === null ? null : dyNorm / dyNormOld;
|
|
12303
|
+
if (rate !== null && (rate >= 1 || Math.pow(rate, BDF_NEWTON_MAXITER - k) / (1 - rate) * dyNorm > tol)) {
|
|
12304
|
+
break;
|
|
12305
|
+
}
|
|
12306
|
+
for (let i = 0; i < n; i++) {
|
|
12307
|
+
y[i] += dy[i];
|
|
12308
|
+
d[i] += dy[i];
|
|
12309
|
+
}
|
|
12310
|
+
if (dyNorm === 0 || rate !== null && rate / (1 - rate) * dyNorm < tol) {
|
|
12311
|
+
converged = true;
|
|
12312
|
+
k++;
|
|
12313
|
+
break;
|
|
12314
|
+
}
|
|
12315
|
+
dyNormOld = dyNorm;
|
|
12316
|
+
}
|
|
12317
|
+
return { converged, nIter: k, y, d };
|
|
12318
|
+
}
|
|
12319
|
+
function bdfSolve(f, tspan, y0raw, options = {}) {
|
|
12320
|
+
const t0 = tspan[0];
|
|
12321
|
+
const tf = tspan[1];
|
|
12322
|
+
if (!(typeof t0 === "number" && typeof tf === "number")) {
|
|
12323
|
+
throw new Error('The "BDF" stiff method requires numeric tspan');
|
|
12324
|
+
}
|
|
12325
|
+
if (!y0raw.every((v) => typeof v === "number")) {
|
|
12326
|
+
throw new Error('The "BDF" stiff method requires plain-number state (y0)');
|
|
12327
|
+
}
|
|
12328
|
+
const y0 = y0raw;
|
|
12329
|
+
const n = y0.length;
|
|
12330
|
+
const dir = tf >= t0 ? 1 : -1;
|
|
12331
|
+
const rtol = options.tol ? options.tol : 1e-4;
|
|
12332
|
+
const atol = rtol * 1e-3;
|
|
12333
|
+
const maxIter = options.maxIter ? options.maxIter : 1e5;
|
|
12334
|
+
const maxStep = options.maxStep ?? Infinity;
|
|
12335
|
+
const newtonTol = _newtonTol(rtol);
|
|
12336
|
+
let t = t0;
|
|
12337
|
+
let y = y0.slice();
|
|
12338
|
+
const f0 = _fArr(f, t, y);
|
|
12339
|
+
let hAbs = options.firstStep ? Math.abs(options.firstStep) : _selectInitialStep(f, t0, y0, tf, maxStep, f0, dir, 1, rtol, atol);
|
|
12340
|
+
const D = Array.from(
|
|
12341
|
+
{ length: BDF_MAX_ORDER + 3 },
|
|
12342
|
+
() => new Array(n).fill(0)
|
|
12343
|
+
);
|
|
12344
|
+
D[0] = y.slice();
|
|
12345
|
+
D[1] = f0.map((v) => v * hAbs * dir);
|
|
12346
|
+
let order = 1;
|
|
12347
|
+
let nEqualSteps = 0;
|
|
12348
|
+
const tOut = [t];
|
|
12349
|
+
const yOut = [y.slice()];
|
|
12350
|
+
let iter = 0;
|
|
12351
|
+
while ((dir > 0 ? t < tf : t > tf) && iter < maxIter) {
|
|
12352
|
+
iter++;
|
|
12353
|
+
const minStep = _minStep(t);
|
|
12354
|
+
if (hAbs > maxStep) {
|
|
12355
|
+
_bdfChangeD(D, order, maxStep / hAbs);
|
|
12356
|
+
hAbs = maxStep;
|
|
12357
|
+
nEqualSteps = 0;
|
|
12358
|
+
} else if (hAbs < minStep) {
|
|
12359
|
+
_bdfChangeD(D, order, minStep / hAbs);
|
|
12360
|
+
hAbs = minStep;
|
|
12361
|
+
nEqualSteps = 0;
|
|
12362
|
+
}
|
|
12363
|
+
const F0 = _fArr(f, t, y);
|
|
12364
|
+
const J = _jacobianAt(f, t, y, F0, options);
|
|
12365
|
+
let stepAccepted = false;
|
|
12366
|
+
let yNew = y;
|
|
12367
|
+
let dVec = new Array(n).fill(0);
|
|
12368
|
+
let errorNorm = 0;
|
|
12369
|
+
let nIter = 1;
|
|
12370
|
+
let scale4 = new Array(n).fill(1);
|
|
12371
|
+
while (!stepAccepted) {
|
|
12372
|
+
if (hAbs < minStep) {
|
|
12373
|
+
throw new Error("Required step size is less than spacing between numbers (BDF)");
|
|
12374
|
+
}
|
|
12375
|
+
let h = hAbs * dir;
|
|
12376
|
+
let tNew = t + h;
|
|
12377
|
+
if (dir * (tNew - tf) > 0) {
|
|
12378
|
+
tNew = tf;
|
|
12379
|
+
_bdfChangeD(D, order, Math.abs(tNew - t) / hAbs);
|
|
12380
|
+
nEqualSteps = 0;
|
|
12381
|
+
}
|
|
12382
|
+
h = tNew - t;
|
|
12383
|
+
hAbs = Math.abs(h);
|
|
12384
|
+
const yPredict = new Array(n).fill(0);
|
|
12385
|
+
for (let j = 0; j <= order; j++) for (let k = 0; k < n; k++) yPredict[k] += D[j][k];
|
|
12386
|
+
scale4 = yPredict.map((v) => atol + rtol * Math.abs(v));
|
|
12387
|
+
const psi = new Array(n).fill(0);
|
|
12388
|
+
for (let k = 0; k < n; k++) {
|
|
12389
|
+
let s = 0;
|
|
12390
|
+
for (let j = 1; j <= order; j++) s += D[j][k] * BDF_GAMMA[j];
|
|
12391
|
+
psi[k] = s / BDF_ALPHA[order];
|
|
12392
|
+
}
|
|
12393
|
+
const c = h / BDF_ALPHA[order];
|
|
12394
|
+
const W = J.map((rowv, i) => rowv.map((v, j) => (i === j ? 1 : 0) - c * v));
|
|
12395
|
+
const solveW = _factorSolver(W, n);
|
|
12396
|
+
const res = _bdfNewton(f, tNew, yPredict, c, psi, solveW, scale4, newtonTol);
|
|
12397
|
+
if (!res.converged) {
|
|
12398
|
+
hAbs *= 0.5;
|
|
12399
|
+
_bdfChangeD(D, order, 0.5);
|
|
12400
|
+
nEqualSteps = 0;
|
|
12401
|
+
continue;
|
|
12402
|
+
}
|
|
12403
|
+
nIter = res.nIter;
|
|
12404
|
+
yNew = res.y;
|
|
12405
|
+
dVec = res.d;
|
|
12406
|
+
const safety2 = 0.9 * (2 * BDF_NEWTON_MAXITER + 1) / (2 * BDF_NEWTON_MAXITER + nIter);
|
|
12407
|
+
scale4 = yNew.map((v) => atol + rtol * Math.abs(v));
|
|
12408
|
+
errorNorm = _rms(dVec.map((v, i) => BDF_ERROR_CONST[order] * v / scale4[i]));
|
|
12409
|
+
if (errorNorm > 1) {
|
|
12410
|
+
const factor3 = Math.max(BDF_MIN_FACTOR, safety2 * Math.pow(errorNorm, -1 / (order + 1)));
|
|
12411
|
+
hAbs *= factor3;
|
|
12412
|
+
_bdfChangeD(D, order, factor3);
|
|
12413
|
+
nEqualSteps = 0;
|
|
12414
|
+
} else {
|
|
12415
|
+
stepAccepted = true;
|
|
12416
|
+
}
|
|
12417
|
+
if (stepAccepted) {
|
|
12418
|
+
t = tNew;
|
|
12419
|
+
y = yNew;
|
|
12420
|
+
tOut.push(t);
|
|
12421
|
+
yOut.push(y.slice());
|
|
12422
|
+
}
|
|
12423
|
+
}
|
|
12424
|
+
nEqualSteps++;
|
|
12425
|
+
const safety = 0.9 * (2 * BDF_NEWTON_MAXITER + 1) / (2 * BDF_NEWTON_MAXITER + nIter);
|
|
12426
|
+
for (let k = 0; k < n; k++) {
|
|
12427
|
+
D[order + 2][k] = dVec[k] - D[order + 1][k];
|
|
12428
|
+
D[order + 1][k] = dVec[k];
|
|
12429
|
+
}
|
|
12430
|
+
for (let i = order; i >= 0; i--) for (let k = 0; k < n; k++) D[i][k] += D[i + 1][k];
|
|
12431
|
+
if (nEqualSteps < order + 1) continue;
|
|
12432
|
+
const errM = order > 1 ? _rms(D[order].map((v, i) => BDF_ERROR_CONST[order - 1] * v / scale4[i])) : Infinity;
|
|
12433
|
+
const errP = order < BDF_MAX_ORDER ? _rms(D[order + 2].map((v, i) => BDF_ERROR_CONST[order + 1] * v / scale4[i])) : Infinity;
|
|
12434
|
+
const errNorms = [errM, errorNorm, errP];
|
|
12435
|
+
const factors = errNorms.map((e, i) => Math.pow(e, -1 / (order + i)));
|
|
12436
|
+
let best = 0;
|
|
12437
|
+
for (let i = 1; i < 3; i++) if (factors[i] > factors[best]) best = i;
|
|
12438
|
+
order += best - 1;
|
|
12439
|
+
const factor2 = Math.min(BDF_MAX_FACTOR, safety * factors[best]);
|
|
12440
|
+
hAbs *= factor2;
|
|
12441
|
+
_bdfChangeD(D, order, factor2);
|
|
12442
|
+
nEqualSteps = 0;
|
|
12443
|
+
}
|
|
12444
|
+
if (iter >= maxIter) {
|
|
12445
|
+
throw new Error("Maximum number of iterations reached, try changing options");
|
|
12446
|
+
}
|
|
12447
|
+
return { t: tOut, y: yOut };
|
|
12448
|
+
}
|
|
12449
|
+
var RADAU_NEWTON_MAXITER = 6;
|
|
12450
|
+
var RADAU_MIN_FACTOR = 0.2;
|
|
12451
|
+
var RADAU_MAX_FACTOR = 10;
|
|
12452
|
+
var _S6 = Math.sqrt(6);
|
|
12453
|
+
var RADAU_A = [
|
|
12454
|
+
[(88 - 7 * _S6) / 360, (296 - 169 * _S6) / 1800, (-2 + 3 * _S6) / 225],
|
|
12455
|
+
[(296 + 169 * _S6) / 1800, (88 + 7 * _S6) / 360, (-2 - 3 * _S6) / 225],
|
|
12456
|
+
[(16 - _S6) / 36, (16 + _S6) / 36, 1 / 9]
|
|
12457
|
+
];
|
|
12458
|
+
var RADAU_C = [(4 - _S6) / 10, (4 + _S6) / 10, 1];
|
|
12459
|
+
var RADAU_E = [(-13 - 7 * _S6) / 3, (-13 + 7 * _S6) / 3, -1 / 3];
|
|
12460
|
+
var RADAU_MU_REAL = 3 + Math.pow(3, 2 / 3) - Math.pow(3, 1 / 3);
|
|
12461
|
+
function _radauPredictFactor(hAbs, hAbsOld, errNorm, errNormOld) {
|
|
12462
|
+
const mult = errNormOld === null || hAbsOld === null || errNorm === 0 ? 1 : hAbs / hAbsOld * Math.pow(errNormOld / errNorm, 0.25);
|
|
12463
|
+
return Math.min(1, mult) * Math.pow(errNorm, -0.25);
|
|
12464
|
+
}
|
|
12465
|
+
function _radauNewton(f, t, y, h, J, scale4, tol) {
|
|
12466
|
+
const n = y.length;
|
|
12467
|
+
const Z = [
|
|
12468
|
+
new Array(n).fill(0),
|
|
12469
|
+
new Array(n).fill(0),
|
|
12470
|
+
new Array(n).fill(0)
|
|
12471
|
+
];
|
|
12472
|
+
const big = Array.from({ length: 3 * n }, () => new Array(3 * n).fill(0));
|
|
12473
|
+
for (let i = 0; i < 3; i++) {
|
|
12474
|
+
for (let k2 = 0; k2 < 3; k2++) {
|
|
12475
|
+
const a = h * RADAU_A[i][k2];
|
|
12476
|
+
for (let r = 0; r < n; r++) {
|
|
12477
|
+
for (let col = 0; col < n; col++) {
|
|
12478
|
+
big[i * n + r][k2 * n + col] = (i === k2 && r === col ? 1 : 0) - a * J[r][col];
|
|
12479
|
+
}
|
|
12480
|
+
}
|
|
12481
|
+
}
|
|
12482
|
+
}
|
|
12483
|
+
const solveBig = _factorSolver(big, 3 * n);
|
|
12484
|
+
let dWNormOld = null;
|
|
12485
|
+
let rate = 0;
|
|
12486
|
+
let converged = false;
|
|
12487
|
+
let k = 0;
|
|
12488
|
+
for (; k < RADAU_NEWTON_MAXITER; k++) {
|
|
12489
|
+
const F = [
|
|
12490
|
+
_fArr(
|
|
12491
|
+
f,
|
|
12492
|
+
t + RADAU_C[0] * h,
|
|
12493
|
+
y.map((yi, r) => yi + Z[0][r])
|
|
12494
|
+
),
|
|
12495
|
+
_fArr(
|
|
12496
|
+
f,
|
|
12497
|
+
t + RADAU_C[1] * h,
|
|
12498
|
+
y.map((yi, r) => yi + Z[1][r])
|
|
12499
|
+
),
|
|
12500
|
+
_fArr(
|
|
12501
|
+
f,
|
|
12502
|
+
t + RADAU_C[2] * h,
|
|
12503
|
+
y.map((yi, r) => yi + Z[2][r])
|
|
12504
|
+
)
|
|
12505
|
+
];
|
|
12506
|
+
if (!F.every((row2) => row2.every((v) => Number.isFinite(v)))) break;
|
|
12507
|
+
const rhs = new Array(3 * n).fill(0);
|
|
12508
|
+
for (let i = 0; i < 3; i++) {
|
|
12509
|
+
for (let r = 0; r < n; r++) {
|
|
12510
|
+
let acc = Z[i][r];
|
|
12511
|
+
for (let j = 0; j < 3; j++) acc -= h * RADAU_A[i][j] * F[j][r];
|
|
12512
|
+
rhs[i * n + r] = -acc;
|
|
12513
|
+
}
|
|
12514
|
+
}
|
|
12515
|
+
const dZ = solveBig(rhs);
|
|
12516
|
+
let sq = 0;
|
|
12517
|
+
for (let i = 0; i < 3; i++) for (let r = 0; r < n; r++) sq += (dZ[i * n + r] / scale4[r]) ** 2;
|
|
12518
|
+
const dWNorm = Math.sqrt(sq / (3 * n));
|
|
12519
|
+
if (dWNormOld !== null) rate = dWNorm / dWNormOld;
|
|
12520
|
+
if (dWNormOld !== null && (rate >= 1 || Math.pow(rate, RADAU_NEWTON_MAXITER - k) / (1 - rate) * dWNorm > tol)) {
|
|
12521
|
+
break;
|
|
12522
|
+
}
|
|
12523
|
+
for (let i = 0; i < 3; i++) for (let r = 0; r < n; r++) Z[i][r] += dZ[i * n + r];
|
|
12524
|
+
if (dWNorm === 0 || dWNormOld !== null && rate / (1 - rate) * dWNorm < tol) {
|
|
12525
|
+
converged = true;
|
|
12526
|
+
k++;
|
|
12527
|
+
break;
|
|
12528
|
+
}
|
|
12529
|
+
dWNormOld = dWNorm;
|
|
12530
|
+
}
|
|
12531
|
+
return { converged, nIter: k, Z, rate };
|
|
12532
|
+
}
|
|
12533
|
+
function radauSolve(f, tspan, y0raw, options = {}) {
|
|
12534
|
+
const t0 = tspan[0];
|
|
12535
|
+
const tf = tspan[1];
|
|
12536
|
+
if (!(typeof t0 === "number" && typeof tf === "number")) {
|
|
12537
|
+
throw new Error('The "Radau" stiff method requires numeric tspan');
|
|
12538
|
+
}
|
|
12539
|
+
if (!y0raw.every((v) => typeof v === "number")) {
|
|
12540
|
+
throw new Error('The "Radau" stiff method requires plain-number state (y0)');
|
|
12541
|
+
}
|
|
12542
|
+
const y0 = y0raw;
|
|
12543
|
+
const n = y0.length;
|
|
12544
|
+
const dir = tf >= t0 ? 1 : -1;
|
|
12545
|
+
const rtol = options.tol ? options.tol : 1e-4;
|
|
12546
|
+
const atol = rtol * 1e-3;
|
|
12547
|
+
const maxIter = options.maxIter ? options.maxIter : 1e5;
|
|
12548
|
+
const maxStep = options.maxStep ?? Infinity;
|
|
12549
|
+
const newtonTol = _newtonTol(rtol);
|
|
12550
|
+
let t = t0;
|
|
12551
|
+
let y = y0.slice();
|
|
12552
|
+
let hAbs = options.firstStep ? Math.abs(options.firstStep) : _selectInitialStep(f, t0, y0, tf, maxStep, _fArr(f, t, y), dir, 3, rtol, atol);
|
|
12553
|
+
let hAbsOld = null;
|
|
12554
|
+
let errNormOld = null;
|
|
12555
|
+
const tOut = [t];
|
|
12556
|
+
const yOut = [y.slice()];
|
|
12557
|
+
let iter = 0;
|
|
12558
|
+
while ((dir > 0 ? t < tf : t > tf) && iter < maxIter) {
|
|
12559
|
+
iter++;
|
|
12560
|
+
const minStep = _minStep(t);
|
|
12561
|
+
let hEntry;
|
|
12562
|
+
if (hAbs > maxStep) {
|
|
12563
|
+
hEntry = maxStep;
|
|
12564
|
+
hAbs = maxStep;
|
|
12565
|
+
hAbsOld = null;
|
|
12566
|
+
errNormOld = null;
|
|
12567
|
+
} else if (hAbs < minStep) {
|
|
12568
|
+
hEntry = minStep;
|
|
12569
|
+
hAbs = minStep;
|
|
12570
|
+
hAbsOld = null;
|
|
12571
|
+
errNormOld = null;
|
|
12572
|
+
} else {
|
|
12573
|
+
hEntry = hAbs;
|
|
12574
|
+
}
|
|
12575
|
+
const f0 = _fArr(f, t, y);
|
|
12576
|
+
const J = _jacobianAt(f, t, y, f0, options);
|
|
12577
|
+
let stepAccepted = false;
|
|
12578
|
+
let rejected = false;
|
|
12579
|
+
let yNew = y;
|
|
12580
|
+
let errNorm = 0;
|
|
12581
|
+
let nIter = 1;
|
|
12582
|
+
let tNew = t;
|
|
12583
|
+
while (!stepAccepted) {
|
|
12584
|
+
if (hAbs < minStep) {
|
|
12585
|
+
throw new Error("Required step size is less than spacing between numbers (Radau)");
|
|
12586
|
+
}
|
|
12587
|
+
let h = hAbs * dir;
|
|
12588
|
+
tNew = t + h;
|
|
12589
|
+
if (dir * (tNew - tf) > 0) tNew = tf;
|
|
12590
|
+
h = tNew - t;
|
|
12591
|
+
hAbs = Math.abs(h);
|
|
12592
|
+
const scale4 = y.map((yi) => atol + Math.abs(yi) * rtol);
|
|
12593
|
+
const res = _radauNewton(f, t, y, h, J, scale4, newtonTol);
|
|
12594
|
+
if (!res.converged) {
|
|
12595
|
+
hAbs *= 0.5;
|
|
12596
|
+
continue;
|
|
12597
|
+
}
|
|
12598
|
+
nIter = res.nIter;
|
|
12599
|
+
const Z = res.Z;
|
|
12600
|
+
yNew = y.map((yi, r) => yi + Z[2][r]);
|
|
12601
|
+
const ze = new Array(n).fill(0);
|
|
12602
|
+
for (let r = 0; r < n; r++) {
|
|
12603
|
+
ze[r] = f0[r] + (RADAU_E[0] * Z[0][r] + RADAU_E[1] * Z[1][r] + RADAU_E[2] * Z[2][r]) / h;
|
|
12604
|
+
}
|
|
12605
|
+
const Merr = J.map((rowv, i) => rowv.map((v, j) => (i === j ? RADAU_MU_REAL / h : 0) - v));
|
|
12606
|
+
const solveErr = _factorSolver(Merr, n);
|
|
12607
|
+
let error = solveErr(ze);
|
|
12608
|
+
const escale = y.map((yi, r) => atol + Math.max(Math.abs(yi), Math.abs(yNew[r])) * rtol);
|
|
12609
|
+
errNorm = _rms(error.map((v, r) => v / escale[r]));
|
|
12610
|
+
const safety2 = 0.9 * (2 * RADAU_NEWTON_MAXITER + 1) / (2 * RADAU_NEWTON_MAXITER + nIter);
|
|
12611
|
+
if (rejected && errNorm > 1) {
|
|
12612
|
+
const yErr = y.map((yi, r) => yi + error[r]);
|
|
12613
|
+
const fErr = _fArr(f, t, yErr);
|
|
12614
|
+
error = solveErr(fErr.map((v, r) => v + ze[r] - f0[r]));
|
|
12615
|
+
errNorm = _rms(error.map((v, r) => v / escale[r]));
|
|
12616
|
+
}
|
|
12617
|
+
if (errNorm > 1) {
|
|
12618
|
+
const factor3 = _radauPredictFactor(hAbs, hAbsOld, errNorm, errNormOld);
|
|
12619
|
+
hAbs *= Math.max(RADAU_MIN_FACTOR, safety2 * factor3);
|
|
12620
|
+
rejected = true;
|
|
12621
|
+
} else {
|
|
12622
|
+
stepAccepted = true;
|
|
12623
|
+
}
|
|
12624
|
+
}
|
|
12625
|
+
const safety = 0.9 * (2 * RADAU_NEWTON_MAXITER + 1) / (2 * RADAU_NEWTON_MAXITER + nIter);
|
|
12626
|
+
let factor2 = _radauPredictFactor(hAbs, hAbsOld, errNorm, errNormOld);
|
|
12627
|
+
factor2 = Math.min(RADAU_MAX_FACTOR, safety * factor2);
|
|
12628
|
+
if (factor2 < 1.2) factor2 = 1;
|
|
12629
|
+
hAbsOld = hEntry;
|
|
12630
|
+
errNormOld = errNorm;
|
|
12631
|
+
t = tNew;
|
|
12632
|
+
y = yNew;
|
|
12633
|
+
tOut.push(t);
|
|
12634
|
+
yOut.push(y.slice());
|
|
12635
|
+
hAbs *= factor2;
|
|
12636
|
+
}
|
|
12637
|
+
if (iter >= maxIter) {
|
|
12638
|
+
throw new Error("Maximum number of iterations reached, try changing options");
|
|
12639
|
+
}
|
|
12640
|
+
return { t: tOut, y: yOut };
|
|
12641
|
+
}
|
|
12233
12642
|
var createSolveODE = /* @__PURE__ */ factory(
|
|
12234
12643
|
name,
|
|
12235
12644
|
dependencies,
|
|
@@ -12536,7 +12945,9 @@ var createSolveODE = /* @__PURE__ */ factory(
|
|
|
12536
12945
|
RK23: _rk23,
|
|
12537
12946
|
RK45: _rk45,
|
|
12538
12947
|
ROSENBROCK: rosenbrockSolve,
|
|
12539
|
-
RODAS: rodasSolve
|
|
12948
|
+
RODAS: rodasSolve,
|
|
12949
|
+
BDF: bdfSolve,
|
|
12950
|
+
RADAU: radauSolve
|
|
12540
12951
|
};
|
|
12541
12952
|
if (method.toUpperCase() in methods) {
|
|
12542
12953
|
const methodOptions = { ...opt };
|
|
@@ -13446,9 +13857,84 @@ function powerfit(xs, ys) {
|
|
|
13446
13857
|
const lna = (sy - b * sx) / n;
|
|
13447
13858
|
return [Math.exp(lna), b];
|
|
13448
13859
|
}
|
|
13860
|
+
var _DP_C = [0, 1 / 5, 3 / 10, 4 / 5, 8 / 9, 1, 1];
|
|
13861
|
+
var _DP_A = [
|
|
13862
|
+
[],
|
|
13863
|
+
[1 / 5],
|
|
13864
|
+
[3 / 40, 9 / 40],
|
|
13865
|
+
[44 / 45, -56 / 15, 32 / 9],
|
|
13866
|
+
[19372 / 6561, -25360 / 2187, 64448 / 6561, -212 / 729],
|
|
13867
|
+
[9017 / 3168, -355 / 33, 46732 / 5247, 49 / 176, -5103 / 18656],
|
|
13868
|
+
[35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84]
|
|
13869
|
+
];
|
|
13870
|
+
var _DP_B = [35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, 0];
|
|
13871
|
+
var _DP_BHAT = [5179 / 57600, 0, 7571 / 16695, 393 / 640, -92097 / 339200, 187 / 2100, 1 / 40];
|
|
13872
|
+
function _adaptiveRK45System(f, y0, tspan, tol, maxSteps) {
|
|
13873
|
+
const n = y0.length;
|
|
13874
|
+
const [t0, tf] = tspan;
|
|
13875
|
+
const dir = tf >= t0 ? 1 : -1;
|
|
13876
|
+
const rtol = tol;
|
|
13877
|
+
const atol = tol * 1e-3;
|
|
13878
|
+
const ts = [t0];
|
|
13879
|
+
const ys = [y0.slice()];
|
|
13880
|
+
let t = t0;
|
|
13881
|
+
let y = y0.slice();
|
|
13882
|
+
const f0 = f(t, y);
|
|
13883
|
+
const rms = (v) => {
|
|
13884
|
+
let s = 0;
|
|
13885
|
+
for (let i = 0; i < v.length; i++) s += v[i] * v[i];
|
|
13886
|
+
return Math.sqrt(s / v.length);
|
|
13887
|
+
};
|
|
13888
|
+
const d0 = rms(y);
|
|
13889
|
+
const d1 = rms(f0);
|
|
13890
|
+
let h = dir * Math.min(d0 < 1e-5 || d1 < 1e-5 ? 1e-6 : 0.01 * (d0 / d1), Math.abs(tf - t0));
|
|
13891
|
+
let steps = 0;
|
|
13892
|
+
while ((dir > 0 ? t < tf : t > tf) && steps < maxSteps) {
|
|
13893
|
+
steps++;
|
|
13894
|
+
if (Math.abs(h) > Math.abs(tf - t)) h = tf - t;
|
|
13895
|
+
const k = [f(t, y)];
|
|
13896
|
+
for (let s = 1; s < 7; s++) {
|
|
13897
|
+
const ys_ = y.slice();
|
|
13898
|
+
for (let j = 0; j < s; j++) {
|
|
13899
|
+
const aij = _DP_A[s][j];
|
|
13900
|
+
if (aij === 0) continue;
|
|
13901
|
+
for (let i = 0; i < n; i++) ys_[i] += h * aij * k[j][i];
|
|
13902
|
+
}
|
|
13903
|
+
k.push(f(t + _DP_C[s] * h, ys_));
|
|
13904
|
+
}
|
|
13905
|
+
const yNew = y.slice();
|
|
13906
|
+
let errNorm = 0;
|
|
13907
|
+
for (let i = 0; i < n; i++) {
|
|
13908
|
+
let sum5 = 0;
|
|
13909
|
+
let errI = 0;
|
|
13910
|
+
for (let s = 0; s < 7; s++) {
|
|
13911
|
+
sum5 += _DP_B[s] * k[s][i];
|
|
13912
|
+
errI += (_DP_B[s] - _DP_BHAT[s]) * k[s][i];
|
|
13913
|
+
}
|
|
13914
|
+
yNew[i] = y[i] + h * sum5;
|
|
13915
|
+
const sc = atol + rtol * Math.max(Math.abs(y[i]), Math.abs(yNew[i]));
|
|
13916
|
+
errNorm += (h * errI / sc) ** 2;
|
|
13917
|
+
}
|
|
13918
|
+
errNorm = Math.sqrt(errNorm / n);
|
|
13919
|
+
if (errNorm <= 1 || Math.abs(h) <= 1e-14 * Math.abs(t)) {
|
|
13920
|
+
t += h;
|
|
13921
|
+
y = yNew;
|
|
13922
|
+
ts.push(t);
|
|
13923
|
+
ys.push(y.slice());
|
|
13924
|
+
}
|
|
13925
|
+
h *= Math.min(5, Math.max(0.2, 0.9 * Math.pow(errNorm || 1e-10, -1 / 5)));
|
|
13926
|
+
}
|
|
13927
|
+
if (steps >= maxSteps) {
|
|
13928
|
+
throw new Error("Maximum number of steps reached in solveODESystem, try changing options");
|
|
13929
|
+
}
|
|
13930
|
+
return { t: ts, y: ys };
|
|
13931
|
+
}
|
|
13449
13932
|
function solveODESystem(f, y0, tspan, opts) {
|
|
13933
|
+
if (opts?.dt === void 0) {
|
|
13934
|
+
return _adaptiveRK45System(f, y0, tspan, opts?.tol ?? 1e-6, opts?.maxSteps ?? 1e5);
|
|
13935
|
+
}
|
|
13450
13936
|
const n = y0.length;
|
|
13451
|
-
const dt = opts
|
|
13937
|
+
const dt = opts.dt;
|
|
13452
13938
|
const nSteps = Math.ceil((tspan[1] - tspan[0]) / dt);
|
|
13453
13939
|
const h = (tspan[1] - tspan[0]) / nSteps;
|
|
13454
13940
|
const ts = [tspan[0]];
|
|
@@ -15157,11 +15643,11 @@ function _eigenvectorOnce(adj, maxIter, tol, seed) {
|
|
|
15157
15643
|
if (adj[j][i] > 0) next[i] += adj[j][i] * x[j];
|
|
15158
15644
|
}
|
|
15159
15645
|
}
|
|
15160
|
-
let
|
|
15161
|
-
for (let i = 0; i < n; i++)
|
|
15162
|
-
|
|
15163
|
-
if (
|
|
15164
|
-
for (let i = 0; i < n; i++) next[i] /=
|
|
15646
|
+
let norm5 = 0;
|
|
15647
|
+
for (let i = 0; i < n; i++) norm5 += next[i] * next[i];
|
|
15648
|
+
norm5 = Math.sqrt(norm5);
|
|
15649
|
+
if (norm5 < 1e-15) break;
|
|
15650
|
+
for (let i = 0; i < n; i++) next[i] /= norm5;
|
|
15165
15651
|
let delta = 0;
|
|
15166
15652
|
for (let i = 0; i < n; i++) delta = Math.max(delta, Math.abs(next[i] - x[i]));
|
|
15167
15653
|
x = next;
|
|
@@ -15174,9 +15660,9 @@ function _aggregateEigenvector(vectors, aggregation) {
|
|
|
15174
15660
|
const count2 = vectors.length;
|
|
15175
15661
|
const ref = vectors[0];
|
|
15176
15662
|
const aligned = vectors.map((v) => {
|
|
15177
|
-
let
|
|
15178
|
-
for (let i = 0; i < n; i++)
|
|
15179
|
-
if (
|
|
15663
|
+
let dot9 = 0;
|
|
15664
|
+
for (let i = 0; i < n; i++) dot9 += v[i] * ref[i];
|
|
15665
|
+
if (dot9 < 0) {
|
|
15180
15666
|
const flipped = new Float64Array(n);
|
|
15181
15667
|
for (let i = 0; i < n; i++) flipped[i] = -v[i];
|
|
15182
15668
|
return flipped;
|
|
@@ -15188,11 +15674,11 @@ function _aggregateEigenvector(vectors, aggregation) {
|
|
|
15188
15674
|
for (let i = 0; i < n; i++) mean7[i] += v[i];
|
|
15189
15675
|
}
|
|
15190
15676
|
for (let i = 0; i < n; i++) mean7[i] /= count2;
|
|
15191
|
-
let
|
|
15192
|
-
for (let i = 0; i < n; i++)
|
|
15193
|
-
|
|
15194
|
-
if (
|
|
15195
|
-
for (let i = 0; i < n; i++) mean7[i] /=
|
|
15677
|
+
let norm5 = 0;
|
|
15678
|
+
for (let i = 0; i < n; i++) norm5 += mean7[i] * mean7[i];
|
|
15679
|
+
norm5 = Math.sqrt(norm5);
|
|
15680
|
+
if (norm5 > 1e-15) {
|
|
15681
|
+
for (let i = 0; i < n; i++) mean7[i] /= norm5;
|
|
15196
15682
|
}
|
|
15197
15683
|
if (aggregation === "mean") {
|
|
15198
15684
|
return { centrality: mean7 };
|
|
@@ -17103,11 +17589,11 @@ function principalComponentAnalysis(data, k) {
|
|
|
17103
17589
|
Av[i] += A[i][j] * v[j];
|
|
17104
17590
|
}
|
|
17105
17591
|
}
|
|
17106
|
-
let
|
|
17107
|
-
for (let i = 0; i < p; i++)
|
|
17108
|
-
|
|
17109
|
-
if (
|
|
17110
|
-
const vNew = Av.map((x) => x /
|
|
17592
|
+
let norm5 = 0;
|
|
17593
|
+
for (let i = 0; i < p; i++) norm5 += Av[i] * Av[i];
|
|
17594
|
+
norm5 = Math.sqrt(norm5);
|
|
17595
|
+
if (norm5 === 0) break;
|
|
17596
|
+
const vNew = Av.map((x) => x / norm5);
|
|
17111
17597
|
let diff2 = 0;
|
|
17112
17598
|
for (let i = 0; i < p; i++) diff2 += (vNew[i] - v[i]) ** 2;
|
|
17113
17599
|
v = vNew;
|
|
@@ -17132,9 +17618,9 @@ function principalComponentAnalysis(data, k) {
|
|
|
17132
17618
|
const explained = eigenvalues.map((ev) => totalVar > 0 ? Math.abs(ev) / totalVar : 0);
|
|
17133
17619
|
const scores = centered.map((row2) => {
|
|
17134
17620
|
return eigenvectors.map((ev) => {
|
|
17135
|
-
let
|
|
17136
|
-
for (let j = 0; j < p; j++)
|
|
17137
|
-
return
|
|
17621
|
+
let dot9 = 0;
|
|
17622
|
+
for (let j = 0; j < p; j++) dot9 += row2[j] * ev[j];
|
|
17623
|
+
return dot9;
|
|
17138
17624
|
});
|
|
17139
17625
|
});
|
|
17140
17626
|
return { components: eigenvectors, explained, scores };
|
|
@@ -17733,30 +18219,30 @@ function hessenbergForm(A) {
|
|
|
17733
18219
|
if (normV < 1e-30) continue;
|
|
17734
18220
|
const beta2 = 2 / normV;
|
|
17735
18221
|
for (let j = k; j < n; j++) {
|
|
17736
|
-
let
|
|
18222
|
+
let dot9 = 0;
|
|
17737
18223
|
for (let i = 0; i < len; i++) {
|
|
17738
|
-
|
|
18224
|
+
dot9 += v[i] * H[k + 1 + i][j];
|
|
17739
18225
|
}
|
|
17740
18226
|
for (let i = 0; i < len; i++) {
|
|
17741
|
-
H[k + 1 + i][j] -= beta2 * v[i] *
|
|
18227
|
+
H[k + 1 + i][j] -= beta2 * v[i] * dot9;
|
|
17742
18228
|
}
|
|
17743
18229
|
}
|
|
17744
18230
|
for (let i = 0; i < n; i++) {
|
|
17745
|
-
let
|
|
18231
|
+
let dot9 = 0;
|
|
17746
18232
|
for (let j = 0; j < len; j++) {
|
|
17747
|
-
|
|
18233
|
+
dot9 += H[i][k + 1 + j] * v[j];
|
|
17748
18234
|
}
|
|
17749
18235
|
for (let j = 0; j < len; j++) {
|
|
17750
|
-
H[i][k + 1 + j] -= beta2 *
|
|
18236
|
+
H[i][k + 1 + j] -= beta2 * dot9 * v[j];
|
|
17751
18237
|
}
|
|
17752
18238
|
}
|
|
17753
18239
|
for (let i = 0; i < n; i++) {
|
|
17754
|
-
let
|
|
18240
|
+
let dot9 = 0;
|
|
17755
18241
|
for (let j = 0; j < len; j++) {
|
|
17756
|
-
|
|
18242
|
+
dot9 += Q2[i][k + 1 + j] * v[j];
|
|
17757
18243
|
}
|
|
17758
18244
|
for (let j = 0; j < len; j++) {
|
|
17759
|
-
Q2[i][k + 1 + j] -= beta2 *
|
|
18245
|
+
Q2[i][k + 1 + j] -= beta2 * dot9 * v[j];
|
|
17760
18246
|
}
|
|
17761
18247
|
}
|
|
17762
18248
|
}
|
|
@@ -18125,11 +18611,11 @@ function findKernelVector(A, n, tol) {
|
|
|
18125
18611
|
}
|
|
18126
18612
|
}
|
|
18127
18613
|
}
|
|
18128
|
-
let
|
|
18129
|
-
for (let i = 0; i < n; i++)
|
|
18130
|
-
|
|
18131
|
-
if (
|
|
18132
|
-
for (let i = 0; i < n; i++) v[i] /=
|
|
18614
|
+
let norm5 = 0;
|
|
18615
|
+
for (let i = 0; i < n; i++) norm5 += v[i] * v[i];
|
|
18616
|
+
norm5 = Math.sqrt(norm5);
|
|
18617
|
+
if (norm5 > 1e-15) {
|
|
18618
|
+
for (let i = 0; i < n; i++) v[i] /= norm5;
|
|
18133
18619
|
}
|
|
18134
18620
|
return v;
|
|
18135
18621
|
}
|
|
@@ -18166,11 +18652,11 @@ async function solveApprox(A, b, n) {
|
|
|
18166
18652
|
}
|
|
18167
18653
|
}
|
|
18168
18654
|
const x = M.map((row2) => row2[n]);
|
|
18169
|
-
let
|
|
18170
|
-
for (let i = 0; i < n; i++)
|
|
18171
|
-
|
|
18172
|
-
if (
|
|
18173
|
-
for (let i = 0; i < n; i++) x[i] /=
|
|
18655
|
+
let norm5 = 0;
|
|
18656
|
+
for (let i = 0; i < n; i++) norm5 += x[i] * x[i];
|
|
18657
|
+
norm5 = Math.sqrt(norm5);
|
|
18658
|
+
if (norm5 > 1e-15) {
|
|
18659
|
+
for (let i = 0; i < n; i++) x[i] /= norm5;
|
|
18174
18660
|
}
|
|
18175
18661
|
return x;
|
|
18176
18662
|
}
|
|
@@ -30180,7 +30666,7 @@ var createPinv = /* @__PURE__ */ factory(
|
|
|
30180
30666
|
deepEqual: deepEqual3,
|
|
30181
30667
|
equal: equal2,
|
|
30182
30668
|
dotDivide: dotDivide2,
|
|
30183
|
-
dot:
|
|
30669
|
+
dot: dot9,
|
|
30184
30670
|
ctranspose: ctranspose2,
|
|
30185
30671
|
divideScalar: divideScalar2,
|
|
30186
30672
|
multiply: multiply2,
|
|
@@ -30196,7 +30682,7 @@ var createPinv = /* @__PURE__ */ factory(
|
|
|
30196
30682
|
if (size2[0] === 1) {
|
|
30197
30683
|
return inv3(x);
|
|
30198
30684
|
} else {
|
|
30199
|
-
return dotDivide2(ctranspose2(x),
|
|
30685
|
+
return dotDivide2(ctranspose2(x), dot9(x, x));
|
|
30200
30686
|
}
|
|
30201
30687
|
case 2: {
|
|
30202
30688
|
if (_isZeros(x)) return ctranspose2(x);
|
|
@@ -30275,8 +30761,8 @@ var createPinv = /* @__PURE__ */ factory(
|
|
|
30275
30761
|
}
|
|
30276
30762
|
function _rankFact(mat, rows, cols) {
|
|
30277
30763
|
const rref = _rref(mat, rows, cols);
|
|
30278
|
-
const C = mat.map((row2) => row2.filter((_, j) => j < rows && !_isZero(
|
|
30279
|
-
const F = rref.filter((_, i) => !_isZero(
|
|
30764
|
+
const C = mat.map((row2) => row2.filter((_, j) => j < rows && !_isZero(dot9(rref[j], rref[j]))));
|
|
30765
|
+
const F = rref.filter((_, i) => !_isZero(dot9(rref[i], rref[i])));
|
|
30280
30766
|
return { C, F };
|
|
30281
30767
|
}
|
|
30282
30768
|
function _isZero(x) {
|
|
@@ -37197,7 +37683,7 @@ function createComplexEigs({
|
|
|
37197
37683
|
larger: larger2,
|
|
37198
37684
|
smaller: smaller2,
|
|
37199
37685
|
matrixFromColumns: _matrixFromColumns,
|
|
37200
|
-
dot:
|
|
37686
|
+
dot: dot9
|
|
37201
37687
|
}) {
|
|
37202
37688
|
function complexEigs(arr10, N, prec, type, findVectors = true) {
|
|
37203
37689
|
if (!findVectors && type === "number" && N * N >= WASM_EIGS_THRESHOLD) {
|
|
@@ -37568,11 +38054,11 @@ function createComplexEigs({
|
|
|
37568
38054
|
M[i] = Array(N).fill(0);
|
|
37569
38055
|
}
|
|
37570
38056
|
let I2 = 0;
|
|
37571
|
-
for (const
|
|
37572
|
-
const n =
|
|
38057
|
+
for (const sub3 of arr10) {
|
|
38058
|
+
const n = sub3.length;
|
|
37573
38059
|
for (let i = 0; i < n; i++) {
|
|
37574
38060
|
for (let j = 0; j < n; j++) {
|
|
37575
|
-
M[I2 + i][I2 + j] =
|
|
38061
|
+
M[I2 + i][I2 + j] = sub3[i][j];
|
|
37576
38062
|
}
|
|
37577
38063
|
}
|
|
37578
38064
|
I2 += n;
|
|
@@ -37598,7 +38084,7 @@ function createComplexEigs({
|
|
|
37598
38084
|
} catch {
|
|
37599
38085
|
continue;
|
|
37600
38086
|
}
|
|
37601
|
-
if (larger2(
|
|
38087
|
+
if (larger2(norm5(b), largeNum)) {
|
|
37602
38088
|
break;
|
|
37603
38089
|
}
|
|
37604
38090
|
}
|
|
@@ -37608,13 +38094,13 @@ function createComplexEigs({
|
|
|
37608
38094
|
i = 0;
|
|
37609
38095
|
while (true) {
|
|
37610
38096
|
const c = usolve2(A, b);
|
|
37611
|
-
if (smaller2(
|
|
38097
|
+
if (smaller2(norm5(orthogonalComplement(b, [c])), prec)) {
|
|
37612
38098
|
break;
|
|
37613
38099
|
}
|
|
37614
38100
|
if (++i >= 10) {
|
|
37615
38101
|
return null;
|
|
37616
38102
|
}
|
|
37617
|
-
b =
|
|
38103
|
+
b = normalize3(c, type);
|
|
37618
38104
|
}
|
|
37619
38105
|
return b;
|
|
37620
38106
|
}
|
|
@@ -37629,7 +38115,7 @@ function createComplexEigs({
|
|
|
37629
38115
|
v = v.map((n) => complex3(n));
|
|
37630
38116
|
}
|
|
37631
38117
|
v = orthogonalComplement(v, orthog);
|
|
37632
|
-
return
|
|
38118
|
+
return normalize3(v, type);
|
|
37633
38119
|
}
|
|
37634
38120
|
function orthogonalComplement(v, orthog) {
|
|
37635
38121
|
const vectorShape = size2(v);
|
|
@@ -37638,21 +38124,21 @@ function createComplexEigs({
|
|
|
37638
38124
|
v = subtract3(
|
|
37639
38125
|
v,
|
|
37640
38126
|
multiply2(
|
|
37641
|
-
divideScalar2(
|
|
38127
|
+
divideScalar2(dot9(w, v), dot9(w, w)),
|
|
37642
38128
|
w
|
|
37643
38129
|
)
|
|
37644
38130
|
);
|
|
37645
38131
|
}
|
|
37646
38132
|
return v;
|
|
37647
38133
|
}
|
|
37648
|
-
function
|
|
37649
|
-
return abs2(sqrt2(
|
|
38134
|
+
function norm5(v) {
|
|
38135
|
+
return abs2(sqrt2(dot9(v, v)));
|
|
37650
38136
|
}
|
|
37651
|
-
function
|
|
38137
|
+
function normalize3(v, type) {
|
|
37652
38138
|
const big = type === "BigNumber";
|
|
37653
38139
|
const cplx = type === "Complex";
|
|
37654
38140
|
const one = big ? bignumber2(1) : cplx ? complex3(1) : 1;
|
|
37655
|
-
return multiply2(divideScalar2(one,
|
|
38141
|
+
return multiply2(divideScalar2(one, norm5(v)), v);
|
|
37656
38142
|
}
|
|
37657
38143
|
return complexEigs;
|
|
37658
38144
|
}
|
|
@@ -38066,7 +38552,7 @@ var createEigs = /* @__PURE__ */ factory(
|
|
|
38066
38552
|
re: re3,
|
|
38067
38553
|
smaller: smaller2,
|
|
38068
38554
|
matrixFromColumns: matrixFromColumns2,
|
|
38069
|
-
dot:
|
|
38555
|
+
dot: dot9
|
|
38070
38556
|
}) => {
|
|
38071
38557
|
const doRealSymmetric = createRealSymmetric({
|
|
38072
38558
|
config: config2,
|
|
@@ -38105,7 +38591,7 @@ var createEigs = /* @__PURE__ */ factory(
|
|
|
38105
38591
|
larger: larger2,
|
|
38106
38592
|
smaller: smaller2,
|
|
38107
38593
|
matrixFromColumns: matrixFromColumns2,
|
|
38108
|
-
dot:
|
|
38594
|
+
dot: dot9
|
|
38109
38595
|
});
|
|
38110
38596
|
return typed3("eigs", {
|
|
38111
38597
|
// The conversion to matrix in the first two implementations,
|
|
@@ -40852,7 +41338,7 @@ var createRotationMatrix = /* @__PURE__ */ factory(
|
|
|
40852
41338
|
multiplyScalar: multiplyScalar2,
|
|
40853
41339
|
addScalar: addScalar2,
|
|
40854
41340
|
unaryMinus: unaryMinus2,
|
|
40855
|
-
norm:
|
|
41341
|
+
norm: norm5,
|
|
40856
41342
|
BigNumber: BigNumber9,
|
|
40857
41343
|
matrix: matrix2,
|
|
40858
41344
|
DenseMatrix: DenseMatrix7,
|
|
@@ -40926,7 +41412,7 @@ var createRotationMatrix = /* @__PURE__ */ factory(
|
|
|
40926
41412
|
return data;
|
|
40927
41413
|
}
|
|
40928
41414
|
function _rotationMatrix3x3(theta, v, format4) {
|
|
40929
|
-
const normV =
|
|
41415
|
+
const normV = norm5(v);
|
|
40930
41416
|
if (normV === 0) {
|
|
40931
41417
|
throw new RangeError("Rotation around zero vector");
|
|
40932
41418
|
}
|
|
@@ -42963,11 +43449,11 @@ function multivariateTaylor(expr, vars, x0, n = 1) {
|
|
|
42963
43449
|
const fmp = evalWith(expr, s);
|
|
42964
43450
|
s[vars[j]] = x0[j] - h;
|
|
42965
43451
|
const fmm = evalWith(expr, s);
|
|
42966
|
-
const
|
|
42967
|
-
if (Math.abs(
|
|
43452
|
+
const cross4 = (fpp - fpm - fmp + fmm) / (4 * h * h);
|
|
43453
|
+
if (Math.abs(cross4) < 1e-12) continue;
|
|
42968
43454
|
const xi = x0[i] === 0 ? vars[i] : `(${vars[i]} - ${formatCoeff(x0[i])})`;
|
|
42969
43455
|
const xj = x0[j] === 0 ? vars[j] : `(${vars[j]} - ${formatCoeff(x0[j])})`;
|
|
42970
|
-
terms.push(`${formatCoeff(
|
|
43456
|
+
terms.push(`${formatCoeff(cross4)}*${xi}*${xj}`);
|
|
42971
43457
|
}
|
|
42972
43458
|
}
|
|
42973
43459
|
}
|
|
@@ -45950,12 +46436,12 @@ function svds(A, k = 1, opts) {
|
|
|
45950
46436
|
}
|
|
45951
46437
|
|
|
45952
46438
|
// src/numeric/structured-solvers.ts
|
|
45953
|
-
function thomasSolve(
|
|
46439
|
+
function thomasSolve(sub3, diag2, sup, d) {
|
|
45954
46440
|
const n = diag2.length;
|
|
45955
46441
|
if (n === 0) return [];
|
|
45956
|
-
if (
|
|
46442
|
+
if (sub3.length !== n - 1 || sup.length !== n - 1 || d.length !== n) {
|
|
45957
46443
|
throw new Error(
|
|
45958
|
-
`thomasSolve: expected sub/sup of length ${n - 1} and d of length ${n}, got sub=${
|
|
46444
|
+
`thomasSolve: expected sub/sup of length ${n - 1} and d of length ${n}, got sub=${sub3.length}, sup=${sup.length}, d=${d.length}`
|
|
45959
46445
|
);
|
|
45960
46446
|
}
|
|
45961
46447
|
const cp = new Array(n).fill(0);
|
|
@@ -45964,12 +46450,12 @@ function thomasSolve(sub2, diag2, sup, d) {
|
|
|
45964
46450
|
cp[0] = n > 1 ? sup[0] / diag2[0] : 0;
|
|
45965
46451
|
dp[0] = d[0] / diag2[0];
|
|
45966
46452
|
for (let i = 1; i < n; i++) {
|
|
45967
|
-
const m = diag2[i] -
|
|
46453
|
+
const m = diag2[i] - sub3[i - 1] * cp[i - 1];
|
|
45968
46454
|
if (m === 0) {
|
|
45969
46455
|
throw new Error(`thomasSolve: zero pivot at row ${i} (no pivoting is performed)`);
|
|
45970
46456
|
}
|
|
45971
46457
|
cp[i] = i < n - 1 ? sup[i] / m : 0;
|
|
45972
|
-
dp[i] = (d[i] -
|
|
46458
|
+
dp[i] = (d[i] - sub3[i - 1] * dp[i - 1]) / m;
|
|
45973
46459
|
}
|
|
45974
46460
|
const x = new Array(n);
|
|
45975
46461
|
x[n - 1] = dp[n - 1];
|
|
@@ -47554,17 +48040,17 @@ function nelderMead(f, x0, opts = {}) {
|
|
|
47554
48040
|
return c;
|
|
47555
48041
|
};
|
|
47556
48042
|
const add4 = (a, b, s) => a.map((v, i) => v + s * b[i]);
|
|
47557
|
-
const
|
|
48043
|
+
const sub3 = (a, b) => a.map((v, i) => v - b[i]);
|
|
47558
48044
|
for (; iter < maxIter; iter++) {
|
|
47559
48045
|
const order = fv.map((_, i) => i).sort((i, j) => fv[i] - fv[j]);
|
|
47560
48046
|
simplex = order.map((i) => simplex[i]);
|
|
47561
48047
|
fv = order.map((i) => fv[i]);
|
|
47562
48048
|
if (Math.abs(fv[n] - fv[0]) <= tol * (Math.abs(fv[0]) + tol)) break;
|
|
47563
48049
|
const c = centroid2(simplex.slice(0, n));
|
|
47564
|
-
const xr = add4(c,
|
|
48050
|
+
const xr = add4(c, sub3(c, simplex[n]), alpha);
|
|
47565
48051
|
const fr = f(xr);
|
|
47566
48052
|
if (fr < fv[0]) {
|
|
47567
|
-
const xe = add4(c,
|
|
48053
|
+
const xe = add4(c, sub3(c, simplex[n]), gamma2);
|
|
47568
48054
|
const fe = f(xe);
|
|
47569
48055
|
if (fe < fr) {
|
|
47570
48056
|
simplex[n] = xe;
|
|
@@ -47577,14 +48063,14 @@ function nelderMead(f, x0, opts = {}) {
|
|
|
47577
48063
|
simplex[n] = xr;
|
|
47578
48064
|
fv[n] = fr;
|
|
47579
48065
|
} else {
|
|
47580
|
-
const xc = add4(c,
|
|
48066
|
+
const xc = add4(c, sub3(simplex[n], c), rho);
|
|
47581
48067
|
const fc = f(xc);
|
|
47582
48068
|
if (fc < fv[n]) {
|
|
47583
48069
|
simplex[n] = xc;
|
|
47584
48070
|
fv[n] = fc;
|
|
47585
48071
|
} else {
|
|
47586
48072
|
for (let i = 1; i <= n; i++) {
|
|
47587
|
-
simplex[i] = add4(simplex[0],
|
|
48073
|
+
simplex[i] = add4(simplex[0], sub3(simplex[i], simplex[0]), sigma);
|
|
47588
48074
|
fv[i] = f(simplex[i]);
|
|
47589
48075
|
}
|
|
47590
48076
|
}
|
|
@@ -50204,12 +50690,12 @@ function rickerWavelet(points, scale4) {
|
|
|
50204
50690
|
return out;
|
|
50205
50691
|
}
|
|
50206
50692
|
function morletWavelet(points, scale4) {
|
|
50207
|
-
const
|
|
50693
|
+
const norm5 = 1 / (Math.sqrt(scale4) * Math.pow(Math.PI, 0.25));
|
|
50208
50694
|
const out = new Array(points);
|
|
50209
50695
|
const center3 = (points - 1) / 2;
|
|
50210
50696
|
for (let i = 0; i < points; i++) {
|
|
50211
50697
|
const t = (i - center3) / scale4;
|
|
50212
|
-
out[i] =
|
|
50698
|
+
out[i] = norm5 * Math.cos(5 * t) * Math.exp(-(t * t) / 2);
|
|
50213
50699
|
}
|
|
50214
50700
|
return out;
|
|
50215
50701
|
}
|
|
@@ -50756,6 +51242,264 @@ function segmentSegmentClosest(p1, p2, q1, q2) {
|
|
|
50756
51242
|
return { point1, point2, distance: distance2 };
|
|
50757
51243
|
}
|
|
50758
51244
|
|
|
51245
|
+
// src/geometry/hull.ts
|
|
51246
|
+
function hull2DIndices(points) {
|
|
51247
|
+
const n = points.length;
|
|
51248
|
+
const order = Array.from({ length: n }, (_, i) => i).sort(
|
|
51249
|
+
(a, b) => points[a][0] - points[b][0] || points[a][1] - points[b][1]
|
|
51250
|
+
);
|
|
51251
|
+
const cross4 = (o, a, b) => (points[a][0] - points[o][0]) * (points[b][1] - points[o][1]) - (points[a][1] - points[o][1]) * (points[b][0] - points[o][0]);
|
|
51252
|
+
const lower = [];
|
|
51253
|
+
for (const i of order) {
|
|
51254
|
+
while (lower.length >= 2 && cross4(lower[lower.length - 2], lower[lower.length - 1], i) <= 0) {
|
|
51255
|
+
lower.pop();
|
|
51256
|
+
}
|
|
51257
|
+
lower.push(i);
|
|
51258
|
+
}
|
|
51259
|
+
const upper = [];
|
|
51260
|
+
for (let k = order.length - 1; k >= 0; k--) {
|
|
51261
|
+
const i = order[k];
|
|
51262
|
+
while (upper.length >= 2 && cross4(upper[upper.length - 2], upper[upper.length - 1], i) <= 0) {
|
|
51263
|
+
upper.pop();
|
|
51264
|
+
}
|
|
51265
|
+
upper.push(i);
|
|
51266
|
+
}
|
|
51267
|
+
lower.pop();
|
|
51268
|
+
upper.pop();
|
|
51269
|
+
return lower.concat(upper);
|
|
51270
|
+
}
|
|
51271
|
+
function convexHull2D2(points) {
|
|
51272
|
+
const vertices = hull2DIndices(points);
|
|
51273
|
+
const m = vertices.length;
|
|
51274
|
+
const simplices = [];
|
|
51275
|
+
let signedArea = 0;
|
|
51276
|
+
let perimeter = 0;
|
|
51277
|
+
for (let k = 0; k < m; k++) {
|
|
51278
|
+
const i = vertices[k];
|
|
51279
|
+
const j = vertices[(k + 1) % m];
|
|
51280
|
+
simplices.push([i, j]);
|
|
51281
|
+
const a = points[i];
|
|
51282
|
+
const b = points[j];
|
|
51283
|
+
signedArea += a[0] * b[1] - b[0] * a[1];
|
|
51284
|
+
perimeter += Math.hypot(b[0] - a[0], b[1] - a[1]);
|
|
51285
|
+
}
|
|
51286
|
+
return { vertices, simplices, area: perimeter, volume: Math.abs(signedArea) / 2 };
|
|
51287
|
+
}
|
|
51288
|
+
function convexHull3DResult(points) {
|
|
51289
|
+
const faces = convexHull3D(points);
|
|
51290
|
+
const vertexSet = /* @__PURE__ */ new Set();
|
|
51291
|
+
let volume6 = 0;
|
|
51292
|
+
let surface = 0;
|
|
51293
|
+
for (const [ia, ib, ic] of faces) {
|
|
51294
|
+
vertexSet.add(ia);
|
|
51295
|
+
vertexSet.add(ib);
|
|
51296
|
+
vertexSet.add(ic);
|
|
51297
|
+
const a = points[ia];
|
|
51298
|
+
const b = points[ib];
|
|
51299
|
+
const c = points[ic];
|
|
51300
|
+
volume6 += a[0] * (b[1] * c[2] - b[2] * c[1]) - a[1] * (b[0] * c[2] - b[2] * c[0]) + a[2] * (b[0] * c[1] - b[1] * c[0]);
|
|
51301
|
+
const ux = b[0] - a[0];
|
|
51302
|
+
const uy = b[1] - a[1];
|
|
51303
|
+
const uz = b[2] - a[2];
|
|
51304
|
+
const vx = c[0] - a[0];
|
|
51305
|
+
const vy = c[1] - a[1];
|
|
51306
|
+
const vz = c[2] - a[2];
|
|
51307
|
+
const cx = uy * vz - uz * vy;
|
|
51308
|
+
const cy = uz * vx - ux * vz;
|
|
51309
|
+
const cz = ux * vy - uy * vx;
|
|
51310
|
+
surface += Math.hypot(cx, cy, cz) / 2;
|
|
51311
|
+
}
|
|
51312
|
+
return {
|
|
51313
|
+
vertices: Array.from(vertexSet).sort((a, b) => a - b),
|
|
51314
|
+
simplices: faces.map((f) => [...f]),
|
|
51315
|
+
area: surface,
|
|
51316
|
+
volume: Math.abs(volume6) / 6
|
|
51317
|
+
};
|
|
51318
|
+
}
|
|
51319
|
+
function convexHull(points) {
|
|
51320
|
+
if (!Array.isArray(points) || points.length === 0) {
|
|
51321
|
+
throw new Error("convexHull: requires a non-empty array of points");
|
|
51322
|
+
}
|
|
51323
|
+
const dim = points[0].length;
|
|
51324
|
+
if (dim === 2) {
|
|
51325
|
+
if (points.length < 3) throw new Error("convexHull: 2-D hull requires at least 3 points");
|
|
51326
|
+
return convexHull2D2(points);
|
|
51327
|
+
}
|
|
51328
|
+
if (dim === 3) {
|
|
51329
|
+
if (points.length < 4) throw new Error("convexHull: 3-D hull requires at least 4 points");
|
|
51330
|
+
return convexHull3DResult(points);
|
|
51331
|
+
}
|
|
51332
|
+
throw new Error(`convexHull: only 2-D and 3-D point sets are supported (got dimension ${dim})`);
|
|
51333
|
+
}
|
|
51334
|
+
|
|
51335
|
+
// src/geometry/delaunay.ts
|
|
51336
|
+
function delaunay(points) {
|
|
51337
|
+
if (!Array.isArray(points) || points.length < 3) {
|
|
51338
|
+
throw new Error("delaunay: requires at least 3 points");
|
|
51339
|
+
}
|
|
51340
|
+
if (points[0].length !== 2) {
|
|
51341
|
+
throw new Error("delaunay: only 2-D point sets are supported");
|
|
51342
|
+
}
|
|
51343
|
+
return { simplices: delaunayTriangulation(points).map((t) => [...t]) };
|
|
51344
|
+
}
|
|
51345
|
+
|
|
51346
|
+
// src/geometry/voronoi.ts
|
|
51347
|
+
function circumcenter(a, b, c) {
|
|
51348
|
+
const d = 2 * (a[0] * (b[1] - c[1]) + b[0] * (c[1] - a[1]) + c[0] * (a[1] - b[1]));
|
|
51349
|
+
if (Math.abs(d) < 1e-15) return null;
|
|
51350
|
+
const a2 = a[0] * a[0] + a[1] * a[1];
|
|
51351
|
+
const b2 = b[0] * b[0] + b[1] * b[1];
|
|
51352
|
+
const c2 = c[0] * c[0] + c[1] * c[1];
|
|
51353
|
+
const ux = (a2 * (b[1] - c[1]) + b2 * (c[1] - a[1]) + c2 * (a[1] - b[1])) / d;
|
|
51354
|
+
const uy = (a2 * (c[0] - b[0]) + b2 * (a[0] - c[0]) + c2 * (b[0] - a[0])) / d;
|
|
51355
|
+
return [ux, uy];
|
|
51356
|
+
}
|
|
51357
|
+
function voronoi(points) {
|
|
51358
|
+
const { simplices: tris } = delaunay(points);
|
|
51359
|
+
const vertices = [];
|
|
51360
|
+
const simplices = [];
|
|
51361
|
+
const regions = Array.from({ length: points.length }, () => []);
|
|
51362
|
+
for (const t of tris) {
|
|
51363
|
+
const cc = circumcenter(points[t[0]], points[t[1]], points[t[2]]);
|
|
51364
|
+
if (cc === null) continue;
|
|
51365
|
+
const vIdx = vertices.length;
|
|
51366
|
+
vertices.push(cc);
|
|
51367
|
+
simplices.push([...t]);
|
|
51368
|
+
for (const p of t) regions[p].push(vIdx);
|
|
51369
|
+
}
|
|
51370
|
+
return { vertices, simplices, regions };
|
|
51371
|
+
}
|
|
51372
|
+
|
|
51373
|
+
// src/geometry/alpha-shape.ts
|
|
51374
|
+
function circumradius(a, b, c) {
|
|
51375
|
+
const d = 2 * (a[0] * (b[1] - c[1]) + b[0] * (c[1] - a[1]) + c[0] * (a[1] - b[1]));
|
|
51376
|
+
if (Math.abs(d) < 1e-15) return Infinity;
|
|
51377
|
+
const a2 = a[0] * a[0] + a[1] * a[1];
|
|
51378
|
+
const b2 = b[0] * b[0] + b[1] * b[1];
|
|
51379
|
+
const c2 = c[0] * c[0] + c[1] * c[1];
|
|
51380
|
+
const ux = (a2 * (b[1] - c[1]) + b2 * (c[1] - a[1]) + c2 * (a[1] - b[1])) / d;
|
|
51381
|
+
const uy = (a2 * (c[0] - b[0]) + b2 * (a[0] - c[0]) + c2 * (b[0] - a[0])) / d;
|
|
51382
|
+
return Math.hypot(a[0] - ux, a[1] - uy);
|
|
51383
|
+
}
|
|
51384
|
+
function alphaShape(points, alpha) {
|
|
51385
|
+
if (!(alpha > 0)) throw new Error("alphaShape: alpha must be positive");
|
|
51386
|
+
const { simplices: tris } = delaunay(points);
|
|
51387
|
+
const threshold = 1 / alpha;
|
|
51388
|
+
const triangles = [];
|
|
51389
|
+
const edgeCount = /* @__PURE__ */ new Map();
|
|
51390
|
+
for (const t of tris) {
|
|
51391
|
+
if (circumradius(points[t[0]], points[t[1]], points[t[2]]) > threshold) continue;
|
|
51392
|
+
triangles.push([...t]);
|
|
51393
|
+
const es = [
|
|
51394
|
+
[t[0], t[1]],
|
|
51395
|
+
[t[1], t[2]],
|
|
51396
|
+
[t[2], t[0]]
|
|
51397
|
+
];
|
|
51398
|
+
for (const [u, v] of es) {
|
|
51399
|
+
const key = `${Math.min(u, v)},${Math.max(u, v)}`;
|
|
51400
|
+
edgeCount.set(key, (edgeCount.get(key) ?? 0) + 1);
|
|
51401
|
+
}
|
|
51402
|
+
}
|
|
51403
|
+
const edges = [];
|
|
51404
|
+
for (const [key, count2] of edgeCount) {
|
|
51405
|
+
if (count2 === 1) {
|
|
51406
|
+
const [lo, hi] = key.split(",").map(Number);
|
|
51407
|
+
edges.push([lo, hi]);
|
|
51408
|
+
}
|
|
51409
|
+
}
|
|
51410
|
+
return { triangles, edges };
|
|
51411
|
+
}
|
|
51412
|
+
|
|
51413
|
+
// src/geometry/spherical-voronoi.ts
|
|
51414
|
+
function sub2(a, b) {
|
|
51415
|
+
return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
|
|
51416
|
+
}
|
|
51417
|
+
function cross3(a, b) {
|
|
51418
|
+
return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
|
|
51419
|
+
}
|
|
51420
|
+
function dot8(a, b) {
|
|
51421
|
+
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
51422
|
+
}
|
|
51423
|
+
function norm4(a) {
|
|
51424
|
+
return Math.hypot(a[0], a[1], a[2]);
|
|
51425
|
+
}
|
|
51426
|
+
function normalize2(a) {
|
|
51427
|
+
const n = norm4(a) || 1;
|
|
51428
|
+
return [a[0] / n, a[1] / n, a[2] / n];
|
|
51429
|
+
}
|
|
51430
|
+
function geodesicAngle(u, v) {
|
|
51431
|
+
return Math.atan2(norm4(cross3(u, v)), dot8(u, v));
|
|
51432
|
+
}
|
|
51433
|
+
function sphericalTriangleArea(a, b, c) {
|
|
51434
|
+
const A = geodesicAngle(b, c);
|
|
51435
|
+
const B = geodesicAngle(a, c);
|
|
51436
|
+
const C = geodesicAngle(a, b);
|
|
51437
|
+
const s = (A + B + C) / 2;
|
|
51438
|
+
const t = Math.tan(s / 2) * Math.tan((s - A) / 2) * Math.tan((s - B) / 2) * Math.tan((s - C) / 2);
|
|
51439
|
+
return 4 * Math.atan(Math.sqrt(Math.max(0, t)));
|
|
51440
|
+
}
|
|
51441
|
+
function sphericalVoronoi(points, radius = 1, center3 = [0, 0, 0]) {
|
|
51442
|
+
if (!Array.isArray(points) || points.length < 4) {
|
|
51443
|
+
throw new Error("sphericalVoronoi: requires at least 4 points");
|
|
51444
|
+
}
|
|
51445
|
+
if (points[0].length !== 3) {
|
|
51446
|
+
throw new Error("sphericalVoronoi: only 3-D point sets are supported");
|
|
51447
|
+
}
|
|
51448
|
+
const gen = points.map((p) => normalize2(sub2(p, center3)));
|
|
51449
|
+
const faces = convexHull3D(points);
|
|
51450
|
+
const vertices = [];
|
|
51451
|
+
const vertDir = [];
|
|
51452
|
+
const incident = Array.from({ length: points.length }, () => []);
|
|
51453
|
+
faces.forEach((f, fi) => {
|
|
51454
|
+
const a = gen[f[0]];
|
|
51455
|
+
const b = gen[f[1]];
|
|
51456
|
+
const c = gen[f[2]];
|
|
51457
|
+
let nrm = cross3(sub2(b, a), sub2(c, a));
|
|
51458
|
+
if (dot8(nrm, a) < 0) nrm = [-nrm[0], -nrm[1], -nrm[2]];
|
|
51459
|
+
const dir = normalize2(nrm);
|
|
51460
|
+
vertDir.push(dir);
|
|
51461
|
+
vertices.push([
|
|
51462
|
+
center3[0] + radius * dir[0],
|
|
51463
|
+
center3[1] + radius * dir[1],
|
|
51464
|
+
center3[2] + radius * dir[2]
|
|
51465
|
+
]);
|
|
51466
|
+
for (const p of f) incident[p].push(fi);
|
|
51467
|
+
});
|
|
51468
|
+
const regions = [];
|
|
51469
|
+
const areas = [];
|
|
51470
|
+
for (let g = 0; g < points.length; g++) {
|
|
51471
|
+
const gdir = gen[g];
|
|
51472
|
+
const facs = incident[g];
|
|
51473
|
+
let ref = null;
|
|
51474
|
+
const withAngle = facs.map((fi) => {
|
|
51475
|
+
const d = vertDir[fi];
|
|
51476
|
+
const tang = normalize2(
|
|
51477
|
+
sub2(d, [gdir[0] * dot8(d, gdir), gdir[1] * dot8(d, gdir), gdir[2] * dot8(d, gdir)])
|
|
51478
|
+
);
|
|
51479
|
+
if (ref === null) {
|
|
51480
|
+
ref = tang;
|
|
51481
|
+
return { fi, ang: 0 };
|
|
51482
|
+
}
|
|
51483
|
+
const x = dot8(tang, ref);
|
|
51484
|
+
const y = dot8(cross3(gdir, ref), tang);
|
|
51485
|
+
let ang = Math.atan2(y, x);
|
|
51486
|
+
if (ang < 0) ang += 2 * Math.PI;
|
|
51487
|
+
return { fi, ang };
|
|
51488
|
+
});
|
|
51489
|
+
withAngle.sort((p, q) => p.ang - q.ang);
|
|
51490
|
+
const ring = withAngle.map((w) => w.fi);
|
|
51491
|
+
regions.push(ring);
|
|
51492
|
+
let area2 = 0;
|
|
51493
|
+
for (let k = 0; k < ring.length; k++) {
|
|
51494
|
+
const v1 = vertDir[ring[k]];
|
|
51495
|
+
const v2 = vertDir[ring[(k + 1) % ring.length]];
|
|
51496
|
+
area2 += sphericalTriangleArea(gdir, v1, v2);
|
|
51497
|
+
}
|
|
51498
|
+
areas.push(area2 * radius * radius);
|
|
51499
|
+
}
|
|
51500
|
+
return { vertices, regions, areas };
|
|
51501
|
+
}
|
|
51502
|
+
|
|
50759
51503
|
// src/stats/inference-extra2.ts
|
|
50760
51504
|
var TWO_PI = 2 * Math.PI;
|
|
50761
51505
|
function noncentralChi2CDF(x, df, nc) {
|
|
@@ -51965,9 +52709,9 @@ function katzCentrality(adj, alpha, beta2 = 1) {
|
|
|
51965
52709
|
sum3 += xi;
|
|
51966
52710
|
sumSq += xi * xi;
|
|
51967
52711
|
}
|
|
51968
|
-
const
|
|
51969
|
-
if (
|
|
51970
|
-
return x.map((xi) => xi /
|
|
52712
|
+
const norm5 = Math.sign(sum3) * Math.sqrt(sumSq);
|
|
52713
|
+
if (norm5 === 0) return x;
|
|
52714
|
+
return x.map((xi) => xi / norm5);
|
|
51971
52715
|
}
|
|
51972
52716
|
function isIsomorphic(graphA, graphB) {
|
|
51973
52717
|
const n = graphA.length;
|
|
@@ -52522,6 +53266,7 @@ export {
|
|
|
52522
53266
|
adjacencyMatrix,
|
|
52523
53267
|
airyAi,
|
|
52524
53268
|
airyBi,
|
|
53269
|
+
alphaShape,
|
|
52525
53270
|
and,
|
|
52526
53271
|
andersonDarlingTest,
|
|
52527
53272
|
angle2D,
|
|
@@ -52666,6 +53411,7 @@ export {
|
|
|
52666
53411
|
connectedComponents,
|
|
52667
53412
|
continuedFraction,
|
|
52668
53413
|
convexHull,
|
|
53414
|
+
convexHull2D,
|
|
52669
53415
|
convexHull3D,
|
|
52670
53416
|
convolve,
|
|
52671
53417
|
coordinateTransform,
|
|
@@ -52717,6 +53463,7 @@ export {
|
|
|
52717
53463
|
deconvolve,
|
|
52718
53464
|
deepEqual,
|
|
52719
53465
|
degree,
|
|
53466
|
+
delaunay,
|
|
52720
53467
|
delaunayTriangulation,
|
|
52721
53468
|
derivative,
|
|
52722
53469
|
derivativeAt,
|
|
@@ -53423,6 +54170,7 @@ export {
|
|
|
53423
54170
|
spectralClustering,
|
|
53424
54171
|
spectrogram,
|
|
53425
54172
|
speedOfLight,
|
|
54173
|
+
sphericalVoronoi,
|
|
53426
54174
|
splitUnit,
|
|
53427
54175
|
sqrt,
|
|
53428
54176
|
sqrtm,
|
|
@@ -53526,6 +54274,7 @@ export {
|
|
|
53526
54274
|
variance,
|
|
53527
54275
|
variation,
|
|
53528
54276
|
vonMisesPDF,
|
|
54277
|
+
voronoi,
|
|
53529
54278
|
voronoiDiagram,
|
|
53530
54279
|
wavedec,
|
|
53531
54280
|
waverec,
|