判定:负结果
数据源与对照规模:自造合成序列数据集(6 taxa / 根序列 220bp / K2P 替换 + 混合几何 indel;dev 种子 100/101/102、test 种子 0/1/2,各 4 个家族,pi_long ∈ {0.00, 0.05, 0.20}),6 个实验臂 × 3 个测试种子,含两轮各 20 组网格搜索在内全流程 20.1 秒
主要结论:预注册预测被推翻:预测长 indel 占比 0.20 时 2-piece 相对 1-piece 的 SP 增益 ≥ 2 个百分点且三个种子同号,实测只有 0.68pp(0.4602 → 0.4670)且种子符号不一致。代价则很确定——2-piece 的 5 层 DP 把运行时间从 6.27ms 抬到 10.7ms,峰值 DP 内存从 1.31MB 抬到 3.58MB。需要说明:那条 2pp 门槛是按原计划规模(8 taxa / 800bp / 10 家族)设的,实际跑的是缩减版(6 taxa / 220bp / 4 家族),所以这个推翻只在缩减版规模下成立,放大后是否仍被推翻要重跑才知道。
这些结果不支持:不支持“2-piece affine gap 无用”这个一般结论——本轮无法分辨是效应被这个规模(6 条序列、约 220bp)的噪声淹没,还是 progressive 的贪心合并把 pairwise 上的好处吃掉了。也不支持任何真实生物序列上的结论(数据是合成的),不支持与 MAFFT/MUSCLE 等成熟实现的性能比较。
代码 / 原始结果 / 日志:代码、原始 results.json、运行日志、图与一键复现脚本齐全;数据由程序按记录的参数现场生成。
提交方向: 用C/C++写一份2-piece affine gap cost得分策略的progressive 模式的多序列比对程序。 交付时间: 2026-07-31 这一轮真跑了: 自造合成数据集(6 taxa / 根序列 220bp / K2P 替换 + 混合几何 indel;dev 种子 100/101/102 × 4 家族,test 种子 0/1/2 × 4 家族,pi_long ∈ {0.0, 0.05, 0.2});6 个臂(1-piece baseline 与 2-piece proposed 各 3 个 pi_long 档);3 个测试种子;含两轮各 20 组的网格搜索在内,全流程 20.1 秒跑完。代码与日志随附。
我们的预测被推翻了,这条路在你现在的设定下不成立。 预测是:长 indel 占比 pi_long=0.20 时,2-piece 相对 1-piece 的 SP 增益 ≥ 2 个百分点,且 3 个种子全部同号。实测:pi_long=0.20 上增益只有 0.68pp(baseline 均值 0.4602 → proposed 均值 0.4670),而且种子符号不一致——有一个种子上 1-piece 反而更好。pi_long=0.00 上增益 0.09pp,同样符号不一致。
原因(两种解释,这一轮没有分辨出是哪一种):要么效应真实但在这个规模(6 条序列、约 220bp、每种子 4 个家族)上被噪声淹没,要么 progressive 的贪心传播真的把 2-piece 在 pairwise 上的好处吃掉了——早期的合并一旦锁死 gap 位置,后面更灵活的 gap 模型就没机会发挥。
下一步该往哪拐: 别急着把这个 2-piece 实现当方法创新写论文,先把规模和 iterative refinement 这两个变量拉进来(见第 3 节)。代价这边倒是很确定:2-piece 的 5 层 DP 在 pi_long=0.20 上运行时间 6.27ms → 10.7ms,峰值 DP 内存 1.31MB → 3.58MB。精度没换来,开销是实打实的。
实验设计一句话: 同一份 C++ 代码、同一棵 guide tree、同一个 profile 打分函数,唯一变量是 gap 函数——baseline 用 1-piece affine g(l)=O+l·E,proposed 用 2-piece affine g(l)=min(O1+l·E1, O2+l·E2);在 dev 集上各做 20 组网格搜索选参数,在 test 集(种子 0/1/2)上报结果。
baseline 是什么、为什么公平: baseline 不是外部工具,就是同一份代码把 gap 函数退化成 1-piece。三点保证对照公平:(a) 令 O2=O1、E2=E1 时 2-piece 精确退化为 baseline,即 baseline 是 proposed 的特例;(b) 两臂网格搜索评估次数完全相同(各 20 组);(c) 调参用 dev 种子 100/101/102,报结果用 test 种子 0/1/2,严格分离。proposed 的 (O1,E1) 直接沿用 baseline 选出的值,只搜 (O2,E2)。
选出的参数: baseline 三档都是 (O,E)=(4,3);proposed 的 (O1,E1)=(4,3) 固定,(O2,E2) 在 pi_long=0.00 / 0.05 / 0.20 上分别选到 (28, 0.4) / (24, 0.4) / (16, 0.4)。
主结果表 · sp_score(主指标,越高越好)
| pi_long | 臂 | seed 0 | seed 1 | seed 2 | 均值 ± 标准差 |
|---|---|---|---|---|---|
| 0.00 | baseline-affine-1p | 0.4505 | 0.4779 | 0.5207 | 0.4830 ± 0.0289 |
| 0.00 | proposed-affine-2p | 0.4475 | 0.4838 | 0.5207 | 0.4840 ± 0.0299 |
| 0.05 | baseline-affine-1p | 0.3438 | 0.4808 | 0.5207 | 0.4484 ± 0.0757 |
| 0.05 | proposed-affine-2p | 0.3408 | 0.4984 | 0.5207 | 0.4533 ± 0.0801 |
| 0.20 | baseline-affine-1p | 0.3438 | 0.4808 | 0.5561 | 0.4602 ± 0.0879 |
| 0.20 | proposed-affine-2p | 0.3406 | 0.4985 | 0.5620 | 0.4670 ± 0.0931 |
增益:pi_long=0.00 为 0.09pp,pi_long=0.20 为 0.68pp(两个数直接来自 results.json.headline.claim);pi_long=0.05 为上表两列均值相减,约 0.49pp。三档全部符号不一致——每一档上 seed 0 都是 baseline 略高,另外两个种子是 proposed 略高。
其余指标 · 均值 ± 标准差
| pi_long | 臂 | tc_score | sp_near_long_indel | runtime_ms | peak_dp_bytes |
|---|---|---|---|---|---|
| 0.00 | baseline-1p | 0.7649 ± 0.1405 | 0.4830 ± 0.0289 | 5.71 ± 0.157 | 1,080,267 ± 59,593 |
| 0.00 | proposed-2p | 0.7641 ± 0.1413 | 0.4840 ± 0.0299 | 9.99 ± 0.595 | 2,785,935 ± 138,135 |
| 0.05 | baseline-1p | 0.6256 ± 0.2536 | 0.4291 ± 0.1152 | 6.01 ± 0.410 | 1,184,105 ± 132,484 |
| 0.05 | proposed-2p | 0.6238 ± 0.2550 | 0.4325 ± 0.1105 | 10.29 ± 0.170 | 3,087,132 ± 350,299 |
| 0.20 | baseline-1p | 0.4976 ± 0.1049 | 0.3438 ± 0.1105 | 6.27 ± 0.139 | 1,309,470 ± 45,075 |
| 0.20 | proposed-2p | 0.4949 ± 0.1061 | 0.3516 ± 0.0957 | 10.73 ± 0.313 | 3,576,959 ± 82,738 |
逐个种子的原始值全部在 work/results.json 的 arms[].metrics[].per_seed 里,一个没删。

figs/ 目录。这些数支持的结论: 在这个受控设定下,2-piece affine 相对 1-piece 的 SP 增益小于 1 个百分点,且在 3 个种子上符号不一致,预测的 ≥2pp 门槛没达到。增益随 pi_long 单调上升(0.09 → 约 0.49 → 0.68pp),方向和"长 indel 越多、2-piece 越有用"的机制一致,但幅度远小于种子间离散度(标准差最高到 0.093),所以这只是一个方向性的观察,不构成任何统计上的断言。同时代价确定:5 层 DP 的运行时间接近 1-piece 的两倍,峰值 DP 内存约 2.6–2.7 倍。tc_score 三档上 proposed 都略低于 baseline,差距同样在噪声量级内。
这些数不支持的结论: 不能说 2-piece 无效——3 个种子、每种子 4 个家族的样本量,本来就分辨不出 1pp 量级的差异。也不能说 2-piece 有效。这一轮能确定的只有:在这个规模上它没有可复现的增益,而开销翻倍是确定的。 我们没跑真实 benchmark、没跟 MAFFT/MUSCLE/FAMSA2 比、没做蛋白序列、没做 iterative refinement,这些结论一条都没有暗示。
放大后可能变的部分: 序列更长(实际用 220bp,原计划 800bp)、序列更多(6 条,原计划 8 条)、家族更多(4 个/种子,原计划 10 个)之后,长 indel 事件的绝对数量会上去,信噪比会改善。如果要复查这个负结果,先加家族数和序列长度,这是最短路径。
本轮的三条偏离(全部来自 results.json.deviations):
sp_near_long_indel 有回退。 当某个(种子,臂)的 4 个测试家族里一条真实长度 ≥10 的 gap 都没出现时,这个指标无定义(低 pi_long 下长 indel 罕见但不是不可能),此时回退成该种子的整体 sp_score,并在 logs/run.log 里逐条记了 ... falls back to sp_score=...。影响 pi_long=0.00 的全部 3 个种子,以及 pi_long=0.05 的 1 个种子;pi_long=0.20 三个种子都有真实的侧翼数据。这个指标只用于机制检查,不是主结论的依据(主结论用的是 sp_score),所以回退不触及"推翻"这个判定。值得投的一步:先把这个负结果做实,而不是先去优化 2-piece 的实现。 最短路径是把家族数从 4 提到 10、根序列从 220bp 回到 800bp、种子从 3 提到 10,重跑同一份 run.sh——代码不用改,只是参数。如果放大后 pi_long=0.20 的增益仍然 <1pp 且符号不稳,你就拿到了一个干净、可发表的负结论:"2-piece affine 在纯 progressive MSA 里的收益穿不过贪心传播"。这个结论对中文核心 / SCI 四区 / 普通国际会议是够的,而且它比一个含糊的正结果更难被驳。
第二步(只在第一步做完后再投):加一个 iterative refinement 的开关。 本轮的两种解释里,"贪心传播吃掉增益"这一条,只有在开了精修之后增益回来,才能被证实。这是一个能把负结果升级成机制性发现的实验。
先别投的: 别去做 profile 大小自适应的 gap 参数(SCOPE 第 2 节缺口 B),也别碰参数自动估计(缺口 C)。这两个都建立在"2-piece 在 progressive 里确实有增益"之上,而这一轮的数据不支持这个前提。 也别去和 FAMSA2 拼速度和规模,那条线你赢不了。
审稿人最可能打的三个点(SCOPE 第 3 节的判断,压成三句):
| 文件 | 是什么 |
|---|---|
work/src/simulate.cpp | C++ 模拟器:随机二叉树 + K2P 替换 + 混合几何 indel;用全局双向链表精确追踪真实比对列,ground truth 是精确的不是近似的 |
work/src/msa.cpp | C++ progressive MSA:k-mer(k=4)余弦距离 + UPGMA guide tree + profile-profile Gotoh DP;1-piece 走 3 层(M/Ix/Iy),2-piece 走 5 层(M/Ix1/Iy1/Ix2/Iy2) |
work/experiment.py | 编排:模拟 + 两轮 dev 网格搜索 + test 集评测 + 写 results.json 和图 |
work/run.sh | 一条命令复现:bash run.sh。内含 g++ -O2 -std=c++17 编译两个 C++ 程序,再跑 experiment.py |
work/logs/run.log | 完整日志:每一组网格搜索的 dev 得分、每个种子每个臂的测试得分、以及全部 sp_near_long_indel 回退记录 |
work/figs/sp_gain_vs_pi_long.png | SP 增益随 pi_long 的曲线 |
work/results.json | 原始结果:6 个臂 × 5 个指标 × 3 个种子的逐个数值 + 均值 + 标准差,以及预测判定和偏离说明。本报告里每个数字都能在这里查到 |
work/data/ | 全部模拟数据(未比对输入 FASTA + 真实比对 FASTA),dev 与 test 均在内 |
SCOPE.md | 方向判断与文献查新(本报告第 5 节的出处) |
环境: 纯 CPU,Python 3.12.3,没有用 torch(这是 C++ 实验,results.json.env.torch 记为 n/a),无额外第三方依赖。所有随机性均由种子固定(dev 100/101/102,test 0/1/2),bash run.sh 可原样重跑,全流程 20.1 秒。
关于数据来源: 我们不需要你的数据、代码或稿子。证据全部由随附的 C++ 模拟器自己生成,不依赖任何外部数据分发,任何人拿到这个目录就能独立复查、也能推翻我们的结论。
gap_affine_2p C/C++ 实现。DP 核心不能当卖点。参考来源(原样保留):
gap-affine-2p 现成实现,公式 g(N)=min{O₁+N·E₁, O₂+N·E₂},参数名 affine2p_penalties.*本文档由 JouleBeat · DeepGraph 出具。实验代码、日志与原始结果随附,结论可被复查与反驳。