Skip to content

Add the Michalsky positioning algorithm - #120

Merged
langestefan merged 2 commits into
mainfrom
feature/michalsky-positioning
Jul 30, 2026
Merged

Add the Michalsky positioning algorithm#120
langestefan merged 2 commits into
mainfrom
feature/michalsky-positioning

Conversation

@langestefan

Copy link
Copy Markdown
Member

Implements the Astronomical Almanac series as presented by Michalsky (1988), closing the @test_skip that has been sitting in test/positioning/test-michalsky.jl.

solar_position(Observer(45.0, 10.0), DateTime(2020, 10, 17, 13, 30), Michalsky())
# ApparentSolPos(azimuth=220.57252808890308°, elevation=26.45700256925404°, ...)
  • The Spencer (1989) azimuth quadrant correction is on by default, so the result is valid in both hemispheres. spencer_correction = false reproduces the original northern hemisphere formulation.
  • The default refraction model is MICHALSKY, matching the paper, so a default call returns ApparentSolPos.
  • julian_date selects the paper's integer based Julian date, :original, or the exact one, :standard. The paper's naive leap year count from 1949 only holds the stated 0.01° accuracy between 1950 and 2050; the two agree exactly inside that window and diverge outside it.

Rather than build the ~2.43e6 Julian Date and subtract J2000, which would materialise that magnitude at precision T and break the magnitude-safety rule in CLAUDE.md, the constant offset is folded into the integer day count. Every literal is converted at T and every asin argument goes through unit_clamp.

The stored reference tables were stale

This is the part worth a close look, and probably why this algorithm stalled before.

The tables in test-michalsky.jl were generated against a test_conditions() whose base time was 12:30 UTC. That is 1800 s from noon, which is not a multiple of the 84.375 s grid the reference values depend on for an exactly representable Float64 Julian Date. The conditions were later moved to 13:30 UTC, which is exactly 64 × 84.375. The tables here and in test-sg2.jl were never regenerated, and because both testsets were skipped, nobody noticed. Implementing against them shows roughly 15° of error on 14 of the 19 rows, which looks exactly like a broken algorithm.

I verified this rather than assuming it: solving for the instant each stored row actually corresponds to put all 19 rows within 4e-9 of this implementation at the old times, including latitude ±90°, longitude ±180°, and the years 1800 and 2200. That validated the implementation against 285 independent numbers before any table was touched.

row stored reference instant current test_conditions()
most 12:30 UTC 13:30 UTC
3 10:30 (12:30+02:00) unchanged
4 14:30 (12:30-02:00) 14:15
15, 16 03:30, 05:50 03:45, 05:48:45

All three tables are now exact solposx output at the current conditions, generated through the existing CondaPkg setup. This implementation matches solposx bit for bit on row 1 (26.45700256925404), which let the tolerance tighten from 1e-6 to 1e-10, the same as every other algorithm. benchmark/CondaPkg.toml is added so that generation is reproducible; it mirrors the already tracked docs/CondaPkg.toml exactly.

test-sg2.jl has the identical staleness and is left alone here, since SG2 positioning is still unimplemented and its name would collide with the SG2 refraction model.

A duplicated mapping in the interface tests

test-interface.jl kept its own copy of the algorithm to result type mapping, hardcoded as SPA/NOAAApparentSolPos and everything else → SolPos. Michalsky fell into the wrong branch, and the in-place test built a SolPos buffer that then failed with Cannot convert ApparentSolPos{Float64} to SolPos{Float64}. Instead of adding Michalsky to the list, the copy is replaced by a call to result_type, with the buffer's fields taken from fieldnames, so the next algorithm with a default refraction model will not hit this.

expected-values.jl was also missing the Michalsky import; test_algorithms() had been resolving it by luck through another test file's import.

Verification

Full Pkg.test() passes, exit 0, no failures or errors. Michalsky 350/350 where it was previously a single skip, Interface 755/755, Autodiff 111/111, Typestability 274/274, Aqua 11/11, JET 1/1. Adding Michalsky to test_algorithms() means the interface, precision, type-stability and autodiff testsets all cover it. docs/make.jl exits 0 and the full prek run -a hook set passes.

One naming question

solposx spells the option julian_date='original'|'pandas'. I used :original and :standard, since "pandas" names a Python library that has nothing to do with the Julian date in a Julia package; the docstring records the correspondence. Happy to switch to :pandas if you would rather match upstream exactly.

🤖 Generated with Claude Code

Implements the Astronomical Almanac series as presented by Michalsky (1988),
with the Spencer (1989) azimuth quadrant correction on by default so the result
is valid in both hemispheres. The default refraction model is MICHALSKY, matching
the paper, so a default call returns ApparentSolPos.

The paper's Julian date uses a naive leap year count from 1949 and only holds the
stated 0.01 degree accuracy between 1950 and 2050. Both variants are available
through julian_date, :original and :standard, and they agree exactly inside that
window. Rather than build the ~2.43e6 Julian Date and subtract, which would
materialise that magnitude at precision T, the constant J2000 offset is folded
into the integer day count.

The reference tables were stale and are regenerated
--------------------------------------------------

The tables in test-michalsky.jl were generated against a test_conditions() whose
base time was 12:30 UTC. That time is 1800 s from noon, which is not a multiple
of the 84.375 s grid the reference values rely on for an exactly representable
Julian Date, and the conditions were later moved to 13:30, which is. The two
tables in this file and in test-sg2.jl were never regenerated, and because both
testsets were skipped nobody noticed. Anyone implementing against them would
have seen roughly 15 degrees of error on 14 of the 19 rows.

Solving for the instant each stored row corresponded to put all 19 rows on the
old times to within 4e-9, which is what confirmed the implementation before the
tables were replaced. The three tables are now exact solposx output at the
current conditions, which lets the tolerance go from 1e-6 to 1e-10, matching the
other algorithms. benchmark/CondaPkg.toml is added so that generation is
reproducible; it mirrors the tracked docs/CondaPkg.toml exactly.

test-interface.jl kept its own copy of the algorithm to result type mapping,
which sent Michalsky down the SolPos branch and made the in-place buffer fail to
convert. That copy is replaced by a call to result_type, so the next algorithm
with a default refraction model does not hit it.

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 vlts)

Time benchmarks
main 3a59538... main / 3a59538...
ours/n=100/Interpolated 0.0224 ± 0.00071 ms 0.0223 ± 0.00029 ms 1 ± 0.034
ours/n=100/Iqbal 0.011 ± 0.0014 ms 0.0113 ± 0.0013 ms 0.973 ± 0.17
ours/n=100/NOAA 0.0336 ± 0.0062 ms 0.0326 ± 0.00054 ms 1.03 ± 0.19
ours/n=100/PSA 0.0151 ± 0.0012 ms 0.0152 ± 0.0011 ms 0.995 ± 0.11
ours/n=100/SPA 0.272 ± 0.008 ms 0.272 ± 0.0071 ms 1 ± 0.039
ours/n=100/USNO 0.0302 ± 0.0014 ms 0.0303 ± 0.0013 ms 0.999 ± 0.063
ours/n=100/Walraven 0.0169 ± 0.0015 ms 0.0166 ± 0.00075 ms 1.02 ± 0.1
ours/n=1000/Interpolated 0.216 ± 0.013 ms 0.211 ± 0.0061 ms 1.02 ± 0.069
ours/n=1000/Iqbal 0.104 ± 0.0069 ms 0.103 ± 0.0048 ms 1.01 ± 0.082
ours/n=1000/NOAA 0.31 ± 0.01 ms 0.309 ± 0.0081 ms 1 ± 0.042
ours/n=1000/PSA 0.145 ± 0.01 ms 0.145 ± 0.0082 ms 1 ± 0.09
ours/n=1000/SPA 2.77 ± 0.047 ms 2.78 ± 0.033 ms 0.998 ± 0.021
ours/n=1000/USNO 0.285 ± 0.0076 ms 0.287 ± 0.0085 ms 0.992 ± 0.04
ours/n=1000/Walraven 0.164 ± 0.0081 ms 0.164 ± 0.0069 ms 1 ± 0.065
ours/n=10000/Interpolated 2.21 ± 0.27 ms 2.21 ± 0.056 ms 1 ± 0.13
ours/n=10000/Iqbal 1.11 ± 0.027 ms 1.11 ± 0.032 ms 0.998 ± 0.037
ours/n=10000/NOAA 3.09 ± 0.083 ms 3.08 ± 0.07 ms 1 ± 0.035
ours/n=10000/PSA 1.45 ± 0.014 ms 1.44 ± 0.039 ms 1 ± 0.029
ours/n=10000/SPA 27.9 ± 0.91 ms 28 ± 0.47 ms 0.995 ± 0.037
ours/n=10000/USNO 2.89 ± 0.074 ms 2.9 ± 0.063 ms 0.998 ± 0.033
ours/n=10000/Walraven 1.64 ± 0.048 ms 1.64 ± 0.047 ms 1 ± 0.041
ours/n=100000/Interpolated 22.4 ± 0.88 ms 22.3 ± 0.81 ms 1 ± 0.054
ours/n=100000/Iqbal 11.3 ± 0.55 ms 11.3 ± 0.44 ms 0.999 ± 0.062
ours/n=100000/NOAA 32.1 ± 1.2 ms 32.4 ± 1.1 ms 0.992 ± 0.05
ours/n=100000/PSA 14.8 ± 0.48 ms 14.8 ± 0.55 ms 0.998 ± 0.049
ours/n=100000/SPA 285 ± 5 ms 282 ± 6.6 ms 1.01 ± 0.03
ours/n=100000/USNO 29.7 ± 0.83 ms 29.8 ± 1.6 ms 0.997 ± 0.06
ours/n=100000/Walraven 16.6 ± 0.7 ms 16.6 ± 0.54 ms 1 ± 0.053
refraction/ARCHER 0.000215 ± 3e-06 ms 0.000216 ± 2e-06 ms 0.995 ± 0.017
refraction/BENNETT 0.000209 ± 2e-06 ms 0.000209 ± 3e-06 ms 1 ± 0.017
refraction/MICHALSKY 0.000184 ± 2e-06 ms 0.000182 ± 2e-06 ms 1.01 ± 0.016
refraction/NoRefraction 0.000178 ± 2e-06 ms 0.000178 ± 3e-06 ms 1 ± 0.02
refraction/SG2 0.000224 ± 3e-06 ms 0.000223 ± 2e-06 ms 1 ± 0.016
single/Interpolated 0.000362 ± 4e-06 ms 0.000352 ± 4e-06 ms 1.03 ± 0.016
single/Iqbal 0.000147 ± 2e-06 ms 0.000147 ± 2e-06 ms 1 ± 0.019
single/NOAA 0.000333 ± 6e-06 ms 0.000341 ± 5e-06 ms 0.977 ± 0.023
single/PSA 0.000184 ± 4e-06 ms 0.000178 ± 3e-06 ms 1.03 ± 0.028
single/SPA 0.00316 ± 0.00026 ms 0.00281 ± 2.2e-05 ms 1.12 ± 0.092
single/USNO 0.000296 ± 4e-06 ms 0.000296 ± 3e-06 ms 1 ± 0.017
single/Walraven 0.000213 ± 3e-06 ms 0.000207 ± 2e-06 ms 1.03 ± 0.018
solposx/n=100/Iqbal 1.27 ± 0.048 ms 1.27 ± 0.054 ms 0.996 ± 0.057
solposx/n=100/NOAA 2.32 ± 0.074 ms 2.33 ± 0.11 ms 0.997 ± 0.057
solposx/n=100/PSA 1.67 ± 0.06 ms 1.66 ± 0.067 ms 1.01 ± 0.054
solposx/n=100/SPA 2.13 ± 0.068 ms 2.14 ± 0.099 ms 0.993 ± 0.056
solposx/n=100/USNO 1.88 ± 0.062 ms 1.91 ± 0.061 ms 0.985 ± 0.045
solposx/n=100/Walraven 0.675 ± 0.032 ms 0.681 ± 0.035 ms 0.991 ± 0.07
solposx/n=1000/Iqbal 1.46 ± 0.052 ms 1.47 ± 0.057 ms 0.995 ± 0.052
solposx/n=1000/NOAA 2.85 ± 0.067 ms 2.86 ± 0.081 ms 0.997 ± 0.037
solposx/n=1000/PSA 1.93 ± 0.058 ms 1.92 ± 0.062 ms 1 ± 0.044
solposx/n=1000/SPA 5.34 ± 0.13 ms 5.35 ± 0.12 ms 0.998 ± 0.034
solposx/n=1000/USNO 4.89 ± 0.12 ms 5.15 ± 0.16 ms 0.949 ± 0.038
solposx/n=1000/Walraven 0.886 ± 0.045 ms 0.884 ± 0.041 ms 1 ± 0.069
solposx/n=10000/Iqbal 3.44 ± 0.093 ms 3.48 ± 0.13 ms 0.991 ± 0.045
solposx/n=10000/NOAA 7.6 ± 0.16 ms 7.65 ± 0.18 ms 0.994 ± 0.031
solposx/n=10000/PSA 4.31 ± 0.087 ms 4.31 ± 0.11 ms 0.999 ± 0.032
solposx/n=10000/SPA 33.7 ± 0.61 ms 34 ± 1.1 ms 0.991 ± 0.036
solposx/n=10000/USNO 34.4 ± 1.2 ms 36.7 ± 1.4 ms 0.937 ± 0.048
solposx/n=10000/Walraven 2.75 ± 0.089 ms 2.77 ± 0.075 ms 0.993 ± 0.042
solposx/n=100000/Iqbal 24.4 ± 0.55 ms 24.8 ± 1.1 ms 0.985 ± 0.05
solposx/n=100000/NOAA 58.4 ± 1.8 ms 59.6 ± 1.6 ms 0.98 ± 0.04
solposx/n=100000/PSA 29.4 ± 0.71 ms 29.7 ± 0.39 ms 0.99 ± 0.027
solposx/n=100000/SPA 349 ± 6.8 ms 355 ± 7.5 ms 0.982 ± 0.028
solposx/n=100000/USNO 345 ± 31 ms 379 ± 32 ms 0.909 ± 0.11
solposx/n=100000/Walraven 21.2 ± 0.36 ms 21.3 ± 0.35 ms 0.993 ± 0.023
time_to_load 0.137 ± 0.0026 s 0.139 ± 0.0023 s 0.987 ± 0.025
Memory benchmarks
main 3a59538... main / 3a59538...
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 v1)

Time benchmarks
main 3a59538... main / 3a59538...
ours/n=100/Interpolated 0.0272 ± 0.00033 ms 0.0272 ± 0.00033 ms 1 ± 0.017
ours/n=100/Iqbal 0.0129 ± 0.00014 ms 0.0129 ± 0.00013 ms 0.999 ± 0.015
ours/n=100/NOAA 0.0411 ± 0.00023 ms 0.0412 ± 0.00034 ms 0.998 ± 0.01
ours/n=100/PSA 0.0173 ± 0.00016 ms 0.0173 ± 0.00016 ms 0.998 ± 0.013
ours/n=100/SPA 0.31 ± 0.008 ms 0.309 ± 0.0081 ms 1 ± 0.037
ours/n=100/USNO 0.0389 ± 0.00033 ms 0.0386 ± 0.00021 ms 1.01 ± 0.01
ours/n=100/Walraven 0.0209 ± 0.00036 ms 0.0208 ± 0.00053 ms 1 ± 0.031
ours/n=1000/Interpolated 0.272 ± 0.008 ms 0.272 ± 0.0083 ms 1 ± 0.042
ours/n=1000/Iqbal 0.134 ± 0.0026 ms 0.134 ± 0.0027 ms 0.999 ± 0.028
ours/n=1000/NOAA 0.403 ± 0.0088 ms 0.404 ± 0.0087 ms 0.998 ± 0.031
ours/n=1000/PSA 0.175 ± 0.0087 ms 0.172 ± 0.0086 ms 1.01 ± 0.071
ours/n=1000/SPA 3.2 ± 0.022 ms 3.19 ± 0.021 ms 1 ± 0.0095
ours/n=1000/USNO 0.383 ± 0.0087 ms 0.38 ± 0.0088 ms 1.01 ± 0.033
ours/n=1000/Walraven 0.211 ± 0.01 ms 0.21 ± 0.01 ms 1 ± 0.068
ours/n=10000/Interpolated 2.85 ± 0.015 ms 2.85 ± 0.015 ms 1 ± 0.0073
ours/n=10000/Iqbal 1.41 ± 0.01 ms 1.41 ± 0.011 ms 0.999 ± 0.011
ours/n=10000/NOAA 4.08 ± 0.017 ms 4.08 ± 0.023 ms 1 ± 0.007
ours/n=10000/PSA 1.72 ± 0.0083 ms 1.72 ± 0.0086 ms 1 ± 0.0069
ours/n=10000/SPA 32.5 ± 0.11 ms 32.5 ± 0.068 ms 1 ± 0.004
ours/n=10000/USNO 3.86 ± 0.019 ms 3.84 ± 0.025 ms 1.01 ± 0.0081
ours/n=10000/Walraven 2.1 ± 0.016 ms 2.1 ± 0.012 ms 1 ± 0.0096
ours/n=100000/Interpolated 28.7 ± 0.8 ms 28.6 ± 0.92 ms 1 ± 0.043
ours/n=100000/Iqbal 14.1 ± 0.11 ms 14.2 ± 0.18 ms 0.996 ± 0.015
ours/n=100000/NOAA 41.9 ± 0.83 ms 41.9 ± 0.86 ms 1 ± 0.029
ours/n=100000/PSA 17.6 ± 0.13 ms 17.5 ± 0.11 ms 1 ± 0.01
ours/n=100000/SPA 326 ± 2.4 ms 326 ± 2.4 ms 1 ± 0.01
ours/n=100000/USNO 39.4 ± 0.13 ms 39.1 ± 0.45 ms 1.01 ± 0.012
ours/n=100000/Walraven 21 ± 0.38 ms 21.1 ± 0.2 ms 0.999 ± 0.02
refraction/ARCHER 0.000261 ± 1e-05 ms 0.000261 ± 1.1e-05 ms 1 ± 0.057
refraction/BENNETT 0.00026 ± 1e-06 ms 0.000261 ± 1e-06 ms 0.996 ± 0.0054
refraction/MICHALSKY 0.00022 ± 1e-06 ms 0.00022 ± 1e-05 ms 1 ± 0.046
refraction/NoRefraction 0.00022 ± 9e-06 ms 0.00022 ± 9e-06 ms 1 ± 0.058
refraction/SG2 0.00028 ± 1e-06 ms 0.00028 ± 1e-06 ms 1 ± 0.0051
single/Interpolated 0.00044 ± 1e-05 ms 0.000431 ± 9e-06 ms 1.02 ± 0.032
single/Iqbal 0.00019 ± 1e-06 ms 0.00019 ± 1e-06 ms 1 ± 0.0074
single/NOAA 0.00046 ± 1e-05 ms 0.00046 ± 1e-05 ms 1 ± 0.031
single/PSA 0.00022 ± 9e-06 ms 0.00022 ± 9e-06 ms 1 ± 0.058
single/SPA 0.00325 ± 2e-05 ms 0.00324 ± 1.1e-05 ms 1.01 ± 0.0071
single/USNO 0.000421 ± 1e-06 ms 0.000421 ± 1e-06 ms 1 ± 0.0034
single/Walraven 0.000261 ± 1e-06 ms 0.00026 ± 1e-06 ms 1 ± 0.0054
solposx/n=100/Iqbal 1.59 ± 0.026 ms 1.58 ± 0.025 ms 1 ± 0.023
solposx/n=100/NOAA 2.9 ± 0.036 ms 2.87 ± 0.036 ms 1.01 ± 0.018
solposx/n=100/PSA 2 ± 0.026 ms 2 ± 0.026 ms 1 ± 0.019
solposx/n=100/SPA 3.08 ± 0.031 ms 3.04 ± 0.098 ms 1.01 ± 0.034
solposx/n=100/USNO 2.41 ± 0.03 ms 2.39 ± 0.031 ms 1.01 ± 0.018
solposx/n=100/Walraven 0.841 ± 0.016 ms 0.845 ± 0.018 ms 0.995 ± 0.028
solposx/n=1000/Iqbal 1.85 ± 0.025 ms 1.85 ± 0.026 ms 1 ± 0.02
solposx/n=1000/NOAA 3.52 ± 0.037 ms 3.51 ± 0.054 ms 1 ± 0.019
solposx/n=1000/PSA 2.37 ± 0.031 ms 2.34 ± 0.032 ms 1.01 ± 0.019
solposx/n=1000/SPA 7.46 ± 0.054 ms 7.44 ± 0.11 ms 1 ± 0.017
solposx/n=1000/USNO 6.44 ± 0.057 ms 6.52 ± 0.087 ms 0.987 ± 0.016
solposx/n=1000/Walraven 1.13 ± 0.027 ms 1.12 ± 0.025 ms 1.01 ± 0.033
solposx/n=10000/Iqbal 4.63 ± 0.12 ms 4.59 ± 0.13 ms 1.01 ± 0.038
solposx/n=10000/NOAA 9.51 ± 0.22 ms 9.46 ± 0.19 ms 1.01 ± 0.03
solposx/n=10000/PSA 5.7 ± 0.14 ms 5.68 ± 0.17 ms 1 ± 0.039
solposx/n=10000/SPA 48.9 ± 0.26 ms 49 ± 0.26 ms 0.998 ± 0.0074
solposx/n=10000/USNO 46.9 ± 0.91 ms 48.3 ± 0.87 ms 0.97 ± 0.026
solposx/n=10000/Walraven 3.74 ± 0.11 ms 3.75 ± 0.1 ms 0.997 ± 0.04
solposx/n=100000/Iqbal 31.6 ± 1 ms 31.7 ± 0.97 ms 0.995 ± 0.044
solposx/n=100000/NOAA 68.3 ± 0.3 ms 68.3 ± 0.59 ms 1 ± 0.0096
solposx/n=100000/PSA 39.2 ± 0.88 ms 39.6 ± 1.1 ms 0.99 ± 0.034
solposx/n=100000/SPA 461 ± 1.3 ms 462 ± 3.8 ms 0.998 ± 0.0086
solposx/n=100000/USNO 450 ± 37 ms 466 ± 40 ms 0.965 ± 0.11
solposx/n=100000/Walraven 29.6 ± 0.85 ms 29.8 ± 0.54 ms 0.994 ± 0.034
time_to_load 0.181 ± 0.0052 s 0.181 ± 0.0031 s 0.997 ± 0.033
Memory benchmarks
main 3a59538... main / 3a59538...
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 vpre)

Time benchmarks
main 3a59538... main / 3a59538...
ours/n=100/Interpolated 0.0287 ± 0.00065 ms 0.0287 ± 0.00084 ms 1 ± 0.037
ours/n=100/Iqbal 0.0135 ± 0.00038 ms 0.0136 ± 0.00042 ms 0.994 ± 0.042
ours/n=100/NOAA 0.0432 ± 0.00038 ms 0.0428 ± 0.00032 ms 1.01 ± 0.012
ours/n=100/PSA 0.0176 ± 0.00022 ms 0.0177 ± 0.00023 ms 0.994 ± 0.018
ours/n=100/SPA 0.386 ± 0.0052 ms 0.385 ± 0.005 ms 1 ± 0.019
ours/n=100/USNO 0.0402 ± 0.00043 ms 0.0404 ± 0.0004 ms 0.997 ± 0.014
ours/n=100/Walraven 0.0201 ± 0.00017 ms 0.0202 ± 0.00021 ms 0.996 ± 0.013
ours/n=1000/Interpolated 0.283 ± 0.0071 ms 0.284 ± 0.0069 ms 0.996 ± 0.035
ours/n=1000/Iqbal 0.14 ± 0.0049 ms 0.14 ± 0.0044 ms 0.999 ± 0.047
ours/n=1000/NOAA 0.422 ± 0.0056 ms 0.418 ± 0.0051 ms 1.01 ± 0.018
ours/n=1000/PSA 0.177 ± 0.0045 ms 0.176 ± 0.0042 ms 1 ± 0.035
ours/n=1000/SPA 3.95 ± 0.012 ms 3.94 ± 0.01 ms 1 ± 0.004
ours/n=1000/USNO 0.394 ± 0.005 ms 0.396 ± 0.0047 ms 0.994 ± 0.017
ours/n=1000/Walraven 0.202 ± 0.002 ms 0.202 ± 0.0018 ms 1 ± 0.013
ours/n=10000/Interpolated 2.99 ± 0.036 ms 3 ± 0.036 ms 0.997 ± 0.017
ours/n=10000/Iqbal 1.51 ± 0.02 ms 1.51 ± 0.017 ms 0.999 ± 0.017
ours/n=10000/NOAA 4.23 ± 0.051 ms 4.19 ± 0.042 ms 1.01 ± 0.016
ours/n=10000/PSA 1.76 ± 0.016 ms 1.76 ± 0.012 ms 1 ± 0.011
ours/n=10000/SPA 39.7 ± 0.07 ms 39.6 ± 0.079 ms 1 ± 0.0027
ours/n=10000/USNO 3.97 ± 0.032 ms 4.01 ± 0.038 ms 0.99 ± 0.012
ours/n=10000/Walraven 2.02 ± 0.0099 ms 2.03 ± 0.0082 ms 0.999 ± 0.0063
ours/n=100000/Interpolated 30.3 ± 1.1 ms 30.4 ± 1.1 ms 0.996 ± 0.052
ours/n=100000/Iqbal 15.3 ± 0.7 ms 15.3 ± 0.72 ms 0.999 ± 0.066
ours/n=100000/NOAA 44.1 ± 1.2 ms 43 ± 1.1 ms 1.02 ± 0.038
ours/n=100000/PSA 17.9 ± 0.71 ms 17.9 ± 0.74 ms 0.998 ± 0.057
ours/n=100000/SPA 399 ± 0.33 ms 397 ± 0.14 ms 1 ± 0.00089
ours/n=100000/USNO 40.1 ± 0.69 ms 40.3 ± 0.74 ms 0.995 ± 0.025
ours/n=100000/Walraven 20.4 ± 0.76 ms 20.4 ± 0.81 ms 0.998 ± 0.054
refraction/ARCHER 0.000249 ± 3e-06 ms 0.000249 ± 3e-06 ms 1 ± 0.017
refraction/BENNETT 0.000247 ± 3e-06 ms 0.00025 ± 2e-06 ms 0.988 ± 0.014
refraction/MICHALSKY 0.000208 ± 2e-06 ms 0.000208 ± 2e-06 ms 1 ± 0.014
refraction/NoRefraction 0.000204 ± 3e-06 ms 0.000203 ± 3e-06 ms 1 ± 0.021
refraction/SG2 0.000261 ± 2e-06 ms 0.000262 ± 3e-06 ms 0.996 ± 0.014
single/Interpolated 0.000436 ± 4e-06 ms 0.000433 ± 4e-06 ms 1.01 ± 0.013
single/Iqbal 0.000178 ± 3e-06 ms 0.000181 ± 3e-06 ms 0.983 ± 0.023
single/NOAA 0.000448 ± 4e-06 ms 0.000459 ± 4e-06 ms 0.976 ± 0.012
single/PSA 0.000204 ± 3e-06 ms 0.000204 ± 2e-06 ms 1 ± 0.018
single/SPA 0.00391 ± 3.9e-05 ms 0.00384 ± 4.4e-05 ms 1.02 ± 0.015
single/USNO 0.000411 ± 4e-06 ms 0.000426 ± 3e-06 ms 0.965 ± 0.012
single/Walraven 0.000239 ± 2e-06 ms 0.000238 ± 2e-06 ms 1 ± 0.012
solposx/n=100/Iqbal 1.81 ± 0.033 ms 1.78 ± 0.041 ms 1.01 ± 0.03
solposx/n=100/NOAA 3.36 ± 0.11 ms 3.32 ± 0.12 ms 1.01 ± 0.048
solposx/n=100/PSA 2.37 ± 0.086 ms 2.39 ± 0.077 ms 0.99 ± 0.048
solposx/n=100/SPA 2.91 ± 0.081 ms 2.94 ± 0.079 ms 0.991 ± 0.038
solposx/n=100/USNO 2.63 ± 0.095 ms 2.61 ± 0.1 ms 1.01 ± 0.054
solposx/n=100/Walraven 1.03 ± 0.1 ms 0.994 ± 0.099 ms 1.03 ± 0.15
solposx/n=1000/Iqbal 2.15 ± 0.071 ms 2.09 ± 0.071 ms 1.02 ± 0.048
solposx/n=1000/NOAA 4.21 ± 0.18 ms 4.1 ± 0.18 ms 1.03 ± 0.063
solposx/n=1000/PSA 2.64 ± 0.051 ms 2.62 ± 0.056 ms 1.01 ± 0.029
solposx/n=1000/SPA 6.84 ± 0.1 ms 6.67 ± 0.12 ms 1.03 ± 0.024
solposx/n=1000/USNO 6.63 ± 0.14 ms 6.52 ± 0.12 ms 1.02 ± 0.029
solposx/n=1000/Walraven 1.3 ± 0.075 ms 1.28 ± 0.079 ms 1.02 ± 0.086
solposx/n=10000/Iqbal 4.41 ± 0.044 ms 4.32 ± 0.042 ms 1.02 ± 0.014
solposx/n=10000/NOAA 9.92 ± 0.23 ms 9.72 ± 0.29 ms 1.02 ± 0.039
solposx/n=10000/PSA 5.62 ± 0.18 ms 5.49 ± 0.15 ms 1.02 ± 0.042
solposx/n=10000/SPA 41.2 ± 0.6 ms 41 ± 0.5 ms 1 ± 0.019
solposx/n=10000/USNO 45.6 ± 1 ms 44.6 ± 0.58 ms 1.02 ± 0.027
solposx/n=10000/Walraven 3.54 ± 0.13 ms 3.54 ± 0.1 ms 1 ± 0.046
solposx/n=100000/Iqbal 29.7 ± 0.34 ms 29.6 ± 0.36 ms 1 ± 0.017
solposx/n=100000/NOAA 73.9 ± 0.74 ms 73.1 ± 0.87 ms 1.01 ± 0.016
solposx/n=100000/PSA 37.6 ± 0.65 ms 37.9 ± 0.94 ms 0.992 ± 0.03
solposx/n=100000/SPA 439 ± 7.8 ms 435 ± 8.6 ms 1.01 ± 0.027
solposx/n=100000/USNO 442 ± 35 ms 436 ± 26 ms 1.01 ± 0.1
solposx/n=100000/Walraven 27.7 ± 1.2 ms 26.7 ± 0.89 ms 1.04 ± 0.057
time_to_load 0.116 ± 0.003 s 0.118 ± 0.0011 s 0.989 ± 0.027
Memory benchmarks
main 3a59538... main / 3a59538...
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

@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 (2c867fa) to head (3a59538).

Additional details and impacted files
@@            Coverage Diff            @@
##              main      #120   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           20        21    +1     
  Lines          766       811   +45     
=========================================
+ Hits           766       811   +45     

☔ 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.

Codecov flagged one uncovered line, the azimuth += 360 arm of
_original_quadrant. That branch needs the sun below the critical elevation
after solar noon, and every one of the 19 shared test conditions is either
daytime or before noon, so it was unreachable from test_conditions(). A branch
tally over those conditions confirmed it: 15 hits on the 180 - azimuth arm, 4 on
neither, 1 on the undefined ratio at the equator, and 0 here.

test_conditions() is shared with every other algorithm's reference table, so it
cannot grow a row. Two evening cases at latitude plus and minus 45 cover the
branch instead, and their azimuths above 180 degrees are the full turn taking
effect. The timestamp is 29025 s from noon, which is 344 times the 84.375 s grid
and a whole number of seconds, so the Julian Date stays exactly representable.
Values are solposx output, the same provenance as the tables.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KhdBYRmHazfXZHWCRWt5fT
@langestefan
langestefan merged commit 8a0b6c0 into main Jul 30, 2026
18 checks passed
@langestefan
langestefan deleted the feature/michalsky-positioning branch July 30, 2026 14:39
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