FAILURE MAP
← Case archive

FA-51596 / Raster clipping / Open access

Liang barsky parametric rect: integer parameter floor · case 01

Boundary parameters are floor-divided, collapsing fractional intersections to integer parameters.

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

ROOT CAUSE

Boundary parameters are floor-divided, collapsing fractional intersections to integer parameters.

VERIFIED REPAIR

Restore the specified clipping decision at integer parameter floor. 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: A thousandths fixed-point approximation is closer but no longer returns exact rational parameters.

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[['0', '0']][['2/9', '7/9']]Failed
explicit case 1[['0', '0']][['0', '2/5']]Failed
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[['0', '0']][['1/2', '3/4']]Failed
explicit case 7[['0', '1']][['0', '1']]Passed
explicit case 8[['0', '1']][['1/3', '1']]Failed
explicit case 9[['0', '0']][['0', '3/8']]Failed
explicit case 10[['0', '0']][['1/2', '2/3']]Failed
explicit case 11[['1', '1']][None]Failed
explicit case 12[None][None]Passed

SHA-256 / bce1cc482d1a5cda29ed5633aa29437ac8e1dadb9696a952d12079acf4ed3b54

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: ok=False
            else:
                u=Fraction(round(q/p*1000),1000)
                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[['111/500', '389/500']][['2/9', '7/9']]Failed
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[['333/1000', '1']][['1/3', '1']]Failed
explicit case 9[['0', '3/8']][['0', '3/8']]Passed
explicit case 10[['1/2', '667/1000']][['1/2', '2/3']]Failed
explicit case 11[None][None]Passed
explicit case 12[None][None]Passed

SHA-256 / e507d05592b3345a27cc92f150ed6e001aee15f718784e74a6d576ad05db45f1

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

Case digest / be6641a354fab35154c87ed864b8ce1393d7fad73e16fc5a8de4a82d634cfdfa