FA-91451 / Digital signal filters / Open access
Median filter takes the middle sample without sorting · case 01
The output is the centre sample of the window, i.e. no filtering at all.
ROOT CAUSE
The window slice is used in time order rather than sorted.
VERIFIED REPAIR
Sort the window before selecting the middle.
Unsuccessful approach: The attempted repair sorts a de-duplicated set, which changes the median whenever values repeat.
Case contract
Input [K, samples]; K odd ("bad-kernel" otherwise). Output i is the median of samples[i-K//2 .. i+K//2] clipped to the valid range (shrinking windows at the edges); an even count uses the mean of the two middle values. Return exact fraction strings.
Why this case matters
Median filters remove impulse noise without blurring edges; window or tie handling slips shift features.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(x):
k, xs = x
if k < 1 or k % 2 == 0:
return 'bad-kernel'
h = k // 2
out = []
for i in range(len(xs)):
win = list(xs[max(0, i - h):i + h + 1])
m = len(win)
if m % 2:
out.append(str(Fraction(win[m // 2])))
else:
out.append(str(Fraction(win[m // 2 - 1] + win[m // 2], 2)))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: unsorted window', [3, [5, 1, 9, 2]], ['3', '5', '2', '11/2']], ['regression: edge even median', [3, [4, 1, 7]], ['5/2', '4', '4']], ['regression: duplicates', [3, [2, 2, 5, 2]], ['2', '2', '2', '7/2']], ['control: negative odd sum', [3, [-3, 0, 5]], ['-3/2', '0', '5/2']], ['control: even kernel', [2, [1, 2, 3]], 'bad-kernel'], ['control: even kernel four', [4, [1, 5, 2, 8]], 'bad-kernel'], ['control: random median 1', [1, [2, 3, 4, -2]], ['2', '3', '4', '-2']]], [['regression: random median 2', [3, [5, 5, 3, -5, 8, -1]], ['5', '5', '3', '3', '-1', '7/2']], ['regression: random median 6', [3, [3, 9, 2, 4, 6, 3, -4]], ['6', '3', '4', '4', '4', '3', '-1/2']], ['repair check: random median 4', [3, [0, -4, -4, 3]], ['-2', '-4', '-4', '-1/2']], ['control: random median 3', [1, [2, -3, 7, 8, -2, 3, 8, 1]], ['2', '-3', '7', '8', '-2', '3', '8', '1']], ['control: random median 7', [1, [7, 6, 6, -2, 6, 0, 8, -4]], ['7', '6', '6', '-2', '6', '0', '8', '-4']], ['control: random median 8', [1, [2, 8, -4, 9, 7, 7]], ['2', '8', '-4', '9', '7', '7']], ['control: random median 9', [1, [2, 5, 7, 9]], ['2', '5', '7', '9']]], [['regression: random median 12', [3, [7, 1, -5, -5, -5, 2, 5, -5]], ['4', '1', '-5', '-5', '-5', '2', '2', '0']], ['regression: random median 13', [3, [1, -4, -1, 3, 9, 4, 6, 2]], ['-3/2', '-1', '-1', '3', '4', '6', '4', '4']], ['repair check: random median 5', [3, [2, -2, -2, -2, -4, -4]], ['0', '-2', '-2', '-2', '-4', '-4']], ['control: random median 10', [1, [9, 3, -5, 8]], ['9', '3', '-5', '8']], ['control: random median 14', [1, [2, 8, 6, 5, -4, -3, -1]], ['2', '8', '6', '5', '-4', '-3', '-1']], ['control: random median 15', [1, [8, 2]], ['8', '2']], ['control: random median 17', [1, [-5, -2, -4, 5, 9, 2, -4]], ['-5', '-2', '-4', '5', '9', '2', '-4']]], [['regression: random median 18', [5, [-4, 9, 8, -3, -2]], ['8', '5/2', '-2', '3', '-2']], ['regression: random median 19', [3, [7, 8, -4]], ['15/2', '7', '2']], ['regression: random median 12', [3, [7, 1, -5, -5, -5, 2, 5, -5]], ['4', '1', '-5', '-5', '-5', '2', '2', '0']], ['control: random median 23', [1, [4, 1, -1, 3, -1]], ['4', '1', '-1', '3', '-1']], ['control: random median 25', [1, [-5, 6]], ['-5', '6']], ['control: random median 26', [3, [-4, 5]], ['1/2', '1/2']], ['control: random median 27', [1, [-2, 5, -4, 7, 1, -3]], ['-2', '5', '-4', '7', '1', '-3']]], [['regression: random median 22', [5, [3, -1, 4, 8, 9]], ['3', '7/2', '4', '6', '8']], ['regression: random median 24', [3, [8, -2, -5, 4, 2]], ['3', '-2', '-2', '2', '3']], ['repair check: random median 20', [3, [-3, -5, -5]], ['-4', '-5', '-5']], ['control: random median 28', [1, [1, -1, 2, 9, 2, 3, 6]], ['1', '-1', '2', '9', '2', '3', '6']], ['control: random median 29', [5, [9, 8, 5]], ['8', '8', '8']], ['control: random median 34', [3, [-1, 5]], ['2', '2']], ['control: random median 35', [1, [-3, 0, 9]], ['-3', '0', '9']]]]
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 |
|---|---|---|---|
| regression: unsorted window | ['3', '1', '9', '11/2'] | ['3', '5', '2', '11/2'] | Failed |
| regression: edge even median | ['5/2', '1', '4'] | ['5/2', '4', '4'] | Failed |
| regression: duplicates | ['2', '2', '5', '7/2'] | ['2', '2', '2', '7/2'] | Failed |
| control: negative odd sum | ['-3/2', '0', '5/2'] | ['-3/2', '0', '5/2'] | Passed |
| control: even kernel | bad-kernel | bad-kernel | Passed |
| control: even kernel four | bad-kernel | bad-kernel | Passed |
| control: random median 1 | ['2', '3', '4', '-2'] | ['2', '3', '4', '-2'] | Passed |
SHA-256 / 28321666975f230bd1cda5814c5492299506eb70bef7c0bd77b3286efbfa16e5
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(x):
k, xs = x
if k < 1 or k % 2 == 0:
return 'bad-kernel'
h = k // 2
out = []
for i in range(len(xs)):
win = sorted(set(xs[max(0, i - h):i + h + 1]))
m = len(win)
if m % 2:
out.append(str(Fraction(win[m // 2])))
else:
out.append(str(Fraction(win[m // 2 - 1] + win[m // 2], 2)))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: unsorted window', [3, [5, 1, 9, 2]], ['3', '5', '2', '11/2']], ['regression: edge even median', [3, [4, 1, 7]], ['5/2', '4', '4']], ['regression: duplicates', [3, [2, 2, 5, 2]], ['2', '2', '2', '7/2']], ['control: negative odd sum', [3, [-3, 0, 5]], ['-3/2', '0', '5/2']], ['control: even kernel', [2, [1, 2, 3]], 'bad-kernel'], ['control: even kernel four', [4, [1, 5, 2, 8]], 'bad-kernel'], ['control: random median 1', [1, [2, 3, 4, -2]], ['2', '3', '4', '-2']]], [['regression: random median 2', [3, [5, 5, 3, -5, 8, -1]], ['5', '5', '3', '3', '-1', '7/2']], ['regression: random median 6', [3, [3, 9, 2, 4, 6, 3, -4]], ['6', '3', '4', '4', '4', '3', '-1/2']], ['repair check: random median 4', [3, [0, -4, -4, 3]], ['-2', '-4', '-4', '-1/2']], ['control: random median 3', [1, [2, -3, 7, 8, -2, 3, 8, 1]], ['2', '-3', '7', '8', '-2', '3', '8', '1']], ['control: random median 7', [1, [7, 6, 6, -2, 6, 0, 8, -4]], ['7', '6', '6', '-2', '6', '0', '8', '-4']], ['control: random median 8', [1, [2, 8, -4, 9, 7, 7]], ['2', '8', '-4', '9', '7', '7']], ['control: random median 9', [1, [2, 5, 7, 9]], ['2', '5', '7', '9']]], [['regression: random median 12', [3, [7, 1, -5, -5, -5, 2, 5, -5]], ['4', '1', '-5', '-5', '-5', '2', '2', '0']], ['regression: random median 13', [3, [1, -4, -1, 3, 9, 4, 6, 2]], ['-3/2', '-1', '-1', '3', '4', '6', '4', '4']], ['repair check: random median 5', [3, [2, -2, -2, -2, -4, -4]], ['0', '-2', '-2', '-2', '-4', '-4']], ['control: random median 10', [1, [9, 3, -5, 8]], ['9', '3', '-5', '8']], ['control: random median 14', [1, [2, 8, 6, 5, -4, -3, -1]], ['2', '8', '6', '5', '-4', '-3', '-1']], ['control: random median 15', [1, [8, 2]], ['8', '2']], ['control: random median 17', [1, [-5, -2, -4, 5, 9, 2, -4]], ['-5', '-2', '-4', '5', '9', '2', '-4']]], [['regression: random median 18', [5, [-4, 9, 8, -3, -2]], ['8', '5/2', '-2', '3', '-2']], ['regression: random median 19', [3, [7, 8, -4]], ['15/2', '7', '2']], ['regression: random median 12', [3, [7, 1, -5, -5, -5, 2, 5, -5]], ['4', '1', '-5', '-5', '-5', '2', '2', '0']], ['control: random median 23', [1, [4, 1, -1, 3, -1]], ['4', '1', '-1', '3', '-1']], ['control: random median 25', [1, [-5, 6]], ['-5', '6']], ['control: random median 26', [3, [-4, 5]], ['1/2', '1/2']], ['control: random median 27', [1, [-2, 5, -4, 7, 1, -3]], ['-2', '5', '-4', '7', '1', '-3']]], [['regression: random median 22', [5, [3, -1, 4, 8, 9]], ['3', '7/2', '4', '6', '8']], ['regression: random median 24', [3, [8, -2, -5, 4, 2]], ['3', '-2', '-2', '2', '3']], ['repair check: random median 20', [3, [-3, -5, -5]], ['-4', '-5', '-5']], ['control: random median 28', [1, [1, -1, 2, 9, 2, 3, 6]], ['1', '-1', '2', '9', '2', '3', '6']], ['control: random median 29', [5, [9, 8, 5]], ['8', '8', '8']], ['control: random median 34', [3, [-1, 5]], ['2', '2']], ['control: random median 35', [1, [-3, 0, 9]], ['-3', '0', '9']]]]
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 |
|---|---|---|---|
| regression: unsorted window | ['3', '5', '2', '11/2'] | ['3', '5', '2', '11/2'] | Passed |
| regression: edge even median | ['5/2', '4', '4'] | ['5/2', '4', '4'] | Passed |
| regression: duplicates | ['2', '7/2', '7/2', '7/2'] | ['2', '2', '2', '7/2'] | Failed |
| control: negative odd sum | ['-3/2', '0', '5/2'] | ['-3/2', '0', '5/2'] | Passed |
| control: even kernel | bad-kernel | bad-kernel | Passed |
| control: even kernel four | bad-kernel | bad-kernel | Passed |
| control: random median 1 | ['2', '3', '4', '-2'] | ['2', '3', '4', '-2'] | Passed |
SHA-256 / 1f4bc483476d3f253e5c8adef2987060121ee904210371ad4b2808bc8c1b6b71
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(x):
k, xs = x
if k < 1 or k % 2 == 0:
return 'bad-kernel'
h = k // 2
out = []
for i in range(len(xs)):
win = sorted(xs[max(0, i - h):i + h + 1])
m = len(win)
if m % 2:
out.append(str(Fraction(win[m // 2])))
else:
out.append(str(Fraction(win[m // 2 - 1] + win[m // 2], 2)))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: unsorted window', [3, [5, 1, 9, 2]], ['3', '5', '2', '11/2']], ['regression: edge even median', [3, [4, 1, 7]], ['5/2', '4', '4']], ['regression: duplicates', [3, [2, 2, 5, 2]], ['2', '2', '2', '7/2']], ['control: negative odd sum', [3, [-3, 0, 5]], ['-3/2', '0', '5/2']], ['control: even kernel', [2, [1, 2, 3]], 'bad-kernel'], ['control: even kernel four', [4, [1, 5, 2, 8]], 'bad-kernel'], ['control: random median 1', [1, [2, 3, 4, -2]], ['2', '3', '4', '-2']]], [['regression: random median 2', [3, [5, 5, 3, -5, 8, -1]], ['5', '5', '3', '3', '-1', '7/2']], ['regression: random median 6', [3, [3, 9, 2, 4, 6, 3, -4]], ['6', '3', '4', '4', '4', '3', '-1/2']], ['repair check: random median 4', [3, [0, -4, -4, 3]], ['-2', '-4', '-4', '-1/2']], ['control: random median 3', [1, [2, -3, 7, 8, -2, 3, 8, 1]], ['2', '-3', '7', '8', '-2', '3', '8', '1']], ['control: random median 7', [1, [7, 6, 6, -2, 6, 0, 8, -4]], ['7', '6', '6', '-2', '6', '0', '8', '-4']], ['control: random median 8', [1, [2, 8, -4, 9, 7, 7]], ['2', '8', '-4', '9', '7', '7']], ['control: random median 9', [1, [2, 5, 7, 9]], ['2', '5', '7', '9']]], [['regression: random median 12', [3, [7, 1, -5, -5, -5, 2, 5, -5]], ['4', '1', '-5', '-5', '-5', '2', '2', '0']], ['regression: random median 13', [3, [1, -4, -1, 3, 9, 4, 6, 2]], ['-3/2', '-1', '-1', '3', '4', '6', '4', '4']], ['repair check: random median 5', [3, [2, -2, -2, -2, -4, -4]], ['0', '-2', '-2', '-2', '-4', '-4']], ['control: random median 10', [1, [9, 3, -5, 8]], ['9', '3', '-5', '8']], ['control: random median 14', [1, [2, 8, 6, 5, -4, -3, -1]], ['2', '8', '6', '5', '-4', '-3', '-1']], ['control: random median 15', [1, [8, 2]], ['8', '2']], ['control: random median 17', [1, [-5, -2, -4, 5, 9, 2, -4]], ['-5', '-2', '-4', '5', '9', '2', '-4']]], [['regression: random median 18', [5, [-4, 9, 8, -3, -2]], ['8', '5/2', '-2', '3', '-2']], ['regression: random median 19', [3, [7, 8, -4]], ['15/2', '7', '2']], ['regression: random median 12', [3, [7, 1, -5, -5, -5, 2, 5, -5]], ['4', '1', '-5', '-5', '-5', '2', '2', '0']], ['control: random median 23', [1, [4, 1, -1, 3, -1]], ['4', '1', '-1', '3', '-1']], ['control: random median 25', [1, [-5, 6]], ['-5', '6']], ['control: random median 26', [3, [-4, 5]], ['1/2', '1/2']], ['control: random median 27', [1, [-2, 5, -4, 7, 1, -3]], ['-2', '5', '-4', '7', '1', '-3']]], [['regression: random median 22', [5, [3, -1, 4, 8, 9]], ['3', '7/2', '4', '6', '8']], ['regression: random median 24', [3, [8, -2, -5, 4, 2]], ['3', '-2', '-2', '2', '3']], ['repair check: random median 20', [3, [-3, -5, -5]], ['-4', '-5', '-5']], ['control: random median 28', [1, [1, -1, 2, 9, 2, 3, 6]], ['1', '-1', '2', '9', '2', '3', '6']], ['control: random median 29', [5, [9, 8, 5]], ['8', '8', '8']], ['control: random median 34', [3, [-1, 5]], ['2', '2']], ['control: random median 35', [1, [-3, 0, 9]], ['-3', '0', '9']]]]
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 |
|---|---|---|---|
| regression: unsorted window | ['3', '5', '2', '11/2'] | ['3', '5', '2', '11/2'] | Passed |
| regression: edge even median | ['5/2', '4', '4'] | ['5/2', '4', '4'] | Passed |
| regression: duplicates | ['2', '2', '2', '7/2'] | ['2', '2', '2', '7/2'] | Passed |
| control: negative odd sum | ['-3/2', '0', '5/2'] | ['-3/2', '0', '5/2'] | Passed |
| control: even kernel | bad-kernel | bad-kernel | Passed |
| control: even kernel four | bad-kernel | bad-kernel | Passed |
| control: random median 1 | ['2', '3', '4', '-2'] | ['2', '3', '4', '-2'] | Passed |
SHA-256 / 4394eabf5edbbfccee1767d53740382bcd00aabb03b53f82a63d85ee2aedbd6d
Verification & scope
A deterministic bounded teaching model with a stipulated toy contract; exact rational arithmetic or fixed-decimal rounding keeps outputs strict JSON. It is not a production DSP library and claims no standards conformance. 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:51:36.142691+00:00.
Case digest / ae4f5814f888ba48aaf1511351ca9f9f57c4932cef07e6698edc293d9ac4f8ef