FAILURE MAP
← Case archive

FA-55661 / Astronomical coordinate conventions / Open access

Spectral channel edges: Channel averaging locates the output at the first input rather than its center · case 01

The adapter reports an incorrect averaged center while other fields remain valid.

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

ROOT CAUSE

Channel averaging locates the output at the first input rather than its center. Faulty expression: d['c0']+d['i']*d['b']*d['d']

VERIFIED REPAIR

Preserve the declared model convention at this site: d['c0']+(d['i']*d['b']+(d['b']-1)/2)*d['d']

Unsuccessful approach: A partial convention repair still uses d['c0']+(d['i']*d['b']+d['b']/2)*d['d']

Case contract

A spectral window has first center c0, signed center step d, integer channel i starting at zero, full width w>0, channel averaging factor b, and total n channels. Edges are always ascending world-coordinate values; averaging preserves the mean of contributing channel centers. Output fields are defined by: center = d['c0']+d['i']*d['d']; edges = [d['c0']+d['i']*d['d']-d['w']/2,d['c0']+d['i']*d['d']+d['w']/2]; averaged_center = d['c0']+(d['i']*d['b']+(d['b']-1)/2)*d['d']; averaged_step = d['b']*d['d']; window_center = d['c0']+(d['n']-1)*d['d']/2; window_extent = abs((d['n']-1)*d['d'])+d['w']

Why this case matters

Catalog, detector, sky-coordinate, and spectroscopy adapters must preserve the association between numeric coordinates and their declared reference conventions.

1 / The failure

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

N = 1
observations = []
def solve(d):
    return {'center': d['c0']+d['i']*d['d'], 'edges': [d['c0']+d['i']*d['d']-d['w']/2,d['c0']+d['i']*d['d']+d['w']/2], 'averaged_center': d['c0']+d['i']*d['b']*d['d'], 'averaged_step': d['b']*d['d'], 'window_center': d['c0']+(d['n']-1)*d['d']/2, 'window_extent': abs((d['n']-1)*d['d'])+d['w']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'c0': 100, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 108, 'edges': [106.5, 109.5], 'averaged_center': 118.0, 'averaged_step': 8, 'window_center': 114.0, 'window_extent': 31}), ({'c0': 100, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 92, 'edges': [90.5, 93.5], 'averaged_center': 82.0, 'averaged_step': -8, 'window_center': 86.0, 'window_extent': 31}), ({'c0': 100, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 100, 'edges': [98.5, 101.5], 'averaged_center': 102.0, 'averaged_step': 8, 'window_center': 114.0, 'window_extent': 31}), ({'c0': 100, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 108, 'edges': [106.5, 109.5], 'averaged_center': 108.0, 'averaged_step': 4, 'window_center': 114.0, 'window_extent': 31}), ({'c0': 100, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 100, 'edges': [98.5, 101.5], 'averaged_center': 102.0, 'averaged_step': 8, 'window_center': 100.0, 'window_extent': 3}), ({'c0': 100, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 104, 'edges': [100.0, 108.0], 'averaged_center': 109.0, 'averaged_step': 4, 'window_center': 107.0, 'window_extent': 22})], 2: [({'c0': 101, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 109, 'edges': [107.5, 110.5], 'averaged_center': 119.0, 'averaged_step': 8, 'window_center': 115.0, 'window_extent': 31}), ({'c0': 101, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 93, 'edges': [91.5, 94.5], 'averaged_center': 83.0, 'averaged_step': -8, 'window_center': 87.0, 'window_extent': 31}), ({'c0': 101, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 101, 'edges': [99.5, 102.5], 'averaged_center': 103.0, 'averaged_step': 8, 'window_center': 115.0, 'window_extent': 31}), ({'c0': 101, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 109, 'edges': [107.5, 110.5], 'averaged_center': 109.0, 'averaged_step': 4, 'window_center': 115.0, 'window_extent': 31}), ({'c0': 101, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 101, 'edges': [99.5, 102.5], 'averaged_center': 103.0, 'averaged_step': 8, 'window_center': 101.0, 'window_extent': 3}), ({'c0': 101, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 105, 'edges': [101.0, 109.0], 'averaged_center': 110.0, 'averaged_step': 4, 'window_center': 108.0, 'window_extent': 22})], 3: [({'c0': 102, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 110, 'edges': [108.5, 111.5], 'averaged_center': 120.0, 'averaged_step': 8, 'window_center': 116.0, 'window_extent': 31}), ({'c0': 102, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 94, 'edges': [92.5, 95.5], 'averaged_center': 84.0, 'averaged_step': -8, 'window_center': 88.0, 'window_extent': 31}), ({'c0': 102, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 102, 'edges': [100.5, 103.5], 'averaged_center': 104.0, 'averaged_step': 8, 'window_center': 116.0, 'window_extent': 31}), ({'c0': 102, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 110, 'edges': [108.5, 111.5], 'averaged_center': 110.0, 'averaged_step': 4, 'window_center': 116.0, 'window_extent': 31}), ({'c0': 102, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 102, 'edges': [100.5, 103.5], 'averaged_center': 104.0, 'averaged_step': 8, 'window_center': 102.0, 'window_extent': 3}), ({'c0': 102, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 106, 'edges': [102.0, 110.0], 'averaged_center': 111.0, 'averaged_step': 4, 'window_center': 109.0, 'window_extent': 22})], 4: [({'c0': 103, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 111, 'edges': [109.5, 112.5], 'averaged_center': 121.0, 'averaged_step': 8, 'window_center': 117.0, 'window_extent': 31}), ({'c0': 103, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 95, 'edges': [93.5, 96.5], 'averaged_center': 85.0, 'averaged_step': -8, 'window_center': 89.0, 'window_extent': 31}), ({'c0': 103, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 103, 'edges': [101.5, 104.5], 'averaged_center': 105.0, 'averaged_step': 8, 'window_center': 117.0, 'window_extent': 31}), ({'c0': 103, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 111, 'edges': [109.5, 112.5], 'averaged_center': 111.0, 'averaged_step': 4, 'window_center': 117.0, 'window_extent': 31}), ({'c0': 103, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 103, 'edges': [101.5, 104.5], 'averaged_center': 105.0, 'averaged_step': 8, 'window_center': 103.0, 'window_extent': 3}), ({'c0': 103, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 107, 'edges': [103.0, 111.0], 'averaged_center': 112.0, 'averaged_step': 4, 'window_center': 110.0, 'window_extent': 22})], 5: [({'c0': 104, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 112, 'edges': [110.5, 113.5], 'averaged_center': 122.0, 'averaged_step': 8, 'window_center': 118.0, 'window_extent': 31}), ({'c0': 104, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 96, 'edges': [94.5, 97.5], 'averaged_center': 86.0, 'averaged_step': -8, 'window_center': 90.0, 'window_extent': 31}), ({'c0': 104, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 104, 'edges': [102.5, 105.5], 'averaged_center': 106.0, 'averaged_step': 8, 'window_center': 118.0, 'window_extent': 31}), ({'c0': 104, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 112, 'edges': [110.5, 113.5], 'averaged_center': 112.0, 'averaged_step': 4, 'window_center': 118.0, 'window_extent': 31}), ({'c0': 104, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 104, 'edges': [102.5, 105.5], 'averaged_center': 106.0, 'averaged_step': 8, 'window_center': 104.0, 'window_extent': 3}), ({'c0': 104, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 108, 'edges': [104.0, 112.0], 'averaged_center': 113.0, 'averaged_step': 4, 'window_center': 111.0, 'window_extent': 22})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), 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
astronomical fixture 0{'averaged_center': 116, 'averaged_step': 8, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}{'averaged_center': 118.0, 'averaged_step': 8, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}Failed
astronomical fixture 1{'averaged_center': 84, 'averaged_step': -8, 'center': 92, 'edges': [90.5, 93.5], 'window_center': 86.0, 'window_extent': 31}{'averaged_center': 82.0, 'averaged_step': -8, 'center': 92, 'edges': [90.5, 93.5], 'window_center': 86.0, 'window_extent': 31}Failed
astronomical fixture 2{'averaged_center': 100, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 114.0, 'window_extent': 31}{'averaged_center': 102.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 114.0, 'window_extent': 31}Failed
astronomical fixture 3{'averaged_center': 108, 'averaged_step': 4, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}{'averaged_center': 108.0, 'averaged_step': 4, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}Passed
astronomical fixture 4{'averaged_center': 100, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 100.0, 'window_extent': 3}{'averaged_center': 102.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 100.0, 'window_extent': 3}Failed
astronomical fixture 5{'averaged_center': 108, 'averaged_step': 4, 'center': 104, 'edges': [100.0, 108.0], 'window_center': 107.0, 'window_extent': 22}{'averaged_center': 109.0, 'averaged_step': 4, 'center': 104, 'edges': [100.0, 108.0], 'window_center': 107.0, 'window_extent': 22}Failed

SHA-256 / f14467ae52ad3ff58d25384fb7afb7ad62d0cb97d36cec7c36283f7301567526

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(d):
    return {'center': d['c0']+d['i']*d['d'], 'edges': [d['c0']+d['i']*d['d']-d['w']/2,d['c0']+d['i']*d['d']+d['w']/2], 'averaged_center': d['c0']+(d['i']*d['b']+d['b']/2)*d['d'], 'averaged_step': d['b']*d['d'], 'window_center': d['c0']+(d['n']-1)*d['d']/2, 'window_extent': abs((d['n']-1)*d['d'])+d['w']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'c0': 100, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 108, 'edges': [106.5, 109.5], 'averaged_center': 118.0, 'averaged_step': 8, 'window_center': 114.0, 'window_extent': 31}), ({'c0': 100, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 92, 'edges': [90.5, 93.5], 'averaged_center': 82.0, 'averaged_step': -8, 'window_center': 86.0, 'window_extent': 31}), ({'c0': 100, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 100, 'edges': [98.5, 101.5], 'averaged_center': 102.0, 'averaged_step': 8, 'window_center': 114.0, 'window_extent': 31}), ({'c0': 100, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 108, 'edges': [106.5, 109.5], 'averaged_center': 108.0, 'averaged_step': 4, 'window_center': 114.0, 'window_extent': 31}), ({'c0': 100, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 100, 'edges': [98.5, 101.5], 'averaged_center': 102.0, 'averaged_step': 8, 'window_center': 100.0, 'window_extent': 3}), ({'c0': 100, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 104, 'edges': [100.0, 108.0], 'averaged_center': 109.0, 'averaged_step': 4, 'window_center': 107.0, 'window_extent': 22})], 2: [({'c0': 101, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 109, 'edges': [107.5, 110.5], 'averaged_center': 119.0, 'averaged_step': 8, 'window_center': 115.0, 'window_extent': 31}), ({'c0': 101, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 93, 'edges': [91.5, 94.5], 'averaged_center': 83.0, 'averaged_step': -8, 'window_center': 87.0, 'window_extent': 31}), ({'c0': 101, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 101, 'edges': [99.5, 102.5], 'averaged_center': 103.0, 'averaged_step': 8, 'window_center': 115.0, 'window_extent': 31}), ({'c0': 101, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 109, 'edges': [107.5, 110.5], 'averaged_center': 109.0, 'averaged_step': 4, 'window_center': 115.0, 'window_extent': 31}), ({'c0': 101, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 101, 'edges': [99.5, 102.5], 'averaged_center': 103.0, 'averaged_step': 8, 'window_center': 101.0, 'window_extent': 3}), ({'c0': 101, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 105, 'edges': [101.0, 109.0], 'averaged_center': 110.0, 'averaged_step': 4, 'window_center': 108.0, 'window_extent': 22})], 3: [({'c0': 102, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 110, 'edges': [108.5, 111.5], 'averaged_center': 120.0, 'averaged_step': 8, 'window_center': 116.0, 'window_extent': 31}), ({'c0': 102, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 94, 'edges': [92.5, 95.5], 'averaged_center': 84.0, 'averaged_step': -8, 'window_center': 88.0, 'window_extent': 31}), ({'c0': 102, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 102, 'edges': [100.5, 103.5], 'averaged_center': 104.0, 'averaged_step': 8, 'window_center': 116.0, 'window_extent': 31}), ({'c0': 102, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 110, 'edges': [108.5, 111.5], 'averaged_center': 110.0, 'averaged_step': 4, 'window_center': 116.0, 'window_extent': 31}), ({'c0': 102, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 102, 'edges': [100.5, 103.5], 'averaged_center': 104.0, 'averaged_step': 8, 'window_center': 102.0, 'window_extent': 3}), ({'c0': 102, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 106, 'edges': [102.0, 110.0], 'averaged_center': 111.0, 'averaged_step': 4, 'window_center': 109.0, 'window_extent': 22})], 4: [({'c0': 103, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 111, 'edges': [109.5, 112.5], 'averaged_center': 121.0, 'averaged_step': 8, 'window_center': 117.0, 'window_extent': 31}), ({'c0': 103, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 95, 'edges': [93.5, 96.5], 'averaged_center': 85.0, 'averaged_step': -8, 'window_center': 89.0, 'window_extent': 31}), ({'c0': 103, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 103, 'edges': [101.5, 104.5], 'averaged_center': 105.0, 'averaged_step': 8, 'window_center': 117.0, 'window_extent': 31}), ({'c0': 103, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 111, 'edges': [109.5, 112.5], 'averaged_center': 111.0, 'averaged_step': 4, 'window_center': 117.0, 'window_extent': 31}), ({'c0': 103, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 103, 'edges': [101.5, 104.5], 'averaged_center': 105.0, 'averaged_step': 8, 'window_center': 103.0, 'window_extent': 3}), ({'c0': 103, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 107, 'edges': [103.0, 111.0], 'averaged_center': 112.0, 'averaged_step': 4, 'window_center': 110.0, 'window_extent': 22})], 5: [({'c0': 104, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 112, 'edges': [110.5, 113.5], 'averaged_center': 122.0, 'averaged_step': 8, 'window_center': 118.0, 'window_extent': 31}), ({'c0': 104, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 96, 'edges': [94.5, 97.5], 'averaged_center': 86.0, 'averaged_step': -8, 'window_center': 90.0, 'window_extent': 31}), ({'c0': 104, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 104, 'edges': [102.5, 105.5], 'averaged_center': 106.0, 'averaged_step': 8, 'window_center': 118.0, 'window_extent': 31}), ({'c0': 104, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 112, 'edges': [110.5, 113.5], 'averaged_center': 112.0, 'averaged_step': 4, 'window_center': 118.0, 'window_extent': 31}), ({'c0': 104, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 104, 'edges': [102.5, 105.5], 'averaged_center': 106.0, 'averaged_step': 8, 'window_center': 104.0, 'window_extent': 3}), ({'c0': 104, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 108, 'edges': [104.0, 112.0], 'averaged_center': 113.0, 'averaged_step': 4, 'window_center': 111.0, 'window_extent': 22})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), 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
astronomical fixture 0{'averaged_center': 120.0, 'averaged_step': 8, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}{'averaged_center': 118.0, 'averaged_step': 8, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}Failed
astronomical fixture 1{'averaged_center': 80.0, 'averaged_step': -8, 'center': 92, 'edges': [90.5, 93.5], 'window_center': 86.0, 'window_extent': 31}{'averaged_center': 82.0, 'averaged_step': -8, 'center': 92, 'edges': [90.5, 93.5], 'window_center': 86.0, 'window_extent': 31}Failed
astronomical fixture 2{'averaged_center': 104.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 114.0, 'window_extent': 31}{'averaged_center': 102.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 114.0, 'window_extent': 31}Failed
astronomical fixture 3{'averaged_center': 110.0, 'averaged_step': 4, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}{'averaged_center': 108.0, 'averaged_step': 4, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}Failed
astronomical fixture 4{'averaged_center': 104.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 100.0, 'window_extent': 3}{'averaged_center': 102.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 100.0, 'window_extent': 3}Failed
astronomical fixture 5{'averaged_center': 110.0, 'averaged_step': 4, 'center': 104, 'edges': [100.0, 108.0], 'window_center': 107.0, 'window_extent': 22}{'averaged_center': 109.0, 'averaged_step': 4, 'center': 104, 'edges': [100.0, 108.0], 'window_center': 107.0, 'window_extent': 22}Failed

SHA-256 / 7b300b1e991d829aa19d003e0c0e76f9005d755152db7c65b2b7726b0b884c17

3 / The verified repair

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

N = 1
observations = []
def solve(d):
    return {'center': d['c0']+d['i']*d['d'], 'edges': [d['c0']+d['i']*d['d']-d['w']/2,d['c0']+d['i']*d['d']+d['w']/2], 'averaged_center': d['c0']+(d['i']*d['b']+(d['b']-1)/2)*d['d'], 'averaged_step': d['b']*d['d'], 'window_center': d['c0']+(d['n']-1)*d['d']/2, 'window_extent': abs((d['n']-1)*d['d'])+d['w']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'c0': 100, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 108, 'edges': [106.5, 109.5], 'averaged_center': 118.0, 'averaged_step': 8, 'window_center': 114.0, 'window_extent': 31}), ({'c0': 100, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 92, 'edges': [90.5, 93.5], 'averaged_center': 82.0, 'averaged_step': -8, 'window_center': 86.0, 'window_extent': 31}), ({'c0': 100, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 100, 'edges': [98.5, 101.5], 'averaged_center': 102.0, 'averaged_step': 8, 'window_center': 114.0, 'window_extent': 31}), ({'c0': 100, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 108, 'edges': [106.5, 109.5], 'averaged_center': 108.0, 'averaged_step': 4, 'window_center': 114.0, 'window_extent': 31}), ({'c0': 100, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 100, 'edges': [98.5, 101.5], 'averaged_center': 102.0, 'averaged_step': 8, 'window_center': 100.0, 'window_extent': 3}), ({'c0': 100, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 104, 'edges': [100.0, 108.0], 'averaged_center': 109.0, 'averaged_step': 4, 'window_center': 107.0, 'window_extent': 22})], 2: [({'c0': 101, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 109, 'edges': [107.5, 110.5], 'averaged_center': 119.0, 'averaged_step': 8, 'window_center': 115.0, 'window_extent': 31}), ({'c0': 101, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 93, 'edges': [91.5, 94.5], 'averaged_center': 83.0, 'averaged_step': -8, 'window_center': 87.0, 'window_extent': 31}), ({'c0': 101, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 101, 'edges': [99.5, 102.5], 'averaged_center': 103.0, 'averaged_step': 8, 'window_center': 115.0, 'window_extent': 31}), ({'c0': 101, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 109, 'edges': [107.5, 110.5], 'averaged_center': 109.0, 'averaged_step': 4, 'window_center': 115.0, 'window_extent': 31}), ({'c0': 101, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 101, 'edges': [99.5, 102.5], 'averaged_center': 103.0, 'averaged_step': 8, 'window_center': 101.0, 'window_extent': 3}), ({'c0': 101, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 105, 'edges': [101.0, 109.0], 'averaged_center': 110.0, 'averaged_step': 4, 'window_center': 108.0, 'window_extent': 22})], 3: [({'c0': 102, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 110, 'edges': [108.5, 111.5], 'averaged_center': 120.0, 'averaged_step': 8, 'window_center': 116.0, 'window_extent': 31}), ({'c0': 102, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 94, 'edges': [92.5, 95.5], 'averaged_center': 84.0, 'averaged_step': -8, 'window_center': 88.0, 'window_extent': 31}), ({'c0': 102, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 102, 'edges': [100.5, 103.5], 'averaged_center': 104.0, 'averaged_step': 8, 'window_center': 116.0, 'window_extent': 31}), ({'c0': 102, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 110, 'edges': [108.5, 111.5], 'averaged_center': 110.0, 'averaged_step': 4, 'window_center': 116.0, 'window_extent': 31}), ({'c0': 102, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 102, 'edges': [100.5, 103.5], 'averaged_center': 104.0, 'averaged_step': 8, 'window_center': 102.0, 'window_extent': 3}), ({'c0': 102, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 106, 'edges': [102.0, 110.0], 'averaged_center': 111.0, 'averaged_step': 4, 'window_center': 109.0, 'window_extent': 22})], 4: [({'c0': 103, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 111, 'edges': [109.5, 112.5], 'averaged_center': 121.0, 'averaged_step': 8, 'window_center': 117.0, 'window_extent': 31}), ({'c0': 103, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 95, 'edges': [93.5, 96.5], 'averaged_center': 85.0, 'averaged_step': -8, 'window_center': 89.0, 'window_extent': 31}), ({'c0': 103, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 103, 'edges': [101.5, 104.5], 'averaged_center': 105.0, 'averaged_step': 8, 'window_center': 117.0, 'window_extent': 31}), ({'c0': 103, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 111, 'edges': [109.5, 112.5], 'averaged_center': 111.0, 'averaged_step': 4, 'window_center': 117.0, 'window_extent': 31}), ({'c0': 103, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 103, 'edges': [101.5, 104.5], 'averaged_center': 105.0, 'averaged_step': 8, 'window_center': 103.0, 'window_extent': 3}), ({'c0': 103, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 107, 'edges': [103.0, 111.0], 'averaged_center': 112.0, 'averaged_step': 4, 'window_center': 110.0, 'window_extent': 22})], 5: [({'c0': 104, 'd': 4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 112, 'edges': [110.5, 113.5], 'averaged_center': 122.0, 'averaged_step': 8, 'window_center': 118.0, 'window_extent': 31}), ({'c0': 104, 'd': -4, 'i': 2, 'w': 3, 'b': 2, 'n': 8}, {'center': 96, 'edges': [94.5, 97.5], 'averaged_center': 86.0, 'averaged_step': -8, 'window_center': 90.0, 'window_extent': 31}), ({'c0': 104, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 8}, {'center': 104, 'edges': [102.5, 105.5], 'averaged_center': 106.0, 'averaged_step': 8, 'window_center': 118.0, 'window_extent': 31}), ({'c0': 104, 'd': 4, 'i': 2, 'w': 3, 'b': 1, 'n': 8}, {'center': 112, 'edges': [110.5, 113.5], 'averaged_center': 112.0, 'averaged_step': 4, 'window_center': 118.0, 'window_extent': 31}), ({'c0': 104, 'd': 4, 'i': 0, 'w': 3, 'b': 2, 'n': 1}, {'center': 104, 'edges': [102.5, 105.5], 'averaged_center': 106.0, 'averaged_step': 8, 'window_center': 104.0, 'window_extent': 3}), ({'c0': 104, 'd': 2, 'i': 2, 'w': 8, 'b': 2, 'n': 8}, {'center': 108, 'edges': [104.0, 112.0], 'averaged_center': 113.0, 'averaged_step': 4, 'window_center': 111.0, 'window_extent': 22})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), 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
astronomical fixture 0{'averaged_center': 118.0, 'averaged_step': 8, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}{'averaged_center': 118.0, 'averaged_step': 8, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}Passed
astronomical fixture 1{'averaged_center': 82.0, 'averaged_step': -8, 'center': 92, 'edges': [90.5, 93.5], 'window_center': 86.0, 'window_extent': 31}{'averaged_center': 82.0, 'averaged_step': -8, 'center': 92, 'edges': [90.5, 93.5], 'window_center': 86.0, 'window_extent': 31}Passed
astronomical fixture 2{'averaged_center': 102.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 114.0, 'window_extent': 31}{'averaged_center': 102.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 114.0, 'window_extent': 31}Passed
astronomical fixture 3{'averaged_center': 108.0, 'averaged_step': 4, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}{'averaged_center': 108.0, 'averaged_step': 4, 'center': 108, 'edges': [106.5, 109.5], 'window_center': 114.0, 'window_extent': 31}Passed
astronomical fixture 4{'averaged_center': 102.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 100.0, 'window_extent': 3}{'averaged_center': 102.0, 'averaged_step': 8, 'center': 100, 'edges': [98.5, 101.5], 'window_center': 100.0, 'window_extent': 3}Passed
astronomical fixture 5{'averaged_center': 109.0, 'averaged_step': 4, 'center': 104, 'edges': [100.0, 108.0], 'window_center': 107.0, 'window_extent': 22}{'averaged_center': 109.0, 'averaged_step': 4, 'center': 104, 'edges': [100.0, 108.0], 'window_center': 107.0, 'window_extent': 22}Passed

SHA-256 / a9d0a7962a371d3935df31ba96bbbc7dbde0495715ee41da5449dd15764d6692

Verification & scope

Explicitly stipulated finite algebraic adapter; no standards conformance, physical accuracy, or production-library claim. Inputs are the documented finite valid model domain. 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:45:59.862259+00:00.

Case digest / c50adab0a9cf688f24dbed80d9afd0a52140de01e2e1dabb2293a6dc71853479