Spaces:
Running
Running
Fixed several functions to enhance the game name display
Browse files
app.py
CHANGED
@@ -66,6 +66,7 @@ HUGGINGFACE_MODELS: Dict[str, str] = {
|
|
66 |
}
|
67 |
|
68 |
GAMES_REGISTRY: Dict[str, Any] = {}
|
|
|
69 |
db_dir = Path(__file__).resolve().parent / "results"
|
70 |
|
71 |
LEADERBOARD_COLUMNS = [
|
@@ -111,6 +112,22 @@ except Exception as e:
|
|
111 |
log.warning("Failed to load games registry: %s", e)
|
112 |
GAMES_REGISTRY = {}
|
113 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
# -----------------------------------------------------------------------------
|
115 |
# DB helpers
|
116 |
# -----------------------------------------------------------------------------
|
@@ -210,11 +227,12 @@ def extract_illegal_moves_summary() -> pd.DataFrame:
|
|
210 |
summary.append({"agent_name": model_name, "illegal_moves": count})
|
211 |
return pd.DataFrame(summary)
|
212 |
|
|
|
|
|
213 |
# -----------------------------------------------------------------------------
|
214 |
# Player config
|
215 |
# -----------------------------------------------------------------------------
|
216 |
|
217 |
-
|
218 |
class PlayerConfigData(TypedDict, total=False):
|
219 |
player_types: List[str]
|
220 |
player_type_display: Dict[str, str]
|
@@ -257,14 +275,21 @@ def setup_player_config(
|
|
257 |
|
258 |
|
259 |
def create_player_config() -> GameArenaConfig:
|
260 |
-
|
|
|
261 |
|
262 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
database_models = [model for _, _, model in iter_agent_databases()]
|
264 |
|
265 |
player_types = ["random_bot"]
|
266 |
player_type_display = {"random_bot": "Random Bot"}
|
267 |
-
|
268 |
if BACKEND_SYSTEM_AVAILABLE:
|
269 |
for model_key in HUGGINGFACE_MODELS.keys():
|
270 |
key = f"hf_{model_key}"
|
@@ -273,15 +298,21 @@ def create_player_config() -> GameArenaConfig:
|
|
273 |
player_type_display[key] = f"HuggingFace: {tag}"
|
274 |
|
275 |
all_models = list(HUGGINGFACE_MODELS.keys()) + database_models
|
276 |
-
|
277 |
model_info = (
|
278 |
"HuggingFace transformer models integrated with backend system."
|
279 |
if BACKEND_SYSTEM_AVAILABLE
|
280 |
else "Backend system not available - limited functionality."
|
281 |
)
|
282 |
|
|
|
|
|
|
|
|
|
|
|
|
|
283 |
return {
|
284 |
"available_games": available_games,
|
|
|
285 |
"player_config": {
|
286 |
"player_types": player_types,
|
287 |
"player_type_display": player_type_display,
|
@@ -291,11 +322,11 @@ def create_player_config() -> GameArenaConfig:
|
|
291 |
"backend_available": BACKEND_SYSTEM_AVAILABLE,
|
292 |
}
|
293 |
|
|
|
294 |
# -----------------------------------------------------------------------------
|
295 |
# Main game entry
|
296 |
# -----------------------------------------------------------------------------
|
297 |
|
298 |
-
|
299 |
def play_game(
|
300 |
game_name: str,
|
301 |
player1_type: str,
|
@@ -317,8 +348,12 @@ def play_game(
|
|
317 |
rounds,
|
318 |
)
|
319 |
|
320 |
-
#
|
321 |
config = create_player_config()
|
|
|
|
|
|
|
|
|
322 |
display_to_key = {
|
323 |
v: k for k, v in config["player_config"]["player_type_display"].items()
|
324 |
}
|
@@ -328,11 +363,9 @@ def play_game(
|
|
328 |
player2_type = display_to_key[player2_type]
|
329 |
|
330 |
try:
|
331 |
-
# IMPORTANT: rename your local folder to 'ui/'
|
332 |
from ui.gradio_config_generator import (
|
333 |
run_game_with_existing_infrastructure,
|
334 |
)
|
335 |
-
|
336 |
result = run_game_with_existing_infrastructure(
|
337 |
game_name=game_name,
|
338 |
player1_type=player1_type,
|
@@ -346,7 +379,6 @@ def play_game(
|
|
346 |
except Exception as e:
|
347 |
return f"Error during game simulation: {e}"
|
348 |
|
349 |
-
|
350 |
def extract_leaderboard_stats(game_name: str) -> pd.DataFrame:
|
351 |
all_stats = []
|
352 |
for db_file, agent_type, model_name in iter_agent_databases():
|
@@ -428,11 +460,12 @@ def extract_leaderboard_stats(game_name: str) -> pd.DataFrame:
|
|
428 |
leaderboard_df = pd.concat(all_stats, ignore_index=True)
|
429 |
return leaderboard_df[LEADERBOARD_COLUMNS]
|
430 |
|
|
|
|
|
431 |
# -----------------------------------------------------------------------------
|
432 |
# Simple plotting helpers
|
433 |
# -----------------------------------------------------------------------------
|
434 |
|
435 |
-
|
436 |
def create_bar_plot(
|
437 |
data: pd.DataFrame,
|
438 |
x_col: str,
|
|
|
66 |
}
|
67 |
|
68 |
GAMES_REGISTRY: Dict[str, Any] = {}
|
69 |
+
|
70 |
db_dir = Path(__file__).resolve().parent / "results"
|
71 |
|
72 |
LEADERBOARD_COLUMNS = [
|
|
|
112 |
log.warning("Failed to load games registry: %s", e)
|
113 |
GAMES_REGISTRY = {}
|
114 |
|
115 |
+
def _get_game_display_mapping() -> Dict[str, str]:
|
116 |
+
"""
|
117 |
+
Build a mapping from internal game keys to their human‑friendly display names.
|
118 |
+
If the registry is not available or a game has no explicit display_name,
|
119 |
+
fall back to a title‑cased version of the internal key.
|
120 |
+
"""
|
121 |
+
mapping: Dict[str, str] = {}
|
122 |
+
if games_registry is not None and hasattr(games_registry, "_registry"):
|
123 |
+
for key, info in games_registry._registry.items():
|
124 |
+
display = info.get("display_name") if isinstance(info, dict) else None
|
125 |
+
if not display:
|
126 |
+
display = key.replace("_", " ").title()
|
127 |
+
mapping[key] = display
|
128 |
+
return mapping
|
129 |
+
|
130 |
+
|
131 |
# -----------------------------------------------------------------------------
|
132 |
# DB helpers
|
133 |
# -----------------------------------------------------------------------------
|
|
|
227 |
summary.append({"agent_name": model_name, "illegal_moves": count})
|
228 |
return pd.DataFrame(summary)
|
229 |
|
230 |
+
|
231 |
+
|
232 |
# -----------------------------------------------------------------------------
|
233 |
# Player config
|
234 |
# -----------------------------------------------------------------------------
|
235 |
|
|
|
236 |
class PlayerConfigData(TypedDict, total=False):
|
237 |
player_types: List[str]
|
238 |
player_type_display: Dict[str, str]
|
|
|
275 |
|
276 |
|
277 |
def create_player_config() -> GameArenaConfig:
|
278 |
+
# Internal names for arena dropdown
|
279 |
+
available_keys = get_available_games(include_aggregated=False)
|
280 |
|
281 |
+
# Map internal names to display names
|
282 |
+
key_to_display = _get_game_display_mapping()
|
283 |
+
available_games = [
|
284 |
+
key_to_display.get(key, key.replace("_", " ").title())
|
285 |
+
for key in available_keys
|
286 |
+
]
|
287 |
+
|
288 |
+
# Collect models seen in DBs for charts/labels
|
289 |
database_models = [model for _, _, model in iter_agent_databases()]
|
290 |
|
291 |
player_types = ["random_bot"]
|
292 |
player_type_display = {"random_bot": "Random Bot"}
|
|
|
293 |
if BACKEND_SYSTEM_AVAILABLE:
|
294 |
for model_key in HUGGINGFACE_MODELS.keys():
|
295 |
key = f"hf_{model_key}"
|
|
|
298 |
player_type_display[key] = f"HuggingFace: {tag}"
|
299 |
|
300 |
all_models = list(HUGGINGFACE_MODELS.keys()) + database_models
|
|
|
301 |
model_info = (
|
302 |
"HuggingFace transformer models integrated with backend system."
|
303 |
if BACKEND_SYSTEM_AVAILABLE
|
304 |
else "Backend system not available - limited functionality."
|
305 |
)
|
306 |
|
307 |
+
# Build display→key mapping for games
|
308 |
+
display_to_key = {
|
309 |
+
key_to_display.get(key, key.replace("_", " ").title()): key
|
310 |
+
for key in available_keys
|
311 |
+
}
|
312 |
+
|
313 |
return {
|
314 |
"available_games": available_games,
|
315 |
+
"game_display_to_key": display_to_key,
|
316 |
"player_config": {
|
317 |
"player_types": player_types,
|
318 |
"player_type_display": player_type_display,
|
|
|
322 |
"backend_available": BACKEND_SYSTEM_AVAILABLE,
|
323 |
}
|
324 |
|
325 |
+
|
326 |
# -----------------------------------------------------------------------------
|
327 |
# Main game entry
|
328 |
# -----------------------------------------------------------------------------
|
329 |
|
|
|
330 |
def play_game(
|
331 |
game_name: str,
|
332 |
player1_type: str,
|
|
|
348 |
rounds,
|
349 |
)
|
350 |
|
351 |
+
# Map human‑friendly game name back to internal key if needed
|
352 |
config = create_player_config()
|
353 |
+
if "game_display_to_key" in config and game_name in config["game_display_to_key"]:
|
354 |
+
game_name = config["game_display_to_key"][game_name]
|
355 |
+
|
356 |
+
# Map display labels for player types back to keys
|
357 |
display_to_key = {
|
358 |
v: k for k, v in config["player_config"]["player_type_display"].items()
|
359 |
}
|
|
|
363 |
player2_type = display_to_key[player2_type]
|
364 |
|
365 |
try:
|
|
|
366 |
from ui.gradio_config_generator import (
|
367 |
run_game_with_existing_infrastructure,
|
368 |
)
|
|
|
369 |
result = run_game_with_existing_infrastructure(
|
370 |
game_name=game_name,
|
371 |
player1_type=player1_type,
|
|
|
379 |
except Exception as e:
|
380 |
return f"Error during game simulation: {e}"
|
381 |
|
|
|
382 |
def extract_leaderboard_stats(game_name: str) -> pd.DataFrame:
|
383 |
all_stats = []
|
384 |
for db_file, agent_type, model_name in iter_agent_databases():
|
|
|
460 |
leaderboard_df = pd.concat(all_stats, ignore_index=True)
|
461 |
return leaderboard_df[LEADERBOARD_COLUMNS]
|
462 |
|
463 |
+
|
464 |
+
|
465 |
# -----------------------------------------------------------------------------
|
466 |
# Simple plotting helpers
|
467 |
# -----------------------------------------------------------------------------
|
468 |
|
|
|
469 |
def create_bar_plot(
|
470 |
data: pd.DataFrame,
|
471 |
x_col: str,
|