{"abstract":"After moving endpoint 0 onto a window edge its outcode is assumed to be zero, so a point pushed into a different outside region is treated as inside.","category":"Raster clipping","checks":16,"contract":"Each command is a segment [x0,y0,x1,y1] whose endpoints are integers or exact decimal/rational strings in pixel-center coordinates. The window is the closed square [0,size-1]x[0,size-1] of pixel centers. Outcodes use strict outside tests (left 1, right 2, below 4, above 8). Both codes zero accepts; a shared bit rejects; otherwise the outside endpoint (endpoint 0 first) is moved to the highest set edge in above, below, right, left order and its code is recomputed from the new point; a clip against an edge parallel to the segment is treated as a rejection. At most five iterations are allowed; an unresolved or rejected segment returns None. Accepted endpoints round half-up to integer pixels.","evaluation_group":"s3-raster-clipping-cohen-sutherland-pixel-window","failed_approach":"Recomputing the code but masking out every bit of the previous code hides a corner endpoint that is still outside the other edge.","family":"s3-raster-clipping-cohen-sutherland-pixel-window-stale-outcode-after-clip","id":"FA-51551","implementations":{"attempt":{"sha256":"7e372cef5e56a8af8fb767e73977308a78f5eb2c0c837f51da99dbd7916b3784","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(commands, size):\n    lo=0\n    hi=size-1\n    def code(x,y):\n        c=0\n        if x<lo: c|=1\n        elif x>hi: c|=2\n        if y<lo: c|=4\n        elif y>hi: c|=8\n        return c\n    out=[]\n    for x0,y0,x1,y1 in commands:\n        x0,y0,x1,y1=[Fraction(v) for v in (x0,y0,x1,y1)]\n        c0,c1=code(x0,y0),code(x1,y1)\n        result=None\n        for _ in range(5):\n            if not (c0|c1):\n                result=[int((v+Fraction(1,2))//1) for v in (x0,y0,x1,y1)]\n                break\n            if c0&c1: break\n            c=c0 if c0 else c1\n            if c&12 and y1==y0 or c&3 and x1==x0: break\n            if c&8: x,y=x0+(x1-x0)*(hi-y0)/(y1-y0),Fraction(hi)\n            elif c&4: x,y=x0+(x1-x0)*(lo-y0)/(y1-y0),Fraction(lo)\n            elif c&2: x,y=Fraction(hi),y0+(y1-y0)*(hi-x0)/(x1-x0)\n            else: x,y=Fraction(lo),y0+(y1-y0)*(lo-x0)/(x1-x0)\n            if c==c0:\n                x0,y0=x,y\n                c0=code(x0,y0)&~c\n            else:\n                x1,y1=x,y\n                c1=code(x1,y1)\n        out.append(result)\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('explicit case 0', solve([[1, 1, 4, 3]], 6), [[1, 1, 4, 3]])\n    check('explicit case 1', solve([[-3, 2, 8, 2]], 6), [[0, 2, 5, 2]])\n    check('explicit case 2', solve([[-2, -2, 7, 7]], 6), [[0, 0, 5, 5]])\n    check('explicit case 3', solve([[-3, 0, -1, 5]], 6), [None])\n    check('explicit case 4', solve([[0, 0, 5, 5]], 6), [[0, 0, 5, 5]])\n    check('explicit case 5', solve([[0, 0, '5.8', 0]], 6), [[0, 0, 5, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 6), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 6), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 10]], 6), [[0, 4, 1, 5]])\n    check('explicit case 9', solve([[0, '2.5', 5, '2.5']], 6), [[0, 3, 5, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 6), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 9, 0]], 6), [[0, 0, 5, 0]])\n    check('explicit case 12', solve([['-5', '-7/2', '10', '17/2']], 6), [[0, 1, 5, 5]])\n    check('explicit case 13', solve([[2, 1, 4, 11]], 6), [[2, 1, 3, 5]])\n    check('explicit case 14', solve([[3, 8, 1, -2]], 6), [[2, 5, 1, 0]])\n    check('explicit case 15', solve([[8, 1, 1, 9]], 6), [[5, 4, 5, 5]])\nif N == 2:\n    check('explicit case 0', solve([[1, 1, 5, 4]], 7), [[1, 1, 5, 4]])\n    check('explicit case 1', solve([[-3, 2, 9, 2]], 7), [[0, 2, 6, 2]])\n    check('explicit case 2', solve([[-2, -2, 8, 8]], 7), [[0, 0, 6, 6]])\n    check('explicit case 3', solve([[-3, 0, -1, 6]], 7), [None])\n    check('explicit case 4', solve([[0, 0, 6, 6]], 7), [[0, 0, 6, 6]])\n    check('explicit case 5', solve([[0, 0, '6.8', 0]], 7), [[0, 0, 6, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 7), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 7), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 11]], 7), [[0, 4, 1, 6]])\n    check('explicit case 9', solve([[0, '2.5', 6, '2.5']], 7), [[0, 3, 6, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 7), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 10, 0]], 7), [[0, 0, 6, 0]])\n    check('explicit case 12', solve([['-6', '-9/2', '12', '21/2']], 7), [[0, 1, 6, 6]])\n    check('explicit case 13', solve([[2, 1, 4, 12]], 7), [[2, 1, 3, 6]])\n    check('explicit case 14', solve([[3, 9, 1, -2]], 7), [[2, 6, 1, 0]])\n    check('explicit case 15', solve([[9, 1, 1, 10]], 7), [[6, 4, 5, 6]])\nif N == 3:\n    check('explicit case 0', solve([[1, 1, 6, 5]], 8), [[1, 1, 6, 5]])\n    check('explicit case 1', solve([[-3, 2, 10, 2]], 8), [[0, 2, 7, 2]])\n    check('explicit case 2', solve([[-2, -2, 9, 9]], 8), [[0, 0, 7, 7]])\n    check('explicit case 3', solve([[-3, 0, -1, 7]], 8), [None])\n    check('explicit case 4', solve([[0, 0, 7, 7]], 8), [[0, 0, 7, 7]])\n    check('explicit case 5', solve([[0, 0, '7.8', 0]], 8), [[0, 0, 7, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 8), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 8), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 12]], 8), [[0, 5, 1, 7]])\n    check('explicit case 9', solve([[0, '2.5', 7, '2.5']], 8), [[0, 3, 7, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 8), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 11, 0]], 8), [[0, 0, 7, 0]])\n    check('explicit case 12', solve([['-7', '-11/2', '14', '25/2']], 8), [[0, 1, 7, 7]])\n    check('explicit case 13', solve([[2, 1, 4, 13]], 8), [[2, 1, 3, 7]])\n    check('explicit case 14', solve([[3, 10, 1, -2]], 8), [[3, 7, 1, 0]])\n    check('explicit case 15', solve([[10, 1, 1, 11]], 8), [[7, 4, 5, 7]])\nif N == 4:\n    check('explicit case 0', solve([[1, 1, 7, 6]], 9), [[1, 1, 7, 6]])\n    check('explicit case 1', solve([[-3, 2, 11, 2]], 9), [[0, 2, 8, 2]])\n    check('explicit case 2', solve([[-2, -2, 10, 10]], 9), [[0, 0, 8, 8]])\n    check('explicit case 3', solve([[-3, 0, -1, 8]], 9), [None])\n    check('explicit case 4', solve([[0, 0, 8, 8]], 9), [[0, 0, 8, 8]])\n    check('explicit case 5', solve([[0, 0, '8.8', 0]], 9), [[0, 0, 8, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 9), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 9), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 13]], 9), [[0, 5, 2, 8]])\n    check('explicit case 9', solve([[0, '2.5', 8, '2.5']], 9), [[0, 3, 8, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 9), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 12, 0]], 9), [[0, 0, 8, 0]])\n    check('explicit case 12', solve([['-8', '-13/2', '16', '29/2']], 9), [[0, 1, 8, 8]])\n    check('explicit case 13', solve([[2, 1, 4, 14]], 9), [[2, 1, 3, 8]])\n    check('explicit case 14', solve([[3, 11, 1, -2]], 9), [[3, 8, 1, 0]])\n    check('explicit case 15', solve([[11, 1, 1, 12]], 9), [[8, 4, 5, 8]])\nif N == 5:\n    check('explicit case 0', solve([[1, 1, 8, 7]], 10), [[1, 1, 8, 7]])\n    check('explicit case 1', solve([[-3, 2, 12, 2]], 10), [[0, 2, 9, 2]])\n    check('explicit case 2', solve([[-2, -2, 11, 11]], 10), [[0, 0, 9, 9]])\n    check('explicit case 3', solve([[-3, 0, -1, 9]], 10), [None])\n    check('explicit case 4', solve([[0, 0, 9, 9]], 10), [[0, 0, 9, 9]])\n    check('explicit case 5', solve([[0, 0, '9.8', 0]], 10), [[0, 0, 9, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 10), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 10), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 14]], 10), [[0, 5, 2, 9]])\n    check('explicit case 9', solve([[0, '2.5', 9, '2.5']], 10), [[0, 3, 9, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 10), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 13, 0]], 10), [[0, 0, 9, 0]])\n    check('explicit case 12', solve([['-9', '-15/2', '18', '33/2']], 10), [[0, 1, 9, 9]])\n    check('explicit case 13', solve([[2, 1, 4, 15]], 10), [[2, 1, 3, 9]])\n    check('explicit case 14', solve([[3, 12, 1, -2]], 10), [[3, 9, 1, 0]])\n    check('explicit case 15', solve([[12, 1, 1, 13]], 10), [[9, 4, 5, 9]])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"81776db43629922a20aa42a40e28a0c49972b6181cad71cce20d53e3182c7613","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(commands, size):\n    lo=0\n    hi=size-1\n    def code(x,y):\n        c=0\n        if x<lo: c|=1\n        elif x>hi: c|=2\n        if y<lo: c|=4\n        elif y>hi: c|=8\n        return c\n    out=[]\n    for x0,y0,x1,y1 in commands:\n        x0,y0,x1,y1=[Fraction(v) for v in (x0,y0,x1,y1)]\n        c0,c1=code(x0,y0),code(x1,y1)\n        result=None\n        for _ in range(5):\n            if not (c0|c1):\n                result=[int((v+Fraction(1,2))//1) for v in (x0,y0,x1,y1)]\n                break\n            if c0&c1: break\n            c=c0 if c0 else c1\n            if c&12 and y1==y0 or c&3 and x1==x0: break\n            if c&8: x,y=x0+(x1-x0)*(hi-y0)/(y1-y0),Fraction(hi)\n            elif c&4: x,y=x0+(x1-x0)*(lo-y0)/(y1-y0),Fraction(lo)\n            elif c&2: x,y=Fraction(hi),y0+(y1-y0)*(hi-x0)/(x1-x0)\n            else: x,y=Fraction(lo),y0+(y1-y0)*(lo-x0)/(x1-x0)\n            if c==c0:\n                x0,y0=x,y\n                c0=0\n            else:\n                x1,y1=x,y\n                c1=code(x1,y1)\n        out.append(result)\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('explicit case 0', solve([[1, 1, 4, 3]], 6), [[1, 1, 4, 3]])\n    check('explicit case 1', solve([[-3, 2, 8, 2]], 6), [[0, 2, 5, 2]])\n    check('explicit case 2', solve([[-2, -2, 7, 7]], 6), [[0, 0, 5, 5]])\n    check('explicit case 3', solve([[-3, 0, -1, 5]], 6), [None])\n    check('explicit case 4', solve([[0, 0, 5, 5]], 6), [[0, 0, 5, 5]])\n    check('explicit case 5', solve([[0, 0, '5.8', 0]], 6), [[0, 0, 5, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 6), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 6), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 10]], 6), [[0, 4, 1, 5]])\n    check('explicit case 9', solve([[0, '2.5', 5, '2.5']], 6), [[0, 3, 5, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 6), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 9, 0]], 6), [[0, 0, 5, 0]])\n    check('explicit case 12', solve([['-5', '-7/2', '10', '17/2']], 6), [[0, 1, 5, 5]])\n    check('explicit case 13', solve([[2, 1, 4, 11]], 6), [[2, 1, 3, 5]])\n    check('explicit case 14', solve([[3, 8, 1, -2]], 6), [[2, 5, 1, 0]])\n    check('explicit case 15', solve([[8, 1, 1, 9]], 6), [[5, 4, 5, 5]])\nif N == 2:\n    check('explicit case 0', solve([[1, 1, 5, 4]], 7), [[1, 1, 5, 4]])\n    check('explicit case 1', solve([[-3, 2, 9, 2]], 7), [[0, 2, 6, 2]])\n    check('explicit case 2', solve([[-2, -2, 8, 8]], 7), [[0, 0, 6, 6]])\n    check('explicit case 3', solve([[-3, 0, -1, 6]], 7), [None])\n    check('explicit case 4', solve([[0, 0, 6, 6]], 7), [[0, 0, 6, 6]])\n    check('explicit case 5', solve([[0, 0, '6.8', 0]], 7), [[0, 0, 6, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 7), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 7), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 11]], 7), [[0, 4, 1, 6]])\n    check('explicit case 9', solve([[0, '2.5', 6, '2.5']], 7), [[0, 3, 6, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 7), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 10, 0]], 7), [[0, 0, 6, 0]])\n    check('explicit case 12', solve([['-6', '-9/2', '12', '21/2']], 7), [[0, 1, 6, 6]])\n    check('explicit case 13', solve([[2, 1, 4, 12]], 7), [[2, 1, 3, 6]])\n    check('explicit case 14', solve([[3, 9, 1, -2]], 7), [[2, 6, 1, 0]])\n    check('explicit case 15', solve([[9, 1, 1, 10]], 7), [[6, 4, 5, 6]])\nif N == 3:\n    check('explicit case 0', solve([[1, 1, 6, 5]], 8), [[1, 1, 6, 5]])\n    check('explicit case 1', solve([[-3, 2, 10, 2]], 8), [[0, 2, 7, 2]])\n    check('explicit case 2', solve([[-2, -2, 9, 9]], 8), [[0, 0, 7, 7]])\n    check('explicit case 3', solve([[-3, 0, -1, 7]], 8), [None])\n    check('explicit case 4', solve([[0, 0, 7, 7]], 8), [[0, 0, 7, 7]])\n    check('explicit case 5', solve([[0, 0, '7.8', 0]], 8), [[0, 0, 7, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 8), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 8), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 12]], 8), [[0, 5, 1, 7]])\n    check('explicit case 9', solve([[0, '2.5', 7, '2.5']], 8), [[0, 3, 7, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 8), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 11, 0]], 8), [[0, 0, 7, 0]])\n    check('explicit case 12', solve([['-7', '-11/2', '14', '25/2']], 8), [[0, 1, 7, 7]])\n    check('explicit case 13', solve([[2, 1, 4, 13]], 8), [[2, 1, 3, 7]])\n    check('explicit case 14', solve([[3, 10, 1, -2]], 8), [[3, 7, 1, 0]])\n    check('explicit case 15', solve([[10, 1, 1, 11]], 8), [[7, 4, 5, 7]])\nif N == 4:\n    check('explicit case 0', solve([[1, 1, 7, 6]], 9), [[1, 1, 7, 6]])\n    check('explicit case 1', solve([[-3, 2, 11, 2]], 9), [[0, 2, 8, 2]])\n    check('explicit case 2', solve([[-2, -2, 10, 10]], 9), [[0, 0, 8, 8]])\n    check('explicit case 3', solve([[-3, 0, -1, 8]], 9), [None])\n    check('explicit case 4', solve([[0, 0, 8, 8]], 9), [[0, 0, 8, 8]])\n    check('explicit case 5', solve([[0, 0, '8.8', 0]], 9), [[0, 0, 8, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 9), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 9), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 13]], 9), [[0, 5, 2, 8]])\n    check('explicit case 9', solve([[0, '2.5', 8, '2.5']], 9), [[0, 3, 8, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 9), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 12, 0]], 9), [[0, 0, 8, 0]])\n    check('explicit case 12', solve([['-8', '-13/2', '16', '29/2']], 9), [[0, 1, 8, 8]])\n    check('explicit case 13', solve([[2, 1, 4, 14]], 9), [[2, 1, 3, 8]])\n    check('explicit case 14', solve([[3, 11, 1, -2]], 9), [[3, 8, 1, 0]])\n    check('explicit case 15', solve([[11, 1, 1, 12]], 9), [[8, 4, 5, 8]])\nif N == 5:\n    check('explicit case 0', solve([[1, 1, 8, 7]], 10), [[1, 1, 8, 7]])\n    check('explicit case 1', solve([[-3, 2, 12, 2]], 10), [[0, 2, 9, 2]])\n    check('explicit case 2', solve([[-2, -2, 11, 11]], 10), [[0, 0, 9, 9]])\n    check('explicit case 3', solve([[-3, 0, -1, 9]], 10), [None])\n    check('explicit case 4', solve([[0, 0, 9, 9]], 10), [[0, 0, 9, 9]])\n    check('explicit case 5', solve([[0, 0, '9.8', 0]], 10), [[0, 0, 9, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 10), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 10), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 14]], 10), [[0, 5, 2, 9]])\n    check('explicit case 9', solve([[0, '2.5', 9, '2.5']], 10), [[0, 3, 9, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 10), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 13, 0]], 10), [[0, 0, 9, 0]])\n    check('explicit case 12', solve([['-9', '-15/2', '18', '33/2']], 10), [[0, 1, 9, 9]])\n    check('explicit case 13', solve([[2, 1, 4, 15]], 10), [[2, 1, 3, 9]])\n    check('explicit case 14', solve([[3, 12, 1, -2]], 10), [[3, 9, 1, 0]])\n    check('explicit case 15', solve([[12, 1, 1, 13]], 10), [[9, 4, 5, 9]])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"8885092b602f3d5a6f5769f10ad2a90f91243932b6afd68cbfb3a0c3db9666bb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(commands, size):\n    lo=0\n    hi=size-1\n    def code(x,y):\n        c=0\n        if x<lo: c|=1\n        elif x>hi: c|=2\n        if y<lo: c|=4\n        elif y>hi: c|=8\n        return c\n    out=[]\n    for x0,y0,x1,y1 in commands:\n        x0,y0,x1,y1=[Fraction(v) for v in (x0,y0,x1,y1)]\n        c0,c1=code(x0,y0),code(x1,y1)\n        result=None\n        for _ in range(5):\n            if not (c0|c1):\n                result=[int((v+Fraction(1,2))//1) for v in (x0,y0,x1,y1)]\n                break\n            if c0&c1: break\n            c=c0 if c0 else c1\n            if c&12 and y1==y0 or c&3 and x1==x0: break\n            if c&8: x,y=x0+(x1-x0)*(hi-y0)/(y1-y0),Fraction(hi)\n            elif c&4: x,y=x0+(x1-x0)*(lo-y0)/(y1-y0),Fraction(lo)\n            elif c&2: x,y=Fraction(hi),y0+(y1-y0)*(hi-x0)/(x1-x0)\n            else: x,y=Fraction(lo),y0+(y1-y0)*(lo-x0)/(x1-x0)\n            if c==c0:\n                x0,y0=x,y\n                c0=code(x0,y0)\n            else:\n                x1,y1=x,y\n                c1=code(x1,y1)\n        out.append(result)\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('explicit case 0', solve([[1, 1, 4, 3]], 6), [[1, 1, 4, 3]])\n    check('explicit case 1', solve([[-3, 2, 8, 2]], 6), [[0, 2, 5, 2]])\n    check('explicit case 2', solve([[-2, -2, 7, 7]], 6), [[0, 0, 5, 5]])\n    check('explicit case 3', solve([[-3, 0, -1, 5]], 6), [None])\n    check('explicit case 4', solve([[0, 0, 5, 5]], 6), [[0, 0, 5, 5]])\n    check('explicit case 5', solve([[0, 0, '5.8', 0]], 6), [[0, 0, 5, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 6), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 6), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 10]], 6), [[0, 4, 1, 5]])\n    check('explicit case 9', solve([[0, '2.5', 5, '2.5']], 6), [[0, 3, 5, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 6), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 9, 0]], 6), [[0, 0, 5, 0]])\n    check('explicit case 12', solve([['-5', '-7/2', '10', '17/2']], 6), [[0, 1, 5, 5]])\n    check('explicit case 13', solve([[2, 1, 4, 11]], 6), [[2, 1, 3, 5]])\n    check('explicit case 14', solve([[3, 8, 1, -2]], 6), [[2, 5, 1, 0]])\n    check('explicit case 15', solve([[8, 1, 1, 9]], 6), [[5, 4, 5, 5]])\nif N == 2:\n    check('explicit case 0', solve([[1, 1, 5, 4]], 7), [[1, 1, 5, 4]])\n    check('explicit case 1', solve([[-3, 2, 9, 2]], 7), [[0, 2, 6, 2]])\n    check('explicit case 2', solve([[-2, -2, 8, 8]], 7), [[0, 0, 6, 6]])\n    check('explicit case 3', solve([[-3, 0, -1, 6]], 7), [None])\n    check('explicit case 4', solve([[0, 0, 6, 6]], 7), [[0, 0, 6, 6]])\n    check('explicit case 5', solve([[0, 0, '6.8', 0]], 7), [[0, 0, 6, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 7), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 7), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 11]], 7), [[0, 4, 1, 6]])\n    check('explicit case 9', solve([[0, '2.5', 6, '2.5']], 7), [[0, 3, 6, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 7), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 10, 0]], 7), [[0, 0, 6, 0]])\n    check('explicit case 12', solve([['-6', '-9/2', '12', '21/2']], 7), [[0, 1, 6, 6]])\n    check('explicit case 13', solve([[2, 1, 4, 12]], 7), [[2, 1, 3, 6]])\n    check('explicit case 14', solve([[3, 9, 1, -2]], 7), [[2, 6, 1, 0]])\n    check('explicit case 15', solve([[9, 1, 1, 10]], 7), [[6, 4, 5, 6]])\nif N == 3:\n    check('explicit case 0', solve([[1, 1, 6, 5]], 8), [[1, 1, 6, 5]])\n    check('explicit case 1', solve([[-3, 2, 10, 2]], 8), [[0, 2, 7, 2]])\n    check('explicit case 2', solve([[-2, -2, 9, 9]], 8), [[0, 0, 7, 7]])\n    check('explicit case 3', solve([[-3, 0, -1, 7]], 8), [None])\n    check('explicit case 4', solve([[0, 0, 7, 7]], 8), [[0, 0, 7, 7]])\n    check('explicit case 5', solve([[0, 0, '7.8', 0]], 8), [[0, 0, 7, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 8), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 8), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 12]], 8), [[0, 5, 1, 7]])\n    check('explicit case 9', solve([[0, '2.5', 7, '2.5']], 8), [[0, 3, 7, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 8), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 11, 0]], 8), [[0, 0, 7, 0]])\n    check('explicit case 12', solve([['-7', '-11/2', '14', '25/2']], 8), [[0, 1, 7, 7]])\n    check('explicit case 13', solve([[2, 1, 4, 13]], 8), [[2, 1, 3, 7]])\n    check('explicit case 14', solve([[3, 10, 1, -2]], 8), [[3, 7, 1, 0]])\n    check('explicit case 15', solve([[10, 1, 1, 11]], 8), [[7, 4, 5, 7]])\nif N == 4:\n    check('explicit case 0', solve([[1, 1, 7, 6]], 9), [[1, 1, 7, 6]])\n    check('explicit case 1', solve([[-3, 2, 11, 2]], 9), [[0, 2, 8, 2]])\n    check('explicit case 2', solve([[-2, -2, 10, 10]], 9), [[0, 0, 8, 8]])\n    check('explicit case 3', solve([[-3, 0, -1, 8]], 9), [None])\n    check('explicit case 4', solve([[0, 0, 8, 8]], 9), [[0, 0, 8, 8]])\n    check('explicit case 5', solve([[0, 0, '8.8', 0]], 9), [[0, 0, 8, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 9), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 9), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 13]], 9), [[0, 5, 2, 8]])\n    check('explicit case 9', solve([[0, '2.5', 8, '2.5']], 9), [[0, 3, 8, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 9), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 12, 0]], 9), [[0, 0, 8, 0]])\n    check('explicit case 12', solve([['-8', '-13/2', '16', '29/2']], 9), [[0, 1, 8, 8]])\n    check('explicit case 13', solve([[2, 1, 4, 14]], 9), [[2, 1, 3, 8]])\n    check('explicit case 14', solve([[3, 11, 1, -2]], 9), [[3, 8, 1, 0]])\n    check('explicit case 15', solve([[11, 1, 1, 12]], 9), [[8, 4, 5, 8]])\nif N == 5:\n    check('explicit case 0', solve([[1, 1, 8, 7]], 10), [[1, 1, 8, 7]])\n    check('explicit case 1', solve([[-3, 2, 12, 2]], 10), [[0, 2, 9, 2]])\n    check('explicit case 2', solve([[-2, -2, 11, 11]], 10), [[0, 0, 9, 9]])\n    check('explicit case 3', solve([[-3, 0, -1, 9]], 10), [None])\n    check('explicit case 4', solve([[0, 0, 9, 9]], 10), [[0, 0, 9, 9]])\n    check('explicit case 5', solve([[0, 0, '9.8', 0]], 10), [[0, 0, 9, 0]])\n    check('explicit case 6', solve([[1, -4, -2, 2]], 10), [None])\n    check('explicit case 7', solve([[-2, 1, 3, -4]], 10), [None])\n    check('explicit case 8', solve([[-2, 1, 4, 14]], 10), [[0, 5, 2, 9]])\n    check('explicit case 9', solve([[0, '2.5', 9, '2.5']], 10), [[0, 3, 9, 3]])\n    check('explicit case 10', solve([[0, '1.5', 2, '1.5']], 10), [[0, 2, 2, 2]])\n    check('explicit case 11', solve([[0, 0, 13, 0]], 10), [[0, 0, 9, 0]])\n    check('explicit case 12', solve([['-9', '-15/2', '18', '33/2']], 10), [[0, 1, 9, 9]])\n    check('explicit case 13', solve([[2, 1, 4, 15]], 10), [[2, 1, 3, 9]])\n    check('explicit case 14', solve([[3, 12, 1, -2]], 10), [[3, 9, 1, 0]])\n    check('explicit case 15', solve([[12, 1, 1, 13]], 10), [[9, 4, 5, 9]])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"s3-raster-clipping-cohen-sutherland-pixel-window-stale-outcode-after-clip","generated_at":"2026-09-29T14:45:20.056972+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"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.","repair":"Restore the specified clipping decision at stale outcode after clip. Each command is a segment [x0,y0,x1,y1] whose endpoints are integers or exact decimal/rational strings in pixel-center coordinates. The window is the closed square [0,size-1]x[0,size-1] of pixel centers. Outcodes use strict outside tests (left 1, right 2, below 4, above 8). Both codes zero accepts; a shared bit rejects; otherwise the outside endpoint (endpoint 0 first) is moved to the highest set edge in above, below, right, left order and its code is recomputed from the new point; a clip against an edge parallel to the segment is treated as a rejection. At most five iterations are allowed; an unresolved or rejected segment returns None. Accepted endpoints round half-up to integer pixels.","root_cause":"After moving endpoint 0 onto a window edge its outcode is assumed to be zero, so a point pushed into a different outside region is treated as inside.","sha256":"ccda99103d8aa7b1471ec1fafb2bbd4b6b6d989044e3d446ff2a0eafa13d1124","title":"Cohen sutherland pixel window: stale outcode after clip · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.239,"exit_code":1,"observations":[{"actual":[[1,1,4,3]],"check":"explicit case 0","expected":[[1,1,4,3]],"passed":true},{"actual":[[0,2,5,2]],"check":"explicit case 1","expected":[[0,2,5,2]],"passed":true},{"actual":[[0,0,5,5]],"check":"explicit case 2","expected":[[0,0,5,5]],"passed":true},{"actual":[null],"check":"explicit case 3","expected":[null],"passed":true},{"actual":[[0,0,5,5]],"check":"explicit case 4","expected":[[0,0,5,5]],"passed":true},{"actual":[[0,0,5,0]],"check":"explicit case 5","expected":[[0,0,5,0]],"passed":true},{"actual":[null],"check":"explicit case 6","expected":[null],"passed":true},{"actual":[null],"check":"explicit case 7","expected":[null],"passed":true},{"actual":[[0,4,1,5]],"check":"explicit case 8","expected":[[0,4,1,5]],"passed":true},{"actual":[[0,3,5,3]],"check":"explicit case 9","expected":[[0,3,5,3]],"passed":true},{"actual":[[0,2,2,2]],"check":"explicit case 10","expected":[[0,2,2,2]],"passed":true},{"actual":[[0,0,5,0]],"check":"explicit case 11","expected":[[0,0,5,0]],"passed":true},{"actual":[[-1,0,5,5]],"check":"explicit case 12","expected":[[0,1,5,5]],"passed":false},{"actual":[[2,1,3,5]],"check":"explicit case 13","expected":[[2,1,3,5]],"passed":true},{"actual":[[2,5,1,0]],"check":"explicit case 14","expected":[[2,5,1,0]],"passed":true},{"actual":[[5,4,5,5]],"check":"explicit case 15","expected":[[5,4,5,5]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"explicit case 0\", \"actual\": [[1, 1, 4, 3]], \"expected\": [[1, 1, 4, 3]], \"passed\": true}, {\"check\": \"explicit case 1\", \"actual\": [[0, 2, 5, 2]], \"expected\": [[0, 2, 5, 2]], \"passed\": true}, {\"check\": \"explicit case 2\", \"actual\": [[0, 0, 5, 5]], \"expected\": [[0, 0, 5, 5]], \"passed\": true}, {\"check\": \"explicit case 3\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"explicit case 4\", \"actual\": [[0, 0, 5, 5]], \"expected\": [[0, 0, 5, 5]], \"passed\": true}, {\"check\": \"explicit case 5\", \"actual\": [[0, 0, 5, 0]], \"expected\": [[0, 0, 5, 0]], \"passed\": true}, {\"check\": \"explicit case 6\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"explicit case 7\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"explicit case 8\", \"actual\": [[0, 4, 1, 5]], \"expected\": [[0, 4, 1, 5]], \"passed\": true}, {\"check\": \"explicit case 9\", \"actual\": [[0, 3, 5, 3]], \"expected\": [[0, 3, 5, 3]], \"passed\": true}, {\"check\": \"explicit case 10\", \"actual\": [[0, 2, 2, 2]], \"expected\": [[0, 2, 2, 2]], \"passed\": true}, {\"check\": \"explicit case 11\", \"actual\": [[0, 0, 5, 0]], \"expected\": [[0, 0, 5, 0]], \"passed\": true}, {\"check\": \"explicit case 12\", \"actual\": [[-1, 0, 5, 5]], \"expected\": [[0, 1, 5, 5]], \"passed\": false}, {\"check\": \"explicit case 13\", \"actual\": [[2, 1, 3, 5]], \"expected\": [[2, 1, 3, 5]], \"passed\": true}, {\"check\": \"explicit case 14\", \"actual\": [[2, 5, 1, 0]], \"expected\": [[2, 5, 1, 0]], \"passed\": true}, {\"check\": \"explicit case 15\", \"actual\": [[5, 4, 5, 5]], \"expected\": [[5, 4, 5, 5]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.224,"exit_code":1,"observations":[{"actual":[[1,1,4,3]],"check":"explicit case 0","expected":[[1,1,4,3]],"passed":true},{"actual":[[0,2,5,2]],"check":"explicit case 1","expected":[[0,2,5,2]],"passed":true},{"actual":[[0,0,5,5]],"check":"explicit case 2","expected":[[0,0,5,5]],"passed":true},{"actual":[null],"check":"explicit case 3","expected":[null],"passed":true},{"actual":[[0,0,5,5]],"check":"explicit case 4","expected":[[0,0,5,5]],"passed":true},{"actual":[[0,0,5,0]],"check":"explicit case 5","expected":[[0,0,5,0]],"passed":true},{"actual":[null],"check":"explicit case 6","expected":[null],"passed":true},{"actual":[null],"check":"explicit case 7","expected":[null],"passed":true},{"actual":[[0,4,1,5]],"check":"explicit case 8","expected":[[0,4,1,5]],"passed":true},{"actual":[[0,3,5,3]],"check":"explicit case 9","expected":[[0,3,5,3]],"passed":true},{"actual":[[0,2,2,2]],"check":"explicit case 10","expected":[[0,2,2,2]],"passed":true},{"actual":[[0,0,5,0]],"check":"explicit case 11","expected":[[0,0,5,0]],"passed":true},{"actual":[[-1,0,5,5]],"check":"explicit case 12","expected":[[0,1,5,5]],"passed":false},{"actual":[[2,1,3,5]],"check":"explicit case 13","expected":[[2,1,3,5]],"passed":true},{"actual":[[2,5,1,0]],"check":"explicit case 14","expected":[[2,5,1,0]],"passed":true},{"actual":[[5,4,5,5]],"check":"explicit case 15","expected":[[5,4,5,5]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"explicit case 0\", \"actual\": [[1, 1, 4, 3]], \"expected\": [[1, 1, 4, 3]], \"passed\": true}, {\"check\": \"explicit case 1\", \"actual\": [[0, 2, 5, 2]], \"expected\": [[0, 2, 5, 2]], \"passed\": true}, {\"check\": \"explicit case 2\", \"actual\": [[0, 0, 5, 5]], \"expected\": [[0, 0, 5, 5]], \"passed\": true}, {\"check\": \"explicit case 3\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"explicit case 4\", \"actual\": [[0, 0, 5, 5]], \"expected\": [[0, 0, 5, 5]], \"passed\": true}, {\"check\": \"explicit case 5\", \"actual\": [[0, 0, 5, 0]], \"expected\": [[0, 0, 5, 0]], \"passed\": true}, {\"check\": \"explicit case 6\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"explicit case 7\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"explicit case 8\", \"actual\": [[0, 4, 1, 5]], \"expected\": [[0, 4, 1, 5]], \"passed\": true}, {\"check\": \"explicit case 9\", \"actual\": [[0, 3, 5, 3]], \"expected\": [[0, 3, 5, 3]], \"passed\": true}, {\"check\": \"explicit case 10\", \"actual\": [[0, 2, 2, 2]], \"expected\": [[0, 2, 2, 2]], \"passed\": true}, {\"check\": \"explicit case 11\", \"actual\": [[0, 0, 5, 0]], \"expected\": [[0, 0, 5, 0]], \"passed\": true}, {\"check\": \"explicit case 12\", \"actual\": [[-1, 0, 5, 5]], \"expected\": [[0, 1, 5, 5]], \"passed\": false}, {\"check\": \"explicit case 13\", \"actual\": [[2, 1, 3, 5]], \"expected\": [[2, 1, 3, 5]], \"passed\": true}, {\"check\": \"explicit case 14\", \"actual\": [[2, 5, 1, 0]], \"expected\": [[2, 5, 1, 0]], \"passed\": true}, {\"check\": \"explicit case 15\", \"actual\": [[5, 4, 5, 5]], \"expected\": [[5, 4, 5, 5]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.948,"exit_code":0,"observations":[{"actual":[[1,1,4,3]],"check":"explicit case 0","expected":[[1,1,4,3]],"passed":true},{"actual":[[0,2,5,2]],"check":"explicit case 1","expected":[[0,2,5,2]],"passed":true},{"actual":[[0,0,5,5]],"check":"explicit case 2","expected":[[0,0,5,5]],"passed":true},{"actual":[null],"check":"explicit case 3","expected":[null],"passed":true},{"actual":[[0,0,5,5]],"check":"explicit case 4","expected":[[0,0,5,5]],"passed":true},{"actual":[[0,0,5,0]],"check":"explicit case 5","expected":[[0,0,5,0]],"passed":true},{"actual":[null],"check":"explicit case 6","expected":[null],"passed":true},{"actual":[null],"check":"explicit case 7","expected":[null],"passed":true},{"actual":[[0,4,1,5]],"check":"explicit case 8","expected":[[0,4,1,5]],"passed":true},{"actual":[[0,3,5,3]],"check":"explicit case 9","expected":[[0,3,5,3]],"passed":true},{"actual":[[0,2,2,2]],"check":"explicit case 10","expected":[[0,2,2,2]],"passed":true},{"actual":[[0,0,5,0]],"check":"explicit case 11","expected":[[0,0,5,0]],"passed":true},{"actual":[[0,1,5,5]],"check":"explicit case 12","expected":[[0,1,5,5]],"passed":true},{"actual":[[2,1,3,5]],"check":"explicit case 13","expected":[[2,1,3,5]],"passed":true},{"actual":[[2,5,1,0]],"check":"explicit case 14","expected":[[2,5,1,0]],"passed":true},{"actual":[[5,4,5,5]],"check":"explicit case 15","expected":[[5,4,5,5]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"explicit case 0\", \"actual\": [[1, 1, 4, 3]], \"expected\": [[1, 1, 4, 3]], \"passed\": true}, {\"check\": \"explicit case 1\", \"actual\": [[0, 2, 5, 2]], \"expected\": [[0, 2, 5, 2]], \"passed\": true}, {\"check\": \"explicit case 2\", \"actual\": [[0, 0, 5, 5]], \"expected\": [[0, 0, 5, 5]], \"passed\": true}, {\"check\": \"explicit case 3\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"explicit case 4\", \"actual\": [[0, 0, 5, 5]], \"expected\": [[0, 0, 5, 5]], \"passed\": true}, {\"check\": \"explicit case 5\", \"actual\": [[0, 0, 5, 0]], \"expected\": [[0, 0, 5, 0]], \"passed\": true}, {\"check\": \"explicit case 6\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"explicit case 7\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"explicit case 8\", \"actual\": [[0, 4, 1, 5]], \"expected\": [[0, 4, 1, 5]], \"passed\": true}, {\"check\": \"explicit case 9\", \"actual\": [[0, 3, 5, 3]], \"expected\": [[0, 3, 5, 3]], \"passed\": true}, {\"check\": \"explicit case 10\", \"actual\": [[0, 2, 2, 2]], \"expected\": [[0, 2, 2, 2]], \"passed\": true}, {\"check\": \"explicit case 11\", \"actual\": [[0, 0, 5, 0]], \"expected\": [[0, 0, 5, 0]], \"passed\": true}, {\"check\": \"explicit case 12\", \"actual\": [[0, 1, 5, 5]], \"expected\": [[0, 1, 5, 5]], \"passed\": true}, {\"check\": \"explicit case 13\", \"actual\": [[2, 1, 3, 5]], \"expected\": [[2, 1, 3, 5]], \"passed\": true}, {\"check\": \"explicit case 14\", \"actual\": [[2, 5, 1, 0]], \"expected\": [[2, 5, 1, 0]], \"passed\": true}, {\"check\": \"explicit case 15\", \"actual\": [[5, 4, 5, 5]], \"expected\": [[5, 4, 5, 5]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}