velo-plot 1.12.0 → 1.15.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 (101) hide show
  1. package/README.md +14 -0
  2. package/dist/{index.core-xiNcuFfJ.js → ChartCore-BimVvUEg.js} +922 -929
  3. package/dist/ChartCore-BimVvUEg.js.map +1 -0
  4. package/dist/core/chart/ChartCore.d.ts +1 -0
  5. package/dist/core/chart/exporter/SVGExporter.d.ts +7 -2
  6. package/dist/core/chart/types.d.ts +2 -0
  7. package/dist/core/render/pixelSnap.d.ts +8 -0
  8. package/dist/core/stacked/index.d.ts +3 -1
  9. package/dist/core/stacked/paneResize.d.ts +15 -18
  10. package/dist/core/stacked/stackExport.d.ts +18 -0
  11. package/dist/core/stacked/types.d.ts +34 -5
  12. package/dist/createStackedChart-CjsKcOvX.js +1088 -0
  13. package/dist/createStackedChart-CjsKcOvX.js.map +1 -0
  14. package/dist/index-CUGS98p4.js +277 -0
  15. package/dist/index-CUGS98p4.js.map +1 -0
  16. package/dist/index-ChgIdk3N.js +229 -0
  17. package/dist/index-ChgIdk3N.js.map +1 -0
  18. package/dist/index.core-C_-CFftD.js +167 -0
  19. package/dist/index.core-C_-CFftD.js.map +1 -0
  20. package/dist/math-Ddm2EZjj.js +85 -0
  21. package/dist/math-Ddm2EZjj.js.map +1 -0
  22. package/dist/plugins/analysis.js +132 -130
  23. package/dist/plugins/analysis.js.map +1 -1
  24. package/dist/plugins/anomaly-detection.d.ts +1 -0
  25. package/dist/plugins/anomaly-detection.js +221 -0
  26. package/dist/plugins/anomaly-detection.js.map +1 -0
  27. package/dist/plugins/broken-axis.d.ts +3 -0
  28. package/dist/plugins/broken-axis.js +262 -0
  29. package/dist/plugins/broken-axis.js.map +1 -0
  30. package/dist/plugins/caching.d.ts +3 -0
  31. package/dist/plugins/caching.js +182 -0
  32. package/dist/plugins/caching.js.map +1 -0
  33. package/dist/plugins/data-transform.d.ts +3 -0
  34. package/dist/plugins/data-transform.js +146 -0
  35. package/dist/plugins/data-transform.js.map +1 -0
  36. package/dist/plugins/debug.js +12 -11
  37. package/dist/plugins/debug.js.map +1 -1
  38. package/dist/plugins/forecasting.d.ts +1 -0
  39. package/dist/plugins/forecasting.js +236 -0
  40. package/dist/plugins/forecasting.js.map +1 -0
  41. package/dist/plugins/latex.d.ts +1 -0
  42. package/dist/plugins/latex.js +454 -0
  43. package/dist/plugins/latex.js.map +1 -0
  44. package/dist/plugins/lazy-load.d.ts +3 -0
  45. package/dist/plugins/lazy-load.js +189 -0
  46. package/dist/plugins/lazy-load.js.map +1 -0
  47. package/dist/plugins/ml-integration.d.ts +3 -0
  48. package/dist/plugins/ml-integration.js +355 -0
  49. package/dist/plugins/ml-integration.js.map +1 -0
  50. package/dist/plugins/offscreen.d.ts +3 -0
  51. package/dist/plugins/offscreen.js +169 -0
  52. package/dist/plugins/offscreen.js.map +1 -0
  53. package/dist/plugins/pattern-recognition.d.ts +3 -0
  54. package/dist/plugins/pattern-recognition.js +690 -0
  55. package/dist/plugins/pattern-recognition.js.map +1 -0
  56. package/dist/plugins/radar.d.ts +3 -0
  57. package/dist/plugins/radar.js +103 -0
  58. package/dist/plugins/radar.js.map +1 -0
  59. package/dist/plugins/regression.d.ts +3 -0
  60. package/dist/plugins/regression.js +634 -0
  61. package/dist/plugins/regression.js.map +1 -0
  62. package/dist/plugins/roi.d.ts +1 -0
  63. package/dist/plugins/roi.js +223 -0
  64. package/dist/plugins/roi.js.map +1 -0
  65. package/dist/plugins/snapshot/types.d.ts +1 -1
  66. package/dist/plugins/snapshot.d.ts +3 -0
  67. package/dist/plugins/snapshot.js +90 -0
  68. package/dist/plugins/snapshot.js.map +1 -0
  69. package/dist/plugins/sync/index.d.ts +2 -1
  70. package/dist/plugins/sync.js +13 -269
  71. package/dist/plugins/sync.js.map +1 -1
  72. package/dist/plugins/video-recorder.d.ts +3 -0
  73. package/dist/plugins/video-recorder.js +104 -0
  74. package/dist/plugins/video-recorder.js.map +1 -0
  75. package/dist/plugins/virtualization.d.ts +3 -0
  76. package/dist/plugins/virtualization.js +6 -0
  77. package/dist/plugins/virtualization.js.map +1 -0
  78. package/dist/react.d.ts +1 -0
  79. package/dist/react.js +31 -0
  80. package/dist/react.js.map +1 -0
  81. package/dist/utils-BK5UUXxj.js +172 -0
  82. package/dist/utils-BK5UUXxj.js.map +1 -0
  83. package/dist/velo-plot.full.js +920 -6003
  84. package/dist/velo-plot.full.js.map +1 -1
  85. package/dist/velo-plot.js +23 -22
  86. package/dist/velo-plot.js.map +1 -1
  87. package/package.json +9 -2
  88. package/dist/core/OverlayRenderer.test.d.ts +0 -1
  89. package/dist/core/chart/ChartScaling.test.d.ts +0 -1
  90. package/dist/core/chart/NavigationUtils.test.d.ts +0 -1
  91. package/dist/core/format/axisFormat.test.d.ts +0 -1
  92. package/dist/core/indicator/buildIndicatorSeries.test.d.ts +0 -1
  93. package/dist/core/series/SeriesBounds.test.d.ts +0 -1
  94. package/dist/core/stacked/createStackedChart.test.d.ts +0 -1
  95. package/dist/core/stacked/paneAxis.test.d.ts +0 -1
  96. package/dist/core/stacked/paneResize.test.d.ts +0 -1
  97. package/dist/core/sync/index.test.d.ts +0 -1
  98. package/dist/index.core-xiNcuFfJ.js.map +0 -1
  99. package/dist/plugins/tools/tooltip/format.test.d.ts +0 -1
  100. package/dist/utils-Dbro9-qM.js +0 -254
  101. 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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"}
@@ -0,0 +1 @@
1
+ export * from './latex/index'