FA-94931 / Warehouse slotting and bin packing / Open access
Tote packing: exact volume fill rejected · case 01
An item that would fill a tote exactly to its volume limit is sent to a new tote.
ROOT CAUSE
The volume fit test rejects totals equal to the tote volume.
VERIFIED REPAIR
Allow the running volume plus the item to equal the tote volume.
Unsuccessful approach: Testing the running volume before adding the item lets totes overflow.
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 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 = [[['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['generated mix 1', [[['i0', 60, 10, False], ['i1', 25, 1, False], ['i2', 60, 3, False], ['i3', 5, 10, True], ['i4', 10, 10, True]], 60, 20], [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['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']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 9', [[['i0', 60, 8, False], ['i1', 30, 10, False], ['i2', 50, 11, True], ['i3', 10, 15, True]], 50, 20], [[['i2'], ['i1'], ['i3']], ['i0']]]], [['generated mix 12', [[['i0', 10, 8, False], ['i1', 50, 11, True], ['i2', 5, 3, True], ['i3', 25, 3, True], ['i4', 60, 10, False]], 60, 20], [[['i4'], ['i1', 'i0'], ['i3', 'i2']], []]], ['generated mix 6', [[['i0', 60, 15, False], ['i1', 40, 8, False], ['i2', 25, 15, False], ['i3', 10, 15, False]], 60, 25], [[['i0'], ['i1', 'i3'], ['i2']], []]], ['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']], []]], ['generated mix 10', [[['i0', 5, 15, False], ['i1', 40, 11, True], ['i2', 25, 3, False], ['i3', 30, 1, False], ['i4', 20, 15, False], ['i5', 20, 10, False], ['i6', 30, 11, False]], 60, 20], [[['i1'], ['i6', 'i3'], ['i2', 'i4'], ['i5'], ['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 27', [[['i0', 20, 10, False], ['i1', 25, 1, False], ['i2', 5, 11, True], ['i3', 20, 8, False], ['i4', 5, 10, False]], 60, 20], [[['i1', 'i0'], ['i3', 'i2'], ['i4']], []]]], [['generated mix 29', [[['i0', 60, 1, False], ['i1', 30, 11, True], ['i2', 60, 15, False], ['i3', 60, 3, False], ['i4', 20, 3, True], ['i5', 30, 10, False], ['i6', 20, 1, True]], 50, 20], [[['i1'], ['i5', 'i4'], ['i6']], ['i0', 'i2', 'i3']]], ['generated mix 12', [[['i0', 10, 8, False], ['i1', 50, 11, True], ['i2', 5, 3, True], ['i3', 25, 3, True], ['i4', 60, 10, False]], 60, 20], [[['i4'], ['i1', 'i0'], ['i3', 'i2']], []]], ['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']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 21', [[['i0', 20, 1, True], ['i1', 25, 1, False], ['i2', 30, 3, True], ['i3', 60, 1, False], ['i4', 50, 15, True]], 50, 25], [[['i4'], ['i2', 'i0'], ['i1']], ['i3']]], ['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 38', [[['i0', 40, 10, False], ['i1', 60, 3, True], ['i2', 25, 10, True], ['i3', 10, 8, False], ['i4', 60, 11, True], ['i5', 40, 1, False]], 50, 20], [[['i0', 'i3'], ['i5'], ['i2']], ['i1', 'i4']]]], [['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 17', [[['i0', 25, 1, True], ['i1', 60, 10, False], ['i2', 5, 1, True], ['i3', 10, 1, False], ['i4', 50, 8, False], ['i5', 40, 8, False]], 60, 25], [[['i1'], ['i4', 'i3'], ['i5', 'i2'], ['i0']], []]], ['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']], []]], ['generated mix 32', [[['i0', 10, 8, False], ['i1', 50, 8, False]], 50, 20], [[['i1'], ['i0']], []]], ['generated mix 40', [[['i0', 10, 10, True], ['i1', 30, 1, False], ['i2', 30, 1, False], ['i3', 20, 10, False]], 60, 25], [[['i1', 'i2'], ['i3', 'i0']], []]], ['generated mix 49', [[['i0', 10, 10, False], ['i1', 20, 10, True], ['i2', 10, 15, False], ['i3', 20, 3, False], ['i4', 20, 15, False], ['i5', 5, 1, False], ['i6', 50, 15, False]], 50, 20], [[['i6'], ['i4', 'i3', 'i5'], ['i1', 'i0'], ['i2']], []]]], [['generated mix 57', [[['i0', 20, 10, False], ['i1', 30, 3, False], ['i2', 40, 1, False], ['i3', 30, 11, True]], 60, 25], [[['i2', 'i0'], ['i3', 'i1']], []]], ['generated mix 23', [[['i0', 60, 3, False], ['i1', 40, 8, False], ['i2', 20, 15, False]], 60, 20], [[['i0'], ['i1'], ['i2']], []]], ['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']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 43', [[['i0', 5, 8, False], ['i1', 10, 3, False], ['i2', 40, 15, False], ['i3', 40, 15, False], ['i4', 20, 1, False], ['i5', 50, 11, False], ['i6', 20, 3, False]], 50, 20], [[['i5'], ['i2', 'i1'], ['i3'], ['i6', 'i4', 'i0']], []]], ['generated mix 51', [[['i0', 25, 11, False], ['i1', 40, 3, False], ['i2', 5, 15, True], ['i3', 60, 10, False], ['i4', 40, 15, False], ['i5', 40, 15, False], ['i6', 30, 15, False], ['i7', 50, 15, True]], 60, 20], [[['i3'], ['i7'], ['i4'], ['i5'], ['i1', 'i2'], ['i6'], ['i0']], []]], ['generated mix 60', [[['i0', 60, 3, False], ['i1', 40, 8, False], ['i2', 60, 8, False]], 50, 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 |
|---|---|---|---|
| exact fill | [[['a'], ['b']], []] | [[['a', 'b']], []] | Failed |
| generated mix 1 | [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []] | [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []] | Passed |
| fragile vs heavy | [[['h'], ['f']], []] | [[['h'], ['f']], []] | Passed |
| oversize weight | [[['y']], ['x']] | [[['y']], ['x']] | Passed |
| first fit not best fit | [[['a'], ['b', 'c']], []] | [[['a', 'c'], ['b']], []] | Failed |
| heavy after fragile | [[['f'], ['h']], []] | [[['f'], ['h']], []] | Passed |
| weight limit splits | [[['a'], ['b']], []] | [[['a'], ['b']], []] | Passed |
| generated mix 9 | [[['i2'], ['i1'], ['i3']], ['i0']] | [[['i2'], ['i1'], ['i3']], ['i0']] | Passed |
SHA-256 / f33d21aa2c812a05f8d7fb69d18cf7970a5d1444be9c5c2e24245f9961e84b06
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 or wt > tote_wt:
oversize.append(iid)
continue
placed = False
for t in totes:
if t['v'] > 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 = [[['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['generated mix 1', [[['i0', 60, 10, False], ['i1', 25, 1, False], ['i2', 60, 3, False], ['i3', 5, 10, True], ['i4', 10, 10, True]], 60, 20], [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['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']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 9', [[['i0', 60, 8, False], ['i1', 30, 10, False], ['i2', 50, 11, True], ['i3', 10, 15, True]], 50, 20], [[['i2'], ['i1'], ['i3']], ['i0']]]], [['generated mix 12', [[['i0', 10, 8, False], ['i1', 50, 11, True], ['i2', 5, 3, True], ['i3', 25, 3, True], ['i4', 60, 10, False]], 60, 20], [[['i4'], ['i1', 'i0'], ['i3', 'i2']], []]], ['generated mix 6', [[['i0', 60, 15, False], ['i1', 40, 8, False], ['i2', 25, 15, False], ['i3', 10, 15, False]], 60, 25], [[['i0'], ['i1', 'i3'], ['i2']], []]], ['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']], []]], ['generated mix 10', [[['i0', 5, 15, False], ['i1', 40, 11, True], ['i2', 25, 3, False], ['i3', 30, 1, False], ['i4', 20, 15, False], ['i5', 20, 10, False], ['i6', 30, 11, False]], 60, 20], [[['i1'], ['i6', 'i3'], ['i2', 'i4'], ['i5'], ['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 27', [[['i0', 20, 10, False], ['i1', 25, 1, False], ['i2', 5, 11, True], ['i3', 20, 8, False], ['i4', 5, 10, False]], 60, 20], [[['i1', 'i0'], ['i3', 'i2'], ['i4']], []]]], [['generated mix 29', [[['i0', 60, 1, False], ['i1', 30, 11, True], ['i2', 60, 15, False], ['i3', 60, 3, False], ['i4', 20, 3, True], ['i5', 30, 10, False], ['i6', 20, 1, True]], 50, 20], [[['i1'], ['i5', 'i4'], ['i6']], ['i0', 'i2', 'i3']]], ['generated mix 12', [[['i0', 10, 8, False], ['i1', 50, 11, True], ['i2', 5, 3, True], ['i3', 25, 3, True], ['i4', 60, 10, False]], 60, 20], [[['i4'], ['i1', 'i0'], ['i3', 'i2']], []]], ['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']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 21', [[['i0', 20, 1, True], ['i1', 25, 1, False], ['i2', 30, 3, True], ['i3', 60, 1, False], ['i4', 50, 15, True]], 50, 25], [[['i4'], ['i2', 'i0'], ['i1']], ['i3']]], ['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 38', [[['i0', 40, 10, False], ['i1', 60, 3, True], ['i2', 25, 10, True], ['i3', 10, 8, False], ['i4', 60, 11, True], ['i5', 40, 1, False]], 50, 20], [[['i0', 'i3'], ['i5'], ['i2']], ['i1', 'i4']]]], [['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 17', [[['i0', 25, 1, True], ['i1', 60, 10, False], ['i2', 5, 1, True], ['i3', 10, 1, False], ['i4', 50, 8, False], ['i5', 40, 8, False]], 60, 25], [[['i1'], ['i4', 'i3'], ['i5', 'i2'], ['i0']], []]], ['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']], []]], ['generated mix 32', [[['i0', 10, 8, False], ['i1', 50, 8, False]], 50, 20], [[['i1'], ['i0']], []]], ['generated mix 40', [[['i0', 10, 10, True], ['i1', 30, 1, False], ['i2', 30, 1, False], ['i3', 20, 10, False]], 60, 25], [[['i1', 'i2'], ['i3', 'i0']], []]], ['generated mix 49', [[['i0', 10, 10, False], ['i1', 20, 10, True], ['i2', 10, 15, False], ['i3', 20, 3, False], ['i4', 20, 15, False], ['i5', 5, 1, False], ['i6', 50, 15, False]], 50, 20], [[['i6'], ['i4', 'i3', 'i5'], ['i1', 'i0'], ['i2']], []]]], [['generated mix 57', [[['i0', 20, 10, False], ['i1', 30, 3, False], ['i2', 40, 1, False], ['i3', 30, 11, True]], 60, 25], [[['i2', 'i0'], ['i3', 'i1']], []]], ['generated mix 23', [[['i0', 60, 3, False], ['i1', 40, 8, False], ['i2', 20, 15, False]], 60, 20], [[['i0'], ['i1'], ['i2']], []]], ['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']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 43', [[['i0', 5, 8, False], ['i1', 10, 3, False], ['i2', 40, 15, False], ['i3', 40, 15, False], ['i4', 20, 1, False], ['i5', 50, 11, False], ['i6', 20, 3, False]], 50, 20], [[['i5'], ['i2', 'i1'], ['i3'], ['i6', 'i4', 'i0']], []]], ['generated mix 51', [[['i0', 25, 11, False], ['i1', 40, 3, False], ['i2', 5, 15, True], ['i3', 60, 10, False], ['i4', 40, 15, False], ['i5', 40, 15, False], ['i6', 30, 15, False], ['i7', 50, 15, True]], 60, 20], [[['i3'], ['i7'], ['i4'], ['i5'], ['i1', 'i2'], ['i6'], ['i0']], []]], ['generated mix 60', [[['i0', 60, 3, False], ['i1', 40, 8, False], ['i2', 60, 8, False]], 50, 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 |
|---|---|---|---|
| exact fill | [[['a', 'b']], []] | [[['a', 'b']], []] | Passed |
| generated mix 1 | [[['i0', 'i2'], ['i1', 'i4'], ['i3']], []] | [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []] | Failed |
| fragile vs heavy | [[['h'], ['f']], []] | [[['h'], ['f']], []] | Passed |
| oversize weight | [[['y']], ['x']] | [[['y']], ['x']] | Passed |
| first fit not best fit | [[['a', 'b'], ['c']], []] | [[['a', 'c'], ['b']], []] | Failed |
| heavy after fragile | [[['f'], ['h']], []] | [[['f'], ['h']], []] | Passed |
| weight limit splits | [[['a'], ['b']], []] | [[['a'], ['b']], []] | Passed |
| generated mix 9 | [[['i2'], ['i1'], ['i3']], ['i0']] | [[['i2'], ['i1'], ['i3']], ['i0']] | Passed |
SHA-256 / 64e7ed6df5ee36138ffbaae1cfaa267fc734865e11e0d862b390da11b43d16e7
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 = [[['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['generated mix 1', [[['i0', 60, 10, False], ['i1', 25, 1, False], ['i2', 60, 3, False], ['i3', 5, 10, True], ['i4', 10, 10, True]], 60, 20], [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['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']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 9', [[['i0', 60, 8, False], ['i1', 30, 10, False], ['i2', 50, 11, True], ['i3', 10, 15, True]], 50, 20], [[['i2'], ['i1'], ['i3']], ['i0']]]], [['generated mix 12', [[['i0', 10, 8, False], ['i1', 50, 11, True], ['i2', 5, 3, True], ['i3', 25, 3, True], ['i4', 60, 10, False]], 60, 20], [[['i4'], ['i1', 'i0'], ['i3', 'i2']], []]], ['generated mix 6', [[['i0', 60, 15, False], ['i1', 40, 8, False], ['i2', 25, 15, False], ['i3', 10, 15, False]], 60, 25], [[['i0'], ['i1', 'i3'], ['i2']], []]], ['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']], []]], ['generated mix 10', [[['i0', 5, 15, False], ['i1', 40, 11, True], ['i2', 25, 3, False], ['i3', 30, 1, False], ['i4', 20, 15, False], ['i5', 20, 10, False], ['i6', 30, 11, False]], 60, 20], [[['i1'], ['i6', 'i3'], ['i2', 'i4'], ['i5'], ['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 27', [[['i0', 20, 10, False], ['i1', 25, 1, False], ['i2', 5, 11, True], ['i3', 20, 8, False], ['i4', 5, 10, False]], 60, 20], [[['i1', 'i0'], ['i3', 'i2'], ['i4']], []]]], [['generated mix 29', [[['i0', 60, 1, False], ['i1', 30, 11, True], ['i2', 60, 15, False], ['i3', 60, 3, False], ['i4', 20, 3, True], ['i5', 30, 10, False], ['i6', 20, 1, True]], 50, 20], [[['i1'], ['i5', 'i4'], ['i6']], ['i0', 'i2', 'i3']]], ['generated mix 12', [[['i0', 10, 8, False], ['i1', 50, 11, True], ['i2', 5, 3, True], ['i3', 25, 3, True], ['i4', 60, 10, False]], 60, 20], [[['i4'], ['i1', 'i0'], ['i3', 'i2']], []]], ['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']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 21', [[['i0', 20, 1, True], ['i1', 25, 1, False], ['i2', 30, 3, True], ['i3', 60, 1, False], ['i4', 50, 15, True]], 50, 25], [[['i4'], ['i2', 'i0'], ['i1']], ['i3']]], ['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 38', [[['i0', 40, 10, False], ['i1', 60, 3, True], ['i2', 25, 10, True], ['i3', 10, 8, False], ['i4', 60, 11, True], ['i5', 40, 1, False]], 50, 20], [[['i0', 'i3'], ['i5'], ['i2']], ['i1', 'i4']]]], [['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 17', [[['i0', 25, 1, True], ['i1', 60, 10, False], ['i2', 5, 1, True], ['i3', 10, 1, False], ['i4', 50, 8, False], ['i5', 40, 8, False]], 60, 25], [[['i1'], ['i4', 'i3'], ['i5', 'i2'], ['i0']], []]], ['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']], []]], ['generated mix 32', [[['i0', 10, 8, False], ['i1', 50, 8, False]], 50, 20], [[['i1'], ['i0']], []]], ['generated mix 40', [[['i0', 10, 10, True], ['i1', 30, 1, False], ['i2', 30, 1, False], ['i3', 20, 10, False]], 60, 25], [[['i1', 'i2'], ['i3', 'i0']], []]], ['generated mix 49', [[['i0', 10, 10, False], ['i1', 20, 10, True], ['i2', 10, 15, False], ['i3', 20, 3, False], ['i4', 20, 15, False], ['i5', 5, 1, False], ['i6', 50, 15, False]], 50, 20], [[['i6'], ['i4', 'i3', 'i5'], ['i1', 'i0'], ['i2']], []]]], [['generated mix 57', [[['i0', 20, 10, False], ['i1', 30, 3, False], ['i2', 40, 1, False], ['i3', 30, 11, True]], 60, 25], [[['i2', 'i0'], ['i3', 'i1']], []]], ['generated mix 23', [[['i0', 60, 3, False], ['i1', 40, 8, False], ['i2', 20, 15, False]], 60, 20], [[['i0'], ['i1'], ['i2']], []]], ['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']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 43', [[['i0', 5, 8, False], ['i1', 10, 3, False], ['i2', 40, 15, False], ['i3', 40, 15, False], ['i4', 20, 1, False], ['i5', 50, 11, False], ['i6', 20, 3, False]], 50, 20], [[['i5'], ['i2', 'i1'], ['i3'], ['i6', 'i4', 'i0']], []]], ['generated mix 51', [[['i0', 25, 11, False], ['i1', 40, 3, False], ['i2', 5, 15, True], ['i3', 60, 10, False], ['i4', 40, 15, False], ['i5', 40, 15, False], ['i6', 30, 15, False], ['i7', 50, 15, True]], 60, 20], [[['i3'], ['i7'], ['i4'], ['i5'], ['i1', 'i2'], ['i6'], ['i0']], []]], ['generated mix 60', [[['i0', 60, 3, False], ['i1', 40, 8, False], ['i2', 60, 8, False]], 50, 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 |
|---|---|---|---|
| exact fill | [[['a', 'b']], []] | [[['a', 'b']], []] | Passed |
| generated mix 1 | [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []] | [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []] | Passed |
| fragile vs heavy | [[['h'], ['f']], []] | [[['h'], ['f']], []] | Passed |
| oversize weight | [[['y']], ['x']] | [[['y']], ['x']] | Passed |
| first fit not best fit | [[['a', 'c'], ['b']], []] | [[['a', 'c'], ['b']], []] | Passed |
| heavy after fragile | [[['f'], ['h']], []] | [[['f'], ['h']], []] | Passed |
| weight limit splits | [[['a'], ['b']], []] | [[['a'], ['b']], []] | Passed |
| generated mix 9 | [[['i2'], ['i1'], ['i3']], ['i0']] | [[['i2'], ['i1'], ['i3']], ['i0']] | Passed |
SHA-256 / 0b22e0bf9c340ea31429b11e13603028aef3e327e110cf39e7d4f9037627fa2c
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.112455+00:00.
Case digest / c6c065e56b959afb6471121944c6082ec4a7e5d8673d798adc0675f73984bf81