eis/TestProject/RNG/CHANGELOG.md

120 lines
4.1 KiB
Markdown
Raw Normal View History

# RNG 改动日志
**日期**2026-05-13
**范围**`TestProject/RNG/` 全部改动
**目标**:将硬编码的信号→数据源映射重构为 JSON 配置驱动的参数化模型架构
---
## 概览
| 类别 | 数量 |
|------|------|
| 新增文件 | 20 |
| 修改文件 | 5 |
| 删除文件 | 1 |
| 总行数变化 | +955 / -244 |
---
## 新增文件
| 文件 | 职责 |
|------|------|
| `json/rng_models.json` | 17 个预定义模型模板 |
| `model/IModel.h` | 模型基类接口evaluate / evaluateBool / linkPeers / reset |
| `model/ConstantModel.h` | 固定值 y = c |
| `model/NormalModel.h` | 正态分布 y = μ + σ·N(0,1) |
| `model/LinearModel.h` | 线性变化 y = k·t + b支持 period_ms 周期取模 |
| `model/SineModel.h` | 正弦波 y = A·sin(ω·t + φ) + offset |
| `model/UniformModel.h` | 均匀随机 y = center ± delta |
| `model/SpikeModel.h` | 随机毛刺注入(概率 × 幅值) |
| `model/DriftModel.h` | 线性漂移 y = base + rate·t支持 period_ms 周期取模 |
| `model/CsvReplayModel.h` | CSV 历史数据模拟量回放 |
| `model/BoolRandomModel.h` | 概率随机布尔 |
| `model/BoolToggleModel.h` | 固定周期翻转布尔 |
| `model/BoolCsvModel.h` | CSV 历史数据布尔回放 |
| `model/ValvePairModel.h` | 阀动作→到位传感器时序仿真(四态状态机) |
| `model/NotModel.h` | 布尔量取反包装器(`!` 前缀) |
| `model/CompositeModel.h` | base + noise 组合模型(`+` 前缀) |
| `model/ModelRegistry.h` | 工厂注册表声明单例、模型注册、tables[1] 解析) |
| `model/ModelRegistry.cc` | 工厂注册表实现JSON 加载、12 种模式注册、语法解析、valve_pair 关联) |
| `README.md` | 完整项目文档 |
---
## 修改文件
| 文件 | 改动内容 |
|------|----------|
| `Generator.h` | 新增 `ModelRegistry& registry` 引用成员 |
| `Generator.cc` | 删除 ~150 行硬编码 if-else 链和 10 个全局 CSV 变量;替换为三遍扫描(创建→链接→求值) |
| `RNG.cc` | 启动时加载 `rng_models.json`,带 try-catch 保护 |
| `CMakeLists.txt` | 新增 `aux_source_directory(./model MODEL_DIR)` |
| `read_csv.hpp` | 修复:`is_same_v` 加 `std::` 前缀;`std::exit(1)` 改为 `throw std::runtime_error`;移除重复 `#pragma once` |
---
## 删除文件
| 文件 | 原因 |
|------|------|
| `BaseData.h` | 仅被旧 Generator.cc 使用,重构后无引用 |
---
## 同时修改的外部文件
| 文件 | 改动 | 原因 |
|------|------|------|
| `RandT.h` (TestProject/RNG/) | `sqrt(sigma)``sigma` | 修正标准差语义:参数含义从方差改为标准差 |
---
## 架构变更
### 旧架构
```
RNG_icei → Generator::wtite_in_shm()
├─ if (item == "BR1_1_V_act") → 硬编码 CSV 列
├─ else if (item == "BR2_2_I_act") → 硬编码 CSV 列
├─ ... 150+ 行 strcmp 链
└─ else → RandT::RandT(-0.01, 0.01)
```
### 新架构
```
rng_models.json ──────────┐
├─ ModelRegistry → 12 个 IModel 子类
DB2 T_LOV_FDAAITEM ──────┘ │
tables[1] 字段 │ getOrCreate(spec, defaultVal, itemName)
RNG_icei → Generator::wtite_in_shm()
├─ Pass 1: 创建模型实例 (per signal key)
├─ Pass 2: 链接 valve_pair → 动作信号
└─ Pass 3: model->evaluate(t) / evaluateBool(t)
```
---
## tables[1] 语法
| 格式 | 含义 |
|------|------|
| `模型名` | 引用 JSON 中的模型模板 |
| `csv:文件:列号` | 内联 CSV 数据回放 |
| `基模型+噪声模型` | 组合模型 |
| `pair模型:动作模型` | 阀到位传感器引用动作信号 |
| `!模型引用` | 布尔量取反 |
| 空 / `default` | 默认 `normal_tiny` |
---
## 可复用设计
新增模型只需三步,不改现有代码:
1. 创建 `model/NewModel.h`,继承 `IModel`,实现 `evaluate()``evaluateBool()`
2.`ModelRegistry.cc` 构造函数中加一行 `registerMode(...)`
3.`rng_models.json` 中添加模板(可选)