eis/TestProject/RNG/CHANGELOG.md

120 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` 中添加模板(可选)