FA-91446 / Digital signal filters / Open access
CIC comb subtracts the new sample from the delayed one · case 01
Outputs have the opposite sign for odd N.
ROOT CAUSE
The comb computes v[k-M] - v instead of v - v[k-M].
VERIFIED REPAIR
Compute v - delayed.
Unsuccessful approach: The attempted repair takes the absolute difference, destroying the sign of negative inputs.
Case contract
Input [N, R, M, samples]: N integrator stages at the input rate, keep the integrator output at indices R-1, 2R-1, ... (whole blocks only), then N comb stages y = v - v[k-M] at the low rate with zero initial state; divide by the gain (R M)^N and return exact fraction strings.
Why this case matters
CIC decimators front most digital down-converters; decimation phase, delay or gain slips distort the passband level.
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):
N, R, M, xs = x
ints = [0] * N
dec = []
for i, v in enumerate(xs):
acc = v
for k in range(N):
ints[k] += acc
acc = ints[k]
if i % R == R - 1:
dec.append(acc)
combs = [[0] * M for _ in range(N)]
out = []
for v in dec:
for k in range(N):
d = combs[k]
prev = d.pop(0)
d.append(v)
v = prev - v
out.append(str(Fraction(v, (R * M) ** N)))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: one stage R=2 M=1', [1, 2, 1, [1, 2, 3, 4, 5, 6]], ['3/2', '7/2', '11/2']], ['regression: partial final block', [1, 3, 1, [3, 3, 3, 3, 3]], ['3']], ['regression: random cic 2', [1, 3, 1, [2, 2, 3, -2, 1, -2, 3, 1, -3]], ['7/3', '-1', '1/3']], ['control: two stages R=3 M=2', [2, 3, 2, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], ['1/12', '1/6', '1/12', '0']], ['control: random cic 13', [2, 3, 2, [0, 3, 3, -2, 4, -2, 2, 4, 1, 1]], ['1/4', '3/4', '7/6']], ['control: random cic 23', [2, 4, 2, [-3, 5, 5, 3, 0, 2, -3, 3, 4, 5, 0, -1, 0, 1, -1, 1, 1]], ['1/4', '59/64', '105/64', '101/64']], ['control: random cic 25', [2, 2, 2, [-1, 2, 5, -2, -1]], ['0', '5/8']]], [['regression: random cic 0', [1, 3, 2, [4, 1, 1, 5, -2, 4, -1, 4, 5]], ['1', '13/6', '5/2']], ['regression: random cic 1', [1, 4, 1, [2, -1, 3, 4, 5, -3, 5, -2, 3, -1, 2, -3, -3, 0, 4, 0, 2, 4, 1]], ['2', '5/4', '1/4', '1/4']], ['regression: random cic 5', [3, 2, 2, [-2, 2, -3, 2, -2, -3, 3, -3, -1]], ['-1/16', '-15/64', '-27/64', '-9/16']], ['control: random cic 26', [2, 2, 1, [1, 5, -3, 3, -2, 1, -1, 4, 1, 2]], ['7/4', '1/2', '0', '3/4', '2']], ['control: random cic 27', [2, 4, 1, [-1, 3, 5, 4, -3, 3, 3, 2, 2]], ['19/16', '15/8']], ['control: random cic 35', [2, 4, 2, [4, 1, 2, 2, 5, 1, -1, -2, -2, 3, 3, -3, 2]], ['25/64', '5/4', '41/32']], ['control: random cic 40', [2, 4, 2, [4, -2, 4, 1, 3, -2, -3, 5, 1, 1]], ['19/64', '13/16']]], [['regression: random cic 3', [3, 2, 2, [3, -3, 3, 5, -2, 3, 2, 4, 2, 2, 0]], ['3/32', '13/32', '57/64', '23/16', '63/32']], ['regression: random cic 4', [1, 2, 2, [-3, 1, 4, 2, 4, 2, -3, 5]], ['-1/2', '1', '3', '2']], ['repair check: random cic 7', [2, 4, 1, [3, -2, 2, -1, 3, -1, 0, -1, 0, -2, -3, -2]], ['9/16', '7/16', '-9/8']], ['control: random cic 41', [2, 4, 1, [1, 4, 3, 3, 1, 1, -1, 0, -2, 5, 0, 3, 2, 4, 2, 4, 5, 5, 1, -2]], ['25/16', '3/2', '9/16', '21/8', '55/16']], ['control: random cic 47', [2, 4, 1, [-2, 0, 4, 0, -1, 5, -2, 4, 0, -2, -1]], ['0', '19/16']], ['control: two stages R=3 M=2', [2, 3, 2, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], ['1/12', '1/6', '1/12', '0']], ['control: random cic 13', [2, 3, 2, [0, 3, 3, -2, 4, -2, 2, 4, 1, 1]], ['1/4', '3/4', '7/6']]], [['regression: random cic 6', [1, 4, 1, [-2, 5, 3, -2, 5, -2, 1, 3, 0, -2, -3, 4, -2, -1, 5, 4, 2, 0, -2, 1]], ['1', '7/4', '-1/4', '3/2', '1/4']], ['regression: random cic 8', [3, 3, 1, [-1, 1, 5, 5, 3, 3, 0, -2, 2, 2, 1, 1, 1, -3]], ['2/27', '80/27', '55/27', '7/9']], ['regression: random cic 16', [3, 2, 2, [-1, 0, 1, 2, 5, 5, 3, -1, 5, -3]], ['-3/64', '-5/64', '15/32', '59/32', '181/64']], ['control: random cic 23', [2, 4, 2, [-3, 5, 5, 3, 0, 2, -3, 3, 4, 5, 0, -1, 0, 1, -1, 1, 1]], ['1/4', '59/64', '105/64', '101/64']], ['control: random cic 25', [2, 2, 2, [-1, 2, 5, -2, -1]], ['0', '5/8']], ['control: random cic 26', [2, 2, 1, [1, 5, -3, 3, -2, 1, -1, 4, 1, 2]], ['7/4', '1/2', '0', '3/4', '2']], ['control: random cic 27', [2, 4, 1, [-1, 3, 5, 4, -3, 3, 3, 2, 2]], ['19/16', '15/8']]], [['regression: random cic 10', [3, 2, 2, [-2, 3, -2, 1, 1, 0, 0]], ['-3/64', '-7/64', '1/64']], ['regression: random cic 11', [3, 2, 2, [1, -1, 2, 1, -2, 3]], ['1/32', '11/64', '23/64']], ['repair check: random cic 19', [2, 4, 1, [4, 4, 2, 0, -3, 0, -1, 5, 0, 3, -1, 1]], ['2', '-1/16', '21/16']], ['control: random cic 35', [2, 4, 2, [4, 1, 2, 2, 5, 1, -1, -2, -2, 3, 3, -3, 2]], ['25/64', '5/4', '41/32']], ['control: random cic 40', [2, 4, 2, [4, -2, 4, 1, 3, -2, -3, 5, 1, 1]], ['19/64', '13/16']], ['control: random cic 41', [2, 4, 1, [1, 4, 3, 3, 1, 1, -1, 0, -2, 5, 0, 3, 2, 4, 2, 4, 5, 5, 1, -2]], ['25/16', '3/2', '9/16', '21/8', '55/16']], ['control: random cic 47', [2, 4, 1, [-2, 0, 4, 0, -1, 5, -2, 4, 0, -2, -1]], ['0', '19/16']]]]
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: one stage R=2 M=1 | ['-3/2', '-7/2', '-11/2'] | ['3/2', '7/2', '11/2'] | Failed |
| regression: partial final block | ['-3'] | ['3'] | Failed |
| regression: random cic 2 | ['-7/3', '1', '-1/3'] | ['7/3', '-1', '1/3'] | Failed |
| control: two stages R=3 M=2 | ['1/12', '1/6', '1/12', '0'] | ['1/12', '1/6', '1/12', '0'] | Passed |
| control: random cic 13 | ['1/4', '3/4', '7/6'] | ['1/4', '3/4', '7/6'] | Passed |
| control: random cic 23 | ['1/4', '59/64', '105/64', '101/64'] | ['1/4', '59/64', '105/64', '101/64'] | Passed |
| control: random cic 25 | ['0', '5/8'] | ['0', '5/8'] | Passed |
SHA-256 / f698cf5152d6fa401d5b838409b91779d66f0d2a196c10c9c058a998138cd78c
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):
N, R, M, xs = x
ints = [0] * N
dec = []
for i, v in enumerate(xs):
acc = v
for k in range(N):
ints[k] += acc
acc = ints[k]
if i % R == R - 1:
dec.append(acc)
combs = [[0] * M for _ in range(N)]
out = []
for v in dec:
for k in range(N):
d = combs[k]
prev = d.pop(0)
d.append(v)
v = abs(v - prev)
out.append(str(Fraction(v, (R * M) ** N)))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: one stage R=2 M=1', [1, 2, 1, [1, 2, 3, 4, 5, 6]], ['3/2', '7/2', '11/2']], ['regression: partial final block', [1, 3, 1, [3, 3, 3, 3, 3]], ['3']], ['regression: random cic 2', [1, 3, 1, [2, 2, 3, -2, 1, -2, 3, 1, -3]], ['7/3', '-1', '1/3']], ['control: two stages R=3 M=2', [2, 3, 2, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], ['1/12', '1/6', '1/12', '0']], ['control: random cic 13', [2, 3, 2, [0, 3, 3, -2, 4, -2, 2, 4, 1, 1]], ['1/4', '3/4', '7/6']], ['control: random cic 23', [2, 4, 2, [-3, 5, 5, 3, 0, 2, -3, 3, 4, 5, 0, -1, 0, 1, -1, 1, 1]], ['1/4', '59/64', '105/64', '101/64']], ['control: random cic 25', [2, 2, 2, [-1, 2, 5, -2, -1]], ['0', '5/8']]], [['regression: random cic 0', [1, 3, 2, [4, 1, 1, 5, -2, 4, -1, 4, 5]], ['1', '13/6', '5/2']], ['regression: random cic 1', [1, 4, 1, [2, -1, 3, 4, 5, -3, 5, -2, 3, -1, 2, -3, -3, 0, 4, 0, 2, 4, 1]], ['2', '5/4', '1/4', '1/4']], ['regression: random cic 5', [3, 2, 2, [-2, 2, -3, 2, -2, -3, 3, -3, -1]], ['-1/16', '-15/64', '-27/64', '-9/16']], ['control: random cic 26', [2, 2, 1, [1, 5, -3, 3, -2, 1, -1, 4, 1, 2]], ['7/4', '1/2', '0', '3/4', '2']], ['control: random cic 27', [2, 4, 1, [-1, 3, 5, 4, -3, 3, 3, 2, 2]], ['19/16', '15/8']], ['control: random cic 35', [2, 4, 2, [4, 1, 2, 2, 5, 1, -1, -2, -2, 3, 3, -3, 2]], ['25/64', '5/4', '41/32']], ['control: random cic 40', [2, 4, 2, [4, -2, 4, 1, 3, -2, -3, 5, 1, 1]], ['19/64', '13/16']]], [['regression: random cic 3', [3, 2, 2, [3, -3, 3, 5, -2, 3, 2, 4, 2, 2, 0]], ['3/32', '13/32', '57/64', '23/16', '63/32']], ['regression: random cic 4', [1, 2, 2, [-3, 1, 4, 2, 4, 2, -3, 5]], ['-1/2', '1', '3', '2']], ['repair check: random cic 7', [2, 4, 1, [3, -2, 2, -1, 3, -1, 0, -1, 0, -2, -3, -2]], ['9/16', '7/16', '-9/8']], ['control: random cic 41', [2, 4, 1, [1, 4, 3, 3, 1, 1, -1, 0, -2, 5, 0, 3, 2, 4, 2, 4, 5, 5, 1, -2]], ['25/16', '3/2', '9/16', '21/8', '55/16']], ['control: random cic 47', [2, 4, 1, [-2, 0, 4, 0, -1, 5, -2, 4, 0, -2, -1]], ['0', '19/16']], ['control: two stages R=3 M=2', [2, 3, 2, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], ['1/12', '1/6', '1/12', '0']], ['control: random cic 13', [2, 3, 2, [0, 3, 3, -2, 4, -2, 2, 4, 1, 1]], ['1/4', '3/4', '7/6']]], [['regression: random cic 6', [1, 4, 1, [-2, 5, 3, -2, 5, -2, 1, 3, 0, -2, -3, 4, -2, -1, 5, 4, 2, 0, -2, 1]], ['1', '7/4', '-1/4', '3/2', '1/4']], ['regression: random cic 8', [3, 3, 1, [-1, 1, 5, 5, 3, 3, 0, -2, 2, 2, 1, 1, 1, -3]], ['2/27', '80/27', '55/27', '7/9']], ['regression: random cic 16', [3, 2, 2, [-1, 0, 1, 2, 5, 5, 3, -1, 5, -3]], ['-3/64', '-5/64', '15/32', '59/32', '181/64']], ['control: random cic 23', [2, 4, 2, [-3, 5, 5, 3, 0, 2, -3, 3, 4, 5, 0, -1, 0, 1, -1, 1, 1]], ['1/4', '59/64', '105/64', '101/64']], ['control: random cic 25', [2, 2, 2, [-1, 2, 5, -2, -1]], ['0', '5/8']], ['control: random cic 26', [2, 2, 1, [1, 5, -3, 3, -2, 1, -1, 4, 1, 2]], ['7/4', '1/2', '0', '3/4', '2']], ['control: random cic 27', [2, 4, 1, [-1, 3, 5, 4, -3, 3, 3, 2, 2]], ['19/16', '15/8']]], [['regression: random cic 10', [3, 2, 2, [-2, 3, -2, 1, 1, 0, 0]], ['-3/64', '-7/64', '1/64']], ['regression: random cic 11', [3, 2, 2, [1, -1, 2, 1, -2, 3]], ['1/32', '11/64', '23/64']], ['repair check: random cic 19', [2, 4, 1, [4, 4, 2, 0, -3, 0, -1, 5, 0, 3, -1, 1]], ['2', '-1/16', '21/16']], ['control: random cic 35', [2, 4, 2, [4, 1, 2, 2, 5, 1, -1, -2, -2, 3, 3, -3, 2]], ['25/64', '5/4', '41/32']], ['control: random cic 40', [2, 4, 2, [4, -2, 4, 1, 3, -2, -3, 5, 1, 1]], ['19/64', '13/16']], ['control: random cic 41', [2, 4, 1, [1, 4, 3, 3, 1, 1, -1, 0, -2, 5, 0, 3, 2, 4, 2, 4, 5, 5, 1, -2]], ['25/16', '3/2', '9/16', '21/8', '55/16']], ['control: random cic 47', [2, 4, 1, [-2, 0, 4, 0, -1, 5, -2, 4, 0, -2, -1]], ['0', '19/16']]]]
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: one stage R=2 M=1 | ['3/2', '7/2', '11/2'] | ['3/2', '7/2', '11/2'] | Passed |
| regression: partial final block | ['3'] | ['3'] | Passed |
| regression: random cic 2 | ['7/3', '1', '1/3'] | ['7/3', '-1', '1/3'] | Failed |
| control: two stages R=3 M=2 | ['1/12', '1/6', '1/12', '0'] | ['1/12', '1/6', '1/12', '0'] | Passed |
| control: random cic 13 | ['1/4', '3/4', '7/6'] | ['1/4', '3/4', '7/6'] | Passed |
| control: random cic 23 | ['1/4', '59/64', '105/64', '101/64'] | ['1/4', '59/64', '105/64', '101/64'] | Passed |
| control: random cic 25 | ['0', '5/8'] | ['0', '5/8'] | Passed |
SHA-256 / 434bc54fcc12c55eea6722613b3a992bb2e426cc1b3a533033f291e7142a9436
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):
N, R, M, xs = x
ints = [0] * N
dec = []
for i, v in enumerate(xs):
acc = v
for k in range(N):
ints[k] += acc
acc = ints[k]
if i % R == R - 1:
dec.append(acc)
combs = [[0] * M for _ in range(N)]
out = []
for v in dec:
for k in range(N):
d = combs[k]
prev = d.pop(0)
d.append(v)
v = v - prev
out.append(str(Fraction(v, (R * M) ** N)))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: one stage R=2 M=1', [1, 2, 1, [1, 2, 3, 4, 5, 6]], ['3/2', '7/2', '11/2']], ['regression: partial final block', [1, 3, 1, [3, 3, 3, 3, 3]], ['3']], ['regression: random cic 2', [1, 3, 1, [2, 2, 3, -2, 1, -2, 3, 1, -3]], ['7/3', '-1', '1/3']], ['control: two stages R=3 M=2', [2, 3, 2, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], ['1/12', '1/6', '1/12', '0']], ['control: random cic 13', [2, 3, 2, [0, 3, 3, -2, 4, -2, 2, 4, 1, 1]], ['1/4', '3/4', '7/6']], ['control: random cic 23', [2, 4, 2, [-3, 5, 5, 3, 0, 2, -3, 3, 4, 5, 0, -1, 0, 1, -1, 1, 1]], ['1/4', '59/64', '105/64', '101/64']], ['control: random cic 25', [2, 2, 2, [-1, 2, 5, -2, -1]], ['0', '5/8']]], [['regression: random cic 0', [1, 3, 2, [4, 1, 1, 5, -2, 4, -1, 4, 5]], ['1', '13/6', '5/2']], ['regression: random cic 1', [1, 4, 1, [2, -1, 3, 4, 5, -3, 5, -2, 3, -1, 2, -3, -3, 0, 4, 0, 2, 4, 1]], ['2', '5/4', '1/4', '1/4']], ['regression: random cic 5', [3, 2, 2, [-2, 2, -3, 2, -2, -3, 3, -3, -1]], ['-1/16', '-15/64', '-27/64', '-9/16']], ['control: random cic 26', [2, 2, 1, [1, 5, -3, 3, -2, 1, -1, 4, 1, 2]], ['7/4', '1/2', '0', '3/4', '2']], ['control: random cic 27', [2, 4, 1, [-1, 3, 5, 4, -3, 3, 3, 2, 2]], ['19/16', '15/8']], ['control: random cic 35', [2, 4, 2, [4, 1, 2, 2, 5, 1, -1, -2, -2, 3, 3, -3, 2]], ['25/64', '5/4', '41/32']], ['control: random cic 40', [2, 4, 2, [4, -2, 4, 1, 3, -2, -3, 5, 1, 1]], ['19/64', '13/16']]], [['regression: random cic 3', [3, 2, 2, [3, -3, 3, 5, -2, 3, 2, 4, 2, 2, 0]], ['3/32', '13/32', '57/64', '23/16', '63/32']], ['regression: random cic 4', [1, 2, 2, [-3, 1, 4, 2, 4, 2, -3, 5]], ['-1/2', '1', '3', '2']], ['repair check: random cic 7', [2, 4, 1, [3, -2, 2, -1, 3, -1, 0, -1, 0, -2, -3, -2]], ['9/16', '7/16', '-9/8']], ['control: random cic 41', [2, 4, 1, [1, 4, 3, 3, 1, 1, -1, 0, -2, 5, 0, 3, 2, 4, 2, 4, 5, 5, 1, -2]], ['25/16', '3/2', '9/16', '21/8', '55/16']], ['control: random cic 47', [2, 4, 1, [-2, 0, 4, 0, -1, 5, -2, 4, 0, -2, -1]], ['0', '19/16']], ['control: two stages R=3 M=2', [2, 3, 2, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], ['1/12', '1/6', '1/12', '0']], ['control: random cic 13', [2, 3, 2, [0, 3, 3, -2, 4, -2, 2, 4, 1, 1]], ['1/4', '3/4', '7/6']]], [['regression: random cic 6', [1, 4, 1, [-2, 5, 3, -2, 5, -2, 1, 3, 0, -2, -3, 4, -2, -1, 5, 4, 2, 0, -2, 1]], ['1', '7/4', '-1/4', '3/2', '1/4']], ['regression: random cic 8', [3, 3, 1, [-1, 1, 5, 5, 3, 3, 0, -2, 2, 2, 1, 1, 1, -3]], ['2/27', '80/27', '55/27', '7/9']], ['regression: random cic 16', [3, 2, 2, [-1, 0, 1, 2, 5, 5, 3, -1, 5, -3]], ['-3/64', '-5/64', '15/32', '59/32', '181/64']], ['control: random cic 23', [2, 4, 2, [-3, 5, 5, 3, 0, 2, -3, 3, 4, 5, 0, -1, 0, 1, -1, 1, 1]], ['1/4', '59/64', '105/64', '101/64']], ['control: random cic 25', [2, 2, 2, [-1, 2, 5, -2, -1]], ['0', '5/8']], ['control: random cic 26', [2, 2, 1, [1, 5, -3, 3, -2, 1, -1, 4, 1, 2]], ['7/4', '1/2', '0', '3/4', '2']], ['control: random cic 27', [2, 4, 1, [-1, 3, 5, 4, -3, 3, 3, 2, 2]], ['19/16', '15/8']]], [['regression: random cic 10', [3, 2, 2, [-2, 3, -2, 1, 1, 0, 0]], ['-3/64', '-7/64', '1/64']], ['regression: random cic 11', [3, 2, 2, [1, -1, 2, 1, -2, 3]], ['1/32', '11/64', '23/64']], ['repair check: random cic 19', [2, 4, 1, [4, 4, 2, 0, -3, 0, -1, 5, 0, 3, -1, 1]], ['2', '-1/16', '21/16']], ['control: random cic 35', [2, 4, 2, [4, 1, 2, 2, 5, 1, -1, -2, -2, 3, 3, -3, 2]], ['25/64', '5/4', '41/32']], ['control: random cic 40', [2, 4, 2, [4, -2, 4, 1, 3, -2, -3, 5, 1, 1]], ['19/64', '13/16']], ['control: random cic 41', [2, 4, 1, [1, 4, 3, 3, 1, 1, -1, 0, -2, 5, 0, 3, 2, 4, 2, 4, 5, 5, 1, -2]], ['25/16', '3/2', '9/16', '21/8', '55/16']], ['control: random cic 47', [2, 4, 1, [-2, 0, 4, 0, -1, 5, -2, 4, 0, -2, -1]], ['0', '19/16']]]]
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: one stage R=2 M=1 | ['3/2', '7/2', '11/2'] | ['3/2', '7/2', '11/2'] | Passed |
| regression: partial final block | ['3'] | ['3'] | Passed |
| regression: random cic 2 | ['7/3', '-1', '1/3'] | ['7/3', '-1', '1/3'] | Passed |
| control: two stages R=3 M=2 | ['1/12', '1/6', '1/12', '0'] | ['1/12', '1/6', '1/12', '0'] | Passed |
| control: random cic 13 | ['1/4', '3/4', '7/6'] | ['1/4', '3/4', '7/6'] | Passed |
| control: random cic 23 | ['1/4', '59/64', '105/64', '101/64'] | ['1/4', '59/64', '105/64', '101/64'] | Passed |
| control: random cic 25 | ['0', '5/8'] | ['0', '5/8'] | Passed |
SHA-256 / 13ef68c6843dea92a02a47e23b1899d6f9d14f34430e5e4b92839c2a1965d939
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.144535+00:00.
Case digest / 1d7f10da7d61c0ca94600413c347b4f71137d03fe3c97e805c38be274843029c