FAILURE MAP
← Case archive

FA-69666 / Orbital propagation / Open access

Orbit energy classification: Parabolic tolerance is absolute · case 01

The parabolic band depends on the unit system.

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

ROOT CAUSE

The test compares |eps| with tol directly instead of tol*mu/r.

VERIFIED REPAIR

Scale the tolerance by mu/r.

Unsuccessful approach: Scaling by the kinetic energy term is not the stipulated normalization.

Case contract

Input [r, v, mu, tol]. eps=v^2/2-mu/r. Parabolic when |eps|<=tol*mu/r, else elliptic (eps<0) or hyperbolic. a=-mu/(2 eps) (None if parabolic), escape speed sqrt(2mu/r), v_inf=sqrt(2 eps) for hyperbolic else None. Return [kind, a rounded 3, vesc rounded 6, vinf rounded 6].

Why this case matters

Orbit determination and mission planning chain many small conversions; one wrong branch or unit silently moves a spacecraft by kilometres.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r,v,mu,tol=x
    eps=v*v/2-mu/r
    if abs(eps)<=tol: kind='parabolic'
    elif eps<0: kind='elliptic'
    else: kind='hyperbolic'
    a=None if kind=='parabolic' else round(-mu/(2*eps),3)
    vesc=math.sqrt(2*mu/r)
    vinf=round(math.sqrt(2*eps),6) if kind=='hyperbolic' else None
    return [kind,a,round(vesc,6),vinf]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]['elliptic', 43341095.732, 10.671731, None]['parabolic', None, 10.671731, None]Failed
orbit energy classification [1.0, 1.05, 1.0, 0.5]['parabolic', None, 1.414214, None]['parabolic', None, 1.414214, None]Passed
orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]['elliptic', 6915.843, 10.671731, None]['elliptic', 6915.843, 10.671731, None]Passed
orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]['hyperbolic', -144726.71, 10.671731, 1.659566]['hyperbolic', -144726.71, 10.671731, 1.659566]Passed
orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]['elliptic', 10790332.769, 10.671731, None]['elliptic', 10790332.769, 10.671731, None]Passed
orbit energy classification [1.0, 1.4142, 1.0, 0.001]['parabolic', None, 1.414214, None]['parabolic', None, 1.414214, None]Passed
orbit energy classification [1.0, 1.0, 1.0, 0.001]['elliptic', 1.0, 1.414214, None]['elliptic', 1.0, 1.414214, None]Passed

SHA-256 / 70e7057cafbd6c182b196c3fe26cf348587dd46c79aa5865c3f8140521bc7a0c

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r,v,mu,tol=x
    eps=v*v/2-mu/r
    if abs(eps)<=tol*v*v/2: kind='parabolic'
    elif eps<0: kind='elliptic'
    else: kind='hyperbolic'
    a=None if kind=='parabolic' else round(-mu/(2*eps),3)
    vesc=math.sqrt(2*mu/r)
    vinf=round(math.sqrt(2*eps),6) if kind=='hyperbolic' else None
    return [kind,a,round(vesc,6),vinf]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]['parabolic', None, 10.671731, None]['parabolic', None, 10.671731, None]Passed
orbit energy classification [1.0, 1.05, 1.0, 0.5]['elliptic', 1.114, 1.414214, None]['parabolic', None, 1.414214, None]Failed
orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]['elliptic', 6915.843, 10.671731, None]['elliptic', 6915.843, 10.671731, None]Passed
orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]['hyperbolic', -144726.71, 10.671731, 1.659566]['hyperbolic', -144726.71, 10.671731, 1.659566]Passed
orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]['elliptic', 10790332.769, 10.671731, None]['elliptic', 10790332.769, 10.671731, None]Passed
orbit energy classification [1.0, 1.4142, 1.0, 0.001]['parabolic', None, 1.414214, None]['parabolic', None, 1.414214, None]Passed
orbit energy classification [1.0, 1.0, 1.0, 0.001]['elliptic', 1.0, 1.414214, None]['elliptic', 1.0, 1.414214, None]Passed

SHA-256 / ed50c0bc7351cfacd9046853e3919fef78c166625fd66c0659d9c280e3dbc4f7

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r,v,mu,tol=x
    eps=v*v/2-mu/r
    if abs(eps)<=tol*mu/r: kind='parabolic'
    elif eps<0: kind='elliptic'
    else: kind='hyperbolic'
    a=None if kind=='parabolic' else round(-mu/(2*eps),3)
    vesc=math.sqrt(2*mu/r)
    vinf=round(math.sqrt(2*eps),6) if kind=='hyperbolic' else None
    return [kind,a,round(vesc,6),vinf]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 1.0, 1.0, 0.001]', [1.0, 1.0, 1.0, 0.001], ['elliptic', 1.0, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [1.0, 2.0, 1.0, 0.001]', [1.0, 2.0, 1.0, 0.001], ['hyperbolic', -0.5, 1.414214, 1.414214]), ('orbit energy classification [42164.0, 3.07, 398600.4418, 1e-06]', [42164.0, 3.07, 398600.4418, 1e-06], ['elliptic', 42036.503, 4.348235, None]), ('orbit energy classification [6678.0, 11.5, 398600.4418, 1e-06]', [6678.0, 11.5, 398600.4418, 1e-06], ['hyperbolic', -30964.528, 10.925987, 3.58787]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [2.0, 1.0, 1.0, 0.0001]', [2.0, 1.0, 1.0, 0.0001], ['parabolic', None, 1.0, None]), ('orbit energy classification [100.0, 0.1414, 1.0, 0.001]', [100.0, 0.1414, 1.0, 0.001], ['parabolic', None, 0.141421, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566])], [('orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]', [7000.0, 10.6713, 398600.4418, 0.0001], ['parabolic', None, 10.671731, None]), ('orbit energy classification [1.0, 1.05, 1.0, 0.5]', [1.0, 1.05, 1.0, 0.5], ['parabolic', None, 1.414214, None]), ('orbit energy classification [2.0, 0.8, 1.0, 0.5]', [2.0, 0.8, 1.0, 0.5], ['parabolic', None, 1.0, None]), ('orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]', [7000.0, 7.5, 398600.4418, 1e-06], ['elliptic', 6915.843, 10.671731, None]), ('orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]', [7000.0, 10.8, 398600.4418, 1e-06], ['hyperbolic', -144726.71, 10.671731, 1.659566]), ('orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]', [7000.0, 10.67, 398600.4418, 1e-06], ['elliptic', 10790332.769, 10.671731, None]), ('orbit energy classification [1.0, 1.4142, 1.0, 0.001]', [1.0, 1.4142, 1.0, 0.001], ['parabolic', None, 1.414214, None])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
orbit energy classification [7000.0, 10.6713, 398600.4418, 0.0001]['parabolic', None, 10.671731, None]['parabolic', None, 10.671731, None]Passed
orbit energy classification [1.0, 1.05, 1.0, 0.5]['parabolic', None, 1.414214, None]['parabolic', None, 1.414214, None]Passed
orbit energy classification [7000.0, 7.5, 398600.4418, 1e-06]['elliptic', 6915.843, 10.671731, None]['elliptic', 6915.843, 10.671731, None]Passed
orbit energy classification [7000.0, 10.8, 398600.4418, 1e-06]['hyperbolic', -144726.71, 10.671731, 1.659566]['hyperbolic', -144726.71, 10.671731, 1.659566]Passed
orbit energy classification [7000.0, 10.67, 398600.4418, 1e-06]['elliptic', 10790332.769, 10.671731, None]['elliptic', 10790332.769, 10.671731, None]Passed
orbit energy classification [1.0, 1.4142, 1.0, 0.001]['parabolic', None, 1.414214, None]['parabolic', None, 1.414214, None]Passed
orbit energy classification [1.0, 1.0, 1.0, 0.001]['elliptic', 1.0, 1.414214, None]['elliptic', 1.0, 1.414214, None]Passed

SHA-256 / 56904531df98e2234dc736013060c8ab51b2f9958eead4d1db9b4504ee2a272a

Verification & scope

A deterministic toy two-body model with stipulated constants and conventions; not flight dynamics software or a validated SGP4 implementation. 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:48:13.478036+00:00.

Case digest / 271d8226de64f2219fddaed8f72baec22b2d09a18f35a0f10c1b8f7e2c5b936c