import numpy as np import matplotlib.pylab as plt from pathlib import Path from matplotlib.colors import ListedColormap from match import MatchDetails from paths import LeagueDir from ranking_system import RankingSystem from settings import PersistentSettings settings = PersistentSettings.load() ld = LeagueDir(Path(settings.league_dir_raw)) ranks = RankingSystem.latest(ld, 1)[0] bots = sorted(ranks.ratings.keys(), key=lambda bot: -ranks.get_mmr(bot)) N = len(bots) matches = MatchDetails.all(ld) win_rate = np.full((N, N), -0.01) for i in range(N): for j in range(N): if i < j: wins_i = 0 wins_j = 0 for match in matches: if bots[i] in match.blue and bots[j] in match.orange: if match.result.blue_goals > match.result.orange_goals: wins_i += 1 else: wins_j += 1
def make_summary(ld: LeagueDir, count: int): """ Make a summary of the N latest matches and the resulting ranks and tickets. If N is 0 the summary will just contain the current ratings. """ summary = {} tickets = TicketSystem.load(ld) # ========== Matches ========== matches = [] bot_wins = defaultdict(list) # Maps bots to list of booleans, where true=win and false=loss if count > 0: latest_matches = MatchDetails.latest(ld, count) for i, match in enumerate(latest_matches): matches.append({ "index": i, "blue_names": [defmt_bot_name(bot_id) for bot_id in match.blue], "orange_names": [defmt_bot_name(bot_id) for bot_id in match.orange], "blue_goals": match.result.blue_goals, "orange_goals": match.result.orange_goals, }) for bot in match.blue: bot_wins[bot].append(match.result.blue_goals > match.result.orange_goals) for bot in match.orange: bot_wins[bot].append(match.result.blue_goals < match.result.orange_goals) summary["matches"] = matches # ========= Ranks/Ratings ========= bots = load_all_unretired_bots(ld) retired = load_retired_bots(ld) bots_by_rank = [] if count <= 0: # Old rankings and current rankings is the same, but make sure all bots have a rank currently old_rankings = RankingSystem.load(ld).as_sorted_list(exclude=retired) cur_rankings = RankingSystem.load(ld).ensure_all(list(bots.keys())).as_sorted_list(exclude=retired) else: # Determine current rank and their to N matches ago n_rankings = RankingSystem.latest(ld, count + 1) old_rankings = n_rankings[0].as_sorted_list(exclude=retired) cur_rankings = n_rankings[-1].ensure_all(list(bots.keys())).as_sorted_list(exclude=retired) for i, (bot, mrr, sigma) in enumerate(cur_rankings): cur_rank = i + 1 old_rank = None old_mmr = None for j, (other_bot, other_mrr, _) in enumerate(old_rankings): if bot == other_bot: old_rank = j + 1 old_mmr = other_mrr break bots_by_rank.append({ "bot_id": defmt_bot_name(bot), "mmr": mrr, "old_mmr": old_mmr, "sigma": sigma, "cur_rank": cur_rank, "old_rank": old_rank, "tickets": tickets.get(bot) or tickets.new_bot_ticket_count, "wins": bot_wins[bot], }) summary["bots_by_rank"] = bots_by_rank # =========== Write ============= with open(PackageFiles.overlay_summary, 'w') as f: json.dump(summary, f, indent=4) league_settings = LeagueSettings.load(ld) league_settings.last_summary = count league_settings.save(ld)