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()