|
import pandas as pd
|
|
import json
|
|
import numpy as np
|
|
|
|
|
|
GAME_ORDER = [
|
|
|
|
"Super Mario Bros",
|
|
"Sokoban",
|
|
"2048",
|
|
"Candy Crush",
|
|
|
|
"Tetris",
|
|
"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_sokoban_leaderboard(rank_data):
|
|
data = rank_data.get("Sokoban", {}).get("results", [])
|
|
df = pd.DataFrame(data)
|
|
df = df.rename(columns={
|
|
"model": "Player",
|
|
"score": "Score",
|
|
"steps": "Steps",
|
|
"detail_box_on_target": "Detail Box On Target",
|
|
"cracked_levels": "Levels Cracked"
|
|
})
|
|
df["Organization"] = df["Player"].apply(get_organization)
|
|
|
|
|
|
columns_to_keep = ["Player", "Organization", "Score", "Levels Cracked", "Detail Box On Target", "Steps"]
|
|
|
|
df_columns = [col for col in columns_to_keep if col in df.columns]
|
|
df = df[df_columns]
|
|
|
|
if "Score" in df.columns:
|
|
df["Score"] = pd.to_numeric(df["Score"], errors='coerce')
|
|
df = df.sort_values("Score", ascending=False)
|
|
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",
|
|
"details": "Details",
|
|
"highest_tail": "Highest Tail"
|
|
|
|
})
|
|
|
|
|
|
|
|
if "Player" in df.columns:
|
|
df["Organization"] = df["Player"].apply(get_organization)
|
|
else:
|
|
|
|
|
|
df["Organization"] = "unknown"
|
|
|
|
columns_to_keep = ["Player", "Organization", "Score", "Highest Tail", "Details"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for col_k in columns_to_keep:
|
|
if col_k not in df.columns:
|
|
|
|
df[col_k] = np.nan
|
|
|
|
df = df[columns_to_keep]
|
|
|
|
|
|
if "Score" in df.columns:
|
|
df["Score"] = pd.to_numeric(df["Score"], errors='coerce')
|
|
df = df.sort_values("Score", ascending=False)
|
|
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": "Score",
|
|
"details": "Details"
|
|
})
|
|
df["Organization"] = df["Player"].apply(get_organization)
|
|
|
|
columns_to_keep = ["Player", "Organization", "Score", "Details"]
|
|
df_columns = [col for col in columns_to_keep if col in df.columns]
|
|
df = df[df_columns]
|
|
|
|
if "Score" in df.columns:
|
|
df["Score"] = pd.to_numeric(df["Score"], errors='coerce')
|
|
df = df.sort_values("Score", ascending=False)
|
|
return df
|
|
|
|
def get_tetris_planning_leaderboard(rank_data):
|
|
data = rank_data.get("Tetris", {}).get("results", [])
|
|
df = pd.DataFrame(data)
|
|
df = df.rename(columns={
|
|
"model": "Player",
|
|
"score": "Score",
|
|
"details": "Details"
|
|
|
|
})
|
|
df["Organization"] = df["Player"].apply(get_organization)
|
|
|
|
columns_to_keep = ["Player", "Organization", "Score", "Details"]
|
|
df_columns = [col for col in columns_to_keep if col in df.columns]
|
|
df = df[df_columns]
|
|
|
|
if "Score" in df.columns:
|
|
df["Score"] = pd.to_numeric(df["Score"], errors='coerce')
|
|
df = df.sort_values("Score", ascending=False)
|
|
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",
|
|
"score": "Score",
|
|
"progress": "Progress"
|
|
})
|
|
df["Organization"] = df["Player"].apply(get_organization)
|
|
|
|
|
|
columns_to_keep = ["Player", "Organization", "Score", "Progress"]
|
|
|
|
df_columns = [col for col in columns_to_keep if col in df.columns]
|
|
df = df[df_columns]
|
|
|
|
if "Score" in df.columns:
|
|
df["Score"] = pd.to_numeric(df["Score"], errors='coerce')
|
|
df = df.sort_values("Score", ascending=False)
|
|
return df
|
|
|
|
def get_mario_planning_leaderboard(rank_data):
|
|
data = rank_data.get("Super Mario Bros", {}).get("results", [])
|
|
df = pd.DataFrame(data)
|
|
df = df.rename(columns={
|
|
"model": "Player",
|
|
"score": "Score",
|
|
"detail_data": "Detail Data",
|
|
"progress": "Progress"
|
|
})
|
|
df["Organization"] = df["Player"].apply(get_organization)
|
|
|
|
columns_to_keep = ["Player", "Organization", "Score", "Progress", "Detail Data"]
|
|
df_columns = [col for col in columns_to_keep if col in df.columns]
|
|
df = df[df_columns]
|
|
|
|
if "Score" in df.columns:
|
|
df["Score"] = pd.to_numeric(df["Score"], errors='coerce')
|
|
df = df.sort_values("Score", ascending=False)
|
|
return df
|
|
|
|
def calculate_rank_and_completeness(rank_data, selected_games):
|
|
|
|
game_dfs = {}
|
|
|
|
|
|
|
|
|
|
if selected_games.get("Super Mario Bros"):
|
|
game_dfs["Super Mario Bros"] = get_mario_planning_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"):
|
|
game_dfs["Tetris"] = get_tetris_planning_leaderboard(rank_data)
|
|
if selected_games.get("Ace Attorney"):
|
|
game_dfs["Ace Attorney"] = get_ace_attorney_leaderboard(rank_data)
|
|
|
|
|
|
all_players = set()
|
|
for df in game_dfs.values():
|
|
all_players.update(df["Player"].unique())
|
|
all_players = sorted(list(all_players))
|
|
|
|
|
|
results = []
|
|
for player in all_players:
|
|
player_data = {
|
|
"Player": player,
|
|
"Organization": get_organization(player)
|
|
}
|
|
ranks = []
|
|
games_played = 0
|
|
|
|
|
|
for game in GAME_ORDER:
|
|
if game in game_dfs:
|
|
df = game_dfs[game]
|
|
if player in df["Player"].values:
|
|
games_played += 1
|
|
|
|
|
|
|
|
|
|
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":
|
|
player_score = df[df["Player"] == player]["Score"].iloc[0]
|
|
rank = len(df[df["Score"] > 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]["Score"].iloc[0]
|
|
rank = len(df[df["Score"] > player_score]) + 1
|
|
elif game in ["Tetris"]:
|
|
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'
|
|
|
|
|
|
if ranks:
|
|
player_data["Average Rank"] = round(np.mean(ranks), 2)
|
|
player_data["Games Played"] = games_played
|
|
else:
|
|
player_data["Average Rank"] = float('inf')
|
|
player_data["Games Played"] = 0
|
|
|
|
results.append(player_data)
|
|
|
|
|
|
df_results = pd.DataFrame(results)
|
|
if not df_results.empty:
|
|
|
|
df_results = df_results.sort_values(
|
|
by=["Average Rank", "Games Played"],
|
|
ascending=[True, False]
|
|
)
|
|
|
|
df_results = df_results.drop(["Average 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
|
|
"""
|
|
|
|
game_dfs = {}
|
|
|
|
|
|
|
|
|
|
if selected_games.get("Super Mario Bros"):
|
|
game_dfs["Super Mario Bros"] = get_mario_planning_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"):
|
|
game_dfs["Tetris"] = get_tetris_planning_leaderboard(rank_data)
|
|
if selected_games.get("Ace Attorney"):
|
|
game_dfs["Ace Attorney"] = get_ace_attorney_leaderboard(rank_data)
|
|
|
|
|
|
all_players = set()
|
|
for df in game_dfs.values():
|
|
all_players.update(df["Player"].unique())
|
|
all_players = sorted(list(all_players))
|
|
|
|
|
|
results = []
|
|
for player in all_players:
|
|
player_data = {
|
|
"Player": player,
|
|
"Organization": get_organization(player)
|
|
}
|
|
|
|
|
|
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":
|
|
player_data[f"{game} Score"] = df[df["Player"] == player]["Score"].iloc[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]["Score"].iloc[0]
|
|
elif game in ["Tetris"]:
|
|
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)
|
|
|
|
|
|
df_results = pd.DataFrame(results)
|
|
|
|
|
|
if not df_results.empty:
|
|
|
|
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
|
|
)
|
|
|
|
|
|
df_results = df_results.sort_values("Total Score", ascending=False)
|
|
|
|
|
|
df_results = df_results.drop("Total Score", axis=1)
|
|
|
|
return df_results
|
|
|