From 1e781a7c0383bf80e63ab809578b6a619ab402b0 Mon Sep 17 00:00:00 2001 From: Huamonarch Date: Wed, 13 May 2026 16:56:30 +0800 Subject: [PATCH] feat: add ! negation operator for boolean models Prefix any boolean model reference with ! to negate its output. Works with all boolean models: !toggle_2s, !valve_px_std:toggle_2s, !bool_50, etc. --- TestProject/RNG/README.md | 1 + TestProject/RNG/model/ModelRegistry.cc | 6 ++++++ TestProject/RNG/model/NotModel.h | 13 +++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 TestProject/RNG/model/NotModel.h diff --git a/TestProject/RNG/README.md b/TestProject/RNG/README.md index fc5c9fb..ae0f968 100644 --- a/TestProject/RNG/README.md +++ b/TestProject/RNG/README.md @@ -66,6 +66,7 @@ make -j$(nproc) | `csv:文件:列号` | 内联 CSV 数据回放 | `csv:spbdata:1` | | `基模型+噪声模型` | 组合模型(叠加噪声) | `linear_slow+normal_tiny` | | `pair模型:动作模型` | 阀到位传感器引用动作信号 | `valve_px_std:toggle_2s` | +| `!模型引用` | 布尔量取反 | `!toggle_2s` | | 空或 `default` | 默认模型 `normal_tiny` | — | ## 模型参考 diff --git a/TestProject/RNG/model/ModelRegistry.cc b/TestProject/RNG/model/ModelRegistry.cc index f2bacb7..845099f 100644 --- a/TestProject/RNG/model/ModelRegistry.cc +++ b/TestProject/RNG/model/ModelRegistry.cc @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,11 @@ void ModelRegistry::loadModels(const std::string& jsonPath) { } std::unique_ptr ModelRegistry::createModel(const std::string& modelName, float defaultVal) { + // Negation: !model + if (!modelName.empty() && modelName[0] == '!') { + return std::make_unique(createModel(modelName.substr(1), defaultVal)); + } + // Composite: base+noise auto plusPos = modelName.find('+'); if (plusPos != std::string::npos) { diff --git a/TestProject/RNG/model/NotModel.h b/TestProject/RNG/model/NotModel.h new file mode 100644 index 0000000..5fdf292 --- /dev/null +++ b/TestProject/RNG/model/NotModel.h @@ -0,0 +1,13 @@ +#pragma once +#include +#include + +struct NotModel : IModel { + std::unique_ptr inner; + + NotModel(std::unique_ptr m) : inner(std::move(m)) {} + + bool evaluateBool(size_t t) override { return !inner->evaluateBool(t); } + + void linkPeers(ModelRegistry& reg) override { inner->linkPeers(reg); } +};