velo-plot 1.12.0 → 1.19.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 (153) hide show
  1. package/README.md +14 -0
  2. package/dist/{index.core-xiNcuFfJ.js → ChartCore-DQ691eXH.js} +1807 -1287
  3. package/dist/ChartCore-DQ691eXH.js.map +1 -0
  4. package/dist/assets/downsample.worker-C70QJ04y.js +2 -0
  5. package/dist/assets/downsample.worker-C70QJ04y.js.map +1 -0
  6. package/dist/assets/indicator.worker-bv0zC4EX.js +2 -0
  7. package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -0
  8. package/dist/core/OverlayRenderer.d.ts +2 -0
  9. package/dist/core/chart/ChartAlerts.d.ts +42 -0
  10. package/dist/core/chart/ChartCore.d.ts +20 -1
  11. package/dist/core/chart/ChartRenderLoop.d.ts +4 -2
  12. package/dist/core/chart/ChartRenderer.d.ts +3 -2
  13. package/dist/core/chart/candlestickMarkers.d.ts +23 -0
  14. package/dist/core/chart/exporter/SVGExporter.d.ts +7 -2
  15. package/dist/core/chart/heikinAshi.d.ts +10 -0
  16. package/dist/core/chart/series/types.d.ts +2 -2
  17. package/dist/core/chart/types.d.ts +9 -0
  18. package/dist/core/indicator/addIndicator.d.ts +36 -0
  19. package/dist/core/indicator/index.d.ts +2 -0
  20. package/dist/core/indicator/indicatorPresets.d.ts +37 -0
  21. package/dist/core/render/pixelSnap.d.ts +8 -0
  22. package/dist/core/series/Series.d.ts +3 -0
  23. package/dist/core/stacked/index.d.ts +3 -1
  24. package/dist/core/stacked/paneResize.d.ts +15 -18
  25. package/dist/core/stacked/stackExport.d.ts +18 -0
  26. package/dist/core/stacked/types.d.ts +42 -5
  27. package/dist/core/time/TimeScale.d.ts +31 -0
  28. package/dist/createStackedChart-BPooTQ9z.js +1164 -0
  29. package/dist/createStackedChart-BPooTQ9z.js.map +1 -0
  30. package/dist/gpu/adapter/gpuRenderer.d.ts +21 -0
  31. package/dist/gpu/backends/webgpu/WebGPUBackend.d.ts +2 -1
  32. package/dist/gpuRenderer-BpaMYz-k.js +1848 -0
  33. package/dist/gpuRenderer-BpaMYz-k.js.map +1 -0
  34. package/dist/index-CUGS98p4.js +277 -0
  35. package/dist/index-CUGS98p4.js.map +1 -0
  36. package/dist/index-D7dTq6VB.js +503 -0
  37. package/dist/index-D7dTq6VB.js.map +1 -0
  38. package/dist/{index-Ce2JgkH_.js → index-DoYxf1cV.js} +86 -43
  39. package/dist/{index-Ce2JgkH_.js.map → index-DoYxf1cV.js.map} +1 -1
  40. package/dist/index.core-BtGFYMOu.js +167 -0
  41. package/dist/index.core-BtGFYMOu.js.map +1 -0
  42. package/dist/index.d.ts +12 -4
  43. package/dist/indicators--eJGmVox.js +302 -0
  44. package/dist/indicators--eJGmVox.js.map +1 -0
  45. package/dist/math-Ddm2EZjj.js +85 -0
  46. package/dist/math-Ddm2EZjj.js.map +1 -0
  47. package/dist/plugins/analysis.js +543 -818
  48. package/dist/plugins/analysis.js.map +1 -1
  49. package/dist/plugins/anomaly-detection.d.ts +1 -0
  50. package/dist/plugins/anomaly-detection.js +221 -0
  51. package/dist/plugins/anomaly-detection.js.map +1 -0
  52. package/dist/plugins/broken-axis.d.ts +3 -0
  53. package/dist/plugins/broken-axis.js +262 -0
  54. package/dist/plugins/broken-axis.js.map +1 -0
  55. package/dist/plugins/caching.d.ts +3 -0
  56. package/dist/plugins/caching.js +187 -0
  57. package/dist/plugins/caching.js.map +1 -0
  58. package/dist/plugins/data-transform.d.ts +3 -0
  59. package/dist/plugins/data-transform.js +146 -0
  60. package/dist/plugins/data-transform.js.map +1 -0
  61. package/dist/plugins/debug.js +12 -11
  62. package/dist/plugins/debug.js.map +1 -1
  63. package/dist/plugins/drawing-tools/index.d.ts +16 -0
  64. package/dist/plugins/forecasting.d.ts +1 -0
  65. package/dist/plugins/forecasting.js +236 -0
  66. package/dist/plugins/forecasting.js.map +1 -0
  67. package/dist/plugins/gpu.js +202 -1895
  68. package/dist/plugins/gpu.js.map +1 -1
  69. package/dist/plugins/index.d.ts +2 -0
  70. package/dist/plugins/keyboard/index.d.ts +1 -7
  71. package/dist/plugins/keyboard.js +1 -1
  72. package/dist/plugins/latex.d.ts +1 -0
  73. package/dist/plugins/latex.js +454 -0
  74. package/dist/plugins/latex.js.map +1 -0
  75. package/dist/plugins/lazy-load/types.d.ts +7 -0
  76. package/dist/plugins/lazy-load.d.ts +3 -0
  77. package/dist/plugins/lazy-load.js +212 -0
  78. package/dist/plugins/lazy-load.js.map +1 -0
  79. package/dist/plugins/ml-integration.d.ts +3 -0
  80. package/dist/plugins/ml-integration.js +355 -0
  81. package/dist/plugins/ml-integration.js.map +1 -0
  82. package/dist/plugins/offscreen.d.ts +3 -0
  83. package/dist/plugins/offscreen.js +169 -0
  84. package/dist/plugins/offscreen.js.map +1 -0
  85. package/dist/plugins/pattern-recognition.d.ts +3 -0
  86. package/dist/plugins/pattern-recognition.js +690 -0
  87. package/dist/plugins/pattern-recognition.js.map +1 -0
  88. package/dist/plugins/radar.d.ts +3 -0
  89. package/dist/plugins/radar.js +103 -0
  90. package/dist/plugins/radar.js.map +1 -0
  91. package/dist/plugins/regression.d.ts +3 -0
  92. package/dist/plugins/regression.js +634 -0
  93. package/dist/plugins/regression.js.map +1 -0
  94. package/dist/plugins/replay/index.d.ts +19 -0
  95. package/dist/plugins/roi.d.ts +1 -0
  96. package/dist/plugins/roi.js +223 -0
  97. package/dist/plugins/roi.js.map +1 -0
  98. package/dist/plugins/snapshot/types.d.ts +1 -1
  99. package/dist/plugins/snapshot.d.ts +3 -0
  100. package/dist/plugins/snapshot.js +90 -0
  101. package/dist/plugins/snapshot.js.map +1 -0
  102. package/dist/plugins/sync/index.d.ts +2 -1
  103. package/dist/plugins/sync.js +13 -269
  104. package/dist/plugins/sync.js.map +1 -1
  105. package/dist/plugins/video-recorder.d.ts +3 -0
  106. package/dist/plugins/video-recorder.js +104 -0
  107. package/dist/plugins/video-recorder.js.map +1 -0
  108. package/dist/plugins/virtualization/types.d.ts +12 -0
  109. package/dist/plugins/virtualization.d.ts +3 -0
  110. package/dist/plugins/virtualization.js +6 -0
  111. package/dist/plugins/virtualization.js.map +1 -0
  112. package/dist/pool-15HMCNv8.js +88 -0
  113. package/dist/pool-15HMCNv8.js.map +1 -0
  114. package/dist/react.d.ts +1 -0
  115. package/dist/react.js +31 -0
  116. package/dist/react.js.map +1 -0
  117. package/dist/renderer/CandlestickRenderer.d.ts +1 -1
  118. package/dist/renderer/ChartSeriesRenderer.d.ts +6 -0
  119. package/dist/renderer/GpuChartRenderer.d.ts +23 -0
  120. package/dist/renderer/index.d.ts +3 -0
  121. package/dist/renderer/spike/WebGLGridSpike.d.ts +40 -0
  122. package/dist/testing/baselines/v1.15.0.json.d.ts +51 -0
  123. package/dist/testing/gridSpikeBenchmark.d.ts +49 -0
  124. package/dist/testing/index.d.ts +5 -0
  125. package/dist/testing/rendererBenchmark.d.ts +13 -0
  126. package/dist/testing/stage1BrowserBench.d.ts +42 -0
  127. package/dist/types.d.ts +21 -1
  128. package/dist/utils-BK5UUXxj.js +172 -0
  129. package/dist/utils-BK5UUXxj.js.map +1 -0
  130. package/dist/velo-plot.full.js +1382 -5932
  131. package/dist/velo-plot.full.js.map +1 -1
  132. package/dist/velo-plot.js +26 -25
  133. package/dist/velo-plot.js.map +1 -1
  134. package/dist/workers/downsample.d.ts +38 -0
  135. package/dist/workers/downsampleAsync.d.ts +6 -0
  136. package/dist/workers/indicator.worker.d.ts +32 -0
  137. package/dist/workers/indicatorsAsync.d.ts +26 -0
  138. package/dist/workers/pool.d.ts +36 -0
  139. package/package.json +19 -2
  140. package/dist/core/OverlayRenderer.test.d.ts +0 -1
  141. package/dist/core/chart/ChartScaling.test.d.ts +0 -1
  142. package/dist/core/chart/NavigationUtils.test.d.ts +0 -1
  143. package/dist/core/format/axisFormat.test.d.ts +0 -1
  144. package/dist/core/indicator/buildIndicatorSeries.test.d.ts +0 -1
  145. package/dist/core/series/SeriesBounds.test.d.ts +0 -1
  146. package/dist/core/stacked/createStackedChart.test.d.ts +0 -1
  147. package/dist/core/stacked/paneAxis.test.d.ts +0 -1
  148. package/dist/core/stacked/paneResize.test.d.ts +0 -1
  149. package/dist/core/sync/index.test.d.ts +0 -1
  150. package/dist/index.core-xiNcuFfJ.js.map +0 -1
  151. package/dist/plugins/tools/tooltip/format.test.d.ts +0 -1
  152. package/dist/utils-Dbro9-qM.js +0 -254
  153. package/dist/utils-Dbro9-qM.js.map +0 -1
@@ -0,0 +1,236 @@
1
+ function p(n, s, r, o, l = {}) {
2
+ const t = n.length;
3
+ if (t === 0) throw new Error("Dataset is empty");
4
+ const c = t > 1 ? (n[t - 1] - n[0]) / (t - 1) : 1, a = n[t - 1];
5
+ let e;
6
+ switch (r) {
7
+ case "sma":
8
+ e = L(s, o, l.windowSize || 10);
9
+ break;
10
+ case "ema":
11
+ e = W(s, o, l.alpha || 0.3);
12
+ break;
13
+ case "linear":
14
+ e = F(n, s, o);
15
+ break;
16
+ case "expSmoothing":
17
+ e = x(s, o, l.alpha || 0.3);
18
+ break;
19
+ case "holt":
20
+ e = k(s, o, l.alpha || 0.3, l.beta || 0.1);
21
+ break;
22
+ case "wma":
23
+ e = E(s, o, l.windowSize || 10);
24
+ break;
25
+ case "holtWinters":
26
+ e = C(
27
+ s,
28
+ o,
29
+ l.period || 12,
30
+ l.alpha || 0.3,
31
+ l.beta || 0.1,
32
+ l.gamma || 0.1
33
+ );
34
+ break;
35
+ default:
36
+ throw new Error(`Method ${r} not implemented yet`);
37
+ }
38
+ const u = new Array(o);
39
+ for (let w = 0; w < o; w++)
40
+ u[w] = a + (w + 1) * c;
41
+ return {
42
+ xValues: u,
43
+ yValues: e.yValues,
44
+ lowerBound: e.lower,
45
+ upperBound: e.upper,
46
+ method: r,
47
+ metadata: Y(s, e.yValues)
48
+ // Simplified for now
49
+ };
50
+ }
51
+ function E(n, s, r) {
52
+ const o = n.length, l = Math.min(r, o);
53
+ let t = 0, c = 0;
54
+ for (let e = 0; e < l; e++) {
55
+ const u = e + 1;
56
+ t += n[o - l + e] * u, c += u;
57
+ }
58
+ const a = t / c;
59
+ return { yValues: new Array(s).fill(a) };
60
+ }
61
+ function L(n, s, r) {
62
+ const o = n.length, l = Math.min(r, o);
63
+ let t = 0;
64
+ for (let a = o - l; a < o; a++)
65
+ t += n[a];
66
+ const c = t / l;
67
+ return {
68
+ yValues: new Array(s).fill(c)
69
+ };
70
+ }
71
+ function W(n, s, r) {
72
+ const o = n.length;
73
+ let l = n[0];
74
+ for (let t = 1; t < o; t++)
75
+ l = r * n[t] + (1 - r) * l;
76
+ return {
77
+ yValues: new Array(s).fill(l)
78
+ };
79
+ }
80
+ function F(n, s, r) {
81
+ const o = n.length;
82
+ let l = 0, t = 0, c = 0, a = 0;
83
+ for (let f = 0; f < o; f++)
84
+ l += n[f], t += s[f], c += n[f] * s[f], a += n[f] * n[f];
85
+ const e = (o * c - l * t) / (o * a - l * l), u = (t - e * l) / o, w = n[o - 1], h = o > 1 ? (n[o - 1] - n[0]) / (o - 1) : 1, i = new Array(r);
86
+ for (let f = 0; f < r; f++) {
87
+ const g = w + (f + 1) * h;
88
+ i[f] = e * g + u;
89
+ }
90
+ return { yValues: i };
91
+ }
92
+ function x(n, s, r) {
93
+ const o = n.length;
94
+ let l = n[0];
95
+ for (let t = 1; t < o; t++)
96
+ l = r * n[t] + (1 - r) * l;
97
+ return {
98
+ yValues: new Array(s).fill(l)
99
+ };
100
+ }
101
+ function k(n, s, r, o) {
102
+ const l = n.length;
103
+ if (l < 2) return { yValues: new Array(s).fill(n[0] || 0) };
104
+ let t = n[0], c = n[1] - n[0];
105
+ for (let e = 1; e < l; e++) {
106
+ const u = t;
107
+ t = r * n[e] + (1 - r) * (t + c), c = o * (t - u) + (1 - o) * c;
108
+ }
109
+ const a = new Array(s);
110
+ for (let e = 0; e < s; e++)
111
+ a[e] = t + (e + 1) * c;
112
+ return { yValues: a };
113
+ }
114
+ function C(n, s, r, o, l, t) {
115
+ const c = n.length;
116
+ if (c < r * 2)
117
+ return k(n, s, o, l);
118
+ const a = new Array(r), e = new Array(Math.floor(c / r));
119
+ for (let i = 0; i < e.length; i++) {
120
+ let f = 0;
121
+ for (let g = 0; g < r; g++)
122
+ f += n[i * r + g];
123
+ e[i] = f / r;
124
+ }
125
+ for (let i = 0; i < r; i++) {
126
+ let f = 0;
127
+ for (let g = 0; g < e.length; g++)
128
+ f += n[g * r + i] - e[g];
129
+ a[i] = f / e.length;
130
+ }
131
+ let u = e[0], w = (e[e.length - 1] - e[0]) / ((e.length - 1) * r);
132
+ for (let i = 0; i < c; i++) {
133
+ const f = u, g = n[i];
134
+ u = o * (g - a[i % r]) + (1 - o) * (u + w), w = l * (u - f) + (1 - l) * w, a[i % r] = t * (g - u) + (1 - t) * a[i % r];
135
+ }
136
+ const h = new Array(s);
137
+ for (let i = 0; i < s; i++) {
138
+ const f = i + 1;
139
+ h[i] = u + f * w + a[(c + i) % r];
140
+ }
141
+ return { yValues: h };
142
+ }
143
+ function Y(n, s) {
144
+ return {
145
+ mse: 0,
146
+ mae: 0,
147
+ r2: 1
148
+ };
149
+ }
150
+ const B = {
151
+ name: "velo-plot-forecasting",
152
+ version: "1.0.0",
153
+ description: "Time series forecasting for velo-plot",
154
+ provides: ["analysis", "forecasting"],
155
+ tags: ["statistics", "forecasting", "analysis"]
156
+ };
157
+ function D(n = {}) {
158
+ let s = null;
159
+ const r = /* @__PURE__ */ new Map(), o = {
160
+ forecast(t, c) {
161
+ let a, e;
162
+ if (Array.isArray(t))
163
+ e = t, a = t.map((u, w) => w);
164
+ else if (t.x && t.y)
165
+ a = t.x, e = t.y;
166
+ else
167
+ throw new Error("Invalid data format for forecasting");
168
+ return p(a, e, c.method, c.horizon, c.params);
169
+ },
170
+ async forecastSeries(t, c) {
171
+ if (!s) throw new Error("Plugin not initialized");
172
+ const a = s.data.getAllSeries().find((u) => u.getId() === t);
173
+ if (!a) throw new Error(`Series not found: ${t}`);
174
+ const e = a.getData();
175
+ return this.forecast(e, c);
176
+ },
177
+ visualize(t, c = {}) {
178
+ const a = `forecast-${Math.random().toString(36).substr(2, 9)}`, e = {
179
+ showLine: !0,
180
+ showConfidenceInterval: !0,
181
+ ...n.defaultVisualization,
182
+ ...c
183
+ };
184
+ return r.set(a, { result: t, config: e }), s == null || s.requestRender(), a;
185
+ },
186
+ clear(t) {
187
+ t ? r.delete(t) : r.clear(), s == null || s.requestRender();
188
+ }
189
+ };
190
+ function l(t) {
191
+ const { render: c, coords: a } = t, { ctx2d: e } = c;
192
+ e && r.forEach((u) => {
193
+ var V, T, b, M, P, X;
194
+ const { result: w, config: h } = u, { xValues: i, yValues: f, lowerBound: g, upperBound: A } = w;
195
+ if (e.save(), h.showConfidenceInterval && g && A) {
196
+ e.beginPath();
197
+ const v = ((V = h.intervalStyle) == null ? void 0 : V.opacity) ?? 0.15, m = ((T = h.intervalStyle) == null ? void 0 : T.fillColor) || ((b = h.lineStyle) == null ? void 0 : b.color) || "#3b82f6";
198
+ e.fillStyle = m.startsWith("rgba") ? m : m + Math.floor(v * 255).toString(16).padStart(2, "0");
199
+ for (let d = 0; d < i.length; d++) {
200
+ const y = a.dataToPixelX(i[d]), S = a.dataToPixelY(A[d]);
201
+ d === 0 ? e.moveTo(y, S) : e.lineTo(y, S);
202
+ }
203
+ for (let d = i.length - 1; d >= 0; d--) {
204
+ const y = a.dataToPixelX(i[d]), S = a.dataToPixelY(g[d]);
205
+ e.lineTo(y, S);
206
+ }
207
+ e.closePath(), e.fill();
208
+ }
209
+ if (h.showLine) {
210
+ e.beginPath(), e.strokeStyle = ((M = h.lineStyle) == null ? void 0 : M.color) || "#3b82f6", e.lineWidth = ((P = h.lineStyle) == null ? void 0 : P.width) || 2, (X = h.lineStyle) != null && X.dash ? e.setLineDash(h.lineStyle.dash) : e.setLineDash([5, 5]);
211
+ for (let v = 0; v < i.length; v++) {
212
+ const m = a.dataToPixelX(i[v]), d = a.dataToPixelY(f[v]);
213
+ v === 0 ? e.moveTo(m, d) : e.lineTo(m, d);
214
+ }
215
+ e.stroke();
216
+ }
217
+ e.restore();
218
+ });
219
+ }
220
+ return {
221
+ manifest: B,
222
+ onInit(t) {
223
+ s = t;
224
+ },
225
+ onRenderOverlay(t, c) {
226
+ l(t);
227
+ },
228
+ api: o
229
+ };
230
+ }
231
+ export {
232
+ D as PluginForecasting,
233
+ p as calculateForecast,
234
+ B as manifestForecasting
235
+ };
236
+ //# sourceMappingURL=forecasting.js.map
@@ -0,0 +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\nimport type { ForecastingMethod, ForecastingParams, ForecastingResult } from './types';\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): ForecastingResult {\n const n = x.length;\n if (n === 0) throw new Error(\"Dataset is empty\");\n\n // Determine time step (assuming regular intervals)\n const dt = n > 1 ? (x[n - 1] - x[0]) / (n - 1) : 1;\n const lastX = x[n - 1];\n\n let result: { yValues: number[], lower?: number[], upper?: number[] };\n\n switch (method) {\n case 'sma':\n result = forecastSMA(y, horizon, params.windowSize || 10);\n break;\n case 'ema':\n result = forecastEMA(y, horizon, params.alpha || 0.3);\n break;\n case 'linear':\n result = forecastLinear(x, y, horizon);\n break;\n case 'expSmoothing':\n result = forecastSimpleExpSmoothing(y, horizon, params.alpha || 0.3);\n break;\n case 'holt':\n result = forecastHolt(y, horizon, params.alpha || 0.3, params.beta || 0.1);\n break;\n case 'wma':\n result = forecastWMA(y, horizon, params.windowSize || 10);\n break;\n case 'holtWinters':\n result = forecastHoltWinters(\n y, \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 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 return {\n xValues: futureX,\n yValues: result.yValues,\n lowerBound: result.lower,\n upperBound: result.upper,\n method,\n metadata: calculateFitMetrics(y, result.yValues) // Simplified for now\n };\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[] | Float64Array | Float32Array, horizon: number, window: number) {\n const n = y.length;\n const effectiveWindow = Math.min(window, n);\n let weightedSum = 0;\n let weightTotal = 0;\n for (let i = 0; i < effectiveWindow; i++) {\n const weight = i + 1;\n weightedSum += y[n - effectiveWindow + i] * weight;\n weightTotal += weight;\n }\n const wma = weightedSum / weightTotal;\n return { yValues: new Array(horizon).fill(wma) };\n}\n\n/**\n * Simple Moving Average (SMA)\n * Historical SMA used for projection (flat line at last average)\n */\nfunction forecastSMA(y: number[] | Float64Array | Float32Array, horizon: number, window: number) {\n const n = y.length;\n const effectiveWindow = Math.min(window, n);\n \n let sum = 0;\n for (let i = n - effectiveWindow; i < n; i++) {\n sum += y[i];\n }\n const avg = sum / effectiveWindow;\n\n // SMA projection is usually a flat line unless we slide the window (which requires predictions)\n return {\n yValues: new Array(horizon).fill(avg)\n };\n}\n\n/**\n * Exponential Moving Average (EMA)\n */\nfunction forecastEMA(y: number[] | Float64Array | Float32Array, horizon: number, alpha: number) {\n const n = y.length;\n let ema = y[0];\n \n for (let i = 1; i < n; i++) {\n ema = alpha * y[i] + (1 - alpha) * ema;\n }\n\n return {\n yValues: new Array(horizon).fill(ema)\n };\n}\n\n/**\n * Linear Trend Projection\n * Fits y = mx + b to the historical data\n */\nfunction forecastLinear(x: any, y: any, horizon: number) {\n const n = x.length;\n let sumX = 0, sumY = 0, sumXY = 0, 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 slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\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\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 };\n}\n\n/**\n * Simple Exponential Smoothing (SES)\n */\nfunction forecastSimpleExpSmoothing(y: any, horizon: number, alpha: number) {\n const n = y.length;\n let level = y[0];\n \n for (let i = 1; i < n; i++) {\n level = alpha * y[i] + (1 - alpha) * level;\n }\n\n return {\n yValues: new Array(horizon).fill(level)\n };\n}\n\n/**\n * Holt's Linear Trend (Double Exponential Smoothing)\n */\nfunction forecastHolt(y: any, horizon: number, alpha: number, beta: number) {\n const n = y.length;\n if (n < 2) return { yValues: new Array(horizon).fill(y[0] || 0) };\n\n let level = y[0];\n let trend = y[1] - y[0];\n\n for (let i = 1; i < n; i++) {\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++) {\n yValues[i] = level + (i + 1) * trend;\n }\n\n return { yValues };\n}\n\n/**\n * Holt-Winters (Triple Exponential Smoothing)\n */\nfunction forecastHoltWinters(y: any, horizon: number, period: number, alpha: number, beta: number, gamma: number) {\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++) {\n sum += y[i * period + j];\n }\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 = (seasonAverages[seasonAverages.length - 1] - seasonAverages[0]) / ((seasonAverages.length - 1) * period);\n\n // 3. Update coefficients\n for (let i = 0; i < n; i++) {\n const lastLevel = level;\n const val = y[i];\n level = alpha * (val - seasonals[i % period]) + (1 - alpha) * (level + trend);\n trend = beta * (level - lastLevel) + (1 - beta) * trend;\n seasonals[i % period] = gamma * (val - level) + (1 - gamma) * seasonals[i % period];\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 };\n}\n\n/**\n * Calculate common error metrics\n */\nfunction calculateFitMetrics(_historical: any, _forecast: number[]) {\n // This is a simplified placeholder\n // Real metrics should compare historical with a \"back-forecast\"\n return {\n mse: 0,\n mae: 0,\n r2: 1\n };\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 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);\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":["calculateForecast","x","y","method","horizon","params","n","dt","lastX","result","forecastSMA","forecastEMA","forecastLinear","forecastSimpleExpSmoothing","forecastHolt","forecastWMA","forecastHoltWinters","futureX","i","calculateFitMetrics","window","effectiveWindow","weightedSum","weightTotal","weight","wma","sum","avg","alpha","ema","sumX","sumY","sumXY","sumXX","slope","intercept","yValues","nextX","level","beta","trend","lastLevel","period","gamma","seasonals","seasonAverages","j","sumOverAvg","val","m","_historical","_forecast","manifestForecasting","PluginForecasting","config","ctx","activeForecasts","api","data","options","_","seriesId","series","s","vizConfig","id","mergedConfig","drawForecasts","pCtx","render","coords","ctx2d","viz","_a","_b","_c","_d","_e","_f","xValues","lowerBound","upperBound","opacity","color","px","py","c","_event"],"mappings":"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"}