总览 · ← 返回运行 20261003-043412-search-t2-embryo-interp-g24-D-s1
节点 n14
radial bin 内晚端细胞改选距型内混合质心 (1−t)μ_a+tμ_b 最近者(中间态偏好,保径向覆盖),κ 0.5→0.65 联合生效;xy 膨胀叠加被否证,off 对照=父节点。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-043412-search-t2-embryo-interp-g24-D-s1 |
|---|---|
| 父节点 | n12 |
| 子节点 | — |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 61.74(+0.6) · proxy 61.74(+0.6) · 3 次复测均分 61.59 |
| 审查 | 未审查 |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 14 分 |
| 程序版本 | 147c45ff841d9fca233f827c358fc38781a48f0e (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 147c45ff84:solution/METHOD.md
radial bin 内晚端细胞改选距型内混合质心 (1−t)μ_a+tμ_b 最近者(中间态偏好,保径向覆盖),κ 0.5→0.65 联合生效;xy 膨胀叠加被否证,off 对照=父节点。
方法(家族 T2EI-01)
提交态 = mix + procrustes3d 对齐 + scale_damp=0.455 + 组成阻尼 κ=0.65 + 晚端细胞类型内径向等频分层(radial bins),新增机制:每个 radial bin 内不再随机取一个细胞,而是取到该型混合质心 m_c=(1−t)·μ_a(c)+t·μ_b(c) 最近的细胞。距离在型内 z-score 表达空间计算(均值/方差取自 A_c∪B_c 全部细胞,与 node 7/12 的配对空间一致);a 侧 <3 细胞的型退化为 bin 内随机(15/26 个小型跳过,11 型生效);k<4 或全选的型保持父节点行为。逐细胞异质:同一 bin 内哪个细胞入选取决于其表达谱,类型配额、总数、坐标几何均不变。
开关:T2EI_SEL_MODE=random 完整复现父节点(off 对照);T2EI_EXPAND(node 11 的 xy 径向膨胀 γ)默认 0;T2EI_KAPPA 默认改为 0.65。
机制对照(vec-score proxy E6.75+E8.0→E7.25,t=0.4,A 半;查询 7/20)
| 配置 | seed0 | seed1 | 两种子均值 | cell_state | expr_change | local_spatial | shape |
|---|---|---|---|---|---|---|---|
| off(=父 node12,κ0.5+random) | 60.32 | 60.47* | 60.39 | 52.78 | 59.93 | 58.04 | 70.51 |
| centroid,κ=0.5 | 60.71 | 60.67 | 60.69 | 55.02/55.62 | 60.13/59.82 | 57.51/56.47 | 70.17/70.79 |
| centroid,κ=0.65(提交态) | 60.78 | 60.97 | 60.87 | 52.23/52.62 | 60.91/60.77 | 58.06/58.67 | 71.91/71.80 |
| off(random),κ=0.65 | 59.80 | - | - | 48.19 | 60.25 | 58.24 | 72.52 |
| centroid+EXPAND1.15,κ=0.5 | 60.29 | - | - | 55.02 | 60.13 | 57.54 | 68.47 |
| centroid,κ=0.8 | 60.27 | - | - | 47.95 | 61.06 | 58.06 | 74.01 |
*父 seed1 引自 node 8 记录。机制隔离:同 κ=0.65 下 centroid vs random = +0.98(cell_state +4.04,其余组持平±0.7);κ 单独(random 下 0.5→0.65)为 −0.52,与 node 8 的 κ 重扫一致——收益来自选胞机制与 κ 的交互:中间态偏好的细胞多纳入才转化为 cell_state/expression_change,随机多纳入只伤 cell_state。κ=0.8 时 cell_state 崩塌(47.95),0.65 是峰。
机制证据
- 实际改变了哪些细胞:1000(κ0.5)/1300(κ0.65)个 b 细胞中,11 个共有型(bin 数≥4)的选取被改变;平均每 bin 24–32 个候选、100% 的 bin 有真实选择余地;选中细胞到混合质心的 z 空间平方距离均值 206.5 vs 全体候选 669.6(系统性小 3.2 倍)。
- 空间覆盖保持(PLAN 风险 1 排除):选中细胞径向距离 RMS / 全体候选 RMS ≈ 1.001,occupancy_dice 0.8038→0.7953(κ0.65 random→centroid),b_rms_frac ≈1.0,未退化为全局最近选取。
- 四组分变化(centroid κ0.65 vs off κ0.65,seed0):cell_state 48.19→52.23(+4.0),expression_change 60.25→60.91,local_spatial 58.24→58.06(−0.2,噪声内),shape 72.52→71.91(−0.6,选取改变细胞群体所致)。vs 父节点两种子均值:+0.48,两个种子方向一致(+0.46/+0.50)。
- 不是常数位移/组成重加权:表达矩阵与类型配额完全不动,只改变哪些真实 b 细胞被保留,逐细胞由表达谱决定。
已验证 / 未验证
- 已验证:off 对照(SEL_MODE=random,κ=0.5)与父节点输出 sha256 逐位一致;提交态 seed0 两次运行字节相同、与查分所用文件 sha256 一致;vec-check 通过;CPU ~2s / <0.4GB;新代码只用类型标签、表达、坐标与 t(时间差商),无绝对时间/视图/board 分支,单输入阶段退路(copy_last)不受影响。
- 未验证:B 半分数与 final 视图;κ∈(0.5,0.65) 细网格;centroid 选取用于 k<4 的小型(当前保持随机);EXPAND<1(收缩);κ=0.65 的 off 对照 seed1。
- 生物学知识来源:无外部数据/文献数值/保留阶段信息;混合质心与 z-score 为通用统计操作。
下一步建议
- node 11(κ0.65+全局最近选胞+xy膨胀,rank3 62.13)与本节点(κ0.65+radial bin 内选胞)是近亲:值得比较"全局 top-k 最近 + radial 覆盖约束"的折中(如每 bin 取距质心最近但允许 bin 间配额微调),以及把 EXPAND 只作用于 a 细胞收缩(等效相对膨胀)而非 b 外推。
- cell_state 在 κ0.65 下仍只有 ~52.4(κ0.5 时 55.3):若 local_spatial 允许,κ 与选胞强度(如取 bin 内第 2 近而非第 1 近,软化偏好)可做二维小网格。
调研员的计划
| 名称 | mix+κ0.5+radial分层内中间态偏好选胞+damp0.455组合 |
|---|---|
| 动机 | node 7(中间态选胞+κ0.65)得分61.76,node 6/8/12(radial+κ0.5+damp0.455)得分61.15,两者是不同局部最优。ANALYSIS明确指出'中间态偏好选胞+radial'组合未测过。node 7的选胞在expression_change +1.36、local_spatial +2.73有效;node 6的radial在occupancy_dice 0.8019→0.8065有效。cell_state 54.18是最弱组,选胞机制在node 7中单独贡献+4.7。 |
| 做法 | 在父节点(κ=0.5+radial等频分层+damp0.455)的b细胞选取步骤中,将radial bin内的随机选取替换为中间态偏好选取:对每个类型c,计算混合质心m_c=(1−t)·μ_a(c)+t·μ_b(c)(在A_c∪B_c的基因型内z-score空间中),将b细胞按径向距离分入等频bin后,每个bin内选距m_c最近的细胞(而非随机)。环境变量T2EI_SEL_MODE=centroid(新机制)/random(=父节点,off对照)。若某型b细胞数≤bin数则退化为全选。参数无新连续旋钮,仅切换选取策略。若时间允许,二次测试叠加node 11的xy膨胀γ=1.15(T2EI_EXPAND=1.15)。单输入阶段退路不变(无括号走copy_last)。用vec-score在proxy上查分,先跑off对照确认=父节点60.32,再跑centroid模式,比较四组分。 |
| 风险 | 1) radial bin内选最近质心可能退化为全局最近(若bin内细胞表达相似),此时与node 7无区别且丢了radial多样性——Engineer应检查每bin内选中细胞的径向距离分布是否仍覆盖全范围。2) κ=0.5下b细胞只占26%,可选细胞少,bin内可能只有1-2个细胞使选取无意义——应统计每型每bin平均细胞数。3) 改善可能<1分(T2噪声),需两种子确认。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 bfb87cc82d。改动的文件:solution/METHOD.md +24 −29、solution/run.py +84 −6
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 7f82d06..329982e 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,43 +1,38 @@-实现PLAN的型内a-b近邻配对插值生成中间态细胞(T2EI_INTERP_FRAC,含空间加权配对与坐标插值变体):cell_state一致+1.2但local_spatial一致−2.0,净效应在噪声内或为负,机制被否证;提交态默认关闭,输出与父节点node 8逐位一致(off对照查分60.3156=父记录)。+radial bin 内晚端细胞改选距型内混合质心 (1−t)μ_a+tμ_b 最近者(中间态偏好,保径向覆盖),κ 0.5→0.65 联合生效;xy 膨胀叠加被否证,off 对照=父节点。 -## 方法+## 方法(家族 T2EI-01) -提交态 = 父节点配置:mix + procrustes3d + scale_damp=0.455 + 组成阻尼 κ=0.5 + 晚端 radial 等频分层。新增环境变量开关(默认全关,`T2EI_INTERP_FRAC=0` 时配对/插值代码路径不执行,输出与父节点逐位一致,已用 sha256 与 off 对照查分双重验证):+提交态 = mix + procrustes3d 对齐 + scale_damp=0.455 + 组成阻尼 κ=0.65 + 晚端细胞类型内径向等频分层(radial bins),**新增机制**:每个 radial bin 内不再随机取一个细胞,而是取到该型混合质心 m_c=(1−t)·μ_a(c)+t·μ_b(c) 最近的细胞。距离在型内 z-score 表达空间计算(均值/方差取自 A_c∪B_c 全部细胞,与 node 7/12 的配对空间一致);a 侧 <3 细胞的型退化为 bin 内随机(15/26 个小型跳过,11 型生效);k<4 或全选的型保持父节点行为。逐细胞异质:同一 bin 内哪个细胞入选取决于其表达谱,类型配额、总数、坐标几何均不变。 -1. **T2EI_INTERP_FRAC(PLAN 机制,型内近邻配对插值)**:对每个共有型 c(stage-a 该型 ≥3 个细胞,否则跳过),在按基因型内 z-score(均值/方差取自 A_c∪B_c)的表达空间里为每个入选 b 细胞找 A_c 中最近邻 a(欧氏,平局取小索引),按距离升序取前 FRAC 比例配对,生成 `expr=(1−t)·a_nn+t·b`(clip≥0),替换对应 b 槽位;a 细胞、类型配额、总数不动。-2. **T2EI_INTERP_COORD**(默认 1):同时插值坐标 `(1−t)·ca_nn+t·cb`(pre-jitter)。-3. **T2EI_INTERP_W**:配对距离加入空间项 `W·dc2/median(dc2)`(表达项按 median 归一),测试"用空间近邻的 a 细胞配对能否修复 local_spatial"。+开关:`T2EI_SEL_MODE=random` 完整复现父节点(off 对照);`T2EI_EXPAND`(node 11 的 xy 径向膨胀 γ)默认 0;`T2EI_KAPPA` 默认改为 0.65。 -## 机制对照(vec-score,proxy E6.75+E8.0→E7.25,t=0.4,A 半;查询 8/20)+## 机制对照(vec-score proxy E6.75+E8.0→E7.25,t=0.4,A 半;查询 7/20) -| 配置 | 榜分 | 表达 | 状态 | 形状 | 邻域 |-|---|---:|---:|---:|---:|---:|-| FRAC=0(off 对照,=父节点) | 60.32 | 59.93 | 52.78 | 70.51 | 58.04 |-| FRAC=0.5 + 坐标插值 | 59.56 | 60.12 | 53.29 | 68.26 | 56.57 |-| FRAC=0.25 / 0.5 / 1.0,仅表达 | 60.31 / 60.30 / **60.38** | 60.0/60.1/61.0 | 52.98/53.29/53.86 | 70.51 | 57.72/57.29/56.10 |-| FRAC=1.0 仅表达,seed 1 | 60.17 | 60.53 | 54.03 | 70.86 | 55.27 |-| FRAC=1.0,空间加权配对 W=0.25 / 1.0 | 60.08 / 60.07 | ~60.2 | 53.74/53.57 | 70.51 | 55.9/56.0 |+| 配置 | seed0 | seed1 | 两种子均值 | cell_state | expr_change | local_spatial | shape |+|---|---:|---:|---:|---:|---:|---:|---:|+| off(=父 node12,κ0.5+random) | 60.32 | 60.47* | 60.39 | 52.78 | 59.93 | 58.04 | 70.51 |+| centroid,κ=0.5 | 60.71 | 60.67 | 60.69 | 55.02/55.62 | 60.13/59.82 | 57.51/56.47 | 70.17/70.79 |+| **centroid,κ=0.65(提交态)** | **60.78** | **60.97** | **60.87** | 52.23/52.62 | 60.91/60.77 | 58.06/58.67 | 71.91/71.80 |+| off(random),κ=0.65 | 59.80 | - | - | 48.19 | 60.25 | 58.24 | 72.52 |+| centroid+EXPAND1.15,κ=0.5 | 60.29 | - | - | 55.02 | 60.13 | 57.54 | 68.47 |+| centroid,κ=0.8 | 60.27 | - | - | 47.95 | 61.06 | 58.06 | 74.01 | -父节点 seed1 A 半 = 60.47(node 8 记录)。FRAC=1.0 仅表达两种子均值 60.28 vs 父 60.39。+*父 seed1 引自 node 8 记录。机制隔离:同 κ=0.65 下 centroid vs random = +0.98(cell_state +4.04,其余组持平±0.7);κ 单独(random 下 0.5→0.65)为 −0.52,与 node 8 的 κ 重扫一致——**收益来自选胞机制与 κ 的交互**:中间态偏好的细胞多纳入才转化为 cell_state/expression_change,随机多纳入只伤 cell_state。κ=0.8 时 cell_state 崩塌(47.95),0.65 是峰。 -## 机制证据(FRAC=1.0,仅表达)+## 机制证据 -- **配对覆盖率**:1000 个 b 细胞中 520 个被插值、480 个跳过(26 个 b 型中只有 10 个共有型且 a 侧 ≥3 细胞);平均逐细胞位移范数 20.7(log1p 单位),不同细胞方向/幅度不同。-- **不是均值坍缩**:被插值子集型内方差比 0.37(保留 1/3 强),且 PCA 主轴上插值细胞落在 a 簇与 b 簇之间而非型均值点:EXE-Endoderm 主轴均值 a=1.40、b=−13.86、插值=−4.96((1−t)a+tb 理论值 −4.70);HEM-Endoth a=3.27、b=−7.73、插值=−1.17。-- **四组分变化(两种子一致)**:cell_state +1.08/+1.25、expression_change +1.11/+0.17(升),local_spatial −1.94/−2.14(降,neighborhood_mmd 0.0555→0.0598),shape_scale 持平(仅表达模式;坐标插值使 d2_shape 0.0274→0.0372、shape −2.25,occupancy_dice 反升 0.8065→0.8101)。--## 结论--机制确实生成了处于中间态的细胞并提升了 cell_state/expression_change,但代价是把"中间表达谱"放在晚端坐标/邻域上下文里,local_spatial(neighborhood_mmd)以约 2 倍幅度下降,净榜分 ≤ 父节点(差距小于 T2 噪声 ~1)。空间加权配对(W>0,用空间近邻 a 细胞)不能修复:local_spatial 仍 ~56。结合父节点 ALPHA/SHRINK 证伪,mix 家族里 cell_state 与 local_spatial 对"改写 b 细胞表达"存在稳定的权衡,任何此类杠杆净收益 ≤0。坐标插值单独有害(shape)。**提交态 = 父节点配置。**+- **实际改变了哪些细胞**:1000(κ0.5)/1300(κ0.65)个 b 细胞中,11 个共有型(bin 数≥4)的选取被改变;平均每 bin 24–32 个候选、100% 的 bin 有真实选择余地;选中细胞到混合质心的 z 空间平方距离均值 206.5 vs 全体候选 669.6(系统性小 3.2 倍)。+- **空间覆盖保持**(PLAN 风险 1 排除):选中细胞径向距离 RMS / 全体候选 RMS ≈ 1.001,occupancy_dice 0.8038→0.7953(κ0.65 random→centroid),b_rms_frac ≈1.0,未退化为全局最近选取。+- **四组分变化**(centroid κ0.65 vs off κ0.65,seed0):cell_state 48.19→52.23(+4.0),expression_change 60.25→60.91,local_spatial 58.24→58.06(−0.2,噪声内),shape 72.52→71.91(−0.6,选取改变细胞群体所致)。vs 父节点两种子均值:+0.48,两个种子方向一致(+0.46/+0.50)。+- **不是常数位移/组成重加权**:表达矩阵与类型配额完全不动,只改变哪些真实 b 细胞被保留,逐细胞由表达谱决定。 ## 已验证 / 未验证 -- 已验证:FRAC=0 输出与父节点代码路径逐位一致(sha256 相同、off 对照查分 60.3156 = node 8 记录 60.3156);同一 seed 两次运行字节相同;vec-check 通过;无绝对时间/视图分支(新代码只用类型标签、表达、坐标与 t);CPU ~2s、~0.3GB;单输入阶段退路不受影响(无括号时走 copy_last 分支,FRAC 不参与)。-- 未验证:B 半分数;final 视图;W 的更细网格(W>1)与 FRAC×W 组合(前两个 W 点方向一致向下,放弃);"插值 a 细胞向 b"(对称方向)——local_spatial 损伤随被改写细胞数单调增大,4000 个 a 细胞改写预期更差,未测。-- 生物学知识来源:无外部数据/文献数值/保留阶段信息;配对与插值为通用统计操作。+- 已验证:off 对照(SEL_MODE=random,κ=0.5)与父节点输出 sha256 逐位一致;提交态 seed0 两次运行字节相同、与查分所用文件 sha256 一致;vec-check 通过;CPU ~2s / <0.4GB;新代码只用类型标签、表达、坐标与 t(时间差商),无绝对时间/视图/board 分支,单输入阶段退路(copy_last)不受影响。+- 未验证:B 半分数与 final 视图;κ∈(0.5,0.65) 细网格;centroid 选取用于 k<4 的小型(当前保持随机);EXPAND<1(收缩);κ=0.65 的 off 对照 seed1。+- 生物学知识来源:无外部数据/文献数值/保留阶段信息;混合质心与 z-score 为通用统计操作。 ## 下一步建议 -- mix 家族内 cell_state 的表达侧与生成侧杠杆(平移、收缩、外扩、伪批量插值、逐对近邻插值)已全部系统性排除,权衡结构(状态↑=邻域↓)稳定;继续在 5000 细胞 mix 框架内改表达预期收益为 0。-- 剩余可动的是 local_spatial/shape 本身:occupancy_dice 0.8065 与 κ=1 的差距、以及 neighborhood_mmd 的参考结构;或换出 mix 家族(如以参考邻域结构为目标的局部重排)。-- node 7(κ=0.65+中间态偏好选胞,61.76)与本家族(node 8,61.15)是两条不同的局部最优,值得一个节点做两者的显式组合验证(κ=0.65 在 radial+damp0.455 下已被 node 8 单测为 −0.4,但"中间态偏好选胞+radial"未测)。+- node 11(κ0.65+全局最近选胞+xy膨胀,rank3 62.13)与本节点(κ0.65+radial bin 内选胞)是近亲:值得比较"全局 top-k 最近 + radial 覆盖约束"的折中(如每 bin 取距质心最近但允许 bin 间配额微调),以及把 EXPAND 只作用于 a 细胞收缩(等效相对膨胀)而非 b 外推。+- cell_state 在 κ0.65 下仍只有 ~52.4(κ0.5 时 55.3):若 local_spatial 允许,κ 与选胞强度(如取 bin 内第 2 近而非第 1 近,软化偏好)可做二维小网格。diff --git a/solution/run.py b/solution/run.pyindex d83f5fa..17d151d 100644--- a/solution/run.py+++ b/solution/run.py@@ -39,7 +39,19 @@ reproduce the parent, node 5, bit-for-bit): (z-slice-proportional quotas + radial bins within slice) wins seed 0 (60.54) but loses seed 1 (60.15 vs 60.47) -> noise, radial kept default. -7. T2EI_INTERP_FRAC (within-type a-b nearest-neighbour pair interpolation,+ 7. T2EI_SEL_MODE (default "centroid", node 14): within each radial bin of the+ late-stage draw, pick the cell closest (per-type z-scored expression space,+ z over A_c u B_c) to the mixed centroid m_c = (1-t)*mu_a(c) + t*mu_b(c)+ instead of a random cell; types with <3 stage-a cells keep random picks.+ Proxy A-half: kappa 0.5 -> 60.71/60.67 (seeds 0/1) vs parent random+ 60.32/60.47; kappa 0.65 -> 60.78/60.97 (two-seed mean +0.48 over parent),+ off control at same kappa 59.80 (cell_state 48.19 vs 52.23). kappa 0.8+ worse (60.27). KAPPA default therefore 0.65. Radial coverage preserved+ (proj RMS ratio sel/cand ~1.0, occupancy_dice ~0.80).+ T2EI_EXPAND (node 11 xy dilation gamma, default 0 = OFF, refuted here):+ gamma=1.15 on top of centroid bins drops occupancy_dice 0.8028->0.7517+ (board 60.29) - radial bins already cover, expansion overshoots.+ 8. T2EI_INTERP_FRAC (within-type a-b nearest-neighbour pair interpolation, default 0 = OFF, refuted): each retained b-cell is paired with its nearest stage-a cell of the same type in per-type z-scored expression space; the closest FRAC share of pairs is replaced by (1-t)*a_nn + t*b (and optionally@@ -69,13 +81,44 @@ from src.task2_spatial.view_io import board_params, interp_bracket, load_manifes PARAMS = {"align": "procrustes3d", "scale_damp": float(os.environ.get("T2EI_DAMP", "0.455"))} ALPHA = float(os.environ.get("T2EI_ALPHA", "0.0"))-KAPPA = float(os.environ.get("T2EI_KAPPA", "0.5"))+KAPPA = float(os.environ.get("T2EI_KAPPA", "0.65")) SPATIAL_STRAT = os.environ.get("T2EI_SPATIAL_STRAT", "1") != "0" SPATIAL_MODE = os.environ.get("T2EI_SPATIAL_MODE", "radial") SHRINK = float(os.environ.get("T2EI_SHRINK", "0.0")) INTERP_FRAC = float(os.environ.get("T2EI_INTERP_FRAC", "0.0")) INTERP_COORD = os.environ.get("T2EI_INTERP_COORD", "1") != "0" INTERP_W = float(os.environ.get("T2EI_INTERP_W", "0.0"))+SEL_MODE = os.environ.get("T2EI_SEL_MODE", "centroid") # "random" = parent (off control)+EXPAND = float(os.environ.get("T2EI_EXPAND", "0.0"))+EVIDENCE: dict = {}+++def _centroid_dists(A, la, B, lb, t, min_pair=3):+ """Per-type squared distance of every b-cell to the mixed centroid.++ Mixed centroid m_c = (1-t)*mu_a(c) + t*mu_b(c) in the per-type z-scored+ expression space (mean/sd over A_c u B_c). Types whose a-side has+ < min_pair cells are skipped (fall back to random within-bin picks).+ """+ dists = {}+ n_used = n_skip = 0+ for lab in np.unique(lb):+ idxA = np.flatnonzero(la == lab)+ idxB = np.flatnonzero(lb == lab)+ if idxA.size < min_pair or idxB.size == 0:+ n_skip += 1+ continue+ Xa = A[idxA]+ Xb = B[idxB]+ both = np.vstack([Xa, Xb])+ mu = both.mean(axis=0)+ sd = both.std(axis=0) + 1e-6+ m = np.float32(1.0 - t) * Xa.mean(axis=0) + np.float32(t) * Xb.mean(axis=0)+ zm = (m - mu) / sd+ Zb = (Xb - mu) / sd+ dists[lab] = ((Zb - zm) ** 2).sum(axis=1).astype(np.float64)+ n_used += 1+ return dists, {"types_used": n_used, "types_skipped": n_skip} def pair_interpolate(expr, coords, ca, stage_a, labels_b_sel, t, frac, n_a, min_pair=3):@@ -212,7 +255,7 @@ def _fps(pts: np.ndarray, k: int, centroid: np.ndarray) -> np.ndarray: return np.asarray(sel) -def spatial_take(labels: np.ndarray, coords: np.ndarray, n: int, rng: np.random.Generator, centroid=None) -> np.ndarray:+def spatial_take(labels: np.ndarray, coords: np.ndarray, n: int, rng: np.random.Generator, centroid=None, dists=None) -> np.ndarray: """Type-stratified draw, within type equal-frequency PCA1 bins pick one cell. Per-type counts match stratified_choice exactly (type composition unchanged);@@ -272,7 +315,17 @@ def spatial_take(labels: np.ndarray, coords: np.ndarray, n: int, rng: np.random. proj = np.linalg.norm(cpts, axis=1) order = np.argsort(proj, kind="stable") bins = np.array_split(order, k)- sel = np.fromiter((b[rng.integers(len(b))] for b in bins if len(b)), dtype=np.intp, count=k)+ d2 = dists.get(lab) if (dists is not None and SPATIAL_MODE == "radial") else None+ if d2 is not None:+ sel_l = [b[int(np.argmin(d2[b]))] for b in bins if len(b)]+ sel = np.asarray(sel_l, dtype=np.intp)+ EVIDENCE.setdefault("cand_per_bin", []).extend(int(len(b)) for b in bins if len(b))+ EVIDENCE.setdefault("d2_sel", []).extend(float(d2[s]) for s in sel_l)+ EVIDENCE.setdefault("d2_cand", []).append(float(d2.mean()))+ EVIDENCE.setdefault("proj_rms_sel", []).append(float(np.sqrt((proj[sel] ** 2).mean())))+ EVIDENCE.setdefault("proj_rms_cand", []).append(float(np.sqrt((proj ** 2).mean())))+ else:+ sel = np.fromiter((b[rng.integers(len(b))] for b in bins if len(b)), dtype=np.intp, count=k) picks.append(idx[sel]) return np.concatenate(picks) @@ -292,10 +345,18 @@ def mix_damped(stage_a, stage_b, t: float, params: dict, kappa: float): n_b = int(np.clip(int(round(t_comp * n)), 0, n)) n_a = n - n_b ia = take(stage_a.labels, n_a, rng) if n_a > 0 else np.array([], dtype=int)+ dists = None+ if n_b > 0 and SPATIAL_STRAT and SEL_MODE == "centroid":+ A = np.clip(as_dense(stage_a.X, np.arange(stage_a.n)), 0.0, None).astype(np.float32)+ B = np.clip(as_dense(stage_b.X, np.arange(stage_b.n)), 0.0, None).astype(np.float32)+ la = np.asarray(stage_a.labels).astype(str)+ lb = np.asarray(stage_b.labels).astype(str)+ dists, dstats = _centroid_dists(A, la, B, lb, t)+ EVIDENCE["centroid"] = dstats if n_b <= 0: ib = np.array([], dtype=int) elif SPATIAL_STRAT:- ib = spatial_take(np.asarray(stage_b.labels).astype(str), cb, n_b, rng, centroid=np.asarray(cb).mean(axis=0))+ ib = spatial_take(np.asarray(stage_b.labels).astype(str), cb, n_b, rng, centroid=np.asarray(cb).mean(axis=0), dists=dists) else: ib = take(stage_b.labels, n_b, rng) expr_parts, coord_parts = [], []@@ -307,6 +368,11 @@ def mix_damped(stage_a, stage_b, t: float, params: dict, kappa: float): coord_parts.append(np.asarray(cb[ib], dtype=np.float64)) expr = np.vstack(expr_parts) if len(expr_parts) > 1 else expr_parts[0] coords_pre = np.vstack(coord_parts)+ if EXPAND > 0 and ib.size:+ cen = coords_pre.mean(axis=0)+ xy = coords_pre[int(ia.size):, :2] - cen[:2]+ coords_pre[int(ia.size):, :2] = cen[:2] + EXPAND * xy+ EVIDENCE["expand"] = {"gamma": EXPAND, "n_expanded": int(ib.size)} pev = {"applied": False, "reason": "interp_frac=0"} if INTERP_FRAC > 0 and ib.size: pev = pair_interpolate(expr, coords_pre, ca, stage_a, stage_b.labels[ib], t,@@ -321,6 +387,18 @@ def mix_damped(stage_a, stage_b, t: float, params: dict, kappa: float): info["b_bbox_frac"] = float(np.prod((sel_b.max(0) - sel_b.min(0)) / np.maximum(np.asarray(cb).max(0) - np.asarray(cb).min(0), 1e-9))) info["b_rms_frac"] = float(rms_radius(sel_b) / max(rms_radius(np.asarray(cb)), 1e-9)) info["pair_interp"] = pev+ if EVIDENCE.get("cand_per_bin"):+ cpb = np.asarray(EVIDENCE["cand_per_bin"])+ info["sel"] = {+ "mode": SEL_MODE, **EVIDENCE.get("centroid", {}),+ "mean_cand_per_bin": float(cpb.mean()),+ "frac_bins_with_choice": float((cpb > 1).mean()),+ "d2_sel_mean": float(np.mean(EVIDENCE["d2_sel"])),+ "d2_cand_mean": float(np.mean(EVIDENCE["d2_cand"])),+ "proj_rms_ratio_sel_vs_cand": float(np.mean(EVIDENCE["proj_rms_sel"]) / max(np.mean(EVIDENCE["proj_rms_cand"]), 1e-9)),+ }+ if "expand" in EVIDENCE:+ info["expand"] = EVIDENCE["expand"] return expr, coords.astype(np.float32), info, ia, ib @@ -371,7 +449,7 @@ def main() -> None: if SHRINK != 0 and ib.size: mu_a = type_means(stage_a.X, stage_a.labels) cev = contract_b(expr, stage_a.labels, stage_b.labels[ib], mu_a, float(SHRINK * t), int(ia.size))- keep = {k: info.get(k) for k in ("t", "t_comp", "n", "rms_a", "rms_b", "out_rms", "n_shared_types", "z_dot", "z_flipped", "align", "n_from_a", "n_from_b", "spatial_strat", "b_bbox_frac", "b_rms_frac", "pair_interp")}+ keep = {k: info.get(k) for k in ("t", "t_comp", "n", "rms_a", "rms_b", "out_rms", "n_shared_types", "z_dot", "z_flipped", "align", "n_from_a", "n_from_b", "spatial_strat", "b_bbox_frac", "b_rms_frac", "pair_interp", "sel", "expand")} print(json.dumps({"bracket": [a["stage"], b["stage"]], **keep, "shift": ev, "contract": cev}, default=float), file=sys.stderr) write_t2(args.out, expr, coords, genes, seed=args.seed)
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k007 | Interval staging and held-out-window filtering of external data | notes/official/来件/virtualembryo.ai/rules.md |
| k026 | Canonicalise predicted 3D coordinates before submission | notes/pitfalls/04_scorer_invariance.md |
| k024 | World-model evaluation dimensions for state-transition predictors | notes/competition/07_biomedical_world_models.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 在 radial 等频分层的每个 bin 内,把晚端 b 细胞的随机选取替换为距型内混合质心 (1-t)μ_a+tμ_b 最近(z-score 空间)的中间态偏好选取(T2EI_SEL_MODE=centroid),同时将组成阻尼 κ 默认从 0.5 改为 0.65;附带 xy 膨胀 T2EI_EXPAND(默认关,proxy 上被否证)。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内偏负:-0.46(54.18→53.72);与 Engineer 声称的 proxy cell_state +4.04 相矛盾,榜上未兑现 expression_change:变好但在噪声内:+0.85(60.05→60.90),接近 T2 噪声 ~1 local_spatial:噪声内:+0.41(59.26→59.67) shape_scale:变好但幅度接近噪声:+1.58(71.10→72.68),可能主要来自 κ=0.65 而非选胞机制 |
| family_id | T2EI-01 |
| 假设是否成立 | unclear |
| 经验 |
|
| mechanism_active | 是 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 3 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 2 次:bash 1、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 11,662 · 输出 1,049 · 思考 389 |
| 任务(第一行) | 分析节点 n14 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/14/analyst.jsonl 6 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/14/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 32 |
| 工具调用 | 共 34 次:bash 21、edit 11、read 1、write 1 |
| 用时 | 12 分 |
| token 数 | 输入 64,509 · 输出 10,449 · 思考 11,501 |
| 任务(第一行) | 按计划修改程序:mix+κ0.5+radial分层内中间态偏好选胞+damp0.455组合 |
| 最后的回答(摘录) | **完成。** 做了什么:按 PLAN 在 radial 等频分层的每个 bin 内,把晚端 b 细胞的随机选取替换为"距型内混合质心 (1−t)μ_a+tμ_b 最近"的中间态偏好选取(`T2EI_SEL_MODE=centroid`,z-score 空间,a 侧 <3 细胞的型退化随机),并把 κ 默认改为 0.65(与选胞机制交互验证)。node 11 的 xy 膨胀叠加被否证(occupancy_dice 0.803→0.752),κ=0.8 被否证。 查分(A 半,7/20 次):off 对照 sha256 逐位=父节点(60.32);centroid κ0.5 = 60.71/60.67,**centroid κ0.65 = 60.78/60.97(两种子均值 +0.48 over 父 60.39)**;同 κ 下机制隔离 +0.98(cell_state 48.19→52.23)。提交态 seed0 逐位复现查分文件,seed 2 也通过 vec-check,~2s/<0.4GB,无视图依赖。 下一步最值得试:与 node 11(全局最近选胞+膨胀,rank3 62.13)合并比较——"bin 间配额向中间态细胞多的型微调"或软化偏好(bin 内取第 2 近),以及 κ×选胞强度二维小网格;cell_state 在 κ0.65 下仍 ~52,与 κ0.5 的 55 之间有可探索的权衡带。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/14/engineer.jsonl 174 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/14/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 1 分 |
| token 数 | 输入 12,612 · 输出 838 · 思考 2,588 |
| 任务(第一行) | 为节点 n14(改进,父节点 n12)写改进计划 PLAN.json |
| 最后的回答(摘录) | {
"name": "mix+κ0.5+radial分层内中间态偏好选胞+damp0.455组合",
"motivation": "node 7(中间态选胞+κ0.65)得分61.76,node 6/8/12(radial+κ0.5+damp0.455)得分61.15,两者是不同局部最优。ANALYSIS明确指出'中间态偏好选胞+radial'组合未测过。node 7的选胞在expression_change +1.36、local_spatial +2.73有效;node 6的radial在occupancy_dice 0.8019→0.8065有效。cell_state 54.18是最弱组,选胞机制在node 7中单独贡献+4.7。",
"approach": "在父节点(κ=0.5+radial等频分层+damp0.455)的b细胞选取步骤中,将radial bin内的随机选取替换为中间态偏好选取:对每个类型c,计算混合质心m_c=(1−t)·μ_a(c)+t·μ_b(c)(在A_c∪B_c的基因型内z-score空间中),将b细胞按径向距离分入等频bin后,每个bin内选距m_c最近的细胞(而非随机)。环境变量T2EI_SEL_MODE=centroid(新机制)/random(=父节点,off对照)。若某型b细胞数≤bin数则退化为全选。参数无新连续旋钮,仅切换选取策略。若时间允许,二次测试叠加node 11的xy膨胀γ=1.15(T2EI_EXPAND=1.15)。单输入阶段退路不变(无括号走copy_last)。用vec-score在proxy上查分,先跑off对照确认=父节点60.32,再跑centroid模式,比较四组分。",
"expected_groups": ["cell_state", "expression_change", "local_spatial"],
"risks": "1) radial bin内选最近质心可能退化为全局最近(若bin内细胞表达相似),此时与node 7无区别且丢了radial多样性——Engineer应检查每bin内选中细胞的径向距离分布是否仍覆盖全范围。2) κ=0.5下b细胞只占26%,可选细胞少,bin内可能只有1-2个细胞使选取无意义——应统计每型每bin平均细胞数。3) 改善可能<1分(T2噪声),需两种子确认。",
"family_id": "T2EI-01",
"mechanism": "在radial等频分层的每个bin内,用中间态偏好(距混合质心最近)替代随机选取,同时保持空间覆盖多样性。",
"vs_constant_shift": "不是对表达做型级平移或全局组成重加权;是改变b细胞的选取策略(哪些细胞被保留),每个细胞是否入选取决于其在表达空间中与混合质心的距离,逐细胞异质。",
"mechanism_evidence": "1) 统计每型每bin内选中细胞到质心的距离 vs 随机选取的距离(应系统性更小);2) 选中细胞的径向距离分布应与off对照相似(保持覆盖);3) 四组分变化:预期cell_state和expression_change上升、local_spatial至少持平。",
"mechanism_off_control": "T2EI_SEL_MODE=random时,bin内随机选取,输出应与父节点(node 8/12)逐位一致(sha256验证)。预期差别:off=60.32,on若有效应>61。",
"sources": []
} |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/14/researcher.jsonl 4 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-embryo-interp-g24-D-s1/nodes/14/researcher.stderr |