public static GlickoPlayer ToGlicko(this DriversRating driversRating, string name = "")
 {
     return(new GlickoPlayer(driversRating.Rating, driversRating.Deviation, driversRating.Volatility)
     {
         Name = name
     });
 }
示例#2
0
 public RatingChangeArgs(DriversRating newRating, int ratingChange, int deviationChange, double volatilityChange, string ratingName)
 {
     NewRating        = newRating;
     RatingChange     = ratingChange;
     DeviationChange  = deviationChange;
     VolatilityChange = volatilityChange;
     RatingName       = ratingName;
 }
示例#3
0
        public override bool TryGetDriverRating(string driverName, out DriversRating driversRating)
        {
            if (SharedContext?.RaceContext?.FieldRating != null)
            {
                return(SharedContext.RaceContext.FieldRating.TryGetValue(driverName, out driversRating));
            }


            driversRating = new DriversRating();
            return(false);
        }
示例#4
0
        private DriversRating NormalizeRatingChange(DriversRating oldRating, DriversRating newRating)
        {
            newRating.Rating = Math.Max(newRating.Rating, _simulatorRatingConfiguration.MinimumRating);
            int maximumChange    = _simulatorRatingConfiguration.RatingPerLevel * 5;
            int ratingDifference = newRating.Rating - oldRating.Rating;

            if (Math.Abs(ratingDifference) > maximumChange)
            {
                newRating.Rating = ratingDifference < 0 ? oldRating.Rating - maximumChange : oldRating.Rating + maximumChange;
            }

            return(newRating);
        }
示例#5
0
 private static DriversRating UpdateDeviation(DriversRating driversRating)
 {
     /*int daysOfInactivity = (int)Math.Floor((DateTime.Now - driversRating.CreationTime).TotalDays);
      * double newDeviation = driversRating.Deviation;
      * for (int i = 0; i < daysOfInactivity; i++)
      * {
      *  newDeviation = Math.Min(350, Math.Sqrt(Math.Pow(newDeviation, 2) + Math.Pow(GlickoDeviationC, 2)));
      * }
      *
      * driversRating.Deviation = (int) newDeviation;*/
     driversRating.Deviation  = 50;
     driversRating.Volatility = 0.06;
     return(driversRating);
 }
示例#6
0
        public void UpdateRating(DriversRating newClassRating, DriversRating newDifficultyRating, DriversRating newSimRating, int difficulty, string trackName, DriverFinishState driverFinishState)
        {
            ClassRating   classRating         = GetOrCreateClassRating(driverFinishState.CarClass);
            DriversRating oldClassRating      = classRating.PlayersRating;
            DriversRating oldDifficultyRating = classRating.DifficultyRating;
            DriversRating oldSimRating        = _simulatorRating.PlayersRating;

            newSimRating                   = NormalizeRatingChange(oldSimRating, newSimRating);
            newClassRating                 = NormalizeRatingChange(oldClassRating, newClassRating);
            newSimRating                   = FillDifficulty(newSimRating);
            newClassRating                 = FillDifficulty(newClassRating);
            newDifficultyRating            = NormalizeRatingChange(oldDifficultyRating, newDifficultyRating);
            newDifficultyRating            = FillDifficulty(newDifficultyRating);
            classRating.PlayersRating      = newClassRating;
            classRating.DifficultyRating   = newDifficultyRating;
            _simulatorRating.PlayersRating = newSimRating;

            if (!classRating.DifficultySettings.WasUserSelected)
            {
                classRating.DifficultySettings.SelectedDifficulty = classRating.DifficultyRating.Difficulty;
            }

            _simulatorRating.LastPlayerClass = driverFinishState.CarClass;
            RaceResult result = new RaceResult()
            {
                CarName               = driverFinishState.CarName,
                ClassName             = driverFinishState.CarClass,
                CreationTime          = DateTime.Now,
                FinishingPosition     = driverFinishState.FinishPosition,
                TrackName             = trackName,
                Difficulty            = difficulty,
                SimulatorRatingChange = new RatingChange()
                {
                    RatingBeforeChange = oldSimRating.Rating,
                    RatingAfterChange  = newSimRating.Rating
                },
                ClassRatingChange = new RatingChange()
                {
                    RatingBeforeChange = oldClassRating.Rating,
                    RatingAfterChange  = newClassRating.Rating
                },
            };

            _simulatorRating.Results.Add(result);
            _simulatorRating.Results = _simulatorRating.Results.Take(500).ToList();
            _ratingRepository.SaveRatings(_ratings);
            NotifyRatingsChanges(CreateChangeArgs(oldClassRating, classRating.PlayersRating, driverFinishState.CarClass), CreateChangeArgs(oldSimRating, _simulatorRating.PlayersRating, SimulatorName), CreateChangeArgs(oldDifficultyRating, newDifficultyRating, driverFinishState.CarClass));
        }
示例#7
0
 private DriversRating FillDifficulty(DriversRating rating)
 {
     rating.Difficulty = GetSuggestedDifficulty(rating.Rating);
     return(rating);
 }
示例#8
0
 private static RatingChangeArgs CreateChangeArgs(DriversRating oldRating, DriversRating newRating, string ratingName)
 {
     return(new RatingChangeArgs(newRating, newRating.Rating - oldRating.Rating, newRating.Deviation - oldRating.Deviation, newRating.Volatility - oldRating.Volatility, ratingName));
 }
示例#9
0
 private static void LogRating(DriversRating driversRating)
 {
     Logger.Info($"Rating - {driversRating.Rating}, Deviation - {driversRating.Deviation}, Volatility - {driversRating.Volatility}");
 }
 public virtual bool TryGetDriverRating(string driverName, out DriversRating driversRating)
 {
     driversRating = new DriversRating();
     return(false);
 }
示例#11
0
 private void ComputeNewRatingsAndNotify(DriversRating newPlayerClassRating, DriversRating newDifficultyRating, DriversRating newPlayerSimRatingRating, int difficulty, DriverFinishState playerFinishState, string trackName)
 {
     _ratingController.UpdateRating(newPlayerClassRating, newDifficultyRating, newPlayerSimRatingRating, difficulty, trackName, playerFinishState);
 }
示例#12
0
        private GlickoPlayer CalculateNewRatingByResult(Dictionary <string, DriversRating> ratings, DriversRating rating, SessionFinishState sessionFinishState, DriverFinishState player)
        {
            Logger.Info("---- CALCULATING NEW RATINGS ---");
            Logger.Info($"Players Rating: {rating.Rating}-{rating.Deviation}-{rating.Volatility}");
            LogRatings(ratings);
            var playerRating  = rating.ToGlicko(player.Name);
            var glickoRatings = TransformToGlickoPlayers(ratings);

            DriverFinishState[] eligibleDrivers = sessionFinishState.DriverFinishStates.Where(x => !x.IsPlayer && ratings.ContainsKey(x.Name)).ToArray();
            var opponents = eligibleDrivers.Select(x => new GlickoOpponent(glickoRatings[x.Name], x.FinishPosition < player.FinishPosition ? 0 : 1)).ToList();

            return(CalculateNewRating(playerRating, opponents));
        }
示例#13
0
        private GlickoPlayer CalculateNewAsLoss(Dictionary <string, DriversRating> ratings, DriversRating rating, Driver player)
        {
            var playerRating  = rating.ToGlicko(player.DriverName);
            var glickoRatings = TransformToGlickoPlayers(ratings);
            var opponents     = glickoRatings.Where(x => x.Key != player.DriverName).Select(x => new GlickoOpponent(x.Value, 0)).ToList();

            return(CalculateNewRating(playerRating, opponents));
        }
示例#14
0
        public (DriversRating newSimulatorRating, DriversRating newClassRating, DriversRating newDifficultyRating) UpdateRatingsAsLoss(Dictionary <string, DriversRating> ratings, DriversRating difficultyRating, DriversRating simulatorRating, int difficulty, Driver player, string trackName)
        {
            DriverFinishState playerFinishState = new DriverFinishState(true, player.DriverName, player.CarName, player.ClassName, ratings.Count);
            GlickoPlayer      newClassRating    = CalculateNewAsLoss(ratings, ratings[player.DriverName], player);
            GlickoPlayer      newSimRating      = CalculateNewAsLoss(ratings, simulatorRating, player);

            ComputeNewRatingsAndNotify(newClassRating.FromGlicko(), difficultyRating, newSimRating.FromGlicko(), difficulty, playerFinishState, trackName);
            return(newSimRating.FromGlicko(), newClassRating.FromGlicko(), difficultyRating);
        }
示例#15
0
        public (DriversRating newSimulatorRating, DriversRating newClassRating, DriversRating newDifficultyRating) UpdateRatingsByResults(Dictionary <string, DriversRating> ratings, DriversRating difficultyRating, DriversRating simulatorRating, SessionFinishState sessionFinishState, int difficulty)
        {
            DriverFinishState player = sessionFinishState.DriverFinishStates.First(x => x.IsPlayer);

            Logger.Info("---- CALCULATING NEW CLASS RATINGS ---");
            GlickoPlayer newClassRating = CalculateNewRatingByResult(ratings, ratings[player.Name], sessionFinishState, player);

            Logger.Info("---- CALCULATING NEW SIM RATINGS ---");
            GlickoPlayer newSimRating = CalculateNewRatingByResult(ratings, simulatorRating, sessionFinishState, player);

            Logger.Info("---- CALCULATING NEW DIFFICULTY RATINGS ---");
            GlickoPlayer newDifficultyRating = CalculateNewRatingByResult(ratings, difficultyRating, sessionFinishState, player);

            ComputeNewRatingsAndNotify(newClassRating.FromGlicko(), newDifficultyRating.FromGlicko(), newSimRating.FromGlicko(), difficulty, player, sessionFinishState.TrackName);
            return(newSimRating.FromGlicko(), newClassRating.FromGlicko(), newDifficultyRating.FromGlicko());
        }