{"abstract":"Columns drift across rows of rotated rasters.","category":"Map projection transforms","checks":8,"contract":"Input [gx, gy, gt, width, height] with a six-term affine gt: X = gt0 + col*gt1 + row*gt2, Y = gt3 + col*gt4 + row*gt5, where (gt0, gt3) is the outer corner of pixel (0, 0). Invert with the 2x2 determinant, take floor of the fractional column and row, and return [col, row] if inside [0, width) x [0, height), otherwise None (also None for a singular transform).","contract_signature":"x","evaluation_group":"w2-map-projection-transforms-geotransform-inverse-pixel","failed_approach":"The right coefficient is used with the wrong sign.","family":"w2-map-projection-transforms-geotransform-inverse-pixel-column-numerator","id":"FA-70261","implementations":{"attempt":{"sha256":"5f1944b7d4d0e67eff004304bf2ed2030e72f0f2a499d145d798013c991ea830","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    gx, gy, gt, width, height = x\n    det = gt[1] * gt[5] - gt[2] * gt[4]\n    if det == 0:\n        return None\n    dx = gx - gt[0]\n    dy = gy - gt[3]\n    col = (gt[5] * dx + gt[2] * dy) / det\n    row = (-gt[4] * dx + gt[1] * dy) / det\n    c, r = math.floor(col), math.floor(row)\n    if c < 0 or r < 0 or c >= width or r >= height:\n        return None\n    return [c, r]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [501757.3953, 4199818.2948, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [58, 6]), ('control #1', [-171.8788, 83.4562, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [32, 26]), ('control #2', [1046.5787, 4959.4742, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [17, 23]), ('control #3', [515.0875, 607.7306, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [32, 35]), ('control #4', [76.2652, 18.2363, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [76, 18]), ('control #5', [500628.6941, 4200027.3496, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], None), ('control #6', [-155.5787, 74.1746, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [97, 63]), ('control #7', [1081.9041, 4971.5191, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [35, 21])], [('control #3', [515.0875, 607.7306, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [32, 35]), ('control #4', [76.2652, 18.2363, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [76, 18]), ('control #5', [500628.6941, 4200027.3496, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], None), ('control #6', [-155.5787, 74.1746, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [97, 63]), ('control #7', [1081.9041, 4971.5191, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [35, 21]), ('control #8', [1154.1901, 783.547, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [94, 30]), ('control #9', [38.71, 51.2013, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [38, 51]), ('control #10', [500787.7801, 4199579.3798, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [26, 14])], [('control #6', [-155.5787, 74.1746, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [97, 63]), ('control #7', [1081.9041, 4971.5191, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [35, 21]), ('control #8', [1154.1901, 783.547, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [94, 30]), ('control #9', [38.71, 51.2013, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [38, 51]), ('control #10', [500787.7801, 4199579.3798, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [26, 14]), ('control #11', [-179.8182, 72.2686, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [0, 70]), ('control #12', [1181.1787, 4910.1448, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [75, 60]), ('control #13', [651.582, 912.3698, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [37, 6])], [('control #8', [1154.1901, 783.547, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [94, 30]), ('control #10', [500787.7801, 4199579.3798, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [26, 14]), ('control #11', [-179.8182, 72.2686, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [0, 70]), ('control #12', [1181.1787, 4910.1448, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [75, 60]), ('control #13', [651.582, 912.3698, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [37, 6]), ('control #14', [43.3467, 82.4576, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], None), ('control #15', [500583.8568, 4199766.5953, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [19, 7]), ('control #16', [-155.0962, 71.5551, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [99, 73])], [('control #12', [1181.1787, 4910.1448, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [75, 60]), ('control #13', [651.582, 912.3698, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [37, 6]), ('control #14', [43.3467, 82.4576, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], None), ('control #15', [500583.8568, 4199766.5953, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [19, 7]), ('control #16', [-155.0962, 71.5551, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [99, 73]), ('control #17', [1052.7736, 4892.5715, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [12, 56]), ('control #18', [1072.1342, 274.3213, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], None), ('control #19', [85.7339, 56.5251, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [85, 56])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\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":"c230d1e383731f5b7682af0cc41d22ee3925297afc7a51aef587189b2376d004","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    gx, gy, gt, width, height = x\n    det = gt[1] * gt[5] - gt[2] * gt[4]\n    if det == 0:\n        return None\n    dx = gx - gt[0]\n    dy = gy - gt[3]\n    col = (gt[5] * dx - gt[4] * dy) / det\n    row = (-gt[4] * dx + gt[1] * dy) / det\n    c, r = math.floor(col), math.floor(row)\n    if c < 0 or r < 0 or c >= width or r >= height:\n        return None\n    return [c, r]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [501757.3953, 4199818.2948, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [58, 6]), ('control #1', [-171.8788, 83.4562, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [32, 26]), ('control #2', [1046.5787, 4959.4742, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [17, 23]), ('control #3', [515.0875, 607.7306, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [32, 35]), ('control #4', [76.2652, 18.2363, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [76, 18]), ('control #5', [500628.6941, 4200027.3496, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], None), ('control #6', [-155.5787, 74.1746, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [97, 63]), ('control #7', [1081.9041, 4971.5191, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [35, 21])], [('control #3', [515.0875, 607.7306, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [32, 35]), ('control #4', [76.2652, 18.2363, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [76, 18]), ('control #5', [500628.6941, 4200027.3496, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], None), ('control #6', [-155.5787, 74.1746, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [97, 63]), ('control #7', [1081.9041, 4971.5191, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [35, 21]), ('control #8', [1154.1901, 783.547, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [94, 30]), ('control #9', [38.71, 51.2013, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [38, 51]), ('control #10', [500787.7801, 4199579.3798, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [26, 14])], [('control #6', [-155.5787, 74.1746, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [97, 63]), ('control #7', [1081.9041, 4971.5191, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [35, 21]), ('control #8', [1154.1901, 783.547, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [94, 30]), ('control #9', [38.71, 51.2013, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [38, 51]), ('control #10', [500787.7801, 4199579.3798, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [26, 14]), ('control #11', [-179.8182, 72.2686, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [0, 70]), ('control #12', [1181.1787, 4910.1448, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [75, 60]), ('control #13', [651.582, 912.3698, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [37, 6])], [('control #8', [1154.1901, 783.547, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [94, 30]), ('control #10', [500787.7801, 4199579.3798, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [26, 14]), ('control #11', [-179.8182, 72.2686, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [0, 70]), ('control #12', [1181.1787, 4910.1448, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [75, 60]), ('control #13', [651.582, 912.3698, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [37, 6]), ('control #14', [43.3467, 82.4576, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], None), ('control #15', [500583.8568, 4199766.5953, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [19, 7]), ('control #16', [-155.0962, 71.5551, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [99, 73])], [('control #12', [1181.1787, 4910.1448, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [75, 60]), ('control #13', [651.582, 912.3698, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], [37, 6]), ('control #14', [43.3467, 82.4576, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], None), ('control #15', [500583.8568, 4199766.5953, [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0], 100, 80], [19, 7]), ('control #16', [-155.0962, 71.5551, [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25], 100, 80], [99, 73]), ('control #17', [1052.7736, 4892.5715, [1000.0, 2.0, 0.5, 5000.0, 0.4, -2.0], 100, 80], [12, 56]), ('control #18', [1072.1342, 274.3213, [300.0, 10.0, -3.0, 900.0, 2.0, -10.0], 100, 80], None), ('control #19', [85.7339, 56.5251, [0.0, 1.0, 0.0, 0.0, 0.0, 1.0], 100, 80], [85, 56])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\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":"Stipulated deterministic toy contract on a bounded input domain; results are rounded as stated and no conformance with any published standard or library is claimed. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-map-projection-transforms-geotransform-inverse-pixel-column-numerator","generated_at":"2026-09-29T14:48:19.083183+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Point sampling of rasters and click-to-pixel lookups rely on this inverse; half-pixel or sign mistakes read the neighbouring cell.","root_cause":"The column numerator uses the row-rotation term gt4 where the inverse needs gt2.","sha256":"af94805648c49eb7a28aa51ef7a5c555d9ade10c81dcb36768d96090975bf4a2","title":"Affine geotransform inverse to pixel indices: column numerator · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":39.086,"exit_code":1,"observations":[{"actual":[58,6],"check":"control #0","expected":[58,6],"passed":true},{"actual":[32,26],"check":"control #1","expected":[32,26],"passed":true},{"actual":[27,23],"check":"control #2","expected":[17,23],"passed":false},{"actual":[13,35],"check":"control #3","expected":[32,35],"passed":false},{"actual":[76,18],"check":"control #4","expected":[76,18],"passed":true},{"actual":null,"check":"control #5","expected":null,"passed":true},{"actual":[97,63],"check":"control #6","expected":[97,63],"passed":true},{"actual":[42,21],"check":"control #7","expected":[35,21],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [58, 6], \"expected\": [58, 6], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [32, 26], \"expected\": [32, 26], \"passed\": true}, {\"check\": \"control #2\", \"actual\": [27, 23], \"expected\": [17, 23], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [13, 35], \"expected\": [32, 35], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [76, 18], \"expected\": [76, 18], \"passed\": true}, {\"check\": \"control #5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control #6\", \"actual\": [97, 63], \"expected\": [97, 63], \"passed\": true}, {\"check\": \"control #7\", \"actual\": [42, 21], \"expected\": [35, 21], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.891,"exit_code":1,"observations":[{"actual":[58,6],"check":"control #0","expected":[58,6],"passed":true},{"actual":[32,26],"check":"control #1","expected":[32,26],"passed":true},{"actual":[18,23],"check":"control #2","expected":[17,23],"passed":false},{"actual":[16,35],"check":"control #3","expected":[32,35],"passed":false},{"actual":[76,18],"check":"control #4","expected":[76,18],"passed":true},{"actual":null,"check":"control #5","expected":null,"passed":true},{"actual":[97,63],"check":"control #6","expected":[97,63],"passed":true},{"actual":[36,21],"check":"control #7","expected":[35,21],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [58, 6], \"expected\": [58, 6], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [32, 26], \"expected\": [32, 26], \"passed\": true}, {\"check\": \"control #2\", \"actual\": [18, 23], \"expected\": [17, 23], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [16, 35], \"expected\": [32, 35], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [76, 18], \"expected\": [76, 18], \"passed\": true}, {\"check\": \"control #5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control #6\", \"actual\": [97, 63], \"expected\": [97, 63], \"passed\": true}, {\"check\": \"control #7\", \"actual\": [36, 21], \"expected\": [35, 21], \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}