FAILURE MAP
← Case archive

FA-94821 / Exam timetabling constraints / Open access

Room split reported as a period conflict · case 01

Exams split across rooms in one period are listed as conflicts.

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

ROOT CAUSE

Periods are collected per row instead of distinct.

VERIFIED REPAIR

Collect distinct periods per exam.

Unsuccessful approach: Requiring three periods misses two-period conflicts.

Case contract

exams = required exam ids; assign [exam, room, period]. Return missing (required but unassigned), unknown (assigned but not required) and conflict (assigned to more than one distinct period; a split across rooms in one period is fine), each sorted.

Why this case matters

Completeness checks catch exams dropped or duplicated when merging timetable drafts.

1 / The failure

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

N = 1
observations = []
def solve(exams, assign):
    req = set(exams)
    per = {}
    for ex, r, p in assign:
        per.setdefault(ex, []).append(p)
    return {'missing': sorted(req - set(per)), 'unknown': sorted(set(per) - req),
            'conflict': sorted(ex for ex in per if len(per[ex]) > 1)}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: split conflict 1', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('regression variant: split conflict 2',
   [['ECON150', 'PHYS110', 'MATH101H', 'MATH101', 'CHEM120'],
    [['ECON150', 'R2', 2], ['BIO130', 'R1', 1], ['MATH101', 'R2', 2], ['MATH101', 'R2', 1],
     ['CHEM120', 'R2', 0], ['HIST140', 'R1', 2], ['HIST140', 'R2', 2]]],
   {'missing': ['MATH101H', 'PHYS110'], 'unknown': ['BIO130', 'HIST140'], 'conflict': ['MATH101']}),
  ('partial repair guard 3',
   [['CHEM120', 'HIST140', 'ECON150', 'BIO130', 'MATH101H', 'MATH101'],
    [['BIO130', 'R2', 2], ['MATH101H', 'R1', 1], ['MATH101', 'R1', 1], ['HIST140', 'R1', 0],
     ['HIST140', 'R1', 2]]],
   {'missing': ['CHEM120', 'ECON150'], 'unknown': [], 'conflict': ['HIST140']}),
  ('boundary control 4', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('normal control 5',
   [['PHYS110', 'BIO130', 'MATH101', 'ECON150', 'CHEM120'],
    [['MATH101', 'R1', 2], ['PHYS110', 'R2', 2], ['CHEM120', 'R2', 1], ['BIO130', 'R2', 1],
     ['CHEM120', 'R2', 2], ['MATH101H', 'R1', 2], ['CHEM120', 'R2', 2]]],
   {'missing': ['ECON150'], 'unknown': ['MATH101H'], 'conflict': ['CHEM120']}),
  ('normal control 6',
   [['MATH101', 'ECON150', 'PHYS110', 'MATH101H'], [['ECON150', 'R1', 0], ['MATH101', 'R1', 0]]],
   {'missing': ['MATH101H', 'PHYS110'], 'unknown': [], 'conflict': []}),
  ('normal control 7',
   [['CHEM120', 'PHYS110', 'MATH101H', 'MATH101', 'HIST140', 'BIO130'],
    [['BIO130', 'R2', 2], ['HIST140', 'R1', 0], ['ECON150', 'R2', 2], ['PHYS110', 'R1', 2],
     ['PHYS110', 'R2', 1], ['HIST140', 'R2', 1]]],
   {'missing': ['CHEM120', 'MATH101', 'MATH101H'],
    'unknown': ['ECON150'],
    'conflict': ['HIST140', 'PHYS110']}),
  ('normal control 8',
   [['HIST140', 'ECON150', 'MATH101', 'MATH101H'],
    [['HIST140', 'R2', 0], ['MATH101H', 'R2', 2], ['PHYS110', 'R1', 1]]],
   {'missing': ['ECON150', 'MATH101'], 'unknown': ['PHYS110'], 'conflict': []})],
 [('regression: split conflict 1',
   [['MATH101H', 'MATH101', 'ECON150', 'HIST140'],
    [['HIST140', 'R1', 1], ['BIO130', 'R1', 1], ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 0],
     ['MATH101H', 'R1', 0], ['HIST140', 'R2', 1]]],
   {'missing': ['ECON150', 'MATH101'], 'unknown': ['BIO130', 'CHEM120'], 'conflict': ['CHEM120']}),
  ('regression variant: split conflict 2',
   [['BIO130', 'MATH101', 'ECON150', 'MATH101H'],
    [['MATH101', 'R1', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R1', 2]]],
   {'missing': ['BIO130', 'ECON150', 'MATH101H'], 'unknown': ['CHEM120'], 'conflict': []}),
  ('partial repair guard 3',
   [['ECON150', 'HIST140', 'PHYS110', 'MATH101'],
    [['CHEM120', 'R2', 0], ['CHEM120', 'R1', 2], ['HIST140', 'R1', 0]]],
   {'missing': ['ECON150', 'MATH101', 'PHYS110'], 'unknown': ['CHEM120'], 'conflict': ['CHEM120']}),
  ('boundary control 4', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('boundary control 5', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('normal control 6',
   [['HIST140', 'ECON150'],
    [['HIST140', 'R2', 0], ['ECON150', 'R1', 1], ['MATH101H', 'R2', 2], ['BIO130', 'R2', 0],
     ['MATH101H', 'R2', 2]]],
   {'missing': [], 'unknown': ['BIO130', 'MATH101H'], 'conflict': []}),
  ('normal control 7',
   [['MATH101H', 'PHYS110', 'HIST140'],
    [['PHYS110', 'R2', 1], ['MATH101H', 'R2', 2], ['HIST140', 'R1', 0], ['MATH101H', 'R1', 0],
     ['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0]]],
   {'missing': [], 'unknown': ['CHEM120'], 'conflict': ['MATH101H', 'PHYS110']}),
  ('normal control 8',
   [['CHEM120', 'MATH101', 'ECON150', 'MATH101H', 'BIO130', 'PHYS110'],
    [['HIST140', 'R2', 2], ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 0]]],
   {'missing': ['BIO130', 'ECON150', 'MATH101', 'MATH101H', 'PHYS110'],
    'unknown': ['HIST140'],
    'conflict': ['CHEM120']})],
 [('regression: split conflict 1',
   [['MATH101', 'MATH101H'],
    [['ECON150', 'R1', 1], ['MATH101H', 'R2', 0], ['MATH101', 'R1', 0], ['PHYS110', 'R1', 1],
     ['ECON150', 'R1', 1], ['PHYS110', 'R1', 2]]],
   {'missing': [], 'unknown': ['ECON150', 'PHYS110'], 'conflict': ['PHYS110']}),
  ('regression variant: split conflict 2',
   [['ECON150', 'HIST140', 'CHEM120'],
    [['MATH101H', 'R1', 0], ['MATH101', 'R1', 0], ['PHYS110', 'R2', 1], ['BIO130', 'R2', 2],
     ['ECON150', 'R2', 2], ['MATH101', 'R1', 0]]],
   {'missing': ['CHEM120', 'HIST140'],
    'unknown': ['BIO130', 'MATH101', 'MATH101H', 'PHYS110'],
    'conflict': []}),
  ('partial repair guard 3',
   [['MATH101H', 'ECON150'],
    [['HIST140', 'R2', 2], ['MATH101H', 'R2', 0], ['MATH101', 'R2', 1], ['MATH101H', 'R1', 1],
     ['MATH101H', 'R1', 0], ['MATH101', 'R1', 1]]],
   {'missing': ['ECON150'], 'unknown': ['HIST140', 'MATH101'], 'conflict': ['MATH101H']}),
  ('boundary control 4', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('boundary control 5', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('normal control 6',
   [['PHYS110', 'MATH101H'],
    [['PHYS110', 'R2', 1], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 1], ['CHEM120', 'R1', 2]]],
   {'missing': ['MATH101H'], 'unknown': ['CHEM120', 'ECON150'], 'conflict': []}),
  ('normal control 7',
   [['HIST140', 'ECON150'],
    [['HIST140', 'R2', 0], ['ECON150', 'R1', 1], ['MATH101H', 'R2', 2], ['BIO130', 'R2', 0],
     ['MATH101H', 'R2', 2]]],
   {'missing': [], 'unknown': ['BIO130', 'MATH101H'], 'conflict': []}),
  ('normal control 8',
   [['ECON150', 'PHYS110', 'BIO130'], [['CHEM120', 'R1', 1], ['PHYS110', 'R1', 0], ['MATH101H', 'R2', 2]]],
   {'missing': ['BIO130', 'ECON150'], 'unknown': ['CHEM120', 'MATH101H'], 'conflict': []})],
 [('regression: split conflict 1',
   [['PHYS110', 'MATH101H', 'HIST140', 'CHEM120'],
    [['PHYS110', 'R2', 1], ['BIO130', 'R2', 0], ['PHYS110', 'R2', 1], ['MATH101H', 'R1', 0],
     ['MATH101', 'R1', 2], ['ECON150', 'R2', 1], ['HIST140', 'R1', 0]]],
   {'missing': ['CHEM120'], 'unknown': ['BIO130', 'ECON150', 'MATH101'], 'conflict': []}),
  ('regression variant: split conflict 2',
   [['HIST140', 'CHEM120', 'MATH101H', 'BIO130', 'MATH101'],
    [['PHYS110', 'R1', 1], ['MATH101H', 'R2', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R1', 0],
     ['HIST140', 'R1', 2], ['ECON150', 'R2', 1], ['BIO130', 'R2', 1]]],
   {'missing': ['CHEM120'], 'unknown': ['ECON150', 'PHYS110'], 'conflict': []}),
  ('partial repair guard 3',
   [['HIST140', 'PHYS110', 'MATH101H', 'MATH101', 'BIO130', 'CHEM120'],
    [['BIO130', 'R2', 1], ['MATH101H', 'R1', 2], ['MATH101H', 'R2', 0]]],
   {'missing': ['CHEM120', 'HIST140', 'MATH101', 'PHYS110'], 'unknown': [], 'conflict': ['MATH101H']}),
  ('boundary control 4', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('boundary control 5', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('normal control 6',
   [['CHEM120', 'PHYS110', 'HIST140', 'BIO130'],
    [['BIO130', 'R2', 0], ['MATH101', 'R2', 1], ['CHEM120', 'R2', 1], ['BIO130', 'R2', 1],
     ['MATH101H', 'R2', 1], ['ECON150', 'R1', 2], ['CHEM120', 'R2', 0]]],
   {'missing': ['HIST140', 'PHYS110'],
    'unknown': ['ECON150', 'MATH101', 'MATH101H'],
    'conflict': ['BIO130', 'CHEM120']}),
  ('normal control 7',
   [['CHEM120', 'MATH101', 'BIO130'],
    [['CHEM120', 'R1', 2], ['MATH101', 'R2', 1], ['CHEM120', 'R1', 1], ['ECON150', 'R1', 0],
     ['ECON150', 'R1', 1]]],
   {'missing': ['BIO130'], 'unknown': ['ECON150'], 'conflict': ['CHEM120', 'ECON150']}),
  ('normal control 8',
   [['MATH101', 'HIST140', 'PHYS110', 'BIO130', 'CHEM120', 'MATH101H'],
    [['CHEM120', 'R1', 1], ['MATH101', 'R1', 0], ['CHEM120', 'R2', 1], ['MATH101H', 'R2', 2],
     ['PHYS110', 'R1', 0], ['HIST140', 'R1', 2]]],
   {'missing': ['BIO130'], 'unknown': [], 'conflict': []})],
 [('regression: split conflict 1',
   [['BIO130', 'CHEM120', 'MATH101', 'HIST140'],
    [['PHYS110', 'R1', 1], ['MATH101', 'R2', 0], ['PHYS110', 'R1', 1], ['ECON150', 'R2', 1],
     ['MATH101', 'R2', 0]]],
   {'missing': ['BIO130', 'CHEM120', 'HIST140'], 'unknown': ['ECON150', 'PHYS110'], 'conflict': []}),
  ('regression variant: split conflict 2',
   [['CHEM120', 'PHYS110', 'ECON150', 'HIST140', 'MATH101H'],
    [['PHYS110', 'R2', 2], ['HIST140', 'R2', 1], ['ECON150', 'R1', 1], ['MATH101', 'R1', 0],
     ['HIST140', 'R2', 1]]],
   {'missing': ['CHEM120', 'MATH101H'], 'unknown': ['MATH101'], 'conflict': []}),
  ('partial repair guard 3',
   [['HIST140', 'PHYS110', 'MATH101', 'BIO130', 'MATH101H', 'ECON150'],
    [['MATH101', 'R2', 2], ['BIO130', 'R2', 1], ['MATH101', 'R2', 0], ['HIST140', 'R1', 0],
     ['BIO130', 'R2', 2]]],
   {'missing': ['ECON150', 'MATH101H', 'PHYS110'], 'unknown': [], 'conflict': ['BIO130', 'MATH101']}),
  ('boundary control 4', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('boundary control 5', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('normal control 6',
   [['PHYS110', 'HIST140'], [['CHEM120', 'R1', 2], ['PHYS110', 'R1', 2], ['MATH101', 'R2', 0]]],
   {'missing': ['HIST140'], 'unknown': ['CHEM120', 'MATH101'], 'conflict': []}),
  ('normal control 7',
   [['ECON150', 'MATH101', 'MATH101H'], [['PHYS110', 'R1', 1], ['CHEM120', 'R2', 1], ['BIO130', 'R1', 0]]],
   {'missing': ['ECON150', 'MATH101', 'MATH101H'],
    'unknown': ['BIO130', 'CHEM120', 'PHYS110'],
    'conflict': []}),
  ('normal control 8',
   [['HIST140', 'ECON150'], [['HIST140', 'R1', 1], ['PHYS110', 'R2', 0], ['MATH101', 'R2', 1]]],
   {'missing': ['ECON150'], 'unknown': ['MATH101', 'PHYS110'], 'conflict': []})]]
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: split conflict 1{'conflict': ['A'], 'missing': ['B'], 'unknown': []}{'conflict': [], 'missing': ['B'], 'unknown': []}Failed
regression variant: split conflict 2{'conflict': ['HIST140', 'MATH101'], 'missing': ['MATH101H', 'PHYS110'], 'unknown': ['BIO130', 'HIST140']}{'conflict': ['MATH101'], 'missing': ['MATH101H', 'PHYS110'], 'unknown': ['BIO130', 'HIST140']}Failed
partial repair guard 3{'conflict': ['HIST140'], 'missing': ['CHEM120', 'ECON150'], 'unknown': []}{'conflict': ['HIST140'], 'missing': ['CHEM120', 'ECON150'], 'unknown': []}Passed
boundary control 4{'conflict': ['A'], 'missing': [], 'unknown': ['C']}{'conflict': ['A'], 'missing': [], 'unknown': ['C']}Passed
normal control 5{'conflict': ['CHEM120'], 'missing': ['ECON150'], 'unknown': ['MATH101H']}{'conflict': ['CHEM120'], 'missing': ['ECON150'], 'unknown': ['MATH101H']}Passed
normal control 6{'conflict': [], 'missing': ['MATH101H', 'PHYS110'], 'unknown': []}{'conflict': [], 'missing': ['MATH101H', 'PHYS110'], 'unknown': []}Passed
normal control 7{'conflict': ['HIST140', 'PHYS110'], 'missing': ['CHEM120', 'MATH101', 'MATH101H'], 'unknown': ['ECON150']}{'conflict': ['HIST140', 'PHYS110'], 'missing': ['CHEM120', 'MATH101', 'MATH101H'], 'unknown': ['ECON150']}Passed
normal control 8{'conflict': [], 'missing': ['ECON150', 'MATH101'], 'unknown': ['PHYS110']}{'conflict': [], 'missing': ['ECON150', 'MATH101'], 'unknown': ['PHYS110']}Passed

SHA-256 / cff1f32270d97ffa90eb32d092350489d987b514dbd3905a9e7a560ba49a7b9b

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(exams, assign):
    req = set(exams)
    per = {}
    for ex, r, p in assign:
        per.setdefault(ex, set()).add(p)
    return {'missing': sorted(req - set(per)), 'unknown': sorted(set(per) - req),
            'conflict': sorted(ex for ex in per if len(per[ex]) > 2)}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: split conflict 1', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('regression variant: split conflict 2',
   [['ECON150', 'PHYS110', 'MATH101H', 'MATH101', 'CHEM120'],
    [['ECON150', 'R2', 2], ['BIO130', 'R1', 1], ['MATH101', 'R2', 2], ['MATH101', 'R2', 1],
     ['CHEM120', 'R2', 0], ['HIST140', 'R1', 2], ['HIST140', 'R2', 2]]],
   {'missing': ['MATH101H', 'PHYS110'], 'unknown': ['BIO130', 'HIST140'], 'conflict': ['MATH101']}),
  ('partial repair guard 3',
   [['CHEM120', 'HIST140', 'ECON150', 'BIO130', 'MATH101H', 'MATH101'],
    [['BIO130', 'R2', 2], ['MATH101H', 'R1', 1], ['MATH101', 'R1', 1], ['HIST140', 'R1', 0],
     ['HIST140', 'R1', 2]]],
   {'missing': ['CHEM120', 'ECON150'], 'unknown': [], 'conflict': ['HIST140']}),
  ('boundary control 4', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('normal control 5',
   [['PHYS110', 'BIO130', 'MATH101', 'ECON150', 'CHEM120'],
    [['MATH101', 'R1', 2], ['PHYS110', 'R2', 2], ['CHEM120', 'R2', 1], ['BIO130', 'R2', 1],
     ['CHEM120', 'R2', 2], ['MATH101H', 'R1', 2], ['CHEM120', 'R2', 2]]],
   {'missing': ['ECON150'], 'unknown': ['MATH101H'], 'conflict': ['CHEM120']}),
  ('normal control 6',
   [['MATH101', 'ECON150', 'PHYS110', 'MATH101H'], [['ECON150', 'R1', 0], ['MATH101', 'R1', 0]]],
   {'missing': ['MATH101H', 'PHYS110'], 'unknown': [], 'conflict': []}),
  ('normal control 7',
   [['CHEM120', 'PHYS110', 'MATH101H', 'MATH101', 'HIST140', 'BIO130'],
    [['BIO130', 'R2', 2], ['HIST140', 'R1', 0], ['ECON150', 'R2', 2], ['PHYS110', 'R1', 2],
     ['PHYS110', 'R2', 1], ['HIST140', 'R2', 1]]],
   {'missing': ['CHEM120', 'MATH101', 'MATH101H'],
    'unknown': ['ECON150'],
    'conflict': ['HIST140', 'PHYS110']}),
  ('normal control 8',
   [['HIST140', 'ECON150', 'MATH101', 'MATH101H'],
    [['HIST140', 'R2', 0], ['MATH101H', 'R2', 2], ['PHYS110', 'R1', 1]]],
   {'missing': ['ECON150', 'MATH101'], 'unknown': ['PHYS110'], 'conflict': []})],
 [('regression: split conflict 1',
   [['MATH101H', 'MATH101', 'ECON150', 'HIST140'],
    [['HIST140', 'R1', 1], ['BIO130', 'R1', 1], ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 0],
     ['MATH101H', 'R1', 0], ['HIST140', 'R2', 1]]],
   {'missing': ['ECON150', 'MATH101'], 'unknown': ['BIO130', 'CHEM120'], 'conflict': ['CHEM120']}),
  ('regression variant: split conflict 2',
   [['BIO130', 'MATH101', 'ECON150', 'MATH101H'],
    [['MATH101', 'R1', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R1', 2]]],
   {'missing': ['BIO130', 'ECON150', 'MATH101H'], 'unknown': ['CHEM120'], 'conflict': []}),
  ('partial repair guard 3',
   [['ECON150', 'HIST140', 'PHYS110', 'MATH101'],
    [['CHEM120', 'R2', 0], ['CHEM120', 'R1', 2], ['HIST140', 'R1', 0]]],
   {'missing': ['ECON150', 'MATH101', 'PHYS110'], 'unknown': ['CHEM120'], 'conflict': ['CHEM120']}),
  ('boundary control 4', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('boundary control 5', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('normal control 6',
   [['HIST140', 'ECON150'],
    [['HIST140', 'R2', 0], ['ECON150', 'R1', 1], ['MATH101H', 'R2', 2], ['BIO130', 'R2', 0],
     ['MATH101H', 'R2', 2]]],
   {'missing': [], 'unknown': ['BIO130', 'MATH101H'], 'conflict': []}),
  ('normal control 7',
   [['MATH101H', 'PHYS110', 'HIST140'],
    [['PHYS110', 'R2', 1], ['MATH101H', 'R2', 2], ['HIST140', 'R1', 0], ['MATH101H', 'R1', 0],
     ['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0]]],
   {'missing': [], 'unknown': ['CHEM120'], 'conflict': ['MATH101H', 'PHYS110']}),
  ('normal control 8',
   [['CHEM120', 'MATH101', 'ECON150', 'MATH101H', 'BIO130', 'PHYS110'],
    [['HIST140', 'R2', 2], ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 0]]],
   {'missing': ['BIO130', 'ECON150', 'MATH101', 'MATH101H', 'PHYS110'],
    'unknown': ['HIST140'],
    'conflict': ['CHEM120']})],
 [('regression: split conflict 1',
   [['MATH101', 'MATH101H'],
    [['ECON150', 'R1', 1], ['MATH101H', 'R2', 0], ['MATH101', 'R1', 0], ['PHYS110', 'R1', 1],
     ['ECON150', 'R1', 1], ['PHYS110', 'R1', 2]]],
   {'missing': [], 'unknown': ['ECON150', 'PHYS110'], 'conflict': ['PHYS110']}),
  ('regression variant: split conflict 2',
   [['ECON150', 'HIST140', 'CHEM120'],
    [['MATH101H', 'R1', 0], ['MATH101', 'R1', 0], ['PHYS110', 'R2', 1], ['BIO130', 'R2', 2],
     ['ECON150', 'R2', 2], ['MATH101', 'R1', 0]]],
   {'missing': ['CHEM120', 'HIST140'],
    'unknown': ['BIO130', 'MATH101', 'MATH101H', 'PHYS110'],
    'conflict': []}),
  ('partial repair guard 3',
   [['MATH101H', 'ECON150'],
    [['HIST140', 'R2', 2], ['MATH101H', 'R2', 0], ['MATH101', 'R2', 1], ['MATH101H', 'R1', 1],
     ['MATH101H', 'R1', 0], ['MATH101', 'R1', 1]]],
   {'missing': ['ECON150'], 'unknown': ['HIST140', 'MATH101'], 'conflict': ['MATH101H']}),
  ('boundary control 4', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('boundary control 5', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('normal control 6',
   [['PHYS110', 'MATH101H'],
    [['PHYS110', 'R2', 1], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 1], ['CHEM120', 'R1', 2]]],
   {'missing': ['MATH101H'], 'unknown': ['CHEM120', 'ECON150'], 'conflict': []}),
  ('normal control 7',
   [['HIST140', 'ECON150'],
    [['HIST140', 'R2', 0], ['ECON150', 'R1', 1], ['MATH101H', 'R2', 2], ['BIO130', 'R2', 0],
     ['MATH101H', 'R2', 2]]],
   {'missing': [], 'unknown': ['BIO130', 'MATH101H'], 'conflict': []}),
  ('normal control 8',
   [['ECON150', 'PHYS110', 'BIO130'], [['CHEM120', 'R1', 1], ['PHYS110', 'R1', 0], ['MATH101H', 'R2', 2]]],
   {'missing': ['BIO130', 'ECON150'], 'unknown': ['CHEM120', 'MATH101H'], 'conflict': []})],
 [('regression: split conflict 1',
   [['PHYS110', 'MATH101H', 'HIST140', 'CHEM120'],
    [['PHYS110', 'R2', 1], ['BIO130', 'R2', 0], ['PHYS110', 'R2', 1], ['MATH101H', 'R1', 0],
     ['MATH101', 'R1', 2], ['ECON150', 'R2', 1], ['HIST140', 'R1', 0]]],
   {'missing': ['CHEM120'], 'unknown': ['BIO130', 'ECON150', 'MATH101'], 'conflict': []}),
  ('regression variant: split conflict 2',
   [['HIST140', 'CHEM120', 'MATH101H', 'BIO130', 'MATH101'],
    [['PHYS110', 'R1', 1], ['MATH101H', 'R2', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R1', 0],
     ['HIST140', 'R1', 2], ['ECON150', 'R2', 1], ['BIO130', 'R2', 1]]],
   {'missing': ['CHEM120'], 'unknown': ['ECON150', 'PHYS110'], 'conflict': []}),
  ('partial repair guard 3',
   [['HIST140', 'PHYS110', 'MATH101H', 'MATH101', 'BIO130', 'CHEM120'],
    [['BIO130', 'R2', 1], ['MATH101H', 'R1', 2], ['MATH101H', 'R2', 0]]],
   {'missing': ['CHEM120', 'HIST140', 'MATH101', 'PHYS110'], 'unknown': [], 'conflict': ['MATH101H']}),
  ('boundary control 4', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('boundary control 5', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('normal control 6',
   [['CHEM120', 'PHYS110', 'HIST140', 'BIO130'],
    [['BIO130', 'R2', 0], ['MATH101', 'R2', 1], ['CHEM120', 'R2', 1], ['BIO130', 'R2', 1],
     ['MATH101H', 'R2', 1], ['ECON150', 'R1', 2], ['CHEM120', 'R2', 0]]],
   {'missing': ['HIST140', 'PHYS110'],
    'unknown': ['ECON150', 'MATH101', 'MATH101H'],
    'conflict': ['BIO130', 'CHEM120']}),
  ('normal control 7',
   [['CHEM120', 'MATH101', 'BIO130'],
    [['CHEM120', 'R1', 2], ['MATH101', 'R2', 1], ['CHEM120', 'R1', 1], ['ECON150', 'R1', 0],
     ['ECON150', 'R1', 1]]],
   {'missing': ['BIO130'], 'unknown': ['ECON150'], 'conflict': ['CHEM120', 'ECON150']}),
  ('normal control 8',
   [['MATH101', 'HIST140', 'PHYS110', 'BIO130', 'CHEM120', 'MATH101H'],
    [['CHEM120', 'R1', 1], ['MATH101', 'R1', 0], ['CHEM120', 'R2', 1], ['MATH101H', 'R2', 2],
     ['PHYS110', 'R1', 0], ['HIST140', 'R1', 2]]],
   {'missing': ['BIO130'], 'unknown': [], 'conflict': []})],
 [('regression: split conflict 1',
   [['BIO130', 'CHEM120', 'MATH101', 'HIST140'],
    [['PHYS110', 'R1', 1], ['MATH101', 'R2', 0], ['PHYS110', 'R1', 1], ['ECON150', 'R2', 1],
     ['MATH101', 'R2', 0]]],
   {'missing': ['BIO130', 'CHEM120', 'HIST140'], 'unknown': ['ECON150', 'PHYS110'], 'conflict': []}),
  ('regression variant: split conflict 2',
   [['CHEM120', 'PHYS110', 'ECON150', 'HIST140', 'MATH101H'],
    [['PHYS110', 'R2', 2], ['HIST140', 'R2', 1], ['ECON150', 'R1', 1], ['MATH101', 'R1', 0],
     ['HIST140', 'R2', 1]]],
   {'missing': ['CHEM120', 'MATH101H'], 'unknown': ['MATH101'], 'conflict': []}),
  ('partial repair guard 3',
   [['HIST140', 'PHYS110', 'MATH101', 'BIO130', 'MATH101H', 'ECON150'],
    [['MATH101', 'R2', 2], ['BIO130', 'R2', 1], ['MATH101', 'R2', 0], ['HIST140', 'R1', 0],
     ['BIO130', 'R2', 2]]],
   {'missing': ['ECON150', 'MATH101H', 'PHYS110'], 'unknown': [], 'conflict': ['BIO130', 'MATH101']}),
  ('boundary control 4', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('boundary control 5', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('normal control 6',
   [['PHYS110', 'HIST140'], [['CHEM120', 'R1', 2], ['PHYS110', 'R1', 2], ['MATH101', 'R2', 0]]],
   {'missing': ['HIST140'], 'unknown': ['CHEM120', 'MATH101'], 'conflict': []}),
  ('normal control 7',
   [['ECON150', 'MATH101', 'MATH101H'], [['PHYS110', 'R1', 1], ['CHEM120', 'R2', 1], ['BIO130', 'R1', 0]]],
   {'missing': ['ECON150', 'MATH101', 'MATH101H'],
    'unknown': ['BIO130', 'CHEM120', 'PHYS110'],
    'conflict': []}),
  ('normal control 8',
   [['HIST140', 'ECON150'], [['HIST140', 'R1', 1], ['PHYS110', 'R2', 0], ['MATH101', 'R2', 1]]],
   {'missing': ['ECON150'], 'unknown': ['MATH101', 'PHYS110'], 'conflict': []})]]
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: split conflict 1{'conflict': [], 'missing': ['B'], 'unknown': []}{'conflict': [], 'missing': ['B'], 'unknown': []}Passed
regression variant: split conflict 2{'conflict': [], 'missing': ['MATH101H', 'PHYS110'], 'unknown': ['BIO130', 'HIST140']}{'conflict': ['MATH101'], 'missing': ['MATH101H', 'PHYS110'], 'unknown': ['BIO130', 'HIST140']}Failed
partial repair guard 3{'conflict': [], 'missing': ['CHEM120', 'ECON150'], 'unknown': []}{'conflict': ['HIST140'], 'missing': ['CHEM120', 'ECON150'], 'unknown': []}Failed
boundary control 4{'conflict': [], 'missing': [], 'unknown': ['C']}{'conflict': ['A'], 'missing': [], 'unknown': ['C']}Failed
normal control 5{'conflict': [], 'missing': ['ECON150'], 'unknown': ['MATH101H']}{'conflict': ['CHEM120'], 'missing': ['ECON150'], 'unknown': ['MATH101H']}Failed
normal control 6{'conflict': [], 'missing': ['MATH101H', 'PHYS110'], 'unknown': []}{'conflict': [], 'missing': ['MATH101H', 'PHYS110'], 'unknown': []}Passed
normal control 7{'conflict': [], 'missing': ['CHEM120', 'MATH101', 'MATH101H'], 'unknown': ['ECON150']}{'conflict': ['HIST140', 'PHYS110'], 'missing': ['CHEM120', 'MATH101', 'MATH101H'], 'unknown': ['ECON150']}Failed
normal control 8{'conflict': [], 'missing': ['ECON150', 'MATH101'], 'unknown': ['PHYS110']}{'conflict': [], 'missing': ['ECON150', 'MATH101'], 'unknown': ['PHYS110']}Passed

SHA-256 / 76235baf01969e0355cc1f7dc331dbe042d0cfb2f185e93bf8e2b2fb090cb932

3 / The verified repair

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

N = 1
observations = []
def solve(exams, assign):
    req = set(exams)
    per = {}
    for ex, r, p in assign:
        per.setdefault(ex, set()).add(p)
    return {'missing': sorted(req - set(per)), 'unknown': sorted(set(per) - req),
            'conflict': sorted(ex for ex in per if len(per[ex]) > 1)}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: split conflict 1', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('regression variant: split conflict 2',
   [['ECON150', 'PHYS110', 'MATH101H', 'MATH101', 'CHEM120'],
    [['ECON150', 'R2', 2], ['BIO130', 'R1', 1], ['MATH101', 'R2', 2], ['MATH101', 'R2', 1],
     ['CHEM120', 'R2', 0], ['HIST140', 'R1', 2], ['HIST140', 'R2', 2]]],
   {'missing': ['MATH101H', 'PHYS110'], 'unknown': ['BIO130', 'HIST140'], 'conflict': ['MATH101']}),
  ('partial repair guard 3',
   [['CHEM120', 'HIST140', 'ECON150', 'BIO130', 'MATH101H', 'MATH101'],
    [['BIO130', 'R2', 2], ['MATH101H', 'R1', 1], ['MATH101', 'R1', 1], ['HIST140', 'R1', 0],
     ['HIST140', 'R1', 2]]],
   {'missing': ['CHEM120', 'ECON150'], 'unknown': [], 'conflict': ['HIST140']}),
  ('boundary control 4', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('normal control 5',
   [['PHYS110', 'BIO130', 'MATH101', 'ECON150', 'CHEM120'],
    [['MATH101', 'R1', 2], ['PHYS110', 'R2', 2], ['CHEM120', 'R2', 1], ['BIO130', 'R2', 1],
     ['CHEM120', 'R2', 2], ['MATH101H', 'R1', 2], ['CHEM120', 'R2', 2]]],
   {'missing': ['ECON150'], 'unknown': ['MATH101H'], 'conflict': ['CHEM120']}),
  ('normal control 6',
   [['MATH101', 'ECON150', 'PHYS110', 'MATH101H'], [['ECON150', 'R1', 0], ['MATH101', 'R1', 0]]],
   {'missing': ['MATH101H', 'PHYS110'], 'unknown': [], 'conflict': []}),
  ('normal control 7',
   [['CHEM120', 'PHYS110', 'MATH101H', 'MATH101', 'HIST140', 'BIO130'],
    [['BIO130', 'R2', 2], ['HIST140', 'R1', 0], ['ECON150', 'R2', 2], ['PHYS110', 'R1', 2],
     ['PHYS110', 'R2', 1], ['HIST140', 'R2', 1]]],
   {'missing': ['CHEM120', 'MATH101', 'MATH101H'],
    'unknown': ['ECON150'],
    'conflict': ['HIST140', 'PHYS110']}),
  ('normal control 8',
   [['HIST140', 'ECON150', 'MATH101', 'MATH101H'],
    [['HIST140', 'R2', 0], ['MATH101H', 'R2', 2], ['PHYS110', 'R1', 1]]],
   {'missing': ['ECON150', 'MATH101'], 'unknown': ['PHYS110'], 'conflict': []})],
 [('regression: split conflict 1',
   [['MATH101H', 'MATH101', 'ECON150', 'HIST140'],
    [['HIST140', 'R1', 1], ['BIO130', 'R1', 1], ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 0],
     ['MATH101H', 'R1', 0], ['HIST140', 'R2', 1]]],
   {'missing': ['ECON150', 'MATH101'], 'unknown': ['BIO130', 'CHEM120'], 'conflict': ['CHEM120']}),
  ('regression variant: split conflict 2',
   [['BIO130', 'MATH101', 'ECON150', 'MATH101H'],
    [['MATH101', 'R1', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R1', 2]]],
   {'missing': ['BIO130', 'ECON150', 'MATH101H'], 'unknown': ['CHEM120'], 'conflict': []}),
  ('partial repair guard 3',
   [['ECON150', 'HIST140', 'PHYS110', 'MATH101'],
    [['CHEM120', 'R2', 0], ['CHEM120', 'R1', 2], ['HIST140', 'R1', 0]]],
   {'missing': ['ECON150', 'MATH101', 'PHYS110'], 'unknown': ['CHEM120'], 'conflict': ['CHEM120']}),
  ('boundary control 4', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('boundary control 5', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('normal control 6',
   [['HIST140', 'ECON150'],
    [['HIST140', 'R2', 0], ['ECON150', 'R1', 1], ['MATH101H', 'R2', 2], ['BIO130', 'R2', 0],
     ['MATH101H', 'R2', 2]]],
   {'missing': [], 'unknown': ['BIO130', 'MATH101H'], 'conflict': []}),
  ('normal control 7',
   [['MATH101H', 'PHYS110', 'HIST140'],
    [['PHYS110', 'R2', 1], ['MATH101H', 'R2', 2], ['HIST140', 'R1', 0], ['MATH101H', 'R1', 0],
     ['CHEM120', 'R2', 0], ['PHYS110', 'R1', 0]]],
   {'missing': [], 'unknown': ['CHEM120'], 'conflict': ['MATH101H', 'PHYS110']}),
  ('normal control 8',
   [['CHEM120', 'MATH101', 'ECON150', 'MATH101H', 'BIO130', 'PHYS110'],
    [['HIST140', 'R2', 2], ['CHEM120', 'R1', 1], ['CHEM120', 'R1', 0]]],
   {'missing': ['BIO130', 'ECON150', 'MATH101', 'MATH101H', 'PHYS110'],
    'unknown': ['HIST140'],
    'conflict': ['CHEM120']})],
 [('regression: split conflict 1',
   [['MATH101', 'MATH101H'],
    [['ECON150', 'R1', 1], ['MATH101H', 'R2', 0], ['MATH101', 'R1', 0], ['PHYS110', 'R1', 1],
     ['ECON150', 'R1', 1], ['PHYS110', 'R1', 2]]],
   {'missing': [], 'unknown': ['ECON150', 'PHYS110'], 'conflict': ['PHYS110']}),
  ('regression variant: split conflict 2',
   [['ECON150', 'HIST140', 'CHEM120'],
    [['MATH101H', 'R1', 0], ['MATH101', 'R1', 0], ['PHYS110', 'R2', 1], ['BIO130', 'R2', 2],
     ['ECON150', 'R2', 2], ['MATH101', 'R1', 0]]],
   {'missing': ['CHEM120', 'HIST140'],
    'unknown': ['BIO130', 'MATH101', 'MATH101H', 'PHYS110'],
    'conflict': []}),
  ('partial repair guard 3',
   [['MATH101H', 'ECON150'],
    [['HIST140', 'R2', 2], ['MATH101H', 'R2', 0], ['MATH101', 'R2', 1], ['MATH101H', 'R1', 1],
     ['MATH101H', 'R1', 0], ['MATH101', 'R1', 1]]],
   {'missing': ['ECON150'], 'unknown': ['HIST140', 'MATH101'], 'conflict': ['MATH101H']}),
  ('boundary control 4', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('boundary control 5', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('normal control 6',
   [['PHYS110', 'MATH101H'],
    [['PHYS110', 'R2', 1], ['PHYS110', 'R2', 1], ['ECON150', 'R2', 1], ['CHEM120', 'R1', 2]]],
   {'missing': ['MATH101H'], 'unknown': ['CHEM120', 'ECON150'], 'conflict': []}),
  ('normal control 7',
   [['HIST140', 'ECON150'],
    [['HIST140', 'R2', 0], ['ECON150', 'R1', 1], ['MATH101H', 'R2', 2], ['BIO130', 'R2', 0],
     ['MATH101H', 'R2', 2]]],
   {'missing': [], 'unknown': ['BIO130', 'MATH101H'], 'conflict': []}),
  ('normal control 8',
   [['ECON150', 'PHYS110', 'BIO130'], [['CHEM120', 'R1', 1], ['PHYS110', 'R1', 0], ['MATH101H', 'R2', 2]]],
   {'missing': ['BIO130', 'ECON150'], 'unknown': ['CHEM120', 'MATH101H'], 'conflict': []})],
 [('regression: split conflict 1',
   [['PHYS110', 'MATH101H', 'HIST140', 'CHEM120'],
    [['PHYS110', 'R2', 1], ['BIO130', 'R2', 0], ['PHYS110', 'R2', 1], ['MATH101H', 'R1', 0],
     ['MATH101', 'R1', 2], ['ECON150', 'R2', 1], ['HIST140', 'R1', 0]]],
   {'missing': ['CHEM120'], 'unknown': ['BIO130', 'ECON150', 'MATH101'], 'conflict': []}),
  ('regression variant: split conflict 2',
   [['HIST140', 'CHEM120', 'MATH101H', 'BIO130', 'MATH101'],
    [['PHYS110', 'R1', 1], ['MATH101H', 'R2', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R1', 0],
     ['HIST140', 'R1', 2], ['ECON150', 'R2', 1], ['BIO130', 'R2', 1]]],
   {'missing': ['CHEM120'], 'unknown': ['ECON150', 'PHYS110'], 'conflict': []}),
  ('partial repair guard 3',
   [['HIST140', 'PHYS110', 'MATH101H', 'MATH101', 'BIO130', 'CHEM120'],
    [['BIO130', 'R2', 1], ['MATH101H', 'R1', 2], ['MATH101H', 'R2', 0]]],
   {'missing': ['CHEM120', 'HIST140', 'MATH101', 'PHYS110'], 'unknown': [], 'conflict': ['MATH101H']}),
  ('boundary control 4', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('boundary control 5', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('normal control 6',
   [['CHEM120', 'PHYS110', 'HIST140', 'BIO130'],
    [['BIO130', 'R2', 0], ['MATH101', 'R2', 1], ['CHEM120', 'R2', 1], ['BIO130', 'R2', 1],
     ['MATH101H', 'R2', 1], ['ECON150', 'R1', 2], ['CHEM120', 'R2', 0]]],
   {'missing': ['HIST140', 'PHYS110'],
    'unknown': ['ECON150', 'MATH101', 'MATH101H'],
    'conflict': ['BIO130', 'CHEM120']}),
  ('normal control 7',
   [['CHEM120', 'MATH101', 'BIO130'],
    [['CHEM120', 'R1', 2], ['MATH101', 'R2', 1], ['CHEM120', 'R1', 1], ['ECON150', 'R1', 0],
     ['ECON150', 'R1', 1]]],
   {'missing': ['BIO130'], 'unknown': ['ECON150'], 'conflict': ['CHEM120', 'ECON150']}),
  ('normal control 8',
   [['MATH101', 'HIST140', 'PHYS110', 'BIO130', 'CHEM120', 'MATH101H'],
    [['CHEM120', 'R1', 1], ['MATH101', 'R1', 0], ['CHEM120', 'R2', 1], ['MATH101H', 'R2', 2],
     ['PHYS110', 'R1', 0], ['HIST140', 'R1', 2]]],
   {'missing': ['BIO130'], 'unknown': [], 'conflict': []})],
 [('regression: split conflict 1',
   [['BIO130', 'CHEM120', 'MATH101', 'HIST140'],
    [['PHYS110', 'R1', 1], ['MATH101', 'R2', 0], ['PHYS110', 'R1', 1], ['ECON150', 'R2', 1],
     ['MATH101', 'R2', 0]]],
   {'missing': ['BIO130', 'CHEM120', 'HIST140'], 'unknown': ['ECON150', 'PHYS110'], 'conflict': []}),
  ('regression variant: split conflict 2',
   [['CHEM120', 'PHYS110', 'ECON150', 'HIST140', 'MATH101H'],
    [['PHYS110', 'R2', 2], ['HIST140', 'R2', 1], ['ECON150', 'R1', 1], ['MATH101', 'R1', 0],
     ['HIST140', 'R2', 1]]],
   {'missing': ['CHEM120', 'MATH101H'], 'unknown': ['MATH101'], 'conflict': []}),
  ('partial repair guard 3',
   [['HIST140', 'PHYS110', 'MATH101', 'BIO130', 'MATH101H', 'ECON150'],
    [['MATH101', 'R2', 2], ['BIO130', 'R2', 1], ['MATH101', 'R2', 0], ['HIST140', 'R1', 0],
     ['BIO130', 'R2', 2]]],
   {'missing': ['ECON150', 'MATH101H', 'PHYS110'], 'unknown': [], 'conflict': ['BIO130', 'MATH101']}),
  ('boundary control 4', [['A'], [['A', 'R1', 0], ['A', 'R2', 1], ['C', 'R1', 0]]],
   {'missing': [], 'unknown': ['C'], 'conflict': ['A']}),
  ('boundary control 5', [['A', 'B'], [['A', 'R1', 0], ['A', 'R2', 0]]],
   {'missing': ['B'], 'unknown': [], 'conflict': []}),
  ('normal control 6',
   [['PHYS110', 'HIST140'], [['CHEM120', 'R1', 2], ['PHYS110', 'R1', 2], ['MATH101', 'R2', 0]]],
   {'missing': ['HIST140'], 'unknown': ['CHEM120', 'MATH101'], 'conflict': []}),
  ('normal control 7',
   [['ECON150', 'MATH101', 'MATH101H'], [['PHYS110', 'R1', 1], ['CHEM120', 'R2', 1], ['BIO130', 'R1', 0]]],
   {'missing': ['ECON150', 'MATH101', 'MATH101H'],
    'unknown': ['BIO130', 'CHEM120', 'PHYS110'],
    'conflict': []}),
  ('normal control 8',
   [['HIST140', 'ECON150'], [['HIST140', 'R1', 1], ['PHYS110', 'R2', 0], ['MATH101', 'R2', 1]]],
   {'missing': ['ECON150'], 'unknown': ['MATH101', 'PHYS110'], 'conflict': []})]]
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: split conflict 1{'conflict': [], 'missing': ['B'], 'unknown': []}{'conflict': [], 'missing': ['B'], 'unknown': []}Passed
regression variant: split conflict 2{'conflict': ['MATH101'], 'missing': ['MATH101H', 'PHYS110'], 'unknown': ['BIO130', 'HIST140']}{'conflict': ['MATH101'], 'missing': ['MATH101H', 'PHYS110'], 'unknown': ['BIO130', 'HIST140']}Passed
partial repair guard 3{'conflict': ['HIST140'], 'missing': ['CHEM120', 'ECON150'], 'unknown': []}{'conflict': ['HIST140'], 'missing': ['CHEM120', 'ECON150'], 'unknown': []}Passed
boundary control 4{'conflict': ['A'], 'missing': [], 'unknown': ['C']}{'conflict': ['A'], 'missing': [], 'unknown': ['C']}Passed
normal control 5{'conflict': ['CHEM120'], 'missing': ['ECON150'], 'unknown': ['MATH101H']}{'conflict': ['CHEM120'], 'missing': ['ECON150'], 'unknown': ['MATH101H']}Passed
normal control 6{'conflict': [], 'missing': ['MATH101H', 'PHYS110'], 'unknown': []}{'conflict': [], 'missing': ['MATH101H', 'PHYS110'], 'unknown': []}Passed
normal control 7{'conflict': ['HIST140', 'PHYS110'], 'missing': ['CHEM120', 'MATH101', 'MATH101H'], 'unknown': ['ECON150']}{'conflict': ['HIST140', 'PHYS110'], 'missing': ['CHEM120', 'MATH101', 'MATH101H'], 'unknown': ['ECON150']}Passed
normal control 8{'conflict': [], 'missing': ['ECON150', 'MATH101'], 'unknown': ['PHYS110']}{'conflict': [], 'missing': ['ECON150', 'MATH101'], 'unknown': ['PHYS110']}Passed

SHA-256 / a703ef0ecc34330fb1a781abb32c1c564f9ed42201bd005fa72e1770f0117d57

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

Case digest / d667fbd7c54cf9f6e3e7c51910bafca8e3c229e99f20e75bc2378d7586e24430