broken_source:
"""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)

evaluation_group: astro-solar-disk-image-basis

source:
"""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)

prompt:
The adapter reports an incorrect normalized east while other fields remain valid.

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'])

split: open-access


broken_source:
"""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']/(2*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)

meaning: Fixture-count band, not measured model difficulty

deps: stdlib

evaluation_group: astro-solar-disk-image-basis

source:
"""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']), '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)

prompt:
The adapter reports an incorrect normalized north while other fields remain valid.

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'])

split: open-access


broken_source:
"""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)

evaluation_group: astro-solar-disk-image-basis

source:
"""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': 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)

prompt:
The adapter reports an incorrect disk pixel radius while other fields remain valid.

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'])

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'east_longitude': d['W']%360, 'inertial_longitude': (d['P']-d['W'])%360, 'view_latitude': -d['B'] if d['south'] else d['B'], 'geodetic_tangent': d['g']*d['latratio'], 'future_prime_meridian': (d['P']+d['rate']*d['dt'])%360, 'future_body_longitude': (-d['W']-d['rate']*d['dt'])%360}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'W': 40, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 350, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 10, 'inertial_longitude': 40, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 356}), ({'W': 40, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 40, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 40, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 320}), ({'W': 40, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 320, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 328})], 2: [({'W': 41, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 351, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 9, 'inertial_longitude': 39, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 355}), ({'W': 41, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 41, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 41, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 319}), ({'W': 41, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 319, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 327})], 3: [({'W': 42, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 352, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 8, 'inertial_longitude': 38, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 354}), ({'W': 42, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 42, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 42, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 318}), ({'W': 42, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 318, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 326})], 4: [({'W': 43, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 353, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 7, 'inertial_longitude': 37, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 353}), ({'W': 43, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 43, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 43, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 317}), ({'W': 43, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 317, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 325})], 5: [({'W': 44, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 354, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 6, 'inertial_longitude': 36, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 352}), ({'W': 44, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 44, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 44, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 316}), ({'W': 44, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 316, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 324})]}
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)

evaluation_group: astro-planetary-body-fixed-labels

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'east_longitude': (180-d['W'])%360, 'inertial_longitude': (d['P']-d['W'])%360, 'view_latitude': -d['B'] if d['south'] else d['B'], 'geodetic_tangent': d['g']*d['latratio'], 'future_prime_meridian': (d['P']+d['rate']*d['dt'])%360, 'future_body_longitude': (-d['W']-d['rate']*d['dt'])%360}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'W': 40, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 350, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 10, 'inertial_longitude': 40, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 356}), ({'W': 40, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 40, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 40, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 320}), ({'W': 40, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 320, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 328})], 2: [({'W': 41, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 351, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 9, 'inertial_longitude': 39, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 355}), ({'W': 41, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 41, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 41, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 319}), ({'W': 41, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 319, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 327})], 3: [({'W': 42, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 352, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 8, 'inertial_longitude': 38, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 354}), ({'W': 42, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 42, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 42, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 318}), ({'W': 42, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 318, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 326})], 4: [({'W': 43, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 353, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 7, 'inertial_longitude': 37, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 353}), ({'W': 43, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 43, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 43, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 317}), ({'W': 43, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 317, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 325})], 5: [({'W': 44, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 354, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 6, 'inertial_longitude': 36, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 352}), ({'W': 44, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 44, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 44, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 316}), ({'W': 44, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 316, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 324})]}
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)

prompt:
The adapter reports an incorrect east longitude while other fields remain valid.

This explicitly stipulated planetary atlas uses west-positive input longitude W, east-positive prime-meridian angle P, latitude B, and an equatorial mirror flag for a southern view. Body-fixed east longitude is -W; inertial longitude adds P. Supplied sin-latitude ratio g is already calibrated and not recomputed. Output fields are defined by: east_longitude = (-d['W'])%360; inertial_longitude = (d['P']-d['W'])%360; view_latitude = -d['B'] if d['south'] else d['B']; geodetic_tangent = d['g']*d['latratio']; future_prime_meridian = (d['P']+d['rate']*d['dt'])%360; future_body_longitude = (-d['W']-d['rate']*d['dt'])%360

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'east_longitude': (-d['W'])%360, 'inertial_longitude': (d['P']+d['W'])%360, 'view_latitude': -d['B'] if d['south'] else d['B'], 'geodetic_tangent': d['g']*d['latratio'], 'future_prime_meridian': (d['P']+d['rate']*d['dt'])%360, 'future_body_longitude': (-d['W']-d['rate']*d['dt'])%360}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'W': 40, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 350, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 10, 'inertial_longitude': 40, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 356}), ({'W': 40, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 40, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 40, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 320}), ({'W': 40, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 320, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 328})], 2: [({'W': 41, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 351, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 9, 'inertial_longitude': 39, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 355}), ({'W': 41, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 41, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 41, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 319}), ({'W': 41, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 319, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 327})], 3: [({'W': 42, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 352, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 8, 'inertial_longitude': 38, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 354}), ({'W': 42, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 42, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 42, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 318}), ({'W': 42, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 318, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 326})], 4: [({'W': 43, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 353, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 7, 'inertial_longitude': 37, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 353}), ({'W': 43, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 43, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 43, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 317}), ({'W': 43, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 317, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 325})], 5: [({'W': 44, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 354, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 6, 'inertial_longitude': 36, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 352}), ({'W': 44, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 44, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 44, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 316}), ({'W': 44, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 316, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 324})]}
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)

evaluation_group: astro-planetary-body-fixed-labels

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'east_longitude': (-d['W'])%360, 'inertial_longitude': (-d['W'])%360, 'view_latitude': -d['B'] if d['south'] else d['B'], 'geodetic_tangent': d['g']*d['latratio'], 'future_prime_meridian': (d['P']+d['rate']*d['dt'])%360, 'future_body_longitude': (-d['W']-d['rate']*d['dt'])%360}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'W': 40, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 350, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 10, 'inertial_longitude': 40, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 356}), ({'W': 40, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 40, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 306}), ({'W': 40, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 320, 'inertial_longitude': 60, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 320}), ({'W': 40, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 320, 'inertial_longitude': 320, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 328})], 2: [({'W': 41, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 351, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 9, 'inertial_longitude': 39, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 355}), ({'W': 41, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 41, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 305}), ({'W': 41, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 319, 'inertial_longitude': 59, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 319}), ({'W': 41, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 319, 'inertial_longitude': 319, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 327})], 3: [({'W': 42, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 352, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 8, 'inertial_longitude': 38, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 354}), ({'W': 42, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 42, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 304}), ({'W': 42, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 318, 'inertial_longitude': 58, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 318}), ({'W': 42, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 318, 'inertial_longitude': 318, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 326})], 4: [({'W': 43, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 353, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 7, 'inertial_longitude': 37, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 353}), ({'W': 43, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 43, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 303}), ({'W': 43, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 317, 'inertial_longitude': 57, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 317}), ({'W': 43, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 317, 'inertial_longitude': 317, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 325})], 5: [({'W': 44, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 354, 'P': 30, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 6, 'inertial_longitude': 36, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 44, 'future_body_longitude': 352}), ({'W': 44, 'P': 100, 'B': 20, 'south': True, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': -20, 'geodetic_tangent': 6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 44, 'P': 100, 'B': -30, 'south': False, 'g': -2, 'latratio': 3, 'rate': 7, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': -30, 'geodetic_tangent': -6, 'future_prime_meridian': 114, 'future_body_longitude': 302}), ({'W': 44, 'P': 100, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': 7, 'dt': 0}, {'east_longitude': 316, 'inertial_longitude': 56, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 100, 'future_body_longitude': 316}), ({'W': 44, 'P': 0, 'B': 20, 'south': False, 'g': 2, 'latratio': 3, 'rate': -4, 'dt': 2}, {'east_longitude': 316, 'inertial_longitude': 316, 'view_latitude': 20, 'geodetic_tangent': 6, 'future_prime_meridian': 352, 'future_body_longitude': 324})]}
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)

prompt:
The adapter reports an incorrect inertial longitude while other fields remain valid.

This explicitly stipulated planetary atlas uses west-positive input longitude W, east-positive prime-meridian angle P, latitude B, and an equatorial mirror flag for a southern view. Body-fixed east longitude is -W; inertial longitude adds P. Supplied sin-latitude ratio g is already calibrated and not recomputed. Output fields are defined by: east_longitude = (-d['W'])%360; inertial_longitude = (d['P']-d['W'])%360; view_latitude = -d['B'] if d['south'] else d['B']; geodetic_tangent = d['g']*d['latratio']; future_prime_meridian = (d['P']+d['rate']*d['dt'])%360; future_body_longitude = (-d['W']-d['rate']*d['dt'])%360

split: open-access