FA-51671 / Raster clipping / Open access
Blit source destination clip: scissor left origin · case 01
Left trimming only happens for negative destination origins, ignoring a scissor whose left edge is inside the target.
ROOT CAUSE
Left trimming only happens for negative destination origins, ignoring a scissor whose left edge is inside the target.
VERIFIED REPAIR
Restore the specified clipping decision at scissor left origin. Each command is [sw,sh,sx,sy,w,h,dx,dy,clip]: a source image sw by sh, a requested source rectangle origin and size, a destination origin, and a half-open destination scissor [left,top,right,bottom) first intersected with the size by size target. Negative source origins trim width/height and shift the destination by the same amount; the source rectangle is limited to the image; destination pixels left/top of the scissor trim size and advance the source origin; right/bottom trims use half-open bounds. The result is [sx,sy,dx,dy,w,h] or None when either dimension is empty.
Unsuccessful approach: An off-by-one scissor comparison still leaves a copy starting one column left of the scissor.
Case contract
Each command is [sw,sh,sx,sy,w,h,dx,dy,clip]: a source image sw by sh, a requested source rectangle origin and size, a destination origin, and a half-open destination scissor [left,top,right,bottom) first intersected with the size by size target. Negative source origins trim width/height and shift the destination by the same amount; the source rectangle is limited to the image; destination pixels left/top of the scissor trim size and advance the source origin; right/bottom trims use half-open bounds. The result is [sx,sy,dx,dy,w,h] or None when either dimension is empty.
Why this case matters
Raster clipping decides which pixels a primitive may touch; a single wrong clip decision writes outside the target or scissor, or silently drops visible coverage.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(commands, size):
out=[]
for sw,sh,sx,sy,w,h,dx,dy,clip in commands:
cl,ct,cr,cb=max(clip[0],0),max(clip[1],0),min(clip[2],size),min(clip[3],size)
if sx<0:
w+=sx; dx-=sx; sx=0
if sy<0:
h+=sy; dy-=sy; sy=0
w=min(w,sw-sx)
h=min(h,sh-sy)
if dx<0:
w-=cl-dx; sx+=cl-dx; dx=cl
if dy<ct:
h-=ct-dy; sy+=ct-dy; dy=ct
w=min(w,cr-dx)
h=min(h,cb-dy)
out.append([sx,sy,dx,dy,w,h] if w>0 and h>0 else None)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 6, 6]]], 6), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 6, 6]]], 6), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 6, 6]]], 6), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[9, 2, 0, 0, 9, 2, 0, 0, [0, 0, 10, 6]]], 6), [[0, 0, 0, 0, 6, 2]])
check('explicit case 4', solve([[6, 2, 0, 0, 6, 2, 0, 0, [0, 0, 3, 6]]], 6), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 4, 0, [0, 0, 6, 6]]], 6), [[0, 0, 4, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 6]]], 6), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 6, 6]]], 6), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 6, 6]]], 6), [[2, 0, 3, 0, 3, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 6, 6]]], 6), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 6, 6]]], 6), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[6, 6, 1, 1, 6, 6, -1, -1, [0, 0, 6, 6]]], 6), [[2, 2, 0, 0, 4, 4]])
if N == 2:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 7, 7]]], 7), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 7, 7]]], 7), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 7, 7]]], 7), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[10, 2, 0, 0, 10, 2, 0, 0, [0, 0, 11, 7]]], 7), [[0, 0, 0, 0, 7, 2]])
check('explicit case 4', solve([[7, 2, 0, 0, 7, 2, 0, 0, [0, 0, 3, 7]]], 7), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 5, 0, [0, 0, 7, 7]]], 7), [[0, 0, 5, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 7]]], 7), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 7, 7]]], 7), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 7, 7]]], 7), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 7, 7]]], 7), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 7, 7]]], 7), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[7, 7, 1, 1, 7, 7, -1, -1, [0, 0, 7, 7]]], 7), [[2, 2, 0, 0, 5, 5]])
if N == 3:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 8, 8]]], 8), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 8, 8]]], 8), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 8, 8]]], 8), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[11, 2, 0, 0, 11, 2, 0, 0, [0, 0, 12, 8]]], 8), [[0, 0, 0, 0, 8, 2]])
check('explicit case 4', solve([[8, 2, 0, 0, 8, 2, 0, 0, [0, 0, 3, 8]]], 8), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 6, 0, [0, 0, 8, 8]]], 8), [[0, 0, 6, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 8]]], 8), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 8, 8]]], 8), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 8, 8]]], 8), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 8, 8]]], 8), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 8, 8]]], 8), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[8, 8, 1, 1, 8, 8, -1, -1, [0, 0, 8, 8]]], 8), [[2, 2, 0, 0, 6, 6]])
if N == 4:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 9, 9]]], 9), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 9, 9]]], 9), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 9, 9]]], 9), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[12, 2, 0, 0, 12, 2, 0, 0, [0, 0, 13, 9]]], 9), [[0, 0, 0, 0, 9, 2]])
check('explicit case 4', solve([[9, 2, 0, 0, 9, 2, 0, 0, [0, 0, 3, 9]]], 9), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 7, 0, [0, 0, 9, 9]]], 9), [[0, 0, 7, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 9]]], 9), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 9, 9]]], 9), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 9, 9]]], 9), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 9, 9]]], 9), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 9, 9]]], 9), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[9, 9, 1, 1, 9, 9, -1, -1, [0, 0, 9, 9]]], 9), [[2, 2, 0, 0, 7, 7]])
if N == 5:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 10, 10]]], 10), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 10, 10]]], 10), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 10, 10]]], 10), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[13, 2, 0, 0, 13, 2, 0, 0, [0, 0, 14, 10]]], 10), [[0, 0, 0, 0, 10, 2]])
check('explicit case 4', solve([[10, 2, 0, 0, 10, 2, 0, 0, [0, 0, 3, 10]]], 10), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 8, 0, [0, 0, 10, 10]]], 10), [[0, 0, 8, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 10]]], 10), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 10, 10]]], 10), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 10, 10]]], 10), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 10, 10]]], 10), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 10, 10]]], 10), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[10, 10, 1, 1, 10, 10, -1, -1, [0, 0, 10, 10]]], 10), [[2, 2, 0, 0, 8, 8]])
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 |
|---|---|---|---|
| explicit case 0 | [[0, 0, 1, 1, 4, 4]] | [[0, 0, 1, 1, 4, 4]] | Passed |
| explicit case 1 | [[0, 0, 2, 0, 2, 2]] | [[0, 0, 2, 0, 2, 2]] | Passed |
| explicit case 2 | [[2, 0, 0, 0, 3, 3]] | [[2, 0, 0, 0, 3, 3]] | Passed |
| explicit case 3 | [[0, 0, 0, 0, 6, 2]] | [[0, 0, 0, 0, 6, 2]] | Passed |
| explicit case 4 | [[0, 0, 0, 0, 3, 2]] | [[0, 0, 0, 0, 3, 2]] | Passed |
| explicit case 5 | [[0, 0, 4, 0, 2, 4]] | [[0, 0, 4, 0, 2, 4]] | Passed |
| explicit case 6 | [None] | [None] | Passed |
| explicit case 7 | [None] | [None] | Passed |
| explicit case 8 | [[0, 0, 1, 0, 5, 6]] | [[2, 0, 3, 0, 3, 6]] | Failed |
| explicit case 9 | [[0, 0, 0, 0, 6, 2]] | [[0, 0, 0, 0, 6, 2]] | Passed |
| explicit case 10 | [[0, 0, 0, 0, 2, 6]] | [[0, 0, 0, 0, 2, 6]] | Passed |
| explicit case 11 | [[2, 2, 0, 0, 4, 4]] | [[2, 2, 0, 0, 4, 4]] | Passed |
SHA-256 / 0486da19640850aae2f19f89b58b10761e7a2e07f4a717bd605362a596a3aec5
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(commands, size):
out=[]
for sw,sh,sx,sy,w,h,dx,dy,clip in commands:
cl,ct,cr,cb=max(clip[0],0),max(clip[1],0),min(clip[2],size),min(clip[3],size)
if sx<0:
w+=sx; dx-=sx; sx=0
if sy<0:
h+=sy; dy-=sy; sy=0
w=min(w,sw-sx)
h=min(h,sh-sy)
if dx<cl-1:
w-=cl-dx; sx+=cl-dx; dx=cl
if dy<ct:
h-=ct-dy; sy+=ct-dy; dy=ct
w=min(w,cr-dx)
h=min(h,cb-dy)
out.append([sx,sy,dx,dy,w,h] if w>0 and h>0 else None)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 6, 6]]], 6), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 6, 6]]], 6), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 6, 6]]], 6), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[9, 2, 0, 0, 9, 2, 0, 0, [0, 0, 10, 6]]], 6), [[0, 0, 0, 0, 6, 2]])
check('explicit case 4', solve([[6, 2, 0, 0, 6, 2, 0, 0, [0, 0, 3, 6]]], 6), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 4, 0, [0, 0, 6, 6]]], 6), [[0, 0, 4, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 6]]], 6), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 6, 6]]], 6), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 6, 6]]], 6), [[2, 0, 3, 0, 3, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 6, 6]]], 6), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 6, 6]]], 6), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[6, 6, 1, 1, 6, 6, -1, -1, [0, 0, 6, 6]]], 6), [[2, 2, 0, 0, 4, 4]])
if N == 2:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 7, 7]]], 7), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 7, 7]]], 7), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 7, 7]]], 7), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[10, 2, 0, 0, 10, 2, 0, 0, [0, 0, 11, 7]]], 7), [[0, 0, 0, 0, 7, 2]])
check('explicit case 4', solve([[7, 2, 0, 0, 7, 2, 0, 0, [0, 0, 3, 7]]], 7), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 5, 0, [0, 0, 7, 7]]], 7), [[0, 0, 5, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 7]]], 7), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 7, 7]]], 7), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 7, 7]]], 7), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 7, 7]]], 7), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 7, 7]]], 7), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[7, 7, 1, 1, 7, 7, -1, -1, [0, 0, 7, 7]]], 7), [[2, 2, 0, 0, 5, 5]])
if N == 3:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 8, 8]]], 8), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 8, 8]]], 8), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 8, 8]]], 8), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[11, 2, 0, 0, 11, 2, 0, 0, [0, 0, 12, 8]]], 8), [[0, 0, 0, 0, 8, 2]])
check('explicit case 4', solve([[8, 2, 0, 0, 8, 2, 0, 0, [0, 0, 3, 8]]], 8), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 6, 0, [0, 0, 8, 8]]], 8), [[0, 0, 6, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 8]]], 8), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 8, 8]]], 8), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 8, 8]]], 8), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 8, 8]]], 8), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 8, 8]]], 8), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[8, 8, 1, 1, 8, 8, -1, -1, [0, 0, 8, 8]]], 8), [[2, 2, 0, 0, 6, 6]])
if N == 4:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 9, 9]]], 9), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 9, 9]]], 9), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 9, 9]]], 9), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[12, 2, 0, 0, 12, 2, 0, 0, [0, 0, 13, 9]]], 9), [[0, 0, 0, 0, 9, 2]])
check('explicit case 4', solve([[9, 2, 0, 0, 9, 2, 0, 0, [0, 0, 3, 9]]], 9), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 7, 0, [0, 0, 9, 9]]], 9), [[0, 0, 7, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 9]]], 9), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 9, 9]]], 9), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 9, 9]]], 9), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 9, 9]]], 9), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 9, 9]]], 9), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[9, 9, 1, 1, 9, 9, -1, -1, [0, 0, 9, 9]]], 9), [[2, 2, 0, 0, 7, 7]])
if N == 5:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 10, 10]]], 10), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 10, 10]]], 10), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 10, 10]]], 10), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[13, 2, 0, 0, 13, 2, 0, 0, [0, 0, 14, 10]]], 10), [[0, 0, 0, 0, 10, 2]])
check('explicit case 4', solve([[10, 2, 0, 0, 10, 2, 0, 0, [0, 0, 3, 10]]], 10), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 8, 0, [0, 0, 10, 10]]], 10), [[0, 0, 8, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 10]]], 10), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 10, 10]]], 10), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 10, 10]]], 10), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 10, 10]]], 10), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 10, 10]]], 10), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[10, 10, 1, 1, 10, 10, -1, -1, [0, 0, 10, 10]]], 10), [[2, 2, 0, 0, 8, 8]])
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 |
|---|---|---|---|
| explicit case 0 | [[0, 0, 1, 1, 4, 4]] | [[0, 0, 1, 1, 4, 4]] | Passed |
| explicit case 1 | [[0, 0, 2, 0, 2, 2]] | [[0, 0, 2, 0, 2, 2]] | Passed |
| explicit case 2 | [[2, 0, 0, 0, 3, 3]] | [[2, 0, 0, 0, 3, 3]] | Passed |
| explicit case 3 | [[0, 0, 0, 0, 6, 2]] | [[0, 0, 0, 0, 6, 2]] | Passed |
| explicit case 4 | [[0, 0, 0, 0, 3, 2]] | [[0, 0, 0, 0, 3, 2]] | Passed |
| explicit case 5 | [[0, 0, 4, 0, 2, 4]] | [[0, 0, 4, 0, 2, 4]] | Passed |
| explicit case 6 | [None] | [None] | Passed |
| explicit case 7 | [None] | [None] | Passed |
| explicit case 8 | [[2, 0, 3, 0, 3, 6]] | [[2, 0, 3, 0, 3, 6]] | Passed |
| explicit case 9 | [[0, 0, 0, 0, 6, 2]] | [[0, 0, 0, 0, 6, 2]] | Passed |
| explicit case 10 | [[0, 0, 0, 0, 2, 6]] | [[0, 0, 0, 0, 2, 6]] | Passed |
| explicit case 11 | [[1, 2, -1, 0, 5, 4]] | [[2, 2, 0, 0, 4, 4]] | Failed |
SHA-256 / 1032f022972a9516330d01e24ad0a61a3b62d6d174edf52acf2f8e1f2355ee43
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(commands, size):
out=[]
for sw,sh,sx,sy,w,h,dx,dy,clip in commands:
cl,ct,cr,cb=max(clip[0],0),max(clip[1],0),min(clip[2],size),min(clip[3],size)
if sx<0:
w+=sx; dx-=sx; sx=0
if sy<0:
h+=sy; dy-=sy; sy=0
w=min(w,sw-sx)
h=min(h,sh-sy)
if dx<cl:
w-=cl-dx; sx+=cl-dx; dx=cl
if dy<ct:
h-=ct-dy; sy+=ct-dy; dy=ct
w=min(w,cr-dx)
h=min(h,cb-dy)
out.append([sx,sy,dx,dy,w,h] if w>0 and h>0 else None)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 6, 6]]], 6), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 6, 6]]], 6), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 6, 6]]], 6), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[9, 2, 0, 0, 9, 2, 0, 0, [0, 0, 10, 6]]], 6), [[0, 0, 0, 0, 6, 2]])
check('explicit case 4', solve([[6, 2, 0, 0, 6, 2, 0, 0, [0, 0, 3, 6]]], 6), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 4, 0, [0, 0, 6, 6]]], 6), [[0, 0, 4, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 6]]], 6), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 6, 6]]], 6), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 6, 6]]], 6), [[2, 0, 3, 0, 3, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 6, 6]]], 6), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 6, 6]]], 6), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[6, 6, 1, 1, 6, 6, -1, -1, [0, 0, 6, 6]]], 6), [[2, 2, 0, 0, 4, 4]])
if N == 2:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 7, 7]]], 7), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 7, 7]]], 7), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 7, 7]]], 7), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[10, 2, 0, 0, 10, 2, 0, 0, [0, 0, 11, 7]]], 7), [[0, 0, 0, 0, 7, 2]])
check('explicit case 4', solve([[7, 2, 0, 0, 7, 2, 0, 0, [0, 0, 3, 7]]], 7), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 5, 0, [0, 0, 7, 7]]], 7), [[0, 0, 5, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 7]]], 7), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 7, 7]]], 7), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 7, 7]]], 7), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 7, 7]]], 7), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 7, 7]]], 7), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[7, 7, 1, 1, 7, 7, -1, -1, [0, 0, 7, 7]]], 7), [[2, 2, 0, 0, 5, 5]])
if N == 3:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 8, 8]]], 8), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 8, 8]]], 8), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 8, 8]]], 8), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[11, 2, 0, 0, 11, 2, 0, 0, [0, 0, 12, 8]]], 8), [[0, 0, 0, 0, 8, 2]])
check('explicit case 4', solve([[8, 2, 0, 0, 8, 2, 0, 0, [0, 0, 3, 8]]], 8), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 6, 0, [0, 0, 8, 8]]], 8), [[0, 0, 6, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 8]]], 8), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 8, 8]]], 8), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 8, 8]]], 8), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 8, 8]]], 8), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 8, 8]]], 8), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[8, 8, 1, 1, 8, 8, -1, -1, [0, 0, 8, 8]]], 8), [[2, 2, 0, 0, 6, 6]])
if N == 4:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 9, 9]]], 9), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 9, 9]]], 9), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 9, 9]]], 9), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[12, 2, 0, 0, 12, 2, 0, 0, [0, 0, 13, 9]]], 9), [[0, 0, 0, 0, 9, 2]])
check('explicit case 4', solve([[9, 2, 0, 0, 9, 2, 0, 0, [0, 0, 3, 9]]], 9), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 7, 0, [0, 0, 9, 9]]], 9), [[0, 0, 7, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 9]]], 9), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 9, 9]]], 9), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 9, 9]]], 9), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 9, 9]]], 9), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 9, 9]]], 9), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[9, 9, 1, 1, 9, 9, -1, -1, [0, 0, 9, 9]]], 9), [[2, 2, 0, 0, 7, 7]])
if N == 5:
check('explicit case 0', solve([[4, 4, 0, 0, 4, 4, 1, 1, [0, 0, 10, 10]]], 10), [[0, 0, 1, 1, 4, 4]])
check('explicit case 1', solve([[4, 4, -2, 0, 4, 2, 0, 0, [0, 0, 10, 10]]], 10), [[0, 0, 2, 0, 2, 2]])
check('explicit case 2', solve([[5, 3, 2, 0, 5, 3, 0, 0, [0, 0, 10, 10]]], 10), [[2, 0, 0, 0, 3, 3]])
check('explicit case 3', solve([[13, 2, 0, 0, 13, 2, 0, 0, [0, 0, 14, 10]]], 10), [[0, 0, 0, 0, 10, 2]])
check('explicit case 4', solve([[10, 2, 0, 0, 10, 2, 0, 0, [0, 0, 3, 10]]], 10), [[0, 0, 0, 0, 3, 2]])
check('explicit case 5', solve([[4, 4, 0, 0, 4, 4, 8, 0, [0, 0, 10, 10]]], 10), [[0, 0, 8, 0, 2, 4]])
check('explicit case 6', solve([[4, 4, 0, 0, 4, 4, 0, 0, [0, 0, 0, 10]]], 10), [None])
check('explicit case 7', solve([[4, 4, 0, 0, 4, 0, 0, 0, [0, 0, 10, 10]]], 10), [None])
check('explicit case 8', solve([[6, 6, 0, 0, 6, 6, 1, 0, [3, 0, 10, 10]]], 10), [[2, 0, 3, 0, 4, 6]])
check('explicit case 9', solve([[6, 2, 0, 0, 6, 6, 0, 0, [0, 0, 10, 10]]], 10), [[0, 0, 0, 0, 6, 2]])
check('explicit case 10', solve([[2, 6, 0, 0, 6, 6, 0, 0, [0, 0, 10, 10]]], 10), [[0, 0, 0, 0, 2, 6]])
check('explicit case 11', solve([[10, 10, 1, 1, 10, 10, -1, -1, [0, 0, 10, 10]]], 10), [[2, 2, 0, 0, 8, 8]])
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 |
|---|---|---|---|
| explicit case 0 | [[0, 0, 1, 1, 4, 4]] | [[0, 0, 1, 1, 4, 4]] | Passed |
| explicit case 1 | [[0, 0, 2, 0, 2, 2]] | [[0, 0, 2, 0, 2, 2]] | Passed |
| explicit case 2 | [[2, 0, 0, 0, 3, 3]] | [[2, 0, 0, 0, 3, 3]] | Passed |
| explicit case 3 | [[0, 0, 0, 0, 6, 2]] | [[0, 0, 0, 0, 6, 2]] | Passed |
| explicit case 4 | [[0, 0, 0, 0, 3, 2]] | [[0, 0, 0, 0, 3, 2]] | Passed |
| explicit case 5 | [[0, 0, 4, 0, 2, 4]] | [[0, 0, 4, 0, 2, 4]] | Passed |
| explicit case 6 | [None] | [None] | Passed |
| explicit case 7 | [None] | [None] | Passed |
| explicit case 8 | [[2, 0, 3, 0, 3, 6]] | [[2, 0, 3, 0, 3, 6]] | Passed |
| explicit case 9 | [[0, 0, 0, 0, 6, 2]] | [[0, 0, 0, 0, 6, 2]] | Passed |
| explicit case 10 | [[0, 0, 0, 0, 2, 6]] | [[0, 0, 0, 0, 2, 6]] | Passed |
| explicit case 11 | [[2, 2, 0, 0, 4, 4]] | [[2, 2, 0, 0, 4, 4]] | Passed |
SHA-256 / b3d4aa04d3bb498f415dc4837ccbfd804d6e5de09034cbca24858bfa447dac6d
Verification & scope
Exact integer/rational arithmetic on small stipulated fixtures models the clipping decision only; no memory layout, GPU pipeline, graphics API or standards conformance 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:45:21.200577+00:00.
Case digest / 70aef9b346bcd03fb205c1931c9071fc287b8e8f109ca1c601d202c624506762