def ts_winp(a, b, env=None): """Win probability of player a over b given their trueskill ratings. Formula found at https://github.com/sublee/trueskill/issues/1#issuecomment-244699989""" if not env: env = trueskill.global_env() epsilon = trueskill.calc_draw_margin(env.draw_probability, 2) denom = math.sqrt(a.sigma**2 + b.sigma**2 + (2 * env.beta**2)) return phi((a.mu - b.mu - epsilon) / denom)
def __init__(self, name, daily_sigma_decay=0, k=3, established_sigma=None, **kwargs): super(TrueSkillSystem, self).__init__(name) self.env = trueskill.TrueSkill(**kwargs) self.daily_sigma_decay = daily_sigma_decay self.established_sigma = established_sigma self.k = k self.two_p_draw_margin = trueskill.calc_draw_margin( self.env.draw_probability, 2, env=self.env)
def predict(self, teams: Tuple[str, str], rosters: Tuple[Roster, Roster] = None, drawable: bool = False) -> Tuple[float, float]: """Given two teams, return win/draw probabilities of them.""" env = self.env_drawable if drawable else self.env_undrawable team1_ratings, team2_ratings = self._teams_ratings(teams, rosters) size = len(team1_ratings) + len(team2_ratings) delta_mu = (sum(r.mu for r in team1_ratings) - sum(r.mu for r in team2_ratings)) draw_margin = calc_draw_margin(env.draw_probability, size, env=env) sum_sigma = sum(r.sigma**2 for r in chain(team1_ratings, team2_ratings)) denom = sqrt(size * env.beta**2 + sum_sigma) p_win = env.cdf((delta_mu - draw_margin) / denom) p_not_loss = env.cdf((delta_mu + draw_margin) / denom) return p_win, p_not_loss - p_win
def __init__(self, name, trueskill_env, daily_sigma_decay=0, **kwargs): super(RatingDeviationSystem, self).__init__(name, **kwargs) self.env = trueskill_env self.daily_sigma_decay = daily_sigma_decay self.draw_margin = trueskill.calc_draw_margin( self.env.draw_probability, 2, env=self.env)
def win_probability(self, player, opponent): delta_mu = player.rating.mu - opponent.rating.mu - calc_draw_margin(self.draw, 2, self.env) denom = sqrt(2 * (self.beta * self.beta) + pow(player.rating.sigma, 2) + pow(opponent.rating.sigma, 2)) return cdf(delta_mu / denom)
def __init__(self, name, trueskill_env, daily_sigma_decay=0): super(TrueSkillSystem, self).__init__(name) self.env = trueskill_env self.daily_sigma_decay = daily_sigma_decay self.draw_margin = trueskill.calc_draw_margin( self.env.draw_probability, 2, env=self.env)