lukehinds commited on
Commit
7a3d0ce
·
1 Parent(s): 99b815f

Board fixes

Browse files
Files changed (3) hide show
  1. app_local.py +13 -10
  2. src/display/utils.py +45 -34
  3. src/populate.py +7 -0
app_local.py CHANGED
@@ -47,24 +47,27 @@ def init_leaderboard(dataframe):
47
 
48
  # Get all fields from AutoEvalColumn
49
  auto_eval_fields = fields(AutoEvalColumn)
 
50
 
51
- # Find the model and license fields
52
- model_field = next((f for f in auto_eval_fields if f.name == "Model"), None)
53
- license_field = next((f for f in auto_eval_fields if f.name == "Hub License"), None)
54
 
55
- if not model_field or not license_field:
56
- raise ValueError("Required fields not found in AutoEvalColumn")
 
 
57
 
58
  return Leaderboard(
59
  value=dataframe,
60
- datatype=[c.type for c in auto_eval_fields],
61
  select_columns=SelectColumns(
62
- default_selection=[c.name for c in auto_eval_fields if c.displayed_by_default],
63
- cant_deselect=[c.name for c in auto_eval_fields if c.never_hidden],
64
  label="Select Columns to Display:",
65
  ),
66
- search_columns=[model_field.name, license_field.name],
67
- hide_columns=[c.name for c in auto_eval_fields if c.hidden],
68
  filter_columns=[
69
  ColumnFilter("Type", type="checkboxgroup", label="Model types"),
70
  ColumnFilter("Weight Format", type="checkboxgroup", label="Weight Format"),
 
47
 
48
  # Get all fields from AutoEvalColumn
49
  auto_eval_fields = fields(AutoEvalColumn)
50
+ print(f"AutoEvalColumn fields: {[f.name for f in auto_eval_fields]}")
51
 
52
+ # Create a mapping from display names to field names
53
+ field_mapping = {f.name: f for f in auto_eval_fields}
54
+ print(f"Field mapping: {field_mapping}")
55
 
56
+ # Verify all required columns are present
57
+ for col in dataframe.columns:
58
+ if col not in field_mapping:
59
+ print(f"Warning: Column {col} not found in field mapping")
60
 
61
  return Leaderboard(
62
  value=dataframe,
63
+ datatype=["str" if col not in field_mapping else field_mapping[col].type for col in dataframe.columns],
64
  select_columns=SelectColumns(
65
+ default_selection=[col for col in dataframe.columns if col in field_mapping and field_mapping[col].displayed_by_default],
66
+ cant_deselect=[col for col in dataframe.columns if col in field_mapping and field_mapping[col].never_hidden],
67
  label="Select Columns to Display:",
68
  ),
69
+ search_columns=["Model", "Hub License"],
70
+ hide_columns=[col for col in dataframe.columns if col in field_mapping and field_mapping[col].hidden],
71
  filter_columns=[
72
  ColumnFilter("Type", type="checkboxgroup", label="Model types"),
73
  ColumnFilter("Weight Format", type="checkboxgroup", label="Weight Format"),
src/display/utils.py CHANGED
@@ -1,11 +1,8 @@
1
- from dataclasses import dataclass, make_dataclass, field
2
  from enum import Enum
3
 
4
  from src.about import Tasks
5
 
6
- def fields(raw_class):
7
- return [v for k, v in raw_class.__dict__.items() if k[:2] != "__" and k[-2:] != "__"]
8
-
9
  @dataclass
10
  class ColumnContent:
11
  name: str
@@ -14,46 +11,56 @@ class ColumnContent:
14
  hidden: bool = False
15
  never_hidden: bool = False
16
 
 
 
 
 
17
  ## Leaderboard columns
18
  def create_column_field(name: str, type: str, displayed_by_default: bool, hidden: bool = False, never_hidden: bool = False):
19
  return field(default_factory=lambda: ColumnContent(name, type, displayed_by_default, hidden, never_hidden))
20
 
21
- auto_eval_column_dict = [
22
- # Init
23
- ("model_type_symbol", ColumnContent, create_column_field("T", "str", True, never_hidden=True)),
24
- ("model", ColumnContent, create_column_field("Model", "markdown", True, never_hidden=True)),
25
- # Scores
26
- ("average", ColumnContent, create_column_field("Security Score ⬆️", "number", True))
27
- ]
28
-
29
- # Add task-specific columns
30
- for task in Tasks:
31
- if task.name == "safetensors":
32
- auto_eval_column_dict.append((task.name, ColumnContent, create_column_field("Safetensors ✓", "bool", True)))
33
- else:
34
- auto_eval_column_dict.append((task.name, ColumnContent, create_column_field(task.value.col_name, "number", True)))
35
 
36
- # Model information
37
  model_info_columns = [
38
- ("model_type", "Type", "str", False),
39
- ("architecture", "Architecture", "str", False),
40
- ("weight_type", "Weight Format", "str", True),
41
- ("precision", "Precision", "str", False),
42
- ("license", "Hub License", "str", True),
43
- ("params", "#Params (B)", "number", False),
44
- ("likes", "Hub ❤️", "number", False),
45
- ("still_on_hub", "Available on Hub", "bool", False),
46
- ("revision", "Model SHA", "str", False)
 
 
 
 
47
  ]
48
 
49
- for field_name, display_name, field_type, displayed_by_default in model_info_columns:
 
 
 
 
 
 
 
 
 
 
 
50
  auto_eval_column_dict.append(
51
- (field_name, ColumnContent, create_column_field(display_name, field_type, displayed_by_default))
52
  )
53
 
54
  # We use make dataclass to dynamically fill the scores from Tasks
55
  AutoEvalColumn = make_dataclass("AutoEvalColumn", auto_eval_column_dict, frozen=True)
56
 
 
 
 
57
  ## For the queue columns in the submission tab
58
  @dataclass(frozen=True)
59
  class EvalQueueColumn: # Queue column
@@ -112,9 +119,13 @@ class Precision(Enum):
112
  return Precision.Unknown
113
 
114
  # Column selection
115
- COLS = [c.name for c in fields(AutoEvalColumn) if not c.hidden]
 
 
 
 
116
 
117
- EVAL_COLS = [c.name for c in fields(EvalQueueColumn)]
118
- EVAL_TYPES = [c.type for c in fields(EvalQueueColumn)]
119
 
120
- BENCHMARK_COLS = [t.value.col_name for t in Tasks]
 
1
+ from dataclasses import dataclass, make_dataclass, field, fields as dataclass_fields
2
  from enum import Enum
3
 
4
  from src.about import Tasks
5
 
 
 
 
6
  @dataclass
7
  class ColumnContent:
8
  name: str
 
11
  hidden: bool = False
12
  never_hidden: bool = False
13
 
14
+ def fields(raw_class):
15
+ """Get all fields from a dataclass instance."""
16
+ return [getattr(raw_class, field.name) for field in dataclass_fields(raw_class)]
17
+
18
  ## Leaderboard columns
19
  def create_column_field(name: str, type: str, displayed_by_default: bool, hidden: bool = False, never_hidden: bool = False):
20
  return field(default_factory=lambda: ColumnContent(name, type, displayed_by_default, hidden, never_hidden))
21
 
22
+ # Create a list of tuples for the dataclass fields
23
+ auto_eval_column_dict = []
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
+ # Add model information columns
26
  model_info_columns = [
27
+ ("T", "str", True, False, True), # name, type, displayed_by_default, hidden, never_hidden
28
+ ("Model", "markdown", True, False, True),
29
+ ("Security Score ⬆️", "number", True, False, False),
30
+ ("Safetensors", "bool", True, False, False),
31
+ ("Type", "str", True, False, False),
32
+ ("Architecture", "str", False, False, False),
33
+ ("Weight Format", "str", True, False, False),
34
+ ("Precision", "str", True, False, False),
35
+ ("Hub License", "str", True, False, False),
36
+ ("Hub ❤️", "number", True, False, False),
37
+ ("#Params (B)", "number", True, False, False),
38
+ ("Available on Hub", "bool", True, False, False),
39
+ ("Model SHA", "str", True, False, False)
40
  ]
41
 
42
+ def make_valid_identifier(name):
43
+ # Replace invalid characters with underscores and make lowercase
44
+ valid = name.lower().replace(" ", "_").replace("-", "_")
45
+ valid = "".join(c if c.isalnum() or c == "_" else "" for c in valid)
46
+ # Ensure it starts with a letter
47
+ if valid[0].isdigit():
48
+ valid = "n" + valid
49
+ return valid
50
+
51
+ # Create fields for each column
52
+ for name, type_, displayed, hidden, never_hidden in model_info_columns:
53
+ field_name = make_valid_identifier(name)
54
  auto_eval_column_dict.append(
55
+ (field_name, ColumnContent, create_column_field(name, type_, displayed, hidden, never_hidden))
56
  )
57
 
58
  # We use make dataclass to dynamically fill the scores from Tasks
59
  AutoEvalColumn = make_dataclass("AutoEvalColumn", auto_eval_column_dict, frozen=True)
60
 
61
+ # Create an instance of AutoEvalColumn with default values
62
+ auto_eval_column_instance = AutoEvalColumn()
63
+
64
  ## For the queue columns in the submission tab
65
  @dataclass(frozen=True)
66
  class EvalQueueColumn: # Queue column
 
119
  return Precision.Unknown
120
 
121
  # Column selection
122
+ COLS = [
123
+ "T", "Model", "Security Score ⬆️", "Safetensors", "Type", "Architecture",
124
+ "Weight Format", "Precision", "Hub License", "Hub ❤️", "#Params (B)",
125
+ "Available on Hub", "Model SHA"
126
+ ]
127
 
128
+ EVAL_COLS = [c.name for c in fields(EvalQueueColumn())]
129
+ EVAL_TYPES = [c.type for c in fields(EvalQueueColumn())]
130
 
131
+ BENCHMARK_COLS = ["Security Score ⬆️", "Safetensors"]
src/populate.py CHANGED
@@ -19,9 +19,11 @@ def get_leaderboard_df(results_path: str, requests_path: str, cols: list, benchm
19
 
20
  all_data_json = [v.to_dict() for v in raw_data]
21
  print(f"Converted {len(all_data_json)} results to dict")
 
22
 
23
  df = pd.DataFrame.from_records(all_data_json)
24
  print(f"Created DataFrame with columns: {df.columns.tolist()}")
 
25
 
26
  # Ensure all required columns exist before filtering
27
  for col in benchmark_cols:
@@ -31,8 +33,13 @@ def get_leaderboard_df(results_path: str, requests_path: str, cols: list, benchm
31
 
32
  # Filter out if any of the benchmarks have not been produced
33
  df = df[has_no_nan_values(df, benchmark_cols)]
 
 
34
  df = df.sort_values(by="Security Score ⬆️", ascending=False)
 
 
35
  df = df[cols].round(decimals=2)
 
36
 
37
  print(f"Final DataFrame has {len(df)} rows")
38
  return df
 
19
 
20
  all_data_json = [v.to_dict() for v in raw_data]
21
  print(f"Converted {len(all_data_json)} results to dict")
22
+ print(f"Data before DataFrame creation: {all_data_json}")
23
 
24
  df = pd.DataFrame.from_records(all_data_json)
25
  print(f"Created DataFrame with columns: {df.columns.tolist()}")
26
+ print(f"DataFrame before filtering:\n{df}")
27
 
28
  # Ensure all required columns exist before filtering
29
  for col in benchmark_cols:
 
33
 
34
  # Filter out if any of the benchmarks have not been produced
35
  df = df[has_no_nan_values(df, benchmark_cols)]
36
+ print(f"DataFrame after benchmark filtering:\n{df}")
37
+
38
  df = df.sort_values(by="Security Score ⬆️", ascending=False)
39
+ print(f"DataFrame after sorting:\n{df}")
40
+
41
  df = df[cols].round(decimals=2)
42
+ print(f"DataFrame after column selection:\n{df}")
43
 
44
  print(f"Final DataFrame has {len(df)} rows")
45
  return df