Prjs109 / Fast  ·  評測報告

Step 4 救回範圍的修正與 S_X 的可信度

以 HOMSTRAD 人工比對為標準答案,量測本專案的 clean-room 實作與原作者發布之 FAST 執行檔。修正 Step 4 的計算範圍後,與原版的差距縮小 76.7%;全量 2663 對驗收確認缺口為 −0.0238 且幾乎全部來自 recall;同時發現論文自身的目標函數 S_X 與比對正確性系統性背離。

日期 2026-09-03 修正前後對照 HOMSTRAD · 602 對 正式驗收 HOMSTRAD · 2663 對 修正前指紋 b284dbbb…40a2c 修正後指紋 2c996a48…4530b
結論

一句話

Step 4 的 R 矩陣原本只對 Step 1 存活的候選集計算,使規則 (a) 淘汰的殘基對永無翻身機會——這與論文 Eq. 5 不符。改為對全部殘基對計算後,recall 由 0.702 升至 0.814,F1 由 0.806 升至 0.881,precision 幾乎無損且仍高於原版 FAST。

F1 · 修正後
0.8813
+0.0756 對比修正前 0.8057
配對差值 · 602 對
−0.0230
缺口縮小 76.7%(原為 −0.0987)
全量 2663 對為 −0.0238
Recall
0.8135
+0.1118 原版 FAST 為 0.8670
Precision
0.9736
−0.0033 仍高於原版的 0.9492

以上為修正前後對照,n = 455 組結構對(602 對中兩支程式皆能執行者)。修正前後必須在同一集合上比較,故沿用此集。配對差值為逐對計算 F1(本實作) − F1(原版) 後取平均,標準誤 0.0035。

正式驗收 · 2026-09-03

全量 2663 對 / 959 家族 / 3038 個相異鏈,耗時 6.0 小時。

集合nPrecisionRecallF1
主集合(對 HOMSTRAD)26630.96350.82080.8818
兩者皆可跑 · 本實作15150.96000.79940.8665
兩者皆可跑 · 原版 FAST15150.93420.85420.8903

配對差值 −0.0238(sd 0.1076、標準誤 0.0028、平均差/標準誤 = −8.61)。本實作較佳 213 對、平手 26 對、原版較佳 1276 對。

此缺口在 n = 361、752、1515 三個樣本量下皆為 −0.023,是穩定的系統性性質,不是取樣雜訊


01

評測方法

標準答案

HOMSTRAD 2026 Sep 1,1032 個蛋白質家族、3458 個結構,附專家策展的人工結構比對。同一家族中兩個成員在比對的同一欄位皆非 gap 時,該欄位即構成一組等價殘基對,這就是標準答案。

比對欄位到 PDB 殘基索引的對照一律以 Needleman-Wunsch 序列比對建立,不用位置推算——1032 個家族中有 85 個、3458 個成員中有 330 個(9.5%)兩者長度不符,差值由 −90 到 +57,逐位置對應會靜默產生錯位的標準答案。改用序列指派後可用成員由 92.7% 提升至 99.5%,一致度中位數 1.0000。

評測集為每家族取 1 對、鏈長 60–250 殘基,共 602 對;其中 455 對(75.6%)的 NA×NB 未超過原版 FAST 的執行上限而能取得對照。

三個指標

把標準答案當成一份有正確解答的考卷,程式交出的比對就是答案卷。

Precision
正確率 = TP / (TP + FP)。我們寫的配對裡,有幾成是對的。
Recall
涵蓋率 = TP / (TP + FN)。標準答案裡,我們找到了幾成。
F1
兩者的調和平均 2PR/(P+R)。調和平均會被較小的一方拖住,故無法靠單邊刷分——亂配一堆能把 recall 拉滿,但 precision 會崩,F1 隨之下降。
為何兩個都要看

修正前的 hr 案例:標準答案 75 對,我們配 16 對且全部正確。Precision = 1.0000 看似完美,Recall 卻只有 0.2133——漏掉了 78%。單看任一項都會得出錯誤結論。

統計方法

兩支程式跑的是同一批結構對,屬配對資料,故以逐對差值的平均與標準差為判斷依據。分別報平均值再目測比較會被結構對之間的難度差異淹沒:兩者各自的 F1 標準差為 0.1216 與 0.1226,而差值的標準差僅 0.0737


02

主要結果

本實作 · 修正前 本實作 · 修正後 原版 FAST
0.00 0.25 0.50 0.75 1.00 .9769 .9736 .9492 Precision 配得對嗎 .7017 .8135 .8670 Recall 配得夠嗎 .8057 .8813 .9044 F1 綜合
n = 455 組結構對。Recall 補上 11.2 個百分點,而 precision 僅降 0.0033 且仍高於原版——多配上的殘基絕大多數是對的,不是以錯配換長度。
版本PrecisionRecallF1平均比對長度佔標準答案平均 RMSD
本實作 · 修正前 0.97690.70170.805778.072.7%1.366 Å
本實作 · 修正後 0.97360.81350.881390.284.0%1.541 Å
原版 FAST 0.94920.86700.904498.291.5%1.899 Å

標準答案的平均等價殘基對數為 107.3。RMSD 上升是配上更多殘基的必然結果——原版配得更多,RMSD 也更高(1.899 Å)。

逐對勝負

 本實作較佳平手原版較佳
修正前72446
修正後616388

03

修正了什麼

Step 4 的 R 矩陣計算範圍

論文 Step 4 的 Eq. 5 為:

R_ij = Σ  e_ij,mn        其中 (m,n) ∈ X⁰,  (m,n) ≠ (i,j)

加總範圍限定在 X⁰,但被評分的 (i,j) 論文未加任何限制。且 Step 4 開頭明言「some biologically relevant pairs may be dropped during pruning」,而 Step 1 的規則 (a)(b) 在論文中正是以 prune 描述:「We then prune G(V,E)… (a) Pairs with negative L scores are eliminated.」

原實作將 R 的計算限制在 Step 1 的候選集,其註解明確寫著「Step 1 已被刪除的殘基對…不屬於 Step 4 的救回範圍」。該判斷與論文不符,是比對長度系統性偏短的主因。新增 Params.RefineScope,預設改為 RefineAllPairs

診斷的交叉驗證

hr(1hra vs 1hcp,標準答案 75 對)上,修正後得 recall 0.6400、48 對;而先前以違反論文規則 (a) 的方式(LocalCutoff 由 0 放寬至 −0.5)取得的結果完全相同——同樣是 recall 0.6400、48 對。

亦即:以論文自身的機制取得了同樣的復原,不需要違反論文明訂的規則。這是診斷正確的強證據。

連帶修掉一個潛伏的邊界 bug

幾何表的角度欄位在殘基缺少前或後方向向量時留白(值為 0),但 edgeWorst 從未檢查,直接把 0 當成真實角度讀取。此 bug 先前處於休眠狀態——Eq. 1 需要 i−2…i+2,首尾各兩個殘基本就不在候選集內,故從未被觸及。改為全域計算後才暴露:自我比對一度得到 N 對(2EZM 為 101 對),即鏈端殘基以垃圾角度被配上。

比對長度的理論上限:N−4 更正為 N−2

論文 p.620 稱首尾各兩個殘基「left out of the calculation」——該句描述的是 Eq. 1(需 ±2 的鄰居),限制的是 Step 1 的候選集,不是最終比對。Eq. 2 的六個角度只需 ±1,故索引 1 與 N−2 可以合法進入最終比對;只有真正的鏈端(0 與 N−1)永遠不可能。

自我比對N修正前修正後RMSD
2EZM:A101101990.000 Å
1MSB:A1151151130.000 Å
2P99:A2612612590.000 Å

全部剛好為 N−2。相關單元測試同步更新,且新增了更嚴格的斷言:索引 0 與 N−1 不得出現在比對中。全部測試通過。


04

為何不是參數的問題

在確認根因之前,先對全部可調參數做了 one-at-a-time 掃描。評測集為凍結的 200 對清單,各設定跑完全相同的結構對,故差異只來自參數。

參數類別預設掃描範圍F1 範圍結論
MinSupportCLEAN-ROOM41 – 80.8355 – 0.8388無影響
MaxPruneRoundsCLEAN-ROOM203 – 500.8383 – 0.8386無影響
D0CLEAN-ROOM20 Å12 – 400.8378 – 0.8392無影響
UnanimityEpsCLEAN-ROOM1e−41e−6 – 1e−20.8383 – 0.8385無影響
MaxRefineRoundsPAPER510 / 20 / 500.8386(三者相同)第 5 輪前已收斂
MinStretchPAPER42 – 60.8200 – 0.83904 已接近最佳
MinFinalStretchPAPER41 – 60.8176 – 0.8418唯一有效,+0.0033
決定性的否定結果

全部 20 個設定的 F1 跨度僅 0.0140,最佳設定的改善僅 +0.0009;而同一集合上與原版 FAST 的缺口為 0.0894

亦即:整個參數空間能移動的範圍只有缺口的 16%,實際可得的改善不到 1%。缺口不在可調常數。相較之下,Step 4 的單一修正補上了 77%。

D0 一直被列為「主要嫌疑」——它是唯一完全無文獻依據的參數。本輪證實在 12–40 的範圍內其對比對正確率的影響小於 0.0015,該嫌疑應予降級。

另註:LocalCutoff 取負值未納入掃描——放寬 Step 1 規則 (a) 使候選幾乎不被淘汰,|V| 暴增而規則 (b) 的 O(V²) 失控,實測 LocalCutoff=−2.0 在 200 對上跑逾 44 分鐘未完(正常設定約 5 分鐘)。此現象本身即為效能限制 L3 的實證。


05

S_X 這把尺準不準

S_X 是什麼

論文 Eq. 3 定義比對 X 的總相似度為一個雙重加總——把 X 裡每兩個殘基對之間的相容度 e 全部加起來:

S_X = Σ      Σ           e_ij,mn
     (i,j)∈X (m,n)∈X, ≠(i,j)

e(Eq. 2)取距離項與六個主鏈角度項中最差的一項作為基礎分,再乘一個隨距離衰減的指數包絡。S_X 越大越好——論文明言「the optimal alignment X* should achieve the maximal similarity score」。

量測方式

直接比較兩支程式各自回報的 S_X 並不對等——它們的參數選擇可能不同。故新增 fast.ScoreAlignment()以本實作的公式與參數評分雙方的比對,使唯一的變因是比對本身。本節數字取自全量 2663 對評測中兩者皆可跑且評分有效者。

以同一公式評分(全量 n = 1509)對數佔比
本實作的 S_X 較高113375.1%
本實作的 F1 較高21314.1%
本實作的比對較短148798.5%
S_X 贏但 F1 輸94162.4%
S_X 輸但 F1 贏251.7%
尺與真相的系統性背離

六成以上的案例,本實作在論文自己的目標函數上勝出,卻在與標準答案的一致度上落敗。反向的情形僅 1.7%。這不是雜訊。

換句話說:本實作的搜尋沒有問題,甚至比原版 FAST 更會找到 S_X 高的解——問題是那個分數與「正確」不夠相關。

一個反直覺的觀察:這裡的分歧不是「S_X 偏好長比對」造成的

S_X 在公式上確實偏好長比對(下方問題一)。但在這批真實資料裡,那個偏好被另一個效應壓過去了:

在原版比對較長的結構對中組數
它的 S_X 也較高143
它的 S_X 反而較低1135

本實作的比對幾乎總是更短(98.5%),卻幾乎總是 S_X 更高(75.1%)。亦即在這批資料上,「長」與「S_X 高」是相關的。

壓過長度偏好的是下方的問題二——S_X 測的是內部一致性,不是涵蓋率。本實作只收緊密相容的核心(S_X 高、比對短、recall 低);原版延伸進結構發散區域(配對更完整,但用本實作的公式評分會變差)。

用本實作的公式評分,結果為的比對組數佔比最低分
原版 FAST 的比對20613.6%−3.87×1012
本實作的比對00.0%17.3(最低仍為正)

原版有 13.6% 的比對在 Eq. 2 下是負分,最極端達負 3.87 兆——它納入了本實作的評分函數判定為嚴重不相容的殘基對,而那些殘基正是 HOMSTRAD 認定等價的。本實作自己的比對從無負分,因為 DP 就是在最大化這個分數。

補充:HOMSTRAD 並非「不視過長的配對為同源」。方向相反——我們漏掉的殘基是 HOMSTRAD 認定等價而我們沒配上的(平均每組 17.9 個)。專家看的是演化與結構的對應;S_X 看的是局部幾何的自我一致性。這兩件事在結構發散區域會分開。

公式的四個問題

一、二次成長而無正規化。比對有 n 對殘基就有 n(n−1) 個 e 項,長度加倍則分數變四倍。S_N = S_X / √(M·N) 只除以結構長度,未除以比對長度,此二次成長完全未被修正。

二、它測的是內部一致性,不是涵蓋率。S_X 問的是「X 的成員彼此合不合」,沒有任何一項在問「你配了多少」。一小群彼此完美相容的殘基對,可以贏過一大群還不錯但沒那麼緊密的。這是 clique 品質的量測,不是比對品質的量測。

三、max{} 是瓶頸式評分,脆而不平滑。單一個角度差就能讓整條邊歸零:k_α = 4/π,角度差 45° 即令 k_α·t_α = 1e = 0;超過 45° 則為負。

四、內部一致的錯誤答案照樣得高分。整體平移一格的比對,因所有成員被一致地移動,彼此的相對幾何幾乎不變,S_X 看不出來。這正好對應實測中約 1% 的 register shift 案例——而它們集中在 linker_histonehrpp-binding螺旋蛋白,螺旋的週期性使平移最不易被察覺。

公平的但書

S_X 並非設計錯誤——它是為了在 pair graph 上尋找最大 clique 而設計的,那件事它做得很好。問題出在拿它當「比對正確性」的代理指標。論文自身也知道這個張力,故才有 Step 4 的精修去補救。


06

剩餘的差距

全量驗收的配對差值為 −0.0238(n = 1515)。差距的性質已與修正前不同——不再是少數災難案例,而是普遍的小幅落差。

而且缺口幾乎全部來自 recall。逐對比較兩個指標的勝負:

指標本實作較佳平手原版較佳
Precision770605140
Recall46581411

1411 / 1515 = 93% 的配對,本實作 recall 較低。不是少數離群案例,是普遍傾向:本實作系統性偏保守——選中的配對更可靠,但漏掉明顯更多。

F1 差距(本實作 − 原版)對數佔比平均差
本實作明顯較佳(> +0.05)432.8%+0.3566
相當(±0.01)50333.2%+0.0008
略遜(−0.01 至 −0.10)85956.7%−0.0342
明顯遜(−0.10 至 −0.30)946.2%−0.1503
嚴重落後(< −0.30)161.1%−0.5152

另有 117 對(7.7%)的 precision 低於 0.90。

先前提出的 v1 完成標準為「配對差值 ≥ −0.02」,目前 −0.0238,差 0.0038 未達

參數已無空間。MinSupportMaxPruneRoundsPruneFractionPruneRounding 七個設定給出逐位元相同的結果——Step 4 的不動點與起點 X⁰ 無關,Step 1 規則 (a) 與 Step 3 的剪枝對最終輸出已完全無關緊要。D0 的最佳值因案例而異且無一致方向(縮小至 8 使 ANATO 的 recall 由 0.554 升至 0.692,但 ACT 變差、hr 完全崩潰)。

根因在 Eq. 2 的 max{} 瓶頸式評分:漏失配對中八成以上其 R 值為負(四個逐案診斷為 85.7%、82.6%、86.2%、88.9%),DP 完全無誘因納入。這屬 v2 的範圍,不是 v1 能調的。


07

限制與注意事項

  • 原版 FAST 執行檔的容量上限。NA×NB 超過約 33,000 時 segfault(32/64-bit 行為相同,官方文件未記載)。全量 2663 對中僅 1515 對(56.9%)可取得對照。同一問題使該執行檔跑不出論文自己的 Table IV——11 組中僅 4 組在能力範圍內,該 4 組的比對長度與論文完全相同。
  • 可比較的子集合系統性地偏小結構——這是本評測最重要的限制。因兩條鏈都長就超出 33,000 上限,能取得對照的 1515 對幾乎都是小結構。而無對照的 1148 對(較大結構),本實作對 HOMSTRAD 的成績反而更好:precision 0.9680、recall 0.8490、F1 0.9018,高於可比較子集合的 0.8665。故 −0.0238 這個缺口只在小結構上成立,不可外推為整體結論
  • 鏈端配對的處理。原版 FAST 會將鏈端殘基(索引 0、N−1)配入比對,602 對評測的 455 對中有 337 對(74.1%)如此,平均 1.04 對。Eq. 2 的角度在該處無定義,故評分前予以剔除並記錄(欄位 fast_n_term);此處理使原版的 S_X 略降,解讀時須一併參看。
  • 兩個評測集的分工。修正前後的對照用 602 對(每家族 1 對、鏈長 60–250)——修正前後必須在同一集合上比較。正式驗收用全量 2663 對(959 家族、3038 個相異鏈、每家族上限 8 對、鏈長上限 500);已於 2026-09-03 完成,耗時 6.0 小時。每家族設上限是為避免成員多的家族主導平均值,故 2663 對是分層抽樣後的集合,非全部可能組合。配對選取完全可重現(連跑兩次的清單逐行相同)。
  • 原版 FAST 的官方 README 有一處敘述不正確。其文件稱「only reads the ATOM lines of CA's」,但實測只餵 Cα 行會改變其輸出(7kD_DNA_binding 的比對長度由 61 變 63、A2M_A 由 117 變 116、ACPS 由 77 變 76)。側鏈原子確實影響其結果,故本評測一律提供完整 ATOM 內容。
  • 19 個成員因屬多鏈複合體而排除rhvltninsprc 等,其 .ali 將多條鏈串為一條序列)。本實作僅支援單鏈對單鏈,這些案例本就無法評測。
  • clean-room 立場不變。調參目標為 HOMSTRAD 準確度,原版 FAST 執行檔僅作黑箱對照,從未取得或檢視其原始碼,亦不以其輸出為調參目標。

08

重現

# 驗證 HOMSTRAD 家族的序列與鏈對應(先跑這個)
GO111MODULE=off ./dev/bin/bench -db ~/data/Prjs109/homstrad/with_PDB -check

# 產生凍結的評測集清單
GO111MODULE=off ./dev/bin/bench -db ~/data/Prjs109/homstrad/with_PDB \
  -pairs exp/results/2026-09-02_iterset.list -perfam 1 -minlen 60 -maxlen 250

# 評測
GO111MODULE=off ./dev/bin/bench -db ~/data/Prjs109/homstrad/with_PDB \
  -run -fast ./prg/FAST-2007/fast-linux-64 \
  -pairlist exp/results/2026-09-02_iterset.list -j 3 \
  -o exp/results/2026-09-02_iterset-with-sx.tsv

# A/B 對照修正前後
... -P RefineScope=verts    # 修正前的行為
... -P RefineScope=all      # 修正後(預設)

# 單一案例的逐段檢視
GO111MODULE=off ./dev/bin/bench -db ~/data/Prjs109/homstrad/with_PDB \
  -fast ./prg/FAST-2007/fast-linux-64 -inspect hr:1hra:1hcp

# 全量正式驗收(2663 對, 約 6 小時;-tmp 需指向空間充足的檔案系統)
GO111MODULE=off ./dev/bin/bench -db ~/data/Prjs109/homstrad/with_PDB \
  -run -fast ./prg/FAST-2007/fast-linux-64 \
  -cap 8 -maxlen 500 -j 3 -tmp ~/data/Prjs109/tmp/bench \
  -o exp/results/2026-09-02_full-benchmark.tsv

逐對原始資料:修正前後對照為 exp/results/2026-09-02_iterset-with-sx.tsv,全量驗收為 exp/results/2026-09-02_full-benchmark.tsv(皆 32 欄)。資料來源與重建方式見 dat/materials/homstrad-provenance.mdprg/FAST-2007/README.md。假說與限制的權威登記表為 doc/Status.md;推導與證據見 dev/logs/Developmental_Steps.txt