FAILURE MAP
← Case archive

FA-94571 / Exam timetabling constraints / Open access

Mixed durations evaluated across all rooms of a period · case 01

Different rooms with different durations are penalised as if they shared a room.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Groups are keyed by period only.

VERIFIED REPAIR

Group by room and period.

Unsuccessful approach: Keying by room only mixes all periods of the room.

Case contract

Assignments [exam, room, period] and exam durations. For each room and period, the penalty is the number of distinct durations minus one. Return [total penalty, [room, period, distinct durations] for penalised room-periods in order].

Why this case matters

Mixed durations in one room disrupt invigilation; the penalty is defined over distinct durations.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(assign, dur):
    groups = {}
    for e, r, p in assign:
        groups.setdefault(('all', p), set()).add(dur[e])
    bad = []
    total = 0
    for (r, p), ds in sorted(groups.items()):
        if len(ds) > 1:
            bad.append([r, p, len(ds)])
            total += len(ds) - 1
    return [total, bad]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: room period key 1',
   [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}], [2, [['R1', 0, 3]]]),
  ('regression variant: room period key 2',
   [[['HIST140', 'R2', 2], ['ECON150', 'R2', 0], ['CHEM120', 'R1', 0], ['HIST140', 'R2', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 90}],
   [0, []]),
  ('partial repair guard 3',
   [[['BIO130', 'R1', 0], ['MATH101', 'R2', 2], ['HIST140', 'R2', 0]],
    {'MATH101': 120,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 60,
     'BIO130': 90,
     'HIST140': 60,
     'ECON150': 60}],
   [0, []]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),
  ('normal control 6',
   [[['PHYS110', 'R1', 0], ['HIST140', 'R1', 1], ['MATH101', 'R2', 0], ['CHEM120', 'R2', 2]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90}],
   [0, []]),
  ('normal control 7',
   [[['PHYS110', 'R1', 1], ['BIO130', 'R1', 1]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 120,
     'ECON150': 60}],
   [1, [['R1', 1, 2]]]),
  ('normal control 8',
   [[['HIST140', 'R1', 0], ['PHYS110', 'R2', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R2', 0],
     ['MATH101', 'R2', 2], ['HIST140', 'R1', 0]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 60}],
   [1, [['R2', 0, 2]]])],
 [('regression: room period key 1', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),
  ('regression variant: room period key 2',
   [[['MATH101', 'R1', 0], ['MATH101H', 'R2', 2], ['BIO130', 'R1', 0], ['MATH101', 'R2', 0],
     ['MATH101', 'R2', 0], ['CHEM120', 'R2', 0]],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60}],
   [2, [['R1', 0, 2], ['R2', 0, 2]]]),
  ('partial repair guard 3',
   [[['HIST140', 'R1', 1], ['MATH101', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90}],
   [0, []]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),
  ('normal control 5',
   [[['ECON150', 'R1', 0], ['MATH101', 'R1', 2], ['HIST140', 'R1', 1], ['ECON150', 'R1', 0]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 120}],
   [0, []]),
  ('normal control 6',
   [[['HIST140', 'R2', 2], ['BIO130', 'R2', 1], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],
     ['BIO130', 'R2', 1]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60}],
   [1, [['R2', 1, 2]]]),
  ('normal control 7',
   [[['PHYS110', 'R1', 2], ['PHYS110', 'R2', 2], ['PHYS110', 'R2', 1], ['MATH101', 'R2', 0],
     ['CHEM120', 'R2', 2], ['HIST140', 'R1', 0]],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 60}],
   [1, [['R2', 2, 2]]]),
  ('normal control 8',
   [[['MATH101H', 'R1', 2], ['BIO130', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60}],
   [0, []])],
 [('regression: room period key 1',
   [[['MATH101H', 'R2', 0], ['PHYS110', 'R1', 0], ['BIO130', 'R2', 0], ['MATH101', 'R1', 1],
     ['CHEM120', 'R1', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 120,
     'ECON150': 90}],
   [3, [['R1', 1, 2], ['R2', 0, 3]]]),
  ('regression variant: room period key 2',
   [[['MATH101H', 'R1', 0], ['MATH101H', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 1]],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 120}],
   [1, [['R2', 1, 2]]]),
  ('partial repair guard 3',
   [[['ECON150', 'R2', 2], ['CHEM120', 'R1', 1], ['HIST140', 'R2', 2], ['ECON150', 'R1', 2],
     ['HIST140', 'R1', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 2], ['BIO130', 'R2', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90}],
   [2, [['R1', 1, 2], ['R2', 2, 2]]]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],
   [2, [['R1', 0, 3]]]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),
  ('normal control 6',
   [[['HIST140', 'R1', 0], ['BIO130', 'R1', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 60}],
   [0, []]),
  ('normal control 7',
   [[['BIO130', 'R1', 1], ['CHEM120', 'R2', 0], ['HIST140', 'R2', 0], ['PHYS110', 'R1', 2],
     ['CHEM120', 'R1', 0]],
    {'MATH101': 90,
     'MATH101H': 60,
     'PHYS110': 90,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 60}],
   [1, [['R2', 0, 2]]]),
  ('normal control 8',
   [[['MATH101H', 'R1', 1], ['BIO130', 'R1', 0], ['HIST140', 'R1', 2]],
    {'MATH101': 60,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 120}],
   [0, []])],
 [('regression: room period key 1',
   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],
     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 120}],
   [3, [['R1', 0, 2], ['R2', 2, 3]]]),
  ('regression variant: room period key 2',
   [[['MATH101', 'R1', 2], ['ECON150', 'R1', 1], ['BIO130', 'R2', 1], ['HIST140', 'R2', 0],
     ['PHYS110', 'R1', 0], ['ECON150', 'R2', 2], ['MATH101H', 'R1', 1]],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 90}],
   [1, [['R1', 1, 2]]]),
  ('partial repair guard 3',
   [[['CHEM120', 'R2', 0], ['ECON150', 'R2', 1], ['PHYS110', 'R2', 1], ['ECON150', 'R1', 2],
     ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 1], ['MATH101H', 'R2', 1]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 90}],
   [1, [['R2', 1, 2]]]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],
   [2, [['R1', 0, 3]]]),
  ('normal control 6',
   [[['HIST140', 'R2', 1], ['BIO130', 'R2', 1], ['MATH101', 'R1', 2], ['MATH101', 'R2', 1],
     ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 90}],
   [1, [['R2', 1, 2]]]),
  ('normal control 7',
   [[['MATH101', 'R1', 2], ['CHEM120', 'R2', 2]],
    {'MATH101': 60,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 60}],
   [0, []]),
  ('normal control 8',
   [[['MATH101', 'R1', 1], ['PHYS110', 'R2', 2], ['CHEM120', 'R2', 1], ['PHYS110', 'R2', 2],
     ['MATH101', 'R1', 0], ['PHYS110', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 60}],
   [0, []])],
 [('regression: room period key 1',
   [[['CHEM120', 'R1', 2], ['CHEM120', 'R1', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R1', 0],
     ['HIST140', 'R1', 0]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90}],
   [2, [['R1', 0, 3]]]),
  ('regression variant: room period key 2',
   [[['BIO130', 'R1', 1], ['MATH101', 'R2', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 0],
     ['MATH101', 'R1', 1], ['CHEM120', 'R1', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 120}],
   [1, [['R1', 1, 2]]]),
  ('partial repair guard 3',
   [[['MATH101', 'R1', 2], ['MATH101', 'R1', 2], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],
     ['CHEM120', 'R1', 2], ['MATH101', 'R1', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90}],
   [1, [['R1', 1, 2]]]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),
  ('normal control 6',
   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],
     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 120}],
   [3, [['R1', 0, 2], ['R2', 2, 3]]]),
  ('normal control 7',
   [[['MATH101H', 'R2', 1], ['HIST140', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 0],
     ['HIST140', 'R2', 2], ['HIST140', 'R1', 2], ['CHEM120', 'R1', 1]],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 60}],
   [0, []]),
  ('normal control 8',
   [[['ECON150', 'R1', 0], ['MATH101H', 'R1', 2], ['CHEM120', 'R2', 2], ['ECON150', 'R1', 2],
     ['CHEM120', 'R1', 2], ['CHEM120', 'R1', 0], ['ECON150', 'R1', 0], ['ECON150', 'R2', 0]],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90}],
   [1, [['R1', 2, 2]]])]]
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 fixtureActualExpectedOutcome
regression: room period key 1[2, [['all', 0, 3]]][2, [['R1', 0, 3]]]Failed
regression variant: room period key 2[1, [['all', 0, 2]]][0, []]Failed
partial repair guard 3[1, [['all', 0, 2]]][0, []]Failed
boundary control 4[0, []][0, []]Passed
boundary control 5[0, []][0, []]Passed
normal control 6[1, [['all', 0, 2]]][0, []]Failed
normal control 7[1, [['all', 1, 2]]][1, [['R1', 1, 2]]]Failed
normal control 8[1, [['all', 0, 2]]][1, [['R2', 0, 2]]]Failed

SHA-256 / 7963556e6e8fa746dd87b324391766391f0958ed0672087d420d21740ba9c3f3

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(assign, dur):
    groups = {}
    for e, r, p in assign:
        groups.setdefault((r, 0), set()).add(dur[e])
    bad = []
    total = 0
    for (r, p), ds in sorted(groups.items()):
        if len(ds) > 1:
            bad.append([r, p, len(ds)])
            total += len(ds) - 1
    return [total, bad]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: room period key 1',
   [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}], [2, [['R1', 0, 3]]]),
  ('regression variant: room period key 2',
   [[['HIST140', 'R2', 2], ['ECON150', 'R2', 0], ['CHEM120', 'R1', 0], ['HIST140', 'R2', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 90}],
   [0, []]),
  ('partial repair guard 3',
   [[['BIO130', 'R1', 0], ['MATH101', 'R2', 2], ['HIST140', 'R2', 0]],
    {'MATH101': 120,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 60,
     'BIO130': 90,
     'HIST140': 60,
     'ECON150': 60}],
   [0, []]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),
  ('normal control 6',
   [[['PHYS110', 'R1', 0], ['HIST140', 'R1', 1], ['MATH101', 'R2', 0], ['CHEM120', 'R2', 2]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90}],
   [0, []]),
  ('normal control 7',
   [[['PHYS110', 'R1', 1], ['BIO130', 'R1', 1]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 120,
     'ECON150': 60}],
   [1, [['R1', 1, 2]]]),
  ('normal control 8',
   [[['HIST140', 'R1', 0], ['PHYS110', 'R2', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R2', 0],
     ['MATH101', 'R2', 2], ['HIST140', 'R1', 0]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 60}],
   [1, [['R2', 0, 2]]])],
 [('regression: room period key 1', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),
  ('regression variant: room period key 2',
   [[['MATH101', 'R1', 0], ['MATH101H', 'R2', 2], ['BIO130', 'R1', 0], ['MATH101', 'R2', 0],
     ['MATH101', 'R2', 0], ['CHEM120', 'R2', 0]],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60}],
   [2, [['R1', 0, 2], ['R2', 0, 2]]]),
  ('partial repair guard 3',
   [[['HIST140', 'R1', 1], ['MATH101', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90}],
   [0, []]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),
  ('normal control 5',
   [[['ECON150', 'R1', 0], ['MATH101', 'R1', 2], ['HIST140', 'R1', 1], ['ECON150', 'R1', 0]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 120}],
   [0, []]),
  ('normal control 6',
   [[['HIST140', 'R2', 2], ['BIO130', 'R2', 1], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],
     ['BIO130', 'R2', 1]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60}],
   [1, [['R2', 1, 2]]]),
  ('normal control 7',
   [[['PHYS110', 'R1', 2], ['PHYS110', 'R2', 2], ['PHYS110', 'R2', 1], ['MATH101', 'R2', 0],
     ['CHEM120', 'R2', 2], ['HIST140', 'R1', 0]],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 60}],
   [1, [['R2', 2, 2]]]),
  ('normal control 8',
   [[['MATH101H', 'R1', 2], ['BIO130', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60}],
   [0, []])],
 [('regression: room period key 1',
   [[['MATH101H', 'R2', 0], ['PHYS110', 'R1', 0], ['BIO130', 'R2', 0], ['MATH101', 'R1', 1],
     ['CHEM120', 'R1', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 120,
     'ECON150': 90}],
   [3, [['R1', 1, 2], ['R2', 0, 3]]]),
  ('regression variant: room period key 2',
   [[['MATH101H', 'R1', 0], ['MATH101H', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 1]],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 120}],
   [1, [['R2', 1, 2]]]),
  ('partial repair guard 3',
   [[['ECON150', 'R2', 2], ['CHEM120', 'R1', 1], ['HIST140', 'R2', 2], ['ECON150', 'R1', 2],
     ['HIST140', 'R1', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 2], ['BIO130', 'R2', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90}],
   [2, [['R1', 1, 2], ['R2', 2, 2]]]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],
   [2, [['R1', 0, 3]]]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),
  ('normal control 6',
   [[['HIST140', 'R1', 0], ['BIO130', 'R1', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 60}],
   [0, []]),
  ('normal control 7',
   [[['BIO130', 'R1', 1], ['CHEM120', 'R2', 0], ['HIST140', 'R2', 0], ['PHYS110', 'R1', 2],
     ['CHEM120', 'R1', 0]],
    {'MATH101': 90,
     'MATH101H': 60,
     'PHYS110': 90,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 60}],
   [1, [['R2', 0, 2]]]),
  ('normal control 8',
   [[['MATH101H', 'R1', 1], ['BIO130', 'R1', 0], ['HIST140', 'R1', 2]],
    {'MATH101': 60,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 120}],
   [0, []])],
 [('regression: room period key 1',
   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],
     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 120}],
   [3, [['R1', 0, 2], ['R2', 2, 3]]]),
  ('regression variant: room period key 2',
   [[['MATH101', 'R1', 2], ['ECON150', 'R1', 1], ['BIO130', 'R2', 1], ['HIST140', 'R2', 0],
     ['PHYS110', 'R1', 0], ['ECON150', 'R2', 2], ['MATH101H', 'R1', 1]],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 90}],
   [1, [['R1', 1, 2]]]),
  ('partial repair guard 3',
   [[['CHEM120', 'R2', 0], ['ECON150', 'R2', 1], ['PHYS110', 'R2', 1], ['ECON150', 'R1', 2],
     ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 1], ['MATH101H', 'R2', 1]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 90}],
   [1, [['R2', 1, 2]]]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],
   [2, [['R1', 0, 3]]]),
  ('normal control 6',
   [[['HIST140', 'R2', 1], ['BIO130', 'R2', 1], ['MATH101', 'R1', 2], ['MATH101', 'R2', 1],
     ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 90}],
   [1, [['R2', 1, 2]]]),
  ('normal control 7',
   [[['MATH101', 'R1', 2], ['CHEM120', 'R2', 2]],
    {'MATH101': 60,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 60}],
   [0, []]),
  ('normal control 8',
   [[['MATH101', 'R1', 1], ['PHYS110', 'R2', 2], ['CHEM120', 'R2', 1], ['PHYS110', 'R2', 2],
     ['MATH101', 'R1', 0], ['PHYS110', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 60}],
   [0, []])],
 [('regression: room period key 1',
   [[['CHEM120', 'R1', 2], ['CHEM120', 'R1', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R1', 0],
     ['HIST140', 'R1', 0]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90}],
   [2, [['R1', 0, 3]]]),
  ('regression variant: room period key 2',
   [[['BIO130', 'R1', 1], ['MATH101', 'R2', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 0],
     ['MATH101', 'R1', 1], ['CHEM120', 'R1', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 120}],
   [1, [['R1', 1, 2]]]),
  ('partial repair guard 3',
   [[['MATH101', 'R1', 2], ['MATH101', 'R1', 2], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],
     ['CHEM120', 'R1', 2], ['MATH101', 'R1', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90}],
   [1, [['R1', 1, 2]]]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),
  ('normal control 6',
   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],
     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 120}],
   [3, [['R1', 0, 2], ['R2', 2, 3]]]),
  ('normal control 7',
   [[['MATH101H', 'R2', 1], ['HIST140', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 0],
     ['HIST140', 'R2', 2], ['HIST140', 'R1', 2], ['CHEM120', 'R1', 1]],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 60}],
   [0, []]),
  ('normal control 8',
   [[['ECON150', 'R1', 0], ['MATH101H', 'R1', 2], ['CHEM120', 'R2', 2], ['ECON150', 'R1', 2],
     ['CHEM120', 'R1', 2], ['CHEM120', 'R1', 0], ['ECON150', 'R1', 0], ['ECON150', 'R2', 0]],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90}],
   [1, [['R1', 2, 2]]])]]
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 fixtureActualExpectedOutcome
regression: room period key 1[2, [['R1', 0, 3]]][2, [['R1', 0, 3]]]Passed
regression variant: room period key 2[0, []][0, []]Passed
partial repair guard 3[1, [['R2', 0, 2]]][0, []]Failed
boundary control 4[1, [['R1', 0, 2]]][0, []]Failed
boundary control 5[0, []][0, []]Passed
normal control 6[1, [['R2', 0, 2]]][0, []]Failed
normal control 7[1, [['R1', 0, 2]]][1, [['R1', 1, 2]]]Failed
normal control 8[2, [['R2', 0, 3]]][1, [['R2', 0, 2]]]Failed

SHA-256 / ad54afe29c696ff345fa51cbbd62d8e7fe415ad1a467f9beb629f7c9eb4b71e1

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(assign, dur):
    groups = {}
    for e, r, p in assign:
        groups.setdefault((r, p), set()).add(dur[e])
    bad = []
    total = 0
    for (r, p), ds in sorted(groups.items()):
        if len(ds) > 1:
            bad.append([r, p, len(ds)])
            total += len(ds) - 1
    return [total, bad]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: room period key 1',
   [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}], [2, [['R1', 0, 3]]]),
  ('regression variant: room period key 2',
   [[['HIST140', 'R2', 2], ['ECON150', 'R2', 0], ['CHEM120', 'R1', 0], ['HIST140', 'R2', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 90}],
   [0, []]),
  ('partial repair guard 3',
   [[['BIO130', 'R1', 0], ['MATH101', 'R2', 2], ['HIST140', 'R2', 0]],
    {'MATH101': 120,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 60,
     'BIO130': 90,
     'HIST140': 60,
     'ECON150': 60}],
   [0, []]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),
  ('normal control 6',
   [[['PHYS110', 'R1', 0], ['HIST140', 'R1', 1], ['MATH101', 'R2', 0], ['CHEM120', 'R2', 2]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90}],
   [0, []]),
  ('normal control 7',
   [[['PHYS110', 'R1', 1], ['BIO130', 'R1', 1]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 120,
     'ECON150': 60}],
   [1, [['R1', 1, 2]]]),
  ('normal control 8',
   [[['HIST140', 'R1', 0], ['PHYS110', 'R2', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R2', 0],
     ['MATH101', 'R2', 2], ['HIST140', 'R1', 0]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 60}],
   [1, [['R2', 0, 2]]])],
 [('regression: room period key 1', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),
  ('regression variant: room period key 2',
   [[['MATH101', 'R1', 0], ['MATH101H', 'R2', 2], ['BIO130', 'R1', 0], ['MATH101', 'R2', 0],
     ['MATH101', 'R2', 0], ['CHEM120', 'R2', 0]],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60}],
   [2, [['R1', 0, 2], ['R2', 0, 2]]]),
  ('partial repair guard 3',
   [[['HIST140', 'R1', 1], ['MATH101', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90}],
   [0, []]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),
  ('normal control 5',
   [[['ECON150', 'R1', 0], ['MATH101', 'R1', 2], ['HIST140', 'R1', 1], ['ECON150', 'R1', 0]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 120}],
   [0, []]),
  ('normal control 6',
   [[['HIST140', 'R2', 2], ['BIO130', 'R2', 1], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],
     ['BIO130', 'R2', 1]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60}],
   [1, [['R2', 1, 2]]]),
  ('normal control 7',
   [[['PHYS110', 'R1', 2], ['PHYS110', 'R2', 2], ['PHYS110', 'R2', 1], ['MATH101', 'R2', 0],
     ['CHEM120', 'R2', 2], ['HIST140', 'R1', 0]],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 60}],
   [1, [['R2', 2, 2]]]),
  ('normal control 8',
   [[['MATH101H', 'R1', 2], ['BIO130', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 60}],
   [0, []])],
 [('regression: room period key 1',
   [[['MATH101H', 'R2', 0], ['PHYS110', 'R1', 0], ['BIO130', 'R2', 0], ['MATH101', 'R1', 1],
     ['CHEM120', 'R1', 1], ['CHEM120', 'R2', 0], ['MATH101H', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 120,
     'BIO130': 60,
     'HIST140': 120,
     'ECON150': 90}],
   [3, [['R1', 1, 2], ['R2', 0, 3]]]),
  ('regression variant: room period key 2',
   [[['MATH101H', 'R1', 0], ['MATH101H', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 1]],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 60,
     'ECON150': 120}],
   [1, [['R2', 1, 2]]]),
  ('partial repair guard 3',
   [[['ECON150', 'R2', 2], ['CHEM120', 'R1', 1], ['HIST140', 'R2', 2], ['ECON150', 'R1', 2],
     ['HIST140', 'R1', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 2], ['BIO130', 'R2', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90}],
   [2, [['R1', 1, 2], ['R2', 2, 2]]]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],
   [2, [['R1', 0, 3]]]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R2', 0]], {'A': 60, 'B': 90}], [0, []]),
  ('normal control 6',
   [[['HIST140', 'R1', 0], ['BIO130', 'R1', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 60}],
   [0, []]),
  ('normal control 7',
   [[['BIO130', 'R1', 1], ['CHEM120', 'R2', 0], ['HIST140', 'R2', 0], ['PHYS110', 'R1', 2],
     ['CHEM120', 'R1', 0]],
    {'MATH101': 90,
     'MATH101H': 60,
     'PHYS110': 90,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 60}],
   [1, [['R2', 0, 2]]]),
  ('normal control 8',
   [[['MATH101H', 'R1', 1], ['BIO130', 'R1', 0], ['HIST140', 'R1', 2]],
    {'MATH101': 60,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 120}],
   [0, []])],
 [('regression: room period key 1',
   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],
     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 120}],
   [3, [['R1', 0, 2], ['R2', 2, 3]]]),
  ('regression variant: room period key 2',
   [[['MATH101', 'R1', 2], ['ECON150', 'R1', 1], ['BIO130', 'R2', 1], ['HIST140', 'R2', 0],
     ['PHYS110', 'R1', 0], ['ECON150', 'R2', 2], ['MATH101H', 'R1', 1]],
    {'MATH101': 120,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 90}],
   [1, [['R1', 1, 2]]]),
  ('partial repair guard 3',
   [[['CHEM120', 'R2', 0], ['ECON150', 'R2', 1], ['PHYS110', 'R2', 1], ['ECON150', 'R1', 2],
     ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 1], ['MATH101H', 'R2', 1]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 120,
     'CHEM120': 60,
     'BIO130': 60,
     'HIST140': 90,
     'ECON150': 90}],
   [1, [['R2', 1, 2]]]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0], ['C', 'R1', 0]], {'A': 60, 'B': 90, 'C': 120}],
   [2, [['R1', 0, 3]]]),
  ('normal control 6',
   [[['HIST140', 'R2', 1], ['BIO130', 'R2', 1], ['MATH101', 'R1', 2], ['MATH101', 'R2', 1],
     ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1]],
    {'MATH101': 120,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 90}],
   [1, [['R2', 1, 2]]]),
  ('normal control 7',
   [[['MATH101', 'R1', 2], ['CHEM120', 'R2', 2]],
    {'MATH101': 60,
     'MATH101H': 90,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 60,
     'HIST140': 60,
     'ECON150': 60}],
   [0, []]),
  ('normal control 8',
   [[['MATH101', 'R1', 1], ['PHYS110', 'R2', 2], ['CHEM120', 'R2', 1], ['PHYS110', 'R2', 2],
     ['MATH101', 'R1', 0], ['PHYS110', 'R1', 2]],
    {'MATH101': 90,
     'MATH101H': 90,
     'PHYS110': 90,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 60}],
   [0, []])],
 [('regression: room period key 1',
   [[['CHEM120', 'R1', 2], ['CHEM120', 'R1', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R1', 0],
     ['HIST140', 'R1', 0]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 120,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90}],
   [2, [['R1', 0, 3]]]),
  ('regression variant: room period key 2',
   [[['BIO130', 'R1', 1], ['MATH101', 'R2', 0], ['PHYS110', 'R1', 1], ['PHYS110', 'R2', 0],
     ['MATH101', 'R1', 1], ['CHEM120', 'R1', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 90,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 120}],
   [1, [['R1', 1, 2]]]),
  ('partial repair guard 3',
   [[['MATH101', 'R1', 2], ['MATH101', 'R1', 2], ['BIO130', 'R1', 1], ['ECON150', 'R2', 1],
     ['CHEM120', 'R1', 2], ['MATH101', 'R1', 1]],
    {'MATH101': 90,
     'MATH101H': 120,
     'PHYS110': 60,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 120,
     'ECON150': 90}],
   [1, [['R1', 1, 2]]]),
  ('boundary control 4', [[['A', 'R1', 0], ['B', 'R1', 1]], {'A': 60, 'B': 90}], [0, []]),
  ('boundary control 5', [[['A', 'R1', 0], ['B', 'R1', 0]], {'A': 60, 'B': 60}], [0, []]),
  ('normal control 6',
   [[['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0], ['MATH101', 'R2', 2], ['BIO130', 'R1', 0],
     ['CHEM120', 'R2', 2], ['ECON150', 'R2', 2], ['BIO130', 'R2', 2]],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 90,
     'HIST140': 120,
     'ECON150': 120}],
   [3, [['R1', 0, 2], ['R2', 2, 3]]]),
  ('normal control 7',
   [[['MATH101H', 'R2', 1], ['HIST140', 'R2', 2], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 0],
     ['HIST140', 'R2', 2], ['HIST140', 'R1', 2], ['CHEM120', 'R1', 1]],
    {'MATH101': 60,
     'MATH101H': 120,
     'PHYS110': 120,
     'CHEM120': 120,
     'BIO130': 90,
     'HIST140': 90,
     'ECON150': 60}],
   [0, []]),
  ('normal control 8',
   [[['ECON150', 'R1', 0], ['MATH101H', 'R1', 2], ['CHEM120', 'R2', 2], ['ECON150', 'R1', 2],
     ['CHEM120', 'R1', 2], ['CHEM120', 'R1', 0], ['ECON150', 'R1', 0], ['ECON150', 'R2', 0]],
    {'MATH101': 60,
     'MATH101H': 60,
     'PHYS110': 120,
     'CHEM120': 90,
     'BIO130': 120,
     'HIST140': 90,
     'ECON150': 90}],
   [1, [['R1', 2, 2]]])]]
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 fixtureActualExpectedOutcome
regression: room period key 1[2, [['R1', 0, 3]]][2, [['R1', 0, 3]]]Passed
regression variant: room period key 2[0, []][0, []]Passed
partial repair guard 3[0, []][0, []]Passed
boundary control 4[0, []][0, []]Passed
boundary control 5[0, []][0, []]Passed
normal control 6[0, []][0, []]Passed
normal control 7[1, [['R1', 1, 2]]][1, [['R1', 1, 2]]]Passed
normal control 8[1, [['R2', 0, 2]]][1, [['R2', 0, 2]]]Passed

SHA-256 / 9a1c63399b1d9a179606daa59f040d5adf7636cad5436a9a73571883baae2cac

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:05.638810+00:00.

Case digest / 4d0325148fdeb5e617d1e1e40eb7ee01c183d25af275fcdbc49095ca4119189e