@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.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1147 -111
- package/dist/ml/dbscan-knn.d.ts +52 -0
- package/dist/ml/dbscan-knn.d.ts.map +1 -0
- package/dist/ml/kde.d.ts +37 -0
- package/dist/ml/kde.d.ts.map +1 -0
- package/dist/ml/logistic-regression.d.ts +34 -0
- package/dist/ml/logistic-regression.d.ts.map +1 -0
- package/dist/ml/ols.d.ts +37 -0
- package/dist/ml/ols.d.ts.map +1 -0
- package/dist/ml/regularized-regression.d.ts +65 -0
- package/dist/ml/regularized-regression.d.ts.map +1 -0
- package/dist/numeric/bfgs.d.ts +70 -0
- package/dist/numeric/bfgs.d.ts.map +1 -0
- package/dist/numeric/nnls.d.ts +72 -0
- package/dist/numeric/nnls.d.ts.map +1 -0
- package/dist/stats/inference-extra.d.ts +46 -0
- package/dist/stats/inference-extra.d.ts.map +1 -0
- package/dist/typed/numeric.d.ts +28 -7
- package/dist/typed/numeric.d.ts.map +1 -1
- package/package.json +1 -1
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
|
|
2754
|
-
return ((a -
|
|
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
|
|
2758
|
-
return ((a -
|
|
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
|
|
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] -
|
|
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
|
|
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,
|
|
8388
|
+
return Math.acos(Math.max(-1, Math.min(1, dot5 / (mag1 * mag2))));
|
|
8389
8389
|
}
|
|
8390
8390
|
function angle3D(v1, v2) {
|
|
8391
|
-
const
|
|
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,
|
|
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
|
|
8501
|
-
return v.map((c, i) => c - 2 *
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
14165
|
+
const mean7 = new Float64Array(n);
|
|
13887
14166
|
for (const v of vectors) {
|
|
13888
|
-
for (let i = 0; i < n; i++)
|
|
14167
|
+
for (let i = 0; i < n; i++) mean7[i] += v[i];
|
|
13889
14168
|
}
|
|
13890
|
-
for (let i = 0; i < n; i++)
|
|
14169
|
+
for (let i = 0; i < n; i++) mean7[i] /= count2;
|
|
13891
14170
|
if (aggregation === "mean") {
|
|
13892
|
-
return { ranks:
|
|
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] -
|
|
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:
|
|
14182
|
+
ranks: mean7,
|
|
13904
14183
|
ranksPerRestart: vectors,
|
|
13905
|
-
restartStats: { mean:
|
|
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
|
|
14317
|
+
const mean7 = new Float64Array(n);
|
|
14039
14318
|
for (const v of vectors) {
|
|
14040
|
-
for (let i = 0; i < n; i++)
|
|
14319
|
+
for (let i = 0; i < n; i++) mean7[i] += v[i];
|
|
14041
14320
|
}
|
|
14042
|
-
for (let i = 0; i < n; i++)
|
|
14321
|
+
for (let i = 0; i < n; i++) mean7[i] /= count2;
|
|
14043
14322
|
if (aggregation === "mean") {
|
|
14044
|
-
return { centrality:
|
|
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] -
|
|
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:
|
|
14334
|
+
centrality: mean7,
|
|
14056
14335
|
centralityPerRestart: vectors,
|
|
14057
|
-
restartStats: { mean:
|
|
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
|
|
14122
|
-
for (let i = 0; i < n; i++)
|
|
14123
|
-
if (
|
|
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
|
|
14409
|
+
const mean7 = new Float64Array(n);
|
|
14131
14410
|
for (const v of aligned) {
|
|
14132
|
-
for (let i = 0; i < n; i++)
|
|
14411
|
+
for (let i = 0; i < n; i++) mean7[i] += v[i];
|
|
14133
14412
|
}
|
|
14134
|
-
for (let i = 0; i < n; i++)
|
|
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 +=
|
|
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++)
|
|
14418
|
+
for (let i = 0; i < n; i++) mean7[i] /= norm4;
|
|
14140
14419
|
}
|
|
14141
14420
|
if (aggregation === "mean") {
|
|
14142
|
-
return { centrality:
|
|
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] -
|
|
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:
|
|
14432
|
+
centrality: mean7,
|
|
14154
14433
|
centralityPerRestart: aligned,
|
|
14155
|
-
restartStats: { mean:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
15261
|
+
mean: mean7,
|
|
14983
15262
|
variance: variance2,
|
|
14984
|
-
sample: () => _discreteSample(cdf, Math.random, Math.ceil(
|
|
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(
|
|
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(
|
|
15167
|
-
const k =
|
|
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:
|
|
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] -
|
|
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
|
|
15525
|
+
const mean7 = sum3 / n;
|
|
15247
15526
|
let sq = 0;
|
|
15248
|
-
for (let i = 0; i < n; i++) sq += (stats[i] -
|
|
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:
|
|
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
|
|
15975
|
-
for (let j = 0; j < p; j++)
|
|
15976
|
-
return
|
|
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,
|
|
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 =
|
|
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
|
|
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] -
|
|
16140
|
-
const wj = (sorted[n - 1 - i] -
|
|
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
|
|
16866
|
+
let dot5 = 0;
|
|
16588
16867
|
for (let i = 0; i < len; i++) {
|
|
16589
|
-
|
|
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] *
|
|
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
|
|
16875
|
+
let dot5 = 0;
|
|
16597
16876
|
for (let j = 0; j < len; j++) {
|
|
16598
|
-
|
|
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 *
|
|
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
|
|
16884
|
+
let dot5 = 0;
|
|
16606
16885
|
for (let j = 0; j < len; j++) {
|
|
16607
|
-
|
|
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 *
|
|
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:
|
|
22681
|
+
({ typed: typed3, transpose: transpose4, conj: conj3 }) => {
|
|
22403
22682
|
return typed3(name85, {
|
|
22404
22683
|
any: function(x) {
|
|
22405
|
-
return conj3(
|
|
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:
|
|
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 =
|
|
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 =
|
|
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:
|
|
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 =
|
|
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:
|
|
24041
|
-
const csAmd2 = createCsAmd({ add: add2, multiply: multiply2, transpose:
|
|
24042
|
-
const csCounts2 = createCsCounts({ transpose:
|
|
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:
|
|
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),
|
|
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(
|
|
30018
|
-
const F = rref.filter((_, i) => !_isZero(
|
|
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:
|
|
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:
|
|
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
|
|
35791
|
+
const mean7 = divide2(sum3, num2);
|
|
35513
35792
|
sum3 = void 0;
|
|
35514
35793
|
deepForEach2(array, function(value) {
|
|
35515
|
-
const diff2 = subtract2(value,
|
|
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:
|
|
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(
|
|
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(
|
|
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:
|
|
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:
|
|
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:
|
|
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(
|
|
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,
|
|
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:
|
|
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,
|
|
41241
|
+
return sylvester2(A, transpose4(A), multiply2(-1, Q2));
|
|
40963
41242
|
},
|
|
40964
41243
|
"Array, Matrix": function(A, Q2) {
|
|
40965
|
-
return sylvester2(matrix2(A),
|
|
41244
|
+
return sylvester2(matrix2(A), transpose4(matrix2(A)), multiply2(-1, Q2));
|
|
40966
41245
|
},
|
|
40967
41246
|
"Matrix, Array": function(A, Q2) {
|
|
40968
|
-
return sylvester2(A,
|
|
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
|
-
|
|
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
|
|
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) >=
|
|
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) <
|
|
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
|
|
45348
|
-
for (const p of data) for (let j = 0; j < d; j++)
|
|
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],
|
|
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
|
|
45675
|
-
var norm3 = (a) => Math.sqrt(
|
|
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 =
|
|
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,
|