{"abstract":"The map is squashed vertically.","category":"Map projection transforms","checks":8,"contract":"Input [lon, lat, lon0]; sphere R = 6371000, dlon wrapped to [-180, 180). Solve 2t + sin 2t = pi sin(phi) by Newton from t = phi, at most 50 steps, stopping when the residual is below 1e-12, with derivative 2 + 2 cos 2t. x = R (2 sqrt 2 / pi) dlon cos t, y = R sqrt 2 sin t, rounded to 2 decimals.","evaluation_group":"w2-map-projection-transforms-mollweide-newton","failed_approach":"sqrt(2) is restored but the sine is taken of the latitude instead of the auxiliary angle.","family":"w2-map-projection-transforms-mollweide-newton-northing-scale","id":"FA-70251","implementations":{"attempt":{"sha256":"b2818b424d86db9767e8d2de5b5d3e9ae44ef06eba73f7a8dd0552a71050dbd0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lon, lat, lon0 = x\n    R = 6371000.0\n    phi = math.radians(lat)\n    dl = math.radians(((lon - lon0 + 180.0) % 360.0) - 180.0)\n    theta = phi\n    for _ in range(50):\n        f = 2 * theta + math.sin(2 * theta) - math.pi * math.sin(phi)\n        if abs(f) < 1e-12:\n            break\n        theta -= f / (2 + 2 * math.cos(2 * theta))\n    px = R * 2 * math.sqrt(2) / math.pi * dl * math.cos(theta)\n    py = R * math.sqrt(2) * math.sin(phi)\n    return [round(px, 2), round(py, 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [101.361, 11.005, 160.0], [-5803523.67, 1355983.62]), ('control #1', [-137.531, 16.006, 160.0], [6102963.12, 1966970.83]), ('control #2', [152.471, -58.088, -90.0], [-7888806.65, -6684729.63]), ('control #3', [-64.263, -57.975, 10.0], [-4994731.15, -6673720.01]), ('control #4', [95.241, 74.746, 10.0], [3649809.48, 8144275.14]), ('control #5', [172.208, 59.576, 10.0], [10593963.16, 6828509.25]), ('control #6', [-110.318, -70.158, 0.0], [-5572506.91, -7778914.97]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #1', [-137.531, 16.006, 160.0], [6102963.12, 1966970.83]), ('control #2', [152.471, -58.088, -90.0], [-7888806.65, -6684729.63]), ('control #5', [172.208, 59.576, 10.0], [10593963.16, 6828509.25]), ('control #6', [-110.318, -70.158, 0.0], [-5572506.91, -7778914.97]), ('control #7', [114.805, 18.464, -90.0], [-15037610.8, 2265254.5]), ('control #8', [-149.861, -30.081, 160.0], [4589310.14, -3649245.65]), ('control #9', [101.273, 37.68, 160.0], [-5084573.46, 4523399.69]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #2', [152.471, -58.088, -90.0], [-7888806.65, -6684729.63]), ('control #3', [-64.263, -57.975, 10.0], [-4994731.15, -6673720.01]), ('control #8', [-149.861, -30.081, 160.0], [4589310.14, -3649245.65]), ('control #9', [101.273, 37.68, 160.0], [-5084573.46, 4523399.69]), ('control #10', [-134.836, -65.77, 160.0], [3720190.56, -7401319.17]), ('control #11', [148.892, -11.799, 0.0], [14710485.98, -1453302.05]), ('control #12', [-27.35, -61.095, 10.0], [-2367959.82, -6972924.49]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #3', [-64.263, -57.975, 10.0], [-4994731.15, -6673720.01]), ('control #4', [95.241, 74.746, 10.0], [3649809.48, 8144275.14]), ('control #11', [148.892, -11.799, 0.0], [14710485.98, -1453302.05]), ('control #12', [-27.35, -61.095, 10.0], [-2367959.82, -6972924.49]), ('control #13', [-49.492, 24.945, 0.0], [-4663467.36, 3043363.54]), ('control #14', [165.148, 70.359, 10.0], [7787627.95, 7795585.92]), ('control #15', [-71.762, 5.799, 160.0], [12797412.04, 715745.6]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #4', [95.241, 74.746, 10.0], [3649809.48, 8144275.14]), ('control #5', [172.208, 59.576, 10.0], [10593963.16, 6828509.25]), ('control #14', [165.148, 70.359, 10.0], [7787627.95, 7795585.92]), ('control #15', [-71.762, 5.799, 160.0], [12797412.04, 715745.6]), ('control #16', [120.053, 58.23, -90.0], [-10039242.4, 6698546.76]), ('control #17', [164.893, -9.572, 10.0], [15372850.89, -1180095.58]), ('control #18', [35.53, 12.622, 10.0], [2517518.51, 1554061.2]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])]]\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":"a34cd36a9103a4d548485ff8c110d87b401d416f223b49f2478944a27ea95215","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lon, lat, lon0 = x\n    R = 6371000.0\n    phi = math.radians(lat)\n    dl = math.radians(((lon - lon0 + 180.0) % 360.0) - 180.0)\n    theta = phi\n    for _ in range(50):\n        f = 2 * theta + math.sin(2 * theta) - math.pi * math.sin(phi)\n        if abs(f) < 1e-12:\n            break\n        theta -= f / (2 + 2 * math.cos(2 * theta))\n    px = R * 2 * math.sqrt(2) / math.pi * dl * math.cos(theta)\n    py = R * math.sin(theta)\n    return [round(px, 2), round(py, 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [101.361, 11.005, 160.0], [-5803523.67, 1355983.62]), ('control #1', [-137.531, 16.006, 160.0], [6102963.12, 1966970.83]), ('control #2', [152.471, -58.088, -90.0], [-7888806.65, -6684729.63]), ('control #3', [-64.263, -57.975, 10.0], [-4994731.15, -6673720.01]), ('control #4', [95.241, 74.746, 10.0], [3649809.48, 8144275.14]), ('control #5', [172.208, 59.576, 10.0], [10593963.16, 6828509.25]), ('control #6', [-110.318, -70.158, 0.0], [-5572506.91, -7778914.97]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #1', [-137.531, 16.006, 160.0], [6102963.12, 1966970.83]), ('control #2', [152.471, -58.088, -90.0], [-7888806.65, -6684729.63]), ('control #5', [172.208, 59.576, 10.0], [10593963.16, 6828509.25]), ('control #6', [-110.318, -70.158, 0.0], [-5572506.91, -7778914.97]), ('control #7', [114.805, 18.464, -90.0], [-15037610.8, 2265254.5]), ('control #8', [-149.861, -30.081, 160.0], [4589310.14, -3649245.65]), ('control #9', [101.273, 37.68, 160.0], [-5084573.46, 4523399.69]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #2', [152.471, -58.088, -90.0], [-7888806.65, -6684729.63]), ('control #3', [-64.263, -57.975, 10.0], [-4994731.15, -6673720.01]), ('control #8', [-149.861, -30.081, 160.0], [4589310.14, -3649245.65]), ('control #9', [101.273, 37.68, 160.0], [-5084573.46, 4523399.69]), ('control #10', [-134.836, -65.77, 160.0], [3720190.56, -7401319.17]), ('control #11', [148.892, -11.799, 0.0], [14710485.98, -1453302.05]), ('control #12', [-27.35, -61.095, 10.0], [-2367959.82, -6972924.49]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #3', [-64.263, -57.975, 10.0], [-4994731.15, -6673720.01]), ('control #4', [95.241, 74.746, 10.0], [3649809.48, 8144275.14]), ('control #11', [148.892, -11.799, 0.0], [14710485.98, -1453302.05]), ('control #12', [-27.35, -61.095, 10.0], [-2367959.82, -6972924.49]), ('control #13', [-49.492, 24.945, 0.0], [-4663467.36, 3043363.54]), ('control #14', [165.148, 70.359, 10.0], [7787627.95, 7795585.92]), ('control #15', [-71.762, 5.799, 160.0], [12797412.04, 715745.6]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #4', [95.241, 74.746, 10.0], [3649809.48, 8144275.14]), ('control #5', [172.208, 59.576, 10.0], [10593963.16, 6828509.25]), ('control #14', [165.148, 70.359, 10.0], [7787627.95, 7795585.92]), ('control #15', [-71.762, 5.799, 160.0], [12797412.04, 715745.6]), ('control #16', [120.053, 58.23, -90.0], [-10039242.4, 6698546.76]), ('control #17', [164.893, -9.572, 10.0], [15372850.89, -1180095.58]), ('control #18', [35.53, 12.622, 10.0], [2517518.51, 1554061.2]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])]]\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":"650a2d4376dadaf054d34dfc3a3046ff49c1f0ebc3e15693c13a26a498842c57","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lon, lat, lon0 = x\n    R = 6371000.0\n    phi = math.radians(lat)\n    dl = math.radians(((lon - lon0 + 180.0) % 360.0) - 180.0)\n    theta = phi\n    for _ in range(50):\n        f = 2 * theta + math.sin(2 * theta) - math.pi * math.sin(phi)\n        if abs(f) < 1e-12:\n            break\n        theta -= f / (2 + 2 * math.cos(2 * theta))\n    px = R * 2 * math.sqrt(2) / math.pi * dl * math.cos(theta)\n    py = R * math.sqrt(2) * math.sin(theta)\n    return [round(px, 2), round(py, 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [101.361, 11.005, 160.0], [-5803523.67, 1355983.62]), ('control #1', [-137.531, 16.006, 160.0], [6102963.12, 1966970.83]), ('control #2', [152.471, -58.088, -90.0], [-7888806.65, -6684729.63]), ('control #3', [-64.263, -57.975, 10.0], [-4994731.15, -6673720.01]), ('control #4', [95.241, 74.746, 10.0], [3649809.48, 8144275.14]), ('control #5', [172.208, 59.576, 10.0], [10593963.16, 6828509.25]), ('control #6', [-110.318, -70.158, 0.0], [-5572506.91, -7778914.97]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #1', [-137.531, 16.006, 160.0], [6102963.12, 1966970.83]), ('control #2', [152.471, -58.088, -90.0], [-7888806.65, -6684729.63]), ('control #5', [172.208, 59.576, 10.0], [10593963.16, 6828509.25]), ('control #6', [-110.318, -70.158, 0.0], [-5572506.91, -7778914.97]), ('control #7', [114.805, 18.464, -90.0], [-15037610.8, 2265254.5]), ('control #8', [-149.861, -30.081, 160.0], [4589310.14, -3649245.65]), ('control #9', [101.273, 37.68, 160.0], [-5084573.46, 4523399.69]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #2', [152.471, -58.088, -90.0], [-7888806.65, -6684729.63]), ('control #3', [-64.263, -57.975, 10.0], [-4994731.15, -6673720.01]), ('control #8', [-149.861, -30.081, 160.0], [4589310.14, -3649245.65]), ('control #9', [101.273, 37.68, 160.0], [-5084573.46, 4523399.69]), ('control #10', [-134.836, -65.77, 160.0], [3720190.56, -7401319.17]), ('control #11', [148.892, -11.799, 0.0], [14710485.98, -1453302.05]), ('control #12', [-27.35, -61.095, 10.0], [-2367959.82, -6972924.49]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #3', [-64.263, -57.975, 10.0], [-4994731.15, -6673720.01]), ('control #4', [95.241, 74.746, 10.0], [3649809.48, 8144275.14]), ('control #11', [148.892, -11.799, 0.0], [14710485.98, -1453302.05]), ('control #12', [-27.35, -61.095, 10.0], [-2367959.82, -6972924.49]), ('control #13', [-49.492, 24.945, 0.0], [-4663467.36, 3043363.54]), ('control #14', [165.148, 70.359, 10.0], [7787627.95, 7795585.92]), ('control #15', [-71.762, 5.799, 160.0], [12797412.04, 715745.6]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])], [('control #4', [95.241, 74.746, 10.0], [3649809.48, 8144275.14]), ('control #5', [172.208, 59.576, 10.0], [10593963.16, 6828509.25]), ('control #14', [165.148, 70.359, 10.0], [7787627.95, 7795585.92]), ('control #15', [-71.762, 5.799, 160.0], [12797412.04, 715745.6]), ('control #16', [120.053, 58.23, -90.0], [-10039242.4, 6698546.76]), ('control #17', [164.893, -9.572, 10.0], [15372850.89, -1180095.58]), ('control #18', [35.53, 12.622, 10.0], [2517518.51, 1554061.2]), ('control #22', [0.0, 0.0, 0.0], [0.0, 0.0])]]\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-mollweide-newton-northing-scale","generated_at":"2026-09-29T14:48:19.073855+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Global thematic maps use Mollweide for equal area; an under-converged auxiliary angle skews high latitudes.","repair":"At the northing scale step restore `py = R * math.sqrt(2) * math.sin(theta)`, leaving the rest of the model unchanged.","root_cause":"The northing omits the sqrt(2) factor.","sha256":"9ee2cdf58031a05c8fda51aa6b3ae991941f2a00898e33849e0ef60980715a54","title":"Mollweide forward with Newton solve: northing scale · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.855,"exit_code":1,"observations":[{"actual":[-5803523.67,1719952.2],"check":"control #0","expected":[-5803523.67,1355983.62],"passed":false},{"actual":[6102963.12,2484387.02],"check":"control #1","expected":[6102963.12,1966970.83],"passed":false},{"actual":[-7888806.65,-7648199.01],"check":"control #2","expected":[-7888806.65,-6684729.63],"passed":false},{"actual":[-4994731.15,-7638790.83],"check":"control #3","expected":[-4994731.15,-6673720.01],"passed":false},{"actual":[3649809.48,8692524.52],"check":"control #4","expected":[3649809.48,8144275.14],"passed":false},{"actual":[10593963.16,7769298.51],"check":"control #5","expected":[10593963.16,6828509.25],"passed":false},{"actual":[-5572506.91,-8475053.5],"check":"control #6","expected":[-5572506.91,-7778914.97],"passed":false},{"actual":[0.0,0.0],"check":"control #22","expected":[0.0,0.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [-5803523.67, 1719952.2], \"expected\": [-5803523.67, 1355983.62], \"passed\": false}, {\"check\": \"control #1\", \"actual\": [6102963.12, 2484387.02], \"expected\": [6102963.12, 1966970.83], \"passed\": false}, {\"check\": \"control #2\", \"actual\": [-7888806.65, -7648199.01], \"expected\": [-7888806.65, -6684729.63], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [-4994731.15, -7638790.83], \"expected\": [-4994731.15, -6673720.01], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [3649809.48, 8692524.52], \"expected\": [3649809.48, 8144275.14], \"passed\": false}, {\"check\": \"control #5\", \"actual\": [10593963.16, 7769298.51], \"expected\": [10593963.16, 6828509.25], \"passed\": false}, {\"check\": \"control #6\", \"actual\": [-5572506.91, -8475053.5], \"expected\": [-5572506.91, -7778914.97], \"passed\": false}, {\"check\": \"control #22\", \"actual\": [0.0, 0.0], \"expected\": [0.0, 0.0], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.322,"exit_code":1,"observations":[{"actual":[-5803523.67,958825.21],"check":"control #0","expected":[-5803523.67,1355983.62],"passed":false},{"actual":[6102963.12,1390858.41],"check":"control #1","expected":[6102963.12,1966970.83],"passed":false},{"actual":[-7888806.65,-4726817.65],"check":"control #2","expected":[-7888806.65,-6684729.63],"passed":false},{"actual":[-4994731.15,-4719032.68],"check":"control #3","expected":[-4994731.15,-6673720.01],"passed":false},{"actual":[3649809.48,5758872.18],"check":"control #4","expected":[3649809.48,8144275.14],"passed":false},{"actual":[10593963.16,4828485.2],"check":"control #5","expected":[10593963.16,6828509.25],"passed":false},{"actual":[-5572506.91,-5500523.53],"check":"control #6","expected":[-5572506.91,-7778914.97],"passed":false},{"actual":[0.0,0.0],"check":"control #22","expected":[0.0,0.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [-5803523.67, 958825.21], \"expected\": [-5803523.67, 1355983.62], \"passed\": false}, {\"check\": \"control #1\", \"actual\": [6102963.12, 1390858.41], \"expected\": [6102963.12, 1966970.83], \"passed\": false}, {\"check\": \"control #2\", \"actual\": [-7888806.65, -4726817.65], \"expected\": [-7888806.65, -6684729.63], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [-4994731.15, -4719032.68], \"expected\": [-4994731.15, -6673720.01], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [3649809.48, 5758872.18], \"expected\": [3649809.48, 8144275.14], \"passed\": false}, {\"check\": \"control #5\", \"actual\": [10593963.16, 4828485.2], \"expected\": [10593963.16, 6828509.25], \"passed\": false}, {\"check\": \"control #6\", \"actual\": [-5572506.91, -5500523.53], \"expected\": [-5572506.91, -7778914.97], \"passed\": false}, {\"check\": \"control #22\", \"actual\": [0.0, 0.0], \"expected\": [0.0, 0.0], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.125,"exit_code":0,"observations":[{"actual":[-5803523.67,1355983.62],"check":"control #0","expected":[-5803523.67,1355983.62],"passed":true},{"actual":[6102963.12,1966970.83],"check":"control #1","expected":[6102963.12,1966970.83],"passed":true},{"actual":[-7888806.65,-6684729.63],"check":"control #2","expected":[-7888806.65,-6684729.63],"passed":true},{"actual":[-4994731.15,-6673720.01],"check":"control #3","expected":[-4994731.15,-6673720.01],"passed":true},{"actual":[3649809.48,8144275.14],"check":"control #4","expected":[3649809.48,8144275.14],"passed":true},{"actual":[10593963.16,6828509.25],"check":"control #5","expected":[10593963.16,6828509.25],"passed":true},{"actual":[-5572506.91,-7778914.97],"check":"control #6","expected":[-5572506.91,-7778914.97],"passed":true},{"actual":[0.0,0.0],"check":"control #22","expected":[0.0,0.0],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [-5803523.67, 1355983.62], \"expected\": [-5803523.67, 1355983.62], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [6102963.12, 1966970.83], \"expected\": [6102963.12, 1966970.83], \"passed\": true}, {\"check\": \"control #2\", \"actual\": [-7888806.65, -6684729.63], \"expected\": [-7888806.65, -6684729.63], \"passed\": true}, {\"check\": \"control #3\", \"actual\": [-4994731.15, -6673720.01], \"expected\": [-4994731.15, -6673720.01], \"passed\": true}, {\"check\": \"control #4\", \"actual\": [3649809.48, 8144275.14], \"expected\": [3649809.48, 8144275.14], \"passed\": true}, {\"check\": \"control #5\", \"actual\": [10593963.16, 6828509.25], \"expected\": [10593963.16, 6828509.25], \"passed\": true}, {\"check\": \"control #6\", \"actual\": [-5572506.91, -7778914.97], \"expected\": [-5572506.91, -7778914.97], \"passed\": true}, {\"check\": \"control #22\", \"actual\": [0.0, 0.0], \"expected\": [0.0, 0.0], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}