#pragma once /** * @file roller3.h * @brief 多变量,离群检测 * @author your name (you@domain.com) * @version 0.1 * @date 2026-01-12 * * Copyright: Baosight Co. Ltd. * DO NOT COPY/USE WITHOUT PERMISSION * */ #include #include #include #include #include namespace HoldState { enum class AlarmState { None = 0, DownLower, UpHigher }; enum class AlarmType { Warn = 0, Error }; struct StateInfo { TimePoint last_start_time = std::chrono::system_clock::now(); AlarmState last_alarm_tate = AlarmState::None; AlarmType alarm_type = AlarmType::Error; }; } using std::string; class Roller3 : public ExpBase { public: Roller3(const string &name, const mix_cc::json &rule_json, const string &ruleId, size_t exp_type); virtual ~Roller3(); public: int init() override; virtual AlarmInfo mon_proc() override; std::vector exec_task(mix_cc::time_range_t time_range) override; private: double limit_error_; double limit_warn_; double median_; vector deviations_; vector values_; vector tag_seq_; string tags_exp_; int value_num_ = 0; vector is_zero_list_; std::map state_info_map_; private: int init_X_exp(); void print_load_content(); /** * @brief * @param expr My Param doc * @return vector */ vector extractTagNumbers(const string &expr); /** * @brief 计算数组的中位数 * @param data My Param doc * @return double */ double calculateMedian(std::vector data); /** * @brief 计算数组的max,返回max数据的下标和值 */ std::pair findMaxWithIndex(const std::vector &vec); /** * @brief Get the up down object * @param value My Param doc * @param is_up 是否区间上限 * @return double */ double get_up_down(const double &value, bool is_up); /** * @brief 检测数据超阈值情况 * @param value 数据值 * @return AlarmState None = 0, DownLower, median_ */ HoldState::AlarmState detect_up_down(const double &value); };