Пример #1
0
        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");
                }
            }
        }
Пример #2
0
        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();
            }
        }