FAILURE MAP
← Case archive

FA-94381 / Exam timetabling constraints / Open access

Student periods listed in exam-code order before differencing · case 01

Pairs with the later exam first produce negative distances and are ignored.

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

ROOT CAUSE

Periods are ordered by exam id rather than chronologically.

VERIFIED REPAIR

Sort each student's periods ascending before taking differences.

Unsuccessful approach: Descending order makes every distance negative.

Case contract

Periods are numbered consecutively with spd slots per day (day = p // spd). For each student and each pair of their distinct exams: same day and adjacent periods counts two-in-a-row; same day and further apart counts two-in-a-day (same-period clashes count neither); periods 1..spread apart count period spread regardless of day. w = [row weight, day weight, spread]. Return [row, day, spread count, weighted total].

Why this case matters

Proximity soft constraints are what exam timetabling quality is judged on; each counter has its own boundary.

1 / The failure

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

N = 1
observations = []
def solve(enrol, period, spd, w):
    wr, wd, spread = w
    by = {}
    for st, ex in enrol:
        by.setdefault(st, set()).add(ex)
    row = day = spr = 0
    for st in by:
        ps = [period[e] for e in sorted(by[st])]
        for i in range(len(ps)):
            for j in range(i + 1, len(ps)):
                a, b = ps[i], ps[j]
                if a // spd == b // spd:
                    if b - a == 1:
                        row += 1
                    elif b - a > 1:
                        day += 1
                if 0 < b - a <= spread:
                    spr += 1
    return [row, day, spr, row * wr + day * wd + spr]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: period sort 1',
   [[['s1', 'ECON150'], ['s2', 'MATH101'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s2', 'HIST140'],
     ['s1', 'ECON150'], ['s2', 'BIO130']],
    {'MATH101': 4, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2}, 2,
    [10, 3, 2]],
   [0, 0, 4, 4]),
  ('regression variant: period sort 2',
   [[['s1', 'CHEM120'], ['s1', 'MATH101']],
    {'MATH101': 6, 'MATH101H': 1, 'PHYS110': 5, 'CHEM120': 7, 'BIO130': 5, 'HIST140': 7, 'ECON150': 8}, 3,
    [10, 1, 1]],
   [1, 0, 1, 11]),
  ('partial repair guard 3',
   [[['s5', 'BIO130'], ['s1', 'HIST140'], ['s5', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'HIST140'],
     ['s5', 'ECON150']],
    {'MATH101': 5, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, 2,
    [10, 3, 1]],
   [0, 0, 1, 1]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}, 3, [10, 2, 2]], [0, 1, 1, 3]),
  ('normal control 5',
   [[['s4', 'MATH101H'], ['s4', 'MATH101'], ['s5', 'MATH101'], ['s4', 'ECON150'], ['s4', 'PHYS110']],
    {'MATH101': 7, 'MATH101H': 4, 'PHYS110': 7, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 2, 'ECON150': 3}, 3,
    [10, 2, 4]],
   [1, 0, 5, 15]),
  ('normal control 6',
   [[['s2', 'CHEM120'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'MATH101'],
     ['s3', 'PHYS110']],
    {'MATH101': 1, 'MATH101H': 6, 'PHYS110': 6, 'CHEM120': 5, 'BIO130': 2, 'HIST140': 6, 'ECON150': 5}, 4,
    [5, 1, 2]],
   [2, 0, 2, 12]),
  ('normal control 7',
   [[['s2', 'HIST140'], ['s4', 'MATH101'], ['s2', 'HIST140'], ['s2', 'MATH101H'], ['s2', 'PHYS110'],
     ['s4', 'CHEM120'], ['s2', 'ECON150']],
    {'MATH101': 2, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 5, 'ECON150': 3}, 2,
    [10, 2, 1]],
   [0, 0, 0, 0]),
  ('normal control 8',
   [[['s5', 'ECON150']],
    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 2, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 0, 'ECON150': 5}, 2,
    [10, 3, 1]],
   [0, 0, 0, 0])],
 [('regression: period sort 1',
   [[['s2', 'HIST140'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s2', 'BIO130'], ['s1', 'HIST140'],
     ['s2', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 1, 'HIST140': 7, 'ECON150': 8}, 3,
    [5, 2, 4]],
   [2, 0, 2, 12]),
  ('regression variant: period sort 2',
   [[['s4', 'MATH101'], ['s2', 'HIST140'], ['s1', 'PHYS110'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
     ['s3', 'ECON150'], ['s3', 'BIO130'], ['s1', 'MATH101H'], ['s2', 'PHYS110'], ['s3', 'PHYS110'],
     ['s5', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101H'], ['s3', 'MATH101'],
     ['s4', 'PHYS110']],
    {'MATH101': 9, 'MATH101H': 7, 'PHYS110': 11, 'CHEM120': 8, 'BIO130': 0, 'HIST140': 7, 'ECON150': 0}, 4,
    [10, 1, 2]],
   [1, 4, 6, 20]),
  ('partial repair guard 3',
   [[['s5', 'MATH101H'], ['s1', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s1', 'ECON150'],
     ['s4', 'BIO130'], ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 6, 'CHEM120': 0, 'BIO130': 4, 'HIST140': 7, 'ECON150': 5}, 3,
    [10, 3, 4]],
   [2, 0, 3, 23]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 4, [10, 2, 2]], [1, 0, 1, 11]),
  ('normal control 5',
   [[['s2', 'HIST140'], ['s2', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 5, 'PHYS110': 3, 'CHEM120': 8, 'BIO130': 5, 'HIST140': 4, 'ECON150': 3}, 3,
    [5, 3, 1]],
   [0, 0, 0, 0]),
  ('normal control 6',
   [[['s4', 'PHYS110'], ['s5', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'PHYS110'], ['s4', 'MATH101'],
     ['s4', 'MATH101'], ['s2', 'HIST140']],
    {'MATH101': 5, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 5, 'BIO130': 4, 'HIST140': 4, 'ECON150': 2}, 2,
    [5, 2, 2]],
   [3, 0, 3, 18]),
  ('normal control 7',
   [[['s1', 'ECON150'], ['s4', 'HIST140'], ['s1', 'PHYS110'], ['s1', 'MATH101'], ['s5', 'MATH101'],
     ['s1', 'BIO130'], ['s5', 'MATH101H']],
    {'MATH101': 7, 'MATH101H': 6, 'PHYS110': 2, 'CHEM120': 2, 'BIO130': 4, 'HIST140': 6, 'ECON150': 0}, 4,
    [5, 2, 4]],
   [1, 2, 5, 14]),
  ('normal control 8',
   [[['s3', 'HIST140'], ['s5', 'CHEM120'], ['s5', 'MATH101H'], ['s5', 'MATH101'], ['s4', 'CHEM120'],
     ['s5', 'CHEM120'], ['s4', 'BIO130'], ['s5', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 7, 'ECON150': 4}, 3,
    [10, 2, 2]],
   [0, 1, 3, 5])],
 [('regression: period sort 1',
   [[['s3', 'HIST140'], ['s5', 'BIO130'], ['s3', 'BIO130'], ['s3', 'ECON150'], ['s3', 'PHYS110'],
     ['s4', 'ECON150'], ['s4', 'CHEM120']],
    {'MATH101': 9, 'MATH101H': 6, 'PHYS110': 0, 'CHEM120': 4, 'BIO130': 8, 'HIST140': 1, 'ECON150': 10}, 4,
    [5, 3, 2]],
   [1, 1, 2, 10]),
  ('regression variant: period sort 2',
   [[['s2', 'ECON150'], ['s2', 'ECON150'], ['s2', 'MATH101H'], ['s4', 'PHYS110'], ['s4', 'HIST140'],
     ['s2', 'BIO130'], ['s2', 'CHEM120']],
    {'MATH101': 11, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 11, 'BIO130': 1, 'HIST140': 10, 'ECON150': 9}, 4,
    [5, 3, 1]],
   [0, 1, 0, 3]),
  ('partial repair guard 3',
   [[['s5', 'HIST140'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s5', 'BIO130'], ['s1', 'MATH101H']],
    {'MATH101': 6, 'MATH101H': 11, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 11, 'ECON150': 3}, 4,
    [5, 3, 1]],
   [0, 1, 0, 3]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 4}, 3, [10, 2, 4]], [0, 0, 1, 1]),
  ('normal control 5',
   [[['s2', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'ECON150'], ['s1', 'MATH101'], ['s2', 'ECON150'],
     ['s4', 'BIO130'], ['s4', 'PHYS110'], ['s4', 'MATH101'], ['s4', 'ECON150'], ['s1', 'MATH101H'],
     ['s3', 'PHYS110']],
    {'MATH101': 8, 'MATH101H': 7, 'PHYS110': 6, 'CHEM120': 3, 'BIO130': 8, 'HIST140': 1, 'ECON150': 1}, 3,
    [10, 1, 2]],
   [1, 2, 4, 16]),
  ('normal control 6',
   [[['s4', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'BIO130'], ['s4', 'MATH101'], ['s1', 'BIO130']],
    {'MATH101': 8, 'MATH101H': 3, 'PHYS110': 6, 'CHEM120': 9, 'BIO130': 6, 'HIST140': 9, 'ECON150': 1}, 4,
    [10, 1, 4]],
   [1, 0, 5, 15]),
  ('normal control 7',
   [[['s3', 'ECON150'], ['s1', 'BIO130'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s2', 'BIO130'],
     ['s2', 'PHYS110'], ['s3', 'PHYS110'], ['s2', 'HIST140']],
    {'MATH101': 11, 'MATH101H': 3, 'PHYS110': 8, 'CHEM120': 8, 'BIO130': 8, 'HIST140': 1, 'ECON150': 7}, 4,
    [10, 3, 1]],
   [0, 0, 1, 1]),
  ('normal control 8',
   [[['s4', 'PHYS110'], ['s5', 'CHEM120'], ['s1', 'PHYS110'], ['s5', 'BIO130'], ['s3', 'CHEM120'],
     ['s5', 'ECON150'], ['s4', 'ECON150'], ['s4', 'MATH101H'], ['s5', 'MATH101'], ['s1', 'ECON150']],
    {'MATH101': 4, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 1, 'BIO130': 5, 'HIST140': 1, 'ECON150': 4}, 2,
    [10, 3, 1]],
   [4, 0, 4, 44])],
 [('regression: period sort 1',
   [[['s5', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'BIO130'], ['s5', 'HIST140'], ['s1', 'PHYS110'],
     ['s4', 'PHYS110'], ['s5', 'MATH101H'], ['s2', 'MATH101H'], ['s3', 'CHEM120'], ['s5', 'BIO130'],
     ['s3', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101'],
     ['s3', 'MATH101'], ['s2', 'PHYS110']],
    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 5, 'BIO130': 1, 'HIST140': 3, 'ECON150': 5}, 2,
    [10, 3, 4]],
   [3, 0, 16, 46]),
  ('regression variant: period sort 2',
   [[['s4', 'HIST140'], ['s5', 'ECON150'], ['s3', 'ECON150'], ['s4', 'BIO130'], ['s1', 'HIST140'],
     ['s2', 'MATH101H'], ['s5', 'HIST140'], ['s1', 'PHYS110'], ['s4', 'ECON150'], ['s2', 'BIO130'],
     ['s5', 'PHYS110'], ['s1', 'BIO130'], ['s2', 'PHYS110'], ['s4', 'MATH101'], ['s2', 'HIST140'],
     ['s5', 'BIO130']],
    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 5, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 0}, 2,
    [10, 3, 1]],
   [3, 0, 3, 33]),
  ('partial repair guard 3',
   [[['s3', 'HIST140'], ['s3', 'BIO130'], ['s3', 'HIST140'], ['s3', 'ECON150'], ['s5', 'ECON150'],
     ['s5', 'BIO130']],
    {'MATH101': 10, 'MATH101H': 7, 'PHYS110': 0, 'CHEM120': 0, 'BIO130': 3, 'HIST140': 11, 'ECON150': 8}, 4,
    [10, 3, 1]],
   [0, 1, 0, 3]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 1, 'PHYS110': 1}, 3, [10, 2, 2]], [0, 0, 0, 0]),
  ('normal control 5',
   [[['s1', 'HIST140'], ['s1', 'HIST140'], ['s3', 'CHEM120'], ['s3', 'MATH101H'], ['s1', 'MATH101'],
     ['s3', 'BIO130'], ['s3', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 2, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 4, 'ECON150': 2}, 3,
    [10, 3, 2]],
   [1, 0, 3, 13]),
  ('normal control 6',
   [[['s1', 'HIST140'], ['s1', 'MATH101'], ['s1', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 6, 'PHYS110': 7, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 0, 'ECON150': 4}, 3,
    [5, 1, 4]],
   [0, 1, 1, 2]),
  ('normal control 7',
   [[['s3', 'ECON150'], ['s2', 'ECON150'], ['s3', 'MATH101'], ['s4', 'PHYS110'], ['s2', 'MATH101'],
     ['s3', 'HIST140'], ['s2', 'CHEM120']],
    {'MATH101': 4, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 3, 'HIST140': 2, 'ECON150': 2}, 2,
    [10, 3, 4]],
   [1, 0, 5, 15]),
  ('normal control 8',
   [[['s1', 'CHEM120'], ['s2', 'BIO130'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s5', 'MATH101'],
     ['s5', 'HIST140'], ['s3', 'ECON150'], ['s2', 'HIST140'], ['s3', 'MATH101'], ['s4', 'ECON150']],
    {'MATH101': 9, 'MATH101H': 8, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 1, 'HIST140': 7, 'ECON150': 5}, 4,
    [5, 1, 2]],
   [2, 0, 4, 14])],
 [('regression: period sort 1',
   [[['s5', 'MATH101H'], ['s1', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s1', 'ECON150'],
     ['s4', 'BIO130'], ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 6, 'CHEM120': 0, 'BIO130': 4, 'HIST140': 7, 'ECON150': 5}, 3,
    [10, 3, 4]],
   [2, 0, 3, 23]),
  ('regression variant: period sort 2',
   [[['s1', 'BIO130'], ['s2', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'HIST140'], ['s1', 'MATH101H'],
     ['s2', 'BIO130'], ['s3', 'MATH101H'], ['s1', 'CHEM120'], ['s3', 'CHEM120'], ['s2', 'MATH101H'],
     ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 4, 'ECON150': 0}, 2,
    [5, 1, 4]],
   [4, 0, 13, 33]),
  ('partial repair guard 3',
   [[['s3', 'CHEM120'], ['s1', 'MATH101'], ['s3', 'HIST140'], ['s1', 'BIO130'], ['s1', 'PHYS110'],
     ['s2', 'BIO130'], ['s4', 'BIO130'], ['s3', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 11, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 8, 'HIST140': 5, 'ECON150': 0}, 4,
    [10, 3, 4]],
   [0, 0, 3, 3]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 3, [10, 2, 2]], [0, 0, 1, 1]),
  ('normal control 5',
   [[['s2', 'BIO130'], ['s1', 'PHYS110'], ['s4', 'ECON150'], ['s5', 'ECON150'], ['s5', 'BIO130'],
     ['s5', 'MATH101'], ['s2', 'CHEM120'], ['s4', 'MATH101'], ['s2', 'HIST140'], ['s1', 'BIO130'],
     ['s5', 'CHEM120'], ['s4', 'HIST140'], ['s1', 'HIST140'], ['s1', 'MATH101']],
    {'MATH101': 9, 'MATH101H': 11, 'PHYS110': 11, 'CHEM120': 9, 'BIO130': 1, 'HIST140': 5, 'ECON150': 11}, 4,
    [10, 1, 4]],
   [0, 4, 9, 13]),
  ('normal control 6',
   [[['s3', 'MATH101'], ['s4', 'HIST140'], ['s1', 'HIST140'], ['s3', 'PHYS110'], ['s4', 'MATH101H'],
     ['s1', 'BIO130'], ['s2', 'MATH101H'], ['s2', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 6, 'PHYS110': 4, 'CHEM120': 0, 'BIO130': 7, 'HIST140': 1, 'ECON150': 5}, 3,
    [5, 3, 2]],
   [1, 0, 1, 6]),
  ('normal control 7',
   [[['s1', 'HIST140'], ['s1', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 8}, 3,
    [10, 2, 1]],
   [0, 0, 0, 0]),
  ('normal control 8',
   [[['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s3', 'PHYS110'], ['s1', 'MATH101H'], ['s3', 'ECON150'],
     ['s1', 'HIST140'], ['s5', 'ECON150'], ['s5', 'MATH101H'], ['s1', 'ECON150']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 7, 'CHEM120': 4, 'BIO130': 3, 'HIST140': 9, 'ECON150': 6}, 4,
    [5, 1, 1]],
   [4, 3, 4, 27])]]
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: period sort 1[0, 0, 2, 2][0, 0, 4, 4]Failed
regression variant: period sort 2[0, 0, 0, 0][1, 0, 1, 11]Failed
partial repair guard 3[0, 0, 1, 1][0, 0, 1, 1]Passed
boundary control 4[0, 1, 1, 3][0, 1, 1, 3]Passed
normal control 5[1, 0, 4, 14][1, 0, 5, 15]Failed
normal control 6[2, 0, 2, 12][2, 0, 2, 12]Passed
normal control 7[0, 0, 0, 0][0, 0, 0, 0]Passed
normal control 8[0, 0, 0, 0][0, 0, 0, 0]Passed

SHA-256 / 8ef8dbfd9c9b5f893dbaf3c1813aa4bcd759f9f17d4ffe66e370db24215d7054

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(enrol, period, spd, w):
    wr, wd, spread = w
    by = {}
    for st, ex in enrol:
        by.setdefault(st, set()).add(ex)
    row = day = spr = 0
    for st in by:
        ps = sorted((period[e] for e in by[st]), reverse=True)
        for i in range(len(ps)):
            for j in range(i + 1, len(ps)):
                a, b = ps[i], ps[j]
                if a // spd == b // spd:
                    if b - a == 1:
                        row += 1
                    elif b - a > 1:
                        day += 1
                if 0 < b - a <= spread:
                    spr += 1
    return [row, day, spr, row * wr + day * wd + spr]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: period sort 1',
   [[['s1', 'ECON150'], ['s2', 'MATH101'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s2', 'HIST140'],
     ['s1', 'ECON150'], ['s2', 'BIO130']],
    {'MATH101': 4, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2}, 2,
    [10, 3, 2]],
   [0, 0, 4, 4]),
  ('regression variant: period sort 2',
   [[['s1', 'CHEM120'], ['s1', 'MATH101']],
    {'MATH101': 6, 'MATH101H': 1, 'PHYS110': 5, 'CHEM120': 7, 'BIO130': 5, 'HIST140': 7, 'ECON150': 8}, 3,
    [10, 1, 1]],
   [1, 0, 1, 11]),
  ('partial repair guard 3',
   [[['s5', 'BIO130'], ['s1', 'HIST140'], ['s5', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'HIST140'],
     ['s5', 'ECON150']],
    {'MATH101': 5, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, 2,
    [10, 3, 1]],
   [0, 0, 1, 1]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}, 3, [10, 2, 2]], [0, 1, 1, 3]),
  ('normal control 5',
   [[['s4', 'MATH101H'], ['s4', 'MATH101'], ['s5', 'MATH101'], ['s4', 'ECON150'], ['s4', 'PHYS110']],
    {'MATH101': 7, 'MATH101H': 4, 'PHYS110': 7, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 2, 'ECON150': 3}, 3,
    [10, 2, 4]],
   [1, 0, 5, 15]),
  ('normal control 6',
   [[['s2', 'CHEM120'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'MATH101'],
     ['s3', 'PHYS110']],
    {'MATH101': 1, 'MATH101H': 6, 'PHYS110': 6, 'CHEM120': 5, 'BIO130': 2, 'HIST140': 6, 'ECON150': 5}, 4,
    [5, 1, 2]],
   [2, 0, 2, 12]),
  ('normal control 7',
   [[['s2', 'HIST140'], ['s4', 'MATH101'], ['s2', 'HIST140'], ['s2', 'MATH101H'], ['s2', 'PHYS110'],
     ['s4', 'CHEM120'], ['s2', 'ECON150']],
    {'MATH101': 2, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 5, 'ECON150': 3}, 2,
    [10, 2, 1]],
   [0, 0, 0, 0]),
  ('normal control 8',
   [[['s5', 'ECON150']],
    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 2, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 0, 'ECON150': 5}, 2,
    [10, 3, 1]],
   [0, 0, 0, 0])],
 [('regression: period sort 1',
   [[['s2', 'HIST140'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s2', 'BIO130'], ['s1', 'HIST140'],
     ['s2', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 1, 'HIST140': 7, 'ECON150': 8}, 3,
    [5, 2, 4]],
   [2, 0, 2, 12]),
  ('regression variant: period sort 2',
   [[['s4', 'MATH101'], ['s2', 'HIST140'], ['s1', 'PHYS110'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
     ['s3', 'ECON150'], ['s3', 'BIO130'], ['s1', 'MATH101H'], ['s2', 'PHYS110'], ['s3', 'PHYS110'],
     ['s5', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101H'], ['s3', 'MATH101'],
     ['s4', 'PHYS110']],
    {'MATH101': 9, 'MATH101H': 7, 'PHYS110': 11, 'CHEM120': 8, 'BIO130': 0, 'HIST140': 7, 'ECON150': 0}, 4,
    [10, 1, 2]],
   [1, 4, 6, 20]),
  ('partial repair guard 3',
   [[['s5', 'MATH101H'], ['s1', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s1', 'ECON150'],
     ['s4', 'BIO130'], ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 6, 'CHEM120': 0, 'BIO130': 4, 'HIST140': 7, 'ECON150': 5}, 3,
    [10, 3, 4]],
   [2, 0, 3, 23]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 4, [10, 2, 2]], [1, 0, 1, 11]),
  ('normal control 5',
   [[['s2', 'HIST140'], ['s2', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 5, 'PHYS110': 3, 'CHEM120': 8, 'BIO130': 5, 'HIST140': 4, 'ECON150': 3}, 3,
    [5, 3, 1]],
   [0, 0, 0, 0]),
  ('normal control 6',
   [[['s4', 'PHYS110'], ['s5', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'PHYS110'], ['s4', 'MATH101'],
     ['s4', 'MATH101'], ['s2', 'HIST140']],
    {'MATH101': 5, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 5, 'BIO130': 4, 'HIST140': 4, 'ECON150': 2}, 2,
    [5, 2, 2]],
   [3, 0, 3, 18]),
  ('normal control 7',
   [[['s1', 'ECON150'], ['s4', 'HIST140'], ['s1', 'PHYS110'], ['s1', 'MATH101'], ['s5', 'MATH101'],
     ['s1', 'BIO130'], ['s5', 'MATH101H']],
    {'MATH101': 7, 'MATH101H': 6, 'PHYS110': 2, 'CHEM120': 2, 'BIO130': 4, 'HIST140': 6, 'ECON150': 0}, 4,
    [5, 2, 4]],
   [1, 2, 5, 14]),
  ('normal control 8',
   [[['s3', 'HIST140'], ['s5', 'CHEM120'], ['s5', 'MATH101H'], ['s5', 'MATH101'], ['s4', 'CHEM120'],
     ['s5', 'CHEM120'], ['s4', 'BIO130'], ['s5', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 7, 'ECON150': 4}, 3,
    [10, 2, 2]],
   [0, 1, 3, 5])],
 [('regression: period sort 1',
   [[['s3', 'HIST140'], ['s5', 'BIO130'], ['s3', 'BIO130'], ['s3', 'ECON150'], ['s3', 'PHYS110'],
     ['s4', 'ECON150'], ['s4', 'CHEM120']],
    {'MATH101': 9, 'MATH101H': 6, 'PHYS110': 0, 'CHEM120': 4, 'BIO130': 8, 'HIST140': 1, 'ECON150': 10}, 4,
    [5, 3, 2]],
   [1, 1, 2, 10]),
  ('regression variant: period sort 2',
   [[['s2', 'ECON150'], ['s2', 'ECON150'], ['s2', 'MATH101H'], ['s4', 'PHYS110'], ['s4', 'HIST140'],
     ['s2', 'BIO130'], ['s2', 'CHEM120']],
    {'MATH101': 11, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 11, 'BIO130': 1, 'HIST140': 10, 'ECON150': 9}, 4,
    [5, 3, 1]],
   [0, 1, 0, 3]),
  ('partial repair guard 3',
   [[['s5', 'HIST140'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s5', 'BIO130'], ['s1', 'MATH101H']],
    {'MATH101': 6, 'MATH101H': 11, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 11, 'ECON150': 3}, 4,
    [5, 3, 1]],
   [0, 1, 0, 3]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 4}, 3, [10, 2, 4]], [0, 0, 1, 1]),
  ('normal control 5',
   [[['s2', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'ECON150'], ['s1', 'MATH101'], ['s2', 'ECON150'],
     ['s4', 'BIO130'], ['s4', 'PHYS110'], ['s4', 'MATH101'], ['s4', 'ECON150'], ['s1', 'MATH101H'],
     ['s3', 'PHYS110']],
    {'MATH101': 8, 'MATH101H': 7, 'PHYS110': 6, 'CHEM120': 3, 'BIO130': 8, 'HIST140': 1, 'ECON150': 1}, 3,
    [10, 1, 2]],
   [1, 2, 4, 16]),
  ('normal control 6',
   [[['s4', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'BIO130'], ['s4', 'MATH101'], ['s1', 'BIO130']],
    {'MATH101': 8, 'MATH101H': 3, 'PHYS110': 6, 'CHEM120': 9, 'BIO130': 6, 'HIST140': 9, 'ECON150': 1}, 4,
    [10, 1, 4]],
   [1, 0, 5, 15]),
  ('normal control 7',
   [[['s3', 'ECON150'], ['s1', 'BIO130'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s2', 'BIO130'],
     ['s2', 'PHYS110'], ['s3', 'PHYS110'], ['s2', 'HIST140']],
    {'MATH101': 11, 'MATH101H': 3, 'PHYS110': 8, 'CHEM120': 8, 'BIO130': 8, 'HIST140': 1, 'ECON150': 7}, 4,
    [10, 3, 1]],
   [0, 0, 1, 1]),
  ('normal control 8',
   [[['s4', 'PHYS110'], ['s5', 'CHEM120'], ['s1', 'PHYS110'], ['s5', 'BIO130'], ['s3', 'CHEM120'],
     ['s5', 'ECON150'], ['s4', 'ECON150'], ['s4', 'MATH101H'], ['s5', 'MATH101'], ['s1', 'ECON150']],
    {'MATH101': 4, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 1, 'BIO130': 5, 'HIST140': 1, 'ECON150': 4}, 2,
    [10, 3, 1]],
   [4, 0, 4, 44])],
 [('regression: period sort 1',
   [[['s5', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'BIO130'], ['s5', 'HIST140'], ['s1', 'PHYS110'],
     ['s4', 'PHYS110'], ['s5', 'MATH101H'], ['s2', 'MATH101H'], ['s3', 'CHEM120'], ['s5', 'BIO130'],
     ['s3', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101'],
     ['s3', 'MATH101'], ['s2', 'PHYS110']],
    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 5, 'BIO130': 1, 'HIST140': 3, 'ECON150': 5}, 2,
    [10, 3, 4]],
   [3, 0, 16, 46]),
  ('regression variant: period sort 2',
   [[['s4', 'HIST140'], ['s5', 'ECON150'], ['s3', 'ECON150'], ['s4', 'BIO130'], ['s1', 'HIST140'],
     ['s2', 'MATH101H'], ['s5', 'HIST140'], ['s1', 'PHYS110'], ['s4', 'ECON150'], ['s2', 'BIO130'],
     ['s5', 'PHYS110'], ['s1', 'BIO130'], ['s2', 'PHYS110'], ['s4', 'MATH101'], ['s2', 'HIST140'],
     ['s5', 'BIO130']],
    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 5, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 0}, 2,
    [10, 3, 1]],
   [3, 0, 3, 33]),
  ('partial repair guard 3',
   [[['s3', 'HIST140'], ['s3', 'BIO130'], ['s3', 'HIST140'], ['s3', 'ECON150'], ['s5', 'ECON150'],
     ['s5', 'BIO130']],
    {'MATH101': 10, 'MATH101H': 7, 'PHYS110': 0, 'CHEM120': 0, 'BIO130': 3, 'HIST140': 11, 'ECON150': 8}, 4,
    [10, 3, 1]],
   [0, 1, 0, 3]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 1, 'PHYS110': 1}, 3, [10, 2, 2]], [0, 0, 0, 0]),
  ('normal control 5',
   [[['s1', 'HIST140'], ['s1', 'HIST140'], ['s3', 'CHEM120'], ['s3', 'MATH101H'], ['s1', 'MATH101'],
     ['s3', 'BIO130'], ['s3', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 2, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 4, 'ECON150': 2}, 3,
    [10, 3, 2]],
   [1, 0, 3, 13]),
  ('normal control 6',
   [[['s1', 'HIST140'], ['s1', 'MATH101'], ['s1', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 6, 'PHYS110': 7, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 0, 'ECON150': 4}, 3,
    [5, 1, 4]],
   [0, 1, 1, 2]),
  ('normal control 7',
   [[['s3', 'ECON150'], ['s2', 'ECON150'], ['s3', 'MATH101'], ['s4', 'PHYS110'], ['s2', 'MATH101'],
     ['s3', 'HIST140'], ['s2', 'CHEM120']],
    {'MATH101': 4, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 3, 'HIST140': 2, 'ECON150': 2}, 2,
    [10, 3, 4]],
   [1, 0, 5, 15]),
  ('normal control 8',
   [[['s1', 'CHEM120'], ['s2', 'BIO130'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s5', 'MATH101'],
     ['s5', 'HIST140'], ['s3', 'ECON150'], ['s2', 'HIST140'], ['s3', 'MATH101'], ['s4', 'ECON150']],
    {'MATH101': 9, 'MATH101H': 8, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 1, 'HIST140': 7, 'ECON150': 5}, 4,
    [5, 1, 2]],
   [2, 0, 4, 14])],
 [('regression: period sort 1',
   [[['s5', 'MATH101H'], ['s1', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s1', 'ECON150'],
     ['s4', 'BIO130'], ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 6, 'CHEM120': 0, 'BIO130': 4, 'HIST140': 7, 'ECON150': 5}, 3,
    [10, 3, 4]],
   [2, 0, 3, 23]),
  ('regression variant: period sort 2',
   [[['s1', 'BIO130'], ['s2', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'HIST140'], ['s1', 'MATH101H'],
     ['s2', 'BIO130'], ['s3', 'MATH101H'], ['s1', 'CHEM120'], ['s3', 'CHEM120'], ['s2', 'MATH101H'],
     ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 4, 'ECON150': 0}, 2,
    [5, 1, 4]],
   [4, 0, 13, 33]),
  ('partial repair guard 3',
   [[['s3', 'CHEM120'], ['s1', 'MATH101'], ['s3', 'HIST140'], ['s1', 'BIO130'], ['s1', 'PHYS110'],
     ['s2', 'BIO130'], ['s4', 'BIO130'], ['s3', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 11, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 8, 'HIST140': 5, 'ECON150': 0}, 4,
    [10, 3, 4]],
   [0, 0, 3, 3]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 3, [10, 2, 2]], [0, 0, 1, 1]),
  ('normal control 5',
   [[['s2', 'BIO130'], ['s1', 'PHYS110'], ['s4', 'ECON150'], ['s5', 'ECON150'], ['s5', 'BIO130'],
     ['s5', 'MATH101'], ['s2', 'CHEM120'], ['s4', 'MATH101'], ['s2', 'HIST140'], ['s1', 'BIO130'],
     ['s5', 'CHEM120'], ['s4', 'HIST140'], ['s1', 'HIST140'], ['s1', 'MATH101']],
    {'MATH101': 9, 'MATH101H': 11, 'PHYS110': 11, 'CHEM120': 9, 'BIO130': 1, 'HIST140': 5, 'ECON150': 11}, 4,
    [10, 1, 4]],
   [0, 4, 9, 13]),
  ('normal control 6',
   [[['s3', 'MATH101'], ['s4', 'HIST140'], ['s1', 'HIST140'], ['s3', 'PHYS110'], ['s4', 'MATH101H'],
     ['s1', 'BIO130'], ['s2', 'MATH101H'], ['s2', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 6, 'PHYS110': 4, 'CHEM120': 0, 'BIO130': 7, 'HIST140': 1, 'ECON150': 5}, 3,
    [5, 3, 2]],
   [1, 0, 1, 6]),
  ('normal control 7',
   [[['s1', 'HIST140'], ['s1', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 8}, 3,
    [10, 2, 1]],
   [0, 0, 0, 0]),
  ('normal control 8',
   [[['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s3', 'PHYS110'], ['s1', 'MATH101H'], ['s3', 'ECON150'],
     ['s1', 'HIST140'], ['s5', 'ECON150'], ['s5', 'MATH101H'], ['s1', 'ECON150']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 7, 'CHEM120': 4, 'BIO130': 3, 'HIST140': 9, 'ECON150': 6}, 4,
    [5, 1, 1]],
   [4, 3, 4, 27])]]
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: period sort 1[0, 0, 0, 0][0, 0, 4, 4]Failed
regression variant: period sort 2[0, 0, 0, 0][1, 0, 1, 11]Failed
partial repair guard 3[0, 0, 0, 0][0, 0, 1, 1]Failed
boundary control 4[0, 0, 0, 0][0, 1, 1, 3]Failed
normal control 5[0, 0, 0, 0][1, 0, 5, 15]Failed
normal control 6[0, 0, 0, 0][2, 0, 2, 12]Failed
normal control 7[0, 0, 0, 0][0, 0, 0, 0]Passed
normal control 8[0, 0, 0, 0][0, 0, 0, 0]Passed

SHA-256 / 92b7f661773ba6342600566921c64324aeb1ccad0ac52a9084d11adde01e482d

3 / The verified repair

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

N = 1
observations = []
def solve(enrol, period, spd, w):
    wr, wd, spread = w
    by = {}
    for st, ex in enrol:
        by.setdefault(st, set()).add(ex)
    row = day = spr = 0
    for st in by:
        ps = sorted(period[e] for e in by[st])
        for i in range(len(ps)):
            for j in range(i + 1, len(ps)):
                a, b = ps[i], ps[j]
                if a // spd == b // spd:
                    if b - a == 1:
                        row += 1
                    elif b - a > 1:
                        day += 1
                if 0 < b - a <= spread:
                    spr += 1
    return [row, day, spr, row * wr + day * wd + spr]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: period sort 1',
   [[['s1', 'ECON150'], ['s2', 'MATH101'], ['s2', 'PHYS110'], ['s3', 'CHEM120'], ['s2', 'HIST140'],
     ['s1', 'ECON150'], ['s2', 'BIO130']],
    {'MATH101': 4, 'MATH101H': 0, 'PHYS110': 3, 'CHEM120': 4, 'BIO130': 3, 'HIST140': 1, 'ECON150': 2}, 2,
    [10, 3, 2]],
   [0, 0, 4, 4]),
  ('regression variant: period sort 2',
   [[['s1', 'CHEM120'], ['s1', 'MATH101']],
    {'MATH101': 6, 'MATH101H': 1, 'PHYS110': 5, 'CHEM120': 7, 'BIO130': 5, 'HIST140': 7, 'ECON150': 8}, 3,
    [10, 1, 1]],
   [1, 0, 1, 11]),
  ('partial repair guard 3',
   [[['s5', 'BIO130'], ['s1', 'HIST140'], ['s5', 'PHYS110'], ['s1', 'BIO130'], ['s1', 'HIST140'],
     ['s5', 'ECON150']],
    {'MATH101': 5, 'MATH101H': 3, 'PHYS110': 4, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 0, 'ECON150': 3}, 2,
    [10, 3, 1]],
   [0, 0, 1, 1]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 2}, 3, [10, 2, 2]], [0, 1, 1, 3]),
  ('normal control 5',
   [[['s4', 'MATH101H'], ['s4', 'MATH101'], ['s5', 'MATH101'], ['s4', 'ECON150'], ['s4', 'PHYS110']],
    {'MATH101': 7, 'MATH101H': 4, 'PHYS110': 7, 'CHEM120': 3, 'BIO130': 7, 'HIST140': 2, 'ECON150': 3}, 3,
    [10, 2, 4]],
   [1, 0, 5, 15]),
  ('normal control 6',
   [[['s2', 'CHEM120'], ['s2', 'PHYS110'], ['s2', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'MATH101'],
     ['s3', 'PHYS110']],
    {'MATH101': 1, 'MATH101H': 6, 'PHYS110': 6, 'CHEM120': 5, 'BIO130': 2, 'HIST140': 6, 'ECON150': 5}, 4,
    [5, 1, 2]],
   [2, 0, 2, 12]),
  ('normal control 7',
   [[['s2', 'HIST140'], ['s4', 'MATH101'], ['s2', 'HIST140'], ['s2', 'MATH101H'], ['s2', 'PHYS110'],
     ['s4', 'CHEM120'], ['s2', 'ECON150']],
    {'MATH101': 2, 'MATH101H': 1, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 0, 'HIST140': 5, 'ECON150': 3}, 2,
    [10, 2, 1]],
   [0, 0, 0, 0]),
  ('normal control 8',
   [[['s5', 'ECON150']],
    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 2, 'CHEM120': 3, 'BIO130': 2, 'HIST140': 0, 'ECON150': 5}, 2,
    [10, 3, 1]],
   [0, 0, 0, 0])],
 [('regression: period sort 1',
   [[['s2', 'HIST140'], ['s1', 'PHYS110'], ['s1', 'BIO130'], ['s2', 'BIO130'], ['s1', 'HIST140'],
     ['s2', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'BIO130']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 6, 'CHEM120': 4, 'BIO130': 1, 'HIST140': 7, 'ECON150': 8}, 3,
    [5, 2, 4]],
   [2, 0, 2, 12]),
  ('regression variant: period sort 2',
   [[['s4', 'MATH101'], ['s2', 'HIST140'], ['s1', 'PHYS110'], ['s3', 'PHYS110'], ['s4', 'CHEM120'],
     ['s3', 'ECON150'], ['s3', 'BIO130'], ['s1', 'MATH101H'], ['s2', 'PHYS110'], ['s3', 'PHYS110'],
     ['s5', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'ECON150'], ['s4', 'MATH101H'], ['s3', 'MATH101'],
     ['s4', 'PHYS110']],
    {'MATH101': 9, 'MATH101H': 7, 'PHYS110': 11, 'CHEM120': 8, 'BIO130': 0, 'HIST140': 7, 'ECON150': 0}, 4,
    [10, 1, 2]],
   [1, 4, 6, 20]),
  ('partial repair guard 3',
   [[['s5', 'MATH101H'], ['s1', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s1', 'ECON150'],
     ['s4', 'BIO130'], ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 6, 'CHEM120': 0, 'BIO130': 4, 'HIST140': 7, 'ECON150': 5}, 3,
    [10, 3, 4]],
   [2, 0, 3, 23]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 4, [10, 2, 2]], [1, 0, 1, 11]),
  ('normal control 5',
   [[['s2', 'HIST140'], ['s2', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 5, 'PHYS110': 3, 'CHEM120': 8, 'BIO130': 5, 'HIST140': 4, 'ECON150': 3}, 3,
    [5, 3, 1]],
   [0, 0, 0, 0]),
  ('normal control 6',
   [[['s4', 'PHYS110'], ['s5', 'MATH101H'], ['s2', 'MATH101'], ['s2', 'PHYS110'], ['s4', 'MATH101'],
     ['s4', 'MATH101'], ['s2', 'HIST140']],
    {'MATH101': 5, 'MATH101H': 4, 'PHYS110': 4, 'CHEM120': 5, 'BIO130': 4, 'HIST140': 4, 'ECON150': 2}, 2,
    [5, 2, 2]],
   [3, 0, 3, 18]),
  ('normal control 7',
   [[['s1', 'ECON150'], ['s4', 'HIST140'], ['s1', 'PHYS110'], ['s1', 'MATH101'], ['s5', 'MATH101'],
     ['s1', 'BIO130'], ['s5', 'MATH101H']],
    {'MATH101': 7, 'MATH101H': 6, 'PHYS110': 2, 'CHEM120': 2, 'BIO130': 4, 'HIST140': 6, 'ECON150': 0}, 4,
    [5, 2, 4]],
   [1, 2, 5, 14]),
  ('normal control 8',
   [[['s3', 'HIST140'], ['s5', 'CHEM120'], ['s5', 'MATH101H'], ['s5', 'MATH101'], ['s4', 'CHEM120'],
     ['s5', 'CHEM120'], ['s4', 'BIO130'], ['s5', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 7, 'PHYS110': 3, 'CHEM120': 2, 'BIO130': 3, 'HIST140': 7, 'ECON150': 4}, 3,
    [10, 2, 2]],
   [0, 1, 3, 5])],
 [('regression: period sort 1',
   [[['s3', 'HIST140'], ['s5', 'BIO130'], ['s3', 'BIO130'], ['s3', 'ECON150'], ['s3', 'PHYS110'],
     ['s4', 'ECON150'], ['s4', 'CHEM120']],
    {'MATH101': 9, 'MATH101H': 6, 'PHYS110': 0, 'CHEM120': 4, 'BIO130': 8, 'HIST140': 1, 'ECON150': 10}, 4,
    [5, 3, 2]],
   [1, 1, 2, 10]),
  ('regression variant: period sort 2',
   [[['s2', 'ECON150'], ['s2', 'ECON150'], ['s2', 'MATH101H'], ['s4', 'PHYS110'], ['s4', 'HIST140'],
     ['s2', 'BIO130'], ['s2', 'CHEM120']],
    {'MATH101': 11, 'MATH101H': 1, 'PHYS110': 4, 'CHEM120': 11, 'BIO130': 1, 'HIST140': 10, 'ECON150': 9}, 4,
    [5, 3, 1]],
   [0, 1, 0, 3]),
  ('partial repair guard 3',
   [[['s5', 'HIST140'], ['s5', 'ECON150'], ['s5', 'BIO130'], ['s5', 'BIO130'], ['s1', 'MATH101H']],
    {'MATH101': 6, 'MATH101H': 11, 'PHYS110': 0, 'CHEM120': 2, 'BIO130': 1, 'HIST140': 11, 'ECON150': 3}, 4,
    [5, 3, 1]],
   [0, 1, 0, 3]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 0, 'PHYS110': 4}, 3, [10, 2, 4]], [0, 0, 1, 1]),
  ('normal control 5',
   [[['s2', 'HIST140'], ['s1', 'CHEM120'], ['s1', 'ECON150'], ['s1', 'MATH101'], ['s2', 'ECON150'],
     ['s4', 'BIO130'], ['s4', 'PHYS110'], ['s4', 'MATH101'], ['s4', 'ECON150'], ['s1', 'MATH101H'],
     ['s3', 'PHYS110']],
    {'MATH101': 8, 'MATH101H': 7, 'PHYS110': 6, 'CHEM120': 3, 'BIO130': 8, 'HIST140': 1, 'ECON150': 1}, 3,
    [10, 1, 2]],
   [1, 2, 4, 16]),
  ('normal control 6',
   [[['s4', 'CHEM120'], ['s4', 'PHYS110'], ['s4', 'BIO130'], ['s4', 'MATH101'], ['s1', 'BIO130']],
    {'MATH101': 8, 'MATH101H': 3, 'PHYS110': 6, 'CHEM120': 9, 'BIO130': 6, 'HIST140': 9, 'ECON150': 1}, 4,
    [10, 1, 4]],
   [1, 0, 5, 15]),
  ('normal control 7',
   [[['s3', 'ECON150'], ['s1', 'BIO130'], ['s3', 'MATH101H'], ['s3', 'PHYS110'], ['s2', 'BIO130'],
     ['s2', 'PHYS110'], ['s3', 'PHYS110'], ['s2', 'HIST140']],
    {'MATH101': 11, 'MATH101H': 3, 'PHYS110': 8, 'CHEM120': 8, 'BIO130': 8, 'HIST140': 1, 'ECON150': 7}, 4,
    [10, 3, 1]],
   [0, 0, 1, 1]),
  ('normal control 8',
   [[['s4', 'PHYS110'], ['s5', 'CHEM120'], ['s1', 'PHYS110'], ['s5', 'BIO130'], ['s3', 'CHEM120'],
     ['s5', 'ECON150'], ['s4', 'ECON150'], ['s4', 'MATH101H'], ['s5', 'MATH101'], ['s1', 'ECON150']],
    {'MATH101': 4, 'MATH101H': 0, 'PHYS110': 5, 'CHEM120': 1, 'BIO130': 5, 'HIST140': 1, 'ECON150': 4}, 2,
    [10, 3, 1]],
   [4, 0, 4, 44])],
 [('regression: period sort 1',
   [[['s5', 'CHEM120'], ['s1', 'ECON150'], ['s5', 'BIO130'], ['s5', 'HIST140'], ['s1', 'PHYS110'],
     ['s4', 'PHYS110'], ['s5', 'MATH101H'], ['s2', 'MATH101H'], ['s3', 'CHEM120'], ['s5', 'BIO130'],
     ['s3', 'BIO130'], ['s3', 'MATH101H'], ['s4', 'HIST140'], ['s2', 'BIO130'], ['s4', 'MATH101'],
     ['s3', 'MATH101'], ['s2', 'PHYS110']],
    {'MATH101': 0, 'MATH101H': 2, 'PHYS110': 0, 'CHEM120': 5, 'BIO130': 1, 'HIST140': 3, 'ECON150': 5}, 2,
    [10, 3, 4]],
   [3, 0, 16, 46]),
  ('regression variant: period sort 2',
   [[['s4', 'HIST140'], ['s5', 'ECON150'], ['s3', 'ECON150'], ['s4', 'BIO130'], ['s1', 'HIST140'],
     ['s2', 'MATH101H'], ['s5', 'HIST140'], ['s1', 'PHYS110'], ['s4', 'ECON150'], ['s2', 'BIO130'],
     ['s5', 'PHYS110'], ['s1', 'BIO130'], ['s2', 'PHYS110'], ['s4', 'MATH101'], ['s2', 'HIST140'],
     ['s5', 'BIO130']],
    {'MATH101': 1, 'MATH101H': 1, 'PHYS110': 5, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 0}, 2,
    [10, 3, 1]],
   [3, 0, 3, 33]),
  ('partial repair guard 3',
   [[['s3', 'HIST140'], ['s3', 'BIO130'], ['s3', 'HIST140'], ['s3', 'ECON150'], ['s5', 'ECON150'],
     ['s5', 'BIO130']],
    {'MATH101': 10, 'MATH101H': 7, 'PHYS110': 0, 'CHEM120': 0, 'BIO130': 3, 'HIST140': 11, 'ECON150': 8}, 4,
    [10, 3, 1]],
   [0, 1, 0, 3]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 1, 'PHYS110': 1}, 3, [10, 2, 2]], [0, 0, 0, 0]),
  ('normal control 5',
   [[['s1', 'HIST140'], ['s1', 'HIST140'], ['s3', 'CHEM120'], ['s3', 'MATH101H'], ['s1', 'MATH101'],
     ['s3', 'BIO130'], ['s3', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 2, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 4, 'ECON150': 2}, 3,
    [10, 3, 2]],
   [1, 0, 3, 13]),
  ('normal control 6',
   [[['s1', 'HIST140'], ['s1', 'MATH101'], ['s1', 'HIST140']],
    {'MATH101': 2, 'MATH101H': 6, 'PHYS110': 7, 'CHEM120': 6, 'BIO130': 0, 'HIST140': 0, 'ECON150': 4}, 3,
    [5, 1, 4]],
   [0, 1, 1, 2]),
  ('normal control 7',
   [[['s3', 'ECON150'], ['s2', 'ECON150'], ['s3', 'MATH101'], ['s4', 'PHYS110'], ['s2', 'MATH101'],
     ['s3', 'HIST140'], ['s2', 'CHEM120']],
    {'MATH101': 4, 'MATH101H': 5, 'PHYS110': 4, 'CHEM120': 3, 'BIO130': 3, 'HIST140': 2, 'ECON150': 2}, 2,
    [10, 3, 4]],
   [1, 0, 5, 15]),
  ('normal control 8',
   [[['s1', 'CHEM120'], ['s2', 'BIO130'], ['s3', 'MATH101H'], ['s3', 'CHEM120'], ['s5', 'MATH101'],
     ['s5', 'HIST140'], ['s3', 'ECON150'], ['s2', 'HIST140'], ['s3', 'MATH101'], ['s4', 'ECON150']],
    {'MATH101': 9, 'MATH101H': 8, 'PHYS110': 4, 'CHEM120': 6, 'BIO130': 1, 'HIST140': 7, 'ECON150': 5}, 4,
    [5, 1, 2]],
   [2, 0, 4, 14])],
 [('regression: period sort 1',
   [[['s5', 'MATH101H'], ['s1', 'CHEM120'], ['s4', 'MATH101'], ['s5', 'HIST140'], ['s1', 'ECON150'],
     ['s4', 'BIO130'], ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 6, 'PHYS110': 6, 'CHEM120': 0, 'BIO130': 4, 'HIST140': 7, 'ECON150': 5}, 3,
    [10, 3, 4]],
   [2, 0, 3, 23]),
  ('regression variant: period sort 2',
   [[['s1', 'BIO130'], ['s2', 'MATH101'], ['s3', 'PHYS110'], ['s3', 'HIST140'], ['s1', 'MATH101H'],
     ['s2', 'BIO130'], ['s3', 'MATH101H'], ['s1', 'CHEM120'], ['s3', 'CHEM120'], ['s2', 'MATH101H'],
     ['s1', 'PHYS110']],
    {'MATH101': 5, 'MATH101H': 1, 'PHYS110': 0, 'CHEM120': 1, 'BIO130': 2, 'HIST140': 4, 'ECON150': 0}, 2,
    [5, 1, 4]],
   [4, 0, 13, 33]),
  ('partial repair guard 3',
   [[['s3', 'CHEM120'], ['s1', 'MATH101'], ['s3', 'HIST140'], ['s1', 'BIO130'], ['s1', 'PHYS110'],
     ['s2', 'BIO130'], ['s4', 'BIO130'], ['s3', 'PHYS110'], ['s1', 'CHEM120'], ['s2', 'HIST140']],
    {'MATH101': 3, 'MATH101H': 11, 'PHYS110': 3, 'CHEM120': 3, 'BIO130': 8, 'HIST140': 5, 'ECON150': 0}, 4,
    [10, 3, 4]],
   [0, 0, 3, 3]),
  ('boundary control 4',
   [[['s1', 'MATH101'], ['s1', 'PHYS110']], {'MATH101': 2, 'PHYS110': 3}, 3, [10, 2, 2]], [0, 0, 1, 1]),
  ('normal control 5',
   [[['s2', 'BIO130'], ['s1', 'PHYS110'], ['s4', 'ECON150'], ['s5', 'ECON150'], ['s5', 'BIO130'],
     ['s5', 'MATH101'], ['s2', 'CHEM120'], ['s4', 'MATH101'], ['s2', 'HIST140'], ['s1', 'BIO130'],
     ['s5', 'CHEM120'], ['s4', 'HIST140'], ['s1', 'HIST140'], ['s1', 'MATH101']],
    {'MATH101': 9, 'MATH101H': 11, 'PHYS110': 11, 'CHEM120': 9, 'BIO130': 1, 'HIST140': 5, 'ECON150': 11}, 4,
    [10, 1, 4]],
   [0, 4, 9, 13]),
  ('normal control 6',
   [[['s3', 'MATH101'], ['s4', 'HIST140'], ['s1', 'HIST140'], ['s3', 'PHYS110'], ['s4', 'MATH101H'],
     ['s1', 'BIO130'], ['s2', 'MATH101H'], ['s2', 'BIO130']],
    {'MATH101': 0, 'MATH101H': 6, 'PHYS110': 4, 'CHEM120': 0, 'BIO130': 7, 'HIST140': 1, 'ECON150': 5}, 3,
    [5, 3, 2]],
   [1, 0, 1, 6]),
  ('normal control 7',
   [[['s1', 'HIST140'], ['s1', 'MATH101']],
    {'MATH101': 0, 'MATH101H': 1, 'PHYS110': 7, 'CHEM120': 1, 'BIO130': 1, 'HIST140': 3, 'ECON150': 8}, 3,
    [10, 2, 1]],
   [0, 0, 0, 0]),
  ('normal control 8',
   [[['s5', 'CHEM120'], ['s5', 'PHYS110'], ['s3', 'PHYS110'], ['s1', 'MATH101H'], ['s3', 'ECON150'],
     ['s1', 'HIST140'], ['s5', 'ECON150'], ['s5', 'MATH101H'], ['s1', 'ECON150']],
    {'MATH101': 2, 'MATH101H': 7, 'PHYS110': 7, 'CHEM120': 4, 'BIO130': 3, 'HIST140': 9, 'ECON150': 6}, 4,
    [5, 1, 1]],
   [4, 3, 4, 27])]]
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: period sort 1[0, 0, 4, 4][0, 0, 4, 4]Passed
regression variant: period sort 2[1, 0, 1, 11][1, 0, 1, 11]Passed
partial repair guard 3[0, 0, 1, 1][0, 0, 1, 1]Passed
boundary control 4[0, 1, 1, 3][0, 1, 1, 3]Passed
normal control 5[1, 0, 5, 15][1, 0, 5, 15]Passed
normal control 6[2, 0, 2, 12][2, 0, 2, 12]Passed
normal control 7[0, 0, 0, 0][0, 0, 0, 0]Passed
normal control 8[0, 0, 0, 0][0, 0, 0, 0]Passed

SHA-256 / c69c35c872efaa4db3010550f536cafce2648123184dcec472ea0a0f7706a9b7

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

Case digest / 5818e2667253840c7159564a6be0b20f95f19c303016829b1dd49297e1b52024