def schedule(workload, target):
    routing = sum(target["route_extra"])
    gates = len(workload["interactions"]) + routing
    layers = (gates + target["parallel"] - 1) // target["parallel"]
    return {"workload":workload["id"], "routing_gates":routing, "layers":layers, "seconds":layers * target["gate_s"] + target["reconfigure_s"]}
workload = {"id":"five-edge-v1", "interactions":[(0,1),(1,2),(2,3),(3,4),(0,4)]}
serial = {"route_extra":[0,0,0,0,0], "parallel":1, "gate_s":120e-6, "reconfigure_s":0.0, "protocol":"schedule-v1", "source":"synthetic", "date":"2026-01-01"}
parallel = {"route_extra":[0,1,0,1,0], "parallel":3, "gate_s":160e-6, "reconfigure_s":0.0, "protocol":"schedule-v1", "source":"synthetic", "date":"2026-01-01"}
baseline = schedule(workload, serial)
counterfactual = schedule(workload, parallel)
sensitivity = schedule(workload, {**parallel, "reconfigure_s":250e-6})
assert (baseline["routing_gates"], baseline["layers"]) == (0, 5) and abs(baseline["seconds"] - 600e-6) < 1e-15
assert abs(counterfactual["seconds"] - 480e-6) < 1e-15 and counterfactual["seconds"] < baseline["seconds"] < sensitivity["seconds"]
assert len({baseline["workload"], counterfactual["workload"], sensitivity["workload"]}) == 1
print(f"PASS: 56 ion evidence serial={baseline} parallel={counterfactual} reconfiguration_reverses={sensitivity['seconds'] > baseline['seconds']}")
