diff --git a/backend/scripts/breeding_stats/blup.py b/backend/scripts/breeding_stats/blup.py index 988cd9f..eb50069 100644 --- a/backend/scripts/breeding_stats/blup.py +++ b/backend/scripts/breeding_stats/blup.py @@ -84,7 +84,14 @@ def _pearson(x: list[float], y: list[float]) -> float: def _order_pedigree(base: list[int], non_base: list[tuple[int, int | None, int | None]]) -> tuple[list[int], dict[int, int]]: - """返回拓扑序(祖先恒在子代之前,base 恒在最前)与 {个体id: 序号}。""" + """返回拓扑序(祖先恒在子代之前,base 恒在最前)与 {个体id: 序号}。 + + 输入顺序不参与计算:base 与同世代并列个体均按 id 确定性排序,调用方/DB 行序不再 + 影响 MME 变量布局——同内容输入必得逐位相同输出(平似然/退化数据上尤其关键,否则 + golden-section/二分会被末位浮点噪声带偏到任意 h²)。 + """ + base = sorted(base, key=str) + non_base = sorted(non_base, key=lambda it: str(it[0])) order: list[int] = list(base) placed: set[int] = set(base) remaining = list(non_base)