总览 · ← 返回运行 20261002-204524-search-t2-embryo-interp-g24q
节点 n5 终选程序?按该运行锁定的规则最终选出的程序;可能是候选节点,也可能由护栏回退到基线。在终选来历上
METHOD
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261002-204524-search-t2-embryo-interp-g24q |
|---|---|
| 父节点 | n4 |
| 子节点 | — |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 61.82(+0.0) · proxy 61.82(+0.0) · 3 次复测均分 61.49 |
| 审查 | 通过 1 越界读取:未发现问题——run.py 只经 view_io 的 load_manifest/panel_genes/read_stage/interp_bracket 读取 args.data 下的清单与输入阶段(run.py:240-251),无绝对路径、'..'、/mnt、/home、data/raw、downloads、打分器或 src/common/evaluation 引用,无联网;未读取目标阶段文件(只 read_stage(a)/read_stage(b),t 由清单时间差给出,run.py:242-250)。; 2 硬编码目标统计量:未发现问题——全部数值常量都是标量超参… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 17 分 |
| 程序版本 | bb477154e13e4e0f0bd2942724688c5f8d0795c0 (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git bb477154e1:solution/METHOD.md
METHOD
实现 PLAN 的 local_ot 表达位移(熵正则 Sinkhorn 逐细胞耦合,早端细胞向其晚端 barycentric 像移动);proxy 上 fwd/rev 两方向 cell_state 均单调劣化,机制被证伪,故 alpha=0 出厂(与 node 4 逐位相同)。
方法族与机制(如实报告:机制已实现但被证伪)
方法族 local_ot。在 node 4 管道(mix MIX_S=0.5 + 分组 RMS 校正 SHAPE_CORR=−0.8 + z 扩散插值 0.5)之后,只改表达、不动坐标地加一步逐细胞最优传输位移:
- 取两阶段各自
getnnz>0的共享覆盖基因(proxy 上 465/498),做逐基因标准化(减均值除标准差,用被移动组与源组联合统计)。 - 被移动组 vs 源组算平方欧氏代价,按中位数归一,跑 balanced 熵正则 Sinkhorn(eps=0.1,≤100 次迭代,纯 numpy 矩阵-向量乘,独立 rng 流)。
- 每个被移动细胞的 barycentric 像
mu_i = Σ_j P_ij·X_src[j] / 行和(源细胞全基因面板原始值的凸组合,天然落在数据支撑上);位移X_i ← clip(X_i + ALPHA·(mu_i − X_i), 0, None)。 - 坐标管道(procrustes3d 对齐、分组 RMS 校正、z 插值、整体 scale_to_rms、jitter)逐位保留;用独立 rng(
default_rng(seed+104729))保证 alpha=0 与 alpha>0 的坐标完全一致。
两个方向(env T2_TRANSPORT_DIR):
fwd(PLAN 原意,T2EI-02):被抽中的早端细胞向晚端全体移动,晚端不动。源 = 晚端阶段(>2 万时按类型分层子采样到 2 万)。rev(镜像假设):晚端细胞向早端全体移动(晚端是 cell_state 的负资产,把它拉回早端)。源 = 早端阶段。
单输入退路:无括号时只有一个输入阶段,被移动组或源组为空 → 位移为零、输出等于父行为;共享基因 <50(MIN_SHARED_GENES)同样自动关闭。ALPHA=0 提前返回,跳过全部传输计算。
机制对照(同一程序,env 开关,proxy A 半 seed 0)
- 关闭对照:
T2_TRANSPORT_ALPHA=0(出厂默认)输出与 node 4 逐位相同(X、坐标 max diff = 0),A 半 61.48 = 父 A 半。重构无回归。 - 机制生效证据(位移确实逐细胞、非均匀):fwd alpha=0.2 时位移范数 mean=24.73、sd=1.67(连续谱,非常向量),tr_shared_genes=465、tr_n_src=20000;坐标组(shape_scale 75.41、d2_shape 0.01902、occupancy_dice 0.8517)在所有 alpha 下逐位不变,证实机制只动了表达,符合 PLAN 的免费一致性检查。
- 机制方向被证伪:fwd 与 rev 的 board 分都从 alpha=0 的 61.48 单调下降,cell_state 首当其冲:
| 配置 | board | cell_state | expression_change | shape_scale | local_spatial |
|---|---|---|---|---|---|
| alpha=0(出厂,=node4) | 61.48 | 53.88 | 60.08 | 74.25/75.41 | 57.77 |
| fwd alpha=0.05 | 56.87 | 36.13 | 60.22 | 75.41 | 55.73 |
| fwd alpha=0.1 | 54.74 | 30.45 | 60.25 | 75.41 | 52.83 |
| fwd alpha=0.2 | 48.98 | 21.75 | 60.31 | 68.46* | 45.39 |
| rev alpha=0.2 | 59.97 | 49.21 | 60.11 | 75.41 | 55.16 |
(*fwd alpha=0.2 的 shape_scale 下降是 local_spatial 组联带,坐标本身未改;d2_shape 仍 0.01902。)
结论:为什么两方向都失败(生物学解释)
cell_state 在组成比上已近最优,任何把细胞表达态往某一端拉的都远离目标流形:
- copy_last(100% 早端 E6.75)cell_state = 49.29;mix MIX_S=0.5(80% 早 / 20% 晚)= 53.88 —— 80/20 优于 100/0,说明少量晚端细胞有益,目标 E7.25 的转录态夹在中间、更靠近早端但非纯早端。
fwd把早端细胞推向晚端 barycentric 像 → 有效组成右移 + 熵正则把早端平均成 off-manifold 的“平均晚端”谱 → cell_state 崩到 21.75。rev把晚端细胞拉向早端 → 有效组成左移、逼近 copy_last 的 49.29 → cell_state 49.21,仍低于 53.88。- 位移对 alpha 极敏感(fwd alpha=0.05 已掉到 36.13),因为 eps=0.1 的 barycentric 像是几十个远端晚端细胞的均值,非任何真实目标细胞;混入 5% 即破坏离散态。这与 node 3 的 T2EI-01(per-type 常向量位移)单调失败同源:目标表达态离早端比离“向晚端位移”更近,逐细胞版本同样成立。
因此 local_ot 表达位移族在本插值榜上无正增益区间,出厂取边界 alpha=0(逐位等于 node 4,非回归)。这不是把别的方法冒充 local_ot——机制已完整实现并双向扫描证伪。
验证过 / 没验证过
- 验证过:默认 alpha=0 跑通 proxy(~1.4 s、内存 <0.4 GB、纯 CPU)、vec-check ok、关闭对照逐位等于 node 4(seed 0)、fwd 4 档 + rev 1 档的单调劣化、坐标组在所有 alpha 下逐位不变(机制只动表达)。
- 没验证过:eps 细扫(0.05/0.2)——因 alpha 在 0.05 即大幅劣化、方向已判死,按 PLAN risk#1「alpha=0.1 即差≥1 分立即放弃不细扫」停止;rev 的 alpha=0.4 已生成但既然 rev alpha=0.2 已单调劣化未查分;final 视图(t=1/3,共享基因/细胞数不同,但 alpha=0 出厂使传输恒关闭,final 输出=node4 管道,迁移风险仅继承自 node 4);seed 1/2(alpha=0 对任意 seed 逐位等于 node 4,无需单独复核传输)。
- 查分额度:用 4/20(fwd 0.1/0.2、rev 0.2、fwd 0.05),余 16。
下一步建议(供后续节点)
- 放弃 local_ot 表达位移:本节点已双向证伪,勿再投入。cell_state 的杠杆在组成比而非表达位移——试微调 MIX_S(如 0.45/0.55)或按类型的差异化混合权重,而非搬移已选细胞的表达。
- 沿 node 4 的坐标建议继续(同属坐标二阶矩族,非 local_ot):固定 SHAPE_CORR=−0.8 联合细扫 Z_INTERP∈{0.3,0.5,0.7},或做分组 xy 各向异性/主轴伸长率校正攻 shape_scale 的残余 d2_shape≈0.019。
- expression_change(60.08)几乎不随任何机制动(DE 方向对位移不敏感),非高杠杆组。
知识来源
- 通用发育机制:胚胎发育中转录态随时间连续演进、目标阶段的细胞态夹在两括号阶段之间且更靠近时间较近的一端——不针对禁窗阶段的定性知识。
- 熵正则 OT / Sinkhorn、barycentric 投影为凸组合故落在数据支撑上:最优传输通用算法知识。
- 全部参数(eps、alpha、方向、共享基因阈值)与「机制无正增益」的结论由 proxy 视图现场扫描确定,未使用任何保留阶段/基因型的实测信息。
调研员的计划
| 名称 | 早端细胞的表达空间 OT 前向位移(T2EI-02,局部保邻域) |
|---|---|
| 动机 | node 4 四组分中最弱的是 cell_state 53.88(expression_change 60.08 次之),坐标类机制已近平台(shape_scale 74.25、d2_shape 0.019),继续修坐标对榜分边际小。关键证据:copy_last(node 1)cell_state 49.29 vs mix(node 2)37.49,说明晚端细胞离目标表达态很远,是混入 20% 晚端细胞拉低 cell_state 的主因;而 node 3 对'晚端表达位移'唯一一次尝试(T2EI-01 per-type 均值位移)单调失败(36.2→30.0→27.3),该方向尚未被'逐细胞、非均匀'版本检验过。本节点不动坐标(保住 +5.16 的 shape_scale),专攻表达组。 |
| 做法 | 在 node 4 管道后只改表达、不动坐标:1) 对被抽中的早端细胞(ia 部分)与全部晚端细胞,在共享基因上做表达距离(标准化后欧氏/余弦)的 Sinkhorn 熵正则 OT(balanced,eps 初值 0.1、候选 {0.05,0.1,0.2},迭代 ≤100,用 numpy 即可,≤50 行);2) 每个早端细胞的 barycentric 像 mu_i = Σ_j P_ij·X_b[j]/行和,位移 X_i ← X_i + ALPHA·(mu_i − X_i),在全基因面板原始值上做(barycentric 像是凸组合,天然回到数据支撑上);3) 晚端细胞表达一律不动(证据:晚端细胞对 cell_state 是负资产,前移早端比后拉晚端安全);4) ALPHA 扫描 {0.1,0.2,0.4,0.7},env T2_TRANSPORT_ALPHA 默认 0;坐标管道(SHAPE_CORR=-0.8、Z_INTERP=0.5、scale_to_rms)逐位保留。单输入阶段退路:无括号时只有一个输入阶段,OT 两端同集合→位移为零、输出等于父行为,自然退化;若阶段间共享基因过少(<500)同样自动关闭。vec-score 筛选:先查 ALPHA=0 的 seed 0 确认逐位重现父 A 半 61.48(1 次);粗扫 4 个 ALPHA(seed 0);最优配置再用 seed 1 复核,两均值 >61.82+1 才提交。预算约 8/20 次,留余量给 eps 单点调整。 |
| 风险 | 1) 目标可能离早端比 OT 前移更近(类似 T2EI-01 失败的根因):若 ALPHA=0.1 即比基线差 ≥1 分,说明方向错,立即放弃不细扫。2) 大 cost 矩阵内存/耗时:细胞数 >4 万时用每组 ≤2 万的随机子采样算 P,或退化为每早端细胞取余弦最近邻晚端细胞做位移;先小样本(5k 细胞)跑通再全量,运行 >60 s 即换近邻版。3) barycentric 平滑效应抹平表达离散度、反伤 cell_state:查分时同时看 cell_state 与 expression_change,若两者同降即停止。4) 输出管道故障曾浪费 4 次查分(node 4 教训):首次查分前先确认文件写出正常。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 3c674dd783。改动的文件:solution/METHOD.md +45 −28、solution/run.py +87 −4
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 125fbd3..4074ecc 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,45 +1,62 @@ # METHOD -在 mix(MIX_S=0.5) 上加两个纯坐标校正:按组成-几何差 (t−t_mix) 比例的分组 RMS 校正(proxy 最优为负系数 −0.8,即早端云放大、晚端云缩小)与两组 z 扩散向时间插值目标的混合(w=0.5),主要收回 MIX_S=0.5 损失的 shape_scale。+实现 PLAN 的 local_ot 表达位移(熵正则 Sinkhorn 逐细胞耦合,早端细胞向其晚端 barycentric 像移动);proxy 上 fwd/rev 两方向 cell_state 均单调劣化,机制被证伪,故 alpha=0 出厂(与 node 4 逐位相同)。 -## 方法+## 方法族与机制(如实报告:机制已实现但被证伪) -父节点(node 3):mix,align=procrustes3d,scale_damp=0.5,组成比 t_mix=0.5·t_geo,RMS 目标用 t_geo;表达式不改任何细胞。本节点新增两个机制(都只动坐标、都由时间差驱动、视图无关):+方法族 `local_ot`。在 node 4 管道(mix MIX_S=0.5 + 分组 RMS 校正 SHAPE_CORR=−0.8 + z 扩散插值 0.5)之后,**只改表达、不动坐标**地加一步逐细胞最优传输位移: -1. **分组 RMS 校正(PLAN T2EI-05,符号与 PLAN 假设相反)**:`corr = SHAPE_CORR·(t − t_mix)`,早端对齐云缩到 `target_rms·(1−corr)`、晚端缩到 `target_rms·(1+corr)`;混合后的整体 `scale_to_rms(target_rms)` 保留,故整体 RMS 不变,只改两组的相对尺度。**默认 SHAPE_CORR=−0.8**(env `T2_SHAPE_CORR`):PLAN 假设正系数(早端缩小),但 proxy 实测正系数全部劣于基线(0.1→59.67、0.2→59.52、0.3→59.43、0.5→58.85,基线 59.88),负系数单调改善(−0.15→60.30、−0.3→60.68、−0.5→61.26、−0.8→61.48、−1.0→61.50 平台)。解释:MIX_S=0.5 下 80% 细胞来自早端且两端都被缩到同一 target_rms,混合云的占据域相对目标收缩(occupancy_dice 0.80),把占多数的早端云放大反而恢复二阶形状矩与占据。-2. **z 扩散插值(w=0.5,env `T2_Z_INTERP`)**:每组 z 列的 RMS 按 w 向 `log_interp(z_rms_a, z_rms_b, t, damp)` 混合。procrustes3d 的三维旋转会拧斜离散切片轴,z 是形状失配的主要方向之一;单独 w=0.5(SHAPE_CORR=0)已把 d2_shape 0.028→0.021、board 59.88→60.03,与分组校正叠加有效。+1. 取两阶段各自 `getnnz>0` 的**共享覆盖基因**(proxy 上 465/498),做逐基因标准化(减均值除标准差,用被移动组与源组联合统计)。+2. 被移动组 vs 源组算平方欧氏代价,按中位数归一,跑 **balanced 熵正则 Sinkhorn**(eps=0.1,≤100 次迭代,纯 numpy 矩阵-向量乘,独立 rng 流)。+3. 每个被移动细胞的 barycentric 像 `mu_i = Σ_j P_ij·X_src[j] / 行和`(源细胞**全基因面板原始值**的凸组合,天然落在数据支撑上);位移 `X_i ← clip(X_i + ALPHA·(mu_i − X_i), 0, None)`。+4. 坐标管道(procrustes3d 对齐、分组 RMS 校正、z 插值、整体 scale_to_rms、jitter)**逐位保留**;用独立 rng(`default_rng(seed+104729)`)保证 alpha=0 与 alpha>0 的坐标完全一致。 -单输入退路不变(不混合、不校正)。类型内表达位移(T2_TYPE_ALPHA)保留但默认 0(父节点已证伪)。+两个方向(env `T2_TRANSPORT_DIR`):+- `fwd`(PLAN 原意,T2EI-02):被抽中的**早端**细胞向**晚端**全体移动,晚端不动。源 = 晚端阶段(>2 万时按类型分层子采样到 2 万)。+- `rev`(镜像假设):**晚端**细胞向**早端**全体移动(晚端是 cell_state 的负资产,把它拉回早端)。源 = 早端阶段。 -## 机制对照(同一程序,env 开关)+单输入退路:无括号时只有一个输入阶段,被移动组或源组为空 → 位移为零、输出等于父行为;共享基因 <50(`MIN_SHARED_GENES`)同样自动关闭。ALPHA=0 提前返回,跳过全部传输计算。 -- **关闭对照**:`T2_SHAPE_CORR=0 T2_Z_INTERP=0` 输出与 node 3 逐位相同(X、坐标 max diff = 0),A 半 59.88 = 父 A 半。重构无回归。-- **机制生效证据**:(a) d2_shape 0.0280 → 0.0190(−0.8),PLAN 预期方向达成(目标 ≤0.01 未完全达到,剩余失配推测为各向异性/xy 形状差);(b) 输出中两组 RMS 分离(−0.8 时早端 153.1、晚端 132.5,target 149.2;混合前目标差为 2·|corr|·target_rms≈47.7,整体重缩放后余 ≈20.6);(c) 四组分(A 半 seed 0):shape_scale 68.53→75.41(+6.9),occupancy_dice 0.802→0.852,cell_state 52.56 不变、expression_change 60.17 不变(表达式未动,±0 符合预期),local_spatial 58.27→57.77(−0.5,噪声内)。-- **与 PLAN 的差异如实报告**:PLAN 指定扫描正 SHAPE_CORR∈{0.1,0.2,0.3,0.5},全部劣化且 d2_shape 不动(0.0272–0.0291)——PLAN 假设的“早端偏小”方向错误;负方向为扫描发现的实证修正,机制形式(乘性、分组、∝(t−t_mix))与 PLAN 一致。z 插值是 PLAN 外的补充机制(同族:坐标二阶矩校正)。+## 机制对照(同一程序,env 开关,proxy A 半 seed 0) -## 查分记录(proxy A 半,seed 0,除注明外)+- **关闭对照**:`T2_TRANSPORT_ALPHA=0`(出厂默认)输出与 node 4 **逐位相同**(X、坐标 max diff = 0),A 半 61.48 = 父 A 半。重构无回归。+- **机制生效证据(位移确实逐细胞、非均匀)**:fwd alpha=0.2 时位移范数 mean=24.73、sd=1.67(连续谱,非常向量),tr_shared_genes=465、tr_n_src=20000;坐标组(shape_scale 75.41、d2_shape 0.01902、occupancy_dice 0.8517)在所有 alpha 下**逐位不变**,证实机制只动了表达,符合 PLAN 的免费一致性检查。+- **机制方向被证伪**:fwd 与 rev 的 board 分都从 alpha=0 的 61.48 **单调下降**,cell_state 首当其冲: -| 配置 | board | shape_scale | d2_shape | occupancy |-|---|---:|---:|---:|---:|-| 基线(node3 逐位) | 59.88 | 68.53 | 0.0280 | 0.802 |-| SHAPE_CORR=+0.1/+0.2/+0.3/+0.5 | 59.67/59.52/59.43/58.85 | 67.6/67.3/67.0/64.9 | ~0.027 | 0.78→0.73 |-| Z_INTERP=0.5(corr=0) | 60.03 | 69.84 | 0.0205 | 0.786 |-| Z=0.5, CORR=−0.15/−0.3 | 60.30/60.68 | 70.96/72.45 | 0.019/0.018 | 0.796/0.815 |-| Z=0.5, CORR=−0.5 | 61.26 | 74.55 | 0.0180 | 0.840 |-| **Z=0.5, CORR=−0.8(提交)** | **61.48** | **75.41** | 0.0190 | 0.852 |-| Z=0.5, CORR=−1.0 | 61.50 | 75.51 | 0.0203 | 0.856 |-| 提交配置 seed 1 | 60.67 | 73.72 | – | – |+| 配置 | board | cell_state | expression_change | shape_scale | local_spatial |+|---|---:|---:|---:|---:|---:|+| **alpha=0(出厂,=node4)** | **61.48** | **53.88** | 60.08 | 74.25/75.41 | 57.77 |+| fwd alpha=0.05 | 56.87 | 36.13 | 60.22 | 75.41 | 55.73 |+| fwd alpha=0.1 | 54.74 | 30.45 | 60.25 | 75.41 | 52.83 |+| fwd alpha=0.2 | 48.98 | 21.75 | 60.31 | 68.46* | 45.39 |+| rev alpha=0.2 | 59.97 | 49.21 | 60.11 | 75.41 | 55.16 | -seed 0/1 均值 61.08 vs 基线 59.88(+1.2);seed 间波动 ~0.8(大于父节点报告的 0.15,因坐标校正放大了抽样差异),增益主要来自 shape_scale +5~7,远超噪声。查分额度用尽(20/20,其中 4 次因输出管道故障对同一批文件重复查分),seed 2 未验证。+(*fwd alpha=0.2 的 shape_scale 下降是 local_spatial 组联带,坐标本身未改;d2_shape 仍 0.01902。)++## 结论:为什么两方向都失败(生物学解释)++cell_state 在**组成比**上已近最优,任何把细胞表达态往某一端拉的都远离目标流形:+- copy_last(100% 早端 E6.75)cell_state = 49.29;mix MIX_S=0.5(80% 早 / 20% 晚)= 53.88 —— **80/20 优于 100/0**,说明少量晚端细胞有益,目标 E7.25 的转录态夹在中间、更靠近早端但非纯早端。+- `fwd` 把早端细胞推向晚端 barycentric 像 → 有效组成右移 + 熵正则把早端平均成 off-manifold 的“平均晚端”谱 → cell_state 崩到 21.75。+- `rev` 把晚端细胞拉向早端 → 有效组成左移、逼近 copy_last 的 49.29 → cell_state 49.21,仍低于 53.88。+- 位移对 alpha 极敏感(fwd alpha=0.05 已掉到 36.13),因为 eps=0.1 的 barycentric 像是几十个远端晚端细胞的均值,非任何真实目标细胞;混入 5% 即破坏离散态。这与 node 3 的 T2EI-01(per-type 常向量位移)单调失败同源:**目标表达态离早端比离“向晚端位移”更近**,逐细胞版本同样成立。++因此 local_ot 表达位移族在本插值榜上无正增益区间,出厂取边界 alpha=0(逐位等于 node 4,非回归)。这不是把别的方法冒充 local_ot——机制已完整实现并双向扫描证伪。 ## 验证过 / 没验证过 -- 验证过:默认配置跑通 proxy(~2 s、内存 <0.5 GB)、vec-check ok、关闭对照逐位等于 node 3、默认输出逐位等于扫描时的 −0.8 配置、seed 1 可复现且增益保持。-- 没验证过:final 视图(t_geo=1/3,corr=−0.8·(1/3−1/6)=−0.133;校正随 t 差自然缩放,方向合理但未实测);seed 2;Z_INTERP 与 SHAPE_CORR 的联合细扫(z 固定 0.5 扫 corr);−0.8 与 −1.0 在 A 半并列,取 −0.8 为平台内侧更保守值。-- 风险:负系数在 proxy 上单调到平台,若 final 的括号几何不同(真实 E7.25↔E8.0 增长更快),−0.133 的组间尺度差可能偏大;但校正幅度 ∝ (t−t_mix),t 越小自动越弱。+- 验证过:默认 alpha=0 跑通 proxy(~1.4 s、内存 <0.4 GB、纯 CPU)、vec-check ok、关闭对照逐位等于 node 4(seed 0)、fwd 4 档 + rev 1 档的单调劣化、坐标组在所有 alpha 下逐位不变(机制只动表达)。+- 没验证过:eps 细扫(0.05/0.2)——因 alpha 在 0.05 即大幅劣化、方向已判死,按 PLAN risk#1「alpha=0.1 即差≥1 分立即放弃不细扫」停止;rev 的 alpha=0.4 已生成但既然 rev alpha=0.2 已单调劣化未查分;final 视图(t=1/3,共享基因/细胞数不同,但 alpha=0 出厂使传输恒关闭,final 输出=node4 管道,迁移风险仅继承自 node 4);seed 1/2(alpha=0 对任意 seed 逐位等于 node 4,无需单独复核传输)。+- 查分额度:用 4/20(fwd 0.1/0.2、rev 0.2、fwd 0.05),余 16。++## 下一步建议(供后续节点)++1. **放弃 local_ot 表达位移**:本节点已双向证伪,勿再投入。cell_state 的杠杆在**组成比**而非表达位移——试微调 MIX_S(如 0.45/0.55)或按类型的差异化混合权重,而非搬移已选细胞的表达。+2. 沿 node 4 的坐标建议继续(同属坐标二阶矩族,非 local_ot):固定 SHAPE_CORR=−0.8 联合细扫 Z_INTERP∈{0.3,0.5,0.7},或做分组 xy 各向异性/主轴伸长率校正攻 shape_scale 的残余 d2_shape≈0.019。+3. expression_change(60.08)几乎不随任何机制动(DE 方向对位移不敏感),非高杠杆组。 ## 知识来源 -- 胚胎发育中整体尺寸随时间单调增长、不同谱系空间占位随发育重排:通用发育生物学机制知识(不针对禁窗阶段的定量信息)。-- z 为离散切片轴、三维旋转会拧斜切片:任务方法卡(T2 方法卡“坐标系”节)。-- 其余全部参数由 proxy 视图现场扫描确定,未使用任何保留阶段/基因型信息。+- 通用发育机制:胚胎发育中转录态随时间连续演进、目标阶段的细胞态夹在两括号阶段之间且更靠近时间较近的一端——不针对禁窗阶段的定性知识。+- 熵正则 OT / Sinkhorn、barycentric 投影为凸组合故落在数据支撑上:最优传输通用算法知识。+- 全部参数(eps、alpha、方向、共享基因阈值)与「机制无正增益」的结论由 proxy 视图现场扫描确定,未使用任何保留阶段/基因型的实测信息。diff --git a/solution/run.py b/solution/run.pyindex b3682ee..d970542 100644--- a/solution/run.py+++ b/solution/run.py@@ -51,7 +51,7 @@ from src.task2_spatial.frame import align_pair, log_interp, rms_radius, scale_to from src.task2_spatial.methods import _jitter, _pack_expr from src.task2_spatial.sample import interp_count, mix_indices, take from src.task2_spatial.shift import type_means-from src.task2_spatial.transport import as_dense+from src.task2_spatial.transport import as_dense, stratified_choice, _sqdist from src.task2_spatial.view_io import board_params, interp_bracket, load_manifest, panel_genes, read_stage, write_t2 PARAMS = {"align": "procrustes3d", "scale_damp": float(os.environ.get("T2_SCALE_DAMP", "0.5"))}@@ -60,10 +60,89 @@ SHAPE_CORR = float(os.environ.get("T2_SHAPE_CORR", "-0.8")) ZI = float(os.environ.get("T2_Z_INTERP", "0.5")) ALPHA = float(os.environ.get("T2_TYPE_ALPHA", "0.0")) CENTER = bool(int(os.environ.get("T2_TYPE_CENTER", "0")))+TR_ALPHA = float(os.environ.get("T2_TRANSPORT_ALPHA", "0.0"))+TR_EPS = float(os.environ.get("T2_TRANSPORT_EPS", "0.1"))+TR_DIR = os.environ.get("T2_TRANSPORT_DIR", "rev")+TR_MAX_LATE = int(os.environ.get("T2_TRANSPORT_MAX_LATE", "20000"))+MIN_SHARED_GENES = 50 MIN_TYPE_CELLS = 5 -def mix_pipeline(stage_a, stage_b, t, params, mix_s, alpha, center, shape_corr=0.0, z_interp=0.0):+def ot_forward_shift(expr, stage_a, stage_b, n_from_a, alpha, eps, seed, direction="fwd"):+ """PLAN T2EI-02 family: per-cell entropic-OT displacement of expression.++ direction="fwd": the EARLY selected cells move toward their barycentric+ images in the late stage (proxy verdict: monotonically harmful, cell_state+ 53.9 -> 30.5 -> 21.8 for alpha 0.1/0.2, same failure root as T2EI-01).+ direction="rev": the LATE selected cells move toward their barycentric+ images in the full early stage (late cells are the cell_state liability;+ pulling them back is the mirror hypothesis).++ Coupling: balanced Sinkhorn (entropy reg eps, <=100 iters) on squared+ Euclidean distance of per-gene standardized expression over genes covered+ in BOTH stages (median-normalized cost). The barycentric image is a convex+ combination of source cells' raw full-panel vectors, so displaced values+ stay on the data support. Auto-off when too few shared genes or the moved+ group is empty. Deterministic: its own rng stream, independent of the+ pipeline rng (alpha=0 reproduces the parent bitwise, coords untouched).+ """+ info = {"tr_shared_genes": None, "tr_n_src": None, "tr_disp_mean": None, "tr_disp_sd": None}+ if alpha == 0.0:+ return expr, info+ n = expr.shape[0]+ if direction == "fwd":+ if n_from_a <= 0:+ return expr, info+ moved = slice(0, n_from_a)+ src_stage, src_max = stage_b, TR_MAX_LATE+ else:+ if n - n_from_a <= 0:+ return expr, info+ moved = slice(n_from_a, n)+ src_stage, src_max = stage_a, TR_MAX_LATE+ cov_a = np.asarray(stage_a.X.getnnz(axis=0)).ravel() > 0+ cov_b = np.asarray(stage_b.X.getnnz(axis=0)).ravel() > 0+ shared = np.flatnonzero(cov_a & cov_b)+ info["tr_shared_genes"] = int(shared.size)+ if shared.size < MIN_SHARED_GENES:+ return expr, info+ rng_ot = np.random.default_rng(int(seed) + 104729)+ ns = src_stage.n+ if ns > src_max:+ idx_s = np.sort(stratified_choice(src_stage.labels, src_max, rng_ot))+ else:+ idx_s = np.arange(ns)+ info["tr_n_src"] = int(idx_s.size)++ A = expr[moved][:, shared].astype(np.float64)+ Sraw = as_dense(src_stage.X, idx_s).astype(np.float64)+ S = Sraw[:, shared]+ joint = np.vstack([A, S])+ mu = joint.mean(axis=0)+ sd = joint.std(axis=0) + 1e-8+ Az = (A - mu) / sd+ Sz = (S - mu) / sd+ cost = _sqdist(Az, Sz)+ cost /= np.median(cost) + 1e-8+ K = np.exp(-cost / max(float(eps), 1e-6))+ del cost, joint, Az, Sz+ u = np.ones(K.shape[0])+ v = np.ones(K.shape[1])+ for _ in range(100):+ u = 1.0 / (K @ v + 1e-300)+ v = 1.0 / (K.T @ u + 1e-300)+ P = u[:, None] * K * v[None, :]+ rows = P.sum(axis=1, keepdims=True) + 1e-300+ mu_img = (P @ Sraw) / rows+ disp = mu_img - expr[moved].astype(np.float64)+ info["tr_disp_mean"] = float(np.linalg.norm(disp, axis=1).mean())+ out = expr.copy()+ out[moved] = np.clip(expr[moved] + float(alpha) * disp, 0.0, None).astype(np.float32)+ info["tr_disp_sd"] = float(np.linalg.norm(disp, axis=1).std())+ return out.astype(np.float32), info+++def mix_pipeline(stage_a, stage_b, t, params, mix_s, alpha, center, shape_corr=0.0, z_interp=0.0, tr_alpha=0.0, tr_eps=0.1, tr_dir="rev"): t = float(t) t_mix = float(np.clip(t * mix_s, 0.0, 1.0)) damp = float(params.get("scale_damp", 1.0))@@ -110,10 +189,14 @@ def mix_pipeline(stage_a, stage_b, t, params, mix_s, alpha, center, shape_corr=0 ) expr = within_type_shift(expr, stage_a, stage_b, labels_sel, ia.size, t, alpha, center) + expr, tr_info = ot_forward_shift(expr, stage_a, stage_b, int(ia.size), float(tr_alpha), float(tr_eps), int(params.get("seed", 0)), tr_dir)+ info.update(tr_info)+ coords = _jitter(np.vstack(coord_parts), rng) coords = scale_to_rms(coords, target_rms) info.update( t=t, t_mix=t_mix, mix_s=mix_s, alpha=alpha, shape_corr=float(shape_corr), corr=corr, z_interp=float(z_interp),+ tr_alpha=float(tr_alpha), tr_eps=float(tr_eps), tr_dir=str(tr_dir), n=int(expr.shape[0]), rms_a=rms_a, rms_b=rms_b, target_rms=target_rms, out_rms=rms_radius(coords), rms_out_a=rms_radius(coords[: ia.size]) if ia.size else None,@@ -166,8 +249,8 @@ def main() -> None: stage_a = read_stage(args.data, a, genes) stage_b = read_stage(args.data, b, genes) params = board_params(manifest, "mix", PARAMS, args.seed)- expr, coords, info = mix_pipeline(stage_a, stage_b, t, params, MIX_S, ALPHA, CENTER, SHAPE_CORR, ZI)- keep = {k: info.get(k) for k in ("t", "t_mix", "shape_corr", "corr", "z_interp", "n", "rms_a", "rms_b", "target_rms", "out_rms", "rms_out_a", "rms_out_b", "n_shared_types", "z_dot", "z_flipped", "align", "n_from_a", "n_from_b")}+ expr, coords, info = mix_pipeline(stage_a, stage_b, t, params, MIX_S, ALPHA, CENTER, SHAPE_CORR, ZI, TR_ALPHA, TR_EPS, TR_DIR)+ keep = {k: info.get(k) for k in ("t", "t_mix", "shape_corr", "corr", "z_interp", "n", "rms_a", "rms_b", "target_rms", "out_rms", "rms_out_a", "rms_out_b", "n_shared_types", "z_dot", "z_flipped", "align", "n_from_a", "n_from_b", "tr_alpha", "tr_eps", "tr_dir", "tr_shared_genes", "tr_n_src", "tr_disp_mean", "tr_disp_sd")} print(json.dumps({"bracket": [a["stage"], b["stage"]], **keep}, 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:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 按 PLAN 实现了 local_ot 方法族:在 node 4 管道后只改表达、不动坐标的熵正则 Sinkhorn 逐细胞位移(共享覆盖基因 465、barycentric 凸组合落数据支撑、独立 rng),并加了镜像方向 rev;proxy 上双向证伪后出厂取 T2_TRANSPORT_ALPHA=0,故交付输出与 node 4 逐位相同(四组 delta 全 +0.00)。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内/无变化:53.88 vs 53.88(+0.00);注:proxy 上机制开启时本组单调劣化(fwd α=0.1→30.45、α=0.2→21.75,rev α=0.2→49.21),故被关闭 expression_change:噪声内/无变化:60.08 vs 60.08(+0.00,出厂 alpha=0 机制关闭,逐位等于父) local_spatial:噪声内/无变化:59.07 vs 59.07(+0.00) shape_scale:噪声内/无变化:74.25 vs 74.25(+0.00,坐标管道逐位保留,机制只动表达) |
| family_id | local_ot |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 4 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 3 次:bash 2、write 1 |
| 用时 | 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 15,407 · 输出 1,194 · 思考 2,507 |
| 任务(第一行) | 分析节点 n5 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261002-204524-search-t2-embryo-interp-g24q/nodes/5/analyst.jsonl 12 KB /home/spark-longxinyang/vec/runs/formal/20261002-204524-search-t2-embryo-interp-g24q/nodes/5/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 35 |
| 工具调用 | 共 40 次:bash 26、edit 10、read 3、write 1 |
| 用时 | 13 分 |
| token 数 | 输入 72,929 · 输出 14,481 · 思考 10,796 |
| 任务(第一行) | 按计划修改程序:早端细胞的表达空间 OT 前向位移(T2EI-02,局部保邻域) |
| 最后的回答(摘录) | Done. Final summary:
**做了什么**:按 PLAN 实现 `local_ot` 方法族——node 4 管道后只改表达、不动坐标的熵正则 Sinkhorn 逐细胞位移(共享覆盖基因 465 个、barycentric 凸组合落数据支撑、独立 rng、eps=0.1、≤100 迭代),并加了镜像方向 `rev`(晚端拉回早端)。关闭对照 `T2_TRANSPORT_ALPHA=0` 与 node 4 **逐位相同**(X/坐标 max diff=0)。
**查分结果**(proxy A 半,用 4/20 次):机制**双向证伪**,board 从 alpha=0 的 61.48 单调下降——fwd α=0.05/0.1/0.2 → 56.87/54.74/48.98(cell_state 36.1/30.5/21.8),rev α=0.2 → 59.97(cell_state 49.2)。坐标组(shape_scale 75.41、d2_shape 0.019)在所有 alpha 下逐位不变,证实机制只动表达。根因:80/20 组成比的 cell_state(53.88)已优于纯早端 copy_last(49.29),任何把表达态往某一端搬的位移都远离目标流形,与 node 3 T2EI-01 同源。**出厂取 alpha=0**(非回归、逐位等于 node 4,rank3≈61.49),如实报告为 local_ot 族的干净负结果,未冒充成其它方法。vec-check 在 seed 0/1 均 ok,纯 CPU。
**下一步最值得试**:(1) 放弃 local_ot 表达位移;cell_state 的杠杆在**组成比**而非搬移已选细胞——微调 MIX_S(0.45/0.55)或按类型差异化混合权重。(2) 沿 node 4 坐标族继续:固定 SHAPE_CORR=−0.8 联合细扫 Z_INTERP∈{0.3,0.5,0.7},或分组 xy 各向异性校正攻 shape_scale 残余 d2_shape≈0.019。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261002-204524-search-t2-embryo-interp-g24q/nodes/5/engineer.jsonl 234 KB /home/spark-longxinyang/vec/runs/formal/20261002-204524-search-t2-embryo-interp-g24q/nodes/5/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 2 分 |
| token 数 | 输入 10,620 · 输出 1,314 · 思考 2,998 |
| 任务(第一行) | 为节点 n5(改进,父节点 n4)写改进计划 PLAN.json |
| 最后的回答(摘录) | 37.49,说明晚端细胞离目标表达态很远,是混入 20% 晚端细胞拉低 cell_state 的主因;而 node 3 对'晚端表达位移'唯一一次尝试(T2EI-01 per-type 均值位移)单调失败(36.2→30.0→27.3),该方向尚未被'逐细胞、非均匀'版本检验过。本节点不动坐标(保住 +5.16 的 shape_scale),专攻表达组。",
"approach": "在 node 4 管道后只改表达、不动坐标:1) 对被抽中的早端细胞(ia 部分)与全部晚端细胞,在共享基因上做表达距离(标准化后欧氏/余弦)的 Sinkhorn 熵正则 OT(balanced,eps 初值 0.1、候选 {0.05,0.1,0.2},迭代 ≤100,用 numpy 即可,≤50 行);2) 每个早端细胞的 barycentric 像 mu_i = Σ_j P_ij·X_b[j]/行和,位移 X_i ← X_i + ALPHA·(mu_i − X_i),在全基因面板原始值上做(barycentric 像是凸组合,天然回到数据支撑上);3) 晚端细胞表达一律不动(证据:晚端细胞对 cell_state 是负资产,前移早端比后拉晚端安全);4) ALPHA 扫描 {0.1,0.2,0.4,0.7},env T2_TRANSPORT_ALPHA 默认 0;坐标管道(SHAPE_CORR=-0.8、Z_INTERP=0.5、scale_to_rms)逐位保留。单输入阶段退路:无括号时只有一个输入阶段,OT 两端同集合→位移为零、输出等于父行为,自然退化;若阶段间共享基因过少(<500)同样自动关闭。vec-score 筛选:先查 ALPHA=0 的 seed 0 确认逐位重现父 A 半 61.48(1 次);粗扫 4 个 ALPHA(seed 0);最优配置再用 seed 1 复核,两均值 >61.82+1 才提交。预算约 8/20 次,留余量给 eps 单点调整。",
"expected_groups": ["cell_state", "expression_change"],
"risks": "1) 目标可能离早端比 OT 前移更近(类似 T2EI-01 失败的根因):若 ALPHA=0.1 即比基线差 ≥1 分,说明方向错,立即放弃不细扫。2) 大 cost 矩阵内存/耗时:细胞数 >4 万时用每组 ≤2 万的随机子采样算 P,或退化为每早端细胞取余弦最近邻晚端细胞做位移;先小样本(5k 细胞)跑通再全量,运行 >60 s 即换近邻版。3) barycentric 平滑效应抹平表达离散度、反伤 cell_state:查分时同时看 cell_state 与 expression_change,若两者同降即停止。4) 输出管道故障曾浪费 4 次查分(node 4 教训):首次查分前先确认文件写出正常。",
"family_id": "local_ot",
"mechanism": "以表达空间熵正则 OT 在早端选中细胞与晚端细胞间建立逐细胞耦合,每个早端细胞沿其 barycentric 像方向移动 ALPHA 倍的位移,晚端细胞不动;位移场由数据耦合结构决定且逐细胞异质。",
"vs_constant_shift": "node 3 失败的是 per-type 常向量(每型均值差、型内所有细胞同一位移);本方案每细胞位移向量互不相同,由表达相似性耦合给出,型内位移有连续谱;且只前移早端、不动晚端,不是组成重加权也不是全局平移。若对照发现位移型内方差≈0,则说明退化为常数位移、机制未成立。",
"mechanism_evidence": "a) ALPHA=0 时输出与 node 4 逐位相同(坐标与晚端表达 max diff=0,A 半 61.48);b) 位移范数的型内标准差显著 >0 且与 per-type 均值位移的型内残差大(证明非均匀);c) cell_state 较 53.88 提升 >1(超 T2 噪声)且 seed 0/1 均保持,expression_change 不降;d) 免费一致性检查:shape_scale 74.25、local_spatial 59.07 应基本不变(只动表达),若明显变化说明坐标管道被意外改动。",
"mechanism_off_control": "T2_TRANSPORT_ALPHA=0 跳过位移步骤,同一程序输出应与 node 4 逐位相同(表达与坐标 max diff=0,A 半 61.48);预期差别仅在 ALPHA>0 时:cell_state 上升、型内位移出现离散谱,其余三组不动。若 ALPHA=0 与父输出有任何非零差异,先修回归再继续。"}
``` |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261002-204524-search-t2-embryo-interp-g24q/nodes/5/researcher.jsonl 5 KB /home/spark-longxinyang/vec/runs/formal/20261002-204524-search-t2-embryo-interp-g24q/nodes/5/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 8 |
| 工具调用 | 共 12 次:bash 6、read 5、write 1 |
| 用时 | 1 分 |
| token 数 | 输入 22,576 · 输出 1,722 · 思考 1,754 |
| 任务(第一行) | 审查节点 n5 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261002-204524-search-t2-embryo-interp-g24q/nodes/5/reviewer.jsonl 99 KB /home/spark-longxinyang/vec/runs/formal/20261002-204524-search-t2-embryo-interp-g24q/nodes/5/reviewer.stderr |