FA-70461 / GIS polygon topology / Open access
Bounding box topological relation: touching sides · case 01
Boxes stacked vertically are reported as overlapping.
ROOT CAUSE
Touching is detected only on vertical sides.
VERIFIED REPAIR
At the touching sides step restore `if a[2] == b[0] or b[2] == a[0] or a[3] == b[1] or b[3] == a[1]:`, leaving the rest of the model unchanged.
Unsuccessful approach: The patched test misses boxes touching along the bottom edge of a.
Case contract
Input [a, b], closed boxes [minx, miny, maxx, maxy] with positive width and height. Return "equals" if identical, else "disjoint" if separated with no shared point, else "contains" if a covers b (shared edges allowed), "within" if b covers a, else "touches" if the boxes share only boundary, else "overlaps".
Why this case matters
Spatial indexes and map tile filters prune candidates with envelope relations before exact geometry tests.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
a, b = x
if a == b:
return 'equals'
if a[2] < b[0] or b[2] < a[0] or a[3] < b[1] or b[3] < a[1]:
return 'disjoint'
if a[0] <= b[0] and a[1] <= b[1] and a[2] >= b[2] and a[3] >= b[3]:
return 'contains'
if b[0] <= a[0] and b[1] <= a[1] and b[2] >= a[2] and b[3] >= a[3]:
return 'within'
if a[2] == b[0] or b[2] == a[0]:
return 'touches'
return 'overlaps'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control #0', [[3, 0, 9, 4], [9, 3, 13, 11]], 'touches'), ('control #1', [[6, 3, 7, 5], [3, 1, 9, 6]], 'within'), ('control #2', [[5, 9, 6, 10], [3, 9, 10, 13]], 'within'), ('control #3', [[8, 2, 9, 4], [1, 10, 4, 15]], 'disjoint'), ('control #4', [[1, 1, 7, 5], [4, 5, 9, 8]], 'touches'), ('control #5', [[9, 7, 16, 13], [1, 10, 7, 13]], 'disjoint'), ('control #6', [[3, 1, 4, 5], [8, 8, 12, 15]], 'disjoint'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches')], [('control #3', [[8, 2, 9, 4], [1, 10, 4, 15]], 'disjoint'), ('control #4', [[1, 1, 7, 5], [4, 5, 9, 8]], 'touches'), ('control #5', [[9, 7, 16, 13], [1, 10, 7, 13]], 'disjoint'), ('control #6', [[3, 1, 4, 5], [8, 8, 12, 15]], 'disjoint'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #8', [[2, 1, 4, 2], [3, 1, 6, 4]], 'overlaps'), ('control #9', [[7, 2, 15, 6], [8, 4, 14, 11]], 'overlaps'), ('boundary #28', [[0, 6, 5, 9], [0, 0, 5, 6]], 'touches')], [('control #6', [[3, 1, 4, 5], [8, 8, 12, 15]], 'disjoint'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #8', [[2, 1, 4, 2], [3, 1, 6, 4]], 'overlaps'), ('control #9', [[7, 2, 15, 6], [8, 4, 14, 11]], 'overlaps'), ('control #10', [[7, 1, 10, 3], [7, 0, 14, 3]], 'within'), ('control #11', [[2, 7, 10, 9], [10, 8, 12, 13]], 'touches'), ('control #12', [[8, 9, 9, 16], [4, 4, 11, 11]], 'overlaps'), ('boundary #18', [[0, 0, 5, 5], [0, 5, 5, 9]], 'touches')], [('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #10', [[7, 1, 10, 3], [7, 0, 14, 3]], 'within'), ('control #11', [[2, 7, 10, 9], [10, 8, 12, 13]], 'touches'), ('control #12', [[8, 9, 9, 16], [4, 4, 11, 11]], 'overlaps'), ('control #13', [[5, 3, 9, 9], [7, 8, 8, 15]], 'overlaps'), ('control #14', [[3, 2, 10, 3], [8, 5, 14, 7]], 'disjoint'), ('control #15', [[3, 5, 7, 12], [9, 2, 16, 3]], 'disjoint'), ('boundary #28', [[0, 6, 5, 9], [0, 0, 5, 6]], 'touches')], [('control #4', [[1, 1, 7, 5], [4, 5, 9, 8]], 'touches'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #14', [[3, 2, 10, 3], [8, 5, 14, 7]], 'disjoint'), ('control #15', [[3, 5, 7, 12], [9, 2, 16, 3]], 'disjoint'), ('boundary #16', [[0, 0, 5, 5], [5, 0, 9, 5]], 'touches'), ('boundary #17', [[0, 0, 5, 5], [5, 5, 9, 9]], 'touches'), ('boundary #18', [[0, 0, 5, 5], [0, 5, 5, 9]], 'touches'), ('boundary #19', [[0, 0, 10, 10], [0, 0, 5, 5]], 'contains')]]
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 |
|---|---|---|---|
| control #0 | touches | touches | Passed |
| control #1 | within | within | Passed |
| control #2 | within | within | Passed |
| control #3 | disjoint | disjoint | Passed |
| control #4 | overlaps | touches | Failed |
| control #5 | disjoint | disjoint | Passed |
| control #6 | disjoint | disjoint | Passed |
| control #7 | overlaps | touches | Failed |
SHA-256 / 2d63f7656b5b747f5e18a8ce9fe7b96d4fb3603e37e8468c87c209e01da048b9
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
a, b = x
if a == b:
return 'equals'
if a[2] < b[0] or b[2] < a[0] or a[3] < b[1] or b[3] < a[1]:
return 'disjoint'
if a[0] <= b[0] and a[1] <= b[1] and a[2] >= b[2] and a[3] >= b[3]:
return 'contains'
if b[0] <= a[0] and b[1] <= a[1] and b[2] >= a[2] and b[3] >= a[3]:
return 'within'
if a[2] == b[0] or b[2] == a[0] or a[3] == b[1]:
return 'touches'
return 'overlaps'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control #0', [[3, 0, 9, 4], [9, 3, 13, 11]], 'touches'), ('control #1', [[6, 3, 7, 5], [3, 1, 9, 6]], 'within'), ('control #2', [[5, 9, 6, 10], [3, 9, 10, 13]], 'within'), ('control #3', [[8, 2, 9, 4], [1, 10, 4, 15]], 'disjoint'), ('control #4', [[1, 1, 7, 5], [4, 5, 9, 8]], 'touches'), ('control #5', [[9, 7, 16, 13], [1, 10, 7, 13]], 'disjoint'), ('control #6', [[3, 1, 4, 5], [8, 8, 12, 15]], 'disjoint'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches')], [('control #3', [[8, 2, 9, 4], [1, 10, 4, 15]], 'disjoint'), ('control #4', [[1, 1, 7, 5], [4, 5, 9, 8]], 'touches'), ('control #5', [[9, 7, 16, 13], [1, 10, 7, 13]], 'disjoint'), ('control #6', [[3, 1, 4, 5], [8, 8, 12, 15]], 'disjoint'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #8', [[2, 1, 4, 2], [3, 1, 6, 4]], 'overlaps'), ('control #9', [[7, 2, 15, 6], [8, 4, 14, 11]], 'overlaps'), ('boundary #28', [[0, 6, 5, 9], [0, 0, 5, 6]], 'touches')], [('control #6', [[3, 1, 4, 5], [8, 8, 12, 15]], 'disjoint'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #8', [[2, 1, 4, 2], [3, 1, 6, 4]], 'overlaps'), ('control #9', [[7, 2, 15, 6], [8, 4, 14, 11]], 'overlaps'), ('control #10', [[7, 1, 10, 3], [7, 0, 14, 3]], 'within'), ('control #11', [[2, 7, 10, 9], [10, 8, 12, 13]], 'touches'), ('control #12', [[8, 9, 9, 16], [4, 4, 11, 11]], 'overlaps'), ('boundary #18', [[0, 0, 5, 5], [0, 5, 5, 9]], 'touches')], [('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #10', [[7, 1, 10, 3], [7, 0, 14, 3]], 'within'), ('control #11', [[2, 7, 10, 9], [10, 8, 12, 13]], 'touches'), ('control #12', [[8, 9, 9, 16], [4, 4, 11, 11]], 'overlaps'), ('control #13', [[5, 3, 9, 9], [7, 8, 8, 15]], 'overlaps'), ('control #14', [[3, 2, 10, 3], [8, 5, 14, 7]], 'disjoint'), ('control #15', [[3, 5, 7, 12], [9, 2, 16, 3]], 'disjoint'), ('boundary #28', [[0, 6, 5, 9], [0, 0, 5, 6]], 'touches')], [('control #4', [[1, 1, 7, 5], [4, 5, 9, 8]], 'touches'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #14', [[3, 2, 10, 3], [8, 5, 14, 7]], 'disjoint'), ('control #15', [[3, 5, 7, 12], [9, 2, 16, 3]], 'disjoint'), ('boundary #16', [[0, 0, 5, 5], [5, 0, 9, 5]], 'touches'), ('boundary #17', [[0, 0, 5, 5], [5, 5, 9, 9]], 'touches'), ('boundary #18', [[0, 0, 5, 5], [0, 5, 5, 9]], 'touches'), ('boundary #19', [[0, 0, 10, 10], [0, 0, 5, 5]], 'contains')]]
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 |
|---|---|---|---|
| control #0 | touches | touches | Passed |
| control #1 | within | within | Passed |
| control #2 | within | within | Passed |
| control #3 | disjoint | disjoint | Passed |
| control #4 | touches | touches | Passed |
| control #5 | disjoint | disjoint | Passed |
| control #6 | disjoint | disjoint | Passed |
| control #7 | overlaps | touches | Failed |
SHA-256 / 406ffd5b41ebda1ac4997e7c18101e9c7164da35b2c2862f45fa22d8a8252e79
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
a, b = x
if a == b:
return 'equals'
if a[2] < b[0] or b[2] < a[0] or a[3] < b[1] or b[3] < a[1]:
return 'disjoint'
if a[0] <= b[0] and a[1] <= b[1] and a[2] >= b[2] and a[3] >= b[3]:
return 'contains'
if b[0] <= a[0] and b[1] <= a[1] and b[2] >= a[2] and b[3] >= a[3]:
return 'within'
if a[2] == b[0] or b[2] == a[0] or a[3] == b[1] or b[3] == a[1]:
return 'touches'
return 'overlaps'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control #0', [[3, 0, 9, 4], [9, 3, 13, 11]], 'touches'), ('control #1', [[6, 3, 7, 5], [3, 1, 9, 6]], 'within'), ('control #2', [[5, 9, 6, 10], [3, 9, 10, 13]], 'within'), ('control #3', [[8, 2, 9, 4], [1, 10, 4, 15]], 'disjoint'), ('control #4', [[1, 1, 7, 5], [4, 5, 9, 8]], 'touches'), ('control #5', [[9, 7, 16, 13], [1, 10, 7, 13]], 'disjoint'), ('control #6', [[3, 1, 4, 5], [8, 8, 12, 15]], 'disjoint'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches')], [('control #3', [[8, 2, 9, 4], [1, 10, 4, 15]], 'disjoint'), ('control #4', [[1, 1, 7, 5], [4, 5, 9, 8]], 'touches'), ('control #5', [[9, 7, 16, 13], [1, 10, 7, 13]], 'disjoint'), ('control #6', [[3, 1, 4, 5], [8, 8, 12, 15]], 'disjoint'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #8', [[2, 1, 4, 2], [3, 1, 6, 4]], 'overlaps'), ('control #9', [[7, 2, 15, 6], [8, 4, 14, 11]], 'overlaps'), ('boundary #28', [[0, 6, 5, 9], [0, 0, 5, 6]], 'touches')], [('control #6', [[3, 1, 4, 5], [8, 8, 12, 15]], 'disjoint'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #8', [[2, 1, 4, 2], [3, 1, 6, 4]], 'overlaps'), ('control #9', [[7, 2, 15, 6], [8, 4, 14, 11]], 'overlaps'), ('control #10', [[7, 1, 10, 3], [7, 0, 14, 3]], 'within'), ('control #11', [[2, 7, 10, 9], [10, 8, 12, 13]], 'touches'), ('control #12', [[8, 9, 9, 16], [4, 4, 11, 11]], 'overlaps'), ('boundary #18', [[0, 0, 5, 5], [0, 5, 5, 9]], 'touches')], [('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #10', [[7, 1, 10, 3], [7, 0, 14, 3]], 'within'), ('control #11', [[2, 7, 10, 9], [10, 8, 12, 13]], 'touches'), ('control #12', [[8, 9, 9, 16], [4, 4, 11, 11]], 'overlaps'), ('control #13', [[5, 3, 9, 9], [7, 8, 8, 15]], 'overlaps'), ('control #14', [[3, 2, 10, 3], [8, 5, 14, 7]], 'disjoint'), ('control #15', [[3, 5, 7, 12], [9, 2, 16, 3]], 'disjoint'), ('boundary #28', [[0, 6, 5, 9], [0, 0, 5, 6]], 'touches')], [('control #4', [[1, 1, 7, 5], [4, 5, 9, 8]], 'touches'), ('control #7', [[1, 7, 6, 11], [0, 6, 7, 7]], 'touches'), ('control #14', [[3, 2, 10, 3], [8, 5, 14, 7]], 'disjoint'), ('control #15', [[3, 5, 7, 12], [9, 2, 16, 3]], 'disjoint'), ('boundary #16', [[0, 0, 5, 5], [5, 0, 9, 5]], 'touches'), ('boundary #17', [[0, 0, 5, 5], [5, 5, 9, 9]], 'touches'), ('boundary #18', [[0, 0, 5, 5], [0, 5, 5, 9]], 'touches'), ('boundary #19', [[0, 0, 10, 10], [0, 0, 5, 5]], 'contains')]]
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 |
|---|---|---|---|
| control #0 | touches | touches | Passed |
| control #1 | within | within | Passed |
| control #2 | within | within | Passed |
| control #3 | disjoint | disjoint | Passed |
| control #4 | touches | touches | Passed |
| control #5 | disjoint | disjoint | Passed |
| control #6 | disjoint | disjoint | Passed |
| control #7 | touches | touches | Passed |
SHA-256 / b46227e34ea3a8926e6849d34947c976fba2b865f7b5bd7764f1fb86ee8e9ea4
Verification & scope
Stipulated deterministic toy contract on a bounded input domain; results are rounded as stated and no conformance with any published standard or library is claimed. 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:48:21.041261+00:00.
Case digest / bc50cd070a73f395953da40b690025649c1f2896ac8cdab839e76caf921ee82b