pleiades_data/
thresholds.rs1use pleiades_backend::CelestialBody;
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub enum BodyClass {
9 Luminary,
10 InnerPlanet,
11 OuterPlanet,
12 Asteroid,
13}
14
15pub fn body_class(body: &CelestialBody) -> BodyClass {
16 match body {
17 CelestialBody::Sun | CelestialBody::Moon => BodyClass::Luminary,
18 CelestialBody::Mercury | CelestialBody::Venus | CelestialBody::Mars => {
19 BodyClass::InnerPlanet
20 }
21 CelestialBody::Jupiter
22 | CelestialBody::Saturn
23 | CelestialBody::Uranus
24 | CelestialBody::Neptune
25 | CelestialBody::Pluto => BodyClass::OuterPlanet,
26 _ => BodyClass::Asteroid,
27 }
28}
29
30#[derive(Clone, Copy, Debug)]
31pub struct AccuracyCeiling {
32 pub lon_arcsec: f64,
33 pub lat_arcsec: f64,
34 pub dist_km: f64,
35 pub lon_speed_arcsec_per_day: f64,
36 pub lat_speed_arcsec_per_day: f64,
37 pub radial_speed_au_per_day: f64,
38}
39
40pub fn accuracy_ceiling(body: &CelestialBody) -> AccuracyCeiling {
58 match body_class(body) {
59 BodyClass::Luminary | BodyClass::InnerPlanet => AccuracyCeiling {
60 lon_arcsec: 1.0,
61 lat_arcsec: 1.0,
62 dist_km: 50.0,
63 lon_speed_arcsec_per_day: 0.5,
64 lat_speed_arcsec_per_day: 0.5,
65 radial_speed_au_per_day: 1.0e-4,
66 },
67 BodyClass::OuterPlanet => AccuracyCeiling {
68 lon_arcsec: 5.0,
69 lat_arcsec: 5.0,
70 dist_km: 1_000.0,
71 lon_speed_arcsec_per_day: 0.05,
72 lat_speed_arcsec_per_day: 0.05,
73 radial_speed_au_per_day: 1.0e-4,
74 },
75 BodyClass::Asteroid => AccuracyCeiling {
76 lon_arcsec: 30.0,
77 lat_arcsec: 30.0,
78 dist_km: 5_000_000.0,
79 lon_speed_arcsec_per_day: 120.0,
80 lat_speed_arcsec_per_day: 120.0,
81 radial_speed_au_per_day: 1.0e-2,
82 },
83 }
84}
85
86#[derive(Clone, Copy, Debug)]
87pub struct ArtifactBudgets {
88 pub max_encoded_bytes: usize,
89 pub decode_latency_target_ms: f64,
90 pub single_lookup_target_ms: f64,
91 pub batch_throughput_target_per_s: f64,
92 pub chart_workload_target_ms: f64,
93}
94
95pub const PACKAGED_BUDGETS: ArtifactBudgets = ArtifactBudgets {
96 max_encoded_bytes: 12_000_000, decode_latency_target_ms: 400.0, single_lookup_target_ms: 6.0, batch_throughput_target_per_s: 1_000.0,
100 chart_workload_target_ms: 50.0,
101};
102
103#[cfg(test)]
104mod tests {
105 use super::*;
106 use pleiades_backend::CelestialBody;
107
108 #[test]
109 fn classes_map_bodies_correctly() {
110 assert_eq!(body_class(&CelestialBody::Sun), BodyClass::Luminary);
111 assert_eq!(body_class(&CelestialBody::Moon), BodyClass::Luminary);
112 assert_eq!(body_class(&CelestialBody::Mercury), BodyClass::InnerPlanet);
113 assert_eq!(body_class(&CelestialBody::Pluto), BodyClass::OuterPlanet);
114 }
115
116 #[test]
117 fn outer_planets_have_looser_longitude_ceiling_than_inner() {
118 assert!(
119 accuracy_ceiling(&CelestialBody::Uranus).lon_arcsec
120 > accuracy_ceiling(&CelestialBody::Mercury).lon_arcsec
121 );
122 }
123
124 #[test]
125 fn size_budget_exceeds_current_artifact() {
126 let max_encoded_bytes = PACKAGED_BUDGETS.max_encoded_bytes;
130 assert!(max_encoded_bytes >= 10_000_000);
131 assert!(max_encoded_bytes <= 16_000_000);
132 }
133}