def new_rating(self, self_rating, opponent_rating, comparison, game_info=None): game_info = TrueSkillGameInfo.ensure_game_info(game_info) if comparison == LOSE: mean_delta = opponent_rating.mean - self_rating.mean else: mean_delta = self_rating.mean - opponent_rating.mean c = sqrt( self_rating.stdev ** 2.0 + opponent_rating.stdev ** 2.0 + 2.0 * game_info.beta ** 2.0 ) if comparison != DRAW: v = v_exceeds_margin_scaled(mean_delta, game_info.draw_margin, c) w = w_exceeds_margin_scaled(mean_delta, game_info.draw_margin, c) rank_multiplier = TwoPlayerTrueSkillCalculator.score[comparison] else: v = v_within_margin_scaled(mean_delta, game_info.draw_margin, c) w = w_within_margin_scaled(mean_delta, game_info.draw_margin, c) rank_multiplier = 1.0 mean_multiplier = (self_rating.stdev ** 2.0 + game_info.dynamics_factor ** 2.0) / c variance_with_dynamics = self_rating.stdev ** 2.0 + game_info.dynamics_factor ** 2.0 std_dev_multiplier = variance_with_dynamics / (c ** 2.0) new_mean = self_rating.mean + (rank_multiplier * mean_multiplier * v) new_std_dev = sqrt(variance_with_dynamics * (1.0 - w * std_dev_multiplier)) return GaussianRating(new_mean, new_std_dev)
def new_rating(self, self_rating, opponent_rating, comparison, game_info=None): game_info = TrueSkillGameInfo.ensure_game_info(game_info) if comparison == LOSE: mean_delta = opponent_rating.mean - self_rating.mean else: mean_delta = self_rating.mean - opponent_rating.mean c = sqrt(self_rating.stdev**2.0 + opponent_rating.stdev**2.0 + 2.0 * game_info.beta**2.0) if comparison != DRAW: v = v_exceeds_margin_scaled(mean_delta, game_info.draw_margin, c) w = w_exceeds_margin_scaled(mean_delta, game_info.draw_margin, c) rank_multiplier = TwoPlayerTrueSkillCalculator.score[comparison] else: v = v_within_margin_scaled(mean_delta, game_info.draw_margin, c) w = w_within_margin_scaled(mean_delta, game_info.draw_margin, c) rank_multiplier = 1.0 mean_multiplier = (self_rating.stdev**2.0 + game_info.dynamics_factor**2.0) / c variance_with_dynamics = self_rating.stdev**2.0 + game_info.dynamics_factor**2.0 std_dev_multiplier = variance_with_dynamics / (c**2.0) new_mean = self_rating.mean + (rank_multiplier * mean_multiplier * v) new_std_dev = sqrt(variance_with_dynamics * (1.0 - w * std_dev_multiplier)) return GaussianRating(new_mean, new_std_dev)
def new_team_ratings(self, self_team, other_team, self_to_other_team_comparison, game_info=None): game_info = TrueSkillGameInfo.ensure_game_info(game_info) self_mean_sum = sum(rating.mean for rating in self_team.ratings()) other_team_mean_sum = sum(rating.mean for rating in other_team.ratings()) if self_to_other_team_comparison == LOSE: mean_delta = other_team_mean_sum - self_mean_sum else: mean_delta = self_mean_sum - other_team_mean_sum c = sqrt( sum(rating.stdev**2.0 for rating in self_team.ratings()) + sum(rating.stdev**2.0 for rating in other_team.ratings()) + (len(self_team) + len(other_team)) * game_info.beta**2) tau_squared = game_info.dynamics_factor**2 if self_to_other_team_comparison != DRAW: v = v_exceeds_margin_scaled(mean_delta, game_info.draw_margin, c) w = w_exceeds_margin_scaled(mean_delta, game_info.draw_margin, c) rank_multiplier = TwoTeamTrueSkillCalculator.score[ self_to_other_team_comparison] else: v = v_within_margin_scaled(mean_delta, game_info.draw_margin, c) w = w_within_margin_scaled(mean_delta, game_info.draw_margin, c) rank_multiplier = 1.0 new_team_ratings = Team() for self_team_current_player, previous_player_rating in self_team.player_rating( ): mean_multiplier = (previous_player_rating.stdev**2.0 + tau_squared) / c std_dev_multiplier = (previous_player_rating.stdev**2.0 + tau_squared) / (c**2.0) player_mean_delta = rank_multiplier * mean_multiplier * v new_mean = previous_player_rating.mean + player_mean_delta new_std_dev = sqrt( (previous_player_rating.stdev**2.0 + tau_squared) * (1.0 - w * std_dev_multiplier)) new_team_ratings[self_team_current_player] = GaussianRating( new_mean, new_std_dev) return new_team_ratings
def new_team_ratings(self, self_team, other_team, self_to_other_team_comparison, game_info=None): game_info = TrueSkillGameInfo.ensure_game_info(game_info) self_mean_sum = sum(rating.mean for rating in self_team.ratings()) other_team_mean_sum = sum(rating.mean for rating in other_team.ratings()) if self_to_other_team_comparison == LOSE: mean_delta = other_team_mean_sum - self_mean_sum else: mean_delta = self_mean_sum - other_team_mean_sum c = sqrt( sum(rating.stdev ** 2.0 for rating in self_team.ratings()) + sum(rating.stdev ** 2.0 for rating in other_team.ratings()) + (len(self_team) + len(other_team)) * game_info.beta ** 2 ) tau_squared = game_info.dynamics_factor ** 2 if self_to_other_team_comparison != DRAW: v = v_exceeds_margin_scaled(mean_delta, game_info.draw_margin, c) w = w_exceeds_margin_scaled(mean_delta, game_info.draw_margin, c) rank_multiplier = TwoTeamTrueSkillCalculator.score[self_to_other_team_comparison] else: v = v_within_margin_scaled(mean_delta, game_info.draw_margin, c) w = w_within_margin_scaled(mean_delta, game_info.draw_margin, c) rank_multiplier = 1.0 new_team_ratings = Team() for self_team_current_player, previous_player_rating in self_team.player_rating(): mean_multiplier = (previous_player_rating.stdev ** 2.0 + tau_squared) / c std_dev_multiplier = (previous_player_rating.stdev ** 2.0 + tau_squared) / (c ** 2.0) player_mean_delta = rank_multiplier * mean_multiplier * v new_mean = previous_player_rating.mean + player_mean_delta new_std_dev = sqrt( (previous_player_rating.stdev ** 2.0 + tau_squared) * (1.0 - w * std_dev_multiplier) ) new_team_ratings[self_team_current_player] = GaussianRating(new_mean, new_std_dev) return new_team_ratings