private void StartLoadPrediction() { LastPredictedLoad = CalculateNeededTotalLoad(); OldLoad = new Load(LastPredictedLoad); OlderLoad = new Load(LastPredictedLoad); if (Global.PredictionSource == PredictionSource.Host) { if (CurrentLoadPrediction == LoadPrediction.None) { } else if (CurrentLoadPrediction == LoadPrediction.Ewma) { Task predictionThread = new Task(async() => { while (Started) { await Task.Delay(Global.Second); var realLoad = CalculateNeededTotalLoad(); var newPredicted = realLoad * Global.Alpha + LastPredictedLoad * (1 - Global.Alpha); lock (_lock) { LastPredictedLoad = new Load(newPredicted); } } }); predictionThread.Start(); } else if (CurrentLoadPrediction == LoadPrediction.Arma) { Task predictionThread = new Task(async() => { while (Started) { await Task.Delay(Global.Second); var realLoad = CalculateNeededTotalLoad(); var newPredicted = realLoad * Global.Beta + OldLoad * Global.Gamma + OlderLoad * (1 - (Global.Beta + Global.Gamma)); lock (_lock) { LastPredictedLoad = newPredicted; OlderLoad = new Load(OldLoad); OldLoad = new Load(realLoad); } } }); predictionThread.Start(); } else if (CurrentLoadPrediction == LoadPrediction.LinReg) { Task predictionThread = new Task(async() => { List <Load> oldLoads = new List <Load>(); while (Started) { await Task.Delay(Global.Second); var realLoad = CalculateNeededTotalLoad(); oldLoads.Add(realLoad); if (oldLoads.Count > Global.LinerRegWindow) { oldLoads.RemoveAt(0); } var predictor = new SimpleLinerRegression(oldLoads); var newPredicted = predictor.TimePredict(Global.LinerRegWindow + Global.PredictionTime); lock (_lock) { if (newPredicted.CpuLoad < 0) { throw new NotImplementedException("Host Load manager"); } LastPredictedLoad = newPredicted; } } }); predictionThread.Start(); } else { throw new NotImplementedException("How Come exception"); } } }
private void StartPrediction() { LastPredictedLoad = new Load(NeededLoad); OldLoad = new Load(NeededLoad); OlderLoad = new Load(NeededLoad); if (CurrentLoadPrediction == LoadPrediction.None) { } else if (CurrentLoadPrediction == LoadPrediction.Ewma) { Task predictionTask = new Task(async() => { while (Started) { await Task.Delay(Global.CheckRate); var newLast = NeededLoad * Global.Alpha + LastPredictedLoad * (1 - Global.Alpha); lock (lck) { LastPredictedLoad = newLast; } } }); predictionTask.Start(); } else if (CurrentLoadPrediction == LoadPrediction.Arma) { Task predictionTask = new Task(async() => { while (Started) { await Task.Delay(Global.CheckRate); var newLast = NeededLoad * Global.Beta + OldLoad * Global.Gamma + OlderLoad * (1 - (Global.Beta + Global.Gamma)); lock (lck) { LastPredictedLoad = newLast; OlderLoad = new Load(OldLoad); OldLoad = new Load(NeededLoad); } } }); predictionTask.Start(); } else if (CurrentLoadPrediction == LoadPrediction.LinReg) { Task predictionTask = new Task(async() => { List <Load> oldLoads = new List <Load>(); while (Started) { await Task.Delay(Global.CheckRate / 2); var realLoad = new Load(NeededLoad); oldLoads.Add(realLoad); if (oldLoads.Count > Global.LinerRegWindow) { oldLoads.RemoveAt(0); } var predictor = new SimpleLinerRegression(oldLoads); var newLast = predictor.TimePredict(Global.PredictionTime); lock (lck) { LastPredictedLoad = newLast; } } }); predictionTask.Start(); } else { throw new NotImplementedException(); } }