FAILURE MAP
← Case archive

FA-94461 / Exam timetabling constraints / Open access

Invigilator count floors the candidate ratio · case 01

Rooms with fewer candidates than the ratio get no invigilator.

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

ROOT CAUSE

Floor division is used for the ratio.

VERIFIED REPAIR

Use ceiling division of candidates by ratio.

Unsuccessful approach: Adding one to the floor over-staffs rooms at exact multiples.

Case contract

rooms [room, venue, candidates, has access-arrangement candidate]. A room with candidates needs ceil(candidates / ratio) invigilators plus one if it has an access arrangement; an empty room needs none. Each venue with any invigilators also needs one chief invigilator. Return [per room, per venue including chief, grand total].

Why this case matters

Invigilation staffing follows directly from the room plan of a timetable.

1 / The failure

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

N = 1
observations = []
def solve(rooms, ratio):
    per = {}
    venue = {}
    for r, v, n, acc in rooms:
        k = 0
        if n > 0:
            k = n // ratio
            if acc:
                k += 1
        per[r] = k
        venue.setdefault(v, 0)
        venue[v] += k
    for v in venue:
        if venue[v] > 0:
            venue[v] += 1
    return [per, venue, sum(venue.values())]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: ratio ceiling 1', [[['R1', 'main', 31, False]], 30], [{'R1': 2}, {'main': 3}, 3]),
  ('regression variant: ratio ceiling 2',
   [[['R0', 'lab', 25, False], ['R1', 'main', 1, False], ['R2', 'main', 0, True], ['R3', 'annex', 31, False],
     ['R4', 'annex', 60, True]],
    25],
   [{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 4}, {'lab': 2, 'main': 2, 'annex': 7}, 11]),
  ('partial repair guard 3',
   [[['R0', 'main', 60, False], ['R1', 'main', 0, False], ['R2', 'lab', 15, True],
     ['R3', 'annex', 30, False]],
    30],
   [{'R0': 2, 'R1': 0, 'R2': 2, 'R3': 1}, {'main': 3, 'lab': 3, 'annex': 2}, 8]),
  ('boundary control 4', [[['R1', 'main', 0, False], ['R2', 'annex', 5, False]], 30],
   [{'R1': 0, 'R2': 1}, {'main': 0, 'annex': 2}, 2]),
  ('normal control 5',
   [[['R0', 'annex', 31, True], ['R1', 'main', 25, False], ['R2', 'main', 25, False],
     ['R3', 'annex', 31, False]],
    25],
   [{'R0': 3, 'R1': 1, 'R2': 1, 'R3': 2}, {'annex': 6, 'main': 3}, 9]),
  ('normal control 6', [[['R0', 'annex', 61, False]], 30], [{'R0': 3}, {'annex': 4}, 4]),
  ('normal control 7',
   [[['R0', 'main', 31, False], ['R1', 'main', 31, False], ['R2', 'lab', 60, True],
     ['R3', 'annex', 60, False]],
    25],
   [{'R0': 2, 'R1': 2, 'R2': 4, 'R3': 3}, {'main': 5, 'lab': 5, 'annex': 4}, 14]),
  ('normal control 8', [[['R0', 'main', 60, True], ['R1', 'lab', 61, False], ['R2', 'lab', 25, False]], 30],
   [{'R0': 3, 'R1': 3, 'R2': 1}, {'main': 4, 'lab': 5}, 9])],
 [('regression: ratio ceiling 1', [[['R1', 'main', 0, False], ['R2', 'annex', 5, False]], 30],
   [{'R1': 0, 'R2': 1}, {'main': 0, 'annex': 2}, 2]),
  ('regression variant: ratio ceiling 2',
   [[['R0', 'lab', 1, True], ['R1', 'lab', 31, True], ['R2', 'lab', 0, True]], 30],
   [{'R0': 2, 'R1': 3, 'R2': 0}, {'lab': 6}, 6]),
  ('partial repair guard 3', [[['R0', 'annex', 0, True], ['R1', 'lab', 30, False]], 30],
   [{'R0': 0, 'R1': 1}, {'annex': 0, 'lab': 2}, 2]),
  ('boundary control 4', [[['R1', 'main', 31, False]], 30], [{'R1': 2}, {'main': 3}, 3]),
  ('normal control 5',
   [[['R0', 'main', 0, False], ['R1', 'main', 60, False], ['R2', 'main', 0, False],
     ['R3', 'annex', 30, False]],
    30],
   [{'R0': 0, 'R1': 2, 'R2': 0, 'R3': 1}, {'main': 3, 'annex': 2}, 5]),
  ('normal control 6',
   [[['R0', 'main', 31, False], ['R1', 'main', 15, False], ['R2', 'annex', 31, False],
     ['R3', 'main', 0, True], ['R4', 'main', 0, False]],
    25],
   [{'R0': 2, 'R1': 1, 'R2': 2, 'R3': 0, 'R4': 0}, {'main': 4, 'annex': 3}, 7]),
  ('normal control 7',
   [[['R0', 'lab', 0, False], ['R1', 'main', 25, False], ['R2', 'lab', 60, False], ['R3', 'annex', 0, False],
     ['R4', 'annex', 31, False]],
    25],
   [{'R0': 0, 'R1': 1, 'R2': 3, 'R3': 0, 'R4': 2}, {'lab': 4, 'main': 2, 'annex': 3}, 9]),
  ('normal control 8',
   [[['R0', 'lab', 0, False], ['R1', 'lab', 15, False], ['R2', 'annex', 0, False], ['R3', 'annex', 30, False],
     ['R4', 'main', 31, False]],
    25],
   [{'R0': 0, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 2}, {'lab': 2, 'annex': 3, 'main': 3}, 8])],
 [('regression: ratio ceiling 1', [[['R1', 'main', 12, True], ['R2', 'main', 40, False]], 25],
   [{'R1': 2, 'R2': 2}, {'main': 5}, 5]),
  ('regression variant: ratio ceiling 2', [[['R0', 'lab', 0, False], ['R1', 'main', 31, False]], 30],
   [{'R0': 0, 'R1': 2}, {'lab': 0, 'main': 3}, 3]),
  ('partial repair guard 3',
   [[['R0', 'lab', 31, False], ['R1', 'main', 60, True], ['R2', 'lab', 0, False], ['R3', 'annex', 1, False],
     ['R4', 'annex', 15, False]],
    30],
   [{'R0': 2, 'R1': 3, 'R2': 0, 'R3': 1, 'R4': 1}, {'lab': 3, 'main': 4, 'annex': 3}, 10]),
  ('normal control 4',
   [[['R0', 'lab', 25, False], ['R1', 'annex', 61, True], ['R2', 'annex', 1, False],
     ['R3', 'main', 0, False]],
    25],
   [{'R0': 1, 'R1': 4, 'R2': 1, 'R3': 0}, {'lab': 2, 'annex': 6, 'main': 0}, 8]),
  ('normal control 5', [[['R0', 'main', 0, False]], 30], [{'R0': 0}, {'main': 0}, 0]),
  ('normal control 6',
   [[['R0', 'main', 0, False], ['R1', 'annex', 1, False], ['R2', 'main', 15, False], ['R3', 'lab', 0, False],
     ['R4', 'main', 31, False]],
    25],
   [{'R0': 0, 'R1': 1, 'R2': 1, 'R3': 0, 'R4': 2}, {'main': 4, 'annex': 2, 'lab': 0}, 6]),
  ('normal control 7',
   [[['R0', 'main', 61, False], ['R1', 'lab', 60, True], ['R2', 'annex', 30, False], ['R3', 'lab', 25, False],
     ['R4', 'main', 61, False]],
    25],
   [{'R0': 3, 'R1': 4, 'R2': 2, 'R3': 1, 'R4': 3}, {'main': 7, 'lab': 6, 'annex': 3}, 16]),
  ('normal control 8',
   [[['R0', 'annex', 30, False], ['R1', 'annex', 0, True], ['R2', 'main', 0, True], ['R3', 'lab', 0, False],
     ['R4', 'annex', 0, False]],
    25],
   [{'R0': 2, 'R1': 0, 'R2': 0, 'R3': 0, 'R4': 0}, {'annex': 3, 'main': 0, 'lab': 0}, 3])],
 [('regression: ratio ceiling 1', [[['R0', 'lab', 60, False], ['R1', 'lab', 25, True]], 30],
   [{'R0': 2, 'R1': 2}, {'lab': 5}, 5]),
  ('regression variant: ratio ceiling 2', [[['R0', 'annex', 25, True]], 30], [{'R0': 2}, {'annex': 3}, 3]),
  ('partial repair guard 3', [[['R0', 'annex', 30, True], ['R1', 'annex', 15, False]], 30],
   [{'R0': 2, 'R1': 1}, {'annex': 4}, 4]),
  ('boundary control 4', [[['R1', 'main', 0, True]], 30], [{'R1': 0}, {'main': 0}, 0]),
  ('normal control 5', [[['R0', 'main', 0, False], ['R1', 'main', 15, False], ['R2', 'lab', 61, True]], 25],
   [{'R0': 0, 'R1': 1, 'R2': 4}, {'main': 2, 'lab': 5}, 7]),
  ('normal control 6',
   [[['R0', 'annex', 15, False], ['R1', 'lab', 1, False], ['R2', 'lab', 0, False],
     ['R3', 'annex', 25, False]],
    30],
   [{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 1}, {'annex': 3, 'lab': 2}, 5]),
  ('normal control 7',
   [[['R0', 'annex', 31, False], ['R1', 'lab', 60, False], ['R2', 'main', 0, False], ['R3', 'lab', 1, False],
     ['R4', 'annex', 15, False]],
    25],
   [{'R0': 2, 'R1': 3, 'R2': 0, 'R3': 1, 'R4': 1}, {'annex': 4, 'lab': 5, 'main': 0}, 9]),
  ('normal control 8',
   [[['R0', 'main', 30, False], ['R1', 'annex', 61, False], ['R2', 'main', 61, True],
     ['R3', 'annex', 60, False], ['R4', 'annex', 1, True]],
    30],
   [{'R0': 1, 'R1': 3, 'R2': 4, 'R3': 2, 'R4': 2}, {'main': 6, 'annex': 8}, 14])],
 [('regression: ratio ceiling 1',
   [[['R0', 'annex', 31, False], ['R1', 'lab', 25, True], ['R2', 'lab', 61, False], ['R3', 'annex', 1, True]],
    30],
   [{'R0': 2, 'R1': 2, 'R2': 3, 'R3': 2}, {'annex': 5, 'lab': 6}, 11]),
  ('regression variant: ratio ceiling 2',
   [[['R0', 'annex', 61, False], ['R1', 'lab', 15, False], ['R2', 'annex', 1, True],
     ['R3', 'annex', 61, False]],
    30],
   [{'R0': 3, 'R1': 1, 'R2': 2, 'R3': 3}, {'annex': 9, 'lab': 2}, 11]),
  ('partial repair guard 3',
   [[['R0', 'main', 25, False], ['R1', 'lab', 0, False], ['R2', 'main', 1, False], ['R3', 'main', 60, True],
     ['R4', 'main', 15, True]],
    25],
   [{'R0': 1, 'R1': 0, 'R2': 1, 'R3': 4, 'R4': 2}, {'main': 9, 'lab': 0}, 9]),
  ('boundary control 4', [[['R1', 'main', 30, False]], 30], [{'R1': 1}, {'main': 2}, 2]),
  ('normal control 5',
   [[['R0', 'main', 61, True], ['R1', 'annex', 15, False], ['R2', 'main', 30, False], ['R3', 'lab', 1, False],
     ['R4', 'main', 31, True]],
    30],
   [{'R0': 4, 'R1': 1, 'R2': 1, 'R3': 1, 'R4': 3}, {'main': 9, 'annex': 2, 'lab': 2}, 13]),
  ('normal control 6', [[['R0', 'lab', 0, False], ['R1', 'main', 25, True]], 30],
   [{'R0': 0, 'R1': 2}, {'lab': 0, 'main': 3}, 3]),
  ('normal control 7', [[['R0', 'lab', 31, True], ['R1', 'lab', 61, False], ['R2', 'main', 61, False]], 25],
   [{'R0': 3, 'R1': 3, 'R2': 3}, {'lab': 7, 'main': 4}, 11]),
  ('normal control 8',
   [[['R0', 'annex', 0, True], ['R1', 'main', 0, False], ['R2', 'main', 15, False], ['R3', 'lab', 1, True],
     ['R4', 'annex', 25, False]],
    30],
   [{'R0': 0, 'R1': 0, 'R2': 1, 'R3': 2, 'R4': 1}, {'annex': 2, 'main': 2, 'lab': 3}, 7])]]
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: ratio ceiling 1[{'R1': 1}, {'main': 2}, 2][{'R1': 2}, {'main': 3}, 3]Failed
regression variant: ratio ceiling 2[{'R0': 1, 'R1': 0, 'R2': 0, 'R3': 1, 'R4': 3}, {'annex': 5, 'lab': 2, 'main': 0}, 7][{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 4}, {'annex': 7, 'lab': 2, 'main': 2}, 11]Failed
partial repair guard 3[{'R0': 2, 'R1': 0, 'R2': 1, 'R3': 1}, {'annex': 2, 'lab': 2, 'main': 3}, 7][{'R0': 2, 'R1': 0, 'R2': 2, 'R3': 1}, {'annex': 2, 'lab': 3, 'main': 3}, 8]Failed
boundary control 4[{'R1': 0, 'R2': 0}, {'annex': 0, 'main': 0}, 0][{'R1': 0, 'R2': 1}, {'annex': 2, 'main': 0}, 2]Failed
normal control 5[{'R0': 2, 'R1': 1, 'R2': 1, 'R3': 1}, {'annex': 4, 'main': 3}, 7][{'R0': 3, 'R1': 1, 'R2': 1, 'R3': 2}, {'annex': 6, 'main': 3}, 9]Failed
normal control 6[{'R0': 2}, {'annex': 3}, 3][{'R0': 3}, {'annex': 4}, 4]Failed
normal control 7[{'R0': 1, 'R1': 1, 'R2': 3, 'R3': 2}, {'annex': 3, 'lab': 4, 'main': 3}, 10][{'R0': 2, 'R1': 2, 'R2': 4, 'R3': 3}, {'annex': 4, 'lab': 5, 'main': 5}, 14]Failed
normal control 8[{'R0': 3, 'R1': 2, 'R2': 0}, {'lab': 3, 'main': 4}, 7][{'R0': 3, 'R1': 3, 'R2': 1}, {'lab': 5, 'main': 4}, 9]Failed

SHA-256 / ded634fca8615ad9e5cef454ac5b64bf83ec7f449c61f16214283495a104753f

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(rooms, ratio):
    per = {}
    venue = {}
    for r, v, n, acc in rooms:
        k = 0
        if n > 0:
            k = n // ratio + 1
            if acc:
                k += 1
        per[r] = k
        venue.setdefault(v, 0)
        venue[v] += k
    for v in venue:
        if venue[v] > 0:
            venue[v] += 1
    return [per, venue, sum(venue.values())]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: ratio ceiling 1', [[['R1', 'main', 31, False]], 30], [{'R1': 2}, {'main': 3}, 3]),
  ('regression variant: ratio ceiling 2',
   [[['R0', 'lab', 25, False], ['R1', 'main', 1, False], ['R2', 'main', 0, True], ['R3', 'annex', 31, False],
     ['R4', 'annex', 60, True]],
    25],
   [{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 4}, {'lab': 2, 'main': 2, 'annex': 7}, 11]),
  ('partial repair guard 3',
   [[['R0', 'main', 60, False], ['R1', 'main', 0, False], ['R2', 'lab', 15, True],
     ['R3', 'annex', 30, False]],
    30],
   [{'R0': 2, 'R1': 0, 'R2': 2, 'R3': 1}, {'main': 3, 'lab': 3, 'annex': 2}, 8]),
  ('boundary control 4', [[['R1', 'main', 0, False], ['R2', 'annex', 5, False]], 30],
   [{'R1': 0, 'R2': 1}, {'main': 0, 'annex': 2}, 2]),
  ('normal control 5',
   [[['R0', 'annex', 31, True], ['R1', 'main', 25, False], ['R2', 'main', 25, False],
     ['R3', 'annex', 31, False]],
    25],
   [{'R0': 3, 'R1': 1, 'R2': 1, 'R3': 2}, {'annex': 6, 'main': 3}, 9]),
  ('normal control 6', [[['R0', 'annex', 61, False]], 30], [{'R0': 3}, {'annex': 4}, 4]),
  ('normal control 7',
   [[['R0', 'main', 31, False], ['R1', 'main', 31, False], ['R2', 'lab', 60, True],
     ['R3', 'annex', 60, False]],
    25],
   [{'R0': 2, 'R1': 2, 'R2': 4, 'R3': 3}, {'main': 5, 'lab': 5, 'annex': 4}, 14]),
  ('normal control 8', [[['R0', 'main', 60, True], ['R1', 'lab', 61, False], ['R2', 'lab', 25, False]], 30],
   [{'R0': 3, 'R1': 3, 'R2': 1}, {'main': 4, 'lab': 5}, 9])],
 [('regression: ratio ceiling 1', [[['R1', 'main', 0, False], ['R2', 'annex', 5, False]], 30],
   [{'R1': 0, 'R2': 1}, {'main': 0, 'annex': 2}, 2]),
  ('regression variant: ratio ceiling 2',
   [[['R0', 'lab', 1, True], ['R1', 'lab', 31, True], ['R2', 'lab', 0, True]], 30],
   [{'R0': 2, 'R1': 3, 'R2': 0}, {'lab': 6}, 6]),
  ('partial repair guard 3', [[['R0', 'annex', 0, True], ['R1', 'lab', 30, False]], 30],
   [{'R0': 0, 'R1': 1}, {'annex': 0, 'lab': 2}, 2]),
  ('boundary control 4', [[['R1', 'main', 31, False]], 30], [{'R1': 2}, {'main': 3}, 3]),
  ('normal control 5',
   [[['R0', 'main', 0, False], ['R1', 'main', 60, False], ['R2', 'main', 0, False],
     ['R3', 'annex', 30, False]],
    30],
   [{'R0': 0, 'R1': 2, 'R2': 0, 'R3': 1}, {'main': 3, 'annex': 2}, 5]),
  ('normal control 6',
   [[['R0', 'main', 31, False], ['R1', 'main', 15, False], ['R2', 'annex', 31, False],
     ['R3', 'main', 0, True], ['R4', 'main', 0, False]],
    25],
   [{'R0': 2, 'R1': 1, 'R2': 2, 'R3': 0, 'R4': 0}, {'main': 4, 'annex': 3}, 7]),
  ('normal control 7',
   [[['R0', 'lab', 0, False], ['R1', 'main', 25, False], ['R2', 'lab', 60, False], ['R3', 'annex', 0, False],
     ['R4', 'annex', 31, False]],
    25],
   [{'R0': 0, 'R1': 1, 'R2': 3, 'R3': 0, 'R4': 2}, {'lab': 4, 'main': 2, 'annex': 3}, 9]),
  ('normal control 8',
   [[['R0', 'lab', 0, False], ['R1', 'lab', 15, False], ['R2', 'annex', 0, False], ['R3', 'annex', 30, False],
     ['R4', 'main', 31, False]],
    25],
   [{'R0': 0, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 2}, {'lab': 2, 'annex': 3, 'main': 3}, 8])],
 [('regression: ratio ceiling 1', [[['R1', 'main', 12, True], ['R2', 'main', 40, False]], 25],
   [{'R1': 2, 'R2': 2}, {'main': 5}, 5]),
  ('regression variant: ratio ceiling 2', [[['R0', 'lab', 0, False], ['R1', 'main', 31, False]], 30],
   [{'R0': 0, 'R1': 2}, {'lab': 0, 'main': 3}, 3]),
  ('partial repair guard 3',
   [[['R0', 'lab', 31, False], ['R1', 'main', 60, True], ['R2', 'lab', 0, False], ['R3', 'annex', 1, False],
     ['R4', 'annex', 15, False]],
    30],
   [{'R0': 2, 'R1': 3, 'R2': 0, 'R3': 1, 'R4': 1}, {'lab': 3, 'main': 4, 'annex': 3}, 10]),
  ('normal control 4',
   [[['R0', 'lab', 25, False], ['R1', 'annex', 61, True], ['R2', 'annex', 1, False],
     ['R3', 'main', 0, False]],
    25],
   [{'R0': 1, 'R1': 4, 'R2': 1, 'R3': 0}, {'lab': 2, 'annex': 6, 'main': 0}, 8]),
  ('normal control 5', [[['R0', 'main', 0, False]], 30], [{'R0': 0}, {'main': 0}, 0]),
  ('normal control 6',
   [[['R0', 'main', 0, False], ['R1', 'annex', 1, False], ['R2', 'main', 15, False], ['R3', 'lab', 0, False],
     ['R4', 'main', 31, False]],
    25],
   [{'R0': 0, 'R1': 1, 'R2': 1, 'R3': 0, 'R4': 2}, {'main': 4, 'annex': 2, 'lab': 0}, 6]),
  ('normal control 7',
   [[['R0', 'main', 61, False], ['R1', 'lab', 60, True], ['R2', 'annex', 30, False], ['R3', 'lab', 25, False],
     ['R4', 'main', 61, False]],
    25],
   [{'R0': 3, 'R1': 4, 'R2': 2, 'R3': 1, 'R4': 3}, {'main': 7, 'lab': 6, 'annex': 3}, 16]),
  ('normal control 8',
   [[['R0', 'annex', 30, False], ['R1', 'annex', 0, True], ['R2', 'main', 0, True], ['R3', 'lab', 0, False],
     ['R4', 'annex', 0, False]],
    25],
   [{'R0': 2, 'R1': 0, 'R2': 0, 'R3': 0, 'R4': 0}, {'annex': 3, 'main': 0, 'lab': 0}, 3])],
 [('regression: ratio ceiling 1', [[['R0', 'lab', 60, False], ['R1', 'lab', 25, True]], 30],
   [{'R0': 2, 'R1': 2}, {'lab': 5}, 5]),
  ('regression variant: ratio ceiling 2', [[['R0', 'annex', 25, True]], 30], [{'R0': 2}, {'annex': 3}, 3]),
  ('partial repair guard 3', [[['R0', 'annex', 30, True], ['R1', 'annex', 15, False]], 30],
   [{'R0': 2, 'R1': 1}, {'annex': 4}, 4]),
  ('boundary control 4', [[['R1', 'main', 0, True]], 30], [{'R1': 0}, {'main': 0}, 0]),
  ('normal control 5', [[['R0', 'main', 0, False], ['R1', 'main', 15, False], ['R2', 'lab', 61, True]], 25],
   [{'R0': 0, 'R1': 1, 'R2': 4}, {'main': 2, 'lab': 5}, 7]),
  ('normal control 6',
   [[['R0', 'annex', 15, False], ['R1', 'lab', 1, False], ['R2', 'lab', 0, False],
     ['R3', 'annex', 25, False]],
    30],
   [{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 1}, {'annex': 3, 'lab': 2}, 5]),
  ('normal control 7',
   [[['R0', 'annex', 31, False], ['R1', 'lab', 60, False], ['R2', 'main', 0, False], ['R3', 'lab', 1, False],
     ['R4', 'annex', 15, False]],
    25],
   [{'R0': 2, 'R1': 3, 'R2': 0, 'R3': 1, 'R4': 1}, {'annex': 4, 'lab': 5, 'main': 0}, 9]),
  ('normal control 8',
   [[['R0', 'main', 30, False], ['R1', 'annex', 61, False], ['R2', 'main', 61, True],
     ['R3', 'annex', 60, False], ['R4', 'annex', 1, True]],
    30],
   [{'R0': 1, 'R1': 3, 'R2': 4, 'R3': 2, 'R4': 2}, {'main': 6, 'annex': 8}, 14])],
 [('regression: ratio ceiling 1',
   [[['R0', 'annex', 31, False], ['R1', 'lab', 25, True], ['R2', 'lab', 61, False], ['R3', 'annex', 1, True]],
    30],
   [{'R0': 2, 'R1': 2, 'R2': 3, 'R3': 2}, {'annex': 5, 'lab': 6}, 11]),
  ('regression variant: ratio ceiling 2',
   [[['R0', 'annex', 61, False], ['R1', 'lab', 15, False], ['R2', 'annex', 1, True],
     ['R3', 'annex', 61, False]],
    30],
   [{'R0': 3, 'R1': 1, 'R2': 2, 'R3': 3}, {'annex': 9, 'lab': 2}, 11]),
  ('partial repair guard 3',
   [[['R0', 'main', 25, False], ['R1', 'lab', 0, False], ['R2', 'main', 1, False], ['R3', 'main', 60, True],
     ['R4', 'main', 15, True]],
    25],
   [{'R0': 1, 'R1': 0, 'R2': 1, 'R3': 4, 'R4': 2}, {'main': 9, 'lab': 0}, 9]),
  ('boundary control 4', [[['R1', 'main', 30, False]], 30], [{'R1': 1}, {'main': 2}, 2]),
  ('normal control 5',
   [[['R0', 'main', 61, True], ['R1', 'annex', 15, False], ['R2', 'main', 30, False], ['R3', 'lab', 1, False],
     ['R4', 'main', 31, True]],
    30],
   [{'R0': 4, 'R1': 1, 'R2': 1, 'R3': 1, 'R4': 3}, {'main': 9, 'annex': 2, 'lab': 2}, 13]),
  ('normal control 6', [[['R0', 'lab', 0, False], ['R1', 'main', 25, True]], 30],
   [{'R0': 0, 'R1': 2}, {'lab': 0, 'main': 3}, 3]),
  ('normal control 7', [[['R0', 'lab', 31, True], ['R1', 'lab', 61, False], ['R2', 'main', 61, False]], 25],
   [{'R0': 3, 'R1': 3, 'R2': 3}, {'lab': 7, 'main': 4}, 11]),
  ('normal control 8',
   [[['R0', 'annex', 0, True], ['R1', 'main', 0, False], ['R2', 'main', 15, False], ['R3', 'lab', 1, True],
     ['R4', 'annex', 25, False]],
    30],
   [{'R0': 0, 'R1': 0, 'R2': 1, 'R3': 2, 'R4': 1}, {'annex': 2, 'main': 2, 'lab': 3}, 7])]]
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: ratio ceiling 1[{'R1': 2}, {'main': 3}, 3][{'R1': 2}, {'main': 3}, 3]Passed
regression variant: ratio ceiling 2[{'R0': 2, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 4}, {'annex': 7, 'lab': 3, 'main': 2}, 12][{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 4}, {'annex': 7, 'lab': 2, 'main': 2}, 11]Failed
partial repair guard 3[{'R0': 3, 'R1': 0, 'R2': 2, 'R3': 2}, {'annex': 3, 'lab': 3, 'main': 4}, 10][{'R0': 2, 'R1': 0, 'R2': 2, 'R3': 1}, {'annex': 2, 'lab': 3, 'main': 3}, 8]Failed
boundary control 4[{'R1': 0, 'R2': 1}, {'annex': 2, 'main': 0}, 2][{'R1': 0, 'R2': 1}, {'annex': 2, 'main': 0}, 2]Passed
normal control 5[{'R0': 3, 'R1': 2, 'R2': 2, 'R3': 2}, {'annex': 6, 'main': 5}, 11][{'R0': 3, 'R1': 1, 'R2': 1, 'R3': 2}, {'annex': 6, 'main': 3}, 9]Failed
normal control 6[{'R0': 3}, {'annex': 4}, 4][{'R0': 3}, {'annex': 4}, 4]Passed
normal control 7[{'R0': 2, 'R1': 2, 'R2': 4, 'R3': 3}, {'annex': 4, 'lab': 5, 'main': 5}, 14][{'R0': 2, 'R1': 2, 'R2': 4, 'R3': 3}, {'annex': 4, 'lab': 5, 'main': 5}, 14]Passed
normal control 8[{'R0': 4, 'R1': 3, 'R2': 1}, {'lab': 5, 'main': 5}, 10][{'R0': 3, 'R1': 3, 'R2': 1}, {'lab': 5, 'main': 4}, 9]Failed

SHA-256 / 5d1d9e68fb379d9feecc4279e57da69dabf96290b8e8d0182de64e6c9868f2bf

3 / The verified repair

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

N = 1
observations = []
def solve(rooms, ratio):
    per = {}
    venue = {}
    for r, v, n, acc in rooms:
        k = 0
        if n > 0:
            k = -(-n // ratio)
            if acc:
                k += 1
        per[r] = k
        venue.setdefault(v, 0)
        venue[v] += k
    for v in venue:
        if venue[v] > 0:
            venue[v] += 1
    return [per, venue, sum(venue.values())]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: ratio ceiling 1', [[['R1', 'main', 31, False]], 30], [{'R1': 2}, {'main': 3}, 3]),
  ('regression variant: ratio ceiling 2',
   [[['R0', 'lab', 25, False], ['R1', 'main', 1, False], ['R2', 'main', 0, True], ['R3', 'annex', 31, False],
     ['R4', 'annex', 60, True]],
    25],
   [{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 4}, {'lab': 2, 'main': 2, 'annex': 7}, 11]),
  ('partial repair guard 3',
   [[['R0', 'main', 60, False], ['R1', 'main', 0, False], ['R2', 'lab', 15, True],
     ['R3', 'annex', 30, False]],
    30],
   [{'R0': 2, 'R1': 0, 'R2': 2, 'R3': 1}, {'main': 3, 'lab': 3, 'annex': 2}, 8]),
  ('boundary control 4', [[['R1', 'main', 0, False], ['R2', 'annex', 5, False]], 30],
   [{'R1': 0, 'R2': 1}, {'main': 0, 'annex': 2}, 2]),
  ('normal control 5',
   [[['R0', 'annex', 31, True], ['R1', 'main', 25, False], ['R2', 'main', 25, False],
     ['R3', 'annex', 31, False]],
    25],
   [{'R0': 3, 'R1': 1, 'R2': 1, 'R3': 2}, {'annex': 6, 'main': 3}, 9]),
  ('normal control 6', [[['R0', 'annex', 61, False]], 30], [{'R0': 3}, {'annex': 4}, 4]),
  ('normal control 7',
   [[['R0', 'main', 31, False], ['R1', 'main', 31, False], ['R2', 'lab', 60, True],
     ['R3', 'annex', 60, False]],
    25],
   [{'R0': 2, 'R1': 2, 'R2': 4, 'R3': 3}, {'main': 5, 'lab': 5, 'annex': 4}, 14]),
  ('normal control 8', [[['R0', 'main', 60, True], ['R1', 'lab', 61, False], ['R2', 'lab', 25, False]], 30],
   [{'R0': 3, 'R1': 3, 'R2': 1}, {'main': 4, 'lab': 5}, 9])],
 [('regression: ratio ceiling 1', [[['R1', 'main', 0, False], ['R2', 'annex', 5, False]], 30],
   [{'R1': 0, 'R2': 1}, {'main': 0, 'annex': 2}, 2]),
  ('regression variant: ratio ceiling 2',
   [[['R0', 'lab', 1, True], ['R1', 'lab', 31, True], ['R2', 'lab', 0, True]], 30],
   [{'R0': 2, 'R1': 3, 'R2': 0}, {'lab': 6}, 6]),
  ('partial repair guard 3', [[['R0', 'annex', 0, True], ['R1', 'lab', 30, False]], 30],
   [{'R0': 0, 'R1': 1}, {'annex': 0, 'lab': 2}, 2]),
  ('boundary control 4', [[['R1', 'main', 31, False]], 30], [{'R1': 2}, {'main': 3}, 3]),
  ('normal control 5',
   [[['R0', 'main', 0, False], ['R1', 'main', 60, False], ['R2', 'main', 0, False],
     ['R3', 'annex', 30, False]],
    30],
   [{'R0': 0, 'R1': 2, 'R2': 0, 'R3': 1}, {'main': 3, 'annex': 2}, 5]),
  ('normal control 6',
   [[['R0', 'main', 31, False], ['R1', 'main', 15, False], ['R2', 'annex', 31, False],
     ['R3', 'main', 0, True], ['R4', 'main', 0, False]],
    25],
   [{'R0': 2, 'R1': 1, 'R2': 2, 'R3': 0, 'R4': 0}, {'main': 4, 'annex': 3}, 7]),
  ('normal control 7',
   [[['R0', 'lab', 0, False], ['R1', 'main', 25, False], ['R2', 'lab', 60, False], ['R3', 'annex', 0, False],
     ['R4', 'annex', 31, False]],
    25],
   [{'R0': 0, 'R1': 1, 'R2': 3, 'R3': 0, 'R4': 2}, {'lab': 4, 'main': 2, 'annex': 3}, 9]),
  ('normal control 8',
   [[['R0', 'lab', 0, False], ['R1', 'lab', 15, False], ['R2', 'annex', 0, False], ['R3', 'annex', 30, False],
     ['R4', 'main', 31, False]],
    25],
   [{'R0': 0, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 2}, {'lab': 2, 'annex': 3, 'main': 3}, 8])],
 [('regression: ratio ceiling 1', [[['R1', 'main', 12, True], ['R2', 'main', 40, False]], 25],
   [{'R1': 2, 'R2': 2}, {'main': 5}, 5]),
  ('regression variant: ratio ceiling 2', [[['R0', 'lab', 0, False], ['R1', 'main', 31, False]], 30],
   [{'R0': 0, 'R1': 2}, {'lab': 0, 'main': 3}, 3]),
  ('partial repair guard 3',
   [[['R0', 'lab', 31, False], ['R1', 'main', 60, True], ['R2', 'lab', 0, False], ['R3', 'annex', 1, False],
     ['R4', 'annex', 15, False]],
    30],
   [{'R0': 2, 'R1': 3, 'R2': 0, 'R3': 1, 'R4': 1}, {'lab': 3, 'main': 4, 'annex': 3}, 10]),
  ('normal control 4',
   [[['R0', 'lab', 25, False], ['R1', 'annex', 61, True], ['R2', 'annex', 1, False],
     ['R3', 'main', 0, False]],
    25],
   [{'R0': 1, 'R1': 4, 'R2': 1, 'R3': 0}, {'lab': 2, 'annex': 6, 'main': 0}, 8]),
  ('normal control 5', [[['R0', 'main', 0, False]], 30], [{'R0': 0}, {'main': 0}, 0]),
  ('normal control 6',
   [[['R0', 'main', 0, False], ['R1', 'annex', 1, False], ['R2', 'main', 15, False], ['R3', 'lab', 0, False],
     ['R4', 'main', 31, False]],
    25],
   [{'R0': 0, 'R1': 1, 'R2': 1, 'R3': 0, 'R4': 2}, {'main': 4, 'annex': 2, 'lab': 0}, 6]),
  ('normal control 7',
   [[['R0', 'main', 61, False], ['R1', 'lab', 60, True], ['R2', 'annex', 30, False], ['R3', 'lab', 25, False],
     ['R4', 'main', 61, False]],
    25],
   [{'R0': 3, 'R1': 4, 'R2': 2, 'R3': 1, 'R4': 3}, {'main': 7, 'lab': 6, 'annex': 3}, 16]),
  ('normal control 8',
   [[['R0', 'annex', 30, False], ['R1', 'annex', 0, True], ['R2', 'main', 0, True], ['R3', 'lab', 0, False],
     ['R4', 'annex', 0, False]],
    25],
   [{'R0': 2, 'R1': 0, 'R2': 0, 'R3': 0, 'R4': 0}, {'annex': 3, 'main': 0, 'lab': 0}, 3])],
 [('regression: ratio ceiling 1', [[['R0', 'lab', 60, False], ['R1', 'lab', 25, True]], 30],
   [{'R0': 2, 'R1': 2}, {'lab': 5}, 5]),
  ('regression variant: ratio ceiling 2', [[['R0', 'annex', 25, True]], 30], [{'R0': 2}, {'annex': 3}, 3]),
  ('partial repair guard 3', [[['R0', 'annex', 30, True], ['R1', 'annex', 15, False]], 30],
   [{'R0': 2, 'R1': 1}, {'annex': 4}, 4]),
  ('boundary control 4', [[['R1', 'main', 0, True]], 30], [{'R1': 0}, {'main': 0}, 0]),
  ('normal control 5', [[['R0', 'main', 0, False], ['R1', 'main', 15, False], ['R2', 'lab', 61, True]], 25],
   [{'R0': 0, 'R1': 1, 'R2': 4}, {'main': 2, 'lab': 5}, 7]),
  ('normal control 6',
   [[['R0', 'annex', 15, False], ['R1', 'lab', 1, False], ['R2', 'lab', 0, False],
     ['R3', 'annex', 25, False]],
    30],
   [{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 1}, {'annex': 3, 'lab': 2}, 5]),
  ('normal control 7',
   [[['R0', 'annex', 31, False], ['R1', 'lab', 60, False], ['R2', 'main', 0, False], ['R3', 'lab', 1, False],
     ['R4', 'annex', 15, False]],
    25],
   [{'R0': 2, 'R1': 3, 'R2': 0, 'R3': 1, 'R4': 1}, {'annex': 4, 'lab': 5, 'main': 0}, 9]),
  ('normal control 8',
   [[['R0', 'main', 30, False], ['R1', 'annex', 61, False], ['R2', 'main', 61, True],
     ['R3', 'annex', 60, False], ['R4', 'annex', 1, True]],
    30],
   [{'R0': 1, 'R1': 3, 'R2': 4, 'R3': 2, 'R4': 2}, {'main': 6, 'annex': 8}, 14])],
 [('regression: ratio ceiling 1',
   [[['R0', 'annex', 31, False], ['R1', 'lab', 25, True], ['R2', 'lab', 61, False], ['R3', 'annex', 1, True]],
    30],
   [{'R0': 2, 'R1': 2, 'R2': 3, 'R3': 2}, {'annex': 5, 'lab': 6}, 11]),
  ('regression variant: ratio ceiling 2',
   [[['R0', 'annex', 61, False], ['R1', 'lab', 15, False], ['R2', 'annex', 1, True],
     ['R3', 'annex', 61, False]],
    30],
   [{'R0': 3, 'R1': 1, 'R2': 2, 'R3': 3}, {'annex': 9, 'lab': 2}, 11]),
  ('partial repair guard 3',
   [[['R0', 'main', 25, False], ['R1', 'lab', 0, False], ['R2', 'main', 1, False], ['R3', 'main', 60, True],
     ['R4', 'main', 15, True]],
    25],
   [{'R0': 1, 'R1': 0, 'R2': 1, 'R3': 4, 'R4': 2}, {'main': 9, 'lab': 0}, 9]),
  ('boundary control 4', [[['R1', 'main', 30, False]], 30], [{'R1': 1}, {'main': 2}, 2]),
  ('normal control 5',
   [[['R0', 'main', 61, True], ['R1', 'annex', 15, False], ['R2', 'main', 30, False], ['R3', 'lab', 1, False],
     ['R4', 'main', 31, True]],
    30],
   [{'R0': 4, 'R1': 1, 'R2': 1, 'R3': 1, 'R4': 3}, {'main': 9, 'annex': 2, 'lab': 2}, 13]),
  ('normal control 6', [[['R0', 'lab', 0, False], ['R1', 'main', 25, True]], 30],
   [{'R0': 0, 'R1': 2}, {'lab': 0, 'main': 3}, 3]),
  ('normal control 7', [[['R0', 'lab', 31, True], ['R1', 'lab', 61, False], ['R2', 'main', 61, False]], 25],
   [{'R0': 3, 'R1': 3, 'R2': 3}, {'lab': 7, 'main': 4}, 11]),
  ('normal control 8',
   [[['R0', 'annex', 0, True], ['R1', 'main', 0, False], ['R2', 'main', 15, False], ['R3', 'lab', 1, True],
     ['R4', 'annex', 25, False]],
    30],
   [{'R0': 0, 'R1': 0, 'R2': 1, 'R3': 2, 'R4': 1}, {'annex': 2, 'main': 2, 'lab': 3}, 7])]]
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: ratio ceiling 1[{'R1': 2}, {'main': 3}, 3][{'R1': 2}, {'main': 3}, 3]Passed
regression variant: ratio ceiling 2[{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 4}, {'annex': 7, 'lab': 2, 'main': 2}, 11][{'R0': 1, 'R1': 1, 'R2': 0, 'R3': 2, 'R4': 4}, {'annex': 7, 'lab': 2, 'main': 2}, 11]Passed
partial repair guard 3[{'R0': 2, 'R1': 0, 'R2': 2, 'R3': 1}, {'annex': 2, 'lab': 3, 'main': 3}, 8][{'R0': 2, 'R1': 0, 'R2': 2, 'R3': 1}, {'annex': 2, 'lab': 3, 'main': 3}, 8]Passed
boundary control 4[{'R1': 0, 'R2': 1}, {'annex': 2, 'main': 0}, 2][{'R1': 0, 'R2': 1}, {'annex': 2, 'main': 0}, 2]Passed
normal control 5[{'R0': 3, 'R1': 1, 'R2': 1, 'R3': 2}, {'annex': 6, 'main': 3}, 9][{'R0': 3, 'R1': 1, 'R2': 1, 'R3': 2}, {'annex': 6, 'main': 3}, 9]Passed
normal control 6[{'R0': 3}, {'annex': 4}, 4][{'R0': 3}, {'annex': 4}, 4]Passed
normal control 7[{'R0': 2, 'R1': 2, 'R2': 4, 'R3': 3}, {'annex': 4, 'lab': 5, 'main': 5}, 14][{'R0': 2, 'R1': 2, 'R2': 4, 'R3': 3}, {'annex': 4, 'lab': 5, 'main': 5}, 14]Passed
normal control 8[{'R0': 3, 'R1': 3, 'R2': 1}, {'lab': 5, 'main': 4}, 9][{'R0': 3, 'R1': 3, 'R2': 1}, {'lab': 5, 'main': 4}, 9]Passed

SHA-256 / 9001eb719db0f24f2dcc9400a698da90336cc61c5fae3f8ad402f94c7266c2d4

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

Case digest / 0d6ae2f6535941500683dc8712f70b0c62ca0b053d071905b928a89cd2cd3545