csaps-js 0.1.0 → 0.1.1
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.cjs +127 -80
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/index.global.js +127 -80
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +127 -80
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/banded.ts","../src/ppoly.ts","../src/umv.ts","../src/ndarray.ts","../src/ndg.ts","../src/csaps.ts"],"names":["c","out","toFloat64","normalizeSmooth"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Symmetric positive-definite banded linear solver via LDLᵀ factorization.\n *\n * The cubic smoothing spline normal equations produce a symmetric, positive\n * definite, pentadiagonal matrix (half-bandwidth 2). scipy solves this with a\n * sparse solver; here we use a banded LDLᵀ factorization which needs no\n * pivoting for SPD systems and is both fast and numerically stable.\n */\n\n/**\n * Solve `A X = B` where `A` is symmetric positive-definite with half-bandwidth\n * `bw`, supplied in lower-band storage.\n *\n * @param n Matrix dimension.\n * @param bw Half-bandwidth (number of sub-diagonals).\n * @param lower Lower-band storage of length `n * (bw + 1)` where\n * `lower[i * (bw + 1) + o] = A[i][i - o]` for `o = 0..bw`\n * (entries referencing negative columns are ignored).\n * @param B Right-hand side, `n` rows × `nrhs` columns (row-major flat array).\n * @param nrhs Number of right-hand-side columns.\n * @returns Solution `X`, `n` rows × `nrhs` columns (row-major flat array).\n */\nexport function ldltBandSolve(\n n: number,\n bw: number,\n lower: Float64Array,\n B: Float64Array,\n nrhs: number,\n): Float64Array {\n const stride = bw + 1;\n // L holds the unit-lower-triangular factor in the same band layout\n // (L[i*stride + o] = L[i][i-o], o >= 1); d holds the diagonal of D.\n const L = new Float64Array(n * stride);\n const d = new Float64Array(n);\n\n for (let i = 0; i < n; i++) {\n const oMax = Math.min(bw, i);\n\n // Off-diagonal factors L[i][i-o], computed for larger o first because the\n // inner sum reads L[i][i-k] with (i-k) > o that must already be finalized.\n for (let o = oMax; o >= 1; o--) {\n const j = i - o;\n let s = lower[i * stride + o]; // A[i][j]\n const kStart = i - bw < 0 ? 0 : i - bw;\n for (let k = kStart; k < j; k++) {\n const oi = i - k;\n const oj = j - k;\n if (oi <= bw && oj <= bw) {\n s -= L[i * stride + oi] * L[j * stride + oj] * d[k];\n }\n }\n L[i * stride + o] = s / d[j];\n }\n\n // Diagonal D[i]\n let di = lower[i * stride];\n for (let o = 1; o <= oMax; o++) {\n const lio = L[i * stride + o];\n di -= lio * lio * d[i - o];\n }\n if (di === 0 || !Number.isFinite(di)) {\n throw new Error('Banded LDLᵀ solve failed: matrix is singular or ill-conditioned.');\n }\n d[i] = di;\n }\n\n const X = new Float64Array(n * nrhs);\n X.set(B);\n\n // Forward substitution: solve L Y = B (in place in X).\n for (let i = 0; i < n; i++) {\n const oMax = Math.min(bw, i);\n for (let c = 0; c < nrhs; c++) {\n let v = X[i * nrhs + c];\n for (let o = 1; o <= oMax; o++) {\n v -= L[i * stride + o] * X[(i - o) * nrhs + c];\n }\n X[i * nrhs + c] = v;\n }\n }\n\n // Diagonal solve: D Z = Y.\n for (let i = 0; i < n; i++) {\n const inv = 1 / d[i];\n for (let c = 0; c < nrhs; c++) {\n X[i * nrhs + c] *= inv;\n }\n }\n\n // Back substitution: solve Lᵀ X = Z.\n for (let i = n - 1; i >= 0; i--) {\n const oMaxUp = Math.min(bw, n - 1 - i);\n for (let c = 0; c < nrhs; c++) {\n let v = X[i * nrhs + c];\n for (let o = 1; o <= oMaxUp; o++) {\n v -= L[(i + o) * stride + o] * X[(i + o) * nrhs + c];\n }\n X[i * nrhs + c] = v;\n }\n }\n\n return X;\n}\n","/**\n * Piecewise-polynomial evaluation in local power basis.\n *\n * Mirrors the relevant behaviour of `scipy.interpolate.PPoly`:\n * - coefficients are stored highest-order first,\n * - each piece is evaluated in the local variable `s = xq - breaks[i]`,\n * - intervals are half-open `[x[i], x[i+1])` except the last, which is closed,\n * - out-of-bounds points are extrapolated from the first/last piece (or NaN).\n */\n\nexport type Extrapolate = boolean;\n\n/**\n * Univariate (optionally multi-component) piecewise polynomial.\n *\n * Coefficients are stored as a flat C-contiguous array with logical shape\n * `(order, pieces, ndim)`: `c[k][i][n] = data[(k * pieces + i) * ndim + n]`,\n * where `k` indexes the polynomial coefficient (highest power first), `i` the\n * piece and `n` the data component (`ndim === 1` for univariate data).\n */\nexport class PPoly {\n constructor(\n readonly c: Float64Array,\n readonly breaks: Float64Array,\n readonly order: number,\n readonly pieces: number,\n readonly ndim: number,\n ) {}\n\n /** Locate the piece index for `xq`, or `-1` when out of bounds and not extrapolating. */\n private findPiece(xq: number, extrapolate: Extrapolate): number {\n const b = this.breaks;\n const last = this.pieces;\n if (xq < b[0]) return extrapolate ? 0 : -1;\n if (xq > b[last]) return extrapolate ? this.pieces - 1 : -1;\n if (xq >= b[last]) return this.pieces - 1;\n // Binary search for the largest i with breaks[i] <= xq.\n let lo = 0;\n let hi = this.pieces - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (b[mid] <= xq) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n /** Evaluate component `n` at scalar `xq` with derivative order `nu`. */\n private evalScalar(n: number, xq: number, nu: number, extrapolate: Extrapolate): number {\n const i = this.findPiece(xq, extrapolate);\n if (i < 0) return NaN;\n const s = xq - this.breaks[i];\n const order = this.order;\n const pieces = this.pieces;\n const ndim = this.ndim;\n let res = 0;\n for (let k = 0; k < order; k++) {\n const e = order - 1 - k; // power of s for this coefficient\n if (e < nu) continue;\n let f = 1;\n for (let t = 0; t < nu; t++) f *= e - t; // falling factorial e·(e-1)···(e-nu+1)\n const coef = this.c[(k * pieces + i) * ndim + n];\n res += coef * f * Math.pow(s, e - nu);\n }\n return res;\n }\n\n /**\n * Evaluate all components at every point in `xs`.\n *\n * @returns Flat row-major array with logical shape `(ndim, xs.length)`:\n * `out[n * xs.length + q]`.\n */\n evalAll(xs: ArrayLike<number>, nu: number, extrapolate: Extrapolate): Float64Array {\n const L = xs.length;\n const out = new Float64Array(this.ndim * L);\n for (let q = 0; q < L; q++) {\n const xq = xs[q];\n for (let n = 0; n < this.ndim; n++) {\n out[n * L + q] = this.evalScalar(n, xq, nu, extrapolate);\n }\n }\n return out;\n }\n}\n","/**\n * Univariate / multivariate cubic smoothing spline.\n *\n * Direct port of the algorithm in `csaps._sspumv` (which itself follows\n * C. de Boor, \"A Practical Guide to Splines\"). The smoothing spline minimizes\n *\n * p · Σ wᵢ (yᵢ − f(xᵢ))² + (1 − p) · ∫ f''(x)² dx\n *\n * where `p ∈ [0, 1]` is the smoothing parameter: `p = 1` interpolates the data\n * (natural cubic spline), `p = 0` gives the weighted least-squares straight line.\n */\n\nimport { ldltBandSolve } from './banded';\nimport { PPoly, type Extrapolate } from './ppoly';\n\nexport interface MakeSplineResult {\n pp: PPoly;\n smooth: number;\n}\n\n/** Default smoothing parameter: makes `p·trace(R)` equal `(1−p)·6·trace(QᵀW⁻¹Q)`. */\nfunction computeSmooth(traceR: number, traceQtw: number): number {\n return 1.0 / (1.0 + traceR / (6.0 * traceQtw));\n}\n\n/**\n * Normalized smoothing parameter (csaps `normalizedsmooth=True`): rescales `p`\n * so results are invariant to the `x` range and less sensitive to weight and\n * sample-site clumping. See https://github.com/espdev/csaps/pull/47.\n */\nfunction normalizeSmooth(x: Float64Array, w: Float64Array, smooth: number | null): number {\n const n = x.length;\n let xmin = x[0];\n let xmax = x[0];\n for (let i = 1; i < n; i++) {\n if (x[i] < xmin) xmin = x[i];\n if (x[i] > xmax) xmax = x[i];\n }\n const span = xmax - xmin;\n\n let sumDx2 = 0;\n for (let i = 0; i < n - 1; i++) {\n const d = x[i + 1] - x[i];\n sumDx2 += d * d;\n }\n const effX = 1 + (span * span) / sumDx2;\n\n let sw = 0;\n let sw2 = 0;\n for (let i = 0; i < n; i++) {\n sw += w[i];\n sw2 += w[i] * w[i];\n }\n const effW = (sw * sw) / sw2;\n\n const k = 80 * Math.pow(span, 3) * Math.pow(n, -2) * Math.pow(effX, -0.5) * Math.pow(effW, -0.5);\n\n const s = smooth == null ? 0.5 : smooth;\n return s / (s + (1 - s) * k);\n}\n\n/**\n * Build the cubic smoothing spline for `y2d` (an `N × M` array of `N` data\n * components / curves sampled at the `M` sites `x`).\n *\n * @returns a {@link PPoly} with coefficients shaped `(order, pieces, N)` and the\n * effective smoothing parameter.\n */\nexport function makeSpline(\n x: Float64Array,\n y2d: number[][],\n w: Float64Array,\n smooth: number | null,\n normalizedsmooth: boolean,\n): MakeSplineResult {\n const M = x.length;\n const N = y2d.length;\n\n const dx = new Float64Array(M - 1);\n for (let i = 0; i < M - 1; i++) {\n dx[i] = x[i + 1] - x[i];\n if (!(dx[i] > 0)) {\n throw new Error(\"Items of 'xdata' must satisfy x1 < x2 < ... < xN.\");\n }\n }\n\n // Divided differences dy/dx for every component: N × (M-1).\n const dydx: number[][] = new Array(N);\n for (let n = 0; n < N; n++) {\n const row = new Float64Array(M - 1);\n const yn = y2d[n];\n for (let i = 0; i < M - 1; i++) row[i] = (yn[i + 1] - yn[i]) / dx[i];\n dydx[n] = row as unknown as number[];\n }\n\n // Corner case: two points → linear segment (order-2 spline), p ≡ 1.\n if (M === 2) {\n const c = new Float64Array(2 * 1 * N);\n for (let n = 0; n < N; n++) {\n c[0 * N + n] = dydx[n][0]; // slope\n c[1 * N + n] = y2d[n][0]; // intercept at left break\n }\n return { pp: new PPoly(c, Float64Array.from(x), 2, 1, N), smooth: 1 };\n }\n\n const m = M - 2;\n\n const dr = new Float64Array(M - 1); // 1/dx\n for (let i = 0; i < M - 1; i++) dr[i] = 1 / dx[i];\n const iw = new Float64Array(M); // 1/w\n for (let i = 0; i < M; i++) iw[i] = 1 / w[i];\n\n // Diagonals of QᵀW⁻¹Q (symmetric, pentadiagonal): main, +1, +2.\n const qd = new Float64Array(m);\n for (let i = 0; i < m; i++) {\n const a = dr[i];\n const b = dr[i] + dr[i + 1];\n const cc = dr[i + 1];\n qd[i] = a * a * iw[i] + b * b * iw[i + 1] + cc * cc * iw[i + 2];\n }\n const q1 = new Float64Array(Math.max(0, m - 1));\n for (let i = 0; i < m - 1; i++) {\n q1[i] = -dr[i + 1] * (dr[i] + dr[i + 1]) * iw[i + 1] - dr[i + 1] * (dr[i + 1] + dr[i + 2]) * iw[i + 2];\n }\n const q2 = new Float64Array(Math.max(0, m - 2));\n for (let i = 0; i < m - 2; i++) {\n q2[i] = dr[i + 1] * dr[i + 2] * iw[i + 2];\n }\n\n // Resolve smoothing parameter.\n let p: number;\n if (normalizedsmooth) {\n p = normalizeSmooth(x, w, smooth);\n } else if (smooth == null) {\n let traceR = 0;\n let traceQ = 0;\n for (let i = 0; i < m; i++) {\n traceR += 2 * (dx[i] + dx[i + 1]);\n traceQ += qd[i];\n }\n p = computeSmooth(traceR, traceQ);\n } else {\n p = smooth;\n }\n\n const pp6 = 6.0 * (1.0 - p);\n\n // Symmetric pentadiagonal system A = pp6·QᵀW⁻¹Q + p·R in lower-band storage.\n const lower = new Float64Array(m * 3);\n for (let i = 0; i < m; i++) {\n const rii = 2 * (dx[i] + dx[i + 1]);\n lower[i * 3] = pp6 * qd[i] + p * rii;\n if (i >= 1) lower[i * 3 + 1] = pp6 * q1[i - 1] + p * dx[i]; // A[i,i-1], R[i-1,i] = dx[i]\n if (i >= 2) lower[i * 3 + 2] = pp6 * q2[i - 2]; // A[i,i-2]\n }\n\n // Right-hand side: second divided difference of dy/dx, shape m × N.\n const B = new Float64Array(m * N);\n for (let i = 0; i < m; i++) {\n for (let n = 0; n < N; n++) B[i * N + n] = dydx[n][i + 1] - dydx[n][i];\n }\n\n const U = ldltBandSolve(m, 2, lower, B, N); // m × N\n\n // u padded with zero rows top & bottom → logical index 0..M-1.\n const uAt = (r: number, n: number): number => (r === 0 || r === M - 1 ? 0 : U[(r - 1) * N + n]);\n\n // d1 = diff(pad(u)) / dx, shape (M-1) × N.\n const d1 = new Float64Array((M - 1) * N);\n for (let i = 0; i < M - 1; i++) {\n const inv = dr[i];\n for (let n = 0; n < N; n++) d1[i * N + n] = (uAt(i + 1, n) - uAt(i, n)) * inv;\n }\n const d1At = (r: number, n: number): number => (r === 0 || r === M ? 0 : d1[(r - 1) * N + n]);\n\n // d2 = diff(pad(d1)), shape M × N.\n const d2 = new Float64Array(M * N);\n for (let i = 0; i < M; i++) {\n for (let n = 0; n < N; n++) d2[i * N + n] = d1At(i + 1, n) - d1At(i, n);\n }\n\n // yi = yᵀ − pp6·W⁻¹·d2, shape M × N.\n const yi = new Float64Array(M * N);\n for (let i = 0; i < M; i++) {\n const f = pp6 * iw[i];\n for (let n = 0; n < N; n++) yi[i * N + n] = y2d[n][i] - f * d2[i * N + n];\n }\n\n // pu = pad(p·u), logical index 0..M-1.\n const puAt = (r: number, n: number): number => (r === 0 || r === M - 1 ? 0 : p * U[(r - 1) * N + n]);\n\n // Assemble coefficients, shape (4, M-1, N), highest order first.\n const pieces = M - 1;\n const c = new Float64Array(4 * pieces * N);\n for (let i = 0; i < pieces; i++) {\n const h = dx[i];\n const invh = dr[i];\n for (let n = 0; n < N; n++) {\n const pu0 = puAt(i, n);\n const pu1 = puAt(i + 1, n);\n const yi0 = yi[i * N + n];\n const yi1 = yi[(i + 1) * N + n];\n const c1 = (pu1 - pu0) * invh;\n const c2 = 3 * pu0;\n const c3 = (yi1 - yi0) * invh - h * (2 * pu0 + pu1);\n const c4 = yi0;\n c[(0 * pieces + i) * N + n] = c1;\n c[(1 * pieces + i) * N + n] = c2;\n c[(2 * pieces + i) * N + n] = c3;\n c[(3 * pieces + i) * N + n] = c4;\n }\n }\n\n return { pp: new PPoly(c, Float64Array.from(x), 4, pieces, N), smooth: p };\n}\n\n// ---------------------------------------------------------------------------\n// Public class\n// ---------------------------------------------------------------------------\n\nexport type UnivariateData = number[] | Float64Array;\nexport type MultivariateData = number[] | number[][] | Float64Array;\n\nexport interface CubicSmoothingSplineOptions {\n /** Per-site weights (length = number of `x` sites). */\n weights?: UnivariateData;\n /** Smoothing parameter in `[0, 1]`. Omit / `null` to compute it automatically. */\n smooth?: number | null;\n /** Axis of `ydata` that varies with `x` (for 2-D `ydata`). Default `-1` (last). */\n axis?: number;\n /** Normalize the smoothing parameter to be invariant to the `x` range. */\n normalizedsmooth?: boolean;\n}\n\nexport interface EvaluateOptions {\n /** Derivative order to evaluate (default `0`). */\n nu?: number;\n /** Extrapolate out-of-bounds points (default `true`); otherwise return `NaN`. */\n extrapolate?: Extrapolate;\n}\n\nfunction toFloat64(a: ArrayLike<number>): Float64Array {\n return a instanceof Float64Array ? a : Float64Array.from(a);\n}\n\ninterface Prepared {\n x: Float64Array;\n y2d: number[][];\n w: Float64Array;\n restore: (flat: Float64Array, L: number) => number[] | number[][];\n}\n\nfunction prepareUnivariate(\n xdata: UnivariateData,\n ydata: MultivariateData,\n weights: UnivariateData | undefined,\n axis: number,\n): Prepared {\n const x = toFloat64(xdata);\n const M = x.length;\n if (x.length < 2) throw new Error(\"'xdata' must contain at least 2 data points.\");\n\n let y2d: number[][];\n let isVector: boolean;\n let transposed = false;\n\n const first = (ydata as unknown[])[0];\n if (Array.isArray(first) || first instanceof Float64Array) {\n // 2-D ydata: shape [R][C].\n const y = ydata as number[][];\n const R = y.length;\n const C = y[0].length;\n const ndimY = 2;\n const ax = axis < 0 ? ndimY + axis : axis;\n if (ax === 1) {\n if (C !== M) throw new Error(`'ydata' shape[${ax}] (${C}) must equal 'xdata' size (${M}).`);\n y2d = y.map((row) => Array.from(row));\n } else if (ax === 0) {\n if (R !== M) throw new Error(`'ydata' shape[${ax}] (${R}) must equal 'xdata' size (${M}).`);\n // columns are curves → transpose to N × M.\n transposed = true;\n y2d = new Array(C);\n for (let n = 0; n < C; n++) {\n const row = new Array(M);\n for (let i = 0; i < M; i++) row[i] = y[i][n];\n y2d[n] = row;\n }\n } else {\n throw new Error(`Unsupported axis ${axis} for 2-D ydata.`);\n }\n isVector = false;\n } else {\n // 1-D ydata.\n const y = Array.from(ydata as ArrayLike<number>);\n if (y.length !== M) throw new Error(`'ydata' size (${y.length}) must equal 'xdata' size (${M}).`);\n y2d = [y];\n isVector = true;\n }\n\n let w: Float64Array;\n if (weights == null) {\n w = new Float64Array(M).fill(1);\n } else {\n w = toFloat64(weights);\n if (w.length !== M) throw new Error('Weights vector size must equal xdata size.');\n }\n\n const N = y2d.length;\n const restore = (flat: Float64Array, L: number): number[] | number[][] => {\n if (isVector) {\n const out = new Array(L);\n for (let q = 0; q < L; q++) out[q] = flat[q];\n return out;\n }\n if (transposed) {\n const out: number[][] = new Array(L);\n for (let q = 0; q < L; q++) {\n const row = new Array(N);\n for (let n = 0; n < N; n++) row[n] = flat[n * L + q];\n out[q] = row;\n }\n return out;\n }\n const out: number[][] = new Array(N);\n for (let n = 0; n < N; n++) {\n const row = new Array(L);\n for (let q = 0; q < L; q++) row[q] = flat[n * L + q];\n out[n] = row;\n }\n return out;\n };\n\n return { x, y2d, w, restore };\n}\n\n/**\n * Cubic smoothing spline for univariate or multivariate data sampled at common\n * sites `x`.\n */\nexport class CubicSmoothingSpline {\n /** Effective smoothing parameter actually used. */\n readonly smooth: number;\n private readonly pp: PPoly;\n private readonly restore: (flat: Float64Array, L: number) => number[] | number[][];\n\n constructor(xdata: UnivariateData, ydata: MultivariateData, options: CubicSmoothingSplineOptions = {}) {\n const { weights, smooth = null, axis = -1, normalizedsmooth = false } = options;\n const prep = prepareUnivariate(xdata, ydata, weights, axis);\n const res = makeSpline(prep.x, prep.y2d, prep.w, smooth ?? null, normalizedsmooth);\n this.pp = res.pp;\n this.smooth = res.smooth;\n this.restore = prep.restore;\n }\n\n /** Evaluate the spline (or one of its derivatives) at the sites `xi`. */\n evaluate(xi: UnivariateData, options: EvaluateOptions = {}): number[] | number[][] {\n const { nu = 0, extrapolate = true } = options;\n const xs = toFloat64(xi);\n const flat = this.pp.evalAll(xs, nu, extrapolate);\n return this.restore(flat, xs.length);\n }\n\n /** Breakpoints (data sites) of the piecewise polynomial. */\n get breaks(): number[] {\n return Array.from(this.pp.breaks);\n }\n\n /** Spline description: breakpoints, raw coefficients and shape metadata. */\n get spline(): {\n breaks: number[];\n coeffs: Float64Array;\n order: number;\n pieces: number;\n ndim: number;\n } {\n return {\n breaks: Array.from(this.pp.breaks),\n coeffs: this.pp.c,\n order: this.pp.order,\n pieces: this.pp.pieces,\n ndim: this.pp.ndim,\n };\n }\n\n /** Internal piecewise polynomial (used by the N-D grid spline). */\n get _pp(): PPoly {\n return this.pp;\n }\n}\n","/**\n * Minimal C-contiguous n-dimensional array used by the N-D grid spline.\n *\n * Only the operations required by the tensor-product algorithm are provided:\n * `reshape` (metadata-only, since data is always C-contiguous) and `transpose`\n * (which materializes a permuted copy). This keeps the gridded code free of\n * stride bookkeeping while remaining exact.\n */\nexport class NdArray {\n constructor(\n readonly data: Float64Array,\n readonly shape: number[],\n ) {}\n\n get size(): number {\n return this.data.length;\n }\n\n /** Reinterpret the buffer with a new shape (must keep the same element count). */\n reshape(shape: number[]): NdArray {\n return new NdArray(this.data, shape.slice());\n }\n\n /** Return a new array with axes permuted according to `perm`, materialized C-contiguous. */\n transpose(perm: number[]): NdArray {\n const d = this.shape.length;\n const newShape = perm.map((axis) => this.shape[axis]);\n\n const oldStrides = cStrides(this.shape);\n const permutedStrides = perm.map((axis) => oldStrides[axis]);\n\n const total = this.data.length;\n const out = new Float64Array(total);\n const idx = new Array(d).fill(0);\n\n for (let pos = 0; pos < total; pos++) {\n let off = 0;\n for (let a = 0; a < d; a++) off += idx[a] * permutedStrides[a];\n out[pos] = this.data[off];\n // Increment the C-order odometer over newShape.\n for (let a = d - 1; a >= 0; a--) {\n if (++idx[a] < newShape[a]) break;\n idx[a] = 0;\n }\n }\n\n return new NdArray(out, newShape);\n }\n}\n\n/** Row-major (C-order) strides for a given shape. */\nexport function cStrides(shape: number[]): number[] {\n const d = shape.length;\n const strides = new Array(d).fill(1);\n for (let a = d - 2; a >= 0; a--) strides[a] = strides[a + 1] * shape[a + 1];\n return strides;\n}\n\n/** Product of a list of numbers (empty list → 1). */\nexport function prod(xs: number[]): number {\n let p = 1;\n for (const x of xs) p *= x;\n return p;\n}\n\n/**\n * Flatten an arbitrarily nested numeric array into a C-contiguous buffer plus\n * its shape. Assumes a rectangular (non-ragged) structure.\n */\nexport function flattenNested(y: unknown): { data: Float64Array; shape: number[] } {\n const shape: number[] = [];\n let node: unknown = y;\n while (Array.isArray(node)) {\n shape.push(node.length);\n node = node[0];\n }\n const data = new Float64Array(prod(shape));\n let k = 0;\n const fill = (n: unknown, depth: number): void => {\n if (depth === shape.length) {\n data[k++] = n as number;\n return;\n }\n const a = n as unknown[];\n if (a.length !== shape[depth]) {\n throw new Error('flattenNested: input array is ragged (non-rectangular).');\n }\n for (let i = 0; i < a.length; i++) fill(a[i], depth + 1);\n };\n fill(y, 0);\n return { data, shape };\n}\n\n/** Rebuild a nested numeric array from a flat C-contiguous buffer and shape. */\nexport function nestArray(data: ArrayLike<number>, shape: number[]): number[] | number[][] | unknown {\n const strides = cStrides(shape);\n const build = (depth: number, offset: number): unknown => {\n if (depth === shape.length - 1) {\n const row: number[] = new Array(shape[depth]);\n for (let i = 0; i < shape[depth]; i++) row[i] = data[offset + i];\n return row;\n }\n const arr: unknown[] = new Array(shape[depth]);\n for (let i = 0; i < shape[depth]; i++) arr[i] = build(depth + 1, offset + i * strides[depth]);\n return arr;\n };\n return build(0, 0) as number[] | number[][];\n}\n","/**\n * N-D gridded cubic smoothing spline (piecewise tensor-product polynomial).\n *\n * Port of `csaps._sspndg`. The smoothing spline is built coordinate-wise: the\n * univariate smoother is applied along each grid axis in turn, accumulating a\n * tensor-product coefficient array. Evaluation contracts one axis at a time by\n * reusing the univariate {@link PPoly} evaluator.\n */\n\nimport { NdArray, flattenNested, nestArray } from './ndarray';\nimport { PPoly, type Extrapolate } from './ppoly';\nimport { makeSpline, type UnivariateData } from './umv';\n\nexport interface NdGridCubicSmoothingSplineOptions {\n /** Per-axis weight vectors (each length = that axis' site count). A single vector is allowed for a 1-D grid. */\n weights?: number[][] | number[];\n /** Smoothing parameter(s) in `[0, 1]`: a single value, one per axis, or `null` to auto-compute. */\n smooth?: number | (number | null)[] | null;\n /** Normalize the smoothing parameter to be invariant to each axis' range. */\n normalizedsmooth?: boolean;\n}\n\nexport interface NdEvaluateOptions {\n /** Per-axis derivative orders (default `0` for every axis). */\n nu?: number[];\n /** Extrapolate out-of-bounds points (default `true`); otherwise return `NaN`. */\n extrapolate?: Extrapolate;\n}\n\nfunction toFloat64(a: ArrayLike<number>): Float64Array {\n return a instanceof Float64Array ? a : Float64Array.from(a);\n}\n\nfunction prepareVectors(data: ArrayLike<number>[], name: string, minSize = 2): Float64Array[] {\n if (!Array.isArray(data)) throw new TypeError(`'${name}' must be a sequence of 1-D vectors.`);\n return data.map((d, axis) => {\n const v = toFloat64(d);\n if (v.length < minSize) {\n throw new Error(`'${name}' must contain at least ${minSize} points for axis ${axis}.`);\n }\n return v;\n });\n}\n\ninterface BuiltGrid {\n F: NdArray;\n breaks: Float64Array[];\n orders: number[];\n pieces: number[];\n smooths: number[];\n}\n\nfunction buildGrid(\n xs: Float64Array[],\n yNd: NdArray,\n weights: (Float64Array | undefined)[],\n smooth: (number | null)[],\n normalizedsmooth: boolean,\n): BuiltGrid {\n const d = xs.length;\n const orders = new Array<number>(d);\n const pieces = new Array<number>(d);\n const smooths = new Array<number>(d);\n\n // Permutation that moves the last axis to the front.\n const permute = [d - 1];\n for (let a = 0; a < d - 1; a++) permute.push(a);\n\n let coeffs = yNd;\n let shape = yNd.shape.slice();\n\n for (let i = d - 1; i >= 0; i--) {\n const lastSize = shape[shape.length - 1];\n const total = coeffs.data.length;\n const Nrest = total / lastSize;\n\n // Treat the buffer as Nrest \"curves\" of length lastSize.\n const y2d: number[][] = new Array(Nrest);\n for (let n = 0; n < Nrest; n++) {\n const row = new Array<number>(lastSize);\n const base = n * lastSize;\n for (let col = 0; col < lastSize; col++) row[col] = coeffs.data[base + col];\n y2d[n] = row;\n }\n\n const w = weights[i] ?? new Float64Array(lastSize).fill(1);\n const res = makeSpline(xs[i], y2d, w, smooth[i], normalizedsmooth);\n const order = res.pp.order;\n const pcs = res.pp.pieces;\n orders[i] = order;\n pieces[i] = pcs;\n smooths[i] = res.smooth;\n\n // Flatten canonical (order, pcs, Nrest) → (Nrest, order*pcs), order-major in j.\n const op = order * pcs;\n const flat = new Float64Array(Nrest * op);\n for (let k = 0; k < order; k++) {\n for (let ii = 0; ii < pcs; ii++) {\n const j = k * pcs + ii;\n const cBase = j * Nrest;\n for (let n = 0; n < Nrest; n++) flat[n * op + j] = res.pp.c[cBase + n];\n }\n }\n\n const newShape = shape.slice(0, -1);\n newShape.push(op);\n coeffs = new NdArray(flat, newShape).transpose(permute);\n shape = coeffs.shape.slice();\n }\n\n return { F: coeffs, breaks: xs, orders, pieces, smooths };\n}\n\nfunction evalGrid(\n built: { F: NdArray; breaks: Float64Array[]; orders: number[]; pieces: number[] },\n xiList: Float64Array[],\n nu: number[],\n extrapolate: Extrapolate,\n): NdArray {\n const { F, breaks, orders, pieces } = built;\n const d = breaks.length;\n\n const permute = [d - 1];\n for (let a = 0; a < d - 1; a++) permute.push(a);\n\n let coeffs = F;\n let shape = F.shape.slice();\n\n for (let i = d - 1; i >= 0; i--) {\n const order = orders[i];\n const pcs = pieces[i];\n const lastSize = shape[shape.length - 1]; // order * pcs\n const total = coeffs.data.length;\n const Nrest = total / lastSize;\n\n // Rebuild canonical (order, pcs, Nrest) from the (Nrest, order*pcs) layout.\n const cc = new Float64Array(order * pcs * Nrest);\n for (let k = 0; k < order; k++) {\n for (let ii = 0; ii < pcs; ii++) {\n const j = k * pcs + ii;\n const dst = (k * pcs + ii) * Nrest;\n for (let n = 0; n < Nrest; n++) cc[dst + n] = coeffs.data[n * lastSize + j];\n }\n }\n\n const pp = new PPoly(cc, breaks[i], order, pcs, Nrest);\n const xi = xiList[i];\n const Li = xi.length;\n const out = pp.evalAll(xi, nu[i] ?? 0, extrapolate); // (Nrest, Li) row-major\n\n const newShape = shape.slice(0, -1);\n newShape.push(Li);\n coeffs = new NdArray(out, newShape).transpose(permute);\n shape = coeffs.shape.slice();\n }\n\n return coeffs;\n}\n\nfunction normalizeSmooth(smooth: number | (number | null)[] | null | undefined, d: number): (number | null)[] {\n if (smooth == null) return new Array(d).fill(null);\n if (Array.isArray(smooth)) {\n if (smooth.length !== d) {\n throw new Error(`Number of smoothing values (${smooth.length}) must equal dimensions (${d}).`);\n }\n return smooth.map((s) => (s == null ? null : s));\n }\n return new Array(d).fill(smooth);\n}\n\nfunction normalizeWeights(\n weights: number[][] | number[] | undefined,\n d: number,\n sizes: number[],\n): (Float64Array | undefined)[] {\n if (weights == null) return new Array(d).fill(undefined);\n const w = weights as unknown[];\n const firstIsVector = Array.isArray(w[0]) || (w[0] as unknown) instanceof Float64Array;\n let list: ArrayLike<number>[];\n if (!firstIsVector) {\n // A single flat vector — only valid for a 1-D grid.\n if (d !== 1) throw new Error(\"'weights' must be a sequence of vectors, one per axis.\");\n list = [weights as number[]];\n } else {\n list = weights as number[][];\n }\n if (list.length !== d) throw new Error(`'weights' dimensions (${list.length}) must equal 'xdata' dimensions (${d}).`);\n return list.map((wv, axis) => {\n const v = toFloat64(wv);\n if (v.length !== sizes[axis]) {\n throw new Error(`'weights' size (${v.length}) must equal 'xdata' size (${sizes[axis]}) for axis ${axis}.`);\n }\n return v;\n });\n}\n\n/** N-D gridded cubic smoothing spline. */\nexport class NdGridCubicSmoothingSpline {\n /** Effective per-axis smoothing parameters. */\n readonly smooth: number[];\n private readonly built: BuiltGrid;\n\n constructor(\n xdata: number[][],\n ydata: number[] | number[][] | number[][][] | unknown,\n options: NdGridCubicSmoothingSplineOptions = {},\n ) {\n const xs = prepareVectors(xdata, 'xdata');\n const d = xs.length;\n const sizes = xs.map((v) => v.length);\n\n const { data, shape } = flattenNested(ydata);\n if (shape.length !== d) {\n throw new Error(`'ydata' must have ${d} dimensions according to 'xdata' (got ${shape.length}).`);\n }\n for (let a = 0; a < d; a++) {\n if (shape[a] !== sizes[a]) {\n throw new Error(`'ydata' size (${shape[a]}) and 'xdata' size (${sizes[a]}) mismatch for axis ${a}.`);\n }\n }\n\n const smooth = normalizeSmooth(options.smooth, d);\n const weights = normalizeWeights(options.weights, d, sizes);\n\n this.built = buildGrid(xs, new NdArray(data, shape), weights, smooth, options.normalizedsmooth ?? false);\n this.smooth = this.built.smooths;\n }\n\n /** Evaluate the spline on the grid defined by the sequence of site vectors `xi`. */\n evaluate(xi: number[][], options: NdEvaluateOptions = {}): number[] | number[][] | unknown {\n const d = this.built.breaks.length;\n const xiList = prepareVectors(xi, 'xi', 1);\n if (xiList.length !== d) throw new Error(`'xi' must have length ${d} according to the grid.`);\n const nu = options.nu ?? new Array(d).fill(0);\n const extrapolate = options.extrapolate ?? true;\n const result = evalGrid(this.built, xiList, nu, extrapolate);\n return nestArray(result.data, result.shape);\n }\n\n /** Spline description: per-axis breakpoints, raw coefficient tensor and shape metadata. */\n get spline(): {\n breaks: number[][];\n coeffs: Float64Array;\n coeffsShape: number[];\n order: number[];\n pieces: number[];\n } {\n return {\n breaks: this.built.breaks.map((b) => Array.from(b)),\n coeffs: this.built.F.data,\n coeffsShape: this.built.F.shape.slice(),\n order: this.built.orders.slice(),\n pieces: this.built.pieces.slice(),\n };\n }\n}\n\nexport type { UnivariateData };\n","/**\n * The `csaps` shortcut function — the primary entry point for smoothing data.\n */\n\nimport {\n CubicSmoothingSpline,\n type CubicSmoothingSplineOptions,\n type MultivariateData,\n type UnivariateData,\n} from './umv';\nimport { NdGridCubicSmoothingSpline, type NdGridCubicSmoothingSplineOptions } from './ndg';\n\n/** Result returned when smoothing data while the smoothing parameter is computed automatically. */\nexport interface AutoSmoothingResult {\n /** Smoothed data values. */\n values: number[] | number[][] | unknown;\n /** The smoothing parameter(s) that were computed. */\n smooth: number | number[];\n}\n\nexport interface CsapsOptions {\n /** Weights: a single vector (univariate) or one vector per axis (gridded). */\n weights?: number[] | number[][] | Float64Array;\n /** Smoothing parameter(s) in `[0, 1]`: a value, one per grid axis, or `null`/omitted to auto-compute. */\n smooth?: number | (number | null)[] | null;\n /** Axis of `ydata` that varies with `x` (univariate 2-D data only). Default `-1`. */\n axis?: number;\n /** Normalize the smoothing parameter to be invariant to the data range. */\n normalizedsmooth?: boolean;\n}\n\nfunction isVectorList(x: unknown): boolean {\n return Array.isArray(x) && x.length > 0 && (Array.isArray(x[0]) || x[0] instanceof Float64Array);\n}\n\nfunction isArrayLike(x: unknown): boolean {\n return Array.isArray(x) || x instanceof Float64Array;\n}\n\n// --- Overloads -------------------------------------------------------------\n\n/** Build a univariate / multivariate smoothing spline (no evaluation sites given). */\nexport function csaps(\n xdata: UnivariateData,\n ydata: MultivariateData,\n options?: CubicSmoothingSplineOptions,\n): CubicSmoothingSpline;\n/** Build an N-D gridded smoothing spline (no evaluation sites given). */\nexport function csaps(\n xdata: number[][],\n ydata: number[] | number[][] | number[][][],\n options?: NdGridCubicSmoothingSplineOptions,\n): NdGridCubicSmoothingSpline;\n/** Smooth univariate / multivariate data at the given evaluation sites. */\nexport function csaps(\n xdata: UnivariateData,\n ydata: MultivariateData,\n xidata: UnivariateData,\n options?: CubicSmoothingSplineOptions,\n): number[] | number[][] | AutoSmoothingResult;\n/** Smooth N-D gridded data at the given evaluation grid. */\nexport function csaps(\n xdata: number[][],\n ydata: number[] | number[][] | number[][][],\n xidata: number[][],\n options?: NdGridCubicSmoothingSplineOptions,\n): number[] | number[][] | unknown | AutoSmoothingResult;\n\n// --- Implementation --------------------------------------------------------\n\nexport function csaps(\n xdata: UnivariateData | number[][],\n ydata: unknown,\n arg3?: unknown,\n arg4?: unknown,\n):\n | CubicSmoothingSpline\n | NdGridCubicSmoothingSpline\n | number[]\n | number[][]\n | unknown\n | AutoSmoothingResult {\n let xidata: unknown;\n let options: CsapsOptions;\n\n if (arg3 === undefined) {\n xidata = undefined;\n options = (arg4 as CsapsOptions) ?? {};\n } else if (isArrayLike(arg3)) {\n xidata = arg3;\n options = (arg4 as CsapsOptions) ?? {};\n } else {\n xidata = undefined;\n options = (arg3 as CsapsOptions) ?? {};\n }\n\n const grid = isVectorList(xdata);\n\n const spline: CubicSmoothingSpline | NdGridCubicSmoothingSpline = grid\n ? new NdGridCubicSmoothingSpline(xdata as number[][], ydata, {\n weights: options.weights as number[][] | number[] | undefined,\n smooth: options.smooth,\n normalizedsmooth: options.normalizedsmooth,\n })\n : new CubicSmoothingSpline(xdata as UnivariateData, ydata as MultivariateData, {\n weights: options.weights as UnivariateData | undefined,\n smooth: typeof options.smooth === 'number' ? options.smooth : (options.smooth as null | undefined) ?? null,\n axis: options.axis,\n normalizedsmooth: options.normalizedsmooth,\n });\n\n if (xidata === undefined) return spline;\n\n const values = grid\n ? (spline as NdGridCubicSmoothingSpline).evaluate(xidata as number[][])\n : (spline as CubicSmoothingSpline).evaluate(xidata as UnivariateData);\n\n const sm = options.smooth;\n const autoSmooth = Array.isArray(sm) ? sm.some((s) => s == null) : sm == null;\n\n if (autoSmooth) {\n return { values, smooth: spline.smooth } as AutoSmoothingResult;\n }\n return values as number[] | number[][];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/banded.ts","../src/ppoly.ts","../src/umv.ts","../src/ndarray.ts","../src/ndg.ts","../src/csaps.ts"],"names":["c","out","toFloat64","normalizeSmooth"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Symmetric positive-definite banded linear solver via LDLᵀ factorization.\n *\n * The cubic smoothing spline normal equations produce a symmetric, positive\n * definite, pentadiagonal matrix (half-bandwidth 2). scipy solves this with a\n * sparse solver; here we use a banded LDLᵀ factorization which needs no\n * pivoting for SPD systems and is both fast and numerically stable.\n */\n\n/**\n * Solve `A X = B` where `A` is symmetric positive-definite with half-bandwidth\n * `bw`, supplied in lower-band storage.\n *\n * @param n Matrix dimension.\n * @param bw Half-bandwidth (number of sub-diagonals).\n * @param lower Lower-band storage of length `n * (bw + 1)` where\n * `lower[i * (bw + 1) + o] = A[i][i - o]` for `o = 0..bw`\n * (entries referencing negative columns are ignored).\n * @param B Right-hand side, `n` rows × `nrhs` columns (row-major flat array).\n * @param nrhs Number of right-hand-side columns.\n * @returns Solution `X`, `n` rows × `nrhs` columns (row-major flat array).\n */\nexport function ldltBandSolve(\n n: number,\n bw: number,\n lower: Float64Array,\n B: Float64Array,\n nrhs: number,\n): Float64Array {\n const stride = bw + 1;\n // L holds the unit-lower-triangular factor in the same band layout\n // (L[i*stride + o] = L[i][i-o], o >= 1); d holds the diagonal of D.\n const L = new Float64Array(n * stride);\n const d = new Float64Array(n);\n\n for (let i = 0; i < n; i++) {\n const oMax = Math.min(bw, i);\n\n // Off-diagonal factors L[i][i-o], computed for larger o first because the\n // inner sum reads L[i][i-k] with (i-k) > o that must already be finalized.\n for (let o = oMax; o >= 1; o--) {\n const j = i - o;\n let s = lower[i * stride + o]; // A[i][j]\n const kStart = i - bw < 0 ? 0 : i - bw;\n for (let k = kStart; k < j; k++) {\n const oi = i - k;\n const oj = j - k;\n if (oi <= bw && oj <= bw) {\n s -= L[i * stride + oi] * L[j * stride + oj] * d[k];\n }\n }\n L[i * stride + o] = s / d[j];\n }\n\n // Diagonal D[i]\n let di = lower[i * stride];\n for (let o = 1; o <= oMax; o++) {\n const lio = L[i * stride + o];\n di -= lio * lio * d[i - o];\n }\n if (di === 0 || !Number.isFinite(di)) {\n throw new Error('Banded LDLᵀ solve failed: matrix is singular or ill-conditioned.');\n }\n d[i] = di;\n }\n\n const X = new Float64Array(n * nrhs);\n X.set(B);\n\n // Forward substitution: solve L Y = B (in place in X).\n for (let i = 0; i < n; i++) {\n const oMax = Math.min(bw, i);\n for (let c = 0; c < nrhs; c++) {\n let v = X[i * nrhs + c];\n for (let o = 1; o <= oMax; o++) {\n v -= L[i * stride + o] * X[(i - o) * nrhs + c];\n }\n X[i * nrhs + c] = v;\n }\n }\n\n // Diagonal solve: D Z = Y.\n for (let i = 0; i < n; i++) {\n const inv = 1 / d[i];\n for (let c = 0; c < nrhs; c++) {\n X[i * nrhs + c] *= inv;\n }\n }\n\n // Back substitution: solve Lᵀ X = Z.\n for (let i = n - 1; i >= 0; i--) {\n const oMaxUp = Math.min(bw, n - 1 - i);\n for (let c = 0; c < nrhs; c++) {\n let v = X[i * nrhs + c];\n for (let o = 1; o <= oMaxUp; o++) {\n v -= L[(i + o) * stride + o] * X[(i + o) * nrhs + c];\n }\n X[i * nrhs + c] = v;\n }\n }\n\n return X;\n}\n","/**\n * Piecewise-polynomial evaluation in local power basis.\n *\n * Mirrors the relevant behaviour of `scipy.interpolate.PPoly`:\n * - coefficients are stored highest-order first,\n * - each piece is evaluated in the local variable `s = xq - breaks[i]`,\n * - intervals are half-open `[x[i], x[i+1])` except the last, which is closed,\n * - out-of-bounds points are extrapolated from the first/last piece (or NaN).\n */\n\nexport type Extrapolate = boolean;\n\n/**\n * Univariate (optionally multi-component) piecewise polynomial.\n *\n * Coefficients are stored as a flat C-contiguous array with logical shape\n * `(order, pieces, ndim)`: `c[k][i][n] = data[(k * pieces + i) * ndim + n]`,\n * where `k` indexes the polynomial coefficient (highest power first), `i` the\n * piece and `n` the data component (`ndim === 1` for univariate data).\n */\nexport class PPoly {\n constructor(\n readonly c: Float64Array,\n readonly breaks: Float64Array,\n readonly order: number,\n readonly pieces: number,\n readonly ndim: number,\n ) {}\n\n /** Locate the piece index for `xq`, or `-1` when out of bounds and not extrapolating. */\n private findPiece(xq: number, extrapolate: Extrapolate): number {\n const b = this.breaks;\n const last = this.pieces;\n if (xq < b[0]) return extrapolate ? 0 : -1;\n if (xq > b[last]) return extrapolate ? this.pieces - 1 : -1;\n if (xq >= b[last]) return this.pieces - 1;\n // Binary search for the largest i with breaks[i] <= xq.\n let lo = 0;\n let hi = this.pieces - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (b[mid] <= xq) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n /**\n * Evaluate all components at every point in `xs` (Horner's method).\n *\n * The piece lookup is done once per evaluation point and reused across all\n * components, and the polynomial is evaluated with Horner's scheme rather\n * than `Math.pow` — both matter for multivariate and N-D gridded data where\n * `ndim` is large.\n *\n * @returns Flat row-major array with logical shape `(ndim, xs.length)`:\n * `out[n * xs.length + q]`.\n */\n evalAll(xs: ArrayLike<number>, nu: number, extrapolate: Extrapolate): Float64Array {\n const { order, pieces, ndim, breaks, c } = this;\n const deg = order - 1;\n const L = xs.length;\n const out = new Float64Array(ndim * L);\n if (nu > deg) return out; // derivative of order > degree is identically zero\n\n const effDeg = deg - nu;\n const kstep = pieces * ndim;\n\n // Per-coefficient derivative multipliers (depend only on deg, nu, k).\n let mult: Float64Array | null = null;\n if (nu !== 0) {\n mult = new Float64Array(effDeg + 1);\n for (let k = 0; k <= effDeg; k++) mult[k] = fallingFactorial(deg - k, nu);\n }\n\n for (let q = 0; q < L; q++) {\n const xq = xs[q];\n const i = this.findPiece(xq, extrapolate);\n if (i < 0) {\n for (let n = 0; n < ndim; n++) out[n * L + q] = NaN;\n continue;\n }\n const s = xq - breaks[i];\n const start = i * ndim;\n\n if (nu === 0) {\n // Value: plain Horner over the highest-first coefficients.\n for (let n = 0; n < ndim; n++) {\n let off = start + n;\n let res = c[off];\n for (let k = 1; k <= deg; k++) {\n off += kstep;\n res = res * s + c[off];\n }\n out[n * L + q] = res;\n }\n } else {\n // Derivative: Horner over the differentiated coefficients\n // c[k] · (deg-k)·(deg-k-1)···(deg-k-nu+1), for k = 0..effDeg.\n const m = mult!;\n for (let n = 0; n < ndim; n++) {\n let off = start + n;\n let res = c[off] * m[0];\n for (let k = 1; k <= effDeg; k++) {\n off += kstep;\n res = res * s + c[off] * m[k];\n }\n out[n * L + q] = res;\n }\n }\n }\n return out;\n }\n}\n\n/** Falling factorial base·(base-1)···(base-nu+1). */\nfunction fallingFactorial(base: number, nu: number): number {\n let f = 1;\n for (let t = 0; t < nu; t++) f *= base - t;\n return f;\n}\n","/**\n * Univariate / multivariate cubic smoothing spline.\n *\n * Direct port of the algorithm in `csaps._sspumv` (which itself follows\n * C. de Boor, \"A Practical Guide to Splines\"). The smoothing spline minimizes\n *\n * p · Σ wᵢ (yᵢ − f(xᵢ))² + (1 − p) · ∫ f''(x)² dx\n *\n * where `p ∈ [0, 1]` is the smoothing parameter: `p = 1` interpolates the data\n * (natural cubic spline), `p = 0` gives the weighted least-squares straight line.\n */\n\nimport { ldltBandSolve } from './banded';\nimport { PPoly, type Extrapolate } from './ppoly';\n\nexport interface MakeSplineResult {\n pp: PPoly;\n smooth: number;\n}\n\n/** Default smoothing parameter: makes `p·trace(R)` equal `(1−p)·6·trace(QᵀW⁻¹Q)`. */\nfunction computeSmooth(traceR: number, traceQtw: number): number {\n return 1.0 / (1.0 + traceR / (6.0 * traceQtw));\n}\n\n/**\n * Normalized smoothing parameter (csaps `normalizedsmooth=True`): rescales `p`\n * so results are invariant to the `x` range and less sensitive to weight and\n * sample-site clumping. See https://github.com/espdev/csaps/pull/47.\n */\nfunction normalizeSmooth(x: Float64Array, w: Float64Array, smooth: number | null): number {\n const n = x.length;\n let xmin = x[0];\n let xmax = x[0];\n for (let i = 1; i < n; i++) {\n if (x[i] < xmin) xmin = x[i];\n if (x[i] > xmax) xmax = x[i];\n }\n const span = xmax - xmin;\n\n let sumDx2 = 0;\n for (let i = 0; i < n - 1; i++) {\n const d = x[i + 1] - x[i];\n sumDx2 += d * d;\n }\n const effX = 1 + (span * span) / sumDx2;\n\n let sw = 0;\n let sw2 = 0;\n for (let i = 0; i < n; i++) {\n sw += w[i];\n sw2 += w[i] * w[i];\n }\n const effW = (sw * sw) / sw2;\n\n const k = 80 * Math.pow(span, 3) * Math.pow(n, -2) * Math.pow(effX, -0.5) * Math.pow(effW, -0.5);\n\n const s = smooth == null ? 0.5 : smooth;\n return s / (s + (1 - s) * k);\n}\n\n/**\n * Build the cubic smoothing spline for `y` — a flat, row-major `N × M` buffer of\n * `N` data components / curves sampled at the `M` sites `x` (`y[n * M + i]`).\n *\n * @returns a {@link PPoly} with coefficients shaped `(order, pieces, N)` and the\n * effective smoothing parameter.\n */\nexport function makeSpline(\n x: Float64Array,\n y: Float64Array,\n N: number,\n w: Float64Array,\n smooth: number | null,\n normalizedsmooth: boolean,\n): MakeSplineResult {\n const M = x.length;\n\n const dx = new Float64Array(M - 1);\n for (let i = 0; i < M - 1; i++) {\n dx[i] = x[i + 1] - x[i];\n if (!(dx[i] > 0)) {\n throw new Error(\"Items of 'xdata' must satisfy x1 < x2 < ... < xN.\");\n }\n }\n\n // Divided differences dy/dx for every component: flat N × (M-1).\n const md = M - 1;\n const dydx = new Float64Array(N * md);\n for (let n = 0; n < N; n++) {\n const yb = n * M;\n const db = n * md;\n for (let i = 0; i < md; i++) dydx[db + i] = (y[yb + i + 1] - y[yb + i]) / dx[i];\n }\n\n // Corner case: two points → linear segment (order-2 spline), p ≡ 1.\n if (M === 2) {\n const c = new Float64Array(2 * 1 * N);\n for (let n = 0; n < N; n++) {\n c[0 * N + n] = dydx[n * md]; // slope\n c[1 * N + n] = y[n * M]; // intercept at left break\n }\n return { pp: new PPoly(c, Float64Array.from(x), 2, 1, N), smooth: 1 };\n }\n\n const m = M - 2;\n\n const dr = new Float64Array(M - 1); // 1/dx\n for (let i = 0; i < M - 1; i++) dr[i] = 1 / dx[i];\n const iw = new Float64Array(M); // 1/w\n for (let i = 0; i < M; i++) iw[i] = 1 / w[i];\n\n // Diagonals of QᵀW⁻¹Q (symmetric, pentadiagonal): main, +1, +2.\n const qd = new Float64Array(m);\n for (let i = 0; i < m; i++) {\n const a = dr[i];\n const b = dr[i] + dr[i + 1];\n const cc = dr[i + 1];\n qd[i] = a * a * iw[i] + b * b * iw[i + 1] + cc * cc * iw[i + 2];\n }\n const q1 = new Float64Array(Math.max(0, m - 1));\n for (let i = 0; i < m - 1; i++) {\n q1[i] = -dr[i + 1] * (dr[i] + dr[i + 1]) * iw[i + 1] - dr[i + 1] * (dr[i + 1] + dr[i + 2]) * iw[i + 2];\n }\n const q2 = new Float64Array(Math.max(0, m - 2));\n for (let i = 0; i < m - 2; i++) {\n q2[i] = dr[i + 1] * dr[i + 2] * iw[i + 2];\n }\n\n // Resolve smoothing parameter.\n let p: number;\n if (normalizedsmooth) {\n p = normalizeSmooth(x, w, smooth);\n } else if (smooth == null) {\n let traceR = 0;\n let traceQ = 0;\n for (let i = 0; i < m; i++) {\n traceR += 2 * (dx[i] + dx[i + 1]);\n traceQ += qd[i];\n }\n p = computeSmooth(traceR, traceQ);\n } else {\n p = smooth;\n }\n\n const pp6 = 6.0 * (1.0 - p);\n\n // Symmetric pentadiagonal system A = pp6·QᵀW⁻¹Q + p·R in lower-band storage.\n const lower = new Float64Array(m * 3);\n for (let i = 0; i < m; i++) {\n const rii = 2 * (dx[i] + dx[i + 1]);\n lower[i * 3] = pp6 * qd[i] + p * rii;\n if (i >= 1) lower[i * 3 + 1] = pp6 * q1[i - 1] + p * dx[i]; // A[i,i-1], R[i-1,i] = dx[i]\n if (i >= 2) lower[i * 3 + 2] = pp6 * q2[i - 2]; // A[i,i-2]\n }\n\n // Right-hand side: second divided difference of dy/dx, shape m × N.\n const B = new Float64Array(m * N);\n for (let i = 0; i < m; i++) {\n for (let n = 0; n < N; n++) {\n const db = n * md + i;\n B[i * N + n] = dydx[db + 1] - dydx[db];\n }\n }\n\n const U = ldltBandSolve(m, 2, lower, B, N); // m × N\n\n // u padded with zero rows at top & bottom → shape M × N (rows 0 and M-1 are 0).\n const uFull = new Float64Array(M * N);\n for (let i = 1; i < M - 1; i++) {\n const src = (i - 1) * N;\n const dst = i * N;\n for (let n = 0; n < N; n++) uFull[dst + n] = U[src + n];\n }\n\n // d1 = diff(uFull) / dx, shape (M-1) × N.\n const d1 = new Float64Array((M - 1) * N);\n for (let i = 0; i < M - 1; i++) {\n const inv = dr[i];\n const a = i * N;\n const b = a + N;\n for (let n = 0; n < N; n++) d1[a + n] = (uFull[b + n] - uFull[a + n]) * inv;\n }\n\n // d2 = diff(pad(d1)), shape M × N: ends are ±d1, interior is the first difference.\n const d2 = new Float64Array(M * N);\n const lastD1 = (M - 2) * N;\n const lastD2 = (M - 1) * N;\n for (let n = 0; n < N; n++) {\n d2[n] = d1[n];\n d2[lastD2 + n] = -d1[lastD1 + n];\n }\n for (let i = 1; i < M - 1; i++) {\n const di = i * N;\n const dim1 = di - N;\n for (let n = 0; n < N; n++) d2[di + n] = d1[di + n] - d1[dim1 + n];\n }\n\n // yi = yᵀ − pp6·W⁻¹·d2, shape M × N.\n const yi = new Float64Array(M * N);\n for (let i = 0; i < M; i++) {\n const f = pp6 * iw[i];\n const row = i * N;\n for (let n = 0; n < N; n++) yi[row + n] = y[n * M + i] - f * d2[row + n];\n }\n\n // Assemble coefficients, shape (4, M-1, N), highest order first.\n // pu = pad(p·u) = p·uFull is folded in inline (no separate buffer).\n const pieces = M - 1;\n const c = new Float64Array(4 * pieces * N);\n const o1 = pieces * N;\n const o2 = 2 * pieces * N;\n const o3 = 3 * pieces * N;\n for (let i = 0; i < pieces; i++) {\n const h = dx[i];\n const invh = dr[i];\n const ri = i * N;\n const ri1 = ri + N;\n for (let n = 0; n < N; n++) {\n const pu0 = p * uFull[ri + n];\n const pu1 = p * uFull[ri1 + n];\n const yi0 = yi[ri + n];\n const yi1 = yi[ri1 + n];\n const ci = ri + n;\n c[ci] = (pu1 - pu0) * invh;\n c[o1 + ci] = 3 * pu0;\n c[o2 + ci] = (yi1 - yi0) * invh - h * (2 * pu0 + pu1);\n c[o3 + ci] = yi0;\n }\n }\n\n return { pp: new PPoly(c, Float64Array.from(x), 4, pieces, N), smooth: p };\n}\n\n// ---------------------------------------------------------------------------\n// Public class\n// ---------------------------------------------------------------------------\n\nexport type UnivariateData = number[] | Float64Array;\nexport type MultivariateData = number[] | number[][] | Float64Array;\n\nexport interface CubicSmoothingSplineOptions {\n /** Per-site weights (length = number of `x` sites). */\n weights?: UnivariateData;\n /** Smoothing parameter in `[0, 1]`. Omit / `null` to compute it automatically. */\n smooth?: number | null;\n /** Axis of `ydata` that varies with `x` (for 2-D `ydata`). Default `-1` (last). */\n axis?: number;\n /** Normalize the smoothing parameter to be invariant to the `x` range. */\n normalizedsmooth?: boolean;\n}\n\nexport interface EvaluateOptions {\n /** Derivative order to evaluate (default `0`). */\n nu?: number;\n /** Extrapolate out-of-bounds points (default `true`); otherwise return `NaN`. */\n extrapolate?: Extrapolate;\n}\n\nfunction toFloat64(a: ArrayLike<number>): Float64Array {\n return a instanceof Float64Array ? a : Float64Array.from(a);\n}\n\ninterface Prepared {\n x: Float64Array;\n y: Float64Array; // flat, row-major N × M (y[n * M + i])\n N: number;\n w: Float64Array;\n restore: (flat: Float64Array, L: number) => number[] | number[][];\n}\n\nfunction prepareUnivariate(\n xdata: UnivariateData,\n ydata: MultivariateData,\n weights: UnivariateData | undefined,\n axis: number,\n): Prepared {\n const x = toFloat64(xdata);\n const M = x.length;\n if (x.length < 2) throw new Error(\"'xdata' must contain at least 2 data points.\");\n\n let y: Float64Array;\n let N: number;\n let isVector: boolean;\n let transposed = false;\n\n const first = (ydata as unknown[])[0];\n if (Array.isArray(first) || first instanceof Float64Array) {\n // 2-D ydata: shape [R][C].\n const yin = ydata as number[][];\n const R = yin.length;\n const C = yin[0].length;\n const ndimY = 2;\n const ax = axis < 0 ? ndimY + axis : axis;\n if (ax === 1) {\n if (C !== M) throw new Error(`'ydata' shape[${ax}] (${C}) must equal 'xdata' size (${M}).`);\n N = R;\n y = new Float64Array(N * M);\n for (let n = 0; n < N; n++) {\n const row = yin[n];\n const base = n * M;\n for (let i = 0; i < M; i++) y[base + i] = row[i];\n }\n } else if (ax === 0) {\n if (R !== M) throw new Error(`'ydata' shape[${ax}] (${R}) must equal 'xdata' size (${M}).`);\n // columns are curves → transpose to N × M.\n transposed = true;\n N = C;\n y = new Float64Array(N * M);\n for (let i = 0; i < M; i++) {\n const row = yin[i];\n for (let n = 0; n < N; n++) y[n * M + i] = row[n];\n }\n } else {\n throw new Error(`Unsupported axis ${axis} for 2-D ydata.`);\n }\n isVector = false;\n } else {\n // 1-D ydata.\n const yin = ydata as ArrayLike<number>;\n if (yin.length !== M) throw new Error(`'ydata' size (${yin.length}) must equal 'xdata' size (${M}).`);\n N = 1;\n y = toFloat64(yin);\n isVector = true;\n }\n\n let w: Float64Array;\n if (weights == null) {\n w = new Float64Array(M).fill(1);\n } else {\n w = toFloat64(weights);\n if (w.length !== M) throw new Error('Weights vector size must equal xdata size.');\n }\n\n const restore = (flat: Float64Array, L: number): number[] | number[][] => {\n if (isVector) {\n const out = new Array(L);\n for (let q = 0; q < L; q++) out[q] = flat[q];\n return out;\n }\n if (transposed) {\n const out: number[][] = new Array(L);\n for (let q = 0; q < L; q++) {\n const row = new Array(N);\n for (let n = 0; n < N; n++) row[n] = flat[n * L + q];\n out[q] = row;\n }\n return out;\n }\n const out: number[][] = new Array(N);\n for (let n = 0; n < N; n++) {\n const row = new Array(L);\n for (let q = 0; q < L; q++) row[q] = flat[n * L + q];\n out[n] = row;\n }\n return out;\n };\n\n return { x, y, N, w, restore };\n}\n\n/**\n * Cubic smoothing spline for univariate or multivariate data sampled at common\n * sites `x`.\n */\nexport class CubicSmoothingSpline {\n /** Effective smoothing parameter actually used. */\n readonly smooth: number;\n private readonly pp: PPoly;\n private readonly restore: (flat: Float64Array, L: number) => number[] | number[][];\n\n constructor(xdata: UnivariateData, ydata: MultivariateData, options: CubicSmoothingSplineOptions = {}) {\n const { weights, smooth = null, axis = -1, normalizedsmooth = false } = options;\n const prep = prepareUnivariate(xdata, ydata, weights, axis);\n const res = makeSpline(prep.x, prep.y, prep.N, prep.w, smooth ?? null, normalizedsmooth);\n this.pp = res.pp;\n this.smooth = res.smooth;\n this.restore = prep.restore;\n }\n\n /** Evaluate the spline (or one of its derivatives) at the sites `xi`. */\n evaluate(xi: UnivariateData, options: EvaluateOptions = {}): number[] | number[][] {\n const { nu = 0, extrapolate = true } = options;\n const xs = toFloat64(xi);\n const flat = this.pp.evalAll(xs, nu, extrapolate);\n return this.restore(flat, xs.length);\n }\n\n /** Breakpoints (data sites) of the piecewise polynomial. */\n get breaks(): number[] {\n return Array.from(this.pp.breaks);\n }\n\n /** Spline description: breakpoints, raw coefficients and shape metadata. */\n get spline(): {\n breaks: number[];\n coeffs: Float64Array;\n order: number;\n pieces: number;\n ndim: number;\n } {\n return {\n breaks: Array.from(this.pp.breaks),\n coeffs: this.pp.c,\n order: this.pp.order,\n pieces: this.pp.pieces,\n ndim: this.pp.ndim,\n };\n }\n\n /** Internal piecewise polynomial (used by the N-D grid spline). */\n get _pp(): PPoly {\n return this.pp;\n }\n}\n","/**\n * Minimal C-contiguous n-dimensional array used by the N-D grid spline.\n *\n * Only the operations required by the tensor-product algorithm are provided:\n * `reshape` (metadata-only, since data is always C-contiguous) and `transpose`\n * (which materializes a permuted copy). This keeps the gridded code free of\n * stride bookkeeping while remaining exact.\n */\nexport class NdArray {\n constructor(\n readonly data: Float64Array,\n readonly shape: number[],\n ) {}\n\n get size(): number {\n return this.data.length;\n }\n\n /** Reinterpret the buffer with a new shape (must keep the same element count). */\n reshape(shape: number[]): NdArray {\n return new NdArray(this.data, shape.slice());\n }\n\n /** Return a new array with axes permuted according to `perm`, materialized C-contiguous. */\n transpose(perm: number[]): NdArray {\n const d = this.shape.length;\n const newShape = perm.map((axis) => this.shape[axis]);\n\n const oldStrides = cStrides(this.shape);\n const ps = perm.map((axis) => oldStrides[axis]); // source stride per new axis\n\n const total = this.data.length;\n const src = this.data;\n const out = new Float64Array(total);\n const idx = new Array(d).fill(0);\n\n // Walk the output in C-order while tracking the source offset incrementally,\n // so the source index is never recomputed from scratch.\n let off = 0;\n for (let pos = 0; pos < total; pos++) {\n out[pos] = src[off];\n for (let a = d - 1; a >= 0; a--) {\n off += ps[a];\n if (++idx[a] < newShape[a]) break;\n idx[a] = 0;\n off -= ps[a] * newShape[a];\n }\n }\n\n return new NdArray(out, newShape);\n }\n}\n\n/** Row-major (C-order) strides for a given shape. */\nexport function cStrides(shape: number[]): number[] {\n const d = shape.length;\n const strides = new Array(d).fill(1);\n for (let a = d - 2; a >= 0; a--) strides[a] = strides[a + 1] * shape[a + 1];\n return strides;\n}\n\n/** Product of a list of numbers (empty list → 1). */\nexport function prod(xs: number[]): number {\n let p = 1;\n for (const x of xs) p *= x;\n return p;\n}\n\n/**\n * Flatten an arbitrarily nested numeric array into a C-contiguous buffer plus\n * its shape. Assumes a rectangular (non-ragged) structure.\n */\nexport function flattenNested(y: unknown): { data: Float64Array; shape: number[] } {\n const shape: number[] = [];\n let node: unknown = y;\n while (Array.isArray(node)) {\n shape.push(node.length);\n node = node[0];\n }\n const data = new Float64Array(prod(shape));\n let k = 0;\n const fill = (n: unknown, depth: number): void => {\n if (depth === shape.length) {\n data[k++] = n as number;\n return;\n }\n const a = n as unknown[];\n if (a.length !== shape[depth]) {\n throw new Error('flattenNested: input array is ragged (non-rectangular).');\n }\n for (let i = 0; i < a.length; i++) fill(a[i], depth + 1);\n };\n fill(y, 0);\n return { data, shape };\n}\n\n/** Rebuild a nested numeric array from a flat C-contiguous buffer and shape. */\nexport function nestArray(data: ArrayLike<number>, shape: number[]): number[] | number[][] | unknown {\n const strides = cStrides(shape);\n const build = (depth: number, offset: number): unknown => {\n if (depth === shape.length - 1) {\n const row: number[] = new Array(shape[depth]);\n for (let i = 0; i < shape[depth]; i++) row[i] = data[offset + i];\n return row;\n }\n const arr: unknown[] = new Array(shape[depth]);\n for (let i = 0; i < shape[depth]; i++) arr[i] = build(depth + 1, offset + i * strides[depth]);\n return arr;\n };\n return build(0, 0) as number[] | number[][];\n}\n","/**\n * N-D gridded cubic smoothing spline (piecewise tensor-product polynomial).\n *\n * Port of `csaps._sspndg`. The smoothing spline is built coordinate-wise: the\n * univariate smoother is applied along each grid axis in turn, accumulating a\n * tensor-product coefficient array. Evaluation contracts one axis at a time by\n * reusing the univariate {@link PPoly} evaluator.\n */\n\nimport { NdArray, flattenNested, nestArray } from './ndarray';\nimport { PPoly, type Extrapolate } from './ppoly';\nimport { makeSpline, type UnivariateData } from './umv';\n\nexport interface NdGridCubicSmoothingSplineOptions {\n /** Per-axis weight vectors (each length = that axis' site count). A single vector is allowed for a 1-D grid. */\n weights?: number[][] | number[];\n /** Smoothing parameter(s) in `[0, 1]`: a single value, one per axis, or `null` to auto-compute. */\n smooth?: number | (number | null)[] | null;\n /** Normalize the smoothing parameter to be invariant to each axis' range. */\n normalizedsmooth?: boolean;\n}\n\nexport interface NdEvaluateOptions {\n /** Per-axis derivative orders (default `0` for every axis). */\n nu?: number[];\n /** Extrapolate out-of-bounds points (default `true`); otherwise return `NaN`. */\n extrapolate?: Extrapolate;\n}\n\nfunction toFloat64(a: ArrayLike<number>): Float64Array {\n return a instanceof Float64Array ? a : Float64Array.from(a);\n}\n\nfunction prepareVectors(data: ArrayLike<number>[], name: string, minSize = 2): Float64Array[] {\n if (!Array.isArray(data)) throw new TypeError(`'${name}' must be a sequence of 1-D vectors.`);\n return data.map((d, axis) => {\n const v = toFloat64(d);\n if (v.length < minSize) {\n throw new Error(`'${name}' must contain at least ${minSize} points for axis ${axis}.`);\n }\n return v;\n });\n}\n\ninterface BuiltGrid {\n F: NdArray;\n breaks: Float64Array[];\n orders: number[];\n pieces: number[];\n smooths: number[];\n}\n\nfunction buildGrid(\n xs: Float64Array[],\n yNd: NdArray,\n weights: (Float64Array | undefined)[],\n smooth: (number | null)[],\n normalizedsmooth: boolean,\n): BuiltGrid {\n const d = xs.length;\n const orders = new Array<number>(d);\n const pieces = new Array<number>(d);\n const smooths = new Array<number>(d);\n\n // Permutation that moves the last axis to the front.\n const permute = [d - 1];\n for (let a = 0; a < d - 1; a++) permute.push(a);\n\n let coeffs = yNd;\n let shape = yNd.shape.slice();\n\n for (let i = d - 1; i >= 0; i--) {\n const lastSize = shape[shape.length - 1];\n const total = coeffs.data.length;\n const Nrest = total / lastSize;\n\n // The buffer is already a row-major Nrest × lastSize block of \"curves\",\n // exactly the layout makeSpline expects — pass it through with no copy.\n const w = weights[i] ?? new Float64Array(lastSize).fill(1);\n const res = makeSpline(xs[i], coeffs.data, Nrest, w, smooth[i], normalizedsmooth);\n const order = res.pp.order;\n const pcs = res.pp.pieces;\n orders[i] = order;\n pieces[i] = pcs;\n smooths[i] = res.smooth;\n\n // Flatten canonical (order, pcs, Nrest) → (Nrest, order*pcs), order-major in j.\n const op = order * pcs;\n const flat = new Float64Array(Nrest * op);\n for (let k = 0; k < order; k++) {\n for (let ii = 0; ii < pcs; ii++) {\n const j = k * pcs + ii;\n const cBase = j * Nrest;\n for (let n = 0; n < Nrest; n++) flat[n * op + j] = res.pp.c[cBase + n];\n }\n }\n\n const newShape = shape.slice(0, -1);\n newShape.push(op);\n coeffs = new NdArray(flat, newShape).transpose(permute);\n shape = coeffs.shape.slice();\n }\n\n return { F: coeffs, breaks: xs, orders, pieces, smooths };\n}\n\nfunction evalGrid(\n built: { F: NdArray; breaks: Float64Array[]; orders: number[]; pieces: number[] },\n xiList: Float64Array[],\n nu: number[],\n extrapolate: Extrapolate,\n): NdArray {\n const { F, breaks, orders, pieces } = built;\n const d = breaks.length;\n\n const permute = [d - 1];\n for (let a = 0; a < d - 1; a++) permute.push(a);\n\n let coeffs = F;\n let shape = F.shape.slice();\n\n for (let i = d - 1; i >= 0; i--) {\n const order = orders[i];\n const pcs = pieces[i];\n const lastSize = shape[shape.length - 1]; // order * pcs\n const total = coeffs.data.length;\n const Nrest = total / lastSize;\n\n // Rebuild canonical (order, pcs, Nrest) from the (Nrest, order*pcs) layout.\n const cc = new Float64Array(order * pcs * Nrest);\n for (let k = 0; k < order; k++) {\n for (let ii = 0; ii < pcs; ii++) {\n const j = k * pcs + ii;\n const dst = (k * pcs + ii) * Nrest;\n for (let n = 0; n < Nrest; n++) cc[dst + n] = coeffs.data[n * lastSize + j];\n }\n }\n\n const pp = new PPoly(cc, breaks[i], order, pcs, Nrest);\n const xi = xiList[i];\n const Li = xi.length;\n const out = pp.evalAll(xi, nu[i] ?? 0, extrapolate); // (Nrest, Li) row-major\n\n const newShape = shape.slice(0, -1);\n newShape.push(Li);\n coeffs = new NdArray(out, newShape).transpose(permute);\n shape = coeffs.shape.slice();\n }\n\n return coeffs;\n}\n\nfunction normalizeSmooth(smooth: number | (number | null)[] | null | undefined, d: number): (number | null)[] {\n if (smooth == null) return new Array(d).fill(null);\n if (Array.isArray(smooth)) {\n if (smooth.length !== d) {\n throw new Error(`Number of smoothing values (${smooth.length}) must equal dimensions (${d}).`);\n }\n return smooth.map((s) => (s == null ? null : s));\n }\n return new Array(d).fill(smooth);\n}\n\nfunction normalizeWeights(\n weights: number[][] | number[] | undefined,\n d: number,\n sizes: number[],\n): (Float64Array | undefined)[] {\n if (weights == null) return new Array(d).fill(undefined);\n const w = weights as unknown[];\n const firstIsVector = Array.isArray(w[0]) || (w[0] as unknown) instanceof Float64Array;\n let list: ArrayLike<number>[];\n if (!firstIsVector) {\n // A single flat vector — only valid for a 1-D grid.\n if (d !== 1) throw new Error(\"'weights' must be a sequence of vectors, one per axis.\");\n list = [weights as number[]];\n } else {\n list = weights as number[][];\n }\n if (list.length !== d) throw new Error(`'weights' dimensions (${list.length}) must equal 'xdata' dimensions (${d}).`);\n return list.map((wv, axis) => {\n const v = toFloat64(wv);\n if (v.length !== sizes[axis]) {\n throw new Error(`'weights' size (${v.length}) must equal 'xdata' size (${sizes[axis]}) for axis ${axis}.`);\n }\n return v;\n });\n}\n\n/** N-D gridded cubic smoothing spline. */\nexport class NdGridCubicSmoothingSpline {\n /** Effective per-axis smoothing parameters. */\n readonly smooth: number[];\n private readonly built: BuiltGrid;\n\n constructor(\n xdata: number[][],\n ydata: number[] | number[][] | number[][][] | unknown,\n options: NdGridCubicSmoothingSplineOptions = {},\n ) {\n const xs = prepareVectors(xdata, 'xdata');\n const d = xs.length;\n const sizes = xs.map((v) => v.length);\n\n const { data, shape } = flattenNested(ydata);\n if (shape.length !== d) {\n throw new Error(`'ydata' must have ${d} dimensions according to 'xdata' (got ${shape.length}).`);\n }\n for (let a = 0; a < d; a++) {\n if (shape[a] !== sizes[a]) {\n throw new Error(`'ydata' size (${shape[a]}) and 'xdata' size (${sizes[a]}) mismatch for axis ${a}.`);\n }\n }\n\n const smooth = normalizeSmooth(options.smooth, d);\n const weights = normalizeWeights(options.weights, d, sizes);\n\n this.built = buildGrid(xs, new NdArray(data, shape), weights, smooth, options.normalizedsmooth ?? false);\n this.smooth = this.built.smooths;\n }\n\n /** Evaluate the spline on the grid defined by the sequence of site vectors `xi`. */\n evaluate(xi: number[][], options: NdEvaluateOptions = {}): number[] | number[][] | unknown {\n const d = this.built.breaks.length;\n const xiList = prepareVectors(xi, 'xi', 1);\n if (xiList.length !== d) throw new Error(`'xi' must have length ${d} according to the grid.`);\n const nu = options.nu ?? new Array(d).fill(0);\n const extrapolate = options.extrapolate ?? true;\n const result = evalGrid(this.built, xiList, nu, extrapolate);\n return nestArray(result.data, result.shape);\n }\n\n /** Spline description: per-axis breakpoints, raw coefficient tensor and shape metadata. */\n get spline(): {\n breaks: number[][];\n coeffs: Float64Array;\n coeffsShape: number[];\n order: number[];\n pieces: number[];\n } {\n return {\n breaks: this.built.breaks.map((b) => Array.from(b)),\n coeffs: this.built.F.data,\n coeffsShape: this.built.F.shape.slice(),\n order: this.built.orders.slice(),\n pieces: this.built.pieces.slice(),\n };\n }\n}\n\nexport type { UnivariateData };\n","/**\n * The `csaps` shortcut function — the primary entry point for smoothing data.\n */\n\nimport {\n CubicSmoothingSpline,\n type CubicSmoothingSplineOptions,\n type MultivariateData,\n type UnivariateData,\n} from './umv';\nimport { NdGridCubicSmoothingSpline, type NdGridCubicSmoothingSplineOptions } from './ndg';\n\n/** Result returned when smoothing data while the smoothing parameter is computed automatically. */\nexport interface AutoSmoothingResult {\n /** Smoothed data values. */\n values: number[] | number[][] | unknown;\n /** The smoothing parameter(s) that were computed. */\n smooth: number | number[];\n}\n\nexport interface CsapsOptions {\n /** Weights: a single vector (univariate) or one vector per axis (gridded). */\n weights?: number[] | number[][] | Float64Array;\n /** Smoothing parameter(s) in `[0, 1]`: a value, one per grid axis, or `null`/omitted to auto-compute. */\n smooth?: number | (number | null)[] | null;\n /** Axis of `ydata` that varies with `x` (univariate 2-D data only). Default `-1`. */\n axis?: number;\n /** Normalize the smoothing parameter to be invariant to the data range. */\n normalizedsmooth?: boolean;\n}\n\nfunction isVectorList(x: unknown): boolean {\n return Array.isArray(x) && x.length > 0 && (Array.isArray(x[0]) || x[0] instanceof Float64Array);\n}\n\nfunction isArrayLike(x: unknown): boolean {\n return Array.isArray(x) || x instanceof Float64Array;\n}\n\n// --- Overloads -------------------------------------------------------------\n\n/** Build a univariate / multivariate smoothing spline (no evaluation sites given). */\nexport function csaps(\n xdata: UnivariateData,\n ydata: MultivariateData,\n options?: CubicSmoothingSplineOptions,\n): CubicSmoothingSpline;\n/** Build an N-D gridded smoothing spline (no evaluation sites given). */\nexport function csaps(\n xdata: number[][],\n ydata: number[] | number[][] | number[][][],\n options?: NdGridCubicSmoothingSplineOptions,\n): NdGridCubicSmoothingSpline;\n/** Smooth univariate / multivariate data at the given evaluation sites. */\nexport function csaps(\n xdata: UnivariateData,\n ydata: MultivariateData,\n xidata: UnivariateData,\n options?: CubicSmoothingSplineOptions,\n): number[] | number[][] | AutoSmoothingResult;\n/** Smooth N-D gridded data at the given evaluation grid. */\nexport function csaps(\n xdata: number[][],\n ydata: number[] | number[][] | number[][][],\n xidata: number[][],\n options?: NdGridCubicSmoothingSplineOptions,\n): number[] | number[][] | unknown | AutoSmoothingResult;\n\n// --- Implementation --------------------------------------------------------\n\nexport function csaps(\n xdata: UnivariateData | number[][],\n ydata: unknown,\n arg3?: unknown,\n arg4?: unknown,\n):\n | CubicSmoothingSpline\n | NdGridCubicSmoothingSpline\n | number[]\n | number[][]\n | unknown\n | AutoSmoothingResult {\n let xidata: unknown;\n let options: CsapsOptions;\n\n if (arg3 === undefined) {\n xidata = undefined;\n options = (arg4 as CsapsOptions) ?? {};\n } else if (isArrayLike(arg3)) {\n xidata = arg3;\n options = (arg4 as CsapsOptions) ?? {};\n } else {\n xidata = undefined;\n options = (arg3 as CsapsOptions) ?? {};\n }\n\n const grid = isVectorList(xdata);\n\n const spline: CubicSmoothingSpline | NdGridCubicSmoothingSpline = grid\n ? new NdGridCubicSmoothingSpline(xdata as number[][], ydata, {\n weights: options.weights as number[][] | number[] | undefined,\n smooth: options.smooth,\n normalizedsmooth: options.normalizedsmooth,\n })\n : new CubicSmoothingSpline(xdata as UnivariateData, ydata as MultivariateData, {\n weights: options.weights as UnivariateData | undefined,\n smooth: typeof options.smooth === 'number' ? options.smooth : (options.smooth as null | undefined) ?? null,\n axis: options.axis,\n normalizedsmooth: options.normalizedsmooth,\n });\n\n if (xidata === undefined) return spline;\n\n const values = grid\n ? (spline as NdGridCubicSmoothingSpline).evaluate(xidata as number[][])\n : (spline as CubicSmoothingSpline).evaluate(xidata as UnivariateData);\n\n const sm = options.smooth;\n const autoSmooth = Array.isArray(sm) ? sm.some((s) => s == null) : sm == null;\n\n if (autoSmooth) {\n return { values, smooth: spline.smooth } as AutoSmoothingResult;\n }\n return values as number[] | number[][];\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "csaps-js",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Cubic spline approximation (smoothing) for Node.js and the browser. A dependency-free TypeScript port of the Python csaps library — univariate, multivariate and N-D gridded data smoothing.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|