FA-55456 / Astronomical coordinate conventions / Open access
Solar disk image basis: Solar disk normalization omits observer distance · case 01
The adapter reports an incorrect normalized east while other fields remain valid.
ROOT CAUSE
Solar disk normalization omits observer distance. Faulty expression: d['a']*(d['c']*d['dx']-d['s']*d['dy'])/d['R']
VERIFIED REPAIR
Preserve the declared model convention at this site: d['a']*(d['c']*d['dx']-d['s']*d['dy'])*d['D']/d['R']
Unsuccessful approach: A partial convention repair still uses d['a']*(d['c']*d['dx']-d['s']*d['dy'])*d['R']/d['D']
Case contract
A solar disk image supplies pixel displacements dx,dy, angular plate scale a, observer distance D, solar radius R, and exact supplied sine/cosine c,s of a position angle. Helioprojective east/north is the image rotation; normalized disk coordinates divide by angular radius R/D. Values are reduced linear-angle units. Output fields are defined by: helioprojective_east = d['a']*(d['c']*d['dx']-d['s']*d['dy']); helioprojective_north = d['a']*(d['s']*d['dx']+d['c']*d['dy']); angular_radius = d['R']/d['D']; normalized_east = d['a']*(d['c']*d['dx']-d['s']*d['dy'])*d['D']/d['R']; normalized_north = d['a']*(d['s']*d['dx']+d['c']*d['dy'])*d['D']/d['R']; disk_pixel_radius = abs(d['R']/d['D']/d['a'])
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 {'helioprojective_east': d['a']*(d['c']*d['dx']-d['s']*d['dy']), 'helioprojective_north': d['a']*(d['s']*d['dx']+d['c']*d['dy']), 'angular_radius': d['R']/d['D'], 'normalized_east': d['a']*(d['c']*d['dx']-d['s']*d['dy'])/d['R'], 'normalized_north': d['a']*(d['s']*d['dx']+d['c']*d['dy'])*d['D']/d['R'], 'disk_pixel_radius': abs(d['R']/d['D']/d['a'])}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'dx': 3, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 6, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 15.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 6, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 15.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -6, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -15.0, 'disk_pixel_radius': 0.2}), ({'dx': 0, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 0, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 0.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 6, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 6.0, 'disk_pixel_radius': 0.5}), ({'dx': 3, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -6, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -15.0, 'disk_pixel_radius': 0.2})], 2: [({'dx': 4, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 8, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 20.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 8, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 20.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -8, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -20.0, 'disk_pixel_radius': 0.2}), ({'dx': 1, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 2, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 5.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 8, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 8.0, 'disk_pixel_radius': 0.5}), ({'dx': 4, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -8, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -20.0, 'disk_pixel_radius': 0.2})], 3: [({'dx': 5, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 5, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 10, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 5, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -10, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -25.0, 'disk_pixel_radius': 0.2}), ({'dx': 2, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 4, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 10.0, 'disk_pixel_radius': 0.2}), ({'dx': 5, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 10, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 10.0, 'disk_pixel_radius': 0.5}), ({'dx': 5, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -10, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -25.0, 'disk_pixel_radius': 0.2})], 4: [({'dx': 6, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 12, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 30.0, 'disk_pixel_radius': 0.2}), ({'dx': 6, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 12, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 30.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 6, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -12, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -30.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 6, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 15.0, 'disk_pixel_radius': 0.2}), ({'dx': 6, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 12, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 12.0, 'disk_pixel_radius': 0.5}), ({'dx': 6, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -12, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -30.0, 'disk_pixel_radius': 0.2})], 5: [({'dx': 7, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 14, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 35.0, 'disk_pixel_radius': 0.2}), ({'dx': 7, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 14, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 35.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 7, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -14, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -35.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 8, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 20.0, 'disk_pixel_radius': 0.2}), ({'dx': 7, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 14, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 14.0, 'disk_pixel_radius': 0.5}), ({'dx': 7, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -14, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -35.0, 'disk_pixel_radius': 0.2})]}
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 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -2.5, 'normalized_north': 15.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -25.0, 'normalized_north': 15.0} | Failed |
| astronomical fixture 1 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 6, 'helioprojective_north': 10, 'normalized_east': 1.5, 'normalized_north': 25.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 6, 'helioprojective_north': 10, 'normalized_east': 15.0, 'normalized_north': 25.0} | Failed |
| astronomical fixture 2 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 2.5, 'normalized_north': -15.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 25.0, 'normalized_north': -15.0} | Failed |
| astronomical fixture 3 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 0, 'helioprojective_north': 0, 'normalized_east': 0.0, 'normalized_north': 0.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 0, 'helioprojective_north': 0, 'normalized_east': 0.0, 'normalized_north': 0.0} | Passed |
| astronomical fixture 4 | {'angular_radius': 1.0, 'disk_pixel_radius': 0.5, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -2.5, 'normalized_north': 6.0} | {'angular_radius': 1.0, 'disk_pixel_radius': 0.5, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -10.0, 'normalized_north': 6.0} | Failed |
| astronomical fixture 5 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 2.5, 'normalized_north': -15.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 25.0, 'normalized_north': -15.0} | Failed |
SHA-256 / a3d82600f1c552a004300c17c83fa91d6774b9db4abca0036fa3b39d01640585
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
return {'helioprojective_east': d['a']*(d['c']*d['dx']-d['s']*d['dy']), 'helioprojective_north': d['a']*(d['s']*d['dx']+d['c']*d['dy']), 'angular_radius': d['R']/d['D'], 'normalized_east': d['a']*(d['c']*d['dx']-d['s']*d['dy'])*d['R']/d['D'], 'normalized_north': d['a']*(d['s']*d['dx']+d['c']*d['dy'])*d['D']/d['R'], 'disk_pixel_radius': abs(d['R']/d['D']/d['a'])}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'dx': 3, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 6, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 15.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 6, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 15.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -6, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -15.0, 'disk_pixel_radius': 0.2}), ({'dx': 0, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 0, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 0.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 6, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 6.0, 'disk_pixel_radius': 0.5}), ({'dx': 3, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -6, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -15.0, 'disk_pixel_radius': 0.2})], 2: [({'dx': 4, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 8, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 20.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 8, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 20.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -8, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -20.0, 'disk_pixel_radius': 0.2}), ({'dx': 1, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 2, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 5.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 8, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 8.0, 'disk_pixel_radius': 0.5}), ({'dx': 4, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -8, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -20.0, 'disk_pixel_radius': 0.2})], 3: [({'dx': 5, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 5, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 10, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 5, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -10, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -25.0, 'disk_pixel_radius': 0.2}), ({'dx': 2, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 4, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 10.0, 'disk_pixel_radius': 0.2}), ({'dx': 5, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 10, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 10.0, 'disk_pixel_radius': 0.5}), ({'dx': 5, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -10, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -25.0, 'disk_pixel_radius': 0.2})], 4: [({'dx': 6, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 12, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 30.0, 'disk_pixel_radius': 0.2}), ({'dx': 6, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 12, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 30.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 6, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -12, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -30.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 6, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 15.0, 'disk_pixel_radius': 0.2}), ({'dx': 6, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 12, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 12.0, 'disk_pixel_radius': 0.5}), ({'dx': 6, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -12, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -30.0, 'disk_pixel_radius': 0.2})], 5: [({'dx': 7, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 14, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 35.0, 'disk_pixel_radius': 0.2}), ({'dx': 7, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 14, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 35.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 7, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -14, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -35.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 8, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 20.0, 'disk_pixel_radius': 0.2}), ({'dx': 7, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 14, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 14.0, 'disk_pixel_radius': 0.5}), ({'dx': 7, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -14, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -35.0, 'disk_pixel_radius': 0.2})]}
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 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -4.0, 'normalized_north': 15.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -25.0, 'normalized_north': 15.0} | Failed |
| astronomical fixture 1 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 6, 'helioprojective_north': 10, 'normalized_east': 2.4, 'normalized_north': 25.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 6, 'helioprojective_north': 10, 'normalized_east': 15.0, 'normalized_north': 25.0} | Failed |
| astronomical fixture 2 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 4.0, 'normalized_north': -15.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 25.0, 'normalized_north': -15.0} | Failed |
| astronomical fixture 3 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 0, 'helioprojective_north': 0, 'normalized_east': 0.0, 'normalized_north': 0.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 0, 'helioprojective_north': 0, 'normalized_east': 0.0, 'normalized_north': 0.0} | Passed |
| astronomical fixture 4 | {'angular_radius': 1.0, 'disk_pixel_radius': 0.5, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -10.0, 'normalized_north': 6.0} | {'angular_radius': 1.0, 'disk_pixel_radius': 0.5, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -10.0, 'normalized_north': 6.0} | Passed |
| astronomical fixture 5 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 4.0, 'normalized_north': -15.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 25.0, 'normalized_north': -15.0} | Failed |
SHA-256 / 49bde8da0df57071360cde61ba4a5c5d8b7038b85836ced4af5baad44916ac23
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
return {'helioprojective_east': d['a']*(d['c']*d['dx']-d['s']*d['dy']), 'helioprojective_north': d['a']*(d['s']*d['dx']+d['c']*d['dy']), 'angular_radius': d['R']/d['D'], 'normalized_east': d['a']*(d['c']*d['dx']-d['s']*d['dy'])*d['D']/d['R'], 'normalized_north': d['a']*(d['s']*d['dx']+d['c']*d['dy'])*d['D']/d['R'], 'disk_pixel_radius': abs(d['R']/d['D']/d['a'])}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'dx': 3, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 6, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 15.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 6, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 15.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -6, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -15.0, 'disk_pixel_radius': 0.2}), ({'dx': 0, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 0, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 0.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 6, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 6.0, 'disk_pixel_radius': 0.5}), ({'dx': 3, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -6, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -15.0, 'disk_pixel_radius': 0.2})], 2: [({'dx': 4, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 8, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 20.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 8, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 20.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -8, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -20.0, 'disk_pixel_radius': 0.2}), ({'dx': 1, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 2, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 5.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 8, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 8.0, 'disk_pixel_radius': 0.5}), ({'dx': 4, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -8, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -20.0, 'disk_pixel_radius': 0.2})], 3: [({'dx': 5, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 5, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 10, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 5, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -10, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -25.0, 'disk_pixel_radius': 0.2}), ({'dx': 2, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 4, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 10.0, 'disk_pixel_radius': 0.2}), ({'dx': 5, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 10, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 10.0, 'disk_pixel_radius': 0.5}), ({'dx': 5, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -10, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -25.0, 'disk_pixel_radius': 0.2})], 4: [({'dx': 6, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 12, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 30.0, 'disk_pixel_radius': 0.2}), ({'dx': 6, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 12, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 30.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 6, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -12, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -30.0, 'disk_pixel_radius': 0.2}), ({'dx': 3, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 6, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 15.0, 'disk_pixel_radius': 0.2}), ({'dx': 6, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 12, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 12.0, 'disk_pixel_radius': 0.5}), ({'dx': 6, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -12, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -30.0, 'disk_pixel_radius': 0.2})], 5: [({'dx': 7, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 14, 'angular_radius': 0.4, 'normalized_east': -25.0, 'normalized_north': 35.0, 'disk_pixel_radius': 0.2}), ({'dx': 7, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 1, 's': 0}, {'helioprojective_east': 14, 'helioprojective_north': 10, 'angular_radius': 0.4, 'normalized_east': 35.0, 'normalized_north': 25.0, 'disk_pixel_radius': 0.2}), ({'dx': 7, 'dy': 5, 'a': -2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 10, 'helioprojective_north': -14, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -35.0, 'disk_pixel_radius': 0.2}), ({'dx': 4, 'dy': 0, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': 0, 'helioprojective_north': 8, 'angular_radius': 0.4, 'normalized_east': 0.0, 'normalized_north': 20.0, 'disk_pixel_radius': 0.2}), ({'dx': 7, 'dy': 5, 'a': 2, 'D': 4, 'R': 4, 'c': 0, 's': 1}, {'helioprojective_east': -10, 'helioprojective_north': 14, 'angular_radius': 1.0, 'normalized_east': -10.0, 'normalized_north': 14.0, 'disk_pixel_radius': 0.5}), ({'dx': 7, 'dy': 5, 'a': 2, 'D': 10, 'R': 4, 'c': 0, 's': -1}, {'helioprojective_east': 10, 'helioprojective_north': -14, 'angular_radius': 0.4, 'normalized_east': 25.0, 'normalized_north': -35.0, 'disk_pixel_radius': 0.2})]}
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 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -25.0, 'normalized_north': 15.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -25.0, 'normalized_north': 15.0} | Passed |
| astronomical fixture 1 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 6, 'helioprojective_north': 10, 'normalized_east': 15.0, 'normalized_north': 25.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 6, 'helioprojective_north': 10, 'normalized_east': 15.0, 'normalized_north': 25.0} | Passed |
| astronomical fixture 2 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 25.0, 'normalized_north': -15.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 25.0, 'normalized_north': -15.0} | Passed |
| astronomical fixture 3 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 0, 'helioprojective_north': 0, 'normalized_east': 0.0, 'normalized_north': 0.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 0, 'helioprojective_north': 0, 'normalized_east': 0.0, 'normalized_north': 0.0} | Passed |
| astronomical fixture 4 | {'angular_radius': 1.0, 'disk_pixel_radius': 0.5, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -10.0, 'normalized_north': 6.0} | {'angular_radius': 1.0, 'disk_pixel_radius': 0.5, 'helioprojective_east': -10, 'helioprojective_north': 6, 'normalized_east': -10.0, 'normalized_north': 6.0} | Passed |
| astronomical fixture 5 | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 25.0, 'normalized_north': -15.0} | {'angular_radius': 0.4, 'disk_pixel_radius': 0.2, 'helioprojective_east': 10, 'helioprojective_north': -6, 'normalized_east': 25.0, 'normalized_north': -15.0} | Passed |
SHA-256 / fc68834a4d254b0fdd634c2bcb74eefe1614b23e358795704edcd7d0aada6ab9
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:57.922456+00:00.
Case digest / 106eb5c9caeb95d18eebd93b226ae45e7f8b9344f9c54140578e7b2a5dadbee2