{"abstract":"An exam split across rooms in the same period is flagged as occupying several periods.","category":"Exam timetabling constraints","checks":8,"contract":"assign [exam, room, period] (rows may repeat); building room -> building; k = maximum distinct exams per room-period. Findings per exam (by id): multi_period if it occupies more than one period, split_buildings if its rooms span more than one building; then room_load for room-periods hosting more than k distinct exams.","evaluation_group":"w2-exam-timetabling-constraints-split-exam-building-and-room-load","failed_approach":"Requiring non-adjacent periods misses exams spread over adjacent periods.","family":"w2-exam-timetabling-constraints-split-exam-building-and-room-load-multi-period-rows","id":"FA-94811","implementations":{"attempt":{"sha256":"50c8cc2ae4fb656d5618c483494a10cf819a2673305e44f72faf01f989b27f10","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(assign, building, k):\n    rooms_of = {}\n    periods_of = {}\n    load = {}\n    for ex, r, p in assign:\n        rooms_of.setdefault(ex, []).append(r)\n        periods_of.setdefault(ex, set()).add(p)\n        load.setdefault((r, p), set()).add(ex)\n    out = []\n    for ex in sorted(rooms_of):\n        if max(periods_of[ex]) - min(periods_of[ex]) > 1:\n            out.append(['multi_period', ex])\n        if len({building[r] for r in rooms_of[ex]}) > 1:\n            out.append(['split_buildings', ex])\n    for (r, p) in sorted(load):\n        if len(load[(r, p)]) > k:\n            out.append(['room_load', r, p])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: multi period rows 1',\n   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),\n  ('regression variant: multi period rows 2',\n   [[['CHEM120', 'R1', 2], ['MATH101H', 'R3', 2], ['MATH101H', 'R4', 2], ['MATH101H', 'R4', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('partial repair guard 3',\n   [[['CHEM120', 'R2', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1], ['MATH101', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R1', 1]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'A']]),\n  ('normal control 5',\n   [[['CHEM120', 'R4', 2], ['MATH101', 'R4', 1], ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 0],\n     ['MATH101', 'R4', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']]),\n  ('normal control 6',\n   [[['MATH101H', 'R3', 2], ['CHEM120', 'R1', 1], ['PHYS110', 'R1', 2], ['MATH101', 'R4', 0],\n     ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101']]),\n  ('normal control 7',\n   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101', 'R4', 0], ['MATH101', 'R1', 0],\n     ['MATH101H', 'R2', 0], ['MATH101', 'R4', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']]),\n  ('normal control 8',\n   [[['PHYS110', 'R3', 0], ['MATH101', 'R3', 0], ['MATH101', 'R4', 2], ['PHYS110', 'R4', 0],\n     ['PHYS110', 'R2', 1], ['PHYS110', 'R2', 0], ['MATH101H', 'R4', 0], ['PHYS110', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],\n    ['room_load', 'R3', 0], ['room_load', 'R4', 0]])],\n [('regression: multi period rows 1',\n   [[['A', 'R1', 0], ['A', 'R3', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['split_buildings', 'A']]),\n  ('regression variant: multi period rows 2',\n   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],\n     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['PHYS110', 'R1', 0], ['MATH101', 'R3', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R4', 1],\n     ['PHYS110', 'R3', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),\n  ('normal control 4',\n   [[['PHYS110', 'R2', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 1], ['MATH101', 'R1', 1],\n     ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120']]),\n  ('normal control 5',\n   [[['MATH101H', 'R3', 0], ['CHEM120', 'R3', 1], ['MATH101', 'R4', 2], ['CHEM120', 'R3', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('normal control 6',\n   [[['MATH101', 'R1', 2], ['PHYS110', 'R1', 1], ['CHEM120', 'R2', 1], ['MATH101H', 'R3', 0],\n     ['MATH101', 'R1', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101'], ['room_load', 'R1', 1]]),\n  ('normal control 7',\n   [[['MATH101', 'R4', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R3', 2], ['CHEM120', 'R3', 2],\n     ['PHYS110', 'R2', 2], ['CHEM120', 'R4', 2], ['PHYS110', 'R1', 1], ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110'],\n    ['split_buildings', 'PHYS110']]),\n  ('normal control 8',\n   [[['PHYS110', 'R4', 0], ['MATH101H', 'R3', 2], ['MATH101', 'R4', 1], ['MATH101', 'R3', 2],\n     ['MATH101', 'R4', 1], ['CHEM120', 'R1', 2], ['CHEM120', 'R3', 1], ['CHEM120', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],\n    ['room_load', 'R3', 2]])],\n [('regression: multi period rows 1',\n   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('regression variant: multi period rows 2',\n   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],\n     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R1', 2]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'A']]),\n  ('normal control 5',\n   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101H', 'R3', 2], ['PHYS110', 'R3', 0],\n     ['MATH101H', 'R1', 0], ['MATH101H', 'R3', 0], ['MATH101H', 'R4', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H']]),\n  ('normal control 6',\n   [[['PHYS110', 'R1', 2], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 7',\n   [[['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0], ['PHYS110', 'R1', 2], ['PHYS110', 'R1', 1],\n     ['CHEM120', 'R1', 0], ['PHYS110', 'R3', 0], ['MATH101H', 'R4', 1], ['MATH101', 'R1', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['split_buildings', 'MATH101H'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],\n    ['room_load', 'R1', 1]]),\n  ('normal control 8',\n   [[['PHYS110', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101H', 'R4', 0], ['MATH101H', 'R3', 1],\n     ['PHYS110', 'R3', 2], ['PHYS110', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']])],\n [('regression: multi period rows 1',\n   [[['MATH101H', 'R3', 1], ['MATH101', 'R2', 0], ['MATH101', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('regression variant: multi period rows 2',\n   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],\n     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('normal control 5',\n   [[['PHYS110', 'R2', 0], ['MATH101', 'R1', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 6',\n   [[['MATH101', 'R2', 0], ['MATH101', 'R1', 0], ['MATH101', 'R1', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 7',\n   [[['PHYS110', 'R2', 2], ['CHEM120', 'R4', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 8',\n   [[['PHYS110', 'R4', 2], ['PHYS110', 'R2', 2], ['MATH101', 'R3', 0], ['PHYS110', 'R2', 0],\n     ['PHYS110', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']])],\n [('regression: multi period rows 1',\n   [[['MATH101', 'R2', 2], ['MATH101H', 'R2', 1], ['MATH101', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('regression variant: multi period rows 2',\n   [[['CHEM120', 'R2', 0], ['MATH101', 'R1', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R4', 1],\n     ['PHYS110', 'R1', 2], ['MATH101', 'R4', 1], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 2],\n     ['CHEM120', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],\n     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),\n  ('normal control 5',\n   [[['MATH101H', 'R1', 1], ['PHYS110', 'R3', 2], ['MATH101', 'R3', 0], ['MATH101', 'R2', 2],\n     ['MATH101H', 'R3', 1], ['PHYS110', 'R1', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['split_buildings', 'MATH101H'],\n    ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R1', 1]]),\n  ('normal control 6',\n   [[['CHEM120', 'R4', 1], ['MATH101H', 'R1', 1], ['MATH101', 'R2', 1], ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 7',\n   [[['CHEM120', 'R3', 2], ['MATH101', 'R3', 2], ['PHYS110', 'R1', 2], ['MATH101H', 'R1', 0],\n     ['MATH101H', 'R3', 2], ['MATH101', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H'], ['room_load', 'R3', 2]]),\n  ('normal control 8',\n   [[['CHEM120', 'R2', 1], ['MATH101', 'R2', 1], ['MATH101', 'R3', 2], ['CHEM120', 'R1', 2],\n     ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 2], ['MATH101', 'R4', 1], ['PHYS110', 'R2', 0],\n     ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],\n    ['split_buildings', 'MATH101'], ['room_load', 'R2', 1]])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"97ff1d3031387a514a1f6b9f7899e93ca40b846a9a76fb8d630372dbe8b15ab3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(assign, building, k):\n    rooms_of = {}\n    periods_of = {}\n    load = {}\n    for ex, r, p in assign:\n        rooms_of.setdefault(ex, []).append(r)\n        periods_of.setdefault(ex, []).append(p)\n        load.setdefault((r, p), set()).add(ex)\n    out = []\n    for ex in sorted(rooms_of):\n        if len(periods_of[ex]) > 1:\n            out.append(['multi_period', ex])\n        if len({building[r] for r in rooms_of[ex]}) > 1:\n            out.append(['split_buildings', ex])\n    for (r, p) in sorted(load):\n        if len(load[(r, p)]) > k:\n            out.append(['room_load', r, p])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: multi period rows 1',\n   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),\n  ('regression variant: multi period rows 2',\n   [[['CHEM120', 'R1', 2], ['MATH101H', 'R3', 2], ['MATH101H', 'R4', 2], ['MATH101H', 'R4', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('partial repair guard 3',\n   [[['CHEM120', 'R2', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1], ['MATH101', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R1', 1]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'A']]),\n  ('normal control 5',\n   [[['CHEM120', 'R4', 2], ['MATH101', 'R4', 1], ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 0],\n     ['MATH101', 'R4', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']]),\n  ('normal control 6',\n   [[['MATH101H', 'R3', 2], ['CHEM120', 'R1', 1], ['PHYS110', 'R1', 2], ['MATH101', 'R4', 0],\n     ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101']]),\n  ('normal control 7',\n   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101', 'R4', 0], ['MATH101', 'R1', 0],\n     ['MATH101H', 'R2', 0], ['MATH101', 'R4', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']]),\n  ('normal control 8',\n   [[['PHYS110', 'R3', 0], ['MATH101', 'R3', 0], ['MATH101', 'R4', 2], ['PHYS110', 'R4', 0],\n     ['PHYS110', 'R2', 1], ['PHYS110', 'R2', 0], ['MATH101H', 'R4', 0], ['PHYS110', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],\n    ['room_load', 'R3', 0], ['room_load', 'R4', 0]])],\n [('regression: multi period rows 1',\n   [[['A', 'R1', 0], ['A', 'R3', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['split_buildings', 'A']]),\n  ('regression variant: multi period rows 2',\n   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],\n     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['PHYS110', 'R1', 0], ['MATH101', 'R3', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R4', 1],\n     ['PHYS110', 'R3', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),\n  ('normal control 4',\n   [[['PHYS110', 'R2', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 1], ['MATH101', 'R1', 1],\n     ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120']]),\n  ('normal control 5',\n   [[['MATH101H', 'R3', 0], ['CHEM120', 'R3', 1], ['MATH101', 'R4', 2], ['CHEM120', 'R3', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('normal control 6',\n   [[['MATH101', 'R1', 2], ['PHYS110', 'R1', 1], ['CHEM120', 'R2', 1], ['MATH101H', 'R3', 0],\n     ['MATH101', 'R1', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101'], ['room_load', 'R1', 1]]),\n  ('normal control 7',\n   [[['MATH101', 'R4', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R3', 2], ['CHEM120', 'R3', 2],\n     ['PHYS110', 'R2', 2], ['CHEM120', 'R4', 2], ['PHYS110', 'R1', 1], ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110'],\n    ['split_buildings', 'PHYS110']]),\n  ('normal control 8',\n   [[['PHYS110', 'R4', 0], ['MATH101H', 'R3', 2], ['MATH101', 'R4', 1], ['MATH101', 'R3', 2],\n     ['MATH101', 'R4', 1], ['CHEM120', 'R1', 2], ['CHEM120', 'R3', 1], ['CHEM120', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],\n    ['room_load', 'R3', 2]])],\n [('regression: multi period rows 1',\n   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('regression variant: multi period rows 2',\n   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],\n     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R1', 2]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'A']]),\n  ('normal control 5',\n   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101H', 'R3', 2], ['PHYS110', 'R3', 0],\n     ['MATH101H', 'R1', 0], ['MATH101H', 'R3', 0], ['MATH101H', 'R4', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H']]),\n  ('normal control 6',\n   [[['PHYS110', 'R1', 2], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 7',\n   [[['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0], ['PHYS110', 'R1', 2], ['PHYS110', 'R1', 1],\n     ['CHEM120', 'R1', 0], ['PHYS110', 'R3', 0], ['MATH101H', 'R4', 1], ['MATH101', 'R1', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['split_buildings', 'MATH101H'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],\n    ['room_load', 'R1', 1]]),\n  ('normal control 8',\n   [[['PHYS110', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101H', 'R4', 0], ['MATH101H', 'R3', 1],\n     ['PHYS110', 'R3', 2], ['PHYS110', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']])],\n [('regression: multi period rows 1',\n   [[['MATH101H', 'R3', 1], ['MATH101', 'R2', 0], ['MATH101', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('regression variant: multi period rows 2',\n   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],\n     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('normal control 5',\n   [[['PHYS110', 'R2', 0], ['MATH101', 'R1', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 6',\n   [[['MATH101', 'R2', 0], ['MATH101', 'R1', 0], ['MATH101', 'R1', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 7',\n   [[['PHYS110', 'R2', 2], ['CHEM120', 'R4', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 8',\n   [[['PHYS110', 'R4', 2], ['PHYS110', 'R2', 2], ['MATH101', 'R3', 0], ['PHYS110', 'R2', 0],\n     ['PHYS110', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']])],\n [('regression: multi period rows 1',\n   [[['MATH101', 'R2', 2], ['MATH101H', 'R2', 1], ['MATH101', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('regression variant: multi period rows 2',\n   [[['CHEM120', 'R2', 0], ['MATH101', 'R1', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R4', 1],\n     ['PHYS110', 'R1', 2], ['MATH101', 'R4', 1], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 2],\n     ['CHEM120', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],\n     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),\n  ('normal control 5',\n   [[['MATH101H', 'R1', 1], ['PHYS110', 'R3', 2], ['MATH101', 'R3', 0], ['MATH101', 'R2', 2],\n     ['MATH101H', 'R3', 1], ['PHYS110', 'R1', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['split_buildings', 'MATH101H'],\n    ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R1', 1]]),\n  ('normal control 6',\n   [[['CHEM120', 'R4', 1], ['MATH101H', 'R1', 1], ['MATH101', 'R2', 1], ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 7',\n   [[['CHEM120', 'R3', 2], ['MATH101', 'R3', 2], ['PHYS110', 'R1', 2], ['MATH101H', 'R1', 0],\n     ['MATH101H', 'R3', 2], ['MATH101', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H'], ['room_load', 'R3', 2]]),\n  ('normal control 8',\n   [[['CHEM120', 'R2', 1], ['MATH101', 'R2', 1], ['MATH101', 'R3', 2], ['CHEM120', 'R1', 2],\n     ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 2], ['MATH101', 'R4', 1], ['PHYS110', 'R2', 0],\n     ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],\n    ['split_buildings', 'MATH101'], ['room_load', 'R2', 1]])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"807e8d5c1db686be25bd65828067ab4d389304976063c32d84c42f76b0031c10","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(assign, building, k):\n    rooms_of = {}\n    periods_of = {}\n    load = {}\n    for ex, r, p in assign:\n        rooms_of.setdefault(ex, []).append(r)\n        periods_of.setdefault(ex, set()).add(p)\n        load.setdefault((r, p), set()).add(ex)\n    out = []\n    for ex in sorted(rooms_of):\n        if len(periods_of[ex]) > 1:\n            out.append(['multi_period', ex])\n        if len({building[r] for r in rooms_of[ex]}) > 1:\n            out.append(['split_buildings', ex])\n    for (r, p) in sorted(load):\n        if len(load[(r, p)]) > k:\n            out.append(['room_load', r, p])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: multi period rows 1',\n   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),\n  ('regression variant: multi period rows 2',\n   [[['CHEM120', 'R1', 2], ['MATH101H', 'R3', 2], ['MATH101H', 'R4', 2], ['MATH101H', 'R4', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('partial repair guard 3',\n   [[['CHEM120', 'R2', 2], ['MATH101', 'R1', 2], ['CHEM120', 'R1', 1], ['MATH101', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R1', 1]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'A']]),\n  ('normal control 5',\n   [[['CHEM120', 'R4', 2], ['MATH101', 'R4', 1], ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 0],\n     ['MATH101', 'R4', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120']]),\n  ('normal control 6',\n   [[['MATH101H', 'R3', 2], ['CHEM120', 'R1', 1], ['PHYS110', 'R1', 2], ['MATH101', 'R4', 0],\n     ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101']]),\n  ('normal control 7',\n   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101', 'R4', 0], ['MATH101', 'R1', 0],\n     ['MATH101H', 'R2', 0], ['MATH101', 'R4', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['split_buildings', 'MATH101'], ['multi_period', 'MATH101H']]),\n  ('normal control 8',\n   [[['PHYS110', 'R3', 0], ['MATH101', 'R3', 0], ['MATH101', 'R4', 2], ['PHYS110', 'R4', 0],\n     ['PHYS110', 'R2', 1], ['PHYS110', 'R2', 0], ['MATH101H', 'R4', 0], ['PHYS110', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],\n    ['room_load', 'R3', 0], ['room_load', 'R4', 0]])],\n [('regression: multi period rows 1',\n   [[['A', 'R1', 0], ['A', 'R3', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['split_buildings', 'A']]),\n  ('regression variant: multi period rows 2',\n   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],\n     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['PHYS110', 'R1', 0], ['MATH101', 'R3', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R4', 1],\n     ['PHYS110', 'R3', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),\n  ('normal control 4',\n   [[['PHYS110', 'R2', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 1], ['MATH101', 'R1', 1],\n     ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120']]),\n  ('normal control 5',\n   [[['MATH101H', 'R3', 0], ['CHEM120', 'R3', 1], ['MATH101', 'R4', 2], ['CHEM120', 'R3', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('normal control 6',\n   [[['MATH101', 'R1', 2], ['PHYS110', 'R1', 1], ['CHEM120', 'R2', 1], ['MATH101H', 'R3', 0],\n     ['MATH101', 'R1', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101'], ['room_load', 'R1', 1]]),\n  ('normal control 7',\n   [[['MATH101', 'R4', 0], ['CHEM120', 'R3', 2], ['PHYS110', 'R3', 2], ['CHEM120', 'R3', 2],\n     ['PHYS110', 'R2', 2], ['CHEM120', 'R4', 2], ['PHYS110', 'R1', 1], ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110'],\n    ['split_buildings', 'PHYS110']]),\n  ('normal control 8',\n   [[['PHYS110', 'R4', 0], ['MATH101H', 'R3', 2], ['MATH101', 'R4', 1], ['MATH101', 'R3', 2],\n     ['MATH101', 'R4', 1], ['CHEM120', 'R1', 2], ['CHEM120', 'R3', 1], ['CHEM120', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],\n    ['room_load', 'R3', 2]])],\n [('regression: multi period rows 1',\n   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('regression variant: multi period rows 2',\n   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['PHYS110', 'R4', 2], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2], ['CHEM120', 'R1', 0],\n     ['MATH101H', 'R1', 0], ['MATH101H', 'R2', 1], ['PHYS110', 'R1', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R1', 2]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'A']]),\n  ('normal control 5',\n   [[['MATH101', 'R1', 0], ['MATH101H', 'R1', 1], ['MATH101H', 'R3', 2], ['PHYS110', 'R3', 0],\n     ['MATH101H', 'R1', 0], ['MATH101H', 'R3', 0], ['MATH101H', 'R4', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H']]),\n  ('normal control 6',\n   [[['PHYS110', 'R1', 2], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 7',\n   [[['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0], ['PHYS110', 'R1', 2], ['PHYS110', 'R1', 1],\n     ['CHEM120', 'R1', 0], ['PHYS110', 'R3', 0], ['MATH101H', 'R4', 1], ['MATH101', 'R1', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['split_buildings', 'MATH101H'], ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'],\n    ['room_load', 'R1', 1]]),\n  ('normal control 8',\n   [[['PHYS110', 'R2', 2], ['CHEM120', 'R1', 0], ['MATH101H', 'R4', 0], ['MATH101H', 'R3', 1],\n     ['PHYS110', 'R3', 2], ['PHYS110', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'PHYS110']])],\n [('regression: multi period rows 1',\n   [[['MATH101H', 'R3', 1], ['MATH101', 'R2', 0], ['MATH101', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('regression variant: multi period rows 2',\n   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],\n     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['PHYS110', 'R4', 1], ['CHEM120', 'R2', 2], ['PHYS110', 'R1', 0], ['CHEM120', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R1', 0], ['B', 'R1', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('normal control 5',\n   [[['PHYS110', 'R2', 0], ['MATH101', 'R1', 1], ['CHEM120', 'R3', 2], ['CHEM120', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 6',\n   [[['MATH101', 'R2', 0], ['MATH101', 'R1', 0], ['MATH101', 'R1', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 7',\n   [[['PHYS110', 'R2', 2], ['CHEM120', 'R4', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 8',\n   [[['PHYS110', 'R4', 2], ['PHYS110', 'R2', 2], ['MATH101', 'R3', 0], ['PHYS110', 'R2', 0],\n     ['PHYS110', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110']])],\n [('regression: multi period rows 1',\n   [[['MATH101', 'R2', 2], ['MATH101H', 'R2', 1], ['MATH101', 'R2', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   []),\n  ('regression variant: multi period rows 2',\n   [[['CHEM120', 'R2', 0], ['MATH101', 'R1', 1], ['PHYS110', 'R2', 1], ['MATH101', 'R4', 1],\n     ['PHYS110', 'R1', 2], ['MATH101', 'R4', 1], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 2],\n     ['CHEM120', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'MATH101'], ['multi_period', 'PHYS110']]),\n  ('partial repair guard 3',\n   [[['CHEM120', 'R3', 1], ['MATH101', 'R1', 0], ['MATH101H', 'R2', 1], ['CHEM120', 'R2', 0],\n     ['PHYS110', 'R1', 0], ['PHYS110', 'R2', 2], ['MATH101H', 'R1', 1], ['CHEM120', 'R2', 0]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 2],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'PHYS110']]),\n  ('boundary control 4',\n   [[['A', 'R1', 0], ['A', 'R2', 0]], {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1], []),\n  ('normal control 5',\n   [[['MATH101H', 'R1', 1], ['PHYS110', 'R3', 2], ['MATH101', 'R3', 0], ['MATH101', 'R2', 2],\n     ['MATH101H', 'R3', 1], ['PHYS110', 'R1', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101'], ['split_buildings', 'MATH101'], ['split_buildings', 'MATH101H'],\n    ['multi_period', 'PHYS110'], ['split_buildings', 'PHYS110'], ['room_load', 'R1', 1]]),\n  ('normal control 6',\n   [[['CHEM120', 'R4', 1], ['MATH101H', 'R1', 1], ['MATH101', 'R2', 1], ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   []),\n  ('normal control 7',\n   [[['CHEM120', 'R3', 2], ['MATH101', 'R3', 2], ['PHYS110', 'R1', 2], ['MATH101H', 'R1', 0],\n     ['MATH101H', 'R3', 2], ['MATH101', 'R3', 2]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'MATH101H'], ['split_buildings', 'MATH101H'], ['room_load', 'R3', 2]]),\n  ('normal control 8',\n   [[['CHEM120', 'R2', 1], ['MATH101', 'R2', 1], ['MATH101', 'R3', 2], ['CHEM120', 'R1', 2],\n     ['CHEM120', 'R4', 0], ['CHEM120', 'R1', 2], ['MATH101', 'R4', 1], ['PHYS110', 'R2', 0],\n     ['MATH101', 'R2', 1]],\n    {'R1': 'north', 'R2': 'north', 'R3': 'south', 'R4': 'south'}, 1],\n   [['multi_period', 'CHEM120'], ['split_buildings', 'CHEM120'], ['multi_period', 'MATH101'],\n    ['split_buildings', 'MATH101'], ['room_load', 'R2', 1]])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-exam-timetabling-constraints-split-exam-building-and-room-load-multi-period-rows","generated_at":"2026-09-29T14:52:07.890193+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Split exams must stay in one building and rooms have limits on concurrent exams.","repair":"Collect distinct periods per exam.","root_cause":"Periods are collected per row, so each room row adds the same period again.","sha256":"277a7df452d4d98a8a7ee8459091031580c2d7cca599e37f77d68b23089dc1d6","title":"Split exam in one period reported as multi-period · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.752,"exit_code":1,"observations":[{"actual":[],"check":"regression: multi period rows 1","expected":[],"passed":true},{"actual":[],"check":"regression variant: multi period rows 2","expected":[],"passed":true},{"actual":[],"check":"partial repair guard 3","expected":[["multi_period","CHEM120"]],"passed":false},{"actual":[],"check":"boundary control 4","expected":[["multi_period","A"]],"passed":false},{"actual":[["multi_period","CHEM120"],["split_buildings","CHEM120"]],"check":"normal control 5","expected":[["multi_period","CHEM120"],["split_buildings","CHEM120"]],"passed":true},{"actual":[["split_buildings","MATH101"]],"check":"normal control 6","expected":[["multi_period","MATH101"],["split_buildings","MATH101"]],"passed":false},{"actual":[["split_buildings","MATH101"]],"check":"normal control 7","expected":[["split_buildings","MATH101"],["multi_period","MATH101H"]],"passed":false},{"actual":[["multi_period","MATH101"],["split_buildings","PHYS110"],["room_load","R3",0],["room_load","R4",0]],"check":"normal control 8","expected":[["multi_period","MATH101"],["multi_period","PHYS110"],["split_buildings","PHYS110"],["room_load","R3",0],["room_load","R4",0]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: multi period rows 1\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"regression variant: multi period rows 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [], \"expected\": [[\"multi_period\", \"CHEM120\"]], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [], \"expected\": [[\"multi_period\", \"A\"]], \"passed\": false}, {\"check\": \"normal control 5\", \"actual\": [[\"multi_period\", \"CHEM120\"], [\"split_buildings\", \"CHEM120\"]], \"expected\": [[\"multi_period\", \"CHEM120\"], [\"split_buildings\", \"CHEM120\"]], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[\"split_buildings\", \"MATH101\"]], \"expected\": [[\"multi_period\", \"MATH101\"], [\"split_buildings\", \"MATH101\"]], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [[\"split_buildings\", \"MATH101\"]], \"expected\": [[\"split_buildings\", \"MATH101\"], [\"multi_period\", \"MATH101H\"]], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [[\"multi_period\", \"MATH101\"], [\"split_buildings\", \"PHYS110\"], [\"room_load\", \"R3\", 0], [\"room_load\", \"R4\", 0]], \"expected\": [[\"multi_period\", \"MATH101\"], [\"multi_period\", \"PHYS110\"], [\"split_buildings\", \"PHYS110\"], [\"room_load\", \"R3\", 0], [\"room_load\", \"R4\", 0]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.499,"exit_code":1,"observations":[{"actual":[["multi_period","A"]],"check":"regression: multi period rows 1","expected":[],"passed":false},{"actual":[["multi_period","MATH101H"]],"check":"regression variant: multi period rows 2","expected":[],"passed":false},{"actual":[["multi_period","CHEM120"],["multi_period","MATH101"]],"check":"partial repair guard 3","expected":[["multi_period","CHEM120"]],"passed":false},{"actual":[["multi_period","A"]],"check":"boundary control 4","expected":[["multi_period","A"]],"passed":true},{"actual":[["multi_period","CHEM120"],["split_buildings","CHEM120"],["multi_period","MATH101"]],"check":"normal control 5","expected":[["multi_period","CHEM120"],["split_buildings","CHEM120"]],"passed":false},{"actual":[["multi_period","MATH101"],["split_buildings","MATH101"]],"check":"normal control 6","expected":[["multi_period","MATH101"],["split_buildings","MATH101"]],"passed":true},{"actual":[["multi_period","MATH101"],["split_buildings","MATH101"],["multi_period","MATH101H"]],"check":"normal control 7","expected":[["split_buildings","MATH101"],["multi_period","MATH101H"]],"passed":false},{"actual":[["multi_period","MATH101"],["multi_period","PHYS110"],["split_buildings","PHYS110"],["room_load","R3",0],["room_load","R4",0]],"check":"normal control 8","expected":[["multi_period","MATH101"],["multi_period","PHYS110"],["split_buildings","PHYS110"],["room_load","R3",0],["room_load","R4",0]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: multi period rows 1\", \"actual\": [[\"multi_period\", \"A\"]], \"expected\": [], \"passed\": false}, {\"check\": \"regression variant: multi period rows 2\", \"actual\": [[\"multi_period\", \"MATH101H\"]], \"expected\": [], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"multi_period\", \"CHEM120\"], [\"multi_period\", \"MATH101\"]], \"expected\": [[\"multi_period\", \"CHEM120\"]], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[\"multi_period\", \"A\"]], \"expected\": [[\"multi_period\", \"A\"]], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [[\"multi_period\", \"CHEM120\"], [\"split_buildings\", \"CHEM120\"], [\"multi_period\", \"MATH101\"]], \"expected\": [[\"multi_period\", \"CHEM120\"], [\"split_buildings\", \"CHEM120\"]], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[\"multi_period\", \"MATH101\"], [\"split_buildings\", \"MATH101\"]], \"expected\": [[\"multi_period\", \"MATH101\"], [\"split_buildings\", \"MATH101\"]], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[\"multi_period\", \"MATH101\"], [\"split_buildings\", \"MATH101\"], [\"multi_period\", \"MATH101H\"]], \"expected\": [[\"split_buildings\", \"MATH101\"], [\"multi_period\", \"MATH101H\"]], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [[\"multi_period\", \"MATH101\"], [\"multi_period\", \"PHYS110\"], [\"split_buildings\", \"PHYS110\"], [\"room_load\", \"R3\", 0], [\"room_load\", \"R4\", 0]], \"expected\": [[\"multi_period\", \"MATH101\"], [\"multi_period\", \"PHYS110\"], [\"split_buildings\", \"PHYS110\"], [\"room_load\", \"R3\", 0], [\"room_load\", \"R4\", 0]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.43,"exit_code":0,"observations":[{"actual":[],"check":"regression: multi period rows 1","expected":[],"passed":true},{"actual":[],"check":"regression variant: multi period rows 2","expected":[],"passed":true},{"actual":[["multi_period","CHEM120"]],"check":"partial repair guard 3","expected":[["multi_period","CHEM120"]],"passed":true},{"actual":[["multi_period","A"]],"check":"boundary control 4","expected":[["multi_period","A"]],"passed":true},{"actual":[["multi_period","CHEM120"],["split_buildings","CHEM120"]],"check":"normal control 5","expected":[["multi_period","CHEM120"],["split_buildings","CHEM120"]],"passed":true},{"actual":[["multi_period","MATH101"],["split_buildings","MATH101"]],"check":"normal control 6","expected":[["multi_period","MATH101"],["split_buildings","MATH101"]],"passed":true},{"actual":[["split_buildings","MATH101"],["multi_period","MATH101H"]],"check":"normal control 7","expected":[["split_buildings","MATH101"],["multi_period","MATH101H"]],"passed":true},{"actual":[["multi_period","MATH101"],["multi_period","PHYS110"],["split_buildings","PHYS110"],["room_load","R3",0],["room_load","R4",0]],"check":"normal control 8","expected":[["multi_period","MATH101"],["multi_period","PHYS110"],["split_buildings","PHYS110"],["room_load","R3",0],["room_load","R4",0]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: multi period rows 1\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"regression variant: multi period rows 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"multi_period\", \"CHEM120\"]], \"expected\": [[\"multi_period\", \"CHEM120\"]], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [[\"multi_period\", \"A\"]], \"expected\": [[\"multi_period\", \"A\"]], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [[\"multi_period\", \"CHEM120\"], [\"split_buildings\", \"CHEM120\"]], \"expected\": [[\"multi_period\", \"CHEM120\"], [\"split_buildings\", \"CHEM120\"]], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[\"multi_period\", \"MATH101\"], [\"split_buildings\", \"MATH101\"]], \"expected\": [[\"multi_period\", \"MATH101\"], [\"split_buildings\", \"MATH101\"]], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[\"split_buildings\", \"MATH101\"], [\"multi_period\", \"MATH101H\"]], \"expected\": [[\"split_buildings\", \"MATH101\"], [\"multi_period\", \"MATH101H\"]], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[\"multi_period\", \"MATH101\"], [\"multi_period\", \"PHYS110\"], [\"split_buildings\", \"PHYS110\"], [\"room_load\", \"R3\", 0], [\"room_load\", \"R4\", 0]], \"expected\": [[\"multi_period\", \"MATH101\"], [\"multi_period\", \"PHYS110\"], [\"split_buildings\", \"PHYS110\"], [\"room_load\", \"R3\", 0], [\"room_load\", \"R4\", 0]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}