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 |
"""
|