FA-70291 / Map projection transforms / Open access
World file to corner geotransform and pixel centre: corner x half-pixel shift · case 01
Imported rasters sit one pixel east of their true position.
ROOT CAUSE
The half-pixel shift from centre to corner is applied in the wrong direction.
VERIFIED REPAIR
At the corner x half-pixel shift step restore `C - A / 2 - B / 2`, leaving the rest of the model unchanged.
Unsuccessful approach: The x-scale half-pixel shift is right but the rotation contribution B/2 is omitted.
Case 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.
Why this case matters
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.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
lines, col, row = x
A, D, B, E, C, Fy = lines
gt = [C + A / 2 + B / 2, A, B, Fy - D / 2 - E / 2, D, E]
cx = C + A * col + B * row
cy = Fy + D * col + E * row
return [round(v, 6) for v in gt + [cx, cy]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('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])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| control #0 | [500030.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0] | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0] | Failed |
| control #1 | [-179.75, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125] | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125] | Failed |
| control #2 | [1002.5, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6] | [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6] | Failed |
| control #3 | [302.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0] | [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0] | Failed |
| control #4 | [1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5] | [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5] | Failed |
| control #5 | [103.25, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0] | [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0] | Failed |
| control #6 | [500030.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0] | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0] | Failed |
| control #7 | [-179.75, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125] | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125] | Failed |
SHA-256 / 50deed69162b602ac758b925855c1994be056f10ac3e2c47bdc2ca808ee41c52
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
lines, col, row = x
A, D, B, E, C, Fy = lines
gt = [C - A / 2, A, B, Fy - D / 2 - E / 2, D, E]
cx = C + A * col + B * row
cy = Fy + D * col + E * row
return [round(v, 6) for v in gt + [cx, cy]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('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])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| control #0 | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0] | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0] | Passed |
| control #1 | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125] | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125] | Passed |
| control #2 | [1000.25, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6] | [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6] | Failed |
| control #3 | [293.5, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0] | [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0] | Failed |
| control #4 | [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5] | [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5] | Passed |
| control #5 | [97.5, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0] | [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0] | Failed |
| control #6 | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0] | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0] | Passed |
| control #7 | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125] | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125] | Passed |
SHA-256 / 2c89f9d2e9c6d13200a99e4b2c3e990f223fdbec27dfd8bc25c872ce7022475b
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
lines, col, row = x
A, D, B, E, C, Fy = lines
gt = [C - A / 2 - B / 2, A, B, Fy - D / 2 - E / 2, D, E]
cx = C + A * col + B * row
cy = Fy + D * col + E * row
return [round(v, 6) for v in gt + [cx, cy]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('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])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| control #0 | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0] | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 501455.0, 4198995.0] | Passed |
| control #1 | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125] | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -167.375, 81.125] | Passed |
| control #2 | [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6] | [1000.0, 2.0, 0.5, 4999.6, 0.4, -2.0, 1081.25, 4947.6] | Passed |
| control #3 | [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0] | [295.0, 10.0, -3.0, 905.0, 2.0, -10.0, 241.5, 429.0] | Passed |
| control #4 | [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5] | [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 25.5, 48.5] | Passed |
| control #5 | [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0] | [96.75, 5.0, 1.5, 203.0, -1.0, -5.0, 366.0, -60.0] | Passed |
| control #6 | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0] | [500000.0, 30.0, 0.0, 4200000.0, 0.0, -30.0, 500915.0, 4199895.0] | Passed |
| control #7 | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125] | [-180.0, 0.25, 0.0, 90.0, 0.0, -0.25, -170.125, 88.125] | Passed |
SHA-256 / 71d7420873102edeec94d272bacaf6645e4a667211b740294aeb0d39ac1630c3
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:48:19.420811+00:00.
Case digest / 3eced13dee09f3d976a25933e7658d4d4660ffa228a9f029051b83bce72bde25