总览 · ← 返回运行 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 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 对应项)
- 改变的细胞:s=0.45 时每基因移除数与无 coh 逐位相同(rate_gap_after 一致),但 74% 的被选细胞与随机键不同(
nbhdcoh_sel_move_frac≈0.74,stderr info);同一类型两个细胞因邻域不同获得不同移除集合(非型级常数位移/全局重加权,见 PLAN vs_constant_shift)。 - nbhd raw 0.05365→0.04929(s=0.45 同强度对照),variogram 保持 ≤0.00711:两项同时满足(优于 PLAN 快筛线的相对形式)。
- 四组分(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 相同)。
- 移除数与 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",
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k024 | World-model evaluation dimensions for state-transition predictors | notes/competition/07_biomedical_world_models.md |
| k016 | Degenerate-solution checks for population predictions | notes/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_id | T2EI-01 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 是 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、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 |