Spaces:
Sleeping
Sleeping
github-actions[bot] Claude Sonnet 5 commited on
Commit Β·
e8805a3
1
Parent(s): 2c21c31
Add show-all-variants toggle to model-drilldown heatmap; document local dev server hygiene
Browse filesMulti-model selection in the heatmap previously always collapsed to
best-variant-per-family. Add a checkbox so all variants of all selected
models can be shown instead.
Also add CLAUDE.md noting that the local Gradio dev server must be
killed after a session (data is cached at process start, so a stale
process serves stale data anyway).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- CLAUDE.md +19 -0
- app.py +13 -7
- src/plots.py +8 -11
CLAUDE.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# CLAUDE.md
|
| 2 |
+
|
| 3 |
+
## Local dev server
|
| 4 |
+
|
| 5 |
+
`app.py` runs a Gradio app on port 7860. When launching it locally to test changes
|
| 6 |
+
(`uv run python app.py` in background), always kill that background process before
|
| 7 |
+
ending the session β do not leave it running after the conversation is done.
|
| 8 |
+
|
| 9 |
+
Before launching, check for and kill any stale instance first:
|
| 10 |
+
|
| 11 |
+
```bash
|
| 12 |
+
pgrep -af "python app.py"
|
| 13 |
+
kill <pids>
|
| 14 |
+
```
|
| 15 |
+
|
| 16 |
+
Data (`load_data()`) is fetched once at import time and cached for the process's
|
| 17 |
+
lifetime β restart the process to pick up new HF Hub data or code changes; a
|
| 18 |
+
browser refresh alone is not enough after a restart, and no restart is needed for
|
| 19 |
+
a plain browser refresh of unchanged code.
|
app.py
CHANGED
|
@@ -117,9 +117,10 @@ def render_variant_heatmap(
|
|
| 117 |
metric_label: str,
|
| 118 |
model_alias: list[str] | str,
|
| 119 |
aggregate_by_dataset: bool = False,
|
|
|
|
| 120 |
):
|
| 121 |
key = _metric_key(metric_label)
|
| 122 |
-
return heatmap_variants(df, key, model_alias, aggregate_by_dataset)
|
| 123 |
|
| 124 |
|
| 125 |
def update_category_choices(df: pd.DataFrame, datasets: list[str] | None = None):
|
|
@@ -316,10 +317,15 @@ with gr.Blocks(title="DNA Benchmark Leaderboard", theme=gr.themes.Soft()) as dem
|
|
| 316 |
multiselect=True,
|
| 317 |
label="Select model(s) β single model: all variants as rows; multiple: best variant per family",
|
| 318 |
)
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 323 |
variant_violin_fig = gr.Plot(label="Variant comparison (metric per task)")
|
| 324 |
|
| 325 |
# ββ Tab 2: Per-Category Performance βββββββββββββββββββββββββββββββββββ
|
|
@@ -463,8 +469,8 @@ with gr.Blocks(title="DNA Benchmark Leaderboard", theme=gr.themes.Soft()) as dem
|
|
| 463 |
trigger.change(render_per_task, _per_task_triggers, per_task_fig)
|
| 464 |
|
| 465 |
# Variant heatmap: reacts to model selector, metric, filtered data, or aggregation toggle
|
| 466 |
-
_variant_triggers = [filtered_df_state, metric_dd, model_dd, agg_dataset_cb]
|
| 467 |
-
for trigger in [filtered_df_state, metric_dd, model_dd, agg_dataset_cb]:
|
| 468 |
trigger.change(render_variant_heatmap, _variant_triggers, variant_violin_fig)
|
| 469 |
|
| 470 |
# Update category dropdown choices when global filter OR dataset filter changes
|
|
|
|
| 117 |
metric_label: str,
|
| 118 |
model_alias: list[str] | str,
|
| 119 |
aggregate_by_dataset: bool = False,
|
| 120 |
+
show_all_variants: bool = False,
|
| 121 |
):
|
| 122 |
key = _metric_key(metric_label)
|
| 123 |
+
return heatmap_variants(df, key, model_alias, aggregate_by_dataset, show_all_variants)
|
| 124 |
|
| 125 |
|
| 126 |
def update_category_choices(df: pd.DataFrame, datasets: list[str] | None = None):
|
|
|
|
| 317 |
multiselect=True,
|
| 318 |
label="Select model(s) β single model: all variants as rows; multiple: best variant per family",
|
| 319 |
)
|
| 320 |
+
with gr.Row():
|
| 321 |
+
agg_dataset_cb = gr.Checkbox(
|
| 322 |
+
label="Aggregate by dataset (show mean per benchmark dataset instead of per task)",
|
| 323 |
+
value=False,
|
| 324 |
+
)
|
| 325 |
+
show_all_variants_cb = gr.Checkbox(
|
| 326 |
+
label="Show all variants (instead of best variant per family, when multiple models selected)",
|
| 327 |
+
value=False,
|
| 328 |
+
)
|
| 329 |
variant_violin_fig = gr.Plot(label="Variant comparison (metric per task)")
|
| 330 |
|
| 331 |
# ββ Tab 2: Per-Category Performance βββββββββββββββββββββββββββββββββββ
|
|
|
|
| 469 |
trigger.change(render_per_task, _per_task_triggers, per_task_fig)
|
| 470 |
|
| 471 |
# Variant heatmap: reacts to model selector, metric, filtered data, or aggregation toggle
|
| 472 |
+
_variant_triggers = [filtered_df_state, metric_dd, model_dd, agg_dataset_cb, show_all_variants_cb]
|
| 473 |
+
for trigger in [filtered_df_state, metric_dd, model_dd, agg_dataset_cb, show_all_variants_cb]:
|
| 474 |
trigger.change(render_variant_heatmap, _variant_triggers, variant_violin_fig)
|
| 475 |
|
| 476 |
# Update category dropdown choices when global filter OR dataset filter changes
|
src/plots.py
CHANGED
|
@@ -309,11 +309,13 @@ def heatmap_variants(
|
|
| 309 |
metric: str,
|
| 310 |
model_alias: str | list[str],
|
| 311 |
aggregate_by_dataset: bool = False,
|
|
|
|
| 312 |
) -> go.Figure:
|
| 313 |
"""Heatmap: variant rows vs task columns.
|
| 314 |
|
| 315 |
Single model: rows = all config variants.
|
| 316 |
-
Multiple models: rows = best variant per family (highest mean metric for that family)
|
|
|
|
| 317 |
"""
|
| 318 |
metric_label = CLASSIFICATION_METRICS.get(metric, metric)
|
| 319 |
|
|
@@ -337,7 +339,7 @@ def heatmap_variants(
|
|
| 337 |
|
| 338 |
mdf["_vkey"] = _variant_key_col(mdf)
|
| 339 |
|
| 340 |
-
if multi_model:
|
| 341 |
rows_iter = []
|
| 342 |
for m in model_aliases:
|
| 343 |
family_df = mdf[mdf["model_alias"] == m]
|
|
@@ -356,15 +358,10 @@ def heatmap_variants(
|
|
| 356 |
configs = sorted(
|
| 357 |
c for c in mdf["_vkey"].unique() if mdf[mdf["_vkey"] == c][metric].notna().any()
|
| 358 |
)
|
| 359 |
-
|
| 360 |
-
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
]
|
| 364 |
-
elif len(configs) == 1:
|
| 365 |
-
rows_iter = [(_variant_label(mdf[mdf["_vkey"] == configs[0]].iloc[0]), mdf[mdf["_vkey"] == configs[0]])]
|
| 366 |
-
else:
|
| 367 |
-
rows_iter = []
|
| 368 |
|
| 369 |
# A task/dataset only gets a column if the selected metric is ever reported for it β
|
| 370 |
# e.g. bulk_rna_expression is regression-only (r2_test), so it never has mcc_test/
|
|
|
|
| 309 |
metric: str,
|
| 310 |
model_alias: str | list[str],
|
| 311 |
aggregate_by_dataset: bool = False,
|
| 312 |
+
show_all_variants: bool = False,
|
| 313 |
) -> go.Figure:
|
| 314 |
"""Heatmap: variant rows vs task columns.
|
| 315 |
|
| 316 |
Single model: rows = all config variants.
|
| 317 |
+
Multiple models: rows = best variant per family (highest mean metric for that family),
|
| 318 |
+
unless show_all_variants is True, in which case every variant of every selected model is a row.
|
| 319 |
"""
|
| 320 |
metric_label = CLASSIFICATION_METRICS.get(metric, metric)
|
| 321 |
|
|
|
|
| 339 |
|
| 340 |
mdf["_vkey"] = _variant_key_col(mdf)
|
| 341 |
|
| 342 |
+
if multi_model and not show_all_variants:
|
| 343 |
rows_iter = []
|
| 344 |
for m in model_aliases:
|
| 345 |
family_df = mdf[mdf["model_alias"] == m]
|
|
|
|
| 358 |
configs = sorted(
|
| 359 |
c for c in mdf["_vkey"].unique() if mdf[mdf["_vkey"] == c][metric].notna().any()
|
| 360 |
)
|
| 361 |
+
rows_iter = [
|
| 362 |
+
(_variant_label(mdf[mdf["_vkey"] == c].iloc[0]), mdf[mdf["_vkey"] == c])
|
| 363 |
+
for c in configs
|
| 364 |
+
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 365 |
|
| 366 |
# A task/dataset only gets a column if the selected metric is ever reported for it β
|
| 367 |
# e.g. bulk_rna_expression is regression-only (r2_test), so it never has mcc_test/
|