velo-plot 1.12.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +14 -0
  2. package/dist/{index.core-xiNcuFfJ.js → ChartCore-DQ691eXH.js} +1807 -1287
  3. package/dist/ChartCore-DQ691eXH.js.map +1 -0
  4. package/dist/assets/downsample.worker-C70QJ04y.js +2 -0
  5. package/dist/assets/downsample.worker-C70QJ04y.js.map +1 -0
  6. package/dist/assets/indicator.worker-bv0zC4EX.js +2 -0
  7. package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -0
  8. package/dist/core/OverlayRenderer.d.ts +2 -0
  9. package/dist/core/chart/ChartAlerts.d.ts +42 -0
  10. package/dist/core/chart/ChartCore.d.ts +20 -1
  11. package/dist/core/chart/ChartRenderLoop.d.ts +4 -2
  12. package/dist/core/chart/ChartRenderer.d.ts +3 -2
  13. package/dist/core/chart/candlestickMarkers.d.ts +23 -0
  14. package/dist/core/chart/exporter/SVGExporter.d.ts +7 -2
  15. package/dist/core/chart/heikinAshi.d.ts +10 -0
  16. package/dist/core/chart/series/types.d.ts +2 -2
  17. package/dist/core/chart/types.d.ts +9 -0
  18. package/dist/core/indicator/addIndicator.d.ts +36 -0
  19. package/dist/core/indicator/index.d.ts +2 -0
  20. package/dist/core/indicator/indicatorPresets.d.ts +37 -0
  21. package/dist/core/render/pixelSnap.d.ts +8 -0
  22. package/dist/core/series/Series.d.ts +3 -0
  23. package/dist/core/stacked/index.d.ts +3 -1
  24. package/dist/core/stacked/paneResize.d.ts +15 -18
  25. package/dist/core/stacked/stackExport.d.ts +18 -0
  26. package/dist/core/stacked/types.d.ts +42 -5
  27. package/dist/core/time/TimeScale.d.ts +31 -0
  28. package/dist/createStackedChart-BPooTQ9z.js +1164 -0
  29. package/dist/createStackedChart-BPooTQ9z.js.map +1 -0
  30. package/dist/gpu/adapter/gpuRenderer.d.ts +21 -0
  31. package/dist/gpu/backends/webgpu/WebGPUBackend.d.ts +2 -1
  32. package/dist/gpuRenderer-BpaMYz-k.js +1848 -0
  33. package/dist/gpuRenderer-BpaMYz-k.js.map +1 -0
  34. package/dist/index-CUGS98p4.js +277 -0
  35. package/dist/index-CUGS98p4.js.map +1 -0
  36. package/dist/index-D7dTq6VB.js +503 -0
  37. package/dist/index-D7dTq6VB.js.map +1 -0
  38. package/dist/{index-Ce2JgkH_.js → index-DoYxf1cV.js} +86 -43
  39. package/dist/{index-Ce2JgkH_.js.map → index-DoYxf1cV.js.map} +1 -1
  40. package/dist/index.core-BtGFYMOu.js +167 -0
  41. package/dist/index.core-BtGFYMOu.js.map +1 -0
  42. package/dist/index.d.ts +12 -4
  43. package/dist/indicators--eJGmVox.js +302 -0
  44. package/dist/indicators--eJGmVox.js.map +1 -0
  45. package/dist/math-Ddm2EZjj.js +85 -0
  46. package/dist/math-Ddm2EZjj.js.map +1 -0
  47. package/dist/plugins/analysis.js +543 -818
  48. package/dist/plugins/analysis.js.map +1 -1
  49. package/dist/plugins/anomaly-detection.d.ts +1 -0
  50. package/dist/plugins/anomaly-detection.js +221 -0
  51. package/dist/plugins/anomaly-detection.js.map +1 -0
  52. package/dist/plugins/broken-axis.d.ts +3 -0
  53. package/dist/plugins/broken-axis.js +262 -0
  54. package/dist/plugins/broken-axis.js.map +1 -0
  55. package/dist/plugins/caching.d.ts +3 -0
  56. package/dist/plugins/caching.js +187 -0
  57. package/dist/plugins/caching.js.map +1 -0
  58. package/dist/plugins/data-transform.d.ts +3 -0
  59. package/dist/plugins/data-transform.js +146 -0
  60. package/dist/plugins/data-transform.js.map +1 -0
  61. package/dist/plugins/debug.js +12 -11
  62. package/dist/plugins/debug.js.map +1 -1
  63. package/dist/plugins/drawing-tools/index.d.ts +16 -0
  64. package/dist/plugins/forecasting.d.ts +1 -0
  65. package/dist/plugins/forecasting.js +236 -0
  66. package/dist/plugins/forecasting.js.map +1 -0
  67. package/dist/plugins/gpu.js +202 -1895
  68. package/dist/plugins/gpu.js.map +1 -1
  69. package/dist/plugins/index.d.ts +2 -0
  70. package/dist/plugins/keyboard/index.d.ts +1 -7
  71. package/dist/plugins/keyboard.js +1 -1
  72. package/dist/plugins/latex.d.ts +1 -0
  73. package/dist/plugins/latex.js +454 -0
  74. package/dist/plugins/latex.js.map +1 -0
  75. package/dist/plugins/lazy-load/types.d.ts +7 -0
  76. package/dist/plugins/lazy-load.d.ts +3 -0
  77. package/dist/plugins/lazy-load.js +212 -0
  78. package/dist/plugins/lazy-load.js.map +1 -0
  79. package/dist/plugins/ml-integration.d.ts +3 -0
  80. package/dist/plugins/ml-integration.js +355 -0
  81. package/dist/plugins/ml-integration.js.map +1 -0
  82. package/dist/plugins/offscreen.d.ts +3 -0
  83. package/dist/plugins/offscreen.js +169 -0
  84. package/dist/plugins/offscreen.js.map +1 -0
  85. package/dist/plugins/pattern-recognition.d.ts +3 -0
  86. package/dist/plugins/pattern-recognition.js +690 -0
  87. package/dist/plugins/pattern-recognition.js.map +1 -0
  88. package/dist/plugins/radar.d.ts +3 -0
  89. package/dist/plugins/radar.js +103 -0
  90. package/dist/plugins/radar.js.map +1 -0
  91. package/dist/plugins/regression.d.ts +3 -0
  92. package/dist/plugins/regression.js +634 -0
  93. package/dist/plugins/regression.js.map +1 -0
  94. package/dist/plugins/replay/index.d.ts +19 -0
  95. package/dist/plugins/roi.d.ts +1 -0
  96. package/dist/plugins/roi.js +223 -0
  97. package/dist/plugins/roi.js.map +1 -0
  98. package/dist/plugins/snapshot/types.d.ts +1 -1
  99. package/dist/plugins/snapshot.d.ts +3 -0
  100. package/dist/plugins/snapshot.js +90 -0
  101. package/dist/plugins/snapshot.js.map +1 -0
  102. package/dist/plugins/sync/index.d.ts +2 -1
  103. package/dist/plugins/sync.js +13 -269
  104. package/dist/plugins/sync.js.map +1 -1
  105. package/dist/plugins/video-recorder.d.ts +3 -0
  106. package/dist/plugins/video-recorder.js +104 -0
  107. package/dist/plugins/video-recorder.js.map +1 -0
  108. package/dist/plugins/virtualization/types.d.ts +12 -0
  109. package/dist/plugins/virtualization.d.ts +3 -0
  110. package/dist/plugins/virtualization.js +6 -0
  111. package/dist/plugins/virtualization.js.map +1 -0
  112. package/dist/pool-15HMCNv8.js +88 -0
  113. package/dist/pool-15HMCNv8.js.map +1 -0
  114. package/dist/react.d.ts +1 -0
  115. package/dist/react.js +31 -0
  116. package/dist/react.js.map +1 -0
  117. package/dist/renderer/CandlestickRenderer.d.ts +1 -1
  118. package/dist/renderer/ChartSeriesRenderer.d.ts +6 -0
  119. package/dist/renderer/GpuChartRenderer.d.ts +23 -0
  120. package/dist/renderer/index.d.ts +3 -0
  121. package/dist/renderer/spike/WebGLGridSpike.d.ts +40 -0
  122. package/dist/testing/baselines/v1.15.0.json.d.ts +51 -0
  123. package/dist/testing/gridSpikeBenchmark.d.ts +49 -0
  124. package/dist/testing/index.d.ts +5 -0
  125. package/dist/testing/rendererBenchmark.d.ts +13 -0
  126. package/dist/testing/stage1BrowserBench.d.ts +42 -0
  127. package/dist/types.d.ts +21 -1
  128. package/dist/utils-BK5UUXxj.js +172 -0
  129. package/dist/utils-BK5UUXxj.js.map +1 -0
  130. package/dist/velo-plot.full.js +1382 -5932
  131. package/dist/velo-plot.full.js.map +1 -1
  132. package/dist/velo-plot.js +26 -25
  133. package/dist/velo-plot.js.map +1 -1
  134. package/dist/workers/downsample.d.ts +38 -0
  135. package/dist/workers/downsampleAsync.d.ts +6 -0
  136. package/dist/workers/indicator.worker.d.ts +32 -0
  137. package/dist/workers/indicatorsAsync.d.ts +26 -0
  138. package/dist/workers/pool.d.ts +36 -0
  139. package/package.json +19 -2
  140. package/dist/core/OverlayRenderer.test.d.ts +0 -1
  141. package/dist/core/chart/ChartScaling.test.d.ts +0 -1
  142. package/dist/core/chart/NavigationUtils.test.d.ts +0 -1
  143. package/dist/core/format/axisFormat.test.d.ts +0 -1
  144. package/dist/core/indicator/buildIndicatorSeries.test.d.ts +0 -1
  145. package/dist/core/series/SeriesBounds.test.d.ts +0 -1
  146. package/dist/core/stacked/createStackedChart.test.d.ts +0 -1
  147. package/dist/core/stacked/paneAxis.test.d.ts +0 -1
  148. package/dist/core/stacked/paneResize.test.d.ts +0 -1
  149. package/dist/core/sync/index.test.d.ts +0 -1
  150. package/dist/index.core-xiNcuFfJ.js.map +0 -1
  151. package/dist/plugins/tools/tooltip/format.test.d.ts +0 -1
  152. package/dist/utils-Dbro9-qM.js +0 -254
  153. package/dist/utils-Dbro9-qM.js.map +0 -1
@@ -1 +0,0 @@
1
- export {};
@@ -1,254 +0,0 @@
1
- function v(n, r) {
2
- const t = r.length, o = n.map((a, i) => [...a, r[i]]);
3
- for (let a = 0; a < t; a++) {
4
- let i = a;
5
- for (let c = a + 1; c < t; c++)
6
- Math.abs(o[c][a]) > Math.abs(o[i][a]) && (i = c);
7
- const l = o[a];
8
- o[a] = o[i], o[i] = l;
9
- const s = o[a][a];
10
- if (Math.abs(s) < 1e-12)
11
- throw new Error("Matrix is singular or near-singular");
12
- for (let c = a + 1; c < t; c++) {
13
- const f = o[c][a] / s;
14
- for (let u = a; u <= t; u++)
15
- o[c][u] -= f * o[a][u];
16
- }
17
- }
18
- const e = new Array(t).fill(0);
19
- for (let a = t - 1; a >= 0; a--) {
20
- let i = 0;
21
- for (let l = a + 1; l < t; l++)
22
- i += o[a][l] * e[l];
23
- e[a] = (o[a][t] - i) / o[a][a];
24
- }
25
- return e;
26
- }
27
- function F(n, r, t) {
28
- const o = n.length;
29
- if (o === 0) return 0;
30
- let e = 0;
31
- for (let s = 0; s < o; s++) e += r[s];
32
- const a = e / o;
33
- let i = 0, l = 0;
34
- for (let s = 0; s < o; s++) {
35
- const c = r[s], f = t(n[s]);
36
- i += (c - a) * (c - a), l += (c - f) * (c - f);
37
- }
38
- return i === 0 ? 1 : 1 - l / i;
39
- }
40
- function x(n, r, t, o) {
41
- const e = n.length;
42
- if (e < 2) return 0;
43
- let a = 0;
44
- const i = t !== void 0 ? t : n[0], l = o !== void 0 ? o : n[e - 1];
45
- for (let s = 0; s < e - 1; s++) {
46
- const c = n[s], f = n[s + 1];
47
- if (f < i) continue;
48
- if (c > l) break;
49
- const u = Math.max(c, i), h = Math.min(f, l);
50
- if (u < h) {
51
- const y = r[s] + (r[s + 1] - r[s]) * ((u - c) / (f - c)), m = r[s] + (r[s + 1] - r[s]) * ((h - c) / (f - c));
52
- a += (h - u) * (y + m) / 2;
53
- }
54
- }
55
- return a;
56
- }
57
- function I(n, r) {
58
- const t = n.length;
59
- if (t < 2) return new Float32Array(0);
60
- const o = new Float32Array(t);
61
- for (let e = 0; e < t - 1; e++) {
62
- const a = n[e + 1] - n[e];
63
- o[e] = a !== 0 ? (r[e + 1] - r[e]) / a : 0;
64
- }
65
- return o[t - 1] = o[t - 2], o;
66
- }
67
- function k(n, r) {
68
- const t = n.length;
69
- if (t < 1) return new Float32Array(0);
70
- const o = new Float32Array(t);
71
- o[0] = 0;
72
- for (let e = 0; e < t - 1; e++) {
73
- const i = (n[e + 1] - n[e]) * (r[e] + r[e + 1]) / 2;
74
- o[e + 1] = o[e] + i;
75
- }
76
- return o;
77
- }
78
- const M = [
79
- { symbol: "p", factor: 1e-12 },
80
- { symbol: "n", factor: 1e-9 },
81
- { symbol: "µ", factor: 1e-6 },
82
- { symbol: "m", factor: 1e-3 },
83
- { symbol: "", factor: 1 },
84
- { symbol: "k", factor: 1e3 },
85
- { symbol: "M", factor: 1e6 },
86
- { symbol: "G", factor: 1e9 }
87
- ];
88
- function w(n) {
89
- const r = Math.abs(n);
90
- if (r === 0)
91
- return { symbol: "", factor: 1 };
92
- for (let t = M.length - 1; t >= 0; t--) {
93
- const o = M[t], e = r / o.factor;
94
- if (e >= 1 && e < 1e3)
95
- return o;
96
- }
97
- return { symbol: "", factor: 1 };
98
- }
99
- function S(n, r, t = 2) {
100
- const o = w(n);
101
- return `${(n / o.factor).toFixed(t)} ${o.symbol}${r}`;
102
- }
103
- function D(n, r = 3) {
104
- return Math.abs(n) < 1e-3 || Math.abs(n) >= 1e6 ? n.toExponential(r) : n.toFixed(r);
105
- }
106
- function E(n, r = 2) {
107
- return n.toExponential(r);
108
- }
109
- function j(n, r = 1e-3) {
110
- const t = n instanceof Array ? new Float32Array(n) : n;
111
- if (t.length < 3) return [];
112
- const o = [];
113
- let e = 0, a = 1, i = Math.sign(t[1] - t[0]), l = 0;
114
- for (let s = 2; s < t.length; s++) {
115
- const c = Math.sign(t[s] - t[s - 1]);
116
- if (c !== 0 && c !== i) {
117
- if (l++, l >= 2) {
118
- const f = t[e], u = t[s];
119
- Math.abs(u - f) < r && (o.push({
120
- number: a,
121
- startIndex: e,
122
- endIndex: s,
123
- direction: t[e + 1] > t[e] ? 1 : -1
124
- }), a++, e = s, l = 0);
125
- }
126
- i = c;
127
- }
128
- }
129
- return e < t.length - 1 && o.push({
130
- number: a,
131
- startIndex: e,
132
- endIndex: t.length - 1,
133
- direction: t[e + 1] > t[e] ? 1 : -1
134
- }), o;
135
- }
136
- function C(n) {
137
- const r = [], t = 360 / Math.max(n, 1);
138
- for (let o = 0; o < n; o++) {
139
- const e = o * t % 360;
140
- r.push(`hsl(${e}, 70%, 55%)`);
141
- }
142
- return r;
143
- }
144
- function R(n, r, t = {}) {
145
- const { minProminence: o = 0, type: e = "both" } = t, a = [], i = n instanceof Array ? new Float32Array(n) : n, l = r instanceof Array ? new Float32Array(r) : r;
146
- for (let s = 1; s < l.length - 1; s++) {
147
- const c = l[s - 1], f = l[s], u = l[s + 1];
148
- if (f > c && f > u) {
149
- const h = Math.min(f - c, f - u);
150
- h >= o && (e === "both" || e === "max") && a.push({ index: s, x: i[s], y: f, type: "max", prominence: h });
151
- }
152
- if (f < c && f < u) {
153
- const h = Math.min(c - f, u - f);
154
- h >= o && (e === "both" || e === "min") && a.push({ index: s, x: i[s], y: f, type: "min", prominence: h });
155
- }
156
- }
157
- return a;
158
- }
159
- function V(n) {
160
- let r = 0, t = -1;
161
- const o = n instanceof Array ? n : Array.from(n);
162
- for (let e = 0; e < o.length; e++)
163
- isFinite(o[e]) || (r++, t === -1 && (t = e));
164
- return {
165
- valid: r === 0,
166
- invalidCount: r,
167
- firstInvalidIndex: t
168
- };
169
- }
170
- function Y(n) {
171
- const r = n instanceof Array ? n : Array.from(n), t = r.length;
172
- if (t === 0)
173
- return { min: 0, max: 0, mean: 0, stdDev: 0, count: 0 };
174
- let o = r[0], e = r[0], a = 0;
175
- for (let c = 0; c < t; c++) {
176
- const f = r[c];
177
- f < o && (o = f), f > e && (e = f), a += f;
178
- }
179
- const i = a / t;
180
- let l = 0;
181
- for (let c = 0; c < t; c++) {
182
- const f = r[c] - i;
183
- l += f * f;
184
- }
185
- const s = Math.sqrt(l / t);
186
- return { min: o, max: e, mean: i, stdDev: s, count: t };
187
- }
188
- function $(n, r) {
189
- const t = n instanceof Array ? new Float32Array(n) : n, o = new Float32Array(t.length), e = Math.floor(r / 2);
190
- for (let a = 0; a < t.length; a++) {
191
- let i = 0, l = 0;
192
- for (let s = Math.max(0, a - e); s <= Math.min(t.length - 1, a + e); s++)
193
- i += t[s], l++;
194
- o[a] = i / l;
195
- }
196
- return o;
197
- }
198
- function B(n, r, t) {
199
- const o = n.length;
200
- if (t >= o || t < 3)
201
- return { x: new Float32Array(n), y: new Float32Array(r) };
202
- const e = new Float32Array(t), a = new Float32Array(t);
203
- e[0] = n[0], a[0] = r[0];
204
- const i = (o - 2) / (t - 2);
205
- let l = 0, s = 1;
206
- for (let c = 0; c < t - 2; c++) {
207
- const f = Math.floor((c + 1) * i) + 1, u = Math.floor((c + 2) * i) + 1, h = Math.min(Math.floor((c + 3) * i) + 1, o);
208
- let y = 0, m = 0, b = 0;
209
- for (let d = u; d < h; d++)
210
- y += n[d], m += r[d], b++;
211
- b > 0 && (y /= b, m /= b);
212
- let p = -1, A = f;
213
- for (let d = f; d < u && d < o; d++) {
214
- const g = Math.abs(
215
- (n[l] - y) * (r[d] - r[l]) - (n[l] - n[d]) * (m - r[l])
216
- );
217
- g > p && (p = g, A = d);
218
- }
219
- e[s] = n[A], a[s] = r[A], s++, l = A;
220
- }
221
- return e[t - 1] = n[o - 1], a[t - 1] = r[o - 1], { x: e, y: a };
222
- }
223
- function L(n, r, t, o) {
224
- const e = n.length, a = new Float32Array(e);
225
- let i = 0, l = e - 1, s = 1 / 0, c = 1 / 0;
226
- for (let m = 0; m < e; m++) {
227
- const b = Math.abs(n[m] - t), p = Math.abs(n[m] - o);
228
- b < s && (s = b, i = m), p < c && (c = p, l = m);
229
- }
230
- const f = r[i], h = (r[l] - f) / (n[l] - n[i]), y = f - h * n[i];
231
- for (let m = 0; m < e; m++)
232
- a[m] = r[m] - (h * n[m] + y);
233
- return a;
234
- }
235
- export {
236
- F as a,
237
- L as b,
238
- Y as c,
239
- B as d,
240
- j as e,
241
- S as f,
242
- C as g,
243
- R as h,
244
- x as i,
245
- I as j,
246
- D as k,
247
- E as l,
248
- $ as m,
249
- w as n,
250
- k as o,
251
- v as s,
252
- V as v
253
- };
254
- //# sourceMappingURL=utils-Dbro9-qM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils-Dbro9-qM.js","sources":["../src/plugins/analysis/math.ts","../src/plugins/analysis/utils.ts"],"sourcesContent":["/**\n * Mathematical utilities for numerical analysis and regression.\n */\n\n/**\n * Solve a system of linear equations Ax = B using Gaussian elimination with partial pivoting.\n * \n * @param A - Matrix coefficients\n * @param B - Right hand side vector\n * @returns Solution vector x\n */\nexport function solveLinearSystem(A: number[][], B: number[]): number[] {\n const n = B.length;\n const matrix = A.map((row, i) => [...row, B[i]]);\n\n for (let i = 0; i < n; i++) {\n // Partial pivoting\n let maxRow = i;\n for (let k = i + 1; k < n; k++) {\n if (Math.abs(matrix[k][i]) > Math.abs(matrix[maxRow][i])) {\n maxRow = k;\n }\n }\n\n // Swap rows\n const temp = matrix[i];\n matrix[i] = matrix[maxRow];\n matrix[maxRow] = temp;\n\n // Pivot must be non-zero\n const pivot = matrix[i][i];\n if (Math.abs(pivot) < 1e-12) {\n throw new Error(\"Matrix is singular or near-singular\");\n }\n\n // Eliminate below\n for (let k = i + 1; k < n; k++) {\n const factor = matrix[k][i] / pivot;\n for (let j = i; j <= n; j++) {\n matrix[k][j] -= factor * matrix[i][j];\n }\n }\n }\n\n // Back substitution\n const x = new Array(n).fill(0);\n for (let i = n - 1; i >= 0; i--) {\n let sum = 0;\n for (let j = i + 1; j < n; j++) {\n sum += matrix[i][j] * x[j];\n }\n x[i] = (matrix[i][n] - sum) / matrix[i][i];\n }\n\n return x;\n}\n\n/**\n * Calculate R² (coefficient of determination)\n */\nexport function calculateR2(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n fitFn: (x: number) => number\n): number {\n const n = x.length;\n if (n === 0) return 0;\n\n let sumY = 0;\n for (let i = 0; i < n; i++) sumY += y[i];\n const meanY = sumY / n;\n\n let ssTot = 0; // Total sum of squares\n let ssRes = 0; // Residual sum of squares\n\n for (let i = 0; i < n; i++) {\n const yi = y[i];\n const fi = fitFn(x[i]);\n ssTot += (yi - meanY) * (yi - meanY);\n ssRes += (yi - fi) * (yi - fi);\n }\n\n return ssTot === 0 ? 1 : 1 - ssRes / ssTot;\n}\n\n/**\n * Numerical integration using the trapezoidal rule.\n * \n * @param x - X values (must be sorted)\n * @param y - Y values\n * @param xMin - Optional start of integration range\n * @param xMax - Optional end of integration range\n */\nexport function integrate(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n xMin?: number,\n xMax?: number\n): number {\n const n = x.length;\n if (n < 2) return 0;\n\n let area = 0;\n const start = xMin !== undefined ? xMin : x[0];\n const end = xMax !== undefined ? xMax : x[n - 1];\n\n for (let i = 0; i < n - 1; i++) {\n const x1 = x[i];\n const x2 = x[i + 1];\n \n // Skip if outside range\n if (x2 < start) continue;\n if (x1 > end) break;\n\n // Handle partial intervals at boundaries\n const ia = Math.max(x1, start);\n const ib = Math.min(x2, end);\n\n if (ia < ib) {\n // Linear interpolation for y values at boundaries if needed\n const y1 = y[i] + (y[i + 1] - y[i]) * ((ia - x1) / (x2 - x1));\n const y2 = y[i] + (y[i + 1] - y[i]) * ((ib - x1) / (x2 - x1));\n \n area += (ib - ia) * (y1 + y2) / 2;\n }\n }\n\n return area;\n}\n\n/**\n * Calculate numerical derivative dy/dx\n */\nexport function derivative(\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): Float32Array {\n const n = x.length;\n if (n < 2) return new Float32Array(0);\n\n const result = new Float32Array(n);\n for (let i = 0; i < n - 1; i++) {\n const dx = x[i + 1] - x[i];\n result[i] = dx !== 0 ? (y[i + 1] - y[i]) / dx : 0;\n }\n // Last point same as previous for length matching\n result[n - 1] = result[n - 2];\n return result;\n}\n\n/**\n * Calculate cumulative integral (area array)\n */\nexport function cumulativeIntegral(\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): Float32Array {\n const n = x.length;\n if (n < 1) return new Float32Array(0);\n\n const result = new Float32Array(n);\n result[0] = 0;\n \n for (let i = 0; i < n - 1; i++) {\n const dx = x[i + 1] - x[i];\n const area = dx * (y[i] + y[i + 1]) / 2;\n result[i + 1] = result[i] + area;\n }\n \n return result;\n}\n","/**\n * Data Analysis Utilities\n *\n * General-purpose utilities for scientific data formatting,\n * cycle detection, peak detection, and data validation.\n */\n\n// ============================================\n// Unit Prefixes\n// ============================================\n\ntype SIPrefix = 'p' | 'n' | 'µ' | 'm' | '' | 'k' | 'M' | 'G';\n\nexport interface PrefixInfo {\n symbol: SIPrefix;\n factor: number;\n}\n\nconst SI_PREFIXES: PrefixInfo[] = [\n { symbol: 'p', factor: 1e-12 },\n { symbol: 'n', factor: 1e-9 },\n { symbol: 'µ', factor: 1e-6 },\n { symbol: 'm', factor: 1e-3 },\n { symbol: '', factor: 1 },\n { symbol: 'k', factor: 1e3 },\n { symbol: 'M', factor: 1e6 },\n { symbol: 'G', factor: 1e9 },\n];\n\n/**\n * Find the best SI prefix for a value\n */\nexport function getBestPrefix(value: number): PrefixInfo {\n const absValue = Math.abs(value);\n\n if (absValue === 0) {\n return { symbol: '', factor: 1 };\n }\n\n // Find prefix where value becomes 1-999\n for (let i = SI_PREFIXES.length - 1; i >= 0; i--) {\n const prefix = SI_PREFIXES[i];\n const scaled = absValue / prefix.factor;\n if (scaled >= 1 && scaled < 1000) {\n return prefix;\n }\n }\n\n // Default to base unit\n return { symbol: '', factor: 1 };\n}\n\n/**\n * Format a value with automatic SI prefix\n *\n * @example\n * formatWithPrefix(0.000001, 'A') // \"1.00 µA\"\n * formatWithPrefix(0.5, 'V') // \"500 mV\"\n * formatWithPrefix(1500, 'm') // \"1.50 km\"\n */\nexport function formatWithPrefix(\n value: number,\n unit: string,\n decimals = 2\n): string {\n const prefix = getBestPrefix(value);\n const scaled = value / prefix.factor;\n return `${scaled.toFixed(decimals)} ${prefix.symbol}${unit}`;\n}\n\n/**\n * Format a numeric value with specified decimals\n * Automatically switches to scientific notation for very large/small values\n */\nexport function formatValue(value: number, decimals = 3): string {\n if (Math.abs(value) < 0.001 || Math.abs(value) >= 1e6) {\n return value.toExponential(decimals);\n }\n return value.toFixed(decimals);\n}\n\n/**\n * Format value in scientific notation\n */\nexport function formatScientific(value: number, decimals = 2): string {\n return value.toExponential(decimals);\n}\n\n// ============================================\n// Cycle Detection\n// ============================================\n\nexport interface CycleInfo {\n /** Cycle number (1-indexed) */\n number: number;\n /** Start index in data array */\n startIndex: number;\n /** End index in data array */\n endIndex: number;\n /** Direction at start: 1 = forward, -1 = reverse */\n direction: 1 | -1;\n}\n\n/**\n * Detect cycles in oscillating data\n *\n * A cycle is complete when the signal returns to its starting value\n * after going through both sweep directions. Useful for:\n * - Cyclic voltammetry data\n * - Periodic signals\n * - Oscillation analysis\n *\n * @param signal - The signal data (e.g., potential, position, etc.)\n * @param tolerance - How close to starting value to consider a cycle complete\n */\nexport function detectCycles(\n signal: Float32Array | Float64Array | number[],\n tolerance = 0.001\n): CycleInfo[] {\n const data = signal instanceof Array ? new Float32Array(signal) : signal;\n \n if (data.length < 3) return [];\n\n const cycles: CycleInfo[] = [];\n let cycleStart = 0;\n let cycleNumber = 1;\n\n // Determine initial direction\n let prevDirection = Math.sign(data[1] - data[0]);\n let directionChanges = 0;\n\n for (let i = 2; i < data.length; i++) {\n const direction = Math.sign(data[i] - data[i - 1]);\n\n // Skip if no movement\n if (direction === 0) continue;\n\n // Direction change detected\n if (direction !== prevDirection) {\n directionChanges++;\n\n // After 2 direction changes, check if we're back at start\n if (directionChanges >= 2) {\n const startValue = data[cycleStart];\n const currentValue = data[i];\n\n if (Math.abs(currentValue - startValue) < tolerance) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: i,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n\n cycleNumber++;\n cycleStart = i;\n directionChanges = 0;\n }\n }\n\n prevDirection = direction;\n }\n }\n\n // Handle last incomplete cycle\n if (cycleStart < data.length - 1) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: data.length - 1,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n }\n\n return cycles;\n}\n\n/**\n * Generate distinct colors for cycles/series\n *\n * Uses HSL color space to generate evenly distributed hues\n */\nexport function generateCycleColors(count: number): string[] {\n const colors: string[] = [];\n const hueStep = 360 / Math.max(count, 1);\n\n for (let i = 0; i < count; i++) {\n const hue = (i * hueStep) % 360;\n colors.push(`hsl(${hue}, 70%, 55%)`);\n }\n\n return colors;\n}\n\n// ============================================\n// Peak Detection\n// ============================================\n\nexport interface Peak {\n /** Index in data array */\n index: number;\n /** X value at peak */\n x: number;\n /** Y value at peak */\n y: number;\n /** Peak type */\n type: 'max' | 'min';\n /** Prominence of the peak */\n prominence: number;\n}\n\n/**\n * Detect peaks (local maxima and minima) in data\n *\n * Uses simple local extrema detection with optional prominence filtering.\n * Useful for:\n * - Signal peak detection\n * - Finding local maxima/minima\n * - Feature extraction\n *\n * @param x - X values (independent variable)\n * @param y - Y values (dependent variable)\n * @param options - Detection options\n */\nexport function detectPeaks(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n options: {\n /** Minimum prominence to be considered a peak */\n minProminence?: number;\n /** Only return 'max' or 'min' peaks */\n type?: 'max' | 'min' | 'both';\n } = {}\n): Peak[] {\n const { minProminence = 0, type = 'both' } = options;\n const peaks: Peak[] = [];\n\n const xData = x instanceof Array ? new Float32Array(x) : x;\n const yData = y instanceof Array ? new Float32Array(y) : y;\n\n for (let i = 1; i < yData.length - 1; i++) {\n const prev = yData[i - 1];\n const curr = yData[i];\n const next = yData[i + 1];\n\n // Local maximum\n if (curr > prev && curr > next) {\n const prominence = Math.min(curr - prev, curr - next);\n if (prominence >= minProminence && (type === 'both' || type === 'max')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'max', prominence });\n }\n }\n\n // Local minimum\n if (curr < prev && curr < next) {\n const prominence = Math.min(prev - curr, next - curr);\n if (prominence >= minProminence && (type === 'both' || type === 'min')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'min', prominence });\n }\n }\n }\n\n return peaks;\n}\n\n// ============================================\n// Data Validation\n// ============================================\n\nexport interface ValidationResult {\n /** Whether all data is valid */\n valid: boolean;\n /** Number of invalid values (NaN, Infinity, etc.) */\n invalidCount: number;\n /** Index of first invalid value (-1 if all valid) */\n firstInvalidIndex: number;\n}\n\n/**\n * Validate that data contains only finite numbers\n *\n * Checks for NaN, Infinity, and -Infinity values.\n * Useful for data quality checks before rendering.\n */\nexport function validateData(\n data: Float32Array | Float64Array | number[]\n): ValidationResult {\n let invalidCount = 0;\n let firstInvalidIndex = -1;\n\n const arr = data instanceof Array ? data : Array.from(data);\n\n for (let i = 0; i < arr.length; i++) {\n if (!isFinite(arr[i])) {\n invalidCount++;\n if (firstInvalidIndex === -1) {\n firstInvalidIndex = i;\n }\n }\n }\n\n return {\n valid: invalidCount === 0,\n invalidCount,\n firstInvalidIndex,\n };\n}\n\n// ============================================\n// Data Statistics\n// ============================================\n\nexport interface DataStats {\n min: number;\n max: number;\n mean: number;\n stdDev: number;\n count: number;\n}\n\n/**\n * Calculate basic statistics for a dataset\n */\nexport function calculateStats(\n data: Float32Array | Float64Array | number[]\n): DataStats {\n const arr = data instanceof Array ? data : Array.from(data);\n const count = arr.length;\n\n if (count === 0) {\n return { min: 0, max: 0, mean: 0, stdDev: 0, count: 0 };\n }\n\n let min = arr[0];\n let max = arr[0];\n let sum = 0;\n\n for (let i = 0; i < count; i++) {\n const val = arr[i];\n if (val < min) min = val;\n if (val > max) max = val;\n sum += val;\n }\n\n const mean = sum / count;\n\n // Calculate standard deviation\n let sumSquaredDiff = 0;\n for (let i = 0; i < count; i++) {\n const diff = arr[i] - mean;\n sumSquaredDiff += diff * diff;\n }\n const stdDev = Math.sqrt(sumSquaredDiff / count);\n\n return { min, max, mean, stdDev, count };\n}\n\n// ============================================\n// Data Smoothing\n// ============================================\n\n/**\n * Apply moving average smoothing to data\n *\n * @param data - Input data array\n * @param windowSize - Number of points to average (must be odd)\n */\nexport function movingAverage(\n data: Float32Array | Float64Array | number[],\n windowSize: number\n): Float32Array {\n const arr = data instanceof Array ? new Float32Array(data) : data;\n const result = new Float32Array(arr.length);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < arr.length; i++) {\n let sum = 0;\n let count = 0;\n\n for (let j = Math.max(0, i - halfWindow); j <= Math.min(arr.length - 1, i + halfWindow); j++) {\n sum += arr[j];\n count++;\n }\n\n result[i] = sum / count;\n }\n\n return result;\n}\n\n/**\n * Downsample data using LTTB (Largest Triangle Three Buckets) algorithm\n *\n * Preserves visual characteristics while reducing point count.\n * Ideal for rendering large datasets efficiently.\n *\n * @param x - X values\n * @param y - Y values\n * @param targetPoints - Desired number of output points\n */\nexport function downsampleLTTB(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): { x: Float32Array; y: Float32Array } {\n const dataLength = x.length;\n\n if (targetPoints >= dataLength || targetPoints < 3) {\n return { x: new Float32Array(x), y: new Float32Array(y) };\n }\n\n const sampledX = new Float32Array(targetPoints);\n const sampledY = new Float32Array(targetPoints);\n\n // Always include first point\n sampledX[0] = x[0];\n sampledY[0] = y[0];\n\n const bucketSize = (dataLength - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let sampledIndex = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket range\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n const nextBucketEnd = Math.min(Math.floor((i + 3) * bucketSize) + 1, dataLength);\n\n // Calculate average of next bucket for comparison\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = bucketEnd; j < nextBucketEnd; j++) {\n avgX += x[j];\n avgY += y[j];\n avgCount++;\n }\n\n if (avgCount > 0) {\n avgX /= avgCount;\n avgY /= avgCount;\n }\n\n // Find point in current bucket with largest triangle area\n let maxArea = -1;\n let maxAreaIndex = bucketStart;\n\n for (let j = bucketStart; j < bucketEnd && j < dataLength; j++) {\n // Triangle area calculation\n const area = Math.abs(\n (x[a] - avgX) * (y[j] - y[a]) - (x[a] - x[j]) * (avgY - y[a])\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxAreaIndex = j;\n }\n }\n\n sampledX[sampledIndex] = x[maxAreaIndex];\n sampledY[sampledIndex] = y[maxAreaIndex];\n sampledIndex++;\n a = maxAreaIndex;\n }\n\n // Always include last point\n sampledX[targetPoints - 1] = x[dataLength - 1];\n sampledY[targetPoints - 1] = y[dataLength - 1];\n\n return { x: sampledX, y: sampledY };\n}\n\n/**\n * Subtract a linear baseline from data\n * \n * @param x - X data\n * @param y - Y data\n * @param x1 - Start of baseline segment\n * @param x2 - End of baseline segment\n */\nexport function subtractBaseline(\n x: Float32Array | number[],\n y: Float32Array | number[],\n x1: number,\n x2: number\n): Float32Array {\n const n = x.length;\n const result = new Float32Array(n);\n\n // Find points near x1 and x2 to determine baseline\n let i1 = 0, i2 = n - 1;\n let minDist1 = Infinity, minDist2 = Infinity;\n\n for (let i = 0; i < n; i++) {\n const d1 = Math.abs(x[i] - x1);\n const d2 = Math.abs(x[i] - x2);\n if (d1 < minDist1) { minDist1 = d1; i1 = i; }\n if (d2 < minDist2) { minDist2 = d2; i2 = i; }\n }\n\n const y1 = y[i1];\n const y2 = y[i2];\n const slope = (y2 - y1) / (x[i2] - x[i1]);\n const intercept = y1 - slope * x[i1];\n\n for (let i = 0; i < n; i++) {\n result[i] = y[i] - (slope * x[i] + intercept);\n }\n\n return result;\n}\n"],"names":["solveLinearSystem","A","B","n","matrix","row","i","maxRow","k","temp","pivot","factor","j","x","sum","calculateR2","y","fitFn","sumY","meanY","ssTot","ssRes","yi","fi","integrate","xMin","xMax","area","start","end","x1","x2","ia","ib","y1","y2","derivative","result","dx","cumulativeIntegral","SI_PREFIXES","getBestPrefix","value","absValue","prefix","scaled","formatWithPrefix","unit","decimals","formatValue","formatScientific","detectCycles","signal","tolerance","data","cycles","cycleStart","cycleNumber","prevDirection","directionChanges","direction","startValue","currentValue","generateCycleColors","count","colors","hueStep","hue","detectPeaks","options","minProminence","type","peaks","xData","yData","prev","curr","next","prominence","validateData","invalidCount","firstInvalidIndex","arr","calculateStats","min","max","val","mean","sumSquaredDiff","diff","stdDev","movingAverage","windowSize","halfWindow","downsampleLTTB","targetPoints","dataLength","sampledX","sampledY","bucketSize","a","sampledIndex","bucketStart","bucketEnd","nextBucketEnd","avgX","avgY","avgCount","maxArea","maxAreaIndex","subtractBaseline","i1","i2","minDist1","minDist2","d1","d2","slope","intercept"],"mappings":"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"}