예제 #1
0
        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);
        }
예제 #2
0
        /// <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);
        }