@danielsimonjr/mathts-functions 0.48.0 → 0.50.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]);
@@ -15157,11 +15126,11 @@ function _eigenvectorOnce(adj, maxIter, tol, seed) {
15157
15126
  if (adj[j][i] > 0) next[i] += adj[j][i] * x[j];
15158
15127
  }
15159
15128
  }
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;
15129
+ let norm5 = 0;
15130
+ for (let i = 0; i < n; i++) norm5 += next[i] * next[i];
15131
+ norm5 = Math.sqrt(norm5);
15132
+ if (norm5 < 1e-15) break;
15133
+ for (let i = 0; i < n; i++) next[i] /= norm5;
15165
15134
  let delta = 0;
15166
15135
  for (let i = 0; i < n; i++) delta = Math.max(delta, Math.abs(next[i] - x[i]));
15167
15136
  x = next;
@@ -15174,9 +15143,9 @@ function _aggregateEigenvector(vectors, aggregation) {
15174
15143
  const count2 = vectors.length;
15175
15144
  const ref = vectors[0];
15176
15145
  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) {
15146
+ let dot9 = 0;
15147
+ for (let i = 0; i < n; i++) dot9 += v[i] * ref[i];
15148
+ if (dot9 < 0) {
15180
15149
  const flipped = new Float64Array(n);
15181
15150
  for (let i = 0; i < n; i++) flipped[i] = -v[i];
15182
15151
  return flipped;
@@ -15188,11 +15157,11 @@ function _aggregateEigenvector(vectors, aggregation) {
15188
15157
  for (let i = 0; i < n; i++) mean7[i] += v[i];
15189
15158
  }
15190
15159
  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;
15160
+ let norm5 = 0;
15161
+ for (let i = 0; i < n; i++) norm5 += mean7[i] * mean7[i];
15162
+ norm5 = Math.sqrt(norm5);
15163
+ if (norm5 > 1e-15) {
15164
+ for (let i = 0; i < n; i++) mean7[i] /= norm5;
15196
15165
  }
15197
15166
  if (aggregation === "mean") {
15198
15167
  return { centrality: mean7 };
@@ -17103,11 +17072,11 @@ function principalComponentAnalysis(data, k) {
17103
17072
  Av[i] += A[i][j] * v[j];
17104
17073
  }
17105
17074
  }
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);
17075
+ let norm5 = 0;
17076
+ for (let i = 0; i < p; i++) norm5 += Av[i] * Av[i];
17077
+ norm5 = Math.sqrt(norm5);
17078
+ if (norm5 === 0) break;
17079
+ const vNew = Av.map((x) => x / norm5);
17111
17080
  let diff2 = 0;
17112
17081
  for (let i = 0; i < p; i++) diff2 += (vNew[i] - v[i]) ** 2;
17113
17082
  v = vNew;
@@ -17132,9 +17101,9 @@ function principalComponentAnalysis(data, k) {
17132
17101
  const explained = eigenvalues.map((ev) => totalVar > 0 ? Math.abs(ev) / totalVar : 0);
17133
17102
  const scores = centered.map((row2) => {
17134
17103
  return eigenvectors.map((ev) => {
17135
- let dot8 = 0;
17136
- for (let j = 0; j < p; j++) dot8 += row2[j] * ev[j];
17137
- return dot8;
17104
+ let dot9 = 0;
17105
+ for (let j = 0; j < p; j++) dot9 += row2[j] * ev[j];
17106
+ return dot9;
17138
17107
  });
17139
17108
  });
17140
17109
  return { components: eigenvectors, explained, scores };
@@ -17733,30 +17702,30 @@ function hessenbergForm(A) {
17733
17702
  if (normV < 1e-30) continue;
17734
17703
  const beta2 = 2 / normV;
17735
17704
  for (let j = k; j < n; j++) {
17736
- let dot8 = 0;
17705
+ let dot9 = 0;
17737
17706
  for (let i = 0; i < len; i++) {
17738
- dot8 += v[i] * H[k + 1 + i][j];
17707
+ dot9 += v[i] * H[k + 1 + i][j];
17739
17708
  }
17740
17709
  for (let i = 0; i < len; i++) {
17741
- H[k + 1 + i][j] -= beta2 * v[i] * dot8;
17710
+ H[k + 1 + i][j] -= beta2 * v[i] * dot9;
17742
17711
  }
17743
17712
  }
17744
17713
  for (let i = 0; i < n; i++) {
17745
- let dot8 = 0;
17714
+ let dot9 = 0;
17746
17715
  for (let j = 0; j < len; j++) {
17747
- dot8 += H[i][k + 1 + j] * v[j];
17716
+ dot9 += H[i][k + 1 + j] * v[j];
17748
17717
  }
17749
17718
  for (let j = 0; j < len; j++) {
17750
- H[i][k + 1 + j] -= beta2 * dot8 * v[j];
17719
+ H[i][k + 1 + j] -= beta2 * dot9 * v[j];
17751
17720
  }
17752
17721
  }
17753
17722
  for (let i = 0; i < n; i++) {
17754
- let dot8 = 0;
17723
+ let dot9 = 0;
17755
17724
  for (let j = 0; j < len; j++) {
17756
- dot8 += Q2[i][k + 1 + j] * v[j];
17725
+ dot9 += Q2[i][k + 1 + j] * v[j];
17757
17726
  }
17758
17727
  for (let j = 0; j < len; j++) {
17759
- Q2[i][k + 1 + j] -= beta2 * dot8 * v[j];
17728
+ Q2[i][k + 1 + j] -= beta2 * dot9 * v[j];
17760
17729
  }
17761
17730
  }
17762
17731
  }
@@ -18125,11 +18094,11 @@ function findKernelVector(A, n, tol) {
18125
18094
  }
18126
18095
  }
18127
18096
  }
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;
18097
+ let norm5 = 0;
18098
+ for (let i = 0; i < n; i++) norm5 += v[i] * v[i];
18099
+ norm5 = Math.sqrt(norm5);
18100
+ if (norm5 > 1e-15) {
18101
+ for (let i = 0; i < n; i++) v[i] /= norm5;
18133
18102
  }
18134
18103
  return v;
18135
18104
  }
@@ -18166,11 +18135,11 @@ async function solveApprox(A, b, n) {
18166
18135
  }
18167
18136
  }
18168
18137
  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;
18138
+ let norm5 = 0;
18139
+ for (let i = 0; i < n; i++) norm5 += x[i] * x[i];
18140
+ norm5 = Math.sqrt(norm5);
18141
+ if (norm5 > 1e-15) {
18142
+ for (let i = 0; i < n; i++) x[i] /= norm5;
18174
18143
  }
18175
18144
  return x;
18176
18145
  }
@@ -30180,7 +30149,7 @@ var createPinv = /* @__PURE__ */ factory(
30180
30149
  deepEqual: deepEqual3,
30181
30150
  equal: equal2,
30182
30151
  dotDivide: dotDivide2,
30183
- dot: dot8,
30152
+ dot: dot9,
30184
30153
  ctranspose: ctranspose2,
30185
30154
  divideScalar: divideScalar2,
30186
30155
  multiply: multiply2,
@@ -30196,7 +30165,7 @@ var createPinv = /* @__PURE__ */ factory(
30196
30165
  if (size2[0] === 1) {
30197
30166
  return inv3(x);
30198
30167
  } else {
30199
- return dotDivide2(ctranspose2(x), dot8(x, x));
30168
+ return dotDivide2(ctranspose2(x), dot9(x, x));
30200
30169
  }
30201
30170
  case 2: {
30202
30171
  if (_isZeros(x)) return ctranspose2(x);
@@ -30275,8 +30244,8 @@ var createPinv = /* @__PURE__ */ factory(
30275
30244
  }
30276
30245
  function _rankFact(mat, rows, cols) {
30277
30246
  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])));
30247
+ const C = mat.map((row2) => row2.filter((_, j) => j < rows && !_isZero(dot9(rref[j], rref[j]))));
30248
+ const F = rref.filter((_, i) => !_isZero(dot9(rref[i], rref[i])));
30280
30249
  return { C, F };
30281
30250
  }
30282
30251
  function _isZero(x) {
@@ -31747,9 +31716,9 @@ var dependencies187 = ["typed", "factorial"];
31747
31716
  var createPermutations = /* @__PURE__ */ factory(
31748
31717
  name187,
31749
31718
  dependencies187,
31750
- ({ typed: typed3, factorial: factorial5 }) => {
31719
+ ({ typed: typed3, factorial: factorial6 }) => {
31751
31720
  return typed3(name187, {
31752
- "number | BigNumber": factorial5,
31721
+ "number | BigNumber": factorial6,
31753
31722
  "number, number": function(n, k) {
31754
31723
  if (!isInteger(n) || n < 0) {
31755
31724
  throw new TypeError("Positive integer value expected in function permutations");
@@ -35973,7 +35942,7 @@ var dependencies224 = ["typed", "add", "divide", "multiply", "factorial", "isInt
35973
35942
  var createMultinomial = /* @__PURE__ */ factory(
35974
35943
  name224,
35975
35944
  dependencies224,
35976
- ({ typed: typed3, add: add4, divide: divide2, multiply: multiply2, factorial: factorial5, isInteger: isInteger3, isPositive: isPositive2 }) => {
35945
+ ({ typed: typed3, add: add4, divide: divide2, multiply: multiply2, factorial: factorial6, isInteger: isInteger3, isPositive: isPositive2 }) => {
35977
35946
  return typed3(name224, {
35978
35947
  "Array | Matrix": function(a) {
35979
35948
  let sum3 = 0;
@@ -35983,9 +35952,9 @@ var createMultinomial = /* @__PURE__ */ factory(
35983
35952
  throw new TypeError("Positive integer value expected in function multinomial");
35984
35953
  }
35985
35954
  sum3 = add4(sum3, ai);
35986
- denom = multiply2(denom, factorial5(ai));
35955
+ denom = multiply2(denom, factorial6(ai));
35987
35956
  });
35988
- return divide2(factorial5(sum3), denom);
35957
+ return divide2(factorial6(sum3), denom);
35989
35958
  }
35990
35959
  });
35991
35960
  }
@@ -37042,7 +37011,7 @@ var createZeta = /* @__PURE__ */ factory(
37042
37011
  multiply: multiply2,
37043
37012
  pow: pow2,
37044
37013
  divide: divide2,
37045
- factorial: factorial5,
37014
+ factorial: factorial6,
37046
37015
  equal: equal2,
37047
37016
  smallerEq: smallerEq2,
37048
37017
  isBounded: isBounded2,
@@ -37120,8 +37089,8 @@ var createZeta = /* @__PURE__ */ factory(
37120
37089
  let S = k;
37121
37090
  for (let j = k; smallerEq2(j, n); j = add4(j, 1)) {
37122
37091
  const factor2 = divide2(
37123
- multiply2(factorial5(add4(n, subtract3(j, 1))), pow2(4, j)),
37124
- multiply2(factorial5(subtract3(n, j)), factorial5(multiply2(2, j)))
37092
+ multiply2(factorial6(add4(n, subtract3(j, 1))), pow2(4, j)),
37093
+ multiply2(factorial6(subtract3(n, j)), factorial6(multiply2(2, j)))
37125
37094
  );
37126
37095
  S = add4(S, factor2);
37127
37096
  }
@@ -37197,7 +37166,7 @@ function createComplexEigs({
37197
37166
  larger: larger2,
37198
37167
  smaller: smaller2,
37199
37168
  matrixFromColumns: _matrixFromColumns,
37200
- dot: dot8
37169
+ dot: dot9
37201
37170
  }) {
37202
37171
  function complexEigs(arr10, N, prec, type, findVectors = true) {
37203
37172
  if (!findVectors && type === "number" && N * N >= WASM_EIGS_THRESHOLD) {
@@ -37568,11 +37537,11 @@ function createComplexEigs({
37568
37537
  M[i] = Array(N).fill(0);
37569
37538
  }
37570
37539
  let I2 = 0;
37571
- for (const sub2 of arr10) {
37572
- const n = sub2.length;
37540
+ for (const sub3 of arr10) {
37541
+ const n = sub3.length;
37573
37542
  for (let i = 0; i < n; i++) {
37574
37543
  for (let j = 0; j < n; j++) {
37575
- M[I2 + i][I2 + j] = sub2[i][j];
37544
+ M[I2 + i][I2 + j] = sub3[i][j];
37576
37545
  }
37577
37546
  }
37578
37547
  I2 += n;
@@ -37598,7 +37567,7 @@ function createComplexEigs({
37598
37567
  } catch {
37599
37568
  continue;
37600
37569
  }
37601
- if (larger2(norm4(b), largeNum)) {
37570
+ if (larger2(norm5(b), largeNum)) {
37602
37571
  break;
37603
37572
  }
37604
37573
  }
@@ -37608,13 +37577,13 @@ function createComplexEigs({
37608
37577
  i = 0;
37609
37578
  while (true) {
37610
37579
  const c = usolve2(A, b);
37611
- if (smaller2(norm4(orthogonalComplement(b, [c])), prec)) {
37580
+ if (smaller2(norm5(orthogonalComplement(b, [c])), prec)) {
37612
37581
  break;
37613
37582
  }
37614
37583
  if (++i >= 10) {
37615
37584
  return null;
37616
37585
  }
37617
- b = normalize2(c, type);
37586
+ b = normalize3(c, type);
37618
37587
  }
37619
37588
  return b;
37620
37589
  }
@@ -37629,7 +37598,7 @@ function createComplexEigs({
37629
37598
  v = v.map((n) => complex3(n));
37630
37599
  }
37631
37600
  v = orthogonalComplement(v, orthog);
37632
- return normalize2(v, type);
37601
+ return normalize3(v, type);
37633
37602
  }
37634
37603
  function orthogonalComplement(v, orthog) {
37635
37604
  const vectorShape = size2(v);
@@ -37638,21 +37607,21 @@ function createComplexEigs({
37638
37607
  v = subtract3(
37639
37608
  v,
37640
37609
  multiply2(
37641
- divideScalar2(dot8(w, v), dot8(w, w)),
37610
+ divideScalar2(dot9(w, v), dot9(w, w)),
37642
37611
  w
37643
37612
  )
37644
37613
  );
37645
37614
  }
37646
37615
  return v;
37647
37616
  }
37648
- function norm4(v) {
37649
- return abs2(sqrt2(dot8(v, v)));
37617
+ function norm5(v) {
37618
+ return abs2(sqrt2(dot9(v, v)));
37650
37619
  }
37651
- function normalize2(v, type) {
37620
+ function normalize3(v, type) {
37652
37621
  const big = type === "BigNumber";
37653
37622
  const cplx = type === "Complex";
37654
37623
  const one = big ? bignumber2(1) : cplx ? complex3(1) : 1;
37655
- return multiply2(divideScalar2(one, norm4(v)), v);
37624
+ return multiply2(divideScalar2(one, norm5(v)), v);
37656
37625
  }
37657
37626
  return complexEigs;
37658
37627
  }
@@ -38066,7 +38035,7 @@ var createEigs = /* @__PURE__ */ factory(
38066
38035
  re: re3,
38067
38036
  smaller: smaller2,
38068
38037
  matrixFromColumns: matrixFromColumns2,
38069
- dot: dot8
38038
+ dot: dot9
38070
38039
  }) => {
38071
38040
  const doRealSymmetric = createRealSymmetric({
38072
38041
  config: config2,
@@ -38105,7 +38074,7 @@ var createEigs = /* @__PURE__ */ factory(
38105
38074
  larger: larger2,
38106
38075
  smaller: smaller2,
38107
38076
  matrixFromColumns: matrixFromColumns2,
38108
- dot: dot8
38077
+ dot: dot9
38109
38078
  });
38110
38079
  return typed3("eigs", {
38111
38080
  // The conversion to matrix in the first two implementations,
@@ -40852,7 +40821,7 @@ var createRotationMatrix = /* @__PURE__ */ factory(
40852
40821
  multiplyScalar: multiplyScalar2,
40853
40822
  addScalar: addScalar2,
40854
40823
  unaryMinus: unaryMinus2,
40855
- norm: norm4,
40824
+ norm: norm5,
40856
40825
  BigNumber: BigNumber9,
40857
40826
  matrix: matrix2,
40858
40827
  DenseMatrix: DenseMatrix7,
@@ -40926,7 +40895,7 @@ var createRotationMatrix = /* @__PURE__ */ factory(
40926
40895
  return data;
40927
40896
  }
40928
40897
  function _rotationMatrix3x3(theta, v, format4) {
40929
- const normV = norm4(v);
40898
+ const normV = norm5(v);
40930
40899
  if (normV === 0) {
40931
40900
  throw new RangeError("Rotation around zero vector");
40932
40901
  }
@@ -42963,11 +42932,11 @@ function multivariateTaylor(expr, vars, x0, n = 1) {
42963
42932
  const fmp = evalWith(expr, s);
42964
42933
  s[vars[j]] = x0[j] - h;
42965
42934
  const fmm = evalWith(expr, s);
42966
- const cross3 = (fpp - fpm - fmp + fmm) / (4 * h * h);
42967
- if (Math.abs(cross3) < 1e-12) continue;
42935
+ const cross4 = (fpp - fpm - fmp + fmm) / (4 * h * h);
42936
+ if (Math.abs(cross4) < 1e-12) continue;
42968
42937
  const xi = x0[i] === 0 ? vars[i] : `(${vars[i]} - ${formatCoeff(x0[i])})`;
42969
42938
  const xj = x0[j] === 0 ? vars[j] : `(${vars[j]} - ${formatCoeff(x0[j])})`;
42970
- terms.push(`${formatCoeff(cross3)}*${xi}*${xj}`);
42939
+ terms.push(`${formatCoeff(cross4)}*${xi}*${xj}`);
42971
42940
  }
42972
42941
  }
42973
42942
  }
@@ -45950,12 +45919,12 @@ function svds(A, k = 1, opts) {
45950
45919
  }
45951
45920
 
45952
45921
  // src/numeric/structured-solvers.ts
45953
- function thomasSolve(sub2, diag2, sup, d) {
45922
+ function thomasSolve(sub3, diag2, sup, d) {
45954
45923
  const n = diag2.length;
45955
45924
  if (n === 0) return [];
45956
- if (sub2.length !== n - 1 || sup.length !== n - 1 || d.length !== n) {
45925
+ if (sub3.length !== n - 1 || sup.length !== n - 1 || d.length !== n) {
45957
45926
  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}`
45927
+ `thomasSolve: expected sub/sup of length ${n - 1} and d of length ${n}, got sub=${sub3.length}, sup=${sup.length}, d=${d.length}`
45959
45928
  );
45960
45929
  }
45961
45930
  const cp = new Array(n).fill(0);
@@ -45964,12 +45933,12 @@ function thomasSolve(sub2, diag2, sup, d) {
45964
45933
  cp[0] = n > 1 ? sup[0] / diag2[0] : 0;
45965
45934
  dp[0] = d[0] / diag2[0];
45966
45935
  for (let i = 1; i < n; i++) {
45967
- const m = diag2[i] - sub2[i - 1] * cp[i - 1];
45936
+ const m = diag2[i] - sub3[i - 1] * cp[i - 1];
45968
45937
  if (m === 0) {
45969
45938
  throw new Error(`thomasSolve: zero pivot at row ${i} (no pivoting is performed)`);
45970
45939
  }
45971
45940
  cp[i] = i < n - 1 ? sup[i] / m : 0;
45972
- dp[i] = (d[i] - sub2[i - 1] * dp[i - 1]) / m;
45941
+ dp[i] = (d[i] - sub3[i - 1] * dp[i - 1]) / m;
45973
45942
  }
45974
45943
  const x = new Array(n);
45975
45944
  x[n - 1] = dp[n - 1];
@@ -47554,17 +47523,17 @@ function nelderMead(f, x0, opts = {}) {
47554
47523
  return c;
47555
47524
  };
47556
47525
  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]);
47526
+ const sub3 = (a, b) => a.map((v, i) => v - b[i]);
47558
47527
  for (; iter < maxIter; iter++) {
47559
47528
  const order = fv.map((_, i) => i).sort((i, j) => fv[i] - fv[j]);
47560
47529
  simplex = order.map((i) => simplex[i]);
47561
47530
  fv = order.map((i) => fv[i]);
47562
47531
  if (Math.abs(fv[n] - fv[0]) <= tol * (Math.abs(fv[0]) + tol)) break;
47563
47532
  const c = centroid2(simplex.slice(0, n));
47564
- const xr = add4(c, sub2(c, simplex[n]), alpha);
47533
+ const xr = add4(c, sub3(c, simplex[n]), alpha);
47565
47534
  const fr = f(xr);
47566
47535
  if (fr < fv[0]) {
47567
- const xe = add4(c, sub2(c, simplex[n]), gamma2);
47536
+ const xe = add4(c, sub3(c, simplex[n]), gamma2);
47568
47537
  const fe = f(xe);
47569
47538
  if (fe < fr) {
47570
47539
  simplex[n] = xe;
@@ -47577,14 +47546,14 @@ function nelderMead(f, x0, opts = {}) {
47577
47546
  simplex[n] = xr;
47578
47547
  fv[n] = fr;
47579
47548
  } else {
47580
- const xc = add4(c, sub2(simplex[n], c), rho);
47549
+ const xc = add4(c, sub3(simplex[n], c), rho);
47581
47550
  const fc = f(xc);
47582
47551
  if (fc < fv[n]) {
47583
47552
  simplex[n] = xc;
47584
47553
  fv[n] = fc;
47585
47554
  } else {
47586
47555
  for (let i = 1; i <= n; i++) {
47587
- simplex[i] = add4(simplex[0], sub2(simplex[i], simplex[0]), sigma);
47556
+ simplex[i] = add4(simplex[0], sub3(simplex[i], simplex[0]), sigma);
47588
47557
  fv[i] = f(simplex[i]);
47589
47558
  }
47590
47559
  }
@@ -50204,12 +50173,12 @@ function rickerWavelet(points, scale4) {
50204
50173
  return out;
50205
50174
  }
50206
50175
  function morletWavelet(points, scale4) {
50207
- const norm4 = 1 / (Math.sqrt(scale4) * Math.pow(Math.PI, 0.25));
50176
+ const norm5 = 1 / (Math.sqrt(scale4) * Math.pow(Math.PI, 0.25));
50208
50177
  const out = new Array(points);
50209
50178
  const center3 = (points - 1) / 2;
50210
50179
  for (let i = 0; i < points; i++) {
50211
50180
  const t = (i - center3) / scale4;
50212
- out[i] = norm4 * Math.cos(5 * t) * Math.exp(-(t * t) / 2);
50181
+ out[i] = norm5 * Math.cos(5 * t) * Math.exp(-(t * t) / 2);
50213
50182
  }
50214
50183
  return out;
50215
50184
  }
@@ -50756,6 +50725,264 @@ function segmentSegmentClosest(p1, p2, q1, q2) {
50756
50725
  return { point1, point2, distance: distance2 };
50757
50726
  }
50758
50727
 
50728
+ // src/geometry/hull.ts
50729
+ function hull2DIndices(points) {
50730
+ const n = points.length;
50731
+ const order = Array.from({ length: n }, (_, i) => i).sort(
50732
+ (a, b) => points[a][0] - points[b][0] || points[a][1] - points[b][1]
50733
+ );
50734
+ 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]);
50735
+ const lower = [];
50736
+ for (const i of order) {
50737
+ while (lower.length >= 2 && cross4(lower[lower.length - 2], lower[lower.length - 1], i) <= 0) {
50738
+ lower.pop();
50739
+ }
50740
+ lower.push(i);
50741
+ }
50742
+ const upper = [];
50743
+ for (let k = order.length - 1; k >= 0; k--) {
50744
+ const i = order[k];
50745
+ while (upper.length >= 2 && cross4(upper[upper.length - 2], upper[upper.length - 1], i) <= 0) {
50746
+ upper.pop();
50747
+ }
50748
+ upper.push(i);
50749
+ }
50750
+ lower.pop();
50751
+ upper.pop();
50752
+ return lower.concat(upper);
50753
+ }
50754
+ function convexHull2D2(points) {
50755
+ const vertices = hull2DIndices(points);
50756
+ const m = vertices.length;
50757
+ const simplices = [];
50758
+ let signedArea = 0;
50759
+ let perimeter = 0;
50760
+ for (let k = 0; k < m; k++) {
50761
+ const i = vertices[k];
50762
+ const j = vertices[(k + 1) % m];
50763
+ simplices.push([i, j]);
50764
+ const a = points[i];
50765
+ const b = points[j];
50766
+ signedArea += a[0] * b[1] - b[0] * a[1];
50767
+ perimeter += Math.hypot(b[0] - a[0], b[1] - a[1]);
50768
+ }
50769
+ return { vertices, simplices, area: perimeter, volume: Math.abs(signedArea) / 2 };
50770
+ }
50771
+ function convexHull3DResult(points) {
50772
+ const faces = convexHull3D(points);
50773
+ const vertexSet = /* @__PURE__ */ new Set();
50774
+ let volume6 = 0;
50775
+ let surface = 0;
50776
+ for (const [ia, ib, ic] of faces) {
50777
+ vertexSet.add(ia);
50778
+ vertexSet.add(ib);
50779
+ vertexSet.add(ic);
50780
+ const a = points[ia];
50781
+ const b = points[ib];
50782
+ const c = points[ic];
50783
+ 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]);
50784
+ const ux = b[0] - a[0];
50785
+ const uy = b[1] - a[1];
50786
+ const uz = b[2] - a[2];
50787
+ const vx = c[0] - a[0];
50788
+ const vy = c[1] - a[1];
50789
+ const vz = c[2] - a[2];
50790
+ const cx = uy * vz - uz * vy;
50791
+ const cy = uz * vx - ux * vz;
50792
+ const cz = ux * vy - uy * vx;
50793
+ surface += Math.hypot(cx, cy, cz) / 2;
50794
+ }
50795
+ return {
50796
+ vertices: Array.from(vertexSet).sort((a, b) => a - b),
50797
+ simplices: faces.map((f) => [...f]),
50798
+ area: surface,
50799
+ volume: Math.abs(volume6) / 6
50800
+ };
50801
+ }
50802
+ function convexHull(points) {
50803
+ if (!Array.isArray(points) || points.length === 0) {
50804
+ throw new Error("convexHull: requires a non-empty array of points");
50805
+ }
50806
+ const dim = points[0].length;
50807
+ if (dim === 2) {
50808
+ if (points.length < 3) throw new Error("convexHull: 2-D hull requires at least 3 points");
50809
+ return convexHull2D2(points);
50810
+ }
50811
+ if (dim === 3) {
50812
+ if (points.length < 4) throw new Error("convexHull: 3-D hull requires at least 4 points");
50813
+ return convexHull3DResult(points);
50814
+ }
50815
+ throw new Error(`convexHull: only 2-D and 3-D point sets are supported (got dimension ${dim})`);
50816
+ }
50817
+
50818
+ // src/geometry/delaunay.ts
50819
+ function delaunay(points) {
50820
+ if (!Array.isArray(points) || points.length < 3) {
50821
+ throw new Error("delaunay: requires at least 3 points");
50822
+ }
50823
+ if (points[0].length !== 2) {
50824
+ throw new Error("delaunay: only 2-D point sets are supported");
50825
+ }
50826
+ return { simplices: delaunayTriangulation(points).map((t) => [...t]) };
50827
+ }
50828
+
50829
+ // src/geometry/voronoi.ts
50830
+ function circumcenter(a, b, c) {
50831
+ const d = 2 * (a[0] * (b[1] - c[1]) + b[0] * (c[1] - a[1]) + c[0] * (a[1] - b[1]));
50832
+ if (Math.abs(d) < 1e-15) return null;
50833
+ const a2 = a[0] * a[0] + a[1] * a[1];
50834
+ const b2 = b[0] * b[0] + b[1] * b[1];
50835
+ const c2 = c[0] * c[0] + c[1] * c[1];
50836
+ const ux = (a2 * (b[1] - c[1]) + b2 * (c[1] - a[1]) + c2 * (a[1] - b[1])) / d;
50837
+ const uy = (a2 * (c[0] - b[0]) + b2 * (a[0] - c[0]) + c2 * (b[0] - a[0])) / d;
50838
+ return [ux, uy];
50839
+ }
50840
+ function voronoi(points) {
50841
+ const { simplices: tris } = delaunay(points);
50842
+ const vertices = [];
50843
+ const simplices = [];
50844
+ const regions = Array.from({ length: points.length }, () => []);
50845
+ for (const t of tris) {
50846
+ const cc = circumcenter(points[t[0]], points[t[1]], points[t[2]]);
50847
+ if (cc === null) continue;
50848
+ const vIdx = vertices.length;
50849
+ vertices.push(cc);
50850
+ simplices.push([...t]);
50851
+ for (const p of t) regions[p].push(vIdx);
50852
+ }
50853
+ return { vertices, simplices, regions };
50854
+ }
50855
+
50856
+ // src/geometry/alpha-shape.ts
50857
+ function circumradius(a, b, c) {
50858
+ const d = 2 * (a[0] * (b[1] - c[1]) + b[0] * (c[1] - a[1]) + c[0] * (a[1] - b[1]));
50859
+ if (Math.abs(d) < 1e-15) return Infinity;
50860
+ const a2 = a[0] * a[0] + a[1] * a[1];
50861
+ const b2 = b[0] * b[0] + b[1] * b[1];
50862
+ const c2 = c[0] * c[0] + c[1] * c[1];
50863
+ const ux = (a2 * (b[1] - c[1]) + b2 * (c[1] - a[1]) + c2 * (a[1] - b[1])) / d;
50864
+ const uy = (a2 * (c[0] - b[0]) + b2 * (a[0] - c[0]) + c2 * (b[0] - a[0])) / d;
50865
+ return Math.hypot(a[0] - ux, a[1] - uy);
50866
+ }
50867
+ function alphaShape(points, alpha) {
50868
+ if (!(alpha > 0)) throw new Error("alphaShape: alpha must be positive");
50869
+ const { simplices: tris } = delaunay(points);
50870
+ const threshold = 1 / alpha;
50871
+ const triangles = [];
50872
+ const edgeCount = /* @__PURE__ */ new Map();
50873
+ for (const t of tris) {
50874
+ if (circumradius(points[t[0]], points[t[1]], points[t[2]]) > threshold) continue;
50875
+ triangles.push([...t]);
50876
+ const es = [
50877
+ [t[0], t[1]],
50878
+ [t[1], t[2]],
50879
+ [t[2], t[0]]
50880
+ ];
50881
+ for (const [u, v] of es) {
50882
+ const key = `${Math.min(u, v)},${Math.max(u, v)}`;
50883
+ edgeCount.set(key, (edgeCount.get(key) ?? 0) + 1);
50884
+ }
50885
+ }
50886
+ const edges = [];
50887
+ for (const [key, count2] of edgeCount) {
50888
+ if (count2 === 1) {
50889
+ const [lo, hi] = key.split(",").map(Number);
50890
+ edges.push([lo, hi]);
50891
+ }
50892
+ }
50893
+ return { triangles, edges };
50894
+ }
50895
+
50896
+ // src/geometry/spherical-voronoi.ts
50897
+ function sub2(a, b) {
50898
+ return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
50899
+ }
50900
+ function cross3(a, b) {
50901
+ 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]];
50902
+ }
50903
+ function dot8(a, b) {
50904
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
50905
+ }
50906
+ function norm4(a) {
50907
+ return Math.hypot(a[0], a[1], a[2]);
50908
+ }
50909
+ function normalize2(a) {
50910
+ const n = norm4(a) || 1;
50911
+ return [a[0] / n, a[1] / n, a[2] / n];
50912
+ }
50913
+ function geodesicAngle(u, v) {
50914
+ return Math.atan2(norm4(cross3(u, v)), dot8(u, v));
50915
+ }
50916
+ function sphericalTriangleArea(a, b, c) {
50917
+ const A = geodesicAngle(b, c);
50918
+ const B = geodesicAngle(a, c);
50919
+ const C = geodesicAngle(a, b);
50920
+ const s = (A + B + C) / 2;
50921
+ const t = Math.tan(s / 2) * Math.tan((s - A) / 2) * Math.tan((s - B) / 2) * Math.tan((s - C) / 2);
50922
+ return 4 * Math.atan(Math.sqrt(Math.max(0, t)));
50923
+ }
50924
+ function sphericalVoronoi(points, radius = 1, center3 = [0, 0, 0]) {
50925
+ if (!Array.isArray(points) || points.length < 4) {
50926
+ throw new Error("sphericalVoronoi: requires at least 4 points");
50927
+ }
50928
+ if (points[0].length !== 3) {
50929
+ throw new Error("sphericalVoronoi: only 3-D point sets are supported");
50930
+ }
50931
+ const gen = points.map((p) => normalize2(sub2(p, center3)));
50932
+ const faces = convexHull3D(points);
50933
+ const vertices = [];
50934
+ const vertDir = [];
50935
+ const incident = Array.from({ length: points.length }, () => []);
50936
+ faces.forEach((f, fi) => {
50937
+ const a = gen[f[0]];
50938
+ const b = gen[f[1]];
50939
+ const c = gen[f[2]];
50940
+ let nrm = cross3(sub2(b, a), sub2(c, a));
50941
+ if (dot8(nrm, a) < 0) nrm = [-nrm[0], -nrm[1], -nrm[2]];
50942
+ const dir = normalize2(nrm);
50943
+ vertDir.push(dir);
50944
+ vertices.push([
50945
+ center3[0] + radius * dir[0],
50946
+ center3[1] + radius * dir[1],
50947
+ center3[2] + radius * dir[2]
50948
+ ]);
50949
+ for (const p of f) incident[p].push(fi);
50950
+ });
50951
+ const regions = [];
50952
+ const areas = [];
50953
+ for (let g = 0; g < points.length; g++) {
50954
+ const gdir = gen[g];
50955
+ const facs = incident[g];
50956
+ let ref = null;
50957
+ const withAngle = facs.map((fi) => {
50958
+ const d = vertDir[fi];
50959
+ const tang = normalize2(
50960
+ sub2(d, [gdir[0] * dot8(d, gdir), gdir[1] * dot8(d, gdir), gdir[2] * dot8(d, gdir)])
50961
+ );
50962
+ if (ref === null) {
50963
+ ref = tang;
50964
+ return { fi, ang: 0 };
50965
+ }
50966
+ const x = dot8(tang, ref);
50967
+ const y = dot8(cross3(gdir, ref), tang);
50968
+ let ang = Math.atan2(y, x);
50969
+ if (ang < 0) ang += 2 * Math.PI;
50970
+ return { fi, ang };
50971
+ });
50972
+ withAngle.sort((p, q) => p.ang - q.ang);
50973
+ const ring = withAngle.map((w) => w.fi);
50974
+ regions.push(ring);
50975
+ let area2 = 0;
50976
+ for (let k = 0; k < ring.length; k++) {
50977
+ const v1 = vertDir[ring[k]];
50978
+ const v2 = vertDir[ring[(k + 1) % ring.length]];
50979
+ area2 += sphericalTriangleArea(gdir, v1, v2);
50980
+ }
50981
+ areas.push(area2 * radius * radius);
50982
+ }
50983
+ return { vertices, regions, areas };
50984
+ }
50985
+
50759
50986
  // src/stats/inference-extra2.ts
50760
50987
  var TWO_PI = 2 * Math.PI;
50761
50988
  function noncentralChi2CDF(x, df, nc) {
@@ -51137,6 +51364,161 @@ function barnesG(z) {
51137
51364
  return Math.exp(lnG);
51138
51365
  }
51139
51366
 
51367
+ // src/special/wave-functions.ts
51368
+ var RELTOL3 = 1e-16;
51369
+ function cMul3(a, b) {
51370
+ return { re: a.re * b.re - a.im * b.im, im: a.re * b.im + a.im * b.re };
51371
+ }
51372
+ function cInv(a) {
51373
+ const d = a.re * a.re + a.im * a.im;
51374
+ return { re: a.re / d, im: -a.im / d };
51375
+ }
51376
+ function cLog(a) {
51377
+ return { re: 0.5 * Math.log(a.re * a.re + a.im * a.im), im: Math.atan2(a.im, a.re) };
51378
+ }
51379
+ function cSin(a) {
51380
+ return { re: Math.sin(a.re) * Math.cosh(a.im), im: Math.cos(a.re) * Math.sinh(a.im) };
51381
+ }
51382
+ var LANCZOS_G = 7;
51383
+ var LANCZOS_C = [
51384
+ 0.9999999999998099,
51385
+ 676.5203681218851,
51386
+ -1259.1392167224028,
51387
+ 771.3234287776531,
51388
+ -176.6150291621406,
51389
+ 12.507343278686905,
51390
+ -0.13857109526572012,
51391
+ 9984369578019572e-21,
51392
+ 15056327351493116e-23
51393
+ ];
51394
+ function lnGammaComplex(z) {
51395
+ if (z.re < 0.5) {
51396
+ const sinPiZ = cSin({ re: Math.PI * z.re, im: Math.PI * z.im });
51397
+ const lnSin = cLog(sinPiZ);
51398
+ const rest = lnGammaComplex({ re: 1 - z.re, im: -z.im });
51399
+ return { re: Math.log(Math.PI) - lnSin.re - rest.re, im: -lnSin.im - rest.im };
51400
+ }
51401
+ const x = { re: z.re - 1, im: z.im };
51402
+ let sum3 = { re: LANCZOS_C[0], im: 0 };
51403
+ for (let i = 1; i < LANCZOS_G + 2; i++) {
51404
+ const dr = x.re + i;
51405
+ const di = x.im;
51406
+ const denom = dr * dr + di * di;
51407
+ sum3 = { re: sum3.re + LANCZOS_C[i] * dr / denom, im: sum3.im - LANCZOS_C[i] * di / denom };
51408
+ }
51409
+ const t = { re: x.re + LANCZOS_G + 0.5, im: x.im };
51410
+ const lnT = cLog(t);
51411
+ const lnSum = cLog(sum3);
51412
+ const half = { re: x.re + 0.5, im: x.im };
51413
+ const p = cMul3(half, lnT);
51414
+ return {
51415
+ re: 0.5 * Math.log(2 * Math.PI) + p.re - t.re + lnSum.re,
51416
+ im: p.im - t.im + lnSum.im
51417
+ };
51418
+ }
51419
+ function factorial5(n) {
51420
+ let r = 1;
51421
+ for (let i = 2; i <= n; i++) r *= i;
51422
+ return r;
51423
+ }
51424
+ function riemannSiegelTheta(t) {
51425
+ const lg = lnGammaComplex({ re: 0.25, im: t / 2 });
51426
+ return lg.im - t / 2 * Math.log(Math.PI);
51427
+ }
51428
+ function borweinD(k, n) {
51429
+ let S = k;
51430
+ for (let j = k; j <= n; j++) {
51431
+ S += factorial5(n + j - 1) * Math.pow(4, j) / (factorial5(n - j) * factorial5(2 * j));
51432
+ }
51433
+ return n * S;
51434
+ }
51435
+ function zetaCriticalLine(t) {
51436
+ const n = Math.round(1.3 * 20 + 0.9 * Math.abs(t));
51437
+ const ln2 = Math.LN2;
51438
+ const mag = Math.SQRT2;
51439
+ const den = { re: 1 - mag * Math.cos(t * ln2), im: mag * Math.sin(t * ln2) };
51440
+ const d0 = borweinD(0, n);
51441
+ const c = cInv(cMul3({ re: d0, im: 0 }, den));
51442
+ let Sr = 0;
51443
+ let Si = 0;
51444
+ for (let k = 1; k <= n; k++) {
51445
+ const sign3 = (k - 1) % 2 === 0 ? 1 : -1;
51446
+ const dk = borweinD(k, n);
51447
+ const lnk = Math.log(k);
51448
+ const kpow = 1 / Math.sqrt(k);
51449
+ Sr += sign3 * dk * kpow * Math.cos(t * lnk);
51450
+ Si += sign3 * dk * kpow * -Math.sin(t * lnk);
51451
+ }
51452
+ return cMul3(c, { re: Sr, im: Si });
51453
+ }
51454
+ function siegelZ(t) {
51455
+ const at = Math.abs(t);
51456
+ const z = zetaCriticalLine(at);
51457
+ const th = riemannSiegelTheta(at);
51458
+ return Math.cos(th) * z.re - Math.sin(th) * z.im;
51459
+ }
51460
+ function riemannSiegelZ(t) {
51461
+ return siegelZ(t);
51462
+ }
51463
+ var LERCH_MAX_TERMS = 2e5;
51464
+ function lerchPhi(z, s, a) {
51465
+ if (Math.abs(z) >= 1) {
51466
+ throw new Error("lerchPhi: only |z| < 1 is supported (analytic continuation not implemented)");
51467
+ }
51468
+ if (a <= 0) {
51469
+ throw new Error("lerchPhi: a must be > 0");
51470
+ }
51471
+ let sum3 = 0;
51472
+ let zk = 1;
51473
+ for (let k = 0; k < LERCH_MAX_TERMS; k++) {
51474
+ const term = zk / Math.pow(a + k, s);
51475
+ sum3 += term;
51476
+ if (k > 1 && Math.abs(term) < Math.abs(sum3) * RELTOL3) break;
51477
+ zk *= z;
51478
+ }
51479
+ return sum3;
51480
+ }
51481
+ function recipGamma(y) {
51482
+ if (y > 0) return Math.exp(-_lgamma(y));
51483
+ if (y === Math.floor(y)) return 0;
51484
+ return Math.sin(Math.PI * y) * Math.exp(_lgamma(1 - y)) / Math.PI;
51485
+ }
51486
+ function parabolicCylinderD(nu, x) {
51487
+ const z = x * x / 2;
51488
+ const even = recipGamma((1 - nu) / 2) * hyp1f1(-nu / 2, 0.5, z);
51489
+ const odd = recipGamma(-nu / 2) * hyp1f1((1 - nu) / 2, 1.5, z);
51490
+ return Math.pow(2, nu / 2) * Math.exp(-(x * x) / 4) * (Math.sqrt(Math.PI) * even - Math.sqrt(2 * Math.PI) * x * odd);
51491
+ }
51492
+ var COULOMB_MAX_TERMS = 5e3;
51493
+ function coulombC(L, eta) {
51494
+ const lg = lnGammaComplex({ re: L + 1, im: eta });
51495
+ const absGamma = Math.exp(lg.re);
51496
+ return Math.pow(2, L) * Math.exp(-Math.PI * eta / 2) * absGamma / Math.exp(_lgamma(2 * L + 2));
51497
+ }
51498
+ function coulombF(L, eta, rho) {
51499
+ if (rho < 0) {
51500
+ throw new Error("coulombF: rho must be >= 0");
51501
+ }
51502
+ if (L < 0) {
51503
+ throw new Error("coulombF: L must be >= 0");
51504
+ }
51505
+ if (rho === 0) return 0;
51506
+ let aPrev2 = 0;
51507
+ let aPrev1 = 1;
51508
+ let sum3 = 1;
51509
+ let rhoK = 1;
51510
+ for (let k = 1; k < COULOMB_MAX_TERMS; k++) {
51511
+ const ak = (2 * eta * aPrev1 - aPrev2) / (k * (k + 2 * L + 1));
51512
+ rhoK *= rho;
51513
+ const term = ak * rhoK;
51514
+ sum3 += term;
51515
+ aPrev2 = aPrev1;
51516
+ aPrev1 = ak;
51517
+ if (k > 2 && term !== 0 && Math.abs(term) < Math.abs(sum3) * RELTOL3) break;
51518
+ }
51519
+ return coulombC(L, eta) * Math.pow(rho, L + 1) * sum3;
51520
+ }
51521
+
51140
51522
  // src/graph/traversal-centrality.ts
51141
51523
  function bfs(adj, start) {
51142
51524
  const n = adj.length;
@@ -51810,9 +52192,9 @@ function katzCentrality(adj, alpha, beta2 = 1) {
51810
52192
  sum3 += xi;
51811
52193
  sumSq += xi * xi;
51812
52194
  }
51813
- const norm4 = Math.sign(sum3) * Math.sqrt(sumSq);
51814
- if (norm4 === 0) return x;
51815
- return x.map((xi) => xi / norm4);
52195
+ const norm5 = Math.sign(sum3) * Math.sqrt(sumSq);
52196
+ if (norm5 === 0) return x;
52197
+ return x.map((xi) => xi / norm5);
51816
52198
  }
51817
52199
  function isIsomorphic(graphA, graphB) {
51818
52200
  const n = graphA.length;
@@ -52367,6 +52749,7 @@ export {
52367
52749
  adjacencyMatrix,
52368
52750
  airyAi,
52369
52751
  airyBi,
52752
+ alphaShape,
52370
52753
  and,
52371
52754
  andersonDarlingTest,
52372
52755
  angle2D,
@@ -52511,6 +52894,7 @@ export {
52511
52894
  connectedComponents,
52512
52895
  continuedFraction,
52513
52896
  convexHull,
52897
+ convexHull2D,
52514
52898
  convexHull3D,
52515
52899
  convolve,
52516
52900
  coordinateTransform,
@@ -52525,6 +52909,7 @@ export {
52525
52909
  coth,
52526
52910
  coulomb,
52527
52911
  coulombConstant,
52912
+ coulombF,
52528
52913
  count,
52529
52914
  cov,
52530
52915
  createUnit,
@@ -52561,6 +52946,7 @@ export {
52561
52946
  deconvolve,
52562
52947
  deepEqual,
52563
52948
  degree,
52949
+ delaunay,
52564
52950
  delaunayTriangulation,
52565
52951
  derivative,
52566
52952
  derivativeAt,
@@ -52914,6 +53300,7 @@ export {
52914
53300
  leftShift,
52915
53301
  legendreFit,
52916
53302
  legendreP,
53303
+ lerchPhi,
52917
53304
  levenbergMarquardt,
52918
53305
  leveneTest,
52919
53306
  lfilter,
@@ -53056,6 +53443,7 @@ export {
53056
53443
  pacf,
53057
53444
  padeApproximant,
53058
53445
  pageRank,
53446
+ parabolicCylinderD,
53059
53447
  parallelAutoCorr,
53060
53448
  parallelConv,
53061
53449
  parallelFFT,
@@ -53186,6 +53574,7 @@ export {
53186
53574
  rfft,
53187
53575
  rfftfreq,
53188
53576
  ridge,
53577
+ riemannSiegelZ,
53189
53578
  rightArithShift,
53190
53579
  rightLogShift,
53191
53580
  risingFactorial,
@@ -53228,6 +53617,7 @@ export {
53228
53617
  shapiroWilkTest,
53229
53618
  shortestPath,
53230
53619
  shouldParallelize,
53620
+ siegelZ,
53231
53621
  sigmoid,
53232
53622
  sign,
53233
53623
  simplify,
@@ -53263,6 +53653,7 @@ export {
53263
53653
  spectralClustering,
53264
53654
  spectrogram,
53265
53655
  speedOfLight,
53656
+ sphericalVoronoi,
53266
53657
  splitUnit,
53267
53658
  sqrt,
53268
53659
  sqrtm,
@@ -53366,6 +53757,7 @@ export {
53366
53757
  variance,
53367
53758
  variation,
53368
53759
  vonMisesPDF,
53760
+ voronoi,
53369
53761
  voronoiDiagram,
53370
53762
  wavedec,
53371
53763
  waverec,