FA-71531 / Seismic magnitude estimation / Open access
Epicentral distance and station selection: latitude cosine units · case 01
East-west distances are wildly wrong while north-south ones are fine.
ROOT CAUSE
The cosine factors are evaluated on latitudes in degrees.
VERIFIED REPAIR
Use cos of the latitudes in radians.
Unsuccessful approach: cos(dphi) is not the product of the latitude cosines.
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(event[0]) * math.cos(la) * 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 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 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 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 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 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 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 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 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 20', [[44.06, -114.59], [['S00', 39.32, -110.59], ['S01', 36.71, -114.59], ['S02', 38.77, -120.99], ['S03', 31.6, -120.79]]], []]], [['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 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 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]]], ['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]]]], [['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 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 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 16', [[38.62, -114.83], [['S00', 44.48, -122.4], ['S01', 39.21, -110.38]]], [['S01', 390.5, 3.512]]]], [['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 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 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 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 20', [[44.06, -114.59], [['S00', 39.32, -110.59], ['S01', 36.71, -114.59], ['S02', 38.77, -120.99], ['S03', 31.6, -120.79]]], []], ['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]]]]]
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 |
|---|---|---|---|
| network 2 | [['S03', 399.0, 3.589]] | [['S03', 316.7, 2.848]] | Failed |
| network 3 | [['S00', 186.7, 1.679]] | [['S00', 159.5, 1.434]] | Failed |
| network 5 | [['S01', 265.0, 2.383], ['S03', 352.0, 3.166], ['S04', 542.3, 4.877]] | [['S01', 267.7, 2.408], ['S03', 445.1, 4.003], ['S04', 553.9, 4.981]] | Failed |
| network 6 | [['S00', 113.2, 1.018], ['S01', 205.9, 1.852], ['S04', 346.7, 3.118], ['S02', 388.1, 3.49], ['S03', 536.4, 4.824]] | [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]] | Failed |
| network 7 | [['S01', 409.0, 3.678]] | [['S01', 420.8, 3.784]] | Failed |
| network 8 | [['S01', 157.4, 1.415]] | [['S01', 344.6, 3.099]] | Failed |
| network 9 | [['S01', 291.5, 2.622], ['S02', 391.6, 3.522], ['S03', 553.3, 4.976]] | [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]] | Failed |
| network 12 | [['S04', 69.9, 0.628], ['S03', 332.1, 2.987], ['S00', 442.8, 3.982], ['S01', 545.9, 4.909]] | [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]] | Failed |
SHA-256 / c6967781dfce66e4d08136d7f10423c2e1e60dd6255e13c72901c3e82851b34c
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(dphi) * 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 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 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 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 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 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 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 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 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 20', [[44.06, -114.59], [['S00', 39.32, -110.59], ['S01', 36.71, -114.59], ['S02', 38.77, -120.99], ['S03', 31.6, -120.79]]], []]], [['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 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 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]]], ['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]]]], [['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 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 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 16', [[38.62, -114.83], [['S00', 44.48, -122.4], ['S01', 39.21, -110.38]]], [['S01', 390.5, 3.512]]]], [['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 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 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 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 20', [[44.06, -114.59], [['S00', 39.32, -110.59], ['S01', 36.71, -114.59], ['S02', 38.77, -120.99], ['S03', 31.6, -120.79]]], []], ['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]]]]]
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 |
|---|---|---|---|
| network 2 | [['S03', 435.8, 3.919]] | [['S03', 316.7, 2.848]] | Failed |
| network 3 | [['S00', 194.6, 1.75]] | [['S00', 159.5, 1.434]] | Failed |
| network 5 | [['S01', 329.7, 2.965], ['S03', 478.3, 4.302], ['S04', 581.7, 5.231]] | [['S01', 267.7, 2.408], ['S03', 445.1, 4.003], ['S04', 553.9, 4.981]] | Failed |
| network 6 | [['S00', 168.7, 1.517], ['S02', 529.2, 4.759], ['S04', 562.7, 5.061]] | [['S00', 151.6, 1.363], ['S04', 435.9, 3.92], ['S02', 476.0, 4.281], ['S01', 537.5, 4.834]] | Failed |
| network 7 | [['S01', 425.8, 3.83]] | [['S01', 420.8, 3.784]] | Failed |
| network 8 | [['S01', 420.8, 3.784]] | [['S01', 344.6, 3.099]] | Failed |
| network 9 | [['S01', 439.1, 3.949], ['S02', 459.0, 4.128]] | [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]] | Failed |
| network 12 | [['S04', 87.0, 0.782], ['S03', 394.7, 3.55]] | [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]] | Failed |
SHA-256 / a7b69b7dabae66fae11783498474977290ea25a6353a0f6047976dd64b17b0a0
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 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 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 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 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 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 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 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 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 20', [[44.06, -114.59], [['S00', 39.32, -110.59], ['S01', 36.71, -114.59], ['S02', 38.77, -120.99], ['S03', 31.6, -120.79]]], []]], [['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 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 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]]], ['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]]]], [['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 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 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 16', [[38.62, -114.83], [['S00', 44.48, -122.4], ['S01', 39.21, -110.38]]], [['S01', 390.5, 3.512]]]], [['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 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 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 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 20', [[44.06, -114.59], [['S00', 39.32, -110.59], ['S01', 36.71, -114.59], ['S02', 38.77, -120.99], ['S03', 31.6, -120.79]]], []], ['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]]]]]
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 |
|---|---|---|---|
| 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 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 |
| network 8 | [['S01', 344.6, 3.099]] | [['S01', 344.6, 3.099]] | Passed |
| network 9 | [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]] | [['S01', 361.7, 3.253], ['S02', 437.0, 3.93]] | Passed |
| network 12 | [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]] | [['S04', 81.0, 0.728], ['S03', 376.4, 3.385]] | Passed |
SHA-256 / af84679d1d589ca3f751631656c0044ce6529034edcc9ef5a192ca2745d773c3
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.454949+00:00.
Case digest / c5b39ce8ea004a90f7f760ad7d5402b32a458e922c6d7e5d59917981cef7c9c3