eis/eqpalg/algs/roller3.h

94 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 {
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:
AlarmInfo doMonProc() override;
int init() override;
virtual AlarmInfo mon_proc() override;
std::vector<AlarmInfo> exec_task(mix_cc::time_range_t time_range) override;
private:
double limit_error_;
double limit_warn_;
double median_;
vector<double> deviations_;
vector<double> values_;
vector<int> tag_seq_;
string tags_exp_;
int value_num_ = 0;
vector<int>
is_zero_list_;
std::map<int, HoldState::StateInfo> state_info_map_;
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);
};