#!/usr/bin/env python3 """Render the Beam/Pi pilot from aggregate results, never from invented trajectories.""" from __future__ import annotations import argparse import csv import json import math from pathlib import Path AXES = { "reference_seconds": ("reference", "Normalized latency per task (seconds)", "Estimated new-context input; fixed reference rates + measured tool time"), "wall_seconds": ("wall", "Elapsed solver time per task (seconds)", "Observed wall time, including API and tool delays"), "api_prefill_reference_seconds": ("api-prefill", "API-prefill normalized latency per task (seconds)", "Sensitivity view: all API prompt tokens + output + measured tool time"), } CONDITIONS = ("single", "peers", "async") STYLES = { "single": ("#f66535", "solid", "-", "Single agent · 1M estimated context tokens"), "peers": ("#c65329", "dot", ":", "Five-agent team · 200k estimated context tokens per agent"), "async": ("#fb9a7d", "dashdot", "-.", "Async subagents · 200k estimated context tokens per agent"), } TITLE = "Multi-agent ProgramBench: score vs. latency" MODEL = "Reflection Beam-501B-A23B + Pi" SOURCE = "https://www-cdn.anthropic.com/fc1b44717c85dc068bc6ba5024219938094694bd/Claude%20Opus%205.5%20System%20Card.pdf" def numeric(value): try: result = float(value) except (ValueError, TypeError): raise ValueError("Expected finite numeric curve data") from None if isinstance(value, bool) or not math.isfinite(result): raise ValueError("Expected finite numeric curve data") return result def is_true(value): return value is True or value == "True" def count(value): value = numeric(value) if value != int(value) or not 0 <= value <= 5: raise ValueError("Task coverage must be an integer from zero to five") return int(value) def figure_data(summary, curves, axis="reference_seconds"): if axis not in AXES: raise ValueError("Unknown latency axis") summary = summary or {} groups = {} for condition in CONDITIONS: episodes = [e for e in summary.get("episodes", []) if e.get("condition") == condition] observed = len({e.get("task") for e in episodes if e.get("has_valid_grade") is True}) invalid = sum(int(e.get("invalid_grade_count", 0)) for e in episodes) finished = len(episodes) == 5 and all(e.get("status") in {"completed", "budget_exhausted"} for e in episodes) rows = [] clock_ok = axis == "wall_seconds" or (bool(episodes) and all(e.get("clock_valid") is True for e in episodes)) for row in curves or []: if row.get("axis") != axis or row.get("condition") != condition: continue if count(row["tasks_total"]) != 5: raise ValueError("The pilot plot requires the fixed five-task denominator") seconds = numeric(row["time_seconds"]) coverage = count(row["tasks_with_valid_grade"]) if seconds < 0: raise ValueError("Latency cannot be negative") if not is_true(row.get("clock_valid")): clock_ok = False score = row.get("mean_hidden_test_fraction") if score in (None, ""): continue score = numeric(score) if not 0 <= score <= 1: raise ValueError("Score outside zero to one") # A logarithmic axis has no zero. Never assign an invented positive timestamp. if seconds > 0: rows.append({"seconds": seconds, "score": score, "coverage": coverage}) rows.sort(key=lambda row: row["seconds"]) checkpoints = {numeric(point[axis]) for episode in episodes for point in episode.get("points", []) if axis in point} for row in rows: row["checkpoint"] = row["seconds"] in checkpoints or len(rows) == 1 available = observed > 0 and clock_ok and bool(rows) groups[condition] = {"rows": rows if available else [], "observed": observed, "invalid_grades": invalid, "finished": finished, "clock_valid": clock_ok, "available": available, "complete": observed == 5 and invalid == 0 and finished} values = [row["seconds"] for group in groups.values() for row in group["rows"]] limits = (min(values), max(values)) if values else (30.0, 7200.0) if limits[0] == limits[1]: limits = (limits[0] / 1.1, limits[1] * 1.1) has_grades = any(group["observed"] for group in groups.values()) available = any(group["available"] for group in groups.values()) if not has_grades: status = "Awaiting graded benchmark results" detail = "Reference calibration and infrastructure checks are not model benchmark scores." elif not available: status = "This latency view is unavailable" detail = "Complete clock records and positive-time checkpoints are required. Check the wall-time view." elif not all(group["clock_valid"] for group in groups.values()): status = "One or more normalized curves are unavailable" detail = "Missing or invalid clock records suppress the affected condition; check the wall-time view." elif not all(group["complete"] for group in groups.values()): status = "Provisional results · check grading coverage" detail = "Five-task denominator; zero before any valid grade; last valid score retained after grading failure." else: status = "All 15 episodes graded" detail = "Equal task weights; latest valid score carried forward; regressions retained." rates = summary.get("reference_clock", {}) prefill = numeric(rates.get("prefill_tokens_per_second", 10000)) decode = numeric(rates.get("decode_tokens_per_second", 265)) if prefill <= 0 or decode <= 0: raise ValueError("Reference rates must be positive") return {"axis": axis, "groups": groups, "limits": limits, "available": available, "has_grades": has_grades, "status": status, "detail": detail, "rates": f"Reference rates: {prefill:,.0f} input and {decode:,.0f} output tokens/s (our assumptions)."} def threshold_comparison(data, threshold=0.6): """First observed crossing, never interpolation/extrapolation or a copied paper ratio.""" crossing = {} for condition in ("single", "peers"): group = data["groups"][condition] if not group["complete"] or not group["available"]: return None hit = next((row for row in group["rows"] if row["score"] >= threshold and row["coverage"] == 5), None) if hit is None: return None crossing[condition] = hit["seconds"] ratio = crossing["single"] / crossing["peers"] comparison = f"{ratio:.2f}× faster" if ratio > 1.005 else f"{1 / ratio:.2f}× slower" if ratio < 0.995 else "the same observed latency" return {"threshold": threshold, **crossing, "ratio": ratio, "label": f"Time to {threshold:g}: five-agent team {comparison} (first graded crossing)"} def notes(data): result = ["5 selected tasks · 1 repetition · No confidence intervals · 8M API-token cap per episode", data["detail"], "Coverage counts tasks with a valid grade by each cutoff; it is not the number still running."] if data["axis"] != "wall_seconds": result.extend([data["rates"], "Only completed operations enter the clock. This is not Anthropic's exact latency calibration."]) return result def legend_suffix(group): return " · pending" if not group["observed"] else " · clock unavailable" if not group["clock_valid"] else "" def ticks(limits): lo, hi = limits values = [multiple * 10.0 ** power for power in range(-3, 9) for multiple in (1, 3) if lo <= multiple * 10.0 ** power <= hi] return values, [f"{x:,.0f}" if x >= 1 else f"{x:g}" for x in values] def build_plotly(summary, curves, axis="reference_seconds"): data = figure_data(summary, curves, axis) traces = [] for condition in CONDITIONS: group = data["groups"][condition] color, dash, _, label = STYLES[condition] rows = group["rows"] suffix = legend_suffix(group) traces.append({"type": "scatter", "mode": "lines+markers", "name": label + suffix, "x": [r["seconds"] for r in rows] or [None], "y": [r["score"] for r in rows] or [None], "customdata": [[r["coverage"]] for r in rows], "line": {"color": color, "width": 3, "dash": dash, "shape": "hv"}, "marker": {"color": color, "size": [5 if r["checkpoint"] else 0 for r in rows] or [0]}, "connectgaps": False, "legendgroup": condition, "hovertemplate": "%{x:,.1f}s · mean score %{y:.3f}
%{customdata[0]}/5 tasks graded%{fullData.name}"}) if rows: traces.append({"type": "scatter", "mode": "lines+markers", "x": [r["seconds"] for r in rows], "y": [r["coverage"] for r in rows], "yaxis": "y2", "showlegend": False, "legendgroup": condition, "name": label, "line": {"color": color, "width": 2, "dash": dash, "shape": "hv"}, "marker": {"color": color, "size": [3 if r["checkpoint"] else 0 for r in rows]}, "hovertemplate": "%{x:,.1f}s · %{y}/5 tasks graded"}) annotations = [{"text": data["status"], "xref": "paper", "yref": "paper", "x": 0, "y": 1.025, "showarrow": False, "xanchor": "left", "yanchor": "bottom", "font": {"size": 14, "color": "#61615d"}}] if not data["available"]: annotations.append({"text": "No benchmark curve to display yet" if not data["has_grades"] else "No valid curve for this clock", "xref": "paper", "yref": "paper", "x": 0.5, "y": 0.64, "showarrow": False, "font": {"size": 21, "color": "#767670"}}) crossing = threshold_comparison(data) if crossing: annotations.extend([{"x": math.log10(crossing["single"]), "ax": math.log10(crossing["peers"]), "y": 0.6, "ay": 0.6, "xref": "x", "axref": "x", "yref": "y", "ayref": "y", "arrowside": "end+start", "arrowhead": 2, "startarrowhead": 2, "arrowcolor": "#777", "text": ""}, {"text": crossing["label"], "xref": "paper", "yref": "paper", "x": 0.02, "y": 0.78, "showarrow": False, "xanchor": "left", "bgcolor": "rgba(255,255,255,0.92)"}]) tick_values, tick_text = ticks(data["limits"]) annotations.append({"text": "
".join(notes(data)), "xref": "paper", "yref": "paper", "x": 0, "y": -0.22, "showarrow": False, "xanchor": "left", "yanchor": "top", "align": "left", "font": {"size": 11, "color": "#666660"}}) return {"data": traces, "layout": { "title": {"text": TITLE + "
" + MODEL + " · " + AXES[axis][2] + "", "x": 0.07, "y": 0.95, "yanchor": "top", "font": {"size": 24, "color": "#1b1b18"}}, "height": 850, "paper_bgcolor": "white", "plot_bgcolor": "white", "font": {"family": "Arial, sans-serif", "color": "#22221f"}, "margin": {"t": 200, "b": 200, "l": 85, "r": 25}, "legend": {"orientation": "v", "x": 0, "y": 1.275, "yanchor": "top", "font": {"size": 12}}, "xaxis": {"type": "log", "range": [math.log10(data["limits"][0]), math.log10(data["limits"][1])], "title": {"text": AXES[axis][1]}, "anchor": "y2", "tickmode": "array", "tickvals": tick_values, "ticktext": tick_text, "showgrid": False, "showline": True, "linecolor": "#aaa9a2"}, "yaxis": {"domain": [0.27, 1], "range": [0, 1], "dtick": 0.2, "tickformat": ".1f", "title": {"text": "Fraction of hidden tests passed"}, "gridcolor": "#e1e0da", "zeroline": False}, "yaxis2": {"domain": [0, 0.12], "range": [-0.15, 5.2], "tickvals": [0, 5], "title": {"text": "Tasks graded", "font": {"size": 11}}, "gridcolor": "#efeee8", "zeroline": False}, "annotations": annotations, "hovermode": "closest", "meta": {"status": data["status"], "has_results": data["available"], "axis": axis, "notes": notes(data), "threshold_comparison": crossing, "source": SOURCE, "coverage": {c: {k: v for k, v in g.items() if k != "rows"} for c, g in data["groups"].items()}} }} def render_outputs(summary, curves, output_dir): import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt from matplotlib.lines import Line2D from matplotlib.ticker import FixedLocator, FuncFormatter, NullFormatter directory = Path(output_dir) directory.mkdir(parents=True, exist_ok=True) outputs = {} with plt.rc_context({"font.family": "DejaVu Sans", "font.size": 11, "svg.fonttype": "none"}): for axis, (slug, xlabel, subtitle) in AXES.items(): data = figure_data(summary, curves, axis) fig = plt.figure(figsize=(13.5, 8.7), facecolor="white") ax = fig.add_axes((0.09, 0.33, 0.875, 0.435)) coverage = fig.add_axes((0.09, 0.22, 0.875, 0.065), sharex=ax) for chart in (ax, coverage): chart.set_xscale("log") chart.set_xlim(*data["limits"]) chart.grid(axis="y", color="#e1e0da", linewidth=0.8) chart.spines[["top", "right"]].set_visible(False) chart.spines[["left", "bottom"]].set_color("#aaa9a2") chart.tick_params(colors="#393933", labelsize=10) ax.set_ylim(0, 1) ax.set_yticks([i / 5 for i in range(6)]) ax.set_ylabel("Fraction of hidden tests passed", labelpad=10) ax.tick_params(axis="x", which="both", labelbottom=False) coverage.set_ylim(-0.15, 5.2) coverage.set_yticks([0, 5]) coverage.set_ylabel("Tasks\ngraded", fontsize=9, labelpad=17) coverage.set_xlabel(xlabel, labelpad=9) tick_values, _ = ticks(data["limits"]) coverage.xaxis.set_major_locator(FixedLocator(tick_values)) coverage.xaxis.set_major_formatter(FuncFormatter(lambda value, _: f"{value:,.0f}" if value >= 1 else f"{value:g}")) coverage.xaxis.set_minor_formatter(NullFormatter()) handles = [] for condition in CONDITIONS: color, _, linestyle, label = STYLES[condition] handles.append(Line2D([0], [0], color=color, linestyle=linestyle, linewidth=2.6, label=label + legend_suffix(data["groups"][condition]))) rows = data["groups"][condition]["rows"] if rows: xs = [r["seconds"] for r in rows] ax.step(xs, [r["score"] for r in rows], where="post", color=color, linestyle=linestyle, linewidth=2.6) coverage.step(xs, [r["coverage"] for r in rows], where="post", color=color, linestyle=linestyle, linewidth=1.8) marked = [r for r in rows if r["checkpoint"]] ax.scatter([r["seconds"] for r in marked], [r["score"] for r in marked], color=color, s=13, zorder=3) coverage.scatter([r["seconds"] for r in marked], [r["coverage"] for r in marked], color=color, s=7, zorder=3) fig.text(0.09, 0.94, TITLE, fontsize=24, fontweight="bold", color="#1b1b18") fig.text(0.09, 0.901, MODEL + " · " + subtitle, fontsize=11, color="#55554f") fig.legend(handles=handles, loc="upper left", bbox_to_anchor=(0.085, 0.884), frameon=False, fontsize=10) fig.text(0.09, 0.787, data["status"], fontsize=10, color="#686861") if not data["available"]: ax.text(0.5, 0.53, "Awaiting graded benchmark results" if not data["has_grades"] else "No valid curve for this clock", transform=ax.transAxes, ha="center", color="#797971", fontsize=17) crossing = threshold_comparison(data) if crossing: ax.annotate("", xy=(crossing["single"], 0.6), xytext=(crossing["peers"], 0.6), arrowprops={"arrowstyle": "<->", "color": "#777"}) ax.text(0.02, 0.7, crossing["label"], transform=ax.transAxes, fontsize=10, bbox={"facecolor": "white", "edgecolor": "none", "alpha": 0.92}) for index, note in enumerate(notes(data)): fig.text(0.09, 0.127 - index * 0.022, note, fontsize=9, color="#696962") prefix = f"score-vs-latency-{axis}" for extension in ("png", "svg", "pdf"): path = directory / f"{prefix}.{extension}" fig.savefig(path, dpi=180, facecolor="white") outputs[path.name] = str(path.resolve()) plt.close(fig) path = directory / f"{prefix}.json" path.write_text(json.dumps(build_plotly(summary, curves, axis), indent=2, allow_nan=False) + "\n") outputs[path.name] = str(path.resolve()) return outputs def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--experiment-dir", type=Path, required=True) parser.add_argument("--output-dir", type=Path, required=True) args = parser.parse_args() summary_path, curves_path = args.experiment_dir / "summary.json", args.experiment_dir / "curves.csv" summary = json.loads(summary_path.read_text()) if summary_path.exists() else None curves = list(csv.DictReader(curves_path.open())) if curves_path.exists() else [] print(json.dumps(render_outputs(summary, curves, args.output_dir), indent=2)) if __name__ == "__main__": main()