Skip to content

Reject a non-grav fit only when the covariance cannot support an amplitude - #542

Merged
matthewholman merged 2 commits into
mainfrom
fix/nongrav-weak-guard
Sep 3, 2026
Merged

Reject a non-grav fit only when the covariance cannot support an amplitude#542
matthewholman merged 2 commits into
mainfrom
fix/nongrav-weak-guard

Conversation

@matthewholman

Copy link
Copy Markdown
Collaborator

Closes #541.

This is a behaviour change, and the two rewritten tests are the crux — please push back if you disagree with the policy.

The guard rejected on rcond of the whole npar×npar correlation matrix, which is dominated by the orbit rather than the non-grav column. Radar makes it worse, since it tightens the state: adding seven radar rows to 2062 Aten's 980 optical ones turned a reported A2 = −14.96 ± 1.70 into NaN. All three radar-bearing Yarkovsky objects were suppressed at reduced chi-square 0.28–1.55.

I first tried the amplitude's variance inflation factor and measured that it does not separate the cases either (#541 has the table). What the old test stood in for — a contaminated, over-confident amplitude — was a symptom of taking the step from the squared-condition normal matrix, fixed in #536. A ten-day arc now returns A2 with a formal error five million times its own value, which is the honest answer and, unlike a significance test, does not suppress a well-constrained null. So reject only on a non-positive or non-finite variance.

With this, on merged main: Aten −15.08 ± 1.34 (0.12σ from Farnocchia+2013), Nyx +16.72 ± 2.98 (1.50σ from JPL), Golevka −10.21 ± 1.61 (0.91σ from JPL). Full suite green, 550 passed.

🤖 Generated with Claude Code

matthewholman and others added 2 commits September 3, 2026 18:26
…itude

The weak-constraint guard rejected a joint state + non-grav fit on the
reciprocal condition number of the whole npar x npar correlation matrix. That
is not a statement about the non-grav column. A six-parameter orbit fit is
itself strongly correlated, so the test was dominated by the orbit underneath:
on (6489) Golevka the state block alone has rcond 2.6e-10, twenty-five times
below the old 1e-8 threshold, while A2 correlates with the state at only 0.91
to 0.93 and its formal uncertainty matches the published one.

Radar makes this worse rather than better, because it tightens the state and
lowers that rcond further. Adding seven radar observations to 2062 Aten's 980
optical ones turned a reported A2 = -14.96 +/- 1.70 into NaN. All three
radar-bearing Yarkovsky objects were being suppressed at reduced chi-square
between 0.28 and 1.55.

The concern the old test stood in for -- a contaminated, over-confident
amplitude -- was a symptom of taking the step from the squared-condition normal
matrix, and does not survive that fix. A ten-day arc now returns A2 with a
formal error five million times its own value, which tells the caller what it
needs to know; unlike a significance test it also does not suppress a
well-constrained null. So reject only on a non-positive or non-finite variance,
which means the inverse has genuinely lost the column.

The two tests that encoded the old contract now assert the stronger one: that
the uncertainty is honest, and that it tracks arc length.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
# Conflicts:
#	src/lib/orbit_fit/orbit_fit.cpp

@kjnapier kjnapier left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay

@matthewholman
matthewholman merged commit b6d7edd into main Sep 3, 2026
7 checks passed
@matthewholman
matthewholman deleted the fix/nongrav-weak-guard branch September 3, 2026 23:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The non-grav weak-constraint guard measures the orbit's conditioning, not the amplitude's

2 participants