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 files

Multi-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>

Files changed (3) hide show
  1. CLAUDE.md +19 -0
  2. app.py +13 -7
  3. 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
- agg_dataset_cb = gr.Checkbox(
320
- label="Aggregate by dataset (show mean per benchmark dataset instead of per task)",
321
- value=False,
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
- if len(configs) > 1:
360
- rows_iter = [
361
- (_variant_label(mdf[mdf["_vkey"] == c].iloc[0]), mdf[mdf["_vkey"] == c])
362
- for c in configs
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/