总览 · ← 返回运行 20261003-043412-search-t2-heart-interp-g24-D-s1
节点 n14
按 PLAN 在 T2HI-01 输出坐标端实现确定性 PCA 规范化(减质心→PCA 旋转→det=+1→三阶矩定向)并做 ON/OFF 对照;对照显示形状对齐已旋转不变、规范化仅微伤 occupancy,按 PLAN 判据关闭提交,产物与父节点12逐位一致。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261003-043412-search-t2-heart-interp-g24-D-s1 |
|---|---|
| 父节点 | n12 |
| 子节点 | n20 |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 63.01(+0.0) · proxy 63.01(+0.0) |
| 审查 | 未审查 |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 10 分 |
| 程序版本 | 88dd0156db787cefb0258a1bec27d12065bb0374 (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 88dd0156db:solution/METHOD.md
按 PLAN 在 T2HI-01 输出坐标端实现确定性 PCA 规范化(减质心→PCA 旋转→det=+1→三阶矩定向)并做 ON/OFF 对照;对照显示形状对齐已旋转不变、规范化仅微伤 occupancy,按 PLAN 判据关闭提交,产物与父节点12逐位一致。
方法族与实现
PLAN 指定家族 T2HI-01(对齐 → logit 组成插值 → 共有类型内 k-NN 簇抽样 + 逐细胞表达凸组合,坐标 hold),family 机制全部保持打开(T2HI_INTERP=1, T2HI_EXPR=1, T2HI_COORD=hold, K=25/C=10,父节点12 已验证的 matched-align 保持 OFF)。
本节点新增 PLAN 机制 canonicalise(canonicalize_coords,solution/run.py):在最终写文件之前对输出坐标做一次
- 减质心;
- 对称
eigh求协方差特征分解,旋转到 PCA 主轴(特征值降序); - 若旋转矩阵 det=-1,将最后一轴乘 -1 强制 det=+1;
- 逐轴按第三中心矩符号定向(正偏度指向 +轴)。
只在三个最终输出点各应用一次(interp / control-mix / 单阶段 fallback),不影响对齐、插值、抽样等任何中间步骤。开关 T2_CANONICAL,提交默认 0(关);设 1 可复现机制对照。
机制生效证据(实际改变了什么)
机制确实激活并改变输出(非空转),且为纯刚体变换:
- 坐标全部改变:ON vs OFF
spatial_3D不相等(整体旋转+反射作用于每个细胞,位移随位置而异);规范化后质心 ≈ (0,0,0)(~1e-5),协方差非对角元 ≤1.3e-5(对角化),det=+1,三轴第三矩均为正(305k / 624k / 84k)——PLAN mechanism_evidence 的四条几何性质全部实测成立。 - 表达完全不变:ON vs OFF 的
.Xarray_equal=True;RMS 不变(346.33);k=5 近邻索引集合array_equal=True(距离结构逐位保留)。 - 四组分变化:只有 shape_scale 动了(56.21 → 55.97);cell_state 65.73、expression_change 64.77、local_spatial 63.66 三组逐项不变——符合刚体变换预期。
- 不是常数位移(每细胞位移不同、质心被减掉后旋转作用于全云),也不是组成重加权(细胞数、类型配额、表达值完全不变)。
对照结果(A 半,seed 0,官方评分器)
| 配置 | board | shape_scale | local_spatial | cell_state | expr_change |
|---|---|---|---|---|---|
| canonical ON | 62.53 | 55.97 | 63.66 | 65.73 | 64.77 |
| canonical OFF(提交,=父节点12) | 62.59 | 56.21 | 63.66 | 65.73 | 64.77 |
关闭对照:T2_CANONICAL=0(提交默认)与父节点12输出逐位一致(.X 与 spatial_3D 均 array_equal=True),seed 0 两次运行逐位相同。
结论:机制生效但无收益,按 PLAN 判据回退关闭。 细分指标给出了机理:ON/OFF 的 d2_shape(0.02542)与 scale_log_ratio(0.4669)完全相同——评分器的形状对齐本身已对旋转/手性不变,k026 假设的"旋转方差源"在 shape 分量上不存在;规范化唯一改变的是 occupancy_dice(0.8247 → 0.8207,占据栅格依赖绝对朝向,PCA 规范帧不如 Procrustes 对齐到 a 阶段的原始帧),使 shape_scale 净降 0.24(噪声内但方向为负)。PLAN 成功判据「shape_scale 提升 > 1」未满足 → 提交 OFF。
已验证 / 未验证
已验证:(1) proxy 全流程 ~2s 纯 CPU,vec-check ok;(2) 提交默认与父节点12逐位一致、对 seed 确定(np.random.default_rng(seed));(3) ON/OFF 对照如上,机制的四条几何性质逐条实测;(4) 视图无关:canonicalize_coords 只用输出坐标本身(数据驱动、无绝对时间、无路径/board/manifest 字段依赖),且提交默认 OFF 路径 = 父节点12(已证视图无关)。
未验证 / 风险:(1) occupancy_dice 对朝向的敏感性提示"换一个非 PCA 的规范朝向"可能有 ≤0.1 量级的波动,但父帧(Procrustes 到 a 阶段)已是实测更优朝向,无证据存在更好选择,未做搜索(避免过拟合 A 半噪声);(2) 未在伪装视图实跑,仅代码层面论证;(3) shape_scale 的真正瓶颈仍是 target_rms(log-线性 346 vs proxy 真值 217,scale_log_ratio≈0.467),任何刚体变换都无法触及。
生物学知识来源
未引入外部文献/数据库/检索知识,未用保留阶段(E8.5/E10.5/E12.5、禁窗 (8.25,8.75) 与 9.5<E≤13.5)或保留基因型的任何信息;输入为视图给定的 E8.25_late 与 E9.5(均在允许范围)。PCA、特征分解、第三矩定向均为通用统计/几何方法。未读 external/ 与 prior/。
下一步
- shape_scale 已被证明对姿态类改法完全不敏感(matched-align、PCA 规范化双双证伪,d2_shape 恒为 0.02542)——不要再做任何对齐/朝向类尝试;唯一剩余杠杆是 target_rms 估计(如 RMS~log 细胞数 / 阶段间隔的视图内回归),但需警惕 proxy 非单调 dip(354→217→335)导致的过拟合。
- occupancy_dice 是唯一随朝向变的形状子指标且现帧更优;若未来改动细胞空间分布(如簇参数),需连同 occupancy 一起复测。
- cell_state/expr/local 前沿仍被父配置占满,突破需换机制(容量约束双向互匹配的表达插值等,见父 ANALYSIS)。
调研员的计划
| 名称 | PCA 规范化输出坐标系 + 保持 T2HI-01 插值框架 |
|---|---|
| 动机 | 父节点12及整个 node-10 谱系(node10→12)的 shape_scale 停滞在 56.09,是四组中最低分。ANALYSIS 指出 shape_scale 的主惩罚来源是 target_rms 估计偏差(log-线性给 346,真值≈217,scale_log_ratio≈0.467),且对齐类改法已饱和(matched-align 在 node12 被证伪)。但文献库 k026 指出一个尚未尝试的结构性问题:形状指标对点云做 PCA 对齐但不固定行列式,因此同一次预测的旋转/手性翻转可能改变形状分。当前 node10 系从未做过坐标规范化(canonicalisation),这个方差源仍然存在。通过规范化自身输出的坐标系(减质心→旋转到 PCA 轴→强制 det=+1→三阶矩定向),可以消除评分器引入的额外形状方差,而不改变预测内容的内在结构。预期对 shape_scale 有正向影响(减少随机旋转带来的分数损失)。 |
| 做法 | 步骤: 1. 在 solution/run.py 的预测坐标输出端(写文件之前)新增一个坐标规范化函数:(a) 减去质心;(b) 对预测坐标做 PCA,旋转到主成分轴;(c) 计算旋转矩阵行列式,若为 -1 则将最后一个轴乘以 -1 使 det=+1;(d) 用第三阶矩(第三中心矩)的符号翻转每个轴,使方向唯一确定。 2. 该函数只在最终输出坐标上应用一次,不影响对齐、插值、抽样等中间步骤。 3. 对照开关 T2_CANONICAL=0(默认1),关闭时行为与当前父节点完全一致(跳过规范化步骤)。 4. 先小样本验证:跑一次 proxy,确认 vec-check 通过、输出文件非空、规范化前后坐标确实不同(旋转变化)但基因表达不变。 5. 用 vec-score 查分比较 shape_scale 是否提升 > 1 分。若提升则提交;若未提升或下降,检查是否规范化引入了问题(例如 PCA 轴与形状指标期望不一致),再回退关闭。 6. 不改动任何插值逻辑(INTERP_ENABLED, EXPR_INTERP, COORD_MODE, KNN_K, N_CLUSTERS 等全部保持父节点默认值),只加规范化后处理。 单输入阶段退路:单阶段时坐标仍来自同一阶段,规范化逻辑不变,无额外依赖。 vec-score 快速筛选:只需一次查询即可判断(规范化是确定性变换,无随机性),若 shape_scale 提升 > 1 即有效。 |
| 风险 | 风险1:规范化可能恰好把形状指标期望的手性方向反过来了(例如评分器内部 PCA 的 det 习惯与规范化不一致),导致 shape_scale 反而下降。Engineer 应在第一次查分后立刻比较 shape_scale 前后差异,若下降 > 1 分则关闭规范化并提交父节点。 风险2:PCA 轴在三阶矩定向时若数据分布对称导致符号不确定,可能产生微小抖动,但这在规范化的设计内,影响极小。 风险3:只影响 shape_scale,其他三组应不变;若出现其他组变化,说明规范化影响了坐标结构(不应发生,因为只是刚体变换)。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 79854afc0c。改动的文件:solution/METHOD.md +25 −42、solution/run.py +43 −1
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 142c49c..15ccc50 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,66 +1,49 @@-在父节点10实现跨类型表达相关匹配对齐(matched-align)替代exact-name作Procrustes地标;机制激活(22匹配对)但shape_scale未提升(55.2–56.2 vs 56.21),按PLAN回退关闭,提交=父节点行为。+按 PLAN 在 T2HI-01 输出坐标端实现确定性 PCA 规范化(减质心→PCA 旋转→det=+1→三阶矩定向)并做 ON/OFF 对照;对照显示形状对齐已旋转不变、规范化仅微伤 occupancy,按 PLAN 判据关闭提交,产物与父节点12逐位一致。 ## 方法族与实现 -PLAN 指定家族 **T2HI-01**(插值:对齐 → logit 组成插值 → 共有类型内 k-NN 簇抽样 + 逐细胞表达凸组合,坐标 hold)。本节点按 PLAN 新增 **matched_align** 子机制:把 Procrustes 对齐地标从 exact-name 共有类型换成**跨类型表达相关贪心匹配对**。核心家族机制(`INTERP_ENABLED=1`, `EXPR_INTERP=1`, `COORD_MODE=hold`, 簇抽样 K=25/C=10)全部保持打开。+PLAN 指定家族 **T2HI-01**(对齐 → logit 组成插值 → 共有类型内 k-NN 簇抽样 + 逐细胞表达凸组合,坐标 hold),family 机制全部保持打开(`T2HI_INTERP=1`, `T2HI_EXPR=1`, `T2HI_COORD=hold`, K=25/C=10,父节点12 已验证的 matched-align 保持 OFF)。 -matched_align 实现(`solution/run.py`):-1. 各侧按 celltype 算 pseudobulk 平均表达(每侧 ≥ `MATCH_MIN_CELLS` 细胞的类型)。-2. 计算 a-型 × b-型 Pearson 相关矩阵,按相关从高到低**贪心**选匹配对(每型至多用一次,r ≥ `MATCH_R`),权重 = min(两侧该型细胞数)。-3. 用匹配对质心做 Procrustes:xy Kabsch(允许反射),z 不旋转、符号由匹配质心 z 相关定。-4. 匹配对 < 3 → 回退 exact-name `align_pair`(其内部再回退 PCA)。-5. 开关 `T2_MATCHED_ALIGN=1/0`;另有 `T2_MATCH_R`、`T2_MATCH_MIN_CELLS`、`T2_MATCH_WEIGHT`(count/corr/corr2)、`T2_MATCH_ZFLIP` 供搜索。+本节点新增 PLAN 机制 **canonicalise**(`canonicalize_coords`,`solution/run.py`):在最终写文件之前对输出坐标做一次+1. 减质心;+2. 对称 `eigh` 求协方差特征分解,旋转到 PCA 主轴(特征值降序);+3. 若旋转矩阵 det=-1,将最后一轴乘 -1 强制 det=+1;+4. 逐轴按第三中心矩符号定向(正偏度指向 +轴)。++只在三个最终输出点各应用一次(interp / control-mix / 单阶段 fallback),不影响对齐、插值、抽样等任何中间步骤。开关 `T2_CANONICAL`,**提交默认 0(关)**;设 1 可复现机制对照。 ## 机制生效证据(实际改变了什么) -机制**确实激活并改变输出**(非空转)。proxy 上 r≥0.3 时贪心匹配到 **22 对**(远超回退阈值 3),含大量生物合理的跨类型匹配:Endo↔Great Artery Endoth(0.863)、V-CM↔V-CM(0.851)、JCF↔Peri(0.844)、Intra-Endoth-2↔BEC(0.812)、Lateral FG↔Foregut(0.812)、IFT-CM↔A-CM(0.807)、d-CSE↔SE(0.77)、pPHM↔aPHM(0.751) 等。相比 exact-name 仅 5 个共有类型(NCC/Peri/V-CM/aPHM/pPHM)。匹配地标改变了作用于**全部细胞坐标**的整体刚体+反射变换:det、xy 旋转、以及 z 符号判定(matched 给出 z_flipped=True,exact-name 为 False)都随之改变,因此每个细胞的落点随位置而异——不是常数位移,也不是组成重加权。+机制确实激活并改变输出(非空转),且为纯刚体变换:++- **坐标全部改变**:ON vs OFF `spatial_3D` 不相等(整体旋转+反射作用于每个细胞,位移随位置而异);规范化后质心 ≈ (0,0,0)(~1e-5),协方差非对角元 ≤1.3e-5(对角化),det=+1,三轴第三矩均为正(305k / 624k / 84k)——PLAN mechanism_evidence 的四条几何性质全部实测成立。+- **表达完全不变**:ON vs OFF 的 `.X` `array_equal=True`;RMS 不变(346.33);k=5 近邻索引集合 `array_equal=True`(距离结构逐位保留)。+- **四组分变化**:只有 shape_scale 动了(56.21 → 55.97);cell_state 65.73、expression_change 64.77、local_spatial 63.66 三组逐项不变——符合刚体变换预期。+- 不是常数位移(每细胞位移不同、质心被减掉后旋转作用于全云),也不是组成重加权(细胞数、类型配额、表达值完全不变)。 ## 对照结果(A 半,seed 0,官方评分器) | 配置 | board | shape_scale | local_spatial | cell_state | expr_change | |---|---:|---:|---:|---:|---:|-| **提交:matched OFF(=父节点10)** | **62.59** | **56.21** | 63.66 | 65.73 | 64.77 |-| matched ON r0.3 count(z-flip) | 62.39 | 55.23 | 63.81 | 65.73 | 64.77 |-| matched ON r0.3 count(no z-flip) | 62.36 | 55.45 | 63.49 | 65.73 | 64.77 |-| matched ON r0.7(11 对) | 62.51 | 55.67 | 63.89 | 65.73 | 64.77 |-| matched ON weight=corr | 62.39 | 55.28 | 63.80 | 65.73 | 64.77 |-| matched ON weight=corr2(最佳) | 62.56 | 56.19 | 63.57 | 65.73 | 64.77 |--**关闭对照**:`T2_MATCHED_ALIGN=0` 与父节点10输出**逐位一致**(X 与 spatial_3D 均 `array_equal=True`),board 62.59、shape_scale 56.21,符合 PLAN 的 mechanism_off_control 预期。--**结论:机制生效但未带来收益。** 所有 matched-ON 配置的 shape_scale(55.2–56.2)均**不高于**父节点 exact-name 的 56.21;board 全部 ≤ 62.59。最佳的 corr2 加权(用 r² 压低可疑低相关对)仅把 shape_scale 拉回 56.19 ≈ 父节点,board 62.56 仍在噪声内略低。PLAN 的成功判据是「shape_scale 提升 > 1 且总分不降」——**未满足**,故按 PLAN 明确指示「否则回退 0」,提交 `T2_MATCHED_ALIGN=0`。--## 为什么不奏效(与节点8的差异)--节点8在 node7(mix 组成、shape_scale 52.78)上把地标换成 matched-align 得到 +3.15(→55.93)。但本父节点10(logit 组成 + coord=hold)的 exact-name 对齐**已经达到 shape_scale 56.09/56.21**,即 matched-align 在节点8 上换来的水平,node10 用 5 个空间可靠的同名类型就已达到。matched-align 再叠加只会在饱和点上波动:表达相关匹配把**空间上并不对应**的类型(如 Unknown↔OFT-CM、Allantois↔Branch Arch、Peri↔ST)也拉来当地标,Kabsch 为对齐这些表达相似但位置不符的质心而扭动 xy 旋转,反而不如同名地标稳。这正是 PLAN 风险 #1(与节点8/11 重叠、增益已被父节点吸收)的实现。--## 附加搜索:簇抽样参数(均 matched OFF)--顺带扫了 local_spatial 的最大杠杆——簇抽样 KNN_K × N_CLUSTERS(父=25×10):+| canonical ON | 62.53 | 55.97 | 63.66 | 65.73 | 64.77 |+| **canonical OFF(提交,=父节点12)** | **62.59** | **56.21** | 63.66 | 65.73 | 64.77 | -| K×C | board | shape_scale | local_spatial |-|---|---:|---:|---:|-| 25×10(父) | 62.59 | 56.21 | 63.66 |-| 50×10 | 62.58 | 55.01 | 64.04 |-| 25×20 | 62.57 | 55.20 | 63.90 |-| 25×5 | 61.63 | 51.50 | 65.10 |-| 40×8 | 61.95 | 51.85 | 64.93 |-| 15×10 | 61.31 | 50.79 | 64.39 |+**关闭对照**:`T2_CANONICAL=0`(提交默认)与父节点12输出**逐位一致**(`.X` 与 `spatial_3D` 均 `array_equal=True`),seed 0 两次运行逐位相同。 -shape_scale 对 K 极敏感,K=25/C=10 是尖峰最优;增大 K 或改 C 都以 shape 换 local,总分不升反降。父节点已坐在该前沿最优处,无免费改进。+**结论:机制生效但无收益,按 PLAN 判据回退关闭。** 细分指标给出了机理:ON/OFF 的 `d2_shape`(0.02542)与 `scale_log_ratio`(0.4669)**完全相同**——评分器的形状对齐本身已对旋转/手性不变,k026 假设的"旋转方差源"在 shape 分量上不存在;规范化唯一改变的是 `occupancy_dice`(0.8247 → 0.8207,占据栅格依赖绝对朝向,PCA 规范帧不如 Procrustes 对齐到 a 阶段的原始帧),使 shape_scale 净降 0.24(噪声内但方向为负)。PLAN 成功判据「shape_scale 提升 > 1」未满足 → 提交 OFF。 ## 已验证 / 未验证 -**已验证**:(1) proxy 全流程跑通(~2s,纯 CPU,峰值内存远低于 limits),`vec-check` ok;(2) 提交默认(无环境变量)与父节点10**逐位一致**,seed 0 两次逐位相同,`np.random.default_rng(seed)`,无全局随机;(3) matched ON/OFF 对照如上,机制激活时确实改变 22 对地标、xy 旋转与 z 符号(改变全部细胞坐标),OFF 时回退父节点;(4) 视图无关:matched_align/matched_landmarks 只用 coords、labels、X,不读 board/mode/path、不用绝对时间;t 由 `interp_bracket` 用时间**差**算,统一平移不变;默认 OFF 路径 = 父节点(已证视图无关)。+**已验证**:(1) proxy 全流程 ~2s 纯 CPU,`vec-check` ok;(2) 提交默认与父节点12逐位一致、对 seed 确定(`np.random.default_rng(seed)`);(3) ON/OFF 对照如上,机制的四条几何性质逐条实测;(4) 视图无关:`canonicalize_coords` 只用输出坐标本身(数据驱动、无绝对时间、无路径/board/manifest 字段依赖),且提交默认 OFF 路径 = 父节点12(已证视图无关)。 -**未验证 / 风险**:(1) matched-align 在 **final(31 共有类型)** 上是否更有价值未测——proxy 仅 5 个同名类型,matched 的 22 对里很多是跨类型,若 final 同名类型已足够多,matched 的边际收益可能仍为负;本节点据 proxy 判其不奏效并关闭。(2) shape_scale 受目标 RMS 制约:两端 log-线性给 346,proxy 真值 E8.75≈217(心脏尺度非单调 354→217→335),scale_log_ratio≈0.467 是 shape 的主惩罚,**无法从括号两端推出更小的目标**,matched-align 不改 RMS 故对此无能为力——这是方法卡已知弱点,未硬调 scale_damp 到 proxy 真值(会破坏视图无关)。(3) 未在 final/伪装视图实跑,仅代码层面论证视图无关。+**未验证 / 风险**:(1) occupancy_dice 对朝向的敏感性提示"换一个非 PCA 的规范朝向"可能有 ≤0.1 量级的波动,但父帧(Procrustes 到 a 阶段)已是实测更优朝向,无证据存在更好选择,未做搜索(避免过拟合 A 半噪声);(2) 未在伪装视图实跑,仅代码层面论证;(3) shape_scale 的真正瓶颈仍是 target_rms(log-线性 346 vs proxy 真值 217,`scale_log_ratio`≈0.467),任何刚体变换都无法触及。 ## 生物学知识来源 -未引入外部文献/数据库/检索知识,也未用保留阶段或保留基因型的任何信息。细胞类型名、表达、坐标全部来自视图给定的官方输入阶段(proxy: E8.25_late、E9.5,均在允许范围;目标 E8.75 未使用)。跨类型表达相关匹配、Pearson 相关、Kabsch/Procrustes、贪心匹配均为通用统计/几何方法,不含针对禁窗阶段的先验。未读 `external/` 与 `prior/`。+未引入外部文献/数据库/检索知识,未用保留阶段(E8.5/E10.5/E12.5、禁窗 (8.25,8.75) 与 9.5<E≤13.5)或保留基因型的任何信息;输入为视图给定的 E8.25_late 与 E9.5(均在允许范围)。PCA、特征分解、第三矩定向均为通用统计/几何方法。未读 `external/` 与 `prior/`。 ## 下一步 -1. matched-align 在本 base 饱和,**不要再在 node10 系上重试同款对齐**(本节点已证伪);若要验证它在多类型场景的价值,应在 final-like(多共有类型)视图上单独测,而非 proxy。-2. shape_scale 被目标 RMS 卡死:真正需要的是**不使用真值**的更好 RMS 估计(如 RMS 随 log 细胞数/阶段间隔的回归、或对称验证的 SCALE_DAMP),但要警惕过拟合 proxy 的非单调 dip。-3. local_spatial/expr 的前沿已被父节点占满;若要突破,需换机制(如容量约束/双向互匹配的表达插值、或亚型细分以在多类型下激活 expr interp),而非调簇参数。+1. shape_scale 已被证明对**姿态类**改法完全不敏感(matched-align、PCA 规范化双双证伪,d2_shape 恒为 0.02542)——不要再做任何对齐/朝向类尝试;唯一剩余杠杆是 target_rms 估计(如 RMS~log 细胞数 / 阶段间隔的视图内回归),但需警惕 proxy 非单调 dip(354→217→335)导致的过拟合。+2. occupancy_dice 是唯一随朝向变的形状子指标且现帧更优;若未来改动细胞空间分布(如簇参数),需连同 occupancy 一起复测。+3. cell_state/expr/local 前沿仍被父配置占满,突破需换机制(容量约束双向互匹配的表达插值等,见父 ANALYSIS)。diff --git a/solution/run.py b/solution/run.pyindex 565ec2f..46e31de 100644--- a/solution/run.py+++ b/solution/run.py@@ -46,6 +46,15 @@ MATCH_R = float(os.environ.get("T2_MATCH_R", "0.3")) MATCH_MIN_CELLS = int(os.environ.get("T2_MATCH_MIN_CELLS", "30")) MATCH_ZFLIP = os.environ.get("T2_MATCH_ZFLIP", "1") != "0" # diagnostic: apply matched z-sign decision MATCH_WEIGHT = os.environ.get("T2_MATCH_WEIGHT", "count") # count | corr | corr2+# canonicalise: deterministic canonical frame for the FINAL output coordinates+# (centre -> PCA rotation -> det=+1 -> third-moment axis orientation). Rigid+# transform only; expression, sampling and interpolation logic are untouched.+# Empirically REJECTED on this base (see METHOD.md): d2_shape/scale_log_ratio+# are unchanged by the rigid rotation (scorer's shape alignment is already+# rotation-invariant) and occupancy_dice slightly worsened (0.8247 -> 0.8207),+# shape_scale 56.21 -> 55.97. Submitted OFF per the PLAN criterion; set+# T2_CANONICAL=1 to re-enable the implemented mechanism for comparison.+CANONICAL = os.environ.get("T2_CANONICAL", "0") != "0" MIN_TYPE_CELLS = 5 KNN_K = int(os.environ.get("T2_KNN_K", "25")) N_CLUSTERS = int(os.environ.get("T2_N_CLUSTERS", "10"))@@ -159,6 +168,32 @@ def matched_align(coords_a, coords_b, labels_a, labels_b, X_a, X_b, return aligned_a, aligned_b, info2 +def canonicalize_coords(coords: np.ndarray) -> np.ndarray:+ """Deterministic canonical frame for output coordinates.++ (a) subtract centroid; (b) rotate onto PCA axes (eigenvalues descending,+ computed via symmetric eigh for determinism); (c) if the rotation matrix has+ det=-1, flip the last axis to force det=+1; (d) orient each axis by the sign+ of its third central moment (positive skew points along +axis). Rigid+ transform: pairwise distances and all expression content are unchanged.+ """+ x = np.asarray(coords, dtype=np.float64)+ x = x - x.mean(axis=0)+ cov = (x.T @ x) / max(len(x) - 1, 1)+ evals, evecs = np.linalg.eigh(cov)+ order = np.argsort(-evals)+ rot = evecs[:, order] # columns are PCA axes, descending variance+ if np.linalg.det(rot) < 0:+ rot = rot.copy()+ rot[:, -1] *= -1.0+ y = x @ rot+ for ax in range(y.shape[1]):+ col = y[:, ax]+ if float((col ** 3).mean()) < 0:+ y[:, ax] *= -1.0+ return y++ def cluster_take(coords: np.ndarray, n: int, rng: np.random.Generator) -> np.ndarray: """Greedy k-NN region growth: ~N_CLUSTERS spatially contiguous blocks totalling n cells.""" m = len(coords)@@ -268,7 +303,10 @@ def run(view: str, out: str, seed: int) -> None: n = int(np.clip(sa.n, lo, hi)) idx = take(sa.labels, n, rng) expr = np.asarray(sa.X[idx].todense(), dtype=np.float32)- vio.write_t2(out, expr, sa.coords[idx], genes, seed=seed)+ coords = sa.coords[idx]+ if CANONICAL:+ coords = canonicalize_coords(coords)+ vio.write_t2(out, expr, coords, genes, seed=seed) print(f"[fallback] single anchor stage, n={n}", file=sys.stderr) return @@ -326,6 +364,8 @@ def run(view: str, out: str, seed: int) -> None: ]) coords = np.vstack([ca[ia], cb[ib]]) coords = scale_to_rms(_jitter(coords, rng), target_rms)+ if CANONICAL:+ coords = canonicalize_coords(coords) vio.write_t2(out, expr, coords, genes, seed=seed) print(f"[control] mix n={len(expr)} t={t:.3f}", file=sys.stderr) return@@ -392,6 +432,8 @@ def run(view: str, out: str, seed: int) -> None: expr = np.vstack(expr_parts).astype(np.float32) coords = np.vstack(coord_parts) coords = scale_to_rms(_jitter(coords, rng), target_rms)+ if CANONICAL:+ coords = canonicalize_coords(coords) print( f"[interp] t={t:.3f} n={len(expr)} shared={len(shared)} {shared} " f"interp_cells={n_interp_cells} align={info.get('align')} "
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| 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 |
| k027 | Joint expression-geometry generation with relative geometry | notes/competition/03_solution_landscape.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 在 solution/run.py 最终输出坐标端新增确定性 PCA 规范化函数 canonicalize_coords(减质心→PCA 旋转→det=+1→三阶矩定向),由 T2_CANONICAL 开关控制;对照显示无收益后按 PLAN 判据以默认 OFF 提交,产物与父节点12逐位一致(.X 与 spatial_3D 均 array_equal)。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内(+0.00,66.54,提交配置=父节点) expression_change:噪声内(+0.00,65.25,提交配置=父节点) local_spatial:噪声内(+0.00,64.17,提交配置=父节点) shape_scale:噪声内(+0.00,56.09,提交配置=父节点;Engineer 的 ON 对照中 56.21→55.97,-0.24 也在 T2 约 1 分噪声内但方向为负) |
| family_id | T2HI-01 |
| 假设是否成立 | 否 |
| 经验 |
|
| mechanism_active | 否 |
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 3 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 2 次:bash 1、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 11,982 · 输出 1,029 · 思考 822 |
| 任务(第一行) | 分析节点 n14 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/14/analyst.jsonl 7 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/14/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 19 |
| 工具调用 | 共 20 次:bash 14、edit 3、read 2、write 1 |
| 用时 | 5 分 |
| token 数 | 输入 47,417 · 输出 6,182 · 思考 4,107 |
| 任务(第一行) | 按计划修改程序:PCA 规范化输出坐标系 + 保持 T2HI-01 插值框架 |
| 最后的回答(摘录) | 完成。做了什么、查分结果、下一步: - **做了什么**:按 PLAN 在 T2HI-01 输出坐标端实现确定性 PCA 规范化(减质心→PCA 旋转→det=+1→三阶矩定向,`T2_CANONICAL` 开关),只作用于最终写出的坐标。机制生效证据齐全:坐标全变(质心≈0、协方差对角化、det=+1、三阶矩全正),`.X`/RMS/kNN 结构逐位不变,仅 shape_scale 一组动。 - **查分(A 半,用 2/20)**:ON 62.53(shape_scale 55.97)vs OFF=父节点 62.59(56.21)。机理明确:`d2_shape` 与 `scale_log_ratio` ON/OFF 完全相同(评分器形状对齐本就旋转不变),仅 `occupancy_dice` 0.8247→0.8207 微伤。按 PLAN 判据(提升>1 才提交)**关闭提交**,产物与父节点12逐位一致,vec-check ok、seed 确定。 - **下一步最值得试**:shape_scale 对一切姿态类改法已双双证伪(matched-align、规范化),唯一杠杆是 target_rms 估计(视图内 RMS~log 细胞数/阶段间隔回归,警惕 proxy 非单调 dip 过拟合);cell_state/expr 需换机制(容量约束双向互匹配插值)。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/14/engineer.jsonl 137 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/14/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 1 |
| 工具调用 | 共 0 次:— |
| 用时 | 4 分 |
| token 数 | 输入 13,194 · 输出 1,137 · 思考 8,192 |
| 任务(第一行) | 为节点 n14(改进,父节点 n12)写改进计划 PLAN.json |
| 最后的回答(摘录) | 10→12)的 shape_scale 停滞在 56.09,是四组中最低分。ANALYSIS 指出 shape_scale 的主惩罚来源是 target_rms 估计偏差(log-线性给 346,真值≈217,scale_log_ratio≈0.467),且对齐类改法已饱和(matched-align 在 node12 被证伪)。但文献库 k026 指出一个尚未尝试的结构性问题:形状指标对点云做 PCA 对齐但不固定行列式,因此同一次预测的旋转/手性翻转可能改变形状分。当前 node10 系从未做过坐标规范化(canonicalisation),这个方差源仍然存在。通过规范化自身输出的坐标系(减质心→旋转到 PCA 轴→强制 det=+1→三阶矩定向),可以消除评分器引入的额外形状方差,而不改变预测内容的内在结构。预期对 shape_scale 有正向影响(减少随机旋转带来的分数损失)。", "approach": "步骤:\n1. 在 solution/run.py 的预测坐标输出端(写文件之前)新增一个坐标规范化函数:(a) 减去质心;(b) 对预测坐标做 PCA,旋转到主成分轴;(c) 计算旋转矩阵行列式,若为 -1 则将最后一个轴乘以 -1 使 det=+1;(d) 用第三阶矩(第三中心矩)的符号翻转每个轴,使方向唯一确定。\n2. 该函数只在最终输出坐标上应用一次,不影响对齐、插值、抽样等中间步骤。\n3. 对照开关 T2_CANONICAL=0(默认1),关闭时行为与当前父节点完全一致(跳过规范化步骤)。\n4. 先小样本验证:跑一次 proxy,确认 vec-check 通过、输出文件非空、规范化前后坐标确实不同(旋转变化)但基因表达不变。\n5. 用 vec-score 查分比较 shape_scale 是否提升 > 1 分。若提升则提交;若未提升或下降,检查是否规范化引入了问题(例如 PCA 轴与形状指标期望不一致),再回退关闭。\n6. 不改动任何插值逻辑(INTERP_ENABLED, EXPR_INTERP, COORD_MODE, KNN_K, N_CLUSTERS 等全部保持父节点默认值),只加规范化后处理。\n单输入阶段退路:单阶段时坐标仍来自同一阶段,规范化逻辑不变,无额外依赖。\nvec-score 快速筛选:只需一次查询即可判断(规范化是确定性变换,无随机性),若 shape_scale 提升 > 1 即有效。", "expected_groups": ["shape_scale"], "risks": "风险1:规范化可能恰好把形状指标期望的手性方向反过来了(例如评分器内部 PCA 的 det 习惯与规范化不一致),导致 shape_scale 反而下降。Engineer 应在第一次查分后立刻比较 shape_scale 前后差异,若下降 > 1 分则关闭规范化并提交父节点。\n风险2:PCA 轴在三阶矩定向时若数据分布对称导致符号不确定,可能产生微小抖动,但这在规范化的设计内,影响极小。\n风险3:只影响 shape_scale,其他三组应不变;若出现其他组变化,说明规范化影响了坐标结构(不应发生,因为只是刚体变换)。", "family_id": "T2HI-01", "mechanism": "在最终预测坐标上应用确定性坐标规范化(减质心→PCA 旋转→det=+1→三阶矩定向),消除评分器 PCA 对齐中因旋转/手性自由度引入的形状分方差。", "vs_constant_shift": "这是坐标系的刚体旋转与手性固定,不是每型常数位移(每细胞位移随其坐标位置而异,质心被减掉后旋转矩阵作用于所有细胞),也不是全局组成重加权(细胞数、类型配额、表达值完全不变)。", "mechanism_evidence": "Engineer 应比较规范化前后的坐标:(1) 质心应变为 (0,0,0);(2) 协方差矩阵应变为对角(PCA 轴);(3) 旋转矩阵行列式应为 +1;(4) 四组分中只有 shape_scale 应变化,其余三组应不变(因为是刚体变换,不影响表达、邻域距离的相对值)。若规范化后 shape_scale 提升 > 1 分,说明之前确实存在旋转/手性方差损失。", "mechanism_off_control": "设 T2_CANONICAL=0 时,跳过规范化步骤,输出坐标与当前父节点12完全一致(应验证 array_equal)。预期差别:规范化关闭时 shape_scale 保持在 56.09,开启后应有变化(提升或下降,取决于手性是否匹配评分器期望)。若开启后分数不变,说明规范化对该组无影响,可回退关闭。", "sources": []} ``` |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/14/researcher.jsonl 5 KB /home/spark-longxinyang/vec/runs/formal/20261003-043412-search-t2-heart-interp-g24-D-s1/nodes/14/researcher.stderr |