FA-67831 / Elevator dispatch scheduling / Open access
Encoder position and door zone detection: door zone test · case 01
A car exactly at the zone edge is reported between floors.
ROOT CAUSE
The zone comparison is strict.
VERIFIED REPAIR
Accept offsets up to and including zone_mm.
Unsuccessful approach: Comparing micrometres against a millimetre limit shrinks the zone a thousandfold.
Case contract
Car position is tracked in micrometres: start_mm*1000, pulses add count*um_per_pulse, a door-zone magnet at floor k resets the position to floor_mm[k]*1000. After every event the position in mm is floor(um/1000); the car is at the nearest floor (ties to the lower index) if within zone_mm inclusive, otherwise None (between floors).
Why this case matters
Lift group controllers make these decisions many times per minute; a wrong answer strands passengers, wastes trips or overrides a safety rule.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
table = x['floor_mm']
pos = x['start_mm'] * 1000
out = []
for kind, v in x['events']:
if kind == 'pulses':
pos += v * x['um_per_pulse']
else:
pos = table[v] * 1000
mm = pos // 1000
best = min(range(len(table)), key=lambda k: (abs(table[k] - mm), k))
out.append(best if abs(table[best] - mm) < x['zone_mm'] else None)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('control 1', {'floor_mm': [0, 4200, 8400, 11400, 14900], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 5000], ['magnet', 4], ['pulses', 2999], ['pulses', 4200], ['pulses', 2999], ['magnet', 4]]}, [3, None, 4, None, None, None, 4]), ('control 4', {'floor_mm': [0, 3000, 6500, 10000, 13500, 16500, 20000], 'start_mm': 2990, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 1000], ['pulses', 100]]}, [None, None]), ('control 7', {'floor_mm': [0, 3500, 7700, 10700, 14200, 17200, 21400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 1000], ['pulses', 100], ['magnet', 2], ['pulses', 3000]]}, [0, None, None, None, 2, 3])], [('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('control 10', {'floor_mm': [0, 3000, 6000, 9500, 13700], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['magnet', 2], ['pulses', 4200], ['pulses', 3500], ['pulses', 100], ['pulses', 5000], ['pulses', 3000], ['pulses', 4200]]}, [2, None, 4, None, None, None, None]), ('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('control 12', {'floor_mm': [0, 3000, 6000, 10200, 13200, 17400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 3499], ['pulses', 1000], ['pulses', 3500], ['pulses', 100], ['magnet', 2], ['pulses', 3500]]}, [0, None, None, None, None, 2, None]), ('control 15', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 3499]]}, [1, None]), ('control 18', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 3499], ['pulses', 3000], ['pulses', 3000]]}, [None, None, None])], [('regression: fractional millimetre below a floor', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 1]]}, [1]), ('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('control 26', {'floor_mm': [0, 4200, 7200, 11400, 14900, 17900, 21400, 25600], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['pulses', 4200], ['pulses', 4200], ['pulses', 3500], ['pulses', 2999], ['pulses', 3499], ['pulses', 2999], ['pulses', 4200]]}, [1, None, None, 4, None, 6, None]), ('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('control 23', {'floor_mm': [0, 4200, 7700, 11200, 15400, 18400, 22600, 25600, 28600], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3500], ['pulses', 3000]]}, [None, None]), ('control 29', {'floor_mm': [0, 4200, 8400, 12600, 16100, 20300, 23800, 27300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 2999], ['pulses', 3499], ['pulses', 5000], ['magnet', 1], ['pulses', 100]]}, [3, None, None, None, 1, None]), ('control 32', {'floor_mm': [0, 4200, 7700, 11200, 14700, 17700, 21200, 25400], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3500], ['pulses', 5000], ['pulses', 3000], ['magnet', 6], ['magnet', 0], ['magnet', 4]]}, [None, None, None, 6, 0, 4])], [('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('control 54', {'floor_mm': [0, 4200, 8400, 11900, 16100, 19600, 23100, 26100, 30300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 3500], ['pulses', 3500], ['magnet', 6], ['pulses', 2999]]}, [None, 1, 6, None]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('control 34', {'floor_mm': [0, 4200, 7700, 10700, 14200, 17700, 20700, 23700], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 5], ['pulses', 5000]]}, [5, 6]), ('control 37', {'floor_mm': [0, 4200, 7200, 10700, 14200, 17700, 20700], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 1000], ['pulses', 100], ['magnet', 2]]}, [None, None, None, 2]), ('control 40', {'floor_mm': [0, 4200, 7700, 11900, 15400, 19600, 22600, 26800, 29800], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 0], ['magnet', 8], ['pulses', 5000], ['pulses', 3000], ['pulses', 5000], ['magnet', 4]]}, [None, 0, 8, None, None, None, 4])], [('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('regression: fractional millimetre below a floor', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 1]]}, [1]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('control 45', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19800, 22800, 26300], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 3], ['pulses', 3500], ['pulses', 3500]]}, [3, None, 4]), ('control 48', {'floor_mm': [0, 3000, 6000, 9000, 13200, 16200, 20400, 23400, 26400], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 1000], ['magnet', 2]]}, [0, None, 2]), ('control 51', {'floor_mm': [0, 4200, 7200, 10700, 14900, 19100], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 100]]}, [0, None, None])]]
for label, args, expected in fixtures[N-1]:
check(label, 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 |
|---|---|---|---|
| regression: zone edge | [None, 1] | [1, 1] | Failed |
| boundary: encoder slip accumulates | [1, 2] | [1, 2] | Passed |
| boundary: magnet correction | [1, 1, 2] | [1, 1, 2] | Passed |
| boundary: sub-millimetre pulses | [None, None] | [None, None] | Passed |
| regression: six-tenths of a millimetre short of the zone | [None, None] | [None, 1] | Failed |
| control 1 | [3, None, 4, None, None, None, 4] | [3, None, 4, None, None, None, 4] | Passed |
| control 4 | [None, None] | [None, None] | Passed |
| control 7 | [0, None, None, None, 2, 3] | [0, None, None, None, 2, 3] | Passed |
SHA-256 / 6e702557419f1e82757332cd6da346300686573eb65239a54db4a6355aff5b32
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
table = x['floor_mm']
pos = x['start_mm'] * 1000
out = []
for kind, v in x['events']:
if kind == 'pulses':
pos += v * x['um_per_pulse']
else:
pos = table[v] * 1000
mm = pos // 1000
best = min(range(len(table)), key=lambda k: (abs(table[k] - mm), k))
out.append(best if abs(table[best] * 1000 - pos) <= x['zone_mm'] else None)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('control 1', {'floor_mm': [0, 4200, 8400, 11400, 14900], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 5000], ['magnet', 4], ['pulses', 2999], ['pulses', 4200], ['pulses', 2999], ['magnet', 4]]}, [3, None, 4, None, None, None, 4]), ('control 4', {'floor_mm': [0, 3000, 6500, 10000, 13500, 16500, 20000], 'start_mm': 2990, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 1000], ['pulses', 100]]}, [None, None]), ('control 7', {'floor_mm': [0, 3500, 7700, 10700, 14200, 17200, 21400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 1000], ['pulses', 100], ['magnet', 2], ['pulses', 3000]]}, [0, None, None, None, 2, 3])], [('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('control 10', {'floor_mm': [0, 3000, 6000, 9500, 13700], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['magnet', 2], ['pulses', 4200], ['pulses', 3500], ['pulses', 100], ['pulses', 5000], ['pulses', 3000], ['pulses', 4200]]}, [2, None, 4, None, None, None, None]), ('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('control 12', {'floor_mm': [0, 3000, 6000, 10200, 13200, 17400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 3499], ['pulses', 1000], ['pulses', 3500], ['pulses', 100], ['magnet', 2], ['pulses', 3500]]}, [0, None, None, None, None, 2, None]), ('control 15', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 3499]]}, [1, None]), ('control 18', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 3499], ['pulses', 3000], ['pulses', 3000]]}, [None, None, None])], [('regression: fractional millimetre below a floor', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 1]]}, [1]), ('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('control 26', {'floor_mm': [0, 4200, 7200, 11400, 14900, 17900, 21400, 25600], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['pulses', 4200], ['pulses', 4200], ['pulses', 3500], ['pulses', 2999], ['pulses', 3499], ['pulses', 2999], ['pulses', 4200]]}, [1, None, None, 4, None, 6, None]), ('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('control 23', {'floor_mm': [0, 4200, 7700, 11200, 15400, 18400, 22600, 25600, 28600], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3500], ['pulses', 3000]]}, [None, None]), ('control 29', {'floor_mm': [0, 4200, 8400, 12600, 16100, 20300, 23800, 27300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 2999], ['pulses', 3499], ['pulses', 5000], ['magnet', 1], ['pulses', 100]]}, [3, None, None, None, 1, None]), ('control 32', {'floor_mm': [0, 4200, 7700, 11200, 14700, 17700, 21200, 25400], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3500], ['pulses', 5000], ['pulses', 3000], ['magnet', 6], ['magnet', 0], ['magnet', 4]]}, [None, None, None, 6, 0, 4])], [('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('control 54', {'floor_mm': [0, 4200, 8400, 11900, 16100, 19600, 23100, 26100, 30300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 3500], ['pulses', 3500], ['magnet', 6], ['pulses', 2999]]}, [None, 1, 6, None]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('control 34', {'floor_mm': [0, 4200, 7700, 10700, 14200, 17700, 20700, 23700], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 5], ['pulses', 5000]]}, [5, 6]), ('control 37', {'floor_mm': [0, 4200, 7200, 10700, 14200, 17700, 20700], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 1000], ['pulses', 100], ['magnet', 2]]}, [None, None, None, 2]), ('control 40', {'floor_mm': [0, 4200, 7700, 11900, 15400, 19600, 22600, 26800, 29800], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 0], ['magnet', 8], ['pulses', 5000], ['pulses', 3000], ['pulses', 5000], ['magnet', 4]]}, [None, 0, 8, None, None, None, 4])], [('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('regression: fractional millimetre below a floor', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 1]]}, [1]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('control 45', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19800, 22800, 26300], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 3], ['pulses', 3500], ['pulses', 3500]]}, [3, None, 4]), ('control 48', {'floor_mm': [0, 3000, 6000, 9000, 13200, 16200, 20400, 23400, 26400], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 1000], ['magnet', 2]]}, [0, None, 2]), ('control 51', {'floor_mm': [0, 4200, 7200, 10700, 14900, 19100], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 100]]}, [0, None, None])]]
for label, args, expected in fixtures[N-1]:
check(label, 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 |
|---|---|---|---|
| regression: zone edge | [None, None] | [1, 1] | Failed |
| boundary: encoder slip accumulates | [None, None] | [1, 2] | Failed |
| boundary: magnet correction | [None, 1, None] | [1, 1, 2] | Failed |
| boundary: sub-millimetre pulses | [None, None] | [None, None] | Passed |
| regression: six-tenths of a millimetre short of the zone | [None, None] | [None, 1] | Failed |
| control 1 | [3, None, 4, None, None, None, 4] | [3, None, 4, None, None, None, 4] | Passed |
| control 4 | [None, None] | [None, None] | Passed |
| control 7 | [0, None, None, None, 2, None] | [0, None, None, None, 2, 3] | Failed |
SHA-256 / d38bffd3c69e3b35abdd69bfdd8d7b6ccfd4aa270863cad329839b7472be6070
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
table = x['floor_mm']
pos = x['start_mm'] * 1000
out = []
for kind, v in x['events']:
if kind == 'pulses':
pos += v * x['um_per_pulse']
else:
pos = table[v] * 1000
mm = pos // 1000
best = min(range(len(table)), key=lambda k: (abs(table[k] - mm), k))
out.append(best if abs(table[best] - mm) <= x['zone_mm'] else None)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('control 1', {'floor_mm': [0, 4200, 8400, 11400, 14900], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 5000], ['magnet', 4], ['pulses', 2999], ['pulses', 4200], ['pulses', 2999], ['magnet', 4]]}, [3, None, 4, None, None, None, 4]), ('control 4', {'floor_mm': [0, 3000, 6500, 10000, 13500, 16500, 20000], 'start_mm': 2990, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 1000], ['pulses', 100]]}, [None, None]), ('control 7', {'floor_mm': [0, 3500, 7700, 10700, 14200, 17200, 21400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 1000], ['pulses', 100], ['magnet', 2], ['pulses', 3000]]}, [0, None, None, None, 2, 3])], [('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('control 10', {'floor_mm': [0, 3000, 6000, 9500, 13700], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['magnet', 2], ['pulses', 4200], ['pulses', 3500], ['pulses', 100], ['pulses', 5000], ['pulses', 3000], ['pulses', 4200]]}, [2, None, 4, None, None, None, None]), ('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('control 12', {'floor_mm': [0, 3000, 6000, 10200, 13200, 17400], 'start_mm': 2990, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['magnet', 0], ['pulses', 3499], ['pulses', 1000], ['pulses', 3500], ['pulses', 100], ['magnet', 2], ['pulses', 3500]]}, [0, None, None, None, None, 2, None]), ('control 15', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 3499]]}, [1, None]), ('control 18', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19100], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 3499], ['pulses', 3000], ['pulses', 3000]]}, [None, None, None])], [('regression: fractional millimetre below a floor', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 1]]}, [1]), ('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('control 26', {'floor_mm': [0, 4200, 7200, 11400, 14900, 17900, 21400, 25600], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 75, 'events': [['pulses', 4200], ['pulses', 4200], ['pulses', 3500], ['pulses', 2999], ['pulses', 3499], ['pulses', 2999], ['pulses', 4200]]}, [1, None, None, 4, None, 6, None]), ('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('control 23', {'floor_mm': [0, 4200, 7700, 11200, 15400, 18400, 22600, 25600, 28600], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3500], ['pulses', 3000]]}, [None, None]), ('control 29', {'floor_mm': [0, 4200, 8400, 12600, 16100, 20300, 23800, 27300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 3], ['pulses', 2999], ['pulses', 3499], ['pulses', 5000], ['magnet', 1], ['pulses', 100]]}, [3, None, None, None, 1, None]), ('control 32', {'floor_mm': [0, 4200, 7700, 11200, 14700, 17700, 21200, 25400], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3500], ['pulses', 5000], ['pulses', 3000], ['magnet', 6], ['magnet', 0], ['magnet', 4]]}, [None, None, None, 6, 0, 4])], [('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('control 54', {'floor_mm': [0, 4200, 8400, 11900, 16100, 19600, 23100, 26100, 30300], 'start_mm': 20, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 3500], ['pulses', 3500], ['magnet', 6], ['pulses', 2999]]}, [None, 1, 6, None]), ('boundary: encoder slip accumulates', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 3000], ['pulses', 3000]]}, [1, 2]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('control 34', {'floor_mm': [0, 4200, 7700, 10700, 14200, 17700, 20700, 23700], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 50, 'events': [['magnet', 5], ['pulses', 5000]]}, [5, 6]), ('control 37', {'floor_mm': [0, 4200, 7200, 10700, 14200, 17700, 20700], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 2999], ['pulses', 1000], ['pulses', 100], ['magnet', 2]]}, [None, None, None, 2]), ('control 40', {'floor_mm': [0, 4200, 7700, 11900, 15400, 19600, 22600, 26800, 29800], 'start_mm': 20, 'um_per_pulse': 1000, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 0], ['magnet', 8], ['pulses', 5000], ['pulses', 3000], ['pulses', 5000], ['magnet', 4]]}, [None, 0, 8, None, None, None, 4])], [('regression: six-tenths of a millimetre short of the zone', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['pulses', 1], ['pulses', 1]]}, [None, 1]), ('regression: fractional millimetre below a floor', {'floor_mm': [0, 3000], 'start_mm': 2924, 'um_per_pulse': 1003, 'zone_mm': 75, 'events': [['pulses', 1]]}, [1]), ('boundary: magnet correction', {'floor_mm': [0, 3000, 6000], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['pulses', 3000], ['magnet', 1], ['pulses', 3000]]}, [1, 1, 2]), ('regression: zone edge', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 1000, 'zone_mm': 75, 'events': [['pulses', 2925], ['pulses', 1]]}, [1, 1]), ('boundary: sub-millimetre pulses', {'floor_mm': [0, 3000], 'start_mm': 0, 'um_per_pulse': 997, 'zone_mm': 50, 'events': [['pulses', 999], ['pulses', 2]]}, [None, None]), ('control 45', {'floor_mm': [0, 3000, 7200, 11400, 15600, 19800, 22800, 26300], 'start_mm': 2990, 'um_per_pulse': 600, 'zone_mm': 75, 'events': [['magnet', 3], ['pulses', 3500], ['pulses', 3500]]}, [3, None, 4]), ('control 48', {'floor_mm': [0, 3000, 6000, 9000, 13200, 16200, 20400, 23400, 26400], 'start_mm': 0, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 1000], ['magnet', 2]]}, [0, None, 2]), ('control 51', {'floor_mm': [0, 4200, 7200, 10700, 14900, 19100], 'start_mm': 2990, 'um_per_pulse': 1003, 'zone_mm': 50, 'events': [['magnet', 0], ['pulses', 100], ['pulses', 100]]}, [0, None, None])]]
for label, args, expected in fixtures[N-1]:
check(label, 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 |
|---|---|---|---|
| regression: zone edge | [1, 1] | [1, 1] | Passed |
| boundary: encoder slip accumulates | [1, 2] | [1, 2] | Passed |
| boundary: magnet correction | [1, 1, 2] | [1, 1, 2] | Passed |
| boundary: sub-millimetre pulses | [None, None] | [None, None] | Passed |
| regression: six-tenths of a millimetre short of the zone | [None, 1] | [None, 1] | Passed |
| control 1 | [3, None, 4, None, None, None, 4] | [3, None, 4, None, None, None, 4] | Passed |
| control 4 | [None, None] | [None, None] | Passed |
| control 7 | [0, None, None, None, 2, 3] | [0, None, None, None, 2, 3] | Passed |
SHA-256 / 358f1cc33fe127c9474107aa7c3c4559c99ad84730dbafe051ec48f2bcea3584
Verification & scope
Stipulated toy lift-control contract for a bounded teaching model; it makes no claim of conformance to any lift code or vendor dispatcher and omits real safety cases. 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.567579+00:00.
Case digest / ba0f1dd94a02a9ecc50fd63b6bcfe1f2dc1ad7c1d9b6677104719fc194e361e2