game_arena_bench / leaderboard_utils.py
Yuxuan-Zhang-Dexter
update leaderboard
9caee78
raw
history blame contribute delete
12.4 kB
import pandas as pd
import json
import numpy as np
# Define game order
GAME_ORDER = [
"Super Mario Bros",
"Sokoban",
"2048",
"Candy Crush",
"Tetris (complete)",
"Tetris (planning only)",
"Ace Attorney"
]
def get_organization(model_name):
m = model_name.lower()
if "claude" in m:
return "anthropic"
elif "gemini" in m:
return "google"
elif "o1" in m or "gpt" in m or "o3" in m or "o4" in m:
return "openai"
elif "deepseek" in m:
return "deepseek"
elif "llama" in m:
return "meta"
elif "grok" in m:
return "xai"
else:
return "unknown"
def get_mario_leaderboard(rank_data):
data = rank_data.get("Super Mario Bros", {}).get("results", [])
df = pd.DataFrame(data)
df = df.rename(columns={
"model": "Player",
"progress": "Progress (current/total)",
"score": "Score",
"time_s": "Time (s)"
})
df["Organization"] = df["Player"].apply(get_organization)
df = df[["Player", "Organization", "Progress (current/total)", "Score", "Time (s)"]]
return df
def get_sokoban_leaderboard(rank_data):
data = rank_data.get("Sokoban", {}).get("results", [])
df = pd.DataFrame(data)
df = df.rename(columns={
"model": "Player",
"levels_cracked": "Levels Cracked",
"steps": "Steps"
})
df["Organization"] = df["Player"].apply(get_organization)
df = df[["Player", "Organization", "Levels Cracked", "Steps"]]
return df
def get_2048_leaderboard(rank_data):
data = rank_data.get("2048", {}).get("results", [])
df = pd.DataFrame(data)
df = df.rename(columns={
"model": "Player",
"score": "Score",
"steps": "Steps",
"time": "Time"
})
df["Organization"] = df["Player"].apply(get_organization)
df = df[["Player", "Organization", "Score", "Steps", "Time"]]
return df
def get_candy_leaderboard(rank_data):
data = rank_data.get("Candy Crush", {}).get("results", [])
df = pd.DataFrame(data)
df = df.rename(columns={
"model": "Player",
"score_runs": "Score Runs",
"average_score": "Average Score",
"steps": "Steps"
})
df["Organization"] = df["Player"].apply(get_organization)
df = df[["Player", "Organization", "Score Runs", "Average Score", "Steps"]]
return df
def get_tetris_leaderboard(rank_data):
data = rank_data.get("Tetris (complete)", {}).get("results", [])
df = pd.DataFrame(data)
df = df.rename(columns={
"model": "Player",
"score": "Score",
"steps_blocks": "Steps"
})
df["Organization"] = df["Player"].apply(get_organization)
df = df[["Player", "Organization", "Score", "Steps"]]
return df
def get_tetris_planning_leaderboard(rank_data):
data = rank_data.get("Tetris (planning only)", {}).get("results", [])
df = pd.DataFrame(data)
df = df.rename(columns={
"model": "Player",
"score": "Score",
"steps_blocks": "Steps"
})
df["Organization"] = df["Player"].apply(get_organization)
df = df[["Player", "Organization", "Score", "Steps"]]
return df
def get_ace_attorney_leaderboard(rank_data):
data = rank_data.get("Ace Attorney", {}).get("results", [])
df = pd.DataFrame(data)
df = df.rename(columns={
"model": "Player",
"levels_cracked": "Levels Cracked",
"lives_left": "Lives Left",
"cracked_details": "Progress",
"score": "Score",
"note": "Notes"
})
df["Organization"] = df["Player"].apply(get_organization)
df = df[["Player", "Organization", "Levels Cracked", "Lives Left", "Progress", "Score", "Notes"]]
return df
def calculate_rank_and_completeness(rank_data, selected_games):
# Dictionary to store DataFrames for each game
game_dfs = {}
# Get DataFrames for selected games
if selected_games.get("Super Mario Bros"):
game_dfs["Super Mario Bros"] = get_mario_leaderboard(rank_data)
if selected_games.get("Sokoban"):
game_dfs["Sokoban"] = get_sokoban_leaderboard(rank_data)
if selected_games.get("2048"):
game_dfs["2048"] = get_2048_leaderboard(rank_data)
if selected_games.get("Candy Crush"):
game_dfs["Candy Crush"] = get_candy_leaderboard(rank_data)
if selected_games.get("Tetris (complete)"):
game_dfs["Tetris (complete)"] = get_tetris_leaderboard(rank_data)
if selected_games.get("Tetris (planning only)"):
game_dfs["Tetris (planning only)"] = get_tetris_planning_leaderboard(rank_data)
if selected_games.get("Ace Attorney"):
game_dfs["Ace Attorney"] = get_ace_attorney_leaderboard(rank_data)
# Get all unique players
all_players = set()
for df in game_dfs.values():
all_players.update(df["Player"].unique())
all_players = sorted(list(all_players))
# Create results DataFrame
results = []
for player in all_players:
player_data = {
"Player": player,
"Organization": get_organization(player)
}
ranks = []
games_played = 0
# Calculate rank and completeness for each game
for game in GAME_ORDER:
if game in game_dfs:
df = game_dfs[game]
if player in df["Player"].values:
games_played += 1
# Get player's score based on game type
if game == "Super Mario Bros":
player_score = df[df["Player"] == player]["Score"].iloc[0]
rank = len(df[df["Score"] > player_score]) + 1
elif game == "Sokoban":
# Parse Sokoban score string and get maximum level
levels_str = df[df["Player"] == player]["Levels Cracked"].iloc[0]
try:
# Split by semicolon, strip whitespace, filter empty strings, convert to integers
levels = [int(x.strip()) for x in levels_str.split(";") if x.strip()]
player_score = max(levels) if levels else 0
except:
player_score = 0
# Calculate rank based on maximum level
rank = len(df[df["Levels Cracked"].apply(
lambda x: max([int(y.strip()) for y in x.split(";") if y.strip()]) > player_score
)]) + 1
elif game == "2048":
player_score = df[df["Player"] == player]["Score"].iloc[0]
rank = len(df[df["Score"] > player_score]) + 1
elif game == "Candy Crush":
player_score = df[df["Player"] == player]["Average Score"].iloc[0]
rank = len(df[df["Average Score"] > player_score]) + 1
elif game in ["Tetris (complete)", "Tetris (planning only)"]:
player_score = df[df["Player"] == player]["Score"].iloc[0]
rank = len(df[df["Score"] > player_score]) + 1
elif game == "Ace Attorney":
player_score = df[df["Player"] == player]["Score"].iloc[0]
rank = len(df[df["Score"] > player_score]) + 1
ranks.append(rank)
player_data[f"{game} Score"] = player_score
else:
player_data[f"{game} Score"] = 'n/a'
# Calculate average rank and completeness for sorting only
if ranks:
player_data["Sort Rank"] = round(np.mean(ranks), 2)
player_data["Games Played"] = games_played
else:
player_data["Sort Rank"] = float('inf')
player_data["Games Played"] = 0
results.append(player_data)
# Create DataFrame and sort by average rank and completeness
df_results = pd.DataFrame(results)
if not df_results.empty:
# Sort by average rank (ascending) and completeness (descending)
df_results = df_results.sort_values(
by=["Sort Rank", "Games Played"],
ascending=[True, False]
)
# Drop the sorting columns
df_results = df_results.drop(["Sort Rank", "Games Played"], axis=1)
return df_results
def get_combined_leaderboard(rank_data, selected_games):
"""
Get combined leaderboard for selected games
Args:
rank_data (dict): Dictionary containing rank data
selected_games (dict): Dictionary of game names and their selection status
Returns:
pd.DataFrame: Combined leaderboard DataFrame
"""
# Dictionary to store DataFrames for each game
game_dfs = {}
# Get DataFrames for selected games
if selected_games.get("Super Mario Bros"):
game_dfs["Super Mario Bros"] = get_mario_leaderboard(rank_data)
if selected_games.get("Sokoban"):
game_dfs["Sokoban"] = get_sokoban_leaderboard(rank_data)
if selected_games.get("2048"):
game_dfs["2048"] = get_2048_leaderboard(rank_data)
if selected_games.get("Candy Crush"):
game_dfs["Candy Crush"] = get_candy_leaderboard(rank_data)
if selected_games.get("Tetris (complete)"):
game_dfs["Tetris (complete)"] = get_tetris_leaderboard(rank_data)
if selected_games.get("Tetris (planning only)"):
game_dfs["Tetris (planning only)"] = get_tetris_planning_leaderboard(rank_data)
if selected_games.get("Ace Attorney"):
game_dfs["Ace Attorney"] = get_ace_attorney_leaderboard(rank_data)
# Get all unique players
all_players = set()
for df in game_dfs.values():
all_players.update(df["Player"].unique())
all_players = sorted(list(all_players))
# Create results DataFrame
results = []
for player in all_players:
player_data = {
"Player": player,
"Organization": get_organization(player)
}
# Add scores for each game
for game in GAME_ORDER:
if game in game_dfs:
df = game_dfs[game]
if player in df["Player"].values:
if game == "Super Mario Bros":
player_data[f"{game} Score"] = df[df["Player"] == player]["Score"].iloc[0]
elif game == "Sokoban":
# Parse Sokoban score string and get maximum level
levels_str = df[df["Player"] == player]["Levels Cracked"].iloc[0]
try:
levels = [int(x.strip()) for x in levels_str.split(";") if x.strip()]
player_data[f"{game} Score"] = max(levels) if levels else 0
except:
player_data[f"{game} Score"] = 0
elif game == "2048":
player_data[f"{game} Score"] = df[df["Player"] == player]["Score"].iloc[0]
elif game == "Candy Crush":
player_data[f"{game} Score"] = df[df["Player"] == player]["Average Score"].iloc[0]
elif game in ["Tetris (complete)", "Tetris (planning only)"]:
player_data[f"{game} Score"] = df[df["Player"] == player]["Score"].iloc[0]
elif game == "Ace Attorney":
player_data[f"{game} Score"] = df[df["Player"] == player]["Score"].iloc[0]
else:
player_data[f"{game} Score"] = 'n/a'
results.append(player_data)
# Create DataFrame
df_results = pd.DataFrame(results)
# Sort by total score across all games
if not df_results.empty:
# Calculate total score for each player
df_results["Total Score"] = 0
for game in GAME_ORDER:
if f"{game} Score" in df_results.columns:
df_results["Total Score"] += df_results[f"{game} Score"].apply(
lambda x: float(x) if x != 'n/a' else 0
)
# Sort by total score in descending order
df_results = df_results.sort_values("Total Score", ascending=False)
# Drop the temporary total score column
df_results = df_results.drop("Total Score", axis=1)
return df_results