FAILURE MAP
← Case archive

FA-71766 / Seismic magnitude estimation / Open access

Station magnitude correction update: minimum residual count · case 01

Stations with exactly the minimum number of residuals get no correction.

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

ROOT CAUSE

The count requirement is exclusive.

VERIFIED REPAIR

Require at least min_n kept residuals.

Unsuccessful approach: Hard-coding a two-residual minimum ignores the configured min_n.

Case contract

events are [station, station magnitude, network magnitude]. Residual = station - network; residuals with |r| > 1.0 are discarded (exactly 1.0 kept). A station with at least min_n kept residuals gets correction = -mean(kept) rounded 0.01, otherwise 0.0. Return [[station, correction, kept count]] sorted by station.

Why this case matters

Station corrections remove site amplification bias from future station magnitudes.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(events, min_n):
    res = {}
    for st, sm, nm in events:
        r = round(sm - nm, 2)
        res.setdefault(st, [])
        if abs(r) <= 1.0:
            res[st].append(r)
    out = []
    for st in sorted(res):
        kept = res[st]
        corr = round(-sum(kept) / len(kept), 2) if len(kept) > min_n else 0.0
        out.append([st, corr + 0.0, len(kept)])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['update 0', [[['ABC', 4.08, 2.88], ['JKL', 4.17, 4.57], ['GHI', 2.75, 1.55], ['ABC', 1.69, 2.09], ['GHI', 4.14, 4.54], ['DEF', 1.62, 1.42], ['ABC', 4.95, 3.75]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]]], ['update 1', [[['JKL', 3.77, 3.87], ['JKL', 1.13, 1.53], ['GHI', 4.95, 4.95], ['JKL', 2.75, 2.55]], 2], [['GHI', 0.0, 1], ['JKL', 0.1, 3]]], ['update 2', [[['ABC', 4.36, 5.76], ['DEF', 1.34, 1.74]], 2], [['ABC', 0.0, 0], ['DEF', 0.0, 1]]], ['update 3', [[['GHI', 3.9, 4.3], ['ABC', 3.21, 3.61], ['JKL', 3.44, 2.24], ['GHI', 1.49, 0.99], ['ABC', 2.92, 2.92], ['ABC', 1.35, 0.85], ['JKL', 3.83, 3.33], ['JKL', 4.34, 5.74], ['GHI', 2.74, 2.54], ['JKL', 4.01, 3.81]], 2], [['ABC', -0.03, 3], ['GHI', -0.1, 3], ['JKL', -0.35, 2]]], ['update 4', [[['ABC', 4.03, 5.43], ['GHI', 1.35, 1.15]], 2], [['ABC', 0.0, 0], ['GHI', 0.0, 1]]], ['update 5', [[['ABC', 3.0, 2.8], ['DEF', 3.69, 3.79], ['GHI', 2.6, 2.1], ['ABC', 3.35, 2.85], ['GHI', 1.85, 2.25], ['DEF', 3.27, 3.27], ['GHI', 4.54, 4.54], ['GHI', 4.14, 3.64], ['ABC', 2.9, 4.3], ['DEF', 4.18, 4.18], ['ABC', 2.74, 2.84]], 3], [['ABC', -0.2, 3], ['DEF', 0.03, 3], ['GHI', -0.15, 4]]], ['update 6', [[['JKL', 4.59, 4.09], ['DEF', 4.81, 6.21], ['JKL', 4.33, 4.33], ['DEF', 2.75, 2.85], ['DEF', 3.37, 4.77], ['DEF', 4.94, 5.04], ['ABC', 2.58, 2.38], ['DEF', 4.52, 5.92], ['JKL', 1.3, 1.3]], 2], [['ABC', 0.0, 1], ['DEF', 0.1, 2], ['JKL', -0.17, 3]]], ['update 11', [[['ABC', 3.64, 2.44], ['DEF', 3.65, 2.45], ['GHI', 2.3, 2.7], ['JKL', 1.52, 1.62], ['JKL', 2.79, 2.59], ['JKL', 3.93, 4.33], ['DEF', 4.75, 4.75], ['ABC', 1.64, 1.14], ['DEF', 4.17, 4.57], ['GHI', 2.86, 1.66]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]]]], [['update 7', [[['GHI', 3.12, 4.52], ['DEF', 4.64, 4.64], ['JKL', 3.82, 4.22], ['ABC', 1.25, 1.35], ['ABC', 2.71, 2.51], ['DEF', 3.36, 3.76]], 3], [['ABC', 0.0, 2], ['DEF', 0.0, 2], ['GHI', 0.0, 0], ['JKL', 0.0, 1]]], ['update 8', [[['DEF', 1.07, -0.13], ['ABC', 1.63, 3.03], ['ABC', 1.47, 1.27]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 0]]], ['update 9', [[['JKL', 2.72, 2.72], ['GHI', 1.89, 1.89], ['GHI', 4.29, 4.29]], 3], [['GHI', 0.0, 2], ['JKL', 0.0, 1]]], ['update 10', [[['GHI', 2.55, 3.95], ['GHI', 4.57, 4.67], ['DEF', 2.95, 4.35]], 2], [['DEF', 0.0, 0], ['GHI', 0.0, 1]]], ['update 11', [[['ABC', 3.64, 2.44], ['DEF', 3.65, 2.45], ['GHI', 2.3, 2.7], ['JKL', 1.52, 1.62], ['JKL', 2.79, 2.59], ['JKL', 3.93, 4.33], ['DEF', 4.75, 4.75], ['ABC', 1.64, 1.14], ['DEF', 4.17, 4.57], ['GHI', 2.86, 1.66]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]]], ['update 12', [[['DEF', 4.64, 4.14], ['ABC', 3.51, 3.91], ['GHI', 2.69, 1.49], ['ABC', 3.3, 3.7], ['DEF', 3.3, 3.3], ['JKL', 3.68, 5.08], ['GHI', 2.34, 2.74], ['ABC', 4.82, 6.22], ['ABC', 4.34, 4.34], ['JKL', 3.8, 2.6]], 3], [['ABC', 0.27, 3], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.0, 0]]], ['update 13', [[['JKL', 1.73, 3.13], ['DEF', 4.48, 4.48], ['GHI', 2.01, 0.81], ['ABC', 1.82, 1.62], ['DEF', 1.44, 0.24], ['JKL', 2.06, 2.16]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 0], ['JKL', 0.0, 1]]], ['update 27', [[['GHI', 2.42, 2.42], ['DEF', 3.85, 5.25], ['GHI', 1.72, 0.52], ['DEF', 4.97, 5.07], ['DEF', 2.31, 2.11], ['ABC', 1.12, -0.08]], 3], [['ABC', 0.0, 0], ['DEF', 0.0, 2], ['GHI', 0.0, 1]]]], [['update 14', [[['JKL', 4.27, 4.37], ['DEF', 4.2, 4.2], ['ABC', 3.88, 4.28], ['DEF', 3.23, 3.03], ['ABC', 4.72, 5.12], ['DEF', 2.22, 1.72]], 2], [['ABC', 0.4, 2], ['DEF', -0.23, 3], ['JKL', 0.0, 1]]], ['update 15', [[['DEF', 4.66, 4.46], ['JKL', 1.26, 0.76], ['GHI', 2.61, 3.01], ['GHI', 3.72, 4.12], ['ABC', 1.11, 1.21]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.4, 2], ['JKL', 0.0, 1]]], ['update 16', [[['GHI', 4.77, 4.77], ['DEF', 3.19, 4.59], ['GHI', 2.0, 2.4], ['GHI', 1.56, 1.66], ['JKL', 3.74, 2.54], ['GHI', 3.83, 4.23], ['JKL', 4.29, 3.79], ['JKL', 4.44, 4.54], ['GHI', 3.59, 3.39], ['JKL', 3.34, 4.74], ['GHI', 2.05, 1.85]], 3], [['DEF', 0.0, 0], ['GHI', 0.08, 6], ['JKL', 0.0, 2]]], ['update 17', [[['GHI', 1.47, 1.57], ['ABC', 3.36, 3.16], ['DEF', 4.06, 5.46], ['DEF', 2.41, 2.21]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1]]], ['update 18', [[['GHI', 3.8, 3.6], ['GHI', 4.49, 5.89], ['DEF', 3.04, 1.84]], 2], [['DEF', 0.0, 0], ['GHI', 0.0, 1]]], ['update 19', [[['ABC', 4.48, 4.48], ['ABC', 4.46, 4.46], ['ABC', 2.5, 2.0], ['GHI', 3.14, 2.94], ['GHI', 3.25, 4.65], ['GHI', 4.42, 4.82], ['JKL', 4.58, 5.98], ['ABC', 2.72, 1.52], ['DEF', 4.99, 4.79], ['ABC', 3.34, 3.14], ['ABC', 3.13, 3.53], ['ABC', 2.09, 2.09]], 2], [['ABC', -0.05, 6], ['DEF', 0.0, 1], ['GHI', 0.1, 2], ['JKL', 0.0, 0]]], ['update 20', [[['JKL', 1.82, 0.62], ['GHI', 1.65, 1.45], ['ABC', 4.02, 3.82], ['JKL', 2.38, 2.78], ['JKL', 2.81, 2.81], ['ABC', 1.07, -0.13], ['JKL', 3.47, 3.87], ['GHI', 3.31, 3.11], ['DEF', 1.29, 1.29], ['JKL', 2.27, 3.67], ['ABC', 4.64, 3.44]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', -0.2, 2], ['JKL', 0.27, 3]]], ['update 23', [[['GHI', 4.6, 4.4], ['DEF', 2.07, 3.47], ['JKL', 4.75, 4.55], ['JKL', 1.31, 2.71], ['ABC', 4.84, 6.24], ['GHI', 1.4, 1.8], ['DEF', 3.5, 3.9], ['DEF', 2.03, 1.53], ['GHI', 3.07, 3.17], ['JKL', 2.49, 1.29], ['GHI', 4.66, 3.46], ['ABC', 1.36, 1.46]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.1, 3], ['JKL', 0.0, 1]]]], [['update 12', [[['DEF', 4.64, 4.14], ['ABC', 3.51, 3.91], ['GHI', 2.69, 1.49], ['ABC', 3.3, 3.7], ['DEF', 3.3, 3.3], ['JKL', 3.68, 5.08], ['GHI', 2.34, 2.74], ['ABC', 4.82, 6.22], ['ABC', 4.34, 4.34], ['JKL', 3.8, 2.6]], 3], [['ABC', 0.27, 3], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.0, 0]]], ['update 21', [[['JKL', 3.79, 3.59], ['ABC', 2.38, 2.38], ['GHI', 1.36, 2.76], ['JKL', 3.9, 2.7], ['GHI', 4.16, 3.66], ['JKL', 1.89, 0.69], ['GHI', 3.82, 3.82], ['DEF', 1.18, 1.58], ['ABC', 3.3, 3.1], ['ABC', 2.96, 2.96], ['JKL', 3.86, 3.66]], 2], [['ABC', -0.07, 3], ['DEF', 0.0, 1], ['GHI', -0.25, 2], ['JKL', -0.2, 2]]], ['update 22', [[['GHI', 4.5, 4.9], ['GHI', 1.1, 0.9], ['ABC', 2.26, 2.26], ['DEF', 4.3, 4.1], ['ABC', 2.38, 1.88]], 2], [['ABC', -0.25, 2], ['DEF', 0.0, 1], ['GHI', 0.1, 2]]], ['update 23', [[['GHI', 4.6, 4.4], ['DEF', 2.07, 3.47], ['JKL', 4.75, 4.55], ['JKL', 1.31, 2.71], ['ABC', 4.84, 6.24], ['GHI', 1.4, 1.8], ['DEF', 3.5, 3.9], ['DEF', 2.03, 1.53], ['GHI', 3.07, 3.17], ['JKL', 2.49, 1.29], ['GHI', 4.66, 3.46], ['ABC', 1.36, 1.46]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.1, 3], ['JKL', 0.0, 1]]], ['update 24', [[['ABC', 3.1, 2.6], ['ABC', 4.76, 4.86], ['ABC', 4.5, 3.3], ['DEF', 4.19, 2.99]], 3], [['ABC', 0.0, 2], ['DEF', 0.0, 0]]], ['update 25', [[['GHI', 1.14, 1.14], ['JKL', 1.52, 2.92], ['JKL', 4.34, 4.74], ['GHI', 4.19, 5.59]], 3], [['GHI', 0.0, 1], ['JKL', 0.0, 1]]], ['update 26', [[['ABC', 2.41, 2.41], ['GHI', 1.97, 3.37], ['DEF', 1.7, 1.8]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 0]]], ['update 27', [[['GHI', 2.42, 2.42], ['DEF', 3.85, 5.25], ['GHI', 1.72, 0.52], ['DEF', 4.97, 5.07], ['DEF', 2.31, 2.11], ['ABC', 1.12, -0.08]], 3], [['ABC', 0.0, 0], ['DEF', 0.0, 2], ['GHI', 0.0, 1]]]], [['update 0', [[['ABC', 4.08, 2.88], ['JKL', 4.17, 4.57], ['GHI', 2.75, 1.55], ['ABC', 1.69, 2.09], ['GHI', 4.14, 4.54], ['DEF', 1.62, 1.42], ['ABC', 4.95, 3.75]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]]], ['update 1', [[['JKL', 3.77, 3.87], ['JKL', 1.13, 1.53], ['GHI', 4.95, 4.95], ['JKL', 2.75, 2.55]], 2], [['GHI', 0.0, 1], ['JKL', 0.1, 3]]], ['update 2', [[['ABC', 4.36, 5.76], ['DEF', 1.34, 1.74]], 2], [['ABC', 0.0, 0], ['DEF', 0.0, 1]]], ['update 7', [[['GHI', 3.12, 4.52], ['DEF', 4.64, 4.64], ['JKL', 3.82, 4.22], ['ABC', 1.25, 1.35], ['ABC', 2.71, 2.51], ['DEF', 3.36, 3.76]], 3], [['ABC', 0.0, 2], ['DEF', 0.0, 2], ['GHI', 0.0, 0], ['JKL', 0.0, 1]]], ['update 28', [[['GHI', 2.19, 1.69], ['GHI', 3.1, 2.9], ['DEF', 1.51, 2.91], ['ABC', 3.68, 3.78], ['DEF', 1.85, 3.25], ['DEF', 4.85, 6.25]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 0], ['GHI', -0.35, 2]]], ['update 29', [[['DEF', 1.13, 2.53], ['DEF', 4.46, 4.46], ['DEF', 1.47, 1.47], ['ABC', 2.52, 3.92], ['ABC', 4.28, 4.08], ['DEF', 2.6, 2.7], ['ABC', 3.62, 3.42], ['GHI', 1.48, 1.48], ['GHI', 2.07, 1.87]], 2], [['ABC', -0.2, 2], ['DEF', 0.03, 3], ['GHI', -0.1, 2]]], ['exactly one-unit residual', [[['ABC', 4.0, 3.0], ['ABC', 3.5, 3.4], ['ABC', 3.0, 3.1]], 2], [['ABC', -0.33, 3]]], ['minimum count', [[['XYZ', 2.0, 2.3], ['XYZ', 2.2, 2.4], ['QRS', 1.0, 1.5]], 2], [['QRS', 0.0, 1], ['XYZ', 0.25, 2]]]]]
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
update 0[['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]][['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]]Passed
update 1[['GHI', 0.0, 1], ['JKL', 0.1, 3]][['GHI', 0.0, 1], ['JKL', 0.1, 3]]Passed
update 2[['ABC', 0.0, 0], ['DEF', 0.0, 1]][['ABC', 0.0, 0], ['DEF', 0.0, 1]]Passed
update 3[['ABC', -0.03, 3], ['GHI', -0.1, 3], ['JKL', 0.0, 2]][['ABC', -0.03, 3], ['GHI', -0.1, 3], ['JKL', -0.35, 2]]Failed
update 4[['ABC', 0.0, 0], ['GHI', 0.0, 1]][['ABC', 0.0, 0], ['GHI', 0.0, 1]]Passed
update 5[['ABC', 0.0, 3], ['DEF', 0.0, 3], ['GHI', -0.15, 4]][['ABC', -0.2, 3], ['DEF', 0.03, 3], ['GHI', -0.15, 4]]Failed
update 6[['ABC', 0.0, 1], ['DEF', 0.0, 2], ['JKL', -0.17, 3]][['ABC', 0.0, 1], ['DEF', 0.1, 2], ['JKL', -0.17, 3]]Failed
update 11[['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.0, 3]][['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]]Failed

SHA-256 / 018bdbeceaa0d2fadcfce71bf290c4b81d2301c52152593c740d071d7b0e2119

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(events, min_n):
    res = {}
    for st, sm, nm in events:
        r = round(sm - nm, 2)
        res.setdefault(st, [])
        if abs(r) <= 1.0:
            res[st].append(r)
    out = []
    for st in sorted(res):
        kept = res[st]
        corr = round(-sum(kept) / len(kept), 2) if len(kept) >= 2 else 0.0
        out.append([st, corr + 0.0, len(kept)])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['update 0', [[['ABC', 4.08, 2.88], ['JKL', 4.17, 4.57], ['GHI', 2.75, 1.55], ['ABC', 1.69, 2.09], ['GHI', 4.14, 4.54], ['DEF', 1.62, 1.42], ['ABC', 4.95, 3.75]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]]], ['update 1', [[['JKL', 3.77, 3.87], ['JKL', 1.13, 1.53], ['GHI', 4.95, 4.95], ['JKL', 2.75, 2.55]], 2], [['GHI', 0.0, 1], ['JKL', 0.1, 3]]], ['update 2', [[['ABC', 4.36, 5.76], ['DEF', 1.34, 1.74]], 2], [['ABC', 0.0, 0], ['DEF', 0.0, 1]]], ['update 3', [[['GHI', 3.9, 4.3], ['ABC', 3.21, 3.61], ['JKL', 3.44, 2.24], ['GHI', 1.49, 0.99], ['ABC', 2.92, 2.92], ['ABC', 1.35, 0.85], ['JKL', 3.83, 3.33], ['JKL', 4.34, 5.74], ['GHI', 2.74, 2.54], ['JKL', 4.01, 3.81]], 2], [['ABC', -0.03, 3], ['GHI', -0.1, 3], ['JKL', -0.35, 2]]], ['update 4', [[['ABC', 4.03, 5.43], ['GHI', 1.35, 1.15]], 2], [['ABC', 0.0, 0], ['GHI', 0.0, 1]]], ['update 5', [[['ABC', 3.0, 2.8], ['DEF', 3.69, 3.79], ['GHI', 2.6, 2.1], ['ABC', 3.35, 2.85], ['GHI', 1.85, 2.25], ['DEF', 3.27, 3.27], ['GHI', 4.54, 4.54], ['GHI', 4.14, 3.64], ['ABC', 2.9, 4.3], ['DEF', 4.18, 4.18], ['ABC', 2.74, 2.84]], 3], [['ABC', -0.2, 3], ['DEF', 0.03, 3], ['GHI', -0.15, 4]]], ['update 6', [[['JKL', 4.59, 4.09], ['DEF', 4.81, 6.21], ['JKL', 4.33, 4.33], ['DEF', 2.75, 2.85], ['DEF', 3.37, 4.77], ['DEF', 4.94, 5.04], ['ABC', 2.58, 2.38], ['DEF', 4.52, 5.92], ['JKL', 1.3, 1.3]], 2], [['ABC', 0.0, 1], ['DEF', 0.1, 2], ['JKL', -0.17, 3]]], ['update 11', [[['ABC', 3.64, 2.44], ['DEF', 3.65, 2.45], ['GHI', 2.3, 2.7], ['JKL', 1.52, 1.62], ['JKL', 2.79, 2.59], ['JKL', 3.93, 4.33], ['DEF', 4.75, 4.75], ['ABC', 1.64, 1.14], ['DEF', 4.17, 4.57], ['GHI', 2.86, 1.66]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]]]], [['update 7', [[['GHI', 3.12, 4.52], ['DEF', 4.64, 4.64], ['JKL', 3.82, 4.22], ['ABC', 1.25, 1.35], ['ABC', 2.71, 2.51], ['DEF', 3.36, 3.76]], 3], [['ABC', 0.0, 2], ['DEF', 0.0, 2], ['GHI', 0.0, 0], ['JKL', 0.0, 1]]], ['update 8', [[['DEF', 1.07, -0.13], ['ABC', 1.63, 3.03], ['ABC', 1.47, 1.27]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 0]]], ['update 9', [[['JKL', 2.72, 2.72], ['GHI', 1.89, 1.89], ['GHI', 4.29, 4.29]], 3], [['GHI', 0.0, 2], ['JKL', 0.0, 1]]], ['update 10', [[['GHI', 2.55, 3.95], ['GHI', 4.57, 4.67], ['DEF', 2.95, 4.35]], 2], [['DEF', 0.0, 0], ['GHI', 0.0, 1]]], ['update 11', [[['ABC', 3.64, 2.44], ['DEF', 3.65, 2.45], ['GHI', 2.3, 2.7], ['JKL', 1.52, 1.62], ['JKL', 2.79, 2.59], ['JKL', 3.93, 4.33], ['DEF', 4.75, 4.75], ['ABC', 1.64, 1.14], ['DEF', 4.17, 4.57], ['GHI', 2.86, 1.66]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]]], ['update 12', [[['DEF', 4.64, 4.14], ['ABC', 3.51, 3.91], ['GHI', 2.69, 1.49], ['ABC', 3.3, 3.7], ['DEF', 3.3, 3.3], ['JKL', 3.68, 5.08], ['GHI', 2.34, 2.74], ['ABC', 4.82, 6.22], ['ABC', 4.34, 4.34], ['JKL', 3.8, 2.6]], 3], [['ABC', 0.27, 3], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.0, 0]]], ['update 13', [[['JKL', 1.73, 3.13], ['DEF', 4.48, 4.48], ['GHI', 2.01, 0.81], ['ABC', 1.82, 1.62], ['DEF', 1.44, 0.24], ['JKL', 2.06, 2.16]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 0], ['JKL', 0.0, 1]]], ['update 27', [[['GHI', 2.42, 2.42], ['DEF', 3.85, 5.25], ['GHI', 1.72, 0.52], ['DEF', 4.97, 5.07], ['DEF', 2.31, 2.11], ['ABC', 1.12, -0.08]], 3], [['ABC', 0.0, 0], ['DEF', 0.0, 2], ['GHI', 0.0, 1]]]], [['update 14', [[['JKL', 4.27, 4.37], ['DEF', 4.2, 4.2], ['ABC', 3.88, 4.28], ['DEF', 3.23, 3.03], ['ABC', 4.72, 5.12], ['DEF', 2.22, 1.72]], 2], [['ABC', 0.4, 2], ['DEF', -0.23, 3], ['JKL', 0.0, 1]]], ['update 15', [[['DEF', 4.66, 4.46], ['JKL', 1.26, 0.76], ['GHI', 2.61, 3.01], ['GHI', 3.72, 4.12], ['ABC', 1.11, 1.21]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.4, 2], ['JKL', 0.0, 1]]], ['update 16', [[['GHI', 4.77, 4.77], ['DEF', 3.19, 4.59], ['GHI', 2.0, 2.4], ['GHI', 1.56, 1.66], ['JKL', 3.74, 2.54], ['GHI', 3.83, 4.23], ['JKL', 4.29, 3.79], ['JKL', 4.44, 4.54], ['GHI', 3.59, 3.39], ['JKL', 3.34, 4.74], ['GHI', 2.05, 1.85]], 3], [['DEF', 0.0, 0], ['GHI', 0.08, 6], ['JKL', 0.0, 2]]], ['update 17', [[['GHI', 1.47, 1.57], ['ABC', 3.36, 3.16], ['DEF', 4.06, 5.46], ['DEF', 2.41, 2.21]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1]]], ['update 18', [[['GHI', 3.8, 3.6], ['GHI', 4.49, 5.89], ['DEF', 3.04, 1.84]], 2], [['DEF', 0.0, 0], ['GHI', 0.0, 1]]], ['update 19', [[['ABC', 4.48, 4.48], ['ABC', 4.46, 4.46], ['ABC', 2.5, 2.0], ['GHI', 3.14, 2.94], ['GHI', 3.25, 4.65], ['GHI', 4.42, 4.82], ['JKL', 4.58, 5.98], ['ABC', 2.72, 1.52], ['DEF', 4.99, 4.79], ['ABC', 3.34, 3.14], ['ABC', 3.13, 3.53], ['ABC', 2.09, 2.09]], 2], [['ABC', -0.05, 6], ['DEF', 0.0, 1], ['GHI', 0.1, 2], ['JKL', 0.0, 0]]], ['update 20', [[['JKL', 1.82, 0.62], ['GHI', 1.65, 1.45], ['ABC', 4.02, 3.82], ['JKL', 2.38, 2.78], ['JKL', 2.81, 2.81], ['ABC', 1.07, -0.13], ['JKL', 3.47, 3.87], ['GHI', 3.31, 3.11], ['DEF', 1.29, 1.29], ['JKL', 2.27, 3.67], ['ABC', 4.64, 3.44]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', -0.2, 2], ['JKL', 0.27, 3]]], ['update 23', [[['GHI', 4.6, 4.4], ['DEF', 2.07, 3.47], ['JKL', 4.75, 4.55], ['JKL', 1.31, 2.71], ['ABC', 4.84, 6.24], ['GHI', 1.4, 1.8], ['DEF', 3.5, 3.9], ['DEF', 2.03, 1.53], ['GHI', 3.07, 3.17], ['JKL', 2.49, 1.29], ['GHI', 4.66, 3.46], ['ABC', 1.36, 1.46]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.1, 3], ['JKL', 0.0, 1]]]], [['update 12', [[['DEF', 4.64, 4.14], ['ABC', 3.51, 3.91], ['GHI', 2.69, 1.49], ['ABC', 3.3, 3.7], ['DEF', 3.3, 3.3], ['JKL', 3.68, 5.08], ['GHI', 2.34, 2.74], ['ABC', 4.82, 6.22], ['ABC', 4.34, 4.34], ['JKL', 3.8, 2.6]], 3], [['ABC', 0.27, 3], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.0, 0]]], ['update 21', [[['JKL', 3.79, 3.59], ['ABC', 2.38, 2.38], ['GHI', 1.36, 2.76], ['JKL', 3.9, 2.7], ['GHI', 4.16, 3.66], ['JKL', 1.89, 0.69], ['GHI', 3.82, 3.82], ['DEF', 1.18, 1.58], ['ABC', 3.3, 3.1], ['ABC', 2.96, 2.96], ['JKL', 3.86, 3.66]], 2], [['ABC', -0.07, 3], ['DEF', 0.0, 1], ['GHI', -0.25, 2], ['JKL', -0.2, 2]]], ['update 22', [[['GHI', 4.5, 4.9], ['GHI', 1.1, 0.9], ['ABC', 2.26, 2.26], ['DEF', 4.3, 4.1], ['ABC', 2.38, 1.88]], 2], [['ABC', -0.25, 2], ['DEF', 0.0, 1], ['GHI', 0.1, 2]]], ['update 23', [[['GHI', 4.6, 4.4], ['DEF', 2.07, 3.47], ['JKL', 4.75, 4.55], ['JKL', 1.31, 2.71], ['ABC', 4.84, 6.24], ['GHI', 1.4, 1.8], ['DEF', 3.5, 3.9], ['DEF', 2.03, 1.53], ['GHI', 3.07, 3.17], ['JKL', 2.49, 1.29], ['GHI', 4.66, 3.46], ['ABC', 1.36, 1.46]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.1, 3], ['JKL', 0.0, 1]]], ['update 24', [[['ABC', 3.1, 2.6], ['ABC', 4.76, 4.86], ['ABC', 4.5, 3.3], ['DEF', 4.19, 2.99]], 3], [['ABC', 0.0, 2], ['DEF', 0.0, 0]]], ['update 25', [[['GHI', 1.14, 1.14], ['JKL', 1.52, 2.92], ['JKL', 4.34, 4.74], ['GHI', 4.19, 5.59]], 3], [['GHI', 0.0, 1], ['JKL', 0.0, 1]]], ['update 26', [[['ABC', 2.41, 2.41], ['GHI', 1.97, 3.37], ['DEF', 1.7, 1.8]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 0]]], ['update 27', [[['GHI', 2.42, 2.42], ['DEF', 3.85, 5.25], ['GHI', 1.72, 0.52], ['DEF', 4.97, 5.07], ['DEF', 2.31, 2.11], ['ABC', 1.12, -0.08]], 3], [['ABC', 0.0, 0], ['DEF', 0.0, 2], ['GHI', 0.0, 1]]]], [['update 0', [[['ABC', 4.08, 2.88], ['JKL', 4.17, 4.57], ['GHI', 2.75, 1.55], ['ABC', 1.69, 2.09], ['GHI', 4.14, 4.54], ['DEF', 1.62, 1.42], ['ABC', 4.95, 3.75]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]]], ['update 1', [[['JKL', 3.77, 3.87], ['JKL', 1.13, 1.53], ['GHI', 4.95, 4.95], ['JKL', 2.75, 2.55]], 2], [['GHI', 0.0, 1], ['JKL', 0.1, 3]]], ['update 2', [[['ABC', 4.36, 5.76], ['DEF', 1.34, 1.74]], 2], [['ABC', 0.0, 0], ['DEF', 0.0, 1]]], ['update 7', [[['GHI', 3.12, 4.52], ['DEF', 4.64, 4.64], ['JKL', 3.82, 4.22], ['ABC', 1.25, 1.35], ['ABC', 2.71, 2.51], ['DEF', 3.36, 3.76]], 3], [['ABC', 0.0, 2], ['DEF', 0.0, 2], ['GHI', 0.0, 0], ['JKL', 0.0, 1]]], ['update 28', [[['GHI', 2.19, 1.69], ['GHI', 3.1, 2.9], ['DEF', 1.51, 2.91], ['ABC', 3.68, 3.78], ['DEF', 1.85, 3.25], ['DEF', 4.85, 6.25]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 0], ['GHI', -0.35, 2]]], ['update 29', [[['DEF', 1.13, 2.53], ['DEF', 4.46, 4.46], ['DEF', 1.47, 1.47], ['ABC', 2.52, 3.92], ['ABC', 4.28, 4.08], ['DEF', 2.6, 2.7], ['ABC', 3.62, 3.42], ['GHI', 1.48, 1.48], ['GHI', 2.07, 1.87]], 2], [['ABC', -0.2, 2], ['DEF', 0.03, 3], ['GHI', -0.1, 2]]], ['exactly one-unit residual', [[['ABC', 4.0, 3.0], ['ABC', 3.5, 3.4], ['ABC', 3.0, 3.1]], 2], [['ABC', -0.33, 3]]], ['minimum count', [[['XYZ', 2.0, 2.3], ['XYZ', 2.2, 2.4], ['QRS', 1.0, 1.5]], 2], [['QRS', 0.0, 1], ['XYZ', 0.25, 2]]]]]
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
update 0[['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]][['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]]Passed
update 1[['GHI', 0.0, 1], ['JKL', 0.1, 3]][['GHI', 0.0, 1], ['JKL', 0.1, 3]]Passed
update 2[['ABC', 0.0, 0], ['DEF', 0.0, 1]][['ABC', 0.0, 0], ['DEF', 0.0, 1]]Passed
update 3[['ABC', -0.03, 3], ['GHI', -0.1, 3], ['JKL', -0.35, 2]][['ABC', -0.03, 3], ['GHI', -0.1, 3], ['JKL', -0.35, 2]]Passed
update 4[['ABC', 0.0, 0], ['GHI', 0.0, 1]][['ABC', 0.0, 0], ['GHI', 0.0, 1]]Passed
update 5[['ABC', -0.2, 3], ['DEF', 0.03, 3], ['GHI', -0.15, 4]][['ABC', -0.2, 3], ['DEF', 0.03, 3], ['GHI', -0.15, 4]]Passed
update 6[['ABC', 0.0, 1], ['DEF', 0.1, 2], ['JKL', -0.17, 3]][['ABC', 0.0, 1], ['DEF', 0.1, 2], ['JKL', -0.17, 3]]Passed
update 11[['ABC', 0.0, 1], ['DEF', 0.2, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]][['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]]Failed

SHA-256 / f11b3bc95a6fdd5a13ec1c0ddb985e1b97043412409d0a33aebfdea548146c59

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(events, min_n):
    res = {}
    for st, sm, nm in events:
        r = round(sm - nm, 2)
        res.setdefault(st, [])
        if abs(r) <= 1.0:
            res[st].append(r)
    out = []
    for st in sorted(res):
        kept = res[st]
        corr = round(-sum(kept) / len(kept), 2) if len(kept) >= min_n else 0.0
        out.append([st, corr + 0.0, len(kept)])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['update 0', [[['ABC', 4.08, 2.88], ['JKL', 4.17, 4.57], ['GHI', 2.75, 1.55], ['ABC', 1.69, 2.09], ['GHI', 4.14, 4.54], ['DEF', 1.62, 1.42], ['ABC', 4.95, 3.75]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]]], ['update 1', [[['JKL', 3.77, 3.87], ['JKL', 1.13, 1.53], ['GHI', 4.95, 4.95], ['JKL', 2.75, 2.55]], 2], [['GHI', 0.0, 1], ['JKL', 0.1, 3]]], ['update 2', [[['ABC', 4.36, 5.76], ['DEF', 1.34, 1.74]], 2], [['ABC', 0.0, 0], ['DEF', 0.0, 1]]], ['update 3', [[['GHI', 3.9, 4.3], ['ABC', 3.21, 3.61], ['JKL', 3.44, 2.24], ['GHI', 1.49, 0.99], ['ABC', 2.92, 2.92], ['ABC', 1.35, 0.85], ['JKL', 3.83, 3.33], ['JKL', 4.34, 5.74], ['GHI', 2.74, 2.54], ['JKL', 4.01, 3.81]], 2], [['ABC', -0.03, 3], ['GHI', -0.1, 3], ['JKL', -0.35, 2]]], ['update 4', [[['ABC', 4.03, 5.43], ['GHI', 1.35, 1.15]], 2], [['ABC', 0.0, 0], ['GHI', 0.0, 1]]], ['update 5', [[['ABC', 3.0, 2.8], ['DEF', 3.69, 3.79], ['GHI', 2.6, 2.1], ['ABC', 3.35, 2.85], ['GHI', 1.85, 2.25], ['DEF', 3.27, 3.27], ['GHI', 4.54, 4.54], ['GHI', 4.14, 3.64], ['ABC', 2.9, 4.3], ['DEF', 4.18, 4.18], ['ABC', 2.74, 2.84]], 3], [['ABC', -0.2, 3], ['DEF', 0.03, 3], ['GHI', -0.15, 4]]], ['update 6', [[['JKL', 4.59, 4.09], ['DEF', 4.81, 6.21], ['JKL', 4.33, 4.33], ['DEF', 2.75, 2.85], ['DEF', 3.37, 4.77], ['DEF', 4.94, 5.04], ['ABC', 2.58, 2.38], ['DEF', 4.52, 5.92], ['JKL', 1.3, 1.3]], 2], [['ABC', 0.0, 1], ['DEF', 0.1, 2], ['JKL', -0.17, 3]]], ['update 11', [[['ABC', 3.64, 2.44], ['DEF', 3.65, 2.45], ['GHI', 2.3, 2.7], ['JKL', 1.52, 1.62], ['JKL', 2.79, 2.59], ['JKL', 3.93, 4.33], ['DEF', 4.75, 4.75], ['ABC', 1.64, 1.14], ['DEF', 4.17, 4.57], ['GHI', 2.86, 1.66]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]]]], [['update 7', [[['GHI', 3.12, 4.52], ['DEF', 4.64, 4.64], ['JKL', 3.82, 4.22], ['ABC', 1.25, 1.35], ['ABC', 2.71, 2.51], ['DEF', 3.36, 3.76]], 3], [['ABC', 0.0, 2], ['DEF', 0.0, 2], ['GHI', 0.0, 0], ['JKL', 0.0, 1]]], ['update 8', [[['DEF', 1.07, -0.13], ['ABC', 1.63, 3.03], ['ABC', 1.47, 1.27]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 0]]], ['update 9', [[['JKL', 2.72, 2.72], ['GHI', 1.89, 1.89], ['GHI', 4.29, 4.29]], 3], [['GHI', 0.0, 2], ['JKL', 0.0, 1]]], ['update 10', [[['GHI', 2.55, 3.95], ['GHI', 4.57, 4.67], ['DEF', 2.95, 4.35]], 2], [['DEF', 0.0, 0], ['GHI', 0.0, 1]]], ['update 11', [[['ABC', 3.64, 2.44], ['DEF', 3.65, 2.45], ['GHI', 2.3, 2.7], ['JKL', 1.52, 1.62], ['JKL', 2.79, 2.59], ['JKL', 3.93, 4.33], ['DEF', 4.75, 4.75], ['ABC', 1.64, 1.14], ['DEF', 4.17, 4.57], ['GHI', 2.86, 1.66]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]]], ['update 12', [[['DEF', 4.64, 4.14], ['ABC', 3.51, 3.91], ['GHI', 2.69, 1.49], ['ABC', 3.3, 3.7], ['DEF', 3.3, 3.3], ['JKL', 3.68, 5.08], ['GHI', 2.34, 2.74], ['ABC', 4.82, 6.22], ['ABC', 4.34, 4.34], ['JKL', 3.8, 2.6]], 3], [['ABC', 0.27, 3], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.0, 0]]], ['update 13', [[['JKL', 1.73, 3.13], ['DEF', 4.48, 4.48], ['GHI', 2.01, 0.81], ['ABC', 1.82, 1.62], ['DEF', 1.44, 0.24], ['JKL', 2.06, 2.16]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 0], ['JKL', 0.0, 1]]], ['update 27', [[['GHI', 2.42, 2.42], ['DEF', 3.85, 5.25], ['GHI', 1.72, 0.52], ['DEF', 4.97, 5.07], ['DEF', 2.31, 2.11], ['ABC', 1.12, -0.08]], 3], [['ABC', 0.0, 0], ['DEF', 0.0, 2], ['GHI', 0.0, 1]]]], [['update 14', [[['JKL', 4.27, 4.37], ['DEF', 4.2, 4.2], ['ABC', 3.88, 4.28], ['DEF', 3.23, 3.03], ['ABC', 4.72, 5.12], ['DEF', 2.22, 1.72]], 2], [['ABC', 0.4, 2], ['DEF', -0.23, 3], ['JKL', 0.0, 1]]], ['update 15', [[['DEF', 4.66, 4.46], ['JKL', 1.26, 0.76], ['GHI', 2.61, 3.01], ['GHI', 3.72, 4.12], ['ABC', 1.11, 1.21]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.4, 2], ['JKL', 0.0, 1]]], ['update 16', [[['GHI', 4.77, 4.77], ['DEF', 3.19, 4.59], ['GHI', 2.0, 2.4], ['GHI', 1.56, 1.66], ['JKL', 3.74, 2.54], ['GHI', 3.83, 4.23], ['JKL', 4.29, 3.79], ['JKL', 4.44, 4.54], ['GHI', 3.59, 3.39], ['JKL', 3.34, 4.74], ['GHI', 2.05, 1.85]], 3], [['DEF', 0.0, 0], ['GHI', 0.08, 6], ['JKL', 0.0, 2]]], ['update 17', [[['GHI', 1.47, 1.57], ['ABC', 3.36, 3.16], ['DEF', 4.06, 5.46], ['DEF', 2.41, 2.21]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1]]], ['update 18', [[['GHI', 3.8, 3.6], ['GHI', 4.49, 5.89], ['DEF', 3.04, 1.84]], 2], [['DEF', 0.0, 0], ['GHI', 0.0, 1]]], ['update 19', [[['ABC', 4.48, 4.48], ['ABC', 4.46, 4.46], ['ABC', 2.5, 2.0], ['GHI', 3.14, 2.94], ['GHI', 3.25, 4.65], ['GHI', 4.42, 4.82], ['JKL', 4.58, 5.98], ['ABC', 2.72, 1.52], ['DEF', 4.99, 4.79], ['ABC', 3.34, 3.14], ['ABC', 3.13, 3.53], ['ABC', 2.09, 2.09]], 2], [['ABC', -0.05, 6], ['DEF', 0.0, 1], ['GHI', 0.1, 2], ['JKL', 0.0, 0]]], ['update 20', [[['JKL', 1.82, 0.62], ['GHI', 1.65, 1.45], ['ABC', 4.02, 3.82], ['JKL', 2.38, 2.78], ['JKL', 2.81, 2.81], ['ABC', 1.07, -0.13], ['JKL', 3.47, 3.87], ['GHI', 3.31, 3.11], ['DEF', 1.29, 1.29], ['JKL', 2.27, 3.67], ['ABC', 4.64, 3.44]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', -0.2, 2], ['JKL', 0.27, 3]]], ['update 23', [[['GHI', 4.6, 4.4], ['DEF', 2.07, 3.47], ['JKL', 4.75, 4.55], ['JKL', 1.31, 2.71], ['ABC', 4.84, 6.24], ['GHI', 1.4, 1.8], ['DEF', 3.5, 3.9], ['DEF', 2.03, 1.53], ['GHI', 3.07, 3.17], ['JKL', 2.49, 1.29], ['GHI', 4.66, 3.46], ['ABC', 1.36, 1.46]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.1, 3], ['JKL', 0.0, 1]]]], [['update 12', [[['DEF', 4.64, 4.14], ['ABC', 3.51, 3.91], ['GHI', 2.69, 1.49], ['ABC', 3.3, 3.7], ['DEF', 3.3, 3.3], ['JKL', 3.68, 5.08], ['GHI', 2.34, 2.74], ['ABC', 4.82, 6.22], ['ABC', 4.34, 4.34], ['JKL', 3.8, 2.6]], 3], [['ABC', 0.27, 3], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.0, 0]]], ['update 21', [[['JKL', 3.79, 3.59], ['ABC', 2.38, 2.38], ['GHI', 1.36, 2.76], ['JKL', 3.9, 2.7], ['GHI', 4.16, 3.66], ['JKL', 1.89, 0.69], ['GHI', 3.82, 3.82], ['DEF', 1.18, 1.58], ['ABC', 3.3, 3.1], ['ABC', 2.96, 2.96], ['JKL', 3.86, 3.66]], 2], [['ABC', -0.07, 3], ['DEF', 0.0, 1], ['GHI', -0.25, 2], ['JKL', -0.2, 2]]], ['update 22', [[['GHI', 4.5, 4.9], ['GHI', 1.1, 0.9], ['ABC', 2.26, 2.26], ['DEF', 4.3, 4.1], ['ABC', 2.38, 1.88]], 2], [['ABC', -0.25, 2], ['DEF', 0.0, 1], ['GHI', 0.1, 2]]], ['update 23', [[['GHI', 4.6, 4.4], ['DEF', 2.07, 3.47], ['JKL', 4.75, 4.55], ['JKL', 1.31, 2.71], ['ABC', 4.84, 6.24], ['GHI', 1.4, 1.8], ['DEF', 3.5, 3.9], ['DEF', 2.03, 1.53], ['GHI', 3.07, 3.17], ['JKL', 2.49, 1.29], ['GHI', 4.66, 3.46], ['ABC', 1.36, 1.46]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.1, 3], ['JKL', 0.0, 1]]], ['update 24', [[['ABC', 3.1, 2.6], ['ABC', 4.76, 4.86], ['ABC', 4.5, 3.3], ['DEF', 4.19, 2.99]], 3], [['ABC', 0.0, 2], ['DEF', 0.0, 0]]], ['update 25', [[['GHI', 1.14, 1.14], ['JKL', 1.52, 2.92], ['JKL', 4.34, 4.74], ['GHI', 4.19, 5.59]], 3], [['GHI', 0.0, 1], ['JKL', 0.0, 1]]], ['update 26', [[['ABC', 2.41, 2.41], ['GHI', 1.97, 3.37], ['DEF', 1.7, 1.8]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 0]]], ['update 27', [[['GHI', 2.42, 2.42], ['DEF', 3.85, 5.25], ['GHI', 1.72, 0.52], ['DEF', 4.97, 5.07], ['DEF', 2.31, 2.11], ['ABC', 1.12, -0.08]], 3], [['ABC', 0.0, 0], ['DEF', 0.0, 2], ['GHI', 0.0, 1]]]], [['update 0', [[['ABC', 4.08, 2.88], ['JKL', 4.17, 4.57], ['GHI', 2.75, 1.55], ['ABC', 1.69, 2.09], ['GHI', 4.14, 4.54], ['DEF', 1.62, 1.42], ['ABC', 4.95, 3.75]], 3], [['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]]], ['update 1', [[['JKL', 3.77, 3.87], ['JKL', 1.13, 1.53], ['GHI', 4.95, 4.95], ['JKL', 2.75, 2.55]], 2], [['GHI', 0.0, 1], ['JKL', 0.1, 3]]], ['update 2', [[['ABC', 4.36, 5.76], ['DEF', 1.34, 1.74]], 2], [['ABC', 0.0, 0], ['DEF', 0.0, 1]]], ['update 7', [[['GHI', 3.12, 4.52], ['DEF', 4.64, 4.64], ['JKL', 3.82, 4.22], ['ABC', 1.25, 1.35], ['ABC', 2.71, 2.51], ['DEF', 3.36, 3.76]], 3], [['ABC', 0.0, 2], ['DEF', 0.0, 2], ['GHI', 0.0, 0], ['JKL', 0.0, 1]]], ['update 28', [[['GHI', 2.19, 1.69], ['GHI', 3.1, 2.9], ['DEF', 1.51, 2.91], ['ABC', 3.68, 3.78], ['DEF', 1.85, 3.25], ['DEF', 4.85, 6.25]], 2], [['ABC', 0.0, 1], ['DEF', 0.0, 0], ['GHI', -0.35, 2]]], ['update 29', [[['DEF', 1.13, 2.53], ['DEF', 4.46, 4.46], ['DEF', 1.47, 1.47], ['ABC', 2.52, 3.92], ['ABC', 4.28, 4.08], ['DEF', 2.6, 2.7], ['ABC', 3.62, 3.42], ['GHI', 1.48, 1.48], ['GHI', 2.07, 1.87]], 2], [['ABC', -0.2, 2], ['DEF', 0.03, 3], ['GHI', -0.1, 2]]], ['exactly one-unit residual', [[['ABC', 4.0, 3.0], ['ABC', 3.5, 3.4], ['ABC', 3.0, 3.1]], 2], [['ABC', -0.33, 3]]], ['minimum count', [[['XYZ', 2.0, 2.3], ['XYZ', 2.2, 2.4], ['QRS', 1.0, 1.5]], 2], [['QRS', 0.0, 1], ['XYZ', 0.25, 2]]]]]
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
update 0[['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]][['ABC', 0.0, 1], ['DEF', 0.0, 1], ['GHI', 0.0, 1], ['JKL', 0.0, 1]]Passed
update 1[['GHI', 0.0, 1], ['JKL', 0.1, 3]][['GHI', 0.0, 1], ['JKL', 0.1, 3]]Passed
update 2[['ABC', 0.0, 0], ['DEF', 0.0, 1]][['ABC', 0.0, 0], ['DEF', 0.0, 1]]Passed
update 3[['ABC', -0.03, 3], ['GHI', -0.1, 3], ['JKL', -0.35, 2]][['ABC', -0.03, 3], ['GHI', -0.1, 3], ['JKL', -0.35, 2]]Passed
update 4[['ABC', 0.0, 0], ['GHI', 0.0, 1]][['ABC', 0.0, 0], ['GHI', 0.0, 1]]Passed
update 5[['ABC', -0.2, 3], ['DEF', 0.03, 3], ['GHI', -0.15, 4]][['ABC', -0.2, 3], ['DEF', 0.03, 3], ['GHI', -0.15, 4]]Passed
update 6[['ABC', 0.0, 1], ['DEF', 0.1, 2], ['JKL', -0.17, 3]][['ABC', 0.0, 1], ['DEF', 0.1, 2], ['JKL', -0.17, 3]]Passed
update 11[['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]][['ABC', 0.0, 1], ['DEF', 0.0, 2], ['GHI', 0.0, 1], ['JKL', 0.1, 3]]Passed

SHA-256 / f79599a83d6bc5269fa769100dd7c5e7c965067619cf62d57dc54c154de92d90

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

Case digest / a2795edd6ff55a8e901fef58208afd24c6704c6e58e54e69ed06742b85648c0f