@danielsimonjr/mathts-functions 0.29.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 dot3 = 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, dot3 / (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 dot3 = 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, dot3 / (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 dot3 = v.reduce((s, c, i) => s + c * n[i], 0);
8501
- return v.map((c, i) => c - 2 * dot3 * 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 dot3 = 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 = dot3 / magSq;
8507
+ const scale = dot5 / magSq;
8508
8508
  return onto.map((c) => c * scale);
8509
8509
  }
8510
8510
  function distance2D(a, b) {
@@ -13108,7 +13108,7 @@ function quadprog(H, f, A, b) {
13108
13108
  }
13109
13109
  return x;
13110
13110
  }
13111
- function linprog(c, A, b) {
13111
+ function linprogOnePhaseLegacy(c, A, b) {
13112
13112
  const m = A.length;
13113
13113
  const n = c.length;
13114
13114
  const tableau = [];
@@ -13179,6 +13179,285 @@ function linprog(c, A, b) {
13179
13179
  }
13180
13180
  return x;
13181
13181
  }
13182
+ var LINPROG_TOL = 1e-9;
13183
+ function linprogSolveTwoPhase(costWork, Aeq, beq, hasSlack, slackCol) {
13184
+ const m = Aeq.length;
13185
+ const nw = costWork.length;
13186
+ if (m === 0) {
13187
+ for (let j = 0; j < nw; j++) {
13188
+ if (costWork[j] < -LINPROG_TOL) return { xWork: [], status: "unbounded" };
13189
+ }
13190
+ return { xWork: new Array(nw).fill(0), status: "optimal" };
13191
+ }
13192
+ const rows = [];
13193
+ const rhs = [];
13194
+ const flipped = [];
13195
+ for (let i2 = 0; i2 < m; i2++) {
13196
+ let row2 = [...Aeq[i2]];
13197
+ let b = beq[i2];
13198
+ let f = false;
13199
+ if (b < 0) {
13200
+ row2 = row2.map((v) => -v);
13201
+ b = -b;
13202
+ f = true;
13203
+ }
13204
+ rows.push(row2);
13205
+ rhs.push(b);
13206
+ flipped.push(f);
13207
+ }
13208
+ const basis = new Array(m).fill(-1);
13209
+ const artificialCols = [];
13210
+ let nextCol = nw;
13211
+ for (let i2 = 0; i2 < m; i2++) {
13212
+ if (hasSlack[i2] && !flipped[i2]) {
13213
+ basis[i2] = slackCol[i2];
13214
+ } else {
13215
+ const col = nextCol++;
13216
+ artificialCols.push(col);
13217
+ basis[i2] = col;
13218
+ }
13219
+ }
13220
+ const totalCols = nextCol;
13221
+ const isArtificial = new Array(totalCols).fill(false);
13222
+ for (const col of artificialCols) isArtificial[col] = true;
13223
+ const width = totalCols + 1;
13224
+ const tableau = [];
13225
+ for (let i2 = 0; i2 < m; i2++) {
13226
+ const row2 = new Array(width).fill(0);
13227
+ for (let j = 0; j < nw; j++) row2[j] = rows[i2][j];
13228
+ if (isArtificial[basis[i2]]) row2[basis[i2]] = 1;
13229
+ row2[totalCols] = rhs[i2];
13230
+ tableau.push(row2);
13231
+ }
13232
+ const pivot = (pr, pc, objRow) => {
13233
+ const pivotVal = tableau[pr][pc];
13234
+ for (let j = 0; j < width; j++) tableau[pr][j] /= pivotVal;
13235
+ for (let i2 = 0; i2 < tableau.length; i2++) {
13236
+ if (i2 === pr) continue;
13237
+ const factor3 = tableau[i2][pc];
13238
+ if (factor3 === 0) continue;
13239
+ for (let j = 0; j < width; j++) tableau[i2][j] -= factor3 * tableau[pr][j];
13240
+ }
13241
+ const factor2 = objRow[pc];
13242
+ if (factor2 !== 0) {
13243
+ for (let j = 0; j < width; j++) objRow[j] -= factor2 * tableau[pr][j];
13244
+ }
13245
+ };
13246
+ const buildObjRow = (costFull) => {
13247
+ const row2 = new Array(width).fill(0);
13248
+ for (let j = 0; j < totalCols; j++) row2[j] = costFull[j];
13249
+ for (let i2 = 0; i2 < tableau.length; i2++) {
13250
+ const cb = costFull[basis[i2]];
13251
+ if (cb === 0) continue;
13252
+ for (let j = 0; j < width; j++) row2[j] -= cb * tableau[i2][j];
13253
+ }
13254
+ return row2;
13255
+ };
13256
+ const runSimplex = (objRow, excluded, maxIter = 2e3) => {
13257
+ for (let iter = 0; iter < maxIter; iter++) {
13258
+ let pivotCol = -1;
13259
+ let minVal = -LINPROG_TOL;
13260
+ for (let j = 0; j < totalCols; j++) {
13261
+ if (excluded[j]) continue;
13262
+ if (objRow[j] < minVal) {
13263
+ minVal = objRow[j];
13264
+ pivotCol = j;
13265
+ }
13266
+ }
13267
+ if (pivotCol === -1) return "optimal";
13268
+ let pivotRow = -1;
13269
+ let minRatio = Infinity;
13270
+ for (let i2 = 0; i2 < tableau.length; i2++) {
13271
+ if (tableau[i2][pivotCol] > LINPROG_TOL) {
13272
+ const ratio = tableau[i2][totalCols] / tableau[i2][pivotCol];
13273
+ if (ratio < minRatio - 1e-12) {
13274
+ minRatio = ratio;
13275
+ pivotRow = i2;
13276
+ }
13277
+ }
13278
+ }
13279
+ if (pivotRow === -1) return "unbounded";
13280
+ basis[pivotRow] = pivotCol;
13281
+ pivot(pivotRow, pivotCol, objRow);
13282
+ }
13283
+ return "optimal";
13284
+ };
13285
+ const noExclusions = new Array(totalCols).fill(false);
13286
+ const cost1 = new Array(totalCols).fill(0);
13287
+ for (const col of artificialCols) cost1[col] = 1;
13288
+ const objRow1 = buildObjRow(cost1);
13289
+ const phase1Status = runSimplex(objRow1, noExclusions);
13290
+ if (phase1Status === "unbounded") return { xWork: [], status: "infeasible" };
13291
+ let phase1Obj = 0;
13292
+ for (let i2 = 0; i2 < tableau.length; i2++) phase1Obj += cost1[basis[i2]] * tableau[i2][totalCols];
13293
+ if (phase1Obj > 1e-7) return { xWork: [], status: "infeasible" };
13294
+ let i = 0;
13295
+ while (i < tableau.length) {
13296
+ if (!isArtificial[basis[i]]) {
13297
+ i++;
13298
+ continue;
13299
+ }
13300
+ let pc = -1;
13301
+ for (let j = 0; j < nw; j++) {
13302
+ if (Math.abs(tableau[i][j]) > 1e-8) {
13303
+ pc = j;
13304
+ break;
13305
+ }
13306
+ }
13307
+ if (pc === -1) {
13308
+ tableau.splice(i, 1);
13309
+ basis.splice(i, 1);
13310
+ continue;
13311
+ }
13312
+ basis[i] = pc;
13313
+ pivot(i, pc, new Array(width).fill(0));
13314
+ i++;
13315
+ }
13316
+ const costFull2 = new Array(totalCols).fill(0);
13317
+ for (let j = 0; j < nw; j++) costFull2[j] = costWork[j];
13318
+ const objRow2 = buildObjRow(costFull2);
13319
+ const excludeArtificial = isArtificial.slice();
13320
+ const phase2Status = runSimplex(objRow2, excludeArtificial);
13321
+ if (phase2Status === "unbounded") return { xWork: [], status: "unbounded" };
13322
+ const xWork = new Array(nw).fill(0);
13323
+ for (let r = 0; r < tableau.length; r++) {
13324
+ if (basis[r] < nw) xWork[basis[r]] = Math.max(0, tableau[r][totalCols]);
13325
+ }
13326
+ return { xWork, status: "optimal" };
13327
+ }
13328
+ function linprogTwoPhase(c, opts) {
13329
+ const n = c.length;
13330
+ const boundsResolved = [];
13331
+ for (let j = 0; j < n; j++) {
13332
+ const b = opts.bounds?.[j];
13333
+ boundsResolved.push(b ? [b[0], b[1]] : [0, null]);
13334
+ }
13335
+ let col = 0;
13336
+ const expansions = [];
13337
+ for (let j = 0; j < n; j++) {
13338
+ const low = boundsResolved[j][0];
13339
+ if (low === null) {
13340
+ const colPos = col++;
13341
+ const colNeg = col++;
13342
+ expansions.push({ kind: "split", colPos, colNeg });
13343
+ } else {
13344
+ const c0 = col++;
13345
+ expansions.push({ kind: "shift", col: c0, shift: low });
13346
+ }
13347
+ }
13348
+ const nx = col;
13349
+ const expandRow = (row2) => {
13350
+ const out = new Array(nx).fill(0);
13351
+ for (let j = 0; j < n; j++) {
13352
+ const coeff = row2[j] ?? 0;
13353
+ if (coeff === 0) continue;
13354
+ const e = expansions[j];
13355
+ if (e.kind === "shift") out[e.col] += coeff;
13356
+ else {
13357
+ out[e.colPos] += coeff;
13358
+ out[e.colNeg] -= coeff;
13359
+ }
13360
+ }
13361
+ return out;
13362
+ };
13363
+ const shiftedRhs = (row2, rhsVal) => {
13364
+ let r = rhsVal;
13365
+ for (let j = 0; j < n; j++) {
13366
+ const e = expansions[j];
13367
+ if (e.kind === "shift" && e.shift !== 0) r -= (row2[j] ?? 0) * e.shift;
13368
+ }
13369
+ return r;
13370
+ };
13371
+ let constant = 0;
13372
+ const cWork = new Array(nx).fill(0);
13373
+ for (let j = 0; j < n; j++) {
13374
+ const e = expansions[j];
13375
+ if (e.kind === "shift") {
13376
+ cWork[e.col] = c[j];
13377
+ constant += c[j] * e.shift;
13378
+ } else {
13379
+ cWork[e.colPos] = c[j];
13380
+ cWork[e.colNeg] = -c[j];
13381
+ }
13382
+ }
13383
+ const ubRows = [];
13384
+ const ubRhs = [];
13385
+ const A_ub = opts.A_ub ?? [];
13386
+ const b_ub = opts.b_ub ?? [];
13387
+ for (let i = 0; i < A_ub.length; i++) {
13388
+ ubRows.push(expandRow(A_ub[i]));
13389
+ ubRhs.push(shiftedRhs(A_ub[i], b_ub[i]));
13390
+ }
13391
+ for (let j = 0; j < n; j++) {
13392
+ const high = boundsResolved[j][1];
13393
+ if (high === null) continue;
13394
+ const e = expansions[j];
13395
+ const row2 = new Array(nx).fill(0);
13396
+ let rhsVal;
13397
+ if (e.kind === "shift") {
13398
+ row2[e.col] = 1;
13399
+ rhsVal = high - e.shift;
13400
+ } else {
13401
+ row2[e.colPos] = 1;
13402
+ row2[e.colNeg] = -1;
13403
+ rhsVal = high;
13404
+ }
13405
+ ubRows.push(row2);
13406
+ ubRhs.push(rhsVal);
13407
+ }
13408
+ const A_eq = opts.A_eq ?? [];
13409
+ const b_eq = opts.b_eq ?? [];
13410
+ const eqRows = [];
13411
+ const eqRhs = [];
13412
+ for (let i = 0; i < A_eq.length; i++) {
13413
+ eqRows.push(expandRow(A_eq[i]));
13414
+ eqRhs.push(shiftedRhs(A_eq[i], b_eq[i]));
13415
+ }
13416
+ const mUb = ubRows.length;
13417
+ const mEq = eqRows.length;
13418
+ const nw = nx + mUb;
13419
+ const Aeq = [];
13420
+ const beq = [];
13421
+ const hasSlack = [];
13422
+ const slackCol = [];
13423
+ for (let i = 0; i < mUb; i++) {
13424
+ const row2 = new Array(nw).fill(0);
13425
+ for (let j = 0; j < nx; j++) row2[j] = ubRows[i][j];
13426
+ row2[nx + i] = 1;
13427
+ Aeq.push(row2);
13428
+ beq.push(ubRhs[i]);
13429
+ hasSlack.push(true);
13430
+ slackCol.push(nx + i);
13431
+ }
13432
+ for (let i = 0; i < mEq; i++) {
13433
+ const row2 = new Array(nw).fill(0);
13434
+ for (let j = 0; j < nx; j++) row2[j] = eqRows[i][j];
13435
+ Aeq.push(row2);
13436
+ beq.push(eqRhs[i]);
13437
+ hasSlack.push(false);
13438
+ slackCol.push(-1);
13439
+ }
13440
+ const costWorkFull = new Array(nw).fill(0);
13441
+ for (let j = 0; j < nx; j++) costWorkFull[j] = cWork[j];
13442
+ const raw = linprogSolveTwoPhase(costWorkFull, Aeq, beq, hasSlack, slackCol);
13443
+ if (raw.status !== "optimal") {
13444
+ return { x: new Array(n).fill(NaN), fun: NaN, success: false, status: raw.status };
13445
+ }
13446
+ const x = new Array(n).fill(0);
13447
+ for (let j = 0; j < n; j++) {
13448
+ const e = expansions[j];
13449
+ x[j] = e.kind === "shift" ? raw.xWork[e.col] + e.shift : raw.xWork[e.colPos] - raw.xWork[e.colNeg];
13450
+ }
13451
+ let fun = constant;
13452
+ for (let j = 0; j < nx; j++) fun += cWork[j] * raw.xWork[j];
13453
+ return { x, fun, success: true, status: "optimal" };
13454
+ }
13455
+ function linprog(c, arg22, arg3) {
13456
+ if (Array.isArray(arg22)) {
13457
+ return linprogOnePhaseLegacy(c, arg22, arg3);
13458
+ }
13459
+ return linprogTwoPhase(c, arg22);
13460
+ }
13182
13461
  function solvePDE(pde, domain, bc) {
13183
13462
  const { alpha } = pde;
13184
13463
  const { L, nx, nt, T } = domain;
@@ -13883,26 +14162,26 @@ function _splitSeed(baseSeed, k) {
13883
14162
  function _aggregateRanks(vectors, aggregation) {
13884
14163
  const n = vectors[0].length;
13885
14164
  const count2 = vectors.length;
13886
- const mean6 = new Float64Array(n);
14165
+ const mean7 = new Float64Array(n);
13887
14166
  for (const v of vectors) {
13888
- for (let i = 0; i < n; i++) mean6[i] += v[i];
14167
+ for (let i = 0; i < n; i++) mean7[i] += v[i];
13889
14168
  }
13890
- for (let i = 0; i < n; i++) mean6[i] /= count2;
14169
+ for (let i = 0; i < n; i++) mean7[i] /= count2;
13891
14170
  if (aggregation === "mean") {
13892
- return { ranks: mean6 };
14171
+ return { ranks: mean7 };
13893
14172
  }
13894
14173
  const std2 = new Float64Array(n);
13895
14174
  for (const v of vectors) {
13896
14175
  for (let i = 0; i < n; i++) {
13897
- const d = v[i] - mean6[i];
14176
+ const d = v[i] - mean7[i];
13898
14177
  std2[i] += d * d;
13899
14178
  }
13900
14179
  }
13901
14180
  for (let i = 0; i < n; i++) std2[i] = Math.sqrt(std2[i] / count2);
13902
14181
  return {
13903
- ranks: mean6,
14182
+ ranks: mean7,
13904
14183
  ranksPerRestart: vectors,
13905
- restartStats: { mean: mean6, std: std2 }
14184
+ restartStats: { mean: mean7, std: std2 }
13906
14185
  };
13907
14186
  }
13908
14187
  function _pageRankOnce(adj, d, maxIter, tol, seed) {
@@ -14035,26 +14314,26 @@ function _betweennessOnce(adj, directed, normalise, seed) {
14035
14314
  function _aggregateBetweenness(vectors, aggregation) {
14036
14315
  const n = vectors[0].length;
14037
14316
  const count2 = vectors.length;
14038
- const mean6 = new Float64Array(n);
14317
+ const mean7 = new Float64Array(n);
14039
14318
  for (const v of vectors) {
14040
- for (let i = 0; i < n; i++) mean6[i] += v[i];
14319
+ for (let i = 0; i < n; i++) mean7[i] += v[i];
14041
14320
  }
14042
- for (let i = 0; i < n; i++) mean6[i] /= count2;
14321
+ for (let i = 0; i < n; i++) mean7[i] /= count2;
14043
14322
  if (aggregation === "mean") {
14044
- return { centrality: mean6 };
14323
+ return { centrality: mean7 };
14045
14324
  }
14046
14325
  const std2 = new Float64Array(n);
14047
14326
  for (const v of vectors) {
14048
14327
  for (let i = 0; i < n; i++) {
14049
- const d = v[i] - mean6[i];
14328
+ const d = v[i] - mean7[i];
14050
14329
  std2[i] += d * d;
14051
14330
  }
14052
14331
  }
14053
14332
  for (let i = 0; i < n; i++) std2[i] = Math.sqrt(std2[i] / count2);
14054
14333
  return {
14055
- centrality: mean6,
14334
+ centrality: mean7,
14056
14335
  centralityPerRestart: vectors,
14057
- restartStats: { mean: mean6, std: std2 }
14336
+ restartStats: { mean: mean7, std: std2 }
14058
14337
  };
14059
14338
  }
14060
14339
  async function betweennessCentrality(adj, opts) {
@@ -14118,41 +14397,41 @@ function _aggregateEigenvector(vectors, aggregation) {
14118
14397
  const count2 = vectors.length;
14119
14398
  const ref = vectors[0];
14120
14399
  const aligned = vectors.map((v) => {
14121
- let dot3 = 0;
14122
- for (let i = 0; i < n; i++) dot3 += v[i] * ref[i];
14123
- if (dot3 < 0) {
14400
+ let dot5 = 0;
14401
+ for (let i = 0; i < n; i++) dot5 += v[i] * ref[i];
14402
+ if (dot5 < 0) {
14124
14403
  const flipped = new Float64Array(n);
14125
14404
  for (let i = 0; i < n; i++) flipped[i] = -v[i];
14126
14405
  return flipped;
14127
14406
  }
14128
14407
  return v;
14129
14408
  });
14130
- const mean6 = new Float64Array(n);
14409
+ const mean7 = new Float64Array(n);
14131
14410
  for (const v of aligned) {
14132
- for (let i = 0; i < n; i++) mean6[i] += v[i];
14411
+ for (let i = 0; i < n; i++) mean7[i] += v[i];
14133
14412
  }
14134
- for (let i = 0; i < n; i++) mean6[i] /= count2;
14413
+ for (let i = 0; i < n; i++) mean7[i] /= count2;
14135
14414
  let norm4 = 0;
14136
- 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];
14137
14416
  norm4 = Math.sqrt(norm4);
14138
14417
  if (norm4 > 1e-15) {
14139
- for (let i = 0; i < n; i++) mean6[i] /= norm4;
14418
+ for (let i = 0; i < n; i++) mean7[i] /= norm4;
14140
14419
  }
14141
14420
  if (aggregation === "mean") {
14142
- return { centrality: mean6 };
14421
+ return { centrality: mean7 };
14143
14422
  }
14144
14423
  const std2 = new Float64Array(n);
14145
14424
  for (const v of aligned) {
14146
14425
  for (let i = 0; i < n; i++) {
14147
- const d = v[i] - mean6[i];
14426
+ const d = v[i] - mean7[i];
14148
14427
  std2[i] += d * d;
14149
14428
  }
14150
14429
  }
14151
14430
  for (let i = 0; i < n; i++) std2[i] = Math.sqrt(std2[i] / count2);
14152
14431
  return {
14153
- centrality: mean6,
14432
+ centrality: mean7,
14154
14433
  centralityPerRestart: aligned,
14155
- restartStats: { mean: mean6, std: std2 }
14434
+ restartStats: { mean: mean7, std: std2 }
14156
14435
  };
14157
14436
  }
14158
14437
  async function eigenvectorCentrality(adj, opts) {
@@ -14931,7 +15210,7 @@ function hypergeometricDist(population, successes, draws) {
14931
15210
  for (let i = kMin; i <= kk; i++) sum3 += pmf(i);
14932
15211
  return Math.min(1, sum3);
14933
15212
  };
14934
- const mean6 = N * K / M;
15213
+ const mean7 = N * K / M;
14935
15214
  const variance2 = N * (K / M) * ((M - K) / M) * ((M - N) / (M - 1));
14936
15215
  return {
14937
15216
  pdf: pmf,
@@ -14942,7 +15221,7 @@ function hypergeometricDist(population, successes, draws) {
14942
15221
  for (let k = kMin; k <= kMax; k++) if (cdf(k) >= p) return k;
14943
15222
  return kMax;
14944
15223
  },
14945
- mean: mean6,
15224
+ mean: mean7,
14946
15225
  variance: variance2,
14947
15226
  sample: () => _discreteSample(cdf, Math.random, kMax),
14948
15227
  sampleN: (n, opts) => _sampleNDispatch(null, [], n, opts, (count2, rng) => {
@@ -14964,7 +15243,7 @@ function negativeBinomialDist(r, p) {
14964
15243
  if (k < 0) return 0;
14965
15244
  return Math.min(1, _betainc(p, r, Math.floor(k) + 1));
14966
15245
  };
14967
- const mean6 = r * (1 - p) / p;
15246
+ const mean7 = r * (1 - p) / p;
14968
15247
  const variance2 = r * (1 - p) / (p * p);
14969
15248
  return {
14970
15249
  pdf: pmf,
@@ -14979,12 +15258,12 @@ function negativeBinomialDist(r, p) {
14979
15258
  }
14980
15259
  return Infinity;
14981
15260
  },
14982
- mean: mean6,
15261
+ mean: mean7,
14983
15262
  variance: variance2,
14984
- 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)),
14985
15264
  sampleN: (n, opts) => _sampleNDispatch(null, [], n, opts, (count2, rng) => {
14986
15265
  const out = new Float64Array(count2);
14987
- const cap = Math.ceil(mean6 + 20 * Math.sqrt(variance2) + 20);
15266
+ const cap = Math.ceil(mean7 + 20 * Math.sqrt(variance2) + 20);
14988
15267
  for (let j = 0; j < count2; j++) out[j] = _discreteSample(cdf, rng, cap);
14989
15268
  return out;
14990
15269
  })
@@ -15163,8 +15442,8 @@ function _cholesky(m) {
15163
15442
  }
15164
15443
  return L;
15165
15444
  }
15166
- function multivariateNormal(mean6, cov2) {
15167
- const k = mean6.length;
15445
+ function multivariateNormal(mean7, cov2) {
15446
+ const k = mean7.length;
15168
15447
  if (cov2.length !== k || cov2.some((row2) => row2.length !== k)) {
15169
15448
  throw new Error("multivariateNormal: cov must be a k\xD7k matrix matching mean");
15170
15449
  }
@@ -15172,13 +15451,13 @@ function multivariateNormal(mean6, cov2) {
15172
15451
  let logDet = 0;
15173
15452
  for (let i = 0; i < k; i++) logDet += 2 * Math.log(L[i][i]);
15174
15453
  return {
15175
- mean: mean6,
15454
+ mean: mean7,
15176
15455
  cov: cov2,
15177
15456
  pdf: (x) => {
15178
15457
  if (x.length !== k) throw new Error("multivariateNormal.pdf: x must have length k");
15179
15458
  const z = new Array(k).fill(0);
15180
15459
  for (let i = 0; i < k; i++) {
15181
- let s = x[i] - mean6[i];
15460
+ let s = x[i] - mean7[i];
15182
15461
  for (let j = 0; j < i; j++) s -= L[i][j] * z[j];
15183
15462
  z[i] = s / L[i][i];
15184
15463
  }
@@ -15243,11 +15522,11 @@ function _bootstrapSummary(stats) {
15243
15522
  if (n === 0) return { bootstrapMean: NaN, bootstrapStd: NaN };
15244
15523
  let sum3 = 0;
15245
15524
  for (let i = 0; i < n; i++) sum3 += stats[i];
15246
- const mean6 = sum3 / n;
15525
+ const mean7 = sum3 / n;
15247
15526
  let sq = 0;
15248
- 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;
15249
15528
  const std2 = n > 1 ? Math.sqrt(sq / (n - 1)) : 0;
15250
- return { bootstrapMean: mean6, bootstrapStd: std2 };
15529
+ return { bootstrapMean: mean7, bootstrapStd: std2 };
15251
15530
  }
15252
15531
  function _mean(arr7) {
15253
15532
  let sum3 = 0;
@@ -15971,9 +16250,9 @@ function principalComponentAnalysis(data, k) {
15971
16250
  const explained = eigenvalues.map((ev) => totalVar > 0 ? Math.abs(ev) / totalVar : 0);
15972
16251
  const scores = centered.map((row2) => {
15973
16252
  return eigenvectors.map((ev) => {
15974
- let dot3 = 0;
15975
- for (let j = 0; j < p; j++) dot3 += row2[j] * ev[j];
15976
- return dot3;
16253
+ let dot5 = 0;
16254
+ for (let j = 0; j < p; j++) dot5 += row2[j] * ev[j];
16255
+ return dot5;
15977
16256
  });
15978
16257
  });
15979
16258
  return { components: eigenvectors, explained, scores };
@@ -16014,7 +16293,7 @@ function _median(arr7) {
16014
16293
  const m = n >> 1;
16015
16294
  return n % 2 === 1 ? s[m] : (s[m - 1] + s[m]) / 2;
16016
16295
  }
16017
- function leveneTest(groups, center = "median") {
16296
+ function leveneTest(groups, center2 = "median") {
16018
16297
  const k = groups.length;
16019
16298
  if (k < 2) throw new Error("leveneTest: need at least 2 groups");
16020
16299
  let N = 0;
@@ -16023,7 +16302,7 @@ function leveneTest(groups, center = "median") {
16023
16302
  N += g.length;
16024
16303
  }
16025
16304
  const z = groups.map((g) => {
16026
- const c = center === "median" ? _median(g) : _mean(g);
16305
+ const c = center2 === "median" ? _median(g) : _mean(g);
16027
16306
  return g.map((x) => Math.abs(x - c));
16028
16307
  });
16029
16308
  const allZ = [];
@@ -16131,13 +16410,13 @@ function andersonDarlingTest(data) {
16131
16410
  const n = data.length;
16132
16411
  if (n < 8) throw new Error("andersonDarlingTest: need at least 8 observations");
16133
16412
  const sorted = data.slice().sort((p2, q) => p2 - q);
16134
- const mean6 = _mean(sorted);
16413
+ const mean7 = _mean(sorted);
16135
16414
  const s = Math.sqrt(_variance(sorted, 1));
16136
16415
  const phi = (z) => 0.5 * erfcScalar(-z / Math.SQRT2);
16137
16416
  let sumTerm = 0;
16138
16417
  for (let i = 0; i < n; i++) {
16139
- const wi = (sorted[i] - mean6) / s;
16140
- const wj = (sorted[n - 1 - i] - mean6) / s;
16418
+ const wi = (sorted[i] - mean7) / s;
16419
+ const wj = (sorted[n - 1 - i] - mean7) / s;
16141
16420
  sumTerm += (2 * (i + 1) - 1) / n * (Math.log(phi(wi)) + Math.log(1 - phi(wj)));
16142
16421
  }
16143
16422
  const a2 = -n - sumTerm;
@@ -16584,30 +16863,30 @@ function hessenbergForm(A) {
16584
16863
  if (normV < 1e-30) continue;
16585
16864
  const beta2 = 2 / normV;
16586
16865
  for (let j = k; j < n; j++) {
16587
- let dot3 = 0;
16866
+ let dot5 = 0;
16588
16867
  for (let i = 0; i < len; i++) {
16589
- dot3 += v[i] * H[k + 1 + i][j];
16868
+ dot5 += v[i] * H[k + 1 + i][j];
16590
16869
  }
16591
16870
  for (let i = 0; i < len; i++) {
16592
- H[k + 1 + i][j] -= beta2 * v[i] * dot3;
16871
+ H[k + 1 + i][j] -= beta2 * v[i] * dot5;
16593
16872
  }
16594
16873
  }
16595
16874
  for (let i = 0; i < n; i++) {
16596
- let dot3 = 0;
16875
+ let dot5 = 0;
16597
16876
  for (let j = 0; j < len; j++) {
16598
- dot3 += H[i][k + 1 + j] * v[j];
16877
+ dot5 += H[i][k + 1 + j] * v[j];
16599
16878
  }
16600
16879
  for (let j = 0; j < len; j++) {
16601
- H[i][k + 1 + j] -= beta2 * dot3 * v[j];
16880
+ H[i][k + 1 + j] -= beta2 * dot5 * v[j];
16602
16881
  }
16603
16882
  }
16604
16883
  for (let i = 0; i < n; i++) {
16605
- let dot3 = 0;
16884
+ let dot5 = 0;
16606
16885
  for (let j = 0; j < len; j++) {
16607
- dot3 += Q2[i][k + 1 + j] * v[j];
16886
+ dot5 += Q2[i][k + 1 + j] * v[j];
16608
16887
  }
16609
16888
  for (let j = 0; j < len; j++) {
16610
- Q2[i][k + 1 + j] -= beta2 * dot3 * v[j];
16889
+ Q2[i][k + 1 + j] -= beta2 * dot5 * v[j];
16611
16890
  }
16612
16891
  }
16613
16892
  }
@@ -22399,10 +22678,10 @@ var dependencies85 = ["typed", "transpose", "conj"];
22399
22678
  var createCtranspose = /* @__PURE__ */ factory(
22400
22679
  name85,
22401
22680
  dependencies85,
22402
- ({ typed: typed3, transpose: transpose3, conj: conj3 }) => {
22681
+ ({ typed: typed3, transpose: transpose4, conj: conj3 }) => {
22403
22682
  return typed3(name85, {
22404
22683
  any: function(x) {
22405
- return conj3(transpose3(x));
22684
+ return conj3(transpose4(x));
22406
22685
  }
22407
22686
  });
22408
22687
  }
@@ -23392,7 +23671,7 @@ var dependencies98 = ["add", "multiply", "transpose"];
23392
23671
  var createCsAmd = /* @__PURE__ */ factory(
23393
23672
  name98,
23394
23673
  dependencies98,
23395
- ({ add: add2, multiply: multiply2, transpose: transpose3 }) => {
23674
+ ({ add: add2, multiply: multiply2, transpose: transpose4 }) => {
23396
23675
  function _tryWasmAmd(a, n) {
23397
23676
  const wasm = wasmLoader.getModule();
23398
23677
  if (!wasm || !a._ptr || !a._index) return null;
@@ -23686,7 +23965,7 @@ var createCsAmd = /* @__PURE__ */ factory(
23686
23965
  return P2;
23687
23966
  };
23688
23967
  function _createTargetMatrix(order, a, m, n, dense) {
23689
- const at = transpose3(a);
23968
+ const at = transpose4(a);
23690
23969
  if (order === 1 && n === m) {
23691
23970
  return add2(a, at);
23692
23971
  }
@@ -23705,7 +23984,7 @@ var createCsAmd = /* @__PURE__ */ factory(
23705
23984
  }
23706
23985
  }
23707
23986
  tptr[m] = p2;
23708
- a = transpose3(at);
23987
+ a = transpose4(at);
23709
23988
  return multiply2(at, a);
23710
23989
  }
23711
23990
  return multiply2(at, a);
@@ -23806,7 +24085,7 @@ var dependencies99 = ["transpose"];
23806
24085
  var createCsCounts = /* @__PURE__ */ factory(
23807
24086
  name99,
23808
24087
  dependencies99,
23809
- ({ transpose: transpose3 }) => {
24088
+ ({ transpose: transpose4 }) => {
23810
24089
  function _tryWasmCounts(a, parent, post, n) {
23811
24090
  const wasm = wasmLoader.getModule();
23812
24091
  if (!wasm || n < WASM_COUNTS_THRESHOLD || !a._index || !a._ptr) return null;
@@ -23868,7 +24147,7 @@ var createCsCounts = /* @__PURE__ */ factory(
23868
24147
  w[k] = -1;
23869
24148
  }
23870
24149
  const colcount = [];
23871
- const at = transpose3(a);
24150
+ const at = transpose4(a);
23872
24151
  const tindex = at._index;
23873
24152
  const tptr = at._ptr;
23874
24153
  for (k = 0; k < n; k++) {
@@ -24037,9 +24316,9 @@ var dependencies100 = ["add", "multiply", "transpose"];
24037
24316
  var createCsSqr = /* @__PURE__ */ factory(
24038
24317
  name100,
24039
24318
  dependencies100,
24040
- ({ add: add2, multiply: multiply2, transpose: transpose3 }) => {
24041
- const csAmd2 = createCsAmd({ add: add2, multiply: multiply2, transpose: transpose3 });
24042
- 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 });
24043
24322
  return function csSqr2(order, a, qr2) {
24044
24323
  const aptr = a._ptr;
24045
24324
  const asize = a._size;
@@ -29919,7 +30198,7 @@ var createPinv = /* @__PURE__ */ factory(
29919
30198
  deepEqual: deepEqual3,
29920
30199
  equal: equal2,
29921
30200
  dotDivide: dotDivide2,
29922
- dot: dot3,
30201
+ dot: dot5,
29923
30202
  ctranspose: ctranspose2,
29924
30203
  divideScalar: divideScalar2,
29925
30204
  multiply: multiply2,
@@ -29935,7 +30214,7 @@ var createPinv = /* @__PURE__ */ factory(
29935
30214
  if (size2[0] === 1) {
29936
30215
  return inv2(x);
29937
30216
  } else {
29938
- return dotDivide2(ctranspose2(x), dot3(x, x));
30217
+ return dotDivide2(ctranspose2(x), dot5(x, x));
29939
30218
  }
29940
30219
  case 2: {
29941
30220
  if (_isZeros(x)) return ctranspose2(x);
@@ -30014,8 +30293,8 @@ var createPinv = /* @__PURE__ */ factory(
30014
30293
  }
30015
30294
  function _rankFact(mat, rows, cols) {
30016
30295
  const rref = _rref(mat, rows, cols);
30017
- const C = mat.map((row2) => row2.filter((_, j) => j < rows && !_isZero(dot3(rref[j], rref[j]))));
30018
- const F = rref.filter((_, i) => !_isZero(dot3(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])));
30019
30298
  return { C, F };
30020
30299
  }
30021
30300
  function _isZero(x) {
@@ -34748,14 +35027,14 @@ var createSlu = /* @__PURE__ */ factory(
34748
35027
  abs: abs2,
34749
35028
  add: add2,
34750
35029
  multiply: multiply2,
34751
- transpose: transpose3,
35030
+ transpose: transpose4,
34752
35031
  divideScalar: divideScalar2,
34753
35032
  subtract: subtract2,
34754
35033
  larger: larger2,
34755
35034
  largerEq: largerEq2,
34756
35035
  SparseMatrix
34757
35036
  }) => {
34758
- const csSqr2 = createCsSqr({ add: add2, multiply: multiply2, transpose: transpose3 });
35037
+ const csSqr2 = createCsSqr({ add: add2, multiply: multiply2, transpose: transpose4 });
34759
35038
  const csLu2 = createCsLu({
34760
35039
  abs: abs2,
34761
35040
  divideScalar: divideScalar2,
@@ -35509,10 +35788,10 @@ var createVariance = /* @__PURE__ */ factory(
35509
35788
  }
35510
35789
  });
35511
35790
  if (num2 === 0) throw new Error("Cannot calculate variance of an empty array");
35512
- const mean6 = divide2(sum3, num2);
35791
+ const mean7 = divide2(sum3, num2);
35513
35792
  sum3 = void 0;
35514
35793
  deepForEach2(array, function(value) {
35515
- const diff2 = subtract2(value, mean6);
35794
+ const diff2 = subtract2(value, mean7);
35516
35795
  sum3 = sum3 === void 0 ? multiply2(diff2, diff2) : add2(sum3, multiply2(diff2, diff2));
35517
35796
  });
35518
35797
  if (mathIsNaN(sum3)) {
@@ -36978,7 +37257,7 @@ function createComplexEigs({
36978
37257
  larger: larger2,
36979
37258
  smaller: smaller2,
36980
37259
  matrixFromColumns: _matrixFromColumns,
36981
- dot: dot3
37260
+ dot: dot5
36982
37261
  }) {
36983
37262
  function complexEigs(arr7, N, prec, type, findVectors = true) {
36984
37263
  if (!findVectors && type === "number" && N * N >= WASM_EIGS_THRESHOLD) {
@@ -37419,7 +37698,7 @@ function createComplexEigs({
37419
37698
  v = subtract2(
37420
37699
  v,
37421
37700
  multiply2(
37422
- divideScalar2(dot3(w, v), dot3(w, w)),
37701
+ divideScalar2(dot5(w, v), dot5(w, w)),
37423
37702
  w
37424
37703
  )
37425
37704
  );
@@ -37427,7 +37706,7 @@ function createComplexEigs({
37427
37706
  return v;
37428
37707
  }
37429
37708
  function norm4(v) {
37430
- return abs2(sqrt2(dot3(v, v)));
37709
+ return abs2(sqrt2(dot5(v, v)));
37431
37710
  }
37432
37711
  function normalize2(v, type) {
37433
37712
  const big = type === "BigNumber";
@@ -37847,7 +38126,7 @@ var createEigs = /* @__PURE__ */ factory(
37847
38126
  re: re3,
37848
38127
  smaller: smaller2,
37849
38128
  matrixFromColumns: matrixFromColumns2,
37850
- dot: dot3
38129
+ dot: dot5
37851
38130
  }) => {
37852
38131
  const doRealSymmetric = createRealSymmetric({
37853
38132
  config: config2,
@@ -37886,7 +38165,7 @@ var createEigs = /* @__PURE__ */ factory(
37886
38165
  larger: larger2,
37887
38166
  smaller: smaller2,
37888
38167
  matrixFromColumns: matrixFromColumns2,
37889
- dot: dot3
38168
+ dot: dot5
37890
38169
  });
37891
38170
  return typed3("eigs", {
37892
38171
  // The conversion to matrix in the first two implementations,
@@ -40868,7 +41147,7 @@ var createSylvester = /* @__PURE__ */ factory(
40868
41147
  multiply: multiply2,
40869
41148
  range: range2,
40870
41149
  concat: concat3,
40871
- transpose: transpose3,
41150
+ transpose: transpose4,
40872
41151
  index,
40873
41152
  subset: subset2,
40874
41153
  add: add2,
@@ -40910,7 +41189,7 @@ var createSylvester = /* @__PURE__ */ factory(
40910
41189
  const sB = schur2(multiply2(-1, B));
40911
41190
  const G = sB.T;
40912
41191
  const V = sB.U;
40913
- const D = multiply2(multiply2(transpose3(U), C), V);
41192
+ const D = multiply2(multiply2(transpose4(U), C), V);
40914
41193
  const all = range2(0, m);
40915
41194
  const y = [];
40916
41195
  const hc = (a, b) => concat3(a, b, 1);
@@ -40944,7 +41223,7 @@ var createSylvester = /* @__PURE__ */ factory(
40944
41223
  }
40945
41224
  }
40946
41225
  const Y = matrix2(matrixFromColumns2(...y));
40947
- const X = multiply2(U, multiply2(Y, transpose3(V)));
41226
+ const X = multiply2(U, multiply2(Y, transpose4(V)));
40948
41227
  return X;
40949
41228
  }
40950
41229
  }
@@ -40956,21 +41235,21 @@ var dependencies253 = ["typed", "matrix", "sylvester", "multiply", "transpose"];
40956
41235
  var createLyap = /* @__PURE__ */ factory(
40957
41236
  name253,
40958
41237
  dependencies253,
40959
- ({ typed: typed3, matrix: matrix2, sylvester: sylvester2, multiply: multiply2, transpose: transpose3 }) => {
41238
+ ({ typed: typed3, matrix: matrix2, sylvester: sylvester2, multiply: multiply2, transpose: transpose4 }) => {
40960
41239
  return typed3(name253, {
40961
41240
  "Matrix, Matrix": function(A, Q2) {
40962
- return sylvester2(A, transpose3(A), multiply2(-1, Q2));
41241
+ return sylvester2(A, transpose4(A), multiply2(-1, Q2));
40963
41242
  },
40964
41243
  "Array, Matrix": function(A, Q2) {
40965
- return sylvester2(matrix2(A), transpose3(matrix2(A)), multiply2(-1, Q2));
41244
+ return sylvester2(matrix2(A), transpose4(matrix2(A)), multiply2(-1, Q2));
40966
41245
  },
40967
41246
  "Matrix, Array": function(A, Q2) {
40968
- return sylvester2(A, transpose3(A), matrix2(multiply2(-1, Q2)));
41247
+ return sylvester2(A, transpose4(A), matrix2(multiply2(-1, Q2)));
40969
41248
  },
40970
41249
  "Array, Array": function(A, Q2) {
40971
41250
  return sylvester2(
40972
41251
  matrix2(A),
40973
- transpose3(matrix2(A)),
41252
+ transpose4(matrix2(A)),
40974
41253
  matrix2(multiply2(-1, Q2))
40975
41254
  ).toArray();
40976
41255
  }
@@ -44978,16 +45257,16 @@ function fsolve(F, x0, opts = {}) {
44978
45257
  const msg = err instanceof Error ? err.message : String(err);
44979
45258
  throw new Error(`fsolve: singular Jacobian at iteration ${iter} (${msg})`);
44980
45259
  }
44981
- const residualNorm = norm24(Fx);
45260
+ const residualNorm2 = norm24(Fx);
44982
45261
  let xNext = x.map((xi, i) => xi + delta[i]);
44983
45262
  let FxNext = F(xNext);
44984
- if (norm24(FxNext) >= residualNorm) {
45263
+ if (norm24(FxNext) >= residualNorm2) {
44985
45264
  let trialLambda = 1;
44986
45265
  for (let halving = 0; halving < 20; halving++) {
44987
45266
  trialLambda /= 2;
44988
45267
  const xTrial = x.map((xi, i) => xi + trialLambda * delta[i]);
44989
45268
  const FxTrial = F(xTrial);
44990
- if (norm24(FxTrial) < residualNorm) {
45269
+ if (norm24(FxTrial) < residualNorm2) {
44991
45270
  xNext = xTrial;
44992
45271
  FxNext = FxTrial;
44993
45272
  break;
@@ -45176,6 +45455,297 @@ function linearRegression(x, y) {
45176
45455
  return { slope, intercept, rValue, rSquared: rValue * rValue, pValue, stdErr };
45177
45456
  }
45178
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
+
45179
45749
  // src/optimization-extra.ts
45180
45750
  var _inv2 = inv;
45181
45751
  function nelderMead(f, x0, opts = {}) {
@@ -45344,10 +45914,10 @@ function kmeans(data, k, opts = {}) {
45344
45914
  if (!Number.isInteger(k) || k < 1) throw new Error("kmeans: k must be a positive integer");
45345
45915
  const d = data[0].length;
45346
45916
  if (k > n) throw new Error("kmeans: k exceeds number of points");
45347
- const mean6 = new Array(d).fill(0);
45348
- 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;
45349
45919
  let first = 0;
45350
- 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;
45351
45921
  const centroids = [data[first].slice()];
45352
45922
  while (centroids.length < k) {
45353
45923
  let best = -1;
@@ -45413,6 +45983,458 @@ function spectralClustering(adjacency, k, opts = {}) {
45413
45983
  return kmeans(embed, k, opts).labels;
45414
45984
  }
45415
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
+
46191
+ // src/numeric/bfgs.ts
46192
+ var CBRT_EPS = Math.cbrt(2220446049250313e-31);
46193
+ function numericGradient(f, x) {
46194
+ const n = x.length;
46195
+ const g = new Array(n);
46196
+ for (let i = 0; i < n; i++) {
46197
+ const h = Math.max(1, Math.abs(x[i])) * CBRT_EPS;
46198
+ const xp = x.slice();
46199
+ const xm = x.slice();
46200
+ xp[i] += h;
46201
+ xm[i] -= h;
46202
+ g[i] = (f(xp) - f(xm)) / (2 * h);
46203
+ }
46204
+ return g;
46205
+ }
46206
+ function clipToBounds(x, bounds) {
46207
+ if (!bounds) return x;
46208
+ return x.map((v, i) => {
46209
+ const b = bounds[i];
46210
+ if (!b) return v;
46211
+ const [lo, hi] = b;
46212
+ return Math.min(hi, Math.max(lo, v));
46213
+ });
46214
+ }
46215
+ function dot3(a, b) {
46216
+ let s = 0;
46217
+ for (let i = 0; i < a.length; i++) s += a[i] * b[i];
46218
+ return s;
46219
+ }
46220
+ function matVec2(H, v) {
46221
+ const n = v.length;
46222
+ const out = new Array(n);
46223
+ for (let i = 0; i < n; i++) {
46224
+ let s = 0;
46225
+ for (let j = 0; j < n; j++) s += H[i][j] * v[j];
46226
+ out[i] = s;
46227
+ }
46228
+ return out;
46229
+ }
46230
+ function bfgs(f, x0, opts = {}) {
46231
+ const { grad, bounds, tol = 1e-8, maxIter = 500 } = opts;
46232
+ const gradOf = grad ?? ((x2) => numericGradient(f, x2));
46233
+ const n = x0.length;
46234
+ const c1 = 1e-4;
46235
+ let x = clipToBounds(x0.slice(), bounds);
46236
+ let fx = f(x);
46237
+ let g = gradOf(x);
46238
+ let H = Array.from(
46239
+ { length: n },
46240
+ (_, i) => Array.from({ length: n }, (_2, j) => i === j ? 1 : 0)
46241
+ );
46242
+ const infNorm = (v) => v.reduce((m, c) => Math.max(m, Math.abs(c)), 0);
46243
+ let iter = 0;
46244
+ let converged = infNorm(g) < tol;
46245
+ while (!converged && iter < maxIter) {
46246
+ const d = matVec2(H, g).map((v) => -v);
46247
+ const gd = dot3(g, d);
46248
+ const dir = gd < 0 ? d : g.map((v) => -v);
46249
+ const dirSlope = gd < 0 ? gd : -dot3(g, g);
46250
+ let alpha = 1;
46251
+ let xNew = clipToBounds(
46252
+ x.map((v, i) => v + alpha * dir[i]),
46253
+ bounds
46254
+ );
46255
+ let fNew = f(xNew);
46256
+ let halvings = 0;
46257
+ while (fNew > fx + c1 * alpha * dirSlope && halvings < 50) {
46258
+ alpha *= 0.5;
46259
+ xNew = clipToBounds(
46260
+ x.map((v, i) => v + alpha * dir[i]),
46261
+ bounds
46262
+ );
46263
+ fNew = f(xNew);
46264
+ halvings++;
46265
+ }
46266
+ const gNew = gradOf(xNew);
46267
+ const s = xNew.map((v, i) => v - x[i]);
46268
+ const y = gNew.map((v, i) => v - g[i]);
46269
+ const sy = dot3(s, y);
46270
+ if (sy > 1e-12) {
46271
+ const rho = 1 / sy;
46272
+ const Hy = matVec2(H, y);
46273
+ const yHy = dot3(y, Hy);
46274
+ const HNew = Array.from({ length: n }, () => new Array(n).fill(0));
46275
+ for (let i = 0; i < n; i++) {
46276
+ for (let j = 0; j < n; j++) {
46277
+ HNew[i][j] = H[i][j] - rho * (s[i] * Hy[j] + Hy[i] * s[j]) + rho * rho * yHy * s[i] * s[j] + rho * s[i] * s[j];
46278
+ }
46279
+ }
46280
+ H = HNew;
46281
+ }
46282
+ x = xNew;
46283
+ fx = fNew;
46284
+ g = gNew;
46285
+ iter++;
46286
+ converged = infNorm(g) < tol;
46287
+ }
46288
+ return { x, fval: fx, iterations: iter, converged };
46289
+ }
46290
+
46291
+ // src/numeric/nnls.ts
46292
+ function matVec3(A, x) {
46293
+ const m = A.length;
46294
+ const result = new Array(m);
46295
+ for (let i = 0; i < m; i++) {
46296
+ const row2 = A[i];
46297
+ let s = 0;
46298
+ for (let j = 0; j < row2.length; j++) s += row2[j] * x[j];
46299
+ result[i] = s;
46300
+ }
46301
+ return result;
46302
+ }
46303
+ function residualNorm(A, x, b) {
46304
+ const Ax = matVec3(A, x);
46305
+ let s = 0;
46306
+ for (let i = 0; i < b.length; i++) {
46307
+ const d = Ax[i] - b[i];
46308
+ s += d * d;
46309
+ }
46310
+ return Math.sqrt(s);
46311
+ }
46312
+ function nnls(A, b, opts = {}) {
46313
+ const m = A.length;
46314
+ const n = A[0]?.length ?? 0;
46315
+ const tol = opts.tol ?? 1e-10;
46316
+ const maxIter = opts.maxIter ?? 3 * n;
46317
+ let x = new Array(n).fill(0);
46318
+ const passive = /* @__PURE__ */ new Set();
46319
+ const gradient2 = (xv) => {
46320
+ const Ax = matVec3(A, xv);
46321
+ const w = new Array(n).fill(0);
46322
+ for (let j = 0; j < n; j++) {
46323
+ let s = 0;
46324
+ for (let i = 0; i < m; i++) s += A[i][j] * (b[i] - Ax[i]);
46325
+ w[j] = s;
46326
+ }
46327
+ return w;
46328
+ };
46329
+ const solvePassive = (P2) => {
46330
+ const z = new Array(n).fill(0);
46331
+ if (P2.length === 0) return z;
46332
+ const Asub = A.map((row2) => P2.map((j) => row2[j]));
46333
+ let zp;
46334
+ try {
46335
+ zp = leastSquares(Asub, b);
46336
+ } catch {
46337
+ return x.slice();
46338
+ }
46339
+ for (let k = 0; k < P2.length; k++) z[P2[k]] = zp[k];
46340
+ return z;
46341
+ };
46342
+ let outerIter = 0;
46343
+ while (outerIter < maxIter) {
46344
+ const w = gradient2(x);
46345
+ let maxW = -Infinity;
46346
+ let maxJ = -1;
46347
+ for (let j = 0; j < n; j++) {
46348
+ if (!passive.has(j) && w[j] > maxW) {
46349
+ maxW = w[j];
46350
+ maxJ = j;
46351
+ }
46352
+ }
46353
+ if (maxJ === -1 || maxW <= tol) break;
46354
+ passive.add(maxJ);
46355
+ let z = solvePassive(Array.from(passive));
46356
+ let innerIter = 0;
46357
+ while (Array.from(passive).some((j) => z[j] <= tol) && innerIter < maxIter) {
46358
+ innerIter++;
46359
+ let alpha = Infinity;
46360
+ for (const j of passive) {
46361
+ if (z[j] <= tol) {
46362
+ const denom = x[j] - z[j];
46363
+ if (denom > 0) alpha = Math.min(alpha, x[j] / denom);
46364
+ }
46365
+ }
46366
+ if (!isFinite(alpha)) alpha = 0;
46367
+ for (let j = 0; j < n; j++) x[j] = x[j] + alpha * (z[j] - x[j]);
46368
+ for (const j of Array.from(passive)) {
46369
+ if (Math.abs(x[j]) < tol) passive.delete(j);
46370
+ }
46371
+ z = solvePassive(Array.from(passive));
46372
+ }
46373
+ x = z;
46374
+ outerIter++;
46375
+ }
46376
+ return { x, residual: residualNorm(A, x, b) };
46377
+ }
46378
+ function clip(v, lower, upper) {
46379
+ return v.map((vi, i) => Math.min(Math.max(vi, lower[i]), upper[i]));
46380
+ }
46381
+ function lsqBounded(A, b, lower, upper, opts = {}) {
46382
+ const m = A.length;
46383
+ const n = A[0]?.length ?? 0;
46384
+ const tol = opts.tol ?? 1e-10;
46385
+ const maxIter = opts.maxIter ?? Math.max(200, 20 * n);
46386
+ let x = clip(new Array(n).fill(0), lower, upper);
46387
+ const gradient2 = (xv) => {
46388
+ const Ax = matVec3(A, xv);
46389
+ const r = new Array(m);
46390
+ for (let i = 0; i < m; i++) r[i] = Ax[i] - b[i];
46391
+ const g = new Array(n).fill(0);
46392
+ for (let j = 0; j < n; j++) {
46393
+ let s = 0;
46394
+ for (let i = 0; i < m; i++) s += A[i][j] * r[i];
46395
+ g[j] = s;
46396
+ }
46397
+ return g;
46398
+ };
46399
+ const objective = (xv) => {
46400
+ const r = residualNorm(A, xv, b);
46401
+ return 0.5 * r * r;
46402
+ };
46403
+ for (let iter = 0; iter < maxIter; iter++) {
46404
+ const g = gradient2(x);
46405
+ const projFull = clip(
46406
+ x.map((xi, i) => xi - g[i]),
46407
+ lower,
46408
+ upper
46409
+ );
46410
+ let pgNorm = 0;
46411
+ for (let i = 0; i < n; i++) pgNorm += (x[i] - projFull[i]) ** 2;
46412
+ pgNorm = Math.sqrt(pgNorm);
46413
+ if (pgNorm < tol) break;
46414
+ const fx = objective(x);
46415
+ let alpha = 1;
46416
+ let xNext = clip(
46417
+ x.map((xi, i) => xi - alpha * g[i]),
46418
+ lower,
46419
+ upper
46420
+ );
46421
+ let fNext = objective(xNext);
46422
+ let backtrack = 0;
46423
+ while (fNext > fx && backtrack < 50) {
46424
+ alpha /= 2;
46425
+ xNext = clip(
46426
+ x.map((xi, i) => xi - alpha * g[i]),
46427
+ lower,
46428
+ upper
46429
+ );
46430
+ fNext = objective(xNext);
46431
+ backtrack++;
46432
+ }
46433
+ x = xNext;
46434
+ }
46435
+ return { x, residual: residualNorm(A, x, b) };
46436
+ }
46437
+
45416
46438
  // src/cas-integration.ts
45417
46439
  var parse2 = parse;
45418
46440
  var evaluate2 = evaluate;
@@ -45671,15 +46693,15 @@ function haversine(lat1, lon1, lat2, lon2, radius = EARTH_RADIUS_KM) {
45671
46693
  const a = Math.sin(dPhi / 2) ** 2 + Math.cos(phi1) * Math.cos(phi2) * Math.sin(dLambda / 2) ** 2;
45672
46694
  return radius * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
45673
46695
  }
45674
- var dot2 = (a, b) => a.reduce((s, v, i) => s + v * b[i], 0);
45675
- var norm3 = (a) => Math.sqrt(dot2(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));
45676
46698
  function slerp(v0, v1, t) {
45677
46699
  const n0 = norm3(v0);
45678
46700
  const n16 = norm3(v1);
45679
46701
  if (n0 === 0 || n16 === 0) throw new Error("slerp: input vectors must be non-zero");
45680
46702
  const u0 = v0.map((v) => v / n0);
45681
46703
  const u1 = v1.map((v) => v / n16);
45682
- let cos2 = dot2(u0, u1);
46704
+ let cos2 = dot4(u0, u1);
45683
46705
  cos2 = cos2 > 1 ? 1 : cos2 < -1 ? -1 : cos2;
45684
46706
  const omega = Math.acos(cos2);
45685
46707
  const mag = n0 + (n16 - n0) * t;
@@ -45795,6 +46817,7 @@ export {
45795
46817
  betainc,
45796
46818
  betweennessCentrality,
45797
46819
  bezierCurve,
46820
+ bfgs,
45798
46821
  bigint,
45799
46822
  bignumber,
45800
46823
  bin,
@@ -45835,6 +46858,7 @@ export {
45835
46858
  chebyshevDistance,
45836
46859
  chebyshevFit,
45837
46860
  chebyshevT,
46861
+ chi2Contingency,
45838
46862
  chiSquareTest,
45839
46863
  chiSquaredCDF,
45840
46864
  chiSquaredDist,
@@ -45909,6 +46933,7 @@ export {
45909
46933
  curl,
45910
46934
  curvefit,
45911
46935
  dagostinoTest,
46936
+ dbscan,
45912
46937
  dct,
45913
46938
  deepEqual,
45914
46939
  degree,
@@ -45949,6 +46974,7 @@ export {
45949
46974
  efimovFactor,
45950
46975
  eigenvectorCentrality,
45951
46976
  eigs,
46977
+ elasticNet,
45952
46978
  electricConstant,
45953
46979
  electronMass,
45954
46980
  element,
@@ -46096,6 +47122,7 @@ export {
46096
47122
  gammaincp,
46097
47123
  gasConstant,
46098
47124
  gaussQuad,
47125
+ gaussianKDE,
46099
47126
  gcd,
46100
47127
  generalizedEig,
46101
47128
  geometricPMF,
@@ -46188,6 +47215,8 @@ export {
46188
47215
  kldivergence,
46189
47216
  klitzing,
46190
47217
  kmeans,
47218
+ knnClassify,
47219
+ knnRegress,
46191
47220
  kolmogorovSmirnov2Test,
46192
47221
  kolmogorovSmirnovTest,
46193
47222
  kron,
@@ -46204,6 +47233,7 @@ export {
46204
47233
  laplacianMatrix,
46205
47234
  larger,
46206
47235
  largerEq,
47236
+ lasso,
46207
47237
  lcm,
46208
47238
  leafCount,
46209
47239
  leastSquares,
@@ -46233,12 +47263,14 @@ export {
46233
47263
  logisticCDF,
46234
47264
  logisticPDF,
46235
47265
  logisticQuantile,
47266
+ logisticRegression,
46236
47267
  logsumexp,
46237
47268
  loschmidt,
46238
47269
  lowRankApprox,
46239
47270
  lowpassFilter,
46240
47271
  lsolve,
46241
47272
  lsolveAll,
47273
+ lsqBounded,
46242
47274
  lucas,
46243
47275
  lucasL,
46244
47276
  lup,
@@ -46291,6 +47323,7 @@ export {
46291
47323
  multiTaperPSD,
46292
47324
  multinomial,
46293
47325
  multipleComparison,
47326
+ multipleTest,
46294
47327
  multiply,
46295
47328
  multiplyScalar,
46296
47329
  multivariateNormal,
@@ -46303,6 +47336,7 @@ export {
46303
47336
  newtonInterp,
46304
47337
  nextPrime,
46305
47338
  nintegrate,
47339
+ nnls,
46306
47340
  nodeOperations,
46307
47341
  noncentralChi2PDF,
46308
47342
  norm,
@@ -46325,6 +47359,7 @@ export {
46325
47359
  oct,
46326
47360
  odeAdaptiveStep,
46327
47361
  odeGeneral,
47362
+ ols,
46328
47363
  ones,
46329
47364
  or,
46330
47365
  orth,
@@ -46443,6 +47478,7 @@ export {
46443
47478
  resolve,
46444
47479
  resultant,
46445
47480
  reviver,
47481
+ ridge,
46446
47482
  rightArithShift,
46447
47483
  rightLogShift,
46448
47484
  risingFactorial,