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 +}