Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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