eis/eqpalg/.do_not_use/no_need/br_temp_fit.cpp

143 lines
4.9 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.

#include <mix_cc/ihyper_db/set_record.h>
#include <eqpalg/algs/br_temp_fit.h>
#include <eqpalg/utility/build_alarm_info.h>
#include <vector>
#include <string>
int BrTempFit::init() {
int ret = 0;
try {
this->data_source_ = DataSource::IHDB;
} catch (const std::exception& e) {
std::throw_with_nested(
mix_cc::Exception(-1, "load error", BOOST_CURRENT_LOCATION));
ret = -1;
}
return ret;
}
std::vector<AlarmInfo> BrTempFit::exec_task(mix_cc::time_range_t time_range) {
std::vector<AlarmInfo> out_alarms;
try {
for (auto now_time = time_range.get_left();
now_time <= time_range.get_right(); now_time += delay_time_) {
// logger_->Debug() << "start:"
// << mix_cc::mix_time_t(now_time).to_formatted_time()
// << std::endl;
this->now_time_ = now_time;
this->query_time_range_.set_range(now_time_, now_time_ + delay_time_);
auto alarm = exec_mon();
out_alarms.push_back(alarm);
}
} catch (const std::exception& e) {
std::throw_with_nested(
mix_cc::Exception(-1, "calc_once error", BOOST_CURRENT_LOCATION));
}
return out_alarms;
}
BrTempFit::BrTempFit(const string name, const mix_cc::json& rule_json,
const string ruleId)
: AlgBase(name, rule_json, ruleId) {
logger_.reset(new LOG("BrTempFit:" + rule_name_, AUTO_CATCH_PID));
try {
this->init();
} catch (const std::exception& e) {
std::throw_with_nested(
mix_cc::Exception(-1, "load error", BOOST_CURRENT_LOCATION));
}
}
BrTempFit::~BrTempFit() {}
AlarmInfo BrTempFit::exec_mon() {
try {
this->refresh_now_time();
this->refresh_ihd_cache();
// logger_->Debug() << "read tag count:" << this->queried_data_.rows() <<
// endl;
for (int i = 0; i < this->queried_data_.rows(); i++) {
if (queried_data_(i, 0) <= 10.f) {
continue;
}
if (queried_data_(i, 0) <= 10.f) {
continue;
}
if (queried_data_(i, 2) <= 210.f) {
continue;
}
m_sum += queried_data_(i, 3);
mq_slide.push(queried_data_(i, 3));
if (mq_slide.size() > CS_SLIDE_AVG_SIZE) {
m_sum -= mq_slide.front();
mq_slide.pop();
float tempfit =
this->DriveTempCal1(m_sum / mq_slide.size(), 42.42f, 39.0f);
string tag = "MODFIT_" + m_tags[4];
mix_cc::ihd::set_record(tag, queried_time_[i], tempfit);
logger_->Debug() << "actaul" << queried_data_(i, 4)
<< " fit:" << tempfit << endl;
if (queried_data_(i, 4) - tempfit >
rule_json_.at("limit_alarm").at("diff").at(1).get<double>()) {
string msg =
rule_name_ +
rule_json_.at("limit_alarm").at("name").at(1).get<std::string>() +
rule_json_.at("limit_alarm")
.at("content")
.at(1)
.get<std::string>() +
" 实际:" + std::to_string(queried_data_(i, 4)) +
" 拟合:" + std::to_string(tempfit);
return utility::build_alarm_info(MsgLevel::WARN, rule_id_,
rule_name_, "BR", msg,
query_time_range_);
} else if (queried_data_(i, 4) - tempfit > rule_json_.at("limit_error")
.at("diff")
.at(1)
.get<double>()) {
string msg =
rule_name_ +
rule_json_.at("limit_error").at("name").at(1).get<std::string>() +
rule_json_.at("limit_error")
.at("content")
.at(1)
.get<std::string>() +
" 实际:" + std::to_string(queried_data_(i, 4)) +
" 拟合:" + std::to_string(tempfit);
return utility::build_alarm_info(MsgLevel::ERROR, rule_id_,
rule_name_, "BR", msg,
query_time_range_);
}
}
}
} catch (const std::exception& e) {
std::throw_with_nested(
mix_cc::Exception(-1, "calc_once error", BOOST_CURRENT_LOCATION));
}
return AlarmInfo{};
}
float BrTempFit::DriveTempCal1(float xi, float xmax, float ymax) {
float y = 0.0f;
double m_dwk = 0.0f;
double a[6] = {
0., -4556.1786839, 7132.58229315, -4958.68419167, 1292.01117165, 0.};
double b = 1091.27820069;
if (xi < 37.0f) {
xi = 37.0f;
}
// if( xi > xmax ) { xi = xmax; }
double x = (xi / xmax);
m_dwk = b + a[1] * x + a[2] * x * x + a[3] * x * x * x +
a[4] * x * x * x * x + a[5] * x * x * x * x * x;
y = m_dwk * static_cast<double>(ymax);
// logger_->Debug("xi=%f,xmax=%f,ymax=%f, x=%f, m_dwk=%f, y=%f",
// xi, xmax, ymax, x, m_dwk, y);
return y;
}