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.
- package/README.md +14 -0
- package/dist/{index.core-xiNcuFfJ.js → ChartCore-DQ691eXH.js} +1807 -1287
- package/dist/ChartCore-DQ691eXH.js.map +1 -0
- package/dist/assets/downsample.worker-C70QJ04y.js +2 -0
- package/dist/assets/downsample.worker-C70QJ04y.js.map +1 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js +2 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -0
- package/dist/core/OverlayRenderer.d.ts +2 -0
- package/dist/core/chart/ChartAlerts.d.ts +42 -0
- package/dist/core/chart/ChartCore.d.ts +20 -1
- package/dist/core/chart/ChartRenderLoop.d.ts +4 -2
- package/dist/core/chart/ChartRenderer.d.ts +3 -2
- package/dist/core/chart/candlestickMarkers.d.ts +23 -0
- package/dist/core/chart/exporter/SVGExporter.d.ts +7 -2
- package/dist/core/chart/heikinAshi.d.ts +10 -0
- package/dist/core/chart/series/types.d.ts +2 -2
- package/dist/core/chart/types.d.ts +9 -0
- package/dist/core/indicator/addIndicator.d.ts +36 -0
- package/dist/core/indicator/index.d.ts +2 -0
- package/dist/core/indicator/indicatorPresets.d.ts +37 -0
- package/dist/core/render/pixelSnap.d.ts +8 -0
- package/dist/core/series/Series.d.ts +3 -0
- package/dist/core/stacked/index.d.ts +3 -1
- package/dist/core/stacked/paneResize.d.ts +15 -18
- package/dist/core/stacked/stackExport.d.ts +18 -0
- package/dist/core/stacked/types.d.ts +42 -5
- package/dist/core/time/TimeScale.d.ts +31 -0
- package/dist/createStackedChart-BPooTQ9z.js +1164 -0
- package/dist/createStackedChart-BPooTQ9z.js.map +1 -0
- package/dist/gpu/adapter/gpuRenderer.d.ts +21 -0
- package/dist/gpu/backends/webgpu/WebGPUBackend.d.ts +2 -1
- package/dist/gpuRenderer-BpaMYz-k.js +1848 -0
- package/dist/gpuRenderer-BpaMYz-k.js.map +1 -0
- package/dist/index-CUGS98p4.js +277 -0
- package/dist/index-CUGS98p4.js.map +1 -0
- package/dist/index-D7dTq6VB.js +503 -0
- package/dist/index-D7dTq6VB.js.map +1 -0
- package/dist/{index-Ce2JgkH_.js → index-DoYxf1cV.js} +86 -43
- package/dist/{index-Ce2JgkH_.js.map → index-DoYxf1cV.js.map} +1 -1
- package/dist/index.core-BtGFYMOu.js +167 -0
- package/dist/index.core-BtGFYMOu.js.map +1 -0
- package/dist/index.d.ts +12 -4
- package/dist/indicators--eJGmVox.js +302 -0
- package/dist/indicators--eJGmVox.js.map +1 -0
- package/dist/math-Ddm2EZjj.js +85 -0
- package/dist/math-Ddm2EZjj.js.map +1 -0
- package/dist/plugins/analysis.js +543 -818
- package/dist/plugins/analysis.js.map +1 -1
- package/dist/plugins/anomaly-detection.d.ts +1 -0
- package/dist/plugins/anomaly-detection.js +221 -0
- package/dist/plugins/anomaly-detection.js.map +1 -0
- package/dist/plugins/broken-axis.d.ts +3 -0
- package/dist/plugins/broken-axis.js +262 -0
- package/dist/plugins/broken-axis.js.map +1 -0
- package/dist/plugins/caching.d.ts +3 -0
- package/dist/plugins/caching.js +187 -0
- package/dist/plugins/caching.js.map +1 -0
- package/dist/plugins/data-transform.d.ts +3 -0
- package/dist/plugins/data-transform.js +146 -0
- package/dist/plugins/data-transform.js.map +1 -0
- package/dist/plugins/debug.js +12 -11
- package/dist/plugins/debug.js.map +1 -1
- package/dist/plugins/drawing-tools/index.d.ts +16 -0
- package/dist/plugins/forecasting.d.ts +1 -0
- package/dist/plugins/forecasting.js +236 -0
- package/dist/plugins/forecasting.js.map +1 -0
- package/dist/plugins/gpu.js +202 -1895
- package/dist/plugins/gpu.js.map +1 -1
- package/dist/plugins/index.d.ts +2 -0
- package/dist/plugins/keyboard/index.d.ts +1 -7
- package/dist/plugins/keyboard.js +1 -1
- package/dist/plugins/latex.d.ts +1 -0
- package/dist/plugins/latex.js +454 -0
- package/dist/plugins/latex.js.map +1 -0
- package/dist/plugins/lazy-load/types.d.ts +7 -0
- package/dist/plugins/lazy-load.d.ts +3 -0
- package/dist/plugins/lazy-load.js +212 -0
- package/dist/plugins/lazy-load.js.map +1 -0
- package/dist/plugins/ml-integration.d.ts +3 -0
- package/dist/plugins/ml-integration.js +355 -0
- package/dist/plugins/ml-integration.js.map +1 -0
- package/dist/plugins/offscreen.d.ts +3 -0
- package/dist/plugins/offscreen.js +169 -0
- package/dist/plugins/offscreen.js.map +1 -0
- package/dist/plugins/pattern-recognition.d.ts +3 -0
- package/dist/plugins/pattern-recognition.js +690 -0
- package/dist/plugins/pattern-recognition.js.map +1 -0
- package/dist/plugins/radar.d.ts +3 -0
- package/dist/plugins/radar.js +103 -0
- package/dist/plugins/radar.js.map +1 -0
- package/dist/plugins/regression.d.ts +3 -0
- package/dist/plugins/regression.js +634 -0
- package/dist/plugins/regression.js.map +1 -0
- package/dist/plugins/replay/index.d.ts +19 -0
- package/dist/plugins/roi.d.ts +1 -0
- package/dist/plugins/roi.js +223 -0
- package/dist/plugins/roi.js.map +1 -0
- package/dist/plugins/snapshot/types.d.ts +1 -1
- package/dist/plugins/snapshot.d.ts +3 -0
- package/dist/plugins/snapshot.js +90 -0
- package/dist/plugins/snapshot.js.map +1 -0
- package/dist/plugins/sync/index.d.ts +2 -1
- package/dist/plugins/sync.js +13 -269
- package/dist/plugins/sync.js.map +1 -1
- package/dist/plugins/video-recorder.d.ts +3 -0
- package/dist/plugins/video-recorder.js +104 -0
- package/dist/plugins/video-recorder.js.map +1 -0
- package/dist/plugins/virtualization/types.d.ts +12 -0
- package/dist/plugins/virtualization.d.ts +3 -0
- package/dist/plugins/virtualization.js +6 -0
- package/dist/plugins/virtualization.js.map +1 -0
- package/dist/pool-15HMCNv8.js +88 -0
- package/dist/pool-15HMCNv8.js.map +1 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +31 -0
- package/dist/react.js.map +1 -0
- package/dist/renderer/CandlestickRenderer.d.ts +1 -1
- package/dist/renderer/ChartSeriesRenderer.d.ts +6 -0
- package/dist/renderer/GpuChartRenderer.d.ts +23 -0
- package/dist/renderer/index.d.ts +3 -0
- package/dist/renderer/spike/WebGLGridSpike.d.ts +40 -0
- package/dist/testing/baselines/v1.15.0.json.d.ts +51 -0
- package/dist/testing/gridSpikeBenchmark.d.ts +49 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/rendererBenchmark.d.ts +13 -0
- package/dist/testing/stage1BrowserBench.d.ts +42 -0
- package/dist/types.d.ts +21 -1
- package/dist/utils-BK5UUXxj.js +172 -0
- package/dist/utils-BK5UUXxj.js.map +1 -0
- package/dist/velo-plot.full.js +1382 -5932
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +26 -25
- package/dist/velo-plot.js.map +1 -1
- package/dist/workers/downsample.d.ts +38 -0
- package/dist/workers/downsampleAsync.d.ts +6 -0
- package/dist/workers/indicator.worker.d.ts +32 -0
- package/dist/workers/indicatorsAsync.d.ts +26 -0
- package/dist/workers/pool.d.ts +36 -0
- package/package.json +19 -2
- package/dist/core/OverlayRenderer.test.d.ts +0 -1
- package/dist/core/chart/ChartScaling.test.d.ts +0 -1
- package/dist/core/chart/NavigationUtils.test.d.ts +0 -1
- package/dist/core/format/axisFormat.test.d.ts +0 -1
- package/dist/core/indicator/buildIndicatorSeries.test.d.ts +0 -1
- package/dist/core/series/SeriesBounds.test.d.ts +0 -1
- package/dist/core/stacked/createStackedChart.test.d.ts +0 -1
- package/dist/core/stacked/paneAxis.test.d.ts +0 -1
- package/dist/core/stacked/paneResize.test.d.ts +0 -1
- package/dist/core/sync/index.test.d.ts +0 -1
- package/dist/index.core-xiNcuFfJ.js.map +0 -1
- package/dist/plugins/tools/tooltip/format.test.d.ts +0 -1
- package/dist/utils-Dbro9-qM.js +0 -254
- 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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"}
|