"""Deterministic deadline planner: assumed allowances, not a latency benchmark.""" import csv import json from pathlib import Path def plan(elapsed_ms, deadline_ms=1000, reserve_ms=80, attempt_ms=150, waits=(100, 200)): if min(elapsed_ms, deadline_ms, reserve_ms, attempt_ms) < 0 or attempt_ms == 0: raise ValueError("Durations must be nonnegative; attempt allowance must be positive") available = max(0, deadline_ms - elapsed_ms - reserve_ms) used = 0 accepted = [] for number in range(1, len(waits)+2): wait = 0 if number == 1 else waits[number-2] if used + wait + attempt_ms > available: break used += wait + attempt_ms accepted.append(dict(attempt=number,backoff_ms=wait,allowance_ms=attempt_ms,planned_elapsed_ms=used)) return dict(elapsed_ms=elapsed_ms,available_ms=available,attempts=len(accepted),planned_ms=used,unused_ms=available-used,steps=accepted) def run(): rows = [plan(e) for e in [0,200,400,600,800]] assert [r["attempts"] for r in rows] == [3,2,2,1,0] example = plan(230) assert example["available_ms"] == 690 and example["attempts"] == 2 and example["planned_ms"] == 400 sensitivity = [dict(attempt_allowance_ms=a,**plan(230,attempt_ms=a)) for a in [100,150,200,250,300]] for row in rows+sensitivity: assert row["planned_ms"] <= row["available_ms"] data = dict(scope="Arithmetic scenario, not measured latency or success probability",inputs=dict(deadline_ms=1000,reserve_ms=80,attempt_allowance_ms=150,backoff_ms=[100,200],max_attempts=3),elapsed_sweep=rows,example=example,allowance_sensitivity=sensitivity) Path("budget-results.json").write_text(json.dumps(data,indent=2)+"\n") fields = ["elapsed_ms","available_ms","attempts","planned_ms","unused_ms"] with Path("budget-results.csv").open("w",newline="") as f: w=csv.DictWriter(f,fieldnames=fields,extrasaction="ignore");w.writeheader();w.writerows(rows) print(json.dumps(data,indent=2)) if __name__ == "__main__": run()