Skip to content

Commit ecd38ea

Browse files
smcolbyCopilot
andcommitted
Show query counts in cost bar chart hover tooltips
Each bar segment (DRC, PS→DRC, PS) in the per-iteration cost breakdown panel now shows both the number of queries and the dollar cost on hover, e.g. 'DRC / 10 queries / $100'. - loop.py: compute iter_n_drc_new, iter_n_drc_upgrade, iter_n_ps from new_records and forward them to dashboard.update() - dashboard.py: update() accepts iter_n_drc_new, iter_n_upgrades, iter_n_ps (default 0 for backwards compat); stores counts in the per-iteration snapshot; adds customdata + hovertemplate to the three go.Bar traces in _build_figure() Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 200d2e4 commit ecd38ea

2 files changed

Lines changed: 39 additions & 0 deletions

File tree

moal/dashboard.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,9 @@ def update(
347347
iter_drc_cost: float,
348348
iter_ps_cost: float,
349349
iter_upgrade_cost: float = 0.0,
350+
iter_n_drc_new: int = 0,
351+
iter_n_upgrades: int = 0,
352+
iter_n_ps: int = 0,
350353
model_metric_value: float | None = None,
351354
) -> None:
352355
"""Append iteration data for live display and deferred GIF/HTML export.
@@ -363,6 +366,12 @@ def update(
363366
Total PS cost incurred in the current iteration.
364367
iter_upgrade_cost : float, optional
365368
Portion of ``iter_drc_cost`` attributable to PS→DRC upgrades.
369+
iter_n_drc_new : int, optional
370+
Number of new (first-pass) DRC queries issued this iteration.
371+
iter_n_upgrades : int, optional
372+
Number of PS→DRC upgrade queries issued this iteration.
373+
iter_n_ps : int, optional
374+
Number of PS queries issued this iteration.
366375
model_metric_value : float, optional
367376
Held-out test-set metric for this iteration, or None if unavailable.
368377
"""
@@ -390,6 +399,9 @@ def update(
390399
"iter_drc_cost": iter_drc_cost,
391400
"iter_ps_cost": iter_ps_cost,
392401
"iter_upgrade_cost": iter_upgrade_cost,
402+
"iter_n_drc_new": iter_n_drc_new,
403+
"iter_n_upgrades": iter_n_upgrades,
404+
"iter_n_ps": iter_n_ps,
393405
"model_metric_value": model_metric_value,
394406
"n_ps_only": n_ps_only,
395407
"n_drc_new": n_drc_new,
@@ -841,6 +853,9 @@ def _build_figure(self, iterations: list[dict]) -> go.Figure:
841853
iter_drc_new = [it["iter_drc_cost"] - it["iter_upgrade_cost"] for it in iterations]
842854
iter_upgrades = [it["iter_upgrade_cost"] for it in iterations]
843855
iter_ps = [it["iter_ps_cost"] for it in iterations]
856+
iter_n_drc_new = [it.get("iter_n_drc_new", 0) for it in iterations]
857+
iter_n_upgrades = [it.get("iter_n_upgrades", 0) for it in iterations]
858+
iter_n_ps = [it.get("iter_n_ps", 0) for it in iterations]
844859
# Scale to thousands so secondary y-axis ticks stay compact whole-number integers
845860
cum_total_costs = [
846861
c / 1000
@@ -880,6 +895,8 @@ def _build_figure(self, iterations: list[dict]) -> go.Figure:
880895
y=iter_drc_new,
881896
name="DRC",
882897
marker_color=_COLOUR_DRC,
898+
customdata=iter_n_drc_new,
899+
hovertemplate="<b>DRC</b><br>%{customdata} queries<br>$%{y:.0f}<extra></extra>",
883900
showlegend=False,
884901
),
885902
row=1,
@@ -891,6 +908,8 @@ def _build_figure(self, iterations: list[dict]) -> go.Figure:
891908
y=iter_upgrades,
892909
name="PS→DRC",
893910
marker_color=_COLOUR_UPGRADE,
911+
customdata=iter_n_upgrades,
912+
hovertemplate="<b>PS→DRC</b><br>%{customdata} upgrades<br>$%{y:.0f}<extra></extra>",
894913
showlegend=False,
895914
),
896915
row=1,
@@ -902,6 +921,8 @@ def _build_figure(self, iterations: list[dict]) -> go.Figure:
902921
y=iter_ps,
903922
name="PS",
904923
marker_color=_COLOUR_PS,
924+
customdata=iter_n_ps,
925+
hovertemplate="<b>PS</b><br>%{customdata} queries<br>$%{y:.0f}<extra></extra>",
905926
showlegend=False,
906927
),
907928
row=1,

moal/loop.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,21 @@ def run(
375375
if r.fidelity == QueryType.DOSE_RESPONSE
376376
and r.canonical_smiles in ps_labeled_before
377377
)
378+
iter_n_ps = sum(
379+
1 for r in new_records if r.fidelity == QueryType.PRIMARY_SCREEN
380+
)
381+
iter_n_drc_upgrade = sum(
382+
1
383+
for r in new_records
384+
if r.fidelity == QueryType.DOSE_RESPONSE
385+
and r.canonical_smiles in ps_labeled_before
386+
)
387+
iter_n_drc_new = sum(
388+
1
389+
for r in new_records
390+
if r.fidelity == QueryType.DOSE_RESPONSE
391+
and r.canonical_smiles not in ps_labeled_before
392+
)
378393
progress.advance(task)
379394

380395
# --- Refit model --------------------------------------
@@ -508,6 +523,9 @@ def run(
508523
iter_drc_cost=iter_drc_cost,
509524
iter_ps_cost=iter_ps_cost,
510525
iter_upgrade_cost=iter_upgrade_cost,
526+
iter_n_drc_new=iter_n_drc_new,
527+
iter_n_upgrades=iter_n_drc_upgrade,
528+
iter_n_ps=iter_n_ps,
511529
model_metric_value=model_metric_value,
512530
)
513531

0 commit comments

Comments
 (0)