FA-94661 / Exam timetabling constraints / Open access
Repeated assignment row charges the room penalty again · case 01
Duplicate rows from a timetable merge inflate the room cost.
ROOT CAUSE
The room penalty is charged per row.
VERIFIED REPAIR
Charge the room penalty once per distinct exam and room.
Unsuccessful approach: Recording the pair but charging outside the guard still charges every row.
Case contract
Assignment rows [exam, room, period] (a split exam has one row per room; rows may repeat). Each exam pays its period penalty once per distinct period it occupies and each room penalty once per distinct (exam, room). Return [period penalty, room penalty, total].
Why this case matters
Period and room preferences are soft costs that must not be multiplied by exam splitting.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(assign, ppen, rpen):
seen_exam = set()
seen_room = set()
pp = rp = 0
for ex, r, p in assign:
if (ex, p) not in seen_exam:
seen_exam.add((ex, p))
pp += ppen[p]
rp += rpen[r]
return [pp, rp, pp + rp]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: repeated row room charge 1',
[[['A', 'R2', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('regression variant: repeated row room charge 2',
[[['CHEM120', 'R1', 3], ['CHEM120', 'R2', 3], ['MATH101', 'R3', 2], ['MATH101H', 'R2', 1],
['MATH101', 'R2', 1], ['MATH101', 'R2', 2]],
[10, 5, 5, 1], {'R1': 0, 'R2': 3, 'R3': 7}],
[16, 16, 32]),
('partial repair guard 3',
[[['PHYS110', 'R2', 0], ['MATH101H', 'R2', 1], ['MATH101', 'R2', 1], ['MATH101', 'R2', 3],
['PHYS110', 'R2', 1], ['MATH101H', 'R1', 3], ['MATH101H', 'R3', 2]],
[10, 1, 5, 10], {'R1': 0, 'R2': 3, 'R3': 2}],
[38, 11, 49]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['MATH101H', 'R1', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R3', 3], ['PHYS110', 'R2', 1]], [0, 1, 5, 1],
{'R1': 0, 'R2': 3, 'R3': 7}],
[3, 10, 13]),
('normal control 7',
[[['CHEM120', 'R3', 1], ['PHYS110', 'R1', 3], ['CHEM120', 'R1', 2], ['CHEM120', 'R3', 2],
['MATH101H', 'R3', 3]],
[1, 5, 0, 10], {'R1': 0, 'R2': 3, 'R3': 7}],
[25, 14, 39]),
('normal control 8',
[[['MATH101', 'R3', 2], ['MATH101H', 'R1', 2], ['CHEM120', 'R1', 3], ['PHYS110', 'R2', 2],
['PHYS110', 'R1', 3], ['PHYS110', 'R2', 2], ['CHEM120', 'R3', 2]],
[0, 1, 10, 0], {'R1': 0, 'R2': 1, 'R3': 2}],
[40, 5, 45])],
[('regression: repeated row room charge 1',
[[['CHEM120', 'R2', 0], ['MATH101H', 'R1', 3], ['PHYS110', 'R2', 3], ['PHYS110', 'R2', 3],
['PHYS110', 'R2', 3]],
[1, 1, 0, 1], {'R1': 0, 'R2': 1, 'R3': 2}],
[3, 2, 5]),
('regression variant: repeated row room charge 2',
[[['MATH101', 'R2', 1], ['MATH101', 'R1', 0], ['CHEM120', 'R2', 3], ['MATH101H', 'R2', 0],
['MATH101', 'R2', 0]],
[0, 1, 10, 5], {'R1': 0, 'R2': 1, 'R3': 7}],
[6, 3, 9]),
('partial repair guard 3',
[[['PHYS110', 'R3', 3], ['MATH101H', 'R1', 0], ['MATH101H', 'R3', 0], ['PHYS110', 'R3', 3]], [1, 1, 10, 0],
{'R1': 0, 'R2': 3, 'R3': 7}],
[1, 14, 15]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['PHYS110', 'R1', 0], ['MATH101H', 'R1', 0]], [0, 5, 0, 10], {'R1': 0, 'R2': 3, 'R3': 2}], [0, 0, 0]),
('normal control 7',
[[['MATH101H', 'R1', 3], ['PHYS110', 'R2', 0], ['MATH101H', 'R3', 3], ['CHEM120', 'R1', 0],
['CHEM120', 'R3', 0], ['MATH101', 'R3', 0], ['MATH101', 'R3', 0]],
[10, 1, 10, 5], {'R1': 0, 'R2': 3, 'R3': 7}],
[35, 24, 59]),
('normal control 8',
[[['MATH101H', 'R2', 3], ['CHEM120', 'R3', 3], ['CHEM120', 'R1', 3], ['CHEM120', 'R2', 2]], [5, 5, 1, 0],
{'R1': 0, 'R2': 3, 'R3': 2}],
[1, 8, 9])],
[('regression: repeated row room charge 1',
[[['PHYS110', 'R3', 3], ['PHYS110', 'R3', 1], ['CHEM120', 'R2', 0]], [0, 0, 5, 0],
{'R1': 0, 'R2': 3, 'R3': 7}],
[0, 10, 10]),
('regression variant: repeated row room charge 2',
[[['MATH101', 'R2', 1], ['PHYS110', 'R3', 1], ['MATH101H', 'R1', 2], ['PHYS110', 'R3', 3]], [1, 5, 10, 0],
{'R1': 0, 'R2': 1, 'R3': 7}],
[20, 8, 28]),
('partial repair guard 3',
[[['MATH101', 'R1', 0], ['MATH101', 'R2', 3], ['MATH101', 'R3', 1], ['MATH101H', 'R1', 3],
['PHYS110', 'R1', 0], ['MATH101', 'R1', 0], ['MATH101', 'R3', 1]],
[1, 0, 5, 10], {'R1': 0, 'R2': 3, 'R3': 2}],
[22, 5, 27]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['CHEM120', 'R2', 0], ['MATH101H', 'R3', 2], ['CHEM120', 'R1', 3]], [0, 1, 1, 10],
{'R1': 0, 'R2': 3, 'R3': 7}],
[11, 10, 21]),
('normal control 7',
[[['MATH101', 'R1', 3], ['MATH101H', 'R1', 0], ['MATH101H', 'R1', 0]], [0, 0, 1, 5],
{'R1': 0, 'R2': 1, 'R3': 2}],
[5, 0, 5]),
('normal control 8',
[[['CHEM120', 'R1', 2], ['MATH101H', 'R3', 2], ['CHEM120', 'R1', 2]], [1, 10, 10, 5],
{'R1': 0, 'R2': 3, 'R3': 7}],
[20, 7, 27])],
[('regression: repeated row room charge 1',
[[['PHYS110', 'R3', 2], ['CHEM120', 'R1', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R3', 3],
['CHEM120', 'R1', 3], ['CHEM120', 'R3', 3]],
[0, 0, 5, 1], {'R1': 0, 'R2': 3, 'R3': 2}],
[16, 4, 20]),
('regression variant: repeated row room charge 2',
[[['CHEM120', 'R3', 3], ['MATH101', 'R2', 0], ['PHYS110', 'R2', 1], ['CHEM120', 'R2', 3],
['PHYS110', 'R3', 0], ['CHEM120', 'R2', 3], ['MATH101H', 'R1', 3]],
[1, 10, 10, 5], {'R1': 0, 'R2': 3, 'R3': 2}],
[22, 13, 35]),
('partial repair guard 3',
[[['CHEM120', 'R1', 0], ['MATH101H', 'R1', 3], ['MATH101', 'R1', 1], ['CHEM120', 'R2', 2],
['MATH101', 'R2', 3], ['CHEM120', 'R1', 0], ['CHEM120', 'R2', 2]],
[0, 0, 10, 5], {'R1': 0, 'R2': 3, 'R3': 7}],
[20, 6, 26]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['MATH101H', 'R1', 2], ['CHEM120', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101', 'R1', 3],
['MATH101H', 'R1', 1]],
[1, 0, 10, 10], {'R1': 0, 'R2': 1, 'R3': 7}],
[21, 0, 21]),
('normal control 7',
[[['MATH101H', 'R3', 1], ['MATH101H', 'R1', 1]], [0, 5, 5, 5], {'R1': 0, 'R2': 3, 'R3': 2}], [5, 2, 7]),
('normal control 8',
[[['CHEM120', 'R3', 3], ['MATH101H', 'R3', 0], ['MATH101H', 'R3', 0], ['MATH101', 'R2', 3],
['MATH101', 'R3', 2]],
[0, 0, 0, 0], {'R1': 0, 'R2': 1, 'R3': 7}],
[0, 22, 22])],
[('regression: repeated row room charge 1',
[[['MATH101', 'R2', 1], ['MATH101', 'R3', 1], ['MATH101H', 'R2', 2], ['CHEM120', 'R2', 3],
['MATH101H', 'R2', 1], ['MATH101', 'R2', 3]],
[5, 10, 0, 10], {'R1': 0, 'R2': 3, 'R3': 7}],
[40, 16, 56]),
('regression variant: repeated row room charge 2',
[[['MATH101H', 'R1', 3], ['MATH101H', 'R3', 2], ['MATH101', 'R3', 0], ['MATH101H', 'R1', 3],
['MATH101H', 'R3', 0], ['PHYS110', 'R2', 3]],
[5, 0, 10, 0], {'R1': 0, 'R2': 3, 'R3': 2}],
[20, 7, 27]),
('partial repair guard 3',
[[['MATH101', 'R2', 1], ['CHEM120', 'R2', 0], ['MATH101', 'R2', 1]], [10, 0, 5, 5],
{'R1': 0, 'R2': 3, 'R3': 7}],
[10, 6, 16]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['CHEM120', 'R2', 2], ['PHYS110', 'R1', 1], ['CHEM120', 'R1', 0], ['MATH101H', 'R2', 1],
['MATH101', 'R2', 2], ['CHEM120', 'R3', 0], ['CHEM120', 'R3', 3], ['CHEM120', 'R2', 2]],
[1, 1, 10, 5], {'R1': 0, 'R2': 1, 'R3': 7}],
[28, 10, 38]),
('normal control 7',
[[['CHEM120', 'R3', 3], ['MATH101H', 'R3', 0], ['MATH101H', 'R3', 0], ['MATH101', 'R2', 3],
['MATH101', 'R3', 2]],
[0, 0, 0, 0], {'R1': 0, 'R2': 1, 'R3': 7}],
[0, 22, 22]),
('normal control 8',
[[['PHYS110', 'R1', 2], ['CHEM120', 'R2', 1], ['MATH101H', 'R3', 2], ['MATH101', 'R3', 0],
['CHEM120', 'R2', 1], ['MATH101H', 'R3', 1]],
[10, 0, 10, 0], {'R1': 0, 'R2': 3, 'R3': 2}],
[30, 7, 37])]]
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: repeated row room charge 1 | [5, 6, 11] | [5, 3, 8] | Failed |
| regression variant: repeated row room charge 2 | [16, 19, 35] | [16, 16, 32] | Failed |
| partial repair guard 3 | [38, 17, 55] | [38, 11, 49] | Failed |
| boundary control 4 | [5, 3, 8] | [5, 3, 8] | Passed |
| boundary control 5 | [4, 6, 10] | [4, 6, 10] | Passed |
| normal control 6 | [3, 13, 16] | [3, 10, 13] | Failed |
| normal control 7 | [25, 21, 46] | [25, 14, 39] | Failed |
| normal control 8 | [40, 6, 46] | [40, 5, 45] | Failed |
SHA-256 / 91fc41a9768021ef08b895790c761bce64197f14d85a6a5334b5d862403e4b07
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(assign, ppen, rpen):
seen_exam = set()
seen_room = set()
pp = rp = 0
for ex, r, p in assign:
if (ex, p) not in seen_exam:
seen_exam.add((ex, p))
pp += ppen[p]
if (ex, r) not in seen_room:
seen_room.add((ex, r))
rp += rpen[r]
return [pp, rp, pp + rp]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: repeated row room charge 1',
[[['A', 'R2', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('regression variant: repeated row room charge 2',
[[['CHEM120', 'R1', 3], ['CHEM120', 'R2', 3], ['MATH101', 'R3', 2], ['MATH101H', 'R2', 1],
['MATH101', 'R2', 1], ['MATH101', 'R2', 2]],
[10, 5, 5, 1], {'R1': 0, 'R2': 3, 'R3': 7}],
[16, 16, 32]),
('partial repair guard 3',
[[['PHYS110', 'R2', 0], ['MATH101H', 'R2', 1], ['MATH101', 'R2', 1], ['MATH101', 'R2', 3],
['PHYS110', 'R2', 1], ['MATH101H', 'R1', 3], ['MATH101H', 'R3', 2]],
[10, 1, 5, 10], {'R1': 0, 'R2': 3, 'R3': 2}],
[38, 11, 49]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['MATH101H', 'R1', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R3', 3], ['PHYS110', 'R2', 1]], [0, 1, 5, 1],
{'R1': 0, 'R2': 3, 'R3': 7}],
[3, 10, 13]),
('normal control 7',
[[['CHEM120', 'R3', 1], ['PHYS110', 'R1', 3], ['CHEM120', 'R1', 2], ['CHEM120', 'R3', 2],
['MATH101H', 'R3', 3]],
[1, 5, 0, 10], {'R1': 0, 'R2': 3, 'R3': 7}],
[25, 14, 39]),
('normal control 8',
[[['MATH101', 'R3', 2], ['MATH101H', 'R1', 2], ['CHEM120', 'R1', 3], ['PHYS110', 'R2', 2],
['PHYS110', 'R1', 3], ['PHYS110', 'R2', 2], ['CHEM120', 'R3', 2]],
[0, 1, 10, 0], {'R1': 0, 'R2': 1, 'R3': 2}],
[40, 5, 45])],
[('regression: repeated row room charge 1',
[[['CHEM120', 'R2', 0], ['MATH101H', 'R1', 3], ['PHYS110', 'R2', 3], ['PHYS110', 'R2', 3],
['PHYS110', 'R2', 3]],
[1, 1, 0, 1], {'R1': 0, 'R2': 1, 'R3': 2}],
[3, 2, 5]),
('regression variant: repeated row room charge 2',
[[['MATH101', 'R2', 1], ['MATH101', 'R1', 0], ['CHEM120', 'R2', 3], ['MATH101H', 'R2', 0],
['MATH101', 'R2', 0]],
[0, 1, 10, 5], {'R1': 0, 'R2': 1, 'R3': 7}],
[6, 3, 9]),
('partial repair guard 3',
[[['PHYS110', 'R3', 3], ['MATH101H', 'R1', 0], ['MATH101H', 'R3', 0], ['PHYS110', 'R3', 3]], [1, 1, 10, 0],
{'R1': 0, 'R2': 3, 'R3': 7}],
[1, 14, 15]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['PHYS110', 'R1', 0], ['MATH101H', 'R1', 0]], [0, 5, 0, 10], {'R1': 0, 'R2': 3, 'R3': 2}], [0, 0, 0]),
('normal control 7',
[[['MATH101H', 'R1', 3], ['PHYS110', 'R2', 0], ['MATH101H', 'R3', 3], ['CHEM120', 'R1', 0],
['CHEM120', 'R3', 0], ['MATH101', 'R3', 0], ['MATH101', 'R3', 0]],
[10, 1, 10, 5], {'R1': 0, 'R2': 3, 'R3': 7}],
[35, 24, 59]),
('normal control 8',
[[['MATH101H', 'R2', 3], ['CHEM120', 'R3', 3], ['CHEM120', 'R1', 3], ['CHEM120', 'R2', 2]], [5, 5, 1, 0],
{'R1': 0, 'R2': 3, 'R3': 2}],
[1, 8, 9])],
[('regression: repeated row room charge 1',
[[['PHYS110', 'R3', 3], ['PHYS110', 'R3', 1], ['CHEM120', 'R2', 0]], [0, 0, 5, 0],
{'R1': 0, 'R2': 3, 'R3': 7}],
[0, 10, 10]),
('regression variant: repeated row room charge 2',
[[['MATH101', 'R2', 1], ['PHYS110', 'R3', 1], ['MATH101H', 'R1', 2], ['PHYS110', 'R3', 3]], [1, 5, 10, 0],
{'R1': 0, 'R2': 1, 'R3': 7}],
[20, 8, 28]),
('partial repair guard 3',
[[['MATH101', 'R1', 0], ['MATH101', 'R2', 3], ['MATH101', 'R3', 1], ['MATH101H', 'R1', 3],
['PHYS110', 'R1', 0], ['MATH101', 'R1', 0], ['MATH101', 'R3', 1]],
[1, 0, 5, 10], {'R1': 0, 'R2': 3, 'R3': 2}],
[22, 5, 27]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['CHEM120', 'R2', 0], ['MATH101H', 'R3', 2], ['CHEM120', 'R1', 3]], [0, 1, 1, 10],
{'R1': 0, 'R2': 3, 'R3': 7}],
[11, 10, 21]),
('normal control 7',
[[['MATH101', 'R1', 3], ['MATH101H', 'R1', 0], ['MATH101H', 'R1', 0]], [0, 0, 1, 5],
{'R1': 0, 'R2': 1, 'R3': 2}],
[5, 0, 5]),
('normal control 8',
[[['CHEM120', 'R1', 2], ['MATH101H', 'R3', 2], ['CHEM120', 'R1', 2]], [1, 10, 10, 5],
{'R1': 0, 'R2': 3, 'R3': 7}],
[20, 7, 27])],
[('regression: repeated row room charge 1',
[[['PHYS110', 'R3', 2], ['CHEM120', 'R1', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R3', 3],
['CHEM120', 'R1', 3], ['CHEM120', 'R3', 3]],
[0, 0, 5, 1], {'R1': 0, 'R2': 3, 'R3': 2}],
[16, 4, 20]),
('regression variant: repeated row room charge 2',
[[['CHEM120', 'R3', 3], ['MATH101', 'R2', 0], ['PHYS110', 'R2', 1], ['CHEM120', 'R2', 3],
['PHYS110', 'R3', 0], ['CHEM120', 'R2', 3], ['MATH101H', 'R1', 3]],
[1, 10, 10, 5], {'R1': 0, 'R2': 3, 'R3': 2}],
[22, 13, 35]),
('partial repair guard 3',
[[['CHEM120', 'R1', 0], ['MATH101H', 'R1', 3], ['MATH101', 'R1', 1], ['CHEM120', 'R2', 2],
['MATH101', 'R2', 3], ['CHEM120', 'R1', 0], ['CHEM120', 'R2', 2]],
[0, 0, 10, 5], {'R1': 0, 'R2': 3, 'R3': 7}],
[20, 6, 26]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['MATH101H', 'R1', 2], ['CHEM120', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101', 'R1', 3],
['MATH101H', 'R1', 1]],
[1, 0, 10, 10], {'R1': 0, 'R2': 1, 'R3': 7}],
[21, 0, 21]),
('normal control 7',
[[['MATH101H', 'R3', 1], ['MATH101H', 'R1', 1]], [0, 5, 5, 5], {'R1': 0, 'R2': 3, 'R3': 2}], [5, 2, 7]),
('normal control 8',
[[['CHEM120', 'R3', 3], ['MATH101H', 'R3', 0], ['MATH101H', 'R3', 0], ['MATH101', 'R2', 3],
['MATH101', 'R3', 2]],
[0, 0, 0, 0], {'R1': 0, 'R2': 1, 'R3': 7}],
[0, 22, 22])],
[('regression: repeated row room charge 1',
[[['MATH101', 'R2', 1], ['MATH101', 'R3', 1], ['MATH101H', 'R2', 2], ['CHEM120', 'R2', 3],
['MATH101H', 'R2', 1], ['MATH101', 'R2', 3]],
[5, 10, 0, 10], {'R1': 0, 'R2': 3, 'R3': 7}],
[40, 16, 56]),
('regression variant: repeated row room charge 2',
[[['MATH101H', 'R1', 3], ['MATH101H', 'R3', 2], ['MATH101', 'R3', 0], ['MATH101H', 'R1', 3],
['MATH101H', 'R3', 0], ['PHYS110', 'R2', 3]],
[5, 0, 10, 0], {'R1': 0, 'R2': 3, 'R3': 2}],
[20, 7, 27]),
('partial repair guard 3',
[[['MATH101', 'R2', 1], ['CHEM120', 'R2', 0], ['MATH101', 'R2', 1]], [10, 0, 5, 5],
{'R1': 0, 'R2': 3, 'R3': 7}],
[10, 6, 16]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['CHEM120', 'R2', 2], ['PHYS110', 'R1', 1], ['CHEM120', 'R1', 0], ['MATH101H', 'R2', 1],
['MATH101', 'R2', 2], ['CHEM120', 'R3', 0], ['CHEM120', 'R3', 3], ['CHEM120', 'R2', 2]],
[1, 1, 10, 5], {'R1': 0, 'R2': 1, 'R3': 7}],
[28, 10, 38]),
('normal control 7',
[[['CHEM120', 'R3', 3], ['MATH101H', 'R3', 0], ['MATH101H', 'R3', 0], ['MATH101', 'R2', 3],
['MATH101', 'R3', 2]],
[0, 0, 0, 0], {'R1': 0, 'R2': 1, 'R3': 7}],
[0, 22, 22]),
('normal control 8',
[[['PHYS110', 'R1', 2], ['CHEM120', 'R2', 1], ['MATH101H', 'R3', 2], ['MATH101', 'R3', 0],
['CHEM120', 'R2', 1], ['MATH101H', 'R3', 1]],
[10, 0, 10, 0], {'R1': 0, 'R2': 3, 'R3': 2}],
[30, 7, 37])]]
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: repeated row room charge 1 | [5, 6, 11] | [5, 3, 8] | Failed |
| regression variant: repeated row room charge 2 | [16, 19, 35] | [16, 16, 32] | Failed |
| partial repair guard 3 | [38, 17, 55] | [38, 11, 49] | Failed |
| boundary control 4 | [5, 3, 8] | [5, 3, 8] | Passed |
| boundary control 5 | [4, 6, 10] | [4, 6, 10] | Passed |
| normal control 6 | [3, 13, 16] | [3, 10, 13] | Failed |
| normal control 7 | [25, 21, 46] | [25, 14, 39] | Failed |
| normal control 8 | [40, 6, 46] | [40, 5, 45] | Failed |
SHA-256 / efbc033a09dd0a4592d7a9a41a8bdca465b1a26500ab0d4b1ba63039d3217bd9
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(assign, ppen, rpen):
seen_exam = set()
seen_room = set()
pp = rp = 0
for ex, r, p in assign:
if (ex, p) not in seen_exam:
seen_exam.add((ex, p))
pp += ppen[p]
if (ex, r) not in seen_room:
seen_room.add((ex, r))
rp += rpen[r]
return [pp, rp, pp + rp]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: repeated row room charge 1',
[[['A', 'R2', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('regression variant: repeated row room charge 2',
[[['CHEM120', 'R1', 3], ['CHEM120', 'R2', 3], ['MATH101', 'R3', 2], ['MATH101H', 'R2', 1],
['MATH101', 'R2', 1], ['MATH101', 'R2', 2]],
[10, 5, 5, 1], {'R1': 0, 'R2': 3, 'R3': 7}],
[16, 16, 32]),
('partial repair guard 3',
[[['PHYS110', 'R2', 0], ['MATH101H', 'R2', 1], ['MATH101', 'R2', 1], ['MATH101', 'R2', 3],
['PHYS110', 'R2', 1], ['MATH101H', 'R1', 3], ['MATH101H', 'R3', 2]],
[10, 1, 5, 10], {'R1': 0, 'R2': 3, 'R3': 2}],
[38, 11, 49]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['MATH101H', 'R1', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R3', 3], ['PHYS110', 'R2', 1]], [0, 1, 5, 1],
{'R1': 0, 'R2': 3, 'R3': 7}],
[3, 10, 13]),
('normal control 7',
[[['CHEM120', 'R3', 1], ['PHYS110', 'R1', 3], ['CHEM120', 'R1', 2], ['CHEM120', 'R3', 2],
['MATH101H', 'R3', 3]],
[1, 5, 0, 10], {'R1': 0, 'R2': 3, 'R3': 7}],
[25, 14, 39]),
('normal control 8',
[[['MATH101', 'R3', 2], ['MATH101H', 'R1', 2], ['CHEM120', 'R1', 3], ['PHYS110', 'R2', 2],
['PHYS110', 'R1', 3], ['PHYS110', 'R2', 2], ['CHEM120', 'R3', 2]],
[0, 1, 10, 0], {'R1': 0, 'R2': 1, 'R3': 2}],
[40, 5, 45])],
[('regression: repeated row room charge 1',
[[['CHEM120', 'R2', 0], ['MATH101H', 'R1', 3], ['PHYS110', 'R2', 3], ['PHYS110', 'R2', 3],
['PHYS110', 'R2', 3]],
[1, 1, 0, 1], {'R1': 0, 'R2': 1, 'R3': 2}],
[3, 2, 5]),
('regression variant: repeated row room charge 2',
[[['MATH101', 'R2', 1], ['MATH101', 'R1', 0], ['CHEM120', 'R2', 3], ['MATH101H', 'R2', 0],
['MATH101', 'R2', 0]],
[0, 1, 10, 5], {'R1': 0, 'R2': 1, 'R3': 7}],
[6, 3, 9]),
('partial repair guard 3',
[[['PHYS110', 'R3', 3], ['MATH101H', 'R1', 0], ['MATH101H', 'R3', 0], ['PHYS110', 'R3', 3]], [1, 1, 10, 0],
{'R1': 0, 'R2': 3, 'R3': 7}],
[1, 14, 15]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['PHYS110', 'R1', 0], ['MATH101H', 'R1', 0]], [0, 5, 0, 10], {'R1': 0, 'R2': 3, 'R3': 2}], [0, 0, 0]),
('normal control 7',
[[['MATH101H', 'R1', 3], ['PHYS110', 'R2', 0], ['MATH101H', 'R3', 3], ['CHEM120', 'R1', 0],
['CHEM120', 'R3', 0], ['MATH101', 'R3', 0], ['MATH101', 'R3', 0]],
[10, 1, 10, 5], {'R1': 0, 'R2': 3, 'R3': 7}],
[35, 24, 59]),
('normal control 8',
[[['MATH101H', 'R2', 3], ['CHEM120', 'R3', 3], ['CHEM120', 'R1', 3], ['CHEM120', 'R2', 2]], [5, 5, 1, 0],
{'R1': 0, 'R2': 3, 'R3': 2}],
[1, 8, 9])],
[('regression: repeated row room charge 1',
[[['PHYS110', 'R3', 3], ['PHYS110', 'R3', 1], ['CHEM120', 'R2', 0]], [0, 0, 5, 0],
{'R1': 0, 'R2': 3, 'R3': 7}],
[0, 10, 10]),
('regression variant: repeated row room charge 2',
[[['MATH101', 'R2', 1], ['PHYS110', 'R3', 1], ['MATH101H', 'R1', 2], ['PHYS110', 'R3', 3]], [1, 5, 10, 0],
{'R1': 0, 'R2': 1, 'R3': 7}],
[20, 8, 28]),
('partial repair guard 3',
[[['MATH101', 'R1', 0], ['MATH101', 'R2', 3], ['MATH101', 'R3', 1], ['MATH101H', 'R1', 3],
['PHYS110', 'R1', 0], ['MATH101', 'R1', 0], ['MATH101', 'R3', 1]],
[1, 0, 5, 10], {'R1': 0, 'R2': 3, 'R3': 2}],
[22, 5, 27]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['CHEM120', 'R2', 0], ['MATH101H', 'R3', 2], ['CHEM120', 'R1', 3]], [0, 1, 1, 10],
{'R1': 0, 'R2': 3, 'R3': 7}],
[11, 10, 21]),
('normal control 7',
[[['MATH101', 'R1', 3], ['MATH101H', 'R1', 0], ['MATH101H', 'R1', 0]], [0, 0, 1, 5],
{'R1': 0, 'R2': 1, 'R3': 2}],
[5, 0, 5]),
('normal control 8',
[[['CHEM120', 'R1', 2], ['MATH101H', 'R3', 2], ['CHEM120', 'R1', 2]], [1, 10, 10, 5],
{'R1': 0, 'R2': 3, 'R3': 7}],
[20, 7, 27])],
[('regression: repeated row room charge 1',
[[['PHYS110', 'R3', 2], ['CHEM120', 'R1', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R3', 3],
['CHEM120', 'R1', 3], ['CHEM120', 'R3', 3]],
[0, 0, 5, 1], {'R1': 0, 'R2': 3, 'R3': 2}],
[16, 4, 20]),
('regression variant: repeated row room charge 2',
[[['CHEM120', 'R3', 3], ['MATH101', 'R2', 0], ['PHYS110', 'R2', 1], ['CHEM120', 'R2', 3],
['PHYS110', 'R3', 0], ['CHEM120', 'R2', 3], ['MATH101H', 'R1', 3]],
[1, 10, 10, 5], {'R1': 0, 'R2': 3, 'R3': 2}],
[22, 13, 35]),
('partial repair guard 3',
[[['CHEM120', 'R1', 0], ['MATH101H', 'R1', 3], ['MATH101', 'R1', 1], ['CHEM120', 'R2', 2],
['MATH101', 'R2', 3], ['CHEM120', 'R1', 0], ['CHEM120', 'R2', 2]],
[0, 0, 10, 5], {'R1': 0, 'R2': 3, 'R3': 7}],
[20, 6, 26]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['MATH101H', 'R1', 2], ['CHEM120', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101', 'R1', 3],
['MATH101H', 'R1', 1]],
[1, 0, 10, 10], {'R1': 0, 'R2': 1, 'R3': 7}],
[21, 0, 21]),
('normal control 7',
[[['MATH101H', 'R3', 1], ['MATH101H', 'R1', 1]], [0, 5, 5, 5], {'R1': 0, 'R2': 3, 'R3': 2}], [5, 2, 7]),
('normal control 8',
[[['CHEM120', 'R3', 3], ['MATH101H', 'R3', 0], ['MATH101H', 'R3', 0], ['MATH101', 'R2', 3],
['MATH101', 'R3', 2]],
[0, 0, 0, 0], {'R1': 0, 'R2': 1, 'R3': 7}],
[0, 22, 22])],
[('regression: repeated row room charge 1',
[[['MATH101', 'R2', 1], ['MATH101', 'R3', 1], ['MATH101H', 'R2', 2], ['CHEM120', 'R2', 3],
['MATH101H', 'R2', 1], ['MATH101', 'R2', 3]],
[5, 10, 0, 10], {'R1': 0, 'R2': 3, 'R3': 7}],
[40, 16, 56]),
('regression variant: repeated row room charge 2',
[[['MATH101H', 'R1', 3], ['MATH101H', 'R3', 2], ['MATH101', 'R3', 0], ['MATH101H', 'R1', 3],
['MATH101H', 'R3', 0], ['PHYS110', 'R2', 3]],
[5, 0, 10, 0], {'R1': 0, 'R2': 3, 'R3': 2}],
[20, 7, 27]),
('partial repair guard 3',
[[['MATH101', 'R2', 1], ['CHEM120', 'R2', 0], ['MATH101', 'R2', 1]], [10, 0, 5, 5],
{'R1': 0, 'R2': 3, 'R3': 7}],
[10, 6, 16]),
('boundary control 4', [[['A', 'R1', 1], ['A', 'R2', 1]], [0, 5, 0, 0], {'R1': 0, 'R2': 3}], [5, 3, 8]),
('boundary control 5', [[['A', 'R2', 0], ['B', 'R2', 0]], [2, 5, 0, 0], {'R1': 0, 'R2': 3}], [4, 6, 10]),
('normal control 6',
[[['CHEM120', 'R2', 2], ['PHYS110', 'R1', 1], ['CHEM120', 'R1', 0], ['MATH101H', 'R2', 1],
['MATH101', 'R2', 2], ['CHEM120', 'R3', 0], ['CHEM120', 'R3', 3], ['CHEM120', 'R2', 2]],
[1, 1, 10, 5], {'R1': 0, 'R2': 1, 'R3': 7}],
[28, 10, 38]),
('normal control 7',
[[['CHEM120', 'R3', 3], ['MATH101H', 'R3', 0], ['MATH101H', 'R3', 0], ['MATH101', 'R2', 3],
['MATH101', 'R3', 2]],
[0, 0, 0, 0], {'R1': 0, 'R2': 1, 'R3': 7}],
[0, 22, 22]),
('normal control 8',
[[['PHYS110', 'R1', 2], ['CHEM120', 'R2', 1], ['MATH101H', 'R3', 2], ['MATH101', 'R3', 0],
['CHEM120', 'R2', 1], ['MATH101H', 'R3', 1]],
[10, 0, 10, 0], {'R1': 0, 'R2': 3, 'R3': 2}],
[30, 7, 37])]]
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: repeated row room charge 1 | [5, 3, 8] | [5, 3, 8] | Passed |
| regression variant: repeated row room charge 2 | [16, 16, 32] | [16, 16, 32] | Passed |
| partial repair guard 3 | [38, 11, 49] | [38, 11, 49] | Passed |
| boundary control 4 | [5, 3, 8] | [5, 3, 8] | Passed |
| boundary control 5 | [4, 6, 10] | [4, 6, 10] | Passed |
| normal control 6 | [3, 10, 13] | [3, 10, 13] | Passed |
| normal control 7 | [25, 14, 39] | [25, 14, 39] | Passed |
| normal control 8 | [40, 5, 45] | [40, 5, 45] | Passed |
SHA-256 / 1d8b290376668506ae9917b4d5b13081eb11c897efe0486b6ec65ceb7606d23d
Verification & scope
Stipulated toy exam-timetabling rule set for a bounded model; it does not claim conformance with any institution's regulations or a benchmark specification, and it performs no search or optimisation. 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:52:06.476329+00:00.
Case digest / 94a105d31245022074a9bbaebc2db493dbabfcc36cb999b510fcad7a84fde4c6