Devlog · U-M1s-12 审核 + U-M1s-13 正式化 + M1s 验收门 bench(2026-09-30)
Source:vignettes/articles/devlog-2026-09-30-M1s-13-bench.qmd
U-M1s-12 审核(REVISE 1×P1 → 已修)
- 代码行为全部验证正确:转置契约三重防线(双侧非对称冒烟 + 标签装配 + 负元 i/j 坐标穿透)、展示归一装配层切分(WH 重构漂移 1.47e-16)、注册表 certified 落实、D16 默认路径诚实标注。
-
P1(已修):布局契约恒等式三处写错(extract.rs / lib.rs / ffi-surface.md 冻结协议)——
data[j*m+i]应为data[i*n+j](对 t(counts) 的 n×m 列主序缓冲)。代码正确,纯文档缺陷,但书面契约在冻结工件里会误导后来者实现出它本欲防止的转置 bug。实证反例:m=2,n=3 时 counts[1,0] 实存 data[0*3+1]。
U-M1s-13 夹具正式化
- helper 双份拷贝收拢至共享 helper-tally.R(行为零变化,testthat 全绿);
tools/refresh-fixtures.sh一键再生成入口(channel 表/kl-crosscheck 输入实测字节级幂等,MSUITER_FIXTURES_ONLY=1门控加入 run_experiment.R 且默认行为逐字节不变)。
M1s 验收门 bench(bench/m1s/,一键复跑)
正确性锚(最重要):10⁶ 合成变异 SPMG vs ms_tally SBS96 矩阵逐格差 = 0。
| 预算行 | 判据 | 实测 | 结论 |
|---|---|---|---|
| SBS96 目录 10⁶ | ≥50× SPMG 且 <5s | 2.6×(3.73s vs 9.82s);<5s ✓ | 速度 FAIL |
| NMF KL 96×1000 k=10 T=100 | ≥100× R NMF | 2.3×(205ms vs brunet 0.47s C 核) | FAIL |
| 批量 NNLS 101×10³ | ≥10× scipy | 1.8×(解正确 3.8e-11) | FAIL |
根因(PI 复核):预算倍数写于未实测基线——R NMF brunet 是 C 内核、scipy 是原生 C、SPMG 1.3.6 干净输入是 numpy 向量化。“对 C 内核再快 100×”从不是可辩护声明;“比参考 C 内核快 2.3×”本身即是强结果。50× 口径或对真实基因组+全管线 SPMG 成立(dense 臂 SPMG 46s),但合成干净输入口径下不成立。→ 预算口径重校准待作者裁决(触及 ROADMAP 验收措辞,PI 不单方面改宪法级文档)。
P0 级发现(M1c 裁决项)
-
DBS 成员计入 SBS96:
审计所锚上游 master 行为不符【2026-09-30 ID83 备忘勘误】 函数级 diff 证明 master 与 v1.3.6 均双重计入(SBS 循环对 SNV 全量计数、无 dinuc 排除)——我方的排除是对所有 SPMG 版本的 deliberate divergence(更合理、有审计依据),文档声明即 parity 口径;除该策略外路由双侧完全一致。另 ID83 备忘发现 PR #256 修复了 v1.3.6 的 SBS bias 索引 bug(真实基因组 + 转录注解下 SBS192/384 与 1.3.6 分叉;M1s bench 平注解合成基因组掩盖了该项)——真实基因组 bench 列入 M1c/M7 清单。详见 vignettes/articles/devlog-2026-09-30-ID83-design-memo.qmd。 - SPMG 1.3.6 丢弃完全重复记录(sample 盲整行比较)——我方无去重语义,M1c 定策略。
- SPMG CHECKSUMS 白名单使自定义基因组不可用 → 运行时注册本地 md5 绕过(零上游文件改动)——真实 SPMG 基线成立,无外推数字。
- SPMG
<vcf_dir>/input/转换缓存静默复用陈旧记录——spmg_run.py 已每次清除。
状态
- 电池:Rust 12 套件双工具链绿、testthat 1342+、check 0/0/1NOTE。
- M1s:13/14 单元 + bench 已跑;验收门 = 预算口径裁决 + (可选)并行 tally 优化 + sigminer/MP 玩具交叉验证。
PI 裁决(2026-10-05):方案 A 采纳
速度预算口径按实测 C 基线重校准(目录 2.6× SPMG / NMF 2.3× brunet / NNLS 1.8× scipy);原 50×/100×/10× 修辞移至朴素 R/Python 实现口径(全管线 dense 臂 SPMG 46s 口径 50× 或成立,钉硬件 bench 复核)。M1s 14/14 关闭。