总览 · ← 返回运行 20261003-094241-search-t2-heart-interp-g24-D-s2
节点 n13
在节点 10(logit 组成插值 mix)之上加"同型 kNN 收缩"坐标后处理:每个抽样细胞向同类型 k=10 近邻质心移动 α=1.25 倍位移,表达不动,抬升 neighborhood_mmd 与 local_spatial。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-094241-search-t2-heart-interp-g24-D-s2 |
|---|---|
| 父节点 | n10 |
| 子节点 | n15 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 66.21(+1.0) · proxy 66.21(+1.0) · 3 次复测均分 66.10 |
| 审查 | 通过 1 越界读取:未发现——run.py 只经 src.task2_spatial.view_io(load_manifest/read_stage/panel_genes/interp_bracket,run.py:212-229)读视图内数据,导入的是 task2_spatial 框架模块而非打分器或 src/common/evaluation(run.py:46-49),无绝对路径、..、/mnt、/home、联网;external 与 prior 文件均未被读取; 2 硬编码目标统计量:未发现——类型配额由两侧标签现场计算(composition/allocate_sides,run.p… |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 22 分 |
| 程序版本 | 5c596114839576654ea2ee66080dad3a8ec032c0 (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 5c59611483:solution/METHOD.md
在节点 10(logit 组成插值 mix)之上加"同型 kNN 收缩"坐标后处理:每个抽样细胞向同类型 k=10 近邻质心移动 α=1.25 倍位移,表达不动,抬升 neighborhood_mmd 与 local_spatial。
实现(family T2HI-05 计划 → 实际机制替换,见下)
基座 = 父节点 10 原样:procrustes 对齐、log 线性 RMS 目标、logit 组成插值(eps=5e-4)按配额抽真实细胞。在此之上新增:
- T2HI_SCALE_DAMP(PLAN 机制,默认 1.0 = 不生效,代码保留):target_rms = exp(ln rms_a + DAMP·t·(ln rms_b − ln rms_a))。实测证明在本榜是死路:proxy 括号 rms_a=354.1、rms_b=335.0,几何插值可达范围被夹在 [335, 354],而真值 RMS ≈ 346.3·e^(−0.4688) ≈ 217——任何 DAMP 都无法达到;最大可能改动(DAMP→∞ 等价 t'=1)只把 scale_log_ratio raw 从 0.4688 移到 log(335/217)=0.437(skill +0.01,<0.1 分)。PLAN 风险条款 2 的"放弃此方向"分支成立(不是过冲,是可达域不含目标)。PLAN 字面公式 geo^DAMP 依赖坐标单位(346^0.92≈217 纯属单位巧合),换视图即失效,未采用。故未消耗查分额度扫描 DAMP。
- T2HI_COLOC(试验后放弃,默认 0):共有类型两侧抽取子云平移到其 (1−t,t) 质心插值点。实测有害:γ=1.0 → 64.0、γ=0.35 → 64.8(父 65.25),neighborhood_mmd raw 0.0510→0.0574/0.0530,occupancy 0.819→0.795/0.818。类型质心平移抹掉类型内部结构、把两侧细胞硬拼在一起反而破坏表达-位置配对。
- T2HI_CONTRACT=type(生效机制,α=1.25,k=10):对拼接后的抽取坐标,每个细胞在其同类型细胞内找 k=10 近邻(不含自身),位移 x += α·(centroid−x);之后照常 jitter、scale_to_rms(target)。α=0 或 none 时输出与父节点逐位相同(已验证)。
机制生效证据(proxy:E8.25+E9.5→E8.75,t=0.4,n=17616,seed 0)
- 实际改变的细胞:全部 17616 个抽取细胞的坐标(表达矩阵逐位不动);收缩后 RMS 331.6→325.1,再缩放回 346.3。共有类型(V-CM、Peri、NCC、aPHM、pPHM)的 a/b 两个重复子簇从内部合并(比 coloc 的整簇平移温和,保留簇内梯度),单侧类型区域被致密化。
- 四组分变化(A 半,同程序对照 none → type/α=1.25):expression_change 72.08 → 72.08(不变,表达未动);cell_state 71.56 → 71.56(不变);local_spatial 65.80 → 69.80(neighborhood_mmd raw 0.0510→0.0418,skill 0.658→0.697,+1.0 分);shape_scale 51.08 → 50.75(d2 0.0452→0.0453、occupancy 0.819→0.816、scale 不变,−0.3 在噪声内)。
- 对照:
T2HI_CONTRACT=none输出与父节点文件 X、坐标逐位相同(anndata 比对通过);父节点分 65.25。
验证过的
- α 扫描(seed 0,type,k=10):0.3→65.47、0.6→65.60、1.0→65.91、1.25→66.05、1.5→65.96、2.0→66.13;global 模式 0.3→65.02(差于 type)。neighborhood_mmd raw 随 α 单调降到 ~0.041 后平台;α=2.0 分数最高但 d2_shape raw 恶化(0.0452→0.0472),取平台中部 α=1.25。
- 最终默认配置:seed 0 → 66.05(local_spatial 69.8),seed 1 → 66.55;父 65.25 / rank3 65.16。评分器本身有 ±0.3 左右的漂移(同一文件两次查询 de_score raw 0.5213→0.5435 量级的差异来自评分抽样,非程序)。
vec-check通过;默认输出与查分文件逐位一致;重跑确定(无全局随机态,sklearn kNN 确定);纯 CPU,运行 ~4 s,内存 <1 GB。- 视图无关:只用时间差 t、标签、坐标与 manifest 上下限;不读 board/mode/阶段名,无硬编码细胞数、类型名或统计量。单输入/不被括号:copy_last 分支在机制之前返回,机制自动不生效。
没验证的 / 风险
- final 视图(E8.25+E8.75,31 个共有类型)未跑;同型收缩不依赖共有类型数(单侧类型同样被致密化),预期方向一致,但幅度未验证。
- scale_log_ratio raw≈0.47 仍贴地板:真值 RMS(217) 低于括号两端 [335,354],任何由输入现场计算的插值都无法达到,形状组的这一项在本 proxy 上不可合法修复(见上);shape_scale 组三项全部在地板附近。
- α=1.25 在 1.0–2.0 平台内,B 半上最优 α 可能略移,但平台宽(±0.5 分内),风险小。
- 知识来源:仅通用做法——单一真实阶段的同类细胞占据连续区域,跨阶段混抽会产生重复子簇;向同型局部质心收缩恢复"一型一区"的局部组织。未使用任何保留阶段/保留基因型的测量信息。
调研员的计划
| 名称 | 尺度阻尼校正:修复 log 线性 RMS 目标的系统性高估以抬升 shape_scale |
|---|---|
| 动机 | 父节点 10 四组分中 shape_scale 51.08 为最弱组,三项全部贴地板(得分 4.20/4.31/4.26 vs 地板 4.17/满分 8.33)。其中 scale_log_ratio raw=0.4688(预测 RMS ≈ 真值×e^0.47≈1.6 倍)在节点 2、10 中完全相同,证明偏差完全来自 log 线性 RMS 目标(scale_damp=1.0),与组成机制无关。若能将 raw 压至 0,该项 skill 从 0.512→1.0,得分 +4.07,形状组从 51.08→~55.1,总分预期 +4。方向库 T2HI-05 亦指出'心脏尺度非单调',几何插值在凹趋势下系统性高估中间值。 |
| 做法 | 步骤:1) 在 run.py 中将 target_rms 计算从 log_interp(rms_a, rms_b, t, damp=1.0) 改为 log_interp(rms_a, rms_b, t, damp=DAMP),DAMP 由 env T2HI_SCALE_DAMP 控制(默认 1.0 保持向后兼容);2) 用 vec-score 在 proxy 上扫描 DAMP ∈ {0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90},每次运行 <3 s,8 次查分在 20 次限额内;3) 选取使 scale_log_ratio raw 最接近 0 的 DAMP(预期 ~0.65–0.75,因需压缩 47% 的 log 偏差);4) 确认 d2_shape、occupancy_dice、neighborhood_mmd 不因等比缩放而变(它们对尺度不变,应逐位相同);5) 确认 cell_state、expression_change 两组不变(表达未动)。单输入阶段退路:copy_last 分支不涉及 RMS 目标,无需修改;若只有单侧输入则不触发 scale_to_rms,机制自动不生效。若 proxy 最优 DAMP 在边界(0.55 或 0.90),向外扩展 2 个点再扫。 |
| 风险 | 1) 真值 RMS 与两侧几何插值的关系在不同 seed/视图上不一致,proxy 最优 DAMP 在 B 半或 final 上偏移——Engineer 应检查 3 个 seed 的 scale_log_ratio raw 方差,若 >0.1 则取使 3 seed 均值最接近 0 的值而非单次最优。2) 若心脏尺度变化确实是单调的(几何插值正确),则偏差来源是坐标对齐或细胞抽样而非目标设定——此时应观察降低 DAMP 是否使 scale_log_ratio 过冲为负;若 0.55 仍过正则放弃此方向。3) 等比缩放后若触发 _jitter 或 occupancy_dice 的体素边界效应导致微小波动——预期在噪声内,若形状另两项变化 >0.5 分则需排查。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 fe3e47beae。改动的文件:solution/METHOD.md +19 −22、solution/run.py +117 −15
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 2911dcc..b6726c2 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,32 +1,29 @@-T2HI-01:logit 空间插值括号两侧细胞类型组成定配额,按配额抽真实细胞(表达/坐标原样),不做伪批量平均。+在节点 10(logit 组成插值 mix)之上加"同型 kNN 收缩"坐标后处理:每个抽样细胞向同类型 k=10 近邻质心移动 α=1.25 倍位移,表达不动,抬升 neighborhood_mmd 与 local_spatial。 -## 方法(family T2HI-01,draft 最小实现)+## 实现(family T2HI-05 计划 → 实际机制替换,见下) -1. mix 基座:`view_io.interp_bracket` 取目标两侧输入 (a, b, t);`align_pair(procrustes)`(xy 用共有类型质心 Kabsch,z 只定符号,共有类型 <3 自动退化 PCA);两侧坐标缩放到 log 线性 RMS(scale_damp=1);总细胞数 `interp_count` 夹到 manifest [min_cells, max_cells]。-2. 组成机制(默认开):两侧类型比例 p_a、p_b(未见类型加岭 eps),f ∝ exp((1−t)·logit(p_a) + t·logit(p_b)),归一化后乘 n 得逐型配额;配额受两侧可用细胞数上限约束、余量按 f 比例重分。共有类型按 (1−t, t) 拆到两侧池,单侧类型只从该侧抽;`rng.choice` 无放回,表达与坐标原样携带(无任何平均/插值)。默认 eps=0.0005(env `T2HI_EPS`)。-3. 对照(机制关):`T2HI_COMPOSITION=linear`,同一分配代码,f = (1−t)p_a + t·p_b;两模式 f 相等时输出逐位相同。提交时保持 logit 开。-4. 单输入 / 目标不被括号:copy_last 退路(≤max_cells 原样输出,否则分层 take),组成模块不启用。-5. 视图无关:只用时间差 (t)、manifest 细胞上下限与数据本身;不读 board/mode/阶段名,无硬编码类型名单或比例。已在伪装视图(时间 +1 天、manifest 键序打乱、换路径)验证输出逐位相同。+基座 = 父节点 10 原样:procrustes 对齐、log 线性 RMS 目标、logit 组成插值(eps=5e-4)按配额抽真实细胞。在此之上新增: -## 机制生效证据(proxy:E8.25+E9.5→E8.75,t=0.4,n=17616)+1. **T2HI_SCALE_DAMP(PLAN 机制,默认 1.0 = 不生效,代码保留)**:target_rms = exp(ln rms_a + DAMP·t·(ln rms_b − ln rms_a))。**实测证明在本榜是死路**:proxy 括号 rms_a=354.1、rms_b=335.0,几何插值可达范围被夹在 [335, 354],而真值 RMS ≈ 346.3·e^(−0.4688) ≈ 217——任何 DAMP 都无法达到;最大可能改动(DAMP→∞ 等价 t'=1)只把 scale_log_ratio raw 从 0.4688 移到 log(335/217)=0.437(skill +0.01,<0.1 分)。PLAN 风险条款 2 的"放弃此方向"分支成立(不是过冲,是可达域不含目标)。PLAN 字面公式 geo^DAMP 依赖坐标单位(346^0.92≈217 纯属单位巧合),换视图即失效,未采用。故未消耗查分额度扫描 DAMP。+2. **T2HI_COLOC(试验后放弃,默认 0)**:共有类型两侧抽取子云平移到其 (1−t,t) 质心插值点。实测有害:γ=1.0 → 64.0、γ=0.35 → 64.8(父 65.25),neighborhood_mmd raw 0.0510→0.0574/0.0530,occupancy 0.819→0.795/0.818。类型质心平移抹掉类型内部结构、把两侧细胞硬拼在一起反而破坏表达-位置配对。+3. **T2HI_CONTRACT=type(生效机制,α=1.25,k=10)**:对拼接后的抽取坐标,每个细胞在其**同类型**细胞内找 k=10 近邻(不含自身),位移 x += α·(centroid−x);之后照常 jitter、scale_to_rms(target)。α=0 或 none 时输出与父节点逐位相同(已验证)。 -- 日志:L1(linear, logit) = 0.272(eps=0.0005),逐型配额与两侧实际抽样数均打印;a 侧抽样 12055 vs linear 11421,b 侧 5561 vs 6195,约 634 个细胞换了来源侧,另有多个单侧类型配额改变(如 EXE-Endoderm 928→按 f_log 缩减、NCC 1333→增大)。-- 四组分变化(A 半,linear 对照 → logit 机制,同程序同 RNG 流程):- - expression_change 65.19 → 72.08(de_score raw 0.370→0.505,de_direction 0.543→0.619)- - cell_state 65.95 → 71.56(mmd_u raw 0.0324→0.0288,variogram 0.0281→0.0251)- - local_spatial 54.99 → 65.26(neighborhood_mmd raw 0.0785→0.0663)- - shape_scale 52.83 → 51.03(略降,d2_shape/occupancy 变化在噪声内;scale_log_ratio 不变)-- 对照结果:linear 59.75 ≈ 种子 mix 水平(59.50),确认基座复现;机制版总分 64.98,差 +5.2,远超 ~1 的噪声。+## 机制生效证据(proxy:E8.25+E9.5→E8.75,t=0.4,n=17616,seed 0)++- 实际改变的细胞:全部 17616 个抽取细胞的**坐标**(表达矩阵逐位不动);收缩后 RMS 331.6→325.1,再缩放回 346.3。共有类型(V-CM、Peri、NCC、aPHM、pPHM)的 a/b 两个重复子簇从内部合并(比 coloc 的整簇平移温和,保留簇内梯度),单侧类型区域被致密化。+- 四组分变化(A 半,同程序对照 none → type/α=1.25):expression_change 72.08 → 72.08(不变,表达未动);cell_state 71.56 → 71.56(不变);local_spatial 65.80 → 69.80(neighborhood_mmd raw 0.0510→0.0418,skill 0.658→0.697,+1.0 分);shape_scale 51.08 → 50.75(d2 0.0452→0.0453、occupancy 0.819→0.816、scale 不变,−0.3 在噪声内)。+- 对照:`T2HI_CONTRACT=none` 输出与父节点文件 X、坐标逐位相同(anndata 比对通过);父节点分 65.25。 ## 验证过的 -- proxy 视图(本榜替代评测):eps 网格 {0(61.57)、2e-5(64.90)、2e-4(65.35)、5e-4(64.98)、1e-3(65.15)、2e-3(59.85)、5e-3(62.38)、2e-2(59.85)},2e-4…1e-3 为平台,取中值 5e-4。linear 对照 1 次。共 11 次查分。-- `vec-check` 通过;伪装视图输出逐位相同(view-independent);seed 0 确定性(同参数重跑输出相同)。-- 纯 CPU,运行 <2 分钟,内存远低于 28 GB。+- α 扫描(seed 0,type,k=10):0.3→65.47、0.6→65.60、1.0→65.91、**1.25→66.05**、1.5→65.96、2.0→66.13;global 模式 0.3→65.02(差于 type)。neighborhood_mmd raw 随 α 单调降到 ~0.041 后平台;α=2.0 分数最高但 d2_shape raw 恶化(0.0452→0.0472),取平台中部 α=1.25。+- 最终默认配置:seed 0 → **66.05**(local_spatial 69.8),seed 1 → **66.55**;父 65.25 / rank3 65.16。评分器本身有 ±0.3 左右的漂移(同一文件两次查询 de_score raw 0.5213→0.5435 量级的差异来自评分抽样,非程序)。+- `vec-check` 通过;默认输出与查分文件逐位一致;重跑确定(无全局随机态,sklearn kNN 确定);纯 CPU,运行 ~4 s,内存 <1 GB。+- 视图无关:只用时间差 t、标签、坐标与 manifest 上下限;不读 board/mode/阶段名,无硬编码细胞数、类型名或统计量。单输入/不被括号:copy_last 分支在机制之前返回,机制自动不生效。 ## 没验证的 / 风险 -- final 视图(E8.25+E8.75,31 个共有类型)未跑(无该视图);预期单侧类型更少、eps 影响更小,同段代码作用更大(PLAN 预期)。-- eps 平台在 proxy 上宽(2e-4…1e-3 都在 65±0.4),正式分用 B 半,小幅差异不保证重现。-- 知识来源:仅通用做法——发育过程中细胞类型比例随时间连续变化、logit/对数比空间插值保证组成在单侧类型上平滑过渡而非线性截断;未使用任何保留阶段/基因型的测量信息。-- 若某视图共有类型 <3,procrustes 自动退化 PCA(frame.py 内建),组成机制不受影响。+- final 视图(E8.25+E8.75,31 个共有类型)未跑;同型收缩不依赖共有类型数(单侧类型同样被致密化),预期方向一致,但幅度未验证。+- scale_log_ratio raw≈0.47 仍贴地板:真值 RMS(217) 低于括号两端 [335,354],任何由输入现场计算的插值都无法达到,形状组的这一项在本 proxy 上不可合法修复(见上);shape_scale 组三项全部在地板附近。+- α=1.25 在 1.0–2.0 平台内,B 半上最优 α 可能略移,但平台宽(±0.5 分内),风险小。+- 知识来源:仅通用做法——单一真实阶段的同类细胞占据连续区域,跨阶段混抽会产生重复子簇;向同型局部质心收缩恢复"一型一区"的局部组织。未使用任何保留阶段/保留基因型的测量信息。diff --git a/solution/run.py b/solution/run.pyindex e804c95..531873d 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,13 +1,35 @@-"""T2HI-01: logit-space composition interpolation + real-cell mixing (no pseudobulk).+"""T2HI-01 base + T2HI-05-family scale damping + shared-type centroid colocalisation. -Reads the interpolation bracket from the manifest, aligns the two stage clouds-with z-held procrustes on shared cell-type centroids, rescales both to the-log-linear RMS target, then draws real cells (expression and coordinates-carried unchanged) according to per-type quotas. Quotas come from a logit-space-interpolation of the two sides' type proportions (mechanism on) or a linear-interpolation (control, env T2HI_COMPOSITION=linear). Shared types split their-quota between the sides as (1-t, t); single-side types draw from that side-only, capped by availability with proportional redistribution.+Base (parent, T2HI-01): reads the interpolation bracket from the manifest,+aligns the two stage clouds with z-held procrustes on shared cell-type+centroids, rescales both to the log-linear RMS target, then draws real cells+(expression and coordinates carried unchanged) according to per-type quotas.+Quotas come from a logit-space interpolation of the two sides' type+proportions (mechanism on) or a linear interpolation (control, env+T2HI_COMPOSITION=linear). Shared types split their quota between the sides as+(1-t, t); single-side types draw from that side only, capped by availability+with proportional redistribution.++Additions in this node:+- env T2HI_SCALE_DAMP (default 1.0): damping of the log-linear RMS target,+ target_rms = exp(ln(rms_a) + DAMP*t*(ln(rms_b)-ln(rms_a))). Documented as a+ dead end on brackets whose two sides have nearly equal RMS (see METHOD.md).+- env T2HI_CONTRACT (default "type", alpha T2HI_CONTRACT_A=1.25, k=10): the+ active mechanism. Each drawn cell is moved alpha-fraction toward the centroid+ of its k nearest SAME-TYPE neighbours in the drawn cloud ("global" searches+ the whole cloud; "none" = parent behaviour bit-for-bit). This densifies each+ type's region and merges the duplicate side-a/side-b sub-clusters of shared+ types from the inside, improving expression-location pairing+ (neighborhood_mmd). Coordinates only; expression is never touched; the cloud+ is rescaled to target_rms afterwards as in the parent.+- env T2HI_COLOC (default 0.0, measured harmful on proxy): shared-type centroid+ colocalisation. For every+ cell type drawn from BOTH sides with >= T2HI_COLOC_MIN cells on each side,+ both sub-clouds are translated so their drawn centroids coincide at the+ (1-t, t) interpolation of the two centroids (gamma = env value, 0 disables =+ parent behaviour bit-for-bit). Expression is never touched; this merges the+ duplicate per-type clusters created by mixing two stages into one cluster per+ type, as expected in a single real intermediate stage. Single input / unbracketed target: copy_last fallback (stratified take to max_cells, everything unchanged). No view names, stage names, absolute times or@@ -42,6 +64,66 @@ def _jitter(coords: np.ndarray, rng: np.random.Generator) -> np.ndarray: return out +def colocalize(ca, la_sel, cb, lb_sel, t: float, gamma: float, min_count: int):+ """Translate each shared type's two drawn sub-clouds onto their interpolated centroid.++ ca/cb: drawn coordinates from side a/b (already aligned+scaled); la_sel/lb_sel:+ their type labels. Returns (ca, cb, report). gamma=0 leaves coords unchanged.+ """+ if gamma == 0.0 or ca.shape[0] == 0 or cb.shape[0] == 0:+ return ca, cb, []+ idx_by_type_a: dict[str, np.ndarray] = {}+ idx_by_type_b: dict[str, np.ndarray] = {}+ for ty in np.unique(la_sel):+ idx_by_type_a[ty] = np.flatnonzero(la_sel == ty)+ for ty in np.unique(lb_sel):+ idx_by_type_b[ty] = np.flatnonzero(lb_sel == ty)+ report = []+ for ty in sorted(set(idx_by_type_a) & set(idx_by_type_b)):+ ia = idx_by_type_a[ty]+ ib = idx_by_type_b[ty]+ if ia.size < min_count or ib.size < min_count:+ continue+ c_a = ca[ia].mean(axis=0)+ c_b = cb[ib].mean(axis=0)+ c_t = (1.0 - t) * c_a + t * c_b+ ca[ia] += gamma * (c_t - c_a)+ cb[ib] += gamma * (c_t - c_b)+ report.append((ty, ia.size, ib.size, float(np.linalg.norm(c_a - c_b))))+ return ca, cb, report+++def contract(coords: np.ndarray, labels_sel: np.ndarray, mode: str, alpha: float, k: int) -> np.ndarray:+ """Move each cell alpha-fraction toward the centroid of its k nearest neighbours.++ mode "global": neighbours searched in the whole drawn cloud.+ mode "type": neighbours searched within the same cell type only.+ mode "none" or alpha==0: identity (parent behaviour).+ """+ if mode == "none" or alpha == 0.0 or coords.shape[0] < k + 2:+ return coords+ from sklearn.neighbors import NearestNeighbors++ out = coords.copy()+ if mode == "type":+ for ty in np.unique(labels_sel):+ idx = np.flatnonzero(labels_sel == ty)+ if idx.size < 3:+ continue+ kk = int(min(k, idx.size - 1))+ sub = coords[idx]+ nn = NearestNeighbors(n_neighbors=kk + 1).fit(sub)+ _, ind = nn.kneighbors(sub)+ cent = sub[ind[:, 1:]].mean(axis=1)+ out[idx] = sub + alpha * (cent - sub)+ return out+ kk = int(min(k, coords.shape[0] - 1))+ nn = NearestNeighbors(n_neighbors=kk + 1).fit(coords)+ _, ind = nn.kneighbors(coords)+ cent = coords[ind[:, 1:]].mean(axis=1)+ return coords + alpha * (cent - coords)++ def composition(labels_a, labels_b, t: float, mode: str, eps: float): """Per-type target fractions at time t over the union of both sides' types.""" la = np.asarray(labels_a).astype(str)@@ -150,7 +232,10 @@ def run(view: str, out: str, seed: int) -> None: ) rms_a = rms_radius(stage_a.coords) rms_b = rms_radius(stage_b.coords)- target_rms = log_interp(rms_a, rms_b, float(t), 1.0)+ damp = float(os.environ.get("T2HI_SCALE_DAMP", "1.0"))+ coloc_gamma = float(os.environ.get("T2HI_COLOC", "0.0"))+ coloc_min = int(os.environ.get("T2HI_COLOC_MIN", "10"))+ target_rms = log_interp(rms_a, rms_b, float(t), damp) ca = scale_to_rms(aligned_a, target_rms) cb = scale_to_rms(aligned_b, target_rms) n = interp_count(stage_a.n, stage_b.n, float(t), lo, hi, 1.0)@@ -180,12 +265,29 @@ def run(view: str, out: str, seed: int) -> None: if ib.size: parts.append(as_dense(stage_b.X, ib)) expr = np.clip(np.vstack(parts), 0.0, None).astype(np.float32)+ la_sel = np.asarray(stage_a.labels).astype(str)[ia] if ia.size else np.array([], dtype=str)+ lb_sel = np.asarray(stage_b.labels).astype(str)[ib] if ib.size else np.array([], dtype=str)+ ca_sel = ca[ia].copy() if ia.size else np.zeros((0, 3))+ cb_sel = cb[ib].copy() if ib.size else np.zeros((0, 3))+ ca_sel, cb_sel, coloc_rep = colocalize(ca_sel, la_sel, cb_sel, lb_sel, float(t), coloc_gamma, coloc_min)+ print(f"[coloc] gamma={coloc_gamma} min={coloc_min} types_moved={len(coloc_rep)}", flush=True)+ for ty, na_, nb_, off in coloc_rep:+ print(f" {ty}: a={na_} b={nb_} offset={off:.1f}", flush=True) coord_parts = []- if ia.size:- coord_parts.append(ca[ia])- if ib.size:- coord_parts.append(cb[ib])- coords = _jitter(np.vstack(coord_parts), rng)+ if ca_sel.shape[0]:+ coord_parts.append(ca_sel)+ if cb_sel.shape[0]:+ coord_parts.append(cb_sel)+ coords = np.vstack(coord_parts)+ lab_sel = np.concatenate([la_sel, lb_sel]) if (la_sel.size or lb_sel.size) else la_sel+ cmode = os.environ.get("T2HI_CONTRACT", "type").strip().lower()+ calpha = float(os.environ.get("T2HI_CONTRACT_A", "1.25"))+ ck = int(os.environ.get("T2HI_CONTRACT_K", "10"))+ if cmode != "none":+ before = rms_radius(coords)+ coords = contract(coords, lab_sel, cmode, calpha, ck)+ print(f"[contract] mode={cmode} alpha={calpha} k={ck} rms {before:.1f}->{rms_radius(coords):.1f}", flush=True)+ coords = _jitter(coords, rng) coords = scale_to_rms(coords, target_rms) print(f"[out] n={expr.shape[0]} out_rms={rms_radius(coords):.1f}", flush=True) view_io.write_t2(out, expr, coords, genes, seed=int(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 要求的尺度阻尼(T2HI-05)被 Engineer 判定为数学死路后未启用(DAMP 保持 1.0),实际实现的是新机制:同型 kNN 收缩——每个抽取细胞向同类型 k=10 近邻质心移动 α=1.25,只改坐标、表达逐位不动(另附带默认关闭的 coloc 平移代码,实测有害已弃用)。 |
|---|---|
| 各组分数的变化 | cell_state:不变(72.43→72.43,mmd_u 0.02337、variogram 0.0206 均逐位相同) expression_change:不变(71.71→71.71,de_score/de_direction 原始值逐位相同,表达未动,与机制声明一致) local_spatial:变好(65.80→70.19,+4.39):neighborhood_mmd raw 0.05095→0.04178,skill 0.658→0.702,得分 16.45→17.55(+1.10);榜分总分 +0.96 与 T2 噪声(~1)同量级,但指标分解显示变化集中在 neighborhood_mmd 一项且原始值相对降幅 ~18%,与所声称机制方向一致 shape_scale:略变坏/噪声内(51.08→50.51,-0.57):d2_shape raw 0.04519→0.04598(得分 -0.04)、occupancy_dice raw 0.8188→0.8132(得分 -0.10)、scale_log_ratio 逐位不变(0.4688);收缩后重新缩放到同一 target_rms,两项微降是收缩致密化的副作用,幅度在噪声内 |
| family_id | other |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 是 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 3 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 2 次:bash 1、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 15,426 · 输出 1,335 · 思考 1,425 |
| 任务(第一行) | 分析节点 n13 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/13/analyst.jsonl 7 KB /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/13/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 34 |
| 工具调用 | 共 43 次:bash 31、edit 9、read 2、write 1 |
| 用时 | 15 分 |
| token 数 | 输入 76,909 · 输出 10,890 · 思考 18,434 |
| 任务(第一行) | 按计划修改程序:尺度阻尼校正:修复 log 线性 RMS 目标的系统性高估以抬升 shape_scale |
| 最后的回答(摘录) | **完成**:在节点 10(logit 组成 mix,65.25)上验证了 PLAN 的尺度阻尼(T2HI-05)——数学上证明是死路(括号 RMS [335,354] 夹不到真值 ≈217,scale_log_ratio 无法合法修复),转而实现新机制:**同型 kNN 收缩**(每细胞向同类型 k=10 近邻质心移 α=1.25,只动坐标,表达逐位不动;`T2HI_CONTRACT=none` 对照与父节点逐位相同)。类型质心平移(coloc)实测有害已弃用(64.0/64.8)。 **查分**(11/20 次):α 扫描 0.3→65.47、1.0→65.91、1.25→66.05、2.0→66.13(d2 恶化);提交配置 seed 0 = **66.05**、seed 1 = **66.55**,收益全部来自 neighborhood_mmd(raw 0.0510→0.0418,local_spatial 65.8→69.8),其余三组不变。vec-check 通过,运行 ~4s 纯 CPU。 **下一步最值得试**:① 在收缩后的坐标上微调 k(5/20)与"收缩-缩放"顺序,或叠加轻微全局收缩;② cell_state/expression 组仍靠整细胞混抽,可试类型特异加性表达位移的小步长版(节点 4 显示 DE↑但 mmd_u↓,需折中);③ shape_scale 三项全部贴地板且 scale 项在 proxy 上不可修复,d2_shape/occupancy 是仅剩的形状抓手。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/13/engineer.jsonl 203 KB /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/13/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 5 分 |
| token 数 | 输入 15,587 · 输出 4,337 · 思考 8,192 |
| 任务(第一行) | 为节点 n13(改进,父节点 n10)写改进计划 PLAN.json |
| 最后的回答(摘录) | 7/满分 8.33)。其中 scale_log_ratio raw=0.4688(预测 RMS ≈ 真值×e^0.47≈1.6 倍)在节点 2、10 中完全相同,证明偏差完全来自 log 线性 RMS 目标(scale_damp=1.0),与组成机制无关。若能将 raw 压至 0,该项 skill 从 0.512→1.0,得分 +4.07,形状组从 51.08→~55.1,总分预期 +4。方向库 T2HI-05 亦指出'心脏尺度非单调',几何插值在凹趋势下系统性高估中间值。",
"approach": "步骤:1) 在 run.py 中将 target_rms 计算从 log_interp(rms_a, rms_b, t, damp=1.0) 改为 log_interp(rms_a, rms_b, t, damp=DAMP),DAMP 由 env T2HI_SCALE_DAMP 控制(默认 1.0 保持向后兼容);2) 用 vec-score 在 proxy 上扫描 DAMP ∈ {0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90},每次运行 <3 s,8 次查分在 20 次限额内;3) 选取使 scale_log_ratio raw 最接近 0 的 DAMP(预期 ~0.65–0.75,因需压缩 47% 的 log 偏差);4) 确认 d2_shape、occupancy_dice、neighborhood_mmd 不因等比缩放而变(它们对尺度不变,应逐位相同);5) 确认 cell_state、expression_change 两组不变(表达未动)。单输入阶段退路:copy_last 分支不涉及 RMS 目标,无需修改;若只有单侧输入则不触发 scale_to_rms,机制自动不生效。若 proxy 最优 DAMP 在边界(0.55 或 0.90),向外扩展 2 个点再扫。",
"expected_groups": ["shape_scale"],
"risks": "1) 真值 RMS 与两侧几何插值的关系在不同 seed/视图上不一致,proxy 最优 DAMP 在 B 半或 final 上偏移——Engineer 应检查 3 个 seed 的 scale_log_ratio raw 方差,若 >0.1 则取使 3 seed 均值最接近 0 的值而非单次最优。2) 若心脏尺度变化确实是单调的(几何插值正确),则偏差来源是坐标对齐或细胞抽样而非目标设定——此时应观察降低 DAMP 是否使 scale_log_ratio 过冲为负;若 0.55 仍过正则放弃此方向。3) 等比缩放后若触发 _jitter 或 occupancy_dice 的体素边界效应导致微小波动——预期在噪声内,若形状另两项变化 >0.5 分则需排查。",
"family_id": "T2HI-05",
"mechanism": "将目标阶段的 RMS 半径从几何(log 线性)插值改为幂律阻尼插值:target_rms = exp((1-t)·ln(rms_a) + t·ln(rms_b))^DAMP,DAMP<1 压缩尺度,修正心脏形态发生中非单调尺度变化导致的系统性高估。",
"vs_constant_shift": "这不是对每型加常数位移或全局组成重加权:它不改变任何细胞的表达值,不改变类型配额,只对所有坐标做等比缩放(同一乘数作用于 x/y/z),目的是校正整体点云的绝对尺寸使之匹配真值尺度。机制只影响尺度自由度,不影响形状或组成。",
"mechanism_evidence": "Engineer 应报告:1) scale_log_ratio raw 从 0.4688 变为多少(目标 |raw|<0.1);2) d2_shape raw、occupancy_dice raw、neighborhood_mmd raw 应逐位不变(等比缩放不改变归一化距离和邻域结构);3) 若 d2_shape 或 occupancy_dice 意外变化 >1%,说明代码中有非等比路径需排查。四组分中只有 shape_scale 应变,其余三组应逐位不变。",
"mechanism_off_control": "设 env T2HI_SCALE_DAMP=1.0(默认值),程序输出应与父节点 10 逐位相同(同 seed 下坐标、表达完全一致)。预期差别:开启机制(DAMP<1)后 scale_log_ratio raw 从 +0.47 向 0 移动,总分提升 ~4;关闭后回到 65.25。若关闭后输出有任何逐位差异,说明代码改动引入了副作用。",
"sources": []
} |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/13/researcher.jsonl 16 KB /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/13/researcher.stderr |
审查员
| 角色 | 审查员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 5 |
| 工具调用 | 共 9 次:read 6、bash 2、write 1 |
| 用时 | 1 分 |
| token 数 | 输入 18,536 · 输出 1,463 · 思考 2,110 |
| 任务(第一行) | 审查节点 n13 的程序是否越界读取、写死目标、钻评分器漏洞 |
| 最后的回答(摘录) | REVIEW.json written |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/13/reviewer.jsonl 90 KB /home/spark-longxinyang/vec/runs/formal/20261003-094241-search-t2-heart-interp-g24-D-s2/nodes/13/reviewer.stderr |