3. 译码图构建失败:缺失边与权重异常的定位

问题定位:从探测器坐标到错误机制映射

表面码译码图构建失败通常表现为两类症状:一是边缺失——某个探测器在图中没有与任何相邻探测器或边界相连,导致综合征无法被匹配;二是权重异常——边存在但权重为 0、负数或与错误概率明显不符,使 MWPM 匹配退化。两者根因往往不在译码算法本身,而在探测器坐标与错误机制映射之间的对应关系被破坏。

下面用一张图说明构建链路中三个关键检查点:坐标表、错误机制表、以及二者合成后的图结构。任一环节错位,都会在图层面表现为缺边或权重异常。

探测器坐标表 detector_id → (x, y, t) 例:D7 → (2, 1, 0) 错误机制表 mechanism → 触发探测器集 例:X1 → {D3, D7} 错误概率表 mechanism → p 例:X1 → p=0.01 译码图构建 节点 = 探测器 边 = 机制触发的探测器对 权重 = -log(p/(1-p)) 坐标用于确定邻接与边界 机制表用于确定边端点 概率表用于确定边权重 译码图 G(V, E, w) V:探测器节点 E:机制边 + 边界边 w:边权重 检查:连通性 / 权重范围 检查:边界边是否完整 典型故障模式 ① 坐标缺失/重复 → 邻接判断失败 → 边缺失 ② 机制表端点 ID 与坐标表不一致 → 边指向不存在的节点 ③ 概率为 0 或 ≥1 → 权重为 inf 或负 → 匹配退化 ④ 边界边未生成 → 边界附近综合征无法匹配

排查步骤:逐层核对三张表

按“坐标表 → 机制表 → 概率表”的顺序核对,可以快速把问题锁定到具体表项。以下代码演示一个最小可运行的检查脚本,使用教学示例数据(3×3 表面码、码距 d=3),输出缺边与权重异常清单。

import math
from collections import defaultdict

# 教学示例:3x3 表面码探测器坐标(t=0 层)
# 探测器按 (x, y) 网格排列,边界探测器用 None 表示连接到边界
detector_coords = {
    "D0": (0, 0), "D1": (1, 0), "D2": (2, 0),
    "D3": (0, 1), "D4": (1, 1), "D5": (2, 1),
    "D6": (0, 2), "D7": (1, 2), "D8": (2, 2),
}

# 错误机制表:机制名 -> 触发的探测器集合(空集表示边界机制)
mechanisms = {
    "X0": {"D0", "D1"},
    "X1": {"D1", "D2"},
    "X2": {"D3", "D4"},
    "X3": {"D4", "D5"},
    "X4": {"D6", "D7"},
    "X5": {"D7", "D8"},
    "X6": {"D0", "D3"},
    "X7": {"D3", "D6"},
    "X8": {"D1", "D4"},
    "X9": {"D4", "D7"},
    "X10": {"D2", "D5"},
    "X11": {"D5", "D8"},
    "B0": {"D0"},   # 边界机制
    "B1": {"D2"},
    "B2": {"D6"},
    "B3": {"D8"},
}

# 错误概率表(教学示例值)
probs = {m: 0.01 for m in mechanisms}
probs["X4"] = 0.0      # 故意注入异常:概率为 0
probs["X9"] = 1.0      # 故意注入异常:概率为 1

def weight(p):
    if p <= 0 or p >= 1:
        return None  # 无法计算有效权重
    return -math.log(p / (1 - p))

# 1) 检查机制表端点是否都在坐标表中
missing_nodes = []
for m, dets in mechanisms.items():
    for d in dets:
        if d not in detector_coords:
            missing_nodes.append((m, d))

# 2) 检查权重异常
bad_weights = []
for m, p in probs.items():
    w = weight(p)
    if w is None:
        bad_weights.append((m, p))

# 3) 检查图连通性(忽略边界机制)
adj = defaultdict(set)
for m, dets in mechanisms.items():
    dets = list(dets)
    if len(dets) == 2:
        a, b = dets
        adj[a].add(b)
        adj[b].add(a)

visited = set()
stack = ["D0"]
while stack:
    n = stack.pop()
    if n in visited:
        continue
    visited.add(n)
    stack.extend(adj[n] - visited)

isolated = [d for d in detector_coords if d not in visited]

print("缺失节点引用:", missing_nodes)
print("权重异常机制:", bad_weights)
print("孤立探测器:", isolated)

运行上述脚本,预期输出(教学示例):

缺失节点引用: []
权重异常机制: [('X4', 0.0), ('X9', 1.0)]
孤立探测器: []
若 missing_nodes 非空,说明机制表引用了坐标表中不存在的探测器 ID,需修正机制表或补全坐标表;若 bad_weights 非空,说明概率表存在 0 或 1 的退化值,需替换为合理的小概率(如 1e-3)或检查概率赋值逻辑;若 isolated 非空,说明该探测器没有任何机制边,通常是坐标邻接判断或机制表覆盖不全。

修复与验证

针对本例注入的两处权重异常,修复方式是将 X4 的概率改为合理值(如 0.005),将 X9 改为 0.02,然后重新构建图并验证:

  • 边数检查:内部机制边应为 12 条(3×3 网格的相邻对),边界边 4 条,总边数 16。
  • 权重范围:所有边权重应为正有限值,典型范围约 3.9~5.3(对应 p=0.005~0.02)。
  • 连通性:所有 9 个探测器节点应属于同一连通分量(边界边不计入内部连通性时,内部图应连通)。
  • 译码结果:用修复后的图跑一次 MWPM,对单比特 X 错误注入的综合征应能正确匹配到对应机制边。
概率为 0 或 1 是权重异常最常见的来源。构建图时应显式校验 0 < p < 1,并对越界值抛出明确错误或钳制到安全范围,而不是让 -log(p/(1-p)) 产生 inf 或负权重后静默进入匹配算法。

可复用检查清单

检查项判断条件异常处理
坐标表完整性每个探测器 ID 均有唯一 (x,y,t)补全或去重坐标
机制表端点所有端点 ID 存在于坐标表修正机制表或坐标表
概率范围0 < p < 1替换退化值,记录告警
边覆盖每个探测器至少有一条机制边或边界边检查邻接判断与机制覆盖
连通性内部图单一连通分量定位孤立节点并补边
权重有限性所有 w 为正有限值回溯概率表与公式