Board fixes
Browse files- app_local.py +13 -10
- src/display/utils.py +45 -34
- 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 |
-
#
|
52 |
-
|
53 |
-
|
54 |
|
55 |
-
|
56 |
-
|
|
|
|
|
57 |
|
58 |
return Leaderboard(
|
59 |
value=dataframe,
|
60 |
-
datatype=[
|
61 |
select_columns=SelectColumns(
|
62 |
-
default_selection=[
|
63 |
-
cant_deselect=[
|
64 |
label="Select Columns to Display:",
|
65 |
),
|
66 |
-
search_columns=[
|
67 |
-
hide_columns=[
|
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 |
-
|
22 |
-
|
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 |
-
#
|
37 |
model_info_columns = [
|
38 |
-
("
|
39 |
-
("
|
40 |
-
("
|
41 |
-
("
|
42 |
-
("
|
43 |
-
("
|
44 |
-
("
|
45 |
-
("
|
46 |
-
("
|
|
|
|
|
|
|
|
|
47 |
]
|
48 |
|
49 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
auto_eval_column_dict.append(
|
51 |
-
(field_name, ColumnContent, create_column_field(
|
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 = [
|
|
|
|
|
|
|
|
|
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 = [
|
|
|
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
|