feat: 添加 ExpressionEngine 头文件声明

This commit is contained in:
Huamonarch 2026-05-15 12:17:27 +08:00
parent ec8e44ce5d
commit 2f7ca1e123

View File

@ -0,0 +1,119 @@
// eqpalg/utility/expression_engine.h
#pragma once
#include <chrono>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include <Eigen/Dense>
#include <eqpalg/utility/HoldTime.h>
#include <eqpalg/utility/StatExp.hpp>
#include <eqpalg/utility/VarsCache.hpp>
#include <mix_cc/matheval/matheval.hpp>
#include <mix_cc/type/mix_time.h>
using MExp = mix_cc::matheval::Expression;
using TimePoint = std::chrono::system_clock::time_point;
/**
* @brief
*
* FunVars
* /IHDBhold
*
* ExpModule + ExpBase is_exp_alg_
*/
class ExpressionEngine {
public:
/**
* @param mm_vars AlgBase
* @param m_tags tag AlgBase
*/
ExpressionEngine(std::map<std::string, double>& mm_vars,
std::vector<std::string>& m_tags);
~ExpressionEngine() = default;
// 禁止拷贝/移动
ExpressionEngine(const ExpressionEngine&) = delete;
ExpressionEngine& operator=(const ExpressionEngine&) = delete;
// ========== 表达式注册 ==========
/**
* @brief FunVars
* @param name ("act", "feedback", "result", "pre_result", ...)
* @param raw_exp_str KeepC(tag1,1)
* @return 0 -1
*/
int registerExpression(const std::string& name, const std::string& raw_exp_str);
/**
* @brief FunVars
*/
int registerRawExpression(const std::string& name, const std::string& raw_exp_str);
// ========== 表达式求值 ==========
double evaluate(const std::string& name);
bool evaluateBool(const std::string& name);
/**
* @brief map
*/
std::map<std::string, double>& vars() { return mm_vars_; }
// ========== 每周期数据刷新 ==========
void refreshFromMemory(const TimePoint& now_time,
mix_cc::time_range_t& query_time_range);
void refreshFromIhdRow(int row,
const Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>& queried_data,
const std::vector<TimePoint>& queried_time,
TimePoint& now_time,
mix_cc::time_range_t& query_time_range);
int firstFill(int data_source, TimePoint& now_time,
mix_cc::time_range_t& query_time_range);
// ========== FunVars 控制 ==========
void autoResetFunVars();
void markFunVarsNeedReset();
void forceResetFunVars();
// ========== hold 变量 ==========
void refreshHoldVars();
// ========== 调试 ==========
void printVars(const std::string& exp_str = "");
private:
std::map<std::string, double>& mm_vars_;
std::vector<std::string>& m_tags_;
StatExp::FunVars fun_vars_;
bool fun_vars_need_reset_ = false;
// 表达式注册表
struct ExpEntry {
std::string raw_str;
std::string processed_str;
std::unique_ptr<MExp> ptr;
};
std::map<std::string, ExpEntry> exps_;
// hold(n,T) 变量
std::map<std::string, std::unique_ptr<HoldTime>> hold_times_;
VarsCache var_cache_;
static constexpr size_t PV_NUM = 6;
// 内部辅助
int initHoldExpStr(const std::string& exp_str);
};