Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 static bool IsAPerferredDriver(GapMetric d)
 {
     return(preferredCarIdxs.Contains(d.CarIdx) || preferredCarIdxs.Contains(d.LeaderCarIdx));
 }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
 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);*/
 }
Ejemplo n.º 5
0
 static bool IsAPerferredDriver(GapMetric d)
 {
     return preferredCarIdxs.Contains(d.CarIdx) || preferredCarIdxs.Contains(d.LeaderCarIdx);
 }