private static bool ConfirmEvent(LoadData former, LoadData latter, WindowOperator window_operator, float threshold) { if (window_operator.apque.Count == WINDOW_NUM) //窗口正确形成的时候 { float ap_change = latter.Ap - former.Ap; float rp_change = latter.Rp - former.Rp; float ap_rate_change_Abs = 0; float rp_rate_change_Abs = 0; if (Math.Abs(former.Ap) > BASE_POWER_THRESHOLD) //如果比较的 基础的值比较大才选择使用 { ap_rate_change_Abs = ap_change / former.Ap; } if (Math.Abs(former.Rp) > BASE_POWER_THRESHOLD) { rp_rate_change_Abs = rp_change / former.Rp; } if (Math.Abs(ap_rate_change_Abs) > threshold || Math.Abs(rp_rate_change_Abs) > threshold) { //Log.i("change", ap_change + " ;" + rp_change); //Log.i("changeRate", ap_rate_change_Abs + " ;" + rp_rate_change_Abs); return(true); } else { return(false); } } else { return(false); //窗口不形成 不能给权限进行分析 } }
private static bool whetherPosibleEvent(LoadData former, LoadData latter, WindowOperator window_operator) { if (window_operator.apque.Count == WINDOW_NUM) //窗口正确形成的时候 { float ap_change = latter.Ap - former.Ap; float rp_change = latter.Rp - former.Rp; float ap_rate_change_Abs = 0; float rp_rate_change_Abs = 0; if (Math.Abs(former.Ap) > BASE_POWER_THRESHOLD) //如果比较的 基础的值比较大才选择使用 { ap_rate_change_Abs = ap_change / former.Ap; } if (Math.Abs(former.Rp) > BASE_POWER_THRESHOLD) { rp_rate_change_Abs = rp_change / former.Rp; } if (Math.Abs(ap_rate_change_Abs) > THRESHOLD || Math.Abs(rp_rate_change_Abs) > THRESHOLD) { return(true); } else { return(false); } } else { return(false); //窗口不形成 不能给权限进行分析 } }
public WindowOperator(WindowOperator windowOperator) { this.ap_average = windowOperator.ap_average; this.rp_average = windowOperator.rp_average; this.apque = windowOperator.apque; this.rpque = windowOperator.rpque; this.dateque = windowOperator.dateque; }
public WindowContext(TWindow window, WindowAssigner <TInput, TWindow> windowAssigner, AbstractKeyedStateBackend <TKey> keyedStateBackend, ExecutionConfig executionConfig, IInternalTimerService <TWindow> internalTimerService, IOutput <StreamRecord <TOutput> > output, WindowOperator <TKey, TInput, TAccumulator, TOutput, TWindow> windowOperator) { Window = window; _internalTimerService = internalTimerService; _output = output; _windowOperator = windowOperator; WindowStateStore = windowAssigner is MergingWindowAssigner <TInput, TWindow> ?(AbstractPerWindowStateStore) new MergingWindowStateStore(keyedStateBackend, executionConfig) : new PerWindowStateStore(keyedStateBackend, executionConfig); }
public static List <LoadIDResult> handleHisLogDBMethodWindow(List <LoadData> loadDatalist) { List <LoadIDResult> loadeventslist = new List <LoadIDResult>(); WindowOperator window_operator = new WindowOperator(); LoadData former = null; LoadData latter = null; Queue <LoadData> loadDataQue; loadDataQue = new Queue <LoadData>(); //主要用来存储出现可疑点的 int index = -1; while (loadDatalist.Count > (index++) + 1) { DateTime time = loadDatalist[index].Time; float ap = loadDatalist[index].Ap; float rp = loadDatalist[index].Rp; former = latter; //原来的相对在后面的的点 到了在前面的点的位置 latter = window_operator.addData(ap, rp, time); //后面是找是否有可疑点 然后再进行查找 if (former != null) { if (whetherPosibleEvent(former, latter, window_operator)) //可疑点 { //参考 LoadData reference = former; //作为一个参考后面进行参考 LoadData possibleInOrOut = latter; //可疑点 LoadData thelast = latter; //就是可疑点 和之后要检测的点 WindowOperator tempOperator = new WindowOperator(window_operator); //用来存储突变的点 int cursormovetime = 0; //记录游标到底移动了多少 for (int move = 0; move < WINDOW_NUM - 1; move++) //之后往后走WINDOW_NUM-1 个 点看看 进行一个确认的过程 因为我们的变化基本是一个突变的过程 { //第一步,先拿数据: 记得游标在正常结束的时候也要进行回退 if (loadDatalist.Count > index + 1) { cursormovetime++; index++; //拿下一个点 //Log.i("cursor movetime", "move" + move + " ;cursortime" + cursormovetime); time = loadDatalist[index].Time; ap = loadDatalist[index].Ap; rp = loadDatalist[index].Rp; thelast = tempOperator.addData(ap, rp, time); //做平滑处理 } else { for (int j = 0; j < cursormovetime; j++) { index -= cursormovetime; cursormovetime = 0; } } //第二步比较判断 if (ConfirmEvent(reference, thelast, tempOperator, THRESHOLD + cursormovetime * 0.1f) == false) { for (int j = 0; j < cursormovetime; j++) { index -= cursormovetime; //游标回退 } cursormovetime = 0; break; //否决的话就不做下去了 } else { //第三步:如果做到了最后一个判断 if (move == WINDOW_NUM - 2) //到了最后的把关点的判断正确就要进行显示或者存数据库的相关操作 { String tempstr = null; bool trueForIn = thelast.Ap > reference.Ap; String event_status = null; String ApplianceNameStr = null; // db_loadinfo=new LoadInfoDB(this); float loadap = Math.Abs(thelast.Ap - reference.Ap); float loadrp = -Math.Abs(thelast.Rp - reference.Rp); //先做一个匹配的检验 要从loginfo中匹配到才算ok EVENT_TYPE eventType; if (trueForIn) { tempstr = "Load detected:in\n"; eventType = EVENT_TYPE.ON; } else { tempstr = "Load detected: out\n "; eventType = EVENT_TYPE.OFF; } { ApplianceNameStr = matchload(loadap, loadrp, trueForIn); LoadIDResult loadIDResult = new LoadIDResult { Name = ApplianceNameStr, Imgpath = mapName2ImgPath(ApplianceNameStr), Datetime = reference.Time, Event_type = eventType }; if (!loadIDResult.Name.Equals("Unknow")) { loadeventslist.Add(loadIDResult); } } } } } } } } return(loadeventslist); }
public MergeFunction(WindowOperator <TKey, TInput, TAccumulator, TOutput, TWindow> @operator, TKey key) { _operator = @operator; _key = key; }