def budget(loaded, moves, move_s, loss_per_move, operated, measured, mode):
    if not loaded >= operated >= measured >= 0 or not 0 <= loss_per_move <= 1:
        raise ValueError("invalid count or probability")
    retained = loaded * (1 - loss_per_move) ** moves
    return {"loaded":loaded, "retained":retained, "operated":operated, "measured":measured, "movement_s":moves * move_s, "claim":f"{mode}-observable"}
baseline = budget(100, 4, 250e-6, .003, 90, 85, "digital")
boundary = budget(100, 0, 250e-6, .003, 90, 85, "digital")
counterfactual = budget(100, 8, 250e-6, .003, 90, 85, "analog")
assert baseline["movement_s"] == .001 and boundary["retained"] == 100
assert counterfactual["retained"] < baseline["retained"] < boundary["retained"]
assert counterfactual["claim"] == "analog-observable" and counterfactual["claim"] != "logical-qubit"
print(f"PASS: 57 atom evidence counts={baseline} eight_move_retained={counterfactual['retained']:.3f} analog_claim={counterfactual['claim']}")
