FA-67856 / Traffic signal timing plans / Open access
Webster cycle length: the computed cycle is rounded down to a 5 s multiple · case 01
Webster cycle length returns a wrong result when the computed cycle is rounded down to a 5 s multiple.
ROOT CAUSE
Floor division rounds the optimum cycle down, producing a cycle shorter than the Webster value.
VERIFIED REPAIR
Restore the cycle rounding rule so that the step reads `-(-c0 // 5) * 5`.
Unsuccessful approach: Rounding to the nearest multiple still rounds down whenever the fractional part is below one half.
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 = 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': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[90], [300], [90, 720]], 'sat': 1800, 'lost': 4, 'allred': 1, 'cmin': 50, 'cmax': 180}, {'cycle': 65, 'lost': 13, 'y_milli': 616}), ({'phases': [[300, 540], [120, 210], [180, 450, 570]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 60, 'cmax': 180}, {'cycle': 95, 'lost': 15, 'y_milli': 694}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[210, 690], [540, 480]], 'sat': 1900, 'lost': 4, 'allred': 1, 'cmin': 50, 'cmax': 90}, {'cycle': 55, 'lost': 9, 'y_milli': 647}), ({'phases': [[390], [150, 510, 810]], 'sat': 1900, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 150}, {'cycle': 55, 'lost': 10, 'y_milli': 631}), ({'phases': [[180, 540], [480], [720], [450, 690]], 'sat': 1900, 'lost': 4, 'allred': 5, 'cmin': 60, 'cmax': 120}, 'oversaturated'), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated')], [({'phases': [[630, 600], [510, 270, 120], [720, 90]], 'sat': 1800, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 90}, 'oversaturated'), ({'phases': [[690, 150], [90, 300, 90]], 'sat': 1800, 'lost': 5, 'allred': 2, 'cmin': 40, 'cmax': 180}, {'cycle': 55, 'lost': 12, 'y_milli': 550}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'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': [[180, 630, 300], [90, 600, 120], [570, 540, 390]], 'sat': 1900, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 120}, 'oversaturated'), ({'phases': [[660], [240, 480, 510]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 50, 'cmax': 180}, {'cycle': 60, 'lost': 10, 'y_milli': 650}), ({'phases': [[210, 840, 900], [60], [510]], 'sat': 1800, 'lost': 3, 'allred': 5, 'cmin': 40, 'cmax': 150}, {'cycle': 145, 'lost': 14, 'y_milli': 816})], [({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[750, 570], [180, 510]], 'sat': 1900, 'lost': 3, 'allred': 5, 'cmin': 50, 'cmax': 120}, {'cycle': 65, 'lost': 11, 'y_milli': 663}), ({'phases': [[150, 60], [600, 480, 330], [210, 60, 720]], 'sat': 1900, 'lost': 5, 'allred': 2, 'cmin': 50, 'cmax': 180}, {'cycle': 135, 'lost': 17, 'y_milli': 773}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[420, 450], [270, 510, 690], [210], [60, 150]], 'sat': 1800, 'lost': 2, 'allred': 0, 'cmin': 60, 'cmax': 180}, {'cycle': 105, 'lost': 8, 'y_milli': 833}), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[900], [840, 570, 390], [660, 90]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 50, 'cmax': 180}, 'oversaturated'), ({'phases': [[540], [900]], 'sat': 1900, 'lost': 3, 'allred': 3, 'cmin': 60, 'cmax': 150}, {'cycle': 80, 'lost': 9, 'y_milli': 757})], [({'phases': [[810, 450, 540], [450, 240]], 'sat': 1800, 'lost': 5, 'allred': 1, 'cmin': 40, 'cmax': 180}, {'cycle': 75, 'lost': 11, 'y_milli': 700}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[270], [390, 150], [900], [480]], 'sat': 2000, 'lost': 5, 'allred': 5, 'cmin': 50, 'cmax': 180}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[630, 60], [570]], 'sat': 1800, 'lost': 5, 'allred': 4, 'cmin': 40, 'cmax': 120}, {'cycle': 80, 'lost': 14, 'y_milli': 666}), ({'phases': [[660, 570, 330], [570, 210, 150]], 'sat': 1900, 'lost': 3, 'allred': 6, 'cmin': 60, 'cmax': 180}, {'cycle': 70, 'lost': 12, 'y_milli': 647}), ({'phases': [[270, 600, 120], [570], [570, 900]], 'sat': 1800, 'lost': 2, 'allred': 5, 'cmin': 50, 'cmax': 150}, 'oversaturated')], [({'phases': [[240], [510], [510, 450, 570]], 'sat': 1900, 'lost': 3, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 75, 'lost': 11, 'y_milli': 694}), ({'phases': [[690], [720, 690, 750]], 'sat': 2000, 'lost': 2, 'allred': 0, 'cmin': 50, 'cmax': 180}, {'cycle': 50, 'lost': 4, 'y_milli': 720}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'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': [[810], [660]], 'sat': 2000, 'lost': 3, 'allred': 3, 'cmin': 50, 'cmax': 90}, {'cycle': 70, 'lost': 9, 'y_milli': 735}), ({'phases': [[180], [570], [330, 510, 150], [150]], 'sat': 2000, 'lost': 5, 'allred': 3, 'cmin': 40, 'cmax': 180}, {'cycle': 135, 'lost': 23, 'y_milli': 705}), ({'phases': [[630, 90], [60, 240], [180, 60, 420]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 50, 'cmax': 120}, {'cycle': 75, 'lost': 10, 'y_milli': 716})]]
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': 45, 'lost': 10, 'y_milli': 583} | {'cycle': 50, 'lost': 10, 'y_milli': 583} | Failed |
| timing oracle 1 | {'cycle': 60, 'lost': 13, 'y_milli': 616} | {'cycle': 65, 'lost': 13, 'y_milli': 616} | Failed |
| timing oracle 2 | {'cycle': 90, 'lost': 15, 'y_milli': 694} | {'cycle': 95, 'lost': 15, 'y_milli': 694} | Failed |
| timing oracle 3 | oversaturated | oversaturated | Passed |
| timing oracle 4 | {'cycle': 50, 'lost': 9, 'y_milli': 647} | {'cycle': 55, 'lost': 9, 'y_milli': 647} | Failed |
| timing oracle 5 | {'cycle': 50, 'lost': 10, 'y_milli': 631} | {'cycle': 55, 'lost': 10, 'y_milli': 631} | Failed |
| timing oracle 6 | oversaturated | oversaturated | Passed |
| timing oracle 7 | oversaturated | oversaturated | Passed |
SHA-256 / 005ef200db2a9fe5bfc8c3f51cb63332c9b0bb9776ea406499346616d462d665
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 = round(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': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[90], [300], [90, 720]], 'sat': 1800, 'lost': 4, 'allred': 1, 'cmin': 50, 'cmax': 180}, {'cycle': 65, 'lost': 13, 'y_milli': 616}), ({'phases': [[300, 540], [120, 210], [180, 450, 570]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 60, 'cmax': 180}, {'cycle': 95, 'lost': 15, 'y_milli': 694}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[210, 690], [540, 480]], 'sat': 1900, 'lost': 4, 'allred': 1, 'cmin': 50, 'cmax': 90}, {'cycle': 55, 'lost': 9, 'y_milli': 647}), ({'phases': [[390], [150, 510, 810]], 'sat': 1900, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 150}, {'cycle': 55, 'lost': 10, 'y_milli': 631}), ({'phases': [[180, 540], [480], [720], [450, 690]], 'sat': 1900, 'lost': 4, 'allred': 5, 'cmin': 60, 'cmax': 120}, 'oversaturated'), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated')], [({'phases': [[630, 600], [510, 270, 120], [720, 90]], 'sat': 1800, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 90}, 'oversaturated'), ({'phases': [[690, 150], [90, 300, 90]], 'sat': 1800, 'lost': 5, 'allred': 2, 'cmin': 40, 'cmax': 180}, {'cycle': 55, 'lost': 12, 'y_milli': 550}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'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': [[180, 630, 300], [90, 600, 120], [570, 540, 390]], 'sat': 1900, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 120}, 'oversaturated'), ({'phases': [[660], [240, 480, 510]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 50, 'cmax': 180}, {'cycle': 60, 'lost': 10, 'y_milli': 650}), ({'phases': [[210, 840, 900], [60], [510]], 'sat': 1800, 'lost': 3, 'allred': 5, 'cmin': 40, 'cmax': 150}, {'cycle': 145, 'lost': 14, 'y_milli': 816})], [({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[750, 570], [180, 510]], 'sat': 1900, 'lost': 3, 'allred': 5, 'cmin': 50, 'cmax': 120}, {'cycle': 65, 'lost': 11, 'y_milli': 663}), ({'phases': [[150, 60], [600, 480, 330], [210, 60, 720]], 'sat': 1900, 'lost': 5, 'allred': 2, 'cmin': 50, 'cmax': 180}, {'cycle': 135, 'lost': 17, 'y_milli': 773}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[420, 450], [270, 510, 690], [210], [60, 150]], 'sat': 1800, 'lost': 2, 'allred': 0, 'cmin': 60, 'cmax': 180}, {'cycle': 105, 'lost': 8, 'y_milli': 833}), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[900], [840, 570, 390], [660, 90]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 50, 'cmax': 180}, 'oversaturated'), ({'phases': [[540], [900]], 'sat': 1900, 'lost': 3, 'allred': 3, 'cmin': 60, 'cmax': 150}, {'cycle': 80, 'lost': 9, 'y_milli': 757})], [({'phases': [[810, 450, 540], [450, 240]], 'sat': 1800, 'lost': 5, 'allred': 1, 'cmin': 40, 'cmax': 180}, {'cycle': 75, 'lost': 11, 'y_milli': 700}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[270], [390, 150], [900], [480]], 'sat': 2000, 'lost': 5, 'allred': 5, 'cmin': 50, 'cmax': 180}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[630, 60], [570]], 'sat': 1800, 'lost': 5, 'allred': 4, 'cmin': 40, 'cmax': 120}, {'cycle': 80, 'lost': 14, 'y_milli': 666}), ({'phases': [[660, 570, 330], [570, 210, 150]], 'sat': 1900, 'lost': 3, 'allred': 6, 'cmin': 60, 'cmax': 180}, {'cycle': 70, 'lost': 12, 'y_milli': 647}), ({'phases': [[270, 600, 120], [570], [570, 900]], 'sat': 1800, 'lost': 2, 'allred': 5, 'cmin': 50, 'cmax': 150}, 'oversaturated')], [({'phases': [[240], [510], [510, 450, 570]], 'sat': 1900, 'lost': 3, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 75, 'lost': 11, 'y_milli': 694}), ({'phases': [[690], [720, 690, 750]], 'sat': 2000, 'lost': 2, 'allred': 0, 'cmin': 50, 'cmax': 180}, {'cycle': 50, 'lost': 4, 'y_milli': 720}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'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': [[810], [660]], 'sat': 2000, 'lost': 3, 'allred': 3, 'cmin': 50, 'cmax': 90}, {'cycle': 70, 'lost': 9, 'y_milli': 735}), ({'phases': [[180], [570], [330, 510, 150], [150]], 'sat': 2000, 'lost': 5, 'allred': 3, 'cmin': 40, 'cmax': 180}, {'cycle': 135, 'lost': 23, 'y_milli': 705}), ({'phases': [[630, 90], [60, 240], [180, 60, 420]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 50, 'cmax': 120}, {'cycle': 75, 'lost': 10, 'y_milli': 716})]]
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': 50, 'lost': 10, 'y_milli': 583} | {'cycle': 50, 'lost': 10, 'y_milli': 583} | Passed |
| timing oracle 1 | {'cycle': 65, 'lost': 13, 'y_milli': 616} | {'cycle': 65, 'lost': 13, 'y_milli': 616} | Passed |
| timing oracle 2 | {'cycle': 90, 'lost': 15, 'y_milli': 694} | {'cycle': 95, 'lost': 15, 'y_milli': 694} | Failed |
| timing oracle 3 | oversaturated | oversaturated | Passed |
| timing oracle 4 | {'cycle': 50, 'lost': 9, 'y_milli': 647} | {'cycle': 55, 'lost': 9, 'y_milli': 647} | Failed |
| timing oracle 5 | {'cycle': 55, 'lost': 10, 'y_milli': 631} | {'cycle': 55, 'lost': 10, 'y_milli': 631} | Passed |
| timing oracle 6 | oversaturated | oversaturated | Passed |
| timing oracle 7 | oversaturated | oversaturated | Passed |
SHA-256 / 869ddb912f2b6528075c2524c39062a9009da5dd9ad1c5232f35a8498f4721f0
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': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[90], [300], [90, 720]], 'sat': 1800, 'lost': 4, 'allred': 1, 'cmin': 50, 'cmax': 180}, {'cycle': 65, 'lost': 13, 'y_milli': 616}), ({'phases': [[300, 540], [120, 210], [180, 450, 570]], 'sat': 1900, 'lost': 5, 'allred': 0, 'cmin': 60, 'cmax': 180}, {'cycle': 95, 'lost': 15, 'y_milli': 694}), ({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[210, 690], [540, 480]], 'sat': 1900, 'lost': 4, 'allred': 1, 'cmin': 50, 'cmax': 90}, {'cycle': 55, 'lost': 9, 'y_milli': 647}), ({'phases': [[390], [150, 510, 810]], 'sat': 1900, 'lost': 2, 'allred': 6, 'cmin': 40, 'cmax': 150}, {'cycle': 55, 'lost': 10, 'y_milli': 631}), ({'phases': [[180, 540], [480], [720], [450, 690]], 'sat': 1900, 'lost': 4, 'allred': 5, 'cmin': 60, 'cmax': 120}, 'oversaturated'), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated')], [({'phases': [[630, 600], [510, 270, 120], [720, 90]], 'sat': 1800, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 90}, 'oversaturated'), ({'phases': [[690, 150], [90, 300, 90]], 'sat': 1800, 'lost': 5, 'allred': 2, 'cmin': 40, 'cmax': 180}, {'cycle': 55, 'lost': 12, 'y_milli': 550}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'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': [[180, 630, 300], [90, 600, 120], [570, 540, 390]], 'sat': 1900, 'lost': 3, 'allred': 4, 'cmin': 50, 'cmax': 120}, 'oversaturated'), ({'phases': [[660], [240, 480, 510]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 50, 'cmax': 180}, {'cycle': 60, 'lost': 10, 'y_milli': 650}), ({'phases': [[210, 840, 900], [60], [510]], 'sat': 1800, 'lost': 3, 'allred': 5, 'cmin': 40, 'cmax': 150}, {'cycle': 145, 'lost': 14, 'y_milli': 816})], [({'phases': [[720, 360], [540, 900]], 'sat': 1800, 'lost': 4, 'allred': 4, 'cmin': 60, 'cmax': 150}, 'oversaturated'), ({'phases': [[750, 570], [180, 510]], 'sat': 1900, 'lost': 3, 'allred': 5, 'cmin': 50, 'cmax': 120}, {'cycle': 65, 'lost': 11, 'y_milli': 663}), ({'phases': [[150, 60], [600, 480, 330], [210, 60, 720]], 'sat': 1900, 'lost': 5, 'allred': 2, 'cmin': 50, 'cmax': 180}, {'cycle': 135, 'lost': 17, 'y_milli': 773}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[420, 450], [270, 510, 690], [210], [60, 150]], 'sat': 1800, 'lost': 2, 'allred': 0, 'cmin': 60, 'cmax': 180}, {'cycle': 105, 'lost': 8, 'y_milli': 833}), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[900], [840, 570, 390], [660, 90]], 'sat': 1800, 'lost': 2, 'allred': 6, 'cmin': 50, 'cmax': 180}, 'oversaturated'), ({'phases': [[540], [900]], 'sat': 1900, 'lost': 3, 'allred': 3, 'cmin': 60, 'cmax': 150}, {'cycle': 80, 'lost': 9, 'y_milli': 757})], [({'phases': [[810, 450, 540], [450, 240]], 'sat': 1800, 'lost': 5, 'allred': 1, 'cmin': 40, 'cmax': 180}, {'cycle': 75, 'lost': 11, 'y_milli': 700}), ({'phases': [[810], [810]], 'sat': 1800, 'lost': 4, 'allred': 0, 'cmin': 40, 'cmax': 180}, 'oversaturated'), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'phases': [[270], [390, 150], [900], [480]], 'sat': 2000, 'lost': 5, 'allred': 5, 'cmin': 50, 'cmax': 180}, 'oversaturated'), ({'phases': [[300, 600], [450]], 'sat': 1800, 'lost': 4, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 50, 'lost': 10, 'y_milli': 583}), ({'phases': [[630, 60], [570]], 'sat': 1800, 'lost': 5, 'allred': 4, 'cmin': 40, 'cmax': 120}, {'cycle': 80, 'lost': 14, 'y_milli': 666}), ({'phases': [[660, 570, 330], [570, 210, 150]], 'sat': 1900, 'lost': 3, 'allred': 6, 'cmin': 60, 'cmax': 180}, {'cycle': 70, 'lost': 12, 'y_milli': 647}), ({'phases': [[270, 600, 120], [570], [570, 900]], 'sat': 1800, 'lost': 2, 'allred': 5, 'cmin': 50, 'cmax': 150}, 'oversaturated')], [({'phases': [[240], [510], [510, 450, 570]], 'sat': 1900, 'lost': 3, 'allred': 2, 'cmin': 40, 'cmax': 120}, {'cycle': 75, 'lost': 11, 'y_milli': 694}), ({'phases': [[690], [720, 690, 750]], 'sat': 2000, 'lost': 2, 'allred': 0, 'cmin': 50, 'cmax': 180}, {'cycle': 50, 'lost': 4, 'y_milli': 720}), ({'phases': [[90], [90], [90]], 'sat': 1800, 'lost': 3, 'allred': 0, 'cmin': 60, 'cmax': 120}, {'cycle': 60, 'lost': 9, 'y_milli': 150}), ({'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': [[810], [660]], 'sat': 2000, 'lost': 3, 'allred': 3, 'cmin': 50, 'cmax': 90}, {'cycle': 70, 'lost': 9, 'y_milli': 735}), ({'phases': [[180], [570], [330, 510, 150], [150]], 'sat': 2000, 'lost': 5, 'allred': 3, 'cmin': 40, 'cmax': 180}, {'cycle': 135, 'lost': 23, 'y_milli': 705}), ({'phases': [[630, 90], [60, 240], [180, 60, 420]], 'sat': 1800, 'lost': 3, 'allred': 1, 'cmin': 50, 'cmax': 120}, {'cycle': 75, 'lost': 10, 'y_milli': 716})]]
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': 50, 'lost': 10, 'y_milli': 583} | {'cycle': 50, 'lost': 10, 'y_milli': 583} | Passed |
| timing oracle 1 | {'cycle': 65, 'lost': 13, 'y_milli': 616} | {'cycle': 65, 'lost': 13, 'y_milli': 616} | Passed |
| timing oracle 2 | {'cycle': 95, 'lost': 15, 'y_milli': 694} | {'cycle': 95, 'lost': 15, 'y_milli': 694} | Passed |
| timing oracle 3 | oversaturated | oversaturated | Passed |
| timing oracle 4 | {'cycle': 55, 'lost': 9, 'y_milli': 647} | {'cycle': 55, 'lost': 9, 'y_milli': 647} | Passed |
| timing oracle 5 | {'cycle': 55, 'lost': 10, 'y_milli': 631} | {'cycle': 55, 'lost': 10, 'y_milli': 631} | Passed |
| timing oracle 6 | oversaturated | oversaturated | Passed |
| timing oracle 7 | oversaturated | oversaturated | Passed |
SHA-256 / f2577158d6daa81f4b241d8963fb7e5e3893c5b3160a8ec825186d10a7ba5207
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.753224+00:00.
Case digest / ef669cab291a9dbc18510cfe2ef9b665e6200a2a949714640021b1aabe0c30bd