public static GlickoPlayer ToGlicko(this DriversRating driversRating, string name = "") { return(new GlickoPlayer(driversRating.Rating, driversRating.Deviation, driversRating.Volatility) { Name = name }); }
public RatingChangeArgs(DriversRating newRating, int ratingChange, int deviationChange, double volatilityChange, string ratingName) { NewRating = newRating; RatingChange = ratingChange; DeviationChange = deviationChange; VolatilityChange = volatilityChange; RatingName = ratingName; }
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); }
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); }
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); }
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)); }
private DriversRating FillDifficulty(DriversRating rating) { rating.Difficulty = GetSuggestedDifficulty(rating.Rating); return(rating); }
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)); }
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); }
private void ComputeNewRatingsAndNotify(DriversRating newPlayerClassRating, DriversRating newDifficultyRating, DriversRating newPlayerSimRatingRating, int difficulty, DriverFinishState playerFinishState, string trackName) { _ratingController.UpdateRating(newPlayerClassRating, newDifficultyRating, newPlayerSimRatingRating, difficulty, trackName, playerFinishState); }
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)); }
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)); }
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); }
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()); }