Skip to content

Commit da87eec

Browse files
Merge pull request #439 from nyx-space/feat/type13_hermite_registry
Use registry for hermite type 13
2 parents 840afad + 122bdda commit da87eec

File tree

11 files changed

+160
-103
lines changed

11 files changed

+160
-103
lines changed

.github/workflows/benchmarks.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ jobs:
3636
- name: Install CSPICE
3737
run: sh dev-env-setup.sh && cd .. # Return to root
3838

39+
- uses: taiki-e/install-action@cargo-binstall
40+
- name: Install iai-callgrind-runner
41+
run: |
42+
version=$(cargo metadata --format-version=1 |\
43+
jq '.packages[] | select(.name == "iai-callgrind").version' |\
44+
tr -d '"'
45+
)
46+
cargo binstall --no-confirm iai-callgrind-runner --version $version
47+
sudo apt-get install -y valgrind
48+
49+
3950
- name: Bench JPL Ephemerides
4051
run: cargo bench --bench "*_jpl_ephemerides" --workspace --exclude anise-py
4152

anise/Cargo.toml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,15 @@ rust-spice = "0.7.6"
4949
parquet = "55.0.0"
5050
arrow = "55.0.0"
5151
criterion = "0.6"
52-
iai = "0.1"
52+
iai-callgrind = "0.14"
5353
pretty_env_logger = { workspace = true }
5454
rstest = { workspace = true }
5555
approx = "0.5.1"
5656
polars = { version = "0.46.0", features = ["lazy", "parquet"] }
5757
rayon = "1.7"
5858
serde_yml = "0.0.12"
59+
rand_pcg = "0.9.0"
60+
rand = "0.9.1"
5961

6062
[build-dependencies]
6163
ureq = { version = "3.0.10", default-features = false, optional = true, features = [
@@ -71,7 +73,11 @@ embed_ephem = ["rust-embed", "ureq"]
7173
spkezr_validation = []
7274

7375
[[bench]]
74-
name = "iai_jpl_ephemerides"
76+
name = "iai_jpl_ephemeris"
77+
harness = false
78+
79+
[[bench]]
80+
name = "iai_spacecraft_ephemeris"
7581
harness = false
7682

7783
[[bench]]

anise/benches/crit_bpc_rotation.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use anise::{constants::orientations::ITRF93, prelude::*};
2-
use criterion::{black_box, criterion_group, criterion_main, Criterion};
2+
use criterion::{criterion_group, criterion_main, Criterion};
3+
use std::hint::black_box;
34

45
const NUM_QUERIES_PER_PAIR: f64 = 100.0;
56

anise/benches/crit_jpl_ephemerides.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use anise::{
33
file2heap,
44
prelude::*,
55
};
6-
use criterion::{black_box, criterion_group, criterion_main, Criterion};
6+
use criterion::{criterion_group, criterion_main, Criterion};
7+
use std::hint::black_box;
78

89
const NUM_QUERIES_PER_PAIR: f64 = 100.0;
910

anise/benches/crit_planetary_data.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use std::path::PathBuf;
22

33
use anise::{constants::frames::EARTH_ITRF93, naif::kpl::parser::convert_tpc, prelude::*};
4-
use criterion::{black_box, criterion_group, criterion_main, Criterion};
4+
use criterion::{criterion_group, criterion_main, Criterion};
5+
use std::hint::black_box;
56

67
fn benchmark_fetch(almanac: &Almanac, frame: Frame) {
78
black_box(almanac.frame_from_uid(frame).unwrap());

anise/benches/crit_spacecraft_ephemeris.rs

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,35 @@
11
use anise::{constants::frames::EARTH_J2000, file2heap, prelude::*};
2+
use criterion::{criterion_group, criterion_main, Criterion};
3+
use rand::seq::SliceRandom;
4+
use rand::SeedableRng;
5+
use rand_pcg::Pcg64;
6+
use std::hint::black_box;
27

3-
use criterion::{black_box, criterion_group, criterion_main, Criterion};
8+
const NUM_QUERIES: f64 = 1000.0;
9+
const RNG_SEED: u64 = 1234567890;
410

5-
const NUM_QUERIES: f64 = 100.0;
6-
7-
fn benchmark_spice_single_hop_type13_hermite(time_it: TimeSeries) {
11+
fn benchmark_spice_single_hop_type13_hermite(time_vec: &[Epoch]) {
812
// SPICE load
9-
spice::furnsh("../data/gmat-hermite.bsp");
13+
spice::furnsh("../data/de440s.bsp");
14+
spice::furnsh("../data/lro.bsp");
1015

11-
for epoch in time_it {
16+
for epoch in time_vec {
1217
black_box(spice::spkezr(
13-
"-10000001",
18+
"-85",
1419
epoch.to_et_seconds(),
1520
"J2000",
1621
"NONE",
1722
"EARTH",
1823
));
1924
}
2025

21-
spice::unload("../data/gmat-hermite.bsp");
26+
spice::unload("../data/lro.bsp");
27+
spice::unload("../data/de440s.bsp");
2228
}
2329

24-
fn benchmark_anise_single_hop_type13_hermite(ctx: &Almanac, time_it: TimeSeries) {
25-
let my_sc_j2k = Frame::from_ephem_j2000(-10000001);
26-
for epoch in time_it {
30+
fn benchmark_anise_single_hop_type13_hermite(ctx: &Almanac, time_vec: &[Epoch]) {
31+
let my_sc_j2k = Frame::from_ephem_j2000(-85);
32+
for epoch in time_vec.iter().copied() {
2733
black_box(
2834
ctx.translate_geometric(my_sc_j2k, EARTH_J2000, epoch)
2935
.unwrap(),
@@ -32,32 +38,33 @@ fn benchmark_anise_single_hop_type13_hermite(ctx: &Almanac, time_it: TimeSeries)
3238
}
3339

3440
pub fn criterion_benchmark(c: &mut Criterion) {
35-
let start_epoch = Epoch::from_gregorian_at_noon(2000, 1, 1, TimeScale::UTC);
36-
let end_epoch = Epoch::from_gregorian_hms(2000, 1, 1, 15, 0, 0, TimeScale::UTC);
41+
let start_epoch = Epoch::from_gregorian_at_noon(2023, 12, 15, TimeScale::UTC);
42+
let end_epoch = Epoch::from_gregorian_at_midnight(2024, 1, 9, TimeScale::UTC);
3743
let time_step = ((end_epoch - start_epoch).to_seconds() / NUM_QUERIES).seconds();
3844
let time_it = TimeSeries::exclusive(start_epoch, end_epoch - time_step, time_step);
45+
// Shuffle the time iterator
46+
let mut rng = Pcg64::seed_from_u64(RNG_SEED);
47+
let mut time_vec: Vec<Epoch> = time_it.collect();
48+
time_vec.shuffle(&mut rng);
3949

4050
let path = "../data/de440s.bsp";
4151
let buf = file2heap!(path).unwrap();
4252
let spk = SPK::parse(buf).unwrap();
4353

44-
let buf = file2heap!("../data/gmat-hermite.bsp").unwrap();
54+
let buf = file2heap!("../data/lro.bsp").unwrap();
4555
let spacecraft = SPK::parse(buf).unwrap();
4656

4757
let ctx = Almanac::from_spk(spk)
4858
.unwrap()
4959
.with_spk(spacecraft)
5060
.unwrap();
5161

52-
// Load SPICE data
53-
spice::furnsh("../data/de440s.bsp");
54-
5562
c.bench_function("ANISE hermite", |b| {
56-
b.iter(|| benchmark_anise_single_hop_type13_hermite(&ctx, time_it.clone()))
63+
b.iter(|| benchmark_anise_single_hop_type13_hermite(&ctx, &time_vec))
5764
});
5865

5966
c.bench_function("SPICE hermite", |b| {
60-
b.iter(|| benchmark_spice_single_hop_type13_hermite(time_it.clone()))
67+
b.iter(|| benchmark_spice_single_hop_type13_hermite(&time_vec))
6168
});
6269
}
6370

anise/benches/iai_jpl_ephemerides.rs

Lines changed: 0 additions & 55 deletions
This file was deleted.

anise/benches/iai_jpl_ephemeris.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use anise::{
2+
constants::frames::{EARTH_J2000, MOON_J2000},
3+
file2heap,
4+
prelude::*,
5+
};
6+
use iai_callgrind::{library_benchmark, library_benchmark_group, main};
7+
use std::hint::black_box;
8+
9+
#[library_benchmark]
10+
fn benchmark_spice_single_hop_type2_cheby() {
11+
let epoch = Epoch::from_gregorian_at_noon(2025, 5, 25, TimeScale::ET);
12+
13+
// SPICE load
14+
spice::furnsh("../data/de440s.bsp");
15+
16+
black_box(spice::spkezr(
17+
"EARTH",
18+
epoch.to_et_seconds(),
19+
"J2000",
20+
"NONE",
21+
"MOON",
22+
));
23+
24+
spice::unload("../data/de440s.bsp");
25+
}
26+
27+
#[library_benchmark]
28+
fn benchmark_anise_single_hop_type2_cheby() {
29+
let epoch = Epoch::from_gregorian_at_noon(2025, 5, 25, TimeScale::ET);
30+
31+
let path = "../data/de440s.bsp";
32+
let buf = file2heap!(path).unwrap();
33+
let spk = SPK::parse(buf).unwrap();
34+
let ctx = Almanac::from_spk(spk).unwrap();
35+
36+
black_box(
37+
ctx.translate_geometric(EARTH_J2000, MOON_J2000, epoch)
38+
.unwrap(),
39+
);
40+
}
41+
42+
library_benchmark_group!(name = bench_jpl_ephem; benchmarks = benchmark_anise_single_hop_type2_cheby, benchmark_spice_single_hop_type2_cheby);
43+
main!(library_benchmark_groups = bench_jpl_ephem);
Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,50 @@
11
use anise::{constants::frames::EARTH_J2000, file2heap, prelude::*};
2+
use iai_callgrind::{library_benchmark, library_benchmark_group, main};
3+
use std::hint::black_box;
24

3-
use iai::black_box;
4-
5+
#[library_benchmark]
56
fn benchmark_spice_single_hop_type13_hermite() {
6-
let epoch = Epoch::from_gregorian_hms(2000, 1, 1, 14, 0, 0, TimeScale::UTC);
7+
let epoch = Epoch::from_gregorian_hms(2023, 12, 15, 14, 0, 0, TimeScale::UTC);
78

89
// SPICE load
9-
spice::furnsh("../data/gmat-hermite.bsp");
10+
spice::furnsh("../data/de440s.bsp");
11+
spice::furnsh("../data/lro.bsp");
1012

1113
black_box(spice::spkezr(
12-
"-10000001",
14+
"-85",
1315
epoch.to_et_seconds(),
1416
"J2000",
1517
"NONE",
1618
"EARTH",
1719
));
1820

19-
spice::unload("../data/gmat-hermite.bsp");
21+
spice::unload("../data/lro.bsp");
22+
spice::unload("../data/de440s.bsp");
2023
}
2124

25+
#[library_benchmark]
2226
fn benchmark_anise_single_hop_type13_hermite() {
23-
let epoch = Epoch::from_gregorian_hms(2000, 1, 1, 14, 0, 0, TimeScale::UTC);
27+
let epoch = Epoch::from_gregorian_hms(2023, 12, 15, 14, 0, 0, TimeScale::UTC);
2428

2529
let path = "../data/de440s.bsp";
2630
let buf = file2heap!(path).unwrap();
2731
let spk = SPK::parse(buf).unwrap();
2832

29-
let buf = file2heap!("../data/gmat-hermite.bsp").unwrap();
33+
let buf = file2heap!("../data/lro.bsp").unwrap();
3034
let spacecraft = SPK::parse(buf).unwrap();
3135

3236
let ctx = Almanac::from_spk(spk)
3337
.unwrap()
3438
.with_spk(spacecraft)
3539
.unwrap();
3640

37-
let my_sc_j2k = Frame::from_ephem_j2000(-10000001);
41+
let my_sc_j2k = Frame::from_ephem_j2000(-85);
3842

3943
black_box(
4044
ctx.translate_geometric(my_sc_j2k, EARTH_J2000, epoch)
4145
.unwrap(),
4246
);
4347
}
4448

45-
iai::main!(
46-
benchmark_spice_single_hop_type13_hermite,
47-
benchmark_anise_single_hop_type13_hermite
48-
);
49+
library_benchmark_group!(name = bench_spacecraft_ephem; benchmarks = benchmark_anise_single_hop_type13_hermite, benchmark_spice_single_hop_type13_hermite);
50+
main!(library_benchmark_groups = bench_spacecraft_ephem);

anise/src/math/interpolation/hermite.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@
5959
/* - SPICELIB Version 1.0.0, 01-MAR-2000 (NJB) */
6060

6161
use crate::errors::MathError;
62-
use log::error;
6362

6463
use super::{InterpolationError, MAX_SAMPLES};
6564

@@ -84,15 +83,14 @@ pub fn hermite_eval(
8483
what: "list of abscissas (xs) is empty",
8584
});
8685
} else if xs.len() > MAX_SAMPLES {
87-
error!("More than {MAX_SAMPLES} samples provided, which is the maximum number of items allowed for a Hermite interpolation");
8886
return Err(InterpolationError::CorruptedData {
8987
what: "list of abscissas (xs) contains more items than MAX_SAMPLES (32)",
9088
});
9189
}
9290

9391
// At this point, we know that the lengths of items is correct, so we can directly address them without worry for overflowing the array.
9492

95-
let work: &mut [f64] = &mut [0.0; 8 * MAX_SAMPLES];
93+
let work: &mut [f64] = &mut [0.0; 4 * MAX_SAMPLES];
9694
let n: usize = xs.len();
9795

9896
/* Copy the input array into WORK. After this, the first column */

0 commit comments

Comments
 (0)