将 ExpBase::cron_proc() 中的 DAA::STA 统计学习逻辑提取到独立的
StatCollector 工具类,统一管理分布统计的生命周期(样本累积、分布
初始化、DB2 持久化、置信区间更新)。同时将 exec_task() 与
task_mon_pro() 中的任务相关 STA 操作也委托给 StatCollector。
新增:
- eqpalg/utility/stat_collector.h -- StatCollector 接口
- eqpalg/utility/stat_collector.cpp -- StatCollector 实现
修改:
- eqpalg/algs/exp_base.h -- 替换 sta_ptr_ 为 stat_collector_
- eqpalg/algs/exp_base.cpp -- cron_proc/reload_ci_dist/reset_dev_data/
exec_task/task_mon_pro 委托给 StatCollector
95 lines
2.7 KiB
C++
95 lines
2.7 KiB
C++
// eqpalg/utility/stat_collector.h
|
||
#pragma once
|
||
|
||
#include <chrono>
|
||
#include <memory>
|
||
#include <string>
|
||
#include <vector>
|
||
|
||
// 前向声明
|
||
namespace DAA { class STA; }
|
||
|
||
using TimePoint = std::chrono::system_clock::time_point;
|
||
|
||
/**
|
||
* @brief 统计学习收集器
|
||
*
|
||
* 管理 DAA::STA 分布统计的生命周期:
|
||
* - 样本累积(dist_add)
|
||
* - 分布初始化与 DB2 持久化
|
||
* - 置信区间更新
|
||
*/
|
||
class StatCollector {
|
||
public:
|
||
StatCollector() = default;
|
||
~StatCollector();
|
||
|
||
/**
|
||
* @brief 配置统计收集器
|
||
* @param ruleId 规则 ID
|
||
* @param ruleName 规则名称
|
||
* @param distMode 分布模式(0=手动, 1=在线, 2=离线)
|
||
* @param isLearning 是否启用自学习
|
||
*/
|
||
void configure(const std::string& ruleId, const std::string& ruleName,
|
||
int distMode, bool isLearning);
|
||
|
||
/**
|
||
* @brief cron 进程:从共享内存获取累积样本,更新分布并持久化
|
||
* @param statValues 累积的样本值
|
||
* @param now 当前时间
|
||
* @param cronDelayHours cron 更新延迟(小时)
|
||
* @param lastLoadTime [in/out] 上次加载时间
|
||
* @return 处理的样本数量
|
||
*/
|
||
int processCron(const std::vector<double>& statValues,
|
||
TimePoint now, int cronDelayHours,
|
||
TimePoint& lastLoadTime);
|
||
|
||
/**
|
||
* @brief 加载置信区间到上下限
|
||
* @param limitDown [out] 新的下限
|
||
* @param limitUp [out] 新的上限
|
||
* @param now 当前时间
|
||
* @param lastLoadTime [out] 更新时间
|
||
* @return true 成功加载新区间
|
||
*/
|
||
bool reloadCiDist(double& limitDown, double& limitUp,
|
||
TimePoint now, TimePoint& lastLoadTime);
|
||
|
||
/**
|
||
* @brief 删除统计数据和重置
|
||
*/
|
||
void reset(const std::string& ruleId);
|
||
|
||
bool isConfigured() const { return configured_; }
|
||
|
||
// ---- task 进程专用接口 ----
|
||
|
||
/** @brief 确保 STA 实例已初始化(惰性初始化) */
|
||
void ensureInitialized();
|
||
|
||
/** @brief 重置累积数据,供新 task 使用 */
|
||
void resetData();
|
||
|
||
/** @brief 向分布添加单个值 */
|
||
void distAdd(double value);
|
||
|
||
/** @brief 将 task 结果存储到 DB2 (T_SAMPLE_STAT) */
|
||
bool taskStoreDb2(const std::string& sampleId);
|
||
|
||
/** @brief 获取样本统计字符串,用于 T_SAMPLE_MAG */
|
||
std::string getSampleStatStr();
|
||
|
||
/** @brief 向运行统计中添加值 */
|
||
void runningStatAdd(double value);
|
||
|
||
private:
|
||
std::unique_ptr<DAA::STA> sta_ptr_;
|
||
std::string rule_id_;
|
||
std::string rule_name_;
|
||
int dist_mode_ = 0;
|
||
bool is_learning_ = true;
|
||
bool configured_ = false;
|
||
};
|