{"abstract":"Pixel-centre eastings are half a pixel west of where the world file puts them.","category":"Map projection transforms","checks":8,"contract":"Input [lines, col, row] where lines are the six world-file values in file order A, D, B, E, C, F: A and E are the pixel sizes, D and B the rotation terms, and (C, F) the map coordinate of the centre of the upper-left pixel. Return the corner-based geotransform [C - A/2 - B/2, A, B, F - D/2 - E/2, D, E] followed by the centre of pixel (col, row): C + A*col + B*row and F + D*col + E*row; all rounded to 6 decimals.","evaluation_group":"w2-map-projection-transforms-world-file-geotransform","failed_approach":"Adding half a column fixes north-up rasters but still ignores the half-row rotation contribution.","family":"w2-map-projection-transforms-world-file-geotransform-pixel-centre-origin","id":"FA-70301","implementations":{"attempt":{"sha256":"9aea3f05c49c7a5c4df00a9d0b66dd9bcdfcfd03db0dbeff3676a7ae706271a2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lines, col, row = x\n    A, D, B, E, C, Fy = lines\n    gt = [C - A / 2 - B / 2, A, B, Fy - D / 2 - E / 2, D, E]\n    cx = gt[0] + A * (col + 0.5) + B * row\n    cy = Fy + D * col + E * row\n    return [round(v, 6) for v in gt + [cx, cy]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 48, 33], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0]), ('control #1', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 50, 35], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125]), ('control #2', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 32, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6]), ('control #3', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 9, 49], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0]), ('control #4', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 25, 48], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5]), ('control #5', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 40, 44], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0]), ('control #6', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 30, 3], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0]), ('control #7', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 39, 7], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125])], [('control #1', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 50, 35], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125]), ('control #3', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 9, 49], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0]), ('control #5', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 40, 44], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0]), ('control #6', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 30, 3], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0]), ('control #7', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 39, 7], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125]), ('control #8', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 3, 25], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.75, 4950.0]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #10', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 27, 23], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 27.5, 23.5])], [('control #2', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 32, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6]), ('control #7', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 39, 7], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125]), ('control #8', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 3, 25], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.75, 4950.0]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #10', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 27, 23], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 27.5, 23.5]), ('control #11', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 3, 46], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 184.0, -33.0]), ('control #12', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 5, 40], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500165.0, 4198785.0]), ('control #13', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 14, 18], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -176.375, 85.375])], [('control #3', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 9, 49], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #11', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 3, 46], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 184.0, -33.0]), ('control #12', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 5, 40], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500165.0, 4198785.0]), ('control #13', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 14, 18], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -176.375, 85.375]), ('control #14', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 1, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.25, 4935.2]), ('control #15', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 35, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 579.5, 741.0]), ('control #16', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 0, 18], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.5, 18.5])], [('control #4', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 25, 48], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #14', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 1, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.25, 4935.2]), ('control #15', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 35, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 579.5, 741.0]), ('control #16', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 0, 18], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.5, 18.5]), ('control #17', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 17, 23], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 219.5, 68.0]), ('control #18', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 14, 1], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500435.0, 4199955.0]), ('control #19', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 23, 49], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -174.125, 77.625])]]\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":"2e80fb0687bad4c819546d4e4c2134678187af742457cf40629e5c4140158e02","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lines, col, row = x\n    A, D, B, E, C, Fy = lines\n    gt = [C - A / 2 - B / 2, A, B, Fy - D / 2 - E / 2, D, E]\n    cx = gt[0] + A * col + B * row\n    cy = Fy + D * col + E * row\n    return [round(v, 6) for v in gt + [cx, cy]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 48, 33], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0]), ('control #1', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 50, 35], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125]), ('control #2', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 32, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6]), ('control #3', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 9, 49], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0]), ('control #4', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 25, 48], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5]), ('control #5', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 40, 44], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0]), ('control #6', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 30, 3], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0]), ('control #7', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 39, 7], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125])], [('control #1', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 50, 35], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125]), ('control #3', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 9, 49], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0]), ('control #5', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 40, 44], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0]), ('control #6', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 30, 3], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0]), ('control #7', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 39, 7], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125]), ('control #8', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 3, 25], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.75, 4950.0]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #10', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 27, 23], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 27.5, 23.5])], [('control #2', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 32, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6]), ('control #7', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 39, 7], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125]), ('control #8', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 3, 25], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.75, 4950.0]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #10', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 27, 23], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 27.5, 23.5]), ('control #11', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 3, 46], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 184.0, -33.0]), ('control #12', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 5, 40], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500165.0, 4198785.0]), ('control #13', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 14, 18], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -176.375, 85.375])], [('control #3', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 9, 49], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #11', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 3, 46], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 184.0, -33.0]), ('control #12', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 5, 40], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500165.0, 4198785.0]), ('control #13', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 14, 18], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -176.375, 85.375]), ('control #14', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 1, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.25, 4935.2]), ('control #15', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 35, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 579.5, 741.0]), ('control #16', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 0, 18], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.5, 18.5])], [('control #4', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 25, 48], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #14', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 1, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.25, 4935.2]), ('control #15', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 35, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 579.5, 741.0]), ('control #16', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 0, 18], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.5, 18.5]), ('control #17', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 17, 23], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 219.5, 68.0]), ('control #18', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 14, 1], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500435.0, 4199955.0]), ('control #19', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 23, 49], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -174.125, 77.625])]]\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"},"fixed":{"sha256":"71d7420873102edeec94d272bacaf6645e4a667211b740294aeb0d39ac1630c3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lines, col, row = x\n    A, D, B, E, C, Fy = lines\n    gt = [C - A / 2 - B / 2, A, B, Fy - D / 2 - E / 2, D, E]\n    cx = C + A * col + B * row\n    cy = Fy + D * col + E * row\n    return [round(v, 6) for v in gt + [cx, cy]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 48, 33], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0]), ('control #1', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 50, 35], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125]), ('control #2', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 32, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6]), ('control #3', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 9, 49], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0]), ('control #4', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 25, 48], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5]), ('control #5', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 40, 44], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0]), ('control #6', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 30, 3], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0]), ('control #7', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 39, 7], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125])], [('control #1', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 50, 35], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125]), ('control #3', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 9, 49], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0]), ('control #5', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 40, 44], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0]), ('control #6', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 30, 3], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0]), ('control #7', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 39, 7], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125]), ('control #8', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 3, 25], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.75, 4950.0]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #10', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 27, 23], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 27.5, 23.5])], [('control #2', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 32, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6]), ('control #7', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 39, 7], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125]), ('control #8', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 3, 25], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.75, 4950.0]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #10', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 27, 23], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 27.5, 23.5]), ('control #11', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 3, 46], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 184.0, -33.0]), ('control #12', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 5, 40], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500165.0, 4198785.0]), ('control #13', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 14, 18], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -176.375, 85.375])], [('control #3', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 9, 49], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #11', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 3, 46], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 184.0, -33.0]), ('control #12', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 5, 40], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500165.0, 4198785.0]), ('control #13', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 14, 18], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -176.375, 85.375]), ('control #14', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 1, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.25, 4935.2]), ('control #15', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 35, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 579.5, 741.0]), ('control #16', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 0, 18], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.5, 18.5])], [('control #4', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 25, 48], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5]), ('control #9', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 30, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 529.5, 731.0]), ('control #14', [[2.0, 0.4, 0.5, -2.0, 1001.25, 4998.8], 1, 32], [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1019.25, 4935.2]), ('control #15', [[10.0, 2.0, -3.0, -10.0, 298.5, 901.0], 35, 23], [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 579.5, 741.0]), ('control #16', [[1.0, 0.0, 0.0, 1.0, 0.5, 0.5], 0, 18], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.5, 18.5]), ('control #17', [[5.0, -1.0, 1.5, -5.0, 100.0, 200.0], 17, 23], [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 219.5, 68.0]), ('control #18', [[30.0, 0.0, 0.0, -30.0, 500015.0, 4199985.0], 14, 1], [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500435.0, 4199955.0]), ('control #19', [[0.25, 0.0, 0.0, -0.25, -179.875, 89.875], 23, 49], [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -174.125, 77.625])]]\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-world-file-geotransform-pixel-centre-origin","generated_at":"2026-09-29T14:48:19.463586+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"GIS tools interchange world files and corner-origin geotransforms; the half-pixel convention and line order are classic sources of half-pixel and rotated-raster shifts.","repair":"At the pixel centre origin step restore `cx = C + A * col + B * row`, leaving the rest of the model unchanged.","root_cause":"The centre coordinate starts from the corner origin instead of the world-file centre origin C.","sha256":"11effe9e17598a4f56a4308732af9b378b329c2b7472f8e381bcbe2db248ab21","title":"World file to corner geotransform and pixel centre: pixel centre origin · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.559,"exit_code":1,"observations":[{"actual":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,501455.0,4198995.0],"check":"control #0","expected":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,501455.0,4198995.0],"passed":true},{"actual":[-180.0,0.25,0.0,90.0,0.0,-0.25,-167.375,81.125],"check":"control #1","expected":[-180.0,0.25,0.0,90.0,0.0,-0.25,-167.375,81.125],"passed":true},{"actual":[1000.0,2.0,0.5,4999.6,0.4,-2.0,1081.0,4947.6],"check":"control #2","expected":[1000.0,2.0,0.5,4999.6,0.4,-2.0,1081.25,4947.6],"passed":false},{"actual":[295.0,10.0,-3.0,905.0,2.0,-10.0,243.0,429.0],"check":"control #3","expected":[295.0,10.0,-3.0,905.0,2.0,-10.0,241.5,429.0],"passed":false},{"actual":[0.0,1.0,0.0,0.0,0.0,1.0,25.5,48.5],"check":"control #4","expected":[0.0,1.0,0.0,0.0,0.0,1.0,25.5,48.5],"passed":true},{"actual":[96.75,5.0,1.5,203.0,-1.0,-5.0,365.25,-60.0],"check":"control #5","expected":[96.75,5.0,1.5,203.0,-1.0,-5.0,366.0,-60.0],"passed":false},{"actual":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,500915.0,4199895.0],"check":"control #6","expected":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,500915.0,4199895.0],"passed":true},{"actual":[-180.0,0.25,0.0,90.0,0.0,-0.25,-170.125,88.125],"check":"control #7","expected":[-180.0,0.25,0.0,90.0,0.0,-0.25,-170.125,88.125],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0], \"expected\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125], \"expected\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125], \"passed\": true}, {\"check\": \"control #2\", \"actual\": [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.0, 4947.6], \"expected\": [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 243.0, 429.0], \"expected\": [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5], \"expected\": [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5], \"passed\": true}, {\"check\": \"control #5\", \"actual\": [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 365.25, -60.0], \"expected\": [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0], \"passed\": false}, {\"check\": \"control #6\", \"actual\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0], \"expected\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0], \"passed\": true}, {\"check\": \"control #7\", \"actual\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125], \"expected\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.009,"exit_code":1,"observations":[{"actual":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,501440.0,4198995.0],"check":"control #0","expected":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,501455.0,4198995.0],"passed":false},{"actual":[-180.0,0.25,0.0,90.0,0.0,-0.25,-167.5,81.125],"check":"control #1","expected":[-180.0,0.25,0.0,90.0,0.0,-0.25,-167.375,81.125],"passed":false},{"actual":[1000.0,2.0,0.5,4999.6,0.4,-2.0,1080.0,4947.6],"check":"control #2","expected":[1000.0,2.0,0.5,4999.6,0.4,-2.0,1081.25,4947.6],"passed":false},{"actual":[295.0,10.0,-3.0,905.0,2.0,-10.0,238.0,429.0],"check":"control #3","expected":[295.0,10.0,-3.0,905.0,2.0,-10.0,241.5,429.0],"passed":false},{"actual":[0.0,1.0,0.0,0.0,0.0,1.0,25.0,48.5],"check":"control #4","expected":[0.0,1.0,0.0,0.0,0.0,1.0,25.5,48.5],"passed":false},{"actual":[96.75,5.0,1.5,203.0,-1.0,-5.0,362.75,-60.0],"check":"control #5","expected":[96.75,5.0,1.5,203.0,-1.0,-5.0,366.0,-60.0],"passed":false},{"actual":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,500900.0,4199895.0],"check":"control #6","expected":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,500915.0,4199895.0],"passed":false},{"actual":[-180.0,0.25,0.0,90.0,0.0,-0.25,-170.25,88.125],"check":"control #7","expected":[-180.0,0.25,0.0,90.0,0.0,-0.25,-170.125,88.125],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501440.0, 4198995.0], \"expected\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0], \"passed\": false}, {\"check\": \"control #1\", \"actual\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.5, 81.125], \"expected\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125], \"passed\": false}, {\"check\": \"control #2\", \"actual\": [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1080.0, 4947.6], \"expected\": [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 238.0, 429.0], \"expected\": [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.0, 48.5], \"expected\": [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5], \"passed\": false}, {\"check\": \"control #5\", \"actual\": [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 362.75, -60.0], \"expected\": [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0], \"passed\": false}, {\"check\": \"control #6\", \"actual\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500900.0, 4199895.0], \"expected\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0], \"passed\": false}, {\"check\": \"control #7\", \"actual\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.25, 88.125], \"expected\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.937,"exit_code":0,"observations":[{"actual":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,501455.0,4198995.0],"check":"control #0","expected":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,501455.0,4198995.0],"passed":true},{"actual":[-180.0,0.25,0.0,90.0,0.0,-0.25,-167.375,81.125],"check":"control #1","expected":[-180.0,0.25,0.0,90.0,0.0,-0.25,-167.375,81.125],"passed":true},{"actual":[1000.0,2.0,0.5,4999.6,0.4,-2.0,1081.25,4947.6],"check":"control #2","expected":[1000.0,2.0,0.5,4999.6,0.4,-2.0,1081.25,4947.6],"passed":true},{"actual":[295.0,10.0,-3.0,905.0,2.0,-10.0,241.5,429.0],"check":"control #3","expected":[295.0,10.0,-3.0,905.0,2.0,-10.0,241.5,429.0],"passed":true},{"actual":[0.0,1.0,0.0,0.0,0.0,1.0,25.5,48.5],"check":"control #4","expected":[0.0,1.0,0.0,0.0,0.0,1.0,25.5,48.5],"passed":true},{"actual":[96.75,5.0,1.5,203.0,-1.0,-5.0,366.0,-60.0],"check":"control #5","expected":[96.75,5.0,1.5,203.0,-1.0,-5.0,366.0,-60.0],"passed":true},{"actual":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,500915.0,4199895.0],"check":"control #6","expected":[500000.0,30.0,0.0,4200000.0,0.0,-30.0,500915.0,4199895.0],"passed":true},{"actual":[-180.0,0.25,0.0,90.0,0.0,-0.25,-170.125,88.125],"check":"control #7","expected":[-180.0,0.25,0.0,90.0,0.0,-0.25,-170.125,88.125],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0], \"expected\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125], \"expected\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125], \"passed\": true}, {\"check\": \"control #2\", \"actual\": [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6], \"expected\": [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6], \"passed\": true}, {\"check\": \"control #3\", \"actual\": [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0], \"expected\": [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0], \"passed\": true}, {\"check\": \"control #4\", \"actual\": [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5], \"expected\": [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5], \"passed\": true}, {\"check\": \"control #5\", \"actual\": [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0], \"expected\": [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0], \"passed\": true}, {\"check\": \"control #6\", \"actual\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0], \"expected\": [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0], \"passed\": true}, {\"check\": \"control #7\", \"actual\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125], \"expected\": [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}