public HistoryAnalysis Analyse(IReadOnlyCollection <Period> history) { HistoryAnalysis historyAnalysis = new HistoryAnalysis(); if (history != null && history.Any()) { //Get Valid Periods var validPeriods = history.Where(period => period.End.TimeOfDay > _analyserConfiguration.StartTime && period.Start.TimeOfDay < _analyserConfiguration.EndTime).OrderBy(x => x.Start); List <PeriodAnalysis> periodAnalyses = new List <PeriodAnalysis>(); if (validPeriods != null && validPeriods.Any()) { //Correct Valid periods if (validPeriods.FirstOrDefault().Start.TimeOfDay < _analyserConfiguration.StartTime) { validPeriods.FirstOrDefault().Start = validPeriods.FirstOrDefault().Start.Add(_analyserConfiguration.StartTime - validPeriods.FirstOrDefault().Start.TimeOfDay); } if (validPeriods.LastOrDefault().End.TimeOfDay > _analyserConfiguration.EndTime) { validPeriods.LastOrDefault().End = validPeriods.LastOrDefault().End.Subtract(validPeriods.LastOrDefault().End.TimeOfDay - _analyserConfiguration.EndTime); } foreach (var period in validPeriods) { var periodAnalysis = new PeriodAnalysis(); periodAnalysis.StartTime = period.Start.TimeOfDay; periodAnalysis.EndTime = period.End.TimeOfDay; periodAnalysis.Duration = (decimal)(period.End - period.Start).TotalSeconds; periodAnalysis.Rating = period.AverageSpeed > _analyserConfiguration.MaxSpeed ? 0 : period.AverageSpeed / _analyserConfiguration.MaxSpeed; periodAnalyses.Add(periodAnalysis); } } var analysedUndocumemdtedPeriods = AnalyseUndocumentedPeriods(validPeriods).ToList(); periodAnalyses = periodAnalyses.Concat(analysedUndocumemdtedPeriods).ToList(); periodAnalyses = periodAnalyses.OrderBy(item => item.StartTime).ToList(); ComputeDriverRating(historyAnalysis, periodAnalyses); var analysedTimeSpan = periodAnalyses.Where(periodAnalysis => !periodAnalysis.IsUndocumented).Sum(periodAnalysis => periodAnalysis.Duration); historyAnalysis.AnalysedDuration = new TimeSpan(0, 0, (int)analysedTimeSpan); } return(historyAnalysis); }
/// <summary> /// Initialzes period analysis data. /// </summary> /// <param name="history"></param> /// <returns>List of PeriodAnalysis which is input for further calculations.</returns> protected virtual List <PeriodAnalysis> InitializePeriodAnalysisData(IEnumerable <Period> history) { List <PeriodAnalysis> periodAnalysisList = new List <PeriodAnalysis>(); if (history == null || !history.Any()) { return(periodAnalysisList); } foreach (var period in history) { PeriodAnalysis periodAnalysis = new PeriodAnalysis(); periodAnalysis.Start = period.Start; periodAnalysis.End = period.End; periodAnalysis.AverageSpeed = period.AverageSpeed; //consider all periods as undocumented. Reset it on next calculations. periodAnalysis.IsUndcoumentedPeriod = true; periodAnalysisList.Add(periodAnalysis); } periodAnalysisList.OrderBy(x => x.Start); return(periodAnalysisList); }