FA-87391 / Collision detection broadphase / Open access
Fat box containment is strict · case 01
A proxy whose tight box touches its fat bound is reinserted every frame.
ROOT CAUSE
All four containment comparisons use <.
VERIFIED REPAIR
Containment is inclusive.
Unsuccessful approach: Checking only the minimum corner misses escapes through the maximum side.
Case contract
solve(tight, fat, disp, margin, mult): dynamic-tree proxy update. If the stored fat box contains the new tight box (inclusive) and its area is at most 4x that of a freshly built fat box, keep it: [False, fat]. Otherwise rebuild: tight expanded by margin on all sides, then extended by mult*disp on the side the motion points to; return [True, rebuilt box rounded to 6].
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(tight, fat, disp, margin, mult):
def fatten():
f = [tight[0] - margin, tight[1] - margin, tight[2] + margin, tight[3] + margin]
dx, dy = mult * disp[0], mult * disp[1]
if dx < 0:
f[0] += dx
else:
f[2] += dx
if dy < 0:
f[1] += dy
else:
f[3] += dy
return [round(c, 6) for c in f]
def area(b):
return (b[2] - b[0]) * (b[3] - b[1])
inside = fat[0] < tight[0] and fat[1] < tight[1] and tight[2] < fat[2] and tight[3] < fat[3]
fresh = fatten()
if inside and area(fat) <= 4 * area(fresh):
return [False, fat]
return [True, fresh]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[-2.9, -0.1, -0.6, 0.6], [-4.5, -0.4, -1.4, 0.7], [1.0, 0.1], 0.1, 2.0], [True, [-3.0, -0.2, 1.5, 0.9]]], [[[-2.8, 2.4, -1.8, 3.8], [-4.2, 1.1, -2.4, 3.9], [1.0, 0.1], 0.2, 1.0], [True, [-3.0, 2.2, -0.6, 4.1]]], [[[-0.2, 0.7, 1.1, 1.9], [-0.8, -1.1, 1.7, 2.5], [-0.1, 0], 0.2, 1.0], [False, [-0.8, -1.1, 1.7, 2.5]]], [[[-3.3, 2.7, -1.0, 3.3], [-3.4, 2.0, -0.3, 3.3], [-0.1, 0.1], 0.1, 1.0], [False, [-3.4, 2.0, -0.3, 3.3]]], [[[-3.4, -0.9, -2.5, 0.7], [-7.4, -12.9, 1.5, 4.7], [0.1, 0.2], 0.1, 1.0], [True, [-3.5, -1.0, -2.3, 1.0]]], [[[0.3, -1.3, 1.2, 0.9], [-3.7, -1.9, 1.2, 1.8], [1.0, 0.1], 0.5, 4.0], [False, [-3.7, -1.9, 1.2, 1.8]]], [[[2.4, 1.3, 4.6, 2.6], [2.5, 0.2, 6.2, 3.0], [-0.6, 0.1], 0.5, 2.0], [True, [0.7, 0.8, 5.1, 3.3]]], [[[-4.3, 0.7, -1.4, 3.2], [-4.7, 0.7, 2.2, 7.2], [-0.6, -1.0], 0.5, 2.0], [False, [-4.7, 0.7, 2.2, 7.2]]]], [[[[0.8, -0.3, 1.7, 1.2], [-0.3, -2.3, 2.1, 3.2], [0.1, -1.0], 0.5, 1.0], [False, [-0.3, -2.3, 2.1, 3.2]]], [[[-1.9, -3.8, 0.9, -2.8], [-3.1, -4.5, 0.1, -2.7], [1.0, 0.5], 0.1, 4.0], [True, [-2.0, -3.9, 5.0, -0.7]]], [[[2.2, 3.9, 3.8, 4.6], [-1.8, -0.1, 7.8, 8.6], [0.1, 0.2], 0.2, 1.0], [True, [2.0, 3.7, 4.1, 5.0]]], [[[3.0, 4.0, 3.8, 5.2], [0.0, 3.0, 4.8, 5.2], [0, 0.5], 0.5, 1.0], [False, [0.0, 3.0, 4.8, 5.2]]], [[[-0.1, -0.3, 1.1, 1.0], [-0.8, -0.3, 1.1, 1.4], [0.1, -0.2], 0.1, 4.0], [False, [-0.8, -0.3, 1.1, 1.4]]], [[[3.5, 4.1, 4.2, 5.4], [3.4, 3.4, 4.9, 5.0], [-0.1, 0.5], 0.1, 1.0], [True, [3.3, 4.0, 4.3, 6.0]]], [[[-2.7, -2.6, -1.9, -0.3], [-2.7, -3.2, -1.1, -0.1], [-0.6, 0], 0.1, 1.0], [False, [-2.7, -3.2, -1.1, -0.1]]], [[[0.9, 2.5, 3.2, 4.8], [-0.5, -0.3, 3.8, 6.0], [0.4, -0.2], 0.5, 1.0], [False, [-0.5, -0.3, 3.8, 6.0]]]], [[[[3.6, -4.5, 4.6, -3.5], [0.6, -4.5, 5.6, 0.5], [0, -1.0], 0.5, 4.0], [False, [0.6, -4.5, 5.6, 0.5]]], [[[-0.5, -4.7, 0.5, -2.8], [-1.6, -5.1, 0.1, -2.0], [1.0, -0.2], 0.1, 4.0], [True, [-0.6, -5.6, 4.6, -2.7]]], [[[0.4, 1.0, 2.7, 2.7], [0.8, 1.0, 3.9, 3.0], [-0.6, -0.2], 0.1, 2.0], [True, [-0.9, 0.5, 2.8, 2.8]]], [[[-0.3, 4.2, 1.5, 5.7], [-1.8, 1.1, 1.0, 8.6], [1.0, 0.1], 0.5, 1.0], [True, [-0.8, 3.7, 3.0, 6.3]]], [[[-2.7, -2.3, -1.0, -0.7], [-3.7, -3.3, -0.0, 0.3], [0, 0], 0.2, 1.0], [False, [-3.7, -3.3, -0.0, 0.3]]], [[[-4.3, -1.2, -2.9, -0.1], [-4.3, -1.6, -1.7, 0.2], [-0.6, -0.2], 0.1, 2.0], [False, [-4.3, -1.6, -1.7, 0.2]]], [[[-1.4, 3.0, -0.7, 3.7], [-1.4, 2.6, 0.5, 4.1], [-0.6, -0.2], 0.1, 4.0], [False, [-1.4, 2.6, 0.5, 4.1]]], [[[1.7, -0.5, 2.9, 1.9], [0.7, -0.5, 2.7, 2.3], [0.4, -0.2], 0.1, 4.0], [True, [1.6, -1.4, 4.6, 2.0]]]], [[[[0.2, 1.9, 1.6, 2.6], [0.2, 1.9, 2.8, 3.0], [-0.6, -0.2], 0.1, 4.0], [False, [0.2, 1.9, 2.8, 3.0]]], [[[1.5, -2.9, 4.1, -0.5], [1.4, -4.6, 4.6, -0.8], [-0.1, 0.5], 0.2, 1.0], [True, [1.2, -3.1, 4.3, 0.2]]], [[[2.1, -1.3, 4.7, 0.7], [1.5, -1.3, 5.5, 2.1], [-0.6, -0.2], 0.2, 2.0], [False, [1.5, -1.3, 5.5, 2.1]]], [[[3.4, 1.4, 4.5, 3.4], [0.4, 1.4, 5.5, 4.9], [0, -1.0], 0.5, 2.0], [False, [0.4, 1.4, 5.5, 4.9]]], [[[3.8, 0.5, 4.7, 2.1], [-0.2, -3.5, 8.7, 6.1], [-0.1, 0], 0.2, 1.0], [True, [3.5, 0.3, 4.9, 2.3]]], [[[-2.9, 0.5, -0.5, 2.0], [-4.1, -1.2, 0.7, 1.9], [0, 0.5], 0.2, 1.0], [True, [-3.1, 0.3, -0.3, 2.7]]], [[[-2.8, -1.6, -2.1, -0.8], [-5.0, -0.8, -2.9, 1.4], [1.0, -1.0], 0.2, 2.0], [True, [-3.0, -3.8, 0.1, -0.6]]], [[[5.5, -2.4, 7.0, -1.3], [3.5, -3.2, 6.5, -0.1], [1.0, -0.2], 0.5, 1.0], [True, [5.0, -3.1, 8.5, -0.8]]]], [[[[3.7, 1.3, 6.2, 4.0], [3.4, 1.3, 6.5, 4.6], [-0.1, -0.2], 0.2, 1.0], [False, [3.4, 1.3, 6.5, 4.6]]], [[[-1.5, 3.1, 0.0, 4.0], [-1.8, 2.95, 0.3, 4.3], [0, 0.2], 0.1, 1.0], [False, [-1.8, 2.95, 0.3, 4.3]]], [[[-2.1, -4.0, 0.8, -2.1], [-4.1, -4.6, 0.3, 0.8], [1.0, 0.1], 0.5, 2.0], [True, [-2.6, -4.5, 3.3, -1.4]]], [[[2.8, 2.9, 4.4, 5.8], [2.6, 2.7, 4.5, 5.8], [0, 0.1], 0.1, 4.0], [False, [2.6, 2.7, 4.5, 5.8]]], [[[-3.1, 2.9, -0.8, 4.5], [-5.5, 1.9, 2.8, 5.0], [-0.6, 0], 0.5, 1.0], [False, [-5.5, 1.9, 2.8, 5.0]]], [[[0.6, -5.6, 3.3, -3.9], [0.1, -4.7, 3.5, -2.3], [0.4, -1.0], 0.1, 1.0], [True, [0.5, -6.7, 3.8, -3.8]]], [[[4.7, -1.7, 5.8, -1.1], [3.2, -2.2, 5.8, -0.1], [1.0, 0], 0.5, 4.0], [False, [3.2, -2.2, 5.8, -0.1]]], [[[-2.9, -4.6, -1.5, -3.9], [-4.9, -6.6, -2.0, 0.1], [1.0, -1.0], 0.5, 2.0], [True, [-3.4, -7.1, 1.0, -3.4]]]]]
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 | [True, [-3.0, -0.2, 1.5, 0.9]] | [True, [-3.0, -0.2, 1.5, 0.9]] | Passed |
| case 1 | [True, [-3.0, 2.2, -0.6, 4.1]] | [True, [-3.0, 2.2, -0.6, 4.1]] | Passed |
| case 2 | [False, [-0.8, -1.1, 1.7, 2.5]] | [False, [-0.8, -1.1, 1.7, 2.5]] | Passed |
| case 3 | [True, [-3.5, 2.6, -0.9, 3.5]] | [False, [-3.4, 2.0, -0.3, 3.3]] | Failed |
| case 4 | [True, [-3.5, -1.0, -2.3, 1.0]] | [True, [-3.5, -1.0, -2.3, 1.0]] | Passed |
| case 5 | [True, [-0.2, -1.8, 5.7, 1.8]] | [False, [-3.7, -1.9, 1.2, 1.8]] | Failed |
| case 6 | [True, [0.7, 0.8, 5.1, 3.3]] | [True, [0.7, 0.8, 5.1, 3.3]] | Passed |
| case 7 | [True, [-6.0, -1.8, -0.9, 3.7]] | [False, [-4.7, 0.7, 2.2, 7.2]] | Failed |
SHA-256 / c3ef65c358eca947ab3ce75a5898a126a650f0d72766d296f8224f35fe210b2c
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(tight, fat, disp, margin, mult):
def fatten():
f = [tight[0] - margin, tight[1] - margin, tight[2] + margin, tight[3] + margin]
dx, dy = mult * disp[0], mult * disp[1]
if dx < 0:
f[0] += dx
else:
f[2] += dx
if dy < 0:
f[1] += dy
else:
f[3] += dy
return [round(c, 6) for c in f]
def area(b):
return (b[2] - b[0]) * (b[3] - b[1])
inside = fat[0] <= tight[0] and fat[1] <= tight[1]
fresh = fatten()
if inside and area(fat) <= 4 * area(fresh):
return [False, fat]
return [True, fresh]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[-2.9, -0.1, -0.6, 0.6], [-4.5, -0.4, -1.4, 0.7], [1.0, 0.1], 0.1, 2.0], [True, [-3.0, -0.2, 1.5, 0.9]]], [[[-2.8, 2.4, -1.8, 3.8], [-4.2, 1.1, -2.4, 3.9], [1.0, 0.1], 0.2, 1.0], [True, [-3.0, 2.2, -0.6, 4.1]]], [[[-0.2, 0.7, 1.1, 1.9], [-0.8, -1.1, 1.7, 2.5], [-0.1, 0], 0.2, 1.0], [False, [-0.8, -1.1, 1.7, 2.5]]], [[[-3.3, 2.7, -1.0, 3.3], [-3.4, 2.0, -0.3, 3.3], [-0.1, 0.1], 0.1, 1.0], [False, [-3.4, 2.0, -0.3, 3.3]]], [[[-3.4, -0.9, -2.5, 0.7], [-7.4, -12.9, 1.5, 4.7], [0.1, 0.2], 0.1, 1.0], [True, [-3.5, -1.0, -2.3, 1.0]]], [[[0.3, -1.3, 1.2, 0.9], [-3.7, -1.9, 1.2, 1.8], [1.0, 0.1], 0.5, 4.0], [False, [-3.7, -1.9, 1.2, 1.8]]], [[[2.4, 1.3, 4.6, 2.6], [2.5, 0.2, 6.2, 3.0], [-0.6, 0.1], 0.5, 2.0], [True, [0.7, 0.8, 5.1, 3.3]]], [[[-4.3, 0.7, -1.4, 3.2], [-4.7, 0.7, 2.2, 7.2], [-0.6, -1.0], 0.5, 2.0], [False, [-4.7, 0.7, 2.2, 7.2]]]], [[[[0.8, -0.3, 1.7, 1.2], [-0.3, -2.3, 2.1, 3.2], [0.1, -1.0], 0.5, 1.0], [False, [-0.3, -2.3, 2.1, 3.2]]], [[[-1.9, -3.8, 0.9, -2.8], [-3.1, -4.5, 0.1, -2.7], [1.0, 0.5], 0.1, 4.0], [True, [-2.0, -3.9, 5.0, -0.7]]], [[[2.2, 3.9, 3.8, 4.6], [-1.8, -0.1, 7.8, 8.6], [0.1, 0.2], 0.2, 1.0], [True, [2.0, 3.7, 4.1, 5.0]]], [[[3.0, 4.0, 3.8, 5.2], [0.0, 3.0, 4.8, 5.2], [0, 0.5], 0.5, 1.0], [False, [0.0, 3.0, 4.8, 5.2]]], [[[-0.1, -0.3, 1.1, 1.0], [-0.8, -0.3, 1.1, 1.4], [0.1, -0.2], 0.1, 4.0], [False, [-0.8, -0.3, 1.1, 1.4]]], [[[3.5, 4.1, 4.2, 5.4], [3.4, 3.4, 4.9, 5.0], [-0.1, 0.5], 0.1, 1.0], [True, [3.3, 4.0, 4.3, 6.0]]], [[[-2.7, -2.6, -1.9, -0.3], [-2.7, -3.2, -1.1, -0.1], [-0.6, 0], 0.1, 1.0], [False, [-2.7, -3.2, -1.1, -0.1]]], [[[0.9, 2.5, 3.2, 4.8], [-0.5, -0.3, 3.8, 6.0], [0.4, -0.2], 0.5, 1.0], [False, [-0.5, -0.3, 3.8, 6.0]]]], [[[[3.6, -4.5, 4.6, -3.5], [0.6, -4.5, 5.6, 0.5], [0, -1.0], 0.5, 4.0], [False, [0.6, -4.5, 5.6, 0.5]]], [[[-0.5, -4.7, 0.5, -2.8], [-1.6, -5.1, 0.1, -2.0], [1.0, -0.2], 0.1, 4.0], [True, [-0.6, -5.6, 4.6, -2.7]]], [[[0.4, 1.0, 2.7, 2.7], [0.8, 1.0, 3.9, 3.0], [-0.6, -0.2], 0.1, 2.0], [True, [-0.9, 0.5, 2.8, 2.8]]], [[[-0.3, 4.2, 1.5, 5.7], [-1.8, 1.1, 1.0, 8.6], [1.0, 0.1], 0.5, 1.0], [True, [-0.8, 3.7, 3.0, 6.3]]], [[[-2.7, -2.3, -1.0, -0.7], [-3.7, -3.3, -0.0, 0.3], [0, 0], 0.2, 1.0], [False, [-3.7, -3.3, -0.0, 0.3]]], [[[-4.3, -1.2, -2.9, -0.1], [-4.3, -1.6, -1.7, 0.2], [-0.6, -0.2], 0.1, 2.0], [False, [-4.3, -1.6, -1.7, 0.2]]], [[[-1.4, 3.0, -0.7, 3.7], [-1.4, 2.6, 0.5, 4.1], [-0.6, -0.2], 0.1, 4.0], [False, [-1.4, 2.6, 0.5, 4.1]]], [[[1.7, -0.5, 2.9, 1.9], [0.7, -0.5, 2.7, 2.3], [0.4, -0.2], 0.1, 4.0], [True, [1.6, -1.4, 4.6, 2.0]]]], [[[[0.2, 1.9, 1.6, 2.6], [0.2, 1.9, 2.8, 3.0], [-0.6, -0.2], 0.1, 4.0], [False, [0.2, 1.9, 2.8, 3.0]]], [[[1.5, -2.9, 4.1, -0.5], [1.4, -4.6, 4.6, -0.8], [-0.1, 0.5], 0.2, 1.0], [True, [1.2, -3.1, 4.3, 0.2]]], [[[2.1, -1.3, 4.7, 0.7], [1.5, -1.3, 5.5, 2.1], [-0.6, -0.2], 0.2, 2.0], [False, [1.5, -1.3, 5.5, 2.1]]], [[[3.4, 1.4, 4.5, 3.4], [0.4, 1.4, 5.5, 4.9], [0, -1.0], 0.5, 2.0], [False, [0.4, 1.4, 5.5, 4.9]]], [[[3.8, 0.5, 4.7, 2.1], [-0.2, -3.5, 8.7, 6.1], [-0.1, 0], 0.2, 1.0], [True, [3.5, 0.3, 4.9, 2.3]]], [[[-2.9, 0.5, -0.5, 2.0], [-4.1, -1.2, 0.7, 1.9], [0, 0.5], 0.2, 1.0], [True, [-3.1, 0.3, -0.3, 2.7]]], [[[-2.8, -1.6, -2.1, -0.8], [-5.0, -0.8, -2.9, 1.4], [1.0, -1.0], 0.2, 2.0], [True, [-3.0, -3.8, 0.1, -0.6]]], [[[5.5, -2.4, 7.0, -1.3], [3.5, -3.2, 6.5, -0.1], [1.0, -0.2], 0.5, 1.0], [True, [5.0, -3.1, 8.5, -0.8]]]], [[[[3.7, 1.3, 6.2, 4.0], [3.4, 1.3, 6.5, 4.6], [-0.1, -0.2], 0.2, 1.0], [False, [3.4, 1.3, 6.5, 4.6]]], [[[-1.5, 3.1, 0.0, 4.0], [-1.8, 2.95, 0.3, 4.3], [0, 0.2], 0.1, 1.0], [False, [-1.8, 2.95, 0.3, 4.3]]], [[[-2.1, -4.0, 0.8, -2.1], [-4.1, -4.6, 0.3, 0.8], [1.0, 0.1], 0.5, 2.0], [True, [-2.6, -4.5, 3.3, -1.4]]], [[[2.8, 2.9, 4.4, 5.8], [2.6, 2.7, 4.5, 5.8], [0, 0.1], 0.1, 4.0], [False, [2.6, 2.7, 4.5, 5.8]]], [[[-3.1, 2.9, -0.8, 4.5], [-5.5, 1.9, 2.8, 5.0], [-0.6, 0], 0.5, 1.0], [False, [-5.5, 1.9, 2.8, 5.0]]], [[[0.6, -5.6, 3.3, -3.9], [0.1, -4.7, 3.5, -2.3], [0.4, -1.0], 0.1, 1.0], [True, [0.5, -6.7, 3.8, -3.8]]], [[[4.7, -1.7, 5.8, -1.1], [3.2, -2.2, 5.8, -0.1], [1.0, 0], 0.5, 4.0], [False, [3.2, -2.2, 5.8, -0.1]]], [[[-2.9, -4.6, -1.5, -3.9], [-4.9, -6.6, -2.0, 0.1], [1.0, -1.0], 0.5, 2.0], [True, [-3.4, -7.1, 1.0, -3.4]]]]]
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 | [False, [-4.5, -0.4, -1.4, 0.7]] | [True, [-3.0, -0.2, 1.5, 0.9]] | Failed |
| case 1 | [False, [-4.2, 1.1, -2.4, 3.9]] | [True, [-3.0, 2.2, -0.6, 4.1]] | Failed |
| case 2 | [False, [-0.8, -1.1, 1.7, 2.5]] | [False, [-0.8, -1.1, 1.7, 2.5]] | Passed |
| case 3 | [False, [-3.4, 2.0, -0.3, 3.3]] | [False, [-3.4, 2.0, -0.3, 3.3]] | Passed |
| case 4 | [True, [-3.5, -1.0, -2.3, 1.0]] | [True, [-3.5, -1.0, -2.3, 1.0]] | Passed |
| case 5 | [False, [-3.7, -1.9, 1.2, 1.8]] | [False, [-3.7, -1.9, 1.2, 1.8]] | Passed |
| case 6 | [True, [0.7, 0.8, 5.1, 3.3]] | [True, [0.7, 0.8, 5.1, 3.3]] | Passed |
| case 7 | [False, [-4.7, 0.7, 2.2, 7.2]] | [False, [-4.7, 0.7, 2.2, 7.2]] | Passed |
SHA-256 / b5ad0d9e2f74a4f5468b0ca7c70ce917925680a304e2839c5b0d6576cbe080a1
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(tight, fat, disp, margin, mult):
def fatten():
f = [tight[0] - margin, tight[1] - margin, tight[2] + margin, tight[3] + margin]
dx, dy = mult * disp[0], mult * disp[1]
if dx < 0:
f[0] += dx
else:
f[2] += dx
if dy < 0:
f[1] += dy
else:
f[3] += dy
return [round(c, 6) for c in f]
def area(b):
return (b[2] - b[0]) * (b[3] - b[1])
inside = fat[0] <= tight[0] and fat[1] <= tight[1] and tight[2] <= fat[2] and tight[3] <= fat[3]
fresh = fatten()
if inside and area(fat) <= 4 * area(fresh):
return [False, fat]
return [True, fresh]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[-2.9, -0.1, -0.6, 0.6], [-4.5, -0.4, -1.4, 0.7], [1.0, 0.1], 0.1, 2.0], [True, [-3.0, -0.2, 1.5, 0.9]]], [[[-2.8, 2.4, -1.8, 3.8], [-4.2, 1.1, -2.4, 3.9], [1.0, 0.1], 0.2, 1.0], [True, [-3.0, 2.2, -0.6, 4.1]]], [[[-0.2, 0.7, 1.1, 1.9], [-0.8, -1.1, 1.7, 2.5], [-0.1, 0], 0.2, 1.0], [False, [-0.8, -1.1, 1.7, 2.5]]], [[[-3.3, 2.7, -1.0, 3.3], [-3.4, 2.0, -0.3, 3.3], [-0.1, 0.1], 0.1, 1.0], [False, [-3.4, 2.0, -0.3, 3.3]]], [[[-3.4, -0.9, -2.5, 0.7], [-7.4, -12.9, 1.5, 4.7], [0.1, 0.2], 0.1, 1.0], [True, [-3.5, -1.0, -2.3, 1.0]]], [[[0.3, -1.3, 1.2, 0.9], [-3.7, -1.9, 1.2, 1.8], [1.0, 0.1], 0.5, 4.0], [False, [-3.7, -1.9, 1.2, 1.8]]], [[[2.4, 1.3, 4.6, 2.6], [2.5, 0.2, 6.2, 3.0], [-0.6, 0.1], 0.5, 2.0], [True, [0.7, 0.8, 5.1, 3.3]]], [[[-4.3, 0.7, -1.4, 3.2], [-4.7, 0.7, 2.2, 7.2], [-0.6, -1.0], 0.5, 2.0], [False, [-4.7, 0.7, 2.2, 7.2]]]], [[[[0.8, -0.3, 1.7, 1.2], [-0.3, -2.3, 2.1, 3.2], [0.1, -1.0], 0.5, 1.0], [False, [-0.3, -2.3, 2.1, 3.2]]], [[[-1.9, -3.8, 0.9, -2.8], [-3.1, -4.5, 0.1, -2.7], [1.0, 0.5], 0.1, 4.0], [True, [-2.0, -3.9, 5.0, -0.7]]], [[[2.2, 3.9, 3.8, 4.6], [-1.8, -0.1, 7.8, 8.6], [0.1, 0.2], 0.2, 1.0], [True, [2.0, 3.7, 4.1, 5.0]]], [[[3.0, 4.0, 3.8, 5.2], [0.0, 3.0, 4.8, 5.2], [0, 0.5], 0.5, 1.0], [False, [0.0, 3.0, 4.8, 5.2]]], [[[-0.1, -0.3, 1.1, 1.0], [-0.8, -0.3, 1.1, 1.4], [0.1, -0.2], 0.1, 4.0], [False, [-0.8, -0.3, 1.1, 1.4]]], [[[3.5, 4.1, 4.2, 5.4], [3.4, 3.4, 4.9, 5.0], [-0.1, 0.5], 0.1, 1.0], [True, [3.3, 4.0, 4.3, 6.0]]], [[[-2.7, -2.6, -1.9, -0.3], [-2.7, -3.2, -1.1, -0.1], [-0.6, 0], 0.1, 1.0], [False, [-2.7, -3.2, -1.1, -0.1]]], [[[0.9, 2.5, 3.2, 4.8], [-0.5, -0.3, 3.8, 6.0], [0.4, -0.2], 0.5, 1.0], [False, [-0.5, -0.3, 3.8, 6.0]]]], [[[[3.6, -4.5, 4.6, -3.5], [0.6, -4.5, 5.6, 0.5], [0, -1.0], 0.5, 4.0], [False, [0.6, -4.5, 5.6, 0.5]]], [[[-0.5, -4.7, 0.5, -2.8], [-1.6, -5.1, 0.1, -2.0], [1.0, -0.2], 0.1, 4.0], [True, [-0.6, -5.6, 4.6, -2.7]]], [[[0.4, 1.0, 2.7, 2.7], [0.8, 1.0, 3.9, 3.0], [-0.6, -0.2], 0.1, 2.0], [True, [-0.9, 0.5, 2.8, 2.8]]], [[[-0.3, 4.2, 1.5, 5.7], [-1.8, 1.1, 1.0, 8.6], [1.0, 0.1], 0.5, 1.0], [True, [-0.8, 3.7, 3.0, 6.3]]], [[[-2.7, -2.3, -1.0, -0.7], [-3.7, -3.3, -0.0, 0.3], [0, 0], 0.2, 1.0], [False, [-3.7, -3.3, -0.0, 0.3]]], [[[-4.3, -1.2, -2.9, -0.1], [-4.3, -1.6, -1.7, 0.2], [-0.6, -0.2], 0.1, 2.0], [False, [-4.3, -1.6, -1.7, 0.2]]], [[[-1.4, 3.0, -0.7, 3.7], [-1.4, 2.6, 0.5, 4.1], [-0.6, -0.2], 0.1, 4.0], [False, [-1.4, 2.6, 0.5, 4.1]]], [[[1.7, -0.5, 2.9, 1.9], [0.7, -0.5, 2.7, 2.3], [0.4, -0.2], 0.1, 4.0], [True, [1.6, -1.4, 4.6, 2.0]]]], [[[[0.2, 1.9, 1.6, 2.6], [0.2, 1.9, 2.8, 3.0], [-0.6, -0.2], 0.1, 4.0], [False, [0.2, 1.9, 2.8, 3.0]]], [[[1.5, -2.9, 4.1, -0.5], [1.4, -4.6, 4.6, -0.8], [-0.1, 0.5], 0.2, 1.0], [True, [1.2, -3.1, 4.3, 0.2]]], [[[2.1, -1.3, 4.7, 0.7], [1.5, -1.3, 5.5, 2.1], [-0.6, -0.2], 0.2, 2.0], [False, [1.5, -1.3, 5.5, 2.1]]], [[[3.4, 1.4, 4.5, 3.4], [0.4, 1.4, 5.5, 4.9], [0, -1.0], 0.5, 2.0], [False, [0.4, 1.4, 5.5, 4.9]]], [[[3.8, 0.5, 4.7, 2.1], [-0.2, -3.5, 8.7, 6.1], [-0.1, 0], 0.2, 1.0], [True, [3.5, 0.3, 4.9, 2.3]]], [[[-2.9, 0.5, -0.5, 2.0], [-4.1, -1.2, 0.7, 1.9], [0, 0.5], 0.2, 1.0], [True, [-3.1, 0.3, -0.3, 2.7]]], [[[-2.8, -1.6, -2.1, -0.8], [-5.0, -0.8, -2.9, 1.4], [1.0, -1.0], 0.2, 2.0], [True, [-3.0, -3.8, 0.1, -0.6]]], [[[5.5, -2.4, 7.0, -1.3], [3.5, -3.2, 6.5, -0.1], [1.0, -0.2], 0.5, 1.0], [True, [5.0, -3.1, 8.5, -0.8]]]], [[[[3.7, 1.3, 6.2, 4.0], [3.4, 1.3, 6.5, 4.6], [-0.1, -0.2], 0.2, 1.0], [False, [3.4, 1.3, 6.5, 4.6]]], [[[-1.5, 3.1, 0.0, 4.0], [-1.8, 2.95, 0.3, 4.3], [0, 0.2], 0.1, 1.0], [False, [-1.8, 2.95, 0.3, 4.3]]], [[[-2.1, -4.0, 0.8, -2.1], [-4.1, -4.6, 0.3, 0.8], [1.0, 0.1], 0.5, 2.0], [True, [-2.6, -4.5, 3.3, -1.4]]], [[[2.8, 2.9, 4.4, 5.8], [2.6, 2.7, 4.5, 5.8], [0, 0.1], 0.1, 4.0], [False, [2.6, 2.7, 4.5, 5.8]]], [[[-3.1, 2.9, -0.8, 4.5], [-5.5, 1.9, 2.8, 5.0], [-0.6, 0], 0.5, 1.0], [False, [-5.5, 1.9, 2.8, 5.0]]], [[[0.6, -5.6, 3.3, -3.9], [0.1, -4.7, 3.5, -2.3], [0.4, -1.0], 0.1, 1.0], [True, [0.5, -6.7, 3.8, -3.8]]], [[[4.7, -1.7, 5.8, -1.1], [3.2, -2.2, 5.8, -0.1], [1.0, 0], 0.5, 4.0], [False, [3.2, -2.2, 5.8, -0.1]]], [[[-2.9, -4.6, -1.5, -3.9], [-4.9, -6.6, -2.0, 0.1], [1.0, -1.0], 0.5, 2.0], [True, [-3.4, -7.1, 1.0, -3.4]]]]]
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 | [True, [-3.0, -0.2, 1.5, 0.9]] | [True, [-3.0, -0.2, 1.5, 0.9]] | Passed |
| case 1 | [True, [-3.0, 2.2, -0.6, 4.1]] | [True, [-3.0, 2.2, -0.6, 4.1]] | Passed |
| case 2 | [False, [-0.8, -1.1, 1.7, 2.5]] | [False, [-0.8, -1.1, 1.7, 2.5]] | Passed |
| case 3 | [False, [-3.4, 2.0, -0.3, 3.3]] | [False, [-3.4, 2.0, -0.3, 3.3]] | Passed |
| case 4 | [True, [-3.5, -1.0, -2.3, 1.0]] | [True, [-3.5, -1.0, -2.3, 1.0]] | Passed |
| case 5 | [False, [-3.7, -1.9, 1.2, 1.8]] | [False, [-3.7, -1.9, 1.2, 1.8]] | Passed |
| case 6 | [True, [0.7, 0.8, 5.1, 3.3]] | [True, [0.7, 0.8, 5.1, 3.3]] | Passed |
| case 7 | [False, [-4.7, 0.7, 2.2, 7.2]] | [False, [-4.7, 0.7, 2.2, 7.2]] | Passed |
SHA-256 / 0814c5c229eabb6dfb0c91e9c96f11a78a9a775d873702faf125d1d13ee93a38
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:50:58.358301+00:00.
Case digest / f755e152b6a7f030ff3c376358421a93338081b95f4af5912309fedbe4ab5bc4