Commit Graph

143 Commits

Author SHA1 Message Date
ApsisRS contributors e6ed78bdb0 access: search a constellation's tracks across several threads
A ground station's access schedule is one search per satellite, each
independent of the others, and a shell gives enough of them to pay for the
threads. The parallel form returns the same summaries in the same order as
the sequential one, including an error at the position the sequential form
would put it, so one bad track does not hide the rest.
2026-09-30 18:37:02 +08:00
ApsisRS contributors d703704680 sgp4: propagate a track across several threads
A coverage run wants a satellite's state at every minute of a day, and each
state is independent, so the loop is a candidate for several cores and the
work is large enough to pay for the threads. The parallel form returns the
same values in the same order as the sequential one, including reporting a
decayed instant as None rather than stopping early.
2026-09-30 18:36:14 +08:00
ApsisRS contributors 674de32840 math: add scoped parallelism built on the standard library
The workspace forbids third party crates, and a thread pool is not needed:
every loop in this workspace that benefits from several cores iterates
independent items, which scoped threads express directly. Borrowing the
data removes the need for an Arc, and joining inside the scope means no
result escapes while a thread still writes it.

for_each_index and map_index split a range into one chunk per thread. Both
take a closure that is only called, never mutated, so the caller shares
input and produces output rather than racing on it. threads_for keeps a
short loop on one thread, because starting a thread to do a few
microseconds of work costs more than the work.
2026-09-30 18:35:25 +08:00
ApsisRS contributors 0232790b4e topology: index the outgoing edges
Asking whether an edge already exists scanned the whole edge list, so
building a graph of E edges cost O(E^2). A visibility sweep adds a quadratic
number of edges, so the whole construction was cubic: 600 satellites took
twelve seconds. An index of outgoing edge positions makes the membership
test constant time, and the same index answers neighbours and out-degree
without a scan. Removal rebuilds the index in one pass, since it renumbers
every later position. Six hundred satellites now take 130 ms, a factor of
ninety five.
2026-09-30 18:29:18 +08:00
ApsisRS contributors 9cb9cb17e0 docs: register the two scale benchmarks and correct the stale note
bench_scale and bench_parallel were runnable but documented nowhere, so the
directory listing did not say they existed. The file header of
bench_scale also still claimed the harness warms up, which it stopped
doing when the cold cost was given its own column.
2026-09-30 18:23:37 +08:00
ApsisRS contributors 57ce2edc3b bench: add a parallel scale benchmark
Splits the three heavy paths across scoped threads and reports the
speedup and the efficiency against the thread count, with the serial time
taken as the fastest of several runs so a scheduling hiccup cannot inflate
the reference every number is divided by.

Constellation propagation and access search are embarrassingly parallel and
scale as expected until the thread count passes eight, where the machine
stops gaining. Topology construction does not scale at all, and the split
line shows why: the geometric visibility test is two milliseconds while
folding the visible pairs into the graph is four hundred, because each
insertion scans the edges already stored.
2026-09-30 17:53:48 +08:00
ApsisRS contributors 7995423fa8 bench: drop the warm up and widen the constellation sweep
The warm up hid the first call's allocation and cache cost behind a
discarded run, so the reported figure was one the caller never waits for.
Report the first call separately as the cold cost and the rest as the
steady state, and let the difference speak for itself.

The constellation path now covers a full day at a sixty second step and
sweeps from 24 to 2016 satellites, propagating each satellite at its own
orbital elements so the deep space branch is reached where the period is
long.
2026-09-30 17:36:08 +08:00
ApsisRS contributors f6ac638312 workspace: add the scale benchmark and state the expect convention
bench_scale sweeps the input size over four paths and reports time per
unit, so growth is visible even when absolute times move with the machine.
It shows SGP4 propagation and access search are flat per satellite, while
topology construction is quadratic and planning is quadratic in the number
of tasks.

The README said library code never uses expect, but twelve call sites do,
each guarded by a check on the line above or by construction. Allow that
case explicitly and record each site with its guard in the design notes.
2026-09-30 17:25:59 +08:00
ApsisRS contributors cb0085c99f validation: add cross checks for the two-body model and the element parser
Both crates were verified only against themselves. dump_kepler writes the
element to state conversions and a state back to element round trip, which
check_kepler recomputes from the perifocal formulae, the rotation and the
vis-viva equation. dump_tle writes the parsed fields of eight element sets,
which check_tle reparses with a column indexed reader and a
reimplementation of the modulo ten checksum.
2026-09-30 17:18:45 +08:00
ApsisRS contributors 71b006bcb3 apsis-rs: reuse the shared Earth radius in the network examples
Both network examples repeated the WGS 84 equatorial radius that
apsis-core already exports, so a change to the ellipsoid would not reach
them. Use the constant.
2026-09-26 23:43:51 +08:00
ApsisRS contributors 3f7d656e14 validation: register the coverage check and widen the tolerance table
The implemented checks table listed twelve scripts and omitted the coverage
cross-check added alongside it, and the tolerance table listed three
quantities while the scripts use nineteen. Add the row and describe the
tolerances by the physical quantity they apply to.
2026-09-26 23:42:37 +08:00
ApsisRS contributors d5bb762020 orbit: mark the new error enums non exhaustive
EphemerisSamplingError and ManeuverApplicationError were missing the
attribute the other fifteen error kinds carry. Record the distinction
between an error enum, which is marked so a new category does not break a
caller, and a domain state enum, which is left exhaustive so the compiler
points at every match that a new variant needs.
2026-09-26 23:40:43 +08:00
ApsisRS contributors 66d3cd3515 ci: check and lint with all features
The facade crate enables nothing by default, so cargo check and cargo
clippy without --all-features skipped almost all of its code and every
example. A deliberate mistake placed in feature gated facade code was
invisible to the old commands and caught by the new ones.
2026-09-26 23:39:08 +08:00
ApsisRS contributors c9d2605385 docs: fix the broken intra doc links and check them in CI
Running rustdoc with -D warnings found nine broken links: a misspelt
WGS84, links to methods and constants that are private or in a crate that
is not a dependency, and three redundant explicit targets. Fix each and add
a documentation step to CI so a doc comment cannot drift away from the code
it describes without the build noticing.
2026-09-26 23:37:48 +08:00
ApsisRS contributors 7531ebacd6 workspace: remove dependencies that are declared but never used
Thirty four crates listed apsis-core or apsis-math without referencing it,
and apsis-kepler listed apsis-time and apsis-tle as well. Each was verified
removable by compiling with it taken out. An unused dependency still costs
build time and makes the dependency graph and the layer check report
relations that do not exist. The layer check now reports 104 edges, down
from 141.
2026-09-26 23:36:38 +08:00
ApsisRS contributors 87b52d8455 workspace: enforce the layer dependency rule
README stated that a crate may only depend on layers to its left, but
nothing checked it, and the wording was self contradicting: the example
given for a cross layer jump was a reverse dependency. Clarify the rule,
add scripts/check-layers.sh to enforce it, run it in CI, and record the
boundary cases in docs/design/layers.md.
2026-09-26 23:33:20 +08:00
ApsisRS contributors f299d633fe docs: correct the core error claim and record the error strategy
apsis-core described Error and Result as the workspace's single error
surface, but no crate uses them: every layer with a domain specific failure
defines its own Error and ErrorKind, whose variants name the concrete
conditions a caller matches on. Correct the doc comment and record the
strategy, including the Option versus Result split and the tolerance
conventions.
2026-09-26 23:29:25 +08:00
ApsisRS contributors d5811332e1 validation: clean up the placeholder directories
The atmosphere examples directory was empty and untracked, so it never did
anything. The validation .gitkeep files were redundant once their
directories held real content, and data/tle was described as holding TLE
samples that no script reads. Remove all three and correct the README.
2026-09-26 23:27:50 +08:00
ApsisRS contributors c875aeefa6 validation: add the coverage geometry cross-check
The network layer was the only layer without a Python cross-check, and
validation/python/constellation/ was an empty placeholder that the README
described as existing. Add the dump example and the reference script, which
recomputes the geometry from the spherical triangle relations rather than
from the Rust code, and remove the placeholder.
2026-09-26 23:26:13 +08:00
ApsisRS contributors 2acc95ff21 docs: record the cross layer unit and coordinate conventions 2026-09-26 23:24:16 +08:00
ApsisRS contributors 8b53cb1d1b ci: run the integration checks and add a dependency free benchmark
The cross-layer integration checks were examples containing assertions
that cargo test never ran, so a break in one layer's assumptions about
another could pass CI. Run them explicitly.

The benches/ and tests/ directories were empty placeholders that a virtual
workspace does not compile, and benches/criterion named a third party crate
this workspace forbids. Remove both and add a real zero dependency
benchmark as a facade example.
2026-09-26 23:22:34 +08:00
ApsisRS contributors 604838c927 orbit: add maneuver models and wire the orbit facade 2026-09-26 23:17:16 +08:00
ApsisRS contributors f45f2ad713 orbit: add ephemeris sampling and Hermite interpolation 2026-09-26 23:11:00 +08:00
ApsisRS contributors 48300342ab apsis-rs: fix the network example altitude check 2026-09-26 22:57:03 +08:00
ApsisRS contributors 0f72b866b1 ci: fix the dependency freedom check 2026-09-26 22:54:43 +08:00
ApsisRS contributors 528c4a8c6d docs: record the simulation layer design 2026-09-26 22:53:51 +08:00
ApsisRS contributors a09dd802e0 sim: add simulation facade and integration example 2026-09-26 22:52:51 +08:00
ApsisRS contributors 2ebd85a434 sim: add output trace recording 2026-09-26 22:50:05 +08:00
ApsisRS contributors f56ec891a0 sim: add scenario definition and text loading 2026-09-26 22:48:27 +08:00
ApsisRS contributors 861ec120f4 sim: add discrete event simulation engine 2026-09-26 22:28:23 +08:00
ApsisRS contributors 5f064fd422 sim: add event type and time ordered event queue 2026-09-26 22:23:13 +08:00
ApsisRS contributors 6e1deec750 ops: add precedence constraints and an improvement pass 2026-09-26 22:21:20 +08:00
ApsisRS contributors 083921fae9 apsis-rs: add end to end operations integration example 2026-09-26 17:08:06 +08:00
ApsisRS contributors a83df0333a ops: add greedy task planner 2026-09-26 17:07:12 +08:00
ApsisRS contributors f8fd175266 ops: add schedule conflict detection 2026-09-26 17:04:56 +08:00
ApsisRS contributors 305db01140 ops: add schedule representation and evaluation 2026-09-26 17:02:35 +08:00
ApsisRS contributors f388d9cdaf ops: fix a lint in the task tests 2026-09-26 17:00:11 +08:00
ApsisRS contributors b3808d9a2a ops: add tasks with resource requirements and windows 2026-09-26 16:59:48 +08:00
ApsisRS contributors 72640083af ops: add resources with availability windows and capacity 2026-09-26 16:57:54 +08:00
ApsisRS contributors cc5d0dbd19 physics: add the TEME to Earth-fixed transformation 2026-09-26 16:54:09 +08:00
ApsisRS contributors 5ef517f7c9 physics: add IAU 2000A nutation and IAU 2006 precession 2026-09-26 16:48:57 +08:00
ApsisRS contributors 574971076e apsis-rs: add end to end network integration example 2026-09-26 16:09:27 +08:00
ApsisRS contributors eb8ef3fa3b network: add mesh connectivity and critical link analysis 2026-09-26 16:06:59 +08:00
ApsisRS contributors 0bc127277f network: add handover policy with hysteresis and dwell time 2026-09-26 16:04:52 +08:00
ApsisRS contributors 033c85a338 network: add shortest path and interval routing 2026-09-26 16:03:15 +08:00
ApsisRS contributors 84e62abe52 network: add time-varying topology graph and series 2026-09-26 16:01:19 +08:00
ApsisRS contributors 016c3a4b76 network: add inter-satellite link geometry 2026-09-26 15:58:49 +08:00
ApsisRS contributors dcd1774b3f network: add access window finder 2026-09-26 15:51:47 +08:00
ApsisRS contributors ea89c217eb network: add coverage geometry, footprint, and visibility 2026-09-26 15:48:14 +08:00
ApsisRS contributors bebf7c4df0 network: add Walker constellation construction 2026-09-26 15:44:38 +08:00