@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/index.js CHANGED
@@ -112,7 +112,7 @@ __export(typed_exports, {
112
112
  cond: () => cond,
113
113
  conj: () => conj,
114
114
  connectedComponents: () => connectedComponents,
115
- convexHull: () => convexHull,
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, norm4) {
2284
+ function varianceFromM2(m2, n, norm5) {
2285
2285
  if (n === 0) return NaN;
2286
- switch (norm4) {
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, norm4) => varianceFromM2(m2OfArray(arr10), arr10.length, norm4),
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, norm4) => {
2308
+ "Float64Array, string": async (a, norm5) => {
2309
2309
  const result = await computePool.variance(a);
2310
- return varianceFromM2(result.result.variance * a.length, a.length, norm4);
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, norm4) => Math.sqrt(varianceFromM2(m2OfArray(arr10), arr10.length, norm4)),
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, norm4) => {
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, norm4)
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 norm4 = numFrames * frameLength * winPower;
3593
- for (let k = 0; k < psdLen; k++) psd[k] /= norm4;
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 dot8 = v1[0] * v2[0] + v1[1] * v2[1];
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, dot8 / (mag1 * mag2))));
8558
+ return Math.acos(Math.max(-1, Math.min(1, dot9 / (mag1 * mag2))));
8559
8559
  }
8560
8560
  function angle3D(v1, v2) {
8561
- const dot8 = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
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, dot8 / (mag1 * mag2))));
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 convexHull(points) {
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 cross3(o, a, b) {
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 && cross3(lower[lower.length - 2], lower[lower.length - 1], p) <= 0) {
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 && cross3(upper[upper.length - 2], upper[upper.length - 1], p) <= 0) {
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 dot8 = v.reduce((s, c, i) => s + c * n[i], 0);
8671
- return v.map((c, i) => c - 2 * dot8 * n[i]);
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 dot8 = v.reduce((s, c, i) => s + c * onto[i], 0);
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 = dot8 / magSq;
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 cross3 = vertices[i][0] * vertices[j][1] - vertices[j][0] * vertices[i][1];
8754
- signedArea += cross3;
8755
- cx += (vertices[i][0] + vertices[j][0]) * cross3;
8756
- cy += (vertices[i][1] + vertices[j][1]) * cross3;
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?.dt ?? (tspan[1] - tspan[0]) / 200;
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 norm4 = 0;
15161
- for (let i = 0; i < n; i++) norm4 += next[i] * next[i];
15162
- norm4 = Math.sqrt(norm4);
15163
- if (norm4 < 1e-15) break;
15164
- for (let i = 0; i < n; i++) next[i] /= norm4;
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 dot8 = 0;
15178
- for (let i = 0; i < n; i++) dot8 += v[i] * ref[i];
15179
- if (dot8 < 0) {
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 norm4 = 0;
15192
- for (let i = 0; i < n; i++) norm4 += mean7[i] * mean7[i];
15193
- norm4 = Math.sqrt(norm4);
15194
- if (norm4 > 1e-15) {
15195
- for (let i = 0; i < n; i++) mean7[i] /= norm4;
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 norm4 = 0;
17107
- for (let i = 0; i < p; i++) norm4 += Av[i] * Av[i];
17108
- norm4 = Math.sqrt(norm4);
17109
- if (norm4 === 0) break;
17110
- const vNew = Av.map((x) => x / norm4);
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 dot8 = 0;
17136
- for (let j = 0; j < p; j++) dot8 += row2[j] * ev[j];
17137
- return dot8;
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 dot8 = 0;
18222
+ let dot9 = 0;
17737
18223
  for (let i = 0; i < len; i++) {
17738
- dot8 += v[i] * H[k + 1 + i][j];
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] * dot8;
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 dot8 = 0;
18231
+ let dot9 = 0;
17746
18232
  for (let j = 0; j < len; j++) {
17747
- dot8 += H[i][k + 1 + j] * v[j];
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 * dot8 * v[j];
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 dot8 = 0;
18240
+ let dot9 = 0;
17755
18241
  for (let j = 0; j < len; j++) {
17756
- dot8 += Q2[i][k + 1 + j] * v[j];
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 * dot8 * v[j];
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 norm4 = 0;
18129
- for (let i = 0; i < n; i++) norm4 += v[i] * v[i];
18130
- norm4 = Math.sqrt(norm4);
18131
- if (norm4 > 1e-15) {
18132
- for (let i = 0; i < n; i++) v[i] /= norm4;
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 norm4 = 0;
18170
- for (let i = 0; i < n; i++) norm4 += x[i] * x[i];
18171
- norm4 = Math.sqrt(norm4);
18172
- if (norm4 > 1e-15) {
18173
- for (let i = 0; i < n; i++) x[i] /= norm4;
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: dot8,
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), dot8(x, 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(dot8(rref[j], rref[j]))));
30279
- const F = rref.filter((_, i) => !_isZero(dot8(rref[i], rref[i])));
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: dot8
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 sub2 of arr10) {
37572
- const n = sub2.length;
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] = sub2[i][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(norm4(b), largeNum)) {
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(norm4(orthogonalComplement(b, [c])), prec)) {
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 = normalize2(c, type);
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 normalize2(v, type);
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(dot8(w, v), dot8(w, w)),
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 norm4(v) {
37649
- return abs2(sqrt2(dot8(v, v)));
38134
+ function norm5(v) {
38135
+ return abs2(sqrt2(dot9(v, v)));
37650
38136
  }
37651
- function normalize2(v, type) {
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, norm4(v)), v);
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: dot8
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: dot8
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: norm4,
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 = norm4(v);
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 cross3 = (fpp - fpm - fmp + fmm) / (4 * h * h);
42967
- if (Math.abs(cross3) < 1e-12) continue;
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(cross3)}*${xi}*${xj}`);
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(sub2, diag2, sup, d) {
46439
+ function thomasSolve(sub3, diag2, sup, d) {
45954
46440
  const n = diag2.length;
45955
46441
  if (n === 0) return [];
45956
- if (sub2.length !== n - 1 || sup.length !== n - 1 || d.length !== n) {
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=${sub2.length}, sup=${sup.length}, d=${d.length}`
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] - sub2[i - 1] * cp[i - 1];
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] - sub2[i - 1] * dp[i - 1]) / m;
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 sub2 = (a, b) => a.map((v, i) => v - b[i]);
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, sub2(c, simplex[n]), alpha);
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, sub2(c, simplex[n]), gamma2);
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, sub2(simplex[n], c), rho);
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], sub2(simplex[i], simplex[0]), sigma);
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 norm4 = 1 / (Math.sqrt(scale4) * Math.pow(Math.PI, 0.25));
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] = norm4 * Math.cos(5 * t) * Math.exp(-(t * t) / 2);
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 norm4 = Math.sign(sum3) * Math.sqrt(sumSq);
51969
- if (norm4 === 0) return x;
51970
- return x.map((xi) => xi / norm4);
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,