总览 · ← 返回运行 20261003-070222-search-t2-heart-extrap-g24-D
节点 n22 终选程序?按该运行锁定的规则最终选出的程序;可能是候选节点,也可能由护栏回退到基线。在终选来历上
T2HX-09b 细胞类型条件乘性修正(w_t=1−κ·s_t,s_t 为类型谱与外部心脏质心余弦):proxy 双向证伪(κ>0 单调降、κ<0 亦低于父),按停止规则提交 κ=0,输出与父节点 21 逐字节一致。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-070222-search-t2-heart-extrap-g24-D |
|---|---|
| 父节点 | n21 |
| 子节点 | n25 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 59.09(+0.0) · proxy 59.09(+0.0) |
| 审查 | 通过 检查1(越界读取):run.py 只从视图内读取——read_stage/load_manifest/panel_genes 读输入阶段(E8.25_late、E8.75),external_same_stage 用 os.path.join(view, ent['path']) 读 manifest['external'] 挂载的 external/qiu2024_heart_early_v1/E8.75.h5ad(run.py:152-170,241);唯一 read_h5ad 的路径均来自视图,无绝对路径/..//mnt//home/data/raw/downloads/打分器,不读目… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 13 分 |
| 程序版本 | d61152f9023da8fac56d5ec0654a931b608b9070 (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git d61152f902:solution/METHOD.md
T2HX-09b 细胞类型条件乘性修正(w_t=1−κ·s_t,s_t 为类型谱与外部心脏质心余弦):proxy 双向证伪(κ>0 单调降、κ<0 亦低于父),按停止规则提交 κ=0,输出与父节点 21 逐字节一致。
METHOD
T2HX-09b(PLAN 家族 T2HX-09,节点 22):把父节点 21 的秩-1 逐基因乘性修正升级为按细胞类型调制 w_t=1−κ·s_t(s_t=类型 z-score 均值谱与外部 Qiu 心脏质心的余弦相似度、min-max 归一,<50 细胞类型取中性 0.5)。双向证伪:κ∈{0.3,0.5,0.8,1.0} 四组分单调下降(cell_state 54.38→53.78,local_spatial 56.10→55.22),κ∈{−0.3,−0.5} 亦低于父(58.75/58.70 < 59.09)。按 PLAN 停止规则提交 κ=0,输出与父节点 21 逐字节一致(md5 41a98fd2…)。坐标管线(PCA 规范化 + 0.946×max RMS,shape_scale 66.60)、λ=0.135、LINEAGE=2 全部未动。
榜 / 视图
T2:heart:val_extrap,proxy = E8.25_late + E8.75 → E9.5。纯 CPU,~2.2 s,内存 <1 GB(EXECUTION.json: gpu=false)。查分用量 10/20。
实际实现与 PLAN 的关系(如实记录)
- PLAN 步骤 1–5 全部按计划实现:复用节点 21 的相似度桥接(
type_similarity,无硬编码标签名),s_t min-max 归一、稀有类型(<50 细胞)取 0.5,w_t=1−κ·s_t,X_out[i,g]=X_last[i,g]·exp(−λ·δ_norm[g]·w(celltype_i)),零保持零、稀疏结构逐位置不变,κ=0 逐字节复现父节点。 - PLAN 步骤 6 扫描(λ=0.135 固定):κ>0 方向错误且单调——κ=0.3: cell_state 54.38(−0.22)、expression_change 57.51(−0.33)、local_spatial 56.10(−1.21);κ=1.0: cell_state 53.78、expression_change 57.27、local_spatial 55.22、de_score 也从 0.278 掉到 0.264。PLAN 的三条提交判据(cell_state ≥+1、expression_change 降幅 ≤0.5、de_direction 保持正)中第一条直接失败,故不进入 λ×κ 小网格。
- 追加了 PLAN 未列的反向检查(导数方向):κ=−0.3 → board 58.75、κ=−0.5 → 58.70,仍低于父 59.09,且 local_spatial 同样掉 ~1.3。κ=0 是该轴上的局部最优,统一(秩-1)修正优于任何按类型异质的乘子——异质乘子让相邻位置的异型细胞表达相互分叉,local_spatial(variogram/neighborhood_mmd)首当其冲,而 cell_state 的收益假设(类型维度分化)在 proxy 上不成立。
- 单输入/无外部数据退路不变:无同窗外部数据 → λ=0 → copy-last 行为(节点 16,54.15 保底),κ 无效果。
机制生效的证据 / 对照(mechanism_off_control)
- 机制在 κ≠0 时确实运行且非退化(PLAN risk 1 检查通过,非 w_t 常数问题):κ=1.0 时 w_t 均值 0.645、std 0.242、min 0(Unknown)/max 1(PAM-1);细胞级 w 均值 0.651、std 0.295;按类型平均 |Δ表达| 从 0.0(Unknown,w=0 不修正)到 0.106(非心脏型),类型间离散明确(mechanism_evidence 第 1、2、5 条)。
- 关闭对照
VEC_KAPPA=0与默认:输出 md5 41a98fd2… 与父节点 21 已查分文件逐字节一致 ✓。 VEC_MECH_OFF=1(λ=α=γ=κ=0):md5 9d788ba7… 与节点 16/13/12 一致(本机复核)✓。- 四组分变化(κ=0.3 vs 父,proxy A 半):cell_state 54.60→54.38、expression_change 57.84→57.51、local_spatial 57.31→56.10、shape_scale 66.60→66.60;de_direction 保持 +0.226(第 3、4 条:κ>0 未提升任何组分)。
- 确定性:同 seed 跨进程 md5 一致;seed 0/1 均过 vec-check;无全局随机状态。
验证过 / 没验证
- 验证过:proxy seed0 共 6 次查分(κ∈{0.3,0.5,0.8,1.0,−0.3,−0.5})+ κ=0 与父逐字节一致(父的 59.09 即本提交预期,无需重复查分);mech-off / κ=0 对照 md5;w_t 分布与逐类型修正幅度诊断。
- 没验证:κ 在 (0, 0.3) 内的更细扫描(两端单调劣化,中间出现峰的可能性低);s_t 的其他归一化(rank、z-score)——w_t std 已 ≥0.07,非退化,换归一化不改变「异质乘子伤 local_spatial」的结论方向;B 半复现(提交=父节点,风险与父相同)。
知识来源
无新增外部生物学知识。相似度桥接完全由视图内数据驱动(同父节点 21);外部 Qiu E8.75 为 manifest 挂载的合规训练数据(禁窗外)。未使用任何保留阶段/保留基因型信息。
下一步建议
- 类型条件乘性修正轴已双向关闭(κ=0 局部最优),不要在此轴继续扫描。
- local_spatial 对「细胞间异质的表达改动」高度敏感(本节点 |κ|=0.3 即 −1.3):后续任何逐细胞/逐类型修饰表达的方案应先以 local_spatial 不降为硬约束。
- 更有希望的方向(沿节点 21 的组成对比信号):δ 的 official 侧组成连续加权 w∈[−1,1](w=−1 即节点 21),或 external 侧对称锚定;以及 final 视图 external 挂载检查(无同窗数据时放宽到最近外部阶段,保持数据驱动)。
调研员的计划
| 名称 | T2HX-09 细胞类型条件乘性修正:按型调制 λ 改善 cell_state |
|---|---|
| 动机 | 父节点 21 最弱组为 cell_state 54.60(仅比基线 50 高 4.6,且相对节点 19 的 +0.95 在 T2 噪声 ~1 边缘)。当前修正 exp(-λ·δ_norm) 对所有细胞施加同一逐基因乘性因子(秩-1 修正),忽略了不同细胞类型在 E8.75→E9.5 期间表达变化的差异。expression_change 57.84 已超噪声确认有效,说明逐基因 δ 方向正确;但 cell_state 衡量逐细胞表达状态匹配,需要细胞类型维度的修正分化。节点 19→21 的 expression_change +1.85 vs cell_state +0.95 的差异提示:统一修正对群体均值(expression_change)帮助大于对个体细胞(cell_state)。 |
| 做法 | 在父节点 21 的乘性修正基础上,引入逐细胞类型权重 w_t,使修正从秩-1(纯基因向量)升级为基因×细胞类型交互(分块对角)。步骤: 1. 复用父节点已有的相似度桥接代码:对每个官方 celltype t,计算其 z-score 均值谱与外部 Qiu 质心的余弦相似度 sim_t(已在 lineage filter 中实现)。 2. 归一化 s_t = (sim_t - min_sim) / (max_sim - min_sim) ∈ [0,1];对细胞数 < 50 的类型令 s_t = 0.5(中性,不修正)。 3. 逐细胞类型权重 w_t = 1 - κ·s_t。心脏相似型(s_t→1)修正减弱(已接近外部参考,少推);非心脏型(s_t→0)保持全修正。 4. 修正公式:X_out[i,g] = X_last[i,g] * exp(-λ · δ_norm[g] · w(celltype_i))。零仍为零,稀疏结构不变。 5. κ=0 时逐字节复现父节点 21(关闭对照)。 6. 扫描策略(≤12 次查分):固定 λ=0.135,κ ∈ {0, 0.3, 0.5, 0.8, 1.0}(5 次);若 κ>0 方向正确且 cell_state 提升,再在 λ∈{0.12, 0.15} × κ∈{0.3, 0.5} 做 4 点小网格确认。 7. 单输入阶段退路:无外部数据 → λ=0 → 输出=copy-last,与父节点相同,κ 无效果。 8. 用 vec-score 查分;判断标准:(a) cell_state 提升 ≥1(超噪声),(b) expression_change 不降超 0.5,(c) de_direction 保持正。三条同时满足才提交 κ>0;否则提交 κ=0(=父节点)。 |
| 风险 | 1. 效应可能在噪声内(<1 分):细胞类型均值谱的余弦相似度区分度不够,w_t 近似常数。Engineer 应在第一次查分后打印 w_t 的分布(std),若 std(w_t) < 0.05 则机制实质未运行,直接提交 κ=0。2. 稀有类型(<50 细胞)权重不稳定:已用中性值 0.5 兜底,但若大量细胞属于稀有型,修正被稀释。打印各型细胞数占比确认。3. cell_state 提升以 expression_change 下降为代价:若 expression_change 降 >0.5,说明类型调制过度,回退 κ。4. 30 分钟时限:实现改动约 30 行(复用已有相似度计算),扫描 ≤12 次查分,每次 ~2s,总计 <5 分钟查分 + 15 分钟实现,留有余量。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 a6c56e3a16。改动的文件:solution/METHOD.md +19 −18、solution/README.md +7 −4、solution/run.py +101 −22
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex ca51a0e..9492734 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,38 +1,39 @@+T2HX-09b 细胞类型条件乘性修正(w_t=1−κ·s_t,s_t 为类型谱与外部心脏质心余弦):proxy 双向证伪(κ>0 单调降、κ<0 亦低于父),按停止规则提交 κ=0,输出与父节点 21 逐字节一致。+ # METHOD -T2HX-09 改进:PLAN 的「official 侧限定心脏谱系细胞」在 proxy 上证伪(53.58,de_direction −0.07);反向操作(δ 的 official 侧只取**非**心脏匹配类型,锐化全胚 vs 纯心脏的组成对比)有效:λ=0.135 乘性修正,proxy 58.76(父 57.86)。坐标管线不变。+T2HX-09b(PLAN 家族 T2HX-09,节点 22):把父节点 21 的秩-1 逐基因乘性修正升级为按细胞类型调制 w_t=1−κ·s_t(s_t=类型 z-score 均值谱与外部 Qiu 心脏质心的余弦相似度、min-max 归一,<50 细胞类型取中性 0.5)。**双向证伪**:κ∈{0.3,0.5,0.8,1.0} 四组分单调下降(cell_state 54.38→53.78,local_spatial 56.10→55.22),κ∈{−0.3,−0.5} 亦低于父(58.75/58.70 < 59.09)。按 PLAN 停止规则提交 **κ=0,输出与父节点 21 逐字节一致**(md5 41a98fd2…)。坐标管线(PCA 规范化 + 0.946×max RMS,shape_scale 66.60)、λ=0.135、LINEAGE=2 全部未动。 ## 榜 / 视图 -`T2:heart:val_extrap`,proxy = E8.25_late + E8.75 → E9.5。纯 CPU,~2.2 s,内存 <1 GB(`EXECUTION.json`: gpu=false)。查分用量 6/20。+`T2:heart:val_extrap`,proxy = E8.25_late + E8.75 → E9.5。纯 CPU,~2.2 s,内存 <1 GB(`EXECUTION.json`: gpu=false)。查分用量 10/20。 ## 实际实现与 PLAN 的关系(如实记录) -1. PLAN 字面机制**无法执行**:外部 Qiu 文件标签 = {First heart field, Second heart field, Endocardial cells}(作者级标签,未映射到官方词汇),与官方末阶段 33 个类型交集为**空**(PLAN 风险 3 命中)。改用数据驱动桥接:对官方每个 celltype 算交集基因上的 z-score 均值谱与外部质心的余弦相似度,cos ≥ 0.25·max 且 n ≥ 100 判为「心脏匹配」(proxy 上 = Unknown/V-CM/IFT-CM/Intra-Endoth-2/EXE-Endoderm,5295 细胞,与谱系知识一致:V-CM/IFT-CM 为心肌、Intra-Endoth 为内皮)。无任何硬编码标签名。-2. PLAN 假设**证伪**:δ_official 侧限定心脏匹配细胞 → proxy 53.58,de_direction 从 +0.215 跌到 −0.068(1 次查分即触发 PLAN 的停止条件方向)。-3. **反向假设成立**(本节点提交):组成对比本身就是有效信号——δ 的 official 侧只取非匹配类型(19531 细胞),δ = mean(non-cardiac official) − mean(external heart)。三点单调证据:心脏侧 53.58 < 全量 57.86 < 非心脏侧 58.72–58.76,沿组成轴单调;de_direction 同步单调 −0.068 → +0.215 → +0.226。生物学解释(推测):E9.5 心脏区解剖中心脏占比上升,把表达往「心脏 vs 周边组织」方向推与真实时序方向一致;PLAN 的过滤恰恰删掉了这个成分。-4. λ 扫描(乘性 exp(−λ·δ_norm),δ_norm 去均值标准化,语义同父):0.09→58.48、0.12→58.72、**0.135→58.76(提交,平台中心)**、0.15→58.74、0.2→58.39。平台 0.12–0.15。-5. 其余全部继承父节点 19:表达基线照抄末阶段(24826 ≤ max_cells 全量)、坐标 PCA 规范化 + 0.946×max_k RMS(input_k)(shape_scale 66.60 不动)、α=γ=0 边界、无外部同窗数据 → λ=0 安全退化(输出=父节点 16,54.15 保底)。+1. PLAN 步骤 1–5 全部按计划实现:复用节点 21 的相似度桥接(`type_similarity`,无硬编码标签名),s_t min-max 归一、稀有类型(<50 细胞)取 0.5,w_t=1−κ·s_t,X_out[i,g]=X_last[i,g]·exp(−λ·δ_norm[g]·w(celltype_i)),零保持零、稀疏结构逐位置不变,κ=0 逐字节复现父节点。+2. PLAN 步骤 6 扫描(λ=0.135 固定):**κ>0 方向错误且单调**——κ=0.3: cell_state 54.38(−0.22)、expression_change 57.51(−0.33)、local_spatial 56.10(−1.21);κ=1.0: cell_state 53.78、expression_change 57.27、local_spatial 55.22、de_score 也从 0.278 掉到 0.264。PLAN 的三条提交判据(cell_state ≥+1、expression_change 降幅 ≤0.5、de_direction 保持正)中第一条直接失败,故不进入 λ×κ 小网格。+3. 追加了 PLAN 未列的反向检查(导数方向):κ=−0.3 → board 58.75、κ=−0.5 → 58.70,仍低于父 59.09,且 local_spatial 同样掉 ~1.3。κ=0 是该轴上的局部最优,**统一(秩-1)修正优于任何按类型异质的乘子**——异质乘子让相邻位置的异型细胞表达相互分叉,local_spatial(variogram/neighborhood_mmd)首当其冲,而 cell_state 的收益假设(类型维度分化)在 proxy 上不成立。+4. 单输入/无外部数据退路不变:无同窗外部数据 → λ=0 → copy-last 行为(节点 16,54.15 保底),κ 无效果。 ## 机制生效的证据 / 对照(mechanism_off_control) -- `VEC_MECH_OFF=1`:输出 md5 9d788ba7… 与父节点 16/13/12 逐字节一致(本机复核)✓。-- `VEC_LINEAGE_FILTER=0`(λ=0.12 时):δ 统计与父节点 19 METHOD 完全一致(delta_mean 0.2254/std 0.7816/skew 0.4875),复现父行为 ✓。-- `VEC_LINEAGE_FILTER=1`(PLAN 字面意图):保留开关与证伪记录(53.58)。-- 默认 `=2`:修正实际作用于全部 24826 个输出细胞的 497 个交集基因(乘性,零保持零,稀疏结构逐位置不变,pearson_before_after≈0.984);δ 实质改变:corr(δ_inv_norm, δ_all_norm)≈0.93 但幅度重排,|Δdn| 均值 0.4 量级(心脏侧对照 corr 0.68 < 0.95,PLAN 判据满足)。-- 四组分变化 vs 父 19(proxy A 半):expression_change 55.99→57.78、cell_state 53.65→54.51、local_spatial 56.78→56.16(噪声内)、shape_scale 66.60→66.60;榜分 57.86→58.76(+0.90,接近 T2 噪声 ~1,但三点单调 + de_direction 同向支持机制真实)。+- 机制在 κ≠0 时**确实运行且非退化**(PLAN risk 1 检查通过,非 w_t 常数问题):κ=1.0 时 w_t 均值 0.645、std 0.242、min 0(Unknown)/max 1(PAM-1);细胞级 w 均值 0.651、std 0.295;按类型平均 |Δ表达| 从 0.0(Unknown,w=0 不修正)到 0.106(非心脏型),类型间离散明确(mechanism_evidence 第 1、2、5 条)。+- 关闭对照 `VEC_KAPPA=0` 与默认:输出 md5 41a98fd2… 与父节点 21 已查分文件逐字节一致 ✓。+- `VEC_MECH_OFF=1`(λ=α=γ=κ=0):md5 9d788ba7… 与节点 16/13/12 一致(本机复核)✓。+- 四组分变化(κ=0.3 vs 父,proxy A 半):cell_state 54.60→54.38、expression_change 57.84→57.51、local_spatial 57.31→56.10、shape_scale 66.60→66.60;de_direction 保持 +0.226(第 3、4 条:κ>0 未提升任何组分)。+- 确定性:同 seed 跨进程 md5 一致;seed 0/1 均过 vec-check;无全局随机状态。 ## 验证过 / 没验证 -- 验证过:proxy seed0 全部 5 次查分(filter=1 λ0.12;filter=2 λ∈{0.09,0.12,0.135,0.15,0.2});默认配置 = 已查分文件逐字节一致(md5 41a98fd2…);seed 0/1 vec-check 通过;mech-off / lineage=0 对照 md5;跨进程确定性。-- 没验证:B 半评测复现(+0.90 在噪声边缘,风险:正式分可能与父持平);final 真实视图 external 挂载(无同窗数据 → λ=0 退化 54.15 保底,行为与父相同);「心脏占比随时间上升」的解释未直接检验(用了已发布的 E8.25/E8.75 输入数据算 trend,无禁窗信息);相似度阈值 frac=0.25 / min_type=100 未扫(对结果不敏感:匹配集与谱系常识一致)。+- 验证过:proxy seed0 共 6 次查分(κ∈{0.3,0.5,0.8,1.0,−0.3,−0.5})+ κ=0 与父逐字节一致(父的 59.09 即本提交预期,无需重复查分);mech-off / κ=0 对照 md5;w_t 分布与逐类型修正幅度诊断。+- 没验证:κ 在 (0, 0.3) 内的更细扫描(两端单调劣化,中间出现峰的可能性低);s_t 的其他归一化(rank、z-score)——w_t std 已 ≥0.07,非退化,换归一化不改变「异质乘子伤 local_spatial」的结论方向;B 半复现(提交=父节点,风险与父相同)。 ## 知识来源 -无外部生物学知识写死。谱系桥接完全由视图内数据(表达相似度)驱动;「心脏谱系 vs 周边组织」的解释性叙述来自通用谱系常识(心脏在发育中相对增大),仅用于 METHOD 说明,不进入程序逻辑。外部 Qiu E8.75 为 manifest 挂载的合规训练数据(禁窗外)。未使用任何保留阶段/保留基因型信息。+无新增外部生物学知识。相似度桥接完全由视图内数据驱动(同父节点 21);外部 Qiu E8.75 为 manifest 挂载的合规训练数据(禁窗外)。未使用任何保留阶段/保留基因型信息。 ## 下一步建议 -- local_spatial 略降(噪声内):可对坐标邻域做与表达修正一致性检查,或接受现状。-- 组成对比方向已确认:可试把 δ 的 external 侧也做对称处理(如 external vs 官方心脏侧之差做二次锚定),或按官方心脏/非心脏占比对 δ 做连续加权 w∈[−1,1] 扫描(w=−1 即本节点,w=0 即父,w=+1 即证伪方向),确认 −1 是否为边界最优。-- 不要再动全局线性坐标(shape_scale 66.60,多节点证据饱和)。+- 类型条件乘性修正轴已双向关闭(κ=0 局部最优),不要在此轴继续扫描。+- local_spatial 对「细胞间异质的表达改动」高度敏感(本节点 |κ|=0.3 即 −1.3):后续任何逐细胞/逐类型修饰表达的方案应先以 local_spatial 不降为硬约束。+- 更有希望的方向(沿节点 21 的组成对比信号):δ 的 official 侧组成连续加权 w∈[−1,1](w=−1 即节点 21),或 external 侧对称锚定;以及 final 视图 external 挂载检查(无同窗数据时放宽到最近外部阶段,保持数据驱动)。diff --git a/solution/README.md b/solution/README.mdindex e9283f5..96a7fd3 100644--- a/solution/README.md+++ b/solution/README.md@@ -1,12 +1,15 @@-# T2:heart:val_extrap — T2HX-03 基因级趋势外推(proxy 证伪,提交 α=0)+ PCA 规范化坐标 + 0.946×max RMS 缩放+# T2:heart:val_extrap — T2HX-09 外部锚定逐基因乘性修正(λ=0.135,非心脏侧 δ)+ T2HX-09b 细胞类型调制(proxy 双向证伪,提交 κ=0 = 父节点 21)+ PCA 规范化坐标 + 0.946×max RMS 缩放 `run.py --data <view> --out <pred.h5ad> --seed <int>`(纯 CPU,约 2 s,`EXECUTION.json`: gpu=false)。 -- 表达机制(T2HX-03,已实现、可开关):`delta_g = mean(X_last[:,g]) − mean(X_prev[:,g])`,输出细胞 `X = clip(X_last + α·delta, 0, ∞)`。proxy 上 α=0.2 → 52.05、α=0.05 → 53.02、α=0 → 54.15,de_direction=−0.06 与幅度无关:方向为负,按 PLAN 停止规则提交 **α=0**(表达照抄末阶段)。+- 表达机制(T2HX-09/09b):有同窗(±0.26 d)外部数据时,δ = mean(官方末阶段非心脏匹配类型) − mean(外部),δ_norm 标准化后乘性修正 `X·exp(−λ·δ_norm·w_t)`;w_t = 1 − κ·s_t(s_t 为类型谱与外部质心余弦的 min-max 归一)。proxy 上 κ≠0 双向劣化(local_spatial 最敏感),提交 κ=0、λ=0.135(输出=父节点 21)。无外部同窗数据 → λ=0 安全退化。+- 开关:`VEC_KAPPA`(κ 扫描)、`VEC_LAMBDA`、`VEC_LINEAGE_FILTER`(0/1/2)、`VEC_MECH_OFF=1`(全关,=节点 16)、`VEC_LMODE`(mult/additive)、`VEC_ALPHA`/`VEC_GAMMA`/`VEC_FACTOR`(已证伪家族边界与坐标因子)。++- 已证伪家族保留在边界值(供追溯):`VEC_ALPHA`(T2HX-03 基因级趋势,α=0)、`VEC_GAMMA`(T2HX-05 主轴谱趋势,γ=0)。 - 坐标:确定性 PCA 规范帧(去质心 → eigh 降序 → det=+1 → 第三矩定向),再各向同性缩放到 `FACTOR × max_k RMS(input_k)`,FACTOR=0.946(父节点机制,原样保留)。 - 细胞数:`clip(last.n, min_cells, max_cells)`,超上限时按细胞类型分层无放回抽样。 - 单输入:无 prev → α 强制 0;坐标缩放退化为恒等,不崩。-- `VEC_MECH_OFF=1`:关闭表达外推(α=0,PLAN 对照,输出=父节点 12)。-- `VEC_ALPHA=<a>` / `VEC_FACTOR=<f>`:仅扫参用,提交时不设置。+- `VEC_MECH_OFF=1`:关闭全部机制(λ=α=γ=κ=0,PLAN 对照,输出=节点 16/13/12)。+- 扫参开关(`VEC_KAPPA`/`VEC_LAMBDA`/`VEC_LINEAGE_FILTER`/`VEC_ALPHA`/`VEC_GAMMA`/`VEC_FACTOR`/`VEC_LMODE`):仅本地用,提交时均不设置。 证据、对照与查分记录见 `METHOD.md`。无模型权重,故无 `ARTIFACTS.json`。diff --git a/solution/run.py b/solution/run.pyindex ab1d03d..9f4f82d 100644--- a/solution/run.py+++ b/solution/run.py@@ -45,8 +45,26 @@ Parts: and axis signs via third moments), rescaled isotropically to ``FACTOR * max_k RMS(input_k)``. -``VEC_MECH_OFF=1`` disables all mechanisms (lambda=alpha=gamma=0; output-equals parent node 16 / 13 / 12 byte-for-byte). ``VEC_LINEAGE_FILTER``:+5. NEW (node 22, PLAN T2HX-09b) per-celltype modulation of the correction,+ ``kappa``: w_t = 1 - kappa * s_t with s_t the min-max-normalised cosine+ similarity between the cell type's z-scored mean profile and the external+ centroid (types with < 50 cells get neutral s_t = 0.5); the multiplicative+ correction becomes X_out[i,g] = X_last[i,g] * exp(-lambda * delta_norm[g]+ * w(celltype_i)). FALSIFIED ON PROXY IN BOTH DIRECTIONS (board_score,+ A-half; parent kappa=0 -> 59.09): kappa = 0.3/0.5/0.8/1.0 -> cell_state+ 54.38/54.25/53.99/53.78 and local_spatial 56.10/55.96/55.58/55.22+ (monotone down); kappa = -0.3/-0.5 -> 58.75/58.70, cell_state 54.57/54.56,+ local_spatial 56.04/55.88. Uniform (rank-1) correction is optimal on this+ axis; any cell-type heterogeneity in the multiplier costs local_spatial+ (~-1.3 at |kappa|=0.3) more than it can win on cell_state. Committed+ KAPPA = 0 -> output byte-identical to parent node 21 (md5 41a98fd2...).+ Mechanism verified active at kappa != 0: w_t std 0.07-0.24, per-type mean+ |change| spread 0.0-0.106 at kappa=1.0.++``VEC_MECH_OFF=1`` disables all mechanisms (lambda=alpha=gamma=kappa=0;+output equals parent node 16 / 13 / 12 byte-for-byte). ``VEC_KAPPA``+overrides KAPPA (scan knob; kappa=0 default reproduces node 21 exactly).+``VEC_LINEAGE_FILTER``: 0 = official mean over ALL cells (exactly parent node 19 behaviour); 1 = restrict to official cell types whose mean profile best matches the external centroid (PLAN T2HX-09 literal intent; proxy-FALSIFIED, 53.58,@@ -83,6 +101,7 @@ ALPHA = 0.0 GAMMA = 0.0 # family boundary: proxy falsified every gamma != 0 LAMBDA = 0.135 # T2HX-09: correction strength; inverted-filter plateau 0.12-0.15 (58.7), centre committed LINEAGE = 2 # 0=all official cells (parent 19), 1=heart-matched types, 2=inverted (non-heart types; committed)+KAPPA = 0.0 # T2HX-09b (node 22): per-celltype modulation w_t = 1 - kappa*s_t; 0 = parent node 21 exactly EXTERNAL_TIME_TOL = 0.26 # days; external data counts as "same stage" within this window @@ -151,8 +170,8 @@ def external_same_stage(view: str, manifest: dict, last_time: float): return sorted(out) -def lineage_filter_mask(official_labels, Xo, m_ext, frac=0.25, min_type_cells=100,- invert=False):+def type_similarity(official_labels, Xo, m_ext, frac=0.25, min_type_cells=100,+ invert=False): """Data-driven bridge between the external label vocabulary and the official one (PLAN T2HX-09 step 1; the literal label-set intersection is empty here because the external file keeps author-level lineage labels).@@ -173,7 +192,7 @@ def lineage_filter_mask(official_labels, Xo, m_ext, frac=0.25, min_type_cells=10 cos[str(t)] = float(m @ ze_n / (np.linalg.norm(m) + 1e-12)) cnt[str(t)] = int((ct == t).sum()) if not cos:- return np.ones(len(ct), dtype=bool), {}+ return np.ones(len(ct), dtype=bool), {}, {}, {} thr = frac * max(cos.values()) matched = [t for t in cos if cos[t] >= thr and cnt[t] >= min_type_cells] kept = [t for t in cos if (t in matched) != bool(invert)]@@ -185,24 +204,33 @@ def lineage_filter_mask(official_labels, Xo, m_ext, frac=0.25, min_type_cells=10 "n_cells_kept": int(mask.sum()), "cos_top5": sorted(((round(v, 3), k) for k, v in cos.items()), reverse=True)[:5], }- return mask, diag+ return mask, diag, cos, cnt -def offset_correction(view, manifest, last, genes, last_time, lam, lineage=True):+def offset_correction(view, manifest, last, genes, last_time, lam, lineage=True,+ kappa=0.0): """PLAN T2HX-09: per-gene cross-platform offset, standardised, subtracted. - Returns (correction_vector [len(genes), float32], info dict). correction- is lam * delta_norm on intersection genes, 0 elsewhere. When- ``lineage`` is on, the official-side mean is restricted to cells whose- type matches the external lineage profile (see lineage_filter_mask),- removing the whole-embryo-vs-pure-heart composition confound from delta.+ Returns (correction_vector [len(genes), float32], w_all [n_cells] or None,+ info dict). correction is lam * delta_norm on intersection genes, 0+ elsewhere. When ``lineage`` is on, the official-side mean is restricted+ to cells whose type matches the external lineage profile (see+ type_similarity), removing the whole-embryo-vs-pure-heart composition+ confound from delta.++ NEW (node 22, PLAN T2HX-09b): when ``kappa`` != 0 the per-gene correction+ is modulated per cell type, w_t = 1 - kappa * s_t, where s_t is the+ min-max-normalised cosine similarity between the type's z-scored mean+ profile and the external centroid (types with < 50 cells get the neutral+ s_t = 0.5). Heart-matched types (s_t -> 1) are corrected less, non-heart+ types fully. kappa = 0 -> w_all = None -> parent node 21 exactly. """- info: dict = {"lambda": lam, "lineage_filter": int(lineage)}+ info: dict = {"lambda": lam, "lineage_filter": int(lineage), "kappa": kappa} paths = external_same_stage(view, manifest, last_time) zero = np.zeros(len(genes), dtype=np.float32) if not paths: info["status"] = "no_external_same_stage"- return zero, info+ return zero, None, info import anndata as ad gset = {g: i for i, g in enumerate(genes)}@@ -224,7 +252,7 @@ def offset_correction(view, manifest, last, genes, last_time, lam, lineage=True) common = set(gk) if common is None else (common & set(gk)) if not means or not common: info["status"] = "external_no_panel_genes"- return zero, info+ return zero, None, info # weighted external mean per gene over intersection genes inter = sorted(common, key=lambda g: gset[g]) cols = np.array([gset[g] for g in inter])@@ -240,9 +268,12 @@ def offset_correction(view, manifest, last, genes, last_time, lam, lineage=True) for g in inter ]) Xo = np.asarray(as_dense(last.X[:, cols]), dtype=np.float64)+ cos_by_type: dict = {}+ cnt_by_type: dict = {} if lineage: invert = int(lineage) == 2- mask, fdiag = lineage_filter_mask(last.labels, Xo, m_ext, invert=invert)+ mask, fdiag, cos_by_type, cnt_by_type = type_similarity(+ last.labels, Xo, m_ext, invert=invert) info.update(fdiag) info["filter_invert"] = int(invert) if int(mask.sum()) < 50:@@ -250,6 +281,8 @@ def offset_correction(view, manifest, last, genes, last_time, lam, lineage=True) info["filter"] = "fallback_all(<50 cells)" else: info["filter"] = "lineage" if not invert else "nonlineage"+ elif kappa != 0.0:+ _, _, cos_by_type, cnt_by_type = type_similarity(last.labels, Xo, m_ext) m_off = Xo[mask].mean(axis=0) if lineage else Xo.mean(axis=0) delta = m_off - m_ext sd = float(delta.std())@@ -266,7 +299,7 @@ def offset_correction(view, manifest, last, genes, last_time, lam, lineage=True) }) if sd < 1e-9: info["status"] = "delta_degenerate"- return zero, info+ return zero, None, info delta_norm = (delta - delta.mean()) / sd corr = np.zeros(len(genes), dtype=np.float32) corr[cols] = (lam * delta_norm).astype(np.float32)@@ -276,7 +309,35 @@ def offset_correction(view, manifest, last, genes, last_time, lam, lineage=True) "dn_abs_max": round(float(np.abs(delta_norm).max()), 3), "mean_abs_shift": round(float(np.abs(corr[cols]).mean()), 4), })- return corr, info+ w_all = None+ if kappa != 0.0 and cos_by_type:+ sims = np.array([cos_by_type[t] for t in sorted(cos_by_type)])+ lo_s, hi_s = float(sims.min()), float(sims.max())+ span = hi_s - lo_s+ s_by_type, w_by_type = {}, {}+ for t, c in cos_by_type.items():+ if cnt_by_type.get(t, 0) < 50 or span < 1e-12:+ s = 0.5+ else:+ s = (c - lo_s) / span+ s_by_type[t] = s+ w_by_type[t] = 1.0 - kappa * s+ ct = np.asarray(last.labels)+ w_all = np.array([w_by_type[str(t)] for t in ct], dtype=np.float64)+ ws = np.array([w_by_type[t] for t in sorted(w_by_type)])+ ts = sorted(w_by_type)+ info.update({+ "w_mean": round(float(ws.mean()), 4),+ "w_std": round(float(ws.std()), 4),+ "w_min": round(float(ws.min()), 4),+ "w_min_type": ts[int(np.argmin(ws))],+ "w_max": round(float(ws.max()), 4),+ "w_max_type": ts[int(np.argmax(ws))],+ "w_cell_mean": round(float(w_all.mean()), 4),+ "w_cell_std": round(float(w_all.std()), 4),+ "s_by_type": {t: round(s_by_type[t], 3) for t in ts},+ })+ return corr, w_all, info def main() -> None:@@ -292,6 +353,7 @@ def main() -> None: gamma = 0.0 if mech_off else float(os.environ.get("VEC_GAMMA", "") or GAMMA) lam = 0.0 if mech_off else float(os.environ.get("VEC_LAMBDA", "") or LAMBDA) lineage = 0 if mech_off else int(os.environ.get("VEC_LINEAGE_FILTER", "") or LINEAGE)+ kappa = 0.0 if mech_off else float(os.environ.get("VEC_KAPPA", "") or KAPPA) manifest = load_manifest(args.data) genes = panel_genes(args.data, manifest)@@ -306,15 +368,21 @@ def main() -> None: lam_info: dict = {} if lam != 0.0:- corr, lam_info = offset_correction(- args.data, manifest, last, genes, float(last_e["time"]), lam, lineage=lineage+ corr, w_all, lam_info = offset_correction(+ args.data, manifest, last, genes, float(last_e["time"]), lam,+ lineage=lineage, kappa=kappa ) if np.any(corr != 0.0): before = block.copy()+ cw = None if w_all is None else w_all[idx] if os.environ.get("VEC_LMODE", "mult") == "mult":- block = (block * np.exp(-corr.astype(np.float64))).astype(np.float32)+ if cw is not None:+ block = (block * np.exp(-cw[:, None] * corr[None, :].astype(np.float64))).astype(np.float32)+ else:+ block = (block * np.exp(-corr.astype(np.float64))).astype(np.float32) else:- block = np.clip(block - corr, 0.0, None).astype(np.float32)+ corr_eff = corr if cw is None else cw[:, None] * corr[None, :]+ block = np.clip(block - corr_eff, 0.0, None).astype(np.float32) a = before.ravel().astype(np.float64) b = block.ravel().astype(np.float64) pearson = float(np.corrcoef(a, b)[0, 1])@@ -323,6 +391,17 @@ def main() -> None: "n_clipped_to_zero": int(((before > 0) & (block == 0)).sum()), "mean_shift_applied": round(float((block - before).mean()), 5), })+ if w_all is not None:+ lab_out = np.asarray(last.labels)[idx]+ per_type = {}+ for t in np.unique(lab_out):+ m = lab_out == t+ d = np.abs(block[m] - before[m])+ per_type[str(t)] = round(float(d.mean()), 4)+ vals = np.array(list(per_type.values()))+ lam_info["per_type_abs_change_mean"] = per_type+ lam_info["per_type_change_spread"] = [+ round(float(vals.min()), 4), round(float(vals.max()), 4)] delta_info: dict = {} if alpha != 0.0 and prev_e is not None:
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| 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:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 实现了按细胞类型调制的乘性修正 w_t=1-κ·s_t(s_t 为类型谱与外部心脏质心余弦、min-max 归一),但 proxy 上 κ>0 与 κ<0 双向劣化,按 PLAN 停止规则提交 κ=0,输出与父节点 21 逐字节一致(md5 41a98fd2…)。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内/无变化 +0.00(54.60=父);proxy 上 κ=0.3 时曾降至 54.38、κ=1.0 时 53.78(单调下降) expression_change:噪声内/无变化 +0.00(57.84=父),因提交 κ=0 输出与父逐字节一致 local_spatial:无变化 +0.00(57.31=父);proxy 上对 κ 极敏感:κ=0.3 即 -1.21(57.31→56.10),κ=1.0 时 -2.09 shape_scale:无变化 +0.00(66.60=父),坐标管线未动 |
| family_id | T2HX-09 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 3 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 3 次:bash 1、read 1、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 15,245 · 输出 1,130 · 思考 346 |
| 任务(第一行) | 分析节点 n22 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/22/analyst.jsonl 11 KB /home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/22/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 35 |
| 工具调用 | 共 37 次:bash 16、edit 15、read 5、write 1 |
| 用时 | 10 分 |
| token 数 | 输入 65,612 · 输出 12,872 · 思考 7,478 |
| 任务(第一行) | 按计划修改程序:T2HX-09 细胞类型条件乘性修正:按型调制 λ 改善 cell_state |
| 最后的回答(摘录) | 完成。节点 22(improve,T2HX-09b)总结: **做了什么**:按 PLAN 把父节点 21 的秩-1 逐基因乘性修正升级为细胞类型调制 w_t=1−κ·s_t(s_t=类型 z-score 谱与外部 Qiu 心脏质心余弦、min-max 归一,稀有类型取 0.5),实现+关闭对照均验证(κ=0 与父输出 md5 逐字节一致 41a98fd2…;VEC_MECH_OFF=1 = 节点 16 的 9d788ba7…;w_t std 0.24、逐类型修正幅度 0.0–0.106,机制确认非退化运行)。 **查分结果**(10/20 次):κ>0 双向单调劣化——κ=0.3/0.5/0.8/1.0 时 cell_state 54.38→53.78、local_spatial 56.10→55.22(父:54.60/57.31);反向 κ=−0.3/−0.5 → board 58.75/58.70 < 59.09。按 PLAN 停止规则提交 **κ=0(=父节点 21,预期 59.09)**,seed 0/1 均过 vec-check。 **下一步最值得试**:(1) 沿节点 21 的组成对比信号做 δ official 侧连续加权 w∈[−1,1] 扫描或 external 侧对称锚定;(2) 关键教训:local_spatial 对细胞间异质表达改动极敏感(|κ|=0.3 即 −1.3),任何逐细胞修饰方案应以 local_spatial 不降为硬约束;(3) final 视图 external 同窗挂载检查,无数据时放宽到最近外部阶段防 λ=0 退化。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/22/engineer.jsonl 227 KB /home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/22/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 2 分 |
| token 数 | 输入 13,136 · 输出 1,343 · 思考 4,615 |
| 任务(第一行) | 为节点 n22(改进,父节点 n21)写改进计划 PLAN.json |
| 最后的回答(摘录) | _change +1.85 vs cell_state +0.95 的差异提示:统一修正对群体均值(expression_change)帮助大于对个体细胞(cell_state)。",
"approach": "在父节点 21 的乘性修正基础上,引入逐细胞类型权重 w_t,使修正从秩-1(纯基因向量)升级为基因×细胞类型交互(分块对角)。步骤:\n1. 复用父节点已有的相似度桥接代码:对每个官方 celltype t,计算其 z-score 均值谱与外部 Qiu 质心的余弦相似度 sim_t(已在 lineage filter 中实现)。\n2. 归一化 s_t = (sim_t - min_sim) / (max_sim - min_sim) ∈ [0,1];对细胞数 < 50 的类型令 s_t = 0.5(中性,不修正)。\n3. 逐细胞类型权重 w_t = 1 - κ·s_t。心脏相似型(s_t→1)修正减弱(已接近外部参考,少推);非心脏型(s_t→0)保持全修正。\n4. 修正公式:X_out[i,g] = X_last[i,g] * exp(-λ · δ_norm[g] · w(celltype_i))。零仍为零,稀疏结构不变。\n5. κ=0 时逐字节复现父节点 21(关闭对照)。\n6. 扫描策略(≤12 次查分):固定 λ=0.135,κ ∈ {0, 0.3, 0.5, 0.8, 1.0}(5 次);若 κ>0 方向正确且 cell_state 提升,再在 λ∈{0.12, 0.15} × κ∈{0.3, 0.5} 做 4 点小网格确认。\n7. 单输入阶段退路:无外部数据 → λ=0 → 输出=copy-last,与父节点相同,κ 无效果。\n8. 用 vec-score 查分;判断标准:(a) cell_state 提升 ≥1(超噪声),(b) expression_change 不降超 0.5,(c) de_direction 保持正。三条同时满足才提交 κ>0;否则提交 κ=0(=父节点)。",
"expected_groups": ["cell_state"],
"risks": "1. 效应可能在噪声内(<1 分):细胞类型均值谱的余弦相似度区分度不够,w_t 近似常数。Engineer 应在第一次查分后打印 w_t 的分布(std),若 std(w_t) < 0.05 则机制实质未运行,直接提交 κ=0。2. 稀有类型(<50 细胞)权重不稳定:已用中性值 0.5 兜底,但若大量细胞属于稀有型,修正被稀释。打印各型细胞数占比确认。3. cell_state 提升以 expression_change 下降为代价:若 expression_change 降 >0.5,说明类型调制过度,回退 κ。4. 30 分钟时限:实现改动约 30 行(复用已有相似度计算),扫描 ≤12 次查分,每次 ~2s,总计 <5 分钟查分 + 15 分钟实现,留有余量。",
"family_id": "T2HX-09",
"mechanism": "将逐基因乘性修正从全局统一(秩-1)升级为按细胞类型调制(基因×类型交互):与外部心脏质心相似度高的类型少修正,低的类型多修正,使修正方向贴合各类型在时序中的实际表达变化。",
"vs_constant_shift": "常数位移对每个基因施加同一偏移量、对所有细胞相同;本方案是乘性的(保零、保稀疏),且修正幅度按细胞类型分化——同一基因在不同细胞类型中修正量不同(由 w_t 调制),形成基因×细胞类型的交互结构,而非全局均匀平移。",
"mechanism_evidence": "Engineer 应输出:(1) w_t 的分布(均值、标准差、最大/最小值及对应类型名),确认非退化;(2) 修正前后按细胞类型分组的平均表达变化量,验证类型间存在差异;(3) 四组分各自变化(重点:cell_state 是否超噪声 +1 且 expression_change 不降);(4) de_direction 保持正且不低于父节点 +0.226;(5) pearson_before_after 按类型报告,验证修正幅度在类型间有离散。",
"mechanism_off_control": "设 κ=0(环境变量 VEC_KAPPA=0),此时 w_t=1 对所有类型,修正公式退化为父节点 21 的 exp(-λ·δ_norm),输出应逐字节一致(md5 相同)。另有 VEC_MECH_OFF=1 全局关闭(λ=0),输出等于节点 16。预期差别:κ>0 时 cell_state 应高于 κ=0,若相同则机制未运行。",
"sources": []
} |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/22/researcher.jsonl 5 KB /home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/22/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 9 |
| 工具调用 | 共 13 次:read 7、bash 5、write 1 |
| 用时 | 2 分 |
| token 数 | 输入 29,053 · 输出 1,979 · 思考 5,504 |
| 任务(第一行) | 审查节点 n22 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/22/reviewer.jsonl 124 KB /home/spark-longxinyang/vec/runs/formal/20261003-070222-search-t2-heart-extrap-g24-D/nodes/22/reviewer.stderr |