FA-87761 / Collision detection broadphase / Open access
Boxes starting at the same x are paired by both passes · case 01
Pairs with equal minimum x are reported twice.
ROOT CAUSE
Pass 2 skips only A boxes with minx < b.minx.
VERIFIED REPAIR
Pass 2 must skip A boxes with minx <= b.minx (pass 1 owns ties).
Unsuccessful approach: Making pass 1 skip ties as well loses equal-start pairs entirely.
Case contract
solve(A, B): bipartite box pruning (dynamic set A vs static set B), boxes [id,minx,miny,maxx,maxy], closed intervals. Sort both by (minx,id). Pass 1: for each a, B boxes with minx in [a.minx, a.maxx]; pass 2: for each b, A boxes with minx in (b.minx, b.maxx]; y overlap required. Return sorted [a id, b id] pairs.
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(A, B):
As = sorted(A, key=lambda r: (r[1], r[0]))
Bs = sorted(B, key=lambda r: (r[1], r[0]))
def yover(p, q):
return p[2] <= q[4] and q[2] <= p[4]
pairs = []
j = 0
for a in As:
while j < len(Bs) and Bs[j][1] < a[1]:
j += 1
k = j
while k < len(Bs) and Bs[k][1] <= a[3]:
if yover(a, Bs[k]):
pairs.append([a[0], Bs[k][0]])
k += 1
j2 = 0
for b in Bs:
while j2 < len(As) and As[j2][1] < b[1]:
j2 += 1
k = j2
while k < len(As) and As[k][1] <= b[3]:
if yover(As[k], b):
pairs.append([As[k][0], b[0]])
k += 1
pairs.sort()
return pairs
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[22, 5.0, -3.0, 7.0, -3.0]], [[6, 5.0, 1.0, 5.0, 2.0], [4, 1.0, 0.0, 4.0, 0.0]]], []], [[[[33, 0.0, 3.0, 0.0, 5.0], [32, 2.0, 3.0, 4.0, 5.0], [11, -5.0, -4.0, -5.0, -4.0]], [[8, 0.0, -2.0, 5.0, -2.0]]], []], [[[[39, 2.0, 0.0, 5.0, 2.0], [24, 3.0, -3.0, 4.0, -2.0]], [[9, 2.0, 2.0, 2.0, 3.0], [17, 3.0, 3.0, 5.0, 3.0]]], [[39, 9]]], [[[[29, -3.0, -4.0, -3.0, -1.0], [37, 5.0, 0.0, 5.0, 0.0], [14, -1.0, 2.0, 0.0, 3.0]], [[1, -3.0, -1.0, 3.0, -1.0], [20, 4.0, 0.0, 5.0, 3.0]]], [[29, 1], [37, 20]]], [[[[14, -3.0, 4.0, 0.0, 5.0], [11, -5.0, -1.0, -5.0, -1.0], [7, 5.0, 5.0, 6.0, 8.0]], [[9, -3.0, 2.0, 6.0, 2.0]]], []], [[[[33, 3.0, 3.0, 6.0, 6.0], [9, -4.0, 4.0, -2.0, 6.0], [26, -1.0, -5.0, -1.0, -4.0], [12, 1.0, 4.0, 2.0, 4.0]], [[19, 3.0, 0.0, 7.0, 3.0], [5, -3.0, 5.0, -1.0, 5.0], [18, 1.0, -3.0, 4.0, 0.0], [30, 5.0, -3.0, 7.0, 0.0]]], [[9, 5], [33, 19]]], [[[[4, -5.0, -1.0, -2.0, 1.0], [2, 5.0, -3.0, 5.0, -2.0], [29, -5.0, 2.0, -2.0, 5.0]], [[27, -5.0, 2.0, -1.0, 2.0], [18, 0.0, -5.0, 1.0, -5.0], [37, 3.0, -3.0, 4.0, -3.0], [11, -4.0, -5.0, -2.0, -3.0]]], [[29, 27]]], [[[[4, -3.0, -5.0, -3.0, -5.0], [11, 5.0, -4.0, 6.0, -3.0]], [[26, 5.0, -3.0, 5.0, 0.0]]], [[11, 26]]]], [[[[[35, 5.0, -2.0, 7.0, -2.0], [22, -2.0, 0.0, 0.0, 0.0], [29, 4.0, -2.0, 6.0, 1.0]], [[30, 5.0, -2.0, 5.0, 1.0], [9, 2.0, 2.0, 2.0, 3.0], [19, -1.0, 1.0, -1.0, 3.0]]], [[29, 30], [35, 30]]], [[[[24, -3.0, 5.0, 0.0, 7.0], [22, 2.0, 0.0, 5.0, 2.0]], [[19, -3.0, -2.0, 5.0, -2.0]]], []], [[[[26, 1.0, -5.0, 4.0, -4.0], [15, -3.0, -2.0, -3.0, -2.0], [35, -4.0, 2.0, -2.0, 4.0]], [[22, -2.0, -5.0, -1.0, -3.0], [29, -3.0, -5.0, -1.0, -5.0], [37, 2.0, 4.0, 5.0, 4.0]]], []], [[[[17, -5.0, -3.0, -4.0, 0.0], [22, -5.0, 4.0, -5.0, 5.0]], [[23, -5.0, 1.0, 0.0, 1.0], [3, 5.0, -4.0, 5.0, -4.0], [6, -1.0, 4.0, 0.0, 7.0], [1, 5.0, -5.0, 7.0, -5.0]]], []], [[[[20, -4.0, -5.0, -4.0, -2.0], [9, 5.0, 2.0, 6.0, 5.0]], [[18, 2.0, 5.0, 4.0, 5.0], [5, 4.0, 3.0, 7.0, 5.0]]], [[9, 5]]], [[[[29, 0.0, 4.0, 0.0, 5.0], [13, -2.0, 0.0, 1.0, 0.0], [26, 5.0, -2.0, 8.0, -2.0]], [[4, 0.0, 5.0, 0.0, 6.0], [32, 3.0, 0.0, 6.0, 1.0]]], [[29, 4]]], [[[[34, 3.0, 2.0, 4.0, 4.0], [11, -2.0, -1.0, -2.0, -1.0], [19, -2.0, -5.0, -1.0, -3.0], [39, 1.0, -2.0, 1.0, 0.0]], [[13, 5.0, -5.0, 8.0, -3.0], [14, -4.0, 1.0, -4.0, 1.0], [8, 1.0, -2.0, 1.0, -1.0], [32, 2.0, -4.0, 2.0, -4.0]]], [[39, 8]]], [[[[23, 0.0, -3.0, 1.0, -1.0]], [[9, 0.0, -1.0, 0.0, 0.0], [30, 4.0, 1.0, 4.0, 4.0], [27, -4.0, -3.0, -1.0, 0.0]]], [[23, 9]]]], [[[[[26, -3.0, 3.0, -1.0, 3.0], [12, 3.0, -2.0, 6.0, 1.0], [38, 1.0, -2.0, 4.0, -1.0], [31, 5.0, -5.0, 8.0, -4.0]], [[9, -5.0, -2.0, -2.0, 1.0]]], []], [[[[13, -2.0, 5.0, -2.0, 5.0]], [[19, -1.0, -3.0, -1.0, -1.0]]], []], [[[[26, -1.0, 1.0, 0.0, 1.0]], [[15, 1.0, -1.0, 2.0, -1.0], [10, 4.0, 5.0, 7.0, 6.0], [34, -5.0, -1.0, -4.0, -1.0]]], []], [[[[26, -3.0, 0.0, -3.0, 3.0]], [[28, -2.0, -3.0, -2.0, -2.0], [20, 1.0, 3.0, 1.0, 3.0], [29, 2.0, 4.0, 2.0, 5.0], [19, -3.0, 0.0, -2.0, 3.0]]], [[26, 19]]], [[[[36, 2.0, 4.0, 4.0, 4.0], [32, -3.0, -4.0, -3.0, -2.0], [37, -3.0, -4.0, -2.0, -4.0], [12, 5.0, -2.0, 5.0, 1.0]], [[22, 2.0, 4.0, 2.0, 4.0], [5, 4.0, 2.0, 7.0, 5.0]]], [[36, 5], [36, 22]]], [[[[1, -4.0, -5.0, -2.0, -2.0], [28, -5.0, -2.0, -5.0, 0.0], [3, 2.0, -3.0, 4.0, 0.0], [11, -5.0, -1.0, -3.0, 1.0]], [[9, 2.0, 3.0, 2.0, 5.0], [21, 5.0, -5.0, 6.0, -4.0]]], []], [[[[27, 0.0, 3.0, 0.0, 6.0], [12, -4.0, 4.0, -3.0, 7.0], [8, -3.0, -1.0, -1.0, -1.0]], [[4, -1.0, -4.0, -1.0, -1.0], [16, -5.0, -4.0, -4.0, -3.0], [28, -4.0, 5.0, -2.0, 5.0], [5, -1.0, 4.0, 2.0, 5.0]]], [[8, 4], [12, 28], [27, 5]]], [[[[5, 4.0, 1.0, 5.0, 4.0]], [[15, 4.0, 4.0, 4.0, 4.0]]], [[5, 15]]]], [[[[[8, -2.0, 0.0, 1.0, 1.0], [9, -2.0, -1.0, 1.0, 2.0], [1, 1.0, -3.0, 3.0, -2.0]], [[35, -2.0, 0.0, 3.0, 2.0], [14, 2.0, -1.0, 3.0, 1.0]]], [[8, 35], [9, 35]]], [[[[25, 0.0, -5.0, 0.0, -2.0], [24, 3.0, 5.0, 3.0, 7.0], [1, -3.0, 5.0, -3.0, 8.0], [30, -2.0, -1.0, -1.0, 2.0]], [[13, 0.0, -2.0, 2.0, 1.0], [39, -5.0, 3.0, -4.0, 5.0], [2, 4.0, 5.0, 4.0, 7.0], [7, 0.0, 3.0, 0.0, 5.0]]], [[25, 13]]], [[[[29, 5.0, -4.0, 6.0, -4.0], [7, 5.0, 4.0, 6.0, 7.0]], [[36, 1.0, -4.0, 4.0, -1.0], [27, 1.0, 2.0, 3.0, 3.0], [19, 2.0, 2.0, 3.0, 3.0]]], []], [[[[18, -5.0, 2.0, -2.0, 2.0], [34, -5.0, -3.0, -3.0, -3.0], [13, -5.0, 4.0, -2.0, 6.0]], [[32, -5.0, 5.0, 8.0, 6.0]]], [[13, 32]]], [[[[15, 3.0, -1.0, 3.0, -1.0]], [[35, 3.0, -4.0, 4.0, -1.0], [16, -2.0, 0.0, -2.0, 2.0], [9, 1.0, 4.0, 4.0, 4.0], [27, -4.0, -5.0, -4.0, -4.0]]], [[15, 35]]], [[[[15, 5.0, 2.0, 6.0, 3.0], [27, -3.0, 5.0, -3.0, 6.0]], [[38, 5.0, 2.0, 5.0, 2.0]]], [[15, 38]]], [[[[35, 4.0, 5.0, 6.0, 8.0], [5, -4.0, 4.0, -3.0, 4.0], [33, 1.0, 5.0, 2.0, 5.0]], [[1, 4.0, 4.0, 4.0, 4.0], [10, -3.0, 4.0, -2.0, 6.0], [17, -1.0, 1.0, 0.0, 3.0], [7, 5.0, -5.0, 7.0, -5.0]]], [[5, 10]]], [[[[35, -3.0, 2.0, -3.0, 4.0], [16, 0.0, 1.0, 1.0, 1.0], [15, -2.0, 4.0, 0.0, 6.0]], [[22, -3.0, -3.0, 2.0, 0.0], [7, 2.0, 1.0, 3.0, 4.0], [6, 5.0, -5.0, 6.0, -4.0]]], []]], [[[[[2, -1.0, 0.0, -1.0, 1.0], [10, -5.0, 2.0, -3.0, 5.0], [19, -4.0, 1.0, -4.0, 4.0]], [[11, 4.0, 3.0, 4.0, 5.0], [14, -2.0, 1.0, 1.0, 2.0]]], [[2, 14]]], [[[[32, 2.0, 1.0, 4.0, 4.0], [10, 2.0, -3.0, 3.0, -2.0]], [[5, -2.0, 5.0, -1.0, 5.0]]], []], [[[[16, -1.0, -4.0, 1.0, -1.0], [31, -5.0, -2.0, -5.0, -1.0]], [[6, -1.0, -4.0, 2.0, -4.0], [9, -2.0, -4.0, -2.0, -1.0], [8, -5.0, -5.0, -4.0, -3.0], [34, 5.0, 1.0, 8.0, 4.0]]], [[16, 6]]], [[[[14, -4.0, -1.0, -2.0, 1.0]], [[20, 3.0, 0.0, 5.0, 2.0], [12, 0.0, -2.0, 1.0, 1.0], [19, 4.0, -2.0, 5.0, -1.0]]], []], [[[[14, -5.0, -5.0, -5.0, -5.0], [26, -3.0, -1.0, -1.0, 1.0], [20, 1.0, 3.0, 3.0, 4.0]], [[10, -5.0, -5.0, 2.0, -4.0]]], [[14, 10]]], [[[[29, -2.0, 0.0, 0.0, 3.0]], [[36, -4.0, 5.0, -2.0, 6.0], [1, -2.0, -1.0, -1.0, 2.0]]], [[29, 1]]], [[[[7, -2.0, 0.0, -1.0, 0.0], [15, 5.0, -5.0, 5.0, -5.0], [16, -1.0, -2.0, 2.0, -2.0], [39, 0.0, -1.0, 0.0, 0.0]], [[13, -2.0, 2.0, 3.0, 5.0]]], []], [[[[14, -4.0, 5.0, -2.0, 8.0]], [[8, -4.0, 3.0, -1.0, 6.0], [17, 3.0, -4.0, 6.0, -1.0]]], [[14, 8]]]]]
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 | [] | [] | Passed |
| case 1 | [] | [] | Passed |
| case 2 | [[39, 9], [39, 9]] | [[39, 9]] | Failed |
| case 3 | [[29, 1], [29, 1], [37, 20]] | [[29, 1], [37, 20]] | Failed |
| case 4 | [] | [] | Passed |
| case 5 | [[9, 5], [33, 19], [33, 19]] | [[9, 5], [33, 19]] | Failed |
| case 6 | [[29, 27], [29, 27]] | [[29, 27]] | Failed |
| case 7 | [[11, 26], [11, 26]] | [[11, 26]] | Failed |
SHA-256 / 59a13299ca60b94a14edd28ed2ec0388b70b175ac0fa114b827934796b66c75d
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(A, B):
As = sorted(A, key=lambda r: (r[1], r[0]))
Bs = sorted(B, key=lambda r: (r[1], r[0]))
def yover(p, q):
return p[2] <= q[4] and q[2] <= p[4]
pairs = []
j = 0
for a in As:
while j < len(Bs) and Bs[j][1] <= a[1]:
j += 1
k = j
while k < len(Bs) and Bs[k][1] <= a[3]:
if yover(a, Bs[k]):
pairs.append([a[0], Bs[k][0]])
k += 1
j2 = 0
for b in Bs:
while j2 < len(As) and As[j2][1] <= b[1]:
j2 += 1
k = j2
while k < len(As) and As[k][1] <= b[3]:
if yover(As[k], b):
pairs.append([As[k][0], b[0]])
k += 1
pairs.sort()
return pairs
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[22, 5.0, -3.0, 7.0, -3.0]], [[6, 5.0, 1.0, 5.0, 2.0], [4, 1.0, 0.0, 4.0, 0.0]]], []], [[[[33, 0.0, 3.0, 0.0, 5.0], [32, 2.0, 3.0, 4.0, 5.0], [11, -5.0, -4.0, -5.0, -4.0]], [[8, 0.0, -2.0, 5.0, -2.0]]], []], [[[[39, 2.0, 0.0, 5.0, 2.0], [24, 3.0, -3.0, 4.0, -2.0]], [[9, 2.0, 2.0, 2.0, 3.0], [17, 3.0, 3.0, 5.0, 3.0]]], [[39, 9]]], [[[[29, -3.0, -4.0, -3.0, -1.0], [37, 5.0, 0.0, 5.0, 0.0], [14, -1.0, 2.0, 0.0, 3.0]], [[1, -3.0, -1.0, 3.0, -1.0], [20, 4.0, 0.0, 5.0, 3.0]]], [[29, 1], [37, 20]]], [[[[14, -3.0, 4.0, 0.0, 5.0], [11, -5.0, -1.0, -5.0, -1.0], [7, 5.0, 5.0, 6.0, 8.0]], [[9, -3.0, 2.0, 6.0, 2.0]]], []], [[[[33, 3.0, 3.0, 6.0, 6.0], [9, -4.0, 4.0, -2.0, 6.0], [26, -1.0, -5.0, -1.0, -4.0], [12, 1.0, 4.0, 2.0, 4.0]], [[19, 3.0, 0.0, 7.0, 3.0], [5, -3.0, 5.0, -1.0, 5.0], [18, 1.0, -3.0, 4.0, 0.0], [30, 5.0, -3.0, 7.0, 0.0]]], [[9, 5], [33, 19]]], [[[[4, -5.0, -1.0, -2.0, 1.0], [2, 5.0, -3.0, 5.0, -2.0], [29, -5.0, 2.0, -2.0, 5.0]], [[27, -5.0, 2.0, -1.0, 2.0], [18, 0.0, -5.0, 1.0, -5.0], [37, 3.0, -3.0, 4.0, -3.0], [11, -4.0, -5.0, -2.0, -3.0]]], [[29, 27]]], [[[[4, -3.0, -5.0, -3.0, -5.0], [11, 5.0, -4.0, 6.0, -3.0]], [[26, 5.0, -3.0, 5.0, 0.0]]], [[11, 26]]]], [[[[[35, 5.0, -2.0, 7.0, -2.0], [22, -2.0, 0.0, 0.0, 0.0], [29, 4.0, -2.0, 6.0, 1.0]], [[30, 5.0, -2.0, 5.0, 1.0], [9, 2.0, 2.0, 2.0, 3.0], [19, -1.0, 1.0, -1.0, 3.0]]], [[29, 30], [35, 30]]], [[[[24, -3.0, 5.0, 0.0, 7.0], [22, 2.0, 0.0, 5.0, 2.0]], [[19, -3.0, -2.0, 5.0, -2.0]]], []], [[[[26, 1.0, -5.0, 4.0, -4.0], [15, -3.0, -2.0, -3.0, -2.0], [35, -4.0, 2.0, -2.0, 4.0]], [[22, -2.0, -5.0, -1.0, -3.0], [29, -3.0, -5.0, -1.0, -5.0], [37, 2.0, 4.0, 5.0, 4.0]]], []], [[[[17, -5.0, -3.0, -4.0, 0.0], [22, -5.0, 4.0, -5.0, 5.0]], [[23, -5.0, 1.0, 0.0, 1.0], [3, 5.0, -4.0, 5.0, -4.0], [6, -1.0, 4.0, 0.0, 7.0], [1, 5.0, -5.0, 7.0, -5.0]]], []], [[[[20, -4.0, -5.0, -4.0, -2.0], [9, 5.0, 2.0, 6.0, 5.0]], [[18, 2.0, 5.0, 4.0, 5.0], [5, 4.0, 3.0, 7.0, 5.0]]], [[9, 5]]], [[[[29, 0.0, 4.0, 0.0, 5.0], [13, -2.0, 0.0, 1.0, 0.0], [26, 5.0, -2.0, 8.0, -2.0]], [[4, 0.0, 5.0, 0.0, 6.0], [32, 3.0, 0.0, 6.0, 1.0]]], [[29, 4]]], [[[[34, 3.0, 2.0, 4.0, 4.0], [11, -2.0, -1.0, -2.0, -1.0], [19, -2.0, -5.0, -1.0, -3.0], [39, 1.0, -2.0, 1.0, 0.0]], [[13, 5.0, -5.0, 8.0, -3.0], [14, -4.0, 1.0, -4.0, 1.0], [8, 1.0, -2.0, 1.0, -1.0], [32, 2.0, -4.0, 2.0, -4.0]]], [[39, 8]]], [[[[23, 0.0, -3.0, 1.0, -1.0]], [[9, 0.0, -1.0, 0.0, 0.0], [30, 4.0, 1.0, 4.0, 4.0], [27, -4.0, -3.0, -1.0, 0.0]]], [[23, 9]]]], [[[[[26, -3.0, 3.0, -1.0, 3.0], [12, 3.0, -2.0, 6.0, 1.0], [38, 1.0, -2.0, 4.0, -1.0], [31, 5.0, -5.0, 8.0, -4.0]], [[9, -5.0, -2.0, -2.0, 1.0]]], []], [[[[13, -2.0, 5.0, -2.0, 5.0]], [[19, -1.0, -3.0, -1.0, -1.0]]], []], [[[[26, -1.0, 1.0, 0.0, 1.0]], [[15, 1.0, -1.0, 2.0, -1.0], [10, 4.0, 5.0, 7.0, 6.0], [34, -5.0, -1.0, -4.0, -1.0]]], []], [[[[26, -3.0, 0.0, -3.0, 3.0]], [[28, -2.0, -3.0, -2.0, -2.0], [20, 1.0, 3.0, 1.0, 3.0], [29, 2.0, 4.0, 2.0, 5.0], [19, -3.0, 0.0, -2.0, 3.0]]], [[26, 19]]], [[[[36, 2.0, 4.0, 4.0, 4.0], [32, -3.0, -4.0, -3.0, -2.0], [37, -3.0, -4.0, -2.0, -4.0], [12, 5.0, -2.0, 5.0, 1.0]], [[22, 2.0, 4.0, 2.0, 4.0], [5, 4.0, 2.0, 7.0, 5.0]]], [[36, 5], [36, 22]]], [[[[1, -4.0, -5.0, -2.0, -2.0], [28, -5.0, -2.0, -5.0, 0.0], [3, 2.0, -3.0, 4.0, 0.0], [11, -5.0, -1.0, -3.0, 1.0]], [[9, 2.0, 3.0, 2.0, 5.0], [21, 5.0, -5.0, 6.0, -4.0]]], []], [[[[27, 0.0, 3.0, 0.0, 6.0], [12, -4.0, 4.0, -3.0, 7.0], [8, -3.0, -1.0, -1.0, -1.0]], [[4, -1.0, -4.0, -1.0, -1.0], [16, -5.0, -4.0, -4.0, -3.0], [28, -4.0, 5.0, -2.0, 5.0], [5, -1.0, 4.0, 2.0, 5.0]]], [[8, 4], [12, 28], [27, 5]]], [[[[5, 4.0, 1.0, 5.0, 4.0]], [[15, 4.0, 4.0, 4.0, 4.0]]], [[5, 15]]]], [[[[[8, -2.0, 0.0, 1.0, 1.0], [9, -2.0, -1.0, 1.0, 2.0], [1, 1.0, -3.0, 3.0, -2.0]], [[35, -2.0, 0.0, 3.0, 2.0], [14, 2.0, -1.0, 3.0, 1.0]]], [[8, 35], [9, 35]]], [[[[25, 0.0, -5.0, 0.0, -2.0], [24, 3.0, 5.0, 3.0, 7.0], [1, -3.0, 5.0, -3.0, 8.0], [30, -2.0, -1.0, -1.0, 2.0]], [[13, 0.0, -2.0, 2.0, 1.0], [39, -5.0, 3.0, -4.0, 5.0], [2, 4.0, 5.0, 4.0, 7.0], [7, 0.0, 3.0, 0.0, 5.0]]], [[25, 13]]], [[[[29, 5.0, -4.0, 6.0, -4.0], [7, 5.0, 4.0, 6.0, 7.0]], [[36, 1.0, -4.0, 4.0, -1.0], [27, 1.0, 2.0, 3.0, 3.0], [19, 2.0, 2.0, 3.0, 3.0]]], []], [[[[18, -5.0, 2.0, -2.0, 2.0], [34, -5.0, -3.0, -3.0, -3.0], [13, -5.0, 4.0, -2.0, 6.0]], [[32, -5.0, 5.0, 8.0, 6.0]]], [[13, 32]]], [[[[15, 3.0, -1.0, 3.0, -1.0]], [[35, 3.0, -4.0, 4.0, -1.0], [16, -2.0, 0.0, -2.0, 2.0], [9, 1.0, 4.0, 4.0, 4.0], [27, -4.0, -5.0, -4.0, -4.0]]], [[15, 35]]], [[[[15, 5.0, 2.0, 6.0, 3.0], [27, -3.0, 5.0, -3.0, 6.0]], [[38, 5.0, 2.0, 5.0, 2.0]]], [[15, 38]]], [[[[35, 4.0, 5.0, 6.0, 8.0], [5, -4.0, 4.0, -3.0, 4.0], [33, 1.0, 5.0, 2.0, 5.0]], [[1, 4.0, 4.0, 4.0, 4.0], [10, -3.0, 4.0, -2.0, 6.0], [17, -1.0, 1.0, 0.0, 3.0], [7, 5.0, -5.0, 7.0, -5.0]]], [[5, 10]]], [[[[35, -3.0, 2.0, -3.0, 4.0], [16, 0.0, 1.0, 1.0, 1.0], [15, -2.0, 4.0, 0.0, 6.0]], [[22, -3.0, -3.0, 2.0, 0.0], [7, 2.0, 1.0, 3.0, 4.0], [6, 5.0, -5.0, 6.0, -4.0]]], []]], [[[[[2, -1.0, 0.0, -1.0, 1.0], [10, -5.0, 2.0, -3.0, 5.0], [19, -4.0, 1.0, -4.0, 4.0]], [[11, 4.0, 3.0, 4.0, 5.0], [14, -2.0, 1.0, 1.0, 2.0]]], [[2, 14]]], [[[[32, 2.0, 1.0, 4.0, 4.0], [10, 2.0, -3.0, 3.0, -2.0]], [[5, -2.0, 5.0, -1.0, 5.0]]], []], [[[[16, -1.0, -4.0, 1.0, -1.0], [31, -5.0, -2.0, -5.0, -1.0]], [[6, -1.0, -4.0, 2.0, -4.0], [9, -2.0, -4.0, -2.0, -1.0], [8, -5.0, -5.0, -4.0, -3.0], [34, 5.0, 1.0, 8.0, 4.0]]], [[16, 6]]], [[[[14, -4.0, -1.0, -2.0, 1.0]], [[20, 3.0, 0.0, 5.0, 2.0], [12, 0.0, -2.0, 1.0, 1.0], [19, 4.0, -2.0, 5.0, -1.0]]], []], [[[[14, -5.0, -5.0, -5.0, -5.0], [26, -3.0, -1.0, -1.0, 1.0], [20, 1.0, 3.0, 3.0, 4.0]], [[10, -5.0, -5.0, 2.0, -4.0]]], [[14, 10]]], [[[[29, -2.0, 0.0, 0.0, 3.0]], [[36, -4.0, 5.0, -2.0, 6.0], [1, -2.0, -1.0, -1.0, 2.0]]], [[29, 1]]], [[[[7, -2.0, 0.0, -1.0, 0.0], [15, 5.0, -5.0, 5.0, -5.0], [16, -1.0, -2.0, 2.0, -2.0], [39, 0.0, -1.0, 0.0, 0.0]], [[13, -2.0, 2.0, 3.0, 5.0]]], []], [[[[14, -4.0, 5.0, -2.0, 8.0]], [[8, -4.0, 3.0, -1.0, 6.0], [17, 3.0, -4.0, 6.0, -1.0]]], [[14, 8]]]]]
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 | [] | [] | Passed |
| case 1 | [] | [] | Passed |
| case 2 | [] | [[39, 9]] | Failed |
| case 3 | [[37, 20]] | [[29, 1], [37, 20]] | Failed |
| case 4 | [] | [] | Passed |
| case 5 | [[9, 5]] | [[9, 5], [33, 19]] | Failed |
| case 6 | [] | [[29, 27]] | Failed |
| case 7 | [] | [[11, 26]] | Failed |
SHA-256 / 8e4ed7b2b30056913009e65e09ac76121da3d2f0acd9256a9a5511f9f2e0ec64
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(A, B):
As = sorted(A, key=lambda r: (r[1], r[0]))
Bs = sorted(B, key=lambda r: (r[1], r[0]))
def yover(p, q):
return p[2] <= q[4] and q[2] <= p[4]
pairs = []
j = 0
for a in As:
while j < len(Bs) and Bs[j][1] < a[1]:
j += 1
k = j
while k < len(Bs) and Bs[k][1] <= a[3]:
if yover(a, Bs[k]):
pairs.append([a[0], Bs[k][0]])
k += 1
j2 = 0
for b in Bs:
while j2 < len(As) and As[j2][1] <= b[1]:
j2 += 1
k = j2
while k < len(As) and As[k][1] <= b[3]:
if yover(As[k], b):
pairs.append([As[k][0], b[0]])
k += 1
pairs.sort()
return pairs
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[22, 5.0, -3.0, 7.0, -3.0]], [[6, 5.0, 1.0, 5.0, 2.0], [4, 1.0, 0.0, 4.0, 0.0]]], []], [[[[33, 0.0, 3.0, 0.0, 5.0], [32, 2.0, 3.0, 4.0, 5.0], [11, -5.0, -4.0, -5.0, -4.0]], [[8, 0.0, -2.0, 5.0, -2.0]]], []], [[[[39, 2.0, 0.0, 5.0, 2.0], [24, 3.0, -3.0, 4.0, -2.0]], [[9, 2.0, 2.0, 2.0, 3.0], [17, 3.0, 3.0, 5.0, 3.0]]], [[39, 9]]], [[[[29, -3.0, -4.0, -3.0, -1.0], [37, 5.0, 0.0, 5.0, 0.0], [14, -1.0, 2.0, 0.0, 3.0]], [[1, -3.0, -1.0, 3.0, -1.0], [20, 4.0, 0.0, 5.0, 3.0]]], [[29, 1], [37, 20]]], [[[[14, -3.0, 4.0, 0.0, 5.0], [11, -5.0, -1.0, -5.0, -1.0], [7, 5.0, 5.0, 6.0, 8.0]], [[9, -3.0, 2.0, 6.0, 2.0]]], []], [[[[33, 3.0, 3.0, 6.0, 6.0], [9, -4.0, 4.0, -2.0, 6.0], [26, -1.0, -5.0, -1.0, -4.0], [12, 1.0, 4.0, 2.0, 4.0]], [[19, 3.0, 0.0, 7.0, 3.0], [5, -3.0, 5.0, -1.0, 5.0], [18, 1.0, -3.0, 4.0, 0.0], [30, 5.0, -3.0, 7.0, 0.0]]], [[9, 5], [33, 19]]], [[[[4, -5.0, -1.0, -2.0, 1.0], [2, 5.0, -3.0, 5.0, -2.0], [29, -5.0, 2.0, -2.0, 5.0]], [[27, -5.0, 2.0, -1.0, 2.0], [18, 0.0, -5.0, 1.0, -5.0], [37, 3.0, -3.0, 4.0, -3.0], [11, -4.0, -5.0, -2.0, -3.0]]], [[29, 27]]], [[[[4, -3.0, -5.0, -3.0, -5.0], [11, 5.0, -4.0, 6.0, -3.0]], [[26, 5.0, -3.0, 5.0, 0.0]]], [[11, 26]]]], [[[[[35, 5.0, -2.0, 7.0, -2.0], [22, -2.0, 0.0, 0.0, 0.0], [29, 4.0, -2.0, 6.0, 1.0]], [[30, 5.0, -2.0, 5.0, 1.0], [9, 2.0, 2.0, 2.0, 3.0], [19, -1.0, 1.0, -1.0, 3.0]]], [[29, 30], [35, 30]]], [[[[24, -3.0, 5.0, 0.0, 7.0], [22, 2.0, 0.0, 5.0, 2.0]], [[19, -3.0, -2.0, 5.0, -2.0]]], []], [[[[26, 1.0, -5.0, 4.0, -4.0], [15, -3.0, -2.0, -3.0, -2.0], [35, -4.0, 2.0, -2.0, 4.0]], [[22, -2.0, -5.0, -1.0, -3.0], [29, -3.0, -5.0, -1.0, -5.0], [37, 2.0, 4.0, 5.0, 4.0]]], []], [[[[17, -5.0, -3.0, -4.0, 0.0], [22, -5.0, 4.0, -5.0, 5.0]], [[23, -5.0, 1.0, 0.0, 1.0], [3, 5.0, -4.0, 5.0, -4.0], [6, -1.0, 4.0, 0.0, 7.0], [1, 5.0, -5.0, 7.0, -5.0]]], []], [[[[20, -4.0, -5.0, -4.0, -2.0], [9, 5.0, 2.0, 6.0, 5.0]], [[18, 2.0, 5.0, 4.0, 5.0], [5, 4.0, 3.0, 7.0, 5.0]]], [[9, 5]]], [[[[29, 0.0, 4.0, 0.0, 5.0], [13, -2.0, 0.0, 1.0, 0.0], [26, 5.0, -2.0, 8.0, -2.0]], [[4, 0.0, 5.0, 0.0, 6.0], [32, 3.0, 0.0, 6.0, 1.0]]], [[29, 4]]], [[[[34, 3.0, 2.0, 4.0, 4.0], [11, -2.0, -1.0, -2.0, -1.0], [19, -2.0, -5.0, -1.0, -3.0], [39, 1.0, -2.0, 1.0, 0.0]], [[13, 5.0, -5.0, 8.0, -3.0], [14, -4.0, 1.0, -4.0, 1.0], [8, 1.0, -2.0, 1.0, -1.0], [32, 2.0, -4.0, 2.0, -4.0]]], [[39, 8]]], [[[[23, 0.0, -3.0, 1.0, -1.0]], [[9, 0.0, -1.0, 0.0, 0.0], [30, 4.0, 1.0, 4.0, 4.0], [27, -4.0, -3.0, -1.0, 0.0]]], [[23, 9]]]], [[[[[26, -3.0, 3.0, -1.0, 3.0], [12, 3.0, -2.0, 6.0, 1.0], [38, 1.0, -2.0, 4.0, -1.0], [31, 5.0, -5.0, 8.0, -4.0]], [[9, -5.0, -2.0, -2.0, 1.0]]], []], [[[[13, -2.0, 5.0, -2.0, 5.0]], [[19, -1.0, -3.0, -1.0, -1.0]]], []], [[[[26, -1.0, 1.0, 0.0, 1.0]], [[15, 1.0, -1.0, 2.0, -1.0], [10, 4.0, 5.0, 7.0, 6.0], [34, -5.0, -1.0, -4.0, -1.0]]], []], [[[[26, -3.0, 0.0, -3.0, 3.0]], [[28, -2.0, -3.0, -2.0, -2.0], [20, 1.0, 3.0, 1.0, 3.0], [29, 2.0, 4.0, 2.0, 5.0], [19, -3.0, 0.0, -2.0, 3.0]]], [[26, 19]]], [[[[36, 2.0, 4.0, 4.0, 4.0], [32, -3.0, -4.0, -3.0, -2.0], [37, -3.0, -4.0, -2.0, -4.0], [12, 5.0, -2.0, 5.0, 1.0]], [[22, 2.0, 4.0, 2.0, 4.0], [5, 4.0, 2.0, 7.0, 5.0]]], [[36, 5], [36, 22]]], [[[[1, -4.0, -5.0, -2.0, -2.0], [28, -5.0, -2.0, -5.0, 0.0], [3, 2.0, -3.0, 4.0, 0.0], [11, -5.0, -1.0, -3.0, 1.0]], [[9, 2.0, 3.0, 2.0, 5.0], [21, 5.0, -5.0, 6.0, -4.0]]], []], [[[[27, 0.0, 3.0, 0.0, 6.0], [12, -4.0, 4.0, -3.0, 7.0], [8, -3.0, -1.0, -1.0, -1.0]], [[4, -1.0, -4.0, -1.0, -1.0], [16, -5.0, -4.0, -4.0, -3.0], [28, -4.0, 5.0, -2.0, 5.0], [5, -1.0, 4.0, 2.0, 5.0]]], [[8, 4], [12, 28], [27, 5]]], [[[[5, 4.0, 1.0, 5.0, 4.0]], [[15, 4.0, 4.0, 4.0, 4.0]]], [[5, 15]]]], [[[[[8, -2.0, 0.0, 1.0, 1.0], [9, -2.0, -1.0, 1.0, 2.0], [1, 1.0, -3.0, 3.0, -2.0]], [[35, -2.0, 0.0, 3.0, 2.0], [14, 2.0, -1.0, 3.0, 1.0]]], [[8, 35], [9, 35]]], [[[[25, 0.0, -5.0, 0.0, -2.0], [24, 3.0, 5.0, 3.0, 7.0], [1, -3.0, 5.0, -3.0, 8.0], [30, -2.0, -1.0, -1.0, 2.0]], [[13, 0.0, -2.0, 2.0, 1.0], [39, -5.0, 3.0, -4.0, 5.0], [2, 4.0, 5.0, 4.0, 7.0], [7, 0.0, 3.0, 0.0, 5.0]]], [[25, 13]]], [[[[29, 5.0, -4.0, 6.0, -4.0], [7, 5.0, 4.0, 6.0, 7.0]], [[36, 1.0, -4.0, 4.0, -1.0], [27, 1.0, 2.0, 3.0, 3.0], [19, 2.0, 2.0, 3.0, 3.0]]], []], [[[[18, -5.0, 2.0, -2.0, 2.0], [34, -5.0, -3.0, -3.0, -3.0], [13, -5.0, 4.0, -2.0, 6.0]], [[32, -5.0, 5.0, 8.0, 6.0]]], [[13, 32]]], [[[[15, 3.0, -1.0, 3.0, -1.0]], [[35, 3.0, -4.0, 4.0, -1.0], [16, -2.0, 0.0, -2.0, 2.0], [9, 1.0, 4.0, 4.0, 4.0], [27, -4.0, -5.0, -4.0, -4.0]]], [[15, 35]]], [[[[15, 5.0, 2.0, 6.0, 3.0], [27, -3.0, 5.0, -3.0, 6.0]], [[38, 5.0, 2.0, 5.0, 2.0]]], [[15, 38]]], [[[[35, 4.0, 5.0, 6.0, 8.0], [5, -4.0, 4.0, -3.0, 4.0], [33, 1.0, 5.0, 2.0, 5.0]], [[1, 4.0, 4.0, 4.0, 4.0], [10, -3.0, 4.0, -2.0, 6.0], [17, -1.0, 1.0, 0.0, 3.0], [7, 5.0, -5.0, 7.0, -5.0]]], [[5, 10]]], [[[[35, -3.0, 2.0, -3.0, 4.0], [16, 0.0, 1.0, 1.0, 1.0], [15, -2.0, 4.0, 0.0, 6.0]], [[22, -3.0, -3.0, 2.0, 0.0], [7, 2.0, 1.0, 3.0, 4.0], [6, 5.0, -5.0, 6.0, -4.0]]], []]], [[[[[2, -1.0, 0.0, -1.0, 1.0], [10, -5.0, 2.0, -3.0, 5.0], [19, -4.0, 1.0, -4.0, 4.0]], [[11, 4.0, 3.0, 4.0, 5.0], [14, -2.0, 1.0, 1.0, 2.0]]], [[2, 14]]], [[[[32, 2.0, 1.0, 4.0, 4.0], [10, 2.0, -3.0, 3.0, -2.0]], [[5, -2.0, 5.0, -1.0, 5.0]]], []], [[[[16, -1.0, -4.0, 1.0, -1.0], [31, -5.0, -2.0, -5.0, -1.0]], [[6, -1.0, -4.0, 2.0, -4.0], [9, -2.0, -4.0, -2.0, -1.0], [8, -5.0, -5.0, -4.0, -3.0], [34, 5.0, 1.0, 8.0, 4.0]]], [[16, 6]]], [[[[14, -4.0, -1.0, -2.0, 1.0]], [[20, 3.0, 0.0, 5.0, 2.0], [12, 0.0, -2.0, 1.0, 1.0], [19, 4.0, -2.0, 5.0, -1.0]]], []], [[[[14, -5.0, -5.0, -5.0, -5.0], [26, -3.0, -1.0, -1.0, 1.0], [20, 1.0, 3.0, 3.0, 4.0]], [[10, -5.0, -5.0, 2.0, -4.0]]], [[14, 10]]], [[[[29, -2.0, 0.0, 0.0, 3.0]], [[36, -4.0, 5.0, -2.0, 6.0], [1, -2.0, -1.0, -1.0, 2.0]]], [[29, 1]]], [[[[7, -2.0, 0.0, -1.0, 0.0], [15, 5.0, -5.0, 5.0, -5.0], [16, -1.0, -2.0, 2.0, -2.0], [39, 0.0, -1.0, 0.0, 0.0]], [[13, -2.0, 2.0, 3.0, 5.0]]], []], [[[[14, -4.0, 5.0, -2.0, 8.0]], [[8, -4.0, 3.0, -1.0, 6.0], [17, 3.0, -4.0, 6.0, -1.0]]], [[14, 8]]]]]
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 | [] | [] | Passed |
| case 1 | [] | [] | Passed |
| case 2 | [[39, 9]] | [[39, 9]] | Passed |
| case 3 | [[29, 1], [37, 20]] | [[29, 1], [37, 20]] | Passed |
| case 4 | [] | [] | Passed |
| case 5 | [[9, 5], [33, 19]] | [[9, 5], [33, 19]] | Passed |
| case 6 | [[29, 27]] | [[29, 27]] | Passed |
| case 7 | [[11, 26]] | [[11, 26]] | Passed |
SHA-256 / a661ea5a7b7113fa06daa7a361ba3c513f817e9635d685ef055e33fc929f9b26
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.818733+00:00.
Case digest / 7248733ca8dd4c1667c92c08e79cf57ad44d2df9babb6636766c045d41020160