velo-plot 2.20.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/README.md +26 -12
  2. package/dist/ChartCore-AnR_3Xkb.js +7338 -0
  3. package/dist/ChartCore-AnR_3Xkb.js.map +1 -0
  4. package/dist/GpuChartRenderer-Dxc0hrQA.js +75 -0
  5. package/dist/GpuChartRenderer-Dxc0hrQA.js.map +1 -0
  6. package/dist/{index.core-COREBDNq.js → PluginRegistry-CzMHebYP.js} +24 -38
  7. package/dist/PluginRegistry-CzMHebYP.js.map +1 -0
  8. package/dist/a11y-Bw6urYpr.js +105 -0
  9. package/dist/a11y-Bw6urYpr.js.map +1 -0
  10. package/dist/angular/hooks-entry.d.ts +1 -0
  11. package/dist/angular/hooks.d.ts +26 -0
  12. package/dist/angular/index.d.ts +8 -0
  13. package/dist/angular/velo-plot.component.d.ts +46 -0
  14. package/dist/angular-hooks.d.ts +1 -0
  15. package/dist/angular-hooks.js +9 -0
  16. package/dist/angular-hooks.js.map +1 -0
  17. package/dist/angular.d.ts +1 -0
  18. package/dist/angular.js +166 -0
  19. package/dist/angular.js.map +1 -0
  20. package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -1
  21. package/dist/astro/StackedPlot.astro +19 -0
  22. package/dist/astro/VeloPlot.astro +23 -0
  23. package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
  24. package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
  25. package/dist/bindings/shared/a11y.d.ts +26 -0
  26. package/dist/bindings/shared/chartLifecycle.d.ts +16 -0
  27. package/dist/bindings/shared/chartSyncBridge.d.ts +8 -0
  28. package/dist/bindings/shared/dimensions.d.ts +1 -0
  29. package/dist/bindings/shared/index.d.ts +9 -0
  30. package/dist/bindings/shared/indicatorBridge.d.ts +11 -0
  31. package/dist/bindings/shared/optionsSync.d.ts +7 -0
  32. package/dist/bindings/shared/seriesDiff.d.ts +8 -0
  33. package/dist/bindings/shared/stackedSync.d.ts +9 -0
  34. package/dist/bindings/shared/types.d.ts +46 -0
  35. package/dist/bindings/test-utils/index.d.ts +35 -0
  36. package/dist/bindings/test-utils/mockLifecycle.d.ts +120 -0
  37. package/dist/bindings/test-utils/vitestSveltePlugin.d.ts +3 -0
  38. package/dist/chartSyncBridge-D_rCtbFq.js +58 -0
  39. package/dist/chartSyncBridge-D_rCtbFq.js.map +1 -0
  40. package/dist/core/Chart.d.ts +1 -1
  41. package/dist/core/ChartStatistics.d.ts +1 -1
  42. package/dist/core/InteractionManager.d.ts +7 -1
  43. package/dist/core/OverlayRenderer.d.ts +5 -0
  44. package/dist/core/annotations/types.d.ts +1 -1
  45. package/dist/core/chart/ChartCore.d.ts +14 -19
  46. package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
  47. package/dist/core/chart/chartExportPatch.d.ts +2 -0
  48. package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
  49. package/dist/core/chart/series/SeriesActions.d.ts +1 -0
  50. package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
  51. package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
  52. package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
  53. package/dist/core/chart/types.d.ts +1 -1
  54. package/dist/core/clipboard/index.d.ts +1 -1
  55. package/dist/core/debug/index.d.ts +1 -1
  56. package/dist/core/keybindings/index.d.ts +1 -1
  57. package/dist/core/loading/index.d.ts +1 -1
  58. package/dist/core/locale/index.d.ts +1 -1
  59. package/dist/core/stacked/paneResize.d.ts +3 -0
  60. package/dist/core/stacked/types.d.ts +10 -0
  61. package/dist/core/theme-editor/index.d.ts +1 -1
  62. package/dist/createStackedChart-DqcLCFGS.js +1338 -0
  63. package/dist/createStackedChart-DqcLCFGS.js.map +1 -0
  64. package/dist/examples/PluginDemonstration.d.ts +1 -1
  65. package/dist/hooks-DH-3bewj.js +69 -0
  66. package/dist/hooks-DH-3bewj.js.map +1 -0
  67. package/dist/{index-BBpJwOct.js → index-0InEyj0q.js} +119 -121
  68. package/dist/index-0InEyj0q.js.map +1 -0
  69. package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
  70. package/dist/index-B7PTX94B.js.map +1 -0
  71. package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
  72. package/dist/index-BgrvqltV.js.map +1 -0
  73. package/dist/{index-DoYxf1cV.js → index-CWxIHdwX.js} +38 -98
  74. package/dist/index-CWxIHdwX.js.map +1 -0
  75. package/dist/index-CaXWSOTk.js.map +1 -1
  76. package/dist/{mockDatafeed-927foCM4.js → index-Cv6ZDLWf.js} +227 -217
  77. package/dist/index-Cv6ZDLWf.js.map +1 -0
  78. package/dist/index-Dag88bW4.js.map +1 -1
  79. package/dist/index-qhscKTDy.js.map +1 -1
  80. package/dist/index.core.d.ts +9 -7
  81. package/dist/index.d.ts +2 -15
  82. package/dist/indicators--eJGmVox.js.map +1 -1
  83. package/dist/optionsSync-QUiN4Inw.js +119 -0
  84. package/dist/optionsSync-QUiN4Inw.js.map +1 -0
  85. package/dist/plugins/3d/index.d.ts +2 -2
  86. package/dist/plugins/3d.d.ts +2 -2
  87. package/dist/plugins/3d.js +3 -1
  88. package/dist/plugins/3d.js.map +1 -1
  89. package/dist/plugins/analysis/index.d.ts +1 -1
  90. package/dist/plugins/analysis/indicators.d.ts +1 -1
  91. package/dist/plugins/analysis.d.ts +2 -2
  92. package/dist/plugins/analysis.js +2 -2
  93. package/dist/plugins/analysis.js.map +1 -1
  94. package/dist/plugins/annotations/index.d.ts +1 -1
  95. package/dist/plugins/annotations.d.ts +2 -2
  96. package/dist/plugins/annotations.js.map +1 -1
  97. package/dist/plugins/anomaly-detection.js +1 -1
  98. package/dist/plugins/anomaly-detection.js.map +1 -1
  99. package/dist/plugins/broken-axis.d.ts +2 -2
  100. package/dist/plugins/builtins/crosshair/CrosshairPlugin.d.ts +1 -1
  101. package/dist/plugins/builtins/index.d.ts +1 -1
  102. package/dist/plugins/caching.d.ts +2 -2
  103. package/dist/plugins/clipboard/index.d.ts +2 -2
  104. package/dist/plugins/clipboard.d.ts +2 -2
  105. package/dist/plugins/clipboard.js.map +1 -1
  106. package/dist/plugins/context-menu/index.d.ts +1 -1
  107. package/dist/plugins/context-menu.d.ts +2 -2
  108. package/dist/plugins/context-menu.js +1 -1
  109. package/dist/plugins/context-menu.js.map +1 -1
  110. package/dist/plugins/createPlugin.d.ts +8 -0
  111. package/dist/plugins/data-export/index.d.ts +1 -1
  112. package/dist/plugins/data-export.d.ts +2 -2
  113. package/dist/plugins/data-export.js +2 -2
  114. package/dist/plugins/data-export.js.map +1 -1
  115. package/dist/plugins/data-transform.d.ts +2 -2
  116. package/dist/plugins/data-transform.js +19 -19
  117. package/dist/plugins/data-transform.js.map +1 -1
  118. package/dist/plugins/debug/index.d.ts +2 -2
  119. package/dist/plugins/debug.d.ts +2 -2
  120. package/dist/plugins/debug.js +33 -33
  121. package/dist/plugins/debug.js.map +1 -1
  122. package/dist/plugins/forecasting/index.d.ts +1 -1
  123. package/dist/plugins/forecasting.js.map +1 -1
  124. package/dist/plugins/gpu/index.d.ts +2 -2
  125. package/dist/plugins/gpu.d.ts +2 -2
  126. package/dist/plugins/gpu.js +2033 -209
  127. package/dist/plugins/gpu.js.map +1 -1
  128. package/dist/plugins/i18n/index.d.ts +2 -2
  129. package/dist/plugins/i18n.d.ts +2 -2
  130. package/dist/plugins/i18n.js +286 -23
  131. package/dist/plugins/i18n.js.map +1 -1
  132. package/dist/plugins/index.d.ts +1 -1
  133. package/dist/plugins/keyboard.d.ts +2 -2
  134. package/dist/plugins/keyboard.js +65 -5
  135. package/dist/plugins/keyboard.js.map +1 -1
  136. package/dist/plugins/latex.js +766 -207
  137. package/dist/plugins/latex.js.map +1 -1
  138. package/dist/plugins/lazy-load.d.ts +2 -2
  139. package/dist/plugins/loading/index.d.ts +2 -3
  140. package/dist/plugins/loading.d.ts +2 -2
  141. package/dist/plugins/loading.js +3 -4
  142. package/dist/plugins/ml-integration.d.ts +2 -2
  143. package/dist/plugins/ml-integration.js +5 -5
  144. package/dist/plugins/ml-integration.js.map +1 -1
  145. package/dist/plugins/offscreen.d.ts +2 -2
  146. package/dist/plugins/offscreen.js +11 -10
  147. package/dist/plugins/offscreen.js.map +1 -1
  148. package/dist/plugins/pattern-recognition.d.ts +2 -2
  149. package/dist/plugins/pattern-recognition.js +1 -1
  150. package/dist/plugins/pattern-recognition.js.map +1 -1
  151. package/dist/plugins/radar.d.ts +2 -2
  152. package/dist/plugins/regression.d.ts +2 -2
  153. package/dist/plugins/regression.js +255 -257
  154. package/dist/plugins/regression.js.map +1 -1
  155. package/dist/plugins/roi.js +9 -9
  156. package/dist/plugins/roi.js.map +1 -1
  157. package/dist/plugins/snapshot/index.d.ts +1 -1
  158. package/dist/plugins/snapshot/types.d.ts +1 -1
  159. package/dist/plugins/snapshot.d.ts +2 -2
  160. package/dist/plugins/snapshot.js.map +1 -1
  161. package/dist/plugins/streaming/index.d.ts +2 -2
  162. package/dist/plugins/streaming.d.ts +2 -2
  163. package/dist/plugins/streaming.js +1 -1
  164. package/dist/plugins/sync/index.d.ts +3 -2
  165. package/dist/plugins/sync.d.ts +2 -2
  166. package/dist/plugins/sync.js.map +1 -1
  167. package/dist/plugins/theme-editor/index.d.ts +1 -1
  168. package/dist/plugins/theme-editor.d.ts +2 -2
  169. package/dist/plugins/tools/index.d.ts +1 -1
  170. package/dist/plugins/tools/tooltip/index.d.ts +1 -1
  171. package/dist/plugins/tools.d.ts +2 -2
  172. package/dist/plugins/tools.js +1 -1
  173. package/dist/plugins/types.d.ts +1 -1
  174. package/dist/plugins/video-recorder.d.ts +2 -2
  175. package/dist/plugins/virtualization.d.ts +2 -2
  176. package/dist/plugins/virtualization.js +1 -1
  177. package/dist/pool-DZ8shSqv.js +109 -0
  178. package/dist/pool-DZ8shSqv.js.map +1 -0
  179. package/dist/react/StackedPlot.d.ts +31 -0
  180. package/dist/react/VeloPlot.d.ts +29 -0
  181. package/dist/react/index.d.ts +25 -3
  182. package/dist/react/useChartSync.d.ts +8 -0
  183. package/dist/react/useIndicator.d.ts +12 -0
  184. package/dist/react/useVeloPlot.d.ts +19 -0
  185. package/dist/react.js +325 -24
  186. package/dist/react.js.map +1 -1
  187. package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
  188. package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
  189. package/dist/renderer/native/draw.d.ts +2 -47
  190. package/dist/renderer/native/drawCore.d.ts +27 -0
  191. package/dist/renderer/native/drawExtended.d.ts +29 -0
  192. package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
  193. package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
  194. package/dist/renderer/native/programFactoryCore.d.ts +6 -0
  195. package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
  196. package/dist/renderer/native/utils.d.ts +3 -29
  197. package/dist/renderer/native/utilsCore.d.ts +14 -0
  198. package/dist/renderer/native/utilsExtended.d.ts +17 -0
  199. package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
  200. package/dist/renderer/registerExtendedSeries.d.ts +1 -0
  201. package/dist/renderer/registerWebGPU.d.ts +2 -0
  202. package/dist/renderer/seriesBufferExtended.d.ts +4 -0
  203. package/dist/scientific/index.d.ts +44 -0
  204. package/dist/scientific/registerScientific.d.ts +1 -0
  205. package/dist/scientific.d.ts +1 -0
  206. package/dist/scientific.js +91 -0
  207. package/dist/scientific.js.map +1 -0
  208. package/dist/solid/VeloPlot.d.ts +16 -0
  209. package/dist/solid/index.d.ts +13 -0
  210. package/dist/solid/useChartSync.d.ts +6 -0
  211. package/dist/solid/useIndicator.d.ts +11 -0
  212. package/dist/solid/useStackedPlot.d.ts +14 -0
  213. package/dist/solid/useVeloPlot.d.ts +18 -0
  214. package/dist/solid.d.ts +1 -0
  215. package/dist/solid.js +169 -0
  216. package/dist/solid.js.map +1 -0
  217. package/dist/stackedSync-tnrunZMt.js +100 -0
  218. package/dist/stackedSync-tnrunZMt.js.map +1 -0
  219. package/dist/svelte/StackedPlot.svelte +29 -0
  220. package/dist/svelte/StackedPlot.test.ts +114 -0
  221. package/dist/svelte/VeloPlot.svelte +44 -0
  222. package/dist/svelte/VeloPlot.test.ts +105 -0
  223. package/dist/svelte/index.d.ts +11 -0
  224. package/dist/svelte/index.test.ts +20 -0
  225. package/dist/svelte/index.ts +15 -0
  226. package/dist/svelte/useChartSync.d.ts +8 -0
  227. package/dist/svelte/useChartSync.test.ts +49 -0
  228. package/dist/svelte/useChartSync.ts +29 -0
  229. package/dist/svelte/useIndicator.d.ts +13 -0
  230. package/dist/svelte/useIndicator.test.ts +67 -0
  231. package/dist/svelte/useIndicator.ts +43 -0
  232. package/dist/svelte/useStackedPlot.d.ts +16 -0
  233. package/dist/svelte/useStackedPlot.test.ts +76 -0
  234. package/dist/svelte/useStackedPlot.ts +54 -0
  235. package/dist/svelte/useVeloPlot.d.ts +21 -0
  236. package/dist/svelte/useVeloPlot.test.ts +100 -0
  237. package/dist/svelte/useVeloPlot.ts +81 -0
  238. package/dist/svelte.d.ts +1 -0
  239. package/dist/svelte.js +140 -0
  240. package/dist/svelte.js.map +1 -0
  241. package/dist/testing/index.d.ts +1 -1
  242. package/dist/theme/index.d.ts +2 -1
  243. package/dist/trading/index.d.ts +1 -4
  244. package/dist/trading/registerTrading.d.ts +3 -0
  245. package/dist/trading.js +42 -42
  246. package/dist/types.d.ts +4 -4
  247. package/dist/{utils-BK5UUXxj.js → utils-Dx0h0bgQ.js} +9 -9
  248. package/dist/{utils-BK5UUXxj.js.map → utils-Dx0h0bgQ.js.map} +1 -1
  249. package/dist/velo-plot.full.js +2216 -1346
  250. package/dist/velo-plot.full.js.map +1 -1
  251. package/dist/velo-plot.js +33 -28
  252. package/dist/velo-plot.js.map +1 -1
  253. package/dist/vue/StackedPlot.vue.d.ts +48 -0
  254. package/dist/vue/VeloPlot.vue.d.ts +64 -0
  255. package/dist/vue/index.d.ts +250 -0
  256. package/dist/vue/useChartSync.d.ts +52 -0
  257. package/dist/vue/useIndicator.d.ts +23 -0
  258. package/dist/vue/useStackedPlot.d.ts +15 -0
  259. package/dist/vue/useVeloPlot.d.ts +20 -0
  260. package/dist/vue.d.ts +1 -0
  261. package/dist/vue.js +309 -0
  262. package/dist/vue.js.map +1 -0
  263. package/dist/workers/indicatorsAsync.d.ts +2 -0
  264. package/dist/workers/pool.d.ts +9 -0
  265. package/package.json +96 -10
  266. package/dist/ChartCore-ivzLqxVb.js +0 -8350
  267. package/dist/ChartCore-ivzLqxVb.js.map +0 -1
  268. package/dist/SciPlot-CEU4ApgD.js +0 -463
  269. package/dist/SciPlot-CEU4ApgD.js.map +0 -1
  270. package/dist/createStackedChart-DxNW0VkF.js +0 -705
  271. package/dist/createStackedChart-DxNW0VkF.js.map +0 -1
  272. package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
  273. package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
  274. package/dist/index-BBpJwOct.js.map +0 -1
  275. package/dist/index-BMiZoKmm.js.map +0 -1
  276. package/dist/index-DoYxf1cV.js.map +0 -1
  277. package/dist/index-qunX30Xu.js.map +0 -1
  278. package/dist/index-x4stH3jD.js +0 -282
  279. package/dist/index-x4stH3jD.js.map +0 -1
  280. package/dist/index.core-COREBDNq.js.map +0 -1
  281. package/dist/mockDatafeed-927foCM4.js.map +0 -1
  282. package/dist/pool-15HMCNv8.js +0 -88
  283. package/dist/pool-15HMCNv8.js.map +0 -1
  284. package/dist/react/SciPlot.d.ts +0 -60
  285. package/dist/react/useSciPlot.d.ts +0 -56
  286. package/dist/symbols-DT0eLlpW.js +0 -568
  287. package/dist/symbols-DT0eLlpW.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"data-transform.js","sources":["../../src/plugins/data-transform/index.ts"],"sourcesContent":["/**\n * PluginDataTransform - Implementation\n * \n * Provides a pipeline-based data transformation system for Sci Plot.\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n} from '../types';\n\nimport type {\n PluginDataTransformConfig,\n DataTransformAPI,\n TransformOp\n} from './types';\n\n// Import algorithms from analysis plugin where available\nimport { \n movingAverage, \n derivative as calcDerivative, \n cumulativeIntegral as calcIntegral,\n subtractBaseline\n} from '../analysis';\n\nimport { Series } from '../../core/series/Series';\n\nconst manifest: PluginManifest = {\n name: 'data-transform',\n version: '1.0.0',\n description: 'Advanced data transformation pipeline',\n provides: ['data-transform', 'processing'],\n author: 'Sci Plot Team'\n};\n\nexport function PluginDataTransform(\n userConfig: Partial<PluginDataTransformConfig> = {}\n): ChartPlugin<PluginDataTransformConfig> {\n const _config: Required<PluginDataTransformConfig> = {\n autoApply: false,\n createDerivativeSeries: false,\n precision: 6,\n ...userConfig\n };\n\n let ctx: PluginContext | null = null;\n const originalDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n /**\n * Core transformation logic\n */\n async function applyTransform(\n seriesId: string, \n pipeline: TransformOp[]\n ): Promise<void> {\n if (!ctx) return;\n \n const chart = ctx.chart;\n const series = chart.getSeries(seriesId) as unknown as Series;\n if (!series) {\n throw new Error(`Series ${seriesId} not found`);\n }\n\n // Capture original data if not already captured\n if (!originalDataStore.has(seriesId)) {\n const currentData = series.getData();\n originalDataStore.set(seriesId, {\n x: new Float32Array(currentData.x.buffer.slice(0)),\n y: new Float32Array(currentData.y.buffer.slice(0))\n });\n }\n\n const original = originalDataStore.get(seriesId)!;\n let x = new Float32Array(original.x.buffer.slice(0));\n let y = new Float32Array(original.y.buffer.slice(0));\n\n // Apply pipeline\n for (const op of pipeline) {\n const result = await executeOp(x, y, op);\n x = result.x;\n y = result.y;\n }\n\n // Update series with transformed data\n chart.updateSeries(seriesId, { x, y });\n }\n\n async function executeOp(\n x: Float32Array, \n y: Float32Array, \n op: TransformOp\n ): Promise<{ x: Float32Array; y: Float32Array }> {\n const params = op.parameters || (op as any);\n\n switch (op.type) {\n case 'normalize': {\n const range = params.range || [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < y.length; i++) {\n if (y[i] < min) min = y[i];\n if (y[i] > max) max = y[i];\n }\n const rangeWidth = max - min;\n const targetRange = range[1] - range[0];\n const newY = new Float32Array(y.length);\n if (rangeWidth === 0) {\n newY.fill(range[0]);\n } else {\n for (let i = 0; i < y.length; i++) {\n newY[i] = range[0] + ((y[i] - min) / rangeWidth) * targetRange;\n }\n }\n return { x, y: newY };\n }\n\n case 'smooth':\n case 'moving-average': {\n const window = params.window || 5;\n const smoothedY = movingAverage(y, window);\n return { x, y: smoothedY };\n }\n\n case 'derivative': {\n const order = params.order || 1;\n let dy = y;\n for (let i = 0; i < order; i++) {\n dy = calcDerivative(x, dy);\n }\n return { x, y: dy };\n }\n\n case 'integral': {\n const iy = calcIntegral(x, y);\n return { x, y: iy };\n }\n\n case 'scale-offset': {\n const scale = params.scale ?? 1;\n const offset = params.offset ?? 0;\n const newY = new Float32Array(y.length);\n for (let i = 0; i < y.length; i++) {\n newY[i] = y[i] * scale + offset;\n }\n return { x, y: newY };\n }\n\n case 'resample': {\n const points = params.points || 1000;\n return resample(x, y, points);\n }\n\n case 'baseline-removal': {\n const x1 = params.x1 ?? x[0];\n const x2 = params.x2 ?? x[x.length - 1];\n const result = subtractBaseline(x, y, x1, x2);\n return { x, y: result };\n }\n\n case 'abs': {\n const newY = y.map(v => Math.abs(v));\n return { x, y: newY };\n }\n\n case 'log': {\n const base = params.base || Math.E;\n const logBase = Math.log(base);\n const newY = y.map(v => v > 0 ? Math.log(v) / logBase : 0);\n return { x, y: newY };\n }\n\n case 'power': {\n const exp = params.exponent || 2;\n const newY = y.map(v => Math.pow(v, exp));\n return { x, y: newY };\n }\n\n default:\n console.warn(`Unknown transform type: ${op.type}`);\n return { x, y };\n }\n }\n\n function resample(\n x: Float32Array, \n y: Float32Array, \n numPoints: number\n ): { x: Float32Array; y: Float32Array } {\n if (x.length <= 1 || numPoints <= 1) return { x, y };\n \n const newX = new Float32Array(numPoints);\n const newY = new Float32Array(numPoints);\n \n const xMin = x[0];\n const xMax = x[x.length - 1];\n const dx = (xMax - xMin) / (numPoints - 1);\n \n for (let i = 0; i < numPoints; i++) {\n const targetX = xMin + i * dx;\n newX[i] = targetX;\n \n let low = 0;\n let high = x.length - 2;\n let found = 0;\n \n while (low <= high) {\n const mid = (low + high) >> 1;\n if (x[mid] <= targetX && targetX <= x[mid + 1]) {\n found = mid;\n break;\n }\n if (x[mid] < targetX) low = mid + 1;\n else high = mid - 1;\n }\n \n const x0 = x[found];\n const x1 = x[found + 1];\n const y0 = y[found];\n const y1 = y[found + 1];\n const t = (targetX - x0) / (x1 - x0);\n newY[i] = y0 + t * (y1 - y0);\n }\n \n return { x: newX, y: newY };\n }\n\n const api: DataTransformAPI & Record<string, unknown> = {\n transform: applyTransform,\n \n resetTransform(seriesId: string) {\n if (originalDataStore.has(seriesId) && ctx) {\n const original = originalDataStore.get(seriesId)!;\n ctx.chart.updateSeries(seriesId, { x: original.x, y: original.y });\n originalDataStore.delete(seriesId);\n }\n },\n \n getOriginalData(seriesId: string) {\n return originalDataStore.get(seriesId) || null;\n }\n };\n\n return {\n manifest,\n onInit(context: PluginContext) {\n ctx = context;\n ctx.log?.info(`DataTransform plugin initialized (precision: ${_config.precision})`);\n },\n onDestroy() {\n originalDataStore.clear();\n ctx = null;\n },\n api\n };\n}\n\nexport default PluginDataTransform;\n\nexport type {\n TransformType,\n TransformOp,\n PluginDataTransformConfig,\n DataTransformAPI\n} from './types';\n"],"names":["manifest","PluginDataTransform","userConfig","_config","ctx","originalDataStore","applyTransform","seriesId","pipeline","chart","series","currentData","original","x","y","op","result","executeOp","params","range","min","max","i","rangeWidth","targetRange","newY","window","smoothedY","movingAverage","order","dy","calcDerivative","iy","calcIntegral","scale","offset","points","resample","x1","x2","subtractBaseline","v","base","logBase","exp","numPoints","newX","xMin","dx","targetX","low","high","found","mid","x0","y0","y1","t","context","_a"],"mappings":"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"}
1
+ {"version":3,"file":"data-transform.js","sources":["../../src/plugins/data-transform/index.ts"],"sourcesContent":["/**\n * PluginDataTransform - Implementation\n * \n * Provides a pipeline-based data transformation system for Velo Plot.\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n} from '../types';\n\nimport type {\n PluginDataTransformConfig,\n DataTransformAPI,\n TransformOp\n} from './types';\n\n// Import algorithms from analysis plugin where available\nimport { \n movingAverage, \n derivative as calcDerivative, \n cumulativeIntegral as calcIntegral,\n subtractBaseline\n} from '../analysis';\n\nimport { Series } from '../../core/series/Series';\n\nconst manifest: PluginManifest = {\n name: 'data-transform',\n version: '1.0.0',\n description: 'Advanced data transformation pipeline',\n provides: ['data-transform', 'processing'],\n author: 'Velo Plot Team'\n};\n\nexport function PluginDataTransform(\n userConfig: Partial<PluginDataTransformConfig> = {}\n): ChartPlugin<PluginDataTransformConfig> {\n const _config: Required<PluginDataTransformConfig> = {\n autoApply: false,\n createDerivativeSeries: false,\n precision: 6,\n ...userConfig\n };\n\n let ctx: PluginContext | null = null;\n const originalDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n /**\n * Core transformation logic\n */\n async function applyTransform(\n seriesId: string, \n pipeline: TransformOp[]\n ): Promise<void> {\n if (!ctx) return;\n \n const chart = ctx.chart;\n const series = chart.getSeries(seriesId) as unknown as Series;\n if (!series) {\n throw new Error(`Series ${seriesId} not found`);\n }\n\n // Capture original data if not already captured\n if (!originalDataStore.has(seriesId)) {\n const currentData = series.getData();\n originalDataStore.set(seriesId, {\n x: new Float32Array(currentData.x.buffer.slice(0)),\n y: new Float32Array(currentData.y.buffer.slice(0))\n });\n }\n\n const original = originalDataStore.get(seriesId)!;\n let x = new Float32Array(original.x.buffer.slice(0));\n let y = new Float32Array(original.y.buffer.slice(0));\n\n // Apply pipeline\n for (const op of pipeline) {\n const result = await executeOp(x, y, op);\n x = result.x;\n y = result.y;\n }\n\n // Update series with transformed data\n chart.updateSeries(seriesId, { x, y });\n }\n\n async function executeOp(\n x: Float32Array, \n y: Float32Array, \n op: TransformOp\n ): Promise<{ x: Float32Array; y: Float32Array }> {\n const params = op.parameters || (op as any);\n\n switch (op.type) {\n case 'normalize': {\n const range = params.range || [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < y.length; i++) {\n if (y[i] < min) min = y[i];\n if (y[i] > max) max = y[i];\n }\n const rangeWidth = max - min;\n const targetRange = range[1] - range[0];\n const newY = new Float32Array(y.length);\n if (rangeWidth === 0) {\n newY.fill(range[0]);\n } else {\n for (let i = 0; i < y.length; i++) {\n newY[i] = range[0] + ((y[i] - min) / rangeWidth) * targetRange;\n }\n }\n return { x, y: newY };\n }\n\n case 'smooth':\n case 'moving-average': {\n const window = params.window || 5;\n const smoothedY = movingAverage(y, window);\n return { x, y: smoothedY };\n }\n\n case 'derivative': {\n const order = params.order || 1;\n let dy = y;\n for (let i = 0; i < order; i++) {\n dy = calcDerivative(x, dy);\n }\n return { x, y: dy };\n }\n\n case 'integral': {\n const iy = calcIntegral(x, y);\n return { x, y: iy };\n }\n\n case 'scale-offset': {\n const scale = params.scale ?? 1;\n const offset = params.offset ?? 0;\n const newY = new Float32Array(y.length);\n for (let i = 0; i < y.length; i++) {\n newY[i] = y[i] * scale + offset;\n }\n return { x, y: newY };\n }\n\n case 'resample': {\n const points = params.points || 1000;\n return resample(x, y, points);\n }\n\n case 'baseline-removal': {\n const x1 = params.x1 ?? x[0];\n const x2 = params.x2 ?? x[x.length - 1];\n const result = subtractBaseline(x, y, x1, x2);\n return { x, y: result };\n }\n\n case 'abs': {\n const newY = y.map(v => Math.abs(v));\n return { x, y: newY };\n }\n\n case 'log': {\n const base = params.base || Math.E;\n const logBase = Math.log(base);\n const newY = y.map(v => v > 0 ? Math.log(v) / logBase : 0);\n return { x, y: newY };\n }\n\n case 'power': {\n const exp = params.exponent || 2;\n const newY = y.map(v => Math.pow(v, exp));\n return { x, y: newY };\n }\n\n default:\n console.warn(`Unknown transform type: ${op.type}`);\n return { x, y };\n }\n }\n\n function resample(\n x: Float32Array, \n y: Float32Array, \n numPoints: number\n ): { x: Float32Array; y: Float32Array } {\n if (x.length <= 1 || numPoints <= 1) return { x, y };\n \n const newX = new Float32Array(numPoints);\n const newY = new Float32Array(numPoints);\n \n const xMin = x[0];\n const xMax = x[x.length - 1];\n const dx = (xMax - xMin) / (numPoints - 1);\n \n for (let i = 0; i < numPoints; i++) {\n const targetX = xMin + i * dx;\n newX[i] = targetX;\n \n let low = 0;\n let high = x.length - 2;\n let found = 0;\n \n while (low <= high) {\n const mid = (low + high) >> 1;\n if (x[mid] <= targetX && targetX <= x[mid + 1]) {\n found = mid;\n break;\n }\n if (x[mid] < targetX) low = mid + 1;\n else high = mid - 1;\n }\n \n const x0 = x[found];\n const x1 = x[found + 1];\n const y0 = y[found];\n const y1 = y[found + 1];\n const t = (targetX - x0) / (x1 - x0);\n newY[i] = y0 + t * (y1 - y0);\n }\n \n return { x: newX, y: newY };\n }\n\n const api: DataTransformAPI & Record<string, unknown> = {\n transform: applyTransform,\n \n resetTransform(seriesId: string) {\n if (originalDataStore.has(seriesId) && ctx) {\n const original = originalDataStore.get(seriesId)!;\n ctx.chart.updateSeries(seriesId, { x: original.x, y: original.y });\n originalDataStore.delete(seriesId);\n }\n },\n \n getOriginalData(seriesId: string) {\n return originalDataStore.get(seriesId) || null;\n }\n };\n\n return {\n manifest,\n onInit(context: PluginContext) {\n ctx = context;\n ctx.log?.info(`DataTransform plugin initialized (precision: ${_config.precision})`);\n },\n onDestroy() {\n originalDataStore.clear();\n ctx = null;\n },\n api\n };\n}\n\nexport default PluginDataTransform;\n\nexport type {\n TransformType,\n TransformOp,\n PluginDataTransformConfig,\n DataTransformAPI\n} from './types';\n"],"names":["manifest","PluginDataTransform","userConfig","_config","ctx","originalDataStore","applyTransform","seriesId","pipeline","chart","series","currentData","original","x","y","op","result","executeOp","params","range","min","max","i","rangeWidth","targetRange","newY","window","smoothedY","movingAverage","order","dy","calcDerivative","iy","calcIntegral","scale","offset","points","resample","x1","x2","subtractBaseline","v","base","logBase","exp","numPoints","newX","xMin","dx","targetX","low","high","found","mid","x0","y0","y1","t","context","_a"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ChartPlugin } from '../types';
2
2
  import { DebugOverlay, DebugOverlayOptions } from '../../core/debug';
3
3
  /**
4
- * SciPlot Engine - Debug Overlay Plugin
4
+ * VeloPlot Engine - Debug Overlay Plugin
5
5
  *
6
6
  * Provides performance metrics and debugging information.
7
7
  *
@@ -15,7 +15,7 @@ export interface PluginDebugConfig extends Partial<DebugOverlayOptions> {
15
15
  showDataStats?: boolean;
16
16
  }
17
17
  /**
18
- * SciPlot Debug Plugin
18
+ * VeloPlot Debug Plugin
19
19
  *
20
20
  * Adds a useful overlay with real-time performance metrics and debugging info.
21
21
  */
@@ -1,3 +1,3 @@
1
1
  export * from './debug/index'
2
- import SciPlot from './debug/index'
3
- export default SciPlot
2
+ import VeloPlot from './debug/index'
3
+ export default VeloPlot
@@ -1,8 +1,6 @@
1
- var c = Object.defineProperty;
2
- var m = (r, e, t) => e in r ? c(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
- var n = (r, e, t) => m(r, typeof e != "symbol" ? e + "" : e, t);
4
- import { i as f } from "../math-Ddm2EZjj.js";
5
- import { c as g } from "../utils-BK5UUXxj.js";
1
+ var f = Object.defineProperty;
2
+ var g = (r, e, t) => e in r ? f(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
+ var n = (r, e, t) => g(r, typeof e != "symbol" ? e + "" : e, t);
6
4
  class u {
7
5
  constructor(e, t) {
8
6
  n(this, "container");
@@ -178,13 +176,13 @@ class u {
178
176
  return isFinite(e) ? Math.abs(e) >= 1e6 || Math.abs(e) < 1e-3 && e !== 0 ? e.toExponential(2) : e.toFixed(3) : e.toString();
179
177
  }
180
178
  }
181
- function S(r, e) {
179
+ function y(r, e) {
182
180
  return new u(r, e);
183
181
  }
184
- function C(r) {
182
+ function w(r) {
185
183
  const e = document.querySelector(".velo-plot-container");
186
184
  if (!e)
187
- return console.warn("[SciPlot] No chart container found for debug overlay"), null;
185
+ return console.warn("[VeloPlot] No chart container found for debug overlay"), null;
188
186
  const t = new u(e, r);
189
187
  return t.show(), t;
190
188
  }
@@ -235,36 +233,38 @@ class x {
235
233
  pointer-events: auto;
236
234
  `;
237
235
  }
238
- update(e) {
239
- this.isExpanded && (this.content.innerHTML = "", this.series.forEach((t) => {
240
- if (!t.getVisible()) return;
241
- const i = t.getData();
242
- if (!i) return;
243
- const s = [], o = [];
244
- for (let a = 0; a < i.x.length; a++)
245
- i.x[a] >= e.xMin && i.x[a] <= e.xMax && (o.push(i.x[a]), s.push(i.y[a]));
246
- if (s.length === 0) return;
247
- const l = g(s), p = f(o, s), h = t.getStyle(), d = document.createElement("div");
236
+ async update(e) {
237
+ if (!this.isExpanded) return;
238
+ const { calculateStats: t, integrate: i } = await import("./analysis.js");
239
+ this.content.innerHTML = "", this.series.forEach((s) => {
240
+ if (!s.getVisible()) return;
241
+ const o = s.getData();
242
+ if (!o) return;
243
+ const p = [], h = [];
244
+ for (let l = 0; l < o.x.length; l++)
245
+ o.x[l] >= e.xMin && o.x[l] <= e.xMax && (h.push(o.x[l]), p.push(o.y[l]));
246
+ if (p.length === 0) return;
247
+ const a = t(p), c = i(h, p), m = s.getStyle(), d = document.createElement("div");
248
248
  d.style.cssText = `
249
249
  padding: 8px 0;
250
250
  border-top: 1px solid ${this.isDarkTheme() ? "rgba(255,255,255,0.05)" : "rgba(0,0,0,0.05)"};
251
251
  `, d.innerHTML = `
252
252
  <div style="display: flex; align-items: center; gap: 6px; margin-bottom: 4px; font-weight: 600;">
253
- <div style="width: 8px; height: 8px; border-radius: 2px; background: ${h.color}"></div>
254
- ${t.getId()}
253
+ <div style="width: 8px; height: 8px; border-radius: 2px; background: ${m.color}"></div>
254
+ ${s.getId()}
255
255
  </div>
256
256
  <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0.9; font-size: 11px;">
257
- <span>Min: ${l.min.toExponential(3)}</span>
258
- <span>Max: ${l.max.toExponential(3)}</span>
259
- <span>Mean: ${l.mean.toExponential(3)}</span>
260
- <span>Count: ${l.count}</span>
261
- <span style="grid-column: span 2;">Area: ${p.toExponential(4)}</span>
257
+ <span>Min: ${a.min.toExponential(3)}</span>
258
+ <span>Max: ${a.max.toExponential(3)}</span>
259
+ <span>Mean: ${a.mean.toExponential(3)}</span>
260
+ <span>Count: ${a.count}</span>
261
+ <span style="grid-column: span 2;">Area: ${c.toExponential(4)}</span>
262
262
  </div>
263
263
  `, this.content.appendChild(d);
264
- }), this.content.innerHTML === "" && (this.content.innerHTML = "<div style='opacity: 0.5; font-style: italic;'>No series visible in range</div>"));
264
+ }), this.content.innerHTML === "" && (this.content.innerHTML = "<div style='opacity: 0.5; font-style: italic;'>No series visible in range</div>");
265
265
  }
266
266
  toggle() {
267
- this.isExpanded = !this.isExpanded, this.content.style.display = this.isExpanded ? "block" : "none", this.isExpanded;
267
+ this.isExpanded = !this.isExpanded, this.content.style.display = this.isExpanded ? "block" : "none";
268
268
  }
269
269
  updateTheme(e) {
270
270
  this.theme = e, this.updateContainerStyle();
@@ -280,7 +280,7 @@ const v = {
280
280
  provides: ["ui"],
281
281
  tags: ["debug", "performance", "fps", "monitoring"]
282
282
  };
283
- function F(r = {}) {
283
+ function S(r = {}) {
284
284
  let e = null, t = null, i;
285
285
  return {
286
286
  manifest: v,
@@ -294,7 +294,7 @@ function F(r = {}) {
294
294
  }), e.show(), e.setStatsProvider(() => {
295
295
  const o = i.data.getAllSeries();
296
296
  return {
297
- pointCount: o.reduce((p, h) => p + h.getData().x.length, 0),
297
+ pointCount: o.reduce((h, a) => h + a.getData().x.length, 0),
298
298
  seriesCount: o.length,
299
299
  viewBounds: i.data.getViewBounds(),
300
300
  devicePixelRatio: i.chart.dpr || 1
@@ -323,9 +323,9 @@ function F(r = {}) {
323
323
  }
324
324
  export {
325
325
  u as DebugOverlay,
326
- F as PluginDebug,
327
- S as createDebugOverlay,
328
- F as default,
329
- C as enableDebugMode
326
+ S as PluginDebug,
327
+ y as createDebugOverlay,
328
+ S as default,
329
+ w as enableDebugMode
330
330
  };
331
331
  //# sourceMappingURL=debug.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"debug.js","sources":["../../src/core/debug/index.ts","../../src/core/ChartStatistics.ts","../../src/plugins/debug/index.ts"],"sourcesContent":["/**\n * Sci Plot - Debug Overlay Module\n * \n * Provides a visual debug overlay showing performance metrics,\n * rendering info, and chart state for development and debugging.\n * \n * @module debug\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface DebugStats {\n /** Current frames per second */\n fps: number;\n /** Average frame time in ms */\n frameTime: number;\n /** Total number of points being rendered */\n pointCount: number;\n /** Number of visible series */\n seriesCount: number;\n /** Current view bounds */\n viewBounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n };\n /** WebGL/WebGPU renderer info */\n rendererInfo: {\n type: 'webgl' | 'webgpu' | 'unknown';\n vendor?: string;\n renderer?: string;\n };\n /** Memory usage estimate (bytes) */\n memoryEstimate: number;\n /** Number of draw calls per frame */\n drawCalls: number;\n /** Whether GPU downsampling is active */\n downsamplingActive: boolean;\n /** Device pixel ratio */\n devicePixelRatio: number;\n /** Canvas dimensions */\n canvasSize: { width: number; height: number };\n /** Plot area dimensions */\n plotArea: { x: number; y: number; width: number; height: number };\n}\n\nexport interface DebugOverlayOptions {\n /** Show FPS counter (default: true) */\n showFps?: boolean;\n /** Show point count (default: true) */\n showPointCount?: boolean;\n /** Show view bounds (default: true) */\n showBounds?: boolean;\n /** Show renderer info (default: true) */\n showRendererInfo?: boolean;\n /** Show memory estimate (default: true) */\n showMemory?: boolean;\n /** Show draw calls (default: true) */\n showDrawCalls?: boolean;\n /** Position: 'top-left', 'top-right', 'bottom-left', 'bottom-right' */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n /** Background opacity (0-1, default: 0.8) */\n opacity?: number;\n /** Font size in pixels (default: 11) */\n fontSize?: number;\n /** Update interval in ms (default: 250) */\n updateInterval?: number;\n /** Custom CSS class name */\n className?: string;\n}\n\n// ============================================\n// Debug Overlay Implementation\n// ============================================\n\nexport class DebugOverlay {\n private container: HTMLElement;\n private element: HTMLDivElement | null = null;\n private options: Required<DebugOverlayOptions>;\n private visible: boolean = false;\n private updateIntervalId: number | null = null;\n private statsProvider: (() => Partial<DebugStats>) | null = null;\n private lastStats: Partial<DebugStats> = {};\n\n // FPS calculation\n private frameCount: number = 0;\n private lastFpsUpdate: number = 0;\n private currentFps: number = 0;\n private frameTimes: number[] = [];\n\n constructor(container: HTMLElement, options?: DebugOverlayOptions) {\n this.container = container;\n this.options = {\n showFps: true,\n showPointCount: true,\n showBounds: true,\n showRendererInfo: true,\n showMemory: true,\n showDrawCalls: true,\n position: 'top-left',\n opacity: 0.8,\n fontSize: 11,\n updateInterval: 250,\n className: 'velo-plot-debug-overlay',\n ...options,\n };\n }\n\n /**\n * Set the stats provider function\n */\n setStatsProvider(provider: () => Partial<DebugStats>): void {\n this.statsProvider = provider;\n }\n\n /**\n * Record a frame for FPS calculation\n */\n recordFrame(frameTime?: number): void {\n const now = performance.now();\n this.frameCount++;\n\n if (frameTime !== undefined) {\n this.frameTimes.push(frameTime);\n if (this.frameTimes.length > 60) {\n this.frameTimes.shift();\n }\n }\n\n // Update FPS every second\n if (now - this.lastFpsUpdate >= 1000) {\n this.currentFps = Math.round((this.frameCount * 1000) / (now - this.lastFpsUpdate));\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n }\n\n /**\n * Show the debug overlay\n */\n show(): void {\n if (this.visible) return;\n \n this.visible = true;\n this.createElement();\n this.startUpdates();\n }\n\n /**\n * Hide the debug overlay\n */\n hide(): void {\n if (!this.visible) return;\n \n this.visible = false;\n this.stopUpdates();\n this.destroyElement();\n }\n\n /**\n * Toggle visibility\n */\n toggle(): void {\n if (this.visible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * Check if visible\n */\n isVisible(): boolean {\n return this.visible;\n }\n\n /**\n * Update the display with new stats\n */\n update(stats?: Partial<DebugStats>): void {\n if (!this.visible || !this.element) return;\n\n // Merge with provider stats\n const providerStats = this.statsProvider?.() || {};\n this.lastStats = {\n ...this.lastStats,\n ...providerStats,\n ...stats,\n fps: this.currentFps,\n frameTime: this.getAverageFrameTime(),\n };\n\n this.renderStats();\n }\n\n /**\n * Get current stats\n */\n getStats(): Partial<DebugStats> {\n return {\n ...this.lastStats,\n fps: this.currentFps,\n frameTime: this.getAverageFrameTime(),\n };\n }\n\n /**\n * Destroy the overlay\n */\n destroy(): void {\n this.hide();\n this.statsProvider = null;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private createElement(): void {\n if (this.element) return;\n\n this.element = document.createElement('div');\n this.element.className = this.options.className;\n \n // Apply styles\n Object.assign(this.element.style, {\n position: 'absolute',\n zIndex: '9999',\n fontFamily: 'monospace',\n fontSize: `${this.options.fontSize}px`,\n lineHeight: '1.4',\n padding: '8px 12px',\n backgroundColor: `rgba(0, 0, 0, ${this.options.opacity})`,\n color: '#00ff00',\n borderRadius: '4px',\n pointerEvents: 'none',\n userSelect: 'none',\n whiteSpace: 'pre',\n ...this.getPositionStyles(),\n });\n\n this.container.style.position = 'relative';\n this.container.appendChild(this.element);\n }\n\n private destroyElement(): void {\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n this.element = null;\n }\n\n private getPositionStyles(): Partial<CSSStyleDeclaration> {\n switch (this.options.position) {\n case 'top-right':\n return { top: '8px', right: '8px' };\n case 'bottom-left':\n return { bottom: '8px', left: '8px' };\n case 'bottom-right':\n return { bottom: '8px', right: '8px' };\n case 'top-left':\n default:\n return { top: '8px', left: '8px' };\n }\n }\n\n private startUpdates(): void {\n if (this.updateIntervalId !== null) return;\n \n this.updateIntervalId = window.setInterval(() => {\n this.update();\n }, this.options.updateInterval);\n }\n\n private stopUpdates(): void {\n if (this.updateIntervalId !== null) {\n clearInterval(this.updateIntervalId);\n this.updateIntervalId = null;\n }\n }\n\n private getAverageFrameTime(): number {\n if (this.frameTimes.length === 0) return 0;\n const sum = this.frameTimes.reduce((a, b) => a + b, 0);\n return sum / this.frameTimes.length;\n }\n\n private renderStats(): void {\n if (!this.element) return;\n\n const lines: string[] = [];\n const stats = this.lastStats;\n\n // FPS\n if (this.options.showFps && stats.fps !== undefined) {\n const fpsColor = stats.fps >= 55 ? '#00ff00' : stats.fps >= 30 ? '#ffff00' : '#ff4444';\n lines.push(`<span style=\"color:${fpsColor}\">FPS: ${stats.fps}</span>`);\n if (stats.frameTime) {\n lines.push(`Frame: ${stats.frameTime.toFixed(2)}ms`);\n }\n }\n\n // Point count\n if (this.options.showPointCount && stats.pointCount !== undefined) {\n lines.push(`Points: ${this.formatNumber(stats.pointCount)}`);\n }\n\n // Series count\n if (stats.seriesCount !== undefined) {\n lines.push(`Series: ${stats.seriesCount}`);\n }\n\n // Draw calls\n if (this.options.showDrawCalls && stats.drawCalls !== undefined) {\n lines.push(`Draw calls: ${stats.drawCalls}`);\n }\n\n // Memory\n if (this.options.showMemory && stats.memoryEstimate !== undefined) {\n lines.push(`Memory: ${this.formatBytes(stats.memoryEstimate)}`);\n }\n\n // Bounds\n if (this.options.showBounds && stats.viewBounds) {\n const b = stats.viewBounds;\n lines.push(`X: [${this.formatValue(b.xMin)}, ${this.formatValue(b.xMax)}]`);\n lines.push(`Y: [${this.formatValue(b.yMin)}, ${this.formatValue(b.yMax)}]`);\n }\n\n // Renderer info\n if (this.options.showRendererInfo && stats.rendererInfo) {\n const info = stats.rendererInfo;\n lines.push(`Renderer: ${info.type.toUpperCase()}`);\n if (info.renderer) {\n // Truncate long renderer names\n const shortRenderer = info.renderer.length > 30 \n ? info.renderer.substring(0, 27) + '...'\n : info.renderer;\n lines.push(`GPU: ${shortRenderer}`);\n }\n }\n\n // Canvas size\n if (stats.canvasSize) {\n lines.push(`Canvas: ${stats.canvasSize.width}×${stats.canvasSize.height}`);\n }\n\n // Downsampling\n if (stats.downsamplingActive !== undefined) {\n lines.push(`Downsampling: ${stats.downsamplingActive ? 'ON' : 'OFF'}`);\n }\n\n // DPR\n if (stats.devicePixelRatio !== undefined) {\n lines.push(`DPR: ${stats.devicePixelRatio}`);\n }\n\n this.element.innerHTML = lines.join('\\n');\n }\n\n private formatNumber(n: number): string {\n if (n >= 1e9) return (n / 1e9).toFixed(1) + 'B';\n if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';\n if (n >= 1e3) return (n / 1e3).toFixed(1) + 'K';\n return n.toLocaleString();\n }\n\n private formatBytes(bytes: number): string {\n if (bytes >= 1e9) return (bytes / 1e9).toFixed(2) + ' GB';\n if (bytes >= 1e6) return (bytes / 1e6).toFixed(2) + ' MB';\n if (bytes >= 1e3) return (bytes / 1e3).toFixed(2) + ' KB';\n return bytes + ' B';\n }\n\n private formatValue(v: number): string {\n if (!isFinite(v)) return v.toString();\n if (Math.abs(v) >= 1e6 || (Math.abs(v) < 0.001 && v !== 0)) {\n return v.toExponential(2);\n }\n return v.toFixed(3);\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\n/**\n * Create a debug overlay for a chart container\n */\nexport function createDebugOverlay(\n container: HTMLElement,\n options?: DebugOverlayOptions\n): DebugOverlay {\n return new DebugOverlay(container, options);\n}\n\n/**\n * Quick enable debug mode (attaches to first chart container found)\n */\nexport function enableDebugMode(options?: DebugOverlayOptions): DebugOverlay | null {\n const container = document.querySelector('.velo-plot-container') as HTMLElement;\n if (!container) {\n console.warn('[SciPlot] No chart container found for debug overlay');\n return null;\n }\n \n const overlay = new DebugOverlay(container, options);\n overlay.show();\n return overlay;\n}\n","/**\n * ChartStatistics - In-chart statistics panel\n * \n * Displays real-time statistics (Min, Max, Mean, StdDev, Area) \n * for the visible data range of active series.\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\nimport { calculateStats, integrate } from \"../plugins/analysis\";\nimport { Bounds } from \"../types\";\n\nexport class ChartStatistics {\n private container: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Map<string, Series>;\n private isExpanded = false;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n series: Map<string, Series>\n ) {\n this.theme = theme;\n this.series = series;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"velo-plot-stats-panel\";\n this.updateContainerStyle();\n\n const title = document.createElement(\"div\");\n title.innerHTML = \"📊 Statistics\";\n title.style.cssText = `\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n `;\n title.onclick = () => this.toggle();\n\n this.content = document.createElement(\"div\");\n this.content.style.display = \"none\";\n \n this.container.appendChild(title);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return name.includes(\"dark\") || name.includes(\"midnight\") || name.includes(\"electro\");\n }\n\n private updateContainerStyle(): void {\n const isDark = this.isDarkTheme();\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const color = isDark ? \"#f1f5f9\" : \"#1e293b\";\n const borderColor = isDark ? \"rgba(255, 255, 255, 0.1)\" : \"rgba(0, 0, 0, 0.1)\";\n const shadow = isDark ? \"0 4px 12px rgba(0, 0, 0, 0.5)\" : \"0 4px 12px rgba(0, 0, 0, 0.1)\";\n\n this.container.style.cssText = `\n position: absolute;\n bottom: 8px;\n right: 8px;\n width: 240px;\n background: ${bg};\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n color: ${color};\n font-family: system-ui, -apple-system, sans-serif;\n padding: 8px 12px;\n z-index: 90;\n transition: all 0.3s ease;\n font-size: 12px;\n pointer-events: auto;\n `;\n }\n\n public update(viewBounds: Bounds): void {\n if (!this.isExpanded) return;\n\n this.content.innerHTML = \"\";\n \n this.series.forEach((s) => {\n if (!s.getVisible()) return;\n\n const data = s.getData();\n if (!data) return;\n\n // Filter data in visible range\n const visibleY: number[] = [];\n const visibleX: number[] = [];\n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] >= viewBounds.xMin && data.x[i] <= viewBounds.xMax) {\n visibleX.push(data.x[i]);\n visibleY.push(data.y[i]);\n }\n }\n\n if (visibleY.length === 0) return;\n\n const stats = calculateStats(visibleY);\n const area = integrate(visibleX as any, visibleY as any);\n const style = s.getStyle();\n\n const item = document.createElement(\"div\");\n item.style.cssText = `\n padding: 8px 0;\n border-top: 1px solid ${this.isDarkTheme() ? \"rgba(255,255,255,0.05)\" : \"rgba(0,0,0,0.05)\"};\n `;\n\n item.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 4px; font-weight: 600;\">\n <div style=\"width: 8px; height: 8px; border-radius: 2px; background: ${style.color}\"></div>\n ${s.getId()}\n </div>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0.9; font-size: 11px;\">\n <span>Min: ${stats.min.toExponential(3)}</span>\n <span>Max: ${stats.max.toExponential(3)}</span>\n <span>Mean: ${stats.mean.toExponential(3)}</span>\n <span>Count: ${stats.count}</span>\n <span style=\"grid-column: span 2;\">Area: ${area.toExponential(4)}</span>\n </div>\n `;\n\n this.content.appendChild(item);\n });\n\n if (this.content.innerHTML === \"\") {\n this.content.innerHTML = \"<div style='opacity: 0.5; font-style: italic;'>No series visible in range</div>\";\n }\n }\n\n public toggle(): void {\n this.isExpanded = !this.isExpanded;\n this.content.style.display = this.isExpanded ? \"block\" : \"none\";\n if (this.isExpanded) {\n // Redraw immediately will be handled by the chart's next render\n }\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateContainerStyle();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * SciPlot Engine - Debug Overlay Plugin\n * \n * Provides performance metrics and debugging information.\n * \n * @module plugins/debug\n */\n\nexport * from \"../../core/debug\";\nimport type { PluginManifest, ChartPlugin, PluginContext, AfterRenderEvent } from \"../types\";\n\nexport interface PluginDebugConfig extends Partial<DebugOverlayOptions> {\n /** Show FPS counter */\n showFPS?: boolean;\n /** Show data stats */\n showDataStats?: boolean;\n}\n\nconst manifestDebug: PluginManifest = {\n name: \"velo-plot-debug\",\n version: \"1.0.0\",\n description: \"Performance monitoring and debugging overlay for velo-plot\",\n provides: [\"ui\"],\n tags: [\"debug\", \"performance\", \"fps\", \"monitoring\"],\n};\n\nimport { DebugOverlay, DebugOverlayOptions } from \"../../core/debug\";\nimport { ChartStatistics } from \"../../core/ChartStatistics\";\n\n/**\n * SciPlot Debug Plugin\n * \n * Adds a useful overlay with real-time performance metrics and debugging info.\n */\nexport function PluginDebug(config: PluginDebugConfig = {}): ChartPlugin<PluginDebugConfig> {\n let overlay: DebugOverlay | null = null;\n let stats: ChartStatistics | null = null;\n\n let ctx: PluginContext;\n\n return {\n manifest: manifestDebug,\n\n onInit(pCtx: PluginContext) {\n ctx = pCtx;\n\n // Initialize FPS/Performance overlay\n if (config.showFPS !== false) {\n overlay = new DebugOverlay(ctx.ui.container, {\n showFps: true,\n showMemory: true,\n showPointCount: true,\n updateInterval: 500,\n ...config\n });\n overlay.show();\n\n // Set stats provider for more detailed info\n overlay.setStatsProvider(() => {\n const series = ctx.data.getAllSeries();\n const pointCount = series.reduce((sum, s) => sum + s.getData().x.length, 0);\n\n return {\n pointCount,\n seriesCount: series.length,\n viewBounds: ctx.data.getViewBounds(),\n devicePixelRatio: (ctx.chart as any).dpr || 1,\n };\n });\n }\n\n // Initialize data statistics panel\n if (config.showDataStats) {\n stats = new ChartStatistics(\n ctx.ui.container,\n (ctx.chart as any).theme,\n (ctx.chart as any).series\n );\n }\n },\n\n onBeforeRender() {\n if (overlay) {\n overlay.recordFrame();\n }\n },\n\n onAfterRender(_ctx, event: AfterRenderEvent) {\n if (overlay) {\n overlay.update({\n frameTime: (event as any).frameTime || event.renderTime,\n });\n }\n },\n\n onRenderOverlay(_ctx) {\n if (stats) {\n stats.update(ctx.data.getViewBounds());\n }\n },\n\n onDestroy(_ctx: PluginContext) {\n if (overlay) {\n overlay.destroy();\n overlay = null;\n }\n if (stats) {\n stats.destroy();\n stats = null;\n }\n }\n };\n}\n\nexport { DebugOverlay };\nexport default PluginDebug;\n"],"names":["DebugOverlay","container","options","__publicField","provider","frameTime","now","stats","providerStats","_a","a","b","lines","fpsColor","info","shortRenderer","n","bytes","v","createDebugOverlay","enableDebugMode","overlay","ChartStatistics","parent","theme","series","title","name","isDark","bg","color","borderColor","shadow","viewBounds","s","data","visibleY","visibleX","i","calculateStats","area","integrate","style","item","manifestDebug","PluginDebug","config","ctx","pCtx","sum","_ctx","event"],"mappings":"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"}
1
+ {"version":3,"file":"debug.js","sources":["../../src/core/debug/index.ts","../../src/core/ChartStatistics.ts","../../src/plugins/debug/index.ts"],"sourcesContent":["/**\n * Velo Plot - Debug Overlay Module\n * \n * Provides a visual debug overlay showing performance metrics,\n * rendering info, and chart state for development and debugging.\n * \n * @module debug\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface DebugStats {\n /** Current frames per second */\n fps: number;\n /** Average frame time in ms */\n frameTime: number;\n /** Total number of points being rendered */\n pointCount: number;\n /** Number of visible series */\n seriesCount: number;\n /** Current view bounds */\n viewBounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n };\n /** WebGL/WebGPU renderer info */\n rendererInfo: {\n type: 'webgl' | 'webgpu' | 'unknown';\n vendor?: string;\n renderer?: string;\n };\n /** Memory usage estimate (bytes) */\n memoryEstimate: number;\n /** Number of draw calls per frame */\n drawCalls: number;\n /** Whether GPU downsampling is active */\n downsamplingActive: boolean;\n /** Device pixel ratio */\n devicePixelRatio: number;\n /** Canvas dimensions */\n canvasSize: { width: number; height: number };\n /** Plot area dimensions */\n plotArea: { x: number; y: number; width: number; height: number };\n}\n\nexport interface DebugOverlayOptions {\n /** Show FPS counter (default: true) */\n showFps?: boolean;\n /** Show point count (default: true) */\n showPointCount?: boolean;\n /** Show view bounds (default: true) */\n showBounds?: boolean;\n /** Show renderer info (default: true) */\n showRendererInfo?: boolean;\n /** Show memory estimate (default: true) */\n showMemory?: boolean;\n /** Show draw calls (default: true) */\n showDrawCalls?: boolean;\n /** Position: 'top-left', 'top-right', 'bottom-left', 'bottom-right' */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n /** Background opacity (0-1, default: 0.8) */\n opacity?: number;\n /** Font size in pixels (default: 11) */\n fontSize?: number;\n /** Update interval in ms (default: 250) */\n updateInterval?: number;\n /** Custom CSS class name */\n className?: string;\n}\n\n// ============================================\n// Debug Overlay Implementation\n// ============================================\n\nexport class DebugOverlay {\n private container: HTMLElement;\n private element: HTMLDivElement | null = null;\n private options: Required<DebugOverlayOptions>;\n private visible: boolean = false;\n private updateIntervalId: number | null = null;\n private statsProvider: (() => Partial<DebugStats>) | null = null;\n private lastStats: Partial<DebugStats> = {};\n\n // FPS calculation\n private frameCount: number = 0;\n private lastFpsUpdate: number = 0;\n private currentFps: number = 0;\n private frameTimes: number[] = [];\n\n constructor(container: HTMLElement, options?: DebugOverlayOptions) {\n this.container = container;\n this.options = {\n showFps: true,\n showPointCount: true,\n showBounds: true,\n showRendererInfo: true,\n showMemory: true,\n showDrawCalls: true,\n position: 'top-left',\n opacity: 0.8,\n fontSize: 11,\n updateInterval: 250,\n className: 'velo-plot-debug-overlay',\n ...options,\n };\n }\n\n /**\n * Set the stats provider function\n */\n setStatsProvider(provider: () => Partial<DebugStats>): void {\n this.statsProvider = provider;\n }\n\n /**\n * Record a frame for FPS calculation\n */\n recordFrame(frameTime?: number): void {\n const now = performance.now();\n this.frameCount++;\n\n if (frameTime !== undefined) {\n this.frameTimes.push(frameTime);\n if (this.frameTimes.length > 60) {\n this.frameTimes.shift();\n }\n }\n\n // Update FPS every second\n if (now - this.lastFpsUpdate >= 1000) {\n this.currentFps = Math.round((this.frameCount * 1000) / (now - this.lastFpsUpdate));\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n }\n\n /**\n * Show the debug overlay\n */\n show(): void {\n if (this.visible) return;\n \n this.visible = true;\n this.createElement();\n this.startUpdates();\n }\n\n /**\n * Hide the debug overlay\n */\n hide(): void {\n if (!this.visible) return;\n \n this.visible = false;\n this.stopUpdates();\n this.destroyElement();\n }\n\n /**\n * Toggle visibility\n */\n toggle(): void {\n if (this.visible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * Check if visible\n */\n isVisible(): boolean {\n return this.visible;\n }\n\n /**\n * Update the display with new stats\n */\n update(stats?: Partial<DebugStats>): void {\n if (!this.visible || !this.element) return;\n\n // Merge with provider stats\n const providerStats = this.statsProvider?.() || {};\n this.lastStats = {\n ...this.lastStats,\n ...providerStats,\n ...stats,\n fps: this.currentFps,\n frameTime: this.getAverageFrameTime(),\n };\n\n this.renderStats();\n }\n\n /**\n * Get current stats\n */\n getStats(): Partial<DebugStats> {\n return {\n ...this.lastStats,\n fps: this.currentFps,\n frameTime: this.getAverageFrameTime(),\n };\n }\n\n /**\n * Destroy the overlay\n */\n destroy(): void {\n this.hide();\n this.statsProvider = null;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private createElement(): void {\n if (this.element) return;\n\n this.element = document.createElement('div');\n this.element.className = this.options.className;\n \n // Apply styles\n Object.assign(this.element.style, {\n position: 'absolute',\n zIndex: '9999',\n fontFamily: 'monospace',\n fontSize: `${this.options.fontSize}px`,\n lineHeight: '1.4',\n padding: '8px 12px',\n backgroundColor: `rgba(0, 0, 0, ${this.options.opacity})`,\n color: '#00ff00',\n borderRadius: '4px',\n pointerEvents: 'none',\n userSelect: 'none',\n whiteSpace: 'pre',\n ...this.getPositionStyles(),\n });\n\n this.container.style.position = 'relative';\n this.container.appendChild(this.element);\n }\n\n private destroyElement(): void {\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n this.element = null;\n }\n\n private getPositionStyles(): Partial<CSSStyleDeclaration> {\n switch (this.options.position) {\n case 'top-right':\n return { top: '8px', right: '8px' };\n case 'bottom-left':\n return { bottom: '8px', left: '8px' };\n case 'bottom-right':\n return { bottom: '8px', right: '8px' };\n case 'top-left':\n default:\n return { top: '8px', left: '8px' };\n }\n }\n\n private startUpdates(): void {\n if (this.updateIntervalId !== null) return;\n \n this.updateIntervalId = window.setInterval(() => {\n this.update();\n }, this.options.updateInterval);\n }\n\n private stopUpdates(): void {\n if (this.updateIntervalId !== null) {\n clearInterval(this.updateIntervalId);\n this.updateIntervalId = null;\n }\n }\n\n private getAverageFrameTime(): number {\n if (this.frameTimes.length === 0) return 0;\n const sum = this.frameTimes.reduce((a, b) => a + b, 0);\n return sum / this.frameTimes.length;\n }\n\n private renderStats(): void {\n if (!this.element) return;\n\n const lines: string[] = [];\n const stats = this.lastStats;\n\n // FPS\n if (this.options.showFps && stats.fps !== undefined) {\n const fpsColor = stats.fps >= 55 ? '#00ff00' : stats.fps >= 30 ? '#ffff00' : '#ff4444';\n lines.push(`<span style=\"color:${fpsColor}\">FPS: ${stats.fps}</span>`);\n if (stats.frameTime) {\n lines.push(`Frame: ${stats.frameTime.toFixed(2)}ms`);\n }\n }\n\n // Point count\n if (this.options.showPointCount && stats.pointCount !== undefined) {\n lines.push(`Points: ${this.formatNumber(stats.pointCount)}`);\n }\n\n // Series count\n if (stats.seriesCount !== undefined) {\n lines.push(`Series: ${stats.seriesCount}`);\n }\n\n // Draw calls\n if (this.options.showDrawCalls && stats.drawCalls !== undefined) {\n lines.push(`Draw calls: ${stats.drawCalls}`);\n }\n\n // Memory\n if (this.options.showMemory && stats.memoryEstimate !== undefined) {\n lines.push(`Memory: ${this.formatBytes(stats.memoryEstimate)}`);\n }\n\n // Bounds\n if (this.options.showBounds && stats.viewBounds) {\n const b = stats.viewBounds;\n lines.push(`X: [${this.formatValue(b.xMin)}, ${this.formatValue(b.xMax)}]`);\n lines.push(`Y: [${this.formatValue(b.yMin)}, ${this.formatValue(b.yMax)}]`);\n }\n\n // Renderer info\n if (this.options.showRendererInfo && stats.rendererInfo) {\n const info = stats.rendererInfo;\n lines.push(`Renderer: ${info.type.toUpperCase()}`);\n if (info.renderer) {\n // Truncate long renderer names\n const shortRenderer = info.renderer.length > 30 \n ? info.renderer.substring(0, 27) + '...'\n : info.renderer;\n lines.push(`GPU: ${shortRenderer}`);\n }\n }\n\n // Canvas size\n if (stats.canvasSize) {\n lines.push(`Canvas: ${stats.canvasSize.width}×${stats.canvasSize.height}`);\n }\n\n // Downsampling\n if (stats.downsamplingActive !== undefined) {\n lines.push(`Downsampling: ${stats.downsamplingActive ? 'ON' : 'OFF'}`);\n }\n\n // DPR\n if (stats.devicePixelRatio !== undefined) {\n lines.push(`DPR: ${stats.devicePixelRatio}`);\n }\n\n this.element.innerHTML = lines.join('\\n');\n }\n\n private formatNumber(n: number): string {\n if (n >= 1e9) return (n / 1e9).toFixed(1) + 'B';\n if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';\n if (n >= 1e3) return (n / 1e3).toFixed(1) + 'K';\n return n.toLocaleString();\n }\n\n private formatBytes(bytes: number): string {\n if (bytes >= 1e9) return (bytes / 1e9).toFixed(2) + ' GB';\n if (bytes >= 1e6) return (bytes / 1e6).toFixed(2) + ' MB';\n if (bytes >= 1e3) return (bytes / 1e3).toFixed(2) + ' KB';\n return bytes + ' B';\n }\n\n private formatValue(v: number): string {\n if (!isFinite(v)) return v.toString();\n if (Math.abs(v) >= 1e6 || (Math.abs(v) < 0.001 && v !== 0)) {\n return v.toExponential(2);\n }\n return v.toFixed(3);\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\n/**\n * Create a debug overlay for a chart container\n */\nexport function createDebugOverlay(\n container: HTMLElement,\n options?: DebugOverlayOptions\n): DebugOverlay {\n return new DebugOverlay(container, options);\n}\n\n/**\n * Quick enable debug mode (attaches to first chart container found)\n */\nexport function enableDebugMode(options?: DebugOverlayOptions): DebugOverlay | null {\n const container = document.querySelector('.velo-plot-container') as HTMLElement;\n if (!container) {\n console.warn('[VeloPlot] No chart container found for debug overlay');\n return null;\n }\n \n const overlay = new DebugOverlay(container, options);\n overlay.show();\n return overlay;\n}\n","/**\n * ChartStatistics - In-chart statistics panel\n */\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\nimport { Bounds } from \"../types\";\n\nexport class ChartStatistics {\n private container: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Map<string, Series>;\n private isExpanded = false;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n series: Map<string, Series>\n ) {\n this.theme = theme;\n this.series = series;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"velo-plot-stats-panel\";\n this.updateContainerStyle();\n\n const title = document.createElement(\"div\");\n title.innerHTML = \"📊 Statistics\";\n title.style.cssText = `\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n `;\n title.onclick = () => this.toggle();\n\n this.content = document.createElement(\"div\");\n this.content.style.display = \"none\";\n \n this.container.appendChild(title);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return name.includes(\"dark\") || name.includes(\"midnight\") || name.includes(\"electro\");\n }\n\n private updateContainerStyle(): void {\n const isDark = this.isDarkTheme();\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const color = isDark ? \"#f1f5f9\" : \"#1e293b\";\n const borderColor = isDark ? \"rgba(255, 255, 255, 0.1)\" : \"rgba(0, 0, 0, 0.1)\";\n const shadow = isDark ? \"0 4px 12px rgba(0, 0, 0, 0.5)\" : \"0 4px 12px rgba(0, 0, 0, 0.1)\";\n\n this.container.style.cssText = `\n position: absolute;\n bottom: 8px;\n right: 8px;\n width: 240px;\n background: ${bg};\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n color: ${color};\n font-family: system-ui, -apple-system, sans-serif;\n padding: 8px 12px;\n z-index: 90;\n transition: all 0.3s ease;\n font-size: 12px;\n pointer-events: auto;\n `;\n }\n\n public async update(viewBounds: Bounds): Promise<void> {\n if (!this.isExpanded) return;\n\n const { calculateStats, integrate } = await import(\"../plugins/analysis\");\n this.content.innerHTML = \"\";\n \n this.series.forEach((s) => {\n if (!s.getVisible()) return;\n\n const data = s.getData();\n if (!data) return;\n\n const visibleY: number[] = [];\n const visibleX: number[] = [];\n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] >= viewBounds.xMin && data.x[i] <= viewBounds.xMax) {\n visibleX.push(data.x[i]);\n visibleY.push(data.y[i]);\n }\n }\n\n if (visibleY.length === 0) return;\n\n const stats = calculateStats(visibleY);\n const area = integrate(visibleX as any, visibleY as any);\n const style = s.getStyle();\n\n const item = document.createElement(\"div\");\n item.style.cssText = `\n padding: 8px 0;\n border-top: 1px solid ${this.isDarkTheme() ? \"rgba(255,255,255,0.05)\" : \"rgba(0,0,0,0.05)\"};\n `;\n\n item.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 4px; font-weight: 600;\">\n <div style=\"width: 8px; height: 8px; border-radius: 2px; background: ${style.color}\"></div>\n ${s.getId()}\n </div>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0.9; font-size: 11px;\">\n <span>Min: ${stats.min.toExponential(3)}</span>\n <span>Max: ${stats.max.toExponential(3)}</span>\n <span>Mean: ${stats.mean.toExponential(3)}</span>\n <span>Count: ${stats.count}</span>\n <span style=\"grid-column: span 2;\">Area: ${area.toExponential(4)}</span>\n </div>\n `;\n\n this.content.appendChild(item);\n });\n\n if (this.content.innerHTML === \"\") {\n this.content.innerHTML = \"<div style='opacity: 0.5; font-style: italic;'>No series visible in range</div>\";\n }\n }\n\n public toggle(): void {\n this.isExpanded = !this.isExpanded;\n this.content.style.display = this.isExpanded ? \"block\" : \"none\";\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateContainerStyle();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * VeloPlot Engine - Debug Overlay Plugin\n * \n * Provides performance metrics and debugging information.\n * \n * @module plugins/debug\n */\n\nexport * from \"../../core/debug\";\nimport type { PluginManifest, ChartPlugin, PluginContext, AfterRenderEvent } from \"../types\";\n\nexport interface PluginDebugConfig extends Partial<DebugOverlayOptions> {\n /** Show FPS counter */\n showFPS?: boolean;\n /** Show data stats */\n showDataStats?: boolean;\n}\n\nconst manifestDebug: PluginManifest = {\n name: \"velo-plot-debug\",\n version: \"1.0.0\",\n description: \"Performance monitoring and debugging overlay for velo-plot\",\n provides: [\"ui\"],\n tags: [\"debug\", \"performance\", \"fps\", \"monitoring\"],\n};\n\nimport { DebugOverlay, DebugOverlayOptions } from \"../../core/debug\";\nimport { ChartStatistics } from \"../../core/ChartStatistics\";\n\n/**\n * VeloPlot Debug Plugin\n * \n * Adds a useful overlay with real-time performance metrics and debugging info.\n */\nexport function PluginDebug(config: PluginDebugConfig = {}): ChartPlugin<PluginDebugConfig> {\n let overlay: DebugOverlay | null = null;\n let stats: ChartStatistics | null = null;\n\n let ctx: PluginContext;\n\n return {\n manifest: manifestDebug,\n\n onInit(pCtx: PluginContext) {\n ctx = pCtx;\n\n // Initialize FPS/Performance overlay\n if (config.showFPS !== false) {\n overlay = new DebugOverlay(ctx.ui.container, {\n showFps: true,\n showMemory: true,\n showPointCount: true,\n updateInterval: 500,\n ...config\n });\n overlay.show();\n\n // Set stats provider for more detailed info\n overlay.setStatsProvider(() => {\n const series = ctx.data.getAllSeries();\n const pointCount = series.reduce((sum, s) => sum + s.getData().x.length, 0);\n\n return {\n pointCount,\n seriesCount: series.length,\n viewBounds: ctx.data.getViewBounds(),\n devicePixelRatio: (ctx.chart as any).dpr || 1,\n };\n });\n }\n\n // Initialize data statistics panel\n if (config.showDataStats) {\n stats = new ChartStatistics(\n ctx.ui.container,\n (ctx.chart as any).theme,\n (ctx.chart as any).series\n );\n }\n },\n\n onBeforeRender() {\n if (overlay) {\n overlay.recordFrame();\n }\n },\n\n onAfterRender(_ctx, event: AfterRenderEvent) {\n if (overlay) {\n overlay.update({\n frameTime: (event as any).frameTime || event.renderTime,\n });\n }\n },\n\n onRenderOverlay(_ctx) {\n if (stats) {\n stats.update(ctx.data.getViewBounds());\n }\n },\n\n onDestroy(_ctx: PluginContext) {\n if (overlay) {\n overlay.destroy();\n overlay = null;\n }\n if (stats) {\n stats.destroy();\n stats = null;\n }\n }\n };\n}\n\nexport { DebugOverlay };\nexport default PluginDebug;\n"],"names":["DebugOverlay","container","options","__publicField","provider","frameTime","now","stats","_a","providerStats","a","b","lines","fpsColor","info","shortRenderer","n","bytes","v","createDebugOverlay","enableDebugMode","overlay","ChartStatistics","parent","theme","series","title","name","isDark","bg","color","borderColor","shadow","viewBounds","calculateStats","integrate","data","visibleY","visibleX","i","area","style","item","manifestDebug","PluginDebug","config","ctx","pCtx","sum","s","_ctx","event"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { PluginManifest, ChartPlugin } from '../types';
3
3
 
4
4
  declare const manifestForecasting: PluginManifest;
5
5
  /**
6
- * Forecasting Plugin for Sci Plot
6
+ * Forecasting Plugin for Velo Plot
7
7
  */
8
8
  export declare function PluginForecasting(config?: Partial<PluginForecastingConfig>): ChartPlugin<PluginForecastingConfig>;
9
9
  export * from './types';
@@ -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 * Sci 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 Sci 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 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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"}