FAILURE MAP
← Case archive

FA-71536 / Seismic magnitude estimation / Open access

Epicentral distance and station selection: angular distance conversion · case 01

Distances in degrees are reported in radians.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The central angle is not converted from radians to degrees.

VERIFIED REPAIR

Report degrees(d/R).

Unsuccessful approach: Dividing by 111 km per degree is a rounded approximation that differs at 0.001 degree.

Case contract

event [lat, lon] and stations [code, lat, lon] in degrees. Haversine distance with R = 6371 km. Keep stations within 600 km inclusive. Return [[code, km rounded 0.1, degrees rounded 0.001]] sorted by distance then code.

Why this case matters

Local magnitude and location use only stations in the calibrated distance range.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(event, stations):
    R = 6371.0
    out = []
    for code, la, lo in stations:
        p1 = math.radians(event[0])
        p2 = math.radians(la)
        dphi = p2 - p1
        dl = math.radians(lo - event[1])
        a = math.sin(dphi / 2) ** 2 + math.cos(p1) * math.cos(p2) * math.sin(dl / 2) ** 2
        d = 2 * R * math.asin(math.sqrt(min(1.0, a)))
        if d <= 600:
            out.append([code, round(d, 1), round(d / R, 3)])
    return sorted(out, key=lambda r: (r[1], r[0]))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['network 0', [[43.44, -118.77], [['S00', 33.06, -119.2], ['S01', 32.76, -122.81], ['S02', 40.37, -113.11], ['S03', 47.01, -115.45], ['S04', 33.17, -122.81]]], [['S03', 474.4, 4.267], ['S02', 579.4, 5.21]]], ['network 1', [[36.34, -120.83], [['S00', 37.53, -117.85], ['S01', 32.11, -122.6], ['S02', 34.89, -117.33], ['S03', 49.21, -120.87], ['S04', 42.08, -112.12]]], [['S00', 296.1, 2.662], ['S02', 355.1, 3.193], ['S01', 497.7, 4.476]]], ['network 2', [[44.56, -117.35], [['S00', 33.87, -122.39], ['S01', 32.58, -119.0], ['S02', 30.34, -116.47], ['S03', 43.88, -121.21], ['S04', 32.47, -111.54]]], [['S03', 316.7, 2.848]]], ['network 3', [[37.38, -120.81], [['S00', 37.99, -119.17], ['S01', 44.87, -121.53], ['S02', 36.92, -112.06], ['S03', 45.59, -124.41], ['S04', 48.41, -124.22], ['S05', 45.33, -114.43]]], [['S00', 159.5, 1.434]]], ['network 4', [[37.36, -114.17], [['S00', 43.21, -115.97], ['S01', 45.47, -113.6], ['S02', 43.88, -123.02], ['S03', 33.26, -123.35], ['S04', 41.04, -116.35], ['S05', 41.29, -123.64]]], [['S04', 450.2, 4.049]]], ['network 5', [[41.23, -114.32], [['S00', 48.44, -112.36], ['S01', 39.92, -111.66], ['S02', 31.63, -118.69], ['S03', 44.86, -116.63], ['S04', 45.92, -112.0], ['S05', 31.93, -116.6]]], [['S01', 267.7, 2.408], ['S03', 445.1, 4.003], ['S04', 553.9, 4.981]]], ['network 6', [[42.93, -114.98], [['S00', 41.78, -113.99], ['S01', 46.04, -120.17], ['S02', 39.37, -111.82], ['S03', 48.06, -111.76], ['S04', 45.02, -119.59]]], [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]], ['network 7', [[38.24, -116.31], [['S00', 44.82, -111.25], ['S01', 41.96, -117.22], ['S02', 45.77, -122.79]]], [['S01', 420.8, 3.784]]]], [['network 3', [[37.38, -120.81], [['S00', 37.99, -119.17], ['S01', 44.87, -121.53], ['S02', 36.92, -112.06], ['S03', 45.59, -124.41], ['S04', 48.41, -124.22], ['S05', 45.33, -114.43]]], [['S00', 159.5, 1.434]]], ['network 6', [[42.93, -114.98], [['S00', 41.78, -113.99], ['S01', 46.04, -120.17], ['S02', 39.37, -111.82], ['S03', 48.06, -111.76], ['S04', 45.02, -119.59]]], [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]], ['network 7', [[38.24, -116.31], [['S00', 44.82, -111.25], ['S01', 41.96, -117.22], ['S02', 45.77, -122.79]]], [['S01', 420.8, 3.784]]], ['network 8', [[37.27, -120.03], [['S00', 32.27, -124.77], ['S01', 36.2, -116.4], ['S02', 46.93, -122.1], ['S03', 48.81, -114.9]]], [['S01', 344.6, 3.099]]], ['network 9', [[39.63, -120.96], [['S00', 47.23, -111.26], ['S01', 41.57, -124.4], ['S02', 43.29, -122.87], ['S03', 45.0, -116.27], ['S04', 49.12, -110.82], ['S05', 33.21, -123.87]]], [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]]], ['network 10', [[40.71, -119.76], [['S00', 42.0, -113.32], ['S01', 47.1, -113.65], ['S02', 40.97, -110.91], ['S03', 38.42, -122.78], ['S04', 40.45, -114.89]]], [['S03', 363.1, 3.265], ['S04', 412.2, 3.707], ['S00', 556.2, 5.002]]], ['network 11', [[39.52, -114.53], [['S00', 35.96, -123.88], ['S01', 41.26, -111.67], ['S02', 46.06, -119.82], ['S03', 38.64, -110.68], ['S04', 43.59, -119.31]]], [['S01', 310.0, 2.788], ['S03', 346.4, 3.115]]], ['network 12', [[39.75, -115.38], [['S00', 39.91, -122.96], ['S01', 40.0, -124.22], ['S02', 45.24, -114.12], ['S03', 36.65, -117.11], ['S04', 39.11, -115.83], ['S05', 48.17, -111.51]]], [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]]]], [['network 6', [[42.93, -114.98], [['S00', 41.78, -113.99], ['S01', 46.04, -120.17], ['S02', 39.37, -111.82], ['S03', 48.06, -111.76], ['S04', 45.02, -119.59]]], [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]], ['network 11', [[39.52, -114.53], [['S00', 35.96, -123.88], ['S01', 41.26, -111.67], ['S02', 46.06, -119.82], ['S03', 38.64, -110.68], ['S04', 43.59, -119.31]]], [['S01', 310.0, 2.788], ['S03', 346.4, 3.115]]], ['network 14', [[36.07, -121.76], [['S00', 47.41, -116.96], ['S01', 36.95, -119.89], ['S02', 31.53, -122.92], ['S03', 32.44, -118.51], ['S04', 35.33, -113.8]]], [['S01', 193.7, 1.742], ['S03', 502.1, 4.515], ['S02', 516.1, 4.641]]], ['network 15', [[44.65, -120.07], [['S00', 46.05, -112.8], ['S01', 42.47, -123.99], ['S02', 38.63, -115.24], ['S03', 45.86, -118.34], ['S04', 39.78, -111.34], ['S05', 46.45, -117.59]]], [['S03', 190.9, 1.717], ['S05', 278.1, 2.501], ['S01', 398.1, 3.58], ['S00', 588.8, 5.295]]], ['network 16', [[38.62, -114.83], [['S00', 44.48, -122.4], ['S01', 39.21, -110.38]]], [['S01', 390.5, 3.512]]], ['network 17', [[40.22, -115.43], [['S00', 34.58, -110.93], ['S01', 32.33, -116.94], ['S02', 42.07, -117.12]]], [['S02', 249.7, 2.245]]], ['network 18', [[36.81, -120.08], [['S00', 45.93, -122.19], ['S01', 42.64, -115.55], ['S02', 44.75, -122.18], ['S03', 41.26, -115.09], ['S04', 43.24, -121.66]]], []], ['network 19', [[41.77, -116.31], [['S00', 37.95, -124.57], ['S01', 45.84, -119.62], ['S02', 42.56, -111.41], ['S03', 40.32, -110.13], ['S04', 47.42, -111.15], ['S05', 31.98, -115.86]]], [['S02', 413.2, 3.716], ['S01', 524.6, 4.718], ['S03', 542.6, 4.88]]]], [['network 9', [[39.63, -120.96], [['S00', 47.23, -111.26], ['S01', 41.57, -124.4], ['S02', 43.29, -122.87], ['S03', 45.0, -116.27], ['S04', 49.12, -110.82], ['S05', 33.21, -123.87]]], [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]]], ['network 16', [[38.62, -114.83], [['S00', 44.48, -122.4], ['S01', 39.21, -110.38]]], [['S01', 390.5, 3.512]]], ['network 21', [[36.65, -117.88], [['S00', 38.12, -115.31], ['S01', 38.66, -112.95], ['S02', 34.34, -114.03]]], [['S00', 279.8, 2.516], ['S02', 432.9, 3.893], ['S01', 488.1, 4.389]]], ['network 22', [[44.58, -121.3], [['S00', 38.09, -120.43], ['S01', 49.5, -111.91], ['S02', 46.12, -110.34], ['S03', 49.31, -118.62], ['S04', 34.6, -110.46]]], [['S03', 563.8, 5.071]]], ['network 23', [[44.25, -117.92], [['S00', 44.39, -122.69], ['S01', 37.18, -114.68], ['S02', 44.85, -124.42], ['S03', 42.91, -119.64]]], [['S03', 203.5, 1.83], ['S00', 379.7, 3.415], ['S02', 519.2, 4.67]]], ['network 24', [[42.12, -121.58], [['S00', 39.06, -115.35], ['S01', 41.41, -121.4]]], [['S01', 80.3, 0.723]]], ['network 25', [[38.77, -114.31], [['S00', 43.94, -110.09], ['S01', 47.99, -124.55], ['S02', 48.6, -124.13], ['S03', 47.11, -121.53]]], []], ['network 26', [[42.47, -114.8], [['S00', 36.7, -111.1], ['S01', 46.83, -118.43], ['S02', 34.65, -112.02]]], [['S01', 563.3, 5.066]]]], [['network 0', [[43.44, -118.77], [['S00', 33.06, -119.2], ['S01', 32.76, -122.81], ['S02', 40.37, -113.11], ['S03', 47.01, -115.45], ['S04', 33.17, -122.81]]], [['S03', 474.4, 4.267], ['S02', 579.4, 5.21]]], ['network 12', [[39.75, -115.38], [['S00', 39.91, -122.96], ['S01', 40.0, -124.22], ['S02', 45.24, -114.12], ['S03', 36.65, -117.11], ['S04', 39.11, -115.83], ['S05', 48.17, -111.51]]], [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]]], ['network 23', [[44.25, -117.92], [['S00', 44.39, -122.69], ['S01', 37.18, -114.68], ['S02', 44.85, -124.42], ['S03', 42.91, -119.64]]], [['S03', 203.5, 1.83], ['S00', 379.7, 3.415], ['S02', 519.2, 4.67]]], ['network 28', [[36.13, -121.64], [['S00', 30.99, -116.87], ['S01', 48.63, -114.1], ['S02', 30.53, -117.85], ['S03', 31.41, -124.62], ['S04', 35.71, -124.61]]], [['S04', 271.5, 2.442], ['S03', 592.6, 5.33]]], ['network 29', [[40.48, -114.48], [['S00', 38.22, -118.13], ['S01', 43.34, -122.26]]], [['S00', 402.0, 3.615]]], ['co-located station', [[40.0, -120.0], [['AAA', 40.0, -120.0], ['BBB', 41.0, -120.0]]], [['AAA', 0.0, 0.0], ['BBB', 111.2, 1.0]]], ['equal distance tie', [[0.0, 0.0], [['ZZZ', 1.0, 0.0], ['AAA', -1.0, 0.0]]], [['AAA', 111.2, 1.0], ['ZZZ', 111.2, 1.0]]], ['east-west line', [[10.0, 20.0], [['E1', 10.0, 23.0], ['W1', 10.0, 17.5]]], [['W1', 273.8, 2.462], ['E1', 328.5, 2.954]]]]]
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 fixtureActualExpectedOutcome
network 0[['S03', 474.4, 0.074], ['S02', 579.4, 0.091]][['S03', 474.4, 4.267], ['S02', 579.4, 5.21]]Failed
network 1[['S00', 296.1, 0.046], ['S02', 355.1, 0.056], ['S01', 497.7, 0.078]][['S00', 296.1, 2.662], ['S02', 355.1, 3.193], ['S01', 497.7, 4.476]]Failed
network 2[['S03', 316.7, 0.05]][['S03', 316.7, 2.848]]Failed
network 3[['S00', 159.5, 0.025]][['S00', 159.5, 1.434]]Failed
network 4[['S04', 450.2, 0.071]][['S04', 450.2, 4.049]]Failed
network 5[['S01', 267.7, 0.042], ['S03', 445.1, 0.07], ['S04', 553.9, 0.087]][['S01', 267.7, 2.408], ['S03', 445.1, 4.003], ['S04', 553.9, 4.981]]Failed
network 6[['S00', 151.6, 0.024], ['S04', 435.9, 0.068], ['S02', 476.0, 0.075], ['S01', 537.5, 0.084]][['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]Failed
network 7[['S01', 420.8, 0.066]][['S01', 420.8, 3.784]]Failed

SHA-256 / 4edc9c385d743d3c8ac50238c74879f23ffb4885dd58ea4958e9d0652d29202f

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(event, stations):
    R = 6371.0
    out = []
    for code, la, lo in stations:
        p1 = math.radians(event[0])
        p2 = math.radians(la)
        dphi = p2 - p1
        dl = math.radians(lo - event[1])
        a = math.sin(dphi / 2) ** 2 + math.cos(p1) * math.cos(p2) * math.sin(dl / 2) ** 2
        d = 2 * R * math.asin(math.sqrt(min(1.0, a)))
        if d <= 600:
            out.append([code, round(d, 1), round(d / 111.0, 3)])
    return sorted(out, key=lambda r: (r[1], r[0]))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['network 0', [[43.44, -118.77], [['S00', 33.06, -119.2], ['S01', 32.76, -122.81], ['S02', 40.37, -113.11], ['S03', 47.01, -115.45], ['S04', 33.17, -122.81]]], [['S03', 474.4, 4.267], ['S02', 579.4, 5.21]]], ['network 1', [[36.34, -120.83], [['S00', 37.53, -117.85], ['S01', 32.11, -122.6], ['S02', 34.89, -117.33], ['S03', 49.21, -120.87], ['S04', 42.08, -112.12]]], [['S00', 296.1, 2.662], ['S02', 355.1, 3.193], ['S01', 497.7, 4.476]]], ['network 2', [[44.56, -117.35], [['S00', 33.87, -122.39], ['S01', 32.58, -119.0], ['S02', 30.34, -116.47], ['S03', 43.88, -121.21], ['S04', 32.47, -111.54]]], [['S03', 316.7, 2.848]]], ['network 3', [[37.38, -120.81], [['S00', 37.99, -119.17], ['S01', 44.87, -121.53], ['S02', 36.92, -112.06], ['S03', 45.59, -124.41], ['S04', 48.41, -124.22], ['S05', 45.33, -114.43]]], [['S00', 159.5, 1.434]]], ['network 4', [[37.36, -114.17], [['S00', 43.21, -115.97], ['S01', 45.47, -113.6], ['S02', 43.88, -123.02], ['S03', 33.26, -123.35], ['S04', 41.04, -116.35], ['S05', 41.29, -123.64]]], [['S04', 450.2, 4.049]]], ['network 5', [[41.23, -114.32], [['S00', 48.44, -112.36], ['S01', 39.92, -111.66], ['S02', 31.63, -118.69], ['S03', 44.86, -116.63], ['S04', 45.92, -112.0], ['S05', 31.93, -116.6]]], [['S01', 267.7, 2.408], ['S03', 445.1, 4.003], ['S04', 553.9, 4.981]]], ['network 6', [[42.93, -114.98], [['S00', 41.78, -113.99], ['S01', 46.04, -120.17], ['S02', 39.37, -111.82], ['S03', 48.06, -111.76], ['S04', 45.02, -119.59]]], [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]], ['network 7', [[38.24, -116.31], [['S00', 44.82, -111.25], ['S01', 41.96, -117.22], ['S02', 45.77, -122.79]]], [['S01', 420.8, 3.784]]]], [['network 3', [[37.38, -120.81], [['S00', 37.99, -119.17], ['S01', 44.87, -121.53], ['S02', 36.92, -112.06], ['S03', 45.59, -124.41], ['S04', 48.41, -124.22], ['S05', 45.33, -114.43]]], [['S00', 159.5, 1.434]]], ['network 6', [[42.93, -114.98], [['S00', 41.78, -113.99], ['S01', 46.04, -120.17], ['S02', 39.37, -111.82], ['S03', 48.06, -111.76], ['S04', 45.02, -119.59]]], [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]], ['network 7', [[38.24, -116.31], [['S00', 44.82, -111.25], ['S01', 41.96, -117.22], ['S02', 45.77, -122.79]]], [['S01', 420.8, 3.784]]], ['network 8', [[37.27, -120.03], [['S00', 32.27, -124.77], ['S01', 36.2, -116.4], ['S02', 46.93, -122.1], ['S03', 48.81, -114.9]]], [['S01', 344.6, 3.099]]], ['network 9', [[39.63, -120.96], [['S00', 47.23, -111.26], ['S01', 41.57, -124.4], ['S02', 43.29, -122.87], ['S03', 45.0, -116.27], ['S04', 49.12, -110.82], ['S05', 33.21, -123.87]]], [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]]], ['network 10', [[40.71, -119.76], [['S00', 42.0, -113.32], ['S01', 47.1, -113.65], ['S02', 40.97, -110.91], ['S03', 38.42, -122.78], ['S04', 40.45, -114.89]]], [['S03', 363.1, 3.265], ['S04', 412.2, 3.707], ['S00', 556.2, 5.002]]], ['network 11', [[39.52, -114.53], [['S00', 35.96, -123.88], ['S01', 41.26, -111.67], ['S02', 46.06, -119.82], ['S03', 38.64, -110.68], ['S04', 43.59, -119.31]]], [['S01', 310.0, 2.788], ['S03', 346.4, 3.115]]], ['network 12', [[39.75, -115.38], [['S00', 39.91, -122.96], ['S01', 40.0, -124.22], ['S02', 45.24, -114.12], ['S03', 36.65, -117.11], ['S04', 39.11, -115.83], ['S05', 48.17, -111.51]]], [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]]]], [['network 6', [[42.93, -114.98], [['S00', 41.78, -113.99], ['S01', 46.04, -120.17], ['S02', 39.37, -111.82], ['S03', 48.06, -111.76], ['S04', 45.02, -119.59]]], [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]], ['network 11', [[39.52, -114.53], [['S00', 35.96, -123.88], ['S01', 41.26, -111.67], ['S02', 46.06, -119.82], ['S03', 38.64, -110.68], ['S04', 43.59, -119.31]]], [['S01', 310.0, 2.788], ['S03', 346.4, 3.115]]], ['network 14', [[36.07, -121.76], [['S00', 47.41, -116.96], ['S01', 36.95, -119.89], ['S02', 31.53, -122.92], ['S03', 32.44, -118.51], ['S04', 35.33, -113.8]]], [['S01', 193.7, 1.742], ['S03', 502.1, 4.515], ['S02', 516.1, 4.641]]], ['network 15', [[44.65, -120.07], [['S00', 46.05, -112.8], ['S01', 42.47, -123.99], ['S02', 38.63, -115.24], ['S03', 45.86, -118.34], ['S04', 39.78, -111.34], ['S05', 46.45, -117.59]]], [['S03', 190.9, 1.717], ['S05', 278.1, 2.501], ['S01', 398.1, 3.58], ['S00', 588.8, 5.295]]], ['network 16', [[38.62, -114.83], [['S00', 44.48, -122.4], ['S01', 39.21, -110.38]]], [['S01', 390.5, 3.512]]], ['network 17', [[40.22, -115.43], [['S00', 34.58, -110.93], ['S01', 32.33, -116.94], ['S02', 42.07, -117.12]]], [['S02', 249.7, 2.245]]], ['network 18', [[36.81, -120.08], [['S00', 45.93, -122.19], ['S01', 42.64, -115.55], ['S02', 44.75, -122.18], ['S03', 41.26, -115.09], ['S04', 43.24, -121.66]]], []], ['network 19', [[41.77, -116.31], [['S00', 37.95, -124.57], ['S01', 45.84, -119.62], ['S02', 42.56, -111.41], ['S03', 40.32, -110.13], ['S04', 47.42, -111.15], ['S05', 31.98, -115.86]]], [['S02', 413.2, 3.716], ['S01', 524.6, 4.718], ['S03', 542.6, 4.88]]]], [['network 9', [[39.63, -120.96], [['S00', 47.23, -111.26], ['S01', 41.57, -124.4], ['S02', 43.29, -122.87], ['S03', 45.0, -116.27], ['S04', 49.12, -110.82], ['S05', 33.21, -123.87]]], [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]]], ['network 16', [[38.62, -114.83], [['S00', 44.48, -122.4], ['S01', 39.21, -110.38]]], [['S01', 390.5, 3.512]]], ['network 21', [[36.65, -117.88], [['S00', 38.12, -115.31], ['S01', 38.66, -112.95], ['S02', 34.34, -114.03]]], [['S00', 279.8, 2.516], ['S02', 432.9, 3.893], ['S01', 488.1, 4.389]]], ['network 22', [[44.58, -121.3], [['S00', 38.09, -120.43], ['S01', 49.5, -111.91], ['S02', 46.12, -110.34], ['S03', 49.31, -118.62], ['S04', 34.6, -110.46]]], [['S03', 563.8, 5.071]]], ['network 23', [[44.25, -117.92], [['S00', 44.39, -122.69], ['S01', 37.18, -114.68], ['S02', 44.85, -124.42], ['S03', 42.91, -119.64]]], [['S03', 203.5, 1.83], ['S00', 379.7, 3.415], ['S02', 519.2, 4.67]]], ['network 24', [[42.12, -121.58], [['S00', 39.06, -115.35], ['S01', 41.41, -121.4]]], [['S01', 80.3, 0.723]]], ['network 25', [[38.77, -114.31], [['S00', 43.94, -110.09], ['S01', 47.99, -124.55], ['S02', 48.6, -124.13], ['S03', 47.11, -121.53]]], []], ['network 26', [[42.47, -114.8], [['S00', 36.7, -111.1], ['S01', 46.83, -118.43], ['S02', 34.65, -112.02]]], [['S01', 563.3, 5.066]]]], [['network 0', [[43.44, -118.77], [['S00', 33.06, -119.2], ['S01', 32.76, -122.81], ['S02', 40.37, -113.11], ['S03', 47.01, -115.45], ['S04', 33.17, -122.81]]], [['S03', 474.4, 4.267], ['S02', 579.4, 5.21]]], ['network 12', [[39.75, -115.38], [['S00', 39.91, -122.96], ['S01', 40.0, -124.22], ['S02', 45.24, -114.12], ['S03', 36.65, -117.11], ['S04', 39.11, -115.83], ['S05', 48.17, -111.51]]], [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]]], ['network 23', [[44.25, -117.92], [['S00', 44.39, -122.69], ['S01', 37.18, -114.68], ['S02', 44.85, -124.42], ['S03', 42.91, -119.64]]], [['S03', 203.5, 1.83], ['S00', 379.7, 3.415], ['S02', 519.2, 4.67]]], ['network 28', [[36.13, -121.64], [['S00', 30.99, -116.87], ['S01', 48.63, -114.1], ['S02', 30.53, -117.85], ['S03', 31.41, -124.62], ['S04', 35.71, -124.61]]], [['S04', 271.5, 2.442], ['S03', 592.6, 5.33]]], ['network 29', [[40.48, -114.48], [['S00', 38.22, -118.13], ['S01', 43.34, -122.26]]], [['S00', 402.0, 3.615]]], ['co-located station', [[40.0, -120.0], [['AAA', 40.0, -120.0], ['BBB', 41.0, -120.0]]], [['AAA', 0.0, 0.0], ['BBB', 111.2, 1.0]]], ['equal distance tie', [[0.0, 0.0], [['ZZZ', 1.0, 0.0], ['AAA', -1.0, 0.0]]], [['AAA', 111.2, 1.0], ['ZZZ', 111.2, 1.0]]], ['east-west line', [[10.0, 20.0], [['E1', 10.0, 23.0], ['W1', 10.0, 17.5]]], [['W1', 273.8, 2.462], ['E1', 328.5, 2.954]]]]]
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 fixtureActualExpectedOutcome
network 0[['S03', 474.4, 4.274], ['S02', 579.4, 5.22]][['S03', 474.4, 4.267], ['S02', 579.4, 5.21]]Failed
network 1[['S00', 296.1, 2.667], ['S02', 355.1, 3.199], ['S01', 497.7, 4.484]][['S00', 296.1, 2.662], ['S02', 355.1, 3.193], ['S01', 497.7, 4.476]]Failed
network 2[['S03', 316.7, 2.853]][['S03', 316.7, 2.848]]Failed
network 3[['S00', 159.5, 1.437]][['S00', 159.5, 1.434]]Failed
network 4[['S04', 450.2, 4.056]][['S04', 450.2, 4.049]]Failed
network 5[['S01', 267.7, 2.412], ['S03', 445.1, 4.01], ['S04', 553.9, 4.99]][['S01', 267.7, 2.408], ['S03', 445.1, 4.003], ['S04', 553.9, 4.981]]Failed
network 6[['S00', 151.6, 1.365], ['S04', 435.9, 3.927], ['S02', 476.0, 4.289], ['S01', 537.5, 4.842]][['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]Failed
network 7[['S01', 420.8, 3.791]][['S01', 420.8, 3.784]]Failed

SHA-256 / 41100796e2e9aed26e5392048fd0f7ebd63ff667d2d217d12985cb2cb400cb5d

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(event, stations):
    R = 6371.0
    out = []
    for code, la, lo in stations:
        p1 = math.radians(event[0])
        p2 = math.radians(la)
        dphi = p2 - p1
        dl = math.radians(lo - event[1])
        a = math.sin(dphi / 2) ** 2 + math.cos(p1) * math.cos(p2) * math.sin(dl / 2) ** 2
        d = 2 * R * math.asin(math.sqrt(min(1.0, a)))
        if d <= 600:
            out.append([code, round(d, 1), round(math.degrees(d / R), 3)])
    return sorted(out, key=lambda r: (r[1], r[0]))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['network 0', [[43.44, -118.77], [['S00', 33.06, -119.2], ['S01', 32.76, -122.81], ['S02', 40.37, -113.11], ['S03', 47.01, -115.45], ['S04', 33.17, -122.81]]], [['S03', 474.4, 4.267], ['S02', 579.4, 5.21]]], ['network 1', [[36.34, -120.83], [['S00', 37.53, -117.85], ['S01', 32.11, -122.6], ['S02', 34.89, -117.33], ['S03', 49.21, -120.87], ['S04', 42.08, -112.12]]], [['S00', 296.1, 2.662], ['S02', 355.1, 3.193], ['S01', 497.7, 4.476]]], ['network 2', [[44.56, -117.35], [['S00', 33.87, -122.39], ['S01', 32.58, -119.0], ['S02', 30.34, -116.47], ['S03', 43.88, -121.21], ['S04', 32.47, -111.54]]], [['S03', 316.7, 2.848]]], ['network 3', [[37.38, -120.81], [['S00', 37.99, -119.17], ['S01', 44.87, -121.53], ['S02', 36.92, -112.06], ['S03', 45.59, -124.41], ['S04', 48.41, -124.22], ['S05', 45.33, -114.43]]], [['S00', 159.5, 1.434]]], ['network 4', [[37.36, -114.17], [['S00', 43.21, -115.97], ['S01', 45.47, -113.6], ['S02', 43.88, -123.02], ['S03', 33.26, -123.35], ['S04', 41.04, -116.35], ['S05', 41.29, -123.64]]], [['S04', 450.2, 4.049]]], ['network 5', [[41.23, -114.32], [['S00', 48.44, -112.36], ['S01', 39.92, -111.66], ['S02', 31.63, -118.69], ['S03', 44.86, -116.63], ['S04', 45.92, -112.0], ['S05', 31.93, -116.6]]], [['S01', 267.7, 2.408], ['S03', 445.1, 4.003], ['S04', 553.9, 4.981]]], ['network 6', [[42.93, -114.98], [['S00', 41.78, -113.99], ['S01', 46.04, -120.17], ['S02', 39.37, -111.82], ['S03', 48.06, -111.76], ['S04', 45.02, -119.59]]], [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]], ['network 7', [[38.24, -116.31], [['S00', 44.82, -111.25], ['S01', 41.96, -117.22], ['S02', 45.77, -122.79]]], [['S01', 420.8, 3.784]]]], [['network 3', [[37.38, -120.81], [['S00', 37.99, -119.17], ['S01', 44.87, -121.53], ['S02', 36.92, -112.06], ['S03', 45.59, -124.41], ['S04', 48.41, -124.22], ['S05', 45.33, -114.43]]], [['S00', 159.5, 1.434]]], ['network 6', [[42.93, -114.98], [['S00', 41.78, -113.99], ['S01', 46.04, -120.17], ['S02', 39.37, -111.82], ['S03', 48.06, -111.76], ['S04', 45.02, -119.59]]], [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]], ['network 7', [[38.24, -116.31], [['S00', 44.82, -111.25], ['S01', 41.96, -117.22], ['S02', 45.77, -122.79]]], [['S01', 420.8, 3.784]]], ['network 8', [[37.27, -120.03], [['S00', 32.27, -124.77], ['S01', 36.2, -116.4], ['S02', 46.93, -122.1], ['S03', 48.81, -114.9]]], [['S01', 344.6, 3.099]]], ['network 9', [[39.63, -120.96], [['S00', 47.23, -111.26], ['S01', 41.57, -124.4], ['S02', 43.29, -122.87], ['S03', 45.0, -116.27], ['S04', 49.12, -110.82], ['S05', 33.21, -123.87]]], [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]]], ['network 10', [[40.71, -119.76], [['S00', 42.0, -113.32], ['S01', 47.1, -113.65], ['S02', 40.97, -110.91], ['S03', 38.42, -122.78], ['S04', 40.45, -114.89]]], [['S03', 363.1, 3.265], ['S04', 412.2, 3.707], ['S00', 556.2, 5.002]]], ['network 11', [[39.52, -114.53], [['S00', 35.96, -123.88], ['S01', 41.26, -111.67], ['S02', 46.06, -119.82], ['S03', 38.64, -110.68], ['S04', 43.59, -119.31]]], [['S01', 310.0, 2.788], ['S03', 346.4, 3.115]]], ['network 12', [[39.75, -115.38], [['S00', 39.91, -122.96], ['S01', 40.0, -124.22], ['S02', 45.24, -114.12], ['S03', 36.65, -117.11], ['S04', 39.11, -115.83], ['S05', 48.17, -111.51]]], [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]]]], [['network 6', [[42.93, -114.98], [['S00', 41.78, -113.99], ['S01', 46.04, -120.17], ['S02', 39.37, -111.82], ['S03', 48.06, -111.76], ['S04', 45.02, -119.59]]], [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]], ['network 11', [[39.52, -114.53], [['S00', 35.96, -123.88], ['S01', 41.26, -111.67], ['S02', 46.06, -119.82], ['S03', 38.64, -110.68], ['S04', 43.59, -119.31]]], [['S01', 310.0, 2.788], ['S03', 346.4, 3.115]]], ['network 14', [[36.07, -121.76], [['S00', 47.41, -116.96], ['S01', 36.95, -119.89], ['S02', 31.53, -122.92], ['S03', 32.44, -118.51], ['S04', 35.33, -113.8]]], [['S01', 193.7, 1.742], ['S03', 502.1, 4.515], ['S02', 516.1, 4.641]]], ['network 15', [[44.65, -120.07], [['S00', 46.05, -112.8], ['S01', 42.47, -123.99], ['S02', 38.63, -115.24], ['S03', 45.86, -118.34], ['S04', 39.78, -111.34], ['S05', 46.45, -117.59]]], [['S03', 190.9, 1.717], ['S05', 278.1, 2.501], ['S01', 398.1, 3.58], ['S00', 588.8, 5.295]]], ['network 16', [[38.62, -114.83], [['S00', 44.48, -122.4], ['S01', 39.21, -110.38]]], [['S01', 390.5, 3.512]]], ['network 17', [[40.22, -115.43], [['S00', 34.58, -110.93], ['S01', 32.33, -116.94], ['S02', 42.07, -117.12]]], [['S02', 249.7, 2.245]]], ['network 18', [[36.81, -120.08], [['S00', 45.93, -122.19], ['S01', 42.64, -115.55], ['S02', 44.75, -122.18], ['S03', 41.26, -115.09], ['S04', 43.24, -121.66]]], []], ['network 19', [[41.77, -116.31], [['S00', 37.95, -124.57], ['S01', 45.84, -119.62], ['S02', 42.56, -111.41], ['S03', 40.32, -110.13], ['S04', 47.42, -111.15], ['S05', 31.98, -115.86]]], [['S02', 413.2, 3.716], ['S01', 524.6, 4.718], ['S03', 542.6, 4.88]]]], [['network 9', [[39.63, -120.96], [['S00', 47.23, -111.26], ['S01', 41.57, -124.4], ['S02', 43.29, -122.87], ['S03', 45.0, -116.27], ['S04', 49.12, -110.82], ['S05', 33.21, -123.87]]], [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]]], ['network 16', [[38.62, -114.83], [['S00', 44.48, -122.4], ['S01', 39.21, -110.38]]], [['S01', 390.5, 3.512]]], ['network 21', [[36.65, -117.88], [['S00', 38.12, -115.31], ['S01', 38.66, -112.95], ['S02', 34.34, -114.03]]], [['S00', 279.8, 2.516], ['S02', 432.9, 3.893], ['S01', 488.1, 4.389]]], ['network 22', [[44.58, -121.3], [['S00', 38.09, -120.43], ['S01', 49.5, -111.91], ['S02', 46.12, -110.34], ['S03', 49.31, -118.62], ['S04', 34.6, -110.46]]], [['S03', 563.8, 5.071]]], ['network 23', [[44.25, -117.92], [['S00', 44.39, -122.69], ['S01', 37.18, -114.68], ['S02', 44.85, -124.42], ['S03', 42.91, -119.64]]], [['S03', 203.5, 1.83], ['S00', 379.7, 3.415], ['S02', 519.2, 4.67]]], ['network 24', [[42.12, -121.58], [['S00', 39.06, -115.35], ['S01', 41.41, -121.4]]], [['S01', 80.3, 0.723]]], ['network 25', [[38.77, -114.31], [['S00', 43.94, -110.09], ['S01', 47.99, -124.55], ['S02', 48.6, -124.13], ['S03', 47.11, -121.53]]], []], ['network 26', [[42.47, -114.8], [['S00', 36.7, -111.1], ['S01', 46.83, -118.43], ['S02', 34.65, -112.02]]], [['S01', 563.3, 5.066]]]], [['network 0', [[43.44, -118.77], [['S00', 33.06, -119.2], ['S01', 32.76, -122.81], ['S02', 40.37, -113.11], ['S03', 47.01, -115.45], ['S04', 33.17, -122.81]]], [['S03', 474.4, 4.267], ['S02', 579.4, 5.21]]], ['network 12', [[39.75, -115.38], [['S00', 39.91, -122.96], ['S01', 40.0, -124.22], ['S02', 45.24, -114.12], ['S03', 36.65, -117.11], ['S04', 39.11, -115.83], ['S05', 48.17, -111.51]]], [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]]], ['network 23', [[44.25, -117.92], [['S00', 44.39, -122.69], ['S01', 37.18, -114.68], ['S02', 44.85, -124.42], ['S03', 42.91, -119.64]]], [['S03', 203.5, 1.83], ['S00', 379.7, 3.415], ['S02', 519.2, 4.67]]], ['network 28', [[36.13, -121.64], [['S00', 30.99, -116.87], ['S01', 48.63, -114.1], ['S02', 30.53, -117.85], ['S03', 31.41, -124.62], ['S04', 35.71, -124.61]]], [['S04', 271.5, 2.442], ['S03', 592.6, 5.33]]], ['network 29', [[40.48, -114.48], [['S00', 38.22, -118.13], ['S01', 43.34, -122.26]]], [['S00', 402.0, 3.615]]], ['co-located station', [[40.0, -120.0], [['AAA', 40.0, -120.0], ['BBB', 41.0, -120.0]]], [['AAA', 0.0, 0.0], ['BBB', 111.2, 1.0]]], ['equal distance tie', [[0.0, 0.0], [['ZZZ', 1.0, 0.0], ['AAA', -1.0, 0.0]]], [['AAA', 111.2, 1.0], ['ZZZ', 111.2, 1.0]]], ['east-west line', [[10.0, 20.0], [['E1', 10.0, 23.0], ['W1', 10.0, 17.5]]], [['W1', 273.8, 2.462], ['E1', 328.5, 2.954]]]]]
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 fixtureActualExpectedOutcome
network 0[['S03', 474.4, 4.267], ['S02', 579.4, 5.21]][['S03', 474.4, 4.267], ['S02', 579.4, 5.21]]Passed
network 1[['S00', 296.1, 2.662], ['S02', 355.1, 3.193], ['S01', 497.7, 4.476]][['S00', 296.1, 2.662], ['S02', 355.1, 3.193], ['S01', 497.7, 4.476]]Passed
network 2[['S03', 316.7, 2.848]][['S03', 316.7, 2.848]]Passed
network 3[['S00', 159.5, 1.434]][['S00', 159.5, 1.434]]Passed
network 4[['S04', 450.2, 4.049]][['S04', 450.2, 4.049]]Passed
network 5[['S01', 267.7, 2.408], ['S03', 445.1, 4.003], ['S04', 553.9, 4.981]][['S01', 267.7, 2.408], ['S03', 445.1, 4.003], ['S04', 553.9, 4.981]]Passed
network 6[['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]][['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]]Passed
network 7[['S01', 420.8, 3.784]][['S01', 420.8, 3.784]]Passed

SHA-256 / 74402b90458512b1d831c3bd66cdf244e40d23664c1946c6b1c2545661db7278

Verification & scope

Stipulated deterministic teaching model of a seismological magnitude procedure; constants and tables are fixed by the contract and no claim of agency or standards conformance is made. 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:30.497030+00:00.

Case digest / 7f1d15c76d8f9e9e873c406f0ad5acbdd359132e205554e18060e9f126de5adb