Spaces:
Sleeping
Sleeping
style theme
Browse files- app.py +59 -105
- src/display/utils.py +17 -3
app.py
CHANGED
|
@@ -13,7 +13,6 @@ import plotly.graph_objects as go
|
|
| 13 |
from apscheduler.schedulers.background import BackgroundScheduler
|
| 14 |
import numpy as np
|
| 15 |
from gradio.themes.utils import fonts, colors
|
| 16 |
-
from dataclasses import fields
|
| 17 |
|
| 18 |
from src.about import (
|
| 19 |
CITATION_BUTTON_LABEL,
|
|
@@ -171,44 +170,27 @@ def update_column_choices(df):
|
|
| 171 |
|
| 172 |
# Update the column_selector initialization
|
| 173 |
def get_initial_columns():
|
| 174 |
-
"""Get initial columns to show in the dropdown
|
| 175 |
try:
|
| 176 |
-
internal_defaults = []
|
| 177 |
# Get available columns in the main dataframe
|
| 178 |
available_cols = list(LEADERBOARD_DF.columns)
|
| 179 |
logger.info(f"Available columns in LEADERBOARD_DF: {available_cols}")
|
| 180 |
|
| 181 |
-
#
|
| 182 |
-
|
|
|
|
| 183 |
|
| 184 |
-
#
|
| 185 |
-
if
|
| 186 |
-
internal_defaults = available_cols
|
| 187 |
|
| 188 |
-
#
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
field.name: getattr(gb_cols_instance, field.name).display_name
|
| 192 |
-
for field in fields(gb_cols_instance)
|
| 193 |
-
if hasattr(getattr(gb_cols_instance, field.name), 'display_name')
|
| 194 |
-
}
|
| 195 |
-
display_defaults = [all_columns_map.get(col, col) for col in internal_defaults]
|
| 196 |
-
return display_defaults
|
| 197 |
|
|
|
|
| 198 |
except Exception as e:
|
| 199 |
logger.error(f"Error getting initial columns: {e}")
|
| 200 |
-
|
| 201 |
-
try:
|
| 202 |
-
gb_cols_instance = GUARDBENCH_COLUMN()
|
| 203 |
-
all_columns_map = {
|
| 204 |
-
field.name: getattr(gb_cols_instance, field.name).display_name
|
| 205 |
-
for field in fields(gb_cols_instance)
|
| 206 |
-
if hasattr(getattr(gb_cols_instance, field.name), 'display_name')
|
| 207 |
-
}
|
| 208 |
-
default_internal = get_default_visible_columns()
|
| 209 |
-
return [all_columns_map.get(col, col) for col in default_internal]
|
| 210 |
-
except:
|
| 211 |
-
return get_default_visible_columns() # Final fallback
|
| 212 |
|
| 213 |
def init_leaderboard(dataframe, visible_columns=None):
|
| 214 |
"""
|
|
@@ -272,17 +254,6 @@ def init_leaderboard(dataframe, visible_columns=None):
|
|
| 272 |
|
| 273 |
datatypes.append(col_type)
|
| 274 |
|
| 275 |
-
# Create a mapping from internal column names to display names
|
| 276 |
-
gb_cols_instance = GUARDBENCH_COLUMN() # Create an instance
|
| 277 |
-
all_columns_map = {
|
| 278 |
-
field.name: getattr(gb_cols_instance, field.name).display_name
|
| 279 |
-
for field in fields(gb_cols_instance)
|
| 280 |
-
if hasattr(getattr(gb_cols_instance, field.name), 'display_name') # Ensure it has display_name
|
| 281 |
-
}
|
| 282 |
-
|
| 283 |
-
# Create the list of headers using display names
|
| 284 |
-
display_headers = [all_columns_map.get(col, col) for col in visible_columns]
|
| 285 |
-
|
| 286 |
# Create a dummy column for search functionality if it doesn't exist
|
| 287 |
if 'search_dummy' not in dataframe.columns:
|
| 288 |
dataframe['search_dummy'] = dataframe.apply(
|
|
@@ -306,10 +277,17 @@ def init_leaderboard(dataframe, visible_columns=None):
|
|
| 306 |
if not pd.api.types.is_integer_dtype(display_df[col]):
|
| 307 |
display_df[col] = display_df[col].round(3)
|
| 308 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 309 |
return gr.Dataframe(
|
| 310 |
-
value=display_df,
|
| 311 |
-
headers=display_headers,
|
| 312 |
-
datatype=datatypes,
|
| 313 |
interactive=False,
|
| 314 |
wrap=True,
|
| 315 |
elem_id="leaderboard-table",
|
|
@@ -361,32 +339,13 @@ def refresh_data_with_filters(version=CURRENT_VERSION, search_query="", model_ty
|
|
| 361 |
"""
|
| 362 |
Refresh the leaderboard data and update all components with filtering.
|
| 363 |
Ensures we handle cases where dataframes might have limited columns.
|
| 364 |
-
|
| 365 |
-
Args:
|
| 366 |
-
version: Benchmark version.
|
| 367 |
-
search_query: Text search query.
|
| 368 |
-
model_types: List of model types to filter by.
|
| 369 |
-
selected_columns: List of display names for columns to show.
|
| 370 |
"""
|
| 371 |
try:
|
| 372 |
logger.info(f"Performing refresh of leaderboard data with filters...")
|
| 373 |
# Get new data
|
| 374 |
main_df = get_leaderboard_df(version=version)
|
| 375 |
category_dfs = [get_category_leaderboard_df(category, version=version) for category in CATEGORIES]
|
| 376 |
-
|
| 377 |
-
# Create reverse mapping from display name to internal name
|
| 378 |
-
gb_cols_instance = GUARDBENCH_COLUMN()
|
| 379 |
-
display_to_internal_map = {
|
| 380 |
-
getattr(gb_cols_instance, field.name).display_name: field.name
|
| 381 |
-
for field in fields(gb_cols_instance)
|
| 382 |
-
if hasattr(getattr(gb_cols_instance, field.name), 'display_name')
|
| 383 |
-
}
|
| 384 |
-
|
| 385 |
-
# Convert selected display names to internal names
|
| 386 |
-
if selected_columns:
|
| 387 |
-
internal_selected_columns = [display_to_internal_map.get(disp_name, disp_name) for disp_name in selected_columns]
|
| 388 |
-
else:
|
| 389 |
-
internal_selected_columns = None # Let init_leaderboard handle default
|
| 390 |
|
| 391 |
# Log the actual columns we have
|
| 392 |
logger.info(f"Main dataframe columns: {list(main_df.columns)}")
|
|
@@ -398,31 +357,27 @@ def refresh_data_with_filters(version=CURRENT_VERSION, search_query="", model_ty
|
|
| 398 |
for df in category_dfs
|
| 399 |
]
|
| 400 |
|
| 401 |
-
# Get available columns from the
|
| 402 |
available_columns = list(filtered_main_df.columns)
|
| 403 |
|
| 404 |
-
# Filter
|
| 405 |
-
if
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
valid_internal_selected_columns = ['model_name'] + valid_internal_selected_columns
|
| 410 |
else:
|
| 411 |
-
|
| 412 |
-
valid_internal_selected_columns = available_columns
|
| 413 |
|
| 414 |
-
# Initialize dataframes for display with valid
|
| 415 |
-
main_dataframe = init_leaderboard(filtered_main_df,
|
| 416 |
|
| 417 |
# For category dataframes, get columns that actually exist in each one
|
| 418 |
category_dataframes = []
|
| 419 |
for df in filtered_category_dfs:
|
| 420 |
df_columns = list(df.columns)
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
if 'model_name' in df_columns and 'model_name' not in df_valid_columns:
|
| 425 |
-
df_valid_columns = ['model_name'] + df_valid_columns
|
| 426 |
category_dataframes.append(init_leaderboard(df, df_valid_columns))
|
| 427 |
|
| 428 |
return main_dataframe, *category_dataframes
|
|
@@ -717,44 +672,45 @@ with demo:
|
|
| 717 |
Update all leaderboards to show the selected columns.
|
| 718 |
Ensures all selected columns are preserved in the update.
|
| 719 |
|
| 720 |
-
Args:
|
| 721 |
-
selected_columns: List of display names from the dropdown.
|
| 722 |
"""
|
| 723 |
|
| 724 |
try:
|
| 725 |
-
logger.info(f"Updating columns
|
| 726 |
|
| 727 |
-
#
|
| 728 |
-
gb_cols_instance = GUARDBENCH_COLUMN()
|
| 729 |
-
display_to_internal_map = {
|
| 730 |
-
getattr(gb_cols_instance, field.name).display_name: field.name
|
| 731 |
-
for field in fields(gb_cols_instance)
|
| 732 |
-
if hasattr(getattr(gb_cols_instance, field.name), 'display_name')
|
| 733 |
-
}
|
| 734 |
-
|
| 735 |
-
# Convert selected display names to internal names
|
| 736 |
if not selected_columns or len(selected_columns) == 0:
|
| 737 |
-
|
| 738 |
-
|
| 739 |
-
|
| 740 |
-
|
| 741 |
-
internal_selected_columns = [display_to_internal_map.get(disp_name, disp_name) for disp_name in selected_columns]
|
| 742 |
-
logger.info(f"Converted display names to internal names: {internal_selected_columns}")
|
| 743 |
|
| 744 |
-
# Ensure 'model_name' is always included internally
|
| 745 |
-
if 'model_name' not in internal_selected_columns:
|
| 746 |
-
internal_selected_columns = ['model_name'] + internal_selected_columns
|
| 747 |
|
| 748 |
# Get the current data with ALL columns preserved
|
| 749 |
main_df = get_leaderboard_df(version=version_selector.value)
|
|
|
|
|
|
|
| 750 |
category_dfs = [get_category_leaderboard_df(category, version=version_selector.value)
|
| 751 |
for category in CATEGORIES]
|
| 752 |
|
| 753 |
-
#
|
| 754 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 755 |
category_leaderboards = []
|
| 756 |
for df in category_dfs:
|
| 757 |
-
|
|
|
|
|
|
|
| 758 |
|
| 759 |
return main_leaderboard, *category_leaderboards
|
| 760 |
|
|
@@ -762,8 +718,6 @@ with demo:
|
|
| 762 |
logger.error(f"Error updating columns: {e}")
|
| 763 |
import traceback
|
| 764 |
logger.error(traceback.format_exc())
|
| 765 |
-
# Fallback logic might need adjustment if state uses display names
|
| 766 |
-
# For now, return existing components
|
| 767 |
return leaderboard, *[tab.children[0] for tab in category_tabs.children[1:len(CATEGORIES)+1]]
|
| 768 |
|
| 769 |
# Connect column selector to update function
|
|
|
|
| 13 |
from apscheduler.schedulers.background import BackgroundScheduler
|
| 14 |
import numpy as np
|
| 15 |
from gradio.themes.utils import fonts, colors
|
|
|
|
| 16 |
|
| 17 |
from src.about import (
|
| 18 |
CITATION_BUTTON_LABEL,
|
|
|
|
| 170 |
|
| 171 |
# Update the column_selector initialization
|
| 172 |
def get_initial_columns():
|
| 173 |
+
"""Get initial columns to show in the dropdown"""
|
| 174 |
try:
|
|
|
|
| 175 |
# Get available columns in the main dataframe
|
| 176 |
available_cols = list(LEADERBOARD_DF.columns)
|
| 177 |
logger.info(f"Available columns in LEADERBOARD_DF: {available_cols}")
|
| 178 |
|
| 179 |
+
# If dataframe is empty, use default visible columns
|
| 180 |
+
if not available_cols:
|
| 181 |
+
return get_default_visible_columns()
|
| 182 |
|
| 183 |
+
# Get default visible columns that actually exist in the dataframe
|
| 184 |
+
valid_defaults = [col for col in get_default_visible_columns() if col in available_cols]
|
|
|
|
| 185 |
|
| 186 |
+
# If none of the defaults exist, return all available columns
|
| 187 |
+
if not valid_defaults:
|
| 188 |
+
return available_cols
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
|
| 190 |
+
return valid_defaults
|
| 191 |
except Exception as e:
|
| 192 |
logger.error(f"Error getting initial columns: {e}")
|
| 193 |
+
return get_default_visible_columns()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 194 |
|
| 195 |
def init_leaderboard(dataframe, visible_columns=None):
|
| 196 |
"""
|
|
|
|
| 254 |
|
| 255 |
datatypes.append(col_type)
|
| 256 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 257 |
# Create a dummy column for search functionality if it doesn't exist
|
| 258 |
if 'search_dummy' not in dataframe.columns:
|
| 259 |
dataframe['search_dummy'] = dataframe.apply(
|
|
|
|
| 277 |
if not pd.api.types.is_integer_dtype(display_df[col]):
|
| 278 |
display_df[col] = display_df[col].round(3)
|
| 279 |
|
| 280 |
+
# Create a mapping from internal names to display names
|
| 281 |
+
all_choices = get_all_column_choices()
|
| 282 |
+
display_name_map = {internal_name: display_name for internal_name, display_name in all_choices}
|
| 283 |
+
|
| 284 |
+
# Generate the list of headers to display based on the visible internal column names
|
| 285 |
+
display_headers = [display_name_map.get(col, col) for col in visible_columns] # Default to internal name if no mapping found
|
| 286 |
+
|
| 287 |
return gr.Dataframe(
|
| 288 |
+
value=display_df, # The dataframe still uses internal names
|
| 289 |
+
headers=display_headers, # Use display headers for the UI
|
| 290 |
+
datatype=datatypes,
|
| 291 |
interactive=False,
|
| 292 |
wrap=True,
|
| 293 |
elem_id="leaderboard-table",
|
|
|
|
| 339 |
"""
|
| 340 |
Refresh the leaderboard data and update all components with filtering.
|
| 341 |
Ensures we handle cases where dataframes might have limited columns.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 342 |
"""
|
| 343 |
try:
|
| 344 |
logger.info(f"Performing refresh of leaderboard data with filters...")
|
| 345 |
# Get new data
|
| 346 |
main_df = get_leaderboard_df(version=version)
|
| 347 |
category_dfs = [get_category_leaderboard_df(category, version=version) for category in CATEGORIES]
|
| 348 |
+
selected_columns = [x.lower().replace(" ", "_").replace("(", "").replace(")", "").replace("_recall", "_recall_binary") for x in selected_columns]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 349 |
|
| 350 |
# Log the actual columns we have
|
| 351 |
logger.info(f"Main dataframe columns: {list(main_df.columns)}")
|
|
|
|
| 357 |
for df in category_dfs
|
| 358 |
]
|
| 359 |
|
| 360 |
+
# Get available columns from the dataframe
|
| 361 |
available_columns = list(filtered_main_df.columns)
|
| 362 |
|
| 363 |
+
# Filter selected columns to only those available in the data
|
| 364 |
+
if selected_columns:
|
| 365 |
+
valid_selected_columns = [col for col in selected_columns if col in available_columns]
|
| 366 |
+
if not valid_selected_columns and 'model_name' in available_columns:
|
| 367 |
+
valid_selected_columns = ['model_name'] + get_default_visible_columns()
|
|
|
|
| 368 |
else:
|
| 369 |
+
valid_selected_columns = available_columns
|
|
|
|
| 370 |
|
| 371 |
+
# Initialize dataframes for display with valid selected columns
|
| 372 |
+
main_dataframe = init_leaderboard(filtered_main_df, valid_selected_columns)
|
| 373 |
|
| 374 |
# For category dataframes, get columns that actually exist in each one
|
| 375 |
category_dataframes = []
|
| 376 |
for df in filtered_category_dfs:
|
| 377 |
df_columns = list(df.columns)
|
| 378 |
+
df_valid_columns = [col for col in valid_selected_columns if col in df_columns]
|
| 379 |
+
if not df_valid_columns and 'model_name' in df_columns:
|
| 380 |
+
df_valid_columns = ['model_name'] + get_default_visible_columns()
|
|
|
|
|
|
|
| 381 |
category_dataframes.append(init_leaderboard(df, df_valid_columns))
|
| 382 |
|
| 383 |
return main_dataframe, *category_dataframes
|
|
|
|
| 672 |
Update all leaderboards to show the selected columns.
|
| 673 |
Ensures all selected columns are preserved in the update.
|
| 674 |
|
|
|
|
|
|
|
| 675 |
"""
|
| 676 |
|
| 677 |
try:
|
| 678 |
+
logger.info(f"Updating columns to show: {selected_columns}")
|
| 679 |
|
| 680 |
+
# If no columns are selected, use default visible columns
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 681 |
if not selected_columns or len(selected_columns) == 0:
|
| 682 |
+
selected_columns = get_default_visible_columns()
|
| 683 |
+
logger.info(f"No columns selected, using defaults: {selected_columns}")
|
| 684 |
+
|
| 685 |
+
selected_columns = [x.lower().replace(" ", "_").replace("(", "").replace(")", "").replace("_recall", "_recall_binary") for x in selected_columns]
|
|
|
|
|
|
|
| 686 |
|
|
|
|
|
|
|
|
|
|
| 687 |
|
| 688 |
# Get the current data with ALL columns preserved
|
| 689 |
main_df = get_leaderboard_df(version=version_selector.value)
|
| 690 |
+
|
| 691 |
+
# Get category dataframes with ALL columns preserved
|
| 692 |
category_dfs = [get_category_leaderboard_df(category, version=version_selector.value)
|
| 693 |
for category in CATEGORIES]
|
| 694 |
|
| 695 |
+
# Log columns for debugging
|
| 696 |
+
logger.info(f"Main dataframe columns: {list(main_df.columns)}")
|
| 697 |
+
logger.info(f"Selected columns: {selected_columns}")
|
| 698 |
+
|
| 699 |
+
# IMPORTANT: Make sure model_name is always included
|
| 700 |
+
if 'model_name' in main_df.columns and 'model_name' not in selected_columns:
|
| 701 |
+
selected_columns = ['model_name'] + selected_columns
|
| 702 |
+
|
| 703 |
+
# Initialize the main leaderboard with the selected columns
|
| 704 |
+
# We're passing the raw selected_columns directly to preserve the selection
|
| 705 |
+
main_leaderboard = init_leaderboard(main_df, selected_columns)
|
| 706 |
+
|
| 707 |
+
# Initialize category dataframes with the same selected columns
|
| 708 |
+
# This ensures consistency across all tabs
|
| 709 |
category_leaderboards = []
|
| 710 |
for df in category_dfs:
|
| 711 |
+
# Use the same selected columns for each category
|
| 712 |
+
# init_leaderboard will automatically handle filtering to columns that exist
|
| 713 |
+
category_leaderboards.append(init_leaderboard(df, selected_columns))
|
| 714 |
|
| 715 |
return main_leaderboard, *category_leaderboards
|
| 716 |
|
|
|
|
| 718 |
logger.error(f"Error updating columns: {e}")
|
| 719 |
import traceback
|
| 720 |
logger.error(traceback.format_exc())
|
|
|
|
|
|
|
| 721 |
return leaderboard, *[tab.children[0] for tab in category_tabs.children[1:len(CATEGORIES)+1]]
|
| 722 |
|
| 723 |
# Connect column selector to update function
|
src/display/utils.py
CHANGED
|
@@ -373,9 +373,23 @@ METRICS = [
|
|
| 373 |
]
|
| 374 |
|
| 375 |
def get_all_column_choices():
|
| 376 |
-
"""
|
| 377 |
-
|
| 378 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 379 |
|
| 380 |
def get_default_visible_columns():
|
| 381 |
"""
|
|
|
|
| 373 |
]
|
| 374 |
|
| 375 |
def get_all_column_choices():
|
| 376 |
+
"""
|
| 377 |
+
Get all available column choices for the multiselect dropdown.
|
| 378 |
+
|
| 379 |
+
Returns:
|
| 380 |
+
List of tuples with (column_name, display_name) for all columns.
|
| 381 |
+
"""
|
| 382 |
+
column_choices = []
|
| 383 |
+
|
| 384 |
+
default_visible_columns = get_default_visible_columns()
|
| 385 |
+
|
| 386 |
+
for f in fields(GUARDBENCH_COLUMN):
|
| 387 |
+
column_info = getattr(GUARDBENCH_COLUMN, f.name)
|
| 388 |
+
# Create a tuple with both the internal name and display name
|
| 389 |
+
if column_info.name not in default_visible_columns:
|
| 390 |
+
column_choices.append((column_info.name, column_info.display_name))
|
| 391 |
+
|
| 392 |
+
return column_choices
|
| 393 |
|
| 394 |
def get_default_visible_columns():
|
| 395 |
"""
|