dsh-pf-stream 0.0.0-stage → 0.1.2

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 (92) hide show
  1. package/LICENSE +201 -0
  2. package/README.en.md +110 -0
  3. package/README.md +109 -2
  4. package/cordis.patch.yml +2 -0
  5. package/lib/entry/adapter.d.ts +21 -0
  6. package/lib/entry/adapter.js +112 -0
  7. package/lib/entry/adapter.js.map +1 -0
  8. package/lib/entry/legacyNormalizer.d.ts +16 -0
  9. package/lib/entry/legacyNormalizer.js +86 -0
  10. package/lib/entry/legacyNormalizer.js.map +1 -0
  11. package/lib/errors.d.ts +7 -0
  12. package/lib/errors.js +12 -0
  13. package/lib/errors.js.map +1 -0
  14. package/lib/index.d.ts +108 -0
  15. package/lib/index.js +109 -0
  16. package/lib/index.js.map +1 -0
  17. package/lib/session/state.d.ts +25 -0
  18. package/lib/session/state.js +255 -0
  19. package/lib/session/state.js.map +1 -0
  20. package/lib/stage0/decoder.d.ts +57 -0
  21. package/lib/stage0/decoder.js +229 -0
  22. package/lib/stage0/decoder.js.map +1 -0
  23. package/lib/stage0/ffmpeg.d.ts +34 -0
  24. package/lib/stage0/ffmpeg.js +90 -0
  25. package/lib/stage0/ffmpeg.js.map +1 -0
  26. package/lib/stage0/probe.d.ts +47 -0
  27. package/lib/stage0/probe.js +150 -0
  28. package/lib/stage0/probe.js.map +1 -0
  29. package/lib/stage1/gradient.d.ts +27 -0
  30. package/lib/stage1/gradient.js +85 -0
  31. package/lib/stage1/gradient.js.map +1 -0
  32. package/lib/stage1/perceive.d.ts +66 -0
  33. package/lib/stage1/perceive.js +233 -0
  34. package/lib/stage1/perceive.js.map +1 -0
  35. package/lib/stage2/stateMachine.d.ts +70 -0
  36. package/lib/stage2/stateMachine.js +180 -0
  37. package/lib/stage2/stateMachine.js.map +1 -0
  38. package/lib/stage2/switchDetector.d.ts +18 -0
  39. package/lib/stage2/switchDetector.js +34 -0
  40. package/lib/stage2/switchDetector.js.map +1 -0
  41. package/lib/stage3/deterministicRouter.d.ts +44 -0
  42. package/lib/stage3/deterministicRouter.js +203 -0
  43. package/lib/stage3/deterministicRouter.js.map +1 -0
  44. package/lib/stage3/streamSampler.d.ts +74 -0
  45. package/lib/stage3/streamSampler.js +497 -0
  46. package/lib/stage3/streamSampler.js.map +1 -0
  47. package/lib/stage4/canvasPacker.d.ts +60 -0
  48. package/lib/stage4/canvasPacker.js +161 -0
  49. package/lib/stage4/canvasPacker.js.map +1 -0
  50. package/lib/stage4/markers.d.ts +19 -0
  51. package/lib/stage4/markers.js +98 -0
  52. package/lib/stage4/markers.js.map +1 -0
  53. package/lib/stage4/viewport.d.ts +61 -0
  54. package/lib/stage4/viewport.js +151 -0
  55. package/lib/stage4/viewport.js.map +1 -0
  56. package/lib/stage5/controller.d.ts +61 -0
  57. package/lib/stage5/controller.js +260 -0
  58. package/lib/stage5/controller.js.map +1 -0
  59. package/lib/stage5/intent.d.ts +27 -0
  60. package/lib/stage5/intent.js +87 -0
  61. package/lib/stage5/intent.js.map +1 -0
  62. package/lib/stage6/history.d.ts +52 -0
  63. package/lib/stage6/history.js +155 -0
  64. package/lib/stage6/history.js.map +1 -0
  65. package/lib/stage6/precheck.d.ts +56 -0
  66. package/lib/stage6/precheck.js +86 -0
  67. package/lib/stage6/precheck.js.map +1 -0
  68. package/lib/tool/handler.d.ts +35 -0
  69. package/lib/tool/handler.js +56 -0
  70. package/lib/tool/handler.js.map +1 -0
  71. package/lib/tool/schema.d.ts +29 -0
  72. package/lib/tool/schema.js +59 -0
  73. package/lib/tool/schema.js.map +1 -0
  74. package/lib/tool/streamCall.d.ts +41 -0
  75. package/lib/tool/streamCall.js +105 -0
  76. package/lib/tool/streamCall.js.map +1 -0
  77. package/lib/types.d.ts +355 -0
  78. package/lib/types.js +11 -0
  79. package/lib/types.js.map +1 -0
  80. package/lib/utils/ffmpegBin.d.ts +20 -0
  81. package/lib/utils/ffmpegBin.js +62 -0
  82. package/lib/utils/ffmpegBin.js.map +1 -0
  83. package/lib/utils/hash.d.ts +13 -0
  84. package/lib/utils/hash.js +24 -0
  85. package/lib/utils/hash.js.map +1 -0
  86. package/lib/utils/image.d.ts +32 -0
  87. package/lib/utils/image.js +135 -0
  88. package/lib/utils/image.js.map +1 -0
  89. package/lib/utils/pts.d.ts +15 -0
  90. package/lib/utils/pts.js +50 -0
  91. package/lib/utils/pts.js.map +1 -0
  92. package/package.json +55 -4
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Stage 1 —— Sobel 梯度与灰度直方图(64×36 感知灰度图上的纯函数)。
3
+ *
4
+ * 规格《三、前端轻量感知与施密特四状态机》:
5
+ * - g_t 为整帧 3×3 Sobel 梯度幅值均值;
6
+ * - 分块 ḡ_{t,k} 为块内 Sobel 幅值均值(8×9 块);
7
+ * - 硬切判据用相邻帧 16-bin 归一化灰度直方图 L1 距离。
8
+ *
9
+ * 边界处理:3×3 邻域在图像边缘按最近邻钳制(确定性,无随机性)。
10
+ */
11
+ export declare const GRAY_W = 64;
12
+ export declare const GRAY_H = 36;
13
+ export declare const GRID_COLS = 8;
14
+ export declare const GRID_ROWS = 4;
15
+ export declare const BLOCK_W = 8;
16
+ export declare const BLOCK_H = 9;
17
+ export declare const BLOCK_COUNT: number;
18
+ /** 整帧 Sobel 幅值图(长度 GRAY_W*GRAY_H)。 */
19
+ export declare function sobelMagnitude(gray: Float64Array): Float64Array;
20
+ /** 整帧梯度均值 g_t。 */
21
+ export declare function frameSobelMean(mag: Float64Array): number;
22
+ /** 32 分块的块内 Sobel 幅值均值 ḡ_k。 */
23
+ export declare function blockSobelMeans(mag: Float64Array): Float64Array;
24
+ /** 16-bin 归一化灰度直方图(总和为 1)。 */
25
+ export declare function grayHistogram16(gray: Float64Array): Float64Array;
26
+ /** 相邻帧直方图 L1 距离 D_hist。 */
27
+ export declare function histL1Distance(a: Float64Array, b: Float64Array): number;
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Stage 1 —— Sobel 梯度与灰度直方图(64×36 感知灰度图上的纯函数)。
3
+ *
4
+ * 规格《三、前端轻量感知与施密特四状态机》:
5
+ * - g_t 为整帧 3×3 Sobel 梯度幅值均值;
6
+ * - 分块 ḡ_{t,k} 为块内 Sobel 幅值均值(8×9 块);
7
+ * - 硬切判据用相邻帧 16-bin 归一化灰度直方图 L1 距离。
8
+ *
9
+ * 边界处理:3×3 邻域在图像边缘按最近邻钳制(确定性,无随机性)。
10
+ */
11
+ export const GRAY_W = 64;
12
+ export const GRAY_H = 36;
13
+ export const GRID_COLS = 8;
14
+ export const GRID_ROWS = 4;
15
+ export const BLOCK_W = 8;
16
+ export const BLOCK_H = 9;
17
+ export const BLOCK_COUNT = GRID_COLS * GRID_ROWS;
18
+ /** 整帧 Sobel 幅值图(长度 GRAY_W*GRAY_H)。 */
19
+ export function sobelMagnitude(gray) {
20
+ const out = new Float64Array(GRAY_W * GRAY_H);
21
+ for (let y = 0; y < GRAY_H; y++) {
22
+ for (let x = 0; x < GRAY_W; x++) {
23
+ const xm = x > 0 ? x - 1 : 0;
24
+ const xp = x < GRAY_W - 1 ? x + 1 : GRAY_W - 1;
25
+ const ym = y > 0 ? y - 1 : 0;
26
+ const yp = y < GRAY_H - 1 ? y + 1 : GRAY_H - 1;
27
+ const tl = gray[ym * GRAY_W + xm];
28
+ const tc = gray[ym * GRAY_W + x];
29
+ const tr = gray[ym * GRAY_W + xp];
30
+ const ml = gray[y * GRAY_W + xm];
31
+ const mr = gray[y * GRAY_W + xp];
32
+ const bl = gray[yp * GRAY_W + xm];
33
+ const bc = gray[yp * GRAY_W + x];
34
+ const br = gray[yp * GRAY_W + xp];
35
+ const gx = tr + 2 * mr + br - tl - 2 * ml - bl;
36
+ const gy = bl + 2 * bc + br - tl - 2 * tc - tr;
37
+ out[y * GRAY_W + x] = Math.hypot(gx, gy);
38
+ }
39
+ }
40
+ return out;
41
+ }
42
+ /** 整帧梯度均值 g_t。 */
43
+ export function frameSobelMean(mag) {
44
+ let sum = 0;
45
+ for (let i = 0; i < mag.length; i++)
46
+ sum += mag[i];
47
+ return sum / mag.length;
48
+ }
49
+ /** 32 分块的块内 Sobel 幅值均值 ḡ_k。 */
50
+ export function blockSobelMeans(mag) {
51
+ const out = new Float64Array(BLOCK_COUNT);
52
+ for (let br = 0; br < GRID_ROWS; br++) {
53
+ for (let bc = 0; bc < GRID_COLS; bc++) {
54
+ let sum = 0;
55
+ for (let y = 0; y < BLOCK_H; y++) {
56
+ for (let x = 0; x < BLOCK_W; x++) {
57
+ sum += mag[(br * BLOCK_H + y) * GRAY_W + bc * BLOCK_W + x];
58
+ }
59
+ }
60
+ out[br * GRID_COLS + bc] = sum / (BLOCK_W * BLOCK_H);
61
+ }
62
+ }
63
+ return out;
64
+ }
65
+ /** 16-bin 归一化灰度直方图(总和为 1)。 */
66
+ export function grayHistogram16(gray) {
67
+ const hist = new Float64Array(16);
68
+ for (let i = 0; i < gray.length; i++) {
69
+ const v = gray[i];
70
+ const bin = Math.min(15, Math.max(0, Math.floor(v * 16)));
71
+ hist[bin] += 1;
72
+ }
73
+ const total = gray.length;
74
+ for (let b = 0; b < 16; b++)
75
+ hist[b] = hist[b] / total;
76
+ return hist;
77
+ }
78
+ /** 相邻帧直方图 L1 距离 D_hist。 */
79
+ export function histL1Distance(a, b) {
80
+ let sum = 0;
81
+ for (let i = 0; i < 16; i++)
82
+ sum += Math.abs(a[i] - b[i]);
83
+ return sum;
84
+ }
85
+ //# sourceMappingURL=gradient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradient.js","sourceRoot":"","sources":["../../src/stage1/gradient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,CAAC;AACzB,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,CAAC;AACzB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjD,sCAAsC;AACtC,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/C,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,CAAE,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,GAAG,CAAC,CAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,CAAE,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,CAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,CAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,CAAE,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,GAAG,CAAC,CAAE,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,CAAE,CAAC;YACnC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAC/C,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,cAAc,CAAC,GAAiB;IAC9C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC;IACpD,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;AAC1B,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,eAAe,CAAC,GAAiB;IAC/C,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;IAC1C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;QACtC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjC,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,OAAO,GAAG,CAAC,CAAE,CAAC;gBAC9D,CAAC;YACH,CAAC;YACD,GAAG,CAAC,EAAE,GAAG,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAE,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,cAAc,CAAC,CAAe,EAAE,CAAe;IAC7D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAC5D,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Stage 1 —— 前端轻量感知:双通道变化标量 d_t 与频闪翻转率 r_flip。
3
+ *
4
+ * 规格《三》§1/§2:
5
+ * - 64×36 归一化灰度 → 32 分块(8 列 × 4 行,每块 8×9);
6
+ * - δ_k = clamp(δ_raw/(ḡ_k+0.05) × 0.25, 0, 1),ΔB_k = w_k·δ_k(roi_hint 命中 w=2.0,其余 0.5);
7
+ * - d_global = ΣΔB/Σw;d_local = 前 3 极值块均值(空间 8-邻域连通 + 时间持续门控);
8
+ * - d_t = max(d_global, d_local);
9
+ * - r_flip:|M_t| ≥ 16 时连续两步差分符号翻转比例,> 0.6 → α=0.1,否则 α=1.0;
10
+ * - 等效 30fps 步长(ΔPTS ≥ 33.3ms)由流式引擎在送帧前保证,变帧率时间归一
11
+ * (× ΔPTS/33.3)在积分侧执行(Stage 3)。
12
+ */
13
+ import type { BlockSignal, RoiHint } from '../types.js';
14
+ /** 分块网格坐标。 */
15
+ export declare function blockGridPos(k: number): {
16
+ row: number;
17
+ col: number;
18
+ };
19
+ /** 切比雪夫距离 D∞。 */
20
+ export declare function chebyshev(a: number, b: number): number;
21
+ /** roi_hint → 32 分块权重(命中块 2.0,其余 0.5;无 roi 全 1.0)。 */
22
+ export declare function blockWeights(roi: RoiHint | null | undefined): number[];
23
+ export interface PerceptionContext {
24
+ /** 上一感知步灰度图(首帧为 null)。 */
25
+ prevGray: Float64Array | null;
26
+ /** 上一感知步有符号帧差 ΔI_{t-1}。 */
27
+ prevDelta: Float64Array | null;
28
+ /** 上一感知步前 3 极值块索引 K_{t-1}(d_local=0 或首帧后为 null)。 */
29
+ prevTopK: number[] | null;
30
+ /** 上一感知步极值块索引 k*_{t-1}。 */
31
+ prevArgmax: number | null;
32
+ /** 上一感知步位移向量 v_{t-1}(k* 网格位移)。 */
33
+ prevVec: [number, number] | null;
34
+ /** 上一感知步 16-bin 直方图。 */
35
+ prevHist: Float64Array | null;
36
+ }
37
+ export declare function createPerceptionContext(): PerceptionContext;
38
+ /** 重置时间持续上下文(SWITCH 原子步骤 4 后调用)。 */
39
+ export declare function resetTemporalContext(ctx: PerceptionContext): void;
40
+ export interface PerceptionResult {
41
+ ptsMs: number;
42
+ blocks: BlockSignal[];
43
+ dGlobal: number;
44
+ dLocal: number;
45
+ d: number;
46
+ /** 整帧 Sobel 均值 g_t。 */
47
+ g: number;
48
+ rFlip: number;
49
+ alpha: number;
50
+ /** 硬切候选:δ_raw>0.30 或 δ>0.30 的分块数。 */
51
+ switchCandidateBlocks: number;
52
+ /** 与上一帧的直方图 L1 距离(上一帧缺失时为 0)。 */
53
+ histL1: number;
54
+ /** 本步前 3 极值块(未通过门控也为调用方保留上下文)。 */
55
+ topK: number[];
56
+ argmax: number;
57
+ vec: [number, number] | null;
58
+ hist: Float64Array;
59
+ }
60
+ /**
61
+ * 单感知步。调用方保证步进 ΔPTS ≥ 33.3ms。
62
+ * hHighEff 用于高速跨块补偿门控(位移 2 块时 δ_{k*} > 2×H_high_eff)。
63
+ */
64
+ export declare function perceiveFrame(ctx: PerceptionContext, ptsMs: number, gray: Float64Array, weights: number[], hHighEff: number): PerceptionResult;
65
+ /** RGB 图 → 64×36 归一化灰度(box 均值降采样)。 */
66
+ export declare function toGray64x36(width: number, height: number, rgb: Uint8Array): Float64Array;
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Stage 1 —— 前端轻量感知:双通道变化标量 d_t 与频闪翻转率 r_flip。
3
+ *
4
+ * 规格《三》§1/§2:
5
+ * - 64×36 归一化灰度 → 32 分块(8 列 × 4 行,每块 8×9);
6
+ * - δ_k = clamp(δ_raw/(ḡ_k+0.05) × 0.25, 0, 1),ΔB_k = w_k·δ_k(roi_hint 命中 w=2.0,其余 0.5);
7
+ * - d_global = ΣΔB/Σw;d_local = 前 3 极值块均值(空间 8-邻域连通 + 时间持续门控);
8
+ * - d_t = max(d_global, d_local);
9
+ * - r_flip:|M_t| ≥ 16 时连续两步差分符号翻转比例,> 0.6 → α=0.1,否则 α=1.0;
10
+ * - 等效 30fps 步长(ΔPTS ≥ 33.3ms)由流式引擎在送帧前保证,变帧率时间归一
11
+ * (× ΔPTS/33.3)在积分侧执行(Stage 3)。
12
+ */
13
+ import { BLOCK_COUNT, BLOCK_H, BLOCK_W, GRAY_H, GRAY_W, GRID_COLS, blockSobelMeans, grayHistogram16, histL1Distance, sobelMagnitude, } from './gradient.js';
14
+ const GAMMA_SCALE = 0.25;
15
+ const GRAD_EPS = 0.05;
16
+ const FLIP_PIXEL_THRESHOLD = 0.02;
17
+ const FLIP_MIN_PIXELS = 16;
18
+ const TOP_K = 3;
19
+ /** 分块网格坐标。 */
20
+ export function blockGridPos(k) {
21
+ return { row: Math.floor(k / GRID_COLS), col: k % GRID_COLS };
22
+ }
23
+ /** 切比雪夫距离 D∞。 */
24
+ export function chebyshev(a, b) {
25
+ const pa = blockGridPos(a);
26
+ const pb = blockGridPos(b);
27
+ return Math.max(Math.abs(pa.row - pb.row), Math.abs(pa.col - pb.col));
28
+ }
29
+ /** roi_hint → 32 分块权重(命中块 2.0,其余 0.5;无 roi 全 1.0)。 */
30
+ export function blockWeights(roi) {
31
+ const w = new Array(BLOCK_COUNT).fill(1);
32
+ if (!roi)
33
+ return w;
34
+ for (let br = 0; br < 4; br++) {
35
+ for (let bc = 0; bc < GRID_COLS; bc++) {
36
+ const x0 = bc / GRID_COLS;
37
+ const x1 = (bc + 1) / GRID_COLS;
38
+ const y0 = br / 4;
39
+ const y1 = (br + 1) / 4;
40
+ const overlap = Math.max(0, Math.min(x1, roi.x + roi.w) - Math.max(x0, roi.x)) *
41
+ Math.max(0, Math.min(y1, roi.y + roi.h) - Math.max(y0, roi.y));
42
+ w[br * GRID_COLS + bc] = overlap > 0 ? 2.0 : 0.5;
43
+ }
44
+ }
45
+ return w;
46
+ }
47
+ export function createPerceptionContext() {
48
+ return { prevGray: null, prevDelta: null, prevTopK: null, prevArgmax: null, prevHist: null, prevVec: null };
49
+ }
50
+ /** 重置时间持续上下文(SWITCH 原子步骤 4 后调用)。 */
51
+ export function resetTemporalContext(ctx) {
52
+ ctx.prevTopK = null;
53
+ ctx.prevArgmax = null;
54
+ ctx.prevVec = null;
55
+ }
56
+ /**
57
+ * 单感知步。调用方保证步进 ΔPTS ≥ 33.3ms。
58
+ * hHighEff 用于高速跨块补偿门控(位移 2 块时 δ_{k*} > 2×H_high_eff)。
59
+ */
60
+ export function perceiveFrame(ctx, ptsMs, gray, weights, hHighEff) {
61
+ const mag = sobelMagnitude(gray);
62
+ const blockSobel = blockSobelMeans(mag);
63
+ let g = 0;
64
+ for (let i = 0; i < mag.length; i++)
65
+ g += mag[i];
66
+ g /= mag.length;
67
+ const hist = grayHistogram16(gray);
68
+ const histL1 = ctx.prevHist ? histL1Distance(hist, ctx.prevHist) : 0;
69
+ const blocks = [];
70
+ const delta = new Float64Array(gray.length);
71
+ let flipCount = 0;
72
+ let mCount = 0;
73
+ if (ctx.prevGray) {
74
+ for (let i = 0; i < gray.length; i++) {
75
+ delta[i] = gray[i] - ctx.prevGray[i];
76
+ }
77
+ for (let y = 0; y < GRAY_H; y++) {
78
+ for (let x = 0; x < GRAY_W; x++) {
79
+ const i = y * GRAY_W + x;
80
+ const dt = delta[i];
81
+ if (Math.abs(dt) > FLIP_PIXEL_THRESHOLD) {
82
+ mCount++;
83
+ const dprev = ctx.prevDelta ? ctx.prevDelta[i] : 0;
84
+ if (Math.abs(dprev) > FLIP_PIXEL_THRESHOLD && dt * dprev < 0)
85
+ flipCount++;
86
+ }
87
+ }
88
+ }
89
+ }
90
+ let switchCandidateBlocks = 0;
91
+ const deltaB = new Float64Array(BLOCK_COUNT);
92
+ for (let br = 0; br < 4; br++) {
93
+ for (let bc = 0; bc < GRID_COLS; bc++) {
94
+ const k = br * GRID_COLS + bc;
95
+ let rawSum = 0;
96
+ for (let y = 0; y < BLOCK_H; y++) {
97
+ for (let x = 0; x < BLOCK_W; x++) {
98
+ rawSum += Math.abs(delta[(br * BLOCK_H + y) * GRAY_W + bc * BLOCK_W + x]);
99
+ }
100
+ }
101
+ const deltaRaw = rawSum / (BLOCK_W * BLOCK_H);
102
+ const deltaNorm = Math.min(1, Math.max(0, (deltaRaw / (blockSobel[k] + GRAD_EPS)) * GAMMA_SCALE));
103
+ deltaB[k] = weights[k] * deltaNorm;
104
+ blocks.push({
105
+ row: br,
106
+ col: bc,
107
+ deltaRaw,
108
+ delta: deltaNorm,
109
+ weight: weights[k],
110
+ sobelMean: blockSobel[k],
111
+ });
112
+ if (deltaRaw > 0.3 || deltaNorm > 0.3)
113
+ switchCandidateBlocks++;
114
+ }
115
+ }
116
+ // 全局通道
117
+ let sumB = 0;
118
+ let sumW = 0;
119
+ for (let k = 0; k < BLOCK_COUNT; k++) {
120
+ sumB += deltaB[k];
121
+ sumW += weights[k];
122
+ }
123
+ const dGlobal = sumB / sumW;
124
+ // 前 3 极值块(稳定排序:值降序,索引升序)
125
+ const order = Array.from({ length: BLOCK_COUNT }, (_, k) => k).sort((a, b) => {
126
+ const diff = deltaB[b] - deltaB[a];
127
+ return diff !== 0 ? diff : a - b;
128
+ });
129
+ const topK = order.slice(0, TOP_K);
130
+ const argmax = topK[0];
131
+ // 空间连通:K_t 中至少 2 块互为 8-邻域
132
+ let spatial = false;
133
+ for (let i = 0; i < topK.length && !spatial; i++) {
134
+ for (let j = i + 1; j < topK.length; j++) {
135
+ if (chebyshev(topK[i], topK[j]) <= 1) {
136
+ spatial = true;
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ // 位移向量 v_t
142
+ const pos = blockGridPos(argmax);
143
+ let vec = null;
144
+ if (ctx.prevArgmax !== null) {
145
+ const prev = blockGridPos(ctx.prevArgmax);
146
+ vec = [pos.row - prev.row, pos.col - prev.col];
147
+ }
148
+ // 时间持续与高速跨块补偿
149
+ let temporal = false;
150
+ if (ctx.prevTopK === null || ctx.prevTopK.length === 0) {
151
+ temporal = true; // 首帧 / 状态重置帧:仅由空间连通决定
152
+ }
153
+ else {
154
+ let minDist = Infinity;
155
+ for (const j of ctx.prevTopK)
156
+ minDist = Math.min(minDist, chebyshev(argmax, j));
157
+ if (minDist <= 1) {
158
+ temporal = true;
159
+ }
160
+ else if (minDist === 2) {
161
+ const strongEnough = blocks[argmax].delta > 2 * hHighEff;
162
+ const aligned = vec !== null && ctx.prevVec !== null && cosineSimilarity(vec, ctx.prevVec) >= 0.5;
163
+ temporal = strongEnough && aligned;
164
+ }
165
+ }
166
+ let dLocal = 0;
167
+ if (spatial && temporal) {
168
+ let s = 0;
169
+ for (const k of topK)
170
+ s += deltaB[k];
171
+ dLocal = s / TOP_K;
172
+ }
173
+ const rFlip = mCount < FLIP_MIN_PIXELS ? 0 : flipCount / mCount;
174
+ const alpha = rFlip > 0.6 ? 0.1 : 1.0;
175
+ // 上下文更新
176
+ ctx.prevGray = gray;
177
+ ctx.prevDelta = delta;
178
+ ctx.prevTopK = dLocal > 0 ? topK : null;
179
+ ctx.prevArgmax = argmax;
180
+ ctx.prevVec = vec;
181
+ ctx.prevHist = hist;
182
+ return {
183
+ ptsMs,
184
+ blocks,
185
+ dGlobal,
186
+ dLocal,
187
+ d: Math.max(dGlobal, dLocal),
188
+ g,
189
+ rFlip,
190
+ alpha,
191
+ switchCandidateBlocks,
192
+ histL1,
193
+ topK,
194
+ argmax,
195
+ vec,
196
+ hist,
197
+ };
198
+ }
199
+ function cosineSimilarity(a, b) {
200
+ const dot = a[0] * b[0] + a[1] * b[1];
201
+ const na = Math.hypot(a[0], a[1]);
202
+ const nb = Math.hypot(b[0], b[1]);
203
+ if (na === 0 || nb === 0)
204
+ return 0;
205
+ return dot / (na * nb);
206
+ }
207
+ /** RGB 图 → 64×36 归一化灰度(box 均值降采样)。 */
208
+ export function toGray64x36(width, height, rgb) {
209
+ const out = new Float64Array(GRAY_W * GRAY_H);
210
+ for (let gy = 0; gy < GRAY_H; gy++) {
211
+ const y0 = Math.floor((gy * height) / GRAY_H);
212
+ const y1 = Math.max(y0 + 1, Math.floor(((gy + 1) * height) / GRAY_H));
213
+ for (let gx = 0; gx < GRAY_W; gx++) {
214
+ const x0 = Math.floor((gx * width) / GRAY_W);
215
+ const x1 = Math.max(x0 + 1, Math.floor(((gx + 1) * width) / GRAY_W));
216
+ let sum = 0;
217
+ let count = 0;
218
+ for (let y = y0; y < y1; y++) {
219
+ for (let x = x0; x < x1; x++) {
220
+ const i = (y * width + x) * 3;
221
+ const r = rgb[i];
222
+ const gg = rgb[i + 1];
223
+ const b = rgb[i + 2];
224
+ sum += 0.299 * r + 0.587 * gg + 0.114 * b;
225
+ count++;
226
+ }
227
+ }
228
+ out[gy * GRAY_W + gx] = count > 0 ? sum / count / 255 : 0;
229
+ }
230
+ }
231
+ return out;
232
+ }
233
+ //# sourceMappingURL=perceive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perceive.js","sourceRoot":"","sources":["../../src/stage1/perceive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EACL,WAAW,EACX,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,SAAS,EACT,eAAe,EACf,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,GAAG,IAAI,CAAC;AACzB,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,KAAK,GAAG,CAAC,CAAC;AAEhB,cAAc;AACd,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC;AAChE,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,SAAS,CAAC,CAAS,EAAE,CAAS;IAC5C,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,YAAY,CAAC,GAA+B;IAC1D,MAAM,CAAC,GAAG,IAAI,KAAK,CAAS,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IACnB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAC9B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;YACtC,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;YAC1B,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;YAChC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAClB,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACxB,MAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC,CAAC,EAAE,GAAG,SAAS,GAAG,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAiBD,MAAM,UAAU,uBAAuB;IACrC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9G,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,oBAAoB,CAAC,GAAsB;IACzD,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;AACrB,CAAC;AAuBD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAsB,EACtB,KAAa,EACb,IAAkB,EAClB,OAAiB,EACjB,QAAgB;IAEhB,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC;IAClD,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;IAEhB,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;QACzC,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;gBACzB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;gBACrB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,EAAE,CAAC;oBACxC,MAAM,EAAE,CAAC;oBACT,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBACpD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,oBAAoB,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC;wBAAE,SAAS,EAAE,CAAC;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;IAC7C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAC9B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,EAAE,CAAC;YAC9B,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,OAAO,GAAG,CAAC,CAAE,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;YACnG,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,GAAG,SAAS,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,EAAE;gBACP,GAAG,EAAE,EAAE;gBACP,QAAQ;gBACR,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAE;gBACnB,SAAS,EAAE,UAAU,CAAC,CAAC,CAAE;aAC1B,CAAC,CAAC;YACH,IAAI,QAAQ,GAAG,GAAG,IAAI,SAAS,GAAG,GAAG;gBAAE,qBAAqB,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO;IACP,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC;QACnB,IAAI,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC;IACtB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IAE5B,yBAAyB;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACrC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;IAExB,0BAA0B;IAC1B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,WAAW;IACX,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,GAAG,GAA4B,IAAI,CAAC;IACxC,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,cAAc;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,QAAQ,GAAG,IAAI,CAAC,CAAC,sBAAsB;IACzC,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,GAAG,QAAQ,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC;YAC1D,MAAM,OAAO,GACX,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;YACpF,QAAQ,GAAG,YAAY,IAAI,OAAO,CAAC;QACrC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC;QACtC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEtC,QAAQ;IACR,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;IACtB,GAAG,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC;IACxB,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC;IAClB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IAEpB,OAAO;QACL,KAAK;QACL,MAAM;QACN,OAAO;QACP,MAAM;QACN,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;QAC5B,CAAC;QACD,KAAK;QACL,KAAK;QACL,qBAAqB;QACrB,MAAM;QACN,IAAI;QACJ,MAAM;QACN,GAAG;QACH,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAmB,EAAE,CAAmB;IAChE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,OAAO,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAAc,EAAE,GAAe;IACxE,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC9C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACtE,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACrE,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;oBAClB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;oBACvB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;oBACtB,GAAG,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;oBAC1C,KAAK,EAAE,CAAC;gBACV,CAAC;YACH,CAAC;YACD,GAAG,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Stage 2 —— 施密特四状态机(规格《三》§3)。
3
+ *
4
+ * STATIC / MOTION / SETTLE / SWITCH:
5
+ * - 高阈值 H_high_eff(动态,默认 0.10),低阈值联动 H_low_eff = 0.5×H_high_eff;
6
+ * - SETTLE 满 T_settle_eff(PTS 差值)→ 锁定 F、A←0、转 STATIC,再经 T_merge=50ms 打包;
7
+ * - SWITCH 原子抢占:清积分、清 P 队列、废擂台、EMA 重置 + 3 帧预热、R4 快定格、
8
+ * 捕获 F_switch(黑场顺延由流式引擎执行)、转 STATIC 观察 250ms。
9
+ *
10
+ * 所有时间判定基于 PTS(契约 5)。积分器 A 与擂台归状态机管,
11
+ * 待发 P 队列与 F 编码由 Stage 3 流式采样器执行。
12
+ */
13
+ import type { StateKind, StateMachineSnapshot } from '../types.js';
14
+ export interface SchmittThresholds {
15
+ hHighEff: number;
16
+ /** T_settle_eff 生效值(R4 时由流式引擎瞬时置 80ms)。 */
17
+ tSettleEff: number;
18
+ tMergeMs: number;
19
+ /** SWITCH 后静态观察窗口(250ms)。 */
20
+ switchStaticMs: number;
21
+ }
22
+ export type MachineEffect = 'enter_motion' | 'settle_enter' | 'settle_cancel' | 'settle_lock' | 'merge_emit' | 'switch' | 'switch_static_emit' | 'switch_motion_void';
23
+ export interface MachineStep {
24
+ /** 本步生效的状态(无迁移时为当前态)。 */
25
+ state: StateKind;
26
+ effects: MachineEffect[];
27
+ }
28
+ export declare class SchmittMachine {
29
+ state: StateKind;
30
+ enteredAtPtsMs: number;
31
+ integratorA: number;
32
+ gEma: number;
33
+ emaWarmupLeft: number;
34
+ settleStartPtsMs: number | null;
35
+ /** SETTLE 锁定后的防碎合并窗起点。 */
36
+ mergeStartPtsMs: number | null;
37
+ lastAnchorGlobalId: number | null;
38
+ /** SWITCH 后静态观察起点与 F_switch 待发标志。 */
39
+ switchStaticSincePtsMs: number | null;
40
+ fSwitchPending: boolean;
41
+ constructor(init?: Partial<StateMachineSnapshot>);
42
+ snapshot(): StateMachineSnapshot;
43
+ /** H_low_eff 联动。 */
44
+ static hLowOf(hHighEff: number): number;
45
+ /**
46
+ * 单帧步进。switchVerdict 由 SwitchDetector 先行判定;
47
+ * settleArena 由流式引擎维护(观察窗内 g 最高帧),settle_lock 时取用。
48
+ */
49
+ step(ptsMs: number, d: number, th: SchmittThresholds, switchVerdict: 'none' | 'SWITCH' | 'WHIP'): MachineStep;
50
+ private toMotion;
51
+ }
52
+ export interface ClarityState {
53
+ gEma: number;
54
+ warmupLeft: number;
55
+ rhoHistory: number[];
56
+ }
57
+ export declare function createClarityState(): ClarityState;
58
+ /** 更新 EMA(1/8 系数)与 ρ;预热期内用当前帧梯度初始化/推进。 */
59
+ export declare function updateClarity(cs: ClarityState, g: number, opts?: {
60
+ resetWarmup?: boolean;
61
+ }): number;
62
+ /**
63
+ * PEAK 局部波峰判定:ρ_{t-1} ≥ ρ_{t-2} 且 ρ_{t-1} > ρ_t 且 ρ_{t-1} ≥ ρ_min。
64
+ * 预热期(warmupLeft > 0 或历史不足 3 帧)不判波峰(返回 false)。
65
+ */
66
+ export declare function isLocalPeak(cs: ClarityState, rhoMin: number): boolean;
67
+ /** 擂台比较:候选是否击败当前记录(ρ 更高;无记录时恒真)。 */
68
+ export declare function beatsArena(candidate: {
69
+ rho: number;
70
+ } | null, rho: number): boolean;