From 50173683db5ef7f972eace09b23ba41e01a6f4a1 Mon Sep 17 00:00:00 2001 From: Huamonarch Date: Fri, 15 May 2026 12:27:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ExpressionEngine=20=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E5=AE=9E=E7=8E=B0=EF=BC=88MEMORY=20+=20IHDB?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eqpalg/utility/expression_engine.cpp | 74 ++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/eqpalg/utility/expression_engine.cpp b/eqpalg/utility/expression_engine.cpp index 0260c29..f66c9b6 100644 --- a/eqpalg/utility/expression_engine.cpp +++ b/eqpalg/utility/expression_engine.cpp @@ -70,3 +70,77 @@ bool ExpressionEngine::evaluateBool(const std::string& name) { int ExpressionEngine::initHoldExpStr(const std::string& exp_str) { return 0; // stub — Task 5 will implement } + +void ExpressionEngine::refreshFromMemory( + const TimePoint& now_time, + mix_cc::time_range_t& query_time_range) { + + ensureVarCache(var_cache_, m_tags_.size()); + + for (size_t i = 0; i < m_tags_.size(); i++) { + double current = + SingletonTemplate::GetInstance()[m_tags_[i]]; + + // pN = 旧 tagN + mm_vars_[var_cache_.p_keys[i]] = mm_vars_[var_cache_.tag_keys[i]]; + // tagN = 当前值 + mm_vars_[var_cache_.tag_keys[i]] = current; + + // pvN 历史移位 + for (size_t j = PV_NUM - 1; j > 0; j--) { + mm_vars_[var_cache_.pv_keys[i][j]] = + mm_vars_[var_cache_.pv_keys[i][j - 1]]; + } + mm_vars_[var_cache_.pv_keys[i][0]] = current; + } + + mm_vars_["now"] = std::chrono::duration_cast( + now_time.time_since_epoch()) + .count(); + + fun_vars_.refresh_fun_vars(false, &mm_vars_); + query_time_range.set_right(now_time); + refreshHoldVars(); +} + +void ExpressionEngine::refreshFromIhdRow( + int row, + const Eigen::Matrix& queried_data, + const std::vector& queried_time, + TimePoint& now_time, + mix_cc::time_range_t& query_time_range) { + + if (queried_data.rows() == 0 || queried_data.cols() == 0) return; + if (row < 0 || row >= queried_data.rows()) return; + if (static_cast(m_tags_.size()) > queried_data.cols()) return; + + ensureVarCache(var_cache_, m_tags_.size()); + + for (size_t i = 0; i < m_tags_.size(); i++) { + // pN = 旧 tagN + mm_vars_[var_cache_.p_keys[i]] = mm_vars_[var_cache_.tag_keys[i]]; + // tagN = 当前行数据 + mm_vars_[var_cache_.tag_keys[i]] = queried_data(row, i); + + // pvN 历史移位 + for (size_t j = PV_NUM - 1; j > 0; j--) { + mm_vars_[var_cache_.pv_keys[i][j]] = + mm_vars_[var_cache_.pv_keys[i][j - 1]]; + } + mm_vars_[var_cache_.pv_keys[i][0]] = + mm_vars_[var_cache_.tag_keys[i]]; + } + + mm_vars_["now"] = + mix_cc::mix_time_t(queried_time[row]).to_milliseconds(); + + now_time = queried_time[row]; + query_time_range.set_right(queried_time[row]); + + fun_vars_.refresh_fun_vars(false, &mm_vars_); + refreshHoldVars(); +} + +void ExpressionEngine::refreshHoldVars() { + // stub — Task 5 will implement +}