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.
Files changed (116) hide show
  1. package/dist/{ChartCore-AnR_3Xkb.js → ChartCore-KYG2HTcK.js} +1349 -1213
  2. package/dist/ChartCore-KYG2HTcK.js.map +1 -0
  3. package/dist/{PluginRegistry-CzMHebYP.js → PluginRegistry-CDf_jcnp.js} +2 -2
  4. package/dist/{PluginRegistry-CzMHebYP.js.map → PluginRegistry-CDf_jcnp.js.map} +1 -1
  5. package/dist/SVGDocumentBuilder-C-uLkcFW.js +83 -0
  6. package/dist/SVGDocumentBuilder-C-uLkcFW.js.map +1 -0
  7. package/dist/angular-hooks.js +1 -1
  8. package/dist/angular.js +4 -4
  9. package/dist/{chartSyncBridge-D_rCtbFq.js → chartSyncBridge-C1uRy0ZS.js} +3 -3
  10. package/dist/{chartSyncBridge-D_rCtbFq.js.map → chartSyncBridge-C1uRy0ZS.js.map} +1 -1
  11. package/dist/core/chart/ChartCore.d.ts +7 -3
  12. package/dist/core/chart/ChartRenderLoop.d.ts +5 -0
  13. package/dist/core/chart/ChartRenderer.d.ts +9 -0
  14. package/dist/core/chart/ChartSetup.d.ts +1 -0
  15. package/dist/core/chart/exporter/SVGExporter.d.ts +9 -7
  16. package/dist/core/chart/exporter/svg/SVGDocumentBuilder.d.ts +27 -0
  17. package/dist/core/chart/exporter/svg/SVGExportContext.d.ts +147 -0
  18. package/dist/core/chart/exporter/svg/SVGOrchestrator.d.ts +3 -0
  19. package/dist/core/chart/exporter/svg/SVGThemeAdapter.d.ts +22 -0
  20. package/dist/core/chart/exporter/svg/__tests__/testFixtures.d.ts +46 -0
  21. package/dist/core/chart/exporter/svg/__tests__/visualTestUtils.d.ts +12 -0
  22. package/dist/core/chart/exporter/svg/overlay/axes.d.ts +4 -0
  23. package/dist/core/chart/exporter/svg/overlay/border.d.ts +4 -0
  24. package/dist/core/chart/exporter/svg/overlay/errorBars.d.ts +7 -0
  25. package/dist/core/chart/exporter/svg/overlay/grid.d.ts +4 -0
  26. package/dist/core/chart/exporter/svg/overlay/index.d.ts +12 -0
  27. package/dist/core/chart/exporter/svg/overlay/legend.d.ts +4 -0
  28. package/dist/core/chart/exporter/svg/overlay/pluginCharts.d.ts +6 -0
  29. package/dist/core/chart/exporter/svg/overlay/polarGrid.d.ts +4 -0
  30. package/dist/core/chart/exporter/svg/overlay/specialChart.d.ts +15 -0
  31. package/dist/core/chart/exporter/svg/overlay/title.d.ts +4 -0
  32. package/dist/core/chart/exporter/svg/plugins/annotations.d.ts +5 -0
  33. package/dist/core/chart/exporter/svg/plugins/brokenAxis.d.ts +20 -0
  34. package/dist/core/chart/exporter/svg/plugins/latex.d.ts +9 -0
  35. package/dist/core/chart/exporter/svg/plugins/register.d.ts +8 -0
  36. package/dist/core/chart/exporter/svg/plugins/regression.d.ts +33 -0
  37. package/dist/core/chart/exporter/svg/plugins/roi.d.ts +12 -0
  38. package/dist/core/chart/exporter/svg/plugins/tradeMarkers.d.ts +3 -0
  39. package/dist/core/chart/exporter/svg/plugins/types.d.ts +28 -0
  40. package/dist/core/chart/exporter/svg/plugins/watermark.d.ts +13 -0
  41. package/dist/core/chart/exporter/svg/series/band.d.ts +6 -0
  42. package/dist/core/chart/exporter/svg/series/bar.d.ts +6 -0
  43. package/dist/core/chart/exporter/svg/series/boxplot.d.ts +6 -0
  44. package/dist/core/chart/exporter/svg/series/candlestick.d.ts +6 -0
  45. package/dist/core/chart/exporter/svg/series/finitePoints.d.ts +6 -0
  46. package/dist/core/chart/exporter/svg/series/gauge.d.ts +5 -0
  47. package/dist/core/chart/exporter/svg/series/heatmap.d.ts +6 -0
  48. package/dist/core/chart/exporter/svg/series/indicator.d.ts +6 -0
  49. package/dist/core/chart/exporter/svg/series/line.d.ts +12 -0
  50. package/dist/core/chart/exporter/svg/series/polar.d.ts +6 -0
  51. package/dist/core/chart/exporter/svg/series/radar.d.ts +5 -0
  52. package/dist/core/chart/exporter/svg/series/registry.d.ts +10 -0
  53. package/dist/core/chart/exporter/svg/series/sankey.d.ts +5 -0
  54. package/dist/core/chart/exporter/svg/series/scatter.d.ts +1 -0
  55. package/dist/core/chart/exporter/svg/series/ternary.d.ts +7 -0
  56. package/dist/core/chart/exporter/svg/series/waterfall.d.ts +6 -0
  57. package/dist/core/chart/exporter/svg/seriesAtTimestamp.d.ts +4 -0
  58. package/dist/core/chart/exporter/svg/seriesUtils.d.ts +3 -0
  59. package/dist/core/chart/exporter/svg/symbols.d.ts +5 -0
  60. package/dist/core/chart/exporter/svg/tickUtils.d.ts +9 -0
  61. package/dist/core/chart/mountSVGString.d.ts +5 -0
  62. package/dist/core/chart/types.d.ts +2 -2
  63. package/dist/core/stacked/StackSVGComposer.d.ts +14 -0
  64. package/dist/core/stacked/index.d.ts +3 -2
  65. package/dist/core/stacked/types.d.ts +12 -4
  66. package/dist/createStackedChart-DjA3aJAu.js +2761 -0
  67. package/dist/createStackedChart-DjA3aJAu.js.map +1 -0
  68. package/dist/{hooks-DH-3bewj.js → hooks-4wQH27r9.js} +3 -3
  69. package/dist/{hooks-DH-3bewj.js.map → hooks-4wQH27r9.js.map} +1 -1
  70. package/dist/index-Bj-xyXY6.js +582 -0
  71. package/dist/index-Bj-xyXY6.js.map +1 -0
  72. package/dist/plugins/PluginManager.d.ts +5 -0
  73. package/dist/plugins/annotations.js +8 -7
  74. package/dist/plugins/annotations.js.map +1 -1
  75. package/dist/plugins/broken-axis.js +198 -152
  76. package/dist/plugins/broken-axis.js.map +1 -1
  77. package/dist/plugins/forecasting.js +273 -258
  78. package/dist/plugins/forecasting.js.map +1 -1
  79. package/dist/plugins/ml-integration.js +107 -93
  80. package/dist/plugins/ml-integration.js.map +1 -1
  81. package/dist/plugins/radar/types.d.ts +11 -0
  82. package/dist/plugins/radar.js +64 -53
  83. package/dist/plugins/radar.js.map +1 -1
  84. package/dist/plugins/roi/index.d.ts +2 -0
  85. package/dist/plugins/roi.js +184 -145
  86. package/dist/plugins/roi.js.map +1 -1
  87. package/dist/plugins/snapshot.js +20 -15
  88. package/dist/plugins/snapshot.js.map +1 -1
  89. package/dist/plugins/types.d.ts +4 -0
  90. package/dist/react.js +2 -2
  91. package/dist/regression-HNdyk1Dm.js +28 -0
  92. package/dist/regression-HNdyk1Dm.js.map +1 -0
  93. package/dist/renderer/ChartSeriesRenderer.d.ts +3 -2
  94. package/dist/renderer/SVGChartRenderer.d.ts +15 -0
  95. package/dist/renderer/SankeyRenderer.d.ts +1 -0
  96. package/dist/renderer/registerSVG.d.ts +5 -0
  97. package/dist/renderer/sankeyLayout.d.ts +29 -0
  98. package/dist/scientific.js +2 -2
  99. package/dist/solid.js +2 -2
  100. package/dist/svelte.js +2 -2
  101. package/dist/tickUtils-B_X-ha13.js +41 -0
  102. package/dist/tickUtils-B_X-ha13.js.map +1 -0
  103. package/dist/trading.js +3 -3
  104. package/dist/types.d.ts +2 -1
  105. package/dist/velo-plot.full.js +1107 -1292
  106. package/dist/velo-plot.full.js.map +1 -1
  107. package/dist/velo-plot.js +2 -2
  108. package/dist/vue/VeloPlot.vue.d.ts +1 -1
  109. package/dist/vue/index.d.ts +33 -33
  110. package/dist/vue.js +2 -2
  111. package/package.json +6 -1
  112. package/dist/ChartCore-AnR_3Xkb.js.map +0 -1
  113. package/dist/createStackedChart-DqcLCFGS.js +0 -1338
  114. package/dist/createStackedChart-DqcLCFGS.js.map +0 -1
  115. package/dist/index-Cv6ZDLWf.js +0 -521
  116. 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 k = Object.defineProperty;
2
- var q = (i, t, n) => t in i ? k(i, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : i[t] = n;
3
- var h = (i, t, n) => q(i, typeof t != "symbol" ? t + "" : t, n);
4
- class x {
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
- h(this, "network");
7
- h(this, "config");
8
- h(this, "ready", !1);
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), l = performance.now() - n;
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: l
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 l = 0; l < n.length; l++) {
43
- let r = e[l];
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[l][o];
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 I {
77
+ class D {
77
78
  constructor(t) {
78
- h(this, "config");
79
- h(this, "coefficients", []);
80
- h(this, "intercept", 0);
81
- h(this, "ready", !1);
82
- h(this, "lastTraining", null);
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
- }), l = performance.now() - n;
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: l
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 = F(b(e), e), l = F(b(e), t.y.map((u) => [u])), r = L(s), o = F(r, l);
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), c = t.y.map((u, p) => u - a[p]), g = t.y.reduce((u, p) => u + p, 0) / (n || 1), m = c.reduce((u, p) => u + p * p, 0), d = t.y.reduce((u, p) => u + (p - g) ** 2, 0), M = d > 0 ? 1 - m / d : 0, y = Math.sqrt(m / (n || 1));
124
- return this.lastTraining = { coefficients: this.coefficients, intercept: this.intercept, fitted: a, residuals: c, r2: M, rmse: y }, this.lastTraining;
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 F(i, t) {
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 l = 0;
151
+ let c = 0;
151
152
  for (let r = 0; r < t.length; r++)
152
- l += i[e][r] * t[r][s];
153
- n[e][s] = l;
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 L(i) {
159
+ function z(i) {
159
160
  const t = i.length, n = i.map((e, s) => [
160
161
  ...e,
161
- ...Array.from({ length: t }, (l, r) => s === r ? 1 : 0)
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, c) => o === c ? 1 : 0));
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 l = n[e][e];
171
- for (let r = 0; r < 2 * t; r++) n[e][r] /= l;
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 z {
181
+ class E {
181
182
  constructor(t) {
182
- h(this, "config");
183
- h(this, "filterType");
184
- h(this, "cutoffFrequency");
185
- h(this, "sampleRate");
186
- h(this, "ready", !1);
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), l = performance.now() - n;
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: l
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 l = 1; l < t.length; l++)
224
- s.push(e * t[l] + (1 - e) * s[l - 1]);
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 X(i) {
251
+ function I(i) {
251
252
  switch (i.type) {
252
253
  case "neural-network":
253
- return new x(i);
254
+ return new L(i);
254
255
  case "linear-regression":
255
- return new I(i);
256
+ return new D(i);
256
257
  case "signal-processor":
257
- return new z(i);
258
+ return new E(i);
258
259
  default:
259
- return new I(i);
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 l = 0, r = 0;
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
- l += i[o] * Math.cos(a), r += i[o] * Math.sin(a);
269
+ c += i[o] * Math.cos(a), r += i[o] * Math.sin(a);
269
270
  }
270
- n[s] = l, e[s] = r;
271
+ n[s] = c, e[s] = r;
271
272
  }
272
273
  return { real: n, imag: e };
273
274
  }
274
- function R(i) {
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 = R(i), n = i.reduce((e, s) => e + Math.pow(s - t, 2), 0) / i.length;
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 = R(i), s = R(t);
283
- let l = 0, r = 0, o = 0;
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 c = i[a] - e, g = t[a] - s;
286
- l += c * g, r += c * c, o += g * g;
286
+ const l = i[a] - e, g = t[a] - s;
287
+ c += l * g, r += l * l, o += g * g;
287
288
  }
288
- return l / Math.sqrt(r * o);
289
+ return c / Math.sqrt(r * o);
289
290
  }
290
- const E = {
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 _(i = {}) {
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, X(r)));
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 c = t == null ? void 0 : t.data.getSeriesData(o);
313
- if (!c) throw new Error(`Series not found: ${o}`);
314
- const g = new Float32Array(c.y), m = await a.predict({ data: g });
315
- return m.xValues = c.x, m;
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 = X({ id: r, name: r, type: "linear-regression" }), n.set(r, a)), typeof a.train != "function")
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: R,
358
+ mean: P,
358
359
  standardDeviation: Y,
359
360
  correlation: $
360
361
  }
361
362
  };
362
- function l(r) {
363
- const { render: o, coords: a } = r, { ctx2d: c } = o;
364
- c && e.forEach((g) => {
365
- var S, P, A, D;
366
- const { result: m, config: d } = g, { output: M, xValues: y, confidence: u } = m;
367
- if (!y) return;
368
- const p = Math.min(y.length, M.length);
369
- if (c.save(), d.showConfidenceInterval && u && u.length === p) {
370
- c.beginPath();
371
- const w = d.intervalOpacity ?? 0.2;
372
- c.fillStyle = (((S = d.lineStyle) == null ? void 0 : S.color) || "#3b82f6") + Math.floor(w * 255).toString(16).padStart(2, "0");
373
- for (let f = 0; f < p; f++) {
374
- const v = a.dataToPixelX(y[f]), T = a.dataToPixelY(M[f] + u[f]);
375
- f === 0 ? c.moveTo(v, T) : c.lineTo(v, T);
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 f = p - 1; f >= 0; f--) {
378
- const v = a.dataToPixelX(y[f]), T = a.dataToPixelY(M[f] - u[f]);
379
- c.lineTo(v, T);
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
- c.closePath(), c.fill();
382
+ l.closePath(), l.fill();
382
383
  }
383
- c.beginPath(), c.strokeStyle = ((P = d.lineStyle) == null ? void 0 : P.color) || "#3b82f6", c.lineWidth = ((A = d.lineStyle) == null ? void 0 : A.width) || 2, (D = d.lineStyle) != null && D.dash && c.setLineDash(d.lineStyle.dash);
384
- for (let w = 0; w < p; w++) {
385
- const f = a.dataToPixelX(y[w]), v = a.dataToPixelY(M[w]);
386
- w === 0 ? c.moveTo(f, v) : c.lineTo(f, v);
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
- c.stroke(), c.restore();
389
+ l.stroke(), l.restore();
389
390
  });
390
391
  }
391
392
  return {
392
- manifest: E,
393
+ manifest: N,
393
394
  onInit(r) {
394
395
  t = r;
395
396
  },
396
397
  onRenderOverlay(r, o) {
397
- l(r);
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
- _ as PluginMLIntegration,
404
- _ as default
417
+ j as PluginMLIntegration,
418
+ j as default
405
419
  };
406
420
  //# sourceMappingURL=ml-integration.js.map