FA-54986 / Astronomical coordinate conventions / Open access
Detector mosaic sections: Readout geometry treats one-sided parallel overscan as symmetric · case 01
The adapter reports an incorrect science rows while other fields remain valid.
ROOT CAUSE
Readout geometry treats one-sided parallel overscan as symmetric. Faulty expression: d['rows']
VERIFIED REPAIR
Preserve the declared model convention at this site: d['rows']-d['parallel']
Unsuccessful approach: A partial convention repair still uses d['rows']-2*d['parallel']
Case contract
Two readout amplifiers cover a focal plane with overscan removed. Amplifier B is physically reversed. Detector labels are one-based; chip gap has no samples. Serial overscan is measured in columns and parallel overscan in rows. Output fields are defined by: a_science_column = d['x']-d['serial']; b_detector_column = d['a']+d['gap']+d['b']+1-d['x']; science_row = d['y']-d['parallel']; b_first_pixel = d['a']+d['gap']+1; mosaic_extent = d['a']+d['gap']+d['b']; science_rows = d['rows']-d['parallel']
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 {'a_science_column': d['x']-d['serial'], 'b_detector_column': d['a']+d['gap']+d['b']+1-d['x'], 'science_row': d['y']-d['parallel'], 'b_first_pixel': d['a']+d['gap']+1, 'mosaic_extent': d['a']+d['gap']+d['b'], 'science_rows': d['rows']}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 23, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 1, 'y': 1, 'rows': 20}, {'a_science_column': -1, 'b_detector_column': 25, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 9}, {'a_science_column': 1, 'b_detector_column': 11, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 8, 'y': 20, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 18, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 2: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 22, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 2, 'y': 1, 'rows': 20}, {'a_science_column': 0, 'b_detector_column': 24, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 9}, {'a_science_column': 2, 'b_detector_column': 10, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 9, 'y': 20, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 17, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 3: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 21, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 18, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 1, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 9}, {'a_science_column': 3, 'b_detector_column': 9, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 10, 'y': 20, 'rows': 20}, {'a_science_column': 8, 'b_detector_column': 16, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 4: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 20, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 17, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 1, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 9}, {'a_science_column': 4, 'b_detector_column': 8, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 11, 'y': 20, 'rows': 20}, {'a_science_column': 9, 'b_detector_column': 15, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 5: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 19, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 16, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 1, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 9}, {'a_science_column': 5, 'b_detector_column': 7, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 12, 'y': 20, 'rows': 20}, {'a_science_column': 10, 'b_detector_column': 14, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})]}
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| astronomical fixture 0 | {'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 20} | {'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16} | Failed |
| astronomical fixture 1 | {'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20} | {'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20} | Passed |
| astronomical fixture 2 | {'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 20} | {'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16} | Failed |
| astronomical fixture 3 | {'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 20} | {'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16} | Failed |
| astronomical fixture 4 | {'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 9} | {'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5} | Failed |
| astronomical fixture 5 | {'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 20} | {'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16} | Failed |
SHA-256 / ecf6b44657745d3a6bb89a256860d1290773da56fdc13801902853ef08400631
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
return {'a_science_column': d['x']-d['serial'], 'b_detector_column': d['a']+d['gap']+d['b']+1-d['x'], 'science_row': d['y']-d['parallel'], 'b_first_pixel': d['a']+d['gap']+1, 'mosaic_extent': d['a']+d['gap']+d['b'], 'science_rows': d['rows']-2*d['parallel']}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 23, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 1, 'y': 1, 'rows': 20}, {'a_science_column': -1, 'b_detector_column': 25, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 9}, {'a_science_column': 1, 'b_detector_column': 11, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 8, 'y': 20, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 18, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 2: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 22, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 2, 'y': 1, 'rows': 20}, {'a_science_column': 0, 'b_detector_column': 24, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 9}, {'a_science_column': 2, 'b_detector_column': 10, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 9, 'y': 20, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 17, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 3: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 21, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 18, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 1, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 9}, {'a_science_column': 3, 'b_detector_column': 9, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 10, 'y': 20, 'rows': 20}, {'a_science_column': 8, 'b_detector_column': 16, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 4: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 20, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 17, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 1, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 9}, {'a_science_column': 4, 'b_detector_column': 8, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 11, 'y': 20, 'rows': 20}, {'a_science_column': 9, 'b_detector_column': 15, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 5: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 19, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 16, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 1, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 9}, {'a_science_column': 5, 'b_detector_column': 7, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 12, 'y': 20, 'rows': 20}, {'a_science_column': 10, 'b_detector_column': 14, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})]}
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| astronomical fixture 0 | {'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 12} | {'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16} | Failed |
| astronomical fixture 1 | {'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20} | {'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20} | Passed |
| astronomical fixture 2 | {'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 12} | {'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16} | Failed |
| astronomical fixture 3 | {'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 12} | {'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16} | Failed |
| astronomical fixture 4 | {'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 1} | {'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5} | Failed |
| astronomical fixture 5 | {'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 12} | {'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16} | Failed |
SHA-256 / 88963c5ab85f47be22d80fa6479dd8e261eef8a7ef434be966a79110853b6ebf
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
return {'a_science_column': d['x']-d['serial'], 'b_detector_column': d['a']+d['gap']+d['b']+1-d['x'], 'science_row': d['y']-d['parallel'], 'b_first_pixel': d['a']+d['gap']+1, 'mosaic_extent': d['a']+d['gap']+d['b'], 'science_rows': d['rows']-d['parallel']}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 23, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 1, 'y': 1, 'rows': 20}, {'a_science_column': -1, 'b_detector_column': 25, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 9}, {'a_science_column': 1, 'b_detector_column': 11, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 8, 'y': 20, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 18, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 2: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 22, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 2, 'y': 1, 'rows': 20}, {'a_science_column': 0, 'b_detector_column': 24, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 9}, {'a_science_column': 2, 'b_detector_column': 10, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 9, 'y': 20, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 17, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 3: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 21, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 18, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 1, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 9}, {'a_science_column': 3, 'b_detector_column': 9, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 10, 'y': 20, 'rows': 20}, {'a_science_column': 8, 'b_detector_column': 16, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 4: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 20, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 17, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 1, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 9}, {'a_science_column': 4, 'b_detector_column': 8, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 11, 'y': 20, 'rows': 20}, {'a_science_column': 9, 'b_detector_column': 15, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 5: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 19, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 16, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 1, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 9}, {'a_science_column': 5, 'b_detector_column': 7, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 12, 'y': 20, 'rows': 20}, {'a_science_column': 10, 'b_detector_column': 14, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})]}
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| astronomical fixture 0 | {'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16} | {'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16} | Passed |
| astronomical fixture 1 | {'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20} | {'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20} | Passed |
| astronomical fixture 2 | {'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16} | {'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16} | Passed |
| astronomical fixture 3 | {'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16} | {'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16} | Passed |
| astronomical fixture 4 | {'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5} | {'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5} | Passed |
| astronomical fixture 5 | {'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16} | {'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16} | Passed |
SHA-256 / 06cee28a92eb32f257fe691649a654ceed580e79b0217e4d34974b4c9bef9297
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:53.400810+00:00.
Case digest / f809693e262b1a754acb8cd8da7664b7275ada0d2f06df972f98bb0dc252d841