FAILURE MAP
← Case archive

FA-51581 / Raster clipping / Open access

Liang barsky parametric rect: parallel boundary exclusive · case 01

A segment parallel to and lying exactly on a clip boundary is rejected although boundary points are inside.

Verified by executionVariant 1 · 13 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

A segment parallel to and lying exactly on a clip boundary is rejected although boundary points are inside.

VERIFIED REPAIR

Restore the specified clipping decision at parallel boundary exclusive. Each command is [x0,y0,x1,y1,rect] with integer coordinates and an inclusive integer rectangle [left,top,right,bottom] that is first intersected with the pixel-center raster [0,size-1]x[0,size-1]. An empty rectangle returns None. Liang-Barsky tests left, right, top and bottom inequalities with exact rational parameters: parallel segments outside a boundary are rejected, points on a boundary are inside, entering parameters raise t0 and leaving parameters lower t1. The result is [t0,t1] as exact rational strings or None.

Unsuccessful approach: Accepting boundary lines that move still rejects a degenerate point that lies on the boundary.

Case contract

Each command is [x0,y0,x1,y1,rect] with integer coordinates and an inclusive integer rectangle [left,top,right,bottom] that is first intersected with the pixel-center raster [0,size-1]x[0,size-1]. An empty rectangle returns None. Liang-Barsky tests left, right, top and bottom inequalities with exact rational parameters: parallel segments outside a boundary are rejected, points on a boundary are inside, entering parameters raise t0 and leaving parameters lower t1. The result is [t0,t1] as exact rational strings or None.

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
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    out=[]
    for x0,y0,x1,y1,rect in commands:
        l,t,r,b=max(rect[0],0),max(rect[1],0),min(rect[2],size-1),min(rect[3],size-1)
        if l>r or t>b:
            out.append(None)
            continue
        dx,dy=x1-x0,y1-y0
        t0,t1=Fraction(0),Fraction(1)
        ok=True
        for p,q in ((-dx,x0-l),(dx,r-x0),(-dy,y0-t),(dy,b-y0)):
            if p==0:
                if q<=0: ok=False
            else:
                u=Fraction(q,p)
                if p<0:
                    if u>t1: ok=False
                    elif u>t0: t0=u
                else:
                    if u<t0: ok=False
                    elif u<t1: t1=u
        out.append([str(t0),str(t1)] if ok 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([[-2, 1, 7, 3, [0, 0, 6, 6]]], 6), [['2/9', '7/9']])
    check('explicit case 1', solve([[1, 1, 11, 1, [0, 0, 11, 11]]], 6), [['0', '2/5']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 6), [None])
    check('explicit case 3', solve([[0, 2, 5, 2, [0, 2, 5, 2]]], 6), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 5, 0, [0, 0, 5, 5]]], 6), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 5, 5]]], 6), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 5, 5]]], 6), [['1/2', '3/4']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 5, 5]]], 6), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 5, 5]]], 6), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 10, [0, 0, 5, 5]]], 6), [['0', '3/8']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 6]]], 6), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 5, 5]]], 6), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 5, 5]]], 6), [None])
if N == 2:
    check('explicit case 0', solve([[-2, 1, 8, 3, [0, 0, 7, 7]]], 7), [['1/5', '4/5']])
    check('explicit case 1', solve([[1, 1, 12, 1, [0, 0, 12, 12]]], 7), [['0', '5/11']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 7), [None])
    check('explicit case 3', solve([[0, 2, 6, 2, [0, 2, 6, 2]]], 7), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 6, 0, [0, 0, 6, 6]]], 7), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 6, 6]]], 7), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 6, 6]]], 7), [['1/2', '7/8']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 6, 6]]], 7), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 6, 6]]], 7), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 11, [0, 0, 6, 6]]], 7), [['0', '4/9']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 7]]], 7), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 6, 6]]], 7), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 6, 6]]], 7), [None])
if N == 3:
    check('explicit case 0', solve([[-2, 1, 9, 3, [0, 0, 8, 8]]], 8), [['2/11', '9/11']])
    check('explicit case 1', solve([[1, 1, 13, 1, [0, 0, 13, 13]]], 8), [['0', '1/2']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 8), [None])
    check('explicit case 3', solve([[0, 2, 7, 2, [0, 2, 7, 2]]], 8), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 7, 0, [0, 0, 7, 7]]], 8), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 7, 7]]], 8), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 7, 7]]], 8), [['1/2', '1']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 7, 7]]], 8), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 7, 7]]], 8), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 12, [0, 0, 7, 7]]], 8), [['0', '1/2']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 8]]], 8), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 7, 7]]], 8), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 7, 7]]], 8), [None])
if N == 4:
    check('explicit case 0', solve([[-2, 1, 10, 3, [0, 0, 9, 9]]], 9), [['1/6', '5/6']])
    check('explicit case 1', solve([[1, 1, 14, 1, [0, 0, 14, 14]]], 9), [['0', '7/13']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 9), [None])
    check('explicit case 3', solve([[0, 2, 8, 2, [0, 2, 8, 2]]], 9), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 8, 0, [0, 0, 8, 8]]], 9), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 8, 8]]], 9), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 8, 8]]], 9), [['1/2', '1']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 8, 8]]], 9), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 8, 8]]], 9), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 13, [0, 0, 8, 8]]], 9), [['0', '6/11']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 9]]], 9), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 8, 8]]], 9), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 8, 8]]], 9), [None])
if N == 5:
    check('explicit case 0', solve([[-2, 1, 11, 3, [0, 0, 10, 10]]], 10), [['2/13', '11/13']])
    check('explicit case 1', solve([[1, 1, 15, 1, [0, 0, 15, 15]]], 10), [['0', '4/7']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 10), [None])
    check('explicit case 3', solve([[0, 2, 9, 2, [0, 2, 9, 2]]], 10), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 9, 0, [0, 0, 9, 9]]], 10), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 9, 9]]], 10), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 9, 9]]], 10), [['1/2', '1']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 9, 9]]], 10), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 9, 9]]], 10), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 14, [0, 0, 9, 9]]], 10), [['0', '7/12']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 10]]], 10), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 9, 9]]], 10), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 9, 9]]], 10), [None])
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 fixtureActualExpectedOutcome
explicit case 0[['2/9', '7/9']][['2/9', '7/9']]Passed
explicit case 1[['0', '2/5']][['0', '2/5']]Passed
explicit case 2[None][None]Passed
explicit case 3[None][['0', '1']]Failed
explicit case 4[None][['0', '1']]Failed
explicit case 5[None][['0', '1']]Failed
explicit case 6[['1/2', '3/4']][['1/2', '3/4']]Passed
explicit case 7[['0', '1']][['0', '1']]Passed
explicit case 8[['1/3', '1']][['1/3', '1']]Passed
explicit case 9[['0', '3/8']][['0', '3/8']]Passed
explicit case 10[['1/2', '2/3']][['1/2', '2/3']]Passed
explicit case 11[None][None]Passed
explicit case 12[None][None]Passed

SHA-256 / a60830b17d27a66da3b1cb7fc56bc135f997c05b30e9d6a31aac9ce0fbbc7d51

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    out=[]
    for x0,y0,x1,y1,rect in commands:
        l,t,r,b=max(rect[0],0),max(rect[1],0),min(rect[2],size-1),min(rect[3],size-1)
        if l>r or t>b:
            out.append(None)
            continue
        dx,dy=x1-x0,y1-y0
        t0,t1=Fraction(0),Fraction(1)
        ok=True
        for p,q in ((-dx,x0-l),(dx,r-x0),(-dy,y0-t),(dy,b-y0)):
            if p==0:
                if q<0 or q==0 and dx==dy==0: ok=False
            else:
                u=Fraction(q,p)
                if p<0:
                    if u>t1: ok=False
                    elif u>t0: t0=u
                else:
                    if u<t0: ok=False
                    elif u<t1: t1=u
        out.append([str(t0),str(t1)] if ok 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([[-2, 1, 7, 3, [0, 0, 6, 6]]], 6), [['2/9', '7/9']])
    check('explicit case 1', solve([[1, 1, 11, 1, [0, 0, 11, 11]]], 6), [['0', '2/5']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 6), [None])
    check('explicit case 3', solve([[0, 2, 5, 2, [0, 2, 5, 2]]], 6), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 5, 0, [0, 0, 5, 5]]], 6), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 5, 5]]], 6), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 5, 5]]], 6), [['1/2', '3/4']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 5, 5]]], 6), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 5, 5]]], 6), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 10, [0, 0, 5, 5]]], 6), [['0', '3/8']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 6]]], 6), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 5, 5]]], 6), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 5, 5]]], 6), [None])
if N == 2:
    check('explicit case 0', solve([[-2, 1, 8, 3, [0, 0, 7, 7]]], 7), [['1/5', '4/5']])
    check('explicit case 1', solve([[1, 1, 12, 1, [0, 0, 12, 12]]], 7), [['0', '5/11']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 7), [None])
    check('explicit case 3', solve([[0, 2, 6, 2, [0, 2, 6, 2]]], 7), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 6, 0, [0, 0, 6, 6]]], 7), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 6, 6]]], 7), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 6, 6]]], 7), [['1/2', '7/8']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 6, 6]]], 7), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 6, 6]]], 7), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 11, [0, 0, 6, 6]]], 7), [['0', '4/9']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 7]]], 7), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 6, 6]]], 7), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 6, 6]]], 7), [None])
if N == 3:
    check('explicit case 0', solve([[-2, 1, 9, 3, [0, 0, 8, 8]]], 8), [['2/11', '9/11']])
    check('explicit case 1', solve([[1, 1, 13, 1, [0, 0, 13, 13]]], 8), [['0', '1/2']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 8), [None])
    check('explicit case 3', solve([[0, 2, 7, 2, [0, 2, 7, 2]]], 8), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 7, 0, [0, 0, 7, 7]]], 8), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 7, 7]]], 8), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 7, 7]]], 8), [['1/2', '1']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 7, 7]]], 8), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 7, 7]]], 8), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 12, [0, 0, 7, 7]]], 8), [['0', '1/2']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 8]]], 8), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 7, 7]]], 8), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 7, 7]]], 8), [None])
if N == 4:
    check('explicit case 0', solve([[-2, 1, 10, 3, [0, 0, 9, 9]]], 9), [['1/6', '5/6']])
    check('explicit case 1', solve([[1, 1, 14, 1, [0, 0, 14, 14]]], 9), [['0', '7/13']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 9), [None])
    check('explicit case 3', solve([[0, 2, 8, 2, [0, 2, 8, 2]]], 9), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 8, 0, [0, 0, 8, 8]]], 9), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 8, 8]]], 9), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 8, 8]]], 9), [['1/2', '1']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 8, 8]]], 9), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 8, 8]]], 9), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 13, [0, 0, 8, 8]]], 9), [['0', '6/11']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 9]]], 9), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 8, 8]]], 9), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 8, 8]]], 9), [None])
if N == 5:
    check('explicit case 0', solve([[-2, 1, 11, 3, [0, 0, 10, 10]]], 10), [['2/13', '11/13']])
    check('explicit case 1', solve([[1, 1, 15, 1, [0, 0, 15, 15]]], 10), [['0', '4/7']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 10), [None])
    check('explicit case 3', solve([[0, 2, 9, 2, [0, 2, 9, 2]]], 10), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 9, 0, [0, 0, 9, 9]]], 10), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 9, 9]]], 10), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 9, 9]]], 10), [['1/2', '1']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 9, 9]]], 10), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 9, 9]]], 10), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 14, [0, 0, 9, 9]]], 10), [['0', '7/12']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 10]]], 10), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 9, 9]]], 10), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 9, 9]]], 10), [None])
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 fixtureActualExpectedOutcome
explicit case 0[['2/9', '7/9']][['2/9', '7/9']]Passed
explicit case 1[['0', '2/5']][['0', '2/5']]Passed
explicit case 2[None][None]Passed
explicit case 3[['0', '1']][['0', '1']]Passed
explicit case 4[['0', '1']][['0', '1']]Passed
explicit case 5[None][['0', '1']]Failed
explicit case 6[['1/2', '3/4']][['1/2', '3/4']]Passed
explicit case 7[['0', '1']][['0', '1']]Passed
explicit case 8[['1/3', '1']][['1/3', '1']]Passed
explicit case 9[['0', '3/8']][['0', '3/8']]Passed
explicit case 10[['1/2', '2/3']][['1/2', '2/3']]Passed
explicit case 11[None][None]Passed
explicit case 12[None][None]Passed

SHA-256 / fb0e4612d024f9521616715049686b71541e605a7c796de5068c21759ea6dca7

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    out=[]
    for x0,y0,x1,y1,rect in commands:
        l,t,r,b=max(rect[0],0),max(rect[1],0),min(rect[2],size-1),min(rect[3],size-1)
        if l>r or t>b:
            out.append(None)
            continue
        dx,dy=x1-x0,y1-y0
        t0,t1=Fraction(0),Fraction(1)
        ok=True
        for p,q in ((-dx,x0-l),(dx,r-x0),(-dy,y0-t),(dy,b-y0)):
            if p==0:
                if q<0: ok=False
            else:
                u=Fraction(q,p)
                if p<0:
                    if u>t1: ok=False
                    elif u>t0: t0=u
                else:
                    if u<t0: ok=False
                    elif u<t1: t1=u
        out.append([str(t0),str(t1)] if ok 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([[-2, 1, 7, 3, [0, 0, 6, 6]]], 6), [['2/9', '7/9']])
    check('explicit case 1', solve([[1, 1, 11, 1, [0, 0, 11, 11]]], 6), [['0', '2/5']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 6), [None])
    check('explicit case 3', solve([[0, 2, 5, 2, [0, 2, 5, 2]]], 6), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 5, 0, [0, 0, 5, 5]]], 6), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 5, 5]]], 6), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 5, 5]]], 6), [['1/2', '3/4']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 5, 5]]], 6), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 5, 5]]], 6), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 10, [0, 0, 5, 5]]], 6), [['0', '3/8']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 6]]], 6), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 5, 5]]], 6), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 5, 5]]], 6), [None])
if N == 2:
    check('explicit case 0', solve([[-2, 1, 8, 3, [0, 0, 7, 7]]], 7), [['1/5', '4/5']])
    check('explicit case 1', solve([[1, 1, 12, 1, [0, 0, 12, 12]]], 7), [['0', '5/11']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 7), [None])
    check('explicit case 3', solve([[0, 2, 6, 2, [0, 2, 6, 2]]], 7), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 6, 0, [0, 0, 6, 6]]], 7), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 6, 6]]], 7), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 6, 6]]], 7), [['1/2', '7/8']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 6, 6]]], 7), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 6, 6]]], 7), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 11, [0, 0, 6, 6]]], 7), [['0', '4/9']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 7]]], 7), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 6, 6]]], 7), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 6, 6]]], 7), [None])
if N == 3:
    check('explicit case 0', solve([[-2, 1, 9, 3, [0, 0, 8, 8]]], 8), [['2/11', '9/11']])
    check('explicit case 1', solve([[1, 1, 13, 1, [0, 0, 13, 13]]], 8), [['0', '1/2']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 8), [None])
    check('explicit case 3', solve([[0, 2, 7, 2, [0, 2, 7, 2]]], 8), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 7, 0, [0, 0, 7, 7]]], 8), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 7, 7]]], 8), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 7, 7]]], 8), [['1/2', '1']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 7, 7]]], 8), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 7, 7]]], 8), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 12, [0, 0, 7, 7]]], 8), [['0', '1/2']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 8]]], 8), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 7, 7]]], 8), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 7, 7]]], 8), [None])
if N == 4:
    check('explicit case 0', solve([[-2, 1, 10, 3, [0, 0, 9, 9]]], 9), [['1/6', '5/6']])
    check('explicit case 1', solve([[1, 1, 14, 1, [0, 0, 14, 14]]], 9), [['0', '7/13']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 9), [None])
    check('explicit case 3', solve([[0, 2, 8, 2, [0, 2, 8, 2]]], 9), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 8, 0, [0, 0, 8, 8]]], 9), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 8, 8]]], 9), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 8, 8]]], 9), [['1/2', '1']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 8, 8]]], 9), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 8, 8]]], 9), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 13, [0, 0, 8, 8]]], 9), [['0', '6/11']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 9]]], 9), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 8, 8]]], 9), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 8, 8]]], 9), [None])
if N == 5:
    check('explicit case 0', solve([[-2, 1, 11, 3, [0, 0, 10, 10]]], 10), [['2/13', '11/13']])
    check('explicit case 1', solve([[1, 1, 15, 1, [0, 0, 15, 15]]], 10), [['0', '4/7']])
    check('explicit case 2', solve([[0, 0, 1, 1, [3, 3, 2, 5]]], 10), [None])
    check('explicit case 3', solve([[0, 2, 9, 2, [0, 2, 9, 2]]], 10), [['0', '1']])
    check('explicit case 4', solve([[0, 0, 9, 0, [0, 0, 9, 9]]], 10), [['0', '1']])
    check('explicit case 5', solve([[0, 2, 0, 2, [0, 0, 9, 9]]], 10), [['0', '1']])
    check('explicit case 6', solve([[-4, -1, 4, 7, [0, 0, 9, 9]]], 10), [['1/2', '1']])
    check('explicit case 7', solve([[1, 1, 3, 1, [0, 0, 9, 9]]], 10), [['0', '1']])
    check('explicit case 8', solve([[-1, 1, 2, 1, [0, 0, 9, 9]]], 10), [['1/3', '1']])
    check('explicit case 9', solve([[1, 2, 1, 14, [0, 0, 9, 9]]], 10), [['0', '7/12']])
    check('explicit case 10', solve([[2, -3, 5, 5, [1, 1, 4, 10]]], 10), [['1/2', '2/3']])
    check('explicit case 11', solve([[-3, -3, -1, 4, [0, 0, 9, 9]]], 10), [None])
    check('explicit case 12', solve([[-3, -2, 4, -3, [0, 0, 9, 9]]], 10), [None])
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 fixtureActualExpectedOutcome
explicit case 0[['2/9', '7/9']][['2/9', '7/9']]Passed
explicit case 1[['0', '2/5']][['0', '2/5']]Passed
explicit case 2[None][None]Passed
explicit case 3[['0', '1']][['0', '1']]Passed
explicit case 4[['0', '1']][['0', '1']]Passed
explicit case 5[['0', '1']][['0', '1']]Passed
explicit case 6[['1/2', '3/4']][['1/2', '3/4']]Passed
explicit case 7[['0', '1']][['0', '1']]Passed
explicit case 8[['1/3', '1']][['1/3', '1']]Passed
explicit case 9[['0', '3/8']][['0', '3/8']]Passed
explicit case 10[['1/2', '2/3']][['1/2', '2/3']]Passed
explicit case 11[None][None]Passed
explicit case 12[None][None]Passed

SHA-256 / 888d02f58fae858369ff6ed17ac87af836e8647f0a3a7bd31037c37b7ab537d2

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:20.263298+00:00.

Case digest / a81a91241f203ba3c7cd016ac6e40cf4d7a4585c46ff8f4f7a201eb865a1f5b1