Spaces:
Sleeping
Sleeping
File size: 3,416 Bytes
aed7669 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
import os
import json
import sqlite3
import glob
import pandas as pd
import gradio as gr
from datetime import datetime
from typing import Dict, List
# Directory to store SQLite results
db_dir = "results/"
def find_or_download_db():
"""Check if SQLite .db files exist; if not, attempt to download from cloud storage."""
if not os.path.exists(db_dir):
os.makedirs(db_dir)
db_files = glob.glob(os.path.join(db_dir, "*.db"))
# Ensure the random bot database exists
if "results/random_None.db" not in db_files:
raise FileNotFoundError("Please upload results for the random agent in a file named 'random_None.db'.")
return db_files
def extract_agent_info(filename: str):
"""Extract agent type and model name from the filename."""
base_name = os.path.basename(filename).replace(".db", "")
parts = base_name.split("_", 1)
if len(parts) == 2:
agent_type, model_name = parts
else:
agent_type, model_name = parts[0], "Unknown"
return agent_type, model_name
def extract_leaderboard_stats(game_name: str) -> pd.DataFrame:
"""Extract and aggregate leaderboard stats from all SQLite databases."""
db_files = find_or_download_db()
all_stats = []
for db_file in db_files:
conn = sqlite3.connect(db_file)
agent_type, model_name = extract_agent_info(db_file)
if game_name == "Total Performance":
query = "SELECT game_name, COUNT(DISTINCT episode) AS games_played, " \
"AVG(generation_time) AS avg_gen_time, SUM(reward) AS total_rewards " \
"FROM game_results GROUP BY game_name"
else:
query = "SELECT COUNT(DISTINCT episode) AS games_played, " \
"AVG(generation_time) AS avg_gen_time, SUM(reward) AS total_rewards " \
"FROM game_results WHERE game_name = ?"
df = pd.read_sql_query(query, conn, params=(game_name,) if game_name != "Total Performance" else None)
df["agent_name"] = model_name
df["agent_type"] = agent_type
all_stats.append(df)
conn.close()
leaderboard_df = pd.concat(all_stats, ignore_index=True) if all_stats else pd.DataFrame()
return leaderboard_df
def generate_leaderboard_json():
"""Generate a JSON file containing leaderboard stats."""
leaderboard = extract_leaderboard_stats("Total Performance").to_dict(orient="records")
json_file = "results/leaderboard_stats.json"
with open(json_file, "w", encoding="utf-8") as f:
json.dump({"timestamp": datetime.utcnow().isoformat(), "leaderboard": leaderboard}, f, indent=4)
return json_file
with gr.Blocks() as interface:
with gr.Tab("Leaderboard"):
gr.Markdown("# Leaderboard")
leaderboard_game_dropdown = gr.Dropdown(["Total Performance", "tic_tac_toe"], label="Select Game")
leaderboard_table = gr.Dataframe()
download_button = gr.File(label="Download Leaderboard")
refresh_button = gr.Button("Refresh Leaderboard")
leaderboard_game_dropdown.change(extract_leaderboard_stats, inputs=[leaderboard_game_dropdown], outputs=[leaderboard_table])
refresh_button.click(extract_leaderboard_stats, inputs=[leaderboard_game_dropdown], outputs=[leaderboard_table])
download_button.click(generate_leaderboard_json, outputs=[download_button])
interface.launch()
|