FA-91986 / PLC ladder logic scan cycles / Open access
One-shot storage bit only updates when a pulse is produced · case 01
After one pulse the instruction never fires again because its storage bit is never refreshed to the input.
ROOT CAUSE
The storage write is placed inside the pulse condition.
VERIFIED REPAIR
Write the input state into the storage bit on every execution.
Unsuccessful approach: Deriving storage from the pulse and the old storage works for OSR but never arms OSF.
Case contract
One-shot rising (OSR) and one-shot falling (OSF) instructions executed in program order each scan; instrs is a list of [kind, input_tag, storage_tag] and scans a list of {tag: bool} (missing tags are false). Prescan initializes each OSR storage bit true and each OSF storage bit false (later instructions overwrite shared storage), so nothing pulses on the first scan merely because an input is already in its steady state. OSR pulses when input is true and storage false; OSF pulses when storage is true and input false; the storage bit is then set to the input. Instructions that share a storage tag share its state. Return the pulse list per scan.
Why this case matters
Ladder programs are executed as repeated scans; each defect here changes what a rung, timer, counter or data-table instruction reports on a particular scan, which is how commissioning and field faults are actually observed.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(instrs, scans):
store = {}
for kind, tag, st in instrs:
store[st] = kind != 'OSF'
out = []
for inputs in scans:
pulses = []
for kind, tag, st in instrs:
cur = bool(inputs.get(tag, False))
if kind == 'OSF':
pulse = store[st] and not cur
else:
pulse = cur and not store[st]
if pulse:
store[st] = cur
pulses.append(pulse)
out.append(pulses)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: scenario 1',
[[['OSR', 'I:1', 'B:10'], ['OSR', 'I:1', 'B:10'], ['OSF', 'B:3', 'B:12']],
[{'B:3': False},
{'I:0': False, 'I:1': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, True],
[True, False, False]]],
['regression: scenario 2',
[[['OSF', 'I:1', 'B:13'], ['OSF', 'B:3', 'B:10']],
[{'I:0': True, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False], [False, False], [False, False], [False, True], [True, False], [False, False]]],
['regression: scenario 3',
[[['OSF', 'I:0', 'B:12'], ['OSF', 'B:3', 'B:12']],
[{'I:0': True, 'I:1': True},
{'I:1': False, 'B:3': True},
{'I:1': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': False, 'B:3': False}]],
[[False, True], [False, False], [True, False], [False, False], [False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:12'], ['OSF', 'B:3', 'B:12'], ['OSR', 'I:0', 'B:11'], ['OSR', 'B:3', 'B:12']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True},
{'I:0': False, 'I:1': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True}]],
[[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[True, False, True, False],
[False, False, False, False],
[False, False, True, False],
[False, False, False, False]]],
['control: scenario 5',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'B:3', 'B:12']],
[{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False], [False, False], [False, False], [False, False], [False, False]]]],
[['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: scenario 1',
[[['OSF', 'B:3', 'B:11'], ['OSR', 'B:3', 'B:10']],
[{'I:0': False, 'B:3': True},
{'I:0': True, 'I:1': True},
{'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False}]],
[[False, False], [True, False], [False, False], [False, False], [False, False], [False, False]]],
['regression: scenario 2',
[[['OSR', 'I:1', 'B:11'], ['OSR', 'I:0', 'B:11']],
[{'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False},
{'I:0': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False],
[False, False],
[False, True],
[False, False],
[False, False],
[False, False],
[False, True],
[False, False]]],
['regression: scenario 3',
[[['OSR', 'I:0', 'B:11'], ['OSF', 'I:0', 'B:12'], ['OSR', 'I:1', 'B:13'], ['OSR', 'I:0', 'B:12']],
[{'I:0': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:1': True},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True}]],
[[False, False, False, False],
[False, False, True, False],
[False, True, False, False],
[False, False, True, False],
[True, False, False, False],
[False, True, True, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:12'], ['OSR', 'B:3', 'B:12'], ['OSR', 'I:0', 'B:10']],
[{'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': False},
{'I:0': False, 'I:1': True},
{'I:0': True, 'I:1': True, 'B:3': False}]],
[[True, False, False],
[False, False, True],
[False, False, False],
[False, False, False],
[False, False, True]]],
['regression: scenario 5',
[[['OSF', 'B:3', 'B:13'], ['OSF', 'I:1', 'B:13']],
[{'I:0': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:1': False, 'B:3': True},
{'I:1': False, 'B:3': True}]],
[[False, False],
[False, False],
[False, True],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, True],
[False, True]]]],
[['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: scenario 2',
[[['OSF', 'I:1', 'B:11'], ['OSF', 'B:3', 'B:10'], ['OSF', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:10']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': True},
{'I:0': False, 'B:3': True},
{'I:1': False}]],
[[False, False, False, False],
[False, False, False, False],
[False, False, True, False],
[False, False, False, False],
[True, False, True, False],
[False, False, False, False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: scenario 1',
[[['OSF', 'B:3', 'B:12'], ['OSR', 'I:1', 'B:13'], ['OSR', 'I:1', 'B:12']],
[{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False},
{'I:0': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'B:3': True},
{'I:1': True, 'B:3': True},
{'I:1': True}]],
[[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, True, False],
[True, False, True]]],
['regression: scenario 3',
[[['OSR', 'I:0', 'B:13'], ['OSR', 'I:0', 'B:11'], ['OSF', 'B:3', 'B:10'], ['OSF', 'B:3', 'B:10']],
[{'I:1': True, 'B:3': False},
{'I:0': True, 'B:3': True},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': True},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False}]],
[[False, False, False, False],
[True, True, False, False],
[False, False, True, False],
[True, True, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[True, True, False, False],
[False, False, False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:11'], ['OSF', 'I:0', 'B:13'], ['OSR', 'I:1', 'B:12']],
[{'I:0': False, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'B:3': True},
{'I:1': True},
{'I:0': True, 'I:1': True, 'B:3': False}]],
[[False, False, False],
[False, False, True],
[False, True, False],
[True, False, True],
[False, False, False]]],
['regression: scenario 5',
[[['OSR', 'I:1', 'B:13'], ['OSF', 'I:1', 'B:12'], ['OSF', 'I:1', 'B:12']],
[{'I:0': True, 'I:1': True, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, True, False],
[True, False, False]]]],
[['regression: scenario 1',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:0', 'B:13'], ['OSR', 'I:1', 'B:10']],
[{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True},
{'I:1': False},
{'I:0': False, 'I:1': False}]],
[[False, False, False],
[True, True, False],
[False, False, False],
[False, False, True],
[False, True, False],
[True, False, False],
[False, False, False],
[False, False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:13'], ['OSF', 'I:0', 'B:11'], ['OSR', 'I:1', 'B:13'], ['OSR', 'I:0', 'B:10']],
[{'I:0': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:0': False}]],
[[True, False, False, False],
[False, False, True, True],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: scenario 2',
[[['OSR', 'I:1', 'B:11'], ['OSR', 'I:1', 'B:12'], ['OSR', 'I:0', 'B:13'], ['OSR', 'I:1', 'B:10']],
[{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True}]],
[[False, False, False, False],
[False, False, True, False],
[False, False, False, False],
[False, False, False, False],
[False, False, True, False]]],
['regression: scenario 3',
[[['OSF', 'I:1', 'B:10'], ['OSR', 'I:1', 'B:10'], ['OSF', 'B:3', 'B:11'], ['OSR', 'I:0', 'B:11']],
[{'I:0': True, 'B:3': False},
{'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False},
{'I:0': False, 'B:3': False},
{'I:1': True, 'B:3': False},
{'I:0': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'B:3': False}]],
[[True, False, True, True],
[False, False, True, False],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[True, False, False, False],
[False, False, False, True],
[True, False, True, False]]],
['regression: scenario 5',
[[['OSR', 'I:0', 'B:11'], ['OSF', 'I:1', 'B:12'], ['OSR', 'I:0', 'B:10'], ['OSR', 'I:0', 'B:13']],
[{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:1': False, 'B:3': False},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False}]],
[[False, False, False, False],
[False, True, False, False],
[True, False, True, True],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False],
[True, False, True, True],
[False, False, False, False],
[True, True, True, True]]]],
[['regression: scenario 2',
[[['OSF', 'I:0', 'B:13'], ['OSF', 'B:3', 'B:10'], ['OSF', 'B:3', 'B:10'], ['OSF', 'B:3', 'B:10']],
[{'I:0': True, 'I:1': False},
{'B:3': False},
{'I:1': False},
{'B:3': True},
{'I:0': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:1': False, 'B:3': False},
{'I:0': False, 'B:3': True}]],
[[False, False, False, False],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False],
[False, False, False, False],
[False, True, False, False],
[True, False, False, False],
[False, True, False, False],
[False, False, False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:11'], ['OSF', 'I:0', 'B:12'], ['OSF', 'I:0', 'B:13']],
[{'I:1': True},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': True}]],
[[False, False, False],
[False, False, False],
[True, False, False],
[False, True, True],
[False, False, False],
[False, False, False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: scenario 1',
[[['OSF', 'I:1', 'B:12'], ['OSR', 'B:3', 'B:11'], ['OSR', 'I:0', 'B:13'], ['OSR', 'I:0', 'B:11']],
[{'I:0': True, 'I:1': True, 'B:3': True},
{'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'B:3': True}]],
[[False, False, False, False],
[True, False, False, False],
[False, False, True, True],
[True, False, False, False],
[False, True, False, False]]],
['regression: scenario 3',
[[['OSR', 'I:1', 'B:11'], ['OSF', 'I:1', 'B:12']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True}]],
[[False, False],
[True, False],
[False, False],
[False, False],
[False, True],
[False, False],
[True, False],
[False, False],
[False, True]]],
['regression: scenario 5',
[[['OSR', 'B:3', 'B:12'], ['OSF', 'B:3', 'B:12']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'B:3': True},
{'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': False}]],
[[False, False], [False, False], [True, False], [False, False], [False, False], [False, False]]]]]
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: input on at power-up | [[False, False], [False, False], [False, False], [False, False], [False, False]] | [[False, False], [False, False], [False, False], [True, False], [False, True]] | Failed |
| regression: falling edge train | [[False], [False], [False], [False], [False], [False]] | [[False], [True], [False], [False], [True], [False]] | Failed |
| regression: shared storage | [[False, False], [False, False], [False, False], [False, False]] | [[False, False], [False, True], [False, True], [False, False]] | Failed |
| regression: scenario 1 | [[False, False, False], [False, False, False], [False, False, False], [False, False, False], [False, False, False], [False, False, False], [False, False, False], [False, False, False]] | [[False, False, False], [True, False, False], [False, False, False], [False, False, False], [True, False, False], [False, False, False], [False, False, True], [True, False, False]] | Failed |
| regression: scenario 2 | [[False, False], [False, False], [False, False], [False, False], [False, False], [False, False]] | [[False, False], [False, False], [False, False], [False, True], [True, False], [False, False]] | Failed |
| regression: scenario 3 | [[False, False], [False, False], [False, False], [False, False], [False, False]] | [[False, True], [False, False], [True, False], [False, False], [False, False]] | Failed |
| regression: scenario 4 | [[True, False, False, False], [False, False, False, False], [False, False, False, True], [True, False, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, True]] | [[True, False, False, False], [False, False, False, False], [False, False, False, False], [True, False, True, False], [False, False, False, False], [False, False, True, False], [False, False, False, False]] | Failed |
| control: scenario 5 | [[False, False], [False, False], [False, False], [False, False], [False, False]] | [[False, False], [False, False], [False, False], [False, False], [False, False]] | Passed |
SHA-256 / cb2e3b1962ed5deaa2e98bccfc097b27b80c4a16ecc7f796e26066f76dc57c02
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(instrs, scans):
store = {}
for kind, tag, st in instrs:
store[st] = kind != 'OSF'
out = []
for inputs in scans:
pulses = []
for kind, tag, st in instrs:
cur = bool(inputs.get(tag, False))
if kind == 'OSF':
pulse = store[st] and not cur
else:
pulse = cur and not store[st]
store[st] = pulse or (store[st] and cur)
pulses.append(pulse)
out.append(pulses)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: scenario 1',
[[['OSR', 'I:1', 'B:10'], ['OSR', 'I:1', 'B:10'], ['OSF', 'B:3', 'B:12']],
[{'B:3': False},
{'I:0': False, 'I:1': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, True],
[True, False, False]]],
['regression: scenario 2',
[[['OSF', 'I:1', 'B:13'], ['OSF', 'B:3', 'B:10']],
[{'I:0': True, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False], [False, False], [False, False], [False, True], [True, False], [False, False]]],
['regression: scenario 3',
[[['OSF', 'I:0', 'B:12'], ['OSF', 'B:3', 'B:12']],
[{'I:0': True, 'I:1': True},
{'I:1': False, 'B:3': True},
{'I:1': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': False, 'B:3': False}]],
[[False, True], [False, False], [True, False], [False, False], [False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:12'], ['OSF', 'B:3', 'B:12'], ['OSR', 'I:0', 'B:11'], ['OSR', 'B:3', 'B:12']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True},
{'I:0': False, 'I:1': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True}]],
[[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[True, False, True, False],
[False, False, False, False],
[False, False, True, False],
[False, False, False, False]]],
['control: scenario 5',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'B:3', 'B:12']],
[{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False], [False, False], [False, False], [False, False], [False, False]]]],
[['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: scenario 1',
[[['OSF', 'B:3', 'B:11'], ['OSR', 'B:3', 'B:10']],
[{'I:0': False, 'B:3': True},
{'I:0': True, 'I:1': True},
{'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False}]],
[[False, False], [True, False], [False, False], [False, False], [False, False], [False, False]]],
['regression: scenario 2',
[[['OSR', 'I:1', 'B:11'], ['OSR', 'I:0', 'B:11']],
[{'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False},
{'I:0': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False],
[False, False],
[False, True],
[False, False],
[False, False],
[False, False],
[False, True],
[False, False]]],
['regression: scenario 3',
[[['OSR', 'I:0', 'B:11'], ['OSF', 'I:0', 'B:12'], ['OSR', 'I:1', 'B:13'], ['OSR', 'I:0', 'B:12']],
[{'I:0': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:1': True},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True}]],
[[False, False, False, False],
[False, False, True, False],
[False, True, False, False],
[False, False, True, False],
[True, False, False, False],
[False, True, True, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:12'], ['OSR', 'B:3', 'B:12'], ['OSR', 'I:0', 'B:10']],
[{'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': False},
{'I:0': False, 'I:1': True},
{'I:0': True, 'I:1': True, 'B:3': False}]],
[[True, False, False],
[False, False, True],
[False, False, False],
[False, False, False],
[False, False, True]]],
['regression: scenario 5',
[[['OSF', 'B:3', 'B:13'], ['OSF', 'I:1', 'B:13']],
[{'I:0': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:1': False, 'B:3': True},
{'I:1': False, 'B:3': True}]],
[[False, False],
[False, False],
[False, True],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, True],
[False, True]]]],
[['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: scenario 2',
[[['OSF', 'I:1', 'B:11'], ['OSF', 'B:3', 'B:10'], ['OSF', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:10']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': True},
{'I:0': False, 'B:3': True},
{'I:1': False}]],
[[False, False, False, False],
[False, False, False, False],
[False, False, True, False],
[False, False, False, False],
[True, False, True, False],
[False, False, False, False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: scenario 1',
[[['OSF', 'B:3', 'B:12'], ['OSR', 'I:1', 'B:13'], ['OSR', 'I:1', 'B:12']],
[{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False},
{'I:0': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'B:3': True},
{'I:1': True, 'B:3': True},
{'I:1': True}]],
[[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, True, False],
[True, False, True]]],
['regression: scenario 3',
[[['OSR', 'I:0', 'B:13'], ['OSR', 'I:0', 'B:11'], ['OSF', 'B:3', 'B:10'], ['OSF', 'B:3', 'B:10']],
[{'I:1': True, 'B:3': False},
{'I:0': True, 'B:3': True},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': True},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False}]],
[[False, False, False, False],
[True, True, False, False],
[False, False, True, False],
[True, True, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[True, True, False, False],
[False, False, False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:11'], ['OSF', 'I:0', 'B:13'], ['OSR', 'I:1', 'B:12']],
[{'I:0': False, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'B:3': True},
{'I:1': True},
{'I:0': True, 'I:1': True, 'B:3': False}]],
[[False, False, False],
[False, False, True],
[False, True, False],
[True, False, True],
[False, False, False]]],
['regression: scenario 5',
[[['OSR', 'I:1', 'B:13'], ['OSF', 'I:1', 'B:12'], ['OSF', 'I:1', 'B:12']],
[{'I:0': True, 'I:1': True, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, True, False],
[True, False, False]]]],
[['regression: scenario 1',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:0', 'B:13'], ['OSR', 'I:1', 'B:10']],
[{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True},
{'I:1': False},
{'I:0': False, 'I:1': False}]],
[[False, False, False],
[True, True, False],
[False, False, False],
[False, False, True],
[False, True, False],
[True, False, False],
[False, False, False],
[False, False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:13'], ['OSF', 'I:0', 'B:11'], ['OSR', 'I:1', 'B:13'], ['OSR', 'I:0', 'B:10']],
[{'I:0': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:0': False}]],
[[True, False, False, False],
[False, False, True, True],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: scenario 2',
[[['OSR', 'I:1', 'B:11'], ['OSR', 'I:1', 'B:12'], ['OSR', 'I:0', 'B:13'], ['OSR', 'I:1', 'B:10']],
[{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True}]],
[[False, False, False, False],
[False, False, True, False],
[False, False, False, False],
[False, False, False, False],
[False, False, True, False]]],
['regression: scenario 3',
[[['OSF', 'I:1', 'B:10'], ['OSR', 'I:1', 'B:10'], ['OSF', 'B:3', 'B:11'], ['OSR', 'I:0', 'B:11']],
[{'I:0': True, 'B:3': False},
{'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False},
{'I:0': False, 'B:3': False},
{'I:1': True, 'B:3': False},
{'I:0': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'B:3': False}]],
[[True, False, True, True],
[False, False, True, False],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[True, False, False, False],
[False, False, False, True],
[True, False, True, False]]],
['regression: scenario 5',
[[['OSR', 'I:0', 'B:11'], ['OSF', 'I:1', 'B:12'], ['OSR', 'I:0', 'B:10'], ['OSR', 'I:0', 'B:13']],
[{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:1': False, 'B:3': False},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False}]],
[[False, False, False, False],
[False, True, False, False],
[True, False, True, True],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False],
[True, False, True, True],
[False, False, False, False],
[True, True, True, True]]]],
[['regression: scenario 2',
[[['OSF', 'I:0', 'B:13'], ['OSF', 'B:3', 'B:10'], ['OSF', 'B:3', 'B:10'], ['OSF', 'B:3', 'B:10']],
[{'I:0': True, 'I:1': False},
{'B:3': False},
{'I:1': False},
{'B:3': True},
{'I:0': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:1': False, 'B:3': False},
{'I:0': False, 'B:3': True}]],
[[False, False, False, False],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False],
[False, False, False, False],
[False, True, False, False],
[True, False, False, False],
[False, True, False, False],
[False, False, False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:11'], ['OSF', 'I:0', 'B:12'], ['OSF', 'I:0', 'B:13']],
[{'I:1': True},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': True}]],
[[False, False, False],
[False, False, False],
[True, False, False],
[False, True, True],
[False, False, False],
[False, False, False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: scenario 1',
[[['OSF', 'I:1', 'B:12'], ['OSR', 'B:3', 'B:11'], ['OSR', 'I:0', 'B:13'], ['OSR', 'I:0', 'B:11']],
[{'I:0': True, 'I:1': True, 'B:3': True},
{'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'B:3': True}]],
[[False, False, False, False],
[True, False, False, False],
[False, False, True, True],
[True, False, False, False],
[False, True, False, False]]],
['regression: scenario 3',
[[['OSR', 'I:1', 'B:11'], ['OSF', 'I:1', 'B:12']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True}]],
[[False, False],
[True, False],
[False, False],
[False, False],
[False, True],
[False, False],
[True, False],
[False, False],
[False, True]]],
['regression: scenario 5',
[[['OSR', 'B:3', 'B:12'], ['OSF', 'B:3', 'B:12']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'B:3': True},
{'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': False}]],
[[False, False], [False, False], [True, False], [False, False], [False, False], [False, False]]]]]
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: input on at power-up | [[False, False], [False, False], [False, False], [True, False], [False, False]] | [[False, False], [False, False], [False, False], [True, False], [False, True]] | Failed |
| regression: falling edge train | [[False], [False], [False], [False], [False], [False]] | [[False], [True], [False], [False], [True], [False]] | Failed |
| regression: shared storage | [[False, False], [False, True], [False, True], [False, False]] | [[False, False], [False, True], [False, True], [False, False]] | Passed |
| regression: scenario 1 | [[False, False, False], [True, False, False], [False, False, False], [False, False, False], [True, False, False], [False, False, False], [False, False, False], [True, False, False]] | [[False, False, False], [True, False, False], [False, False, False], [False, False, False], [True, False, False], [False, False, False], [False, False, True], [True, False, False]] | Failed |
| regression: scenario 2 | [[False, False], [False, False], [False, False], [False, False], [False, False], [False, False]] | [[False, False], [False, False], [False, False], [False, True], [True, False], [False, False]] | Failed |
| regression: scenario 3 | [[False, False], [False, False], [False, False], [False, False], [False, False]] | [[False, True], [False, False], [True, False], [False, False], [False, False]] | Failed |
| regression: scenario 4 | [[True, True, False, False], [False, False, False, False], [False, False, False, True], [True, True, True, False], [False, False, False, False], [False, False, True, False], [False, False, False, True]] | [[True, False, False, False], [False, False, False, False], [False, False, False, False], [True, False, True, False], [False, False, False, False], [False, False, True, False], [False, False, False, False]] | Failed |
| control: scenario 5 | [[False, False], [False, False], [False, False], [False, False], [False, False]] | [[False, False], [False, False], [False, False], [False, False], [False, False]] | Passed |
SHA-256 / a3ae98fd91383e6b731ca140c6f19820fa6be5c59b87f70d129991c78d9d8c92
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(instrs, scans):
store = {}
for kind, tag, st in instrs:
store[st] = kind != 'OSF'
out = []
for inputs in scans:
pulses = []
for kind, tag, st in instrs:
cur = bool(inputs.get(tag, False))
if kind == 'OSF':
pulse = store[st] and not cur
else:
pulse = cur and not store[st]
store[st] = cur
pulses.append(pulse)
out.append(pulses)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: scenario 1',
[[['OSR', 'I:1', 'B:10'], ['OSR', 'I:1', 'B:10'], ['OSF', 'B:3', 'B:12']],
[{'B:3': False},
{'I:0': False, 'I:1': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, True],
[True, False, False]]],
['regression: scenario 2',
[[['OSF', 'I:1', 'B:13'], ['OSF', 'B:3', 'B:10']],
[{'I:0': True, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False], [False, False], [False, False], [False, True], [True, False], [False, False]]],
['regression: scenario 3',
[[['OSF', 'I:0', 'B:12'], ['OSF', 'B:3', 'B:12']],
[{'I:0': True, 'I:1': True},
{'I:1': False, 'B:3': True},
{'I:1': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': False, 'B:3': False}]],
[[False, True], [False, False], [True, False], [False, False], [False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:12'], ['OSF', 'B:3', 'B:12'], ['OSR', 'I:0', 'B:11'], ['OSR', 'B:3', 'B:12']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True},
{'I:0': False, 'I:1': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True}]],
[[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[True, False, True, False],
[False, False, False, False],
[False, False, True, False],
[False, False, False, False]]],
['control: scenario 5',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'B:3', 'B:12']],
[{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False], [False, False], [False, False], [False, False], [False, False]]]],
[['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: scenario 1',
[[['OSF', 'B:3', 'B:11'], ['OSR', 'B:3', 'B:10']],
[{'I:0': False, 'B:3': True},
{'I:0': True, 'I:1': True},
{'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False}]],
[[False, False], [True, False], [False, False], [False, False], [False, False], [False, False]]],
['regression: scenario 2',
[[['OSR', 'I:1', 'B:11'], ['OSR', 'I:0', 'B:11']],
[{'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False},
{'I:0': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False],
[False, False],
[False, True],
[False, False],
[False, False],
[False, False],
[False, True],
[False, False]]],
['regression: scenario 3',
[[['OSR', 'I:0', 'B:11'], ['OSF', 'I:0', 'B:12'], ['OSR', 'I:1', 'B:13'], ['OSR', 'I:0', 'B:12']],
[{'I:0': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:1': True},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True}]],
[[False, False, False, False],
[False, False, True, False],
[False, True, False, False],
[False, False, True, False],
[True, False, False, False],
[False, True, True, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:12'], ['OSR', 'B:3', 'B:12'], ['OSR', 'I:0', 'B:10']],
[{'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': False},
{'I:0': False, 'I:1': True},
{'I:0': True, 'I:1': True, 'B:3': False}]],
[[True, False, False],
[False, False, True],
[False, False, False],
[False, False, False],
[False, False, True]]],
['regression: scenario 5',
[[['OSF', 'B:3', 'B:13'], ['OSF', 'I:1', 'B:13']],
[{'I:0': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:1': False, 'B:3': True},
{'I:1': False, 'B:3': True}]],
[[False, False],
[False, False],
[False, True],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, True],
[False, True]]]],
[['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: scenario 2',
[[['OSF', 'I:1', 'B:11'], ['OSF', 'B:3', 'B:10'], ['OSF', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:10']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': True},
{'I:0': False, 'B:3': True},
{'I:1': False}]],
[[False, False, False, False],
[False, False, False, False],
[False, False, True, False],
[False, False, False, False],
[True, False, True, False],
[False, False, False, False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: scenario 1',
[[['OSF', 'B:3', 'B:12'], ['OSR', 'I:1', 'B:13'], ['OSR', 'I:1', 'B:12']],
[{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False},
{'I:0': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'B:3': True},
{'I:1': True, 'B:3': True},
{'I:1': True}]],
[[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, True, False],
[True, False, True]]],
['regression: scenario 3',
[[['OSR', 'I:0', 'B:13'], ['OSR', 'I:0', 'B:11'], ['OSF', 'B:3', 'B:10'], ['OSF', 'B:3', 'B:10']],
[{'I:1': True, 'B:3': False},
{'I:0': True, 'B:3': True},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': True},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False}]],
[[False, False, False, False],
[True, True, False, False],
[False, False, True, False],
[True, True, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[True, True, False, False],
[False, False, False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:11'], ['OSF', 'I:0', 'B:13'], ['OSR', 'I:1', 'B:12']],
[{'I:0': False, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'B:3': True},
{'I:1': True},
{'I:0': True, 'I:1': True, 'B:3': False}]],
[[False, False, False],
[False, False, True],
[False, True, False],
[True, False, True],
[False, False, False]]],
['regression: scenario 5',
[[['OSR', 'I:1', 'B:13'], ['OSF', 'I:1', 'B:12'], ['OSF', 'I:1', 'B:12']],
[{'I:0': True, 'I:1': True, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True}]],
[[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, True, False],
[True, False, False]]]],
[['regression: scenario 1',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:0', 'B:13'], ['OSR', 'I:1', 'B:10']],
[{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True},
{'I:1': False},
{'I:0': False, 'I:1': False}]],
[[False, False, False],
[True, True, False],
[False, False, False],
[False, False, True],
[False, True, False],
[True, False, False],
[False, False, False],
[False, False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:13'], ['OSF', 'I:0', 'B:11'], ['OSR', 'I:1', 'B:13'], ['OSR', 'I:0', 'B:10']],
[{'I:0': False},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:0': False}]],
[[True, False, False, False],
[False, False, True, True],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: scenario 2',
[[['OSR', 'I:1', 'B:11'], ['OSR', 'I:1', 'B:12'], ['OSR', 'I:0', 'B:13'], ['OSR', 'I:1', 'B:10']],
[{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True}]],
[[False, False, False, False],
[False, False, True, False],
[False, False, False, False],
[False, False, False, False],
[False, False, True, False]]],
['regression: scenario 3',
[[['OSF', 'I:1', 'B:10'], ['OSR', 'I:1', 'B:10'], ['OSF', 'B:3', 'B:11'], ['OSR', 'I:0', 'B:11']],
[{'I:0': True, 'B:3': False},
{'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False},
{'I:0': False, 'B:3': False},
{'I:1': True, 'B:3': False},
{'I:0': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'B:3': False}]],
[[True, False, True, True],
[False, False, True, False],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[True, False, False, False],
[False, False, False, True],
[True, False, True, False]]],
['regression: scenario 5',
[[['OSR', 'I:0', 'B:11'], ['OSF', 'I:1', 'B:12'], ['OSR', 'I:0', 'B:10'], ['OSR', 'I:0', 'B:13']],
[{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': False, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:1': False, 'B:3': False},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': False}]],
[[False, False, False, False],
[False, True, False, False],
[True, False, True, True],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False],
[True, False, True, True],
[False, False, False, False],
[True, True, True, True]]]],
[['regression: scenario 2',
[[['OSF', 'I:0', 'B:13'], ['OSF', 'B:3', 'B:10'], ['OSF', 'B:3', 'B:10'], ['OSF', 'B:3', 'B:10']],
[{'I:0': True, 'I:1': False},
{'B:3': False},
{'I:1': False},
{'B:3': True},
{'I:0': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'B:3': False},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:1': False, 'B:3': False},
{'I:0': False, 'B:3': True}]],
[[False, False, False, False],
[True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False],
[False, False, False, False],
[False, True, False, False],
[True, False, False, False],
[False, True, False, False],
[False, False, False, False]]],
['regression: scenario 4',
[[['OSF', 'B:3', 'B:11'], ['OSF', 'I:0', 'B:12'], ['OSF', 'I:0', 'B:13']],
[{'I:1': True},
{'I:0': False, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': False},
{'I:1': False, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': True}]],
[[False, False, False],
[False, False, False],
[True, False, False],
[False, True, True],
[False, False, False],
[False, False, False]]],
['regression: input on at power-up',
[[['OSR', 'I:0', 'B:10'], ['OSF', 'I:1', 'B:11']],
[{'I:0': True}, {'I:0': True}, {'I:0': False}, {'I:0': True, 'I:1': True}, {}]],
[[False, False], [False, False], [False, False], [True, False], [False, True]]],
['regression: shared storage',
[[['OSR', 'I:0', 'B:10'], ['OSR', 'I:1', 'B:10']],
[{'I:0': True}, {'I:0': False, 'I:1': True}, {'I:1': True}, {}]],
[[False, False], [False, True], [False, True], [False, False]]],
['regression: falling edge train',
[[['OSF', 'I:0', 'B:12']],
[{'I:0': True}, {'I:0': False}, {'I:0': False}, {'I:0': True}, {'I:0': False}, {}]],
[[False], [True], [False], [False], [True], [False]]],
['regression: scenario 1',
[[['OSF', 'I:1', 'B:12'], ['OSR', 'B:3', 'B:11'], ['OSR', 'I:0', 'B:13'], ['OSR', 'I:0', 'B:11']],
[{'I:0': True, 'I:1': True, 'B:3': True},
{'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': True, 'B:3': False},
{'I:0': False, 'I:1': False, 'B:3': False},
{'B:3': True}]],
[[False, False, False, False],
[True, False, False, False],
[False, False, True, True],
[True, False, False, False],
[False, True, False, False]]],
['regression: scenario 3',
[[['OSR', 'I:1', 'B:11'], ['OSF', 'I:1', 'B:12']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': True, 'B:3': False},
{'I:0': True, 'I:1': True, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'I:1': True},
{'I:0': False, 'I:1': True, 'B:3': True},
{'I:0': True}]],
[[False, False],
[True, False],
[False, False],
[False, False],
[False, True],
[False, False],
[True, False],
[False, False],
[False, True]]],
['regression: scenario 5',
[[['OSR', 'B:3', 'B:12'], ['OSF', 'B:3', 'B:12']],
[{'I:0': False, 'I:1': False, 'B:3': False},
{'I:0': False, 'B:3': False},
{'I:0': True, 'I:1': False, 'B:3': True},
{'I:0': False, 'B:3': True},
{'I:1': True, 'B:3': True},
{'I:0': False, 'I:1': False}]],
[[False, False], [False, False], [True, False], [False, False], [False, False], [False, False]]]]]
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: input on at power-up | [[False, False], [False, False], [False, False], [True, False], [False, True]] | [[False, False], [False, False], [False, False], [True, False], [False, True]] | Passed |
| regression: falling edge train | [[False], [True], [False], [False], [True], [False]] | [[False], [True], [False], [False], [True], [False]] | Passed |
| regression: shared storage | [[False, False], [False, True], [False, True], [False, False]] | [[False, False], [False, True], [False, True], [False, False]] | Passed |
| regression: scenario 1 | [[False, False, False], [True, False, False], [False, False, False], [False, False, False], [True, False, False], [False, False, False], [False, False, True], [True, False, False]] | [[False, False, False], [True, False, False], [False, False, False], [False, False, False], [True, False, False], [False, False, False], [False, False, True], [True, False, False]] | Passed |
| regression: scenario 2 | [[False, False], [False, False], [False, False], [False, True], [True, False], [False, False]] | [[False, False], [False, False], [False, False], [False, True], [True, False], [False, False]] | Passed |
| regression: scenario 3 | [[False, True], [False, False], [True, False], [False, False], [False, False]] | [[False, True], [False, False], [True, False], [False, False], [False, False]] | Passed |
| regression: scenario 4 | [[True, False, False, False], [False, False, False, False], [False, False, False, False], [True, False, True, False], [False, False, False, False], [False, False, True, False], [False, False, False, False]] | [[True, False, False, False], [False, False, False, False], [False, False, False, False], [True, False, True, False], [False, False, False, False], [False, False, True, False], [False, False, False, False]] | Passed |
| control: scenario 5 | [[False, False], [False, False], [False, False], [False, False], [False, False]] | [[False, False], [False, False], [False, False], [False, False], [False, False]] | Passed |
SHA-256 / b1ccedf6a2e8675d1384c138e69d4e4f94ea2b759c94dacbfb317b78f53f5873
Verification & scope
A deterministic bounded teaching model of one PLC instruction or rung pattern evaluated scan by scan. The stated contract is a stipulated toy convention, not a claim of conformance to any vendor controller or IEC 61131-3 runtime. 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:51:41.377758+00:00.
Case digest / 5c92dba039416cfb8982f038ec7b0c9f1921661c30b233b912399affce40bc95