Virtual Embryo Challenge更新于 10-03 22:39(北京时间) / 每 5 分钟更新

总览 · ← 返回运行 20261003-171955-search-t2-embryo-interp-chain-12h

节点 n41 在终选来历上

NBHDCOH:DETR_EXT 置零改为优先选「15-NN 邻域内该基因表达最低」的细胞(每基因移除数不变),配合强度 0.35→0.45,nbhd 与 variogram 首次同向改善;PLAN 的 NBHDGATE/cap 均被证否。

运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。20261003-171955-search-t2-embryo-interp-chain-12h
父节点n39
子节点n43
操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。改进
状态已打分
分数搜索目标分 65.71(+0.6) · proxy 65.71(+0.6) · 3 次复测均分 65.30
审查通过 1 越界读取:未发现问题——run.py 仅通过 src.task2_spatial.view_io 的 load_manifest/read_stage 读取 args.data 视图内的 bracket 输入(main() 约 2114-2124 行),prior 读取(tf_indicator 568 行、load_pathway_sets 674-686 行)均在 view/prior/ 下且属 view_manifest 的 prior 清单;全文件无绝对路径、'..'、/mnt、/home、data/raw、评分器路径,无网络访问。; 2 硬编码目标统计量:未发现问题——单侧类型…
用时?从运行开始到结束(或到现在)的挂钟时间。47 分
程序版本720fc7fcabdd25df8ad8a161f8c7d636bf9bc5de (programs.git)

方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。

来自 programs.git 720fc7fcab:solution/METHOD.md

NBHDCOH:DETR_EXT 置零改为优先选「15-NN 邻域内该基因表达最低」的细胞(每基因移除数不变),配合强度 0.35→0.45,nbhd 与 variogram 首次同向改善;PLAN 的 NBHDGATE/cap 均被证否。

  • family_id: T2EI-01
  • parent: node 39(DETR_EXT,A 半同期锚点 64.34)
  • mechanism (submitted): NBHDCOH — neighborhood-coherent OFF selection
  • mechanism_off_control: --ablate mechanism(或 T2_NBHDCOH=0):跳过 15-NN 键,回到原随机键 u 选择,其余步骤(含 s=0.45)不变;输出 = 未门控 s=0.45 管线,逐位一致(sha256 验证)。注意:因强度从 0.35 重调到 0.45,ablate 输出不等于父节点 39 的输出,但恰好隔离本节点机制(同强度对照 65.04 vs 64.33 = 机制净贡献 +0.71)。

PLAN 机制(NBHDGATE)的实现与证否

按 PLAN 实现:输出坐标上 cKDTree 取 15-NN(含自身,与 neighborhood_mmd 同尺度),r_i = 邻域内同型同侧单侧细胞占比;r_i < θ 时该细胞置零预算缩为 round(r_i/θ × k_orig),按超额概率 (p_cur−p_t) 降序保留(确定性排序,基因索引破平)。

先做了 PLAN 第 6 步的分布检查:1842 个单侧细胞 r_i 中位数 0.20、p90 0.47、仅 9.9% > 0.5、坐标无重复 → 门控有区分度,不触发跳过条件。

A 半 seed 0(同一次评分会话内可比;本会话锚点与 node 39 记录不同,父节点同文件重测 64.337,de_score 0.3448→0.3214,跨会话绝对值不可比):

配置榜分nbhd rawvariogram raw
父(s=0.35,无门控)64.340.052320.007513
gate θ=0.1564.330.052250.007573
gate θ=0.2564.290.052120.007731
gate θ=0.3564.250.051960.007915
gate θ=0.35 + s=0.4564.340.052790.007429
cap K=median⁺=1464.050.051370.008662

结论:门控方向上 nbhd 确实单调改善(θ↑ → nbhd raw↓,支持"混合邻域中的置零更伤 nbhd"假设),但每 1e-4 nbhd raw 只值 ~0.047 分,而同等置零削减造成的 variogram 回退每 1e-4 值 ~0.125 分——任何削减置零总量的门控都净负。PLAN 的 cap 备选按原定义(全体单侧细胞移除数的中位数)退化:68% 单侧细胞零移除 → 中位数 0 → 全部置零被禁;改用正计数中位数 K=14 后削 62% 移除,同样净负(64.05)。NBHDGATE 判无效(6 配置、8 次查分,见上表 + gate035_st045/nogate_st045 归因对)。

提交的备选机制:NBHDCOH(针对同一弱项 local_spatial)

证据链:s=0.45 同强度下,门控把混合邻域置零换成同质邻域置零,nbhd 每移除伤害 9.3e-8 → 1.7e-7 之差说明移除发生的位置比移除总量更关键。于是保持 DETR_EXT 每基因移除数不变(变igram/边际检出修复全部保留),只改选哪些细胞:对基因 g,在其非零细胞中按 15-NN 邻域平均表达 NS(排除自身:NS'=(15·NS−x_i)/14,预移除输出云、cKDTree、确定性 lexsort 键 (NS', u, index))取最低的 k 个置零。生物学依据:表达的空间自协/共环境协变是组织的一般性质(Moran 1950, doi:10.2307/2332142 —— 一般机制知识,不含任何保留阶段测量值;所有量均运行时从视图输入现场计算)。移除一个「微环境本就缺该转录本」的条目,对邻域平均表达场扰动最小——node 39 nbhd 代价的来源正是随机键在混合邻域制造的孤立置零噪声。

强度补偿:无门控 s=0.45/0.55 会把 nbhd 打到 0.0537/0.0553(净负 64.33/64.19);NBHDCOH 保护下 s=0.45 的 nbhd 仅 0.0493,同时 variogram 收益扩大 → 提交 s=0.45。

A 半查分(同会话):

配置榜分nbhdvariogrammmd_u
coh self s=0.3564.840.048800.007720.01035
coh noself s=0.3564.850.048820.007680.01034
coh P=0.5 blend s=0.3564.690.050170.007650.01040
coh self s=0.4565.020.049280.007170.01027
coh noself s=0.45(提交)65.040.049290.007110.01028
coh noself s=0.5565.040.050220.006720.01043
coh self s=0.5565.050.050170.006750.01037
无 coh s=0.45(=ablate)64.330.053650.007040.01111
无 coh s=0.5564.190.055310.006700.01139

3 种子配对(A 半,final vs parent 同种子):65.04/64.64/64.68 vs 64.34/63.89/63.97 → +0.71/+0.75/+0.71,均值 +0.72 ≥ 0.3;nbhd raw 0.0493–0.0500 vs 0.0521–0.0535,variogram 0.0070–0.0072 vs 0.0075–0.0076,两组首次同向改善(node 39 是 variogram↑ nbhd↓ 交换)。

机制生效证据(PLAN mechanism_evidence 对应项)

  1. 改变的细胞:s=0.45 时每基因移除数与无 coh 逐位相同(rate_gap_after 一致),但 74% 的被选细胞与随机键不同(nbhdcoh_sel_move_frac≈0.74,stderr info);同一类型两个细胞因邻域不同获得不同移除集合(非型级常数位移/全局重加权,见 PLAN vs_constant_shift)。
  2. nbhd raw 0.05365→0.04929(s=0.45 同强度对照),variogram 保持 ≤0.00711:两项同时满足(优于 PLAN 快筛线的相对形式)。
  3. 四组分(seed 0):local_spatial 58.80→60.87(+2.07),cell_state 58.62→59.39(noself s=0.45,mmd_u 0.01111→0.01028),expression_change 62.15→62.16(持平),shape_scale 77.75 不变(坐标逐位不动,d2/occupancy/scale 三项 raw 相同)。
  4. 移除数与 r_i 的相关在 gate 实验中为 +0.039(弱正);NBHDCOH 不依赖 r_i,依赖 NS'(更直接的邻域场扰动度量)。

验证过 / 未验证

  • 验证过:seed 0 双跑逐位一致;--ablate = 无 coh s=0.45 逐位一致;T2_NBHDCOH_P=1.0 = 父管线逐位一致;θ=0 gate = 父逐位一致;vec-check 全部通过;运行时 ~2s / <1GB(限 28GB/30min);单输入阶段退路(b is None → 分层照抄,机制自然不激活);两阶段重构(先收集后写回)对父输出逐位中性。
  • 未验证:B 半与伪装视图(harness 执行);final 真实括号上单侧类型占比若低于本视图 37%,机制收益同比缩小(s=0.45 的选择基于本视图剂量-响应,真实括号未测);nbhd 的评分器抽样噪声(同会话内查分是确定性的,跨会话锚点不同)。
  • 查分使用:20/20。

知识来源

  • 表达的空间自协变/邻域共变是组织一般性质:Moran (1950) Biometrika 37:17–23, doi:10.2307/2332142(空间自相关度量的一般定义;仅用概念,不用任何数值)。
  • neighborhood_mmd 的 15-NN 尺度:任务书评分简报(公开规则),机制与度量尺度对齐是设计选择,不读取评分器。
  • 未使用任何保留阶段/保留基因型的测量值;全部统计量(检出率、漂移比、邻域均值、类型集合)运行时从视图 manifest 输入现场计算。

调研员的计划

名称NBHDGATE:DETR_EXT 置零的 15-NN 空间组成门控修复 nbhd 代价
动机Node 39 DETR_EXT 将 variogram 从地板下修到地板上(raw 0.01016→0.00741,+1.03 分),但 neighborhood_mmd raw 从 0.04775 恶化到 0.04996(skill 0.620→0.609,−0.27 分),是唯一变坏的组(local_spatial −1.09,60.90 vs 父 61.99)。结构原因:DETR_EXT 对 37% 输出细胞(24 个单侧类型)的 OFF 置零逐细胞独立决策,不考虑空间邻域;当单侧类型细胞与共享类型或其他来源细胞混居时,孤立置零在 15-NN 尺度上制造表达-位置不连续,恰好被 neighborhood_mmd(15-NN 平均表达分布的 MMD,25 分+结构门)捕捉。
做法步骤:1) 在 DETR_EXT(mode=shared, s=0.35)置零前,对每个单侧类型输出细胞在输出坐标空间建 KD-tree 取 15-NN(与 neighborhood_mmd 同尺度)。2) 统计 15-NN 中同源同侧单侧类型细胞数 h_i,计算占比 r_i = h_i/15。3) 门控:r_i < θ 时,该细胞置零条目数缩减为 k_i = round(r_i/θ × k_orig),保留超额概率最大的 k_i 条(确定性排序不变);r_i ≥ θ 时全量置零。4) θ 初值 0.25,搜索 {0.15, 0.25, 0.35},每个配置跑 seed 0 vec-score。5) 快筛标准:nbhd raw ≤ 0.0489(父 37 与 39 中点)且 variogram raw ≤ 0.0085 才继续;否则试备选——每细胞置零上限 K = median(全部单侧细胞置零数),超额按超额概率截断。6) 实施前先统计 r_i 分布:若 >80% 细胞 r_i > 0.5(单侧类型已高度聚集),组成门控无区分度,直接跳到备选 K 上限。7) 单输入阶段退路:无括号则无 DETR_EXT,门控自然不激活,输出等同上游。8) 选定配置后跑 seed 0/1/2 确认,均值提升 ≥0.3 才提交。
风险1) 门控过度(θ 偏大)导致置零量不足、variogram 回退:Engineer 每个 θ 配置同时监控 variogram raw,>0.009 即放弃该配置。2) 单侧类型细胞在 mix 分层抽样后已按类型聚集,大多数细胞 r_i 本来就高,门控几乎不改变输出(r_i 分布无区分度):此时应立即转备选 K 上限,不要耗查分次数在无效网格上。3) 净收益可能 <1 分(T2 噪声 ~1 分):需 3 种子均值确认;若 3 种子均值提升 <0.3 则如实报 NO_CHANGE。4) 15-NN 建在输出坐标上,若坐标有退化(全重合等)会导致门控失效:先检查坐标唯一性。

代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。

对比:父节点版本 2e54d3d851。改动的文件:solution/METHOD.md +61 −88、solution/run.py +285 −26

diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 82fe83a..abc54af 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,93 +1,66 @@-DETR_EXT:把 DETR 检出率几何插值扩展到单侧独有类型(37% 输出细胞),以共有类型细胞的逐基因检出漂移作缺失侧代理,OFF-only 置零(s=0.35);PLAN 的 AMPSHRINK 幅度收缩证否(7 配置全劣于父)。+NBHDCOH:DETR_EXT 置零改为优先选「15-NN 邻域内该基因表达最低」的细胞(每基因移除数不变),配合强度 0.35→0.45,nbhd 与 variogram 首次同向改善;PLAN 的 NBHDGATE/cap 均被证否。  - family_id: T2EI-01-- parent: node 37 (DETR, 64.05 official / 63.17 A半 seed0)-- mechanism_off_control: `--ablate mechanism`(或 `T2_DETR_EXT=0`)关闭 DETR_EXT,其余管线不变,输出与父节点 37 逐位一致(sha256 已在 seed 0/1/2 上验证)。--## PLAN 机制 AMPSHRINK:已实现并证否(7 次查分、3 种解码)--按 PLAN 在 DETR 之后实现:逐共有类型(两侧≥10 细胞)× 软权重激活基因(τ=0.15),-m_t = exp((1−t)·ln m_a + t·ln m_b)(m_a/m_b 为括号阶段实测 nnz 均值),m_cur > m_t 时对该型该基因全部-nnz 条目乘 f = (m_t/m_cur)^strength(只缩不放大)。无随机、保稀疏、保序。--信号检查(PLAN 步骤 5 / 风险 1):机制**有信号**——中位相对 gap 9.8%(>5% 门槛),70% 的型×基因对-m_cur > m_t,平均收缩因子 0.91(在预期 0.85–0.98 内),nnz_delta=0(稀疏模式不变)。但查分全部劣于父节点:--| 配置 | board (A半 seed0) | variogram | mmd_u | nbhd | de_score |-|---|---:|---:|---:|---:|---:|-| 父节点 37 | **63.17** | 0.010463 | 0.01139 | 0.05083 | 0.2857 |-| pooled s=0.25 | 63.04 | 0.010353 | 0.01130 | 0.05270 | 0.2857 |-| pooled s=0.5 | 62.42 | 0.010276 | 0.01185 | 0.05556 | 0.2500 |-| pooled s=1.0 | 61.00 | 0.010207 | 0.01463 | 0.06350 | 0.2500 |-| sided s=0.5 | 61.30 | 0.010151 | 0.01318 | 0.06183 | 0.2143 |-| sided s=1.0 | 57.88 | 0.010085 | 0.02098 | 0.07994 | 0.2143 |-| gapped(>10%) s=0.5 | 62.49 | 0.010281 | 0.01177 | 0.05527 | 0.2500 |-| gapped(>10%) s=1.0 | 61.16 | 0.010212 | 0.01430 | 0.06270 | 0.2500 |--结论(判无效,满足 ≥3 解码/幅度、≥6 次查分):variogram 收益始终 <0.0004(PLAN 自己的阈值),而-mmd_u / neighborhood_mmd / de_score 随 strength 单调恶化——乘性值缩放即便保序、保稀疏,也把细胞推离-真值拟合的 PCA 流形并破坏表达-位置配对;pb_maxshift(0.14–0.82)远超 PLAN 的 <0.02 预期,"伪批量近似-对消"假设不成立。"nnz 幅度冻结在源阶段"这一动机假设本身为假:α=5 位移后幅度已接近目标(gap 中位仅-9.8%,且收缩方向系统性地偏离真值)。与 node 17/19/37 的教训一致:**值通道修正一律伤 nbhd/mmd,只有-支持集(零/非零)通道可安全修**。AMPSHRINK 代码保留,默认 `T2_AMPSHRINK_ON=0`。--## 提交的备选机制 DETR_EXT(针对同一弱项 cell_state/variogram)--诊断:父节点 DETR 只覆盖共有类型(两侧≥10 细胞,10 个),但 mix 输出按全类型分层抽样,**37% 的输出-细胞(a 侧 857 + b 侧 985,共 24 个单侧类型)的检出支持集完全未校正**,仍冻结在源阶段水平。b 侧细胞-相对合并几何目标在 95% 基因上过检出(0.134 vs 0.045)。--机制:对每个单侧类型的输出细胞,用**逐基因全局检出漂移**作缺失侧代理:-p_t(g) = p_own(g)·(pa_sh(g)/pb_sh(g))^((1−t) 对 b 侧, −t 对 a 侧),其中 pa_sh/pb_sh 只在**共有类型-细胞**上计算(`DETR_EXT_MODE=shared`)——去掉类型组成变化对漂移估计的混杂;两侧任一未检出的基因被-门掉(保护单侧类型的身份基因不被清零)。过检出部分按与 DETR 相同的规则 OFF-only 置零:-k = round((p_cur−p_t)·n·strength),逐细胞确定性键跨基因共享(模拟深度相关 dropout)。无新随机源-(独立 rng = seed+777002,确定性);不注入任何值。--生物学依据:发育中检出率随时间的乘性(log 线性)漂移与 node 37 已验证的几何插值目标同源;缺失侧用-群体水平漂移近似是"谱系去向/发育事件顺序"级别的通用程序知识,不含任何保留阶段的测量值。所有量均从-view 输入现场计算,无硬编码。--机制证据(seed 0):覆盖 24 个类型、1842/5000 细胞(37%)、445 基因;移除 13,678 个 nnz 条目-(这些细胞 nnz 的 ~17%);逐型检出率相对目标的平均绝对 gap 0.0763 → 0.0552;pb_maxshift=0.299-(与已验证安全的 DETR 0.211 同量级);共享类型细胞的输出不受影响(rng 独立,逐位不变)。--## 查分记录(A 半 proxy,共 19 次,余 1)--DETR_EXT 剂量响应(seed 0):--| 配置 | board | variogram | mmd_u | nbhd | de_score | de_dir |-|---|---:|---:|---:|---:|---:|---:|-| mode=all s=0.3 | 64.11 | 0.007848 | 0.01106 | 0.05248 | 0.3214 | 0.3724 |-| mode=all s=0.4 | 64.13 | 0.007258 | 0.01121 | 0.05404 | 0.3214 | 0.3701 |-| mode=all s=0.5 | 64.16 | 0.006922 | 0.01154 | 0.05582 | 0.3571 | 0.3651 |-| mode=all s=0.75 | 63.45 | 0.006364 | 0.01255 | 0.06220 | 0.3571 | 0.3548 |-| mode=all s=1.5 | 54.55 | 0.009063 | 0.01973 | 0.09083 | 0.1429 | 0.0912 |-| **mode=shared s=0.35(提交)** | **64.34** | 0.007513 | 0.01094 | 0.05232 | 0.3214 | 0.3786 |-| mode=shared s=0.5 | 64.27 | 0.006872 | 0.01120 | 0.05444 | 0.3214 | 0.3707 |-| mode=shared s=0.75 | 63.73 | 0.006245 | 0.01209 | 0.05985 | 0.3214 | 0.3657 |--种子确认(mode=shared s=0.35):seed 0/1/2 = 64.34 / 63.89 / 63.97,均值 **64.07**(父节点 seed 0-= 63.17,官方 rank3 = 63.71)。四组变化(seed 0 vs 父):cell_state 53.17→57.94(variogram raw-0.01046→0.00751,mmd_u 0.01139→0.01094),expression_change 61.64→62.24(de_score 0.286→0.321,-de_dir 0.384→0.379),local_spatial 60.12→59.41(nbhd 0.0508→0.0523,代价 −0.7),shape_scale 不变-(坐标逐位未动)。净 +1.17(seed 0)/ +0.9(三种子均值口径)。--选择 shared s=0.35 而非 all s=0.5 的理由:board 更高且 nbhd 伤害减半(0.0523 vs 0.0558)、-de_dir 保留更多;shared 漂移估计去掉组成混杂,更可能迁移到真实括号(两端相邻、共有类型多)。--## 验证与未验证--- 已验证:`vec-check` 通过(seed 0/1/2);`--ablate mechanism` 输出与父节点 37 逐位一致(sha256,-  3 个种子);重跑同 seed 输出逐位一致(确定性);nnz 条目只减不增(OFF-only);单输入回退路径-  (b is None 提前返回,DETR_EXT 需 bracket)不受影响;程序只依赖时间差 t,不依赖绝对时间/视图字段。-- 未验证:真实括号(final 视图)上的效果——真实两端相邻、单侧类型构成不同,漂移代理的偏差未知;-  B 半分数;s 在 0.35–0.5 之间的更细网格(差异在噪声内,未花额度)。-- 已知风险:nbhd 小幅受损(−0.7 分)是该机制的系统性代价;若正式评分的 nbhd 地板/天花板更紧,-  损失可能放大。s≥0.75 时 nbhd 伤害陡增,不要上调。+- parent: node 39(DETR_EXT,A 半同期锚点 64.34)+- mechanism (submitted): NBHDCOH — neighborhood-coherent OFF selection+- mechanism_off_control: `--ablate mechanism`(或 `T2_NBHDCOH=0`):跳过 15-NN 键,回到原随机键 u 选择,其余步骤(含 s=0.45)不变;输出 = 未门控 s=0.45 管线,逐位一致(sha256 验证)。注意:因强度从 0.35 重调到 0.45,ablate 输出不等于父节点 39 的输出,但恰好隔离本节点机制(同强度对照 65.04 vs 64.33 = 机制净贡献 +0.71)。++## PLAN 机制(NBHDGATE)的实现与证否++按 PLAN 实现:输出坐标上 cKDTree 取 15-NN(含自身,与 neighborhood_mmd 同尺度),r_i = 邻域内同型同侧单侧细胞占比;r_i < θ 时该细胞置零预算缩为 round(r_i/θ × k_orig),按超额概率 (p_cur−p_t) 降序保留(确定性排序,基因索引破平)。++先做了 PLAN 第 6 步的分布检查:1842 个单侧细胞 r_i 中位数 0.20、p90 0.47、仅 9.9% > 0.5、坐标无重复 → 门控有区分度,不触发跳过条件。++A 半 seed 0(同一次评分会话内可比;本会话锚点与 node 39 记录不同,父节点同文件重测 64.337,de_score 0.3448→0.3214,跨会话绝对值不可比):++| 配置 | 榜分 | nbhd raw | variogram raw |+|---|---:|---:|---:|+| 父(s=0.35,无门控) | 64.34 | 0.05232 | 0.007513 |+| gate θ=0.15 | 64.33 | 0.05225 | 0.007573 |+| gate θ=0.25 | 64.29 | 0.05212 | 0.007731 |+| gate θ=0.35 | 64.25 | 0.05196 | 0.007915 |+| gate θ=0.35 + s=0.45 | 64.34 | 0.05279 | 0.007429 |+| cap K=median⁺=14 | 64.05 | 0.05137 | 0.008662 |++结论:门控方向上 nbhd 确实单调改善(θ↑ → nbhd raw↓,支持"混合邻域中的置零更伤 nbhd"假设),但每 1e-4 nbhd raw 只值 ~0.047 分,而同等置零削减造成的 variogram 回退每 1e-4 值 ~0.125 分——**任何削减置零总量的门控都净负**。PLAN 的 cap 备选按原定义(全体单侧细胞移除数的中位数)退化:68% 单侧细胞零移除 → 中位数 0 → 全部置零被禁;改用正计数中位数 K=14 后削 62% 移除,同样净负(64.05)。NBHDGATE 判无效(6 配置、8 次查分,见上表 + gate035_st045/nogate_st045 归因对)。++## 提交的备选机制:NBHDCOH(针对同一弱项 local_spatial)++证据链:s=0.45 同强度下,门控把混合邻域置零换成同质邻域置零,nbhd 每移除伤害 9.3e-8 → 1.7e-7 之差说明**移除发生的位置**比**移除总量**更关键。于是保持 DETR_EXT 每基因移除数不变(变igram/边际检出修复全部保留),只改选哪些细胞:对基因 g,在其非零细胞中按 15-NN 邻域平均表达 NS(**排除自身**:NS'=(15·NS−x_i)/14,预移除输出云、cKDTree、确定性 lexsort 键 (NS', u, index))取最低的 k 个置零。生物学依据:表达的空间自协/共环境协变是组织的一般性质(Moran 1950, doi:10.2307/2332142 —— 一般机制知识,不含任何保留阶段测量值;所有量均运行时从视图输入现场计算)。移除一个「微环境本就缺该转录本」的条目,对邻域平均表达场扰动最小——node 39 nbhd 代价的来源正是随机键在混合邻域制造的孤立置零噪声。++强度补偿:无门控 s=0.45/0.55 会把 nbhd 打到 0.0537/0.0553(净负 64.33/64.19);NBHDCOH 保护下 s=0.45 的 nbhd 仅 0.0493,同时 variogram 收益扩大 → 提交 s=0.45。++A 半查分(同会话):++| 配置 | 榜分 | nbhd | variogram | mmd_u |+|---|---:|---:|---:|---:|+| coh self s=0.35 | 64.84 | 0.04880 | 0.00772 | 0.01035 |+| coh noself s=0.35 | 64.85 | 0.04882 | 0.00768 | 0.01034 |+| coh P=0.5 blend s=0.35 | 64.69 | 0.05017 | 0.00765 | 0.01040 |+| coh self s=0.45 | 65.02 | 0.04928 | 0.00717 | 0.01027 |+| **coh noself s=0.45(提交)** | **65.04** | 0.04929 | 0.00711 | 0.01028 |+| coh noself s=0.55 | 65.04 | 0.05022 | 0.00672 | 0.01043 |+| coh self s=0.55 | 65.05 | 0.05017 | 0.00675 | 0.01037 |+| 无 coh s=0.45(=ablate) | 64.33 | 0.05365 | 0.00704 | 0.01111 |+| 无 coh s=0.55 | 64.19 | 0.05531 | 0.00670 | 0.01139 |++3 种子配对(A 半,final vs parent 同种子):65.04/64.64/64.68 vs 64.34/63.89/63.97 → **+0.71/+0.75/+0.71,均值 +0.72 ≥ 0.3**;nbhd raw 0.0493–0.0500 vs 0.0521–0.0535,variogram 0.0070–0.0072 vs 0.0075–0.0076,两组首次同向改善(node 39 是 variogram↑ nbhd↓ 交换)。++## 机制生效证据(PLAN mechanism_evidence 对应项)++1. 改变的细胞:s=0.45 时每基因移除数与无 coh 逐位相同(rate_gap_after 一致),但 74% 的被选细胞与随机键不同(`nbhdcoh_sel_move_frac`≈0.74,stderr info);同一类型两个细胞因邻域不同获得不同移除集合(非型级常数位移/全局重加权,见 PLAN vs_constant_shift)。+2. nbhd raw 0.05365→0.04929(s=0.45 同强度对照),variogram 保持 ≤0.00711:两项同时满足(优于 PLAN 快筛线的相对形式)。+3. 四组分(seed 0):local_spatial 58.80→60.87(+2.07),cell_state 58.62→59.39(noself s=0.45,mmd_u 0.01111→0.01028),expression_change 62.15→62.16(持平),shape_scale 77.75 不变(坐标逐位不动,d2/occupancy/scale 三项 raw 相同)。+4. 移除数与 r_i 的相关在 gate 实验中为 +0.039(弱正);NBHDCOH 不依赖 r_i,依赖 NS'(更直接的邻域场扰动度量)。++## 验证过 / 未验证++- 验证过:seed 0 双跑逐位一致;`--ablate` = 无 coh s=0.45 逐位一致;`T2_NBHDCOH_P=1.0` = 父管线逐位一致;θ=0 gate = 父逐位一致;vec-check 全部通过;运行时 ~2s / <1GB(限 28GB/30min);单输入阶段退路(b is None → 分层照抄,机制自然不激活);两阶段重构(先收集后写回)对父输出逐位中性。+- 未验证:B 半与伪装视图(harness 执行);final 真实括号上单侧类型占比若低于本视图 37%,机制收益同比缩小(s=0.45 的选择基于本视图剂量-响应,真实括号未测);nbhd 的评分器抽样噪声(同会话内查分是确定性的,跨会话锚点不同)。+- 查分使用:20/20。  ## 知识来源 -无外部文献/数据库条目。全部量(检出率、漂移比、目标、细胞数、t)从 view 的 manifest 与输入 h5ad-现场计算;所用生物学假设仅为"表达检出随发育时间近似乘性漂移"(与父节点已验证的几何插值目标同源,-属通用机制知识,不含保留阶段测量值)。+- 表达的空间自协变/邻域共变是组织一般性质:Moran (1950) Biometrika 37:17–23, doi:10.2307/2332142(空间自相关度量的一般定义;仅用概念,不用任何数值)。+- neighborhood_mmd 的 15-NN 尺度:任务书评分简报(公开规则),机制与度量尺度对齐是设计选择,不读取评分器。+- 未使用任何保留阶段/保留基因型的测量值;全部统计量(检出率、漂移比、邻域均值、类型集合)运行时从视图 manifest 输入现场计算。diff --git a/solution/run.py b/solution/run.pyindex 370b6bf..c26db10 100644--- a/solution/run.py+++ b/solution/run.py@@ -8,7 +8,39 @@ exp(log r_a + SCALE_DAMP·t·Δlog r), and draws cells stratified by type: round(t·n) from the later stage, the rest from the earlier one. Coordinates travel with the cells. n is log-linear in t, clipped to the board range. -This node (39, DETR_EXT, family T2EI-01): the PLAN mechanism (AMPSHRINK:+This node (41, NBHDCOH, family T2EI-01): the PLAN mechanism (NBHDGATE: shrink+each one-side cell's DETR_EXT removal budget by its 15-NN same-type same-side+fraction r_i when r_i < theta) was implemented and FALSIFIED — the r_i+distribution has good discrimination (median 0.20, only 10% > 0.5) and gating+does improve neighborhood_mmd monotonically (raw 0.05232 -> 0.05196 over+theta 0.15/0.25/0.35), but every budget cut trades variogram loss (~0.125+pts per 1e-4 raw) against a ~3x smaller nbhd gain (~0.047 pts per 1e-4 raw),+so all configs land <= parent (A half seed 0, same-session anchors: parent+64.34; theta 64.33/64.29/64.25). The PLAN fallback (per-cell cap at the+median removal count) is degenerate as specified (median over ALL one-side+cells is 0; 68% get no removal) and its positive-median version (K=14,+-62% removals) also loses: 64.05. Attribution runs isolate the mechanism:+at matched strength the coherent selection is worth +0.71 (s=0.45: 65.02 vs+64.33) and +0.85 (s=0.55: 65.04 vs 64.19). The SUBMITTED alternative is+NBHDCOH (neighborhood-coherent OFF selection): keep DETR_EXT's per-gene+removal COUNTS (the variogram/marginal-detection repair) and change only+WHICH cells are zeroed — rank a gene's nonzero cells by their 15-NN+neighborhood-average expression of that gene (self excluded, cKDTree on the+final output coordinates, deterministic lexsort key (NS_excl_self, u, index))+and remove the k lowest — combined with strength 0.35 -> 0.45, which the+coherence now protects (ungated s=0.45/0.55 tank nbhd to 0.0537/0.0553).+Spatial-autocorrelation rationale: dropping a transcript whose micro-+environment already lacks it perturbs the local average-expression field+least (isolated-dropout noise was what nbhd penalized in node 39).+A half seeds 0/1/2: 65.04/64.64/64.68 vs parent 64.34/63.89/63.97 (mean++0.72, consistent); nbhd raw 0.0493-0.0500 vs 0.0521-0.0535 AND variogram+0.0070-0.0072 vs 0.0075-0.0076 — both move together for the first time.+NBHDCOH_SELF=1 (include own value in the key) ties: 65.02. P-blend 0.5:+64.69. --ablate (or T2_NBHDCOH=0) reproduces the ungated s=0.45 pipeline+bit-for-bit (sha256-verified; board 64.33), isolating the mechanism.+See METHOD.md.++Parent node (39, DETR_EXT, family T2EI-01): the PLAN mechanism (AMPSHRINK: shrink-only geometric interpolation of per-type per-gene nnz amplitude means toward m_t = m_a^(1−t)·m_b^t) was implemented and FALSIFIED: 7 configs (3 decodes pooled/sided/gapped × strengths 0.25..1.5) all land BELOW the@@ -337,7 +369,59 @@ DETR_EXT_TAU = float(os.environ.get("T2_DETR_EXT_TAU", "0.15")) # cells at either stage are gated out (protects one-side-only identity # genes from erasure). DETR_EXT_MODE = os.environ.get("T2_DETR_EXT_MODE", "shared")-DETR_EXT_STRENGTH = float(os.environ.get("T2_DETR_EXT_STRENGTH", "0.35"))+DETR_EXT_STRENGTH = float(os.environ.get("T2_DETR_EXT_STRENGTH", "0.45"))+# NBHDGATE (mechanism of this node 41, family T2EI-01): DETR_EXT's OFF-zeroing+# is decided per cell INDEPENDENTLY of space; neighborhood_mmd reads the+# 15-NN average-expression field, so isolated removals inside mixed+# neighborhoods break the expression-position pairing there (node 39: nbhd+# raw 0.04775->0.04996, the only group that got worse). NBHDGATE couples the+# removal budget to the local composition at the metric's own scale: build a+# KD-tree on the FINAL output coordinates, take the K=15 nearest neighbors+# (incl. self, same scale as neighborhood_mmd) of every one-side-only output+# cell, and let r_i = fraction of those neighbors that are same-type+# same-side one-side-only cells. Mode "gate": if r_i < theta the cell's+# removal budget shrinks to k_i = round(r_i/theta * k_orig_i), keeping the+# k_i entries with the LARGEST excess detection count (-dpr), ties by gene+# index (deterministic); r_i >= theta keeps the full DETR_EXT removal.+# Mode "cap" (PLAN fallback): every one-side cell's removals are capped at+# K = cap_frac * median(k_orig over ALL one-side cells), keeping the largest+# excess entries. Cells that keep their full removal are bit-identical to+# DETR_EXT; only gated cells differ.+# T2_NBHDGATE=0 (or --ablate) disables and reproduces parent node 39+# bit-for-bit.+NBHDGATE = os.environ.get("T2_NBHDGATE", "0") == "1"+NBHDGATE_THETA = float(os.environ.get("T2_NBHDGATE_THETA", "0.25"))+NBHDGATE_K = int(os.environ.get("T2_NBHDGATE_K", "15"))+NBHDGATE_MODE = os.environ.get("T2_NBHDGATE_MODE", "gate")+NBHDGATE_CAP = float(os.environ.get("T2_NBHDGATE_CAP", "1.0"))+# absolute override for the cap (0 = use cap_frac × median-of-positive)+NBHDGATE_CAP_K = int(os.environ.get("T2_NBHDGATE_CAP_K", "0"))+NBHDGATE_DIAG = os.environ.get("T2_NBHDGATE_DIAG", "0") == "1"+# NBHDCOH (alternative mechanism of this node 41, after NBHDGATE/cap+# falsification): the gate/cap experiments established the exchange rate —+# every removal-count reduction trades variogram loss (~0.125 pts/1e-4 raw)+# against a smaller nbhd gain (~0.047 pts/1e-4 raw), so ANY budget cut is net+# negative; but at matched budgets, removals in spatially MIXED neighborhoods+# cost ~2x more nbhd per removal than in homogeneous ones (s=0.45 gated vs+# ungated: dnbhd/dremoval 1.7e-7 vs 9.3e-8). NBHDCOH therefore keeps the+# DETR_EXT per-gene removal COUNTS unchanged (variogram/marginal detection+# targets untouched) and changes only WHICH cells are zeroed: among a gene's+# nonzero cells, prefer those whose 15-NN neighborhood-average expression of+# that gene is LOWEST (deterministic sort key (NS, u, index); NS computed once+# from the pre-removal output cloud, same 15-NN scale as neighborhood_mmd).+# Rationale (spatial autocorrelation of expression): removing a transcript+# from a cell whose microenvironment already lacks it perturbs the local+# average-expression field least — the isolated-dropout noise that+# neighborhood_mmd penalizes is removed while the support-channel repair+# stays intact. Blend: P = fraction of genes selected purely by the legacy+# random key u (P=1 → parent bit-for-bit; P=0 → fully coherent).+NBHDCOH = os.environ.get("T2_NBHDCOH", "1") == "1"+NBHDCOH_P = float(os.environ.get("T2_NBHDCOH_P", "0.0"))+# NBHDCOH_SELF=0 excludes the cell's own value from its neighborhood-average+# key (rank by the microenvironment alone, not by own expression), so a+# high-expression cell in a gene-off neighborhood stays selectable. A-half+# seed 0: noself 65.043 vs self 65.022 at s=0.45 (default: noself).+NBHDCOH_SELF = os.environ.get("T2_NBHDCOH_SELF", "0") == "1" # AMPSHRINK (mechanism of this node 39, family T2EI-01): DETR repaired the # zero/nonzero SUPPORT channel; the nnz AMPLITUDE channel is still frozen at # the source stage (a-side cells keep the E_a nnz-value distribution, b-side@@ -1590,13 +1674,82 @@ def mix_converge(stage_a, stage_b, t: float, params: dict, alpha: float, view: s         w_e = np.clip(np.abs(gpb_b - gpb_a) / max(DETR_EXT_TAU, 1e-12), 0.0, 1.0)         act_e = np.where((w_e > 0.01) & gate)[0]         ext_info["detr_ext_n_genes"] = int(act_e.size)+        # NBHDGATE (this node 41): 15-NN same-type same-side fraction r_i on+        # the FINAL output coordinates, measured at the neighborhood_mmd+        # scale; see the config block for the mechanism rationale.+        ng = {"nbhdgate_enable": bool(NBHDGATE), "nbhdgate_mode": NBHDGATE_MODE,+              "nbhdgate_theta": NBHDGATE_THETA, "nbhdgate_k": NBHDGATE_K,+              "nbhdgate_cap_frac": NBHDGATE_CAP,+              "nbhdgate_r_mean": None, "nbhdgate_r_p10": None, "nbhdgate_r_p50": None,+              "nbhdgate_r_p90": None, "nbhdgate_frac_r_gt_half": None,+              "nbhdgate_coord_dups": None, "nbhdgate_cap_median": None,+              "nbhdgate_cells_total": 0, "nbhdgate_cells_gated": 0,+              "nbhdgate_n_off_orig": 0, "nbhdgate_n_off_kept": 0,+              "nbhdgate_removal_r_corr": None}+        r_all = None+        coh_info = {"nbhdcoh_enable": bool(NBHDCOH), "nbhdcoh_p": NBHDCOH_P,+                    "nbhdcoh_n_genes_coh": 0, "nbhdcoh_n_genes_leg": 0,+                    "nbhdcoh_ns_zero_frac": None, "nbhdcoh_sel_move_frac": None}+        NS = None+        if NBHDGATE or NBHDCOH:+            coord_out = np.asarray(coords[:ia.size + ib.size], dtype=np.float64)+            n_out = coord_out.shape[0]+            kk_n = int(min(NBHDGATE_K, n_out))+            labs_full = np.concatenate([la_o, lb_o])+            side_full = np.concatenate([np.zeros(ia.size, dtype=np.int8),+                                        np.ones(ib.size, dtype=np.int8)])+            # deterministic KNN at the neighborhood_mmd scale (15-NN incl+            # self): cKDTree, ties broken by stable sort on (dist, index).+            from scipy.spatial import cKDTree+            tree = cKDTree(coord_out)+            dist_n, nbr = tree.query(coord_out, k=kk_n)+            if nbr.ndim == 1:+                nbr = nbr[None, :]+                dist_n = dist_n[None, :]+            nbr = np.ascontiguousarray(nbr, dtype=np.int64)+            # deterministic order among the kk_n nearest: primary distance,+            # secondary cell index (guards against equal-distance ties).+            order = np.lexsort((nbr, dist_n), axis=1)+            nbr = np.take_along_axis(nbr, order, axis=1)+            del tree, dist_n, order+            if NBHDGATE:+                same = (labs_full[nbr] == labs_full[:, None]) & (side_full[nbr] == side_full[:, None])+                r_all = same.mean(axis=1).astype(np.float64)+                ng["nbhdgate_coord_dups"] = int(n_out - np.unique(np.round(coord_out, 6), axis=0).shape[0])+                one_m = ~np.isin(labs_full, list(shared10))+                rr = r_all[one_m]+                if rr.size:+                    ng["nbhdgate_r_mean"] = float(rr.mean())+                    ng["nbhdgate_r_p10"] = float(np.quantile(rr, 0.10))+                    ng["nbhdgate_r_p50"] = float(np.quantile(rr, 0.50))+                    ng["nbhdgate_r_p90"] = float(np.quantile(rr, 0.90))+                    ng["nbhdgate_frac_r_gt_half"] = float((rr > 0.5).mean())+                del same+            if NBHDCOH:+                # neighborhood-average expression field of the PRE-removal+                # output cloud at the neighborhood_mmd scale (15-NN incl self).+                from scipy import sparse as sps+                rows_w = np.repeat(np.arange(n_out, dtype=np.int32), kk_n)+                W = sps.csr_matrix((np.full(rows_w.size, 1.0 / kk_n, dtype=np.float32),+                                    (rows_w, nbr.ravel())), shape=(n_out, n_out))+                Xfull = np.vstack([xa, xb]).astype(np.float32)+                NS = np.asarray(W @ Xfull, dtype=np.float32)+                del W, Xfull, rows_w+            del nbr         if act_e.size:             rng_e = np.random.default_rng(int(params.get("seed", 0)) + 777002)             pb_before_e = np.vstack([xa, xb]).mean(axis=0).astype(np.float64)             gaps_b_e, gaps_a_e = [], []+            # Phase 1: collect candidate removals per type group. Identical+            # rng consumption order and identical per-gene selection as the+            # ungated parent (column-wise zeroing never touches other+            # columns, so deferring the writes is bit-for-bit neutral).+            groups_e = []+            move_fr, nsz_fr = [], []             for side in ("a", "b"):                 lo = la_o if side == "a" else lb_o                 xo = xa if side == "a" else xb+                off_g = 0 if side == "a" else int(ia.size)                 expo = -t if side == "a" else (1.0 - t)  # p_t = p_own·exp(expo·logratio)                 for lab in sorted(set(lo.tolist()) - shared10):                     m = lo == lab@@ -1608,34 +1761,131 @@ def mix_converge(stage_a, stage_b, t: float, params: dict, alpha: float, view: s                     p_t = p_cur * np.exp(expo * logratio)                     u = rng_e.random(n_c)                     gap_b_side = float(np.abs(p_cur[act_e] - p_t[act_e]).mean())-                    n_off_t = 0-                    Xn = Xc.copy()+                    cand = []+                    gidx_e = (np.where(m)[0] + off_g) if (NBHDCOH and NS is not None) else None                     for g in act_e:                         dpr = (p_t[g] - p_cur[g]) * n_c * DETR_EXT_STRENGTH                         if dpr <= -1.0:-                            nz = np.where(Xn[:, g] > 0)[0]+                            nz = np.where(Xc[:, g] > 0)[0]                             k = min(int(round(-dpr)), nz.size)                             if k > 0:-                                sel = nz[np.argsort(u[nz], kind="stable")[:k]]-                                Xn[sel, g] = 0.0-                                n_off_t += k-                    if n_off_t:-                        xo[m] = Xn-                    p_post = (Xn > 0).mean(axis=0)-                    gaps_b_e.append(gap_b_side)-                    gaps_a_e.append(float(np.abs(p_post[act_e] - p_t[act_e]).mean()))-                    ext_info["detr_ext_n_off"] += n_off_t-                    if side == "a":-                        ext_info["detr_ext_n_types_a"] += 1-                        ext_info["detr_ext_cells_a"] += n_c+                                coh = (NBHDCOH and NS is not None and kk_n >= 2+                                       and (int(g) * 2654435761) % 1000000 >= NBHDCOH_P * 1e6)+                                if coh:+                                    ns_g = NS[gidx_e[nz], int(g)].astype(np.float64)+                                    if not NBHDCOH_SELF:+                                        ns_g = (ns_g * kk_n - Xc[nz, g].astype(np.float64)) / (kk_n - 1.0)+                                    ord_ = np.lexsort((nz, u[nz], ns_g))[:k]+                                    sel = nz[ord_]+                                    leg = nz[np.argsort(u[nz], kind="stable")[:k]]+                                    move_fr.append(float(np.setdiff1d(sel, leg).size) / k)+                                    nsz_fr.append(float((ns_g <= 0.0).mean()))+                                    coh_info["nbhdcoh_n_genes_coh"] += 1+                                else:+                                    sel = nz[np.argsort(u[nz], kind="stable")[:k]]+                                    if NBHDCOH:+                                        coh_info["nbhdcoh_n_genes_leg"] += 1+                                exc = float(p_cur[int(g)] - p_t[int(g)])+                                cand.extend((int(c), int(g), exc) for c in sel)+                    groups_e.append({"side": side, "m": m, "xo": xo, "off_g": off_g,+                                     "Xc": Xc, "p_t": p_t, "n_c": n_c,+                                     "cand": cand, "gap_b_side": gap_b_side})+            if move_fr:+                coh_info["nbhdcoh_sel_move_frac"] = float(np.mean(move_fr))+            if nsz_fr:+                coh_info["nbhdcoh_ns_zero_frac"] = float(np.mean(nsz_fr))+            # Phase 2: apply the spatial gate (or the cap fallback) and write.+            cap_k = None+            if NBHDGATE and NBHDGATE_MODE == "cap" and groups_e:+                counts_all = []+                for grp in groups_e:+                    cnt = {}+                    for (c, g, exc) in grp["cand"]:+                        cnt[c] = cnt.get(c, 0) + 1+                    counts_all.extend(cnt.values())+                n_cells_tot = int(sum(grp["n_c"] for grp in groups_e))+                pos = np.asarray(counts_all, dtype=np.float64)+                if pos.size:+                    ng["nbhdgate_pos_q"] = [float(np.quantile(pos, q)) for q in+                                            (0.1, 0.25, 0.5, 0.75, 0.9, 0.99)]+                    ng["nbhdgate_pos_max"] = float(pos.max())+                    ng["nbhdgate_pos_frac"] = float(pos.size / max(1, n_cells_tot))+                # median over POSITIVE per-cell counts (over all cells it is 0+                # because ~68% of one-side cells receive no removal at all).+                cap_k = int(round(NBHDGATE_CAP * float(np.median(pos)))) if pos.size else 0+                ng["nbhdgate_cap_median"] = cap_k+            corr_xs, corr_ys = [], []+            for grp in groups_e:+                Xc, cand, m, xo = grp["Xc"], grp["cand"], grp["m"], grp["xo"]+                n_c = grp["n_c"]+                Xn = Xc.copy()+                n_orig = len(cand)+                ng["nbhdgate_n_off_orig"] += n_orig+                ng["nbhdgate_cells_total"] += n_c+                n_off_t = 0+                gated_on = (NBHDGATE and cand+                            and (NBHDGATE_MODE == "cap" or NBHDGATE_THETA > 0.0))+                if gated_on:+                    by_cell = {}+                    for (c, g, exc) in cand:+                        by_cell.setdefault(c, []).append((exc, g))+                    keep = set()+                    n_gated_cells = 0+                    if NBHDGATE_MODE == "cap":+                        for c, lst in by_cell.items():+                            lst.sort(key=lambda x: (-x[0], x[1]))+                            k_i = min(len(lst), cap_k) if cap_k is not None else len(lst)+                            if k_i < len(lst):+                                n_gated_cells += 1+                            keep.update((c, g) for (_e, g) in lst[:k_i])                     else:-                        ext_info["detr_ext_n_types_b"] += 1-                        ext_info["detr_ext_cells_b"] += n_c+                        gidx = np.where(m)[0] + grp["off_g"]+                        rr_g = r_all[gidx]+                        th = NBHDGATE_THETA+                        for c, lst in by_cell.items():+                            lst.sort(key=lambda x: (-x[0], x[1]))+                            r_i = float(rr_g[c])+                            if r_i < th:+                                k_i = int(round(r_i / th * len(lst)))+                                n_gated_cells += 1+                            else:+                                k_i = len(lst)+                            keep.update((c, g) for (_e, g) in lst[:k_i])+                        if len(by_cell) >= 3:+                            corr_xs.extend(float(rr_g[c]) for c in by_cell)+                            corr_ys.extend(float(len(l)) for l in by_cell.values())+                    ng["nbhdgate_cells_gated"] += n_gated_cells+                    for (c, g, exc) in cand:+                        if (c, g) in keep:+                            Xn[c, g] = 0.0+                            n_off_t += 1+                else:+                    for (c, g, exc) in cand:+                        Xn[c, g] = 0.0+                        n_off_t += 1+                ng["nbhdgate_n_off_kept"] += n_off_t+                if n_off_t:+                    xo[m] = Xn+                p_post = (Xn > 0).mean(axis=0)+                gaps_b_e.append(grp["gap_b_side"])+                gaps_a_e.append(float(np.abs(p_post[act_e] - grp["p_t"][act_e]).mean()))+                ext_info["detr_ext_n_off"] += n_off_t+                if grp["side"] == "a":+                    ext_info["detr_ext_n_types_a"] += 1+                    ext_info["detr_ext_cells_a"] += n_c+                else:+                    ext_info["detr_ext_n_types_b"] += 1+                    ext_info["detr_ext_cells_b"] += n_c+            if len(corr_xs) >= 3 and np.std(corr_xs) > 0 and np.std(corr_ys) > 0:+                ng["nbhdgate_removal_r_corr"] = float(np.corrcoef(corr_xs, corr_ys)[0, 1])             if gaps_b_e:                 ext_info["detr_ext_rate_gap_before"] = float(np.mean(gaps_b_e))                 ext_info["detr_ext_rate_gap_after"] = float(np.mean(gaps_a_e))             pb_after_e = np.vstack([xa, xb]).mean(axis=0).astype(np.float64)             ext_info["detr_ext_pb_maxshift"] = float(np.abs(pb_after_e - pb_before_e).max())+        ext_info.update(ng)+        if NBHDCOH:+            ext_info.update(coh_info)      # AMPSHRINK (this node 39): shrink-only geometric interpolation of nnz     # amplitude means, applied AFTER DETR (order matters: DETR removed entries@@ -1851,15 +2101,13 @@ def main() -> None:     parser.add_argument("--seed", type=int, default=0)     parser.add_argument("--ablate", default=None,                         help="mechanism-off control: 'mechanism' (or any name) disables this "-                             "node's mechanisms (DETR_EXT coverage extension; AMPSHRINK stays "-                             "off), reproducing parent node 37 bit-for-bit")+                             "node's mechanisms (NBHDCOH neighborhood-coherent OFF selection; "+                             "NBHDGATE spatial gating), reproducing parent node 39 bit-for-bit")     args = parser.parse_args()-    global RESID_GAMMA, SPATRESID_THETA, DETR_FLIP_ON, AMPS_ENABLE, DETR_EXT+    global RESID_GAMMA, SPATRESID_THETA, DETR_FLIP_ON, AMPS_ENABLE, DETR_EXT, NBHDGATE, NBHDCOH     if args.ablate:-        RESID_GAMMA = 0.0-        SPATRESID_THETA = 0.0-        AMPS_ENABLE = False-        DETR_EXT = False+        NBHDGATE = False+        NBHDCOH = False     proj_asym = None     eigproj_k = 0 if args.ablate else None @@ -1937,6 +2185,17 @@ def main() -> None:                                            "detr_ext_cells_a", "detr_ext_cells_b", "detr_ext_n_genes",                                            "detr_ext_n_off", "detr_ext_rate_gap_before",                                            "detr_ext_rate_gap_after", "detr_ext_pb_maxshift",+                                           "nbhdgate_enable", "nbhdgate_mode", "nbhdgate_theta",+                                           "nbhdgate_k", "nbhdgate_cap_frac", "nbhdgate_r_mean",+                                           "nbhdgate_r_p10", "nbhdgate_r_p50", "nbhdgate_r_p90",+                                           "nbhdgate_frac_r_gt_half", "nbhdgate_coord_dups",+                                           "nbhdgate_cap_median", "nbhdgate_pos_q", "nbhdgate_pos_max",+                                           "nbhdgate_pos_frac", "nbhdgate_cells_total",+                                           "nbhdgate_cells_gated", "nbhdgate_n_off_orig",+                                           "nbhdgate_n_off_kept", "nbhdgate_removal_r_corr",+                                           "nbhdcoh_enable", "nbhdcoh_p", "nbhdcoh_n_genes_coh",+                                           "nbhdcoh_n_genes_leg", "nbhdcoh_ns_zero_frac",+                                           "nbhdcoh_sel_move_frac",                                            "ampshrink_enable", "ampshrink_strength", "ampshrink_tau", "ampshrink_decode",                                            "ampshrink_n_types", "ampshrink_n_pairs", "ampshrink_n_shrunk",                                            "ampshrink_frac_shrunk", "ampshrink_f_mean", "ampshrink_f_min",

调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。

用到的知识库条目

编号标题出处
k007Interval staging and held-out-window filtering of external datanotes/official/来件/virtualembryo.ai/rules.md
k024World-model evaluation dimensions for state-transition predictorsnotes/competition/07_biomedical_world_models.md
k016Degenerate-solution checks for population predictionsnotes/handover/02_知识学习路线.md

分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。

改了什么PLAN 的 NBHDGATE(按 15-NN 同型同侧占比 r_i 缩减 DETR_EXT 置零预算)被实现并证否,实际提交的是备选机制 NBHDCOH:保持 DETR_EXT 每基因移除数不变,只把选哪些细胞从随机键改为「15-NN 邻域内该基因平均表达(排除自身)最低的 k 个」,同时把强度 0.35→0.45;坐标与其他管线未动。
各组分数的变化cell_state:变好:mmd_u raw 0.01037→0.00976(skill 0.636→0.650,+0.18 分),variogram raw 0.007408→0.007044(skill 0.552→0.565,+0.17 分),组 +1.36。
expression_change:噪声内:de_score raw 0.3448 不变(7.67 分不变),de_direction raw 0.3976→0.3964(得分 -0.01),组 -0.03。
local_spatial:变好:neighborhood_mmd raw 0.04996→0.04755(skill 0.609→0.621,得分 15.22→15.52,+0.30),组 +1.19;榜分 65.08→65.71(+0.63,略低于 T2 ~1 分噪声,但关闭机制对照 -0.69 且三种子配对差 +0.71/+0.75/+0.71 一致,方向可信)。
shape_scale:完全不变:d2_shape 0.00661、occupancy_dice 0.8086、scale_log_ratio 0.0099 三项 raw 逐位相同,组 +0.00(坐标未动,符合预期)。
family_idT2EI-01
假设是否成立否
经验
  1. 在 DETR_EXT 支持集修复上,任何削减置零总量的门控都净负:本节点实测 nbhd 每 1e-4 raw 只值 ~0.047 分而 variogram 每 1e-4 值 ~0.125 分(约 1:3),θ=0.15/0.25/0.35 单调改善 nbhd raw(0.05232→0.05196)却全部 ≤ 父分。
  2. 置零发生的位置比置零总量更关键:同强度 s=0.45 下,混合邻域置零的 nbhd 单位伤害约为同质邻域的 2 倍(1.7e-7 vs 9.3e-8 per removal),因此「保持每基因移除数、只改选哪些细胞」能同时改善 nbhd 与 variogram。
  3. PLAN 的 cap 备选按「全体单侧细胞移除数的中位数」定义直接退化(68% 单侧细胞零移除 → 中位数 0 → 全部置零被禁);写备选方案前必须先算该定义所依赖统计量的分布,改正计数中位数 K=14 后仍净负(64.05)。
  4. 机制与强度同时改会让 ablate 对照不等于父节点(本节点 ablate = 无 coh 的 s=0.45 管线);要归因机制必须额外跑同强度对照(65.02 vs 64.33 = +0.71),否则强度变化的贡献会混进机制。
  5. 本地 A 半锚点跨评分会话不可比(父同文件重测 64.34 与 node 39 当时记录不同,de_score 0.3214→0.3448),所有配置比较必须在同一会话内完成。
  6. 支持集(零/非零)通道修改可安全改善 nbhd/mmd/variogram;值通道修改(node 17/19/37 与 node 39 的 AMPSHRINK)一律伤 nbhd/mmd,这一分工再次成立。
mechanism_active是
下一步建议
  1. 把 NBHDCOH 的邻域相干选择从单侧类型推广到共有类型的 DETR 置零(目前共有类型仍用随机键 u),针对 local_spatial(neighborhood_mmd,本项权重 25 且门住形状组),预期移除位置优化的收益与单侧同量级。
  2. 在 coh 保护下做 s=0.45/0.50/0.55 × noself/self 的细网格,并按本节点教训加「同强度无 coh 对照」做归因;A 半已现平顶(65.02–65.05),需在 B 半与官方尺子上确认再定 s,针对 cell_state(variogram raw 随 s 单调下降 0.00711→0.00672)。
  3. occupancy_dice 是唯一低于地板的项(raw 0.8086、skill 0.424、得分 3.53 < 地板 4.17),针对 shape_scale:先做只读诊断——比较预测云与参考阶段云居中主轴对齐后的三轴 RMS 比与 16³ 占据谱,判断是各向异性还是占据弥散导致,再决定是否调 per-type 抽样权重(不动坐标),任何改动先在本地 raw 上验证不劣化 d2_shape/scale_log_ratio。

对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。

只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。

分析员

角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。分析员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数?大模型一共回复了几轮(每轮可以调用多个工具)。5
工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。共 6 次:bash 5、write 1
用时1 分
token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。输入 25,866 · 输出 1,727 · 思考 2,309
任务(第一行)分析节点 n41 的打分结果,写 ANALYSIS.json
最后的回答(摘录)
ANALYSIS.json written
原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/41/analyst.jsonl 20 KB
/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/41/analyst.stderr

工程师

角色工程师 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数74
工具调用共 82 次:bash 54、edit 27、write 1
用时42 分
token 数输入 152,018 · 输出 26,707 · 思考 40,570
任务(第一行)按计划修改程序:NBHDGATE:DETR_EXT 置零的 15-NN 空间组成门控修复 nbhd 代价
最后的回答(摘录)
All verified. Final state of `solution/`:

**做了什么**:实现 PLAN 的 NBHDGATE(15-NN 空间组成门控 DETR_EXT 置零预算,θ=0.15/0.25/0.35)及 cap 备选(中位数退化,改正计数中位数 K=14)——全部证否:门控确实单调改善 nbhd(0.05232→0.05196),但每削减置零量,variogram 损失(~0.125 分/1e-4)约为 nbhd 收益(~0.047 分/1e-4)的 3 倍,6 配置净分全 ≤ 父。据此改交备选机制 **NBHDCOH**:保持每基因移除数不变,只把选细胞从随机键改为「15-NN 邻域内该基因平均表达(排除自身)最低者优先」(cKDTree,确定性 lexsort),并把强度 0.35→0.45(无 coh 时 s=0.45 净负 64.33,coh 保护下 +0.71,归因干净)。

**查分结果**(A 半同会话,20/20 用尽;本会话锚点与 node 39 记录不同,父同文件重测 64.34):提交配置 seed 0/1/2 = **65.04/64.64/64.68** vs 父 64.34/63.89/63.97,配对差 **+0.71/+0.75/+0.71(均值 +0.72)**;nbhd raw 0.0493–0.0500(父 0.0521–0.0535)且 variogram 0.0070–0.0072(父 0.0075–0.0076)首次同向改善。`--ablate` 逐位还原同强度无 coh 管线(64.33),`T2_NBHDCOH_P=1.0` 逐位还原父管线;seed 0 双跑逐位一致;vec-check 通过;~2s / <1GB。

**下一步最值得试**:① 在 coh 保护下继续扫 s=0.5–0.55 与 noself/self 键(A 半 65.02–65.05 平顶,B 半可能分岔);② 把 NBHDCOH 同样应用于共有类型的 DETR 置零(目前只覆盖单侧类型,共有类型仍是随机键);③ occupancy_dice(skill 0.42,最弱单项)仍无人撼动,但历史所有坐标整形均劣化它,需谨慎。
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/41/engineer.jsonl 435 KB
/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/41/engineer.stderr

调研员

角色调研员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数1
工具调用共 0 次:—
用时3 分
token 数输入 21,918 · 输出 1,286 · 思考 8,007
任务(第一行)为节点 n41(改进,父节点 n39)写改进计划 PLAN.json
最后的回答(摘录)
(raw 0.01016→0.00741,+1.03 分),但 neighborhood_mmd raw 从 0.04775 恶化到 0.04996(skill 0.620→0.609,−0.27 分),是唯一变坏的组(local_spatial −1.09,60.90 vs 父 61.99)。结构原因:DETR_EXT 对 37% 输出细胞(24 个单侧类型)的 OFF 置零逐细胞独立决策,不考虑空间邻域;当单侧类型细胞与共享类型或其他来源细胞混居时,孤立置零在 15-NN 尺度上制造表达-位置不连续,恰好被 neighborhood_mmd(15-NN 平均表达分布的 MMD,25 分+结构门)捕捉。",
  "approach": "步骤:1) 在 DETR_EXT(mode=shared, s=0.35)置零前,对每个单侧类型输出细胞在输出坐标空间建 KD-tree 取 15-NN(与 neighborhood_mmd 同尺度)。2) 统计 15-NN 中同源同侧单侧类型细胞数 h_i,计算占比 r_i = h_i/15。3) 门控:r_i < θ 时,该细胞置零条目数缩减为 k_i = round(r_i/θ × k_orig),保留超额概率最大的 k_i 条(确定性排序不变);r_i ≥ θ 时全量置零。4) θ 初值 0.25,搜索 {0.15, 0.25, 0.35},每个配置跑 seed 0 vec-score。5) 快筛标准:nbhd raw ≤ 0.0489(父 37 与 39 中点)且 variogram raw ≤ 0.0085 才继续;否则试备选——每细胞置零上限 K = median(全部单侧细胞置零数),超额按超额概率截断。6) 实施前先统计 r_i 分布:若 >80% 细胞 r_i > 0.5(单侧类型已高度聚集),组成门控无区分度,直接跳到备选 K 上限。7) 单输入阶段退路:无括号则无 DETR_EXT,门控自然不激活,输出等同上游。8) 选定配置后跑 seed 0/1/2 确认,均值提升 ≥0.3 才提交。",
  "expected_groups": ["local_spatial"],
  "risks": "1) 门控过度(θ 偏大)导致置零量不足、variogram 回退:Engineer 每个 θ 配置同时监控 variogram raw,>0.009 即放弃该配置。2) 单侧类型细胞在 mix 分层抽样后已按类型聚集,大多数细胞 r_i 本来就高,门控几乎不改变输出(r_i 分布无区分度):此时应立即转备选 K 上限,不要耗查分次数在无效网格上。3) 净收益可能 <1 分(T2 噪声 ~1 分):需 3 种子均值确认;若 3 种子均值提升 <0.3 则如实报 NO_CHANGE。4) 15-NN 建在输出坐标上,若坐标有退化(全重合等)会导致门控失效:先检查坐标唯一性。",
  "family_id": "T2EI-01",
  "mechanism": "将 DETR_EXT 的 OFF 置零从逐细胞独立改为空间耦合:在 15-NN 邻域内同源同侧单侧细胞占比低于阈值 θ 时按比例缩减该细胞的置零条目数,使移除决策与 neighborhood_mmd 的度量尺度对齐,防止混合邻域中的孤立置零破坏表达-位置配对。",
  "vs_constant_shift": "不是每型常数位移或全局组成重加权。机制在支持集(零/非零)通道操作,按逐基因超额概率做确定性二值移除,且移除量受细胞空间邻域组成调制——同一类型的两个细胞因邻域不同会获得不同的移除集合,这是任何型级常数位移或全局重加权无法实现的。",
  "mechanism_evidence": "1) 门控前后对比:被缩减的移除应集中在混合邻域(r_i < θ 的细胞),而非均匀分布——输出被门控细胞的占比及其 r_i 分布。2) nbhd raw 从 0.04996 回落(目标 ≤0.0489),variogram raw 保持 ≤0.0085,两项同时满足才说明门控在正确尺度上生效。3) 四组分变化:local_spatial 升、cell_state 持平或微降(≤0.2 分)、expression_change 与 shape_scale 不变(坐标未动)。4) 逐细胞移除数与 15-NN 同源占比的相关系数应为正。",
  "mechanism_off_control": "T2_NBHDGATE=0(或 --ablate mechanism):跳过 15-NN 计算和门控,所有单侧类型细胞按原 DETR_EXT 逻辑全量置零,输出应与父节点 39 逐位一致(sha256 校验 seed 0/1/2)。"
}
```
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/41/researcher.jsonl 5 KB
/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/41/researcher.stderr

审查员

角色审查员 alibaba-token-plan-cn/qwen3.8-max
调用次数1 次
轮数31
工具调用共 37 次:bash 21、read 14、grep 1、write 1
用时8 分
token 数输入 86,930 · 输出 4,352 · 思考 8,486
任务(第一行)审查节点 n41 的程序是否越界读取、写死目标、钻评分器漏洞
最后的回答(摘录)
REVIEW.json written
原始记录位置/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/41/reviewer.jsonl 397 KB
/home/spark-longxinyang/vec/runs/formal/20261003-171955-search-t2-embryo-interp-chain-12h/nodes/41/reviewer.stderr