velo-plot 3.1.0 → 4.0.0-alpha.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/{ChartCore-AnR_3Xkb.js → ChartCore-KYG2HTcK.js} +1349 -1213
- package/dist/ChartCore-KYG2HTcK.js.map +1 -0
- package/dist/{PluginRegistry-CzMHebYP.js → PluginRegistry-CDf_jcnp.js} +2 -2
- package/dist/{PluginRegistry-CzMHebYP.js.map → PluginRegistry-CDf_jcnp.js.map} +1 -1
- package/dist/SVGDocumentBuilder-C-uLkcFW.js +83 -0
- package/dist/SVGDocumentBuilder-C-uLkcFW.js.map +1 -0
- package/dist/angular-hooks.js +1 -1
- package/dist/angular.js +4 -4
- package/dist/{chartSyncBridge-D_rCtbFq.js → chartSyncBridge-C1uRy0ZS.js} +3 -3
- package/dist/{chartSyncBridge-D_rCtbFq.js.map → chartSyncBridge-C1uRy0ZS.js.map} +1 -1
- package/dist/core/chart/ChartCore.d.ts +7 -3
- package/dist/core/chart/ChartRenderLoop.d.ts +5 -0
- package/dist/core/chart/ChartRenderer.d.ts +9 -0
- package/dist/core/chart/ChartSetup.d.ts +1 -0
- package/dist/core/chart/exporter/SVGExporter.d.ts +9 -7
- package/dist/core/chart/exporter/svg/SVGDocumentBuilder.d.ts +27 -0
- package/dist/core/chart/exporter/svg/SVGExportContext.d.ts +147 -0
- package/dist/core/chart/exporter/svg/SVGOrchestrator.d.ts +3 -0
- package/dist/core/chart/exporter/svg/SVGThemeAdapter.d.ts +22 -0
- package/dist/core/chart/exporter/svg/__tests__/testFixtures.d.ts +46 -0
- package/dist/core/chart/exporter/svg/__tests__/visualTestUtils.d.ts +12 -0
- package/dist/core/chart/exporter/svg/overlay/axes.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/border.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/errorBars.d.ts +7 -0
- package/dist/core/chart/exporter/svg/overlay/grid.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/index.d.ts +12 -0
- package/dist/core/chart/exporter/svg/overlay/legend.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/pluginCharts.d.ts +6 -0
- package/dist/core/chart/exporter/svg/overlay/polarGrid.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/specialChart.d.ts +15 -0
- package/dist/core/chart/exporter/svg/overlay/title.d.ts +4 -0
- package/dist/core/chart/exporter/svg/plugins/annotations.d.ts +5 -0
- package/dist/core/chart/exporter/svg/plugins/brokenAxis.d.ts +20 -0
- package/dist/core/chart/exporter/svg/plugins/latex.d.ts +9 -0
- package/dist/core/chart/exporter/svg/plugins/register.d.ts +8 -0
- package/dist/core/chart/exporter/svg/plugins/regression.d.ts +33 -0
- package/dist/core/chart/exporter/svg/plugins/roi.d.ts +12 -0
- package/dist/core/chart/exporter/svg/plugins/tradeMarkers.d.ts +3 -0
- package/dist/core/chart/exporter/svg/plugins/types.d.ts +28 -0
- package/dist/core/chart/exporter/svg/plugins/watermark.d.ts +13 -0
- package/dist/core/chart/exporter/svg/series/band.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/bar.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/boxplot.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/candlestick.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/finitePoints.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/gauge.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/heatmap.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/indicator.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/line.d.ts +12 -0
- package/dist/core/chart/exporter/svg/series/polar.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/radar.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/registry.d.ts +10 -0
- package/dist/core/chart/exporter/svg/series/sankey.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/scatter.d.ts +1 -0
- package/dist/core/chart/exporter/svg/series/ternary.d.ts +7 -0
- package/dist/core/chart/exporter/svg/series/waterfall.d.ts +6 -0
- package/dist/core/chart/exporter/svg/seriesAtTimestamp.d.ts +4 -0
- package/dist/core/chart/exporter/svg/seriesUtils.d.ts +3 -0
- package/dist/core/chart/exporter/svg/symbols.d.ts +5 -0
- package/dist/core/chart/exporter/svg/tickUtils.d.ts +9 -0
- package/dist/core/chart/mountSVGString.d.ts +5 -0
- package/dist/core/chart/types.d.ts +2 -2
- package/dist/core/stacked/StackSVGComposer.d.ts +14 -0
- package/dist/core/stacked/index.d.ts +3 -2
- package/dist/core/stacked/types.d.ts +12 -4
- package/dist/createStackedChart-DjA3aJAu.js +2761 -0
- package/dist/createStackedChart-DjA3aJAu.js.map +1 -0
- package/dist/{hooks-DH-3bewj.js → hooks-4wQH27r9.js} +3 -3
- package/dist/{hooks-DH-3bewj.js.map → hooks-4wQH27r9.js.map} +1 -1
- package/dist/index-Bj-xyXY6.js +582 -0
- package/dist/index-Bj-xyXY6.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +5 -0
- package/dist/plugins/annotations.js +8 -7
- package/dist/plugins/annotations.js.map +1 -1
- package/dist/plugins/broken-axis.js +198 -152
- package/dist/plugins/broken-axis.js.map +1 -1
- package/dist/plugins/forecasting.js +273 -258
- package/dist/plugins/forecasting.js.map +1 -1
- package/dist/plugins/ml-integration.js +107 -93
- package/dist/plugins/ml-integration.js.map +1 -1
- package/dist/plugins/radar/types.d.ts +11 -0
- package/dist/plugins/radar.js +64 -53
- package/dist/plugins/radar.js.map +1 -1
- package/dist/plugins/roi/index.d.ts +2 -0
- package/dist/plugins/roi.js +184 -145
- package/dist/plugins/roi.js.map +1 -1
- package/dist/plugins/snapshot.js +20 -15
- package/dist/plugins/snapshot.js.map +1 -1
- package/dist/plugins/types.d.ts +4 -0
- package/dist/react.js +2 -2
- package/dist/regression-HNdyk1Dm.js +28 -0
- package/dist/regression-HNdyk1Dm.js.map +1 -0
- package/dist/renderer/ChartSeriesRenderer.d.ts +3 -2
- package/dist/renderer/SVGChartRenderer.d.ts +15 -0
- package/dist/renderer/SankeyRenderer.d.ts +1 -0
- package/dist/renderer/registerSVG.d.ts +5 -0
- package/dist/renderer/sankeyLayout.d.ts +29 -0
- package/dist/scientific.js +2 -2
- package/dist/solid.js +2 -2
- package/dist/svelte.js +2 -2
- package/dist/tickUtils-B_X-ha13.js +41 -0
- package/dist/tickUtils-B_X-ha13.js.map +1 -0
- package/dist/trading.js +3 -3
- package/dist/types.d.ts +2 -1
- package/dist/velo-plot.full.js +1107 -1292
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +2 -2
- package/dist/vue/VeloPlot.vue.d.ts +1 -1
- package/dist/vue/index.d.ts +33 -33
- package/dist/vue.js +2 -2
- package/package.json +6 -1
- package/dist/ChartCore-AnR_3Xkb.js.map +0 -1
- package/dist/createStackedChart-DqcLCFGS.js +0 -1338
- package/dist/createStackedChart-DqcLCFGS.js.map +0 -1
- package/dist/index-Cv6ZDLWf.js +0 -521
- package/dist/index-Cv6ZDLWf.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forecasting.js","sources":["../../src/plugins/forecasting/algorithms.ts","../../src/plugins/forecasting/index.ts"],"sourcesContent":["/**\n * Forecasting Algorithms\n *\n * Native implementations of time series forecasting methods.\n *\n * ---------------------------------------------------------------------------\n * Method status audit (task 3.1)\n * ---------------------------------------------------------------------------\n * | Method | Status | Notes |\n * |---------------|--------------|-------------------------------------------|\n * | sma | implemented | Flat projection at trailing average |\n * | wma | implemented | Flat projection at weighted trailing avg |\n * | ema | implemented | Flat projection at last EMA value |\n * | expSmoothing | implemented | Simple exponential smoothing (SES) |\n * | holt | implemented | Double exponential smoothing (trend) |\n * | holtWinters | implemented | Triple exponential smoothing (seasonal) |\n * | linear | implemented | OLS linear trend projection |\n * | arima | implemented | ARIMA(p,d,q) via Hannan-Rissanen (simple) |\n *\n * Every public method returns a finite forecast plus 95% (configurable)\n * confidence bands derived from in-sample one-step residuals. No public\n * method throws for a supported `ForecastingMethod`.\n */\n\nimport type { ForecastingMethod, ForecastingParams, ForecastingResult } from './types';\n\n/** Internal result of a single method: forecast plus in-sample fitted values. */\ninterface MethodResult {\n /** Point forecast for the requested horizon. */\n yValues: number[];\n /**\n * In-sample one-step-ahead fitted values aligned with the history `y`.\n * `fitted[i]` is the prediction of `y[i]` using only `y[0..i-1]`.\n * `null` entries are ignored when computing residuals.\n */\n fitted?: (number | null)[];\n /** Whether forecast uncertainty accumulates with the horizon (sqrt growth). */\n accumulates: boolean;\n}\n\nfunction toArray(a: number[] | Float64Array | Float32Array): number[] {\n return Array.from(a);\n}\n\n/**\n * Map a confidence level (e.g. 0.95) to a normal-distribution z multiplier.\n */\nfunction zForConfidence(confidence: number): number {\n const table: Array<[number, number]> = [\n [0.5, 0.674],\n [0.68, 0.994],\n [0.8, 1.282],\n [0.9, 1.645],\n [0.95, 1.96],\n [0.975, 2.241],\n [0.99, 2.576],\n [0.995, 2.807],\n ];\n let best = table[0];\n let bestDiff = Infinity;\n for (const entry of table) {\n const diff = Math.abs(entry[0] - confidence);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = entry;\n }\n }\n return best[1];\n}\n\n/**\n * Main dispatcher for forecasting algorithms.\n */\nexport function calculateForecast(\n x: number[] | Float64Array | Float32Array,\n y: number[] | Float64Array | Float32Array,\n method: ForecastingMethod,\n horizon: number,\n params: ForecastingParams = {},\n confidence = 0.95\n): ForecastingResult {\n const n = x.length;\n if (n === 0) throw new Error('Dataset is empty');\n\n const ya = toArray(y);\n const xa = toArray(x);\n\n // Determine time step (assuming regular intervals)\n const dt = n > 1 ? (xa[n - 1] - xa[0]) / (n - 1) : 1;\n const lastX = xa[n - 1];\n\n let result: MethodResult;\n\n switch (method) {\n case 'sma':\n result = forecastSMA(ya, horizon, params.windowSize || 10);\n break;\n case 'ema':\n result = forecastEMA(ya, horizon, params.alpha ?? 0.3);\n break;\n case 'linear':\n result = forecastLinear(xa, ya, horizon);\n break;\n case 'expSmoothing':\n result = forecastSimpleExpSmoothing(ya, horizon, params.alpha ?? 0.3);\n break;\n case 'holt':\n result = forecastHolt(ya, horizon, params.alpha ?? 0.3, params.beta ?? 0.1);\n break;\n case 'wma':\n result = forecastWMA(ya, horizon, params.windowSize || 10);\n break;\n case 'holtWinters':\n result = forecastHoltWinters(\n ya,\n horizon,\n params.period || 12,\n params.alpha ?? 0.3,\n params.beta ?? 0.1,\n params.gamma ?? 0.1\n );\n break;\n case 'arima':\n result = forecastARIMA(\n ya,\n horizon,\n params.p ?? 1,\n params.d ?? 1,\n params.q ?? 0\n );\n break;\n default:\n throw new Error(`Method ${method} not implemented yet`);\n }\n\n // Generate future X values\n const futureX = new Array(horizon);\n for (let i = 0; i < horizon; i++) {\n futureX[i] = lastX + (i + 1) * dt;\n }\n\n // Compute residual-based statistics and confidence bands.\n const metrics = calculateFitMetrics(ya, result.fitted);\n const z = zForConfidence(confidence);\n const sigma = metrics.rmse;\n const { lower, upper } = buildConfidenceBands(\n result.yValues,\n sigma,\n z,\n result.accumulates\n );\n\n return {\n xValues: futureX,\n yValues: result.yValues,\n lowerBound: lower,\n upperBound: upper,\n method,\n metadata: { ...metrics, confidence },\n };\n}\n\n/**\n * Build symmetric confidence bands around the point forecast.\n * When `accumulates` is true the uncertainty widens with sqrt(horizon step),\n * reflecting the compounding error of trend/AR models.\n */\nfunction buildConfidenceBands(\n yValues: number[],\n sigma: number,\n z: number,\n accumulates: boolean\n): { lower: number[]; upper: number[] } {\n const lower = new Array(yValues.length);\n const upper = new Array(yValues.length);\n for (let i = 0; i < yValues.length; i++) {\n const growth = accumulates ? Math.sqrt(i + 1) : 1;\n const margin = z * sigma * growth;\n lower[i] = yValues[i] - margin;\n upper[i] = yValues[i] + margin;\n }\n return { lower, upper };\n}\n\n// ===========================================================================\n// Moving-average family\n// ===========================================================================\n\n/**\n * Weighted Moving Average (WMA).\n * Uses linear weights on the trailing window; projects flat at last WMA value.\n */\nfunction forecastWMA(y: number[], horizon: number, window: number): MethodResult {\n const n = y.length;\n const effectiveWindow = Math.min(window, n);\n\n const wmaAt = (end: number): number => {\n // end is always >= 1 here, so the trailing window w is always >= 1.\n const w = Math.min(effectiveWindow, end);\n let weightedSum = 0;\n let weightTotal = 0;\n for (let i = 0; i < w; i++) {\n const weight = i + 1;\n weightedSum += y[end - w + i] * weight;\n weightTotal += weight;\n }\n return weightedSum / weightTotal;\n };\n\n const fitted: (number | null)[] = new Array(n).fill(null);\n for (let i = 1; i < n; i++) fitted[i] = wmaAt(i);\n\n const wma = wmaAt(n);\n return { yValues: new Array(horizon).fill(wma), fitted, accumulates: false };\n}\n\n/**\n * Simple Moving Average (SMA).\n * Historical SMA used for projection (flat line at last average).\n */\nfunction forecastSMA(y: number[], horizon: number, window: number): MethodResult {\n const n = y.length;\n const effectiveWindow = Math.min(window, n);\n\n const smaAt = (end: number): number => {\n // end is always >= 1 here, so the trailing window w is always >= 1.\n const w = Math.min(effectiveWindow, end);\n let sum = 0;\n for (let i = end - w; i < end; i++) sum += y[i];\n return sum / w;\n };\n\n const fitted: (number | null)[] = new Array(n).fill(null);\n for (let i = 1; i < n; i++) fitted[i] = smaAt(i);\n\n const avg = smaAt(n);\n return { yValues: new Array(horizon).fill(avg), fitted, accumulates: false };\n}\n\n/**\n * Exponential Moving Average (EMA).\n */\nfunction forecastEMA(y: number[], horizon: number, alpha: number): MethodResult {\n const n = y.length;\n let ema = y[0];\n const fitted: (number | null)[] = new Array(n).fill(null);\n\n for (let i = 1; i < n; i++) {\n fitted[i] = ema; // one-step forecast is the previous EMA\n ema = alpha * y[i] + (1 - alpha) * ema;\n }\n\n return { yValues: new Array(horizon).fill(ema), fitted, accumulates: false };\n}\n\n/**\n * Linear Trend Projection.\n * Fits y = mx + b to the historical data.\n */\nfunction forecastLinear(x: number[], y: number[], horizon: number): MethodResult {\n const n = x.length;\n let sumX = 0,\n sumY = 0,\n sumXY = 0,\n sumXX = 0;\n\n for (let i = 0; i < n; i++) {\n sumX += x[i];\n sumY += y[i];\n sumXY += x[i] * y[i];\n sumXX += x[i] * x[i];\n }\n\n const denom = n * sumXX - sumX * sumX;\n const slope = denom !== 0 ? (n * sumXY - sumX * sumY) / denom : 0;\n const intercept = (sumY - slope * sumX) / n;\n\n const fitted: (number | null)[] = new Array(n);\n for (let i = 0; i < n; i++) fitted[i] = slope * x[i] + intercept;\n\n const lastX = x[n - 1];\n const dt = n > 1 ? (x[n - 1] - x[0]) / (n - 1) : 1;\n const yValues = new Array(horizon);\n for (let i = 0; i < horizon; i++) {\n const nextX = lastX + (i + 1) * dt;\n yValues[i] = slope * nextX + intercept;\n }\n\n return { yValues, fitted, accumulates: true };\n}\n\n/**\n * Simple Exponential Smoothing (SES).\n */\nfunction forecastSimpleExpSmoothing(y: number[], horizon: number, alpha: number): MethodResult {\n const n = y.length;\n let level = y[0];\n const fitted: (number | null)[] = new Array(n).fill(null);\n\n for (let i = 1; i < n; i++) {\n fitted[i] = level;\n level = alpha * y[i] + (1 - alpha) * level;\n }\n\n return { yValues: new Array(horizon).fill(level), fitted, accumulates: false };\n}\n\n/**\n * Holt's Linear Trend (Double Exponential Smoothing).\n */\nfunction forecastHolt(y: number[], horizon: number, alpha: number, beta: number): MethodResult {\n const n = y.length;\n if (n < 2) {\n return { yValues: new Array(horizon).fill(y[0] || 0), fitted: [], accumulates: true };\n }\n\n let level = y[0];\n let trend = y[1] - y[0];\n const fitted: (number | null)[] = new Array(n).fill(null);\n\n for (let i = 1; i < n; i++) {\n fitted[i] = level + trend; // one-step forecast\n const lastLevel = level;\n level = alpha * y[i] + (1 - alpha) * (level + trend);\n trend = beta * (level - lastLevel) + (1 - beta) * trend;\n }\n\n const yValues = new Array(horizon);\n for (let i = 0; i < horizon; i++) yValues[i] = level + (i + 1) * trend;\n\n return { yValues, fitted, accumulates: true };\n}\n\n/**\n * Holt-Winters (Triple Exponential Smoothing, additive seasonality).\n */\nfunction forecastHoltWinters(\n y: number[],\n horizon: number,\n period: number,\n alpha: number,\n beta: number,\n gamma: number\n): MethodResult {\n const n = y.length;\n if (n < period * 2) {\n // Fallback to Holt if not enough data for seasonality\n return forecastHolt(y, horizon, alpha, beta);\n }\n\n // 1. Initial Seasonality\n const seasonals = new Array(period);\n const seasonAverages = new Array(Math.floor(n / period));\n for (let i = 0; i < seasonAverages.length; i++) {\n let sum = 0;\n for (let j = 0; j < period; j++) sum += y[i * period + j];\n seasonAverages[i] = sum / period;\n }\n\n for (let i = 0; i < period; i++) {\n let sumOverAvg = 0;\n for (let j = 0; j < seasonAverages.length; j++) {\n sumOverAvg += y[j * period + i] - seasonAverages[j];\n }\n seasonals[i] = sumOverAvg / seasonAverages.length;\n }\n\n // 2. Initial Level and Trend\n let level = seasonAverages[0];\n let trend =\n (seasonAverages[seasonAverages.length - 1] - seasonAverages[0]) /\n ((seasonAverages.length - 1) * period);\n\n const fitted: (number | null)[] = new Array(n).fill(null);\n\n // 3. Update coefficients\n for (let i = 0; i < n; i++) {\n const seasonal = seasonals[i % period];\n if (i > 0) fitted[i] = level + trend + seasonal;\n const lastLevel = level;\n const val = y[i];\n level = alpha * (val - seasonal) + (1 - alpha) * (level + trend);\n trend = beta * (level - lastLevel) + (1 - beta) * trend;\n seasonals[i % period] = gamma * (val - level) + (1 - gamma) * seasonal;\n }\n\n // 4. Forecast\n const yValues = new Array(horizon);\n for (let i = 0; i < horizon; i++) {\n const m = i + 1;\n yValues[i] = level + m * trend + seasonals[(n + i) % period];\n }\n\n return { yValues, fitted, accumulates: true };\n}\n\n// ===========================================================================\n// ARIMA(p, d, q)\n// ===========================================================================\n\n/**\n * Simple native ARIMA implementation.\n *\n * - Differences the series `d` times to achieve (approximate) stationarity.\n * - Estimates AR(p) and MA(q) coefficients using the two-stage\n * Hannan-Rissanen procedure (long AR to recover innovations, then OLS on\n * lagged values and lagged innovations).\n * - Forecasts recursively on the differenced scale, then integrates back.\n *\n * Falls back to Holt's linear trend when there is not enough data to fit the\n * requested orders, so the method never throws for valid input.\n */\nfunction forecastARIMA(\n y: number[],\n horizon: number,\n p: number,\n d: number,\n q: number\n): MethodResult {\n const n = y.length;\n const order = Math.max(p, q);\n // Need enough observations to difference and fit; otherwise degrade gracefully.\n if (n < d + order + 2 || n < 4) {\n return forecastHolt(y, horizon, 0.3, 0.1);\n }\n\n // 1. Difference d times, keeping every intermediate level for integration.\n const diffLevels: number[][] = [y.slice()];\n for (let k = 0; k < d; k++) {\n diffLevels.push(difference(diffLevels[k]));\n }\n const w = diffLevels[d]; // fully differenced (stationary) series\n const m = w.length;\n\n // Center the differenced series around its mean.\n const mean = w.reduce((s, v) => s + v, 0) / m;\n const wc = w.map((v) => v - mean);\n\n // 2. Stage 1 - recover innovation (residual) estimates via a long AR fit.\n let innovations = new Array(m).fill(0);\n if (q > 0) {\n const arLong = Math.min(Math.max(p + q + 2, 5), Math.floor(m / 2));\n const { residuals } = fitAR(wc, arLong);\n innovations = residuals;\n }\n\n // 3. Stage 2 - regress w_t on its p lags and q lagged innovations.\n const start = Math.max(p, q);\n const rows: number[][] = [];\n const targets: number[] = [];\n for (let t = start; t < m; t++) {\n const row: number[] = [];\n for (let i = 1; i <= p; i++) row.push(wc[t - i]);\n for (let j = 1; j <= q; j++) row.push(innovations[t - j]);\n rows.push(row);\n targets.push(wc[t]);\n }\n\n let coeffs: number[] = [];\n if (rows.length > 0 && rows[0].length > 0) {\n coeffs = olsSolve(rows, targets);\n }\n if (coeffs.length !== p + q || coeffs.some((c) => !Number.isFinite(c))) {\n // Fitting failed (singular/ill-conditioned) - fall back.\n return forecastHolt(y, horizon, 0.3, 0.1);\n }\n const ar = coeffs.slice(0, p);\n const ma = coeffs.slice(p, p + q);\n\n // 4. In-sample one-step fitted values (on original scale) for residual sigma.\n const fitted: (number | null)[] = new Array(n).fill(null);\n const fittedResiduals = new Array(m).fill(0);\n for (let t = start; t < m; t++) {\n let pred = 0;\n for (let i = 1; i <= p; i++) pred += ar[i - 1] * wc[t - i];\n for (let j = 1; j <= q; j++) pred += ma[j - 1] * fittedResiduals[t - j];\n fittedResiduals[t] = wc[t] - pred;\n // Map differenced fitted value back to the original scale by adding the\n // previous original observation chain. For d>=1 we approximate by adding\n // the last non-differenced value; exact integration below handles forecasts.\n fitted[t + (n - m)] = integrateFittedPoint(diffLevels, d, t, pred + mean);\n }\n\n // 5. Recursive forecast on the differenced/centered scale.\n const wHist = wc.slice();\n const eHist = fittedResiduals.slice();\n const forecastDiff: number[] = [];\n for (let h = 0; h < horizon; h++) {\n let pred = 0;\n // wHist/eHist always have at least `order` entries here, so the lag index\n // is always in range.\n for (let i = 1; i <= p; i++) {\n pred += ar[i - 1] * wHist[wHist.length - i];\n }\n for (let j = 1; j <= q; j++) {\n pred += ma[j - 1] * eHist[eHist.length - j];\n }\n wHist.push(pred);\n eHist.push(0); // expected future innovation is zero\n forecastDiff.push(pred + mean);\n }\n\n // 6. Integrate the forecast back d times to the original scale.\n const yValues = integrateForecast(diffLevels, d, forecastDiff);\n\n return { yValues, fitted, accumulates: true };\n}\n\n/** First difference of a series. */\nfunction difference(series: number[]): number[] {\n const out = new Array(series.length - 1);\n for (let i = 1; i < series.length; i++) out[i - 1] = series[i] - series[i - 1];\n return out;\n}\n\n/**\n * Integrate a differenced forecast back to the original scale.\n * `diffLevels[0]` is the original series, `diffLevels[d]` fully differenced.\n */\nfunction integrateForecast(diffLevels: number[][], d: number, forecastDiff: number[]): number[] {\n let current = forecastDiff.slice();\n for (let k = d; k >= 1; k--) {\n const parent = diffLevels[k - 1];\n let last = parent[parent.length - 1];\n const integrated = new Array(current.length);\n for (let i = 0; i < current.length; i++) {\n last += current[i];\n integrated[i] = last;\n }\n current = integrated;\n }\n return current;\n}\n\n/**\n * Best-effort mapping of a single in-sample differenced prediction back to the\n * original scale (used only for residual-sigma estimation).\n */\nfunction integrateFittedPoint(\n diffLevels: number[][],\n d: number,\n t: number,\n diffPred: number\n): number {\n if (d === 0) return diffPred;\n // Add the previous observed original value chain.\n const parent = diffLevels[d - 1];\n // parent is one longer than the differenced series, so index t is in range.\n const base = parent[t];\n // For d>1 this is an approximation; sufficient for a residual scale estimate.\n return base + diffPred;\n}\n\n/**\n * Fit an AR(order) model via ordinary least squares and return coefficients\n * plus the in-sample residuals aligned to the input series (leading entries 0).\n */\nfunction fitAR(series: number[], order: number): { coeffs: number[]; residuals: number[] } {\n const m = series.length;\n const rows: number[][] = [];\n const targets: number[] = [];\n for (let t = order; t < m; t++) {\n const row: number[] = [];\n for (let i = 1; i <= order; i++) row.push(series[t - i]);\n rows.push(row);\n targets.push(series[t]);\n }\n const coeffs = rows.length > 0 ? olsSolve(rows, targets) : new Array(order).fill(0);\n const residuals = new Array(m).fill(0);\n for (let t = order; t < m; t++) {\n let pred = 0;\n for (let i = 1; i <= order; i++) pred += (coeffs[i - 1] || 0) * series[t - i];\n residuals[t] = series[t] - pred;\n }\n return { coeffs, residuals };\n}\n\n/**\n * Solve a linear least-squares problem `X b = y` via the normal equations\n * with Gaussian elimination. Returns [] on a singular system.\n */\nfunction olsSolve(X: number[][], y: number[]): number[] {\n const rows = X.length;\n const cols = X[0].length;\n\n // Normal equations: (XᵀX) b = Xᵀy\n const xtx: number[][] = Array.from({ length: cols }, () => new Array(cols).fill(0));\n const xty: number[] = new Array(cols).fill(0);\n\n for (let i = 0; i < rows; i++) {\n for (let a = 0; a < cols; a++) {\n xty[a] += X[i][a] * y[i];\n for (let b = 0; b < cols; b++) {\n xtx[a][b] += X[i][a] * X[i][b];\n }\n }\n }\n\n // Tiny ridge term to stabilise near-singular systems.\n for (let a = 0; a < cols; a++) xtx[a][a] += 1e-8;\n\n return gaussianSolve(xtx, xty);\n}\n\n/**\n * Solve `A x = b` for a square matrix via Gaussian elimination with partial\n * pivoting. Returns [] if the matrix is singular.\n */\nexport function gaussianSolve(A: number[][], b: number[]): number[] {\n const n = b.length;\n const M = A.map((row, i) => [...row, b[i]]);\n\n for (let col = 0; col < n; col++) {\n // Partial pivot\n let pivot = col;\n for (let r = col + 1; r < n; r++) {\n if (Math.abs(M[r][col]) > Math.abs(M[pivot][col])) pivot = r;\n }\n if (Math.abs(M[pivot][col]) < 1e-12) return [];\n [M[col], M[pivot]] = [M[pivot], M[col]];\n\n // Eliminate\n for (let r = 0; r < n; r++) {\n if (r === col) continue;\n const factor = M[r][col] / M[col][col];\n for (let c = col; c <= n; c++) M[r][c] -= factor * M[col][c];\n }\n }\n\n const x = new Array(n);\n for (let i = 0; i < n; i++) x[i] = M[i][n] / M[i][i];\n return x;\n}\n\n/**\n * Compute error metrics from in-sample one-step residuals.\n * `rmse` doubles as the residual sigma used to build confidence bands.\n */\nfunction calculateFitMetrics(\n historical: number[],\n fitted?: (number | null)[]\n): { mse: number; rmse: number; mae: number; r2: number } {\n if (!fitted || fitted.length === 0) {\n return { mse: 0, rmse: 0, mae: 0, r2: 0 };\n }\n\n let sse = 0;\n let sae = 0;\n let count = 0;\n const observed: number[] = [];\n\n for (let i = 0; i < fitted.length && i < historical.length; i++) {\n const f = fitted[i];\n if (f === null || f === undefined || !Number.isFinite(f)) continue;\n const err = historical[i] - f;\n sse += err * err;\n sae += Math.abs(err);\n observed.push(historical[i]);\n count++;\n }\n\n if (count === 0) return { mse: 0, rmse: 0, mae: 0, r2: 0 };\n\n const mse = sse / count;\n const rmse = Math.sqrt(mse);\n const mae = sae / count;\n\n const mean = observed.reduce((s, v) => s + v, 0) / observed.length;\n const sst = observed.reduce((s, v) => s + (v - mean) * (v - mean), 0);\n const r2 = sst > 0 ? 1 - sse / sst : 0;\n\n return {\n mse: round(mse),\n rmse: round(rmse),\n mae: round(mae),\n r2: round(r2),\n };\n}\n\nfunction round(v: number): number {\n return Math.round(v * 1e6) / 1e6;\n}\n","/**\n * Velo Plot - Forecasting Plugin\n * \n * Provides time series forecasting capabilities using native statistical models.\n */\n\nimport type { \n PluginForecastingConfig, \n ForecastingAPI, \n ForecastingOptions, \n ForecastingResult, \n ForecastingVisualizationConfig \n} from './types';\nimport { calculateForecast } from './algorithms';\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n AfterRenderEvent\n} from '../types';\n\nconst manifestForecasting: PluginManifest = {\n name: \"velo-plot-forecasting\",\n version: \"1.0.0\",\n description: \"Time series forecasting for velo-plot\",\n provides: [\"analysis\", \"forecasting\"],\n tags: [\"statistics\", \"forecasting\", \"analysis\"],\n};\n\n/**\n * Forecasting Plugin for Velo Plot\n */\nexport function PluginForecasting(\n config: Partial<PluginForecastingConfig> = {}\n): ChartPlugin<PluginForecastingConfig> {\n let ctx: PluginContext | null = null;\n const activeForecasts = new Map<string, { result: ForecastingResult, config: ForecastingVisualizationConfig }>();\n\n const api: ForecastingAPI = {\n forecast(data: any, options: ForecastingOptions): ForecastingResult {\n let x: any, y: any;\n\n // Allow `forecast('seriesId', options)` by resolving the series data.\n if (typeof data === 'string') {\n if (!ctx) throw new Error('Plugin not initialized');\n const series = ctx.data.getAllSeries().find(s => s.getId() === data);\n if (!series) throw new Error(`Series not found: ${data}`);\n const seriesData = series.getData();\n x = seriesData.x;\n y = seriesData.y;\n } else if (Array.isArray(data)) {\n y = data;\n x = data.map((_, i) => i);\n } else if (data.x && data.y) {\n x = data.x;\n y = data.y;\n } else {\n throw new Error(\"Invalid data format for forecasting\");\n }\n\n return calculateForecast(x, y, options.method, options.horizon, options.params, options.confidence);\n },\n\n async forecastSeries(seriesId: string, options: ForecastingOptions): Promise<ForecastingResult> {\n if (!ctx) throw new Error(\"Plugin not initialized\");\n \n const series = ctx.data.getAllSeries().find(s => s.getId() === seriesId);\n if (!series) throw new Error(`Series not found: ${seriesId}`);\n \n const data = series.getData();\n return this.forecast(data, options);\n },\n\n visualize(result: ForecastingResult, vizConfig: ForecastingVisualizationConfig = {}) {\n const id = `forecast-${Math.random().toString(36).substr(2, 9)}`;\n const mergedConfig = {\n showLine: true,\n showConfidenceInterval: true,\n ...config.defaultVisualization,\n ...vizConfig\n };\n \n activeForecasts.set(id, { result, config: mergedConfig });\n ctx?.requestRender();\n return id;\n },\n\n clear(id?: string) {\n if (id) {\n activeForecasts.delete(id);\n } else {\n activeForecasts.clear();\n }\n ctx?.requestRender();\n }\n };\n\n function drawForecasts(pCtx: PluginContext) {\n const { render, coords } = pCtx;\n const { ctx2d } = render;\n if (!ctx2d) return;\n\n activeForecasts.forEach((viz) => {\n const { result, config: vizConfig } = viz;\n const { xValues, yValues, lowerBound, upperBound } = result;\n\n ctx2d.save();\n\n // 1. Draw Confidence Interval\n if (vizConfig.showConfidenceInterval && lowerBound && upperBound) {\n ctx2d.beginPath();\n const opacity = vizConfig.intervalStyle?.opacity ?? 0.15;\n const color = vizConfig.intervalStyle?.fillColor || (vizConfig.lineStyle?.color || '#3b82f6');\n \n ctx2d.fillStyle = color.startsWith('rgba') ? color : color + Math.floor(opacity * 255).toString(16).padStart(2, '0');\n \n for (let i = 0; i < xValues.length; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(upperBound[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n \n for (let i = xValues.length - 1; i >= 0; i--) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(lowerBound[i]);\n ctx2d.lineTo(px, py);\n }\n \n ctx2d.closePath();\n ctx2d.fill();\n }\n\n // 2. Draw Forecast Line\n if (vizConfig.showLine) {\n ctx2d.beginPath();\n ctx2d.strokeStyle = vizConfig.lineStyle?.color || '#3b82f6';\n ctx2d.lineWidth = vizConfig.lineStyle?.width || 2;\n if (vizConfig.lineStyle?.dash) {\n ctx2d.setLineDash(vizConfig.lineStyle.dash);\n } else {\n ctx2d.setLineDash([5, 5]); // Default dashed for forecast\n }\n\n for (let i = 0; i < xValues.length; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(yValues[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n ctx2d.stroke();\n }\n\n ctx2d.restore();\n });\n }\n\n return {\n manifest: manifestForecasting,\n onInit(c: PluginContext) {\n ctx = c;\n },\n onRenderOverlay(pCtx: PluginContext, _event: AfterRenderEvent) {\n drawForecasts(pCtx);\n },\n api\n };\n}\n\n// Re-export types and constants\nexport * from './types';\nexport * from './algorithms';\nexport { manifestForecasting };\n"],"names":["toArray","a","zForConfidence","confidence","table","best","bestDiff","entry","diff","calculateForecast","x","y","method","horizon","params","n","ya","xa","dt","lastX","result","forecastSMA","forecastEMA","forecastLinear","forecastSimpleExpSmoothing","forecastHolt","forecastWMA","forecastHoltWinters","forecastARIMA","futureX","i","metrics","calculateFitMetrics","z","sigma","lower","upper","buildConfidenceBands","yValues","accumulates","growth","margin","window","effectiveWindow","wmaAt","end","w","weightedSum","weightTotal","weight","fitted","wma","smaAt","sum","avg","alpha","ema","sumX","sumY","sumXY","sumXX","denom","slope","intercept","nextX","level","beta","trend","lastLevel","period","gamma","seasonals","seasonAverages","j","sumOverAvg","seasonal","val","m","p","d","q","order","diffLevels","k","difference","mean","s","v","wc","innovations","arLong","residuals","fitAR","start","rows","targets","t","row","coeffs","olsSolve","c","ar","ma","fittedResiduals","pred","integrateFittedPoint","wHist","eHist","forecastDiff","h","integrateForecast","series","out","current","parent","last","integrated","diffPred","X","cols","xtx","xty","b","gaussianSolve","A","M","col","pivot","r","factor","historical","sse","sae","count","observed","f","err","mse","rmse","mae","sst","r2","round","manifestForecasting","PluginForecasting","config","ctx","activeForecasts","api","data","options","seriesData","_","seriesId","vizConfig","id","mergedConfig","drawForecasts","pCtx","render","coords","ctx2d","viz","_a","_b","_c","_d","_e","_f","xValues","lowerBound","upperBound","opacity","color","px","py","_event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"forecasting.js","sources":["../../src/plugins/forecasting/algorithms.ts","../../src/plugins/forecasting/index.ts"],"sourcesContent":["/**\n * Forecasting Algorithms\n *\n * Native implementations of time series forecasting methods.\n *\n * ---------------------------------------------------------------------------\n * Method status audit (task 3.1)\n * ---------------------------------------------------------------------------\n * | Method | Status | Notes |\n * |---------------|--------------|-------------------------------------------|\n * | sma | implemented | Flat projection at trailing average |\n * | wma | implemented | Flat projection at weighted trailing avg |\n * | ema | implemented | Flat projection at last EMA value |\n * | expSmoothing | implemented | Simple exponential smoothing (SES) |\n * | holt | implemented | Double exponential smoothing (trend) |\n * | holtWinters | implemented | Triple exponential smoothing (seasonal) |\n * | linear | implemented | OLS linear trend projection |\n * | arima | implemented | ARIMA(p,d,q) via Hannan-Rissanen (simple) |\n *\n * Every public method returns a finite forecast plus 95% (configurable)\n * confidence bands derived from in-sample one-step residuals. No public\n * method throws for a supported `ForecastingMethod`.\n */\n\nimport type { ForecastingMethod, ForecastingParams, ForecastingResult } from './types';\n\n/** Internal result of a single method: forecast plus in-sample fitted values. */\ninterface MethodResult {\n /** Point forecast for the requested horizon. */\n yValues: number[];\n /**\n * In-sample one-step-ahead fitted values aligned with the history `y`.\n * `fitted[i]` is the prediction of `y[i]` using only `y[0..i-1]`.\n * `null` entries are ignored when computing residuals.\n */\n fitted?: (number | null)[];\n /** Whether forecast uncertainty accumulates with the horizon (sqrt growth). */\n accumulates: boolean;\n}\n\nfunction toArray(a: number[] | Float64Array | Float32Array): number[] {\n return Array.from(a);\n}\n\n/**\n * Map a confidence level (e.g. 0.95) to a normal-distribution z multiplier.\n */\nfunction zForConfidence(confidence: number): number {\n const table: Array<[number, number]> = [\n [0.5, 0.674],\n [0.68, 0.994],\n [0.8, 1.282],\n [0.9, 1.645],\n [0.95, 1.96],\n [0.975, 2.241],\n [0.99, 2.576],\n [0.995, 2.807],\n ];\n let best = table[0];\n let bestDiff = Infinity;\n for (const entry of table) {\n const diff = Math.abs(entry[0] - confidence);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = entry;\n }\n }\n return best[1];\n}\n\n/**\n * Main dispatcher for forecasting algorithms.\n */\nexport function calculateForecast(\n x: number[] | Float64Array | Float32Array,\n y: number[] | Float64Array | Float32Array,\n method: ForecastingMethod,\n horizon: number,\n params: ForecastingParams = {},\n confidence = 0.95\n): ForecastingResult {\n const n = x.length;\n if (n === 0) throw new Error('Dataset is empty');\n\n const ya = toArray(y);\n const xa = toArray(x);\n\n // Determine time step (assuming regular intervals)\n const dt = n > 1 ? (xa[n - 1] - xa[0]) / (n - 1) : 1;\n const lastX = xa[n - 1];\n\n let result: MethodResult;\n\n switch (method) {\n case 'sma':\n result = forecastSMA(ya, horizon, params.windowSize || 10);\n break;\n case 'ema':\n result = forecastEMA(ya, horizon, params.alpha ?? 0.3);\n break;\n case 'linear':\n result = forecastLinear(xa, ya, horizon);\n break;\n case 'expSmoothing':\n result = forecastSimpleExpSmoothing(ya, horizon, params.alpha ?? 0.3);\n break;\n case 'holt':\n result = forecastHolt(ya, horizon, params.alpha ?? 0.3, params.beta ?? 0.1);\n break;\n case 'wma':\n result = forecastWMA(ya, horizon, params.windowSize || 10);\n break;\n case 'holtWinters':\n result = forecastHoltWinters(\n ya,\n horizon,\n params.period || 12,\n params.alpha ?? 0.3,\n params.beta ?? 0.1,\n params.gamma ?? 0.1\n );\n break;\n case 'arima':\n result = forecastARIMA(\n ya,\n horizon,\n params.p ?? 1,\n params.d ?? 1,\n params.q ?? 0\n );\n break;\n default:\n throw new Error(`Method ${method} not implemented yet`);\n }\n\n // Generate future X values\n const futureX = new Array(horizon);\n for (let i = 0; i < horizon; i++) {\n futureX[i] = lastX + (i + 1) * dt;\n }\n\n // Compute residual-based statistics and confidence bands.\n const metrics = calculateFitMetrics(ya, result.fitted);\n const z = zForConfidence(confidence);\n const sigma = metrics.rmse;\n const { lower, upper } = buildConfidenceBands(\n result.yValues,\n sigma,\n z,\n result.accumulates\n );\n\n return {\n xValues: futureX,\n yValues: result.yValues,\n lowerBound: lower,\n upperBound: upper,\n method,\n metadata: { ...metrics, confidence },\n };\n}\n\n/**\n * Build symmetric confidence bands around the point forecast.\n * When `accumulates` is true the uncertainty widens with sqrt(horizon step),\n * reflecting the compounding error of trend/AR models.\n */\nfunction buildConfidenceBands(\n yValues: number[],\n sigma: number,\n z: number,\n accumulates: boolean\n): { lower: number[]; upper: number[] } {\n const lower = new Array(yValues.length);\n const upper = new Array(yValues.length);\n for (let i = 0; i < yValues.length; i++) {\n const growth = accumulates ? Math.sqrt(i + 1) : 1;\n const margin = z * sigma * growth;\n lower[i] = yValues[i] - margin;\n upper[i] = yValues[i] + margin;\n }\n return { lower, upper };\n}\n\n// ===========================================================================\n// Moving-average family\n// ===========================================================================\n\n/**\n * Weighted Moving Average (WMA).\n * Uses linear weights on the trailing window; projects flat at last WMA value.\n */\nfunction forecastWMA(y: number[], horizon: number, window: number): MethodResult {\n const n = y.length;\n const effectiveWindow = Math.min(window, n);\n\n const wmaAt = (end: number): number => {\n // end is always >= 1 here, so the trailing window w is always >= 1.\n const w = Math.min(effectiveWindow, end);\n let weightedSum = 0;\n let weightTotal = 0;\n for (let i = 0; i < w; i++) {\n const weight = i + 1;\n weightedSum += y[end - w + i] * weight;\n weightTotal += weight;\n }\n return weightedSum / weightTotal;\n };\n\n const fitted: (number | null)[] = new Array(n).fill(null);\n for (let i = 1; i < n; i++) fitted[i] = wmaAt(i);\n\n const wma = wmaAt(n);\n return { yValues: new Array(horizon).fill(wma), fitted, accumulates: false };\n}\n\n/**\n * Simple Moving Average (SMA).\n * Historical SMA used for projection (flat line at last average).\n */\nfunction forecastSMA(y: number[], horizon: number, window: number): MethodResult {\n const n = y.length;\n const effectiveWindow = Math.min(window, n);\n\n const smaAt = (end: number): number => {\n // end is always >= 1 here, so the trailing window w is always >= 1.\n const w = Math.min(effectiveWindow, end);\n let sum = 0;\n for (let i = end - w; i < end; i++) sum += y[i];\n return sum / w;\n };\n\n const fitted: (number | null)[] = new Array(n).fill(null);\n for (let i = 1; i < n; i++) fitted[i] = smaAt(i);\n\n const avg = smaAt(n);\n return { yValues: new Array(horizon).fill(avg), fitted, accumulates: false };\n}\n\n/**\n * Exponential Moving Average (EMA).\n */\nfunction forecastEMA(y: number[], horizon: number, alpha: number): MethodResult {\n const n = y.length;\n let ema = y[0];\n const fitted: (number | null)[] = new Array(n).fill(null);\n\n for (let i = 1; i < n; i++) {\n fitted[i] = ema; // one-step forecast is the previous EMA\n ema = alpha * y[i] + (1 - alpha) * ema;\n }\n\n return { yValues: new Array(horizon).fill(ema), fitted, accumulates: false };\n}\n\n/**\n * Linear Trend Projection.\n * Fits y = mx + b to the historical data.\n */\nfunction forecastLinear(x: number[], y: number[], horizon: number): MethodResult {\n const n = x.length;\n let sumX = 0,\n sumY = 0,\n sumXY = 0,\n sumXX = 0;\n\n for (let i = 0; i < n; i++) {\n sumX += x[i];\n sumY += y[i];\n sumXY += x[i] * y[i];\n sumXX += x[i] * x[i];\n }\n\n const denom = n * sumXX - sumX * sumX;\n const slope = denom !== 0 ? (n * sumXY - sumX * sumY) / denom : 0;\n const intercept = (sumY - slope * sumX) / n;\n\n const fitted: (number | null)[] = new Array(n);\n for (let i = 0; i < n; i++) fitted[i] = slope * x[i] + intercept;\n\n const lastX = x[n - 1];\n const dt = n > 1 ? (x[n - 1] - x[0]) / (n - 1) : 1;\n const yValues = new Array(horizon);\n for (let i = 0; i < horizon; i++) {\n const nextX = lastX + (i + 1) * dt;\n yValues[i] = slope * nextX + intercept;\n }\n\n return { yValues, fitted, accumulates: true };\n}\n\n/**\n * Simple Exponential Smoothing (SES).\n */\nfunction forecastSimpleExpSmoothing(y: number[], horizon: number, alpha: number): MethodResult {\n const n = y.length;\n let level = y[0];\n const fitted: (number | null)[] = new Array(n).fill(null);\n\n for (let i = 1; i < n; i++) {\n fitted[i] = level;\n level = alpha * y[i] + (1 - alpha) * level;\n }\n\n return { yValues: new Array(horizon).fill(level), fitted, accumulates: false };\n}\n\n/**\n * Holt's Linear Trend (Double Exponential Smoothing).\n */\nfunction forecastHolt(y: number[], horizon: number, alpha: number, beta: number): MethodResult {\n const n = y.length;\n if (n < 2) {\n return { yValues: new Array(horizon).fill(y[0] || 0), fitted: [], accumulates: true };\n }\n\n let level = y[0];\n let trend = y[1] - y[0];\n const fitted: (number | null)[] = new Array(n).fill(null);\n\n for (let i = 1; i < n; i++) {\n fitted[i] = level + trend; // one-step forecast\n const lastLevel = level;\n level = alpha * y[i] + (1 - alpha) * (level + trend);\n trend = beta * (level - lastLevel) + (1 - beta) * trend;\n }\n\n const yValues = new Array(horizon);\n for (let i = 0; i < horizon; i++) yValues[i] = level + (i + 1) * trend;\n\n return { yValues, fitted, accumulates: true };\n}\n\n/**\n * Holt-Winters (Triple Exponential Smoothing, additive seasonality).\n */\nfunction forecastHoltWinters(\n y: number[],\n horizon: number,\n period: number,\n alpha: number,\n beta: number,\n gamma: number\n): MethodResult {\n const n = y.length;\n if (n < period * 2) {\n // Fallback to Holt if not enough data for seasonality\n return forecastHolt(y, horizon, alpha, beta);\n }\n\n // 1. Initial Seasonality\n const seasonals = new Array(period);\n const seasonAverages = new Array(Math.floor(n / period));\n for (let i = 0; i < seasonAverages.length; i++) {\n let sum = 0;\n for (let j = 0; j < period; j++) sum += y[i * period + j];\n seasonAverages[i] = sum / period;\n }\n\n for (let i = 0; i < period; i++) {\n let sumOverAvg = 0;\n for (let j = 0; j < seasonAverages.length; j++) {\n sumOverAvg += y[j * period + i] - seasonAverages[j];\n }\n seasonals[i] = sumOverAvg / seasonAverages.length;\n }\n\n // 2. Initial Level and Trend\n let level = seasonAverages[0];\n let trend =\n (seasonAverages[seasonAverages.length - 1] - seasonAverages[0]) /\n ((seasonAverages.length - 1) * period);\n\n const fitted: (number | null)[] = new Array(n).fill(null);\n\n // 3. Update coefficients\n for (let i = 0; i < n; i++) {\n const seasonal = seasonals[i % period];\n if (i > 0) fitted[i] = level + trend + seasonal;\n const lastLevel = level;\n const val = y[i];\n level = alpha * (val - seasonal) + (1 - alpha) * (level + trend);\n trend = beta * (level - lastLevel) + (1 - beta) * trend;\n seasonals[i % period] = gamma * (val - level) + (1 - gamma) * seasonal;\n }\n\n // 4. Forecast\n const yValues = new Array(horizon);\n for (let i = 0; i < horizon; i++) {\n const m = i + 1;\n yValues[i] = level + m * trend + seasonals[(n + i) % period];\n }\n\n return { yValues, fitted, accumulates: true };\n}\n\n// ===========================================================================\n// ARIMA(p, d, q)\n// ===========================================================================\n\n/**\n * Simple native ARIMA implementation.\n *\n * - Differences the series `d` times to achieve (approximate) stationarity.\n * - Estimates AR(p) and MA(q) coefficients using the two-stage\n * Hannan-Rissanen procedure (long AR to recover innovations, then OLS on\n * lagged values and lagged innovations).\n * - Forecasts recursively on the differenced scale, then integrates back.\n *\n * Falls back to Holt's linear trend when there is not enough data to fit the\n * requested orders, so the method never throws for valid input.\n */\nfunction forecastARIMA(\n y: number[],\n horizon: number,\n p: number,\n d: number,\n q: number\n): MethodResult {\n const n = y.length;\n const order = Math.max(p, q);\n // Need enough observations to difference and fit; otherwise degrade gracefully.\n if (n < d + order + 2 || n < 4) {\n return forecastHolt(y, horizon, 0.3, 0.1);\n }\n\n // 1. Difference d times, keeping every intermediate level for integration.\n const diffLevels: number[][] = [y.slice()];\n for (let k = 0; k < d; k++) {\n diffLevels.push(difference(diffLevels[k]));\n }\n const w = diffLevels[d]; // fully differenced (stationary) series\n const m = w.length;\n\n // Center the differenced series around its mean.\n const mean = w.reduce((s, v) => s + v, 0) / m;\n const wc = w.map((v) => v - mean);\n\n // 2. Stage 1 - recover innovation (residual) estimates via a long AR fit.\n let innovations = new Array(m).fill(0);\n if (q > 0) {\n const arLong = Math.min(Math.max(p + q + 2, 5), Math.floor(m / 2));\n const { residuals } = fitAR(wc, arLong);\n innovations = residuals;\n }\n\n // 3. Stage 2 - regress w_t on its p lags and q lagged innovations.\n const start = Math.max(p, q);\n const rows: number[][] = [];\n const targets: number[] = [];\n for (let t = start; t < m; t++) {\n const row: number[] = [];\n for (let i = 1; i <= p; i++) row.push(wc[t - i]);\n for (let j = 1; j <= q; j++) row.push(innovations[t - j]);\n rows.push(row);\n targets.push(wc[t]);\n }\n\n let coeffs: number[] = [];\n if (rows.length > 0 && rows[0].length > 0) {\n coeffs = olsSolve(rows, targets);\n }\n if (coeffs.length !== p + q || coeffs.some((c) => !Number.isFinite(c))) {\n // Fitting failed (singular/ill-conditioned) - fall back.\n return forecastHolt(y, horizon, 0.3, 0.1);\n }\n const ar = coeffs.slice(0, p);\n const ma = coeffs.slice(p, p + q);\n\n // 4. In-sample one-step fitted values (on original scale) for residual sigma.\n const fitted: (number | null)[] = new Array(n).fill(null);\n const fittedResiduals = new Array(m).fill(0);\n for (let t = start; t < m; t++) {\n let pred = 0;\n for (let i = 1; i <= p; i++) pred += ar[i - 1] * wc[t - i];\n for (let j = 1; j <= q; j++) pred += ma[j - 1] * fittedResiduals[t - j];\n fittedResiduals[t] = wc[t] - pred;\n // Map differenced fitted value back to the original scale by adding the\n // previous original observation chain. For d>=1 we approximate by adding\n // the last non-differenced value; exact integration below handles forecasts.\n fitted[t + (n - m)] = integrateFittedPoint(diffLevels, d, t, pred + mean);\n }\n\n // 5. Recursive forecast on the differenced/centered scale.\n const wHist = wc.slice();\n const eHist = fittedResiduals.slice();\n const forecastDiff: number[] = [];\n for (let h = 0; h < horizon; h++) {\n let pred = 0;\n // wHist/eHist always have at least `order` entries here, so the lag index\n // is always in range.\n for (let i = 1; i <= p; i++) {\n pred += ar[i - 1] * wHist[wHist.length - i];\n }\n for (let j = 1; j <= q; j++) {\n pred += ma[j - 1] * eHist[eHist.length - j];\n }\n wHist.push(pred);\n eHist.push(0); // expected future innovation is zero\n forecastDiff.push(pred + mean);\n }\n\n // 6. Integrate the forecast back d times to the original scale.\n const yValues = integrateForecast(diffLevels, d, forecastDiff);\n\n return { yValues, fitted, accumulates: true };\n}\n\n/** First difference of a series. */\nfunction difference(series: number[]): number[] {\n const out = new Array(series.length - 1);\n for (let i = 1; i < series.length; i++) out[i - 1] = series[i] - series[i - 1];\n return out;\n}\n\n/**\n * Integrate a differenced forecast back to the original scale.\n * `diffLevels[0]` is the original series, `diffLevels[d]` fully differenced.\n */\nfunction integrateForecast(diffLevels: number[][], d: number, forecastDiff: number[]): number[] {\n let current = forecastDiff.slice();\n for (let k = d; k >= 1; k--) {\n const parent = diffLevels[k - 1];\n let last = parent[parent.length - 1];\n const integrated = new Array(current.length);\n for (let i = 0; i < current.length; i++) {\n last += current[i];\n integrated[i] = last;\n }\n current = integrated;\n }\n return current;\n}\n\n/**\n * Best-effort mapping of a single in-sample differenced prediction back to the\n * original scale (used only for residual-sigma estimation).\n */\nfunction integrateFittedPoint(\n diffLevels: number[][],\n d: number,\n t: number,\n diffPred: number\n): number {\n if (d === 0) return diffPred;\n // Add the previous observed original value chain.\n const parent = diffLevels[d - 1];\n // parent is one longer than the differenced series, so index t is in range.\n const base = parent[t];\n // For d>1 this is an approximation; sufficient for a residual scale estimate.\n return base + diffPred;\n}\n\n/**\n * Fit an AR(order) model via ordinary least squares and return coefficients\n * plus the in-sample residuals aligned to the input series (leading entries 0).\n */\nfunction fitAR(series: number[], order: number): { coeffs: number[]; residuals: number[] } {\n const m = series.length;\n const rows: number[][] = [];\n const targets: number[] = [];\n for (let t = order; t < m; t++) {\n const row: number[] = [];\n for (let i = 1; i <= order; i++) row.push(series[t - i]);\n rows.push(row);\n targets.push(series[t]);\n }\n const coeffs = rows.length > 0 ? olsSolve(rows, targets) : new Array(order).fill(0);\n const residuals = new Array(m).fill(0);\n for (let t = order; t < m; t++) {\n let pred = 0;\n for (let i = 1; i <= order; i++) pred += (coeffs[i - 1] || 0) * series[t - i];\n residuals[t] = series[t] - pred;\n }\n return { coeffs, residuals };\n}\n\n/**\n * Solve a linear least-squares problem `X b = y` via the normal equations\n * with Gaussian elimination. Returns [] on a singular system.\n */\nfunction olsSolve(X: number[][], y: number[]): number[] {\n const rows = X.length;\n const cols = X[0].length;\n\n // Normal equations: (XᵀX) b = Xᵀy\n const xtx: number[][] = Array.from({ length: cols }, () => new Array(cols).fill(0));\n const xty: number[] = new Array(cols).fill(0);\n\n for (let i = 0; i < rows; i++) {\n for (let a = 0; a < cols; a++) {\n xty[a] += X[i][a] * y[i];\n for (let b = 0; b < cols; b++) {\n xtx[a][b] += X[i][a] * X[i][b];\n }\n }\n }\n\n // Tiny ridge term to stabilise near-singular systems.\n for (let a = 0; a < cols; a++) xtx[a][a] += 1e-8;\n\n return gaussianSolve(xtx, xty);\n}\n\n/**\n * Solve `A x = b` for a square matrix via Gaussian elimination with partial\n * pivoting. Returns [] if the matrix is singular.\n */\nexport function gaussianSolve(A: number[][], b: number[]): number[] {\n const n = b.length;\n const M = A.map((row, i) => [...row, b[i]]);\n\n for (let col = 0; col < n; col++) {\n // Partial pivot\n let pivot = col;\n for (let r = col + 1; r < n; r++) {\n if (Math.abs(M[r][col]) > Math.abs(M[pivot][col])) pivot = r;\n }\n if (Math.abs(M[pivot][col]) < 1e-12) return [];\n [M[col], M[pivot]] = [M[pivot], M[col]];\n\n // Eliminate\n for (let r = 0; r < n; r++) {\n if (r === col) continue;\n const factor = M[r][col] / M[col][col];\n for (let c = col; c <= n; c++) M[r][c] -= factor * M[col][c];\n }\n }\n\n const x = new Array(n);\n for (let i = 0; i < n; i++) x[i] = M[i][n] / M[i][i];\n return x;\n}\n\n/**\n * Compute error metrics from in-sample one-step residuals.\n * `rmse` doubles as the residual sigma used to build confidence bands.\n */\nfunction calculateFitMetrics(\n historical: number[],\n fitted?: (number | null)[]\n): { mse: number; rmse: number; mae: number; r2: number } {\n if (!fitted || fitted.length === 0) {\n return { mse: 0, rmse: 0, mae: 0, r2: 0 };\n }\n\n let sse = 0;\n let sae = 0;\n let count = 0;\n const observed: number[] = [];\n\n for (let i = 0; i < fitted.length && i < historical.length; i++) {\n const f = fitted[i];\n if (f === null || f === undefined || !Number.isFinite(f)) continue;\n const err = historical[i] - f;\n sse += err * err;\n sae += Math.abs(err);\n observed.push(historical[i]);\n count++;\n }\n\n if (count === 0) return { mse: 0, rmse: 0, mae: 0, r2: 0 };\n\n const mse = sse / count;\n const rmse = Math.sqrt(mse);\n const mae = sae / count;\n\n const mean = observed.reduce((s, v) => s + v, 0) / observed.length;\n const sst = observed.reduce((s, v) => s + (v - mean) * (v - mean), 0);\n const r2 = sst > 0 ? 1 - sse / sst : 0;\n\n return {\n mse: round(mse),\n rmse: round(rmse),\n mae: round(mae),\n r2: round(r2),\n };\n}\n\nfunction round(v: number): number {\n return Math.round(v * 1e6) / 1e6;\n}\n","/**\n * Velo Plot - Forecasting Plugin\n * \n * Provides time series forecasting capabilities using native statistical models.\n */\n\nimport type { \n PluginForecastingConfig, \n ForecastingAPI, \n ForecastingOptions, \n ForecastingResult, \n ForecastingVisualizationConfig \n} from './types';\nimport { calculateForecast } from './algorithms';\nimport { exportForecastOverlay } from '../../core/chart/exporter/svg/plugins/regression';\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n AfterRenderEvent\n} from '../types';\n\nconst manifestForecasting: PluginManifest = {\n name: \"velo-plot-forecasting\",\n version: \"1.0.0\",\n description: \"Time series forecasting for velo-plot\",\n provides: [\"analysis\", \"forecasting\"],\n tags: [\"statistics\", \"forecasting\", \"analysis\"],\n};\n\n/**\n * Forecasting Plugin for Velo Plot\n */\nexport function PluginForecasting(\n config: Partial<PluginForecastingConfig> = {}\n): ChartPlugin<PluginForecastingConfig> {\n let ctx: PluginContext | null = null;\n const activeForecasts = new Map<string, { result: ForecastingResult, config: ForecastingVisualizationConfig }>();\n\n const api: ForecastingAPI = {\n forecast(data: any, options: ForecastingOptions): ForecastingResult {\n let x: any, y: any;\n\n // Allow `forecast('seriesId', options)` by resolving the series data.\n if (typeof data === 'string') {\n if (!ctx) throw new Error('Plugin not initialized');\n const series = ctx.data.getAllSeries().find(s => s.getId() === data);\n if (!series) throw new Error(`Series not found: ${data}`);\n const seriesData = series.getData();\n x = seriesData.x;\n y = seriesData.y;\n } else if (Array.isArray(data)) {\n y = data;\n x = data.map((_, i) => i);\n } else if (data.x && data.y) {\n x = data.x;\n y = data.y;\n } else {\n throw new Error(\"Invalid data format for forecasting\");\n }\n\n return calculateForecast(x, y, options.method, options.horizon, options.params, options.confidence);\n },\n\n async forecastSeries(seriesId: string, options: ForecastingOptions): Promise<ForecastingResult> {\n if (!ctx) throw new Error(\"Plugin not initialized\");\n \n const series = ctx.data.getAllSeries().find(s => s.getId() === seriesId);\n if (!series) throw new Error(`Series not found: ${seriesId}`);\n \n const data = series.getData();\n return this.forecast(data, options);\n },\n\n visualize(result: ForecastingResult, vizConfig: ForecastingVisualizationConfig = {}) {\n const id = `forecast-${Math.random().toString(36).substr(2, 9)}`;\n const mergedConfig = {\n showLine: true,\n showConfidenceInterval: true,\n ...config.defaultVisualization,\n ...vizConfig\n };\n \n activeForecasts.set(id, { result, config: mergedConfig });\n ctx?.requestRender();\n return id;\n },\n\n clear(id?: string) {\n if (id) {\n activeForecasts.delete(id);\n } else {\n activeForecasts.clear();\n }\n ctx?.requestRender();\n }\n };\n\n function drawForecasts(pCtx: PluginContext) {\n const { render, coords } = pCtx;\n const { ctx2d } = render;\n if (!ctx2d) return;\n\n activeForecasts.forEach((viz) => {\n const { result, config: vizConfig } = viz;\n const { xValues, yValues, lowerBound, upperBound } = result;\n\n ctx2d.save();\n\n // 1. Draw Confidence Interval\n if (vizConfig.showConfidenceInterval && lowerBound && upperBound) {\n ctx2d.beginPath();\n const opacity = vizConfig.intervalStyle?.opacity ?? 0.15;\n const color = vizConfig.intervalStyle?.fillColor || (vizConfig.lineStyle?.color || '#3b82f6');\n \n ctx2d.fillStyle = color.startsWith('rgba') ? color : color + Math.floor(opacity * 255).toString(16).padStart(2, '0');\n \n for (let i = 0; i < xValues.length; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(upperBound[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n \n for (let i = xValues.length - 1; i >= 0; i--) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(lowerBound[i]);\n ctx2d.lineTo(px, py);\n }\n \n ctx2d.closePath();\n ctx2d.fill();\n }\n\n // 2. Draw Forecast Line\n if (vizConfig.showLine) {\n ctx2d.beginPath();\n ctx2d.strokeStyle = vizConfig.lineStyle?.color || '#3b82f6';\n ctx2d.lineWidth = vizConfig.lineStyle?.width || 2;\n if (vizConfig.lineStyle?.dash) {\n ctx2d.setLineDash(vizConfig.lineStyle.dash);\n } else {\n ctx2d.setLineDash([5, 5]); // Default dashed for forecast\n }\n\n for (let i = 0; i < xValues.length; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(yValues[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n ctx2d.stroke();\n }\n\n ctx2d.restore();\n });\n }\n\n return {\n manifest: manifestForecasting,\n onInit(c: PluginContext) {\n ctx = c;\n },\n onRenderOverlay(pCtx: PluginContext, _event: AfterRenderEvent) {\n drawForecasts(pCtx);\n },\n onExportSVG(svgCtx) {\n if (!svgCtx.builder || svgCtx.exportContext?.options.includeOverlays === false) return;\n activeForecasts.forEach(({ result, config: vizConfig }) => {\n const { xValues, yValues, lowerBound, upperBound } = result;\n const n = xValues.length;\n const points: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < n; i++) {\n points.push({ x: xValues[i], y: yValues[i] });\n }\n const ci =\n vizConfig.showConfidenceInterval && lowerBound && upperBound\n ? {\n upper: Array.from({ length: n }, (_, i) => ({ x: xValues[i], y: upperBound[i] })),\n lower: Array.from({ length: n }, (_, i) => ({ x: xValues[i], y: lowerBound[i] })),\n }\n : undefined;\n exportForecastOverlay(svgCtx, points, ci, vizConfig.lineStyle?.color ?? \"#3b82f6\");\n });\n },\n api\n };\n}\n\n// Re-export types and constants\nexport * from './types';\nexport * from './algorithms';\nexport { manifestForecasting };\n"],"names":["toArray","a","zForConfidence","confidence","table","best","bestDiff","entry","diff","calculateForecast","x","y","method","horizon","params","n","ya","xa","dt","lastX","result","forecastSMA","forecastEMA","forecastLinear","forecastSimpleExpSmoothing","forecastHolt","forecastWMA","forecastHoltWinters","forecastARIMA","futureX","i","metrics","calculateFitMetrics","z","sigma","lower","upper","buildConfidenceBands","yValues","accumulates","growth","margin","window","effectiveWindow","wmaAt","end","w","weightedSum","weightTotal","weight","fitted","wma","smaAt","sum","avg","alpha","ema","sumX","sumY","sumXY","sumXX","denom","slope","intercept","nextX","level","beta","trend","lastLevel","period","gamma","seasonals","seasonAverages","j","sumOverAvg","seasonal","val","m","p","d","q","order","diffLevels","k","difference","mean","s","v","wc","innovations","arLong","residuals","fitAR","start","rows","targets","t","row","coeffs","olsSolve","c","ar","ma","fittedResiduals","pred","integrateFittedPoint","wHist","eHist","forecastDiff","h","integrateForecast","series","out","current","parent","last","integrated","diffPred","X","cols","xtx","xty","b","gaussianSolve","A","M","col","pivot","r","factor","historical","sse","sae","count","observed","err","mse","rmse","mae","sst","r2","round","manifestForecasting","PluginForecasting","config","ctx","activeForecasts","api","data","options","seriesData","_","seriesId","vizConfig","id","mergedConfig","drawForecasts","pCtx","render","coords","ctx2d","viz","xValues","lowerBound","upperBound","opacity","_a","color","_b","_c","px","py","_d","_e","_f","_event","svgCtx","points","ci","exportForecastOverlay"],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
|
|
1
|
+
var X = Object.defineProperty;
|
|
2
|
+
var k = (i, t, n) => t in i ? X(i, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : i[t] = n;
|
|
3
|
+
var d = (i, t, n) => k(i, typeof t != "symbol" ? t + "" : t, n);
|
|
4
|
+
import { e as q } from "../regression-HNdyk1Dm.js";
|
|
5
|
+
class L {
|
|
5
6
|
constructor(t) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
d(this, "network");
|
|
8
|
+
d(this, "config");
|
|
9
|
+
d(this, "ready", !1);
|
|
9
10
|
this.config = t, this.network = {
|
|
10
11
|
layers: [],
|
|
11
12
|
learningRate: 0.01,
|
|
@@ -22,13 +23,13 @@ class x {
|
|
|
22
23
|
return this.config.type;
|
|
23
24
|
}
|
|
24
25
|
async predict(t) {
|
|
25
|
-
const n = performance.now(), e = Array.from(t.data), s = this.forwardPass(e),
|
|
26
|
+
const n = performance.now(), e = Array.from(t.data), s = this.forwardPass(e), c = performance.now() - n;
|
|
26
27
|
return {
|
|
27
28
|
modelId: this.config.id,
|
|
28
29
|
output: new Float32Array(s),
|
|
29
30
|
outputShape: [s.length],
|
|
30
31
|
timestamp: Date.now(),
|
|
31
|
-
processingTime:
|
|
32
|
+
processingTime: c
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
35
|
forwardPass(t) {
|
|
@@ -39,10 +40,10 @@ class x {
|
|
|
39
40
|
}
|
|
40
41
|
denseLayer(t, n, e) {
|
|
41
42
|
const s = [];
|
|
42
|
-
for (let
|
|
43
|
-
let r = e[
|
|
43
|
+
for (let c = 0; c < n.length; c++) {
|
|
44
|
+
let r = e[c];
|
|
44
45
|
for (let o = 0; o < t.length; o++)
|
|
45
|
-
r += t[o] * n[
|
|
46
|
+
r += t[o] * n[c][o];
|
|
46
47
|
s.push(r);
|
|
47
48
|
}
|
|
48
49
|
return s;
|
|
@@ -73,13 +74,13 @@ class x {
|
|
|
73
74
|
this.ready = !1;
|
|
74
75
|
}
|
|
75
76
|
}
|
|
76
|
-
class
|
|
77
|
+
class D {
|
|
77
78
|
constructor(t) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
d(this, "config");
|
|
80
|
+
d(this, "coefficients", []);
|
|
81
|
+
d(this, "intercept", 0);
|
|
82
|
+
d(this, "ready", !1);
|
|
83
|
+
d(this, "lastTraining", null);
|
|
83
84
|
this.config = t;
|
|
84
85
|
}
|
|
85
86
|
get id() {
|
|
@@ -96,13 +97,13 @@ class I {
|
|
|
96
97
|
const o = r;
|
|
97
98
|
let a = this.intercept;
|
|
98
99
|
return this.coefficients.length > 0 && (a += this.coefficients[0] * o), a;
|
|
99
|
-
}),
|
|
100
|
+
}), c = performance.now() - n;
|
|
100
101
|
return {
|
|
101
102
|
modelId: this.config.id,
|
|
102
103
|
output: new Float32Array(s),
|
|
103
104
|
outputShape: [s.length],
|
|
104
105
|
timestamp: Date.now(),
|
|
105
|
-
processingTime:
|
|
106
|
+
processingTime: c
|
|
106
107
|
};
|
|
107
108
|
}
|
|
108
109
|
/** Predict from full feature rows (multivariate). */
|
|
@@ -118,10 +119,10 @@ class I {
|
|
|
118
119
|
const n = t.x.length, e = [];
|
|
119
120
|
for (let u = 0; u < n; u++)
|
|
120
121
|
e.push([1, ...t.x[u]]);
|
|
121
|
-
const s =
|
|
122
|
+
const s = A(b(e), e), c = A(b(e), t.y.map((u) => [u])), r = z(s), o = A(r, c);
|
|
122
123
|
this.intercept = o[0][0], this.coefficients = o.slice(1).map((u) => u[0]), this.ready = !0;
|
|
123
|
-
const a = this.predictRows(t.x),
|
|
124
|
-
return this.lastTraining = { coefficients: this.coefficients, intercept: this.intercept, fitted: a, residuals:
|
|
124
|
+
const a = this.predictRows(t.x), l = t.y.map((u, h) => u - a[h]), g = t.y.reduce((u, h) => u + h, 0) / (n || 1), m = l.reduce((u, h) => u + h * h, 0), f = t.y.reduce((u, h) => u + (h - g) ** 2, 0), y = f > 0 ? 1 - m / f : 0, w = Math.sqrt(m / (n || 1));
|
|
125
|
+
return this.lastTraining = { coefficients: this.coefficients, intercept: this.intercept, fitted: a, residuals: l, r2: y, rmse: w }, this.lastTraining;
|
|
125
126
|
}
|
|
126
127
|
getTrainingResult() {
|
|
127
128
|
return this.lastTraining;
|
|
@@ -142,33 +143,33 @@ class I {
|
|
|
142
143
|
function b(i) {
|
|
143
144
|
return i[0].map((t, n) => i.map((e) => e[n]));
|
|
144
145
|
}
|
|
145
|
-
function
|
|
146
|
+
function A(i, t) {
|
|
146
147
|
const n = [];
|
|
147
148
|
for (let e = 0; e < i.length; e++) {
|
|
148
149
|
n[e] = [];
|
|
149
150
|
for (let s = 0; s < t[0].length; s++) {
|
|
150
|
-
let
|
|
151
|
+
let c = 0;
|
|
151
152
|
for (let r = 0; r < t.length; r++)
|
|
152
|
-
|
|
153
|
-
n[e][s] =
|
|
153
|
+
c += i[e][r] * t[r][s];
|
|
154
|
+
n[e][s] = c;
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
return n;
|
|
157
158
|
}
|
|
158
|
-
function
|
|
159
|
+
function z(i) {
|
|
159
160
|
const t = i.length, n = i.map((e, s) => [
|
|
160
161
|
...e,
|
|
161
|
-
...Array.from({ length: t }, (
|
|
162
|
+
...Array.from({ length: t }, (c, r) => s === r ? 1 : 0)
|
|
162
163
|
]);
|
|
163
164
|
for (let e = 0; e < t; e++) {
|
|
164
165
|
let s = e;
|
|
165
166
|
for (let r = e + 1; r < t; r++)
|
|
166
167
|
Math.abs(n[r][e]) > Math.abs(n[s][e]) && (s = r);
|
|
167
168
|
if (Math.abs(n[s][e]) < 1e-12)
|
|
168
|
-
return i.map((r, o) => r.map((a,
|
|
169
|
+
return i.map((r, o) => r.map((a, l) => o === l ? 1 : 0));
|
|
169
170
|
[n[e], n[s]] = [n[s], n[e]];
|
|
170
|
-
const
|
|
171
|
-
for (let r = 0; r < 2 * t; r++) n[e][r] /=
|
|
171
|
+
const c = n[e][e];
|
|
172
|
+
for (let r = 0; r < 2 * t; r++) n[e][r] /= c;
|
|
172
173
|
for (let r = 0; r < t; r++) {
|
|
173
174
|
if (r === e) continue;
|
|
174
175
|
const o = n[r][e];
|
|
@@ -177,13 +178,13 @@ function L(i) {
|
|
|
177
178
|
}
|
|
178
179
|
return n.map((e) => e.slice(t));
|
|
179
180
|
}
|
|
180
|
-
class
|
|
181
|
+
class E {
|
|
181
182
|
constructor(t) {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
183
|
+
d(this, "config");
|
|
184
|
+
d(this, "filterType");
|
|
185
|
+
d(this, "cutoffFrequency");
|
|
186
|
+
d(this, "sampleRate");
|
|
187
|
+
d(this, "ready", !1);
|
|
187
188
|
var n, e, s;
|
|
188
189
|
this.config = t, this.filterType = ((n = t.metadata) == null ? void 0 : n.filterType) || "lowpass", this.cutoffFrequency = ((e = t.metadata) == null ? void 0 : e.cutoffFrequency) || 1e3, this.sampleRate = ((s = t.metadata) == null ? void 0 : s.sampleRate) || 44100;
|
|
189
190
|
}
|
|
@@ -197,13 +198,13 @@ class z {
|
|
|
197
198
|
return this.config.type;
|
|
198
199
|
}
|
|
199
200
|
async predict(t) {
|
|
200
|
-
const n = performance.now(), e = Array.from(t.data), s = this.applyFilter(e),
|
|
201
|
+
const n = performance.now(), e = Array.from(t.data), s = this.applyFilter(e), c = performance.now() - n;
|
|
201
202
|
return {
|
|
202
203
|
modelId: this.config.id,
|
|
203
204
|
output: new Float32Array(s),
|
|
204
205
|
outputShape: [s.length],
|
|
205
206
|
timestamp: Date.now(),
|
|
206
|
-
processingTime:
|
|
207
|
+
processingTime: c
|
|
207
208
|
};
|
|
208
209
|
}
|
|
209
210
|
applyFilter(t) {
|
|
@@ -220,8 +221,8 @@ class z {
|
|
|
220
221
|
}
|
|
221
222
|
lowpassFilter(t) {
|
|
222
223
|
const n = 2 * Math.PI * this.cutoffFrequency / this.sampleRate, e = n / (1 + n), s = [t[0]];
|
|
223
|
-
for (let
|
|
224
|
-
s.push(e * t[
|
|
224
|
+
for (let c = 1; c < t.length; c++)
|
|
225
|
+
s.push(e * t[c] + (1 - e) * s[c - 1]);
|
|
225
226
|
return s;
|
|
226
227
|
}
|
|
227
228
|
highpassFilter(t) {
|
|
@@ -247,57 +248,57 @@ class z {
|
|
|
247
248
|
this.ready = !1;
|
|
248
249
|
}
|
|
249
250
|
}
|
|
250
|
-
function
|
|
251
|
+
function I(i) {
|
|
251
252
|
switch (i.type) {
|
|
252
253
|
case "neural-network":
|
|
253
|
-
return new
|
|
254
|
+
return new L(i);
|
|
254
255
|
case "linear-regression":
|
|
255
|
-
return new
|
|
256
|
+
return new D(i);
|
|
256
257
|
case "signal-processor":
|
|
257
|
-
return new
|
|
258
|
+
return new E(i);
|
|
258
259
|
default:
|
|
259
|
-
return new
|
|
260
|
+
return new D(i);
|
|
260
261
|
}
|
|
261
262
|
}
|
|
262
263
|
function V(i) {
|
|
263
264
|
const t = i.length, n = new Array(t), e = new Array(t);
|
|
264
265
|
for (let s = 0; s < t; s++) {
|
|
265
|
-
let
|
|
266
|
+
let c = 0, r = 0;
|
|
266
267
|
for (let o = 0; o < t; o++) {
|
|
267
268
|
const a = -2 * Math.PI * s * o / t;
|
|
268
|
-
|
|
269
|
+
c += i[o] * Math.cos(a), r += i[o] * Math.sin(a);
|
|
269
270
|
}
|
|
270
|
-
n[s] =
|
|
271
|
+
n[s] = c, e[s] = r;
|
|
271
272
|
}
|
|
272
273
|
return { real: n, imag: e };
|
|
273
274
|
}
|
|
274
|
-
function
|
|
275
|
+
function P(i) {
|
|
275
276
|
return i.reduce((t, n) => t + n, 0) / i.length;
|
|
276
277
|
}
|
|
277
278
|
function Y(i) {
|
|
278
|
-
const t =
|
|
279
|
+
const t = P(i), n = i.reduce((e, s) => e + Math.pow(s - t, 2), 0) / i.length;
|
|
279
280
|
return Math.sqrt(n);
|
|
280
281
|
}
|
|
281
282
|
function $(i, t) {
|
|
282
|
-
const n = i.length, e =
|
|
283
|
-
let
|
|
283
|
+
const n = i.length, e = P(i), s = P(t);
|
|
284
|
+
let c = 0, r = 0, o = 0;
|
|
284
285
|
for (let a = 0; a < n; a++) {
|
|
285
|
-
const
|
|
286
|
-
|
|
286
|
+
const l = i[a] - e, g = t[a] - s;
|
|
287
|
+
c += l * g, r += l * l, o += g * g;
|
|
287
288
|
}
|
|
288
|
-
return
|
|
289
|
+
return c / Math.sqrt(r * o);
|
|
289
290
|
}
|
|
290
|
-
const
|
|
291
|
+
const N = {
|
|
291
292
|
name: "velo-plot-ml-integration",
|
|
292
293
|
version: "1.0.0",
|
|
293
294
|
description: "Machine Learning Integration Bridge for Velo Plot",
|
|
294
295
|
provides: ["ml", "prediction", "inference"],
|
|
295
296
|
tags: ["ml", "ai", "analysis"]
|
|
296
297
|
};
|
|
297
|
-
function
|
|
298
|
+
function j(i = {}) {
|
|
298
299
|
let t = null;
|
|
299
300
|
const n = /* @__PURE__ */ new Map(), e = /* @__PURE__ */ new Map();
|
|
300
|
-
i.models && i.models.forEach((r) => n.set(r.id,
|
|
301
|
+
i.models && i.models.forEach((r) => n.set(r.id, I(r)));
|
|
301
302
|
const s = {
|
|
302
303
|
registerModel(r) {
|
|
303
304
|
if (!r.id) {
|
|
@@ -309,10 +310,10 @@ function _(i = {}) {
|
|
|
309
310
|
async runInference(r, o) {
|
|
310
311
|
const a = n.get(r);
|
|
311
312
|
if (!a) throw new Error(`Model not found: ${r}`);
|
|
312
|
-
const
|
|
313
|
-
if (!
|
|
314
|
-
const g = new Float32Array(
|
|
315
|
-
return m.xValues =
|
|
313
|
+
const l = t == null ? void 0 : t.data.getSeriesData(o);
|
|
314
|
+
if (!l) throw new Error(`Series not found: ${o}`);
|
|
315
|
+
const g = new Float32Array(l.y), m = await a.predict({ data: g });
|
|
316
|
+
return m.xValues = l.x, m;
|
|
316
317
|
},
|
|
317
318
|
visualizeResults(r, o = {}) {
|
|
318
319
|
const a = `ml-viz-${Math.random().toString(36).substr(2, 9)}`;
|
|
@@ -338,7 +339,7 @@ function _(i = {}) {
|
|
|
338
339
|
*/
|
|
339
340
|
trainModel(r, o) {
|
|
340
341
|
let a = n.get(r);
|
|
341
|
-
if (a || (a =
|
|
342
|
+
if (a || (a = I({ id: r, name: r, type: "linear-regression" }), n.set(r, a)), typeof a.train != "function")
|
|
342
343
|
throw new Error(`Model '${r}' does not support training`);
|
|
343
344
|
return a.train(o);
|
|
344
345
|
},
|
|
@@ -354,53 +355,66 @@ function _(i = {}) {
|
|
|
354
355
|
},
|
|
355
356
|
stats: {
|
|
356
357
|
fft: V,
|
|
357
|
-
mean:
|
|
358
|
+
mean: P,
|
|
358
359
|
standardDeviation: Y,
|
|
359
360
|
correlation: $
|
|
360
361
|
}
|
|
361
362
|
};
|
|
362
|
-
function
|
|
363
|
-
const { render: o, coords: a } = r, { ctx2d:
|
|
364
|
-
|
|
365
|
-
var
|
|
366
|
-
const { result: m, config:
|
|
367
|
-
if (!
|
|
368
|
-
const
|
|
369
|
-
if (
|
|
370
|
-
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
for (let
|
|
374
|
-
const
|
|
375
|
-
|
|
363
|
+
function c(r) {
|
|
364
|
+
const { render: o, coords: a } = r, { ctx2d: l } = o;
|
|
365
|
+
l && e.forEach((g) => {
|
|
366
|
+
var R, v, M, x;
|
|
367
|
+
const { result: m, config: f } = g, { output: y, xValues: w, confidence: u } = m;
|
|
368
|
+
if (!w) return;
|
|
369
|
+
const h = Math.min(w.length, y.length);
|
|
370
|
+
if (l.save(), f.showConfidenceInterval && u && u.length === h) {
|
|
371
|
+
l.beginPath();
|
|
372
|
+
const T = f.intervalOpacity ?? 0.2;
|
|
373
|
+
l.fillStyle = (((R = f.lineStyle) == null ? void 0 : R.color) || "#3b82f6") + Math.floor(T * 255).toString(16).padStart(2, "0");
|
|
374
|
+
for (let p = 0; p < h; p++) {
|
|
375
|
+
const F = a.dataToPixelX(w[p]), S = a.dataToPixelY(y[p] + u[p]);
|
|
376
|
+
p === 0 ? l.moveTo(F, S) : l.lineTo(F, S);
|
|
376
377
|
}
|
|
377
|
-
for (let
|
|
378
|
-
const
|
|
379
|
-
|
|
378
|
+
for (let p = h - 1; p >= 0; p--) {
|
|
379
|
+
const F = a.dataToPixelX(w[p]), S = a.dataToPixelY(y[p] - u[p]);
|
|
380
|
+
l.lineTo(F, S);
|
|
380
381
|
}
|
|
381
|
-
|
|
382
|
+
l.closePath(), l.fill();
|
|
382
383
|
}
|
|
383
|
-
|
|
384
|
-
for (let
|
|
385
|
-
const
|
|
386
|
-
|
|
384
|
+
l.beginPath(), l.strokeStyle = ((v = f.lineStyle) == null ? void 0 : v.color) || "#3b82f6", l.lineWidth = ((M = f.lineStyle) == null ? void 0 : M.width) || 2, (x = f.lineStyle) != null && x.dash && l.setLineDash(f.lineStyle.dash);
|
|
385
|
+
for (let T = 0; T < h; T++) {
|
|
386
|
+
const p = a.dataToPixelX(w[T]), F = a.dataToPixelY(y[T]);
|
|
387
|
+
T === 0 ? l.moveTo(p, F) : l.lineTo(p, F);
|
|
387
388
|
}
|
|
388
|
-
|
|
389
|
+
l.stroke(), l.restore();
|
|
389
390
|
});
|
|
390
391
|
}
|
|
391
392
|
return {
|
|
392
|
-
manifest:
|
|
393
|
+
manifest: N,
|
|
393
394
|
onInit(r) {
|
|
394
395
|
t = r;
|
|
395
396
|
},
|
|
396
397
|
onRenderOverlay(r, o) {
|
|
397
|
-
|
|
398
|
+
c(r);
|
|
399
|
+
},
|
|
400
|
+
onExportSVG(r) {
|
|
401
|
+
var o;
|
|
402
|
+
!r.builder || ((o = r.exportContext) == null ? void 0 : o.options.includeOverlays) === !1 || e.forEach((a) => {
|
|
403
|
+
var R;
|
|
404
|
+
const { result: l, config: g } = a, { output: m, xValues: f, confidence: y } = l;
|
|
405
|
+
if (!(f != null && f.length)) return;
|
|
406
|
+
const w = Math.min(f.length, m.length), u = Array.from({ length: w }, (v, M) => ({ x: f[M], y: m[M] })), h = g.showConfidenceInterval && (y == null ? void 0 : y.length) === w ? {
|
|
407
|
+
upper: u.map((v, M) => ({ x: v.x, y: v.y + y[M] })),
|
|
408
|
+
lower: u.map((v, M) => ({ x: v.x, y: v.y - y[M] }))
|
|
409
|
+
} : void 0;
|
|
410
|
+
q(r, u, h, ((R = g.lineStyle) == null ? void 0 : R.color) ?? "#3b82f6");
|
|
411
|
+
});
|
|
398
412
|
},
|
|
399
413
|
api: s
|
|
400
414
|
};
|
|
401
415
|
}
|
|
402
416
|
export {
|
|
403
|
-
|
|
404
|
-
|
|
417
|
+
j as PluginMLIntegration,
|
|
418
|
+
j as default
|
|
405
419
|
};
|
|
406
420
|
//# sourceMappingURL=ml-integration.js.map
|