FA-91466 / Digital signal filters / Open access
Median filter uses the upper middle for even counts · case 01
Shrunken edge windows report the larger middle value instead of the mean of the two.
ROOT CAUSE
The even branch averages win[m//2] with itself.
VERIFIED REPAIR
Average win[m//2 - 1] and win[m//2].
Unsuccessful approach: The attempted repair averages with integer floor division, wrong for odd sums and negative values.
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 = 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] + 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: 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']], ['control: random median 3', [1, [2, -3, 7, 8, -2, 3, 8, 1]], ['2', '-3', '7', '8', '-2', '3', '8', '1']]], [['regression: negative odd sum', [3, [-3, 0, 5]], ['-3/2', '0', '5/2']], ['regression: random median 0', [3, [-2, -2, -2, 8]], ['-2', '-2', '-2', '3']], ['regression: duplicates', [3, [2, 2, 5, 2]], ['2', '2', '2', '7/2']], ['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']], ['control: random median 10', [1, [9, 3, -5, 8]], ['9', '3', '-5', '8']]], [['regression: random median 4', [3, [0, -4, -4, 3]], ['-2', '-4', '-4', '-1/2']], ['regression: random median 5', [3, [2, -2, -2, -2, -4, -4]], ['0', '-2', '-2', '-2', '-4', '-4']], ['regression: random median 2', [3, [5, 5, 3, -5, 8, -1]], ['5', '5', '3', '3', '-1', '7/2']], ['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']], ['control: random median 23', [1, [4, 1, -1, 3, -1]], ['4', '1', '-1', '3', '-1']]], [['regression: random median 11', [5, [4, 4, 3, -2, -2, 4, 2, 1]], ['4', '7/2', '3', '3', '2', '1', '3/2', '2']], ['regression: random median 12', [3, [7, 1, -5, -5, -5, 2, 5, -5]], ['4', '1', '-5', '-5', '-5', '2', '2', '0']], ['regression: random median 6', [3, [3, 9, 2, 4, 6, 3, -4]], ['6', '3', '4', '4', '4', '3', '-1/2']], ['control: random median 25', [1, [-5, 6]], ['-5', '6']], ['control: random median 27', [1, [-2, 5, -4, 7, 1, -3]], ['-2', '5', '-4', '7', '1', '-3']], ['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']]], [['regression: random median 16', [3, [7, 1, 4, -5, -5, 7, 2, -3]], ['4', '4', '1', '-5', '-5', '2', '2', '-1/2']], ['regression: random median 18', [5, [-4, 9, 8, -3, -2]], ['8', '5/2', '-2', '3', '-2']], ['regression: random median 13', [3, [1, -4, -1, 3, 9, 4, 6, 2]], ['-3/2', '-1', '-1', '3', '4', '6', '4', '4']], ['control: random median 35', [1, [-3, 0, 9]], ['-3', '0', '9']], ['control: random median 36', [1, [9, 8, 4]], ['9', '8', '4']], ['control: random median 37', [1, [-5, 8, 6, 4, -4, 5]], ['-5', '8', '6', '4', '-4', '5']], ['control: random median 39', [1, [3, 6, 4, 4, 1, -4, 9]], ['3', '6', '4', '4', '1', '-4', '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 | ['5', '5', '2', '9'] | ['3', '5', '2', '11/2'] | Failed |
| regression: edge even median | ['4', '4', '7'] | ['5/2', '4', '4'] | Failed |
| regression: duplicates | ['2', '2', '2', '5'] | ['2', '2', '2', '7/2'] | Failed |
| 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 |
| control: random median 3 | ['2', '-3', '7', '8', '-2', '3', '8', '1'] | ['2', '-3', '7', '8', '-2', '3', '8', '1'] | Passed |
SHA-256 / dbaddff5ce3c502582dd2978db97485841d75946e464d5f75bb670c449f5dadf
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(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: 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']], ['control: random median 3', [1, [2, -3, 7, 8, -2, 3, 8, 1]], ['2', '-3', '7', '8', '-2', '3', '8', '1']]], [['regression: negative odd sum', [3, [-3, 0, 5]], ['-3/2', '0', '5/2']], ['regression: random median 0', [3, [-2, -2, -2, 8]], ['-2', '-2', '-2', '3']], ['regression: duplicates', [3, [2, 2, 5, 2]], ['2', '2', '2', '7/2']], ['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']], ['control: random median 10', [1, [9, 3, -5, 8]], ['9', '3', '-5', '8']]], [['regression: random median 4', [3, [0, -4, -4, 3]], ['-2', '-4', '-4', '-1/2']], ['regression: random median 5', [3, [2, -2, -2, -2, -4, -4]], ['0', '-2', '-2', '-2', '-4', '-4']], ['regression: random median 2', [3, [5, 5, 3, -5, 8, -1]], ['5', '5', '3', '3', '-1', '7/2']], ['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']], ['control: random median 23', [1, [4, 1, -1, 3, -1]], ['4', '1', '-1', '3', '-1']]], [['regression: random median 11', [5, [4, 4, 3, -2, -2, 4, 2, 1]], ['4', '7/2', '3', '3', '2', '1', '3/2', '2']], ['regression: random median 12', [3, [7, 1, -5, -5, -5, 2, 5, -5]], ['4', '1', '-5', '-5', '-5', '2', '2', '0']], ['regression: random median 6', [3, [3, 9, 2, 4, 6, 3, -4]], ['6', '3', '4', '4', '4', '3', '-1/2']], ['control: random median 25', [1, [-5, 6]], ['-5', '6']], ['control: random median 27', [1, [-2, 5, -4, 7, 1, -3]], ['-2', '5', '-4', '7', '1', '-3']], ['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']]], [['regression: random median 16', [3, [7, 1, 4, -5, -5, 7, 2, -3]], ['4', '4', '1', '-5', '-5', '2', '2', '-1/2']], ['regression: random median 18', [5, [-4, 9, 8, -3, -2]], ['8', '5/2', '-2', '3', '-2']], ['regression: random median 13', [3, [1, -4, -1, 3, 9, 4, 6, 2]], ['-3/2', '-1', '-1', '3', '4', '6', '4', '4']], ['control: random median 35', [1, [-3, 0, 9]], ['-3', '0', '9']], ['control: random median 36', [1, [9, 8, 4]], ['9', '8', '4']], ['control: random median 37', [1, [-5, 8, 6, 4, -4, 5]], ['-5', '8', '6', '4', '-4', '5']], ['control: random median 39', [1, [3, 6, 4, 4, 1, -4, 9]], ['3', '6', '4', '4', '1', '-4', '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', '5'] | ['3', '5', '2', '11/2'] | Failed |
| regression: edge even median | ['2', '4', '4'] | ['5/2', '4', '4'] | Failed |
| regression: duplicates | ['2', '2', '2', '3'] | ['2', '2', '2', '7/2'] | Failed |
| 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 |
| control: random median 3 | ['2', '-3', '7', '8', '-2', '3', '8', '1'] | ['2', '-3', '7', '8', '-2', '3', '8', '1'] | Passed |
SHA-256 / 8697b4a59664cead01340da60407e012618870f63fae6be6ec9441a496642603
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: 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']], ['control: random median 3', [1, [2, -3, 7, 8, -2, 3, 8, 1]], ['2', '-3', '7', '8', '-2', '3', '8', '1']]], [['regression: negative odd sum', [3, [-3, 0, 5]], ['-3/2', '0', '5/2']], ['regression: random median 0', [3, [-2, -2, -2, 8]], ['-2', '-2', '-2', '3']], ['regression: duplicates', [3, [2, 2, 5, 2]], ['2', '2', '2', '7/2']], ['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']], ['control: random median 10', [1, [9, 3, -5, 8]], ['9', '3', '-5', '8']]], [['regression: random median 4', [3, [0, -4, -4, 3]], ['-2', '-4', '-4', '-1/2']], ['regression: random median 5', [3, [2, -2, -2, -2, -4, -4]], ['0', '-2', '-2', '-2', '-4', '-4']], ['regression: random median 2', [3, [5, 5, 3, -5, 8, -1]], ['5', '5', '3', '3', '-1', '7/2']], ['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']], ['control: random median 23', [1, [4, 1, -1, 3, -1]], ['4', '1', '-1', '3', '-1']]], [['regression: random median 11', [5, [4, 4, 3, -2, -2, 4, 2, 1]], ['4', '7/2', '3', '3', '2', '1', '3/2', '2']], ['regression: random median 12', [3, [7, 1, -5, -5, -5, 2, 5, -5]], ['4', '1', '-5', '-5', '-5', '2', '2', '0']], ['regression: random median 6', [3, [3, 9, 2, 4, 6, 3, -4]], ['6', '3', '4', '4', '4', '3', '-1/2']], ['control: random median 25', [1, [-5, 6]], ['-5', '6']], ['control: random median 27', [1, [-2, 5, -4, 7, 1, -3]], ['-2', '5', '-4', '7', '1', '-3']], ['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']]], [['regression: random median 16', [3, [7, 1, 4, -5, -5, 7, 2, -3]], ['4', '4', '1', '-5', '-5', '2', '2', '-1/2']], ['regression: random median 18', [5, [-4, 9, 8, -3, -2]], ['8', '5/2', '-2', '3', '-2']], ['regression: random median 13', [3, [1, -4, -1, 3, 9, 4, 6, 2]], ['-3/2', '-1', '-1', '3', '4', '6', '4', '4']], ['control: random median 35', [1, [-3, 0, 9]], ['-3', '0', '9']], ['control: random median 36', [1, [9, 8, 4]], ['9', '8', '4']], ['control: random median 37', [1, [-5, 8, 6, 4, -4, 5]], ['-5', '8', '6', '4', '-4', '5']], ['control: random median 39', [1, [3, 6, 4, 4, 1, -4, 9]], ['3', '6', '4', '4', '1', '-4', '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: 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 |
| control: random median 3 | ['2', '-3', '7', '8', '-2', '3', '8', '1'] | ['2', '-3', '7', '8', '-2', '3', '8', '1'] | Passed |
SHA-256 / 912e29797d0b60bfc5305c27815f8e87b329cc3314ae9d2507569a53bd97f0b1
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.273999+00:00.
Case digest / 0f531e845ce4887900c8f643f0508b2fcafe7cf8f51fbbc1f4fa1f4567be8cc0