Skip to content

Differentiate with respect to refraction model parameters - #119

Merged
langestefan merged 6 commits into
mainfrom
autodiff-refraction-params
Jul 30, 2026
Merged

Differentiate with respect to refraction model parameters#119
langestefan merged 6 commits into
mainfrom
autodiff-refraction-params

Conversation

@langestefan

@langestefan langestefan commented Jul 30, 2026

Copy link
Copy Markdown
Member

Differentiating a solar position with respect to a refraction model's pressure or
temperature previously required lifting the Observer to the same dual type, and even
then the keyword constructors rejected it:

ForwardDiff.derivative(
    p -> solar_position(Observer(45.0, 10.0), dt, PSA(), HUGHES(p, 10.0)).apparent_elevation,
    101325.0,
)
# MethodError: no method matching HUGHES(::ForwardDiff.Dual, ::Float64)

Three layers now promote instead:

  • HUGHES, BENNETT, SG2 and SPARefraction accept mixed argument types. The keyword
    form that @kwdef generates routes through SPARefraction's three argument
    constructor, so SPARefraction(pressure = dual) promotes too.
  • SolPos and ApparentSolPos promote over their fields. This was the second failure,
    MethodError: no method matching ApparentSolPos(::Float64, ::Float64, ::Float64, ::Dual, ::Dual),
    since a Float64 observer gives three geometric angles that carry no dual and two
    apparent ones that do.
  • The vector paths size their StructVector from the observer's element type promoted
    against the refraction model's. Without this the scalar path would work while
    solar_position(obs, dts, alg, model) still failed, because the preallocated container
    came from the observer's precision alone and the duals cannot convert into it.

The same type constructors remain strictly more specific, so every existing call
dispatches exactly as before and HUGHES(101325.0, 10.0) never reaches the new method.
The internal refraction_eltype returns Union{} for a model without numeric fields,
which is neutral under promote_type, so NoRefraction, DefaultRefraction, ARCHER
and MICHALSKY leave the observer's element type untouched.

Tests

test/positioning/test-autodiff.jl goes from 6 testsets to 12:

  • Refraction parameters — mixed type promotion for all four parametric models plus the
    keyword form, SolPos and ApparentSolPos field promotion, d/dpressure and
    d/dtemperature against finite differences for each model, and the vector path's
    promoted element type with zero partials on the geometric angles and nonzero on the
    apparent ones.
  • Interpolated — latitude, longitude and altitude against finite differences under
    two refraction models, gradient and Hessian against the exact SPA it wraps, vector and
    in-place dual propagation with per-time partials checked against the scalar derivative,
    and both out_of_range modes. Interpolated is absent from test_algorithms() and so
    had no autodiff coverage, though it already worked: its interpolants cover only the
    geocentric quantities, which depend on time alone, so the duals travel through the
    topocentric half it shares with SPA.

The solar_position docstring and the autodiff guide both documented the old contract of
latitude, longitude and altitude only, and are updated.

Full Pkg.test() passes, including Aqua's ambiguity detection over the new overlapping
constructor methods, and docs/make.jl builds clean.

Behaviour change

The result element type used to be documented as following the Observer{T} element type.
That held only because a mismatched refraction model was a MethodError, and it is now the
promotion of the two, since the apparent angles are computed at the model's precision:

solar_position(Observer(40.0f0, -105.0f0), dt, PSA(), HUGHES())
# was:  MethodError
# now:  ApparentSolPos{Float64}, because HUGHES() carries a Float64 pressure

Matched precision (HUGHES{Float32}()) and parameterless models (ARCHER, MICHALSKY)
keep Float32, and DefaultRefraction builds its model at the observer's precision, so
the default path is untouched. Narrowing the model's parameters to the observer's type
instead would preserve the old rule, but it would have to special case ForwardDiff.Dual
to avoid destroying derivatives, which is the sort of AD specific carve-out this package
otherwise does without.

The solar_position docstring, the numeric precision guide and the index all stated the
old rule and are corrected, with a worked example in the guide.

Type stability

Verified unchanged: 48 of 48 algorithm and refraction combinations infer on both the scalar
and the vector path, allocations are byte identical to main (scalar 0, a 24 element
vector 768 or 1280 B), the Float32/Float64/BigFloat sweep gives identical result
types, and JET reports nothing. The vector path matters most here, since _result_eltype
computes a type at call time and an unfolded result would have made the whole vector API
unstable.

test-typestability.jl grows from 72 assertions to 238. It previously covered only scalar
calls with NoRefraction and DefaultRefraction, so neither the vector path nor any
model that can widen had coverage.

Other commits

f8ba478 is unrelated to the above and rewrites the "making the error controller see the
forcing" section of the ModelingToolkit guide. It separates the two fixes the section had
been conflating, and backs the ranking with a measured table against a reltol = 1e-13
reference: declaring the model's own kink times is worth a factor of 125 on the room
temperature at slightly less cost than declaring nothing, whereas the quadrature state is
worth only a factor of two and earns its keep only when the integrand depends on a state.
Happy to split it into its own PR if you would rather review them separately.

ec60e90 and d159c46 untrack test/.CondaPkg and benchmark/.CondaPkg, both CondaPkg.jl
generated environments. Neither is declared by a tracked CondaPkg.toml, both hold a meta
binary cache of absolute paths from whichever machine last resolved them, and both contain
the same Copier template environment of copier, openssl and libstdcxx. Notably that
content has no solposx or pandas in it, the two packages benchmark/python.jl installs,
so the tracked environment was not serving the one place that uses CondaPkg either.
docs/.CondaPkg was already ignored, so the pattern is generalised to **/.CondaPkg/. The
files stay on disk and CondaPkg resolves them on demand. docs/CondaPkg.toml is a
declaration file and stays tracked.

🤖 Generated with Claude Code

langestefan and others added 3 commits July 30, 2026 11:57
A dual valued pressure or temperature previously needed the observer lifted to
the same dual type, and even then the keyword constructors rejected it. Three
layers now promote instead:

- HUGHES, BENNETT, SG2 and SPARefraction take mixed argument types. The keyword
  form that @kwdef generates routes through SPARefraction's three argument
  constructor, so it promotes too.
- SolPos and ApparentSolPos promote over their fields, so apparent angles that
  carry a dual can join geometric angles that do not.
- The vector paths size their StructVector from the observer's element type
  promoted against the refraction model's, since the observer's precision alone
  gives a container the results cannot convert into.

The same type constructors stay more specific, so existing calls dispatch
exactly as before.

Tests cover the four parametric models against finite differences for both
pressure and temperature, the promoting constructors, and the vector path's
element type. Interpolated gains autodiff coverage as well: it is absent from
test_algorithms() and so had none, though it already worked.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KhdBYRmHazfXZHWCRWt5fT
The section on making the error controller see the forcing asserted that
declaring discontinuities and adding a quadrature state both help, without
showing what either buys. It now separates the two.

The almanac sunrise and the model's own kink are seven minutes apart in
Amsterdam at the solstice, because transit_sunrise_sunset returns the upper limb
at -0.8333 degrees while max(0, sind(elevation)) breaks at geometric zero. The
guide bisects inside the almanac bracket for the time the model actually breaks
at, then draws every solver step as a rug under the forcing across four
variants, with a zoom on sunrise where the mismatch is visible.

A measured table against a reltol = 1e-13 reference gives the ranking. Kink
placement is worth a factor of 125 on the temperature at slightly less cost
than declaring nothing, since the rejections it avoids more than pay for the two
steps it forces. The quadrature state is worth only a factor of two here and
earns its keep only when the integrand depends on a state, which the guide now
says, along with the trapezoid alternative for when it does not.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KhdBYRmHazfXZHWCRWt5fT
MD060 requires the compact table style, which wants a space on each side of
every pipe. The new table's delimiter row was written without them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KhdBYRmHazfXZHWCRWt5fT
@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (Julia v1)

Time benchmarks
main d159c46... main / d159c46...
ours/n=100/Interpolated 0.0219 ± 0.0003 ms 0.0217 ± 0.00028 ms 1.01 ± 0.019
ours/n=100/Iqbal 0.01 ± 0.00013 ms 0.01 ± 0.00013 ms 0.996 ± 0.018
ours/n=100/NOAA 0.0316 ± 0.00023 ms 0.0316 ± 0.00022 ms 1 ± 0.01
ours/n=100/PSA 0.0135 ± 0.00015 ms 0.0134 ± 0.00014 ms 1 ± 0.015
ours/n=100/SPA 0.222 ± 0.0024 ms 0.218 ± 0.0038 ms 1.02 ± 0.021
ours/n=100/USNO 0.0297 ± 0.00023 ms 0.0299 ± 0.00017 ms 0.991 ± 0.0096
ours/n=100/Walraven 0.0167 ± 0.00023 ms 0.0165 ± 0.00032 ms 1.01 ± 0.024
ours/n=1000/Interpolated 0.217 ± 0.003 ms 0.219 ± 0.004 ms 0.994 ± 0.023
ours/n=1000/Iqbal 0.103 ± 0.00058 ms 0.104 ± 0.00043 ms 0.991 ± 0.0069
ours/n=1000/NOAA 0.31 ± 0.0063 ms 0.31 ± 0.0063 ms 1 ± 0.029
ours/n=1000/PSA 0.134 ± 0.0068 ms 0.134 ± 0.0066 ms 0.998 ± 0.07
ours/n=1000/SPA 2.3 ± 0.032 ms 2.27 ± 0.018 ms 1.01 ± 0.016
ours/n=1000/USNO 0.291 ± 0.0061 ms 0.294 ± 0.0063 ms 0.99 ± 0.03
ours/n=1000/Walraven 0.166 ± 0.0082 ms 0.166 ± 0.0093 ms 1 ± 0.075
ours/n=10000/Interpolated 2.27 ± 0.022 ms 2.26 ± 0.03 ms 1 ± 0.016
ours/n=10000/Iqbal 1.08 ± 0.0049 ms 1.09 ± 0.005 ms 0.992 ± 0.0064
ours/n=10000/NOAA 3.13 ± 0.013 ms 3.13 ± 0.0098 ms 1 ± 0.0051
ours/n=10000/PSA 1.34 ± 0.0092 ms 1.34 ± 0.0085 ms 1 ± 0.0094
ours/n=10000/SPA 23.4 ± 0.11 ms 23.1 ± 0.06 ms 1.01 ± 0.0056
ours/n=10000/USNO 2.95 ± 0.011 ms 2.97 ± 0.0095 ms 0.993 ± 0.005
ours/n=10000/Walraven 1.66 ± 0.01 ms 1.66 ± 0.0082 ms 1 ± 0.008
ours/n=100000/Interpolated 23 ± 0.51 ms 22.8 ± 0.35 ms 1.01 ± 0.027
ours/n=100000/Iqbal 10.9 ± 0.072 ms 11 ± 0.069 ms 0.993 ± 0.0091
ours/n=100000/NOAA 32.2 ± 0.68 ms 32.2 ± 0.11 ms 1 ± 0.021
ours/n=100000/PSA 13.6 ± 0.067 ms 13.6 ± 0.071 ms 1 ± 0.0072
ours/n=100000/SPA 236 ± 2 ms 231 ± 0.15 ms 1.02 ± 0.0085
ours/n=100000/USNO 30.1 ± 0.085 ms 30.3 ± 0.068 ms 0.992 ± 0.0036
ours/n=100000/Walraven 16.7 ± 0.11 ms 16.7 ± 0.07 ms 1 ± 0.0076
refraction/ARCHER 0.000201 ± 1e-05 ms 0.000201 ± 1e-05 ms 1 ± 0.07
refraction/BENNETT 0.000201 ± 1.1e-05 ms 0.000201 ± 1.1e-05 ms 1 ± 0.077
refraction/MICHALSKY 0.00017 ± 1e-05 ms 0.00017 ± 1e-05 ms 1 ± 0.083
refraction/NoRefraction 0.00017 ± 0 ms 0.00017 ± 0 ms 1 ± 0
refraction/SG2 0.00022 ± 1e-05 ms 0.00022 ± 9e-06 ms 1 ± 0.061
single/Interpolated 0.000341 ± 1e-05 ms 0.000341 ± 1e-05 ms 1 ± 0.041
single/Iqbal 0.00015 ± 1e-05 ms 0.00015 ± 1e-05 ms 1 ± 0.094
single/NOAA 0.00035 ± 1e-06 ms 0.00035 ± 1e-06 ms 1 ± 0.004
single/PSA 0.000161 ± 1e-05 ms 0.000161 ± 1e-05 ms 1 ± 0.088
single/SPA 0.00226 ± 1.1e-05 ms 0.00227 ± 1e-05 ms 0.996 ± 0.0065
single/USNO 0.000321 ± 1e-05 ms 0.000321 ± 1e-05 ms 1 ± 0.044
single/Walraven 0.000201 ± 1e-05 ms 0.000201 ± 1e-05 ms 1 ± 0.07
solposx/n=100/Iqbal 1.23 ± 0.019 ms 1.24 ± 0.019 ms 0.993 ± 0.022
solposx/n=100/NOAA 2.24 ± 0.025 ms 2.26 ± 0.025 ms 0.991 ± 0.015
solposx/n=100/PSA 1.55 ± 0.024 ms 1.56 ± 0.022 ms 0.99 ± 0.021
solposx/n=100/SPA 2.3 ± 0.072 ms 2.33 ± 0.024 ms 0.988 ± 0.032
solposx/n=100/USNO 1.84 ± 0.022 ms 1.87 ± 0.02 ms 0.987 ± 0.016
solposx/n=100/Walraven 0.649 ± 0.017 ms 0.647 ± 0.016 ms 1 ± 0.037
solposx/n=1000/Iqbal 1.42 ± 0.022 ms 1.43 ± 0.022 ms 0.991 ± 0.021
solposx/n=1000/NOAA 2.79 ± 0.029 ms 2.81 ± 0.034 ms 0.994 ± 0.016
solposx/n=1000/PSA 1.79 ± 0.025 ms 1.8 ± 0.024 ms 0.996 ± 0.019
solposx/n=1000/SPA 5.29 ± 0.075 ms 5.3 ± 0.036 ms 0.998 ± 0.016
solposx/n=1000/USNO 4.95 ± 0.049 ms 4.98 ± 0.043 ms 0.994 ± 0.013
solposx/n=1000/Walraven 0.846 ± 0.019 ms 0.845 ± 0.018 ms 1 ± 0.031
solposx/n=10000/Iqbal 3.44 ± 0.099 ms 3.43 ± 0.1 ms 1 ± 0.042
solposx/n=10000/NOAA 7.81 ± 0.17 ms 7.77 ± 0.17 ms 1.01 ± 0.031
solposx/n=10000/PSA 4.13 ± 0.1 ms 4.14 ± 0.11 ms 0.999 ± 0.037
solposx/n=10000/SPA 33.1 ± 0.23 ms 33.1 ± 0.15 ms 1 ± 0.0083
solposx/n=10000/USNO 35.6 ± 0.57 ms 36.2 ± 0.45 ms 0.983 ± 0.02
solposx/n=10000/Walraven 2.71 ± 0.076 ms 2.71 ± 0.084 ms 1 ± 0.042
solposx/n=100000/Iqbal 23 ± 0.8 ms 22.9 ± 0.82 ms 1 ± 0.05
solposx/n=100000/NOAA 57.2 ± 0.4 ms 57.1 ± 0.59 ms 1 ± 0.013
solposx/n=100000/PSA 27.4 ± 0.83 ms 27.4 ± 0.81 ms 1 ± 0.042
solposx/n=100000/SPA 310 ± 0.43 ms 310 ± 1 ms 0.999 ± 0.0036
solposx/n=100000/USNO 347 ± 29 ms 355 ± 33 ms 0.976 ± 0.12
solposx/n=100000/Walraven 20.9 ± 0.7 ms 20.9 ± 0.76 ms 0.996 ± 0.049
time_to_load 0.139 ± 0.00015 s 0.14 ± 0.0012 s 0.994 ± 0.0089
Memory benchmarks
main d159c46... main / d159c46...
ours/n=100/Interpolated 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/Iqbal 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/NOAA 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/PSA 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/SPA 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/USNO 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/Walraven 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=1000/Interpolated 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/Iqbal 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/NOAA 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/PSA 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/SPA 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/USNO 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/Walraven 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=10000/Interpolated 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/Iqbal 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/NOAA 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/PSA 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/SPA 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/USNO 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/Walraven 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=100000/Interpolated 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/Iqbal 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/NOAA 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/PSA 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/SPA 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/USNO 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/Walraven 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
refraction/ARCHER 0 allocs: 0 B 0 allocs: 0 B
refraction/BENNETT 0 allocs: 0 B 0 allocs: 0 B
refraction/MICHALSKY 0 allocs: 0 B 0 allocs: 0 B
refraction/NoRefraction 0 allocs: 0 B 0 allocs: 0 B
refraction/SG2 0 allocs: 0 B 0 allocs: 0 B
single/Interpolated 0 allocs: 0 B 0 allocs: 0 B
single/Iqbal 0 allocs: 0 B 0 allocs: 0 B
single/NOAA 0 allocs: 0 B 0 allocs: 0 B
single/PSA 0 allocs: 0 B 0 allocs: 0 B
single/SPA 0 allocs: 0 B 0 allocs: 0 B
single/USNO 0 allocs: 0 B 0 allocs: 0 B
single/Walraven 0 allocs: 0 B 0 allocs: 0 B
solposx/n=100/Iqbal 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=100/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/Iqbal 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=1000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/Iqbal 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=10000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/Iqbal 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=100000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
time_to_load 0.145 k allocs: 11 kB 0.145 k allocs: 11 kB 1

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (Julia vlts)

Time benchmarks
main d159c46... main / d159c46...
ours/n=100/Interpolated 0.0228 ± 0.00029 ms 0.0228 ± 0.00032 ms 1 ± 0.019
ours/n=100/Iqbal 0.0114 ± 0.0017 ms 0.0113 ± 0.0017 ms 1 ± 0.21
ours/n=100/NOAA 0.0324 ± 0.00031 ms 0.0324 ± 0.00034 ms 0.999 ± 0.014
ours/n=100/PSA 0.0136 ± 0.00014 ms 0.015 ± 0.0016 ms 0.906 ± 0.097
ours/n=100/SPA 0.229 ± 0.0059 ms 0.23 ± 0.0043 ms 0.996 ± 0.032
ours/n=100/USNO 0.0304 ± 0.0017 ms 0.0304 ± 0.0017 ms 1 ± 0.079
ours/n=100/Walraven 0.0165 ± 0.0002 ms 0.0165 ± 0.00019 ms 0.999 ± 0.017
ours/n=1000/Interpolated 0.212 ± 0.0062 ms 0.212 ± 0.0059 ms 1 ± 0.041
ours/n=1000/Iqbal 0.102 ± 0.00059 ms 0.102 ± 0.00054 ms 1 ± 0.0078
ours/n=1000/NOAA 0.302 ± 0.0072 ms 0.302 ± 0.0065 ms 1 ± 0.032
ours/n=1000/PSA 0.138 ± 0.0086 ms 0.136 ± 0.00063 ms 1.02 ± 0.064
ours/n=1000/SPA 2.35 ± 0.017 ms 2.34 ± 0.008 ms 1 ± 0.0082
ours/n=1000/USNO 0.285 ± 0.007 ms 0.284 ± 0.0065 ms 1 ± 0.034
ours/n=1000/Walraven 0.17 ± 0.0087 ms 0.17 ± 0.0086 ms 0.998 ± 0.072
ours/n=10000/Interpolated 2.21 ± 0.0082 ms 2.2 ± 0.0068 ms 1 ± 0.0048
ours/n=10000/Iqbal 1.07 ± 0.0036 ms 1.07 ± 0.0032 ms 1 ± 0.0045
ours/n=10000/NOAA 3.05 ± 0.011 ms 3.05 ± 0.0072 ms 1 ± 0.0043
ours/n=10000/PSA 1.36 ± 0.012 ms 1.36 ± 0.0077 ms 1 ± 0.011
ours/n=10000/SPA 23.8 ± 0.2 ms 23.8 ± 0.06 ms 1 ± 0.0087
ours/n=10000/USNO 2.88 ± 0.024 ms 2.88 ± 0.021 ms 1 ± 0.011
ours/n=10000/Walraven 1.64 ± 0.0065 ms 1.65 ± 0.0065 ms 0.998 ± 0.0055
ours/n=100000/Interpolated 22.2 ± 0.052 ms 22.2 ± 0.054 ms 1 ± 0.0034
ours/n=100000/Iqbal 10.7 ± 0.042 ms 10.7 ± 0.036 ms 1 ± 0.0052
ours/n=100000/NOAA 31.4 ± 0.09 ms 31.4 ± 0.078 ms 0.999 ± 0.0038
ours/n=100000/PSA 13.7 ± 0.033 ms 13.7 ± 0.035 ms 1 ± 0.0035
ours/n=100000/SPA 239 ± 1.8 ms 239 ± 1.6 ms 1 ± 0.01
ours/n=100000/USNO 29.3 ± 0.15 ms 29.3 ± 0.16 ms 1 ± 0.0075
ours/n=100000/Walraven 16.5 ± 0.071 ms 16.5 ± 0.069 ms 0.998 ± 0.006
refraction/ARCHER 0.000201 ± 1e-05 ms 0.000201 ± 1e-05 ms 1 ± 0.07
refraction/BENNETT 0.0002 ± 1e-05 ms 0.0002 ± 1e-05 ms 1 ± 0.071
refraction/MICHALSKY 0.00017 ± 1e-06 ms 0.00017 ± 1e-06 ms 1 ± 0.0083
refraction/NoRefraction 0.00017 ± 9e-06 ms 0.00017 ± 9e-06 ms 1 ± 0.075
refraction/SG2 0.00021 ± 1e-06 ms 0.00021 ± 0 ms 1 ± 0.0048
single/Interpolated 0.000321 ± 1e-06 ms 0.000321 ± 1e-06 ms 1 ± 0.0044
single/Iqbal 0.00014 ± 1e-05 ms 0.000141 ± 1e-05 ms 0.993 ± 0.1
single/NOAA 0.000341 ± 1e-05 ms 0.000341 ± 1e-05 ms 1 ± 0.041
single/PSA 0.00017 ± 0 ms 0.00017 ± 0 ms 1 ± 0
single/SPA 0.00238 ± 1e-05 ms 0.00239 ± 1e-05 ms 0.996 ± 0.0059
single/USNO 0.00032 ± 1e-05 ms 0.00032 ± 1e-05 ms 1 ± 0.044
single/Walraven 0.0002 ± 9e-06 ms 0.0002 ± 0 ms 1 ± 0.045
solposx/n=100/Iqbal 1.23 ± 0.02 ms 1.24 ± 0.02 ms 0.997 ± 0.022
solposx/n=100/NOAA 2.25 ± 0.025 ms 2.25 ± 0.024 ms 1 ± 0.016
solposx/n=100/PSA 1.55 ± 0.022 ms 1.56 ± 0.024 ms 0.991 ± 0.021
solposx/n=100/SPA 2.32 ± 0.03 ms 2.32 ± 0.087 ms 0.997 ± 0.04
solposx/n=100/USNO 1.86 ± 0.02 ms 1.86 ± 0.019 ms 0.999 ± 0.015
solposx/n=100/Walraven 0.648 ± 0.017 ms 0.651 ± 0.016 ms 0.996 ± 0.036
solposx/n=1000/Iqbal 1.43 ± 0.021 ms 1.43 ± 0.021 ms 0.997 ± 0.021
solposx/n=1000/NOAA 2.82 ± 0.028 ms 2.81 ± 0.028 ms 1 ± 0.014
solposx/n=1000/PSA 1.8 ± 0.024 ms 1.8 ± 0.02 ms 0.999 ± 0.017
solposx/n=1000/SPA 5.41 ± 0.048 ms 5.39 ± 0.12 ms 1 ± 0.024
solposx/n=1000/USNO 4.94 ± 0.047 ms 4.94 ± 0.045 ms 0.999 ± 0.013
solposx/n=1000/Walraven 0.861 ± 0.018 ms 0.859 ± 0.018 ms 1 ± 0.03
solposx/n=10000/Iqbal 3.45 ± 0.055 ms 3.44 ± 0.044 ms 1 ± 0.02
solposx/n=10000/NOAA 7.84 ± 0.18 ms 7.8 ± 0.14 ms 1 ± 0.029
solposx/n=10000/PSA 4.15 ± 0.08 ms 4.15 ± 0.074 ms 1 ± 0.026
solposx/n=10000/SPA 33 ± 0.18 ms 33 ± 0.19 ms 1 ± 0.008
solposx/n=10000/USNO 36.4 ± 0.65 ms 35.9 ± 0.61 ms 1.01 ± 0.025
solposx/n=10000/Walraven 2.72 ± 0.033 ms 2.71 ± 0.032 ms 1 ± 0.017
solposx/n=100000/Iqbal 23.2 ± 0.72 ms 23.3 ± 0.64 ms 0.994 ± 0.041
solposx/n=100000/NOAA 57.1 ± 0.25 ms 57.2 ± 0.21 ms 0.999 ± 0.0057
solposx/n=100000/PSA 27.6 ± 0.66 ms 28.2 ± 0.8 ms 0.979 ± 0.036
solposx/n=100000/SPA 308 ± 6 ms 309 ± 2.8 ms 0.996 ± 0.022
solposx/n=100000/USNO 347 ± 36 ms 351 ± 32 ms 0.99 ± 0.14
solposx/n=100000/Walraven 20.9 ± 0.32 ms 21.2 ± 0.34 ms 0.988 ± 0.022
time_to_load 0.133 ± 0.001 s 0.134 ± 0.0013 s 0.99 ± 0.012
Memory benchmarks
main d159c46... main / d159c46...
ours/n=100/Interpolated 5 allocs: 4.38 kB 5 allocs: 4.38 kB 1
ours/n=100/Iqbal 3 allocs: 2.62 kB 3 allocs: 2.62 kB 1
ours/n=100/NOAA 5 allocs: 4.38 kB 5 allocs: 4.38 kB 1
ours/n=100/PSA 3 allocs: 2.62 kB 3 allocs: 2.62 kB 1
ours/n=100/SPA 5 allocs: 4.38 kB 5 allocs: 4.38 kB 1
ours/n=100/USNO 3 allocs: 2.62 kB 3 allocs: 2.62 kB 1
ours/n=100/Walraven 3 allocs: 2.62 kB 3 allocs: 2.62 kB 1
ours/n=1000/Interpolated 5 allocs: 0.0388 MB 5 allocs: 0.0388 MB 1
ours/n=1000/Iqbal 3 allocs: 23.8 kB 3 allocs: 23.8 kB 1
ours/n=1000/NOAA 5 allocs: 0.0388 MB 5 allocs: 0.0388 MB 1
ours/n=1000/PSA 3 allocs: 23.8 kB 3 allocs: 23.8 kB 1
ours/n=1000/SPA 5 allocs: 0.0388 MB 5 allocs: 0.0388 MB 1
ours/n=1000/USNO 3 allocs: 23.8 kB 3 allocs: 23.8 kB 1
ours/n=1000/Walraven 3 allocs: 23.8 kB 3 allocs: 23.8 kB 1
ours/n=10000/Interpolated 10 allocs: 0.382 MB 10 allocs: 0.382 MB 1
ours/n=10000/Iqbal 6 allocs: 0.229 MB 6 allocs: 0.229 MB 1
ours/n=10000/NOAA 10 allocs: 0.382 MB 10 allocs: 0.382 MB 1
ours/n=10000/PSA 6 allocs: 0.229 MB 6 allocs: 0.229 MB 1
ours/n=10000/SPA 10 allocs: 0.382 MB 10 allocs: 0.382 MB 1
ours/n=10000/USNO 6 allocs: 0.229 MB 6 allocs: 0.229 MB 1
ours/n=10000/Walraven 6 allocs: 0.229 MB 6 allocs: 0.229 MB 1
ours/n=100000/Interpolated 10 allocs: 3.81 MB 10 allocs: 3.81 MB 1
ours/n=100000/Iqbal 6 allocs: 2.29 MB 6 allocs: 2.29 MB 1
ours/n=100000/NOAA 10 allocs: 3.81 MB 10 allocs: 3.81 MB 1
ours/n=100000/PSA 6 allocs: 2.29 MB 6 allocs: 2.29 MB 1
ours/n=100000/SPA 10 allocs: 3.81 MB 10 allocs: 3.81 MB 1
ours/n=100000/USNO 6 allocs: 2.29 MB 6 allocs: 2.29 MB 1
ours/n=100000/Walraven 6 allocs: 2.29 MB 6 allocs: 2.29 MB 1
refraction/ARCHER 0 allocs: 0 B 0 allocs: 0 B
refraction/BENNETT 0 allocs: 0 B 0 allocs: 0 B
refraction/MICHALSKY 0 allocs: 0 B 0 allocs: 0 B
refraction/NoRefraction 0 allocs: 0 B 0 allocs: 0 B
refraction/SG2 0 allocs: 0 B 0 allocs: 0 B
single/Interpolated 0 allocs: 0 B 0 allocs: 0 B
single/Iqbal 0 allocs: 0 B 0 allocs: 0 B
single/NOAA 0 allocs: 0 B 0 allocs: 0 B
single/PSA 0 allocs: 0 B 0 allocs: 0 B
single/SPA 0 allocs: 0 B 0 allocs: 0 B
single/USNO 0 allocs: 0 B 0 allocs: 0 B
single/Walraven 0 allocs: 0 B 0 allocs: 0 B
solposx/n=100/Iqbal 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=100/NOAA 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=100/PSA 0.057 k allocs: 1.61 kB 0.057 k allocs: 1.61 kB 1
solposx/n=100/SPA 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=100/USNO 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=100/Walraven 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=1000/Iqbal 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=1000/NOAA 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=1000/PSA 0.057 k allocs: 1.61 kB 0.057 k allocs: 1.61 kB 1
solposx/n=1000/SPA 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=1000/USNO 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=1000/Walraven 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=10000/Iqbal 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=10000/NOAA 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=10000/PSA 0.057 k allocs: 1.61 kB 0.057 k allocs: 1.61 kB 1
solposx/n=10000/SPA 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=10000/USNO 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=10000/Walraven 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=100000/Iqbal 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=100000/NOAA 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=100000/PSA 0.057 k allocs: 1.61 kB 0.057 k allocs: 1.61 kB 1
solposx/n=100000/SPA 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=100000/USNO 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
solposx/n=100000/Walraven 19 allocs: 0.734 kB 19 allocs: 0.734 kB 1
time_to_load 0.153 k allocs: 14.5 kB 0.153 k allocs: 14.5 kB 1

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (Julia vpre)

Time benchmarks
main d159c46... main / d159c46...
ours/n=100/Interpolated 0.026 ± 0.00033 ms 0.0259 ± 0.0002 ms 1 ± 0.015
ours/n=100/Iqbal 0.0131 ± 0.00011 ms 0.0131 ± 0.00011 ms 1 ± 0.012
ours/n=100/NOAA 0.0425 ± 0.0002 ms 0.0426 ± 0.0004 ms 1 ± 0.011
ours/n=100/PSA 0.0165 ± 0.00012 ms 0.0165 ± 0.00013 ms 1 ± 0.011
ours/n=100/SPA 0.419 ± 0.0086 ms 0.44 ± 0.019 ms 0.953 ± 0.046
ours/n=100/USNO 0.0403 ± 0.00029 ms 0.0405 ± 0.00034 ms 0.997 ± 0.011
ours/n=100/Walraven 0.0199 ± 0.00055 ms 0.0195 ± 0.00049 ms 1.02 ± 0.038
ours/n=1000/Interpolated 0.258 ± 0.0093 ms 0.258 ± 0.0095 ms 0.997 ± 0.051
ours/n=1000/Iqbal 0.134 ± 0.002 ms 0.135 ± 0.0076 ms 0.994 ± 0.058
ours/n=1000/NOAA 0.417 ± 0.009 ms 0.417 ± 0.009 ms 1 ± 0.031
ours/n=1000/PSA 0.165 ± 0.0077 ms 0.165 ± 0.0083 ms 1 ± 0.069
ours/n=1000/SPA 4.39 ± 0.023 ms 4.35 ± 0.13 ms 1.01 ± 0.03
ours/n=1000/USNO 0.395 ± 0.009 ms 0.394 ± 0.009 ms 1 ± 0.032
ours/n=1000/Walraven 0.195 ± 0.0083 ms 0.195 ± 0.0081 ms 1 ± 0.06
ours/n=10000/Interpolated 2.68 ± 0.013 ms 2.69 ± 0.013 ms 0.997 ± 0.0067
ours/n=10000/Iqbal 1.42 ± 0.0098 ms 1.43 ± 0.012 ms 0.994 ± 0.011
ours/n=10000/NOAA 4.19 ± 0.012 ms 4.18 ± 0.013 ms 1 ± 0.0042
ours/n=10000/PSA 1.68 ± 0.0078 ms 1.68 ± 0.0084 ms 0.998 ± 0.0068
ours/n=10000/SPA 44.1 ± 0.13 ms 44.8 ± 1.7 ms 0.984 ± 0.038
ours/n=10000/USNO 3.98 ± 0.011 ms 3.98 ± 0.013 ms 0.998 ± 0.0042
ours/n=10000/Walraven 1.97 ± 0.0053 ms 1.97 ± 0.0057 ms 1 ± 0.004
ours/n=100000/Interpolated 27.6 ± 1.6 ms 27.1 ± 1.4 ms 1.02 ± 0.081
ours/n=100000/Iqbal 14.3 ± 0.3 ms 14.3 ± 0.32 ms 0.995 ± 0.03
ours/n=100000/NOAA 42.8 ± 0.91 ms 42.7 ± 0.47 ms 1 ± 0.024
ours/n=100000/PSA 16.9 ± 0.31 ms 16.9 ± 0.29 ms 1 ± 0.025
ours/n=100000/SPA 441 ± 9.1 ms 451 ± 5.2 ms 0.978 ± 0.023
ours/n=100000/USNO 40.2 ± 0.2 ms 40.3 ± 0.36 ms 0.998 ± 0.01
ours/n=100000/Walraven 19.7 ± 0.35 ms 19.7 ± 0.32 ms 1 ± 0.024
refraction/ARCHER 0.00024 ± 1e-05 ms 0.000231 ± 1e-05 ms 1.04 ± 0.062
refraction/BENNETT 0.00024 ± 1e-05 ms 0.00024 ± 1e-05 ms 1 ± 0.059
refraction/MICHALSKY 0.0002 ± 1e-06 ms 0.0002 ± 1e-06 ms 1 ± 0.0071
refraction/NoRefraction 0.0002 ± 1e-05 ms 0.000191 ± 1e-05 ms 1.05 ± 0.076
refraction/SG2 0.00025 ± 1e-06 ms 0.00025 ± 1e-06 ms 1 ± 0.0057
single/Interpolated 0.000401 ± 1e-06 ms 0.000401 ± 0 ms 1 ± 0.0025
single/Iqbal 0.00018 ± 1e-06 ms 0.00018 ± 1e-05 ms 1 ± 0.056
single/NOAA 0.000451 ± 1e-06 ms 0.000451 ± 0 ms 1 ± 0.0022
single/PSA 0.0002 ± 1e-05 ms 0.000191 ± 1e-05 ms 1.05 ± 0.076
single/SPA 0.00399 ± 4e-05 ms 0.00385 ± 3e-05 ms 1.04 ± 0.013
single/USNO 0.000411 ± 1e-06 ms 0.000411 ± 1e-06 ms 1 ± 0.0034
single/Walraven 0.000231 ± 1e-05 ms 0.000231 ± 1e-05 ms 1 ± 0.061
solposx/n=100/Iqbal 2.25 ± 0.037 ms 2.25 ± 0.029 ms 1 ± 0.021
solposx/n=100/NOAA 4.04 ± 0.061 ms 4.03 ± 0.051 ms 1 ± 0.02
solposx/n=100/PSA 2.86 ± 0.045 ms 2.9 ± 0.036 ms 0.985 ± 0.02
solposx/n=100/SPA 3.07 ± 0.025 ms 3.13 ± 0.028 ms 0.981 ± 0.012
solposx/n=100/USNO 3.08 ± 0.042 ms 3.1 ± 0.034 ms 0.994 ± 0.017
solposx/n=100/Walraven 1.13 ± 0.02 ms 1.12 ± 0.018 ms 1.01 ± 0.024
solposx/n=1000/Iqbal 2.54 ± 0.041 ms 2.54 ± 0.034 ms 1 ± 0.021
solposx/n=1000/NOAA 4.75 ± 0.056 ms 4.67 ± 0.056 ms 1.02 ± 0.017
solposx/n=1000/PSA 3.25 ± 0.05 ms 3.29 ± 0.04 ms 0.989 ± 0.019
solposx/n=1000/SPA 7.54 ± 0.038 ms 7.7 ± 0.07 ms 0.979 ± 0.01
solposx/n=1000/USNO 7.22 ± 0.06 ms 7.26 ± 0.058 ms 0.995 ± 0.011
solposx/n=1000/Walraven 1.42 ± 0.03 ms 1.41 ± 0.031 ms 1.01 ± 0.031
solposx/n=10000/Iqbal 5.3 ± 0.064 ms 5.36 ± 0.078 ms 0.989 ± 0.019
solposx/n=10000/NOAA 10.7 ± 0.13 ms 10.7 ± 0.082 ms 0.994 ± 0.014
solposx/n=10000/PSA 6.64 ± 0.077 ms 6.68 ± 0.065 ms 0.995 ± 0.015
solposx/n=10000/SPA 50.2 ± 0.26 ms 51.1 ± 0.31 ms 0.983 ± 0.0078
solposx/n=10000/USNO 47.8 ± 0.56 ms 49.3 ± 0.55 ms 0.971 ± 0.016
solposx/n=10000/Walraven 3.95 ± 0.039 ms 4 ± 0.035 ms 0.988 ± 0.013
solposx/n=100000/Iqbal 30.8 ± 0.37 ms 31.4 ± 0.34 ms 0.981 ± 0.016
solposx/n=100000/NOAA 67 ± 0.73 ms 68.7 ± 0.44 ms 0.975 ± 0.012
solposx/n=100000/PSA 39.2 ± 0.53 ms 38.9 ± 0.33 ms 1.01 ± 0.016
solposx/n=100000/SPA 503 ± 6.7 ms 508 ± 5.9 ms 0.99 ± 0.018
solposx/n=100000/USNO 463 ± 27 ms 470 ± 29 ms 0.986 ± 0.083
solposx/n=100000/Walraven 28.3 ± 0.34 ms 28.8 ± 0.24 ms 0.983 ± 0.014
time_to_load 0.124 ± 0.0024 s 0.124 ± 0.00032 s 0.998 ± 0.019
Memory benchmarks
main d159c46... main / d159c46...
ours/n=100/Interpolated 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/Iqbal 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/NOAA 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/PSA 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/SPA 10 allocs: 4.53 kB 10 allocs: 4.53 kB 1
ours/n=100/USNO 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=100/Walraven 6 allocs: 2.72 kB 6 allocs: 2.72 kB 1
ours/n=1000/Interpolated 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/Iqbal 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/NOAA 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/PSA 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/SPA 15 allocs: 0.0385 MB 15 allocs: 0.0385 MB 1
ours/n=1000/USNO 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=1000/Walraven 9 allocs: 23.6 kB 9 allocs: 23.6 kB 1
ours/n=10000/Interpolated 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/Iqbal 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/NOAA 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/PSA 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/SPA 15 allocs: 0.382 MB 15 allocs: 0.382 MB 1
ours/n=10000/USNO 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=10000/Walraven 9 allocs: 0.229 MB 9 allocs: 0.229 MB 1
ours/n=100000/Interpolated 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/Iqbal 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/NOAA 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/PSA 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/SPA 15 allocs: 3.82 MB 15 allocs: 3.82 MB 1
ours/n=100000/USNO 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
ours/n=100000/Walraven 9 allocs: 2.29 MB 9 allocs: 2.29 MB 1
refraction/ARCHER 0 allocs: 0 B 0 allocs: 0 B
refraction/BENNETT 0 allocs: 0 B 0 allocs: 0 B
refraction/MICHALSKY 0 allocs: 0 B 0 allocs: 0 B
refraction/NoRefraction 0 allocs: 0 B 0 allocs: 0 B
refraction/SG2 0 allocs: 0 B 0 allocs: 0 B
single/Interpolated 0 allocs: 0 B 0 allocs: 0 B
single/Iqbal 0 allocs: 0 B 0 allocs: 0 B
single/NOAA 0 allocs: 0 B 0 allocs: 0 B
single/PSA 0 allocs: 0 B 0 allocs: 0 B
single/SPA 0 allocs: 0 B 0 allocs: 0 B
single/USNO 0 allocs: 0 B 0 allocs: 0 B
single/Walraven 0 allocs: 0 B 0 allocs: 0 B
solposx/n=100/Iqbal 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=100/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/Iqbal 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=1000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=1000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/Iqbal 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=10000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=10000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/Iqbal 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/NOAA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/PSA 0.039 k allocs: 1.2 kB 0.039 k allocs: 1.2 kB 1
solposx/n=100000/SPA 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/USNO 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
solposx/n=100000/Walraven 10 allocs: 0.531 kB 10 allocs: 0.531 kB 1
time_to_load 0.205 k allocs: 11.9 kB 0.205 k allocs: 11.9 kB 1

langestefan and others added 3 commits July 30, 2026 13:05
test/.CondaPkg is a CondaPkg.jl generated environment, not shareable state.
Nothing declares it, since there is no test/CondaPkg.toml, and nothing under
test/ uses CondaPkg, PythonCall or PyCall. The tracked meta file is a binary
cache holding absolute paths from whichever machine last resolved it.

docs/.CondaPkg was already ignored, so the pattern is generalised rather than
extended one directory at a time. The files stay on disk and CondaPkg
regenerates them on demand.

benchmark/.CondaPkg is tracked for the same reason and has the same problem,
but benchmark/python.jl does use CondaPkg, so it is left alone here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KhdBYRmHazfXZHWCRWt5fT
The docstring and both guides stated that the result element type follows the
Observer element type. That was only true because a mismatched refraction model
used to be a MethodError, and it is now the promotion of the two, since the
apparent angles are computed at the model's precision.

Promotion is kept rather than narrowing the model's parameters to the observer's
type, because narrowing would have to special case ForwardDiff.Dual to avoid
destroying derivatives.

Type stability tests grow to cover the case. The vector path sizes its
StructVector from a type computed at call time, so it has to infer to a concrete
element type or the whole vector API goes unstable, and that path had no
coverage: the existing testset only exercised scalar calls with NoRefraction and
DefaultRefraction, neither of which can widen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KhdBYRmHazfXZHWCRWt5fT
benchmark/python.jl does use CondaPkg, but the tracked environment cannot be
what serves it: pixi.toml and pixi.lock contain no reference to solposx or
pandas, the two packages python.jl installs. What is tracked is the Copier
template's own environment of copier, openssl and libstdcxx, the same stale
content that test/.CondaPkg held, and its meta file is a binary cache of
absolute paths from another machine.

CondaPkg resolves the real dependencies on demand, and there is no tracked
benchmark/CondaPkg.toml declaring anything. The **/.CondaPkg/ pattern added in
the previous commit already covers this directory, and the files stay on disk.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KhdBYRmHazfXZHWCRWt5fT
@codecov

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (0bb61c3) to head (d159c46).

Additional details and impacted files
@@            Coverage Diff            @@
##              main      #119   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           20        20           
  Lines          751       766   +15     
=========================================
+ Hits           751       766   +15     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@langestefan
langestefan merged commit 2c867fa into main Jul 30, 2026
18 checks passed
@langestefan
langestefan deleted the autodiff-refraction-params branch July 30, 2026 12:06
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.

1 participant