FA-95331 / Warehouse slotting and bin packing / Open access
Honeycombing: utilization rounded to nearest · case 01
Lane utilization is reported one basis point high on repeating fractions.
ROOT CAUSE
Utilization is rounded instead of floored.
VERIFIED REPAIR
Floor the utilization basis points with integer arithmetic.
Unsuccessful approach: Flooring to whole percent before scaling loses basis-point resolution.
Case contract
skus [[sku, pallets]] where lines may be adjustments (negative) and are netted per SKU. Each SKU with net pallets > 0 needs ceil(pallets/depth) single-SKU lanes. Honeycomb loss = lanes*depth - pallets. Utilization bp = floor((positions-loss)*10000/positions), 0 with no positions. Status OVER when lanes > available. Return [lanes, loss, util_bp, status].
Why this case matters
Deep-lane storage loses positions when lanes cannot be mixed across SKUs.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(skus, depth, available):
merged = {}
for sku, pallets in skus:
merged[sku] = merged.get(sku, 0) + pallets
lanes = 0
loss = 0
for sku, pallets in merged.items():
if pallets <= 0:
continue
n = -(-pallets // depth)
lanes += n
loss += n * depth - pallets
positions = lanes * depth
util = round((positions - loss) * 10000 / positions) if positions else 0
return [lanes, loss, util, 'OVER' if lanes > available else 'OK']
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']]], [['generated mix 53', [[['C', 3], ['B', -1], ['B', 3], ['C', -1]], 3, 6], [2, 2, 6666, 'OK']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['generated mix 10', [[['D', 8], ['A', 3], ['A', 1], ['A', 3]], 2, 8], [8, 1, 9375, 'OK']], ['generated mix 18', [[['D', 4], ['C', 9], ['C', 9], ['B', 2], ['D', 1]], 3, 8], [9, 2, 9259, 'OVER']]], [['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']], ['generated mix 15', [[['A', 2], ['A', 8], ['A', -3]], 2, 3], [4, 1, 8750, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['generated mix 21', [[['B', -3]], 4, 8], [0, 0, 0, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']]], [['generated mix 77', [[['B', 9], ['B', 2], ['A', -3]], 4, 6], [3, 1, 9166, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['generated mix 32', [[['B', 1], ['D', 9], ['D', 4], ['D', 2], ['D', 8]], 4, 3], [7, 4, 8571, 'OVER']], ['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']]], [['generated mix 48', [[['A', 8], ['C', -3]], 3, 8], [3, 1, 8888, 'OK']], ['generated mix 41', [[['A', 8], ['B', -3], ['A', 9], ['C', 9], ['B', -3]], 3, 2], [9, 1, 9629, 'OVER']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 43', [[['B', -3]], 3, 6], [0, 0, 0, 'OK']], ['generated mix 52', [[['C', 4], ['C', 8], ['C', 5]], 4, 6], [5, 3, 8500, 'OK']]]]
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 |
|---|---|---|---|
| floor util | [1, 1, 6667, 'OK'] | [1, 1, 6666, 'OK'] | Failed |
| merge lines | [2, 3, 6250, 'OK'] | [2, 3, 6250, 'OK'] | Passed |
| mixed | [4, 3, 8125, 'OK'] | [4, 3, 8125, 'OK'] | Passed |
| adjustment nets out | [1, 3, 2500, 'OK'] | [1, 3, 2500, 'OK'] | Passed |
| empty | [0, 0, 0, 'OK'] | [0, 0, 0, 'OK'] | Passed |
| lanes equal available | [2, 0, 10000, 'OK'] | [2, 0, 10000, 'OK'] | Passed |
| over | [3, 3, 7500, 'OVER'] | [3, 3, 7500, 'OVER'] | Passed |
| generated mix 8 | [4, 2, 8333, 'OVER'] | [4, 2, 8333, 'OVER'] | Passed |
SHA-256 / c835fca6610f3375dd22d76da04dbe6929b1bbfb9354ca26d358d5bae65ba06d
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(skus, depth, available):
merged = {}
for sku, pallets in skus:
merged[sku] = merged.get(sku, 0) + pallets
lanes = 0
loss = 0
for sku, pallets in merged.items():
if pallets <= 0:
continue
n = -(-pallets // depth)
lanes += n
loss += n * depth - pallets
positions = lanes * depth
util = (positions - loss) * 100 // positions * 100 if positions else 0
return [lanes, loss, util, 'OVER' if lanes > available else 'OK']
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']]], [['generated mix 53', [[['C', 3], ['B', -1], ['B', 3], ['C', -1]], 3, 6], [2, 2, 6666, 'OK']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['generated mix 10', [[['D', 8], ['A', 3], ['A', 1], ['A', 3]], 2, 8], [8, 1, 9375, 'OK']], ['generated mix 18', [[['D', 4], ['C', 9], ['C', 9], ['B', 2], ['D', 1]], 3, 8], [9, 2, 9259, 'OVER']]], [['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']], ['generated mix 15', [[['A', 2], ['A', 8], ['A', -3]], 2, 3], [4, 1, 8750, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['generated mix 21', [[['B', -3]], 4, 8], [0, 0, 0, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']]], [['generated mix 77', [[['B', 9], ['B', 2], ['A', -3]], 4, 6], [3, 1, 9166, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['generated mix 32', [[['B', 1], ['D', 9], ['D', 4], ['D', 2], ['D', 8]], 4, 3], [7, 4, 8571, 'OVER']], ['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']]], [['generated mix 48', [[['A', 8], ['C', -3]], 3, 8], [3, 1, 8888, 'OK']], ['generated mix 41', [[['A', 8], ['B', -3], ['A', 9], ['C', 9], ['B', -3]], 3, 2], [9, 1, 9629, 'OVER']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 43', [[['B', -3]], 3, 6], [0, 0, 0, 'OK']], ['generated mix 52', [[['C', 4], ['C', 8], ['C', 5]], 4, 6], [5, 3, 8500, 'OK']]]]
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 |
|---|---|---|---|
| floor util | [1, 1, 6600, 'OK'] | [1, 1, 6666, 'OK'] | Failed |
| merge lines | [2, 3, 6200, 'OK'] | [2, 3, 6250, 'OK'] | Failed |
| mixed | [4, 3, 8100, 'OK'] | [4, 3, 8125, 'OK'] | Failed |
| adjustment nets out | [1, 3, 2500, 'OK'] | [1, 3, 2500, 'OK'] | Passed |
| empty | [0, 0, 0, 'OK'] | [0, 0, 0, 'OK'] | Passed |
| lanes equal available | [2, 0, 10000, 'OK'] | [2, 0, 10000, 'OK'] | Passed |
| over | [3, 3, 7500, 'OVER'] | [3, 3, 7500, 'OVER'] | Passed |
| generated mix 8 | [4, 2, 8300, 'OVER'] | [4, 2, 8333, 'OVER'] | Failed |
SHA-256 / 7926415e405ff1eb9b354d2116e546857a136ffa3f1351d4179a6167b4a15bc8
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(skus, depth, available):
merged = {}
for sku, pallets in skus:
merged[sku] = merged.get(sku, 0) + pallets
lanes = 0
loss = 0
for sku, pallets in merged.items():
if pallets <= 0:
continue
n = -(-pallets // depth)
lanes += n
loss += n * depth - pallets
positions = lanes * depth
util = (positions - loss) * 10000 // positions if positions else 0
return [lanes, loss, util, 'OVER' if lanes > available else 'OK']
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']]], [['generated mix 53', [[['C', 3], ['B', -1], ['B', 3], ['C', -1]], 3, 6], [2, 2, 6666, 'OK']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['generated mix 10', [[['D', 8], ['A', 3], ['A', 1], ['A', 3]], 2, 8], [8, 1, 9375, 'OK']], ['generated mix 18', [[['D', 4], ['C', 9], ['C', 9], ['B', 2], ['D', 1]], 3, 8], [9, 2, 9259, 'OVER']]], [['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']], ['generated mix 15', [[['A', 2], ['A', 8], ['A', -3]], 2, 3], [4, 1, 8750, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['generated mix 21', [[['B', -3]], 4, 8], [0, 0, 0, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']]], [['generated mix 77', [[['B', 9], ['B', 2], ['A', -3]], 4, 6], [3, 1, 9166, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['generated mix 32', [[['B', 1], ['D', 9], ['D', 4], ['D', 2], ['D', 8]], 4, 3], [7, 4, 8571, 'OVER']], ['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']]], [['generated mix 48', [[['A', 8], ['C', -3]], 3, 8], [3, 1, 8888, 'OK']], ['generated mix 41', [[['A', 8], ['B', -3], ['A', 9], ['C', 9], ['B', -3]], 3, 2], [9, 1, 9629, 'OVER']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 43', [[['B', -3]], 3, 6], [0, 0, 0, 'OK']], ['generated mix 52', [[['C', 4], ['C', 8], ['C', 5]], 4, 6], [5, 3, 8500, 'OK']]]]
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 |
|---|---|---|---|
| floor util | [1, 1, 6666, 'OK'] | [1, 1, 6666, 'OK'] | Passed |
| merge lines | [2, 3, 6250, 'OK'] | [2, 3, 6250, 'OK'] | Passed |
| mixed | [4, 3, 8125, 'OK'] | [4, 3, 8125, 'OK'] | Passed |
| adjustment nets out | [1, 3, 2500, 'OK'] | [1, 3, 2500, 'OK'] | Passed |
| empty | [0, 0, 0, 'OK'] | [0, 0, 0, 'OK'] | Passed |
| lanes equal available | [2, 0, 10000, 'OK'] | [2, 0, 10000, 'OK'] | Passed |
| over | [3, 3, 7500, 'OVER'] | [3, 3, 7500, 'OVER'] | Passed |
| generated mix 8 | [4, 2, 8333, 'OVER'] | [4, 2, 8333, 'OVER'] | Passed |
SHA-256 / 9c7d24c63a16ac7a93596ca2422bc6bfdfabbfc929823e077f9a81a1dc450943
Verification & scope
Stipulated single-SKU lane policy. 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:12.693783+00:00.
Case digest / ffdcd9c39610d3277febe5e905c5b30c08fe6e5f24bb895cccadb7c8c9eb3b3d