FA-94946 / Warehouse slotting and bin packing / Open access
Tote packing: oversize items get a tote · case 01
Items that exceed tote limits by themselves are packed into their own tote instead of diverted.
ROOT CAUSE
Oversize detection is missing before placement.
VERIFIED REPAIR
Divert any item whose own volume or weight exceeds a tote limit.
Unsuccessful approach: Diverting only by volume still assigns overweight single items to a tote.
Case contract
items [[id, volume, kg, fragile]]. Sort by volume desc, kg desc, id. Place each in the first open tote (creation order) where volume and weight stay within limits (inclusive) and no fragile item shares a tote with an item over 10 kg (either direction). Items exceeding a tote alone go to oversize. Return [list of tote id lists, sorted oversize ids].
Why this case matters
Packing picked units into conveyor totes is bounded by volume, weight, and damage rules.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, tote_vol, tote_wt):
order = sorted(items, key=lambda it: (-it[1], -it[2], it[0]))
totes = []
oversize = []
for iid, vol, wt, fragile in order:
if False:
oversize.append(iid)
continue
placed = False
for t in totes:
if t['v'] + vol > tote_vol or t['w'] + wt > tote_wt:
continue
if fragile and t['heavy']:
continue
if wt > 10 and t['fragile']:
continue
t['ids'].append(iid)
t['v'] += vol
t['w'] += wt
t['heavy'] = t['heavy'] or wt > 10
t['fragile'] = t['fragile'] or fragile
placed = True
break
if not placed:
totes.append({'ids': [iid], 'v': vol, 'w': wt, 'heavy': wt > 10, 'fragile': fragile})
return [[t['ids'] for t in totes], sorted(oversize)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 8', [[['i0', 60, 8, False], ['i1', 60, 15, False], ['i2', 40, 10, True], ['i3', 40, 8, False], ['i4', 25, 11, False], ['i5', 60, 15, False]], 50, 20], [[['i2'], ['i3'], ['i4']], ['i0', 'i1', 'i5']]], ['generated mix 16', [[['i0', 50, 10, False], ['i1', 40, 10, False], ['i2', 5, 11, False], ['i3', 10, 15, False], ['i4', 60, 1, False], ['i5', 20, 8, True]], 60, 20], [[['i4'], ['i0'], ['i1', 'i5'], ['i3'], ['i2']], []]]], [['generated mix 35', [[['i0', 40, 10, False], ['i1', 50, 1, False], ['i2', 10, 10, True], ['i3', 20, 10, True], ['i4', 60, 3, False], ['i5', 40, 15, False], ['i6', 25, 3, True], ['i7', 5, 10, False]], 50, 20], [[['i1'], ['i5'], ['i0', 'i2'], ['i6', 'i3'], ['i7']], ['i4']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['generated mix 11', [[['i0', 20, 3, False], ['i1', 60, 1, False]], 60, 25], [[['i1'], ['i0']], []]], ['generated mix 19', [[['i0', 30, 3, False], ['i1', 5, 11, True], ['i2', 50, 15, False], ['i3', 40, 11, False], ['i4', 60, 15, False], ['i5', 10, 15, False], ['i6', 25, 10, False], ['i7', 60, 8, True]], 50, 20], [[['i2'], ['i3'], ['i0', 'i5'], ['i6'], ['i1']], ['i4', 'i7']]]], [['generated mix 61', [[['i0', 10, 11, True], ['i1', 40, 1, False], ['i2', 20, 10, False], ['i3', 5, 15, True], ['i4', 10, 1, True], ['i5', 5, 8, False], ['i6', 60, 15, True]], 50, 25], [[['i1', 'i0'], ['i2', 'i4', 'i5'], ['i3']], ['i6']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['generated mix 22', [[['i0', 25, 1, False], ['i1', 30, 11, True], ['i2', 50, 1, False]], 50, 25], [[['i2'], ['i1'], ['i0']], []]], ['generated mix 30', [[['i0', 50, 15, True], ['i1', 30, 8, True], ['i2', 30, 10, False], ['i3', 5, 15, True], ['i4', 40, 10, True], ['i5', 40, 11, False], ['i6', 40, 1, True]], 50, 20], [[['i0'], ['i5'], ['i4'], ['i6'], ['i2'], ['i1'], ['i3']], []]]], [['generated mix 28', [[['i0', 5, 11, False], ['i1', 10, 15, True], ['i2', 40, 15, True], ['i3', 25, 3, False], ['i4', 60, 15, False], ['i5', 40, 11, False], ['i6', 5, 11, True]], 50, 25], [[['i2'], ['i5', 'i0'], ['i3', 'i1'], ['i6']], ['i4']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['generated mix 34', [[['i0', 20, 11, True], ['i1', 25, 15, False], ['i2', 20, 8, True], ['i3', 20, 10, False], ['i4', 40, 11, False], ['i5', 5, 8, True], ['i6', 20, 1, False]], 60, 25], [[['i4', 'i3'], ['i1', 'i6'], ['i0'], ['i2', 'i5']], []]], ['generated mix 42', [[['i0', 60, 3, False], ['i1', 20, 8, True], ['i2', 10, 8, False], ['i3', 40, 10, False]], 60, 20], [[['i0'], ['i3', 'i1'], ['i2']], []]]], [['generated mix 54', [[['i0', 30, 10, False], ['i1', 20, 11, False], ['i2', 20, 1, False], ['i3', 60, 10, True], ['i4', 60, 10, True], ['i5', 10, 8, False]], 50, 20], [[['i0', 'i2'], ['i1', 'i5']], ['i3', 'i4']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 44', [[['i0', 50, 3, True], ['i1', 60, 11, False], ['i2', 40, 3, False], ['i3', 40, 10, True], ['i4', 30, 1, False], ['i5', 5, 15, False], ['i6', 40, 11, False]], 50, 25], [[['i0'], ['i6'], ['i3'], ['i2', 'i5'], ['i4']], ['i1']]], ['generated mix 52', [[['i0', 10, 11, False], ['i1', 25, 1, False], ['i2', 5, 15, False]], 60, 25], [[['i1', 'i0'], ['i2']], []]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| oversize weight | [[['x'], ['y']], []] | [[['y']], ['x']] | Failed |
| exact fill | [[['a', 'b']], []] | [[['a', 'b']], []] | Passed |
| heavy after fragile | [[['f'], ['h']], []] | [[['f'], ['h']], []] | Passed |
| first fit not best fit | [[['a', 'c'], ['b']], []] | [[['a', 'c'], ['b']], []] | Passed |
| fragile vs heavy | [[['h'], ['f']], []] | [[['h'], ['f']], []] | Passed |
| weight limit splits | [[['a'], ['b']], []] | [[['a'], ['b']], []] | Passed |
| generated mix 8 | [[['i1'], ['i5'], ['i0'], ['i2'], ['i3'], ['i4']], []] | [[['i2'], ['i3'], ['i4']], ['i0', 'i1', 'i5']] | Failed |
| generated mix 16 | [[['i4'], ['i0'], ['i1', 'i5'], ['i3'], ['i2']], []] | [[['i4'], ['i0'], ['i1', 'i5'], ['i3'], ['i2']], []] | Passed |
SHA-256 / 4d24260e8ceee3ffccaa6f94279545bbbf9c353002fbc21c1ac31d242cf83272
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, tote_vol, tote_wt):
order = sorted(items, key=lambda it: (-it[1], -it[2], it[0]))
totes = []
oversize = []
for iid, vol, wt, fragile in order:
if vol > tote_vol:
oversize.append(iid)
continue
placed = False
for t in totes:
if t['v'] + vol > tote_vol or t['w'] + wt > tote_wt:
continue
if fragile and t['heavy']:
continue
if wt > 10 and t['fragile']:
continue
t['ids'].append(iid)
t['v'] += vol
t['w'] += wt
t['heavy'] = t['heavy'] or wt > 10
t['fragile'] = t['fragile'] or fragile
placed = True
break
if not placed:
totes.append({'ids': [iid], 'v': vol, 'w': wt, 'heavy': wt > 10, 'fragile': fragile})
return [[t['ids'] for t in totes], sorted(oversize)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 8', [[['i0', 60, 8, False], ['i1', 60, 15, False], ['i2', 40, 10, True], ['i3', 40, 8, False], ['i4', 25, 11, False], ['i5', 60, 15, False]], 50, 20], [[['i2'], ['i3'], ['i4']], ['i0', 'i1', 'i5']]], ['generated mix 16', [[['i0', 50, 10, False], ['i1', 40, 10, False], ['i2', 5, 11, False], ['i3', 10, 15, False], ['i4', 60, 1, False], ['i5', 20, 8, True]], 60, 20], [[['i4'], ['i0'], ['i1', 'i5'], ['i3'], ['i2']], []]]], [['generated mix 35', [[['i0', 40, 10, False], ['i1', 50, 1, False], ['i2', 10, 10, True], ['i3', 20, 10, True], ['i4', 60, 3, False], ['i5', 40, 15, False], ['i6', 25, 3, True], ['i7', 5, 10, False]], 50, 20], [[['i1'], ['i5'], ['i0', 'i2'], ['i6', 'i3'], ['i7']], ['i4']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['generated mix 11', [[['i0', 20, 3, False], ['i1', 60, 1, False]], 60, 25], [[['i1'], ['i0']], []]], ['generated mix 19', [[['i0', 30, 3, False], ['i1', 5, 11, True], ['i2', 50, 15, False], ['i3', 40, 11, False], ['i4', 60, 15, False], ['i5', 10, 15, False], ['i6', 25, 10, False], ['i7', 60, 8, True]], 50, 20], [[['i2'], ['i3'], ['i0', 'i5'], ['i6'], ['i1']], ['i4', 'i7']]]], [['generated mix 61', [[['i0', 10, 11, True], ['i1', 40, 1, False], ['i2', 20, 10, False], ['i3', 5, 15, True], ['i4', 10, 1, True], ['i5', 5, 8, False], ['i6', 60, 15, True]], 50, 25], [[['i1', 'i0'], ['i2', 'i4', 'i5'], ['i3']], ['i6']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['generated mix 22', [[['i0', 25, 1, False], ['i1', 30, 11, True], ['i2', 50, 1, False]], 50, 25], [[['i2'], ['i1'], ['i0']], []]], ['generated mix 30', [[['i0', 50, 15, True], ['i1', 30, 8, True], ['i2', 30, 10, False], ['i3', 5, 15, True], ['i4', 40, 10, True], ['i5', 40, 11, False], ['i6', 40, 1, True]], 50, 20], [[['i0'], ['i5'], ['i4'], ['i6'], ['i2'], ['i1'], ['i3']], []]]], [['generated mix 28', [[['i0', 5, 11, False], ['i1', 10, 15, True], ['i2', 40, 15, True], ['i3', 25, 3, False], ['i4', 60, 15, False], ['i5', 40, 11, False], ['i6', 5, 11, True]], 50, 25], [[['i2'], ['i5', 'i0'], ['i3', 'i1'], ['i6']], ['i4']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['generated mix 34', [[['i0', 20, 11, True], ['i1', 25, 15, False], ['i2', 20, 8, True], ['i3', 20, 10, False], ['i4', 40, 11, False], ['i5', 5, 8, True], ['i6', 20, 1, False]], 60, 25], [[['i4', 'i3'], ['i1', 'i6'], ['i0'], ['i2', 'i5']], []]], ['generated mix 42', [[['i0', 60, 3, False], ['i1', 20, 8, True], ['i2', 10, 8, False], ['i3', 40, 10, False]], 60, 20], [[['i0'], ['i3', 'i1'], ['i2']], []]]], [['generated mix 54', [[['i0', 30, 10, False], ['i1', 20, 11, False], ['i2', 20, 1, False], ['i3', 60, 10, True], ['i4', 60, 10, True], ['i5', 10, 8, False]], 50, 20], [[['i0', 'i2'], ['i1', 'i5']], ['i3', 'i4']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 44', [[['i0', 50, 3, True], ['i1', 60, 11, False], ['i2', 40, 3, False], ['i3', 40, 10, True], ['i4', 30, 1, False], ['i5', 5, 15, False], ['i6', 40, 11, False]], 50, 25], [[['i0'], ['i6'], ['i3'], ['i2', 'i5'], ['i4']], ['i1']]], ['generated mix 52', [[['i0', 10, 11, False], ['i1', 25, 1, False], ['i2', 5, 15, False]], 60, 25], [[['i1', 'i0'], ['i2']], []]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| oversize weight | [[['x'], ['y']], []] | [[['y']], ['x']] | Failed |
| exact fill | [[['a', 'b']], []] | [[['a', 'b']], []] | Passed |
| heavy after fragile | [[['f'], ['h']], []] | [[['f'], ['h']], []] | Passed |
| first fit not best fit | [[['a', 'c'], ['b']], []] | [[['a', 'c'], ['b']], []] | Passed |
| fragile vs heavy | [[['h'], ['f']], []] | [[['h'], ['f']], []] | Passed |
| weight limit splits | [[['a'], ['b']], []] | [[['a'], ['b']], []] | Passed |
| generated mix 8 | [[['i2'], ['i3'], ['i4']], ['i0', 'i1', 'i5']] | [[['i2'], ['i3'], ['i4']], ['i0', 'i1', 'i5']] | Passed |
| generated mix 16 | [[['i4'], ['i0'], ['i1', 'i5'], ['i3'], ['i2']], []] | [[['i4'], ['i0'], ['i1', 'i5'], ['i3'], ['i2']], []] | Passed |
SHA-256 / 7c319afaee2a6b2413c315b38a82d807bf1b296436526e2bf8d23ac889c10c8b
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, tote_vol, tote_wt):
order = sorted(items, key=lambda it: (-it[1], -it[2], it[0]))
totes = []
oversize = []
for iid, vol, wt, fragile in order:
if vol > tote_vol or wt > tote_wt:
oversize.append(iid)
continue
placed = False
for t in totes:
if t['v'] + vol > tote_vol or t['w'] + wt > tote_wt:
continue
if fragile and t['heavy']:
continue
if wt > 10 and t['fragile']:
continue
t['ids'].append(iid)
t['v'] += vol
t['w'] += wt
t['heavy'] = t['heavy'] or wt > 10
t['fragile'] = t['fragile'] or fragile
placed = True
break
if not placed:
totes.append({'ids': [iid], 'v': vol, 'w': wt, 'heavy': wt > 10, 'fragile': fragile})
return [[t['ids'] for t in totes], sorted(oversize)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 8', [[['i0', 60, 8, False], ['i1', 60, 15, False], ['i2', 40, 10, True], ['i3', 40, 8, False], ['i4', 25, 11, False], ['i5', 60, 15, False]], 50, 20], [[['i2'], ['i3'], ['i4']], ['i0', 'i1', 'i5']]], ['generated mix 16', [[['i0', 50, 10, False], ['i1', 40, 10, False], ['i2', 5, 11, False], ['i3', 10, 15, False], ['i4', 60, 1, False], ['i5', 20, 8, True]], 60, 20], [[['i4'], ['i0'], ['i1', 'i5'], ['i3'], ['i2']], []]]], [['generated mix 35', [[['i0', 40, 10, False], ['i1', 50, 1, False], ['i2', 10, 10, True], ['i3', 20, 10, True], ['i4', 60, 3, False], ['i5', 40, 15, False], ['i6', 25, 3, True], ['i7', 5, 10, False]], 50, 20], [[['i1'], ['i5'], ['i0', 'i2'], ['i6', 'i3'], ['i7']], ['i4']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['generated mix 11', [[['i0', 20, 3, False], ['i1', 60, 1, False]], 60, 25], [[['i1'], ['i0']], []]], ['generated mix 19', [[['i0', 30, 3, False], ['i1', 5, 11, True], ['i2', 50, 15, False], ['i3', 40, 11, False], ['i4', 60, 15, False], ['i5', 10, 15, False], ['i6', 25, 10, False], ['i7', 60, 8, True]], 50, 20], [[['i2'], ['i3'], ['i0', 'i5'], ['i6'], ['i1']], ['i4', 'i7']]]], [['generated mix 61', [[['i0', 10, 11, True], ['i1', 40, 1, False], ['i2', 20, 10, False], ['i3', 5, 15, True], ['i4', 10, 1, True], ['i5', 5, 8, False], ['i6', 60, 15, True]], 50, 25], [[['i1', 'i0'], ['i2', 'i4', 'i5'], ['i3']], ['i6']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['generated mix 22', [[['i0', 25, 1, False], ['i1', 30, 11, True], ['i2', 50, 1, False]], 50, 25], [[['i2'], ['i1'], ['i0']], []]], ['generated mix 30', [[['i0', 50, 15, True], ['i1', 30, 8, True], ['i2', 30, 10, False], ['i3', 5, 15, True], ['i4', 40, 10, True], ['i5', 40, 11, False], ['i6', 40, 1, True]], 50, 20], [[['i0'], ['i5'], ['i4'], ['i6'], ['i2'], ['i1'], ['i3']], []]]], [['generated mix 28', [[['i0', 5, 11, False], ['i1', 10, 15, True], ['i2', 40, 15, True], ['i3', 25, 3, False], ['i4', 60, 15, False], ['i5', 40, 11, False], ['i6', 5, 11, True]], 50, 25], [[['i2'], ['i5', 'i0'], ['i3', 'i1'], ['i6']], ['i4']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['generated mix 34', [[['i0', 20, 11, True], ['i1', 25, 15, False], ['i2', 20, 8, True], ['i3', 20, 10, False], ['i4', 40, 11, False], ['i5', 5, 8, True], ['i6', 20, 1, False]], 60, 25], [[['i4', 'i3'], ['i1', 'i6'], ['i0'], ['i2', 'i5']], []]], ['generated mix 42', [[['i0', 60, 3, False], ['i1', 20, 8, True], ['i2', 10, 8, False], ['i3', 40, 10, False]], 60, 20], [[['i0'], ['i3', 'i1'], ['i2']], []]]], [['generated mix 54', [[['i0', 30, 10, False], ['i1', 20, 11, False], ['i2', 20, 1, False], ['i3', 60, 10, True], ['i4', 60, 10, True], ['i5', 10, 8, False]], 50, 20], [[['i0', 'i2'], ['i1', 'i5']], ['i3', 'i4']]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 44', [[['i0', 50, 3, True], ['i1', 60, 11, False], ['i2', 40, 3, False], ['i3', 40, 10, True], ['i4', 30, 1, False], ['i5', 5, 15, False], ['i6', 40, 11, False]], 50, 25], [[['i0'], ['i6'], ['i3'], ['i2', 'i5'], ['i4']], ['i1']]], ['generated mix 52', [[['i0', 10, 11, False], ['i1', 25, 1, False], ['i2', 5, 15, False]], 60, 25], [[['i1', 'i0'], ['i2']], []]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| oversize weight | [[['y']], ['x']] | [[['y']], ['x']] | Passed |
| exact fill | [[['a', 'b']], []] | [[['a', 'b']], []] | Passed |
| heavy after fragile | [[['f'], ['h']], []] | [[['f'], ['h']], []] | Passed |
| first fit not best fit | [[['a', 'c'], ['b']], []] | [[['a', 'c'], ['b']], []] | Passed |
| fragile vs heavy | [[['h'], ['f']], []] | [[['h'], ['f']], []] | Passed |
| weight limit splits | [[['a'], ['b']], []] | [[['a'], ['b']], []] | Passed |
| generated mix 8 | [[['i2'], ['i3'], ['i4']], ['i0', 'i1', 'i5']] | [[['i2'], ['i3'], ['i4']], ['i0', 'i1', 'i5']] | Passed |
| generated mix 16 | [[['i4'], ['i0'], ['i1', 'i5'], ['i3'], ['i2']], []] | [[['i4'], ['i0'], ['i1', 'i5'], ['i3'], ['i2']], []] | Passed |
SHA-256 / ed93e0871a317d481fa7c87b3852ea801834a5ceb4ed615b219b303d194c47e9
Verification & scope
Stipulated first-fit rule; 10 kg heavy threshold is a toy contract constant. 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:09.161753+00:00.
Case digest / b2cf2f18be32e9c7259893765cb90e5c98e93ac27ec9b0989d8e5088a77dd6ea