velo-plot 3.0.0 → 4.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -15
- package/dist/ChartCore-KYG2HTcK.js +7474 -0
- package/dist/ChartCore-KYG2HTcK.js.map +1 -0
- package/dist/GpuChartRenderer-Dxc0hrQA.js +75 -0
- package/dist/GpuChartRenderer-Dxc0hrQA.js.map +1 -0
- package/dist/{index.core-BmZe2jRQ.js → PluginRegistry-CDf_jcnp.js} +19 -33
- package/dist/PluginRegistry-CDf_jcnp.js.map +1 -0
- package/dist/SVGDocumentBuilder-C-uLkcFW.js +83 -0
- package/dist/SVGDocumentBuilder-C-uLkcFW.js.map +1 -0
- package/dist/angular-hooks.js +1 -1
- package/dist/angular.js +8 -8
- package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
- package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
- package/dist/{chartSyncBridge-DbWrwtyP.js → chartSyncBridge-C1uRy0ZS.js} +12 -11
- package/dist/{chartSyncBridge-DbWrwtyP.js.map → chartSyncBridge-C1uRy0ZS.js.map} +1 -1
- package/dist/core/ChartStatistics.d.ts +1 -1
- package/dist/core/chart/ChartCore.d.ts +19 -20
- package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
- package/dist/core/chart/ChartRenderLoop.d.ts +5 -0
- package/dist/core/chart/ChartRenderer.d.ts +9 -0
- package/dist/core/chart/ChartSetup.d.ts +1 -0
- package/dist/core/chart/chartExportPatch.d.ts +2 -0
- package/dist/core/chart/exporter/SVGExporter.d.ts +9 -7
- package/dist/core/chart/exporter/svg/SVGDocumentBuilder.d.ts +27 -0
- package/dist/core/chart/exporter/svg/SVGExportContext.d.ts +147 -0
- package/dist/core/chart/exporter/svg/SVGOrchestrator.d.ts +3 -0
- package/dist/core/chart/exporter/svg/SVGThemeAdapter.d.ts +22 -0
- package/dist/core/chart/exporter/svg/__tests__/testFixtures.d.ts +46 -0
- package/dist/core/chart/exporter/svg/__tests__/visualTestUtils.d.ts +12 -0
- package/dist/core/chart/exporter/svg/overlay/axes.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/border.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/errorBars.d.ts +7 -0
- package/dist/core/chart/exporter/svg/overlay/grid.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/index.d.ts +12 -0
- package/dist/core/chart/exporter/svg/overlay/legend.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/pluginCharts.d.ts +6 -0
- package/dist/core/chart/exporter/svg/overlay/polarGrid.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/specialChart.d.ts +15 -0
- package/dist/core/chart/exporter/svg/overlay/title.d.ts +4 -0
- package/dist/core/chart/exporter/svg/plugins/annotations.d.ts +5 -0
- package/dist/core/chart/exporter/svg/plugins/brokenAxis.d.ts +20 -0
- package/dist/core/chart/exporter/svg/plugins/latex.d.ts +9 -0
- package/dist/core/chart/exporter/svg/plugins/register.d.ts +8 -0
- package/dist/core/chart/exporter/svg/plugins/regression.d.ts +33 -0
- package/dist/core/chart/exporter/svg/plugins/roi.d.ts +12 -0
- package/dist/core/chart/exporter/svg/plugins/tradeMarkers.d.ts +3 -0
- package/dist/core/chart/exporter/svg/plugins/types.d.ts +28 -0
- package/dist/core/chart/exporter/svg/plugins/watermark.d.ts +13 -0
- package/dist/core/chart/exporter/svg/series/band.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/bar.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/boxplot.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/candlestick.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/finitePoints.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/gauge.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/heatmap.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/indicator.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/line.d.ts +12 -0
- package/dist/core/chart/exporter/svg/series/polar.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/radar.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/registry.d.ts +10 -0
- package/dist/core/chart/exporter/svg/series/sankey.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/scatter.d.ts +1 -0
- package/dist/core/chart/exporter/svg/series/ternary.d.ts +7 -0
- package/dist/core/chart/exporter/svg/series/waterfall.d.ts +6 -0
- package/dist/core/chart/exporter/svg/seriesAtTimestamp.d.ts +4 -0
- package/dist/core/chart/exporter/svg/seriesUtils.d.ts +3 -0
- package/dist/core/chart/exporter/svg/symbols.d.ts +5 -0
- package/dist/core/chart/exporter/svg/tickUtils.d.ts +9 -0
- package/dist/core/chart/mountSVGString.d.ts +5 -0
- package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
- package/dist/core/chart/series/SeriesActions.d.ts +1 -0
- package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
- package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
- package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
- package/dist/core/chart/types.d.ts +2 -2
- package/dist/core/stacked/StackSVGComposer.d.ts +14 -0
- package/dist/core/stacked/index.d.ts +3 -2
- package/dist/core/stacked/types.d.ts +12 -4
- package/dist/createStackedChart-DjA3aJAu.js +2761 -0
- package/dist/createStackedChart-DjA3aJAu.js.map +1 -0
- package/dist/{hooks-CYPCxoZx.js → hooks-4wQH27r9.js} +7 -7
- package/dist/{hooks-CYPCxoZx.js.map → hooks-4wQH27r9.js.map} +1 -1
- package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
- package/dist/index-B7PTX94B.js.map +1 -0
- package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
- package/dist/index-BgrvqltV.js.map +1 -0
- package/dist/index-Bj-xyXY6.js +582 -0
- package/dist/index-Bj-xyXY6.js.map +1 -0
- package/dist/index-qhscKTDy.js.map +1 -1
- package/dist/index.core.d.ts +8 -6
- package/dist/index.d.ts +1 -14
- package/dist/plugins/3d.js +3 -1
- package/dist/plugins/3d.js.map +1 -1
- package/dist/plugins/PluginManager.d.ts +5 -0
- package/dist/plugins/analysis.js.map +1 -1
- package/dist/plugins/annotations.js +8 -7
- package/dist/plugins/annotations.js.map +1 -1
- package/dist/plugins/broken-axis.js +198 -152
- package/dist/plugins/broken-axis.js.map +1 -1
- package/dist/plugins/createPlugin.d.ts +8 -0
- package/dist/plugins/debug.js +32 -32
- package/dist/plugins/debug.js.map +1 -1
- package/dist/plugins/forecasting.js +273 -258
- package/dist/plugins/forecasting.js.map +1 -1
- package/dist/plugins/gpu.js +2033 -209
- package/dist/plugins/gpu.js.map +1 -1
- package/dist/plugins/i18n.js +286 -23
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/latex.js +766 -207
- package/dist/plugins/latex.js.map +1 -1
- package/dist/plugins/loading/index.d.ts +1 -2
- package/dist/plugins/loading.js +3 -4
- package/dist/plugins/ml-integration.js +107 -93
- package/dist/plugins/ml-integration.js.map +1 -1
- package/dist/plugins/offscreen.js +11 -10
- package/dist/plugins/offscreen.js.map +1 -1
- package/dist/plugins/radar/types.d.ts +11 -0
- package/dist/plugins/radar.js +64 -53
- package/dist/plugins/radar.js.map +1 -1
- package/dist/plugins/regression.js +254 -256
- package/dist/plugins/regression.js.map +1 -1
- package/dist/plugins/roi/index.d.ts +2 -0
- package/dist/plugins/roi.js +184 -145
- package/dist/plugins/roi.js.map +1 -1
- package/dist/plugins/snapshot.js +20 -15
- package/dist/plugins/snapshot.js.map +1 -1
- package/dist/plugins/streaming.js +1 -1
- package/dist/plugins/tools.js +1 -1
- package/dist/plugins/types.d.ts +4 -0
- package/dist/react.js +55 -58
- package/dist/react.js.map +1 -1
- package/dist/regression-HNdyk1Dm.js +28 -0
- package/dist/regression-HNdyk1Dm.js.map +1 -0
- package/dist/renderer/ChartSeriesRenderer.d.ts +3 -2
- package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
- package/dist/renderer/SVGChartRenderer.d.ts +15 -0
- package/dist/renderer/SankeyRenderer.d.ts +1 -0
- package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
- package/dist/renderer/native/draw.d.ts +2 -47
- package/dist/renderer/native/drawCore.d.ts +27 -0
- package/dist/renderer/native/drawExtended.d.ts +29 -0
- package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
- package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
- package/dist/renderer/native/programFactoryCore.d.ts +6 -0
- package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
- package/dist/renderer/native/utils.d.ts +3 -29
- package/dist/renderer/native/utilsCore.d.ts +14 -0
- package/dist/renderer/native/utilsExtended.d.ts +17 -0
- package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
- package/dist/renderer/registerExtendedSeries.d.ts +1 -0
- package/dist/renderer/registerSVG.d.ts +5 -0
- package/dist/renderer/registerWebGPU.d.ts +2 -0
- package/dist/renderer/sankeyLayout.d.ts +29 -0
- package/dist/renderer/seriesBufferExtended.d.ts +4 -0
- package/dist/scientific/index.d.ts +1 -5
- package/dist/scientific/registerScientific.d.ts +1 -0
- package/dist/scientific.js +41 -41
- package/dist/solid.js +56 -59
- package/dist/solid.js.map +1 -1
- package/dist/svelte.js +26 -29
- package/dist/svelte.js.map +1 -1
- package/dist/tickUtils-B_X-ha13.js +41 -0
- package/dist/tickUtils-B_X-ha13.js.map +1 -0
- package/dist/trading/index.d.ts +1 -4
- package/dist/trading/registerTrading.d.ts +3 -0
- package/dist/trading.js +42 -42
- package/dist/types.d.ts +5 -4
- package/dist/velo-plot.full.js +1951 -1275
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +33 -28
- package/dist/velo-plot.js.map +1 -1
- package/dist/vue/VeloPlot.vue.d.ts +1 -1
- package/dist/vue/index.d.ts +33 -33
- package/dist/vue.js +17 -20
- package/dist/vue.js.map +1 -1
- package/package.json +14 -1
- package/dist/ChartCore-BpzRvN4Y.js +0 -8467
- package/dist/ChartCore-BpzRvN4Y.js.map +0 -1
- package/dist/createStackedChart-Dm-YqUT7.js +0 -756
- package/dist/createStackedChart-Dm-YqUT7.js.map +0 -1
- package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
- package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
- package/dist/index-BMiZoKmm.js.map +0 -1
- package/dist/index-qunX30Xu.js.map +0 -1
- package/dist/index-x4stH3jD.js +0 -282
- package/dist/index-x4stH3jD.js.map +0 -1
- package/dist/index.core-BmZe2jRQ.js.map +0 -1
- package/dist/mockDatafeed-DHIDPcpX.js +0 -515
- package/dist/mockDatafeed-DHIDPcpX.js.map +0 -1
- package/dist/symbols-DT0eLlpW.js +0 -568
- package/dist/symbols-DT0eLlpW.js.map +0 -1
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
|
|
1
|
+
var X = Object.defineProperty;
|
|
2
|
+
var k = (i, t, n) => t in i ? X(i, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : i[t] = n;
|
|
3
|
+
var d = (i, t, n) => k(i, typeof t != "symbol" ? t + "" : t, n);
|
|
4
|
+
import { e as q } from "../regression-HNdyk1Dm.js";
|
|
5
|
+
class L {
|
|
5
6
|
constructor(t) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
d(this, "network");
|
|
8
|
+
d(this, "config");
|
|
9
|
+
d(this, "ready", !1);
|
|
9
10
|
this.config = t, this.network = {
|
|
10
11
|
layers: [],
|
|
11
12
|
learningRate: 0.01,
|
|
@@ -22,13 +23,13 @@ class x {
|
|
|
22
23
|
return this.config.type;
|
|
23
24
|
}
|
|
24
25
|
async predict(t) {
|
|
25
|
-
const n = performance.now(), e = Array.from(t.data), s = this.forwardPass(e),
|
|
26
|
+
const n = performance.now(), e = Array.from(t.data), s = this.forwardPass(e), c = performance.now() - n;
|
|
26
27
|
return {
|
|
27
28
|
modelId: this.config.id,
|
|
28
29
|
output: new Float32Array(s),
|
|
29
30
|
outputShape: [s.length],
|
|
30
31
|
timestamp: Date.now(),
|
|
31
|
-
processingTime:
|
|
32
|
+
processingTime: c
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
35
|
forwardPass(t) {
|
|
@@ -39,10 +40,10 @@ class x {
|
|
|
39
40
|
}
|
|
40
41
|
denseLayer(t, n, e) {
|
|
41
42
|
const s = [];
|
|
42
|
-
for (let
|
|
43
|
-
let r = e[
|
|
43
|
+
for (let c = 0; c < n.length; c++) {
|
|
44
|
+
let r = e[c];
|
|
44
45
|
for (let o = 0; o < t.length; o++)
|
|
45
|
-
r += t[o] * n[
|
|
46
|
+
r += t[o] * n[c][o];
|
|
46
47
|
s.push(r);
|
|
47
48
|
}
|
|
48
49
|
return s;
|
|
@@ -73,13 +74,13 @@ class x {
|
|
|
73
74
|
this.ready = !1;
|
|
74
75
|
}
|
|
75
76
|
}
|
|
76
|
-
class
|
|
77
|
+
class D {
|
|
77
78
|
constructor(t) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
d(this, "config");
|
|
80
|
+
d(this, "coefficients", []);
|
|
81
|
+
d(this, "intercept", 0);
|
|
82
|
+
d(this, "ready", !1);
|
|
83
|
+
d(this, "lastTraining", null);
|
|
83
84
|
this.config = t;
|
|
84
85
|
}
|
|
85
86
|
get id() {
|
|
@@ -96,13 +97,13 @@ class I {
|
|
|
96
97
|
const o = r;
|
|
97
98
|
let a = this.intercept;
|
|
98
99
|
return this.coefficients.length > 0 && (a += this.coefficients[0] * o), a;
|
|
99
|
-
}),
|
|
100
|
+
}), c = performance.now() - n;
|
|
100
101
|
return {
|
|
101
102
|
modelId: this.config.id,
|
|
102
103
|
output: new Float32Array(s),
|
|
103
104
|
outputShape: [s.length],
|
|
104
105
|
timestamp: Date.now(),
|
|
105
|
-
processingTime:
|
|
106
|
+
processingTime: c
|
|
106
107
|
};
|
|
107
108
|
}
|
|
108
109
|
/** Predict from full feature rows (multivariate). */
|
|
@@ -118,10 +119,10 @@ class I {
|
|
|
118
119
|
const n = t.x.length, e = [];
|
|
119
120
|
for (let u = 0; u < n; u++)
|
|
120
121
|
e.push([1, ...t.x[u]]);
|
|
121
|
-
const s =
|
|
122
|
+
const s = A(b(e), e), c = A(b(e), t.y.map((u) => [u])), r = z(s), o = A(r, c);
|
|
122
123
|
this.intercept = o[0][0], this.coefficients = o.slice(1).map((u) => u[0]), this.ready = !0;
|
|
123
|
-
const a = this.predictRows(t.x),
|
|
124
|
-
return this.lastTraining = { coefficients: this.coefficients, intercept: this.intercept, fitted: a, residuals:
|
|
124
|
+
const a = this.predictRows(t.x), l = t.y.map((u, h) => u - a[h]), g = t.y.reduce((u, h) => u + h, 0) / (n || 1), m = l.reduce((u, h) => u + h * h, 0), f = t.y.reduce((u, h) => u + (h - g) ** 2, 0), y = f > 0 ? 1 - m / f : 0, w = Math.sqrt(m / (n || 1));
|
|
125
|
+
return this.lastTraining = { coefficients: this.coefficients, intercept: this.intercept, fitted: a, residuals: l, r2: y, rmse: w }, this.lastTraining;
|
|
125
126
|
}
|
|
126
127
|
getTrainingResult() {
|
|
127
128
|
return this.lastTraining;
|
|
@@ -142,33 +143,33 @@ class I {
|
|
|
142
143
|
function b(i) {
|
|
143
144
|
return i[0].map((t, n) => i.map((e) => e[n]));
|
|
144
145
|
}
|
|
145
|
-
function
|
|
146
|
+
function A(i, t) {
|
|
146
147
|
const n = [];
|
|
147
148
|
for (let e = 0; e < i.length; e++) {
|
|
148
149
|
n[e] = [];
|
|
149
150
|
for (let s = 0; s < t[0].length; s++) {
|
|
150
|
-
let
|
|
151
|
+
let c = 0;
|
|
151
152
|
for (let r = 0; r < t.length; r++)
|
|
152
|
-
|
|
153
|
-
n[e][s] =
|
|
153
|
+
c += i[e][r] * t[r][s];
|
|
154
|
+
n[e][s] = c;
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
return n;
|
|
157
158
|
}
|
|
158
|
-
function
|
|
159
|
+
function z(i) {
|
|
159
160
|
const t = i.length, n = i.map((e, s) => [
|
|
160
161
|
...e,
|
|
161
|
-
...Array.from({ length: t }, (
|
|
162
|
+
...Array.from({ length: t }, (c, r) => s === r ? 1 : 0)
|
|
162
163
|
]);
|
|
163
164
|
for (let e = 0; e < t; e++) {
|
|
164
165
|
let s = e;
|
|
165
166
|
for (let r = e + 1; r < t; r++)
|
|
166
167
|
Math.abs(n[r][e]) > Math.abs(n[s][e]) && (s = r);
|
|
167
168
|
if (Math.abs(n[s][e]) < 1e-12)
|
|
168
|
-
return i.map((r, o) => r.map((a,
|
|
169
|
+
return i.map((r, o) => r.map((a, l) => o === l ? 1 : 0));
|
|
169
170
|
[n[e], n[s]] = [n[s], n[e]];
|
|
170
|
-
const
|
|
171
|
-
for (let r = 0; r < 2 * t; r++) n[e][r] /=
|
|
171
|
+
const c = n[e][e];
|
|
172
|
+
for (let r = 0; r < 2 * t; r++) n[e][r] /= c;
|
|
172
173
|
for (let r = 0; r < t; r++) {
|
|
173
174
|
if (r === e) continue;
|
|
174
175
|
const o = n[r][e];
|
|
@@ -177,13 +178,13 @@ function L(i) {
|
|
|
177
178
|
}
|
|
178
179
|
return n.map((e) => e.slice(t));
|
|
179
180
|
}
|
|
180
|
-
class
|
|
181
|
+
class E {
|
|
181
182
|
constructor(t) {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
183
|
+
d(this, "config");
|
|
184
|
+
d(this, "filterType");
|
|
185
|
+
d(this, "cutoffFrequency");
|
|
186
|
+
d(this, "sampleRate");
|
|
187
|
+
d(this, "ready", !1);
|
|
187
188
|
var n, e, s;
|
|
188
189
|
this.config = t, this.filterType = ((n = t.metadata) == null ? void 0 : n.filterType) || "lowpass", this.cutoffFrequency = ((e = t.metadata) == null ? void 0 : e.cutoffFrequency) || 1e3, this.sampleRate = ((s = t.metadata) == null ? void 0 : s.sampleRate) || 44100;
|
|
189
190
|
}
|
|
@@ -197,13 +198,13 @@ class z {
|
|
|
197
198
|
return this.config.type;
|
|
198
199
|
}
|
|
199
200
|
async predict(t) {
|
|
200
|
-
const n = performance.now(), e = Array.from(t.data), s = this.applyFilter(e),
|
|
201
|
+
const n = performance.now(), e = Array.from(t.data), s = this.applyFilter(e), c = performance.now() - n;
|
|
201
202
|
return {
|
|
202
203
|
modelId: this.config.id,
|
|
203
204
|
output: new Float32Array(s),
|
|
204
205
|
outputShape: [s.length],
|
|
205
206
|
timestamp: Date.now(),
|
|
206
|
-
processingTime:
|
|
207
|
+
processingTime: c
|
|
207
208
|
};
|
|
208
209
|
}
|
|
209
210
|
applyFilter(t) {
|
|
@@ -220,8 +221,8 @@ class z {
|
|
|
220
221
|
}
|
|
221
222
|
lowpassFilter(t) {
|
|
222
223
|
const n = 2 * Math.PI * this.cutoffFrequency / this.sampleRate, e = n / (1 + n), s = [t[0]];
|
|
223
|
-
for (let
|
|
224
|
-
s.push(e * t[
|
|
224
|
+
for (let c = 1; c < t.length; c++)
|
|
225
|
+
s.push(e * t[c] + (1 - e) * s[c - 1]);
|
|
225
226
|
return s;
|
|
226
227
|
}
|
|
227
228
|
highpassFilter(t) {
|
|
@@ -247,57 +248,57 @@ class z {
|
|
|
247
248
|
this.ready = !1;
|
|
248
249
|
}
|
|
249
250
|
}
|
|
250
|
-
function
|
|
251
|
+
function I(i) {
|
|
251
252
|
switch (i.type) {
|
|
252
253
|
case "neural-network":
|
|
253
|
-
return new
|
|
254
|
+
return new L(i);
|
|
254
255
|
case "linear-regression":
|
|
255
|
-
return new
|
|
256
|
+
return new D(i);
|
|
256
257
|
case "signal-processor":
|
|
257
|
-
return new
|
|
258
|
+
return new E(i);
|
|
258
259
|
default:
|
|
259
|
-
return new
|
|
260
|
+
return new D(i);
|
|
260
261
|
}
|
|
261
262
|
}
|
|
262
263
|
function V(i) {
|
|
263
264
|
const t = i.length, n = new Array(t), e = new Array(t);
|
|
264
265
|
for (let s = 0; s < t; s++) {
|
|
265
|
-
let
|
|
266
|
+
let c = 0, r = 0;
|
|
266
267
|
for (let o = 0; o < t; o++) {
|
|
267
268
|
const a = -2 * Math.PI * s * o / t;
|
|
268
|
-
|
|
269
|
+
c += i[o] * Math.cos(a), r += i[o] * Math.sin(a);
|
|
269
270
|
}
|
|
270
|
-
n[s] =
|
|
271
|
+
n[s] = c, e[s] = r;
|
|
271
272
|
}
|
|
272
273
|
return { real: n, imag: e };
|
|
273
274
|
}
|
|
274
|
-
function
|
|
275
|
+
function P(i) {
|
|
275
276
|
return i.reduce((t, n) => t + n, 0) / i.length;
|
|
276
277
|
}
|
|
277
278
|
function Y(i) {
|
|
278
|
-
const t =
|
|
279
|
+
const t = P(i), n = i.reduce((e, s) => e + Math.pow(s - t, 2), 0) / i.length;
|
|
279
280
|
return Math.sqrt(n);
|
|
280
281
|
}
|
|
281
282
|
function $(i, t) {
|
|
282
|
-
const n = i.length, e =
|
|
283
|
-
let
|
|
283
|
+
const n = i.length, e = P(i), s = P(t);
|
|
284
|
+
let c = 0, r = 0, o = 0;
|
|
284
285
|
for (let a = 0; a < n; a++) {
|
|
285
|
-
const
|
|
286
|
-
|
|
286
|
+
const l = i[a] - e, g = t[a] - s;
|
|
287
|
+
c += l * g, r += l * l, o += g * g;
|
|
287
288
|
}
|
|
288
|
-
return
|
|
289
|
+
return c / Math.sqrt(r * o);
|
|
289
290
|
}
|
|
290
|
-
const
|
|
291
|
+
const N = {
|
|
291
292
|
name: "velo-plot-ml-integration",
|
|
292
293
|
version: "1.0.0",
|
|
293
294
|
description: "Machine Learning Integration Bridge for Velo Plot",
|
|
294
295
|
provides: ["ml", "prediction", "inference"],
|
|
295
296
|
tags: ["ml", "ai", "analysis"]
|
|
296
297
|
};
|
|
297
|
-
function
|
|
298
|
+
function j(i = {}) {
|
|
298
299
|
let t = null;
|
|
299
300
|
const n = /* @__PURE__ */ new Map(), e = /* @__PURE__ */ new Map();
|
|
300
|
-
i.models && i.models.forEach((r) => n.set(r.id,
|
|
301
|
+
i.models && i.models.forEach((r) => n.set(r.id, I(r)));
|
|
301
302
|
const s = {
|
|
302
303
|
registerModel(r) {
|
|
303
304
|
if (!r.id) {
|
|
@@ -309,10 +310,10 @@ function _(i = {}) {
|
|
|
309
310
|
async runInference(r, o) {
|
|
310
311
|
const a = n.get(r);
|
|
311
312
|
if (!a) throw new Error(`Model not found: ${r}`);
|
|
312
|
-
const
|
|
313
|
-
if (!
|
|
314
|
-
const g = new Float32Array(
|
|
315
|
-
return m.xValues =
|
|
313
|
+
const l = t == null ? void 0 : t.data.getSeriesData(o);
|
|
314
|
+
if (!l) throw new Error(`Series not found: ${o}`);
|
|
315
|
+
const g = new Float32Array(l.y), m = await a.predict({ data: g });
|
|
316
|
+
return m.xValues = l.x, m;
|
|
316
317
|
},
|
|
317
318
|
visualizeResults(r, o = {}) {
|
|
318
319
|
const a = `ml-viz-${Math.random().toString(36).substr(2, 9)}`;
|
|
@@ -338,7 +339,7 @@ function _(i = {}) {
|
|
|
338
339
|
*/
|
|
339
340
|
trainModel(r, o) {
|
|
340
341
|
let a = n.get(r);
|
|
341
|
-
if (a || (a =
|
|
342
|
+
if (a || (a = I({ id: r, name: r, type: "linear-regression" }), n.set(r, a)), typeof a.train != "function")
|
|
342
343
|
throw new Error(`Model '${r}' does not support training`);
|
|
343
344
|
return a.train(o);
|
|
344
345
|
},
|
|
@@ -354,53 +355,66 @@ function _(i = {}) {
|
|
|
354
355
|
},
|
|
355
356
|
stats: {
|
|
356
357
|
fft: V,
|
|
357
|
-
mean:
|
|
358
|
+
mean: P,
|
|
358
359
|
standardDeviation: Y,
|
|
359
360
|
correlation: $
|
|
360
361
|
}
|
|
361
362
|
};
|
|
362
|
-
function
|
|
363
|
-
const { render: o, coords: a } = r, { ctx2d:
|
|
364
|
-
|
|
365
|
-
var
|
|
366
|
-
const { result: m, config:
|
|
367
|
-
if (!
|
|
368
|
-
const
|
|
369
|
-
if (
|
|
370
|
-
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
for (let
|
|
374
|
-
const
|
|
375
|
-
|
|
363
|
+
function c(r) {
|
|
364
|
+
const { render: o, coords: a } = r, { ctx2d: l } = o;
|
|
365
|
+
l && e.forEach((g) => {
|
|
366
|
+
var R, v, M, x;
|
|
367
|
+
const { result: m, config: f } = g, { output: y, xValues: w, confidence: u } = m;
|
|
368
|
+
if (!w) return;
|
|
369
|
+
const h = Math.min(w.length, y.length);
|
|
370
|
+
if (l.save(), f.showConfidenceInterval && u && u.length === h) {
|
|
371
|
+
l.beginPath();
|
|
372
|
+
const T = f.intervalOpacity ?? 0.2;
|
|
373
|
+
l.fillStyle = (((R = f.lineStyle) == null ? void 0 : R.color) || "#3b82f6") + Math.floor(T * 255).toString(16).padStart(2, "0");
|
|
374
|
+
for (let p = 0; p < h; p++) {
|
|
375
|
+
const F = a.dataToPixelX(w[p]), S = a.dataToPixelY(y[p] + u[p]);
|
|
376
|
+
p === 0 ? l.moveTo(F, S) : l.lineTo(F, S);
|
|
376
377
|
}
|
|
377
|
-
for (let
|
|
378
|
-
const
|
|
379
|
-
|
|
378
|
+
for (let p = h - 1; p >= 0; p--) {
|
|
379
|
+
const F = a.dataToPixelX(w[p]), S = a.dataToPixelY(y[p] - u[p]);
|
|
380
|
+
l.lineTo(F, S);
|
|
380
381
|
}
|
|
381
|
-
|
|
382
|
+
l.closePath(), l.fill();
|
|
382
383
|
}
|
|
383
|
-
|
|
384
|
-
for (let
|
|
385
|
-
const
|
|
386
|
-
|
|
384
|
+
l.beginPath(), l.strokeStyle = ((v = f.lineStyle) == null ? void 0 : v.color) || "#3b82f6", l.lineWidth = ((M = f.lineStyle) == null ? void 0 : M.width) || 2, (x = f.lineStyle) != null && x.dash && l.setLineDash(f.lineStyle.dash);
|
|
385
|
+
for (let T = 0; T < h; T++) {
|
|
386
|
+
const p = a.dataToPixelX(w[T]), F = a.dataToPixelY(y[T]);
|
|
387
|
+
T === 0 ? l.moveTo(p, F) : l.lineTo(p, F);
|
|
387
388
|
}
|
|
388
|
-
|
|
389
|
+
l.stroke(), l.restore();
|
|
389
390
|
});
|
|
390
391
|
}
|
|
391
392
|
return {
|
|
392
|
-
manifest:
|
|
393
|
+
manifest: N,
|
|
393
394
|
onInit(r) {
|
|
394
395
|
t = r;
|
|
395
396
|
},
|
|
396
397
|
onRenderOverlay(r, o) {
|
|
397
|
-
|
|
398
|
+
c(r);
|
|
399
|
+
},
|
|
400
|
+
onExportSVG(r) {
|
|
401
|
+
var o;
|
|
402
|
+
!r.builder || ((o = r.exportContext) == null ? void 0 : o.options.includeOverlays) === !1 || e.forEach((a) => {
|
|
403
|
+
var R;
|
|
404
|
+
const { result: l, config: g } = a, { output: m, xValues: f, confidence: y } = l;
|
|
405
|
+
if (!(f != null && f.length)) return;
|
|
406
|
+
const w = Math.min(f.length, m.length), u = Array.from({ length: w }, (v, M) => ({ x: f[M], y: m[M] })), h = g.showConfidenceInterval && (y == null ? void 0 : y.length) === w ? {
|
|
407
|
+
upper: u.map((v, M) => ({ x: v.x, y: v.y + y[M] })),
|
|
408
|
+
lower: u.map((v, M) => ({ x: v.x, y: v.y - y[M] }))
|
|
409
|
+
} : void 0;
|
|
410
|
+
q(r, u, h, ((R = g.lineStyle) == null ? void 0 : R.color) ?? "#3b82f6");
|
|
411
|
+
});
|
|
398
412
|
},
|
|
399
413
|
api: s
|
|
400
414
|
};
|
|
401
415
|
}
|
|
402
416
|
export {
|
|
403
|
-
|
|
404
|
-
|
|
417
|
+
j as PluginMLIntegration,
|
|
418
|
+
j as default
|
|
405
419
|
};
|
|
406
420
|
//# sourceMappingURL=ml-integration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ml-integration.js","sources":["../../src/plugins/ml-integration/native-algorithms.ts","../../src/plugins/ml-integration/index.ts"],"sourcesContent":["/**\n * Native ML Integration Plugin - Core Algorithms\n * \n * Implements machine learning algorithms natively without third-party dependencies.\n * Includes simple neural networks, statistical models, and signal processing.\n * \n * @packageDocumentation\n * @module plugins/ml-integration\n */\n\nimport type {\n MLModelAPI,\n ModelConfig,\n PredictionInput,\n PredictionResult\n} from './types';\n\n// ============================================\n// Native Neural Network Implementation\n// ============================================\n\ninterface NativeNeuralNetwork {\n layers: NeuralLayer[];\n learningRate: number;\n epochs: number;\n}\n\ninterface NeuralLayer {\n type: 'dense' | 'activation';\n weights: number[][];\n biases: number[];\n activation?: 'relu' | 'sigmoid' | 'tanh' | 'linear';\n}\n\nexport class SimpleNeuralNetwork implements MLModelAPI {\n private network: NativeNeuralNetwork;\n private config: ModelConfig;\n private ready = false;\n\n constructor(config: ModelConfig) {\n this.config = config;\n this.network = {\n layers: [],\n learningRate: 0.01,\n epochs: 100\n };\n }\n\n get id(): string { return this.config.id; }\n get name(): string { return this.config.name; }\n get type(): string { return this.config.type; }\n\n async predict(input: PredictionInput): Promise<PredictionResult> {\n const startTime = performance.now();\n \n const inputData = Array.from(input.data as number[]);\n const outputData = this.forwardPass(inputData);\n \n const processingTime = performance.now() - startTime;\n\n return {\n modelId: this.config.id,\n output: new Float32Array(outputData),\n outputShape: [outputData.length],\n timestamp: Date.now(),\n processingTime\n };\n }\n\n private forwardPass(input: number[]): number[] {\n let activations = input;\n \n for (const layer of this.network.layers) {\n if (layer.type === 'dense') {\n activations = this.denseLayer(activations, layer.weights, layer.biases);\n }\n \n if (layer.activation) {\n activations = this.applyActivation(activations, layer.activation);\n }\n }\n \n return activations;\n }\n\n private denseLayer(input: number[], weights: number[][], biases: number[]): number[] {\n const output: number[] = [];\n for (let i = 0; i < weights.length; i++) {\n let sum = biases[i];\n for (let j = 0; j < input.length; j++) {\n sum += input[j] * weights[i][j];\n }\n output.push(sum);\n }\n return output;\n }\n\n private applyActivation(input: number[], activation: string): number[] {\n switch (activation) {\n case 'relu':\n return input.map(x => Math.max(0, x));\n case 'sigmoid':\n return input.map(x => 1 / (1 + Math.exp(-x)));\n case 'tanh':\n return input.map(x => Math.tanh(x));\n default:\n return input;\n }\n }\n\n getInfo(): ModelConfig {\n return { ...this.config };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n async warmup(): Promise<void> {\n const dummyInput = new Array(10).fill(0.1);\n await this.predict({ data: dummyInput });\n this.ready = true;\n }\n\n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================\n// Native Statistical Models\n// ============================================\n\n/** Result returned when training a small on-chart model (task 3.17). */\nexport interface TrainingResult {\n coefficients: number[];\n intercept: number;\n /** Fitted values for the training inputs. */\n fitted: number[];\n /** Residuals (observed - fitted), suitable for a residual plot. */\n residuals: number[];\n /** Coefficient of determination on the training set. */\n r2: number;\n /** Root mean squared error on the training set. */\n rmse: number;\n}\n\nexport class NativeLinearRegression implements MLModelAPI {\n private config: ModelConfig;\n private coefficients: number[] = [];\n private intercept = 0;\n private ready = false;\n private lastTraining: TrainingResult | null = null;\n\n constructor(config: ModelConfig) {\n this.config = config;\n }\n\n get id(): string { return this.config.id; }\n get name(): string { return this.config.name; }\n get type(): string { return this.config.type; }\n\n async predict(input: PredictionInput): Promise<PredictionResult> {\n const startTime = performance.now();\n\n // Each input entry is treated as a single-feature observation.\n const inputData = Array.from(input.data);\n const predictions = inputData.map((x) => {\n const feat = x as number;\n let result = this.intercept;\n // Univariate: only the first coefficient multiplies the scalar input.\n // Multivariate models should call `predictRows`.\n if (this.coefficients.length > 0) {\n result += this.coefficients[0] * feat;\n }\n return result;\n });\n\n const processingTime = performance.now() - startTime;\n\n return {\n modelId: this.config.id,\n output: new Float32Array(predictions),\n outputShape: [predictions.length],\n timestamp: Date.now(),\n processingTime\n };\n }\n\n /** Predict from full feature rows (multivariate). */\n predictRows(rows: number[][]): number[] {\n return rows.map((row) => {\n let result = this.intercept;\n for (let i = 0; i < this.coefficients.length && i < row.length; i++) {\n result += this.coefficients[i] * row[i];\n }\n return result;\n });\n }\n\n train(data: { x: number[][], y: number[] }): TrainingResult {\n const n = data.x.length;\n\n // Design matrix with an intercept column.\n const X: number[][] = [];\n for (let i = 0; i < n; i++) {\n X.push([1, ...data.x[i]]);\n }\n\n // Normal equation: β = (XᵀX)⁻¹ Xᵀy\n const XtX = matrixMultiply(transpose(X), X);\n const XtY = matrixMultiply(transpose(X), data.y.map((y) => [y]));\n\n const XtXInv = matrixInverse(XtX);\n const beta = matrixMultiply(XtXInv, XtY);\n\n this.intercept = beta[0][0];\n this.coefficients = beta.slice(1).map((row) => row[0]);\n this.ready = true;\n\n // Fit diagnostics for a residual plot.\n const fitted = this.predictRows(data.x);\n const residuals = data.y.map((y, i) => y - fitted[i]);\n const meanY = data.y.reduce((s, v) => s + v, 0) / (n || 1);\n const sse = residuals.reduce((s, r) => s + r * r, 0);\n const sst = data.y.reduce((s, y) => s + (y - meanY) ** 2, 0);\n const r2 = sst > 0 ? 1 - sse / sst : 0;\n const rmse = Math.sqrt(sse / (n || 1));\n\n this.lastTraining = { coefficients: this.coefficients, intercept: this.intercept, fitted, residuals, r2, rmse };\n return this.lastTraining;\n }\n\n getTrainingResult(): TrainingResult | null {\n return this.lastTraining;\n }\n\n getInfo(): ModelConfig {\n return { ...this.config };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n async warmup(): Promise<void> {\n this.coefficients = [1.0];\n this.intercept = 0.0;\n this.ready = true;\n }\n\n dispose(): void {\n this.ready = false;\n this.lastTraining = null;\n }\n}\n\n// ============================================\n// Matrix utilities (general purpose)\n// ============================================\n\nfunction transpose(matrix: number[][]): number[][] {\n return matrix[0].map((_, colIndex) => matrix.map((row) => row[colIndex]));\n}\n\nfunction matrixMultiply(a: number[][], b: number[][]): number[][] {\n const result: number[][] = [];\n for (let i = 0; i < a.length; i++) {\n result[i] = [];\n for (let j = 0; j < b[0].length; j++) {\n let sum = 0;\n for (let k = 0; k < b.length; k++) {\n sum += a[i][k] * b[k][j];\n }\n result[i][j] = sum;\n }\n }\n return result;\n}\n\n/**\n * General square-matrix inverse via Gauss-Jordan elimination with partial\n * pivoting. Falls back to the identity for singular matrices so callers never\n * receive NaNs. Replaces the previous 2x2-only stub (task 3.17 fix).\n */\nexport function matrixInverse(matrix: number[][]): number[][] {\n const n = matrix.length;\n // Augment [A | I]\n const M = matrix.map((row, i) => [\n ...row,\n ...Array.from({ length: n }, (_, j) => (i === j ? 1 : 0)),\n ]);\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) {\n // Singular - return identity as a safe fallback.\n return matrix.map((row, i) => row.map((_, j) => (i === j ? 1 : 0)));\n }\n [M[col], M[pivot]] = [M[pivot], M[col]];\n\n const pivotVal = M[col][col];\n for (let c = 0; c < 2 * n; c++) M[col][c] /= pivotVal;\n\n for (let r = 0; r < n; r++) {\n if (r === col) continue;\n const factor = M[r][col];\n for (let c = 0; c < 2 * n; c++) M[r][c] -= factor * M[col][c];\n }\n }\n\n return M.map((row) => row.slice(n));\n}\n\n// ============================================\n// Native Signal Processing\n// ============================================\n\nexport class NativeSignalProcessor implements MLModelAPI {\n private config: ModelConfig;\n private filterType: 'lowpass' | 'highpass' | 'bandpass';\n private cutoffFrequency: number;\n private sampleRate: number;\n private ready = false;\n\n constructor(config: ModelConfig) {\n this.config = config;\n // Extract parameters from metadata\n this.filterType = (config.metadata?.filterType as any) || 'lowpass';\n this.cutoffFrequency = config.metadata?.cutoffFrequency || 1000;\n this.sampleRate = config.metadata?.sampleRate || 44100;\n }\n\n get id(): string { return this.config.id; }\n get name(): string { return this.config.name; }\n get type(): string { return this.config.type; }\n\n async predict(input: PredictionInput): Promise<PredictionResult> {\n const startTime = performance.now();\n \n const inputData = Array.from(input.data as number[]);\n const filteredData = this.applyFilter(inputData);\n \n const processingTime = performance.now() - startTime;\n\n return {\n modelId: this.config.id,\n output: new Float32Array(filteredData),\n outputShape: [filteredData.length],\n timestamp: Date.now(),\n processingTime\n };\n }\n\n private applyFilter(data: number[]): number[] {\n switch (this.filterType) {\n case 'lowpass':\n return this.lowpassFilter(data);\n case 'highpass':\n return this.highpassFilter(data);\n case 'bandpass':\n return this.bandpassFilter(data);\n default:\n return data;\n }\n }\n\n private lowpassFilter(data: number[]): number[] {\n // Simple exponential moving average low-pass filter\n const alpha = 2 * Math.PI * this.cutoffFrequency / this.sampleRate;\n const smoothedAlpha = alpha / (1 + alpha);\n \n const filtered: number[] = [data[0]];\n for (let i = 1; i < data.length; i++) {\n filtered.push(smoothedAlpha * data[i] + (1 - smoothedAlpha) * filtered[i - 1]);\n }\n return filtered;\n }\n\n private highpassFilter(data: number[]): number[] {\n // High-pass filter using difference\n const filtered: number[] = [];\n for (let i = 1; i < data.length; i++) {\n filtered.push(data[i] - data[i - 1]);\n }\n return filtered;\n }\n\n private bandpassFilter(data: number[]): number[] {\n // Band-pass filter using combination of low-pass and high-pass\n const lowpass = this.lowpassFilter(data);\n return this.highpassFilter(lowpass);\n }\n\n getInfo(): ModelConfig {\n return { ...this.config };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n async warmup(): Promise<void> {\n this.ready = true;\n }\n\n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================\n// Native Model Factory\n// ============================================\n\nexport function createNativeModel(config: ModelConfig): MLModelAPI {\n switch (config.type) {\n case 'neural-network':\n return new SimpleNeuralNetwork(config);\n case 'linear-regression':\n return new NativeLinearRegression(config);\n case 'signal-processor':\n return new NativeSignalProcessor(config);\n default:\n // Default to simple linear model\n return new NativeLinearRegression(config);\n }\n}\n\n// ============================================\n// Native FFT Implementation\n// ============================================\n\nexport function nativeFFT(data: number[]): { real: number[]; imag: number[] } {\n const n = data.length;\n const real: number[] = new Array(n);\n const imag: number[] = new Array(n);\n \n // Simplified DFT (not optimized FFT)\n for (let k = 0; k < n; k++) {\n let sumReal = 0;\n let sumImag = 0;\n \n for (let t = 0; t < n; t++) {\n const angle = -2 * Math.PI * k * t / n;\n sumReal += data[t] * Math.cos(angle);\n sumImag += data[t] * Math.sin(angle);\n }\n \n real[k] = sumReal;\n imag[k] = sumImag;\n }\n \n return { real, imag };\n}\n\n// ============================================\n// Native Statistical Functions\n// ============================================\n\nexport function nativeMean(data: number[]): number {\n return data.reduce((sum, val) => sum + val, 0) / data.length;\n}\n\nexport function nativeStandardDeviation(data: number[]): number {\n const mean = nativeMean(data);\n const variance = data.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / data.length;\n return Math.sqrt(variance);\n}\n\nexport function nativeCorrelation(x: number[], y: number[]): number {\n const n = x.length;\n const meanX = nativeMean(x);\n const meanY = nativeMean(y);\n \n let numerator = 0;\n let denomX = 0;\n let denomY = 0;\n \n for (let i = 0; i < n; i++) {\n const dx = x[i] - meanX;\n const dy = y[i] - meanY;\n numerator += dx * dy;\n denomX += dx * dx;\n denomY += dy * dy;\n }\n \n return numerator / Math.sqrt(denomX * denomY);\n}","import type { \n PluginMLIntegrationConfig, \n MLIntegrationAPI, \n MLModelAPI, \n PredictionResult, \n VisualizationConfig\n} from './types';\nimport { \n createNativeModel,\n nativeFFT, \n nativeMean, \n nativeStandardDeviation, \n nativeCorrelation \n} from './native-algorithms';\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n AfterRenderEvent\n} from '../types';\n\nconst manifestML: PluginManifest = {\n name: \"velo-plot-ml-integration\",\n version: \"1.0.0\",\n description: \"Machine Learning Integration Bridge for Velo Plot\",\n provides: [\"ml\", \"prediction\", \"inference\"],\n tags: [\"ml\", \"ai\", \"analysis\"],\n};\n\nexport function PluginMLIntegration(\n userConfig: Partial<PluginMLIntegrationConfig> = {}\n): ChartPlugin<PluginMLIntegrationConfig> {\n let ctx: PluginContext | null = null;\n const models = new Map<string, MLModelAPI>();\n const activeVisualizations = new Map<string, { result: PredictionResult, config: VisualizationConfig }>();\n\n // Register initial models from config\n if (userConfig.models) {\n userConfig.models.forEach(m => models.set(m.id, createNativeModel(m)));\n }\n\n const api: MLIntegrationAPI & Record<string, unknown> = {\n registerModel(model: MLModelAPI) {\n if (!model.id) {\n ctx?.log.error(\"Cannot register model without id\");\n return;\n }\n models.set(model.id, model);\n ctx?.log.info(`Model registered: ${model.name || 'Unnamed'} (${model.id})`);\n },\n\n async runInference(modelId: string, seriesId: string) {\n const model = models.get(modelId);\n if (!model) throw new Error(`Model not found: ${modelId}`);\n\n const seriesData = ctx?.data.getSeriesData(seriesId);\n if (!seriesData) throw new Error(`Series not found: ${seriesId}`);\n\n // Convert to Float32Array for model compatibility\n const data = new Float32Array(seriesData.y);\n\n const result = await model.predict({ data });\n // Attach X values for visualization\n result.xValues = seriesData.x;\n return result;\n },\n\n visualizeResults(result: PredictionResult, config: VisualizationConfig = {}) {\n const vizId = `ml-viz-${Math.random().toString(36).substr(2, 9)}`;\n activeVisualizations.set(vizId, { \n result, \n config: { ...userConfig.defaultVisualization, ...config } \n });\n ctx?.requestRender();\n return vizId;\n },\n\n clearResults(visualizationId?: string) {\n if (visualizationId) {\n activeVisualizations.delete(visualizationId);\n } else {\n activeVisualizations.clear();\n }\n ctx?.requestRender();\n },\n\n /**\n * Alias for {@link visualizeResults} that reads as an intent-revealing\n * name for the prediction-overlay use case (task 3.18).\n */\n visualizePredictions(result: PredictionResult, config: VisualizationConfig = {}) {\n return api.visualizeResults(result, config);\n },\n\n /**\n * Train a small regression model on the fly (task 3.17). Creates a native\n * linear-regression model when the id does not yet exist. Returns fit\n * diagnostics including residuals for a residual plot.\n */\n trainModel(modelId: string, data: { x: number[][]; y: number[] }) {\n let model = models.get(modelId) as any;\n if (!model) {\n model = createNativeModel({ id: modelId, name: modelId, type: 'linear-regression' });\n models.set(modelId, model);\n }\n if (typeof model.train !== 'function') {\n throw new Error(`Model '${modelId}' does not support training`);\n }\n return model.train(data);\n },\n\n /** Retrieve the last training diagnostics for a model, if any. */\n getTrainingResult(modelId: string) {\n const model = models.get(modelId) as any;\n return model?.getTrainingResult?.() ?? null;\n },\n\n /** List registered model descriptors (for the ML audit / introspection). */\n listModels() {\n return Array.from(models.values()).map((m) => m.getInfo());\n },\n\n stats: {\n fft: nativeFFT,\n mean: nativeMean,\n standardDeviation: nativeStandardDeviation,\n correlation: nativeCorrelation\n }\n };\n\n function drawMLVisualizations(pCtx: PluginContext) {\n const { render, coords } = pCtx;\n const { ctx2d } = render;\n if (!ctx2d) return;\n\n activeVisualizations.forEach((viz) => {\n const { result, config } = viz;\n const { output, xValues, confidence } = result;\n if (!xValues) return;\n\n const n = Math.min(xValues.length, output.length);\n\n ctx2d.save();\n\n // 1. Draw Confidence Interval (as filled area)\n if (config.showConfidenceInterval && confidence && confidence.length === n) {\n ctx2d.beginPath();\n const opacity = config.intervalOpacity ?? 0.2;\n ctx2d.fillStyle = (config.lineStyle?.color || '#3b82f6') + Math.floor(opacity * 255).toString(16).padStart(2, '0');\n \n // Forward: upper bound\n for (let i = 0; i < n; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(output[i] + confidence[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n \n // Backward: lower bound\n for (let i = n - 1; i >= 0; i--) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(output[i] - confidence[i]);\n ctx2d.lineTo(px, py);\n }\n \n ctx2d.closePath();\n ctx2d.fill();\n }\n\n // 2. Draw Prediction Line\n ctx2d.beginPath();\n ctx2d.strokeStyle = config.lineStyle?.color || '#3b82f6';\n ctx2d.lineWidth = config.lineStyle?.width || 2;\n if (config.lineStyle?.dash) ctx2d.setLineDash(config.lineStyle.dash);\n\n for (let i = 0; i < n; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(output[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n ctx2d.stroke();\n\n ctx2d.restore();\n });\n }\n\n return {\n manifest: manifestML,\n\n onInit(c: PluginContext) {\n ctx = c;\n },\n\n onRenderOverlay(pCtx: PluginContext, _event: AfterRenderEvent) {\n drawMLVisualizations(pCtx);\n },\n\n api\n };\n}\n\nexport default PluginMLIntegration;\n\nexport type { \n PluginMLIntegrationConfig, \n MLIntegrationAPI, \n MLModelAPI, \n PredictionResult, \n VisualizationConfig \n} from './types';"],"names":["SimpleNeuralNetwork","config","__publicField","input","startTime","inputData","outputData","processingTime","activations","layer","weights","biases","output","i","sum","j","activation","x","dummyInput","NativeLinearRegression","predictions","feat","result","rows","row","data","X","XtX","matrixMultiply","transpose","XtY","y","XtXInv","matrixInverse","beta","fitted","residuals","meanY","s","v","sse","r","sst","r2","rmse","matrix","_","colIndex","a","b","k","n","M","col","pivot","pivotVal","c","factor","NativeSignalProcessor","_a","_b","_c","filteredData","alpha","smoothedAlpha","filtered","lowpass","createNativeModel","nativeFFT","real","imag","sumReal","sumImag","t","angle","nativeMean","val","nativeStandardDeviation","mean","variance","nativeCorrelation","meanX","numerator","denomX","denomY","dx","dy","manifestML","PluginMLIntegration","userConfig","ctx","models","activeVisualizations","m","api","model","modelId","seriesId","seriesData","vizId","visualizationId","drawMLVisualizations","pCtx","render","coords","ctx2d","viz","_d","xValues","confidence","opacity","px","py","_event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ml-integration.js","sources":["../../src/plugins/ml-integration/native-algorithms.ts","../../src/plugins/ml-integration/index.ts"],"sourcesContent":["/**\n * Native ML Integration Plugin - Core Algorithms\n * \n * Implements machine learning algorithms natively without third-party dependencies.\n * Includes simple neural networks, statistical models, and signal processing.\n * \n * @packageDocumentation\n * @module plugins/ml-integration\n */\n\nimport type {\n MLModelAPI,\n ModelConfig,\n PredictionInput,\n PredictionResult\n} from './types';\n\n// ============================================\n// Native Neural Network Implementation\n// ============================================\n\ninterface NativeNeuralNetwork {\n layers: NeuralLayer[];\n learningRate: number;\n epochs: number;\n}\n\ninterface NeuralLayer {\n type: 'dense' | 'activation';\n weights: number[][];\n biases: number[];\n activation?: 'relu' | 'sigmoid' | 'tanh' | 'linear';\n}\n\nexport class SimpleNeuralNetwork implements MLModelAPI {\n private network: NativeNeuralNetwork;\n private config: ModelConfig;\n private ready = false;\n\n constructor(config: ModelConfig) {\n this.config = config;\n this.network = {\n layers: [],\n learningRate: 0.01,\n epochs: 100\n };\n }\n\n get id(): string { return this.config.id; }\n get name(): string { return this.config.name; }\n get type(): string { return this.config.type; }\n\n async predict(input: PredictionInput): Promise<PredictionResult> {\n const startTime = performance.now();\n \n const inputData = Array.from(input.data as number[]);\n const outputData = this.forwardPass(inputData);\n \n const processingTime = performance.now() - startTime;\n\n return {\n modelId: this.config.id,\n output: new Float32Array(outputData),\n outputShape: [outputData.length],\n timestamp: Date.now(),\n processingTime\n };\n }\n\n private forwardPass(input: number[]): number[] {\n let activations = input;\n \n for (const layer of this.network.layers) {\n if (layer.type === 'dense') {\n activations = this.denseLayer(activations, layer.weights, layer.biases);\n }\n \n if (layer.activation) {\n activations = this.applyActivation(activations, layer.activation);\n }\n }\n \n return activations;\n }\n\n private denseLayer(input: number[], weights: number[][], biases: number[]): number[] {\n const output: number[] = [];\n for (let i = 0; i < weights.length; i++) {\n let sum = biases[i];\n for (let j = 0; j < input.length; j++) {\n sum += input[j] * weights[i][j];\n }\n output.push(sum);\n }\n return output;\n }\n\n private applyActivation(input: number[], activation: string): number[] {\n switch (activation) {\n case 'relu':\n return input.map(x => Math.max(0, x));\n case 'sigmoid':\n return input.map(x => 1 / (1 + Math.exp(-x)));\n case 'tanh':\n return input.map(x => Math.tanh(x));\n default:\n return input;\n }\n }\n\n getInfo(): ModelConfig {\n return { ...this.config };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n async warmup(): Promise<void> {\n const dummyInput = new Array(10).fill(0.1);\n await this.predict({ data: dummyInput });\n this.ready = true;\n }\n\n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================\n// Native Statistical Models\n// ============================================\n\n/** Result returned when training a small on-chart model (task 3.17). */\nexport interface TrainingResult {\n coefficients: number[];\n intercept: number;\n /** Fitted values for the training inputs. */\n fitted: number[];\n /** Residuals (observed - fitted), suitable for a residual plot. */\n residuals: number[];\n /** Coefficient of determination on the training set. */\n r2: number;\n /** Root mean squared error on the training set. */\n rmse: number;\n}\n\nexport class NativeLinearRegression implements MLModelAPI {\n private config: ModelConfig;\n private coefficients: number[] = [];\n private intercept = 0;\n private ready = false;\n private lastTraining: TrainingResult | null = null;\n\n constructor(config: ModelConfig) {\n this.config = config;\n }\n\n get id(): string { return this.config.id; }\n get name(): string { return this.config.name; }\n get type(): string { return this.config.type; }\n\n async predict(input: PredictionInput): Promise<PredictionResult> {\n const startTime = performance.now();\n\n // Each input entry is treated as a single-feature observation.\n const inputData = Array.from(input.data);\n const predictions = inputData.map((x) => {\n const feat = x as number;\n let result = this.intercept;\n // Univariate: only the first coefficient multiplies the scalar input.\n // Multivariate models should call `predictRows`.\n if (this.coefficients.length > 0) {\n result += this.coefficients[0] * feat;\n }\n return result;\n });\n\n const processingTime = performance.now() - startTime;\n\n return {\n modelId: this.config.id,\n output: new Float32Array(predictions),\n outputShape: [predictions.length],\n timestamp: Date.now(),\n processingTime\n };\n }\n\n /** Predict from full feature rows (multivariate). */\n predictRows(rows: number[][]): number[] {\n return rows.map((row) => {\n let result = this.intercept;\n for (let i = 0; i < this.coefficients.length && i < row.length; i++) {\n result += this.coefficients[i] * row[i];\n }\n return result;\n });\n }\n\n train(data: { x: number[][], y: number[] }): TrainingResult {\n const n = data.x.length;\n\n // Design matrix with an intercept column.\n const X: number[][] = [];\n for (let i = 0; i < n; i++) {\n X.push([1, ...data.x[i]]);\n }\n\n // Normal equation: β = (XᵀX)⁻¹ Xᵀy\n const XtX = matrixMultiply(transpose(X), X);\n const XtY = matrixMultiply(transpose(X), data.y.map((y) => [y]));\n\n const XtXInv = matrixInverse(XtX);\n const beta = matrixMultiply(XtXInv, XtY);\n\n this.intercept = beta[0][0];\n this.coefficients = beta.slice(1).map((row) => row[0]);\n this.ready = true;\n\n // Fit diagnostics for a residual plot.\n const fitted = this.predictRows(data.x);\n const residuals = data.y.map((y, i) => y - fitted[i]);\n const meanY = data.y.reduce((s, v) => s + v, 0) / (n || 1);\n const sse = residuals.reduce((s, r) => s + r * r, 0);\n const sst = data.y.reduce((s, y) => s + (y - meanY) ** 2, 0);\n const r2 = sst > 0 ? 1 - sse / sst : 0;\n const rmse = Math.sqrt(sse / (n || 1));\n\n this.lastTraining = { coefficients: this.coefficients, intercept: this.intercept, fitted, residuals, r2, rmse };\n return this.lastTraining;\n }\n\n getTrainingResult(): TrainingResult | null {\n return this.lastTraining;\n }\n\n getInfo(): ModelConfig {\n return { ...this.config };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n async warmup(): Promise<void> {\n this.coefficients = [1.0];\n this.intercept = 0.0;\n this.ready = true;\n }\n\n dispose(): void {\n this.ready = false;\n this.lastTraining = null;\n }\n}\n\n// ============================================\n// Matrix utilities (general purpose)\n// ============================================\n\nfunction transpose(matrix: number[][]): number[][] {\n return matrix[0].map((_, colIndex) => matrix.map((row) => row[colIndex]));\n}\n\nfunction matrixMultiply(a: number[][], b: number[][]): number[][] {\n const result: number[][] = [];\n for (let i = 0; i < a.length; i++) {\n result[i] = [];\n for (let j = 0; j < b[0].length; j++) {\n let sum = 0;\n for (let k = 0; k < b.length; k++) {\n sum += a[i][k] * b[k][j];\n }\n result[i][j] = sum;\n }\n }\n return result;\n}\n\n/**\n * General square-matrix inverse via Gauss-Jordan elimination with partial\n * pivoting. Falls back to the identity for singular matrices so callers never\n * receive NaNs. Replaces the previous 2x2-only stub (task 3.17 fix).\n */\nexport function matrixInverse(matrix: number[][]): number[][] {\n const n = matrix.length;\n // Augment [A | I]\n const M = matrix.map((row, i) => [\n ...row,\n ...Array.from({ length: n }, (_, j) => (i === j ? 1 : 0)),\n ]);\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) {\n // Singular - return identity as a safe fallback.\n return matrix.map((row, i) => row.map((_, j) => (i === j ? 1 : 0)));\n }\n [M[col], M[pivot]] = [M[pivot], M[col]];\n\n const pivotVal = M[col][col];\n for (let c = 0; c < 2 * n; c++) M[col][c] /= pivotVal;\n\n for (let r = 0; r < n; r++) {\n if (r === col) continue;\n const factor = M[r][col];\n for (let c = 0; c < 2 * n; c++) M[r][c] -= factor * M[col][c];\n }\n }\n\n return M.map((row) => row.slice(n));\n}\n\n// ============================================\n// Native Signal Processing\n// ============================================\n\nexport class NativeSignalProcessor implements MLModelAPI {\n private config: ModelConfig;\n private filterType: 'lowpass' | 'highpass' | 'bandpass';\n private cutoffFrequency: number;\n private sampleRate: number;\n private ready = false;\n\n constructor(config: ModelConfig) {\n this.config = config;\n // Extract parameters from metadata\n this.filterType = (config.metadata?.filterType as any) || 'lowpass';\n this.cutoffFrequency = config.metadata?.cutoffFrequency || 1000;\n this.sampleRate = config.metadata?.sampleRate || 44100;\n }\n\n get id(): string { return this.config.id; }\n get name(): string { return this.config.name; }\n get type(): string { return this.config.type; }\n\n async predict(input: PredictionInput): Promise<PredictionResult> {\n const startTime = performance.now();\n \n const inputData = Array.from(input.data as number[]);\n const filteredData = this.applyFilter(inputData);\n \n const processingTime = performance.now() - startTime;\n\n return {\n modelId: this.config.id,\n output: new Float32Array(filteredData),\n outputShape: [filteredData.length],\n timestamp: Date.now(),\n processingTime\n };\n }\n\n private applyFilter(data: number[]): number[] {\n switch (this.filterType) {\n case 'lowpass':\n return this.lowpassFilter(data);\n case 'highpass':\n return this.highpassFilter(data);\n case 'bandpass':\n return this.bandpassFilter(data);\n default:\n return data;\n }\n }\n\n private lowpassFilter(data: number[]): number[] {\n // Simple exponential moving average low-pass filter\n const alpha = 2 * Math.PI * this.cutoffFrequency / this.sampleRate;\n const smoothedAlpha = alpha / (1 + alpha);\n \n const filtered: number[] = [data[0]];\n for (let i = 1; i < data.length; i++) {\n filtered.push(smoothedAlpha * data[i] + (1 - smoothedAlpha) * filtered[i - 1]);\n }\n return filtered;\n }\n\n private highpassFilter(data: number[]): number[] {\n // High-pass filter using difference\n const filtered: number[] = [];\n for (let i = 1; i < data.length; i++) {\n filtered.push(data[i] - data[i - 1]);\n }\n return filtered;\n }\n\n private bandpassFilter(data: number[]): number[] {\n // Band-pass filter using combination of low-pass and high-pass\n const lowpass = this.lowpassFilter(data);\n return this.highpassFilter(lowpass);\n }\n\n getInfo(): ModelConfig {\n return { ...this.config };\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n async warmup(): Promise<void> {\n this.ready = true;\n }\n\n dispose(): void {\n this.ready = false;\n }\n}\n\n// ============================================\n// Native Model Factory\n// ============================================\n\nexport function createNativeModel(config: ModelConfig): MLModelAPI {\n switch (config.type) {\n case 'neural-network':\n return new SimpleNeuralNetwork(config);\n case 'linear-regression':\n return new NativeLinearRegression(config);\n case 'signal-processor':\n return new NativeSignalProcessor(config);\n default:\n // Default to simple linear model\n return new NativeLinearRegression(config);\n }\n}\n\n// ============================================\n// Native FFT Implementation\n// ============================================\n\nexport function nativeFFT(data: number[]): { real: number[]; imag: number[] } {\n const n = data.length;\n const real: number[] = new Array(n);\n const imag: number[] = new Array(n);\n \n // Simplified DFT (not optimized FFT)\n for (let k = 0; k < n; k++) {\n let sumReal = 0;\n let sumImag = 0;\n \n for (let t = 0; t < n; t++) {\n const angle = -2 * Math.PI * k * t / n;\n sumReal += data[t] * Math.cos(angle);\n sumImag += data[t] * Math.sin(angle);\n }\n \n real[k] = sumReal;\n imag[k] = sumImag;\n }\n \n return { real, imag };\n}\n\n// ============================================\n// Native Statistical Functions\n// ============================================\n\nexport function nativeMean(data: number[]): number {\n return data.reduce((sum, val) => sum + val, 0) / data.length;\n}\n\nexport function nativeStandardDeviation(data: number[]): number {\n const mean = nativeMean(data);\n const variance = data.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / data.length;\n return Math.sqrt(variance);\n}\n\nexport function nativeCorrelation(x: number[], y: number[]): number {\n const n = x.length;\n const meanX = nativeMean(x);\n const meanY = nativeMean(y);\n \n let numerator = 0;\n let denomX = 0;\n let denomY = 0;\n \n for (let i = 0; i < n; i++) {\n const dx = x[i] - meanX;\n const dy = y[i] - meanY;\n numerator += dx * dy;\n denomX += dx * dx;\n denomY += dy * dy;\n }\n \n return numerator / Math.sqrt(denomX * denomY);\n}","import type { \n PluginMLIntegrationConfig, \n MLIntegrationAPI, \n MLModelAPI, \n PredictionResult, \n VisualizationConfig\n} from './types';\nimport { \n createNativeModel,\n nativeFFT, \n nativeMean, \n nativeStandardDeviation, \n nativeCorrelation \n} from './native-algorithms';\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n AfterRenderEvent\n} from '../types';\nimport { exportForecastOverlay } from '../../core/chart/exporter/svg/plugins/regression';\n\nconst manifestML: PluginManifest = {\n name: \"velo-plot-ml-integration\",\n version: \"1.0.0\",\n description: \"Machine Learning Integration Bridge for Velo Plot\",\n provides: [\"ml\", \"prediction\", \"inference\"],\n tags: [\"ml\", \"ai\", \"analysis\"],\n};\n\nexport function PluginMLIntegration(\n userConfig: Partial<PluginMLIntegrationConfig> = {}\n): ChartPlugin<PluginMLIntegrationConfig> {\n let ctx: PluginContext | null = null;\n const models = new Map<string, MLModelAPI>();\n const activeVisualizations = new Map<string, { result: PredictionResult, config: VisualizationConfig }>();\n\n // Register initial models from config\n if (userConfig.models) {\n userConfig.models.forEach(m => models.set(m.id, createNativeModel(m)));\n }\n\n const api: MLIntegrationAPI & Record<string, unknown> = {\n registerModel(model: MLModelAPI) {\n if (!model.id) {\n ctx?.log.error(\"Cannot register model without id\");\n return;\n }\n models.set(model.id, model);\n ctx?.log.info(`Model registered: ${model.name || 'Unnamed'} (${model.id})`);\n },\n\n async runInference(modelId: string, seriesId: string) {\n const model = models.get(modelId);\n if (!model) throw new Error(`Model not found: ${modelId}`);\n\n const seriesData = ctx?.data.getSeriesData(seriesId);\n if (!seriesData) throw new Error(`Series not found: ${seriesId}`);\n\n // Convert to Float32Array for model compatibility\n const data = new Float32Array(seriesData.y);\n\n const result = await model.predict({ data });\n // Attach X values for visualization\n result.xValues = seriesData.x;\n return result;\n },\n\n visualizeResults(result: PredictionResult, config: VisualizationConfig = {}) {\n const vizId = `ml-viz-${Math.random().toString(36).substr(2, 9)}`;\n activeVisualizations.set(vizId, { \n result, \n config: { ...userConfig.defaultVisualization, ...config } \n });\n ctx?.requestRender();\n return vizId;\n },\n\n clearResults(visualizationId?: string) {\n if (visualizationId) {\n activeVisualizations.delete(visualizationId);\n } else {\n activeVisualizations.clear();\n }\n ctx?.requestRender();\n },\n\n /**\n * Alias for {@link visualizeResults} that reads as an intent-revealing\n * name for the prediction-overlay use case (task 3.18).\n */\n visualizePredictions(result: PredictionResult, config: VisualizationConfig = {}) {\n return api.visualizeResults(result, config);\n },\n\n /**\n * Train a small regression model on the fly (task 3.17). Creates a native\n * linear-regression model when the id does not yet exist. Returns fit\n * diagnostics including residuals for a residual plot.\n */\n trainModel(modelId: string, data: { x: number[][]; y: number[] }) {\n let model = models.get(modelId) as any;\n if (!model) {\n model = createNativeModel({ id: modelId, name: modelId, type: 'linear-regression' });\n models.set(modelId, model);\n }\n if (typeof model.train !== 'function') {\n throw new Error(`Model '${modelId}' does not support training`);\n }\n return model.train(data);\n },\n\n /** Retrieve the last training diagnostics for a model, if any. */\n getTrainingResult(modelId: string) {\n const model = models.get(modelId) as any;\n return model?.getTrainingResult?.() ?? null;\n },\n\n /** List registered model descriptors (for the ML audit / introspection). */\n listModels() {\n return Array.from(models.values()).map((m) => m.getInfo());\n },\n\n stats: {\n fft: nativeFFT,\n mean: nativeMean,\n standardDeviation: nativeStandardDeviation,\n correlation: nativeCorrelation\n }\n };\n\n function drawMLVisualizations(pCtx: PluginContext) {\n const { render, coords } = pCtx;\n const { ctx2d } = render;\n if (!ctx2d) return;\n\n activeVisualizations.forEach((viz) => {\n const { result, config } = viz;\n const { output, xValues, confidence } = result;\n if (!xValues) return;\n\n const n = Math.min(xValues.length, output.length);\n\n ctx2d.save();\n\n // 1. Draw Confidence Interval (as filled area)\n if (config.showConfidenceInterval && confidence && confidence.length === n) {\n ctx2d.beginPath();\n const opacity = config.intervalOpacity ?? 0.2;\n ctx2d.fillStyle = (config.lineStyle?.color || '#3b82f6') + Math.floor(opacity * 255).toString(16).padStart(2, '0');\n \n // Forward: upper bound\n for (let i = 0; i < n; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(output[i] + confidence[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n \n // Backward: lower bound\n for (let i = n - 1; i >= 0; i--) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(output[i] - confidence[i]);\n ctx2d.lineTo(px, py);\n }\n \n ctx2d.closePath();\n ctx2d.fill();\n }\n\n // 2. Draw Prediction Line\n ctx2d.beginPath();\n ctx2d.strokeStyle = config.lineStyle?.color || '#3b82f6';\n ctx2d.lineWidth = config.lineStyle?.width || 2;\n if (config.lineStyle?.dash) ctx2d.setLineDash(config.lineStyle.dash);\n\n for (let i = 0; i < n; i++) {\n const px = coords.dataToPixelX(xValues[i]);\n const py = coords.dataToPixelY(output[i]);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n ctx2d.stroke();\n\n ctx2d.restore();\n });\n }\n\n return {\n manifest: manifestML,\n\n onInit(c: PluginContext) {\n ctx = c;\n },\n\n onRenderOverlay(pCtx: PluginContext, _event: AfterRenderEvent) {\n drawMLVisualizations(pCtx);\n },\n\n onExportSVG(svgCtx) {\n if (!svgCtx.builder || svgCtx.exportContext?.options.includeOverlays === false) return;\n activeVisualizations.forEach((viz) => {\n const { result, config } = viz;\n const { output, xValues, confidence } = result;\n if (!xValues?.length) return;\n const n = Math.min(xValues.length, output.length);\n const points = Array.from({ length: n }, (_, i) => ({ x: xValues[i], y: output[i] }));\n const ci =\n config.showConfidenceInterval && confidence?.length === n\n ? {\n upper: points.map((p, i) => ({ x: p.x, y: p.y + confidence[i] })),\n lower: points.map((p, i) => ({ x: p.x, y: p.y - confidence[i] })),\n }\n : undefined;\n exportForecastOverlay(svgCtx, points, ci, config.lineStyle?.color ?? \"#3b82f6\");\n });\n },\n\n api\n };\n}\n\nexport default PluginMLIntegration;\n\nexport type { \n PluginMLIntegrationConfig, \n MLIntegrationAPI, \n MLModelAPI, \n PredictionResult, \n VisualizationConfig \n} from './types';"],"names":["SimpleNeuralNetwork","config","__publicField","input","startTime","inputData","outputData","processingTime","activations","layer","weights","biases","output","i","sum","j","activation","x","dummyInput","NativeLinearRegression","predictions","feat","result","rows","row","data","X","XtX","matrixMultiply","transpose","XtY","y","XtXInv","matrixInverse","beta","fitted","residuals","meanY","s","v","sse","r","sst","r2","rmse","matrix","_","colIndex","a","b","k","n","M","col","pivot","pivotVal","c","factor","NativeSignalProcessor","_a","_b","_c","filteredData","alpha","smoothedAlpha","filtered","lowpass","createNativeModel","nativeFFT","real","imag","sumReal","sumImag","t","angle","nativeMean","val","nativeStandardDeviation","mean","variance","nativeCorrelation","meanX","numerator","denomX","denomY","dx","dy","manifestML","PluginMLIntegration","userConfig","ctx","models","activeVisualizations","m","api","model","modelId","seriesId","seriesData","vizId","visualizationId","drawMLVisualizations","pCtx","render","coords","ctx2d","viz","xValues","confidence","opacity","px","py","_d","_event","svgCtx","points","ci","p","exportForecastOverlay"],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
var p = Object.defineProperty;
|
|
2
2
|
var m = (o, e, r) => e in o ? p(o, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : o[e] = r;
|
|
3
|
-
var
|
|
3
|
+
var c = (o, e, r) => m(o, typeof e != "symbol" ? e + "" : e, r);
|
|
4
4
|
class g {
|
|
5
5
|
// taskId => workerIndex
|
|
6
6
|
constructor(e) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
c(this, "workers", []);
|
|
8
|
+
c(this, "availableWorkers", /* @__PURE__ */ new Set());
|
|
9
|
+
c(this, "taskQueue", []);
|
|
10
|
+
c(this, "activeJobs", /* @__PURE__ */ new Map());
|
|
11
11
|
this.size = e, this.initialize();
|
|
12
12
|
}
|
|
13
13
|
initialize() {
|
|
@@ -104,14 +104,15 @@ const w = {
|
|
|
104
104
|
};
|
|
105
105
|
function y(o = {}) {
|
|
106
106
|
const e = { ...v, ...o };
|
|
107
|
-
let r = null, t = null
|
|
107
|
+
let r = null, t = null;
|
|
108
|
+
const s = {
|
|
108
109
|
enabled: e.enabled,
|
|
109
110
|
frames: 0,
|
|
110
111
|
lastFrameTime: 0,
|
|
111
112
|
lastFrameTimestamp: 0
|
|
112
113
|
};
|
|
113
|
-
function i(a, ...
|
|
114
|
-
e.debug && r && r.log.info(`[Offscreen] ${a}`, ...
|
|
114
|
+
function i(a, ...f) {
|
|
115
|
+
e.debug && r && r.log.info(`[Offscreen] ${a}`, ...f);
|
|
115
116
|
}
|
|
116
117
|
function n() {
|
|
117
118
|
return typeof globalThis.OffscreenCanvas < "u";
|
|
@@ -156,8 +157,8 @@ function y(o = {}) {
|
|
|
156
157
|
onDestroy(a) {
|
|
157
158
|
d(), delete a.chart.offscreen, r = null;
|
|
158
159
|
},
|
|
159
|
-
onAfterRender(a,
|
|
160
|
-
s.frames += 1, s.lastFrameTime =
|
|
160
|
+
onAfterRender(a, f) {
|
|
161
|
+
s.frames += 1, s.lastFrameTime = f.renderTime, s.lastFrameTimestamp = f.timestamp, e.enabled;
|
|
161
162
|
},
|
|
162
163
|
api: u
|
|
163
164
|
};
|