#!/usr/bin/env python3
"""Gradio wrapper that serves the HTML eval leaderboard with auth + public URL."""
import argparse
import csv
import html
import json
import re
from pathlib import Path
import gradio as gr
STAGES = [
("all", "All"),
("image", "Stage 1 - Image"),
("video", "Stage 2 - Video"),
("vlm", "Stage 3 - VLM"),
("mllm", "Stage 4 - MLLM"),
]
GLOBAL_CATEGORIES = [
("all", "All"),
("prod", "Prod Models"),
("baseline", "Baselines"),
("research", "Research"),
]
GCAT_LABELS = {"prod": "Prod Models", "baseline": "Baselines", "research": "Research"}
GCAT_ORDER = {"prod": 0, "baseline": 1, "research": 2}
PROD_MODELS = {
"prod_v1_100m": {
"display_name": "Prod v1, 100M",
"wandb_url": "https://czi.wandb.io/ai_imaging/dca-pretraining/runs/7roeq1ro",
"base_model": "",
"owner": "Ritvik Vasan",
},
"fg12bbfr_v2_100m": {
"display_name": "Prod v2, 100M",
"wandb_url": "https://czi.wandb.io/ai_imaging/dca-pretraining/runs/fg12bbfr",
"base_model": "",
"owner": "Ritvik Vasan",
},
"baseline_fg12bbfr": {
"display_name": "Prod v2, 100M (frozen eval)",
"wandb_url": "https://czi.wandb.io/ai_imaging/dca-pretraining/runs/fg12bbfr",
"base_model": "",
"owner": "Markus Marks",
},
"prod_v2_300m": {
"display_name": "Prod v2, 300M",
"wandb_url": "https://czi.wandb.io/ai_imaging/dca-pretraining/runs/fr0a2kxv",
"base_model": "Prod v2, 100M",
"owner": "Ritvik Vasan",
},
"prod_v1_vit_s_250000": {
"display_name": "Prod v1, ViT-S (250k)",
"wandb_url": "",
"base_model": "",
"owner": "Ritvik Vasan",
},
"prod_v1_vit_b_100000": {
"display_name": "Prod v1, ViT-B (100k)",
"wandb_url": "",
"base_model": "",
"owner": "Ritvik Vasan",
},
}
BASELINE_NAMES = {
"dino_vitb16",
"dino_vits16",
"dinov1_zeroshot",
"dinov2_vitb14",
"dinov2_vits14",
"dinov3_vitb16",
"openphenom_alfi_fix",
"openphenom_cellphie_h100",
"openphenom_fast",
"vjepa2_L",
"vjepa2_vitb_384",
"aot_dinov2s",
"aot_dinov3b",
"aot_dinov3s",
"aot_vjepa2",
"dc_dinov2s",
"dc_dinov3b",
"dc_dinov3s",
"dc_vjepa2",
"lc_vjepa2",
"lc64_vjepa2",
}
EVAL_SETS = {
"image": {"chammi", "cellphie", "hpav23", "idr0017", "rbc-mc", "jumpcp",
"allencell_nuclear", "allencell_static", "opencell", "rxrx1",
"livecell", "biad2515", "cellstate", "rxrx3_core"},
"video": {"erk", "alfi", "dynacell_annotated", "cbvcc_probe"},
"vlm": {"ret1k", "ret85k", "decoding", "ret500", "vlm"},
}
_SCALING_MILESTONES = {
"prod_v1_vit_s_3500", "prod_v1_vit_s_10500", "prod_v1_vit_s_50000",
"prod_v1_vit_s_100000", "prod_v1_vit_s_150000", "prod_v1_vit_s_200000",
"prod_v1_vit_b_1000", "prod_v1_vit_b_3000", "prod_v1_vit_b_9500",
"prod_v1_vit_b_50000",
}
def _global_cat(name: str, ws: str) -> str:
if name in _SCALING_MILESTONES:
return "research"
if name in PROD_MODELS:
return "prod"
if ws == "ws_prod":
return "prod"
if name in BASELINE_NAMES or ws == "baseline":
return "baseline"
return "research"
def _detect_checkpoint_series(name: str) -> str | None:
m = re.match(r"^(prod_v\d+_vit_[a-z])_\d+$", name)
if m:
return m.group(1)
m = re.match(r"^epoch-\d+-step-\d+(_frozen)?$", name)
if m:
return "prod_milestones"
m = re.match(r"^(.+?)_epoch-\d+-step-\d+(_frozen)?$", name)
if m:
return m.group(1)
return None
def _extract_step(name: str) -> int:
m = re.search(r"step-(\d+)", name)
if m:
return int(m.group(1))
m = re.search(r"_(\d+)$", name)
if m:
return int(m.group(1))
return 0
def _detect_baseline_family(name: str) -> str | None:
lower = name.lower()
if "morphem" in lower:
return "MorphEm"
if "openphenom" in lower:
return "OpenPhenom"
if "vjepa" in lower:
return "V-JEPA"
if "dinov3" in lower:
return "DINOv3"
if "dinov2" in lower:
return "DINOv2"
if "dino" in lower:
return "DINO v1"
if "clip" in lower:
return "CLIP"
return None
TEAM_MEMBERS = [
"Trang Le",
"Ritvik Vasan",
"Benjamin Gallusser",
"Kyle Harrington",
"Alexander Lin",
"Markus Marks",
]
# Map group name -> column name that is the summary metric (shown when collapsed)
WORKSTREAM_MAP = {
"baseline_dinov2_vitb14_frozen": "baseline",
"baseline_dinov3_vitb16_frozen": "baseline",
"baseline_dino_vitb16_frozen": "baseline",
"baseline_dino_vits16_frozen": "baseline",
"dinov2_vitb14_zeroshot": "baseline",
"dinov3_vitb16_zeroshot": "baseline",
"dino_vitb16_zeroshot": "baseline",
"dino_vits16_zeroshot": "baseline",
"prod_v1_100m": "ws_prod",
"prod_v2_300m": "ws_prod",
"v2_100m_base": "ws_prod",
"v2_vits_100k_baseline": "ws1b",
"ws4p6_repro3_frozen": "ws4",
"ws4p6_twostage_long": "ws4",
"ws4p6_weight_schedule": "ws4",
"ws4p7_anchor_decay_frozen": "ws4",
"ws4p7_strong_anchor_frozen": "ws4",
"ws4p8a_decay_high_end_frozen": "ws4",
"ws4p8b_constant_frozen": "ws4",
"ws4p8c_long_decay_frozen": "ws4",
"ws4p9a_very_long_frozen": "ws4",
"ws4p9b_dinov3_anchor_frozen": "ws4",
"ws4p10a_unmasked_frozen": "ws4",
"ws4p10b_twostage_repro_frozen": "ws4",
"ws4p11a_multigpu_fixed": "ws4",
"ws4p11a_multigpu_frozen": "ws4",
"ws4p11b_30k_frozen": "ws4",
"ws4p12a_no_anchor_frozen": "ws4",
"ws4p12b_8crops_frozen": "ws4",
"ws4p13a_two_backward_frozen": "ws4",
"ws4p13b_single_bw_frozen": "ws4",
"ws4p13d_two_bw_v2_frozen": "ws4",
"ws4p13e_2bw_w1_frozen": "ws4",
"ws4p14a_fp32_frozen": "ws4",
"ws4p14b_2bw_fp32_frozen": "ws4",
"v2_baseline_full": "ws1a",
"v2_baseline_200k_full": "ws1a",
"v2_baseline_s100000": "ws1a",
"v2_ccp_full": "ws1a",
"v2_ccp_s100000": "ws1a",
"v2_cmr_full": "ws1a",
"v2_cmr_s100000": "ws1a",
"v2_icvit_50k_full": "ws1a",
"v2_icvit_aug_full": "ws1a",
"v2_icvit_phase2_full": "ws1a",
"v2_icvit_phase2_s100000": "ws1a",
"v2_icvit_cmr_bf_full": "ws1a",
"v2_icvit_cmr_bf_aug_full": "ws1a",
"v2_vcsym_full": "ws1a",
"v2_vcsym_s100000": "ws1a",
"v2_vits_100k_ccp": "ws1b",
"v2_vits_100k_cmr": "ws1b",
"v2_vits_100k_dino_v17_cls": "ws1b",
"v2_vits_100k_dino_v17_spatial": "ws1b",
"v2_vits_100k_icvit_50k": "ws1b",
"v2_vits_100k_icvit_aug": "ws1b",
"v2_vits_100k_icvit_phase2": "ws1b",
"v2_vits_100k_icvit_cmr_bf": "ws1b",
"v2_vits_100k_virtual_channels_sym": "ws1b",
"v2_vits_100k_dino_v18_dinov2_epoch-0000-step-100000_frozen": "ws41",
"v2_vits_100k_dino_v18_epoch-0000-step-100000_frozen": "ws41",
"v2_vits_100k_dino_v18_koleo_epoch-0000-step-100000_frozen": "ws41",
"v2_vits_100k_dino_v19_224_epoch-0000-step-10000_frozen": "ws41",
"v2_vits_100k_dino_v19_224_epoch-0000-step-20000_frozen": "ws41",
"v2_vits_100k_dino_v19_224_epoch-0000-step-30000_frozen": "ws41",
"v2_vits_100k_dino_v19_224_epoch-0000-step-40000_frozen": "ws41",
"v2_vits_100k_dino_v19_224_epoch-0000-step-50000_frozen": "ws41",
"v2_vits_100k_dino_v19_perchannel_epoch-0000-step-10000_frozen": "ws41",
"v2_vits_100k_dino_v19_perchannel_epoch-0000-step-20000_frozen": "ws41",
"v2_vits_100k_dino_v19_perchannel_epoch-0000-step-30000_frozen": "ws41",
"v2_vits_100k_dino_v19_perchannel_epoch-0000-step-40000_frozen": "ws41",
"v2_vits_100k_dino_v19_perchannel_epoch-0000-step-50000_frozen": "ws41",
"v2_vits_100k_dino_v19_perchannel_epoch-0000-step-60000_frozen": "ws41",
"v2_vits_100k_dino_v19_perchannel_epoch-0000-step-70000_frozen": "ws41",
"v2_vits_100k_swav_epoch-0000-step-10000_frozen": "ws1b",
"v2_vits_100k_swav_epoch-0000-step-20000_frozen": "ws1b",
"v2_vits_100k_swav_epoch-0000-step-30000_frozen": "ws1b",
"v2_vits_100k_swav_epoch-0000-step-60000_frozen": "ws1b",
"v2_vits_100k_swav_epoch-0000-step-80000_frozen": "ws1b",
"v2_vits_100k_swav_epoch-0000-step-90000_frozen": "ws1b",
"v2_vits_200k_dino_v18_long_epoch-0000-step-100000_frozen": "ws41",
"v2_vits_200k_dino_v18_long_epoch-0000-step-110000_frozen": "ws41",
"v2_vits_200k_dino_v18_long_epoch-0000-step-140000_frozen": "ws41",
"v2_vits_200k_dino_v18_long_epoch-0000-step-150000_frozen": "ws41",
"v2_vits_100k_icvit_phase2_cmr_bf_asym025_epoch-0000-step-100000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_asym025_epoch-0000-step-80000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_asym025_epoch-0000-step-90000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_cvi_epoch-0000-step-60000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_cvi_epoch-0000-step-70000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_cvi_epoch-0000-step-80000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_cvi_epoch-0000-step-90000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_cvi_epoch-0000-step-100000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_gcca_epoch-0000-step-70000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_gcca_epoch-0000-step-80000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_gcca_epoch-0000-step-90000_frozen": "ws10",
"v2_vits_100k_icvit_phase2_cmr_bf_gcca_epoch-0000-step-100000_frozen": "ws10",
"v2_vits_l1000_pilot_epoch-0000-step-10000_frozen": "ws11",
"v2_vits_l1000_control_epoch-0000-step-10000_frozen": "ws11",
"v2_vits_esm3_pilot_epoch-0000-step-10000_frozen": "ws7",
"pathway_w001_step10000_frozen": "ws7",
"pathway_w001_step10000_full": "ws7",
"video_mae_10m_no_affine_hetero": "ws10",
"video_mae_10m_ccp": "ws1b",
"video_mae_10m_cmr": "ws1b",
"video_mae_10m_contrastive": "ws1b",
"video_mae_10m_ibot_dino1": "ws42",
"video_mae_10m_ibot": "ws42",
"video_mae_10m_icvit_phase1": "ws1a",
"video_mae_10m_icvit_phase2": "ws1a",
"video_mae_10m_no_affine_bf16_lr1e3_mae_init": "ws1b",
"video_mae_10m_no_affine_bf16": "ws1b",
"video_mae_10m_celldino_aug": "ws6",
"vlm_coca_100m_phase2": "ws8",
"vlm_coca_phase2": "ws8",
"vlm_bert_init_100m_500k": "ws8",
"vlm_coca_100m_500k": "ws8",
"vlm_coca_100m_800k": "ws8",
"vlm_coca_300m_200k": "ws8",
"vlm_siglip_coca_100m_100k": "ws8",
"vlm_siglip_only_100m_100k": "ws8",
"vlm_distill_100m_200k": "ws8",
"vlm_pe_distill_100m_200k": "ws8",
"vlm_llm500k_100m_200k": "ws8",
"vlm_llm500k_1000k_100m_300k": "ws8",
"vlm_newbio_100m_200k": "ws8",
"vlm_rnd500k_100m_200k": "ws8",
"vlm_mc_100m_200k_opencell": "ws8",
"vlm_dca_distill_pe_100m_200k": "ws8",
"vlm_coca_300m_200k_cellphie": "ws8",
"vlm_coca_300m_200k_cellphie_v2": "ws8",
"vlm_v3_baseline": "ws8",
"vlm_v3_bert_init": "ws8",
"vlm_v3_distill_kl": "ws8",
"vlm_v3_distill_pe": "ws8",
"vlm_v3_hardneg": "ws8",
"vlm_v3_hardneg_skip5": "ws8",
"vlm_v3_mask_reg": "ws8",
"vlm_v3_paired_clean": "ws8",
"vlm_v3_paired_raw": "ws8",
"vlm_v3_siglip": "ws8",
"vlm_v4_eval_v4_500k_fast": "ws8",
"vlm_v4_eval_v4_baseline_dca_fast": "ws8",
"vlm_ret_biomedclip_pretrained": "ws8",
"vlm_ret_coca_200k_100m": "ws8",
"vlm_ret_coca_300m_phase2": "ws8",
"vlm_ret_coca_phase2_100m": "ws8",
"vlm_ret_phase1_frozen_100m": "ws8",
"vlm_ret_siglip2_100m": "ws8",
"vlm_ret_siglip_loca_100m": "ws8",
"vlm_ret_siglip_only_100m": "ws8",
"vlm_ret500_coca_500k": "ws8",
"vlm_ret500_distill_100m": "ws8",
"vlm_ret500_distill_pe_100m": "ws8",
"vlm_ret500_entity500k_100m": "ws8",
"vlm_ret500_llm500k_100m": "ws8",
"vlm_ret500_mc_100m": "ws8",
"vlm_ret500_mc_native_100m": "ws8",
"vlm_ret500_mc_vanilla_100m": "ws8",
"vlm_ret500_newbio_100m": "ws8",
"vlm_ret500_ontology500k_100m": "ws8",
"vlm_ret500_rnd500k_100m": "ws8",
"vlm_ret500_siglip2_100m": "ws8",
"vlm_ret500_siglip_coca_100m": "ws8",
"vlm_ret500_siglip_only_100m": "ws8",
"epoch-0000-step-10000_frozen": "ws_prod",
"epoch-0000-step-20000_frozen": "ws_prod",
"epoch-0000-step-30000_frozen": "ws_prod",
"epoch-0000-step-40000_frozen": "ws_prod",
"epoch-0000-step-50000_frozen": "ws_prod",
"epoch-0000-step-60000_frozen": "ws_prod",
"epoch-0000-step-70000_frozen": "ws_prod",
"epoch-0000-step-80000_frozen": "ws_prod",
"epoch-0000-step-90000_frozen": "ws_prod",
"epoch-0000-step-100000_frozen": "ws_prod",
"epoch-0000-step-160000_frozen": "ws_prod",
"epoch-0000-step-170000_frozen": "ws_prod",
"epoch-0000-step-180000_frozen": "ws_prod",
"epoch-0000-step-190000_frozen": "ws_prod",
"epoch-0000-step-200000_frozen": "ws_prod",
"epoch-0439-step-13640_frozen": "ws_prod",
"epoch-0617-step-19189_frozen": "ws_prod",
"v2_10m_celldino_complete_epoch-0000-step-100000_frozen": "ws6",
"v2_10m_100k_shallow_dec": "ws1b",
"v2_10m_100k_shallow_dec_epoch-0000-step-80000_frozen": "ws1b",
"v2_10m_100k_shallow_dec_epoch-0000-step-90000_frozen": "ws1b",
"v2_10m_100k_shallow_dec_epoch-0000-step-100000_frozen": "ws1b",
"v17_dino_cls_s100000": "ws1b",
"v17_dino_spatial_s100000": "ws1b",
}
WORKSTREAM_LABELS = {
"all": "All",
"baseline": "Baselines",
"ws_prod": "Prod Runs",
"ws1a": "WS1a Virtual Ch.",
"ws1b": "WS1b Image Rep.",
"ws4": "WS4 DINO-FT",
"ws6": "WS6 Augmentations",
"ws7": "WS7 BioAlign",
"ws8": "WS8 VLM",
"ws10": "WS10 Hetero",
"ws11": "WS11 L1000",
"ws41": "WS41 DINOv2",
"ws42": "WS42 iBOT",
}
SUMMARY_COLS = {
"chammi": "chammi/chammi_macro_f1",
"cellphie": "cellphie/cellphie_macro_f1",
"hpav23": "hpav23/hpav23_Average Precision",
"idr0017": "idr0017/idr0017_katamari_early_fusion",
"rbc-mc": "rbc-mc/rbcmc_overall_accuracy",
"jumpcp": "jumpcp/jumpcp_mean_map",
"allencell_nuclear": "allencell_nuclear/allencell_nuclear_psnr",
"allencell_static": "allencell_static/allencell_static_ssim",
"opencell": "opencell/opencell_micro_f1",
"erk": "erk/erk_ssim",
"cellstate": "cellstate/cellstate/gene_lr_accuracy",
"rxrx1": "rxrx1/rxrx1_percent_matching",
"livecell": "livecell/livecell_accuracy",
"biad2515": "biad2515/biad2515_accuracy",
"rxrx3_core": "rxrx3_core/rxrx3_core_pert_signal_median_magnitude",
"alfi": None,
"ret1k": "ret1k/ret1k_i2t_r1",
"ret85k": "ret85k/ret85k_i2t_r1",
"decoding": "decoding/dec_clipscore",
"ret500": "ret500/i2t_r@1",
}
VLM_COL_MAP = {
"chammi_macro_f1": "chammi/chammi_macro_f1",
"chammi_accuracy": "chammi/chammi_accuracy",
"cellphie_macro_f1": "cellphie/cellphie_macro_f1",
"cellphie_auc": "cellphie/cellphie_macro_auc",
"rbcmc_accuracy": "rbc-mc/rbcmc_overall_accuracy",
"rbcmc_swiss": "rbc-mc/rbcmc_swiss_accuracy",
"rbcmc_canadian": "rbc-mc/rbcmc_canadian_accuracy",
"opencell_micro_f1": "opencell/opencell_micro_f1",
"hpav23_ap": "hpav23/hpav23_Average Precision",
"idr0017": "idr0017/idr0017_katamari_early_fusion",
"jumpcp_map": "jumpcp/jumpcp_mean_map",
"allen_structure": "allencell_static/allencell_static_structure_label_accuracy",
"allen_mitotic": "allencell_nuclear/allencell_nuclear_mitotic_label_accuracy",
}
def _parse_float(v: str) -> float | None:
v = v.strip()
if v == "":
return None
try:
return float(v)
except ValueError:
return None
def load_results(results_dir: Path) -> tuple[list[str], dict[str, list[float | None]]]:
header_path = results_dir / "header.txt"
raw_columns = header_path.read_text().strip().split(",")
keep = [
i for i, c in enumerate(raw_columns) if c.strip() and c.strip() != "placeholder"
]
columns = [raw_columns[i] for i in keep]
rows: dict[str, list[float | None]] = {}
for txt in sorted(results_dir.glob("*.txt")):
if txt.name in ("header.txt", "header2.txt", "chammi.txt", "row.txt"):
continue
model = txt.stem
vals_raw = txt.read_text().strip().split(",")
all_vals = [_parse_float(v) for v in vals_raw]
while len(all_vals) < len(raw_columns):
all_vals.append(None)
rows[model] = [all_vals[i] for i in keep]
# --- Load VLM results from multiple sources ---
vlm_dir = results_dir / "vlm"
if not vlm_dir.exists():
return columns, rows
# 1) Determine VLM-only columns from vlm_eval_all.txt header
vlm_all_path = vlm_dir / "vlm_eval_all.txt"
vlm_only_col_names: list[str] = []
if vlm_all_path.exists():
vlm_header = vlm_all_path.read_text().strip().splitlines()[0].split(",")
for vc in vlm_header:
if vc == "checkpoint" or vc in VLM_COL_MAP:
continue
if vc.startswith("ret1k_"):
vlm_only_col_names.append("ret1k/" + vc)
elif vc.startswith("ret85k_"):
vlm_only_col_names.append("ret85k/" + vc)
elif vc.startswith("dec_"):
vlm_only_col_names.append("decoding/" + vc)
elif vc.startswith("alfi_"):
vlm_only_col_names.append("alfi/" + vc)
else:
vlm_only_col_names.append("vlm/" + vc)
# Also add retrieval_evals columns
ret_header_path = vlm_dir / "retrieval_evals" / "header.txt"
ret_eval_cols: list[str] = []
if ret_header_path.exists():
for rc in ret_header_path.read_text().strip().split(","):
full = "ret500/" + rc.strip()
if full not in vlm_only_col_names:
ret_eval_cols.append(full)
all_new_cols = vlm_only_col_names + ret_eval_cols
columns.extend(all_new_cols)
n_new = len(all_new_cols)
for model in rows:
rows[model].extend([None] * n_new)
def _col_idx(name: str) -> int | None:
try:
return columns.index(name)
except ValueError:
return None
def _set_val(vals: list, col_name: str, fval: float | None):
idx = _col_idx(col_name)
if idx is not None and fval is not None:
if vals[idx] is None:
vals[idx] = fval
def _ensure_row(name: str) -> list:
if name not in rows:
rows[name] = [None] * len(columns)
return rows[name]
# 2) Load vlm_eval_all.txt
if vlm_all_path.exists():
lines = vlm_all_path.read_text().strip().splitlines()
vlm_header = lines[0].split(",")
for line in lines[1:]:
parts = line.split(",")
model_name = parts[0].strip()
if not model_name:
continue
prefixed = "vlm_" + model_name
vals = _ensure_row(prefixed)
for vi, vc in enumerate(vlm_header):
if vc == "checkpoint" or vi >= len(parts):
continue
fval = _parse_float(parts[vi])
main_col = VLM_COL_MAP.get(vc)
if main_col:
_set_val(vals, main_col, fval)
elif vc.startswith("ret1k_"):
_set_val(vals, "ret1k/" + vc, fval)
elif vc.startswith("ret85k_"):
_set_val(vals, "ret85k/" + vc, fval)
elif vc.startswith("dec_"):
_set_val(vals, "decoding/" + vc, fval)
elif vc.startswith("alfi_"):
_set_val(vals, "alfi/" + vc, fval)
else:
_set_val(vals, "vlm/" + vc, fval)
# 3) Load retrieval_evals/ (CSV rows with header)
ret_evals_dir = vlm_dir / "retrieval_evals"
if ret_evals_dir.exists() and ret_header_path.exists():
ret_hdr = ret_header_path.read_text().strip().split(",")
for txt in sorted(ret_evals_dir.glob("*.txt")):
if txt.name == "header.txt":
continue
model_name = "vlm_ret_" + txt.stem
parts = txt.read_text().strip().split(",")
vals = _ensure_row(model_name)
for ri, rc in enumerate(ret_hdr):
if ri < len(parts):
_set_val(vals, "ret500/" + rc.strip(), _parse_float(parts[ri]))
# 4) Load vision_evals/*.csv, v3_evals/vision_*.csv, v4_baseline/*.csv (long format)
LONG_FORMAT_METRIC_MAP = {
"cellphie_macro_f1": "cellphie/cellphie_macro_f1",
"cellphie_macro_auc": "cellphie/cellphie_macro_auc",
"chammi_macro_f1": "chammi/chammi_macro_f1",
"chammi_accuracy": "chammi/chammi_accuracy",
"chammi_Allen_Task_one_f1": "chammi/chammi_Allen_Task_one_f1",
"chammi_Allen_Task_one_accuracy": "chammi/chammi_Allen_Task_one_accuracy",
"chammi_Allen_Task_two_f1": "chammi/chammi_Allen_Task_two_f1",
"chammi_Allen_Task_two_accuracy": "chammi/chammi_Allen_Task_two_accuracy",
"chammi_HPA_Task_one_f1": "chammi/chammi_HPA_Task_one_f1",
"chammi_HPA_Task_one_accuracy": "chammi/chammi_HPA_Task_one_accuracy",
"chammi_HPA_Task_two_f1": "chammi/chammi_HPA_Task_two_f1",
"chammi_HPA_Task_two_accuracy": "chammi/chammi_HPA_Task_two_accuracy",
"chammi_HPA_Task_three_f1": "chammi/chammi_HPA_Task_three_f1",
"chammi_HPA_Task_three_accuracy": "chammi/chammi_HPA_Task_three_accuracy",
"chammi_CP_Task_one_f1": "chammi/chammi_CP_Task_one_f1",
"chammi_CP_Task_one_accuracy": "chammi/chammi_CP_Task_one_accuracy",
"chammi_CP_Task_two_f1": "chammi/chammi_CP_Task_two_f1",
"chammi_CP_Task_two_accuracy": "chammi/chammi_CP_Task_two_accuracy",
"chammi_CP_Task_three_f1": "chammi/chammi_CP_Task_three_f1",
"chammi_CP_Task_three_accuracy": "chammi/chammi_CP_Task_three_accuracy",
"chammi_CP_Task_four_f1": "chammi/chammi_CP_Task_four_f1",
"chammi_CP_Task_four_accuracy": "chammi/chammi_CP_Task_four_accuracy",
"hpav23_Average Precision": "hpav23/hpav23_Average Precision",
"hpav23_AUC": "hpav23/hpav23_AUC",
"hpav23_Label Ranking Average Precision": "hpav23/hpav23_Label Ranking Average Precision",
"hpav23_Micro Average Precision": "hpav23/hpav23_Micro Average Precision",
"rbcmc_swiss_accuracy": "rbc-mc/rbcmc_swiss_accuracy",
"rbcmc_canadian_accuracy": "rbc-mc/rbcmc_canadian_accuracy",
"rbcmc_overall_accuracy": "rbc-mc/rbcmc_overall_accuracy",
"idr0017_katamari_early_fusion": "idr0017/idr0017_katamari_early_fusion",
"jumpcp_mean_map": "jumpcp/jumpcp_mean_map",
"jumpcp_active_ratio": "jumpcp/jumpcp_active_ratio",
"jumpcp_consistent_ratio": "jumpcp/jumpcp_consistent_ratio",
"jumpcp_overall_map": "jumpcp/jumpcp_overall_map",
"allencell_static_structure_label_accuracy": "allencell_static/allencell_static_structure_label_accuracy",
"allencell_static_cell_stage_label_accuracy": "allencell_static/allencell_static_cell_stage_label_accuracy",
"allencell_static_ssim": "allencell_static/allencell_static_ssim",
"allencell_nuclear_psnr": "allencell_nuclear/allencell_nuclear_psnr",
"allencell_nuclear_mitotic_label_accuracy": "allencell_nuclear/allencell_nuclear_mitotic_label_accuracy",
"opencell_micro_f1": "opencell/opencell_micro_f1",
"opencell_supervised_roc_auc": "opencell/opencell_supervised_roc_auc",
"erk_ssim": "erk/erk_ssim",
"erk_psnr": "erk/erk_psnr",
"cellstate/gene_lr_accuracy": "cellstate/cellstate/gene_lr_accuracy",
"cellstate/minibinder_knn_accuracy": "cellstate/cellstate/minibinder_knn_accuracy",
}
def _load_long_csv(csv_path: Path, model_prefix: str, model_name: str):
vals = _ensure_row(model_prefix + model_name)
with open(csv_path) as f:
reader = csv.reader(f)
next(reader, None) # skip header
for row in reader:
if len(row) < 3:
continue
metric, value = row[1].strip(), row[2].strip()
mapped = LONG_FORMAT_METRIC_MAP.get(metric)
if mapped:
_set_val(vals, mapped, _parse_float(value))
for csv_path in sorted((vlm_dir / "vision_evals").glob("*.csv")):
name = csv_path.stem
if name.endswith("_cellphie") or name.endswith("_cellphie_v2"):
continue # duplicates
_load_long_csv(csv_path, "vlm_", name)
for csv_path in sorted((vlm_dir / "v3_evals").glob("vision_*.csv")):
name = csv_path.stem.replace("vision_", "")
_load_long_csv(csv_path, "vlm_v3_", name)
for csv_path in sorted((vlm_dir / "v4_baseline").glob("*.csv")):
_load_long_csv(csv_path, "vlm_v4_", csv_path.stem)
# 5) Parse retrieval log files (retrieval_*.txt in vlm/)
for log_path in sorted(vlm_dir.glob("retrieval_*.txt")):
name = log_path.stem.replace("retrieval_", "")
text = log_path.read_text()
i2t_match = re.search(r"Image → Text: \{([^}]+)\}", text)
t2i_match = re.search(r"Text → Image: \{([^}]+)\}", text)
if not i2t_match and not t2i_match:
continue
prefixed = "vlm_ret500_" + name
vals = _ensure_row(prefixed)
for label, match, prefix in [
("i2t", i2t_match, "ret500/i2t_"),
("t2i", t2i_match, "ret500/t2i_"),
]:
if not match:
continue
for kv in match.group(1).split(","):
k, v = kv.split(":")
k = k.strip().strip("'\"")
metric_name = prefix + k.lower()
_set_val(vals, metric_name, _parse_float(v.strip()))
return columns, rows
def load_results_from_manifest(
manifest_path: Path, header_path: Path
) -> tuple[list[str], dict[str, list[float | None]], dict[str, dict]]:
"""Load results from a manifest.jsonl file instead of local results/ glob."""
raw_columns = header_path.read_text().strip().split(",")
keep = [
i for i, c in enumerate(raw_columns) if c.strip() and c.strip() != "placeholder"
]
columns = [raw_columns[i] for i in keep]
rows: dict[str, list[float | None]] = {}
metadata: dict[str, dict] = {}
for line in manifest_path.read_text().strip().splitlines():
if not line.strip():
continue
entry = json.loads(line)
name = entry["name"]
txt_path = entry.get("txt_path", "")
if txt_path and Path(txt_path).exists():
vals_raw = Path(txt_path).read_text().strip().split(",")
all_vals = [_parse_float(v) for v in vals_raw]
while len(all_vals) < len(raw_columns):
all_vals.append(None)
rows[name] = [all_vals[i] for i in keep]
else:
continue
ws = entry.get("workstream", "") or WORKSTREAM_MAP.get(name, "")
user = entry.get("user", "")
ts = entry.get("timestamp", "")
date_short = ts[:10] if ts else ""
prod_meta = PROD_MODELS.get(name, {})
metadata[name] = {
"display_name": prod_meta.get("display_name")
or entry.get("display_name", "")
or name,
"category": WORKSTREAM_LABELS.get(ws, ""),
"stage": entry.get("stage", ""),
"base_model": prod_meta.get("base_model", ""),
"owner": prod_meta.get("owner") or _format_owner(user),
"wandb_url": prod_meta.get("wandb_url", ""),
"status": "",
"eval_source": txt_path,
"model_path": entry.get("checkpoint", ""),
"date": date_short,
"ws": ws,
"global_cat": _global_cat(name, ws),
}
return columns, rows, metadata
def _format_owner(username: str) -> str:
names = {
"mmarks": "Markus Marks",
"bgallusser": "Benjamin Gallusser",
"rvasan": "Ritvik Vasan",
"trang.le": "Trang Le",
"kharrington": "Kyle Harrington",
"alin": "Alexander Lin",
}
return names.get(username, username)
def load_metadata(results_dir: Path) -> dict[str, dict]:
meta_path = results_dir / "metadata.csv"
if not meta_path.exists():
return {}
meta: dict[str, dict] = {}
with open(meta_path) as f:
reader = csv.DictReader(f)
for row in reader:
key = row.get("model_key", "").strip()
if not key and not (row.get("display_name") or "").strip():
continue
entry = {
"display_name": (row.get("display_name") or "").strip(),
"category": (row.get("category") or "").strip(),
"stage": (row.get("stage") or "").strip(),
"base_model": (row.get("base_model") or "").strip(),
"owner": (row.get("owner") or "").strip(),
"wandb_url": (row.get("wandb_url") or "").strip(),
"status": (row.get("status") or "").strip(),
"eval_source": (row.get("eval_source") or "").strip(),
"model_path": (row.get("model_path") or "").strip(),
}
if key:
meta[key] = entry
else:
placeholder_key = f"__no_data__{entry['display_name']}"
meta[placeholder_key] = entry
return meta
def compute_column_groups(columns: list[str]) -> list[tuple[str, list[int]]]:
groups: list[tuple[str, list[int]]] = []
for i, col in enumerate(columns):
group = col.split("/")[0] if "/" in col else col
if groups and groups[-1][0] == group:
groups[-1][1].append(i)
else:
groups.append((group, [i]))
return groups
def short_name(col: str) -> str:
if "/" in col:
parts = col.split("/", 1)
metric = parts[1]
prefix = parts[0] + "_"
if metric.startswith(prefix):
metric = metric[len(prefix) :]
return metric
return col
def column_stats(
rows: dict[str, list[float | None]], num_cols: int
) -> list[tuple[float | None, float | None]]:
stats: list[tuple[float | None, float | None]] = []
for ci in range(num_cols):
vals = [r[ci] for r in rows.values() if r[ci] is not None]
if vals:
stats.append((min(vals), max(vals)))
else:
stats.append((None, None))
return stats
def build_table_parts(
columns: list[str],
rows: dict[str, list[float | None]],
metadata: dict[str, dict],
sort_by: str | None,
) -> tuple[str, str, str]:
groups = compute_column_groups(columns)
stats = column_stats(rows, len(columns))
col_short = [short_name(c) for c in columns]
# Build group info for JS: {name, cols: [indices], summary_idx}
js_groups = []
for grp_name, grp_indices in groups:
summary_col = SUMMARY_COLS.get(grp_name)
summary_idx = None
if summary_col and summary_col in columns:
summary_idx = columns.index(summary_col)
js_groups.append(
{
"name": grp_name,
"cols": grp_indices,
"summary": summary_idx,
}
)
sort_idx = None
if sort_by:
for i, c in enumerate(columns):
if c == sort_by:
sort_idx = i
break
if sort_idx is not None:
sorted_models = sorted(
rows.keys(), key=lambda m: rows[m][sort_idx] or -999, reverse=True
)
else:
sorted_models = sorted(rows.keys())
js_data = []
seen_keys = set()
for model in sorted_models:
meta = metadata.get(model, {})
seen_keys.add(model)
eval_source = meta.get("eval_source", "") or f"results/{model}.txt"
ws = meta.get("ws", "") or WORKSTREAM_MAP.get(model, "")
default_owner = (
"Markus Marks" if ws and ws not in ("baseline", "ws_prod") else ""
)
gcat = meta.get("global_cat") or _global_cat(model, ws)
js_data.append(
{
"key": model,
"name": meta.get("display_name") or model,
"category": meta.get("category", "") or WORKSTREAM_LABELS.get(ws, ""),
"stage": meta.get("stage", ""),
"base_model": meta.get("base_model", ""),
"owner": meta.get("owner", "") or default_owner,
"status": meta.get("status", ""),
"wandb_url": meta.get("wandb_url", ""),
"eval_source": eval_source,
"checkpoint": meta.get("model_path", "") or meta.get("checkpoint", ""),
"date": meta.get("date", ""),
"vals": rows[model],
"catalogued": bool(meta),
"ws": ws,
"gcat": gcat,
"ckpt_series": _detect_checkpoint_series(model),
"step_num": _extract_step(model),
"baseline_family": _detect_baseline_family(model) if gcat == "baseline" else None,
}
)
for key, meta in metadata.items():
if key not in seen_keys and meta.get("display_name"):
ws = meta.get("ws", "")
gcat = meta.get("global_cat") or _global_cat(key, ws)
js_data.append(
{
"key": key,
"name": meta.get("display_name", key),
"category": meta.get("category", ""),
"stage": meta.get("stage", ""),
"base_model": meta.get("base_model", ""),
"owner": meta.get("owner", ""),
"status": meta.get("status", ""),
"wandb_url": meta.get("wandb_url", ""),
"eval_source": meta.get("eval_source", ""),
"checkpoint": meta.get("model_path", "")
or meta.get("checkpoint", ""),
"date": meta.get("date", ""),
"vals": [None] * len(columns),
"catalogued": True,
"ws": ws,
"gcat": gcat,
"ckpt_series": _detect_checkpoint_series(key),
"step_num": _extract_step(key),
"baseline_family": _detect_baseline_family(key) if gcat == "baseline" else None,
}
)
# --- HTML ---
# Workstream tabs — only include workstreams that have at least one result
ws_in_data = sorted({d["ws"] for d in js_data if d["ws"]})
ws_tabs = ''
for ws_key in ws_in_data:
label = WORKSTREAM_LABELS.get(ws_key, ws_key)
ws_tabs += (
f''
)
stage_tabs = "".join(
f''
for key, label in STAGES
)
cat_tabs = "".join(
f''
for key, label in GLOBAL_CATEGORIES
)
owner_tabs = ''
for name in TEAM_MEMBERS:
first = name.split()[0]
owner_tabs += (
f''
)
# Group headers with expand/collapse toggle
group_headers = ""
for grp in js_groups:
n = grp["name"]
ncols = len(grp["cols"])
esc_name = html.escape(n)
if ncols > 1 and grp["summary"] is not None:
group_headers += (
f'
'
f'{esc_name} +
'
)
else:
group_headers += f'
{esc_name}
'
# Column headers — all rendered, JS controls visibility
col_headers = ""
for i in range(len(columns)):
grp_name = columns[i].split("/")[0] if "/" in columns[i] else columns[i]
col_headers += (
f'