FA-87671 / Collision detection broadphase / Open access
Sweep order sorts by box maxima · case 01
Endpoint arrays are built out of order and pruning breaks.
ROOT CAUSE
The order key uses the max on the chosen axis.
VERIFIED REPAIR
Order by min on the chosen axis.
Unsuccessful approach: Always sorting by x ignores the selected axis.
Case contract
solve(boxes): 3D sweep-and-prune axis selection. Boxes [id,minx,miny,minz,maxx,maxy,maxz]. Pick the axis with the largest population variance of box centres (first axis on ties), then order ids by (min on that axis, id). Return [axis, variance rounded to 6, ordered ids].
Why this case matters
Broadphase stages decide which object pairs ever reach narrowphase; a wrong boundary, ordering or bookkeeping rule silently drops real contacts or floods the solver with false candidates.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(boxes):
n = len(boxes)
best_axis, best_var = 0, -1.0
for ax in (0, 1, 2):
cs_ = [(b[1 + ax] + b[4 + ax]) / 2 for b in boxes]
mean = sum(cs_) / n
var = sum((c - mean) ** 2 for c in cs_) / n
if var > best_var:
best_axis, best_var = ax, var
order = [b[0] for b in sorted(boxes, key=lambda b: (b[4 + best_axis], b[0]))]
return [best_axis, round(best_var, 6), order]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[10, 1, 21, 0, 1, 31, 5], [5, 0, 17, 1, 7, 18, 10], [17, 0, 30, 0, 6, 42, 8], [15, 0, 29, 0, 4, 39, 7], [18, 2, 0, 2, 2, 3, 7]]], [1, 158.3, [18, 5, 10, 15, 17]]], [[[[35, 2, 23, 1, 6, 25, 7], [38, 0, 6, 2, 11, 18, 6]]], [1, 36.0, [38, 35]]], [[[[25, 21, 19, 0, 28, 22, 5], [26, 11, 19, 2, 16, 19, 5], [38, 21, 28, 0, 33, 36, 11], [24, 4, 20, 1, 5, 23, 11]]], [0, 81.046875, [24, 26, 25, 38]]], [[[[3, 0, 3, 27, 2, 4, 32], [5, 1, 6, 0, 5, 6, 10], [27, 0, 8, 19, 5, 17, 28], [39, 2, 0, 2, 5, 11, 6]]], [2, 125.625, [5, 39, 27, 3]]], [[[[30, 0, 2, 2, 11, 11, 8], [34, 0, 2, 9, 3, 12, 15], [22, 0, 1, 9, 7, 6, 17], [36, 1, 1, 4, 5, 11, 12], [25, 1, 2, 2, 4, 12, 5]]], [2, 13.96, [25, 30, 36, 22, 34]]], [[[[17, 4, 16, 17, 8, 16, 20], [26, 1, 24, 26, 5, 25, 26]]], [1, 18.0625, [17, 26]]], [[[[23, 6, 8, 14, 12, 12, 22], [27, 0, 7, 15, 12, 18, 23], [16, 3, 26, 18, 3, 33, 19], [38, 10, 18, 22, 12, 25, 25], [8, 3, 0, 29, 11, 10, 37]]], [1, 76.26, [8, 27, 23, 38, 16]]], [[[[31, 0, 1, 0, 0, 12, 5], [13, 1, 10, 0, 4, 13, 6], [20, 0, 8, 0, 9, 10, 6], [6, 0, 10, 2, 4, 12, 7]]], [1, 3.875, [31, 20, 6, 13]]]], [[[[[34, 4, 9, 21, 14, 14, 28], [24, 21, 7, 4, 28, 13, 11], [29, 10, 8, 6, 10, 8, 7], [14, 23, 9, 30, 25, 21, 37], [10, 2, 8, 23, 10, 14, 30], [19, 3, 4, 3, 6, 7, 9], [37, 7, 0, 3, 7, 12, 7]]], [2, 124.479592, [19, 37, 24, 29, 34, 10, 14]]], [[[[16, 2, 7, 2, 14, 14, 7], [30, 1, 4, 1, 11, 7, 1]]], [1, 6.25, [30, 16]]], [[[[27, 9, 12, 8, 17, 16, 13], [28, 9, 19, 6, 15, 29, 14], [18, 0, 20, 4, 10, 25, 15], [5, 7, 3, 5, 9, 15, 14]]], [1, 37.921875, [5, 27, 28, 18]]], [[[[8, 5, 21, 8, 5, 30, 20], [21, 3, 7, 1, 12, 16, 9]]], [1, 49.0, [21, 8]]], [[[[27, 20, 1, 0, 21, 10, 3], [34, 9, 0, 1, 10, 12, 9]]], [0, 30.25, [34, 27]]], [[[[7, 9, 2, 9, 14, 4, 13], [24, 10, 22, 10, 20, 22, 21], [17, 0, 8, 4, 0, 8, 4], [13, 1, 11, 6, 2, 13, 9], [31, 0, 0, 0, 9, 11, 5], [32, 7, 9, 7, 16, 20, 11]]], [1, 39.555556, [31, 7, 17, 32, 13, 24]]], [[[[30, 0, 0, 7, 1, 4, 12], [7, 1, 0, 8, 8, 0, 11], [2, 2, 2, 4, 8, 11, 7], [35, 0, 0, 9, 3, 7, 19], [22, 0, 1, 8, 2, 6, 8], [3, 1, 1, 2, 9, 13, 14], [29, 1, 2, 4, 5, 3, 14]]], [2, 5.673469, [3, 2, 29, 30, 7, 22, 35]]], [[[[9, 1, 5, 24, 1, 7, 24], [26, 2, 9, 21, 10, 9, 25], [27, 0, 10, 26, 9, 10, 38], [30, 2, 4, 30, 7, 14, 41], [2, 2, 8, 3, 12, 12, 3]]], [2, 127.4, [2, 26, 9, 27, 30]]]], [[[[[34, 30, 7, 10, 37, 7, 11], [10, 16, 10, 4, 18, 17, 7], [21, 12, 30, 1, 24, 38, 11], [24, 30, 0, 8, 41, 11, 15], [11, 22, 4, 9, 33, 12, 16], [31, 10, 2, 7, 13, 3, 16]]], [1, 109.895833, [24, 31, 11, 34, 10, 21]]], [[[[26, 0, 4, 10, 12, 14, 10], [6, 0, 6, 12, 1, 17, 18]]], [0, 7.5625, [6, 26]]], [[[[6, 1, 2, 1, 11, 14, 4], [37, 2, 1, 1, 8, 10, 7]]], [1, 1.5625, [37, 6]]], [[[[27, 1, 8, 21, 3, 17, 23], [1, 12, 8, 3, 13, 18, 5], [18, 26, 3, 24, 38, 5, 27], [7, 13, 27, 13, 23, 30, 16]]], [0, 117.046875, [27, 1, 7, 18]]], [[[[18, 1, 1, 9, 8, 3, 11], [16, 0, 2, 1, 11, 14, 11], [8, 1, 0, 0, 4, 4, 9]]], [1, 8.0, [8, 18, 16]]], [[[[11, 6, 15, 1, 17, 21, 6], [38, 5, 22, 1, 17, 29, 9], [32, 4, 19, 1, 12, 29, 9], [1, 0, 14, 1, 11, 14, 10], [23, 5, 10, 1, 5, 16, 9], [7, 2, 18, 1, 2, 29, 4]]], [1, 24.472222, [23, 1, 11, 7, 32, 38]]], [[[[2, 2, 0, 4, 4, 10, 7], [18, 0, 2, 0, 10, 4, 8], [17, 1, 0, 9, 9, 12, 21], [12, 1, 1, 5, 6, 4, 10], [13, 1, 2, 5, 1, 10, 17], [27, 0, 0, 5, 11, 6, 13], [31, 1, 1, 8, 8, 11, 16], [32, 0, 0, 1, 10, 8, 7]]], [2, 13.9375, [18, 32, 2, 12, 13, 27, 31, 17]]], [[[[37, 8, 1, 0, 14, 5, 1], [38, 0, 2, 22, 7, 5, 25], [10, 3, 5, 29, 7, 12, 38], [35, 6, 7, 7, 6, 19, 16]]], [2, 154.1875, [37, 35, 38, 10]]]], [[[[[36, 26, 16, 0, 38, 18, 3], [1, 0, 6, 1, 8, 11, 6]]], [0, 196.0, [1, 36]]], [[[[15, 2, 6, 0, 6, 13, 7], [32, 0, 10, 10, 12, 10, 14], [16, 1, 9, 10, 1, 9, 19], [31, 2, 24, 7, 13, 31, 10], [20, 1, 5, 9, 5, 6, 9], [8, 0, 10, 8, 0, 17, 15]]], [1, 50.416667, [20, 15, 16, 8, 32, 31]]], [[[[18, 0, 4, 7, 11, 9, 12], [38, 2, 4, 3, 6, 10, 7], [3, 1, 6, 28, 4, 16, 28]]], [2, 99.055556, [38, 18, 3]]], [[[[4, 6, 29, 13, 17, 29, 18], [19, 10, 18, 11, 11, 20, 14], [21, 1, 28, 8, 11, 30, 19], [16, 6, 17, 10, 8, 24, 11]]], [1, 21.671875, [16, 19, 21, 4]]], [[[[3, 15, 2, 2, 25, 3, 6], [13, 6, 0, 0, 11, 0, 0], [10, 25, 1, 1, 26, 12, 2], [30, 21, 1, 1, 31, 13, 9], [24, 4, 0, 0, 6, 10, 9], [16, 5, 0, 1, 16, 1, 11], [6, 22, 1, 1, 29, 2, 10], [32, 24, 1, 1, 26, 8, 5], [12, 5, 2, 0, 11, 5, 2]]], [0, 70.876543, [24, 12, 16, 13, 3, 30, 6, 32, 10]]], [[[[10, 5, 2, 1, 7, 6, 10], [32, 9, 1, 11, 17, 12, 13], [13, 4, 0, 29, 11, 4, 32], [28, 3, 1, 18, 6, 9, 21], [3, 8, 2, 1, 9, 11, 1], [6, 2, 0, 16, 10, 3, 24]]], [2, 96.729167, [3, 10, 32, 6, 28, 13]]], [[[[17, 6, 7, 0, 14, 15, 10], [23, 1, 8, 0, 2, 15, 0], [38, 4, 3, 1, 5, 12, 13]]], [0, 12.388889, [23, 38, 17]]], [[[[12, 0, 9, 1, 1, 20, 6], [10, 1, 7, 0, 9, 9, 6], [31, 1, 3, 1, 10, 5, 2], [7, 0, 2, 2, 1, 5, 2], [25, 2, 9, 2, 2, 18, 7]]], [1, 21.26, [7, 31, 10, 12, 25]]]], [[[[[36, 0, 1, 5, 0, 11, 12], [4, 9, 2, 0, 12, 9, 3], [21, 14, 1, 1, 26, 4, 7], [15, 14, 0, 10, 22, 3, 13]]], [0, 61.546875, [36, 4, 15, 21]]], [[[[8, 2, 4, 0, 13, 10, 3], [25, 0, 0, 0, 2, 4, 8]]], [0, 10.5625, [25, 8]]], [[[[25, 12, 17, 0, 17, 25, 11], [33, 6, 5, 0, 15, 16, 7], [39, 12, 16, 2, 14, 28, 13], [38, 16, 14, 1, 18, 19, 9], [34, 14, 29, 0, 18, 33, 1]]], [1, 45.66, [33, 38, 39, 25, 34]]], [[[[24, 3, 6, 12, 15, 16, 15], [4, 4, 0, 3, 10, 12, 14], [14, 4, 4, 3, 14, 13, 14], [9, 0, 8, 0, 8, 13, 8], [19, 3, 8, 21, 13, 15, 21], [21, 10, 1, 2, 10, 2, 3], [34, 5, 3, 9, 14, 6, 19], [16, 6, 0, 22, 15, 1, 32], [39, 0, 6, 24, 6, 8, 25]]], [2, 68.950617, [9, 21, 4, 14, 34, 24, 19, 16, 39]]], [[[[10, 3, 0, 22, 3, 6, 32], [2, 4, 1, 28, 10, 9, 40], [17, 8, 0, 1, 13, 12, 12], [32, 9, 2, 4, 19, 3, 5], [29, 6, 2, 13, 8, 8, 16], [9, 4, 1, 2, 13, 3, 2], [27, 9, 0, 26, 13, 7, 36], [1, 1, 1, 21, 7, 9, 30], [16, 8, 2, 23, 8, 12, 28], [6, 6, 1, 9, 7, 4, 15]]], [2, 123.6625, [17, 9, 32, 6, 29, 1, 10, 16, 27, 2]]], [[[[37, 25, 2, 2, 29, 14, 8], [31, 12, 2, 3, 22, 6, 15], [36, 27, 1, 9, 30, 12, 17], [8, 30, 2, 6, 37, 11, 11], [35, 9, 2, 9, 20, 11, 10]]], [0, 51.74, [35, 31, 37, 36, 8]]], [[[[35, 10, 0, 20, 17, 12, 22], [17, 10, 0, 24, 13, 6, 29], [30, 8, 2, 29, 11, 3, 32], [24, 9, 0, 25, 9, 3, 31]]], [2, 12.125, [35, 17, 24, 30]]], [[[[26, 8, 4, 3, 11, 14, 4], [13, 1, 9, 30, 7, 9, 32], [4, 2, 10, 26, 13, 18, 34], [18, 0, 7, 24, 2, 8, 34], [38, 0, 4, 7, 0, 5, 8], [37, 0, 4, 22, 0, 12, 26], [29, 6, 10, 7, 17, 21, 8], [6, 3, 5, 24, 12, 7, 31], [24, 9, 9, 7, 21, 19, 18], [17, 7, 5, 1, 15, 17, 12]]], [2, 115.34, [17, 26, 24, 29, 38, 37, 6, 18, 4, 13]]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("case %d" % i, 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 |
|---|---|---|---|
| case 0 | [1, 158.3, [18, 5, 10, 15, 17]] | [1, 158.3, [18, 5, 10, 15, 17]] | Passed |
| case 1 | [1, 36.0, [38, 35]] | [1, 36.0, [38, 35]] | Passed |
| case 2 | [0, 81.046875, [24, 26, 25, 38]] | [0, 81.046875, [24, 26, 25, 38]] | Passed |
| case 3 | [2, 125.625, [39, 5, 27, 3]] | [2, 125.625, [5, 39, 27, 3]] | Failed |
| case 4 | [2, 13.96, [25, 30, 36, 34, 22]] | [2, 13.96, [25, 30, 36, 22, 34]] | Failed |
| case 5 | [1, 18.0625, [17, 26]] | [1, 18.0625, [17, 26]] | Passed |
| case 6 | [1, 76.26, [8, 23, 27, 38, 16]] | [1, 76.26, [8, 27, 23, 38, 16]] | Failed |
| case 7 | [1, 3.875, [20, 6, 31, 13]] | [1, 3.875, [31, 20, 6, 13]] | Failed |
SHA-256 / 55e77612c913fabf87d44a2e4b7279040bfd5e47c50e1637dca9186ed17498a9
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(boxes):
n = len(boxes)
best_axis, best_var = 0, -1.0
for ax in (0, 1, 2):
cs_ = [(b[1 + ax] + b[4 + ax]) / 2 for b in boxes]
mean = sum(cs_) / n
var = sum((c - mean) ** 2 for c in cs_) / n
if var > best_var:
best_axis, best_var = ax, var
order = [b[0] for b in sorted(boxes, key=lambda b: (b[1], b[0]))]
return [best_axis, round(best_var, 6), order]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[10, 1, 21, 0, 1, 31, 5], [5, 0, 17, 1, 7, 18, 10], [17, 0, 30, 0, 6, 42, 8], [15, 0, 29, 0, 4, 39, 7], [18, 2, 0, 2, 2, 3, 7]]], [1, 158.3, [18, 5, 10, 15, 17]]], [[[[35, 2, 23, 1, 6, 25, 7], [38, 0, 6, 2, 11, 18, 6]]], [1, 36.0, [38, 35]]], [[[[25, 21, 19, 0, 28, 22, 5], [26, 11, 19, 2, 16, 19, 5], [38, 21, 28, 0, 33, 36, 11], [24, 4, 20, 1, 5, 23, 11]]], [0, 81.046875, [24, 26, 25, 38]]], [[[[3, 0, 3, 27, 2, 4, 32], [5, 1, 6, 0, 5, 6, 10], [27, 0, 8, 19, 5, 17, 28], [39, 2, 0, 2, 5, 11, 6]]], [2, 125.625, [5, 39, 27, 3]]], [[[[30, 0, 2, 2, 11, 11, 8], [34, 0, 2, 9, 3, 12, 15], [22, 0, 1, 9, 7, 6, 17], [36, 1, 1, 4, 5, 11, 12], [25, 1, 2, 2, 4, 12, 5]]], [2, 13.96, [25, 30, 36, 22, 34]]], [[[[17, 4, 16, 17, 8, 16, 20], [26, 1, 24, 26, 5, 25, 26]]], [1, 18.0625, [17, 26]]], [[[[23, 6, 8, 14, 12, 12, 22], [27, 0, 7, 15, 12, 18, 23], [16, 3, 26, 18, 3, 33, 19], [38, 10, 18, 22, 12, 25, 25], [8, 3, 0, 29, 11, 10, 37]]], [1, 76.26, [8, 27, 23, 38, 16]]], [[[[31, 0, 1, 0, 0, 12, 5], [13, 1, 10, 0, 4, 13, 6], [20, 0, 8, 0, 9, 10, 6], [6, 0, 10, 2, 4, 12, 7]]], [1, 3.875, [31, 20, 6, 13]]]], [[[[[34, 4, 9, 21, 14, 14, 28], [24, 21, 7, 4, 28, 13, 11], [29, 10, 8, 6, 10, 8, 7], [14, 23, 9, 30, 25, 21, 37], [10, 2, 8, 23, 10, 14, 30], [19, 3, 4, 3, 6, 7, 9], [37, 7, 0, 3, 7, 12, 7]]], [2, 124.479592, [19, 37, 24, 29, 34, 10, 14]]], [[[[16, 2, 7, 2, 14, 14, 7], [30, 1, 4, 1, 11, 7, 1]]], [1, 6.25, [30, 16]]], [[[[27, 9, 12, 8, 17, 16, 13], [28, 9, 19, 6, 15, 29, 14], [18, 0, 20, 4, 10, 25, 15], [5, 7, 3, 5, 9, 15, 14]]], [1, 37.921875, [5, 27, 28, 18]]], [[[[8, 5, 21, 8, 5, 30, 20], [21, 3, 7, 1, 12, 16, 9]]], [1, 49.0, [21, 8]]], [[[[27, 20, 1, 0, 21, 10, 3], [34, 9, 0, 1, 10, 12, 9]]], [0, 30.25, [34, 27]]], [[[[7, 9, 2, 9, 14, 4, 13], [24, 10, 22, 10, 20, 22, 21], [17, 0, 8, 4, 0, 8, 4], [13, 1, 11, 6, 2, 13, 9], [31, 0, 0, 0, 9, 11, 5], [32, 7, 9, 7, 16, 20, 11]]], [1, 39.555556, [31, 7, 17, 32, 13, 24]]], [[[[30, 0, 0, 7, 1, 4, 12], [7, 1, 0, 8, 8, 0, 11], [2, 2, 2, 4, 8, 11, 7], [35, 0, 0, 9, 3, 7, 19], [22, 0, 1, 8, 2, 6, 8], [3, 1, 1, 2, 9, 13, 14], [29, 1, 2, 4, 5, 3, 14]]], [2, 5.673469, [3, 2, 29, 30, 7, 22, 35]]], [[[[9, 1, 5, 24, 1, 7, 24], [26, 2, 9, 21, 10, 9, 25], [27, 0, 10, 26, 9, 10, 38], [30, 2, 4, 30, 7, 14, 41], [2, 2, 8, 3, 12, 12, 3]]], [2, 127.4, [2, 26, 9, 27, 30]]]], [[[[[34, 30, 7, 10, 37, 7, 11], [10, 16, 10, 4, 18, 17, 7], [21, 12, 30, 1, 24, 38, 11], [24, 30, 0, 8, 41, 11, 15], [11, 22, 4, 9, 33, 12, 16], [31, 10, 2, 7, 13, 3, 16]]], [1, 109.895833, [24, 31, 11, 34, 10, 21]]], [[[[26, 0, 4, 10, 12, 14, 10], [6, 0, 6, 12, 1, 17, 18]]], [0, 7.5625, [6, 26]]], [[[[6, 1, 2, 1, 11, 14, 4], [37, 2, 1, 1, 8, 10, 7]]], [1, 1.5625, [37, 6]]], [[[[27, 1, 8, 21, 3, 17, 23], [1, 12, 8, 3, 13, 18, 5], [18, 26, 3, 24, 38, 5, 27], [7, 13, 27, 13, 23, 30, 16]]], [0, 117.046875, [27, 1, 7, 18]]], [[[[18, 1, 1, 9, 8, 3, 11], [16, 0, 2, 1, 11, 14, 11], [8, 1, 0, 0, 4, 4, 9]]], [1, 8.0, [8, 18, 16]]], [[[[11, 6, 15, 1, 17, 21, 6], [38, 5, 22, 1, 17, 29, 9], [32, 4, 19, 1, 12, 29, 9], [1, 0, 14, 1, 11, 14, 10], [23, 5, 10, 1, 5, 16, 9], [7, 2, 18, 1, 2, 29, 4]]], [1, 24.472222, [23, 1, 11, 7, 32, 38]]], [[[[2, 2, 0, 4, 4, 10, 7], [18, 0, 2, 0, 10, 4, 8], [17, 1, 0, 9, 9, 12, 21], [12, 1, 1, 5, 6, 4, 10], [13, 1, 2, 5, 1, 10, 17], [27, 0, 0, 5, 11, 6, 13], [31, 1, 1, 8, 8, 11, 16], [32, 0, 0, 1, 10, 8, 7]]], [2, 13.9375, [18, 32, 2, 12, 13, 27, 31, 17]]], [[[[37, 8, 1, 0, 14, 5, 1], [38, 0, 2, 22, 7, 5, 25], [10, 3, 5, 29, 7, 12, 38], [35, 6, 7, 7, 6, 19, 16]]], [2, 154.1875, [37, 35, 38, 10]]]], [[[[[36, 26, 16, 0, 38, 18, 3], [1, 0, 6, 1, 8, 11, 6]]], [0, 196.0, [1, 36]]], [[[[15, 2, 6, 0, 6, 13, 7], [32, 0, 10, 10, 12, 10, 14], [16, 1, 9, 10, 1, 9, 19], [31, 2, 24, 7, 13, 31, 10], [20, 1, 5, 9, 5, 6, 9], [8, 0, 10, 8, 0, 17, 15]]], [1, 50.416667, [20, 15, 16, 8, 32, 31]]], [[[[18, 0, 4, 7, 11, 9, 12], [38, 2, 4, 3, 6, 10, 7], [3, 1, 6, 28, 4, 16, 28]]], [2, 99.055556, [38, 18, 3]]], [[[[4, 6, 29, 13, 17, 29, 18], [19, 10, 18, 11, 11, 20, 14], [21, 1, 28, 8, 11, 30, 19], [16, 6, 17, 10, 8, 24, 11]]], [1, 21.671875, [16, 19, 21, 4]]], [[[[3, 15, 2, 2, 25, 3, 6], [13, 6, 0, 0, 11, 0, 0], [10, 25, 1, 1, 26, 12, 2], [30, 21, 1, 1, 31, 13, 9], [24, 4, 0, 0, 6, 10, 9], [16, 5, 0, 1, 16, 1, 11], [6, 22, 1, 1, 29, 2, 10], [32, 24, 1, 1, 26, 8, 5], [12, 5, 2, 0, 11, 5, 2]]], [0, 70.876543, [24, 12, 16, 13, 3, 30, 6, 32, 10]]], [[[[10, 5, 2, 1, 7, 6, 10], [32, 9, 1, 11, 17, 12, 13], [13, 4, 0, 29, 11, 4, 32], [28, 3, 1, 18, 6, 9, 21], [3, 8, 2, 1, 9, 11, 1], [6, 2, 0, 16, 10, 3, 24]]], [2, 96.729167, [3, 10, 32, 6, 28, 13]]], [[[[17, 6, 7, 0, 14, 15, 10], [23, 1, 8, 0, 2, 15, 0], [38, 4, 3, 1, 5, 12, 13]]], [0, 12.388889, [23, 38, 17]]], [[[[12, 0, 9, 1, 1, 20, 6], [10, 1, 7, 0, 9, 9, 6], [31, 1, 3, 1, 10, 5, 2], [7, 0, 2, 2, 1, 5, 2], [25, 2, 9, 2, 2, 18, 7]]], [1, 21.26, [7, 31, 10, 12, 25]]]], [[[[[36, 0, 1, 5, 0, 11, 12], [4, 9, 2, 0, 12, 9, 3], [21, 14, 1, 1, 26, 4, 7], [15, 14, 0, 10, 22, 3, 13]]], [0, 61.546875, [36, 4, 15, 21]]], [[[[8, 2, 4, 0, 13, 10, 3], [25, 0, 0, 0, 2, 4, 8]]], [0, 10.5625, [25, 8]]], [[[[25, 12, 17, 0, 17, 25, 11], [33, 6, 5, 0, 15, 16, 7], [39, 12, 16, 2, 14, 28, 13], [38, 16, 14, 1, 18, 19, 9], [34, 14, 29, 0, 18, 33, 1]]], [1, 45.66, [33, 38, 39, 25, 34]]], [[[[24, 3, 6, 12, 15, 16, 15], [4, 4, 0, 3, 10, 12, 14], [14, 4, 4, 3, 14, 13, 14], [9, 0, 8, 0, 8, 13, 8], [19, 3, 8, 21, 13, 15, 21], [21, 10, 1, 2, 10, 2, 3], [34, 5, 3, 9, 14, 6, 19], [16, 6, 0, 22, 15, 1, 32], [39, 0, 6, 24, 6, 8, 25]]], [2, 68.950617, [9, 21, 4, 14, 34, 24, 19, 16, 39]]], [[[[10, 3, 0, 22, 3, 6, 32], [2, 4, 1, 28, 10, 9, 40], [17, 8, 0, 1, 13, 12, 12], [32, 9, 2, 4, 19, 3, 5], [29, 6, 2, 13, 8, 8, 16], [9, 4, 1, 2, 13, 3, 2], [27, 9, 0, 26, 13, 7, 36], [1, 1, 1, 21, 7, 9, 30], [16, 8, 2, 23, 8, 12, 28], [6, 6, 1, 9, 7, 4, 15]]], [2, 123.6625, [17, 9, 32, 6, 29, 1, 10, 16, 27, 2]]], [[[[37, 25, 2, 2, 29, 14, 8], [31, 12, 2, 3, 22, 6, 15], [36, 27, 1, 9, 30, 12, 17], [8, 30, 2, 6, 37, 11, 11], [35, 9, 2, 9, 20, 11, 10]]], [0, 51.74, [35, 31, 37, 36, 8]]], [[[[35, 10, 0, 20, 17, 12, 22], [17, 10, 0, 24, 13, 6, 29], [30, 8, 2, 29, 11, 3, 32], [24, 9, 0, 25, 9, 3, 31]]], [2, 12.125, [35, 17, 24, 30]]], [[[[26, 8, 4, 3, 11, 14, 4], [13, 1, 9, 30, 7, 9, 32], [4, 2, 10, 26, 13, 18, 34], [18, 0, 7, 24, 2, 8, 34], [38, 0, 4, 7, 0, 5, 8], [37, 0, 4, 22, 0, 12, 26], [29, 6, 10, 7, 17, 21, 8], [6, 3, 5, 24, 12, 7, 31], [24, 9, 9, 7, 21, 19, 18], [17, 7, 5, 1, 15, 17, 12]]], [2, 115.34, [17, 26, 24, 29, 38, 37, 6, 18, 4, 13]]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("case %d" % i, 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 |
|---|---|---|---|
| case 0 | [1, 158.3, [5, 15, 17, 10, 18]] | [1, 158.3, [18, 5, 10, 15, 17]] | Failed |
| case 1 | [1, 36.0, [38, 35]] | [1, 36.0, [38, 35]] | Passed |
| case 2 | [0, 81.046875, [24, 26, 25, 38]] | [0, 81.046875, [24, 26, 25, 38]] | Passed |
| case 3 | [2, 125.625, [3, 27, 5, 39]] | [2, 125.625, [5, 39, 27, 3]] | Failed |
| case 4 | [2, 13.96, [22, 30, 34, 25, 36]] | [2, 13.96, [25, 30, 36, 22, 34]] | Failed |
| case 5 | [1, 18.0625, [26, 17]] | [1, 18.0625, [17, 26]] | Failed |
| case 6 | [1, 76.26, [27, 8, 16, 23, 38]] | [1, 76.26, [8, 27, 23, 38, 16]] | Failed |
| case 7 | [1, 3.875, [6, 20, 31, 13]] | [1, 3.875, [31, 20, 6, 13]] | Failed |
SHA-256 / 5342f57f94d9179ef0bf8dad81625f7a7d1ff43f4038382050396d6b655aaaeb
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(boxes):
n = len(boxes)
best_axis, best_var = 0, -1.0
for ax in (0, 1, 2):
cs_ = [(b[1 + ax] + b[4 + ax]) / 2 for b in boxes]
mean = sum(cs_) / n
var = sum((c - mean) ** 2 for c in cs_) / n
if var > best_var:
best_axis, best_var = ax, var
order = [b[0] for b in sorted(boxes, key=lambda b: (b[1 + best_axis], b[0]))]
return [best_axis, round(best_var, 6), order]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[10, 1, 21, 0, 1, 31, 5], [5, 0, 17, 1, 7, 18, 10], [17, 0, 30, 0, 6, 42, 8], [15, 0, 29, 0, 4, 39, 7], [18, 2, 0, 2, 2, 3, 7]]], [1, 158.3, [18, 5, 10, 15, 17]]], [[[[35, 2, 23, 1, 6, 25, 7], [38, 0, 6, 2, 11, 18, 6]]], [1, 36.0, [38, 35]]], [[[[25, 21, 19, 0, 28, 22, 5], [26, 11, 19, 2, 16, 19, 5], [38, 21, 28, 0, 33, 36, 11], [24, 4, 20, 1, 5, 23, 11]]], [0, 81.046875, [24, 26, 25, 38]]], [[[[3, 0, 3, 27, 2, 4, 32], [5, 1, 6, 0, 5, 6, 10], [27, 0, 8, 19, 5, 17, 28], [39, 2, 0, 2, 5, 11, 6]]], [2, 125.625, [5, 39, 27, 3]]], [[[[30, 0, 2, 2, 11, 11, 8], [34, 0, 2, 9, 3, 12, 15], [22, 0, 1, 9, 7, 6, 17], [36, 1, 1, 4, 5, 11, 12], [25, 1, 2, 2, 4, 12, 5]]], [2, 13.96, [25, 30, 36, 22, 34]]], [[[[17, 4, 16, 17, 8, 16, 20], [26, 1, 24, 26, 5, 25, 26]]], [1, 18.0625, [17, 26]]], [[[[23, 6, 8, 14, 12, 12, 22], [27, 0, 7, 15, 12, 18, 23], [16, 3, 26, 18, 3, 33, 19], [38, 10, 18, 22, 12, 25, 25], [8, 3, 0, 29, 11, 10, 37]]], [1, 76.26, [8, 27, 23, 38, 16]]], [[[[31, 0, 1, 0, 0, 12, 5], [13, 1, 10, 0, 4, 13, 6], [20, 0, 8, 0, 9, 10, 6], [6, 0, 10, 2, 4, 12, 7]]], [1, 3.875, [31, 20, 6, 13]]]], [[[[[34, 4, 9, 21, 14, 14, 28], [24, 21, 7, 4, 28, 13, 11], [29, 10, 8, 6, 10, 8, 7], [14, 23, 9, 30, 25, 21, 37], [10, 2, 8, 23, 10, 14, 30], [19, 3, 4, 3, 6, 7, 9], [37, 7, 0, 3, 7, 12, 7]]], [2, 124.479592, [19, 37, 24, 29, 34, 10, 14]]], [[[[16, 2, 7, 2, 14, 14, 7], [30, 1, 4, 1, 11, 7, 1]]], [1, 6.25, [30, 16]]], [[[[27, 9, 12, 8, 17, 16, 13], [28, 9, 19, 6, 15, 29, 14], [18, 0, 20, 4, 10, 25, 15], [5, 7, 3, 5, 9, 15, 14]]], [1, 37.921875, [5, 27, 28, 18]]], [[[[8, 5, 21, 8, 5, 30, 20], [21, 3, 7, 1, 12, 16, 9]]], [1, 49.0, [21, 8]]], [[[[27, 20, 1, 0, 21, 10, 3], [34, 9, 0, 1, 10, 12, 9]]], [0, 30.25, [34, 27]]], [[[[7, 9, 2, 9, 14, 4, 13], [24, 10, 22, 10, 20, 22, 21], [17, 0, 8, 4, 0, 8, 4], [13, 1, 11, 6, 2, 13, 9], [31, 0, 0, 0, 9, 11, 5], [32, 7, 9, 7, 16, 20, 11]]], [1, 39.555556, [31, 7, 17, 32, 13, 24]]], [[[[30, 0, 0, 7, 1, 4, 12], [7, 1, 0, 8, 8, 0, 11], [2, 2, 2, 4, 8, 11, 7], [35, 0, 0, 9, 3, 7, 19], [22, 0, 1, 8, 2, 6, 8], [3, 1, 1, 2, 9, 13, 14], [29, 1, 2, 4, 5, 3, 14]]], [2, 5.673469, [3, 2, 29, 30, 7, 22, 35]]], [[[[9, 1, 5, 24, 1, 7, 24], [26, 2, 9, 21, 10, 9, 25], [27, 0, 10, 26, 9, 10, 38], [30, 2, 4, 30, 7, 14, 41], [2, 2, 8, 3, 12, 12, 3]]], [2, 127.4, [2, 26, 9, 27, 30]]]], [[[[[34, 30, 7, 10, 37, 7, 11], [10, 16, 10, 4, 18, 17, 7], [21, 12, 30, 1, 24, 38, 11], [24, 30, 0, 8, 41, 11, 15], [11, 22, 4, 9, 33, 12, 16], [31, 10, 2, 7, 13, 3, 16]]], [1, 109.895833, [24, 31, 11, 34, 10, 21]]], [[[[26, 0, 4, 10, 12, 14, 10], [6, 0, 6, 12, 1, 17, 18]]], [0, 7.5625, [6, 26]]], [[[[6, 1, 2, 1, 11, 14, 4], [37, 2, 1, 1, 8, 10, 7]]], [1, 1.5625, [37, 6]]], [[[[27, 1, 8, 21, 3, 17, 23], [1, 12, 8, 3, 13, 18, 5], [18, 26, 3, 24, 38, 5, 27], [7, 13, 27, 13, 23, 30, 16]]], [0, 117.046875, [27, 1, 7, 18]]], [[[[18, 1, 1, 9, 8, 3, 11], [16, 0, 2, 1, 11, 14, 11], [8, 1, 0, 0, 4, 4, 9]]], [1, 8.0, [8, 18, 16]]], [[[[11, 6, 15, 1, 17, 21, 6], [38, 5, 22, 1, 17, 29, 9], [32, 4, 19, 1, 12, 29, 9], [1, 0, 14, 1, 11, 14, 10], [23, 5, 10, 1, 5, 16, 9], [7, 2, 18, 1, 2, 29, 4]]], [1, 24.472222, [23, 1, 11, 7, 32, 38]]], [[[[2, 2, 0, 4, 4, 10, 7], [18, 0, 2, 0, 10, 4, 8], [17, 1, 0, 9, 9, 12, 21], [12, 1, 1, 5, 6, 4, 10], [13, 1, 2, 5, 1, 10, 17], [27, 0, 0, 5, 11, 6, 13], [31, 1, 1, 8, 8, 11, 16], [32, 0, 0, 1, 10, 8, 7]]], [2, 13.9375, [18, 32, 2, 12, 13, 27, 31, 17]]], [[[[37, 8, 1, 0, 14, 5, 1], [38, 0, 2, 22, 7, 5, 25], [10, 3, 5, 29, 7, 12, 38], [35, 6, 7, 7, 6, 19, 16]]], [2, 154.1875, [37, 35, 38, 10]]]], [[[[[36, 26, 16, 0, 38, 18, 3], [1, 0, 6, 1, 8, 11, 6]]], [0, 196.0, [1, 36]]], [[[[15, 2, 6, 0, 6, 13, 7], [32, 0, 10, 10, 12, 10, 14], [16, 1, 9, 10, 1, 9, 19], [31, 2, 24, 7, 13, 31, 10], [20, 1, 5, 9, 5, 6, 9], [8, 0, 10, 8, 0, 17, 15]]], [1, 50.416667, [20, 15, 16, 8, 32, 31]]], [[[[18, 0, 4, 7, 11, 9, 12], [38, 2, 4, 3, 6, 10, 7], [3, 1, 6, 28, 4, 16, 28]]], [2, 99.055556, [38, 18, 3]]], [[[[4, 6, 29, 13, 17, 29, 18], [19, 10, 18, 11, 11, 20, 14], [21, 1, 28, 8, 11, 30, 19], [16, 6, 17, 10, 8, 24, 11]]], [1, 21.671875, [16, 19, 21, 4]]], [[[[3, 15, 2, 2, 25, 3, 6], [13, 6, 0, 0, 11, 0, 0], [10, 25, 1, 1, 26, 12, 2], [30, 21, 1, 1, 31, 13, 9], [24, 4, 0, 0, 6, 10, 9], [16, 5, 0, 1, 16, 1, 11], [6, 22, 1, 1, 29, 2, 10], [32, 24, 1, 1, 26, 8, 5], [12, 5, 2, 0, 11, 5, 2]]], [0, 70.876543, [24, 12, 16, 13, 3, 30, 6, 32, 10]]], [[[[10, 5, 2, 1, 7, 6, 10], [32, 9, 1, 11, 17, 12, 13], [13, 4, 0, 29, 11, 4, 32], [28, 3, 1, 18, 6, 9, 21], [3, 8, 2, 1, 9, 11, 1], [6, 2, 0, 16, 10, 3, 24]]], [2, 96.729167, [3, 10, 32, 6, 28, 13]]], [[[[17, 6, 7, 0, 14, 15, 10], [23, 1, 8, 0, 2, 15, 0], [38, 4, 3, 1, 5, 12, 13]]], [0, 12.388889, [23, 38, 17]]], [[[[12, 0, 9, 1, 1, 20, 6], [10, 1, 7, 0, 9, 9, 6], [31, 1, 3, 1, 10, 5, 2], [7, 0, 2, 2, 1, 5, 2], [25, 2, 9, 2, 2, 18, 7]]], [1, 21.26, [7, 31, 10, 12, 25]]]], [[[[[36, 0, 1, 5, 0, 11, 12], [4, 9, 2, 0, 12, 9, 3], [21, 14, 1, 1, 26, 4, 7], [15, 14, 0, 10, 22, 3, 13]]], [0, 61.546875, [36, 4, 15, 21]]], [[[[8, 2, 4, 0, 13, 10, 3], [25, 0, 0, 0, 2, 4, 8]]], [0, 10.5625, [25, 8]]], [[[[25, 12, 17, 0, 17, 25, 11], [33, 6, 5, 0, 15, 16, 7], [39, 12, 16, 2, 14, 28, 13], [38, 16, 14, 1, 18, 19, 9], [34, 14, 29, 0, 18, 33, 1]]], [1, 45.66, [33, 38, 39, 25, 34]]], [[[[24, 3, 6, 12, 15, 16, 15], [4, 4, 0, 3, 10, 12, 14], [14, 4, 4, 3, 14, 13, 14], [9, 0, 8, 0, 8, 13, 8], [19, 3, 8, 21, 13, 15, 21], [21, 10, 1, 2, 10, 2, 3], [34, 5, 3, 9, 14, 6, 19], [16, 6, 0, 22, 15, 1, 32], [39, 0, 6, 24, 6, 8, 25]]], [2, 68.950617, [9, 21, 4, 14, 34, 24, 19, 16, 39]]], [[[[10, 3, 0, 22, 3, 6, 32], [2, 4, 1, 28, 10, 9, 40], [17, 8, 0, 1, 13, 12, 12], [32, 9, 2, 4, 19, 3, 5], [29, 6, 2, 13, 8, 8, 16], [9, 4, 1, 2, 13, 3, 2], [27, 9, 0, 26, 13, 7, 36], [1, 1, 1, 21, 7, 9, 30], [16, 8, 2, 23, 8, 12, 28], [6, 6, 1, 9, 7, 4, 15]]], [2, 123.6625, [17, 9, 32, 6, 29, 1, 10, 16, 27, 2]]], [[[[37, 25, 2, 2, 29, 14, 8], [31, 12, 2, 3, 22, 6, 15], [36, 27, 1, 9, 30, 12, 17], [8, 30, 2, 6, 37, 11, 11], [35, 9, 2, 9, 20, 11, 10]]], [0, 51.74, [35, 31, 37, 36, 8]]], [[[[35, 10, 0, 20, 17, 12, 22], [17, 10, 0, 24, 13, 6, 29], [30, 8, 2, 29, 11, 3, 32], [24, 9, 0, 25, 9, 3, 31]]], [2, 12.125, [35, 17, 24, 30]]], [[[[26, 8, 4, 3, 11, 14, 4], [13, 1, 9, 30, 7, 9, 32], [4, 2, 10, 26, 13, 18, 34], [18, 0, 7, 24, 2, 8, 34], [38, 0, 4, 7, 0, 5, 8], [37, 0, 4, 22, 0, 12, 26], [29, 6, 10, 7, 17, 21, 8], [6, 3, 5, 24, 12, 7, 31], [24, 9, 9, 7, 21, 19, 18], [17, 7, 5, 1, 15, 17, 12]]], [2, 115.34, [17, 26, 24, 29, 38, 37, 6, 18, 4, 13]]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("case %d" % i, 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 |
|---|---|---|---|
| case 0 | [1, 158.3, [18, 5, 10, 15, 17]] | [1, 158.3, [18, 5, 10, 15, 17]] | Passed |
| case 1 | [1, 36.0, [38, 35]] | [1, 36.0, [38, 35]] | Passed |
| case 2 | [0, 81.046875, [24, 26, 25, 38]] | [0, 81.046875, [24, 26, 25, 38]] | Passed |
| case 3 | [2, 125.625, [5, 39, 27, 3]] | [2, 125.625, [5, 39, 27, 3]] | Passed |
| case 4 | [2, 13.96, [25, 30, 36, 22, 34]] | [2, 13.96, [25, 30, 36, 22, 34]] | Passed |
| case 5 | [1, 18.0625, [17, 26]] | [1, 18.0625, [17, 26]] | Passed |
| case 6 | [1, 76.26, [8, 27, 23, 38, 16]] | [1, 76.26, [8, 27, 23, 38, 16]] | Passed |
| case 7 | [1, 3.875, [31, 20, 6, 13]] | [1, 3.875, [31, 20, 6, 13]] | Passed |
SHA-256 / 78671dfe2b8f40a0830f7f449647667739351dd51655a6b015b2b42d7144e979
Verification & scope
A deterministic bounded teaching model with stipulated toy conventions; not a production physics engine or spatial index. 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:51:01.009350+00:00.
Case digest / b651e8f661afcef2540ca21fc7a82ad75001431a93409e29c383c884ec45020b