internal static IEnumerable <GapMetric> All(DataSample data, TimeSpan battleGap, long[] preferredCarIdxs, double factor) { if (preferredCarIdxs == null) { preferredCarIdxs = new long[0]; } var distances = data.Telemetry.CarIdxDistance .Select((d, i) => new { CarIdx = i, Distance = d }) .Skip(1) .Where(d => data.Telemetry.CarIdxTrackSurface[d.CarIdx] == TrackLocation.OnTrack) .Where(d => d.Distance > 0) .OrderByDescending(d => d.Distance) .ToList(); if (distances.Count == 0) { return(new GapMetric[0]); } var gap = Enumerable.Range(1, distances.Count - 1) .Select(i => new { LeaderCarIdx = distances[i - 1].CarIdx, CarIdx = distances[i].CarIdx, Distance = distances[i - 1].Distance - distances[i].Distance, Position = i + 1 }); var timeGap = gap.Select(g => new GapMetric { CarIdx = g.CarIdx, LeaderCarIdx = g.LeaderCarIdx, Time = g.Distance * data.Telemetry.Session.ResultsAverageLapTime, Position = g.Position }); var r = timeGap .Where(d => d.Time < battleGap.TotalSeconds); if (Settings.Default.FocusOnPreferedDriver) { r = r.Where(d => IsAPerferredDriver(d)) .OrderBy(d => d.Position); } else { r = r .OrderBy(d => IsAPerferredDriver(d) ? 1 : 2) .ThenBy(d => d.Position); } double[] floor = { 0.0 }; var factors = Enumerable.Range(1, r.Count()).Select(index => Math.Pow(factor, index)).ToArray(); var totalFactors = factors.Sum(); var ratio = 100.0 / totalFactors; var factorsTo100 = factors.Select(f => f * ratio).Reverse().Concat(floor).ToArray(); TraceInfo.WriteLine("total: {0}, ratio: {1}", totalFactors, ratio); for (var i = 0; i < factors.Length; i++) { TraceInfo.WriteLine("Factor: {0}, ratio: {1}", factors[i], factorsTo100[i]); } var currentFactor = 0.0; r = r.Select((d, index) => { currentFactor += factorsTo100[index]; var gapMetric = new GapMetric { CarIdx = d.CarIdx, Factor = currentFactor, LeaderCarIdx = d.LeaderCarIdx, Position = d.Position, Time = d.Time }; return(gapMetric); }).ToArray(); TraceInfo.WriteLine("Battles:"); foreach (var d in r) { TraceInfo.WriteLine("{0}: {1} -> {2}, Time: {3}, Pos: {4}", d.Factor, data.Telemetry.Cars[d.LeaderCarIdx].Details.Driver.UserName, data.Telemetry.Cars[d.CarIdx].Details.Driver.UserName, d.Time, d.Position); } return(r); }
static bool IsAPerferredDriver(GapMetric d) { return(preferredCarIdxs.Contains(d.CarIdx) || preferredCarIdxs.Contains(d.LeaderCarIdx)); }
internal static IEnumerable<GapMetric> All(DataSample data, TimeSpan battleGap, long[] preferredCarIdxs, double factor) { if (preferredCarIdxs == null) preferredCarIdxs = new long[0]; var distances = data.Telemetry.CarIdxDistance .Select((d, i) => new { CarIdx = i, Distance = d }) .Skip(1) .Where(d => data.Telemetry.CarIdxTrackSurface[d.CarIdx] == TrackLocation.OnTrack) .Where(d => d.Distance > 0) .OrderByDescending(d => d.Distance) .ToList(); if (distances.Count == 0) return new GapMetric[0]; var gap = Enumerable.Range(1, distances.Count - 1) .Select(i => new { LeaderCarIdx = distances[i - 1].CarIdx, CarIdx = distances[i].CarIdx, Distance = distances[i - 1].Distance - distances[i].Distance, Position = i + 1 }); var timeGap = gap.Select(g => new GapMetric { CarIdx = g.CarIdx, LeaderCarIdx = g.LeaderCarIdx, Time = g.Distance * data.Telemetry.Session.ResultsAverageLapTime, Position = g.Position }); var r = timeGap .Where(d => d.Time < battleGap.TotalSeconds); if (Settings.Default.FocusOnPreferedDriver) r = r.Where(d => IsAPerferredDriver(d)) .OrderBy(d => d.Position); else r = r .OrderBy(d => IsAPerferredDriver(d) ? 1 : 2) .ThenBy(d => d.Position); double[] floor = { 0.0 }; var factors = Enumerable.Range(1, r.Count()).Select(index => Math.Pow(factor, index)).ToArray(); var totalFactors = factors.Sum(); var ratio = 100.0 / totalFactors; var factorsTo100 = factors.Select(f => f * ratio).Reverse().Concat(floor).ToArray(); TraceInfo.WriteLine("total: {0}, ratio: {1}", totalFactors, ratio); for(var i = 0; i < factors.Length; i++) TraceInfo.WriteLine("Factor: {0}, ratio: {1}", factors[i], factorsTo100[i]); var currentFactor = 0.0; r = r.Select((d, index) => { currentFactor += factorsTo100[index]; var gapMetric = new GapMetric { CarIdx = d.CarIdx, Factor = currentFactor, LeaderCarIdx = d.LeaderCarIdx, Position = d.Position, Time = d.Time }; return gapMetric; }).ToArray(); TraceInfo.WriteLine("Battles:"); foreach( var d in r ) TraceInfo.WriteLine("{0}: {1} -> {2}, Time: {3}, Pos: {4}", d.Factor, data.Telemetry.Cars[d.LeaderCarIdx].Details.Driver.UserName, data.Telemetry.Cars[d.CarIdx].Details.Driver.UserName, d.Time, d.Position); return r; }
static bool IsAPerferredDriver(GapMetric d) { TraceDebug.WriteLine("IsAPreferred Driver called for carIdx {0} Preferred: {1}, Leader: {2} : return: {3}", d.CarIdx, preferredCarIdxs.Contains(d.CarIdx), preferredCarIdxs.Contains(d.LeaderCarIdx), preferredCarIdxs.Contains(d.CarIdx) || preferredCarIdxs.Contains(d.LeaderCarIdx)); return(preferredCarIdxs.Contains(d.CarIdx)); /* || preferredCarIdxs.Contains(d.LeaderCarIdx);*/ }
static bool IsAPerferredDriver(GapMetric d) { return preferredCarIdxs.Contains(d.CarIdx) || preferredCarIdxs.Contains(d.LeaderCarIdx); }