# SINDy 与 SR 执行计划

## 文档作用

这份文档只回答一件事：**接下来要做什么。**

- 只写执行路线、阶段目标、优先级、输出要求
- 不长篇复述历史争论
- 不把背景知识和任务顺序混在一起
- 凡是历史 bug、经验教训、哪些结论已经成立、哪些还不能说，统一放到 `sindy_sr_knowladge`

---

## 当前总目标

把 **所有 cloak 场景** 纳入同一受约束分析框架，使用 **SINDy + SR 并行** 探索控制骨架，先分别拟合，再横向比较，从而判断：

- 哪些项是 shared core
- 哪些项是 scene-specific activation
- 哪些差异来自时间尺度写法，而不是物理骨架本身

当前默认路线不是“先强行做统一总公式”，而是：

\[
\text{separate fit} \rightarrow \text{compare} \rightarrow \text{shared-backbone test}
\]

---

## 当前工作原则

后续默认遵守：

1. **所有场景共用同一套 primitive variables 与同一套 \(G\) 规则**
2. **front 默认 no-bias + odd structure**
3. **rear 默认 shared-head**
4. **SINDy 与 SR 并行推进**，SR 不是替换 SINDy，而是并行工具
5. **先分场景拟合，再做横向比较**
6. **闭环验证不可省略**，但不要求每个场景第一轮都做全套闭环
7. **时间尺度问题必须显式进入特征定义**
8. **不再只围绕跨 Re 的 Kármán 单线深挖**；跨 Re 现在是已站住的第一证据，不是全部主线
9. **当前不讨论功率与能量分析**，这不是这条线的优先任务
10. **当前不把时延作为主要矛盾**；对稳定周期控制，当前第一矛盾是变量骨架与时间尺度写法

---

## 当前场景优先级

### 第一层：本轮重点场景

- Kármán cloak
- steady cloak

这两个场景本轮必须做完整输出，因为它们最适合先建立场景间比较模板。

### 第二层：下一轮扩展场景

- 单涡 cloak（monopole / taylor / lamb 等已有单涡场景）
- erase
- 其他已有 cloak 场景

这批先做轻量版 separate fit，再决定哪些值得补完整闭环与深挖。

---

## 阶段 0

## 统一接口

### 0.1 统一 primitive variables

所有场景统一输出：

- 无量纲 sensor：\(\hat u, \hat v\)
- 力系数：\(C_D, C_L\)
- 无量纲动作：\(\alpha\)
- lagged \(\alpha\)
- \(\Delta \alpha\) 或显式含 \(\Delta t_c\) 的版本
- \(\mu = 1/Re_D\)
- scene metadata：scene id、\(Re_D\)、control interval \(\Delta t_c\)、target type、采样设置

### 0.2 固定 \(G\) 算子

统一使用同一套 \(G\) 规则，不允许不同场景临时改写。动作必须满足：

\[
(\alpha_F,\alpha_T,\alpha_B) \mapsto (-\alpha_F,-\alpha_B,-\alpha_T)
\]

### 0.3 统一 feature builder

统一生成三层特征：

| 层级 | 内容 | 用途 |
|---|---|---|
| core | \(\hat u, \hat v, C_D, C_L, \alpha^-, \Delta\alpha^-, \mu\) | 所有场景共用 |
| derived | 对称/反对称组合、总量/差量 | SINDy 主库 |
| time-scale | 显式含 \(\Delta t_c\) 的版本 | 时间尺度分析 |

### 0.4 必做测试

任何场景进入拟合前，先过：

- \(G(G(x)) = x\)
- feature names 与矩阵列顺序一致
- 闭环预测器输入维度一致
- front / rear 的结构约束在数据接口层正确落地

### 阶段 0 输出

- 统一 `feature_builder`
- 统一 `symmetry`
- 统一 `time_scale`
- 统一 `validators`
- 场景级最小数据摘要（样本数、变量范围、control interval）

---

## 阶段 1

## Kármán 与 steady 的第一轮 separate SINDy

### 目标

在统一变量与统一约束下，先得到两个重点场景各自最可信的稀疏 support。

### 默认约束

- front no-bias
- front odd structure
- rear shared-head
- correct \(G\) consistency

### 每个场景必须输出

| 输出 | 说明 |
|---|---|
| best support | 最优 support 列表 |
| sparsity curve | 稀疏度-误差曲线 |
| front / rear 主项表 | 主导项与系数 |
| one-step metrics | R²、RMSE |
| key closed-loop result | 至少一个关键闭环指标 |
| support stability | threshold / window / bootstrap 稳定性 |
| contribution table | 主要项贡献度，不只看是否出现 |

### 本阶段比较项

Kármán 与 steady 做第一轮 support overlap：

- 哪些项共同出现
- 哪些项只在 Kármán 激活
- steady 是否表现为明显简化版
- overlap 不能只看布尔出现，还要看贡献量级与稳定性

---

## 阶段 2

## Kármán 与 steady 的第一轮受限 SR

### 目标

不是追求最终公式，而是看：

- 在受限物理库上，是否能压出更短闭式
- SINDy 中看似不同的项，是否会被更统一的表达吸收
- Kármán 与 steady 是否出现同形公式

### SR 输入规则

SR 只能使用：

- 阶段 0 的统一变量
- 阶段 1 的 SINDy 已筛出主项及其邻近项
- 受限运算集合

### 当前允许的运算

- 加减乘
- protected divide
- 少量 square
- 必要时有限放开 tanh

### 当前不允许的运算

- raw trig 乱搜
- 高次幂
- 指数
- 深层嵌套

### 每个场景必须输出

| 输出 | 说明 |
|---|---|
| shortest acceptable formula | 最短可接受公式 |
| complexity-error pareto | 复杂度 vs 误差 |
| 和 SINDy 的关系 | 压缩了什么、保留了什么、吸收了什么 |
| key closed-loop result | 最佳 SR 公式至少一版关键闭环 |
| formula family notes | 同一场景内是否存在多种同等可接受闭式 |

---

## 阶段 3

## 横向比较

当 Kármán 与 steady 的 SINDy + SR 都出来后，立即做横向比较。

### 3.1 support 比较

不要只看“是否出现”，必须同时看：

- 是否出现
- 系数或贡献量级
- 稳定性
- SR 是否把它吸收到更高层表达里

### 3.2 公式形态比较

至少检查：

- 是否都包含同类 force feedback 核心
- 是否都包含同类 memory 核心
- steady 是否只是删掉了周期相关项
- 是否存在同形结构 + 少量场景激活项

### 3.3 第一轮 shared-backbone 判断

这一轮只回答：

1. 是否存在 Kármán 与 steady 的 shared core
2. steady 是否可以视为 Kármán 的明显简化版
3. 哪些项更像 scene-specific activation，而不是 backbone 本身

本阶段不急着拟合 all-cloak 联合总公式。

---

## 阶段 4

## 扩展到单涡与其他 cloak

在 Kármán 与 steady 的第一轮比较完成后，再把单涡 cloak 与其他场景纳入。

### 轻量版输出要求

- separate SINDy
- separate SR
- one-step metrics
- support 形态
- 必要时补关键闭环

### 比较目标

重点看：

- 单涡是否保留 shared core
- 单涡是否主要新增 history / transient 项
- 是否开始出现子家族结构

---

## 阶段 5

## 时间尺度显式化

这条线并行推进，但先不抢在全部场景前面。

### 当前目标

- 让 \(\Delta t_c\) 显式进入特征
- 不再把“1 个采样步”默认当物理可比量
- 比较显式化前后，support 是否更收敛
- 为后面严肃讨论采样率影响扫清接口问题

### 第一批测试场景

- Kármán cloak
- steady cloak

### 第一批对比内容

- 旧的 discrete lag / \(\Delta a\)
- 显式含 \(\Delta t_c\) 的版本

### 关注结果

- support 是否变化
- SR 公式是否更统一
- 跨场景比较是否更干净

注意：当前阶段的目标是**时间尺度显式化**，不是立刻给出高采样率优于 PPO 的最终结论。

---

## 本轮必须完成的最小任务

1. 统一 Kármán 与 steady 的 feature builder
2. 统一 Kármán 与 steady 的 \(G\) / time-scale / validators
3. 跑 Kármán 与 steady 的第一轮 separate SINDy
4. 跑 Kármán 与 steady 的第一轮受限 SR（PySR）
5. 输出 Kármán vs steady 的：
   - support overlap
   - 公式形态比较
   - shared core / scene-specific 的初步分类

---

## 本轮结束时应交付的结果包

每个重点场景至少有一张 summary 表：

| method | sparsity | one-step | closed-loop | key terms | notes |
|---|---:|---:|---:|---|---|
| SINDy |  |  |  |  |  |
| SR |  |  |  |  |  |

以及一个跨场景比较表：

| comparison | shared core | scene-enhanced | scene-specific | notes |
|---|---|---|---|---|
| Kármán vs steady |  |  |  |  |

---

## 当前不该做的事

- 不继续围绕单一 Kármán across Re 版本号升级
- 不把 threshold 网格或简单 Pareto 扫描直接当成完整 SR
- 不在 raw feature 上做自由 SR
- 不在不同采样间隔下直接复用旧系数并据此下正式结论
- 不在场景比较证据还弱时，提前宣布 all-cloak 统一总公式
- 不把功率、能量、时延这些非当前主矛盾问题拉入本轮 SINDy/SR 主线

---

## 当前这份 notes 的直接收束

接下来核心任务不是“继续优化某个跨 Re 模型”，而是：

\[
\boxed{
\text{把 Kármán 与 steady 先做成可比较的 separate SINDy + separate SR 结果包，然后以它们为模板扩到单涡与其他 cloak。}
}
\]

这一步完成后，才进入更严肃的 all-cloak shared-backbone 判断。