apsys commited on
Commit
da0fc16
·
1 Parent(s): 952236c

style theme

Browse files
Files changed (2) hide show
  1. app.py +59 -105
  2. 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 (as display names)."""
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
- # Get default visible internal names that actually exist
182
- internal_defaults = [col for col in get_default_visible_columns() if col in available_cols]
 
183
 
184
- # If none of the defaults exist, use all available columns
185
- if not internal_defaults:
186
- internal_defaults = available_cols
187
 
188
- # Map internal names to display names
189
- gb_cols_instance = GUARDBENCH_COLUMN()
190
- all_columns_map = {
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
- # Fallback to default internal names mapped to display names if possible
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, # Now using the correct format
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 filtered data
402
  available_columns = list(filtered_main_df.columns)
403
 
404
- # Filter internal selected columns to only those available in the data
405
- if internal_selected_columns:
406
- valid_internal_selected_columns = [col for col in internal_selected_columns if col in available_columns]
407
- # Ensure model_name is always present if available
408
- if 'model_name' in available_columns and 'model_name' not in valid_internal_selected_columns:
409
- valid_internal_selected_columns = ['model_name'] + valid_internal_selected_columns
410
  else:
411
- # If no columns were selected initially, use all available internal columns
412
- valid_internal_selected_columns = available_columns
413
 
414
- # Initialize dataframes for display with valid internal selected columns
415
- main_dataframe = init_leaderboard(filtered_main_df, valid_internal_selected_columns)
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
- # Use the same valid internal columns, filtered for existence in this specific df
422
- df_valid_columns = [col for col in valid_internal_selected_columns if col in df_columns]
423
- # Ensure model_name if available
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 based on display names: {selected_columns}")
726
 
727
- # Create reverse mapping from display name to internal name
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
- # If empty, get default internal names
738
- internal_selected_columns = get_default_visible_columns()
739
- logger.info(f"No columns selected, using default internal names: {internal_selected_columns}")
740
- else:
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
- # Initialize leaderboards with the internal selected columns
754
- main_leaderboard = init_leaderboard(main_df, internal_selected_columns)
 
 
 
 
 
 
 
 
 
 
 
 
755
  category_leaderboards = []
756
  for df in category_dfs:
757
- category_leaderboards.append(init_leaderboard(df, internal_selected_columns))
 
 
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
- """Get all possible column choices as display names."""
377
- gb_cols_instance = GuardBenchColumn()
378
- return [getattr(gb_cols_instance, field.name).display_name for field in fields(gb_cols_instance) if hasattr(getattr(gb_cols_instance, field.name), 'display_name')]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
  """