FA-67866 / Traffic signal timing plans / Open access
Webster cycle length: the cycle is not capped at the controller maximum · case 01
Webster cycle length returns a wrong result when the cycle is not capped at the controller maximum.
ROOT CAUSE
The min and max operators are swapped, so the result collapses to the minimum cycle bound whenever cmin < cmax.
VERIFIED REPAIR
Restore the cycle bounds clamp rule so that the step reads `max(x['cmin'], min(x['cmax'], int(c)))`.
Unsuccessful approach: Dropping the upper clamp fixes short cycles but still lets heavy volumes exceed cmax.
Case contract
Input {phases: per-phase lists of lane-group flows veh/h, sat: saturation flow per lane group, lost: lost seconds per phase, allred: extra all-red seconds per cycle, cmin, cmax}. Y is the sum over phases of the critical (largest) flow ratio; L = lost*phases + allred. If Y >= 0.9 return 'oversaturated'. Otherwise C0 = (1.5L + 5)/(1 - Y), rounded UP to a multiple of 5 s and clamped to [cmin, cmax]. Return {cycle, lost: L, y_milli: floor(1000Y)}.
Why this case matters
Signal timing arithmetic is exact and integer or rational; a wrong rule silently produces unsafe or inefficient timing plans.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(x):
ph = x['phases']
s = x['sat']
Y = Fraction(0)
for group in ph:
Y += Fraction(max(group), s)
L = x['lost'] * len(ph) + x['allred']
if Y >= Fraction(9, 10):
return 'oversaturated'
c0 = (Fraction(3, 2) * L + 5) / (1 - Y)
c = -(-c0 // 5) * 5
c = min(x['cmin'], max(x['cmax'], int(c)))
return {'cycle': c, 'lost': L, 'y_milli': int(Y * 1000)}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'phases': [[600, 750, 600], [120, 300, 840]], 'sat': 2000, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 90}, {'cycle': 90, 'lost': 10, 'y_milli': 795}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[450, 840], [690], [630, 270], [360, 570]], 'sat': 1900, 'lost': 4, 'allred': 2, 'cmin': 60, 'cmax': 90}, 'oversaturated'), ({'phases': [[510, 570], [420, 210, 90], [240, 780]], 'sat': 2000, 'lost': 5, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 19, 'y_milli': 885}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[870, 900, 270], [480]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 40, 'cmax': 120}, {'cycle': 95, 'lost': 16, 'y_milli': 690}), ({'phases': [[390], [750, 690], [750, 60, 720]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 60, 'cmax': 180}, 'oversaturated')], [({'phases': [[150, 330], [510, 690, 480]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 50, 'cmax': 120}, {'cycle': 50, 'lost': 12, 'y_milli': 510}), ({'phases': [[690, 570], [780, 570]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 12, 'y_milli': 735}), ({'phases': [[390], [510], [600, 840]], 'sat': 2000, 'lost': 5, 'allred': 2, 'cmin': 50, 'cmax': 90}, {'cycle': 90, 'lost': 17, 'y_milli': 870}), ({'phases': [[180], [150, 720, 810], [630, 690, 390]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 15, 'y_milli': 884}), ({'phases': [[660], [690], [480, 60], [630, 390, 510]], 'sat': 2000, 'lost': 4, 'allred': 6, 'cmin': 50, 'cmax': 90}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated')], [({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[90, 660, 150], [630, 300, 90], [450]], 'sat': 2000, 'lost': 3, 'allred': 6, 'cmin': 60, 'cmax': 120}, {'cycle': 120, 'lost': 15, 'y_milli': 870}), ({'phases': [[180, 450, 660], [330, 450], [120], [480]], 'sat': 2000, 'lost': 2, 'allred': 0, 'cmin': 40, 'cmax': 150}, {'cycle': 120, 'lost': 8, 'y_milli': 855}), ({'phases': [[600, 90, 150], [570, 390, 120], [360]], 'sat': 1800, 'lost': 4, 'allred': 1, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 13, 'y_milli': 850}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[420, 270, 510], [720], [540, 870, 300]], 'sat': 1900, 'lost': 2, 'allred': 0, 'cmin': 60, 'cmax': 180}, 'oversaturated'), ({'phases': [[720, 210, 690], [630], [780, 360, 60]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 50, 'cmax': 90}, 'oversaturated')], [({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[270], [510, 180], [120]], 'sat': 1800, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 50, 'lost': 13, 'y_milli': 500}), ({'phases': [[450, 660, 180], [870, 870, 540]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 16, 'y_milli': 765}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[330, 540], [780], [120], [780, 390, 600]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 120}, 'oversaturated'), ({'phases': [[240, 570], [720, 390, 900]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 50, 'cmax': 180}, {'cycle': 85, 'lost': 7, 'y_milli': 816}), ({'phases': [[720, 720, 270], [870, 90]], 'sat': 1800, 'lost': 3, 'allred': 2, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 8, 'y_milli': 883})], [({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[450, 90], [120, 480]], 'sat': 1800, 'lost': 3, 'allred': 5, 'cmin': 40, 'cmax': 180}, {'cycle': 45, 'lost': 11, 'y_milli': 516}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[360, 210], [150], [210, 120], [120, 420, 870]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 20, 'y_milli': 836}), ({'phases': [[360, 360, 60], [540], [420, 600]], 'sat': 1800, 'lost': 5, 'allred': 5, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 20, 'y_milli': 833}), ({'phases': [[180], [60, 480], [390], [60]], 'sat': 1800, 'lost': 3, 'allred': 3, 'cmin': 40, 'cmax': 90}, {'cycle': 75, 'lost': 15, 'y_milli': 616}), ({'phases': [[360], [90, 690, 420]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 40, 'cmax': 150}, {'cycle': 60, 'lost': 13, 'y_milli': 583})]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check('timing oracle' + ' %d' % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| timing oracle 0 | {'cycle': 40, 'lost': 10, 'y_milli': 795} | {'cycle': 90, 'lost': 10, 'y_milli': 795} | Failed |
| timing oracle 1 | oversaturated | oversaturated | Passed |
| timing oracle 2 | {'cycle': 40, 'lost': 10, 'y_milli': 583} | {'cycle': 50, 'lost': 10, 'y_milli': 583} | Failed |
| timing oracle 3 | oversaturated | oversaturated | Passed |
| timing oracle 4 | {'cycle': 50, 'lost': 19, 'y_milli': 885} | {'cycle': 180, 'lost': 19, 'y_milli': 885} | Failed |
| timing oracle 5 | {'cycle': 60, 'lost': 9, 'y_milli': 150} | {'cycle': 60, 'lost': 9, 'y_milli': 150} | Passed |
| timing oracle 6 | {'cycle': 40, 'lost': 16, 'y_milli': 690} | {'cycle': 95, 'lost': 16, 'y_milli': 690} | Failed |
| timing oracle 7 | oversaturated | oversaturated | Passed |
SHA-256 / 85d305508983f1bae173440921c31bcd8733b4781c15a8446acd56dc27eda0ff
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(x):
ph = x['phases']
s = x['sat']
Y = Fraction(0)
for group in ph:
Y += Fraction(max(group), s)
L = x['lost'] * len(ph) + x['allred']
if Y >= Fraction(9, 10):
return 'oversaturated'
c0 = (Fraction(3, 2) * L + 5) / (1 - Y)
c = -(-c0 // 5) * 5
c = max(x['cmin'], int(c))
return {'cycle': c, 'lost': L, 'y_milli': int(Y * 1000)}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'phases': [[600, 750, 600], [120, 300, 840]], 'sat': 2000, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 90}, {'cycle': 90, 'lost': 10, 'y_milli': 795}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[450, 840], [690], [630, 270], [360, 570]], 'sat': 1900, 'lost': 4, 'allred': 2, 'cmin': 60, 'cmax': 90}, 'oversaturated'), ({'phases': [[510, 570], [420, 210, 90], [240, 780]], 'sat': 2000, 'lost': 5, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 19, 'y_milli': 885}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[870, 900, 270], [480]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 40, 'cmax': 120}, {'cycle': 95, 'lost': 16, 'y_milli': 690}), ({'phases': [[390], [750, 690], [750, 60, 720]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 60, 'cmax': 180}, 'oversaturated')], [({'phases': [[150, 330], [510, 690, 480]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 50, 'cmax': 120}, {'cycle': 50, 'lost': 12, 'y_milli': 510}), ({'phases': [[690, 570], [780, 570]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 12, 'y_milli': 735}), ({'phases': [[390], [510], [600, 840]], 'sat': 2000, 'lost': 5, 'allred': 2, 'cmin': 50, 'cmax': 90}, {'cycle': 90, 'lost': 17, 'y_milli': 870}), ({'phases': [[180], [150, 720, 810], [630, 690, 390]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 15, 'y_milli': 884}), ({'phases': [[660], [690], [480, 60], [630, 390, 510]], 'sat': 2000, 'lost': 4, 'allred': 6, 'cmin': 50, 'cmax': 90}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated')], [({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[90, 660, 150], [630, 300, 90], [450]], 'sat': 2000, 'lost': 3, 'allred': 6, 'cmin': 60, 'cmax': 120}, {'cycle': 120, 'lost': 15, 'y_milli': 870}), ({'phases': [[180, 450, 660], [330, 450], [120], [480]], 'sat': 2000, 'lost': 2, 'allred': 0, 'cmin': 40, 'cmax': 150}, {'cycle': 120, 'lost': 8, 'y_milli': 855}), ({'phases': [[600, 90, 150], [570, 390, 120], [360]], 'sat': 1800, 'lost': 4, 'allred': 1, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 13, 'y_milli': 850}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[420, 270, 510], [720], [540, 870, 300]], 'sat': 1900, 'lost': 2, 'allred': 0, 'cmin': 60, 'cmax': 180}, 'oversaturated'), ({'phases': [[720, 210, 690], [630], [780, 360, 60]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 50, 'cmax': 90}, 'oversaturated')], [({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[270], [510, 180], [120]], 'sat': 1800, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 50, 'lost': 13, 'y_milli': 500}), ({'phases': [[450, 660, 180], [870, 870, 540]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 16, 'y_milli': 765}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[330, 540], [780], [120], [780, 390, 600]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 120}, 'oversaturated'), ({'phases': [[240, 570], [720, 390, 900]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 50, 'cmax': 180}, {'cycle': 85, 'lost': 7, 'y_milli': 816}), ({'phases': [[720, 720, 270], [870, 90]], 'sat': 1800, 'lost': 3, 'allred': 2, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 8, 'y_milli': 883})], [({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[450, 90], [120, 480]], 'sat': 1800, 'lost': 3, 'allred': 5, 'cmin': 40, 'cmax': 180}, {'cycle': 45, 'lost': 11, 'y_milli': 516}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[360, 210], [150], [210, 120], [120, 420, 870]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 20, 'y_milli': 836}), ({'phases': [[360, 360, 60], [540], [420, 600]], 'sat': 1800, 'lost': 5, 'allred': 5, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 20, 'y_milli': 833}), ({'phases': [[180], [60, 480], [390], [60]], 'sat': 1800, 'lost': 3, 'allred': 3, 'cmin': 40, 'cmax': 90}, {'cycle': 75, 'lost': 15, 'y_milli': 616}), ({'phases': [[360], [90, 690, 420]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 40, 'cmax': 150}, {'cycle': 60, 'lost': 13, 'y_milli': 583})]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check('timing oracle' + ' %d' % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| timing oracle 0 | {'cycle': 100, 'lost': 10, 'y_milli': 795} | {'cycle': 90, 'lost': 10, 'y_milli': 795} | Failed |
| timing oracle 1 | oversaturated | oversaturated | Passed |
| timing oracle 2 | {'cycle': 50, 'lost': 10, 'y_milli': 583} | {'cycle': 50, 'lost': 10, 'y_milli': 583} | Passed |
| timing oracle 3 | oversaturated | oversaturated | Passed |
| timing oracle 4 | {'cycle': 295, 'lost': 19, 'y_milli': 885} | {'cycle': 180, 'lost': 19, 'y_milli': 885} | Failed |
| timing oracle 5 | {'cycle': 60, 'lost': 9, 'y_milli': 150} | {'cycle': 60, 'lost': 9, 'y_milli': 150} | Passed |
| timing oracle 6 | {'cycle': 95, 'lost': 16, 'y_milli': 690} | {'cycle': 95, 'lost': 16, 'y_milli': 690} | Passed |
| timing oracle 7 | oversaturated | oversaturated | Passed |
SHA-256 / 601c7e6573380722495ea7db264a36b5ae0a9b891102e4a9da8d90a2ecfa8f2d
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(x):
ph = x['phases']
s = x['sat']
Y = Fraction(0)
for group in ph:
Y += Fraction(max(group), s)
L = x['lost'] * len(ph) + x['allred']
if Y >= Fraction(9, 10):
return 'oversaturated'
c0 = (Fraction(3, 2) * L + 5) / (1 - Y)
c = -(-c0 // 5) * 5
c = max(x['cmin'], min(x['cmax'], int(c)))
return {'cycle': c, 'lost': L, 'y_milli': int(Y * 1000)}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'phases': [[600, 750, 600], [120, 300, 840]], 'sat': 2000, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 90}, {'cycle': 90, 'lost': 10, 'y_milli': 795}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[450, 840], [690], [630, 270], [360, 570]], 'sat': 1900, 'lost': 4, 'allred': 2, 'cmin': 60, 'cmax': 90}, 'oversaturated'), ({'phases': [[510, 570], [420, 210, 90], [240, 780]], 'sat': 2000, 'lost': 5, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 19, 'y_milli': 885}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[870, 900, 270], [480]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 40, 'cmax': 120}, {'cycle': 95, 'lost': 16, 'y_milli': 690}), ({'phases': [[390], [750, 690], [750, 60, 720]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 60, 'cmax': 180}, 'oversaturated')], [({'phases': [[150, 330], [510, 690, 480]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 50, 'cmax': 120}, {'cycle': 50, 'lost': 12, 'y_milli': 510}), ({'phases': [[690, 570], [780, 570]], 'sat': 2000, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 12, 'y_milli': 735}), ({'phases': [[390], [510], [600, 840]], 'sat': 2000, 'lost': 5, 'allred': 2, 'cmin': 50, 'cmax': 90}, {'cycle': 90, 'lost': 17, 'y_milli': 870}), ({'phases': [[180], [150, 720, 810], [630, 690, 390]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 15, 'y_milli': 884}), ({'phases': [[660], [690], [480, 60], [630, 390, 510]], 'sat': 2000, 'lost': 4, 'allred': 6, 'cmin': 50, 'cmax': 90}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated')], [({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[90, 660, 150], [630, 300, 90], [450]], 'sat': 2000, 'lost': 3, 'allred': 6, 'cmin': 60, 'cmax': 120}, {'cycle': 120, 'lost': 15, 'y_milli': 870}), ({'phases': [[180, 450, 660], [330, 450], [120], [480]], 'sat': 2000, 'lost': 2, 'allred': 0, 'cmin': 40, 'cmax': 150}, {'cycle': 120, 'lost': 8, 'y_milli': 855}), ({'phases': [[600, 90, 150], [570, 390, 120], [360]], 'sat': 1800, 'lost': 4, 'allred': 1, 'cmin': 60, 'cmax': 150}, {'cycle': 150, 'lost': 13, 'y_milli': 850}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[420, 270, 510], [720], [540, 870, 300]], 'sat': 1900, 'lost': 2, 'allred': 0, 'cmin': 60, 'cmax': 180}, 'oversaturated'), ({'phases': [[720, 210, 690], [630], [780, 360, 60]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 50, 'cmax': 90}, 'oversaturated')], [({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[270], [510, 180], [120]], 'sat': 1800, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 180}, {'cycle': 50, 'lost': 13, 'y_milli': 500}), ({'phases': [[450, 660, 180], [870, 870, 540]], 'sat': 2000, 'lost': 5, 'allred': 6, 'cmin': 60, 'cmax': 90}, {'cycle': 90, 'lost': 16, 'y_milli': 765}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[330, 540], [780], [120], [780, 390, 600]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 120}, 'oversaturated'), ({'phases': [[240, 570], [720, 390, 900]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 50, 'cmax': 180}, {'cycle': 85, 'lost': 7, 'y_milli': 816}), ({'phases': [[720, 720, 270], [870, 90]], 'sat': 1800, 'lost': 3, 'allred': 2, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 8, 'y_milli': 883})], [({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[450, 90], [120, 480]], 'sat': 1800, 'lost': 3, 'allred': 5, 'cmin': 40, 'cmax': 180}, {'cycle': 45, 'lost': 11, 'y_milli': 516}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[360, 210], [150], [210, 120], [120, 420, 870]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 50, 'cmax': 120}, {'cycle': 120, 'lost': 20, 'y_milli': 836}), ({'phases': [[360, 360, 60], [540], [420, 600]], 'sat': 1800, 'lost': 5, 'allred': 5, 'cmin': 50, 'cmax': 180}, {'cycle': 180, 'lost': 20, 'y_milli': 833}), ({'phases': [[180], [60, 480], [390], [60]], 'sat': 1800, 'lost': 3, 'allred': 3, 'cmin': 40, 'cmax': 90}, {'cycle': 75, 'lost': 15, 'y_milli': 616}), ({'phases': [[360], [90, 690, 420]], 'sat': 1800, 'lost': 4, 'allred': 5, 'cmin': 40, 'cmax': 150}, {'cycle': 60, 'lost': 13, 'y_milli': 583})]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check('timing oracle' + ' %d' % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| timing oracle 0 | {'cycle': 90, 'lost': 10, 'y_milli': 795} | {'cycle': 90, 'lost': 10, 'y_milli': 795} | Passed |
| timing oracle 1 | oversaturated | oversaturated | Passed |
| timing oracle 2 | {'cycle': 50, 'lost': 10, 'y_milli': 583} | {'cycle': 50, 'lost': 10, 'y_milli': 583} | Passed |
| timing oracle 3 | oversaturated | oversaturated | Passed |
| timing oracle 4 | {'cycle': 180, 'lost': 19, 'y_milli': 885} | {'cycle': 180, 'lost': 19, 'y_milli': 885} | Passed |
| timing oracle 5 | {'cycle': 60, 'lost': 9, 'y_milli': 150} | {'cycle': 60, 'lost': 9, 'y_milli': 150} | Passed |
| timing oracle 6 | {'cycle': 95, 'lost': 16, 'y_milli': 690} | {'cycle': 95, 'lost': 16, 'y_milli': 690} | Passed |
| timing oracle 7 | oversaturated | oversaturated | Passed |
SHA-256 / e85c80c8ed935cdb09d2c6aa87e2aeec3f72c0e2acdec076a4d2fbb9265a5d0a
Verification & scope
A deterministic, bounded toy model with a stipulated contract; it makes no claim of conformance to any agency manual or standard. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:47:56.923230+00:00.
Case digest / 0175fa041fbbb72ea525a0a6c54125ea49ecefa62f3add443df4417eaf4c8715