mathamateur commited on
Commit
952f09b
·
1 Parent(s): e6a31da

Fix download column

Browse files
src/display/columns.py CHANGED
@@ -83,7 +83,7 @@ def main_board_datatype_for_df(df: pd.DataFrame) -> list[str]:
83
  number_cols = set(_NUMBER_COLS) | {task.value.col_name for task in Tasks}
84
  result: list[str] = []
85
  for col in df.columns:
86
- if col in (MODEL_COL, INTERNAL_MODEL_COL, DOWNLOAD_COL):
87
  result.append("markdown")
88
  elif col in number_cols:
89
  result.append("number")
@@ -97,11 +97,10 @@ def main_board_datatype_for_df(df: pd.DataFrame) -> list[str]:
97
  def main_board_datatype() -> list[str]:
98
  """Fallback datatype list for COLS + download column."""
99
  col_types = {c.name: c.type for c in fields(AutoEvalColumn)}
100
- col_types[INTERNAL_MODEL_COL] = "markdown"
101
  types: list[str] = []
102
  for name in COLS:
103
  if name == INTERNAL_MODEL_COL:
104
- types.append("markdown")
105
  types.append(col_types[name])
106
  return types
107
 
 
83
  number_cols = set(_NUMBER_COLS) | {task.value.col_name for task in Tasks}
84
  result: list[str] = []
85
  for col in df.columns:
86
+ if col == DOWNLOAD_COL:
87
  result.append("markdown")
88
  elif col in number_cols:
89
  result.append("number")
 
97
  def main_board_datatype() -> list[str]:
98
  """Fallback datatype list for COLS + download column."""
99
  col_types = {c.name: c.type for c in fields(AutoEvalColumn)}
 
100
  types: list[str] = []
101
  for name in COLS:
102
  if name == INTERNAL_MODEL_COL:
103
+ types.append("markdown") # download column before model
104
  types.append(col_types[name])
105
  return types
106
 
src/display/datasets_tab.py CHANGED
@@ -9,7 +9,7 @@ from src.populate import get_dataset_info_markdown, get_dataset_leaderboard_df
9
  def _dataset_datatype(task_name: str) -> list[str]:
10
  task = Tasks[task_name]
11
  metric_cols = get_dataset_metric_cols(task)
12
- # download (markdown) + model (markdown) + team + metrics
13
  return ["markdown", "markdown", "str"] + ["number"] * len(metric_cols)
14
 
15
 
 
9
  def _dataset_datatype(task_name: str) -> list[str]:
10
  task = Tasks[task_name]
11
  metric_cols = get_dataset_metric_cols(task)
12
+ # download (markdown) + model (markdown HTML link) + team + metrics
13
  return ["markdown", "markdown", "str"] + ["number"] * len(metric_cols)
14
 
15
 
src/display/formatting.py CHANGED
@@ -1,21 +1,21 @@
1
  def make_clickable_model(model_name: str) -> str:
2
- """Clickable model name as CommonMark (safe for Leaderboard markdown cells)."""
3
  link = f"https://huggingface.co/{model_name}"
4
- # Escape markdown special chars in the label; keep the URL as-is.
5
- label = (
6
- str(model_name)
7
- .replace("\\", "\\\\")
8
- .replace("[", "\\[")
9
- .replace("]", "\\]")
10
  )
11
- return f"[{label}]({link})"
12
 
13
 
14
  def make_download_cell(download_url: str | None = None) -> str:
15
- """Single download-arrow markdown link for a dedicated column."""
16
  if not download_url:
17
  return ""
18
- return f'[⬇️]({download_url} "Скачать сабмит")'
 
 
 
19
 
20
 
21
  def styled_error(error):
 
1
  def make_clickable_model(model_name: str) -> str:
2
+ """HTML link used on Datasets tab tables."""
3
  link = f"https://huggingface.co/{model_name}"
4
+ return (
5
+ f'<a target="_blank" href="{link}" '
6
+ f'style="color: var(--link-text-color); text-decoration: underline;'
7
+ f'text-decoration-style: dotted;">{model_name}</a>'
 
 
8
  )
 
9
 
10
 
11
  def make_download_cell(download_url: str | None = None) -> str:
12
+ """Only the download arrow icon (HTML <a>, rendered by markdown columns)."""
13
  if not download_url:
14
  return ""
15
+ return (
16
+ f'<a href="{download_url}" target="_blank" rel="noopener noreferrer" '
17
+ f'download title="Скачать сабмит">⬇️</a>'
18
+ )
19
 
20
 
21
  def styled_error(error):
src/display/utils.py CHANGED
@@ -20,7 +20,7 @@ class ColumnContent:
20
  ## Leaderboard columns
21
  class AutoEvalColumn:
22
  model_type_symbol = ColumnContent("T", "str", False, never_hidden=True)
23
- model = ColumnContent("Model", "markdown", True, never_hidden=True)
24
  team = ColumnContent("Team", "str", True, never_hidden=True)
25
  average = ColumnContent("Total Score ⬆️", "number", True)
26
  model_type = ColumnContent("Type", "str", False)
 
20
  ## Leaderboard columns
21
  class AutoEvalColumn:
22
  model_type_symbol = ColumnContent("T", "str", False, never_hidden=True)
23
+ model = ColumnContent("Model", "str", True, never_hidden=True)
24
  team = ColumnContent("Team", "str", True, never_hidden=True)
25
  average = ColumnContent("Total Score ⬆️", "number", True)
26
  model_type = ColumnContent("Type", "str", False)
src/leaderboard/store.py CHANGED
@@ -37,10 +37,12 @@ def submission_zip_repo_path_for_model(model: str) -> str:
37
 
38
 
39
  def submission_download_url(model: str) -> str | None:
40
- """Public Hugging Face URL for the stored submission ZIP, if available."""
41
  from src.envs import RESULTS_DATASET_REPO
42
 
43
- if not RESULTS_DATASET_REPO or not has_submission_zip(model):
 
 
44
  return None
45
  path = submission_zip_repo_path_for_model(model)
46
  return (
@@ -49,6 +51,18 @@ def submission_download_url(model: str) -> str | None:
49
  )
50
 
51
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  def has_submission(model: str) -> bool:
53
  return os.path.isfile(result_path_for_model(model))
54
 
 
37
 
38
 
39
  def submission_download_url(model: str) -> str | None:
40
+ """Hugging Face URL for the stored submission ZIP, if available."""
41
  from src.envs import RESULTS_DATASET_REPO
42
 
43
+ if not RESULTS_DATASET_REPO:
44
+ return None
45
+ if not has_submission_zip(model) and not _submission_lists_archive(model):
46
  return None
47
  path = submission_zip_repo_path_for_model(model)
48
  return (
 
51
  )
52
 
53
 
54
+ def _submission_lists_archive(model: str) -> bool:
55
+ path = result_path_for_model(model)
56
+ if not os.path.isfile(path):
57
+ return False
58
+ try:
59
+ with open(path, encoding="utf-8") as fp:
60
+ payload = json.load(fp)
61
+ except Exception:
62
+ return False
63
+ return bool(payload.get("submission_archive"))
64
+
65
+
66
  def has_submission(model: str) -> bool:
67
  return os.path.isfile(result_path_for_model(model))
68
 
src/populate.py CHANGED
@@ -22,37 +22,30 @@ from src.leaderboard.store import submission_download_url
22
  from src.leaderboard.sync import sync_results_from_hub
23
 
24
 
25
- def _with_model_links_and_downloads(df: pd.DataFrame, model_col: str) -> pd.DataFrame:
26
- """Localize names, add download column, render model links as markdown."""
27
- if model_col == AutoEvalColumn.model.name:
28
- df = localize_main_leaderboard_df(df)
29
- model_col = MODEL_COL
30
- else:
31
- df = localize_dataset_leaderboard_df(df)
32
- model_col = MODEL_COL if MODEL_COL in df.columns else model_col
33
-
34
  if df.empty or model_col not in df.columns:
35
  return insert_download_column(df, [])
36
 
37
  models = df[model_col].tolist()
38
  downloads = [make_download_cell(submission_download_url(model)) for model in models]
39
- df = insert_download_column(df, downloads)
40
- df[model_col] = [make_clickable_model(model) for model in models]
41
- return df
42
 
43
 
44
  def get_leaderboard_df(cols: list, benchmark_cols: list) -> pd.DataFrame:
45
  rows = get_stored_eval_rows()
46
  if not rows:
47
- empty = pd.DataFrame(columns=cols)
48
- return _with_model_links_and_downloads(empty, AutoEvalColumn.model.name)
49
 
50
  display_rows = [{k: v for k, v in row.items() if not k.startswith("_")} for row in rows]
51
  df = pd.DataFrame.from_records(display_rows)
52
  df = df.sort_values(by=[AutoEvalColumn.average.name], ascending=False)
53
  df = df[cols].round(decimals=2)
54
  df = df[has_no_nan_values(df, benchmark_cols)]
55
- return _with_model_links_and_downloads(df, AutoEvalColumn.model.name)
 
 
56
 
57
 
58
  def get_dataset_leaderboard_df(task_name: str) -> pd.DataFrame:
@@ -64,9 +57,8 @@ def get_dataset_leaderboard_df(task_name: str) -> pd.DataFrame:
64
 
65
  rows = get_stored_eval_rows()
66
  if not rows:
67
- return _with_model_links_and_downloads(
68
- pd.DataFrame(columns=columns), "model"
69
- )
70
 
71
  dataset_rows = []
72
  for row in rows:
@@ -79,23 +71,28 @@ def get_dataset_leaderboard_df(task_name: str) -> pd.DataFrame:
79
  continue
80
 
81
  dataset_row = {
82
- "model": row["_model"],
83
  "team": row[AutoEvalColumn.team.name],
 
84
  }
85
  for col_name, value in metrics.items():
86
  dataset_row[col_name] = round(value, 2) if value is not None else None
87
  dataset_rows.append(dataset_row)
88
 
89
  if not dataset_rows:
90
- return _with_model_links_and_downloads(
91
- pd.DataFrame(columns=columns), "model"
92
- )
93
 
94
- df = pd.DataFrame.from_records(dataset_rows, columns=columns)
95
  if sort_col:
96
  df = df.sort_values(by=sort_col, ascending=False)
97
  df = df.reset_index(drop=True)
98
- return _with_model_links_and_downloads(df, "model")
 
 
 
 
 
99
 
100
 
101
  def get_dataset_info_markdown(task_name: str) -> str:
@@ -116,7 +113,6 @@ def get_all_leaderboard_outputs():
116
  """Reload main and per-dataset tables from results/."""
117
  from src.display.utils import BENCHMARK_COLS, COLS
118
 
119
- # get_leaderboard_df already localizes and attaches the download column.
120
  main_df = get_leaderboard_df(COLS, BENCHMARK_COLS)
121
  dataset_dfs = [get_dataset_leaderboard_df(task.name) for task in Tasks]
122
  return (main_df, *dataset_dfs)
 
22
  from src.leaderboard.sync import sync_results_from_hub
23
 
24
 
25
+ def _attach_downloads(df: pd.DataFrame, model_col: str) -> pd.DataFrame:
26
+ """Add a download-icon column to the left of the model column."""
 
 
 
 
 
 
 
27
  if df.empty or model_col not in df.columns:
28
  return insert_download_column(df, [])
29
 
30
  models = df[model_col].tolist()
31
  downloads = [make_download_cell(submission_download_url(model)) for model in models]
32
+ return insert_download_column(df, downloads)
 
 
33
 
34
 
35
  def get_leaderboard_df(cols: list, benchmark_cols: list) -> pd.DataFrame:
36
  rows = get_stored_eval_rows()
37
  if not rows:
38
+ empty = localize_main_leaderboard_df(pd.DataFrame(columns=cols))
39
+ return _attach_downloads(empty, MODEL_COL)
40
 
41
  display_rows = [{k: v for k, v in row.items() if not k.startswith("_")} for row in rows]
42
  df = pd.DataFrame.from_records(display_rows)
43
  df = df.sort_values(by=[AutoEvalColumn.average.name], ascending=False)
44
  df = df[cols].round(decimals=2)
45
  df = df[has_no_nan_values(df, benchmark_cols)]
46
+ # Keep plain model names (str); only the download column is markdown.
47
+ df = localize_main_leaderboard_df(df)
48
+ return _attach_downloads(df, MODEL_COL)
49
 
50
 
51
  def get_dataset_leaderboard_df(task_name: str) -> pd.DataFrame:
 
57
 
58
  rows = get_stored_eval_rows()
59
  if not rows:
60
+ empty = localize_dataset_leaderboard_df(pd.DataFrame(columns=columns))
61
+ return _attach_downloads(empty, MODEL_COL)
 
62
 
63
  dataset_rows = []
64
  for row in rows:
 
71
  continue
72
 
73
  dataset_row = {
74
+ "model": make_clickable_model(row["_model"]),
75
  "team": row[AutoEvalColumn.team.name],
76
+ "_model_id": row["_model"],
77
  }
78
  for col_name, value in metrics.items():
79
  dataset_row[col_name] = round(value, 2) if value is not None else None
80
  dataset_rows.append(dataset_row)
81
 
82
  if not dataset_rows:
83
+ empty = localize_dataset_leaderboard_df(pd.DataFrame(columns=columns))
84
+ return _attach_downloads(empty, MODEL_COL)
 
85
 
86
+ df = pd.DataFrame.from_records(dataset_rows)
87
  if sort_col:
88
  df = df.sort_values(by=sort_col, ascending=False)
89
  df = df.reset_index(drop=True)
90
+
91
+ model_ids = df["_model_id"].tolist()
92
+ df = df.drop(columns=["_model_id"])
93
+ df = localize_dataset_leaderboard_df(df)
94
+ downloads = [make_download_cell(submission_download_url(model)) for model in model_ids]
95
+ return insert_download_column(df, downloads)
96
 
97
 
98
  def get_dataset_info_markdown(task_name: str) -> str:
 
113
  """Reload main and per-dataset tables from results/."""
114
  from src.display.utils import BENCHMARK_COLS, COLS
115
 
 
116
  main_df = get_leaderboard_df(COLS, BENCHMARK_COLS)
117
  dataset_dfs = [get_dataset_leaderboard_df(task.name) for task in Tasks]
118
  return (main_df, *dataset_dfs)