2026-05-09 11:23:45 +08:00
|
|
|
|
#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 <array>
|
|
|
|
|
|
#include <eqpalg/algs/exp_base.h>
|
|
|
|
|
|
#include <eqpalg/define/public.h>
|
|
|
|
|
|
#include <map>
|
|
|
|
|
|
#include <utility>
|
|
|
|
|
|
namespace HoldState {
|
|
|
|
|
|
|
|
|
|
|
|
enum class AlarmState { None = 0, DownLower, UpHigher };
|
|
|
|
|
|
enum class AlarmType { Warn = 0, Error };
|
|
|
|
|
|
struct StateInfo {
|
2026-05-09 13:30:09 +08:00
|
|
|
|
TimePoint last_start_time = std::chrono::system_clock::now();
|
2026-05-09 11:23:45 +08:00
|
|
|
|
AlarmState last_alarm_tate =
|
2026-05-09 13:30:09 +08:00
|
|
|
|
AlarmState::None;
|
|
|
|
|
|
AlarmType alarm_type = AlarmType::Error;
|
2026-05-09 11:23:45 +08:00
|
|
|
|
};
|
2026-05-09 13:30:09 +08:00
|
|
|
|
}
|
2026-05-09 11:23:45 +08:00
|
|
|
|
|
|
|
|
|
|
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<AlarmInfo> exec_task(mix_cc::time_range_t time_range) override;
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
2026-05-09 13:30:09 +08:00
|
|
|
|
double limit_error_;
|
|
|
|
|
|
double limit_warn_;
|
|
|
|
|
|
double median_;
|
|
|
|
|
|
vector<double> deviations_;
|
|
|
|
|
|
vector<double> values_;
|
|
|
|
|
|
vector<int> tag_seq_;
|
2026-05-09 11:23:45 +08:00
|
|
|
|
string tags_exp_;
|
2026-05-09 13:30:09 +08:00
|
|
|
|
int value_num_ = 0;
|
2026-05-09 11:23:45 +08:00
|
|
|
|
vector<int>
|
2026-05-09 13:30:09 +08:00
|
|
|
|
is_zero_list_;
|
|
|
|
|
|
std::map<int, HoldState::StateInfo> state_info_map_;
|
2026-05-09 11:23:45 +08:00
|
|
|
|
private:
|
|
|
|
|
|
int init_X_exp();
|
|
|
|
|
|
void print_load_content();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief
|
|
|
|
|
|
* @param expr My Param doc
|
|
|
|
|
|
* @return vector<int>
|
|
|
|
|
|
*/
|
|
|
|
|
|
vector<int> extractTagNumbers(const string &expr);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 计算数组的中位数
|
|
|
|
|
|
* @param data My Param doc
|
|
|
|
|
|
* @return double
|
|
|
|
|
|
*/
|
|
|
|
|
|
double calculateMedian(std::vector<double> data);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 计算数组的max,返回max数据的下标和值
|
|
|
|
|
|
*/
|
|
|
|
|
|
std::pair<int, double> findMaxWithIndex(const std::vector<double> &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);
|
|
|
|
|
|
};
|