@danielsimonjr/mathts-functions 0.30.0 → 0.31.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
@@ -2750,12 +2750,12 @@ var parallelStatVariance = mathTyped4("parallelStatVariance", {
2750
2750
  },
2751
2751
  // Variadic form
2752
2752
  "number, number": (a, b) => {
2753
- const mean6 = (a + b) / 2;
2754
- return ((a - mean6) ** 2 + (b - mean6) ** 2) / 1;
2753
+ const mean7 = (a + b) / 2;
2754
+ return ((a - mean7) ** 2 + (b - mean7) ** 2) / 1;
2755
2755
  },
2756
2756
  "number, number, number": (a, b, c) => {
2757
- const mean6 = (a + b + c) / 3;
2758
- return ((a - mean6) ** 2 + (b - mean6) ** 2 + (c - mean6) ** 2) / 2;
2757
+ const mean7 = (a + b + c) / 3;
2758
+ return ((a - mean7) ** 2 + (b - mean7) ** 2 + (c - mean7) ** 2) / 2;
2759
2759
  }
2760
2760
  });
2761
2761
  var parallelStatStd = mathTyped4("parallelStatStd", {
@@ -3012,10 +3012,10 @@ var parallelStatMAD = mathTyped4("parallelStatMAD", {
3012
3012
  const n = data.length;
3013
3013
  if (n === 0) return NaN;
3014
3014
  const result = await computePool3.mean(data);
3015
- const mean6 = result.result;
3015
+ const mean7 = result.result;
3016
3016
  let mad2 = 0;
3017
3017
  for (let i = 0; i < n; i++) {
3018
- mad2 += Math.abs(data[i] - mean6);
3018
+ mad2 += Math.abs(data[i] - mean7);
3019
3019
  }
3020
3020
  return mad2 / n;
3021
3021
  },
@@ -8381,18 +8381,18 @@ import { computePool as computePool7 } from "@danielsimonjr/mathts-parallel";
8381
8381
  var GEOMETRY_WASM_THRESHOLD = 32;
8382
8382
  var HULL3D_WASM_THRESHOLD = 1024;
8383
8383
  function angle2D(v1, v2) {
8384
- const dot4 = v1[0] * v2[0] + v1[1] * v2[1];
8384
+ const dot5 = v1[0] * v2[0] + v1[1] * v2[1];
8385
8385
  const mag1 = Math.sqrt(v1[0] ** 2 + v1[1] ** 2);
8386
8386
  const mag2 = Math.sqrt(v2[0] ** 2 + v2[1] ** 2);
8387
8387
  if (mag1 === 0 || mag2 === 0) return NaN;
8388
- return Math.acos(Math.max(-1, Math.min(1, dot4 / (mag1 * mag2))));
8388
+ return Math.acos(Math.max(-1, Math.min(1, dot5 / (mag1 * mag2))));
8389
8389
  }
8390
8390
  function angle3D(v1, v2) {
8391
- const dot4 = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
8391
+ const dot5 = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
8392
8392
  const mag1 = Math.sqrt(v1[0] ** 2 + v1[1] ** 2 + v1[2] ** 2);
8393
8393
  const mag2 = Math.sqrt(v2[0] ** 2 + v2[1] ** 2 + v2[2] ** 2);
8394
8394
  if (mag1 === 0 || mag2 === 0) return NaN;
8395
- return Math.acos(Math.max(-1, Math.min(1, dot4 / (mag1 * mag2))));
8395
+ return Math.acos(Math.max(-1, Math.min(1, dot5 / (mag1 * mag2))));
8396
8396
  }
8397
8397
  function cross3D(a, b) {
8398
8398
  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]];
@@ -8497,14 +8497,14 @@ function reflectVector(v, normal) {
8497
8497
  const mag = Math.sqrt(normal.reduce((s, c) => s + c * c, 0));
8498
8498
  if (mag === 0) return v.slice();
8499
8499
  const n = normal.map((c) => c / mag);
8500
- const dot4 = v.reduce((s, c, i) => s + c * n[i], 0);
8501
- return v.map((c, i) => c - 2 * dot4 * n[i]);
8500
+ const dot5 = v.reduce((s, c, i) => s + c * n[i], 0);
8501
+ return v.map((c, i) => c - 2 * dot5 * n[i]);
8502
8502
  }
8503
8503
  function projectVector(v, onto) {
8504
- const dot4 = v.reduce((s, c, i) => s + c * onto[i], 0);
8504
+ const dot5 = v.reduce((s, c, i) => s + c * onto[i], 0);
8505
8505
  const magSq = onto.reduce((s, c) => s + c * c, 0);
8506
8506
  if (magSq === 0) return onto.map(() => 0);
8507
- const scale = dot4 / magSq;
8507
+ const scale = dot5 / magSq;
8508
8508
  return onto.map((c) => c * scale);
8509
8509
  }
8510
8510
  function distance2D(a, b) {
@@ -14162,26 +14162,26 @@ function _splitSeed(baseSeed, k) {
14162
14162
  function _aggregateRanks(vectors, aggregation) {
14163
14163
  const n = vectors[0].length;
14164
14164
  const count2 = vectors.length;
14165
- const mean6 = new Float64Array(n);
14165
+ const mean7 = new Float64Array(n);
14166
14166
  for (const v of vectors) {
14167
- for (let i = 0; i < n; i++) mean6[i] += v[i];
14167
+ for (let i = 0; i < n; i++) mean7[i] += v[i];
14168
14168
  }
14169
- for (let i = 0; i < n; i++) mean6[i] /= count2;
14169
+ for (let i = 0; i < n; i++) mean7[i] /= count2;
14170
14170
  if (aggregation === "mean") {
14171
- return { ranks: mean6 };
14171
+ return { ranks: mean7 };
14172
14172
  }
14173
14173
  const std2 = new Float64Array(n);
14174
14174
  for (const v of vectors) {
14175
14175
  for (let i = 0; i < n; i++) {
14176
- const d = v[i] - mean6[i];
14176
+ const d = v[i] - mean7[i];
14177
14177
  std2[i] += d * d;
14178
14178
  }
14179
14179
  }
14180
14180
  for (let i = 0; i < n; i++) std2[i] = Math.sqrt(std2[i] / count2);
14181
14181
  return {
14182
- ranks: mean6,
14182
+ ranks: mean7,
14183
14183
  ranksPerRestart: vectors,
14184
- restartStats: { mean: mean6, std: std2 }
14184
+ restartStats: { mean: mean7, std: std2 }
14185
14185
  };
14186
14186
  }
14187
14187
  function _pageRankOnce(adj, d, maxIter, tol, seed) {
@@ -14314,26 +14314,26 @@ function _betweennessOnce(adj, directed, normalise, seed) {
14314
14314
  function _aggregateBetweenness(vectors, aggregation) {
14315
14315
  const n = vectors[0].length;
14316
14316
  const count2 = vectors.length;
14317
- const mean6 = new Float64Array(n);
14317
+ const mean7 = new Float64Array(n);
14318
14318
  for (const v of vectors) {
14319
- for (let i = 0; i < n; i++) mean6[i] += v[i];
14319
+ for (let i = 0; i < n; i++) mean7[i] += v[i];
14320
14320
  }
14321
- for (let i = 0; i < n; i++) mean6[i] /= count2;
14321
+ for (let i = 0; i < n; i++) mean7[i] /= count2;
14322
14322
  if (aggregation === "mean") {
14323
- return { centrality: mean6 };
14323
+ return { centrality: mean7 };
14324
14324
  }
14325
14325
  const std2 = new Float64Array(n);
14326
14326
  for (const v of vectors) {
14327
14327
  for (let i = 0; i < n; i++) {
14328
- const d = v[i] - mean6[i];
14328
+ const d = v[i] - mean7[i];
14329
14329
  std2[i] += d * d;
14330
14330
  }
14331
14331
  }
14332
14332
  for (let i = 0; i < n; i++) std2[i] = Math.sqrt(std2[i] / count2);
14333
14333
  return {
14334
- centrality: mean6,
14334
+ centrality: mean7,
14335
14335
  centralityPerRestart: vectors,
14336
- restartStats: { mean: mean6, std: std2 }
14336
+ restartStats: { mean: mean7, std: std2 }
14337
14337
  };
14338
14338
  }
14339
14339
  async function betweennessCentrality(adj, opts) {
@@ -14397,41 +14397,41 @@ function _aggregateEigenvector(vectors, aggregation) {
14397
14397
  const count2 = vectors.length;
14398
14398
  const ref = vectors[0];
14399
14399
  const aligned = vectors.map((v) => {
14400
- let dot4 = 0;
14401
- for (let i = 0; i < n; i++) dot4 += v[i] * ref[i];
14402
- if (dot4 < 0) {
14400
+ let dot5 = 0;
14401
+ for (let i = 0; i < n; i++) dot5 += v[i] * ref[i];
14402
+ if (dot5 < 0) {
14403
14403
  const flipped = new Float64Array(n);
14404
14404
  for (let i = 0; i < n; i++) flipped[i] = -v[i];
14405
14405
  return flipped;
14406
14406
  }
14407
14407
  return v;
14408
14408
  });
14409
- const mean6 = new Float64Array(n);
14409
+ const mean7 = new Float64Array(n);
14410
14410
  for (const v of aligned) {
14411
- for (let i = 0; i < n; i++) mean6[i] += v[i];
14411
+ for (let i = 0; i < n; i++) mean7[i] += v[i];
14412
14412
  }
14413
- for (let i = 0; i < n; i++) mean6[i] /= count2;
14413
+ for (let i = 0; i < n; i++) mean7[i] /= count2;
14414
14414
  let norm4 = 0;
14415
- for (let i = 0; i < n; i++) norm4 += mean6[i] * mean6[i];
14415
+ for (let i = 0; i < n; i++) norm4 += mean7[i] * mean7[i];
14416
14416
  norm4 = Math.sqrt(norm4);
14417
14417
  if (norm4 > 1e-15) {
14418
- for (let i = 0; i < n; i++) mean6[i] /= norm4;
14418
+ for (let i = 0; i < n; i++) mean7[i] /= norm4;
14419
14419
  }
14420
14420
  if (aggregation === "mean") {
14421
- return { centrality: mean6 };
14421
+ return { centrality: mean7 };
14422
14422
  }
14423
14423
  const std2 = new Float64Array(n);
14424
14424
  for (const v of aligned) {
14425
14425
  for (let i = 0; i < n; i++) {
14426
- const d = v[i] - mean6[i];
14426
+ const d = v[i] - mean7[i];
14427
14427
  std2[i] += d * d;
14428
14428
  }
14429
14429
  }
14430
14430
  for (let i = 0; i < n; i++) std2[i] = Math.sqrt(std2[i] / count2);
14431
14431
  return {
14432
- centrality: mean6,
14432
+ centrality: mean7,
14433
14433
  centralityPerRestart: aligned,
14434
- restartStats: { mean: mean6, std: std2 }
14434
+ restartStats: { mean: mean7, std: std2 }
14435
14435
  };
14436
14436
  }
14437
14437
  async function eigenvectorCentrality(adj, opts) {
@@ -15210,7 +15210,7 @@ function hypergeometricDist(population, successes, draws) {
15210
15210
  for (let i = kMin; i <= kk; i++) sum3 += pmf(i);
15211
15211
  return Math.min(1, sum3);
15212
15212
  };
15213
- const mean6 = N * K / M;
15213
+ const mean7 = N * K / M;
15214
15214
  const variance2 = N * (K / M) * ((M - K) / M) * ((M - N) / (M - 1));
15215
15215
  return {
15216
15216
  pdf: pmf,
@@ -15221,7 +15221,7 @@ function hypergeometricDist(population, successes, draws) {
15221
15221
  for (let k = kMin; k <= kMax; k++) if (cdf(k) >= p) return k;
15222
15222
  return kMax;
15223
15223
  },
15224
- mean: mean6,
15224
+ mean: mean7,
15225
15225
  variance: variance2,
15226
15226
  sample: () => _discreteSample(cdf, Math.random, kMax),
15227
15227
  sampleN: (n, opts) => _sampleNDispatch(null, [], n, opts, (count2, rng) => {
@@ -15243,7 +15243,7 @@ function negativeBinomialDist(r, p) {
15243
15243
  if (k < 0) return 0;
15244
15244
  return Math.min(1, _betainc(p, r, Math.floor(k) + 1));
15245
15245
  };
15246
- const mean6 = r * (1 - p) / p;
15246
+ const mean7 = r * (1 - p) / p;
15247
15247
  const variance2 = r * (1 - p) / (p * p);
15248
15248
  return {
15249
15249
  pdf: pmf,
@@ -15258,12 +15258,12 @@ function negativeBinomialDist(r, p) {
15258
15258
  }
15259
15259
  return Infinity;
15260
15260
  },
15261
- mean: mean6,
15261
+ mean: mean7,
15262
15262
  variance: variance2,
15263
- sample: () => _discreteSample(cdf, Math.random, Math.ceil(mean6 + 20 * Math.sqrt(variance2) + 20)),
15263
+ sample: () => _discreteSample(cdf, Math.random, Math.ceil(mean7 + 20 * Math.sqrt(variance2) + 20)),
15264
15264
  sampleN: (n, opts) => _sampleNDispatch(null, [], n, opts, (count2, rng) => {
15265
15265
  const out = new Float64Array(count2);
15266
- const cap = Math.ceil(mean6 + 20 * Math.sqrt(variance2) + 20);
15266
+ const cap = Math.ceil(mean7 + 20 * Math.sqrt(variance2) + 20);
15267
15267
  for (let j = 0; j < count2; j++) out[j] = _discreteSample(cdf, rng, cap);
15268
15268
  return out;
15269
15269
  })
@@ -15442,8 +15442,8 @@ function _cholesky(m) {
15442
15442
  }
15443
15443
  return L;
15444
15444
  }
15445
- function multivariateNormal(mean6, cov2) {
15446
- const k = mean6.length;
15445
+ function multivariateNormal(mean7, cov2) {
15446
+ const k = mean7.length;
15447
15447
  if (cov2.length !== k || cov2.some((row2) => row2.length !== k)) {
15448
15448
  throw new Error("multivariateNormal: cov must be a k\xD7k matrix matching mean");
15449
15449
  }
@@ -15451,13 +15451,13 @@ function multivariateNormal(mean6, cov2) {
15451
15451
  let logDet = 0;
15452
15452
  for (let i = 0; i < k; i++) logDet += 2 * Math.log(L[i][i]);
15453
15453
  return {
15454
- mean: mean6,
15454
+ mean: mean7,
15455
15455
  cov: cov2,
15456
15456
  pdf: (x) => {
15457
15457
  if (x.length !== k) throw new Error("multivariateNormal.pdf: x must have length k");
15458
15458
  const z = new Array(k).fill(0);
15459
15459
  for (let i = 0; i < k; i++) {
15460
- let s = x[i] - mean6[i];
15460
+ let s = x[i] - mean7[i];
15461
15461
  for (let j = 0; j < i; j++) s -= L[i][j] * z[j];
15462
15462
  z[i] = s / L[i][i];
15463
15463
  }
@@ -15522,11 +15522,11 @@ function _bootstrapSummary(stats) {
15522
15522
  if (n === 0) return { bootstrapMean: NaN, bootstrapStd: NaN };
15523
15523
  let sum3 = 0;
15524
15524
  for (let i = 0; i < n; i++) sum3 += stats[i];
15525
- const mean6 = sum3 / n;
15525
+ const mean7 = sum3 / n;
15526
15526
  let sq = 0;
15527
- for (let i = 0; i < n; i++) sq += (stats[i] - mean6) ** 2;
15527
+ for (let i = 0; i < n; i++) sq += (stats[i] - mean7) ** 2;
15528
15528
  const std2 = n > 1 ? Math.sqrt(sq / (n - 1)) : 0;
15529
- return { bootstrapMean: mean6, bootstrapStd: std2 };
15529
+ return { bootstrapMean: mean7, bootstrapStd: std2 };
15530
15530
  }
15531
15531
  function _mean(arr7) {
15532
15532
  let sum3 = 0;
@@ -16250,9 +16250,9 @@ function principalComponentAnalysis(data, k) {
16250
16250
  const explained = eigenvalues.map((ev) => totalVar > 0 ? Math.abs(ev) / totalVar : 0);
16251
16251
  const scores = centered.map((row2) => {
16252
16252
  return eigenvectors.map((ev) => {
16253
- let dot4 = 0;
16254
- for (let j = 0; j < p; j++) dot4 += row2[j] * ev[j];
16255
- return dot4;
16253
+ let dot5 = 0;
16254
+ for (let j = 0; j < p; j++) dot5 += row2[j] * ev[j];
16255
+ return dot5;
16256
16256
  });
16257
16257
  });
16258
16258
  return { components: eigenvectors, explained, scores };
@@ -16293,7 +16293,7 @@ function _median(arr7) {
16293
16293
  const m = n >> 1;
16294
16294
  return n % 2 === 1 ? s[m] : (s[m - 1] + s[m]) / 2;
16295
16295
  }
16296
- function leveneTest(groups, center = "median") {
16296
+ function leveneTest(groups, center2 = "median") {
16297
16297
  const k = groups.length;
16298
16298
  if (k < 2) throw new Error("leveneTest: need at least 2 groups");
16299
16299
  let N = 0;
@@ -16302,7 +16302,7 @@ function leveneTest(groups, center = "median") {
16302
16302
  N += g.length;
16303
16303
  }
16304
16304
  const z = groups.map((g) => {
16305
- const c = center === "median" ? _median(g) : _mean(g);
16305
+ const c = center2 === "median" ? _median(g) : _mean(g);
16306
16306
  return g.map((x) => Math.abs(x - c));
16307
16307
  });
16308
16308
  const allZ = [];
@@ -16410,13 +16410,13 @@ function andersonDarlingTest(data) {
16410
16410
  const n = data.length;
16411
16411
  if (n < 8) throw new Error("andersonDarlingTest: need at least 8 observations");
16412
16412
  const sorted = data.slice().sort((p2, q) => p2 - q);
16413
- const mean6 = _mean(sorted);
16413
+ const mean7 = _mean(sorted);
16414
16414
  const s = Math.sqrt(_variance(sorted, 1));
16415
16415
  const phi = (z) => 0.5 * erfcScalar(-z / Math.SQRT2);
16416
16416
  let sumTerm = 0;
16417
16417
  for (let i = 0; i < n; i++) {
16418
- const wi = (sorted[i] - mean6) / s;
16419
- const wj = (sorted[n - 1 - i] - mean6) / s;
16418
+ const wi = (sorted[i] - mean7) / s;
16419
+ const wj = (sorted[n - 1 - i] - mean7) / s;
16420
16420
  sumTerm += (2 * (i + 1) - 1) / n * (Math.log(phi(wi)) + Math.log(1 - phi(wj)));
16421
16421
  }
16422
16422
  const a2 = -n - sumTerm;
@@ -16863,30 +16863,30 @@ function hessenbergForm(A) {
16863
16863
  if (normV < 1e-30) continue;
16864
16864
  const beta2 = 2 / normV;
16865
16865
  for (let j = k; j < n; j++) {
16866
- let dot4 = 0;
16866
+ let dot5 = 0;
16867
16867
  for (let i = 0; i < len; i++) {
16868
- dot4 += v[i] * H[k + 1 + i][j];
16868
+ dot5 += v[i] * H[k + 1 + i][j];
16869
16869
  }
16870
16870
  for (let i = 0; i < len; i++) {
16871
- H[k + 1 + i][j] -= beta2 * v[i] * dot4;
16871
+ H[k + 1 + i][j] -= beta2 * v[i] * dot5;
16872
16872
  }
16873
16873
  }
16874
16874
  for (let i = 0; i < n; i++) {
16875
- let dot4 = 0;
16875
+ let dot5 = 0;
16876
16876
  for (let j = 0; j < len; j++) {
16877
- dot4 += H[i][k + 1 + j] * v[j];
16877
+ dot5 += H[i][k + 1 + j] * v[j];
16878
16878
  }
16879
16879
  for (let j = 0; j < len; j++) {
16880
- H[i][k + 1 + j] -= beta2 * dot4 * v[j];
16880
+ H[i][k + 1 + j] -= beta2 * dot5 * v[j];
16881
16881
  }
16882
16882
  }
16883
16883
  for (let i = 0; i < n; i++) {
16884
- let dot4 = 0;
16884
+ let dot5 = 0;
16885
16885
  for (let j = 0; j < len; j++) {
16886
- dot4 += Q2[i][k + 1 + j] * v[j];
16886
+ dot5 += Q2[i][k + 1 + j] * v[j];
16887
16887
  }
16888
16888
  for (let j = 0; j < len; j++) {
16889
- Q2[i][k + 1 + j] -= beta2 * dot4 * v[j];
16889
+ Q2[i][k + 1 + j] -= beta2 * dot5 * v[j];
16890
16890
  }
16891
16891
  }
16892
16892
  }
@@ -22678,10 +22678,10 @@ var dependencies85 = ["typed", "transpose", "conj"];
22678
22678
  var createCtranspose = /* @__PURE__ */ factory(
22679
22679
  name85,
22680
22680
  dependencies85,
22681
- ({ typed: typed3, transpose: transpose3, conj: conj3 }) => {
22681
+ ({ typed: typed3, transpose: transpose4, conj: conj3 }) => {
22682
22682
  return typed3(name85, {
22683
22683
  any: function(x) {
22684
- return conj3(transpose3(x));
22684
+ return conj3(transpose4(x));
22685
22685
  }
22686
22686
  });
22687
22687
  }
@@ -23671,7 +23671,7 @@ var dependencies98 = ["add", "multiply", "transpose"];
23671
23671
  var createCsAmd = /* @__PURE__ */ factory(
23672
23672
  name98,
23673
23673
  dependencies98,
23674
- ({ add: add2, multiply: multiply2, transpose: transpose3 }) => {
23674
+ ({ add: add2, multiply: multiply2, transpose: transpose4 }) => {
23675
23675
  function _tryWasmAmd(a, n) {
23676
23676
  const wasm = wasmLoader.getModule();
23677
23677
  if (!wasm || !a._ptr || !a._index) return null;
@@ -23965,7 +23965,7 @@ var createCsAmd = /* @__PURE__ */ factory(
23965
23965
  return P2;
23966
23966
  };
23967
23967
  function _createTargetMatrix(order, a, m, n, dense) {
23968
- const at = transpose3(a);
23968
+ const at = transpose4(a);
23969
23969
  if (order === 1 && n === m) {
23970
23970
  return add2(a, at);
23971
23971
  }
@@ -23984,7 +23984,7 @@ var createCsAmd = /* @__PURE__ */ factory(
23984
23984
  }
23985
23985
  }
23986
23986
  tptr[m] = p2;
23987
- a = transpose3(at);
23987
+ a = transpose4(at);
23988
23988
  return multiply2(at, a);
23989
23989
  }
23990
23990
  return multiply2(at, a);
@@ -24085,7 +24085,7 @@ var dependencies99 = ["transpose"];
24085
24085
  var createCsCounts = /* @__PURE__ */ factory(
24086
24086
  name99,
24087
24087
  dependencies99,
24088
- ({ transpose: transpose3 }) => {
24088
+ ({ transpose: transpose4 }) => {
24089
24089
  function _tryWasmCounts(a, parent, post, n) {
24090
24090
  const wasm = wasmLoader.getModule();
24091
24091
  if (!wasm || n < WASM_COUNTS_THRESHOLD || !a._index || !a._ptr) return null;
@@ -24147,7 +24147,7 @@ var createCsCounts = /* @__PURE__ */ factory(
24147
24147
  w[k] = -1;
24148
24148
  }
24149
24149
  const colcount = [];
24150
- const at = transpose3(a);
24150
+ const at = transpose4(a);
24151
24151
  const tindex = at._index;
24152
24152
  const tptr = at._ptr;
24153
24153
  for (k = 0; k < n; k++) {
@@ -24316,9 +24316,9 @@ var dependencies100 = ["add", "multiply", "transpose"];
24316
24316
  var createCsSqr = /* @__PURE__ */ factory(
24317
24317
  name100,
24318
24318
  dependencies100,
24319
- ({ add: add2, multiply: multiply2, transpose: transpose3 }) => {
24320
- const csAmd2 = createCsAmd({ add: add2, multiply: multiply2, transpose: transpose3 });
24321
- const csCounts2 = createCsCounts({ transpose: transpose3 });
24319
+ ({ add: add2, multiply: multiply2, transpose: transpose4 }) => {
24320
+ const csAmd2 = createCsAmd({ add: add2, multiply: multiply2, transpose: transpose4 });
24321
+ const csCounts2 = createCsCounts({ transpose: transpose4 });
24322
24322
  return function csSqr2(order, a, qr2) {
24323
24323
  const aptr = a._ptr;
24324
24324
  const asize = a._size;
@@ -30198,7 +30198,7 @@ var createPinv = /* @__PURE__ */ factory(
30198
30198
  deepEqual: deepEqual3,
30199
30199
  equal: equal2,
30200
30200
  dotDivide: dotDivide2,
30201
- dot: dot4,
30201
+ dot: dot5,
30202
30202
  ctranspose: ctranspose2,
30203
30203
  divideScalar: divideScalar2,
30204
30204
  multiply: multiply2,
@@ -30214,7 +30214,7 @@ var createPinv = /* @__PURE__ */ factory(
30214
30214
  if (size2[0] === 1) {
30215
30215
  return inv2(x);
30216
30216
  } else {
30217
- return dotDivide2(ctranspose2(x), dot4(x, x));
30217
+ return dotDivide2(ctranspose2(x), dot5(x, x));
30218
30218
  }
30219
30219
  case 2: {
30220
30220
  if (_isZeros(x)) return ctranspose2(x);
@@ -30293,8 +30293,8 @@ var createPinv = /* @__PURE__ */ factory(
30293
30293
  }
30294
30294
  function _rankFact(mat, rows, cols) {
30295
30295
  const rref = _rref(mat, rows, cols);
30296
- const C = mat.map((row2) => row2.filter((_, j) => j < rows && !_isZero(dot4(rref[j], rref[j]))));
30297
- const F = rref.filter((_, i) => !_isZero(dot4(rref[i], rref[i])));
30296
+ const C = mat.map((row2) => row2.filter((_, j) => j < rows && !_isZero(dot5(rref[j], rref[j]))));
30297
+ const F = rref.filter((_, i) => !_isZero(dot5(rref[i], rref[i])));
30298
30298
  return { C, F };
30299
30299
  }
30300
30300
  function _isZero(x) {
@@ -35027,14 +35027,14 @@ var createSlu = /* @__PURE__ */ factory(
35027
35027
  abs: abs2,
35028
35028
  add: add2,
35029
35029
  multiply: multiply2,
35030
- transpose: transpose3,
35030
+ transpose: transpose4,
35031
35031
  divideScalar: divideScalar2,
35032
35032
  subtract: subtract2,
35033
35033
  larger: larger2,
35034
35034
  largerEq: largerEq2,
35035
35035
  SparseMatrix
35036
35036
  }) => {
35037
- const csSqr2 = createCsSqr({ add: add2, multiply: multiply2, transpose: transpose3 });
35037
+ const csSqr2 = createCsSqr({ add: add2, multiply: multiply2, transpose: transpose4 });
35038
35038
  const csLu2 = createCsLu({
35039
35039
  abs: abs2,
35040
35040
  divideScalar: divideScalar2,
@@ -35788,10 +35788,10 @@ var createVariance = /* @__PURE__ */ factory(
35788
35788
  }
35789
35789
  });
35790
35790
  if (num2 === 0) throw new Error("Cannot calculate variance of an empty array");
35791
- const mean6 = divide2(sum3, num2);
35791
+ const mean7 = divide2(sum3, num2);
35792
35792
  sum3 = void 0;
35793
35793
  deepForEach2(array, function(value) {
35794
- const diff2 = subtract2(value, mean6);
35794
+ const diff2 = subtract2(value, mean7);
35795
35795
  sum3 = sum3 === void 0 ? multiply2(diff2, diff2) : add2(sum3, multiply2(diff2, diff2));
35796
35796
  });
35797
35797
  if (mathIsNaN(sum3)) {
@@ -37257,7 +37257,7 @@ function createComplexEigs({
37257
37257
  larger: larger2,
37258
37258
  smaller: smaller2,
37259
37259
  matrixFromColumns: _matrixFromColumns,
37260
- dot: dot4
37260
+ dot: dot5
37261
37261
  }) {
37262
37262
  function complexEigs(arr7, N, prec, type, findVectors = true) {
37263
37263
  if (!findVectors && type === "number" && N * N >= WASM_EIGS_THRESHOLD) {
@@ -37698,7 +37698,7 @@ function createComplexEigs({
37698
37698
  v = subtract2(
37699
37699
  v,
37700
37700
  multiply2(
37701
- divideScalar2(dot4(w, v), dot4(w, w)),
37701
+ divideScalar2(dot5(w, v), dot5(w, w)),
37702
37702
  w
37703
37703
  )
37704
37704
  );
@@ -37706,7 +37706,7 @@ function createComplexEigs({
37706
37706
  return v;
37707
37707
  }
37708
37708
  function norm4(v) {
37709
- return abs2(sqrt2(dot4(v, v)));
37709
+ return abs2(sqrt2(dot5(v, v)));
37710
37710
  }
37711
37711
  function normalize2(v, type) {
37712
37712
  const big = type === "BigNumber";
@@ -38126,7 +38126,7 @@ var createEigs = /* @__PURE__ */ factory(
38126
38126
  re: re3,
38127
38127
  smaller: smaller2,
38128
38128
  matrixFromColumns: matrixFromColumns2,
38129
- dot: dot4
38129
+ dot: dot5
38130
38130
  }) => {
38131
38131
  const doRealSymmetric = createRealSymmetric({
38132
38132
  config: config2,
@@ -38165,7 +38165,7 @@ var createEigs = /* @__PURE__ */ factory(
38165
38165
  larger: larger2,
38166
38166
  smaller: smaller2,
38167
38167
  matrixFromColumns: matrixFromColumns2,
38168
- dot: dot4
38168
+ dot: dot5
38169
38169
  });
38170
38170
  return typed3("eigs", {
38171
38171
  // The conversion to matrix in the first two implementations,
@@ -41147,7 +41147,7 @@ var createSylvester = /* @__PURE__ */ factory(
41147
41147
  multiply: multiply2,
41148
41148
  range: range2,
41149
41149
  concat: concat3,
41150
- transpose: transpose3,
41150
+ transpose: transpose4,
41151
41151
  index,
41152
41152
  subset: subset2,
41153
41153
  add: add2,
@@ -41189,7 +41189,7 @@ var createSylvester = /* @__PURE__ */ factory(
41189
41189
  const sB = schur2(multiply2(-1, B));
41190
41190
  const G = sB.T;
41191
41191
  const V = sB.U;
41192
- const D = multiply2(multiply2(transpose3(U), C), V);
41192
+ const D = multiply2(multiply2(transpose4(U), C), V);
41193
41193
  const all = range2(0, m);
41194
41194
  const y = [];
41195
41195
  const hc = (a, b) => concat3(a, b, 1);
@@ -41223,7 +41223,7 @@ var createSylvester = /* @__PURE__ */ factory(
41223
41223
  }
41224
41224
  }
41225
41225
  const Y = matrix2(matrixFromColumns2(...y));
41226
- const X = multiply2(U, multiply2(Y, transpose3(V)));
41226
+ const X = multiply2(U, multiply2(Y, transpose4(V)));
41227
41227
  return X;
41228
41228
  }
41229
41229
  }
@@ -41235,21 +41235,21 @@ var dependencies253 = ["typed", "matrix", "sylvester", "multiply", "transpose"];
41235
41235
  var createLyap = /* @__PURE__ */ factory(
41236
41236
  name253,
41237
41237
  dependencies253,
41238
- ({ typed: typed3, matrix: matrix2, sylvester: sylvester2, multiply: multiply2, transpose: transpose3 }) => {
41238
+ ({ typed: typed3, matrix: matrix2, sylvester: sylvester2, multiply: multiply2, transpose: transpose4 }) => {
41239
41239
  return typed3(name253, {
41240
41240
  "Matrix, Matrix": function(A, Q2) {
41241
- return sylvester2(A, transpose3(A), multiply2(-1, Q2));
41241
+ return sylvester2(A, transpose4(A), multiply2(-1, Q2));
41242
41242
  },
41243
41243
  "Array, Matrix": function(A, Q2) {
41244
- return sylvester2(matrix2(A), transpose3(matrix2(A)), multiply2(-1, Q2));
41244
+ return sylvester2(matrix2(A), transpose4(matrix2(A)), multiply2(-1, Q2));
41245
41245
  },
41246
41246
  "Matrix, Array": function(A, Q2) {
41247
- return sylvester2(A, transpose3(A), matrix2(multiply2(-1, Q2)));
41247
+ return sylvester2(A, transpose4(A), matrix2(multiply2(-1, Q2)));
41248
41248
  },
41249
41249
  "Array, Array": function(A, Q2) {
41250
41250
  return sylvester2(
41251
41251
  matrix2(A),
41252
- transpose3(matrix2(A)),
41252
+ transpose4(matrix2(A)),
41253
41253
  matrix2(multiply2(-1, Q2))
41254
41254
  ).toArray();
41255
41255
  }
@@ -45455,6 +45455,297 @@ function linearRegression(x, y) {
45455
45455
  return { slope, intercept, rValue, rSquared: rValue * rValue, pValue, stdErr };
45456
45456
  }
45457
45457
 
45458
+ // src/ml/ols.ts
45459
+ function transpose3(m) {
45460
+ const rows = m.length;
45461
+ const cols = m[0].length;
45462
+ const out = Array.from({ length: cols }, () => new Array(rows).fill(0));
45463
+ for (let i = 0; i < rows; i++) {
45464
+ for (let j = 0; j < cols; j++) {
45465
+ out[j][i] = m[i][j];
45466
+ }
45467
+ }
45468
+ return out;
45469
+ }
45470
+ function matmul2(a, b) {
45471
+ const n = a.length;
45472
+ const k = b.length;
45473
+ const m = b[0].length;
45474
+ const out = Array.from({ length: n }, () => new Array(m).fill(0));
45475
+ for (let i = 0; i < n; i++) {
45476
+ for (let c = 0; c < k; c++) {
45477
+ const aic = a[i][c];
45478
+ if (aic === 0) continue;
45479
+ for (let j = 0; j < m; j++) {
45480
+ out[i][j] += aic * b[c][j];
45481
+ }
45482
+ }
45483
+ }
45484
+ return out;
45485
+ }
45486
+ function matVec(a, v) {
45487
+ return a.map((row2) => row2.reduce((sum3, val, j) => sum3 + val * v[j], 0));
45488
+ }
45489
+ function invert(a) {
45490
+ const n = a.length;
45491
+ const M = a.map((row2, i) => [...row2, ...Array.from({ length: n }, (_, j) => i === j ? 1 : 0)]);
45492
+ for (let col = 0; col < n; col++) {
45493
+ let pivotRow = col;
45494
+ let maxVal = Math.abs(M[col][col]);
45495
+ for (let row2 = col + 1; row2 < n; row2++) {
45496
+ if (Math.abs(M[row2][col]) > maxVal) {
45497
+ maxVal = Math.abs(M[row2][col]);
45498
+ pivotRow = row2;
45499
+ }
45500
+ }
45501
+ if (maxVal < 1e-15) throw new Error("ols: X^T X is singular (predictors are collinear)");
45502
+ if (pivotRow !== col) [M[col], M[pivotRow]] = [M[pivotRow], M[col]];
45503
+ const pivot = M[col][col];
45504
+ for (let j = 0; j < 2 * n; j++) M[col][j] /= pivot;
45505
+ for (let row2 = 0; row2 < n; row2++) {
45506
+ if (row2 === col) continue;
45507
+ const factor2 = M[row2][col];
45508
+ if (factor2 === 0) continue;
45509
+ for (let j = 0; j < 2 * n; j++) {
45510
+ M[row2][j] -= factor2 * M[col][j];
45511
+ }
45512
+ }
45513
+ }
45514
+ return M.map((row2) => row2.slice(n));
45515
+ }
45516
+ function ols(X, y, opts) {
45517
+ const n = X.length;
45518
+ if (n === 0) throw new Error("ols: empty design matrix");
45519
+ if (y.length !== n) throw new Error(`ols: length mismatch (X has ${n} rows, y has ${y.length})`);
45520
+ const useIntercept = opts?.intercept !== false;
45521
+ const design = useIntercept ? X.map((row2) => [1, ...row2]) : X.map((row2) => [...row2]);
45522
+ const p = design[0].length;
45523
+ if (n <= p) throw new Error(`ols: need more observations (${n}) than parameters (${p})`);
45524
+ const Xt = transpose3(design);
45525
+ const XtX = matmul2(Xt, design);
45526
+ const Xty = matVec(Xt, y);
45527
+ const XtXinv = invert(XtX);
45528
+ const coefficients = matVec(XtXinv, Xty);
45529
+ const fitted = matVec(design, coefficients);
45530
+ const residuals = y.map((yi, i) => yi - fitted[i]);
45531
+ const rss = residuals.reduce((sum3, e) => sum3 + e * e, 0);
45532
+ const yMean = y.reduce((sum3, v) => sum3 + v, 0) / n;
45533
+ const tss = y.reduce((sum3, v) => sum3 + (v - yMean) * (v - yMean), 0);
45534
+ const dfResid = n - p;
45535
+ const sigma2 = rss / dfResid;
45536
+ const stderr = XtXinv.map((row2, j) => Math.sqrt(sigma2 * row2[j]));
45537
+ const tValues = coefficients.map((b, j) => b / stderr[j]);
45538
+ const pValues = tValues.map((t) => 2 * (1 - studentTCDF(Math.abs(t), dfResid)));
45539
+ const r2 = tss === 0 ? 1 : 1 - rss / tss;
45540
+ const adjR2 = 1 - (1 - r2) * (n - 1) / dfResid;
45541
+ const fStat = p > 1 ? (tss - rss) / (p - 1) / (rss / dfResid) : NaN;
45542
+ return { coefficients, stderr, tValues, pValues, r2, adjR2, fStat, residuals };
45543
+ }
45544
+
45545
+ // src/ml/regularized-regression.ts
45546
+ function validate(X, y, name254) {
45547
+ const n = X.length;
45548
+ if (n === 0) throw new Error(`${name254}: empty design matrix`);
45549
+ if (y.length !== n) {
45550
+ throw new Error(`${name254}: length mismatch (X has ${n} rows, y has ${y.length})`);
45551
+ }
45552
+ const p = X[0].length;
45553
+ if (p === 0) throw new Error(`${name254}: X must have at least one predictor column`);
45554
+ return { n, p };
45555
+ }
45556
+ function colMeans(X, n, p) {
45557
+ const means = new Array(p).fill(0);
45558
+ for (const row2 of X) {
45559
+ for (let j = 0; j < p; j++) means[j] += row2[j];
45560
+ }
45561
+ for (let j = 0; j < p; j++) means[j] /= n;
45562
+ return means;
45563
+ }
45564
+ function mean6(y) {
45565
+ return y.reduce((s, v) => s + v, 0) / y.length;
45566
+ }
45567
+ function center(X, y, n, p, useIntercept) {
45568
+ const xMean = useIntercept ? colMeans(X, n, p) : new Array(p).fill(0);
45569
+ const yMean = useIntercept ? mean6(y) : 0;
45570
+ const Xc = X.map((row2) => row2.map((v, j) => v - xMean[j]));
45571
+ const yc = y.map((v) => v - yMean);
45572
+ return { Xc, yc, xMean, yMean };
45573
+ }
45574
+ function dot2(a, b) {
45575
+ let s = 0;
45576
+ for (let i = 0; i < a.length; i++) s += a[i] * b[i];
45577
+ return s;
45578
+ }
45579
+ function softThreshold(a, lambda) {
45580
+ if (a > lambda) return a - lambda;
45581
+ if (a < -lambda) return a + lambda;
45582
+ return 0;
45583
+ }
45584
+ function ridge(X, y, alpha, opts) {
45585
+ const { n, p } = validate(X, y, "ridge");
45586
+ if (alpha < 0) throw new Error("ridge: alpha must be non-negative");
45587
+ const useIntercept = opts?.intercept !== false;
45588
+ const { Xc, yc, xMean, yMean } = center(X, y, n, p, useIntercept);
45589
+ const XtX = Array.from({ length: p }, () => new Array(p).fill(0));
45590
+ const Xty = new Array(p).fill(0);
45591
+ for (let j = 0; j < p; j++) {
45592
+ for (let k = j; k < p; k++) {
45593
+ let s = 0;
45594
+ for (let i = 0; i < n; i++) s += Xc[i][j] * Xc[i][k];
45595
+ XtX[j][k] = s;
45596
+ XtX[k][j] = s;
45597
+ }
45598
+ XtX[j][j] += alpha;
45599
+ for (let i = 0; i < n; i++) Xty[j] += Xc[i][j] * yc[i];
45600
+ }
45601
+ const coefficients = linsolve(XtX, Xty);
45602
+ const intercept = useIntercept ? yMean - dot2(xMean, coefficients) : 0;
45603
+ return { coefficients, intercept };
45604
+ }
45605
+ function standardize(Xc, n, p) {
45606
+ const scale = new Array(p);
45607
+ for (let j = 0; j < p; j++) {
45608
+ let ss = 0;
45609
+ for (let i = 0; i < n; i++) ss += Xc[i][j] * Xc[i][j];
45610
+ const meanSq = ss / n;
45611
+ scale[j] = meanSq > 1e-15 ? Math.sqrt(meanSq) : 1;
45612
+ }
45613
+ const Xs = Xc.map((row2) => row2.map((v, j) => v / scale[j]));
45614
+ return { Xs, scale };
45615
+ }
45616
+ function coordinateDescent(Xs, yc, n, p, l1, l2, maxIter, tol) {
45617
+ const beta2 = new Array(p).fill(0);
45618
+ const z = new Array(p).fill(n);
45619
+ const residual = [...yc];
45620
+ for (let iter = 0; iter < maxIter; iter++) {
45621
+ let maxChange = 0;
45622
+ for (let j = 0; j < p; j++) {
45623
+ const col = Xs.map((row2) => row2[j]);
45624
+ const oldBeta = beta2[j];
45625
+ let rho = 0;
45626
+ for (let i = 0; i < n; i++) rho += col[i] * (residual[i] + col[i] * oldBeta);
45627
+ const newBeta = softThreshold(rho, l1) / (z[j] + l2);
45628
+ if (newBeta !== oldBeta) {
45629
+ const delta = newBeta - oldBeta;
45630
+ for (let i = 0; i < n; i++) residual[i] -= col[i] * delta;
45631
+ beta2[j] = newBeta;
45632
+ maxChange = Math.max(maxChange, Math.abs(delta));
45633
+ }
45634
+ }
45635
+ if (maxChange < tol) break;
45636
+ }
45637
+ return beta2;
45638
+ }
45639
+ function lasso(X, y, alpha, opts) {
45640
+ const { n, p } = validate(X, y, "lasso");
45641
+ if (alpha < 0) throw new Error("lasso: alpha must be non-negative");
45642
+ const useIntercept = opts?.intercept !== false;
45643
+ const maxIter = opts?.maxIter ?? 1e3;
45644
+ const tol = opts?.tol ?? 1e-7;
45645
+ const { Xc, yc, xMean, yMean } = center(X, y, n, p, useIntercept);
45646
+ const { Xs, scale } = standardize(Xc, n, p);
45647
+ const betaStd = coordinateDescent(Xs, yc, n, p, alpha, 0, maxIter, tol);
45648
+ const coefficients = betaStd.map((b, j) => b / scale[j]);
45649
+ const intercept = useIntercept ? yMean - dot2(xMean, coefficients) : 0;
45650
+ return { coefficients, intercept };
45651
+ }
45652
+ function elasticNet(X, y, alpha, l1Ratio, opts) {
45653
+ const { n, p } = validate(X, y, "elasticNet");
45654
+ if (alpha < 0) throw new Error("elasticNet: alpha must be non-negative");
45655
+ if (l1Ratio < 0 || l1Ratio > 1) throw new Error("elasticNet: l1Ratio must be in [0, 1]");
45656
+ const useIntercept = opts?.intercept !== false;
45657
+ const maxIter = opts?.maxIter ?? 1e3;
45658
+ const tol = opts?.tol ?? 1e-7;
45659
+ const { Xc, yc, xMean, yMean } = center(X, y, n, p, useIntercept);
45660
+ const { Xs, scale } = standardize(Xc, n, p);
45661
+ const l1 = alpha * l1Ratio;
45662
+ const l2 = alpha * (1 - l1Ratio);
45663
+ const betaStd = coordinateDescent(Xs, yc, n, p, l1, l2, maxIter, tol);
45664
+ const coefficients = betaStd.map((b, j) => b / scale[j]);
45665
+ const intercept = useIntercept ? yMean - dot2(xMean, coefficients) : 0;
45666
+ return { coefficients, intercept };
45667
+ }
45668
+
45669
+ // src/ml/logistic-regression.ts
45670
+ function sigmoid2(z) {
45671
+ if (z >= 0) {
45672
+ const e2 = Math.exp(-z);
45673
+ return 1 / (1 + e2);
45674
+ }
45675
+ const e = Math.exp(z);
45676
+ return e / (1 + e);
45677
+ }
45678
+ var MAX_STEP_NORM = 25;
45679
+ function logisticRegression(X, y, opts) {
45680
+ const n = X.length;
45681
+ if (n === 0) throw new Error("logisticRegression: empty design matrix");
45682
+ if (y.length !== n) {
45683
+ throw new Error(`logisticRegression: length mismatch (X has ${n} rows, y has ${y.length})`);
45684
+ }
45685
+ for (const yi of y) {
45686
+ if (yi !== 0 && yi !== 1) {
45687
+ throw new Error("logisticRegression: y must be binary (0 or 1)");
45688
+ }
45689
+ }
45690
+ const useIntercept = opts?.intercept !== false;
45691
+ const tol = opts?.tol ?? 1e-8;
45692
+ const maxIter = opts?.maxIter ?? 100;
45693
+ const design = (rows) => useIntercept ? rows.map((row2) => [1, ...row2]) : rows.map((row2) => [...row2]);
45694
+ const D = design(X);
45695
+ const p = D[0].length;
45696
+ let beta2 = new Array(p).fill(0);
45697
+ for (let iter = 0; iter < maxIter; iter++) {
45698
+ const eta = D.map((row2) => row2.reduce((s, v, j) => s + v * beta2[j], 0));
45699
+ const probs = eta.map(sigmoid2);
45700
+ const weights = probs.map((pi) => Math.max(pi * (1 - pi), 1e-9));
45701
+ const XtWX = Array.from({ length: p }, () => new Array(p).fill(0));
45702
+ for (let i = 0; i < n; i++) {
45703
+ const w = weights[i];
45704
+ const row2 = D[i];
45705
+ for (let a = 0; a < p; a++) {
45706
+ const wa = w * row2[a];
45707
+ if (wa === 0) continue;
45708
+ for (let b = 0; b < p; b++) {
45709
+ XtWX[a][b] += wa * row2[b];
45710
+ }
45711
+ }
45712
+ }
45713
+ const score = new Array(p).fill(0);
45714
+ for (let i = 0; i < n; i++) {
45715
+ const resid = y[i] - probs[i];
45716
+ const row2 = D[i];
45717
+ for (let a = 0; a < p; a++) {
45718
+ score[a] += row2[a] * resid;
45719
+ }
45720
+ }
45721
+ const ridgeEps = 1e-8;
45722
+ const regularized = XtWX.map((row2, a) => row2.map((v, b) => a === b ? v + ridgeEps : v));
45723
+ let delta;
45724
+ try {
45725
+ delta = linsolve(regularized, score);
45726
+ } catch {
45727
+ break;
45728
+ }
45729
+ let stepNorm = 0;
45730
+ for (const d of delta) stepNorm = Math.max(stepNorm, Math.abs(d));
45731
+ if (stepNorm > MAX_STEP_NORM) {
45732
+ const scale = MAX_STEP_NORM / stepNorm;
45733
+ delta = delta.map((d) => d * scale);
45734
+ stepNorm = MAX_STEP_NORM;
45735
+ }
45736
+ beta2 = beta2.map((b, j) => b + delta[j]);
45737
+ if (stepNorm < tol) break;
45738
+ }
45739
+ const intercept = useIntercept ? beta2[0] : 0;
45740
+ const coefficients = useIntercept ? beta2.slice(1) : beta2.slice();
45741
+ const predictProba = (x) => {
45742
+ const Dx = design(x);
45743
+ return Dx.map((row2) => sigmoid2(row2.reduce((s, v, j) => s + v * beta2[j], 0)));
45744
+ };
45745
+ const predict = (x) => predictProba(x).map((pi) => pi >= 0.5 ? 1 : 0);
45746
+ return { coefficients, intercept, predictProba, predict };
45747
+ }
45748
+
45458
45749
  // src/optimization-extra.ts
45459
45750
  var _inv2 = inv;
45460
45751
  function nelderMead(f, x0, opts = {}) {
@@ -45623,10 +45914,10 @@ function kmeans(data, k, opts = {}) {
45623
45914
  if (!Number.isInteger(k) || k < 1) throw new Error("kmeans: k must be a positive integer");
45624
45915
  const d = data[0].length;
45625
45916
  if (k > n) throw new Error("kmeans: k exceeds number of points");
45626
- const mean6 = new Array(d).fill(0);
45627
- for (const p of data) for (let j = 0; j < d; j++) mean6[j] += p[j] / n;
45917
+ const mean7 = new Array(d).fill(0);
45918
+ for (const p of data) for (let j = 0; j < d; j++) mean7[j] += p[j] / n;
45628
45919
  let first = 0;
45629
- for (let i = 1; i < n; i++) if (dist2(data[i], mean6) < dist2(data[first], mean6)) first = i;
45920
+ for (let i = 1; i < n; i++) if (dist2(data[i], mean7) < dist2(data[first], mean7)) first = i;
45630
45921
  const centroids = [data[first].slice()];
45631
45922
  while (centroids.length < k) {
45632
45923
  let best = -1;
@@ -45692,6 +45983,211 @@ function spectralClustering(adjacency, k, opts = {}) {
45692
45983
  return kmeans(embed, k, opts).labels;
45693
45984
  }
45694
45985
 
45986
+ // src/ml/dbscan-knn.ts
45987
+ function euclidean(a, b) {
45988
+ let sum3 = 0;
45989
+ for (let i = 0; i < a.length; i++) {
45990
+ const d = a[i] - b[i];
45991
+ sum3 += d * d;
45992
+ }
45993
+ return Math.sqrt(sum3);
45994
+ }
45995
+ function regionQuery(points, i, eps) {
45996
+ const neighbors = [];
45997
+ for (let j = 0; j < points.length; j++) {
45998
+ if (euclidean(points[i], points[j]) <= eps) neighbors.push(j);
45999
+ }
46000
+ return neighbors;
46001
+ }
46002
+ function dbscan(points, eps, minPts) {
46003
+ const n = points.length;
46004
+ const labels = new Array(n).fill(-2);
46005
+ let clusterId = -1;
46006
+ for (let i = 0; i < n; i++) {
46007
+ if (labels[i] !== -2) continue;
46008
+ const neighbors = regionQuery(points, i, eps);
46009
+ if (neighbors.length < minPts) {
46010
+ labels[i] = -1;
46011
+ continue;
46012
+ }
46013
+ clusterId++;
46014
+ labels[i] = clusterId;
46015
+ const seeds = neighbors.filter((j) => j !== i);
46016
+ for (let s = 0; s < seeds.length; s++) {
46017
+ const j = seeds[s];
46018
+ if (labels[j] === -1) {
46019
+ labels[j] = clusterId;
46020
+ }
46021
+ if (labels[j] !== -2) continue;
46022
+ labels[j] = clusterId;
46023
+ const jNeighbors = regionQuery(points, j, eps);
46024
+ if (jNeighbors.length >= minPts) {
46025
+ for (const k of jNeighbors) {
46026
+ if (labels[k] === -2 || labels[k] === -1) seeds.push(k);
46027
+ }
46028
+ }
46029
+ }
46030
+ }
46031
+ return labels;
46032
+ }
46033
+ function kNearestIndices(train, q, k) {
46034
+ const dists = train.map((row2, i) => ({ i, d: euclidean(row2, q) }));
46035
+ dists.sort((a, b) => a.d - b.d);
46036
+ return dists.slice(0, Math.min(k, dists.length)).map((e) => e.i);
46037
+ }
46038
+ function knnClassify(train, labels, query, k) {
46039
+ return query.map((q) => {
46040
+ const idx = kNearestIndices(train, q, k);
46041
+ const counts = /* @__PURE__ */ new Map();
46042
+ for (const i of idx) {
46043
+ const lbl = labels[i];
46044
+ counts.set(lbl, (counts.get(lbl) ?? 0) + 1);
46045
+ }
46046
+ let bestLabel = labels[idx[0]];
46047
+ let bestCount = -1;
46048
+ for (const [lbl, count2] of counts) {
46049
+ if (count2 > bestCount) {
46050
+ bestCount = count2;
46051
+ bestLabel = lbl;
46052
+ }
46053
+ }
46054
+ const nearestLabel = labels[idx[0]];
46055
+ if (counts.get(nearestLabel) === bestCount) {
46056
+ bestLabel = nearestLabel;
46057
+ }
46058
+ return bestLabel;
46059
+ });
46060
+ }
46061
+ function knnRegress(train, targets, query, k) {
46062
+ return query.map((q) => {
46063
+ const idx = kNearestIndices(train, q, k);
46064
+ const sum3 = idx.reduce((acc, i) => acc + targets[i], 0);
46065
+ return sum3 / idx.length;
46066
+ });
46067
+ }
46068
+
46069
+ // src/ml/kde.ts
46070
+ var SQRT_2PI2 = Math.sqrt(2 * Math.PI);
46071
+ function standardNormalPdf(z) {
46072
+ return Math.exp(-0.5 * z * z) / SQRT_2PI2;
46073
+ }
46074
+ function sampleStd(samples, mean7) {
46075
+ const n = samples.length;
46076
+ let sumSq = 0;
46077
+ for (const s of samples) {
46078
+ const d = s - mean7;
46079
+ sumSq += d * d;
46080
+ }
46081
+ return Math.sqrt(sumSq / (n - 1));
46082
+ }
46083
+ function percentileSorted(sorted, p) {
46084
+ const n = sorted.length;
46085
+ if (n === 1) return sorted[0];
46086
+ const rank2 = p / 100 * (n - 1);
46087
+ const lo = Math.floor(rank2);
46088
+ const hi = Math.ceil(rank2);
46089
+ if (lo === hi) return sorted[lo];
46090
+ const frac = rank2 - lo;
46091
+ return sorted[lo] * (1 - frac) + sorted[hi] * frac;
46092
+ }
46093
+ function silvermanBandwidth(samples) {
46094
+ const n = samples.length;
46095
+ const mean7 = samples.reduce((a, b) => a + b, 0) / n;
46096
+ const sigma = sampleStd(samples, mean7);
46097
+ const sorted = [...samples].sort((a, b) => a - b);
46098
+ const iqr2 = percentileSorted(sorted, 75) - percentileSorted(sorted, 25);
46099
+ const spread = iqr2 > 0 ? Math.min(sigma, iqr2 / 1.34) : sigma;
46100
+ if (spread === 0) {
46101
+ throw new Error(
46102
+ "gaussianKDE: cannot derive a Silverman bandwidth from a constant sample (standard deviation and IQR are both 0); pass an explicit `bandwidth`."
46103
+ );
46104
+ }
46105
+ return 0.9 * spread * Math.pow(n, -1 / 5);
46106
+ }
46107
+ function gaussianKDE(samples, opts = {}) {
46108
+ if (samples.length === 0) {
46109
+ throw new Error("gaussianKDE: `samples` must be non-empty.");
46110
+ }
46111
+ const bandwidth = opts.bandwidth ?? silvermanBandwidth(samples);
46112
+ if (!(bandwidth > 0)) {
46113
+ throw new Error("gaussianKDE: `bandwidth` must be a positive number.");
46114
+ }
46115
+ const n = samples.length;
46116
+ const evaluate3 = (xs) => xs.map((x) => {
46117
+ let sum3 = 0;
46118
+ for (const s of samples) {
46119
+ sum3 += standardNormalPdf((x - s) / bandwidth);
46120
+ }
46121
+ return sum3 / (n * bandwidth);
46122
+ });
46123
+ return { evaluate: evaluate3, bandwidth };
46124
+ }
46125
+
46126
+ // src/stats/inference-extra.ts
46127
+ function chi2Contingency(table, opts = {}) {
46128
+ const rows = table.length;
46129
+ if (rows < 2) throw new Error("chi2Contingency: table needs at least 2 rows");
46130
+ const cols = table[0].length;
46131
+ if (cols < 2) throw new Error("chi2Contingency: table needs at least 2 columns");
46132
+ for (const row2 of table) {
46133
+ if (row2.length !== cols) throw new Error("chi2Contingency: table must be rectangular");
46134
+ }
46135
+ const rowTotals = new Array(rows).fill(0);
46136
+ const colTotals = new Array(cols).fill(0);
46137
+ let total = 0;
46138
+ for (let i = 0; i < rows; i++) {
46139
+ for (let j = 0; j < cols; j++) {
46140
+ const v = table[i][j];
46141
+ rowTotals[i] += v;
46142
+ colTotals[j] += v;
46143
+ total += v;
46144
+ }
46145
+ }
46146
+ if (total <= 0) throw new Error("chi2Contingency: table sum must be positive");
46147
+ const expected = Array.from({ length: rows }, () => new Array(cols).fill(0));
46148
+ const applyCorrection = rows === 2 && cols === 2 && opts.correction !== false;
46149
+ let chi2 = 0;
46150
+ for (let i = 0; i < rows; i++) {
46151
+ for (let j = 0; j < cols; j++) {
46152
+ const e = rowTotals[i] * colTotals[j] / total;
46153
+ expected[i][j] = e;
46154
+ if (e <= 0) continue;
46155
+ const o = table[i][j];
46156
+ const diff2 = applyCorrection ? Math.max(0, Math.abs(o - e) - 0.5) : o - e;
46157
+ chi2 += diff2 * diff2 / e;
46158
+ }
46159
+ }
46160
+ const dof = (rows - 1) * (cols - 1);
46161
+ const pValue = 1 - chiSquaredCDF(chi2, dof);
46162
+ const cramersV = Math.sqrt(chi2 / (total * Math.min(rows - 1, cols - 1)));
46163
+ return { chi2, pValue, dof, expected, cramersV };
46164
+ }
46165
+ function multipleTest(pValues, method) {
46166
+ const n = pValues.length;
46167
+ if (n === 0) return [];
46168
+ if (method === "bonferroni") {
46169
+ return pValues.map((p) => Math.min(1, p * n));
46170
+ }
46171
+ const order = pValues.map((_, i) => i).sort((a, b) => pValues[a] - pValues[b]);
46172
+ const adjusted = new Array(n);
46173
+ if (method === "holm") {
46174
+ let running2 = 0;
46175
+ for (let rank2 = 0; rank2 < n; rank2++) {
46176
+ const idx = order[rank2];
46177
+ running2 = Math.max(running2, (n - rank2) * pValues[idx]);
46178
+ adjusted[idx] = Math.min(1, running2);
46179
+ }
46180
+ return adjusted;
46181
+ }
46182
+ let running = 1;
46183
+ for (let rank2 = n - 1; rank2 >= 0; rank2--) {
46184
+ const idx = order[rank2];
46185
+ running = Math.min(running, n / (rank2 + 1) * pValues[idx]);
46186
+ adjusted[idx] = Math.min(1, running);
46187
+ }
46188
+ return adjusted;
46189
+ }
46190
+
45695
46191
  // src/numeric/bfgs.ts
45696
46192
  var CBRT_EPS = Math.cbrt(2220446049250313e-31);
45697
46193
  function numericGradient(f, x) {
@@ -45716,12 +46212,12 @@ function clipToBounds(x, bounds) {
45716
46212
  return Math.min(hi, Math.max(lo, v));
45717
46213
  });
45718
46214
  }
45719
- function dot2(a, b) {
46215
+ function dot3(a, b) {
45720
46216
  let s = 0;
45721
46217
  for (let i = 0; i < a.length; i++) s += a[i] * b[i];
45722
46218
  return s;
45723
46219
  }
45724
- function matVec(H, v) {
46220
+ function matVec2(H, v) {
45725
46221
  const n = v.length;
45726
46222
  const out = new Array(n);
45727
46223
  for (let i = 0; i < n; i++) {
@@ -45747,10 +46243,10 @@ function bfgs(f, x0, opts = {}) {
45747
46243
  let iter = 0;
45748
46244
  let converged = infNorm(g) < tol;
45749
46245
  while (!converged && iter < maxIter) {
45750
- const d = matVec(H, g).map((v) => -v);
45751
- const gd = dot2(g, d);
46246
+ const d = matVec2(H, g).map((v) => -v);
46247
+ const gd = dot3(g, d);
45752
46248
  const dir = gd < 0 ? d : g.map((v) => -v);
45753
- const dirSlope = gd < 0 ? gd : -dot2(g, g);
46249
+ const dirSlope = gd < 0 ? gd : -dot3(g, g);
45754
46250
  let alpha = 1;
45755
46251
  let xNew = clipToBounds(
45756
46252
  x.map((v, i) => v + alpha * dir[i]),
@@ -45770,11 +46266,11 @@ function bfgs(f, x0, opts = {}) {
45770
46266
  const gNew = gradOf(xNew);
45771
46267
  const s = xNew.map((v, i) => v - x[i]);
45772
46268
  const y = gNew.map((v, i) => v - g[i]);
45773
- const sy = dot2(s, y);
46269
+ const sy = dot3(s, y);
45774
46270
  if (sy > 1e-12) {
45775
46271
  const rho = 1 / sy;
45776
- const Hy = matVec(H, y);
45777
- const yHy = dot2(y, Hy);
46272
+ const Hy = matVec2(H, y);
46273
+ const yHy = dot3(y, Hy);
45778
46274
  const HNew = Array.from({ length: n }, () => new Array(n).fill(0));
45779
46275
  for (let i = 0; i < n; i++) {
45780
46276
  for (let j = 0; j < n; j++) {
@@ -45793,7 +46289,7 @@ function bfgs(f, x0, opts = {}) {
45793
46289
  }
45794
46290
 
45795
46291
  // src/numeric/nnls.ts
45796
- function matVec2(A, x) {
46292
+ function matVec3(A, x) {
45797
46293
  const m = A.length;
45798
46294
  const result = new Array(m);
45799
46295
  for (let i = 0; i < m; i++) {
@@ -45805,7 +46301,7 @@ function matVec2(A, x) {
45805
46301
  return result;
45806
46302
  }
45807
46303
  function residualNorm(A, x, b) {
45808
- const Ax = matVec2(A, x);
46304
+ const Ax = matVec3(A, x);
45809
46305
  let s = 0;
45810
46306
  for (let i = 0; i < b.length; i++) {
45811
46307
  const d = Ax[i] - b[i];
@@ -45821,7 +46317,7 @@ function nnls(A, b, opts = {}) {
45821
46317
  let x = new Array(n).fill(0);
45822
46318
  const passive = /* @__PURE__ */ new Set();
45823
46319
  const gradient2 = (xv) => {
45824
- const Ax = matVec2(A, xv);
46320
+ const Ax = matVec3(A, xv);
45825
46321
  const w = new Array(n).fill(0);
45826
46322
  for (let j = 0; j < n; j++) {
45827
46323
  let s = 0;
@@ -45889,7 +46385,7 @@ function lsqBounded(A, b, lower, upper, opts = {}) {
45889
46385
  const maxIter = opts.maxIter ?? Math.max(200, 20 * n);
45890
46386
  let x = clip(new Array(n).fill(0), lower, upper);
45891
46387
  const gradient2 = (xv) => {
45892
- const Ax = matVec2(A, xv);
46388
+ const Ax = matVec3(A, xv);
45893
46389
  const r = new Array(m);
45894
46390
  for (let i = 0; i < m; i++) r[i] = Ax[i] - b[i];
45895
46391
  const g = new Array(n).fill(0);
@@ -46197,15 +46693,15 @@ function haversine(lat1, lon1, lat2, lon2, radius = EARTH_RADIUS_KM) {
46197
46693
  const a = Math.sin(dPhi / 2) ** 2 + Math.cos(phi1) * Math.cos(phi2) * Math.sin(dLambda / 2) ** 2;
46198
46694
  return radius * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
46199
46695
  }
46200
- var dot3 = (a, b) => a.reduce((s, v, i) => s + v * b[i], 0);
46201
- var norm3 = (a) => Math.sqrt(dot3(a, a));
46696
+ var dot4 = (a, b) => a.reduce((s, v, i) => s + v * b[i], 0);
46697
+ var norm3 = (a) => Math.sqrt(dot4(a, a));
46202
46698
  function slerp(v0, v1, t) {
46203
46699
  const n0 = norm3(v0);
46204
46700
  const n16 = norm3(v1);
46205
46701
  if (n0 === 0 || n16 === 0) throw new Error("slerp: input vectors must be non-zero");
46206
46702
  const u0 = v0.map((v) => v / n0);
46207
46703
  const u1 = v1.map((v) => v / n16);
46208
- let cos2 = dot3(u0, u1);
46704
+ let cos2 = dot4(u0, u1);
46209
46705
  cos2 = cos2 > 1 ? 1 : cos2 < -1 ? -1 : cos2;
46210
46706
  const omega = Math.acos(cos2);
46211
46707
  const mag = n0 + (n16 - n0) * t;
@@ -46362,6 +46858,7 @@ export {
46362
46858
  chebyshevDistance,
46363
46859
  chebyshevFit,
46364
46860
  chebyshevT,
46861
+ chi2Contingency,
46365
46862
  chiSquareTest,
46366
46863
  chiSquaredCDF,
46367
46864
  chiSquaredDist,
@@ -46436,6 +46933,7 @@ export {
46436
46933
  curl,
46437
46934
  curvefit,
46438
46935
  dagostinoTest,
46936
+ dbscan,
46439
46937
  dct,
46440
46938
  deepEqual,
46441
46939
  degree,
@@ -46476,6 +46974,7 @@ export {
46476
46974
  efimovFactor,
46477
46975
  eigenvectorCentrality,
46478
46976
  eigs,
46977
+ elasticNet,
46479
46978
  electricConstant,
46480
46979
  electronMass,
46481
46980
  element,
@@ -46623,6 +47122,7 @@ export {
46623
47122
  gammaincp,
46624
47123
  gasConstant,
46625
47124
  gaussQuad,
47125
+ gaussianKDE,
46626
47126
  gcd,
46627
47127
  generalizedEig,
46628
47128
  geometricPMF,
@@ -46715,6 +47215,8 @@ export {
46715
47215
  kldivergence,
46716
47216
  klitzing,
46717
47217
  kmeans,
47218
+ knnClassify,
47219
+ knnRegress,
46718
47220
  kolmogorovSmirnov2Test,
46719
47221
  kolmogorovSmirnovTest,
46720
47222
  kron,
@@ -46731,6 +47233,7 @@ export {
46731
47233
  laplacianMatrix,
46732
47234
  larger,
46733
47235
  largerEq,
47236
+ lasso,
46734
47237
  lcm,
46735
47238
  leafCount,
46736
47239
  leastSquares,
@@ -46760,6 +47263,7 @@ export {
46760
47263
  logisticCDF,
46761
47264
  logisticPDF,
46762
47265
  logisticQuantile,
47266
+ logisticRegression,
46763
47267
  logsumexp,
46764
47268
  loschmidt,
46765
47269
  lowRankApprox,
@@ -46819,6 +47323,7 @@ export {
46819
47323
  multiTaperPSD,
46820
47324
  multinomial,
46821
47325
  multipleComparison,
47326
+ multipleTest,
46822
47327
  multiply,
46823
47328
  multiplyScalar,
46824
47329
  multivariateNormal,
@@ -46854,6 +47359,7 @@ export {
46854
47359
  oct,
46855
47360
  odeAdaptiveStep,
46856
47361
  odeGeneral,
47362
+ ols,
46857
47363
  ones,
46858
47364
  or,
46859
47365
  orth,
@@ -46972,6 +47478,7 @@ export {
46972
47478
  resolve,
46973
47479
  resultant,
46974
47480
  reviver,
47481
+ ridge,
46975
47482
  rightArithShift,
46976
47483
  rightLogShift,
46977
47484
  risingFactorial,