FAILURE MAP
← Case archive

FA-94811 / Exam timetabling constraints / Open access

Split exam in one period reported as multi-period · case 01

An exam split across rooms in the same period is flagged as occupying several periods.

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

ROOT CAUSE

Periods are collected per row, so each room row adds the same period again.

VERIFIED REPAIR

Collect distinct periods per exam.

Unsuccessful approach: Requiring non-adjacent periods misses exams spread over adjacent periods.

Case contract

assign [exam, room, period] (rows may repeat); building room -> building; k = maximum distinct exams per room-period. Findings per exam (by id): multi_period if it occupies more than one period, split_buildings if its rooms span more than one building; then room_load for room-periods hosting more than k distinct exams.

Why this case matters

Split exams must stay in one building and rooms have limits on concurrent exams.

1 / The failure

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

N = 1
observations = []
def solve(assign, building, k):
    rooms_of = {}
    periods_of = {}
    load = {}
    for ex, r, p in assign:
        rooms_of.setdefault(ex, []).append(r)
        periods_of.setdefault(ex, []).append(p)
        load.setdefault((r, p), set()).add(ex)
    out = []
    for ex in sorted(rooms_of):
        if len(periods_of[ex]) > 1:
            out.append(['multi_period', ex])
        if len({building[r] for r in rooms_of[ex]}) > 1:
            out.append(['split_buildings', ex])
    for (r, p) in sorted(load):
        if len(load[(r, p)]) > k:
            out.append(['room_load', r, p])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: multi period rows 1',
   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),
  ('regression variant: multi period rows 2',
   [[['CHEM120', 'R1', 2], ['MATH101H', 'R3', 2], ['MATH101H', 'R4', 2], ['MATH101H', 'R4', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('partial repair guard 3',
   [[['CHEM120', 'R2', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1], ['MATH101', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R1', 1]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'A']]),
  ('normal control 5',
   [[['CHEM120', 'R4', 2], ['MATH101', 'R4', 1], ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 0],
     ['MATH101', 'R4', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']]),
  ('normal control 6',
   [[['MATH101H', 'R3', 2], ['CHEM120', 'R1', 1], ['PHYS110', 'R1', 2], ['MATH101', 'R4', 0],
     ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101']]),
  ('normal control 7',
   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101', 'R4', 0], ['MATH101', 'R1', 0],
     ['MATH101H', 'R2', 0], ['MATH101', 'R4', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']]),
  ('normal control 8',
   [[['PHYS110', 'R3', 0], ['MATH101', 'R3', 0], ['MATH101', 'R4', 2], ['PHYS110', 'R4', 0],
     ['PHYS110', 'R2', 1], ['PHYS110', 'R2', 0], ['MATH101H', 'R4', 0], ['PHYS110', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],
    ['room_load', 'R3', 0], ['room_load', 'R4', 0]])],
 [('regression: multi period rows 1',
   [[['A', 'R1', 0], ['A', 'R3', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['split_buildings', 'A']]),
  ('regression variant: multi period rows 2',
   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],
     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),
  ('partial repair guard 3',
   [[['PHYS110', 'R1', 0], ['MATH101', 'R3', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R4', 1],
     ['PHYS110', 'R3', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),
  ('normal control 4',
   [[['PHYS110', 'R2', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 1], ['MATH101', 'R1', 1],
     ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120']]),
  ('normal control 5',
   [[['MATH101H', 'R3', 0], ['CHEM120', 'R3', 1], ['MATH101', 'R4', 2], ['CHEM120', 'R3', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('normal control 6',
   [[['MATH101', 'R1', 2], ['PHYS110', 'R1', 1], ['CHEM120', 'R2', 1], ['MATH101H', 'R3', 0],
     ['MATH101', 'R1', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101'], ['room_load', 'R1', 1]]),
  ('normal control 7',
   [[['MATH101', 'R4', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R3', 2], ['CHEM120', 'R3', 2],
     ['PHYS110', 'R2', 2], ['CHEM120', 'R4', 2], ['PHYS110', 'R1', 1], ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110'],
    ['split_buildings', 'PHYS110']]),
  ('normal control 8',
   [[['PHYS110', 'R4', 0], ['MATH101H', 'R3', 2], ['MATH101', 'R4', 1], ['MATH101', 'R3', 2],
     ['MATH101', 'R4', 1], ['CHEM120', 'R1', 2], ['CHEM120', 'R3', 1], ['CHEM120', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],
    ['room_load', 'R3', 2]])],
 [('regression: multi period rows 1',
   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('regression variant: multi period rows 2',
   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),
  ('partial repair guard 3',
   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],
     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R1', 2]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'A']]),
  ('normal control 5',
   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101H', 'R3', 2], ['PHYS110', 'R3', 0],
     ['MATH101H', 'R1', 0], ['MATH101H', 'R3', 0], ['MATH101H', 'R4', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H']]),
  ('normal control 6',
   [[['PHYS110', 'R1', 2], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 7',
   [[['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0], ['PHYS110', 'R1', 2], ['PHYS110', 'R1', 1],
     ['CHEM120', 'R1', 0], ['PHYS110', 'R3', 0], ['MATH101H', 'R4', 1], ['MATH101', 'R1', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['split_buildings', 'MATH101H'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],
    ['room_load', 'R1', 1]]),
  ('normal control 8',
   [[['PHYS110', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101H', 'R4', 0], ['MATH101H', 'R3', 1],
     ['PHYS110', 'R3', 2], ['PHYS110', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']])],
 [('regression: multi period rows 1',
   [[['MATH101H', 'R3', 1], ['MATH101', 'R2', 0], ['MATH101', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('regression variant: multi period rows 2',
   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],
     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),
  ('partial repair guard 3',
   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('normal control 5',
   [[['PHYS110', 'R2', 0], ['MATH101', 'R1', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 6',
   [[['MATH101', 'R2', 0], ['MATH101', 'R1', 0], ['MATH101', 'R1', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 7',
   [[['PHYS110', 'R2', 2], ['CHEM120', 'R4', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 8',
   [[['PHYS110', 'R4', 2], ['PHYS110', 'R2', 2], ['MATH101', 'R3', 0], ['PHYS110', 'R2', 0],
     ['PHYS110', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']])],
 [('regression: multi period rows 1',
   [[['MATH101', 'R2', 2], ['MATH101H', 'R2', 1], ['MATH101', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('regression variant: multi period rows 2',
   [[['CHEM120', 'R2', 0], ['MATH101', 'R1', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R4', 1],
     ['PHYS110', 'R1', 2], ['MATH101', 'R4', 1], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 2],
     ['CHEM120', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110']]),
  ('partial repair guard 3',
   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],
     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),
  ('normal control 5',
   [[['MATH101H', 'R1', 1], ['PHYS110', 'R3', 2], ['MATH101', 'R3', 0], ['MATH101', 'R2', 2],
     ['MATH101H', 'R3', 1], ['PHYS110', 'R1', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['split_buildings', 'MATH101H'],
    ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R1', 1]]),
  ('normal control 6',
   [[['CHEM120', 'R4', 1], ['MATH101H', 'R1', 1], ['MATH101', 'R2', 1], ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 7',
   [[['CHEM120', 'R3', 2], ['MATH101', 'R3', 2], ['PHYS110', 'R1', 2], ['MATH101H', 'R1', 0],
     ['MATH101H', 'R3', 2], ['MATH101', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H'], ['room_load', 'R3', 2]]),
  ('normal control 8',
   [[['CHEM120', 'R2', 1], ['MATH101', 'R2', 1], ['MATH101', 'R3', 2], ['CHEM120', 'R1', 2],
     ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 2], ['MATH101', 'R4', 1], ['PHYS110', 'R2', 0],
     ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],
    ['split_buildings', 'MATH101'], ['room_load', 'R2', 1]])]]
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: multi period rows 1[['multi_period', 'A']][]Failed
regression variant: multi period rows 2[['multi_period', 'MATH101H']][]Failed
partial repair guard 3[['multi_period', 'CHEM120'], ['multi_period', 'MATH101']][['multi_period', 'CHEM120']]Failed
boundary control 4[['multi_period', 'A']][['multi_period', 'A']]Passed
normal control 5[['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101']][['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']]Failed
normal control 6[['multi_period', 'MATH101'], ['split_buildings', 'MATH101']][['multi_period', 'MATH101'], ['split_buildings', 'MATH101']]Passed
normal control 7[['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']][['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']]Failed
normal control 8[['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R3', 0], ['room_load', 'R4', 0]][['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R3', 0], ['room_load', 'R4', 0]]Passed

SHA-256 / 97ff1d3031387a514a1f6b9f7899e93ca40b846a9a76fb8d630372dbe8b15ab3

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(assign, building, k):
    rooms_of = {}
    periods_of = {}
    load = {}
    for ex, r, p in assign:
        rooms_of.setdefault(ex, []).append(r)
        periods_of.setdefault(ex, set()).add(p)
        load.setdefault((r, p), set()).add(ex)
    out = []
    for ex in sorted(rooms_of):
        if max(periods_of[ex]) - min(periods_of[ex]) > 1:
            out.append(['multi_period', ex])
        if len({building[r] for r in rooms_of[ex]}) > 1:
            out.append(['split_buildings', ex])
    for (r, p) in sorted(load):
        if len(load[(r, p)]) > k:
            out.append(['room_load', r, p])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: multi period rows 1',
   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),
  ('regression variant: multi period rows 2',
   [[['CHEM120', 'R1', 2], ['MATH101H', 'R3', 2], ['MATH101H', 'R4', 2], ['MATH101H', 'R4', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('partial repair guard 3',
   [[['CHEM120', 'R2', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1], ['MATH101', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R1', 1]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'A']]),
  ('normal control 5',
   [[['CHEM120', 'R4', 2], ['MATH101', 'R4', 1], ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 0],
     ['MATH101', 'R4', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']]),
  ('normal control 6',
   [[['MATH101H', 'R3', 2], ['CHEM120', 'R1', 1], ['PHYS110', 'R1', 2], ['MATH101', 'R4', 0],
     ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101']]),
  ('normal control 7',
   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101', 'R4', 0], ['MATH101', 'R1', 0],
     ['MATH101H', 'R2', 0], ['MATH101', 'R4', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']]),
  ('normal control 8',
   [[['PHYS110', 'R3', 0], ['MATH101', 'R3', 0], ['MATH101', 'R4', 2], ['PHYS110', 'R4', 0],
     ['PHYS110', 'R2', 1], ['PHYS110', 'R2', 0], ['MATH101H', 'R4', 0], ['PHYS110', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],
    ['room_load', 'R3', 0], ['room_load', 'R4', 0]])],
 [('regression: multi period rows 1',
   [[['A', 'R1', 0], ['A', 'R3', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['split_buildings', 'A']]),
  ('regression variant: multi period rows 2',
   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],
     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),
  ('partial repair guard 3',
   [[['PHYS110', 'R1', 0], ['MATH101', 'R3', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R4', 1],
     ['PHYS110', 'R3', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),
  ('normal control 4',
   [[['PHYS110', 'R2', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 1], ['MATH101', 'R1', 1],
     ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120']]),
  ('normal control 5',
   [[['MATH101H', 'R3', 0], ['CHEM120', 'R3', 1], ['MATH101', 'R4', 2], ['CHEM120', 'R3', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('normal control 6',
   [[['MATH101', 'R1', 2], ['PHYS110', 'R1', 1], ['CHEM120', 'R2', 1], ['MATH101H', 'R3', 0],
     ['MATH101', 'R1', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101'], ['room_load', 'R1', 1]]),
  ('normal control 7',
   [[['MATH101', 'R4', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R3', 2], ['CHEM120', 'R3', 2],
     ['PHYS110', 'R2', 2], ['CHEM120', 'R4', 2], ['PHYS110', 'R1', 1], ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110'],
    ['split_buildings', 'PHYS110']]),
  ('normal control 8',
   [[['PHYS110', 'R4', 0], ['MATH101H', 'R3', 2], ['MATH101', 'R4', 1], ['MATH101', 'R3', 2],
     ['MATH101', 'R4', 1], ['CHEM120', 'R1', 2], ['CHEM120', 'R3', 1], ['CHEM120', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],
    ['room_load', 'R3', 2]])],
 [('regression: multi period rows 1',
   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('regression variant: multi period rows 2',
   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),
  ('partial repair guard 3',
   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],
     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R1', 2]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'A']]),
  ('normal control 5',
   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101H', 'R3', 2], ['PHYS110', 'R3', 0],
     ['MATH101H', 'R1', 0], ['MATH101H', 'R3', 0], ['MATH101H', 'R4', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H']]),
  ('normal control 6',
   [[['PHYS110', 'R1', 2], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 7',
   [[['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0], ['PHYS110', 'R1', 2], ['PHYS110', 'R1', 1],
     ['CHEM120', 'R1', 0], ['PHYS110', 'R3', 0], ['MATH101H', 'R4', 1], ['MATH101', 'R1', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['split_buildings', 'MATH101H'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],
    ['room_load', 'R1', 1]]),
  ('normal control 8',
   [[['PHYS110', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101H', 'R4', 0], ['MATH101H', 'R3', 1],
     ['PHYS110', 'R3', 2], ['PHYS110', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']])],
 [('regression: multi period rows 1',
   [[['MATH101H', 'R3', 1], ['MATH101', 'R2', 0], ['MATH101', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('regression variant: multi period rows 2',
   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],
     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),
  ('partial repair guard 3',
   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('normal control 5',
   [[['PHYS110', 'R2', 0], ['MATH101', 'R1', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 6',
   [[['MATH101', 'R2', 0], ['MATH101', 'R1', 0], ['MATH101', 'R1', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 7',
   [[['PHYS110', 'R2', 2], ['CHEM120', 'R4', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 8',
   [[['PHYS110', 'R4', 2], ['PHYS110', 'R2', 2], ['MATH101', 'R3', 0], ['PHYS110', 'R2', 0],
     ['PHYS110', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']])],
 [('regression: multi period rows 1',
   [[['MATH101', 'R2', 2], ['MATH101H', 'R2', 1], ['MATH101', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('regression variant: multi period rows 2',
   [[['CHEM120', 'R2', 0], ['MATH101', 'R1', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R4', 1],
     ['PHYS110', 'R1', 2], ['MATH101', 'R4', 1], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 2],
     ['CHEM120', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110']]),
  ('partial repair guard 3',
   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],
     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),
  ('normal control 5',
   [[['MATH101H', 'R1', 1], ['PHYS110', 'R3', 2], ['MATH101', 'R3', 0], ['MATH101', 'R2', 2],
     ['MATH101H', 'R3', 1], ['PHYS110', 'R1', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['split_buildings', 'MATH101H'],
    ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R1', 1]]),
  ('normal control 6',
   [[['CHEM120', 'R4', 1], ['MATH101H', 'R1', 1], ['MATH101', 'R2', 1], ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 7',
   [[['CHEM120', 'R3', 2], ['MATH101', 'R3', 2], ['PHYS110', 'R1', 2], ['MATH101H', 'R1', 0],
     ['MATH101H', 'R3', 2], ['MATH101', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H'], ['room_load', 'R3', 2]]),
  ('normal control 8',
   [[['CHEM120', 'R2', 1], ['MATH101', 'R2', 1], ['MATH101', 'R3', 2], ['CHEM120', 'R1', 2],
     ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 2], ['MATH101', 'R4', 1], ['PHYS110', 'R2', 0],
     ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],
    ['split_buildings', 'MATH101'], ['room_load', 'R2', 1]])]]
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: multi period rows 1[][]Passed
regression variant: multi period rows 2[][]Passed
partial repair guard 3[][['multi_period', 'CHEM120']]Failed
boundary control 4[][['multi_period', 'A']]Failed
normal control 5[['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']][['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']]Passed
normal control 6[['split_buildings', 'MATH101']][['multi_period', 'MATH101'], ['split_buildings', 'MATH101']]Failed
normal control 7[['split_buildings', 'MATH101']][['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']]Failed
normal control 8[['multi_period', 'MATH101'], ['split_buildings', 'PHYS110'], ['room_load', 'R3', 0], ['room_load', 'R4', 0]][['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R3', 0], ['room_load', 'R4', 0]]Failed

SHA-256 / 50c8cc2ae4fb656d5618c483494a10cf819a2673305e44f72faf01f989b27f10

3 / The verified repair

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

N = 1
observations = []
def solve(assign, building, k):
    rooms_of = {}
    periods_of = {}
    load = {}
    for ex, r, p in assign:
        rooms_of.setdefault(ex, []).append(r)
        periods_of.setdefault(ex, set()).add(p)
        load.setdefault((r, p), set()).add(ex)
    out = []
    for ex in sorted(rooms_of):
        if len(periods_of[ex]) > 1:
            out.append(['multi_period', ex])
        if len({building[r] for r in rooms_of[ex]}) > 1:
            out.append(['split_buildings', ex])
    for (r, p) in sorted(load):
        if len(load[(r, p)]) > k:
            out.append(['room_load', r, p])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: multi period rows 1',
   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),
  ('regression variant: multi period rows 2',
   [[['CHEM120', 'R1', 2], ['MATH101H', 'R3', 2], ['MATH101H', 'R4', 2], ['MATH101H', 'R4', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('partial repair guard 3',
   [[['CHEM120', 'R2', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1], ['MATH101', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R1', 1]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'A']]),
  ('normal control 5',
   [[['CHEM120', 'R4', 2], ['MATH101', 'R4', 1], ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 0],
     ['MATH101', 'R4', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']]),
  ('normal control 6',
   [[['MATH101H', 'R3', 2], ['CHEM120', 'R1', 1], ['PHYS110', 'R1', 2], ['MATH101', 'R4', 0],
     ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101']]),
  ('normal control 7',
   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101', 'R4', 0], ['MATH101', 'R1', 0],
     ['MATH101H', 'R2', 0], ['MATH101', 'R4', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']]),
  ('normal control 8',
   [[['PHYS110', 'R3', 0], ['MATH101', 'R3', 0], ['MATH101', 'R4', 2], ['PHYS110', 'R4', 0],
     ['PHYS110', 'R2', 1], ['PHYS110', 'R2', 0], ['MATH101H', 'R4', 0], ['PHYS110', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],
    ['room_load', 'R3', 0], ['room_load', 'R4', 0]])],
 [('regression: multi period rows 1',
   [[['A', 'R1', 0], ['A', 'R3', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['split_buildings', 'A']]),
  ('regression variant: multi period rows 2',
   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],
     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),
  ('partial repair guard 3',
   [[['PHYS110', 'R1', 0], ['MATH101', 'R3', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R4', 1],
     ['PHYS110', 'R3', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),
  ('normal control 4',
   [[['PHYS110', 'R2', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 1], ['MATH101', 'R1', 1],
     ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120']]),
  ('normal control 5',
   [[['MATH101H', 'R3', 0], ['CHEM120', 'R3', 1], ['MATH101', 'R4', 2], ['CHEM120', 'R3', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('normal control 6',
   [[['MATH101', 'R1', 2], ['PHYS110', 'R1', 1], ['CHEM120', 'R2', 1], ['MATH101H', 'R3', 0],
     ['MATH101', 'R1', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101'], ['room_load', 'R1', 1]]),
  ('normal control 7',
   [[['MATH101', 'R4', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R3', 2], ['CHEM120', 'R3', 2],
     ['PHYS110', 'R2', 2], ['CHEM120', 'R4', 2], ['PHYS110', 'R1', 1], ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110'],
    ['split_buildings', 'PHYS110']]),
  ('normal control 8',
   [[['PHYS110', 'R4', 0], ['MATH101H', 'R3', 2], ['MATH101', 'R4', 1], ['MATH101', 'R3', 2],
     ['MATH101', 'R4', 1], ['CHEM120', 'R1', 2], ['CHEM120', 'R3', 1], ['CHEM120', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],
    ['room_load', 'R3', 2]])],
 [('regression: multi period rows 1',
   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('regression variant: multi period rows 2',
   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),
  ('partial repair guard 3',
   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],
     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R1', 2]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'A']]),
  ('normal control 5',
   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101H', 'R3', 2], ['PHYS110', 'R3', 0],
     ['MATH101H', 'R1', 0], ['MATH101H', 'R3', 0], ['MATH101H', 'R4', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H']]),
  ('normal control 6',
   [[['PHYS110', 'R1', 2], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 7',
   [[['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0], ['PHYS110', 'R1', 2], ['PHYS110', 'R1', 1],
     ['CHEM120', 'R1', 0], ['PHYS110', 'R3', 0], ['MATH101H', 'R4', 1], ['MATH101', 'R1', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['split_buildings', 'MATH101H'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],
    ['room_load', 'R1', 1]]),
  ('normal control 8',
   [[['PHYS110', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101H', 'R4', 0], ['MATH101H', 'R3', 1],
     ['PHYS110', 'R3', 2], ['PHYS110', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']])],
 [('regression: multi period rows 1',
   [[['MATH101H', 'R3', 1], ['MATH101', 'R2', 0], ['MATH101', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('regression variant: multi period rows 2',
   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],
     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),
  ('partial repair guard 3',
   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('normal control 5',
   [[['PHYS110', 'R2', 0], ['MATH101', 'R1', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 6',
   [[['MATH101', 'R2', 0], ['MATH101', 'R1', 0], ['MATH101', 'R1', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 7',
   [[['PHYS110', 'R2', 2], ['CHEM120', 'R4', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 8',
   [[['PHYS110', 'R4', 2], ['PHYS110', 'R2', 2], ['MATH101', 'R3', 0], ['PHYS110', 'R2', 0],
     ['PHYS110', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']])],
 [('regression: multi period rows 1',
   [[['MATH101', 'R2', 2], ['MATH101H', 'R2', 1], ['MATH101', 'R2', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   []),
  ('regression variant: multi period rows 2',
   [[['CHEM120', 'R2', 0], ['MATH101', 'R1', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R4', 1],
     ['PHYS110', 'R1', 2], ['MATH101', 'R4', 1], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 2],
     ['CHEM120', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110']]),
  ('partial repair guard 3',
   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],
     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),
  ('boundary control 4',
   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),
  ('normal control 5',
   [[['MATH101H', 'R1', 1], ['PHYS110', 'R3', 2], ['MATH101', 'R3', 0], ['MATH101', 'R2', 2],
     ['MATH101H', 'R3', 1], ['PHYS110', 'R1', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['split_buildings', 'MATH101H'],
    ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R1', 1]]),
  ('normal control 6',
   [[['CHEM120', 'R4', 1], ['MATH101H', 'R1', 1], ['MATH101', 'R2', 1], ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   []),
  ('normal control 7',
   [[['CHEM120', 'R3', 2], ['MATH101', 'R3', 2], ['PHYS110', 'R1', 2], ['MATH101H', 'R1', 0],
     ['MATH101H', 'R3', 2], ['MATH101', 'R3', 2]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H'], ['room_load', 'R3', 2]]),
  ('normal control 8',
   [[['CHEM120', 'R2', 1], ['MATH101', 'R2', 1], ['MATH101', 'R3', 2], ['CHEM120', 'R1', 2],
     ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 2], ['MATH101', 'R4', 1], ['PHYS110', 'R2', 0],
     ['MATH101', 'R2', 1]],
    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],
   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],
    ['split_buildings', 'MATH101'], ['room_load', 'R2', 1]])]]
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: multi period rows 1[][]Passed
regression variant: multi period rows 2[][]Passed
partial repair guard 3[['multi_period', 'CHEM120']][['multi_period', 'CHEM120']]Passed
boundary control 4[['multi_period', 'A']][['multi_period', 'A']]Passed
normal control 5[['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']][['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']]Passed
normal control 6[['multi_period', 'MATH101'], ['split_buildings', 'MATH101']][['multi_period', 'MATH101'], ['split_buildings', 'MATH101']]Passed
normal control 7[['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']][['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']]Passed
normal control 8[['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R3', 0], ['room_load', 'R4', 0]][['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R3', 0], ['room_load', 'R4', 0]]Passed

SHA-256 / 807e8d5c1db686be25bd65828067ab4d389304976063c32d84c42f76b0031c10

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

Case digest / 277a7df452d4d98a8a7ee8459091031580c2d7cca599e37f77d68b23089dc1d6