FAILURE MAP
← Case archive

FA-71621 / Seismic magnitude estimation / Open access

Omori-Utsu expected aftershock count: integral bound order · case 01

Expected aftershock counts are negative.

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

ROOT CAUSE

The antiderivative is evaluated upper minus lower with the (p-1) denominator.

VERIFIED REPAIR

Use ((t1+c)^(1-p) - (t2+c)^(1-p))/(p-1).

Unsuccessful approach: Flipping only the denominator sign also negates the result.

Case contract

Rate K/(t+c)^p aftershocks per day. Expected count on [t1, t2] days: for p == 1 (within 1e-12) K ln((t2+c)/(t1+c)); otherwise K((t1+c)^(1-p) - (t2+c)^(1-p))/(p-1). t1 < 0 or t2 <= t1 returns None. Round to 0.001.

Why this case matters

Aftershock forecasts integrate the Omori-Utsu rate over the forecast window.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(k, c, p, t1, t2):
    if t1 < 0 or t2 <= t1:
        return None
    if abs(p - 1.0) < 1e-12:
        n = k * (math.log(t2 + c) - math.log(t1 + c))
    else:
        n = k * ((t2 + c) ** (1 - p) - (t1 + c) ** (1 - p)) / (p - 1)
    return round(n, 3)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['K 50.0 c 0.01 p 0.8 window 0.0-1.0 d', [50.0, 0.01, 0.8, 0.0, 1.0], 150.971], ['K 50.0 c 0.01 p 0.8 window 0.5-10.0 d', [50.0, 0.01, 0.8, 0.5, 10.0], 177.801], ['K 50.0 c 0.01 p 0.8 window 1.0-30.0 d', [50.0, 0.01, 0.8, 1.0, 30.0], 243.123], ['K 50.0 c 0.01 p 0.8 window 5.0-5.0 d', [50.0, 0.01, 0.8, 5.0, 5.0], None], ['K 50.0 c 0.01 p 0.8 window 3.0-2.0 d', [50.0, 0.01, 0.8, 3.0, 2.0], None], ['K 50.0 c 0.01 p 0.8 window 0.0-0.0 d', [50.0, 0.01, 0.8, 0.0, 0.0], None], ['K 50.0 c 0.01 p 1.0 window 0.0-1.0 d', [50.0, 0.01, 1.0, 0.0, 1.0], 230.756], ['K 50.0 c 0.01 p 1.0 window 0.5-10.0 d', [50.0, 0.01, 1.0, 0.5, 10.0], 148.846]], [['K 50.0 c 0.01 p 1.0 window 0.5-10.0 d', [50.0, 0.01, 1.0, 0.5, 10.0], 148.846], ['K 50.0 c 0.01 p 1.0 window 1.0-30.0 d', [50.0, 0.01, 1.0, 1.0, 30.0], 169.579], ['K 50.0 c 0.01 p 1.0 window 5.0-5.0 d', [50.0, 0.01, 1.0, 5.0, 5.0], None], ['K 50.0 c 0.01 p 1.0 window 3.0-2.0 d', [50.0, 0.01, 1.0, 3.0, 2.0], None], ['K 50.0 c 0.01 p 1.0 window 0.0-0.0 d', [50.0, 0.01, 1.0, 0.0, 0.0], None], ['K 50.0 c 0.01 p 1.1 window 0.0-1.0 d', [50.0, 0.01, 1.1, 0.0, 1.0], 292.944], ['K 50.0 c 0.01 p 1.1 window 0.5-10.0 d', [50.0, 0.01, 1.1, 0.5, 10.0], 137.702], ['K 50.0 c 0.01 p 1.3 window 0.0-1.0 d', [50.0, 0.01, 1.3, 0.0, 1.0], 497.342]], [['K 50.0 c 0.01 p 1.1 window 1.0-30.0 d', [50.0, 0.01, 1.1, 1.0, 30.0], 143.672], ['K 50.0 c 0.01 p 1.1 window 5.0-5.0 d', [50.0, 0.01, 1.1, 5.0, 5.0], None], ['K 50.0 c 0.01 p 1.1 window 3.0-2.0 d', [50.0, 0.01, 1.1, 3.0, 2.0], None], ['K 50.0 c 0.01 p 1.1 window 0.0-0.0 d', [50.0, 0.01, 1.1, 0.0, 0.0], None], ['K 50.0 c 0.01 p 1.3 window 0.0-1.0 d', [50.0, 0.01, 1.3, 0.0, 1.0], 497.342], ['K 50.0 c 0.01 p 1.3 window 0.5-10.0 d', [50.0, 0.01, 1.3, 0.5, 10.0], 120.469], ['K 50.0 c 0.01 p 1.3 window 1.0-30.0 d', [50.0, 0.01, 1.3, 1.0, 30.0], 106.098], ['K 50.0 c 0.05 p 0.8 window 1.0-30.0 d', [50.0, 0.05, 0.8, 1.0, 30.0], 241.301]], [['K 50.0 c 0.01 p 1.3 window 5.0-5.0 d', [50.0, 0.01, 1.3, 5.0, 5.0], None], ['K 50.0 c 0.01 p 1.3 window 3.0-2.0 d', [50.0, 0.01, 1.3, 3.0, 2.0], None], ['K 50.0 c 0.01 p 1.3 window 0.0-0.0 d', [50.0, 0.01, 1.3, 0.0, 0.0], None], ['K 50.0 c 0.05 p 0.8 window 0.0-1.0 d', [50.0, 0.05, 0.8, 0.0, 1.0], 115.131], ['K 50.0 c 0.05 p 0.8 window 0.5-10.0 d', [50.0, 0.05, 0.8, 0.5, 10.0], 174.793], ['K 50.0 c 0.05 p 0.8 window 1.0-30.0 d', [50.0, 0.05, 0.8, 1.0, 30.0], 241.301], ['K 50.0 c 0.05 p 0.8 window 5.0-5.0 d', [50.0, 0.05, 0.8, 5.0, 5.0], None], ['K 50.0 c 0.05 p 1.3 window 0.5-10.0 d', [50.0, 0.05, 1.3, 0.5, 10.0], 116.0]], [['K 50.0 c 0.05 p 0.8 window 3.0-2.0 d', [50.0, 0.05, 0.8, 3.0, 2.0], None], ['K 50.0 c 0.05 p 0.8 window 0.0-0.0 d', [50.0, 0.05, 0.8, 0.0, 0.0], None], ['K 50.0 c 0.05 p 1.0 window 0.0-1.0 d', [50.0, 0.05, 1.0, 0.0, 1.0], 152.226], ['K 50.0 c 0.05 p 1.0 window 0.5-10.0 d', [50.0, 0.05, 1.0, 0.5, 10.0], 145.27], ['K 50.0 c 0.05 p 1.0 window 1.0-30.0 d', [50.0, 0.05, 1.0, 1.0, 30.0], 167.704], ['K 50.0 c 0.05 p 1.0 window 5.0-5.0 d', [50.0, 0.05, 1.0, 5.0, 5.0], None], ['K 50.0 c 0.05 p 1.1 window 0.0-1.0 d', [50.0, 0.05, 1.1, 0.0, 1.0], 177.075], ['K 200.0 c 0.01 p 1.1 window 0.0-1.0 d', [200.0, 0.01, 1.1, 0.0, 1.0], 1171.775]]]
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
K 50.0 c 0.01 p 0.8 window 0.0-1.0 d-150.971150.971Failed
K 50.0 c 0.01 p 0.8 window 0.5-10.0 d-177.801177.801Failed
K 50.0 c 0.01 p 0.8 window 1.0-30.0 d-243.123243.123Failed
K 50.0 c 0.01 p 0.8 window 5.0-5.0 dNoneNonePassed
K 50.0 c 0.01 p 0.8 window 3.0-2.0 dNoneNonePassed
K 50.0 c 0.01 p 0.8 window 0.0-0.0 dNoneNonePassed
K 50.0 c 0.01 p 1.0 window 0.0-1.0 d230.756230.756Passed
K 50.0 c 0.01 p 1.0 window 0.5-10.0 d148.846148.846Passed

SHA-256 / 8382650b2fae0a61a58311af8f86d5d5834ba0f58e94a14a0c2fca92051d17f6

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(k, c, p, t1, t2):
    if t1 < 0 or t2 <= t1:
        return None
    if abs(p - 1.0) < 1e-12:
        n = k * (math.log(t2 + c) - math.log(t1 + c))
    else:
        n = k * ((t1 + c) ** (1 - p) - (t2 + c) ** (1 - p)) / (1 - p)
    return round(n, 3)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['K 50.0 c 0.01 p 0.8 window 0.0-1.0 d', [50.0, 0.01, 0.8, 0.0, 1.0], 150.971], ['K 50.0 c 0.01 p 0.8 window 0.5-10.0 d', [50.0, 0.01, 0.8, 0.5, 10.0], 177.801], ['K 50.0 c 0.01 p 0.8 window 1.0-30.0 d', [50.0, 0.01, 0.8, 1.0, 30.0], 243.123], ['K 50.0 c 0.01 p 0.8 window 5.0-5.0 d', [50.0, 0.01, 0.8, 5.0, 5.0], None], ['K 50.0 c 0.01 p 0.8 window 3.0-2.0 d', [50.0, 0.01, 0.8, 3.0, 2.0], None], ['K 50.0 c 0.01 p 0.8 window 0.0-0.0 d', [50.0, 0.01, 0.8, 0.0, 0.0], None], ['K 50.0 c 0.01 p 1.0 window 0.0-1.0 d', [50.0, 0.01, 1.0, 0.0, 1.0], 230.756], ['K 50.0 c 0.01 p 1.0 window 0.5-10.0 d', [50.0, 0.01, 1.0, 0.5, 10.0], 148.846]], [['K 50.0 c 0.01 p 1.0 window 0.5-10.0 d', [50.0, 0.01, 1.0, 0.5, 10.0], 148.846], ['K 50.0 c 0.01 p 1.0 window 1.0-30.0 d', [50.0, 0.01, 1.0, 1.0, 30.0], 169.579], ['K 50.0 c 0.01 p 1.0 window 5.0-5.0 d', [50.0, 0.01, 1.0, 5.0, 5.0], None], ['K 50.0 c 0.01 p 1.0 window 3.0-2.0 d', [50.0, 0.01, 1.0, 3.0, 2.0], None], ['K 50.0 c 0.01 p 1.0 window 0.0-0.0 d', [50.0, 0.01, 1.0, 0.0, 0.0], None], ['K 50.0 c 0.01 p 1.1 window 0.0-1.0 d', [50.0, 0.01, 1.1, 0.0, 1.0], 292.944], ['K 50.0 c 0.01 p 1.1 window 0.5-10.0 d', [50.0, 0.01, 1.1, 0.5, 10.0], 137.702], ['K 50.0 c 0.01 p 1.3 window 0.0-1.0 d', [50.0, 0.01, 1.3, 0.0, 1.0], 497.342]], [['K 50.0 c 0.01 p 1.1 window 1.0-30.0 d', [50.0, 0.01, 1.1, 1.0, 30.0], 143.672], ['K 50.0 c 0.01 p 1.1 window 5.0-5.0 d', [50.0, 0.01, 1.1, 5.0, 5.0], None], ['K 50.0 c 0.01 p 1.1 window 3.0-2.0 d', [50.0, 0.01, 1.1, 3.0, 2.0], None], ['K 50.0 c 0.01 p 1.1 window 0.0-0.0 d', [50.0, 0.01, 1.1, 0.0, 0.0], None], ['K 50.0 c 0.01 p 1.3 window 0.0-1.0 d', [50.0, 0.01, 1.3, 0.0, 1.0], 497.342], ['K 50.0 c 0.01 p 1.3 window 0.5-10.0 d', [50.0, 0.01, 1.3, 0.5, 10.0], 120.469], ['K 50.0 c 0.01 p 1.3 window 1.0-30.0 d', [50.0, 0.01, 1.3, 1.0, 30.0], 106.098], ['K 50.0 c 0.05 p 0.8 window 1.0-30.0 d', [50.0, 0.05, 0.8, 1.0, 30.0], 241.301]], [['K 50.0 c 0.01 p 1.3 window 5.0-5.0 d', [50.0, 0.01, 1.3, 5.0, 5.0], None], ['K 50.0 c 0.01 p 1.3 window 3.0-2.0 d', [50.0, 0.01, 1.3, 3.0, 2.0], None], ['K 50.0 c 0.01 p 1.3 window 0.0-0.0 d', [50.0, 0.01, 1.3, 0.0, 0.0], None], ['K 50.0 c 0.05 p 0.8 window 0.0-1.0 d', [50.0, 0.05, 0.8, 0.0, 1.0], 115.131], ['K 50.0 c 0.05 p 0.8 window 0.5-10.0 d', [50.0, 0.05, 0.8, 0.5, 10.0], 174.793], ['K 50.0 c 0.05 p 0.8 window 1.0-30.0 d', [50.0, 0.05, 0.8, 1.0, 30.0], 241.301], ['K 50.0 c 0.05 p 0.8 window 5.0-5.0 d', [50.0, 0.05, 0.8, 5.0, 5.0], None], ['K 50.0 c 0.05 p 1.3 window 0.5-10.0 d', [50.0, 0.05, 1.3, 0.5, 10.0], 116.0]], [['K 50.0 c 0.05 p 0.8 window 3.0-2.0 d', [50.0, 0.05, 0.8, 3.0, 2.0], None], ['K 50.0 c 0.05 p 0.8 window 0.0-0.0 d', [50.0, 0.05, 0.8, 0.0, 0.0], None], ['K 50.0 c 0.05 p 1.0 window 0.0-1.0 d', [50.0, 0.05, 1.0, 0.0, 1.0], 152.226], ['K 50.0 c 0.05 p 1.0 window 0.5-10.0 d', [50.0, 0.05, 1.0, 0.5, 10.0], 145.27], ['K 50.0 c 0.05 p 1.0 window 1.0-30.0 d', [50.0, 0.05, 1.0, 1.0, 30.0], 167.704], ['K 50.0 c 0.05 p 1.0 window 5.0-5.0 d', [50.0, 0.05, 1.0, 5.0, 5.0], None], ['K 50.0 c 0.05 p 1.1 window 0.0-1.0 d', [50.0, 0.05, 1.1, 0.0, 1.0], 177.075], ['K 200.0 c 0.01 p 1.1 window 0.0-1.0 d', [200.0, 0.01, 1.1, 0.0, 1.0], 1171.775]]]
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
K 50.0 c 0.01 p 0.8 window 0.0-1.0 d-150.971150.971Failed
K 50.0 c 0.01 p 0.8 window 0.5-10.0 d-177.801177.801Failed
K 50.0 c 0.01 p 0.8 window 1.0-30.0 d-243.123243.123Failed
K 50.0 c 0.01 p 0.8 window 5.0-5.0 dNoneNonePassed
K 50.0 c 0.01 p 0.8 window 3.0-2.0 dNoneNonePassed
K 50.0 c 0.01 p 0.8 window 0.0-0.0 dNoneNonePassed
K 50.0 c 0.01 p 1.0 window 0.0-1.0 d230.756230.756Passed
K 50.0 c 0.01 p 1.0 window 0.5-10.0 d148.846148.846Passed

SHA-256 / fa5ecf85c9b33f07ea0d65ecf126bce18d41cd36dc3221ab5ef873ed3a460304

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(k, c, p, t1, t2):
    if t1 < 0 or t2 <= t1:
        return None
    if abs(p - 1.0) < 1e-12:
        n = k * (math.log(t2 + c) - math.log(t1 + c))
    else:
        n = k * ((t1 + c) ** (1 - p) - (t2 + c) ** (1 - p)) / (p - 1)
    return round(n, 3)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['K 50.0 c 0.01 p 0.8 window 0.0-1.0 d', [50.0, 0.01, 0.8, 0.0, 1.0], 150.971], ['K 50.0 c 0.01 p 0.8 window 0.5-10.0 d', [50.0, 0.01, 0.8, 0.5, 10.0], 177.801], ['K 50.0 c 0.01 p 0.8 window 1.0-30.0 d', [50.0, 0.01, 0.8, 1.0, 30.0], 243.123], ['K 50.0 c 0.01 p 0.8 window 5.0-5.0 d', [50.0, 0.01, 0.8, 5.0, 5.0], None], ['K 50.0 c 0.01 p 0.8 window 3.0-2.0 d', [50.0, 0.01, 0.8, 3.0, 2.0], None], ['K 50.0 c 0.01 p 0.8 window 0.0-0.0 d', [50.0, 0.01, 0.8, 0.0, 0.0], None], ['K 50.0 c 0.01 p 1.0 window 0.0-1.0 d', [50.0, 0.01, 1.0, 0.0, 1.0], 230.756], ['K 50.0 c 0.01 p 1.0 window 0.5-10.0 d', [50.0, 0.01, 1.0, 0.5, 10.0], 148.846]], [['K 50.0 c 0.01 p 1.0 window 0.5-10.0 d', [50.0, 0.01, 1.0, 0.5, 10.0], 148.846], ['K 50.0 c 0.01 p 1.0 window 1.0-30.0 d', [50.0, 0.01, 1.0, 1.0, 30.0], 169.579], ['K 50.0 c 0.01 p 1.0 window 5.0-5.0 d', [50.0, 0.01, 1.0, 5.0, 5.0], None], ['K 50.0 c 0.01 p 1.0 window 3.0-2.0 d', [50.0, 0.01, 1.0, 3.0, 2.0], None], ['K 50.0 c 0.01 p 1.0 window 0.0-0.0 d', [50.0, 0.01, 1.0, 0.0, 0.0], None], ['K 50.0 c 0.01 p 1.1 window 0.0-1.0 d', [50.0, 0.01, 1.1, 0.0, 1.0], 292.944], ['K 50.0 c 0.01 p 1.1 window 0.5-10.0 d', [50.0, 0.01, 1.1, 0.5, 10.0], 137.702], ['K 50.0 c 0.01 p 1.3 window 0.0-1.0 d', [50.0, 0.01, 1.3, 0.0, 1.0], 497.342]], [['K 50.0 c 0.01 p 1.1 window 1.0-30.0 d', [50.0, 0.01, 1.1, 1.0, 30.0], 143.672], ['K 50.0 c 0.01 p 1.1 window 5.0-5.0 d', [50.0, 0.01, 1.1, 5.0, 5.0], None], ['K 50.0 c 0.01 p 1.1 window 3.0-2.0 d', [50.0, 0.01, 1.1, 3.0, 2.0], None], ['K 50.0 c 0.01 p 1.1 window 0.0-0.0 d', [50.0, 0.01, 1.1, 0.0, 0.0], None], ['K 50.0 c 0.01 p 1.3 window 0.0-1.0 d', [50.0, 0.01, 1.3, 0.0, 1.0], 497.342], ['K 50.0 c 0.01 p 1.3 window 0.5-10.0 d', [50.0, 0.01, 1.3, 0.5, 10.0], 120.469], ['K 50.0 c 0.01 p 1.3 window 1.0-30.0 d', [50.0, 0.01, 1.3, 1.0, 30.0], 106.098], ['K 50.0 c 0.05 p 0.8 window 1.0-30.0 d', [50.0, 0.05, 0.8, 1.0, 30.0], 241.301]], [['K 50.0 c 0.01 p 1.3 window 5.0-5.0 d', [50.0, 0.01, 1.3, 5.0, 5.0], None], ['K 50.0 c 0.01 p 1.3 window 3.0-2.0 d', [50.0, 0.01, 1.3, 3.0, 2.0], None], ['K 50.0 c 0.01 p 1.3 window 0.0-0.0 d', [50.0, 0.01, 1.3, 0.0, 0.0], None], ['K 50.0 c 0.05 p 0.8 window 0.0-1.0 d', [50.0, 0.05, 0.8, 0.0, 1.0], 115.131], ['K 50.0 c 0.05 p 0.8 window 0.5-10.0 d', [50.0, 0.05, 0.8, 0.5, 10.0], 174.793], ['K 50.0 c 0.05 p 0.8 window 1.0-30.0 d', [50.0, 0.05, 0.8, 1.0, 30.0], 241.301], ['K 50.0 c 0.05 p 0.8 window 5.0-5.0 d', [50.0, 0.05, 0.8, 5.0, 5.0], None], ['K 50.0 c 0.05 p 1.3 window 0.5-10.0 d', [50.0, 0.05, 1.3, 0.5, 10.0], 116.0]], [['K 50.0 c 0.05 p 0.8 window 3.0-2.0 d', [50.0, 0.05, 0.8, 3.0, 2.0], None], ['K 50.0 c 0.05 p 0.8 window 0.0-0.0 d', [50.0, 0.05, 0.8, 0.0, 0.0], None], ['K 50.0 c 0.05 p 1.0 window 0.0-1.0 d', [50.0, 0.05, 1.0, 0.0, 1.0], 152.226], ['K 50.0 c 0.05 p 1.0 window 0.5-10.0 d', [50.0, 0.05, 1.0, 0.5, 10.0], 145.27], ['K 50.0 c 0.05 p 1.0 window 1.0-30.0 d', [50.0, 0.05, 1.0, 1.0, 30.0], 167.704], ['K 50.0 c 0.05 p 1.0 window 5.0-5.0 d', [50.0, 0.05, 1.0, 5.0, 5.0], None], ['K 50.0 c 0.05 p 1.1 window 0.0-1.0 d', [50.0, 0.05, 1.1, 0.0, 1.0], 177.075], ['K 200.0 c 0.01 p 1.1 window 0.0-1.0 d', [200.0, 0.01, 1.1, 0.0, 1.0], 1171.775]]]
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
K 50.0 c 0.01 p 0.8 window 0.0-1.0 d150.971150.971Passed
K 50.0 c 0.01 p 0.8 window 0.5-10.0 d177.801177.801Passed
K 50.0 c 0.01 p 0.8 window 1.0-30.0 d243.123243.123Passed
K 50.0 c 0.01 p 0.8 window 5.0-5.0 dNoneNonePassed
K 50.0 c 0.01 p 0.8 window 3.0-2.0 dNoneNonePassed
K 50.0 c 0.01 p 0.8 window 0.0-0.0 dNoneNonePassed
K 50.0 c 0.01 p 1.0 window 0.0-1.0 d230.756230.756Passed
K 50.0 c 0.01 p 1.0 window 0.5-10.0 d148.846148.846Passed

SHA-256 / ff2b06d4e58d0a379d0785efecadbb2fa6c848b9eeeabaf251fd934401e67d6c

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

Case digest / a61c339e4423d9747b88fa73ddba337e5a0b2aac9b43489646e86aef2e074ff7