FAILURE MAP
← Case archive

FA-72091 / Error-correcting codes / Open access

Min-sum sign includes the edge own message · case 01

Outgoing messages point back towards the incoming belief instead of the extrinsic one.

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

ROOT CAUSE

The sign product runs over all incoming LLRs including edge i.

VERIFIED REPAIR

Multiply only the signs of the other edges.

Unsuccessful approach: Taking the sign of the sum of the other LLRs lets one strong message outvote the parity of the signs.

Case contract

Offset min-sum check-node update for LDPC decoding with integer LLRs. For each edge i the outgoing message is the product of the signs of all OTHER incoming LLRs (0 counts as positive) times max(min |other LLR| - beta, 0). Fewer than two edges returns None. Return the outgoing messages in edge order.

Why this case matters

LDPC decoders in Wi-Fi, 5G and SSD controllers run this update billions of times per second.

1 / The failure

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

N = 1
observations = []
def solve(llrs, beta):
    if len(llrs) < 2:
        return None
    out = []
    for i in range(len(llrs)):
        others = llrs[:i] + llrs[i + 1:]
        sign = 1
        for v in llrs:
            if v < 0:
                sign = -sign
        mag = min(abs(v) for v in others)
        out.append(sign * max(mag - beta, 0))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression [[12, -11, -9, -2, 8, -3], 1]', [[12, -11, -9, -2, 8, -3], 1], [1, -1, -1, -2, 1, -1]], ['regression [[-3, 6], 2]', [[-3, 6], 2], [4, -1]], ['partial-repair [[12, 0, -10, 8], 1]', [[12, 0, -10, 8], 1], [0, -7, 0, 0]], ['control [[3, 4], 0]', [[3, 4], 0], [4, 3]], ['control [[1, -2, -3, -4], 1]', [[1, -2, -3, -4], 1], [-1, 0, 0, 0]], ['control [[-2, -12, 2, -7, 10, 7], 2]', [[-2, -12, 2, -7, 10, 7], 2], [0, 0, 0, 0, 0, 0]], ['control [[3, -8], 3]', [[3, -8], 3], [-5, 0]], ['control [[12, 2], 3]', [[12, 2], 3], [0, 9]]], [['regression [[1, 7, -2], 0]', [[1, 7, -2], 0], [-2, -1, 1]], ['regression [[-3, 6], 3]', [[-3, 6], 3], [3, 0]], ['partial-repair [[-6, 10, 0], 1]', [[-6, 10, 0], 1], [0, 0, -5]], ['control [[-12, 7, -1, 8, 11, -2], 3]', [[-12, 7, -1, 8, 11, -2], 3], [0, 0, 0, 0, 0, 0]], ['control [[2, 4], 3]', [[2, 4], 3], [1, 0]], ['control [[1, 11], 2]', [[1, 11], 2], [9, 0]], ['control [[2, 2, 2], 3]', [[2, 2, 2], 3], [0, 0, 0]], ['control [[-1], 0]', [[-1], 0], None]], [['regression [[-10, 12, 6, 2], 0]', [[-10, 12, 6, 2], 0], [2, -2, -2, -6]], ['regression [[5, -12, -9], 3]', [[5, -12, -9], 3], [6, -2, -2]], ['partial-repair [[4, -9, -7, -9, 6], 3]', [[4, -9, -7, -9, 6], 3], [-3, 1, 1, 1, -1]], ['control [[3, -8, 1], 2]', [[3, -8, 1], 2], [0, 0, -1]], ['control [[3, 4], 0]', [[3, 4], 0], [4, 3]], ['control [[1, -2, -3, -4], 1]', [[1, -2, -3, -4], 1], [-1, 0, 0, 0]], ['control [[-2, -12, 2, -7, 10, 7], 2]', [[-2, -12, 2, -7, 10, 7], 2], [0, 0, 0, 0, 0, 0]], ['control [[3, -8], 3]', [[3, -8], 3], [-5, 0]]], [['regression [[5, -3, -1, -4], 0]', [[5, -3, -1, -4], 0], [-1, 1, 3, 1]], ['regression [[11, 8, 12, -10], 1]', [[11, 8, 12, -10], 1], [-7, -9, -7, 7]], ['partial-repair [[11, -6, -1], 1]', [[11, -6, -1], 1], [0, 0, -5]], ['control [[12, 2], 3]', [[12, 2], 3], [0, 9]], ['control [[-12, 7, -1, 8, 11, -2], 3]', [[-12, 7, -1, 8, 11, -2], 3], [0, 0, 0, 0, 0, 0]], ['control [[2, 4], 3]', [[2, 4], 3], [1, 0]], ['control [[1, 11], 2]', [[1, 11], 2], [9, 0]], ['control [[2, 2, 2], 3]', [[2, 2, 2], 3], [0, 0, 0]]], [['regression [[-1, 2, -7], 1]', [[-1, 2, -7], 1], [-1, 0, 0]], ['regression [[5, -3], 1]', [[5, -3], 1], [-2, 4]], ['partial-repair [[0, -4, 6], 1]', [[0, -4, 6], 1], [-3, 0, 0]], ['partial-repair [[-7, -7, 1, 9], 0]', [[-7, -7, 1, 9], 0], [-1, -1, 7, 1]], ['control [[-1], 0]', [[-1], 0], None], ['control [[3, -8, 1], 2]', [[3, -8, 1], 2], [0, 0, -1]], ['control [[3, 4], 0]', [[3, 4], 0], [4, 3]], ['control [[1, -2, -3, -4], 1]', [[1, -2, -3, -4], 1], [-1, 0, 0, 0]]]]
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
regression [[12, -11, -9, -2, 8, -3], 1][1, 1, 1, 2, 1, 1][1, -1, -1, -2, 1, -1]Failed
regression [[-3, 6], 2][-4, -1][4, -1]Failed
partial-repair [[12, 0, -10, 8], 1][0, -7, 0, 0][0, -7, 0, 0]Passed
control [[3, 4], 0][4, 3][4, 3]Passed
control [[1, -2, -3, -4], 1][-1, 0, 0, 0][-1, 0, 0, 0]Passed
control [[-2, -12, 2, -7, 10, 7], 2][0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0]Passed
control [[3, -8], 3][-5, 0][-5, 0]Passed
control [[12, 2], 3][0, 9][0, 9]Passed

SHA-256 / 891f9d8a2e34d76d9f3a6b23e9a5c5c0193bf7b2ba09ea5dad0172045b2a7fc1

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(llrs, beta):
    if len(llrs) < 2:
        return None
    out = []
    for i in range(len(llrs)):
        others = llrs[:i] + llrs[i + 1:]
        sign = 1 if sum(others) >= 0 else -1
        for v in others:
            if v < 0:
                pass
        mag = min(abs(v) for v in others)
        out.append(sign * max(mag - beta, 0))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression [[12, -11, -9, -2, 8, -3], 1]', [[12, -11, -9, -2, 8, -3], 1], [1, -1, -1, -2, 1, -1]], ['regression [[-3, 6], 2]', [[-3, 6], 2], [4, -1]], ['partial-repair [[12, 0, -10, 8], 1]', [[12, 0, -10, 8], 1], [0, -7, 0, 0]], ['control [[3, 4], 0]', [[3, 4], 0], [4, 3]], ['control [[1, -2, -3, -4], 1]', [[1, -2, -3, -4], 1], [-1, 0, 0, 0]], ['control [[-2, -12, 2, -7, 10, 7], 2]', [[-2, -12, 2, -7, 10, 7], 2], [0, 0, 0, 0, 0, 0]], ['control [[3, -8], 3]', [[3, -8], 3], [-5, 0]], ['control [[12, 2], 3]', [[12, 2], 3], [0, 9]]], [['regression [[1, 7, -2], 0]', [[1, 7, -2], 0], [-2, -1, 1]], ['regression [[-3, 6], 3]', [[-3, 6], 3], [3, 0]], ['partial-repair [[-6, 10, 0], 1]', [[-6, 10, 0], 1], [0, 0, -5]], ['control [[-12, 7, -1, 8, 11, -2], 3]', [[-12, 7, -1, 8, 11, -2], 3], [0, 0, 0, 0, 0, 0]], ['control [[2, 4], 3]', [[2, 4], 3], [1, 0]], ['control [[1, 11], 2]', [[1, 11], 2], [9, 0]], ['control [[2, 2, 2], 3]', [[2, 2, 2], 3], [0, 0, 0]], ['control [[-1], 0]', [[-1], 0], None]], [['regression [[-10, 12, 6, 2], 0]', [[-10, 12, 6, 2], 0], [2, -2, -2, -6]], ['regression [[5, -12, -9], 3]', [[5, -12, -9], 3], [6, -2, -2]], ['partial-repair [[4, -9, -7, -9, 6], 3]', [[4, -9, -7, -9, 6], 3], [-3, 1, 1, 1, -1]], ['control [[3, -8, 1], 2]', [[3, -8, 1], 2], [0, 0, -1]], ['control [[3, 4], 0]', [[3, 4], 0], [4, 3]], ['control [[1, -2, -3, -4], 1]', [[1, -2, -3, -4], 1], [-1, 0, 0, 0]], ['control [[-2, -12, 2, -7, 10, 7], 2]', [[-2, -12, 2, -7, 10, 7], 2], [0, 0, 0, 0, 0, 0]], ['control [[3, -8], 3]', [[3, -8], 3], [-5, 0]]], [['regression [[5, -3, -1, -4], 0]', [[5, -3, -1, -4], 0], [-1, 1, 3, 1]], ['regression [[11, 8, 12, -10], 1]', [[11, 8, 12, -10], 1], [-7, -9, -7, 7]], ['partial-repair [[11, -6, -1], 1]', [[11, -6, -1], 1], [0, 0, -5]], ['control [[12, 2], 3]', [[12, 2], 3], [0, 9]], ['control [[-12, 7, -1, 8, 11, -2], 3]', [[-12, 7, -1, 8, 11, -2], 3], [0, 0, 0, 0, 0, 0]], ['control [[2, 4], 3]', [[2, 4], 3], [1, 0]], ['control [[1, 11], 2]', [[1, 11], 2], [9, 0]], ['control [[2, 2, 2], 3]', [[2, 2, 2], 3], [0, 0, 0]]], [['regression [[-1, 2, -7], 1]', [[-1, 2, -7], 1], [-1, 0, 0]], ['regression [[5, -3], 1]', [[5, -3], 1], [-2, 4]], ['partial-repair [[0, -4, 6], 1]', [[0, -4, 6], 1], [-3, 0, 0]], ['partial-repair [[-7, -7, 1, 9], 0]', [[-7, -7, 1, 9], 0], [-1, -1, 7, 1]], ['control [[-1], 0]', [[-1], 0], None], ['control [[3, -8, 1], 2]', [[3, -8, 1], 2], [0, 0, -1]], ['control [[3, 4], 0]', [[3, 4], 0], [4, 3]], ['control [[1, -2, -3, -4], 1]', [[1, -2, -3, -4], 1], [-1, 0, 0, 0]]]]
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
regression [[12, -11, -9, -2, 8, -3], 1][-1, 1, 1, -2, -1, -1][1, -1, -1, -2, 1, -1]Failed
regression [[-3, 6], 2][4, -1][4, -1]Passed
partial-repair [[12, 0, -10, 8], 1][0, 7, 0, 0][0, -7, 0, 0]Failed
control [[3, 4], 0][4, 3][4, 3]Passed
control [[1, -2, -3, -4], 1][-1, 0, 0, 0][-1, 0, 0, 0]Passed
control [[-2, -12, 2, -7, 10, 7], 2][0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0]Passed
control [[3, -8], 3][-5, 0][-5, 0]Passed
control [[12, 2], 3][0, 9][0, 9]Passed

SHA-256 / 0e9664b92e913771ed8d6a8a5e3884c2f828d5b4a0e759add0a40d605f03d26a

3 / The verified repair

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

N = 1
observations = []
def solve(llrs, beta):
    if len(llrs) < 2:
        return None
    out = []
    for i in range(len(llrs)):
        others = llrs[:i] + llrs[i + 1:]
        sign = 1
        for v in others:
            if v < 0:
                sign = -sign
        mag = min(abs(v) for v in others)
        out.append(sign * max(mag - beta, 0))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression [[12, -11, -9, -2, 8, -3], 1]', [[12, -11, -9, -2, 8, -3], 1], [1, -1, -1, -2, 1, -1]], ['regression [[-3, 6], 2]', [[-3, 6], 2], [4, -1]], ['partial-repair [[12, 0, -10, 8], 1]', [[12, 0, -10, 8], 1], [0, -7, 0, 0]], ['control [[3, 4], 0]', [[3, 4], 0], [4, 3]], ['control [[1, -2, -3, -4], 1]', [[1, -2, -3, -4], 1], [-1, 0, 0, 0]], ['control [[-2, -12, 2, -7, 10, 7], 2]', [[-2, -12, 2, -7, 10, 7], 2], [0, 0, 0, 0, 0, 0]], ['control [[3, -8], 3]', [[3, -8], 3], [-5, 0]], ['control [[12, 2], 3]', [[12, 2], 3], [0, 9]]], [['regression [[1, 7, -2], 0]', [[1, 7, -2], 0], [-2, -1, 1]], ['regression [[-3, 6], 3]', [[-3, 6], 3], [3, 0]], ['partial-repair [[-6, 10, 0], 1]', [[-6, 10, 0], 1], [0, 0, -5]], ['control [[-12, 7, -1, 8, 11, -2], 3]', [[-12, 7, -1, 8, 11, -2], 3], [0, 0, 0, 0, 0, 0]], ['control [[2, 4], 3]', [[2, 4], 3], [1, 0]], ['control [[1, 11], 2]', [[1, 11], 2], [9, 0]], ['control [[2, 2, 2], 3]', [[2, 2, 2], 3], [0, 0, 0]], ['control [[-1], 0]', [[-1], 0], None]], [['regression [[-10, 12, 6, 2], 0]', [[-10, 12, 6, 2], 0], [2, -2, -2, -6]], ['regression [[5, -12, -9], 3]', [[5, -12, -9], 3], [6, -2, -2]], ['partial-repair [[4, -9, -7, -9, 6], 3]', [[4, -9, -7, -9, 6], 3], [-3, 1, 1, 1, -1]], ['control [[3, -8, 1], 2]', [[3, -8, 1], 2], [0, 0, -1]], ['control [[3, 4], 0]', [[3, 4], 0], [4, 3]], ['control [[1, -2, -3, -4], 1]', [[1, -2, -3, -4], 1], [-1, 0, 0, 0]], ['control [[-2, -12, 2, -7, 10, 7], 2]', [[-2, -12, 2, -7, 10, 7], 2], [0, 0, 0, 0, 0, 0]], ['control [[3, -8], 3]', [[3, -8], 3], [-5, 0]]], [['regression [[5, -3, -1, -4], 0]', [[5, -3, -1, -4], 0], [-1, 1, 3, 1]], ['regression [[11, 8, 12, -10], 1]', [[11, 8, 12, -10], 1], [-7, -9, -7, 7]], ['partial-repair [[11, -6, -1], 1]', [[11, -6, -1], 1], [0, 0, -5]], ['control [[12, 2], 3]', [[12, 2], 3], [0, 9]], ['control [[-12, 7, -1, 8, 11, -2], 3]', [[-12, 7, -1, 8, 11, -2], 3], [0, 0, 0, 0, 0, 0]], ['control [[2, 4], 3]', [[2, 4], 3], [1, 0]], ['control [[1, 11], 2]', [[1, 11], 2], [9, 0]], ['control [[2, 2, 2], 3]', [[2, 2, 2], 3], [0, 0, 0]]], [['regression [[-1, 2, -7], 1]', [[-1, 2, -7], 1], [-1, 0, 0]], ['regression [[5, -3], 1]', [[5, -3], 1], [-2, 4]], ['partial-repair [[0, -4, 6], 1]', [[0, -4, 6], 1], [-3, 0, 0]], ['partial-repair [[-7, -7, 1, 9], 0]', [[-7, -7, 1, 9], 0], [-1, -1, 7, 1]], ['control [[-1], 0]', [[-1], 0], None], ['control [[3, -8, 1], 2]', [[3, -8, 1], 2], [0, 0, -1]], ['control [[3, 4], 0]', [[3, 4], 0], [4, 3]], ['control [[1, -2, -3, -4], 1]', [[1, -2, -3, -4], 1], [-1, 0, 0, 0]]]]
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
regression [[12, -11, -9, -2, 8, -3], 1][1, -1, -1, -2, 1, -1][1, -1, -1, -2, 1, -1]Passed
regression [[-3, 6], 2][4, -1][4, -1]Passed
partial-repair [[12, 0, -10, 8], 1][0, -7, 0, 0][0, -7, 0, 0]Passed
control [[3, 4], 0][4, 3][4, 3]Passed
control [[1, -2, -3, -4], 1][-1, 0, 0, 0][-1, 0, 0, 0]Passed
control [[-2, -12, 2, -7, 10, 7], 2][0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0]Passed
control [[3, -8], 3][-5, 0][-5, 0]Passed
control [[12, 2], 3][0, 9][0, 9]Passed

SHA-256 / a58cf648e40b0bfe358d3f836f0e72950a0751b4dab94e252b8ac74e1aaf8372

Verification & scope

A deterministic, bounded teaching model of the named code under the stated contract; not a production codec. 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:35.429025+00:00.

Case digest / 19fcb8b7d7cab65e77bbb9e8ded04e75066633878d3a4254412744a032002ac2