{"abstract":"Distant points are drawn much too close to the centre.","category":"Map projection transforms","checks":8,"contract":"Input [lon, lat, lon0, lat0]; sphere R = 6371000 centred on (lon0, lat0). cos c is clamped to [-1, 1], c = acos. Points with c > pi - 1e-6 (the antipode neighbourhood) return None. k = 1 at the centre (c < 1e-12) else c/sin c. x = R k cos(p) sin(dl); y = R k (cos(p0) sin(p) - sin(p0) cos(p) cos(dl)). Return [x rounded to 1 decimal, y rounded to 1 decimal, hypot(x, y)/1000 km rounded to 3, azimuth clockwise from north in [0, 360) rounded to 4].","contract_signature":"x","evaluation_group":"w2-map-projection-transforms-azimuthal-equidistant-range-bearing","failed_approach":"c/tan(c) matches only near the centre and turns negative beyond 90 degrees.","family":"w2-map-projection-transforms-azimuthal-equidistant-range-bearing-radial-scale","id":"FA-70211","implementations":{"attempt":{"sha256":"4009a8efa5d6e91dc20a4282f6257b7ecb1413d810a0d7499b34d06a14147127","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lon, lat, lon0, lat0 = x\n    R = 6371000.0\n    phi, phi0 = math.radians(lat), math.radians(lat0)\n    dl = math.radians(lon - lon0)\n    cosc = math.sin(phi0) * math.sin(phi) + math.cos(phi0) * math.cos(phi) * math.cos(dl)\n    cosc = max(-1.0, min(1.0, cosc))\n    c = math.acos(cosc)\n    if c > math.pi - 1e-6:\n        return None\n    k = 1.0 if c < 1e-12 else c / math.tan(c)\n    px = R * k * math.cos(phi) * math.sin(dl)\n    py = R * k * (math.cos(phi0) * math.sin(phi) - math.sin(phi0) * math.cos(phi) * math.cos(dl))\n    dist = math.hypot(px, py) / 1000.0\n    az = math.degrees(math.atan2(px, py)) % 360.0\n    return [round(px, 1), round(py, 1), round(dist, 3), round(az, 4)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [-179.674, 72.844, -100.0, -60.0], [-7721194.5, 13929763.9, 15926.555, 331.0006]), ('control #1', [201.072, 34.17, 140.0, 0.0], [5834953.3, 4525637.3, 7384.313, 52.2026]), ('control #2', [194.99, -6.711, 140.0, 70.0], [7727165.8, -5465888.2, 9464.937, 125.2741]), ('control #3', [80.599, 78.457, 0.0, 70.0], [1287102.6, 1984537.9, 2365.38, 32.966]), ('control #4', [233.972, 56.233, 140.0, 0.0], [5689261.3, 8529602.6, 10252.893, 33.7034]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)], [('control #1', [201.072, 34.17, 140.0, 0.0], [5834953.3, 4525637.3, 7384.313, 52.2026]), ('control #2', [194.99, -6.711, 140.0, 70.0], [7727165.8, -5465888.2, 9464.937, 125.2741]), ('control #5', [-8.83, 69.176, 45.0, -60.0], [-6061244.1, 13708058.5, 14988.314, 336.1466]), ('control #6', [70.317, -25.779, 140.0, 70.0], [-10593752.0, -5551791.2, 11960.35, 242.3426]), ('control #7', [82.76, -58.875, 140.0, -60.0], [-2884562.0, -1232854.6, 3136.978, 246.8583]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)], [('control #2', [194.99, -6.711, 140.0, 70.0], [7727165.8, -5465888.2, 9464.937, 125.2741]), ('control #3', [80.599, 78.457, 0.0, 70.0], [1287102.6, 1984537.9, 2365.38, 32.966]), ('control #8', [-80.409, -20.217, 0.0, 70.0], [-11302865.4, -3238552.9, 11757.678, 254.0117]), ('control #9', [24.308, 5.805, 140.0, 0.0], [-12767659.1, 1440420.7, 12848.655, 276.4368]), ('control #10', [171.761, -8.363, 140.0, -60.0], [3932496.4, 4951958.7, 6323.482, 38.4541]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)], [('control #3', [80.599, 78.457, 0.0, 70.0], [1287102.6, 1984537.9, 2365.38, 32.966]), ('control #4', [233.972, 56.233, 140.0, 0.0], [5689261.3, 8529602.6, 10252.893, 33.7034]), ('control #11', [86.324, 1.66, 0.0, -35.0], [9760962.6, 591892.2, 9778.892, 86.5299]), ('control #12', [51.045, 75.896, 45.0, 40.0], [174765.9, 3998901.2, 4002.718, 2.5024]), ('control #13', [-125.02, -49.187, -100.0, 40.0], [-2825638.9, -9817991.9, 10216.516, 196.0559]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)], [('control #4', [233.972, 56.233, 140.0, 0.0], [5689261.3, 8529602.6, 10252.893, 33.7034]), ('control #5', [-8.83, 69.176, 45.0, -60.0], [-6061244.1, 13708058.5, 14988.314, 336.1466]), ('control #14', [82.118, -2.719, 0.0, -60.0], [9265529.2, 888764.4, 9308.057, 84.5209]), ('control #15', [-64.341, 43.206, 0.0, 40.0], [-4695245.9, 2298059.6, 5227.467, 296.0792]), ('control #16', [42.81, -75.807, 0.0, -60.0], [1087216.3, -2146485.8, 2406.126, 153.1373]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)]]\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":"68550e5e0487db6ef69bfb4df154e192c0de7cd7895092629170a8109da3ed8f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lon, lat, lon0, lat0 = x\n    R = 6371000.0\n    phi, phi0 = math.radians(lat), math.radians(lat0)\n    dl = math.radians(lon - lon0)\n    cosc = math.sin(phi0) * math.sin(phi) + math.cos(phi0) * math.cos(phi) * math.cos(dl)\n    cosc = max(-1.0, min(1.0, cosc))\n    c = math.acos(cosc)\n    if c > math.pi - 1e-6:\n        return None\n    k = 1.0 if c < 1e-12 else math.sin(c) / c\n    px = R * k * math.cos(phi) * math.sin(dl)\n    py = R * k * (math.cos(phi0) * math.sin(phi) - math.sin(phi0) * math.cos(phi) * math.cos(dl))\n    dist = math.hypot(px, py) / 1000.0\n    az = math.degrees(math.atan2(px, py)) % 360.0\n    return [round(px, 1), round(py, 1), round(dist, 3), round(az, 4)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [-179.674, 72.844, -100.0, -60.0], [-7721194.5, 13929763.9, 15926.555, 331.0006]), ('control #1', [201.072, 34.17, 140.0, 0.0], [5834953.3, 4525637.3, 7384.313, 52.2026]), ('control #2', [194.99, -6.711, 140.0, 70.0], [7727165.8, -5465888.2, 9464.937, 125.2741]), ('control #3', [80.599, 78.457, 0.0, 70.0], [1287102.6, 1984537.9, 2365.38, 32.966]), ('control #4', [233.972, 56.233, 140.0, 0.0], [5689261.3, 8529602.6, 10252.893, 33.7034]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)], [('control #1', [201.072, 34.17, 140.0, 0.0], [5834953.3, 4525637.3, 7384.313, 52.2026]), ('control #2', [194.99, -6.711, 140.0, 70.0], [7727165.8, -5465888.2, 9464.937, 125.2741]), ('control #5', [-8.83, 69.176, 45.0, -60.0], [-6061244.1, 13708058.5, 14988.314, 336.1466]), ('control #6', [70.317, -25.779, 140.0, 70.0], [-10593752.0, -5551791.2, 11960.35, 242.3426]), ('control #7', [82.76, -58.875, 140.0, -60.0], [-2884562.0, -1232854.6, 3136.978, 246.8583]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)], [('control #2', [194.99, -6.711, 140.0, 70.0], [7727165.8, -5465888.2, 9464.937, 125.2741]), ('control #3', [80.599, 78.457, 0.0, 70.0], [1287102.6, 1984537.9, 2365.38, 32.966]), ('control #8', [-80.409, -20.217, 0.0, 70.0], [-11302865.4, -3238552.9, 11757.678, 254.0117]), ('control #9', [24.308, 5.805, 140.0, 0.0], [-12767659.1, 1440420.7, 12848.655, 276.4368]), ('control #10', [171.761, -8.363, 140.0, -60.0], [3932496.4, 4951958.7, 6323.482, 38.4541]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)], [('control #3', [80.599, 78.457, 0.0, 70.0], [1287102.6, 1984537.9, 2365.38, 32.966]), ('control #4', [233.972, 56.233, 140.0, 0.0], [5689261.3, 8529602.6, 10252.893, 33.7034]), ('control #11', [86.324, 1.66, 0.0, -35.0], [9760962.6, 591892.2, 9778.892, 86.5299]), ('control #12', [51.045, 75.896, 45.0, 40.0], [174765.9, 3998901.2, 4002.718, 2.5024]), ('control #13', [-125.02, -49.187, -100.0, 40.0], [-2825638.9, -9817991.9, 10216.516, 196.0559]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)], [('control #4', [233.972, 56.233, 140.0, 0.0], [5689261.3, 8529602.6, 10252.893, 33.7034]), ('control #5', [-8.83, 69.176, 45.0, -60.0], [-6061244.1, 13708058.5, 14988.314, 336.1466]), ('control #14', [82.118, -2.719, 0.0, -60.0], [9265529.2, 888764.4, 9308.057, 84.5209]), ('control #15', [-64.341, 43.206, 0.0, 40.0], [-4695245.9, 2298059.6, 5227.467, 296.0792]), ('control #16', [42.81, -75.807, 0.0, -60.0], [1087216.3, -2146485.8, 2406.126, 153.1373]), ('boundary #22', [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]), ('boundary #23', [180.0, 0.0, 0.0, 0.0], None), ('boundary #24', [180.0, 1e-05, 0.0, 0.0], None)]]\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-azimuthal-equidistant-range-bearing-radial-scale","generated_at":"2026-09-29T14:48:18.462972+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Radio coverage, flight-range rings and seismology plots use this projection to read range and bearing directly.","root_cause":"The radial scale factor is inverted to sin(c)/c, the factor of an orthographic-like view.","sha256":"6b644147ca56fafa34b3b3ba517301a4e70e855243fc04b0066e89ca5ae8a120","title":"Azimuthal equidistant range and bearing: radial scale · 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":41.904,"exit_code":1,"observations":[{"actual":[6185100.4,-11158505.1,12758.045,151.0006],"check":"control #0","expected":[-7721194.5,13929763.9,15926.555,331.0006],"passed":false},{"actual":[2335204.2,1811203.4,2955.273,52.2026],"check":"control #1","expected":[5834953.3,4525637.3,7384.313,52.2026],"passed":false},{"actual":[657313.7,-464957.5,805.138,125.2741],"check":"control #2","expected":[7727165.8,-5465888.2,9464.937,125.2741],"passed":false},{"actual":[1199407.5,1849323.9,2204.218,32.966],"check":"control #3","expected":[1287102.6,1984537.9,2365.38,32.966],"passed":false},{"actual":[-219041.5,-328397.0,394.745,213.7034],"check":"control #4","expected":[5689261.3,8529602.6,10252.893,33.7034],"passed":false},{"actual":[0.0,0.0,0.0,0.0],"check":"boundary #22","expected":[0.0,0.0,0.0,0.0],"passed":true},{"actual":null,"check":"boundary #23","expected":null,"passed":true},{"actual":null,"check":"boundary #24","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [6185100.4, -11158505.1, 12758.045, 151.0006], \"expected\": [-7721194.5, 13929763.9, 15926.555, 331.0006], \"passed\": false}, {\"check\": \"control #1\", \"actual\": [2335204.2, 1811203.4, 2955.273, 52.2026], \"expected\": [5834953.3, 4525637.3, 7384.313, 52.2026], \"passed\": false}, {\"check\": \"control #2\", \"actual\": [657313.7, -464957.5, 805.138, 125.2741], \"expected\": [7727165.8, -5465888.2, 9464.937, 125.2741], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [1199407.5, 1849323.9, 2204.218, 32.966], \"expected\": [1287102.6, 1984537.9, 2365.38, 32.966], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [-219041.5, -328397.0, 394.745, 213.7034], \"expected\": [5689261.3, 8529602.6, 10252.893, 33.7034], \"passed\": false}, {\"check\": \"boundary #22\", \"actual\": [0.0, 0.0, 0.0, 0.0], \"expected\": [0.0, 0.0, 0.0, 0.0], \"passed\": true}, {\"check\": \"boundary #23\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"boundary #24\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.533,"exit_code":1,"observations":[{"actual":[-442706.9,798685.0,913.174,331.0006],"check":"control #0","expected":[-7721194.5,13929763.9,15926.555,331.0006],"passed":false},{"actual":[3647749.6,2829224.2,4616.339,52.2026],"check":"control #1","expected":[5834953.3,4525637.3,7384.313,52.2026],"passed":false},{"actual":[3475729.7,-2458592.2,4257.39,125.2741],"check":"control #2","expected":[7727165.8,-5465888.2,9464.937,125.2741],"passed":false},{"actual":[1229039.3,1895012.1,2258.674,32.966],"check":"control #3","expected":[1287102.6,1984537.9,2365.38,32.966],"passed":false},{"actual":[2193481.6,3288568.7,3952.979,33.7034],"check":"control #4","expected":[5689261.3,8529602.6,10252.893,33.7034],"passed":false},{"actual":[0.0,0.0,0.0,0.0],"check":"boundary #22","expected":[0.0,0.0,0.0,0.0],"passed":true},{"actual":null,"check":"boundary #23","expected":null,"passed":true},{"actual":null,"check":"boundary #24","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [-442706.9, 798685.0, 913.174, 331.0006], \"expected\": [-7721194.5, 13929763.9, 15926.555, 331.0006], \"passed\": false}, {\"check\": \"control #1\", \"actual\": [3647749.6, 2829224.2, 4616.339, 52.2026], \"expected\": [5834953.3, 4525637.3, 7384.313, 52.2026], \"passed\": false}, {\"check\": \"control #2\", \"actual\": [3475729.7, -2458592.2, 4257.39, 125.2741], \"expected\": [7727165.8, -5465888.2, 9464.937, 125.2741], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [1229039.3, 1895012.1, 2258.674, 32.966], \"expected\": [1287102.6, 1984537.9, 2365.38, 32.966], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [2193481.6, 3288568.7, 3952.979, 33.7034], \"expected\": [5689261.3, 8529602.6, 10252.893, 33.7034], \"passed\": false}, {\"check\": \"boundary #22\", \"actual\": [0.0, 0.0, 0.0, 0.0], \"expected\": [0.0, 0.0, 0.0, 0.0], \"passed\": true}, {\"check\": \"boundary #23\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"boundary #24\", \"actual\": null, \"expected\": null, \"passed\": true}], \"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."}}