public static List <ResultForecast> GetSimpleForecast(List <ResultDiagnostics> resultdiagnostics, StateClass stateClass, Machine machine) { List <ResultDiagnostics> results = new List <ResultDiagnostics>(); results.AddRange(resultdiagnostics); List <ResultForecast> forecasts = new List <ResultForecast>(); int CountForecast = 0; ResultForecast forecast = new ResultForecast(); float Smax = 0; float Stemp = 0; ResultDiagnostics resultmax1 = new ResultDiagnostics(); ResultDiagnostics resultmax2 = new ResultDiagnostics(); float SecondStateValue; Repairs lastrepairs = RepairsController.GetLastRepairs(machine); results = results.Where(x => x.date > lastrepairs.date).OrderBy(x => x.date).ToList(); for (int i = 1; i < results.Count; i++) { Stemp = (Math.Abs(results[i].value - results[i - 1].value) / (((results[i].date.Ticks - 621355968000000000) / 10000000) - ((results[i - 1].date.Ticks - 621355968000000000) / 10000000))); if (Stemp > Smax) { Smax = Stemp; resultmax1 = results[i]; resultmax2 = results[i - 1]; } } if (results.Max(x => x.value) > stateClass.acceptably) { SecondStateValue = stateClass.limited; forecast.level = "Недопустимо"; CountForecast = 1; } else if (results.Max(x => x.value) > stateClass.nicely) { SecondStateValue = stateClass.acceptably; forecast.level = "Требует принятия мер"; CountForecast = 2; } else { SecondStateValue = stateClass.nicely; forecast.level = "Допустимо"; CountForecast = 3; } for (int i = 0; i < CountForecast; i++) { forecast = new ResultForecast(); float ValueDifference1 = Math.Abs(resultmax1.value - resultmax2.value); TimeSpan TimeDifference1 = resultmax1.date - resultmax2.date; float ValueDifference2 = Math.Abs(SecondStateValue - results.Last().value); TimeSpan TimeDifference2 = new TimeSpan(Convert.ToInt64((TimeDifference1.Ticks * ValueDifference2) / ValueDifference1)); forecast.date = results.Max(x => x.date).AddTicks(TimeDifference2.Ticks); forecast.value = SecondStateValue; forecasts.Add(forecast); results.Add(new ResultDiagnostics("", forecast.value, forecast.level, forecast.date)); if (forecast.value >= stateClass.acceptably) { SecondStateValue = stateClass.limited; forecast.level = "Недопустимо"; } else if (forecast.value >= stateClass.nicely) { SecondStateValue = stateClass.acceptably; forecast.level = "Требует принятия мер"; } } return(forecasts); }
public float GetMaxY() { return(ResultForecast.Max(x => x.value) + 0.5f); }
public static List <ResultForecast> GetStandartForecast(List <ResultDiagnostics> resultdiagnostics, StateClass stateClass, Machine machine) { List <ResultDiagnostics> results = new List <ResultDiagnostics>(); if (resultdiagnostics.Count > 5) { results.AddRange(resultdiagnostics.OrderByDescending(x => x.date).Take(5).OrderBy(x => x.date)); } else { results.AddRange(resultdiagnostics); } List <ResultForecast> forecasts = new List <ResultForecast>(); int CountForecast = 0; ResultForecast forecast = new ResultForecast(); float SecondStateValue; float AverageChangeValue = 0; TimeSpan AverageChangeDate = new TimeSpan(); for (int i = 1; i < results.Count; i++) { AverageChangeValue += Math.Abs(results[i].value - results[i - 1].value); AverageChangeDate += results[i].date - results[i - 1].date; } AverageChangeValue = AverageChangeValue / (results.Count - 1); AverageChangeDate = new TimeSpan(AverageChangeDate.Ticks / (results.Count - 1)); if (results.Max(x => x.value) > stateClass.acceptably) { SecondStateValue = stateClass.limited; forecast.level = "Недопустимо"; CountForecast = 1; } else if (results.Max(x => x.value) > stateClass.nicely) { SecondStateValue = stateClass.acceptably; forecast.level = "Требует принятия мер"; CountForecast = 2; } else { SecondStateValue = stateClass.nicely; forecast.level = "Допустимо"; CountForecast = 3; } for (int i = 0; i < CountForecast; i++) { forecast = new ResultForecast(); float ValueDifference = SecondStateValue - results.OrderBy(x => x.date).Last().value; TimeSpan addedtime = new TimeSpan(Convert.ToInt64((AverageChangeDate.Ticks * ValueDifference) / AverageChangeValue)); forecast.date = results.OrderBy(x => x.date).Last().date.AddTicks(addedtime.Ticks); forecast.value = SecondStateValue; forecasts.Add(forecast); results.Add(new ResultDiagnostics("", forecast.value, forecast.level, forecast.date)); if (forecast.value >= stateClass.acceptably) { SecondStateValue = stateClass.limited; forecast.level = "Недопустимо"; } else if (forecast.value >= stateClass.nicely) { SecondStateValue = stateClass.acceptably; forecast.level = "Требует принятия мер"; } } return(forecasts); }
public float GetMaxX() { TimeSpan time = new TimeSpan(ResultForecast.Max(x => x.date).Ticks); return(time.Days); }