#include namespace utility { /** * @brief 判断样本是否应该报警 * @param sample 总采样信息 * @param real_value 输入的实际值 * @param diff 运行的差值 * @return true 样本应报警 * @return false 样本不应报警 */ bool is_alarm_value(SampleTrendAnalysis *sample, double real_value, double diff) { bool ret_flag = false; if (sample->HaveSample()) { switch (sample->JudgeMode()) { case JUDGE_MODE::DIFFERENCE: if (fabs(fabs(real_value) - fabs(sample->GetProperty()->data.abs_diff.avg)) > diff) { ret_flag = true; } break; case JUDGE_MODE::PRCENTAGE: if (fabs(fabs(real_value) - fabs(sample->GetProperty()->data.abs_diff.avg)) / fabs(sample->GetProperty()->data.abs_diff.avg) > diff) { ret_flag = true; } break; case JUDGE_MODE::NORMAL: if (real_value > sample->GetProperty()->data.normal_cfdi.up || real_value < sample->GetProperty()->data.normal_cfdi.low) { ret_flag = true; } default: break; } } return ret_flag; } /** * @brief 判断样本是否应该报警 *无报警下限,适用于样本判断偏差是否合法的算法 * @param sample 总采样信息 * @param real_value 输入的实际值 * @param diff 运行的差值 * @return true 样本应报警 * @return false 样本不应报警 */ bool is_alarm_value_no_down_lim(SampleTrendAnalysis *sample, double real_value, double diff) { bool ret_flag = false; if (sample->HaveSample()) { switch (sample->JudgeMode()) { case JUDGE_MODE::DIFFERENCE: if (fabs(fabs(real_value) - fabs(sample->GetProperty()->data.abs_diff.avg)) > diff && fabs(real_value) - fabs(sample->GetProperty()->data.abs_diff.avg) > 0) { ret_flag = true; } break; case JUDGE_MODE::PRCENTAGE: if (fabs(fabs(real_value) - fabs(sample->GetProperty()->data.abs_diff.avg)) / fabs(sample->GetProperty()->data.abs_diff.avg) > diff && (fabs(real_value) - fabs(sample->GetProperty()->data.abs_diff.avg)) > 0) { ret_flag = true; } break; case JUDGE_MODE::NORMAL: if (real_value > sample->GetProperty()->data.normal_cfdi.up) { ret_flag = true; } default: break; } } return ret_flag; } /** * @brief 产生样本描述 * @param sample 总样本信息 * @param real_value 输入的实际值 * @param diff 合法区间 * @return string 产生的样本描述 */ string generate_sample_describe(SampleTrendAnalysis *sample, double real_value, double diff) { string value = " 实际值:" + to_string(real_value); if (sample->JudgeMode() == JUDGE_MODE::DIFFERENCE) { value += " 区间[" + to_string(sample->GetProperty()->data.abs_diff.avg - diff) + "," + to_string(sample->GetProperty()->data.abs_diff.avg + diff) + "]"; } else if (sample->JudgeMode() == JUDGE_MODE::PRCENTAGE) { value += " 基准值:" + to_string(sample->GetProperty()->data.abs_diff.avg) + "," + to_string(diff * 100) + "%"; } else if (sample->JudgeMode() == JUDGE_MODE::NORMAL) { value += " 区间[" + to_string(sample->GetProperty()->data.normal_cfdi.low) + "," + to_string(sample->GetProperty()->data.normal_cfdi.up) + "]"; } return value; } }