@johnhenry/math 0.1.0 → 0.3.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.
Files changed (62) hide show
  1. package/README.md +5 -4
  2. package/dist/Distributions.d.ts +86 -16
  3. package/dist/Distributions.d.ts.map +1 -1
  4. package/dist/Distributions.js +340 -89
  5. package/dist/Distributions.js.map +1 -1
  6. package/dist/EigenGeneral.d.ts +22 -0
  7. package/dist/EigenGeneral.d.ts.map +1 -0
  8. package/dist/EigenGeneral.js +327 -0
  9. package/dist/EigenGeneral.js.map +1 -0
  10. package/dist/Frobenius.d.ts +60 -0
  11. package/dist/Frobenius.d.ts.map +1 -0
  12. package/dist/Frobenius.js +162 -0
  13. package/dist/Frobenius.js.map +1 -0
  14. package/dist/Graph.d.ts +26 -0
  15. package/dist/Graph.d.ts.map +1 -1
  16. package/dist/Graph.js +75 -0
  17. package/dist/Graph.js.map +1 -1
  18. package/dist/MatrixMath.d.ts +10 -0
  19. package/dist/MatrixMath.d.ts.map +1 -1
  20. package/dist/MatrixMath.js +11 -0
  21. package/dist/MatrixMath.js.map +1 -1
  22. package/dist/MonteCarlo.d.ts +106 -0
  23. package/dist/MonteCarlo.d.ts.map +1 -0
  24. package/dist/MonteCarlo.js +183 -0
  25. package/dist/MonteCarlo.js.map +1 -0
  26. package/dist/Random.d.ts +31 -0
  27. package/dist/Random.d.ts.map +1 -0
  28. package/dist/Random.js +95 -0
  29. package/dist/Random.js.map +1 -0
  30. package/dist/Regression.d.ts +114 -0
  31. package/dist/Regression.d.ts.map +1 -0
  32. package/dist/Regression.js +338 -0
  33. package/dist/Regression.js.map +1 -0
  34. package/dist/Shader.d.ts +41 -0
  35. package/dist/Shader.d.ts.map +1 -0
  36. package/dist/Shader.js +758 -0
  37. package/dist/Shader.js.map +1 -0
  38. package/dist/SpecialFunctions.d.ts +3 -3
  39. package/dist/SpecialFunctions.d.ts.map +1 -1
  40. package/dist/SpecialFunctions.js +61 -51
  41. package/dist/SpecialFunctions.js.map +1 -1
  42. package/dist/Symbolic.d.ts +12 -0
  43. package/dist/Symbolic.d.ts.map +1 -1
  44. package/dist/Symbolic.js +16 -0
  45. package/dist/Symbolic.js.map +1 -1
  46. package/dist/index.d.ts +7 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +5 -0
  49. package/dist/index.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/Distributions.ts +391 -94
  52. package/src/EigenGeneral.ts +342 -0
  53. package/src/Frobenius.ts +203 -0
  54. package/src/Graph.ts +68 -0
  55. package/src/MatrixMath.ts +13 -0
  56. package/src/MonteCarlo.ts +257 -0
  57. package/src/Random.ts +104 -0
  58. package/src/Regression.ts +423 -0
  59. package/src/Shader.ts +837 -0
  60. package/src/SpecialFunctions.ts +52 -48
  61. package/src/Symbolic.ts +18 -0
  62. package/src/index.ts +34 -0
package/dist/Random.js ADDED
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Rng — a seeded, reproducible pseudo-random generator (PCG32, XSH-RR variant;
3
+ * see https://www.pcg-random.org/). The same seed always yields the same
4
+ * stream, which is the point: reproducible Monte Carlo runs and deterministic
5
+ * tests. There is no shared global state — every consumer takes an explicit
6
+ * generator, so nothing interferes across tests.
7
+ *
8
+ * The stream is bit-identical to `Rng` in `@johnhenry/math-plus-tensor-core`
9
+ * (same constants, same seeding), so existing seeds keep their results.
10
+ *
11
+ * `rng.next` is a bound `() => number` returning floats in `[0, 1)`, which is
12
+ * the `rng` hook {@link Distributions} factories and the Monte Carlo helpers
13
+ * accept.
14
+ */
15
+ // 64-bit LCG state held as two uint32 limbs (hi, lo) so no BigInt is needed on the hot path.
16
+ const MULT_HI = 0x5851f42d;
17
+ const MULT_LO = 0x4c957f2d;
18
+ const TWO32 = 4294967296;
19
+ /** Full 32x32 -> 64-bit unsigned product as [hi, lo], exact in doubles via 16-bit limbs. */
20
+ function mul32(a, b) {
21
+ const a0 = a & 0xffff;
22
+ const a1 = a >>> 16;
23
+ const b0 = b & 0xffff;
24
+ const b1 = b >>> 16;
25
+ const mid = a0 * b1 + a1 * b0;
26
+ const lo64 = a0 * b0 + (mid % 65536) * 65536;
27
+ const carry = Math.floor(lo64 / TWO32);
28
+ return [a1 * b1 + Math.floor(mid / 65536) + carry, lo64 % TWO32];
29
+ }
30
+ export class Rng {
31
+ #hi = 0;
32
+ #lo = 0;
33
+ #incHi;
34
+ #incLo;
35
+ constructor(seedValue = 0n, sequence = 1n) {
36
+ const inc = ((BigInt(sequence) << 1n) | 1n) & 0xffffffffffffffffn;
37
+ this.#incHi = Number(inc >> 32n);
38
+ this.#incLo = Number(inc & 0xffffffffn);
39
+ this.#step();
40
+ const s = BigInt(seedValue) & 0xffffffffffffffffn;
41
+ const lo = this.#lo + Number(s & 0xffffffffn);
42
+ this.#lo = lo % TWO32;
43
+ this.#hi = (this.#hi + Number(s >> 32n) + Math.floor(lo / TWO32)) % TWO32;
44
+ this.#step();
45
+ }
46
+ /** Advance the LCG; returns the previous state as [hi, lo]. */
47
+ #step() {
48
+ const [ph, pl] = mul32(this.#lo, MULT_LO);
49
+ const cross = (Math.imul(this.#hi, MULT_LO) + Math.imul(this.#lo, MULT_HI)) >>> 0;
50
+ const lo = pl + this.#incLo;
51
+ this.#lo = lo % TWO32;
52
+ this.#hi = (ph + cross + this.#incHi + Math.floor(lo / TWO32)) % TWO32;
53
+ }
54
+ /** Next integer in `[0, 2^32)`. */
55
+ nextUint32() {
56
+ const hi = this.#hi;
57
+ const lo = this.#lo;
58
+ this.#step();
59
+ const xh = (hi ^ (hi >>> 18)) >>> 0;
60
+ const xl = (lo ^ (((hi << 14) | (lo >>> 18)) >>> 0)) >>> 0;
61
+ const v = ((xl >>> 27) | (xh << 5)) >>> 0;
62
+ const rot = hi >>> 27;
63
+ return ((v >>> rot) | (v << (-rot & 31))) >>> 0;
64
+ }
65
+ /** Uniform float in `[0, 1)`. */
66
+ nextFloat() {
67
+ return this.nextUint32() / 4294967296;
68
+ }
69
+ /** Bound alias of {@link nextFloat}, usable directly as a `() => number` rng hook. */
70
+ next = () => this.nextFloat();
71
+ /** Uniform integer in `[0, bound)` without modulo bias. */
72
+ nextBelow(bound) {
73
+ if (!Number.isInteger(bound) || bound <= 0)
74
+ throw new RangeError(`nextBelow: bound must be a positive integer, got ${bound}`);
75
+ const limit = Math.floor(4294967296 / bound) * bound;
76
+ let x;
77
+ do {
78
+ x = this.nextUint32();
79
+ } while (x >= limit);
80
+ return x % bound;
81
+ }
82
+ /** Standard-normal draw (Box-Muller, two uniforms per call). */
83
+ nextNormal(mean = 0, sd = 1) {
84
+ let u1 = this.nextFloat();
85
+ if (u1 === 0)
86
+ u1 = Number.MIN_VALUE;
87
+ const u2 = this.nextFloat();
88
+ return mean + sd * Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);
89
+ }
90
+ }
91
+ /** A fresh seeded generator. */
92
+ export function seed(value) {
93
+ return new Rng(value);
94
+ }
95
+ //# sourceMappingURL=Random.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Random.js","sourceRoot":"","sources":["../src/Random.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Regression — nonlinear least squares (Levenberg-Marquardt) and robust
3
+ * (Huber) fitting, modelled on `scipy.optimize.least_squares` and
4
+ * `scipy.optimize.curve_fit`.
5
+ *
6
+ * - {@link Regression.leastSquares} minimises `0.5 * Σ ρ((r_i / f_scale)²) * f_scale²`
7
+ * over residuals `r(x)`, with SciPy's robust `loss` options and SciPy's
8
+ * robust-loss Jacobian rescaling. The solver is a damped Gauss-Newton
9
+ * (Levenberg-Marquardt) iteration with Marquardt scaling, so it reaches the
10
+ * same minimiser as SciPy's `method="lm"` / `"trf"` to the requested
11
+ * tolerances (iteration counts differ).
12
+ * - {@link Regression.curveFit} fits `y ≈ model(x, params)` and returns the
13
+ * parameter covariance exactly as `curve_fit` defines it.
14
+ * - {@link Regression.huberLinear} is the robust line fit mallory's regression
15
+ * panel offers (Huber loss), solved to convergence instead of by SGD.
16
+ */
17
+ export type RobustLoss = "linear" | "huber" | "soft_l1" | "cauchy" | "arctan";
18
+ export interface LeastSquaresOptions {
19
+ /** Analytic Jacobian `d residual_i / d x_j` (m×n). Default: central differences. */
20
+ jac?: (x: number[]) => number[][];
21
+ /** Loss function ρ applied to scaled squared residuals. Default `"linear"` (plain least squares). */
22
+ loss?: RobustLoss;
23
+ /** Residual scale at which a robust loss turns over (SciPy's `f_scale`). Default 1. */
24
+ fScale?: number;
25
+ /** Relative cost-reduction tolerance (default 1e-8, as SciPy). */
26
+ ftol?: number;
27
+ /** Step-size tolerance (default 1e-8). */
28
+ xtol?: number;
29
+ /** Gradient infinity-norm tolerance (default 1e-8). */
30
+ gtol?: number;
31
+ /** Maximum residual-function evaluations (default `200 * n`, min 1000). */
32
+ maxNfev?: number;
33
+ }
34
+ export interface LeastSquaresResult {
35
+ x: number[];
36
+ /** `0.5 * Σ ρ` at the solution (SciPy's `cost`; equals `0.5 Σ r²` for the linear loss). */
37
+ cost: number;
38
+ /** Residuals at the solution. */
39
+ fun: number[];
40
+ jac: number[][];
41
+ /** Gradient `Jᵀ ρ'(r) r` at the solution. */
42
+ grad: number[];
43
+ /** Gradient infinity-norm. */
44
+ optimality: number;
45
+ nfev: number;
46
+ njev: number;
47
+ /** 0: max evaluations, 1: gtol, 2: ftol, 3: xtol, 4: ftol and xtol (SciPy's codes). */
48
+ status: 0 | 1 | 2 | 3 | 4;
49
+ success: boolean;
50
+ message: string;
51
+ }
52
+ export interface CurveFitOptions extends Omit<LeastSquaresOptions, "jac"> {
53
+ /** Analytic `d model / d params` for one point: `(x, params) => number[]`. */
54
+ jac?: (x: number, params: number[]) => number[];
55
+ /** Per-point standard deviations (weights `1/sigma`). */
56
+ sigma?: number[];
57
+ /** Treat `sigma` as absolute (don't rescale the covariance by reduced chi-square). Default false. */
58
+ absoluteSigma?: boolean;
59
+ }
60
+ export interface CurveFitResult {
61
+ params: number[];
62
+ /** Parameter covariance, as `scipy.optimize.curve_fit`'s `pcov` (`Infinity` entries when singular). */
63
+ covariance: number[][];
64
+ /** Square roots of the covariance diagonal. */
65
+ standardErrors: number[];
66
+ /** `sqrt(Σ r²)`. */
67
+ residualNorm: number;
68
+ /** Coefficient of determination `1 - SS_res / SS_tot`. */
69
+ rSquared: number;
70
+ iterations: number;
71
+ converged: boolean;
72
+ fit: LeastSquaresResult;
73
+ }
74
+ export interface HuberLinearResult {
75
+ slope: number;
76
+ intercept: number;
77
+ iterations: number;
78
+ converged: boolean;
79
+ }
80
+ export declare class Regression {
81
+ /**
82
+ * Nonlinear least squares by Levenberg-Marquardt -- `scipy.optimize.least_squares`
83
+ * (`method="lm"` for `loss: "linear"`; robust losses as `method="trf"` would
84
+ * minimise them). `fun(x)` returns the residual vector.
85
+ */
86
+ static leastSquares(fun: (x: number[]) => number[], x0: number[], options?: LeastSquaresOptions): LeastSquaresResult;
87
+ /**
88
+ * Fit `y ≈ model(x, params)` by least squares -- `scipy.optimize.curve_fit`
89
+ * (default `method="lm"`). `covariance` follows `curve_fit`: `(JᵀJ)⁻¹`
90
+ * scaled by the reduced chi-square unless `absoluteSigma` is set.
91
+ */
92
+ static curveFit(model: (x: number, params: number[]) => number, xs: number[], ys: number[], p0: number[], options?: CurveFitOptions): CurveFitResult;
93
+ /**
94
+ * Robust straight-line fit `y = slope·x + intercept` minimising the Huber
95
+ * loss of the residuals scaled by `delta` -- the same objective as
96
+ * `scipy.optimize.least_squares(..., loss="huber", f_scale=delta)` on a
97
+ * linear model. Quadratic for residuals within `delta`, linear beyond, so an
98
+ * outlier pulls the line far less than ordinary least squares. Solved by
99
+ * iteratively reweighted least squares to convergence (the objective is convex).
100
+ */
101
+ static huberLinear(xs: number[], ys: number[], options?: {
102
+ delta?: number;
103
+ maxIterations?: number;
104
+ tolerance?: number;
105
+ }): HuberLinearResult;
106
+ /**
107
+ * Indices of points whose residual from `y = slope·x + intercept` is more
108
+ * than `thresholdMads` scaled median absolute deviations from the median
109
+ * residual (MAD × 1.4826 estimates a Gaussian σ without being skewed by the
110
+ * outliers themselves). Empty when the MAD is zero.
111
+ */
112
+ static outlierIndices(xs: number[], ys: number[], slope: number, intercept: number, thresholdMads?: number): number[];
113
+ }
114
+ //# sourceMappingURL=Regression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Regression.d.ts","sourceRoot":"","sources":["../src/Regression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,338 @@
1
+ import { MatrixMath } from "./MatrixMath.js";
2
+ const EPS = Number.EPSILON;
3
+ /** ρ(z), ρ'(z), ρ''(z) for the SciPy robust losses, `z` = squared scaled residual. */
4
+ function rho(loss, z) {
5
+ switch (loss) {
6
+ case "linear":
7
+ return [z, 1, 0];
8
+ case "huber":
9
+ if (z <= 1)
10
+ return [z, 1, 0];
11
+ return [2 * Math.sqrt(z) - 1, 1 / Math.sqrt(z), -0.5 * z ** -1.5];
12
+ case "soft_l1": {
13
+ const t = 1 + z;
14
+ return [2 * (Math.sqrt(t) - 1), 1 / Math.sqrt(t), -0.5 * t ** -1.5];
15
+ }
16
+ case "cauchy": {
17
+ const t = 1 + z;
18
+ return [Math.log1p(z), 1 / t, -1 / (t * t)];
19
+ }
20
+ case "arctan":
21
+ return [Math.atan(z), 1 / (1 + z * z), (-2 * z) / (1 + z * z) ** 2];
22
+ }
23
+ }
24
+ function robustCost(loss, f, fScale) {
25
+ if (loss === "linear")
26
+ return 0.5 * f.reduce((s, v) => s + v * v, 0);
27
+ const c2 = fScale * fScale;
28
+ return 0.5 * c2 * f.reduce((s, v) => s + rho(loss, (v / fScale) ** 2)[0], 0);
29
+ }
30
+ /** Invert a small symmetric matrix by Gauss-Jordan with partial pivoting; `null` when singular. */
31
+ function invert(a) {
32
+ const n = a.length;
33
+ const m = a.map((row, i) => [...row, ...Array.from({ length: n }, (_, j) => (i === j ? 1 : 0))]);
34
+ for (let c = 0; c < n; c++) {
35
+ let p = c;
36
+ for (let r = c + 1; r < n; r++)
37
+ if (Math.abs(m[r][c]) > Math.abs(m[p][c]))
38
+ p = r;
39
+ if (Math.abs(m[p][c]) < 1e-300)
40
+ return null;
41
+ [m[c], m[p]] = [m[p], m[c]];
42
+ const d = m[c][c];
43
+ for (let j = 0; j < 2 * n; j++)
44
+ m[c][j] /= d;
45
+ for (let r = 0; r < n; r++) {
46
+ if (r === c)
47
+ continue;
48
+ const f = m[r][c];
49
+ if (f !== 0)
50
+ for (let j = 0; j < 2 * n; j++)
51
+ m[r][j] -= f * m[c][j];
52
+ }
53
+ }
54
+ return m.map((row) => row.slice(n));
55
+ }
56
+ export class Regression {
57
+ /**
58
+ * Nonlinear least squares by Levenberg-Marquardt -- `scipy.optimize.least_squares`
59
+ * (`method="lm"` for `loss: "linear"`; robust losses as `method="trf"` would
60
+ * minimise them). `fun(x)` returns the residual vector.
61
+ */
62
+ static leastSquares(fun, x0, options = {}) {
63
+ const { loss = "linear", fScale = 1, ftol = 1e-8, xtol = 1e-8, gtol = 1e-8 } = options;
64
+ const n = x0.length;
65
+ const maxNfev = options.maxNfev ?? Math.max(1000, 200 * n);
66
+ let nfev = 0;
67
+ let njev = 0;
68
+ const evalF = (x) => {
69
+ nfev++;
70
+ return fun(x);
71
+ };
72
+ const jacobian = (x, f) => {
73
+ njev++;
74
+ if (options.jac)
75
+ return options.jac(x);
76
+ const m = f.length;
77
+ const J = Array.from({ length: m }, () => new Array(n).fill(0));
78
+ for (let j = 0; j < n; j++) {
79
+ const h = Math.cbrt(EPS) * Math.max(Math.abs(x[j]), 1);
80
+ const xp = [...x];
81
+ const xm = [...x];
82
+ xp[j] += h;
83
+ xm[j] -= h;
84
+ const fp = fun(xp);
85
+ const fm = fun(xm);
86
+ for (let i = 0; i < m; i++)
87
+ J[i][j] = (fp[i] - fm[i]) / (2 * h);
88
+ }
89
+ return J;
90
+ };
91
+ let x = [...x0];
92
+ let f = evalF(x);
93
+ let cost = robustCost(loss, f, fScale);
94
+ let J = jacobian(x, f);
95
+ let lambda = 1e-3;
96
+ let status = 0;
97
+ let message = "The maximum number of function evaluations is exceeded.";
98
+ /** Robust-loss scaled residual & Jacobian (SciPy's `scale_for_robust_loss`) and true gradient. */
99
+ const scaled = (fv, Jv) => {
100
+ if (loss === "linear")
101
+ return { fs: fv, Js: Jv };
102
+ const m = fv.length;
103
+ const fs = new Array(m);
104
+ const Js = new Array(m);
105
+ for (let i = 0; i < m; i++) {
106
+ const [, r1, r2] = rho(loss, (fv[i] / fScale) ** 2);
107
+ let js = r1 + 2 * r2 * (fv[i] / fScale) ** 2;
108
+ if (js < EPS)
109
+ js = EPS;
110
+ js = Math.sqrt(js);
111
+ const fsc = r1 / js;
112
+ fs[i] = fv[i] * fsc;
113
+ Js[i] = Jv[i].map((v) => v * js);
114
+ }
115
+ return { fs, Js };
116
+ };
117
+ const gradientOf = (fv, Jv) => {
118
+ const g = new Array(n).fill(0);
119
+ for (let i = 0; i < fv.length; i++) {
120
+ const w = loss === "linear" ? 1 : rho(loss, (fv[i] / fScale) ** 2)[1];
121
+ for (let j = 0; j < n; j++)
122
+ g[j] += Jv[i][j] * w * fv[i];
123
+ }
124
+ return g;
125
+ };
126
+ let grad = gradientOf(f, J);
127
+ let optimality = Math.max(0, ...grad.map(Math.abs));
128
+ if (optimality <= gtol) {
129
+ status = 1;
130
+ message = "`gtol` termination condition is satisfied.";
131
+ }
132
+ while (status === 0 && nfev < maxNfev) {
133
+ const { fs, Js } = scaled(f, J);
134
+ const JtJ = Array.from({ length: n }, () => new Array(n).fill(0));
135
+ const Jtf = new Array(n).fill(0);
136
+ for (let i = 0; i < fs.length; i++) {
137
+ for (let a = 0; a < n; a++) {
138
+ Jtf[a] += Js[i][a] * fs[i];
139
+ for (let b = a; b < n; b++)
140
+ JtJ[a][b] += Js[i][a] * Js[i][b];
141
+ }
142
+ }
143
+ for (let a = 0; a < n; a++)
144
+ for (let b = 0; b < a; b++)
145
+ JtJ[a][b] = JtJ[b][a];
146
+ let accepted = false;
147
+ let dxNorm = 0;
148
+ let reduction = 0;
149
+ for (let tries = 0; tries < 40 && !accepted && nfev < maxNfev; tries++) {
150
+ const A = JtJ.map((row, a) => row.map((v, b) => (a === b ? v + lambda * Math.max(JtJ[a][a], 1e-12) : v)));
151
+ let dx;
152
+ try {
153
+ dx = [
154
+ ...MatrixMath.solve(A, Jtf.map((v) => -v)),
155
+ ];
156
+ }
157
+ catch {
158
+ lambda *= 10;
159
+ continue;
160
+ }
161
+ if (dx.some((v) => !Number.isFinite(v))) {
162
+ lambda *= 10;
163
+ continue;
164
+ }
165
+ const xn = x.map((v, i) => v + dx[i]);
166
+ const fn = evalF(xn);
167
+ const cn = robustCost(loss, fn, fScale);
168
+ if (Number.isFinite(cn) && cn < cost) {
169
+ reduction = cost - cn;
170
+ dxNorm = Math.hypot(...dx);
171
+ const xNorm = Math.hypot(...x);
172
+ const prevCost = cost;
173
+ x = xn;
174
+ f = fn;
175
+ cost = cn;
176
+ lambda = Math.max(lambda / 10, 1e-14);
177
+ accepted = true;
178
+ J = jacobian(x, f);
179
+ grad = gradientOf(f, J);
180
+ optimality = Math.max(0, ...grad.map(Math.abs));
181
+ const fHit = reduction < ftol * prevCost;
182
+ const xHit = dxNorm < xtol * (xtol + xNorm);
183
+ if (optimality <= gtol) {
184
+ status = 1;
185
+ message = "`gtol` termination condition is satisfied.";
186
+ }
187
+ else if (fHit && xHit) {
188
+ status = 4;
189
+ message = "Both `ftol` and `xtol` termination conditions are satisfied.";
190
+ }
191
+ else if (fHit) {
192
+ status = 2;
193
+ message = "`ftol` termination condition is satisfied.";
194
+ }
195
+ else if (xHit) {
196
+ status = 3;
197
+ message = "`xtol` termination condition is satisfied.";
198
+ }
199
+ }
200
+ else
201
+ lambda *= 10;
202
+ }
203
+ if (!accepted) {
204
+ // no damped step lowers the cost: a (numerical) stationary point
205
+ status = optimality <= Math.sqrt(gtol) || cost === 0 ? 1 : 2;
206
+ message = "No further improvement is possible at this precision.";
207
+ break;
208
+ }
209
+ }
210
+ return { x, cost, fun: f, jac: J, grad, optimality, nfev, njev, status, success: status > 0, message };
211
+ }
212
+ /**
213
+ * Fit `y ≈ model(x, params)` by least squares -- `scipy.optimize.curve_fit`
214
+ * (default `method="lm"`). `covariance` follows `curve_fit`: `(JᵀJ)⁻¹`
215
+ * scaled by the reduced chi-square unless `absoluteSigma` is set.
216
+ */
217
+ static curveFit(model, xs, ys, p0, options = {}) {
218
+ if (xs.length !== ys.length)
219
+ throw new Error("xs and ys must have the same length.");
220
+ const m = xs.length;
221
+ const n = p0.length;
222
+ if (m < n)
223
+ throw new Error(`curveFit needs at least as many points (${m}) as parameters (${n}).`);
224
+ const sigma = options.sigma;
225
+ const w = (i) => (sigma ? 1 / sigma[i] : 1);
226
+ const { jac: pointJac, sigma: _s, absoluteSigma, ...rest } = options;
227
+ const fit = Regression.leastSquares((p) => xs.map((x, i) => (model(x, p) - ys[i]) * w(i)), p0, {
228
+ ...rest,
229
+ jac: pointJac ? (p) => xs.map((x, i) => pointJac(x, p).map((d) => d * w(i))) : undefined,
230
+ });
231
+ const JtJ = Array.from({ length: n }, (_, a) => Array.from({ length: n }, (_, b) => fit.jac.reduce((s, row) => s + row[a] * row[b], 0)));
232
+ const inv = invert(JtJ);
233
+ let covariance;
234
+ if (!inv)
235
+ covariance = Array.from({ length: n }, () => new Array(n).fill(Number.POSITIVE_INFINITY));
236
+ else {
237
+ const sq = 2 * fit.cost; // Σ (r/σ)²
238
+ const scale = absoluteSigma ? 1 : m > n ? sq / (m - n) : Number.POSITIVE_INFINITY;
239
+ covariance = inv.map((row) => row.map((v) => v * scale));
240
+ }
241
+ const meanY = ys.reduce((a, b) => a + b, 0) / m;
242
+ const ssTot = ys.reduce((s, y) => s + (y - meanY) ** 2, 0);
243
+ const ssRes = xs.reduce((s, x, i) => s + (ys[i] - model(x, fit.x)) ** 2, 0);
244
+ return {
245
+ params: fit.x,
246
+ covariance,
247
+ standardErrors: covariance.map((row, i) => Math.sqrt(row[i])),
248
+ residualNorm: Math.sqrt(ssRes),
249
+ rSquared: ssTot === 0 ? (ssRes === 0 ? 1 : 0) : 1 - ssRes / ssTot,
250
+ iterations: fit.nfev,
251
+ converged: fit.success,
252
+ fit,
253
+ };
254
+ }
255
+ /**
256
+ * Robust straight-line fit `y = slope·x + intercept` minimising the Huber
257
+ * loss of the residuals scaled by `delta` -- the same objective as
258
+ * `scipy.optimize.least_squares(..., loss="huber", f_scale=delta)` on a
259
+ * linear model. Quadratic for residuals within `delta`, linear beyond, so an
260
+ * outlier pulls the line far less than ordinary least squares. Solved by
261
+ * iteratively reweighted least squares to convergence (the objective is convex).
262
+ */
263
+ static huberLinear(xs, ys, options = {}) {
264
+ const { delta = 1, maxIterations = 200, tolerance = 1e-12 } = options;
265
+ if (xs.length !== ys.length)
266
+ throw new Error("xs and ys must have the same length.");
267
+ if (xs.length < 2)
268
+ throw new Error("Enter at least two (x, y) rows.");
269
+ if (!(delta > 0))
270
+ throw new Error("delta must be positive.");
271
+ const m = xs.length;
272
+ const wls = (weights) => {
273
+ let sw = 0;
274
+ let sx = 0;
275
+ let sy = 0;
276
+ let sxx = 0;
277
+ let sxy = 0;
278
+ for (let i = 0; i < m; i++) {
279
+ const w = weights[i];
280
+ sw += w;
281
+ sx += w * xs[i];
282
+ sy += w * ys[i];
283
+ sxx += w * xs[i] * xs[i];
284
+ sxy += w * xs[i] * ys[i];
285
+ }
286
+ const det = sw * sxx - sx * sx;
287
+ if (Math.abs(det) < 1e-300)
288
+ return [0, sy / sw];
289
+ return [(sw * sxy - sx * sy) / det, (sxx * sy - sx * sxy) / det];
290
+ };
291
+ let [slope, intercept] = wls(new Array(m).fill(1));
292
+ let iterations = 0;
293
+ let converged = false;
294
+ for (; iterations < maxIterations; iterations++) {
295
+ const weights = xs.map((x, i) => {
296
+ const r = Math.abs(ys[i] - (slope * x + intercept));
297
+ return r <= delta ? 1 : delta / r;
298
+ });
299
+ const [s, b] = wls(weights);
300
+ const change = Math.max(Math.abs(s - slope), Math.abs(b - intercept));
301
+ slope = s;
302
+ intercept = b;
303
+ if (change <= tolerance * (1 + Math.abs(slope) + Math.abs(intercept))) {
304
+ converged = true;
305
+ iterations++;
306
+ break;
307
+ }
308
+ }
309
+ return { slope, intercept, iterations, converged };
310
+ }
311
+ /**
312
+ * Indices of points whose residual from `y = slope·x + intercept` is more
313
+ * than `thresholdMads` scaled median absolute deviations from the median
314
+ * residual (MAD × 1.4826 estimates a Gaussian σ without being skewed by the
315
+ * outliers themselves). Empty when the MAD is zero.
316
+ */
317
+ static outlierIndices(xs, ys, slope, intercept, thresholdMads = 2.5) {
318
+ if (xs.length === 0)
319
+ return [];
320
+ const median = (v) => {
321
+ const s = [...v].sort((a, b) => a - b);
322
+ return s.length % 2 ? s[(s.length - 1) / 2] : (s[s.length / 2 - 1] + s[s.length / 2]) / 2;
323
+ };
324
+ const residuals = ys.map((y, i) => y - (slope * xs[i] + intercept));
325
+ const med = median(residuals);
326
+ const mad = median(residuals.map((r) => Math.abs(r - med)));
327
+ if (mad === 0)
328
+ return [];
329
+ const scaled = mad * 1.4826;
330
+ const out = [];
331
+ residuals.forEach((r, i) => {
332
+ if (Math.abs(r - med) / scaled > thresholdMads)
333
+ out.push(i);
334
+ });
335
+ return out;
336
+ }
337
+ }
338
+ //# sourceMappingURL=Regression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Regression.js","sourceRoot":"","sources":["../src/Regression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Shader code generation for `Expr` trees: GLSL ES 3.0 and WGSL.
3
+ *
4
+ * Output is deterministic (no timestamps, ids or hash ordering): the same tree
5
+ * and options always give the same strings, so callers can golden-test them
6
+ * and cache compiled programs by source text.
7
+ */
8
+ import type { Expr } from "./Symbolic.ts";
9
+ export type ShaderDialect = "glsl" | "wgsl";
10
+ export interface ShaderOptions {
11
+ /**
12
+ * `false` (default): every value is a scalar `float` / `f32`.
13
+ * `true`: every value is a complex number held in a `vec2` (x = real,
14
+ * y = imaginary); the variable `i` (unless listed in `variables`) is the
15
+ * imaginary unit and the helper functions the expression needs are emitted once.
16
+ */
17
+ complex?: boolean;
18
+ /**
19
+ * Free variables the expression may mention; they are emitted as identifiers of the
20
+ * same name and must be in scope where the expression is pasted. Default
21
+ * `["x"]` (real) or `["z"]` (complex). A variable not listed is an error.
22
+ */
23
+ variables?: string[];
24
+ /** When set, `source` is a complete function `name(<variables>)` wrapping the expression. */
25
+ functionName?: string;
26
+ }
27
+ export interface ShaderResult {
28
+ /** The expression text, e.g. `sin(x) * 2.0`. Paste it where a float (or vec2) is wanted. */
29
+ expression: string;
30
+ /** Helper function definitions the expression calls, in dependency order; empty when none are needed. */
31
+ helpers: string;
32
+ /** Complete source: `helpers` followed by the wrapping function when `functionName` was given, else `helpers` and nothing more. */
33
+ source: string;
34
+ /** The free variables actually used, sorted. */
35
+ variables: string[];
36
+ }
37
+ export declare class ShaderUnsupportedError extends Error {
38
+ constructor(message: string);
39
+ }
40
+ export declare function compileShader(expr: Expr, dialect: ShaderDialect, options?: ShaderOptions): ShaderResult;
41
+ //# sourceMappingURL=Shader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shader.d.ts","sourceRoot":"","sources":["../src/Shader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,4FAA4F;IAC5F,UAAU,EAAE,MAAM,CAAC;IACnB,yGAAyG;IACzG,OAAO,EAAE,MAAM,CAAC;IAChB,mIAAmI;IACnI,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AA0uBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CA6C3G"}