FAILURE MAP
← Case archive

FA-71781 / Seismic magnitude estimation / Open access

Abe tsunami magnitude: distance term · case 01

Mt is about two units low.

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

ROOT CAUSE

Distance is converted to degrees before the logarithm although the constant assumes km.

VERIFIED REPAIR

Use log10 of distance in km.

Unsuccessful approach: Using ln(distance) inflates the distance term.

Case contract

gauges are [crest-to-trough double amplitude m, distance km]. Only gauges with distance >= 100 km are used. H = double amplitude / 2; Mt_i = log10 H + log10 distance + 5.8. Return [mean rounded 0.01, gauges used] or None.

Why this case matters

Tsunami magnitude compares tsunami size with seismic magnitude to flag tsunami earthquakes.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(gauges):
    vals = []
    for dbl, dist in gauges:
        if dist < 100 or dbl <= 0:
            continue
        h = dbl / 2.0
        vals.append(math.log10(h) + math.log10(dist / 111.19) + 5.8)
    if not vals:
        return None
    return [round(sum(vals) / len(vals), 2), len(vals)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tide gauges 0', [[[2.6, 100], [1.0, 50], [0.4, 99], [0.1, 99]]], [7.91, 1]], ['tide gauges 1', [[[0.4, 101], [0.4, 99], [8.0, 101]]], [7.76, 2]], ['tide gauges 2', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 3', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 4', [[[1.0, 101], [2.6, 50], [0.4, 800], [0.1, 101], [0.4, 100]]], [7.28, 4]], ['tide gauges 5', [[[2.6, 3000], [1.0, 101]]], [8.45, 2]], ['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]]], [['tide gauges 3', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]], ['tide gauges 8', [[[0.1, 50], [1.0, 99], [1.0, 99], [1.0, 3000]]], [8.98, 1]], ['tide gauges 9', [[[1.0, 100], [1.0, 800], [0.4, 99], [8.0, 101], [2.6, 100]]], [8.06, 4]], ['tide gauges 10', [[[8.0, 800], [8.0, 800], [8.0, 101]]], [9.01, 3]], ['tide gauges 11', [[[2.6, 100], [8.0, 100]]], [8.16, 2]], ['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]]], [['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 11', [[[2.6, 100], [8.0, 100]]], [8.16, 2]], ['tide gauges 14', [[[0.1, 101], [2.6, 101]]], [7.21, 2]], ['tide gauges 15', [[[0.4, 50], [2.6, 800], [2.6, 50]]], [8.82, 1]], ['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 17', [[[0.1, 99], [1.0, 800], [1.0, 100], [8.0, 101]]], [8.1, 3]], ['tide gauges 18', [[[1.0, 50]]], None], ['tide gauges 19', [[[0.1, 50]]], None]], [['tide gauges 9', [[[1.0, 100], [1.0, 800], [0.4, 99], [8.0, 101], [2.6, 100]]], [8.06, 4]], ['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 21', [[[1.0, 50], [8.0, 3000], [2.6, 101]]], [8.9, 2]], ['tide gauges 22', [[[2.6, 101]]], [7.92, 1]], ['tide gauges 23', [[[0.1, 50], [1.0, 800], [1.0, 50], [0.4, 100]]], [7.75, 2]], ['tide gauges 24', [[[2.6, 100], [0.1, 100], [1.0, 101], [8.0, 101], [1.0, 99]]], [7.58, 4]], ['tide gauges 25', [[[2.6, 101], [0.4, 800], [8.0, 100], [2.6, 99], [0.1, 101]]], [7.71, 4]], ['tide gauges 26', [[[8.0, 101], [0.1, 800], [2.6, 99], [0.1, 99]]], [7.9, 2]]], [['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]], ['tide gauges 23', [[[0.1, 50], [1.0, 800], [1.0, 50], [0.4, 100]]], [7.75, 2]], ['tide gauges 28', [[[8.0, 101], [1.0, 99]]], [8.41, 1]], ['tide gauges 29', [[[0.4, 101], [0.1, 99], [2.6, 99], [0.1, 100], [0.1, 50]]], [6.8, 2]], ['tide gauges 30', [[[0.1, 99], [2.6, 3000], [0.1, 3000]]], [8.68, 2]], ['tide gauges 31', [[[2.6, 3000], [0.1, 3000], [8.0, 800]]], [8.89, 3]], ['tide gauges 32', [[[2.6, 800], [1.0, 99]]], [8.82, 1]], ['tide gauges 33', [[[1.0, 800]]], [8.4, 1]]]]
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
tide gauges 0[5.87, 1][7.91, 1]Failed
tide gauges 1[5.71, 2][7.76, 2]Failed
tide gauges 2[4.45, 1][6.5, 1]Failed
tide gauges 3[4.45, 1][6.5, 1]Failed
tide gauges 4[5.23, 4][7.28, 4]Failed
tide gauges 5[6.4, 2][8.45, 2]Failed
tide gauges 6[6.93, 1][8.98, 1]Failed
tide gauges 7[6.06, 3][8.1, 3]Failed

SHA-256 / 391532cfc9fd71b37ffbb3e6dc1417052e89239552b1e3ed5e9136f9b5d567f4

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(gauges):
    vals = []
    for dbl, dist in gauges:
        if dist < 100 or dbl <= 0:
            continue
        h = dbl / 2.0
        vals.append(math.log10(h) + math.log(dist) + 5.8)
    if not vals:
        return None
    return [round(sum(vals) / len(vals), 2), len(vals)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tide gauges 0', [[[2.6, 100], [1.0, 50], [0.4, 99], [0.1, 99]]], [7.91, 1]], ['tide gauges 1', [[[0.4, 101], [0.4, 99], [8.0, 101]]], [7.76, 2]], ['tide gauges 2', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 3', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 4', [[[1.0, 101], [2.6, 50], [0.4, 800], [0.1, 101], [0.4, 100]]], [7.28, 4]], ['tide gauges 5', [[[2.6, 3000], [1.0, 101]]], [8.45, 2]], ['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]]], [['tide gauges 3', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]], ['tide gauges 8', [[[0.1, 50], [1.0, 99], [1.0, 99], [1.0, 3000]]], [8.98, 1]], ['tide gauges 9', [[[1.0, 100], [1.0, 800], [0.4, 99], [8.0, 101], [2.6, 100]]], [8.06, 4]], ['tide gauges 10', [[[8.0, 800], [8.0, 800], [8.0, 101]]], [9.01, 3]], ['tide gauges 11', [[[2.6, 100], [8.0, 100]]], [8.16, 2]], ['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]]], [['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 11', [[[2.6, 100], [8.0, 100]]], [8.16, 2]], ['tide gauges 14', [[[0.1, 101], [2.6, 101]]], [7.21, 2]], ['tide gauges 15', [[[0.4, 50], [2.6, 800], [2.6, 50]]], [8.82, 1]], ['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 17', [[[0.1, 99], [1.0, 800], [1.0, 100], [8.0, 101]]], [8.1, 3]], ['tide gauges 18', [[[1.0, 50]]], None], ['tide gauges 19', [[[0.1, 50]]], None]], [['tide gauges 9', [[[1.0, 100], [1.0, 800], [0.4, 99], [8.0, 101], [2.6, 100]]], [8.06, 4]], ['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 21', [[[1.0, 50], [8.0, 3000], [2.6, 101]]], [8.9, 2]], ['tide gauges 22', [[[2.6, 101]]], [7.92, 1]], ['tide gauges 23', [[[0.1, 50], [1.0, 800], [1.0, 50], [0.4, 100]]], [7.75, 2]], ['tide gauges 24', [[[2.6, 100], [0.1, 100], [1.0, 101], [8.0, 101], [1.0, 99]]], [7.58, 4]], ['tide gauges 25', [[[2.6, 101], [0.4, 800], [8.0, 100], [2.6, 99], [0.1, 101]]], [7.71, 4]], ['tide gauges 26', [[[8.0, 101], [0.1, 800], [2.6, 99], [0.1, 99]]], [7.9, 2]]], [['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]], ['tide gauges 23', [[[0.1, 50], [1.0, 800], [1.0, 50], [0.4, 100]]], [7.75, 2]], ['tide gauges 28', [[[8.0, 101], [1.0, 99]]], [8.41, 1]], ['tide gauges 29', [[[0.4, 101], [0.1, 99], [2.6, 99], [0.1, 100], [0.1, 50]]], [6.8, 2]], ['tide gauges 30', [[[0.1, 99], [2.6, 3000], [0.1, 3000]]], [8.68, 2]], ['tide gauges 31', [[[2.6, 3000], [0.1, 3000], [8.0, 800]]], [8.89, 3]], ['tide gauges 32', [[[2.6, 800], [1.0, 99]]], [8.82, 1]], ['tide gauges 33', [[[1.0, 800]]], [8.4, 1]]]]
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
tide gauges 0[10.52, 1][7.91, 1]Failed
tide gauges 1[10.37, 2][7.76, 2]Failed
tide gauges 2[9.1, 1][6.5, 1]Failed
tide gauges 3[9.1, 1][6.5, 1]Failed
tide gauges 4[10.18, 4][7.28, 4]Failed
tide gauges 5[12.02, 2][8.45, 2]Failed
tide gauges 6[13.51, 1][8.98, 1]Failed
tide gauges 7[11.1, 3][8.1, 3]Failed

SHA-256 / f89c63b5167df997352a7ab48c3a3c42a0cefcebc9f4a6646fde6f5dc6f721f7

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(gauges):
    vals = []
    for dbl, dist in gauges:
        if dist < 100 or dbl <= 0:
            continue
        h = dbl / 2.0
        vals.append(math.log10(h) + math.log10(dist) + 5.8)
    if not vals:
        return None
    return [round(sum(vals) / len(vals), 2), len(vals)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tide gauges 0', [[[2.6, 100], [1.0, 50], [0.4, 99], [0.1, 99]]], [7.91, 1]], ['tide gauges 1', [[[0.4, 101], [0.4, 99], [8.0, 101]]], [7.76, 2]], ['tide gauges 2', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 3', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 4', [[[1.0, 101], [2.6, 50], [0.4, 800], [0.1, 101], [0.4, 100]]], [7.28, 4]], ['tide gauges 5', [[[2.6, 3000], [1.0, 101]]], [8.45, 2]], ['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]]], [['tide gauges 3', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]], ['tide gauges 8', [[[0.1, 50], [1.0, 99], [1.0, 99], [1.0, 3000]]], [8.98, 1]], ['tide gauges 9', [[[1.0, 100], [1.0, 800], [0.4, 99], [8.0, 101], [2.6, 100]]], [8.06, 4]], ['tide gauges 10', [[[8.0, 800], [8.0, 800], [8.0, 101]]], [9.01, 3]], ['tide gauges 11', [[[2.6, 100], [8.0, 100]]], [8.16, 2]], ['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]]], [['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 11', [[[2.6, 100], [8.0, 100]]], [8.16, 2]], ['tide gauges 14', [[[0.1, 101], [2.6, 101]]], [7.21, 2]], ['tide gauges 15', [[[0.4, 50], [2.6, 800], [2.6, 50]]], [8.82, 1]], ['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 17', [[[0.1, 99], [1.0, 800], [1.0, 100], [8.0, 101]]], [8.1, 3]], ['tide gauges 18', [[[1.0, 50]]], None], ['tide gauges 19', [[[0.1, 50]]], None]], [['tide gauges 9', [[[1.0, 100], [1.0, 800], [0.4, 99], [8.0, 101], [2.6, 100]]], [8.06, 4]], ['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 21', [[[1.0, 50], [8.0, 3000], [2.6, 101]]], [8.9, 2]], ['tide gauges 22', [[[2.6, 101]]], [7.92, 1]], ['tide gauges 23', [[[0.1, 50], [1.0, 800], [1.0, 50], [0.4, 100]]], [7.75, 2]], ['tide gauges 24', [[[2.6, 100], [0.1, 100], [1.0, 101], [8.0, 101], [1.0, 99]]], [7.58, 4]], ['tide gauges 25', [[[2.6, 101], [0.4, 800], [8.0, 100], [2.6, 99], [0.1, 101]]], [7.71, 4]], ['tide gauges 26', [[[8.0, 101], [0.1, 800], [2.6, 99], [0.1, 99]]], [7.9, 2]]], [['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]], ['tide gauges 23', [[[0.1, 50], [1.0, 800], [1.0, 50], [0.4, 100]]], [7.75, 2]], ['tide gauges 28', [[[8.0, 101], [1.0, 99]]], [8.41, 1]], ['tide gauges 29', [[[0.4, 101], [0.1, 99], [2.6, 99], [0.1, 100], [0.1, 50]]], [6.8, 2]], ['tide gauges 30', [[[0.1, 99], [2.6, 3000], [0.1, 3000]]], [8.68, 2]], ['tide gauges 31', [[[2.6, 3000], [0.1, 3000], [8.0, 800]]], [8.89, 3]], ['tide gauges 32', [[[2.6, 800], [1.0, 99]]], [8.82, 1]], ['tide gauges 33', [[[1.0, 800]]], [8.4, 1]]]]
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
tide gauges 0[7.91, 1][7.91, 1]Passed
tide gauges 1[7.76, 2][7.76, 2]Passed
tide gauges 2[6.5, 1][6.5, 1]Passed
tide gauges 3[6.5, 1][6.5, 1]Passed
tide gauges 4[7.28, 4][7.28, 4]Passed
tide gauges 5[8.45, 2][8.45, 2]Passed
tide gauges 6[8.98, 1][8.98, 1]Passed
tide gauges 7[8.1, 3][8.1, 3]Passed

SHA-256 / 63a7900222562cffd5f78740fa136aa4b17966228aa17a0ebc1f32f34d1f0f76

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:32.746324+00:00.

Case digest / df732b42d96d3643591abaf93001b832445428635b440248cd8d54217979c333