From 3839d6709fdf3abfc72d69fb07b8f0db43435fa2 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 29 Apr 2026 17:53:50 +0200 Subject: [PATCH 01/47] big change due to the integration of the photom crate --- Cargo.lock | 1391 +++++++------- Cargo.toml | 30 +- rust-toolchain.toml | 2 +- src/cache/mod.rs | 77 + src/cache/observer_centric_cache.rs | 188 ++ src/cache/observer_fixed_cache.rs | 62 + src/constants.rs | 228 +-- src/conversion.rs | 69 +- src/earth_orientation.rs | 13 +- src/env_state.rs | 127 -- src/error_models/data_models/cbm10.rules | 64 - src/error_models/data_models/fcct14.rules | 48 - src/error_models/data_models/vfcc17.rules | 100 -- src/error_models/mod.rs | 418 ----- src/error_models/vfcc17.rs | 96 - src/initial_orbit_determination/gauss.rs | 107 +- src/initial_orbit_determination/mod.rs | 6 + .../triplet_generation/index_generator.rs | 657 +++++++ .../triplet_generation/mod.rs} | 471 +++-- src/jpl_ephem/download_jpl_file.rs | 11 - src/jpl_ephem/horizon/horizon_data.rs | 58 +- src/jpl_ephem/mod.rs | 18 + src/jpl_ephem/naif/naif_data.rs | 27 +- src/lib.rs | 106 +- src/obs_dataset.rs | 113 ++ src/observation_ephemeris.rs | 954 ++++++++++ src/observations/display.rs | 912 ---------- src/observations/mod.rs | 1498 ---------------- src/observations/observations_ext.rs | 1245 ------------- src/observations/triplets_generator.rs | 323 ---- src/observer_extension.rs | 191 ++ src/observers/bimap.rs | 224 --- src/observers/mod.rs | 1140 ------------ src/observers/observatories.rs | 238 --- src/outfit.rs | 676 ------- src/outfit_errors.rs | 30 +- src/trajectories/ades_reader.rs | 257 --- src/trajectories/batch_reader.rs | 432 ----- src/trajectories/mod.rs | 121 -- src/trajectories/mpc_80col_reader.rs | 345 ---- src/trajectories/parquet_reader.rs | 362 ---- src/trajectories/progress_bar.rs | 115 -- src/trajectories/trajectory_file.rs | 513 ------ src/trajectories/trajectory_fit.rs | 1596 ----------------- src/trajectory.rs | 810 +++++++++ tests/outfit_struct_test.rs | 18 - tests/reader_80col_test.rs | 57 - tests/test_gauss_iod.rs | 98 +- tests/test_read_ades.rs | 56 - 49 files changed, 4330 insertions(+), 12368 deletions(-) create mode 100644 src/cache/mod.rs create mode 100644 src/cache/observer_centric_cache.rs create mode 100644 src/cache/observer_fixed_cache.rs delete mode 100644 src/env_state.rs delete mode 100644 src/error_models/data_models/cbm10.rules delete mode 100644 src/error_models/data_models/fcct14.rules delete mode 100644 src/error_models/data_models/vfcc17.rules delete mode 100644 src/error_models/mod.rs delete mode 100644 src/error_models/vfcc17.rs create mode 100644 src/initial_orbit_determination/triplet_generation/index_generator.rs rename src/{observations/triplets_iod.rs => initial_orbit_determination/triplet_generation/mod.rs} (54%) create mode 100644 src/obs_dataset.rs create mode 100644 src/observation_ephemeris.rs delete mode 100644 src/observations/display.rs delete mode 100644 src/observations/mod.rs delete mode 100644 src/observations/observations_ext.rs delete mode 100644 src/observations/triplets_generator.rs create mode 100644 src/observer_extension.rs delete mode 100644 src/observers/bimap.rs delete mode 100644 src/observers/mod.rs delete mode 100644 src/observers/observatories.rs delete mode 100644 src/outfit.rs delete mode 100644 src/trajectories/ades_reader.rs delete mode 100644 src/trajectories/batch_reader.rs delete mode 100644 src/trajectories/mod.rs delete mode 100644 src/trajectories/mpc_80col_reader.rs delete mode 100644 src/trajectories/parquet_reader.rs delete mode 100644 src/trajectories/progress_bar.rs delete mode 100644 src/trajectories/trajectory_file.rs delete mode 100644 src/trajectories/trajectory_fit.rs create mode 100644 src/trajectory.rs delete mode 100644 tests/outfit_struct_test.rs delete mode 100644 tests/reader_80col_test.rs delete mode 100644 tests/test_read_ades.rs diff --git a/Cargo.lock b/Cargo.lock index a841472..781cb90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,48 +15,42 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "const-random", - "getrandom 0.2.15", + "getrandom 0.3.4", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -74,9 +68,15 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "approx" @@ -105,7 +105,7 @@ dependencies = [ "arrow-schema", "chrono", "half", - "hashbrown", + "hashbrown 0.15.5", "num", ] @@ -202,15 +202,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -218,7 +218,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -250,15 +250,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytecount" @@ -268,9 +268,9 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" [[package]] name = "byteorder" @@ -280,15 +280,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "camino" -version = "1.1.9" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" [[package]] name = "cast" @@ -298,18 +298,19 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.17" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ + "find-msvc-tools", "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -319,11 +320,10 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ - "android-tzdata", "iana-time-zone", "num-traits", "windows-link", @@ -358,18 +358,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.34" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e958897981290da2a852763fe9cdb89cd36977a5d729023127095fa94d95e2ff" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.34" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b0f35019843db2160b5bb19ae09b4e6411ac33fc6a712003c33e03090e2489" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstyle", "clap_lex", @@ -377,15 +377,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "comfy-table" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" +checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" dependencies = [ "unicode-segmentation", "unicode-width", @@ -393,14 +393,13 @@ dependencies = [ [[package]] name = "console" -version = "0.16.0" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e09ced7ebbccb63b4c65413d821f2e00ce54c5ca4514ddc6b3c892fdbcbc69d" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" dependencies = [ "encode_unicode", "libc", - "once_cell", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -418,7 +417,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.17", "once_cell", "tiny-keccak", ] @@ -492,9 +491,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "directories" @@ -514,7 +513,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -548,19 +547,25 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "flatbuffers" @@ -579,55 +584,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -636,21 +632,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-core", "futures-io", @@ -659,48 +655,60 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "r-efi 5.3.0", + "wasip2", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "h2" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ "atomic-waker", "bytes", @@ -717,20 +725,30 @@ dependencies = [ [[package]] name = "half" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", "num-traits", + "zerocopy", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "heck" @@ -740,20 +758,19 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hifitime" -version = "4.2.0" +version = "4.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bcc71d459e299e045d3328cc4be250c80f2cf87a73c309d562e8afc52c88a23" +checksum = "22f1dfc1be6cd1c3a44704db0a8800aa53ebb07a9509535a0261cd387eedee7c" dependencies = [ "js-sys", "lexical-core", "num-traits", - "openssl", "serde", "serde_derive", "snafu", @@ -766,12 +783,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -812,13 +828,14 @@ checksum = "8595e3e777338ccc8360c4eb89924f8d7e55a5ff831d057e1c65892c220da28f" [[package]] name = "hyper" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", @@ -832,34 +849,36 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.2", + "webpki-roots", ] [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ + "base64", "bytes", "futures-channel", "futures-util", "http", "http-body", "hyper", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", "socket2", "tokio", @@ -869,9 +888,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -893,21 +912,23 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", + "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -916,104 +937,72 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", + "icu_locale_core", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] [[package]] -name = "icu_provider_macros" -version = "1.5.0" +name = "id-arena" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1022,9 +1011,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1032,24 +1021,25 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.17.0", + "serde", + "serde_core", ] [[package]] name = "indicatif" -version = "0.18.0" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cd" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" dependencies = [ "console", "portable-atomic", "unit-prefix", - "web-time", ] [[package]] @@ -1060,19 +1050,29 @@ checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" +dependencies = [ + "memchr", + "serde", +] [[package]] name = "is-terminal" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1095,31 +1095,33 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "lexical-core" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" dependencies = [ "lexical-parse-float", "lexical-parse-integer", @@ -1130,94 +1132,86 @@ dependencies = [ [[package]] name = "lexical-parse-float" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" dependencies = [ "lexical-parse-integer", "lexical-util", - "static_assertions", ] [[package]] name = "lexical-parse-integer" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" dependencies = [ "lexical-util", - "static_assertions", ] [[package]] name = "lexical-util" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a82e24bf537fd24c177ffbbdc6ebcc8d54732c35b50a3f28cc3f4e4c949a0b3" -dependencies = [ - "static_assertions", -] +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" [[package]] name = "lexical-write-float" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" dependencies = [ "lexical-util", "lexical-write-integer", - "static_assertions", ] [[package]] name = "lexical-write-integer" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" dependencies = [ "lexical-util", - "static_assertions", ] [[package]] name = "libc" -version = "0.2.171" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.9.0", "libc", ] [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "log" -version = "0.4.27" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lru-slab" @@ -1227,9 +1221,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "matrixmultiply" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -1237,41 +1231,35 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] name = "nalgebra" -version = "0.33.2" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +checksum = "9d43ddcacf343185dfd6de2ee786d9e8b1c2301622afab66b6c73baf9882abfd" dependencies = [ "approx", "matrixmultiply", @@ -1379,18 +1367,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "oorandom" @@ -1398,54 +1386,6 @@ version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags 2.9.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-src" -version = "300.5.2+3.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d270b79e2926f5150189d475bc7e9d2c69f9c4697b185fa917d5a32b792d21b4" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -1463,16 +1403,18 @@ dependencies = [ [[package]] name = "ordered-float" -version = "5.0.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2c1f9f56e534ac6a9b8a4600bdf0f530fb393b5f393e7b4d03489c3cf0c3f01" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ "num-traits", + "rand 0.8.6", + "serde", ] [[package]] name = "outfit" -version = "2.1.0" +version = "3.0.0" dependencies = [ "aberth", "ahash", @@ -1489,11 +1431,12 @@ dependencies = [ "nalgebra", "nom", "once_cell", - "ordered-float 5.0.0", + "ordered-float 5.3.0", "parquet", + "photom", "proptest", - "quick-xml", - "rand", + "quick-xml 0.37.5", + "rand 0.9.4", "rand_distr", "rayon", "reqwest", @@ -1535,7 +1478,7 @@ dependencies = [ "bytes", "chrono", "half", - "hashbrown", + "hashbrown 0.15.5", "num", "num-bigint", "paste", @@ -1553,27 +1496,32 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project-lite" -version = "0.2.16" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "pin-utils" +name = "photom" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +dependencies = [ + "ahash", + "camino", + "directories", + "hifitime", + "itertools 0.14.0", + "nom", + "ordered-float 5.3.0", + "quick-xml 0.39.2", + "serde", + "thiserror", + "ureq", +] [[package]] -name = "pkg-config" -version = "0.3.32" +name = "pin-project-lite" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "plotters" @@ -1605,9 +1553,18 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] [[package]] name = "ppv-lite86" @@ -1615,7 +1572,17 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.26", + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", ] [[package]] @@ -1642,25 +1609,24 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.7.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.9.0", - "lazy_static", + "bitflags 2.11.1", "num-traits", - "rand", + "rand 0.9.4", "rand_chacha", "rand_xorshift", "regex-syntax", @@ -1677,9 +1643,19 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quick-xml" -version = "0.37.4" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ce8c88de324ff838700f36fb6ab86c96df0e3c4ab6ef3a9b2044465cce1369" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" dependencies = [ "memchr", "serde", @@ -1707,14 +1683,14 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" dependencies = [ "bytes", - "getrandom 0.3.2", + "getrandom 0.3.4", "lru-slab", - "rand", + "rand 0.9.4", "ring", "rustc-hash", "rustls", @@ -1742,27 +1718,43 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.9.2" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha", - "rand_core", + "rand_core 0.9.5", ] [[package]] @@ -1772,16 +1764,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.5", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.3.2", + "serde", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", ] [[package]] @@ -1791,7 +1792,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand", + "rand 0.9.4", ] [[package]] @@ -1800,7 +1801,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core", + "rand_core 0.9.5", ] [[package]] @@ -1811,9 +1812,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -1831,20 +1832,20 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.17", "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -1854,9 +1855,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -1865,15 +1866,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64", "bytes", @@ -1886,16 +1887,12 @@ dependencies = [ "hyper", "hyper-rustls", "hyper-util", - "ipnet", "js-sys", "log", - "mime", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", @@ -1905,14 +1902,14 @@ dependencies = [ "tokio-rustls", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.8", - "windows-registry", + "webpki-roots", ] [[package]] @@ -1923,7 +1920,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -1937,15 +1934,15 @@ checksum = "082f11ffa03bbef6c2c6ea6bea1acafaade2fd9050ae0234ab44a2153742b058" [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -1958,22 +1955,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.25" +version = "0.23.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +checksum = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e" dependencies = [ "log", "once_cell", @@ -1984,29 +1981,21 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ "web-time", + "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -2015,15 +2004,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rusty-fork" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" dependencies = [ "fnv", "quick-error", @@ -2033,9 +2022,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "safe_arch" @@ -2057,9 +2046,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "seq-macro" @@ -2069,18 +2058,28 @@ checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2089,14 +2088,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", + "serde_core", + "zmij", ] [[package]] @@ -2119,9 +2119,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simba" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" dependencies = [ "approx", "num-complex", @@ -2132,24 +2132,21 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "snafu" -version = "0.8.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" +checksum = "d1d4bced6a69f90b2056c03dcff2c4737f98d6fb9e0853493996e1d253ca29c6" dependencies = [ "backtrace", "snafu-derive", @@ -2157,9 +2154,9 @@ dependencies = [ [[package]] name = "snafu-derive" -version = "0.8.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" +checksum = "54254b8531cafa275c5e096f62d48c81435d1015405a91198ddb11e967301d40" dependencies = [ "heck", "proc-macro2", @@ -2175,19 +2172,19 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.5.9" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -2203,9 +2200,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.100" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -2223,9 +2220,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -2258,15 +2255,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.19.1" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2280,18 +2277,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -2320,9 +2317,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -2340,9 +2337,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -2355,24 +2352,23 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.1" +version = "1.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" dependencies = [ - "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -2380,9 +2376,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -2391,9 +2387,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -2404,9 +2400,9 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -2417,6 +2413,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.1", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -2431,9 +2445,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-core", @@ -2441,9 +2455,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", ] @@ -2466,9 +2480,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.18.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "unarray" @@ -2478,27 +2492,33 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unit-prefix" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" [[package]] name = "untrusted" @@ -2508,26 +2528,25 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.0.10" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0351ca625c7b41a8e4f9bb6c5d9755f67f62c2187ebedecacd9974674b271d" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" dependencies = [ "base64", "log", "percent-encoding", "rustls", - "rustls-pemfile", "rustls-pki-types", "ureq-proto", - "utf-8", - "webpki-roots 0.26.8", + "utf8-zero", + "webpki-roots", ] [[package]] name = "ureq-proto" -version = "0.3.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae239d0a3341aebc94259414d1dc67cfce87d41cbebc816772c91b77902fafa4" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" dependencies = [ "base64", "http", @@ -2537,26 +2556,21 @@ dependencies = [ [[package]] name = "url" -version = "2.5.4" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" +name = "utf8-zero" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" [[package]] name = "utf8_iter" @@ -2564,12 +2578,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" @@ -2606,63 +2614,56 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen 0.57.1", ] [[package]] -name = "wasm-bindgen" -version = "0.2.100" +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", + "wit-bindgen 0.51.0", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" +name = "wasm-bindgen" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2670,26 +2671,48 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + [[package]] name = "wasm-streams" version = "0.4.2" @@ -2703,11 +2726,23 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" dependencies = [ "js-sys", "wasm-bindgen", @@ -2725,27 +2760,18 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webpki-roots" -version = "1.0.2" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" dependencies = [ "rustls-pki-types", ] [[package]] name = "wide" -version = "0.7.32" +version = "0.7.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" dependencies = [ "bytemuck", "safe_arch", @@ -2753,31 +2779,31 @@ dependencies = [ [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "windows-core" -version = "0.61.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", "windows-link", "windows-result", - "windows-strings 0.4.0", + "windows-strings", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -2786,9 +2812,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -2797,44 +2823,24 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-registry" -version = "0.4.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result", - "windows-strings 0.3.1", - "windows-targets 0.53.3", -] +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-result" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ "windows-link", ] @@ -2850,20 +2856,20 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.60.2" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-targets 0.53.3", + "windows-link", ] [[package]] @@ -2884,19 +2890,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -2907,9 +2913,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -2919,9 +2925,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -2931,9 +2937,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -2943,9 +2949,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -2955,9 +2961,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -2967,9 +2973,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -2979,9 +2985,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -2991,89 +2997,147 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" dependencies = [ - "bitflags 2.9.0", + "wit-bindgen-rust-macro", ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] -name = "writeable" -version = "0.5.5" +name = "wit-bindgen-core" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] [[package]] -name = "yoke" -version = "0.7.5" +name = "wit-bindgen-rust" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", ] [[package]] -name = "yoke-derive" -version = "0.7.5" +name = "wit-bindgen-rust-macro" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" dependencies = [ + "anyhow", + "prettyplease", "proc-macro2", "quote", "syn", - "synstructure", + "wit-bindgen-core", + "wit-bindgen-rust", ] [[package]] -name = "zerocopy" -version = "0.7.35" +name = "wit-component" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ - "zerocopy-derive 0.7.35", + "anyhow", + "bitflags 2.11.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", ] [[package]] -name = "zerocopy" -version = "0.8.26" +name = "wit-parser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ - "zerocopy-derive 0.8.26", + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", ] [[package]] -name = "zerocopy-derive" -version = "0.7.35" +name = "writeable" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -3082,18 +3146,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -3103,15 +3167,26 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -3120,11 +3195,17 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", "syn", ] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index a1867e8..150d3bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "outfit" -version = "2.1.0" +version = "3.0.0" edition = "2021" license-file = "LICENSE" -rust-version = "1.82" +rust-version = "1.94.0" description = "Orbit determination toolkit in Rust. Provides astrometric parsing, observer management, and initial orbit determination (Gauss method) with JPL ephemeris support." readme = "README.md" repository = "https://github.com/FusRoman/Outfit" @@ -20,6 +20,9 @@ categories = ["science", "parsing", "data-structures"] authors = ["Roman Le Montagner "] [dependencies] + +photom = { version = "0.1.0", path = "../photom" } + aberth = { version = "0.4.1", default-features = false } ahash = { version = "0.8.11", default-features = false } arrow-array = { version = "54.3.1", default-features = false } @@ -54,18 +57,18 @@ rand = { version = "0.9.2", default-features = false, features = [ ] } rand_distr = { version = "0.5.1", default-features = false } -reqwest = { version = "0.12.15", default-features = false, optional = true, features = [ +reqwest = { version = "0.12.15", default-features = false, features = [ "http2", "rustls-tls", "stream", ] } -tokio = { version = "1.44.1", default-features = false, optional = true, features = [ +tokio = { version = "1.44.1", default-features = false, features = [ "fs", "rt", "rt-multi-thread", "io-util", ] } -tokio-stream = { version = "0.1.17", default-features = false, optional = true } +tokio-stream = { version = "0.1.17", default-features = false } indicatif = { version = "0.18", optional = true, default-features = false } rayon = { version = "1.11.0", optional = true, default-features = false } comfy-table = { version = "7.1.4", default-features = false } @@ -76,21 +79,12 @@ criterion = { version = "0.5.1", features = ["html_reports"] } husky-rs = "0.1.5" proptest = "1.7.0" +photom = { version = "0.1.0", path = "../photom", features = ["mpc_80_col", "ades"] } + [features] -jpl-download = ["dep:reqwest", "dep:tokio", "dep:tokio-stream"] progress = ["dep:indicatif"] parallel = ["dep:rayon"] -[[test]] -name = "reader_80col_test" -path = "tests/reader_80col_test.rs" -required-features = ["jpl-download"] - -[[test]] -name = "test_read_ades" -path = "tests/test_read_ades.rs" -required-features = ["jpl-download"] - [[test]] name = "test_large_parquet" path = "tests/trajectories_from_parquet.rs" @@ -142,7 +136,3 @@ debug = false lto = "fat" codegen-units = 1 strip = true - -[package.metadata.docs.rs] -features = ["jpl-download"] -rustdoc-args = ["--cfg", "docsrs"] diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 7855e6d..0d8ed42 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.88.0" +channel = "1.94.0" components = ["rustfmt", "clippy"] diff --git a/src/cache/mod.rs b/src/cache/mod.rs new file mode 100644 index 0000000..345c720 --- /dev/null +++ b/src/cache/mod.rs @@ -0,0 +1,77 @@ +pub mod observer_centric_cache; +pub mod observer_fixed_cache; + +use hifitime::ut1::Ut1Provider; +use photom::{observation_dataset::ObsDataset, observer::dataset::ObserverId, ObsIndex}; + +use crate::{ + cache::{ + observer_centric_cache::{ + build_centric_observer_cache, CentricObserverCache, ObserverCentricCache, + ObserverGeocentricPosition, ObserverGeocentricVelocity, ObserverHeliocentricPosition, + }, + observer_fixed_cache::{ + build_fixed_observer_cache, BodyFixedObserverCache, ObserverFixedCache, + }, + }, + JPLEphem, OutfitError, +}; + +/// Precomputed observer positions for all observations in a dataset. +/// +/// Built once before any trajectory fitting. Each entry is keyed by the +/// observation's [`ObsIndex`], which is stable for the lifetime of the +/// [`ObsDataset`]. +pub struct OutfitCache { + /// len == number of observations in the dataset. Indexed by [`ObsIndex`]. + observer_centric: CentricObserverCache, + /// len == number of observer in the dataset. Indexed by observer ID. + observer_fixed: BodyFixedObserverCache, +} + +impl OutfitCache { + pub fn get_centric(&self, idx: ObsIndex) -> &ObserverCentricCache { + &self.observer_centric[idx] + } + + pub fn get_fixed(&self, observer_id: ObserverId) -> Option<&ObserverFixedCache> { + self.observer_fixed.get(&observer_id) + } + + /// Build the cache for every observation in `obs_dataset`. + pub fn build( + obs_dataset: &ObsDataset, + jpl: &JPLEphem, + ut1_provider: &Ut1Provider, + ) -> Result { + let observer_iter = obs_dataset.iter_observer()?; + + let observer_fixed_cache = build_fixed_observer_cache(observer_iter)?; + + let observer_centric_cache = + build_centric_observer_cache(jpl, ut1_provider, obs_dataset, &observer_fixed_cache)?; + + Ok(Self { + observer_centric: observer_centric_cache, + observer_fixed: observer_fixed_cache, + }) + } + + pub fn get_observer_fixed_cache(&self, observer_id: ObserverId) -> Option<&ObserverFixedCache> { + self.observer_fixed.get(&observer_id) + } + + /// Accessor for the precomputed geocentric position of an observer. + pub fn get_observer_geocentric_position(&self, idx: ObsIndex) -> &ObserverGeocentricPosition { + &self.get_centric(idx).geo_position + } + + pub fn get_observer_geocentric_velocity(&self, idx: ObsIndex) -> &ObserverGeocentricVelocity { + &self.get_centric(idx).geo_velocity + } + + /// Accessor for the precomputed heliocentric position of an observer. + pub fn get_helio_position(&self, idx: ObsIndex) -> &ObserverHeliocentricPosition { + &self.get_centric(idx).helio_position + } +} diff --git a/src/cache/observer_centric_cache.rs b/src/cache/observer_centric_cache.rs new file mode 100644 index 0000000..aa48a9a --- /dev/null +++ b/src/cache/observer_centric_cache.rs @@ -0,0 +1,188 @@ +use hifitime::{ut1::Ut1Provider, Epoch}; +use nalgebra::Vector3; +use ordered_float::NotNan; +use photom::{observation_dataset::ObsDataset, observer::Observer, MJDTT}; + +use crate::{ + cache::observer_fixed_cache::{BodyFixedObserverCache, ObserverFixedCache}, + observer_extension::ResolvedObserver, + JPLEphem, OutfitError, +}; + +/// Geocentric position of the observer at `time` of an observation (AU, ecliptic mean J2000). +pub type ObserverGeocentricPosition = Vector3>; +/// Geocentric velocity of the observer at `time` of an observation (AU/day, ecliptic mean J2000). +pub type ObserverGeocentricVelocity = Vector3>; +/// Heliocentric position of the observer at `time` of an observation (AU, ecliptic mean J2000). +pub type ObserverHeliocentricPosition = Vector3>; + +/// Geocentric and heliocentric observer positions for a single observation epoch. +pub struct ObserverCentricCache { + pub geo_position: ObserverGeocentricPosition, + pub geo_velocity: ObserverGeocentricVelocity, + pub helio_position: ObserverHeliocentricPosition, +} + +impl ObserverCentricCache { + pub fn new( + jpl: &JPLEphem, + ut1_provider: &Ut1Provider, + obs_time: MJDTT, + observer_fixed_cache: &ObserverFixedCache, + ) -> Result { + let obs_mjd = Epoch::from_mjd_in_time_scale(obs_time, hifitime::TimeScale::TT); + let (geocentric_pos, geocentric_vel) = + Observer::pvobs(&obs_mjd, ut1_provider, observer_fixed_cache)?; + + let heliocentric_pos = Observer::helio_position(jpl, &obs_mjd, &geocentric_pos)?; + + Ok(Self { + geo_position: geocentric_pos, + geo_velocity: geocentric_vel, + helio_position: heliocentric_pos, + }) + } +} + +pub type CentricObserverCache = Vec; + +pub fn build_centric_observer_cache( + jpl: &JPLEphem, + ut1_provider: &Ut1Provider, + obs_dataset: &ObsDataset, + observer_fixed_cache: &BodyFixedObserverCache, +) -> Result { + obs_dataset + .iter_observations() + .enumerate() + .map(|(idx, obs)| { + let observer_id = obs + .observer_id() + .ok_or_else(|| return OutfitError::ObserverIdIsNone(idx as u64))?; + + let fixed_cache = observer_fixed_cache + .get(&observer_id) + .ok_or_else(|| return OutfitError::ObserverIdIsNone(idx as u64))?; + + ObserverCentricCache::new(jpl, ut1_provider, obs.mjd_tt(), fixed_cache) + }) + .collect() +} + +#[cfg(test)] +mod observer_test { + + use photom::{Meters, Radians}; + + use crate::{ + cache::observer_centric_cache::ObserverCentricCache, + test_fixture::{JPL_EPHEM_HORIZON, UT1_PROVIDER}, + }; + + use super::*; + + fn to_observer( + longitude: Radians, + latitude: Radians, + height: Meters, + name: Option, + ra_accuracy: Option, + dec_accuracy: Option, + ) -> Observer { + let observer = Observer::new(longitude, latitude, height, name, ra_accuracy, dec_accuracy) + .expect("Failed to create Observer"); + observer + } + + #[test] + fn body_fixed_coord_test() { + // longitude, latitude and height of Pan-STARRS 1, Haleakala + let (lon, lat, h) = ( + 203.744090000_f64.to_radians(), + 20.707233557_f64.to_radians(), + 3067.694, + ); + let pan_starrs = to_observer(lon, lat, h, None, None, None); + assert_eq!( + pan_starrs + .earth_fixed_position() + .unwrap() + .map(|x| x.into_inner()), + Vector3::new( + -0.00003653799439776371, + -0.00001607260397528885, + 0.000014988110430544328 + ) + ); + } + + #[test] + fn pvobs_test() { + let tmjd = 57028.479297592596; + let epoch = Epoch::from_mjd_in_time_scale(tmjd, hifitime::TimeScale::TT); + // longitude, latitude and height of Pan-STARRS 1, Haleakala + let (lon, lat, h) = ( + 203.744090000_f64.to_radians(), + 20.707233557_f64.to_radians(), + 3067.694, + ); + + let pan_starrs = to_observer(lon, lat, h, Some("Pan-STARRS 1".to_string()), None, None); + + let observer_fixed_cache: ObserverFixedCache = (&pan_starrs).try_into().unwrap(); + + let (observer_position, observer_velocity) = + Observer::pvobs(&epoch, &UT1_PROVIDER, &observer_fixed_cache).unwrap(); + + assert_eq!( + observer_position.as_slice(), + [ + -2.086211182493635e-5, + 3.718476815327979e-5, + 2.4978996447997476e-7 + ] + ); + assert_eq!( + observer_velocity.as_slice(), + [ + -0.0002143246535691577, + -0.00012059801691431748, + 5.262184624215718e-5 + ] + ); + } + + #[test] + fn test_helio_pos_obs() { + let (lon, lat, h) = (203.744090000, 20.707233557, 3067.694); + let pan_starrs = to_observer(lon, lat, h, Some("Pan-STARRS 1".to_string()), None, None); + let observer_fixed_cache: ObserverFixedCache = (&pan_starrs).try_into().unwrap(); + + let cases = [ + ( + 57_028.479_297_592_596, + [-0.2645666171464416, 0.8689351643701766, 0.3766996211107864], + ), + ( + 57_049.245_147_592_59, + [-0.5891631852137064, 0.7238872516824697, 0.3138186516540669], + ), + ( + 57_063.977_117_592_59, + [-0.7743280306286537, 0.5612532665812755, 0.24333415479994636], + ), + ]; + + for (tmjd, expected) in cases { + let obs = ObserverCentricCache::new( + &JPL_EPHEM_HORIZON, + &UT1_PROVIDER, + tmjd, + &observer_fixed_cache, + ) + .unwrap(); + + assert_eq!(obs.helio_position.as_slice(), expected, "tmjd = {tmjd}"); + } + } +} diff --git a/src/cache/observer_fixed_cache.rs b/src/cache/observer_fixed_cache.rs new file mode 100644 index 0000000..09b1664 --- /dev/null +++ b/src/cache/observer_fixed_cache.rs @@ -0,0 +1,62 @@ +use ahash::AHashMap; +use nalgebra::Vector3; +use ordered_float::NotNan; +use photom::observer::{dataset::ObserverId, Observer}; + +use crate::{ + constants::EARTH_ROTATION, conversion::ToNotNan, observer_extension::ResolvedObserver, + OutfitError, +}; + +/// Precomputed **body-fixed** position of the observer in **AU**. +pub type ObserverFixedPosition = Vector3>; +/// Precomputed **body-fixed** velocity of the observer in **AU/day**. +pub type ObserverFixedVelocity = Vector3>; + +pub struct ObserverFixedCache { + observer_fixed_positions: ObserverFixedPosition, + observer_fixed_velocities: ObserverFixedVelocity, +} + +impl ObserverFixedCache { + pub fn new(observer: &Observer) -> Result { + // Body-fixed position in AU from (ρ·cosφ, ρ·sinφ) scaled by Earth radius (AU). + let body_fixed_pos = observer.earth_fixed_position()?; + + // Body-fixed velocity from Earth rotation. + let body_fixed_vel: Vector3> = + EARTH_ROTATION.to_notnan()?.cross(&body_fixed_pos); + + Ok(Self { + observer_fixed_positions: body_fixed_pos, + observer_fixed_velocities: body_fixed_vel, + }) + } + + pub fn position(&self) -> &ObserverFixedPosition { + &self.observer_fixed_positions + } + + pub fn velocity(&self) -> &ObserverFixedVelocity { + &self.observer_fixed_velocities + } +} + +impl TryFrom<&Observer> for ObserverFixedCache { + type Error = OutfitError; + + fn try_from(resolved: &Observer) -> Result { + Self::new(resolved) + } +} + +/// Cache mapping observer IDs to their precomputed body-fixed positions and velocities. +pub type BodyFixedObserverCache = AHashMap; + +pub fn build_fixed_observer_cache<'a>( + observers: impl Iterator, +) -> Result { + observers + .map(|(id, obs)| -> Result<_, OutfitError> { Ok((id, obs.try_into()?)) }) + .collect::>() +} diff --git a/src/constants.rs b/src/constants.rs index 2b121d5..1e81aff 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -15,18 +15,12 @@ //! These definitions are used by all main modules, including orbit determination, observers, //! and ephemerides. -use crate::observations::Observation; -use crate::observers::Observer; -use smallvec::SmallVec; -use std::borrow::Cow; -use std::collections::HashMap; -use std::convert::TryFrom; -use std::sync::Arc; - // ------------------------------------------------------------------------------------------------- // Physical constants and unit conversions // ------------------------------------------------------------------------------------------------- +use nalgebra::{Matrix3, Vector3}; + /// 2π, useful for trigonometric conversions pub const DPI: f64 = 2. * std::f64::consts::PI; @@ -78,189 +72,39 @@ pub const VLIGHT: f64 = 2.99792458e5; /// Speed of light in astronomical units per day pub const VLIGHT_AU: f64 = VLIGHT / AU * SECONDS_PER_DAY; -// ------------------------------------------------------------------------------------------------- -// Type aliases -// ------------------------------------------------------------------------------------------------- - -/// Angle in degrees -pub type Degree = f64; -/// Angle in arcseconds -pub type ArcSec = f64; -/// Angle in radians -pub type Radian = f64; -/// Distance in kilometers -pub type Kilometer = f64; -/// Distance in meters -pub type Meter = f64; -/// MPC code identifying an observatory (3 characters) -pub type MpcCode = String; - -/// Lookup table from MPC code to [`Observer`] metadata -pub type MpcCodeObs = HashMap>; - -/// Modified Julian Date (days) -pub type MJD = f64; - -// ------------------------------------------------------------------------------------------------- -// Identifiers and data containers -// ------------------------------------------------------------------------------------------------- +// Angular velocity of Earth rotation (rad/day) on the z-axis. +pub const EARTH_ROTATION: Vector3 = Vector3::new(0.0, 0.0, DPI * 1.00273790934); -/// Identifier of a solar system object. +/// Rotation matrix from mean equatorial J2000 to mean ecliptic J2000. /// -/// This can be: -/// - An asteroid number (e.g. `Int(1234)`) -/// - A comet number (e.g. `"1234P"`) -/// - A provisional designation (e.g. `"K25D50B"`) -#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub enum ObjectNumber { - /// Integer-based MPC designation (e.g. 1, 433…) - Int(u32), - /// String-based designation (provisional, comet, etc.) - String(String), -} - -impl std::fmt::Display for ObjectNumber { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - ObjectNumber::Int(n) => write!(f, "{n}"), - ObjectNumber::String(s) => write!(f, "{s}"), - } - } -} - -// --- Infallible conversions (enable `.into()` directly) ---------------------- - -impl From for ObjectNumber { - #[inline] - fn from(n: u32) -> Self { - ObjectNumber::Int(n) - } -} - -impl From for ObjectNumber { - #[inline] - fn from(n: u16) -> Self { - ObjectNumber::Int(n as u32) - } -} - -impl From for ObjectNumber { - #[inline] - fn from(n: u8) -> Self { - ObjectNumber::Int(n as u32) - } -} - -impl From<&u32> for ObjectNumber { - /// Convenience to allow `(&n).into()` without dereferencing at call sites. - #[inline] - fn from(n: &u32) -> Self { - ObjectNumber::Int(*n) - } -} - -impl From for ObjectNumber { - #[inline] - fn from(s: String) -> Self { - ObjectNumber::String(s) - } -} - -impl From<&String> for ObjectNumber { - /// Clones the string to build a `String`-backed identifier. - #[inline] - fn from(s: &String) -> Self { - ObjectNumber::String(s.clone()) - } -} - -impl From<&str> for ObjectNumber { - /// Note: this **does not** parse numeric strings into `Int`. Use `FromStr` if you want - /// `"1234"` to become `ObjectNumber::Int(1234)`. - #[inline] - fn from(s: &str) -> Self { - ObjectNumber::String(s.to_string()) - } -} - -impl<'a> From> for ObjectNumber { - /// Accept both borrowed and owned `Cow`. - #[inline] - fn from(c: Cow<'a, str>) -> Self { - match c { - Cow::Borrowed(s) => ObjectNumber::String(s.to_string()), - Cow::Owned(s) => ObjectNumber::String(s), - } - } -} - -// --- Fallible conversions (use `.try_into()` to be overflow-safe) ------------ - -impl TryFrom for ObjectNumber { - type Error = std::num::TryFromIntError; - - /// Convert a `usize` into `Int(u32)` if it fits. - #[inline] - fn try_from(n: usize) -> Result { - Ok(ObjectNumber::Int(u32::try_from(n)?)) - } -} - -impl TryFrom for ObjectNumber { - type Error = std::num::TryFromIntError; - - /// Convert a `u64` into `Int(u32)` if it fits. - #[inline] - fn try_from(n: u64) -> Result { - Ok(ObjectNumber::Int(u32::try_from(n)?)) - } -} - -impl TryFrom for ObjectNumber { - type Error = &'static str; - - /// Convert a non-negative `i64` into `Int(u32)` if it fits. - #[inline] - fn try_from(n: i64) -> Result { - if n < 0 { - return Err("negative value is not a valid ObjectNumber::Int"); - } - let n = u64::try_from(n).map_err(|_| "conversion failed")?; - let n = u32::try_from(n).map_err(|_| "value exceeds u32 range")?; - Ok(ObjectNumber::Int(n)) - } -} - -// --- Smart parsing from &str via `FromStr` (optional) ------------------------ - -impl std::str::FromStr for ObjectNumber { - type Err = std::num::ParseIntError; - - /// Try to parse an `ObjectNumber` from a string. - /// - /// Rules - /// ----- - /// - Pure digits that fit in `u32` → `Int(u32)`. - /// - Otherwise → `String(String)`. - /// - /// Note - /// ---- - /// If the string is *only* digits but **does not** fit in `u32`, this returns the - /// original `ParseIntError`. If you prefer to always fallback to `String` on - /// overflow, we can change the policy (but it’s usually better to fail loudly). - fn from_str(s: &str) -> Result { - match s.parse::() { - Ok(n) => Ok(ObjectNumber::Int(n)), - Err(e) => { - if s.chars().any(|c| !c.is_ascii_digit()) { - Ok(ObjectNumber::String(s.to_string())) - } else { - Err(e) - } - } - } - } -} - -/// A small, inline-optimized container for observations of a single object. -pub type Observations = SmallVec<[Observation; 6]>; +/// Rotation of $-\varepsilon$ around the X-axis, where $\varepsilon$ is the +/// obliquity of the ecliptic at J2000. +pub const ROT_EQUMJ2000_TO_ECLMJ2000: Matrix3 = Matrix3::new( + 1.00000000000000000e0, + 0.00000000000000000e0, + 0.00000000000000000e0, + 0.00000000000000000e0, + 9.17482062069181814e-1, + -3.97777155931913706e-1, + 0.00000000000000000e0, + 3.97777155931913706e-1, + 9.17482062069181814e-1, +); + +/// Rotation matrix from mean ecliptic J2000 to mean equatorial J2000. +/// +/// Transpose (inverse) of [`ROT_EQUMJ2000_TO_ECLMJ2000`]. +pub const ROT_ECLMJ2000_TO_EQUMJ2000: Matrix3 = Matrix3::new( + 1.00000000000000000e0, + 0.00000000000000000e0, + 0.00000000000000000e0, + 0.00000000000000000e0, + 9.17482062069181814e-1, + 3.97777155931913706e-1, + 0.00000000000000000e0, + -3.97777155931913706e-1, + 9.17482062069181814e-1, +); + +/// Modified Julian Date (Scale Ephemeris Time, ET) +pub type MJDET = f64; diff --git a/src/conversion.rs b/src/conversion.rs index 25a19c4..dc20ac5 100644 --- a/src/conversion.rs +++ b/src/conversion.rs @@ -83,9 +83,11 @@ //! - MPC/ADES ingestion modules where these utilities are typically used. use std::f64::consts::TAU; -use nalgebra::Vector3; +use nalgebra::{Matrix3, Vector3}; +use ordered_float::{FloatIsNan, NotNan}; +use photom::{coordinates::cartesian::CartesianCoord, Arcseconds, Degrees, Radians}; -use crate::constants::{ArcSec, Degree, Radian, DPI}; +use crate::constants::DPI; /// Estimate the accuracy of a numeric string based on its decimal precision. /// @@ -118,7 +120,7 @@ fn compute_accuracy(field: &str, factor: f64) -> Option { /// ---------- /// * Angle in **radians** (`Radian`). #[inline] -pub fn arcsec_to_rad(arcsec: ArcSec) -> Radian { +pub fn arcsec_to_rad(arcsec: Arcseconds) -> Radians { (arcsec / 3600.0).to_radians() } @@ -153,7 +155,7 @@ pub fn arcsec_to_rad(arcsec: ArcSec) -> Radian { /// /// # See also /// * [`parse_dec_to_deg`] – Parses declination strings into degrees. -pub fn parse_ra_to_deg(ra: &str) -> Option<(Degree, ArcSec)> { +pub fn parse_ra_to_deg(ra: &str) -> Option<(Degrees, Arcseconds)> { let parts: Vec<&str> = ra.split_whitespace().collect(); if parts.len() != 3 { return None; @@ -200,7 +202,7 @@ pub fn parse_ra_to_deg(ra: &str) -> Option<(Degree, ArcSec)> { /// /// # See also /// * [`parse_ra_to_deg`] – Parses right ascension strings into degrees. -pub fn parse_dec_to_deg(dec: &str) -> Option<(Degree, ArcSec)> { +pub fn parse_dec_to_deg(dec: &str) -> Option<(Degrees, Arcseconds)> { let parts: Vec<&str> = dec.split_whitespace().collect(); if parts.len() != 3 { return None; @@ -445,6 +447,63 @@ pub fn cartesian_to_radec(cartesian_position: Vector3) -> (f64, f64, f64) { (alpha, delta, pos_norm) } +pub trait ToNotNan { + type Output; + fn to_notnan(self) -> Result; +} + +impl ToNotNan for f64 { + type Output = NotNan; + fn to_notnan(self) -> Result { + NotNan::new(self) + } +} + +impl ToNotNan for Vector3 { + type Output = Vector3>; + fn to_notnan(self) -> Result { + Ok(Vector3::new( + self.x.to_notnan()?, + self.y.to_notnan()?, + self.z.to_notnan()?, + )) + } +} + +impl ToNotNan for Matrix3 { + type Output = Matrix3>; + fn to_notnan(self) -> Result { + Ok(Matrix3::new( + self[(0, 0)].to_notnan()?, + self[(0, 1)].to_notnan()?, + self[(0, 2)].to_notnan()?, + self[(1, 0)].to_notnan()?, + self[(1, 1)].to_notnan()?, + self[(1, 2)].to_notnan()?, + self[(2, 0)].to_notnan()?, + self[(2, 1)].to_notnan()?, + self[(2, 2)].to_notnan()?, + )) + } +} + +/// Convert a Cartesian position vector to a `CartesianCoord`. +/// +/// # Arguments +/// +/// - `vec`: A 3D vector representing the Cartesian coordinates (x, y, z). +/// +/// # Returns +/// +/// - A `CartesianCoord` struct with fields `x`, `y`, and `z` populated from the input vector. +pub fn cartesion_from_vec(vec: Vector3) -> CartesianCoord { + CartesianCoord { + x: vec[0], + y: vec[1], + z: vec[2], + } +} + #[cfg(test)] mod observations_test { use super::*; diff --git a/src/earth_orientation.rs b/src/earth_orientation.rs index cef0bbc..a674ee4 100644 --- a/src/earth_orientation.rs +++ b/src/earth_orientation.rs @@ -74,9 +74,10 @@ //! - [`crate::ref_system`] for frame transformations that use these models. //! - **Theory of Orbit Determination** by Milani & Gronchi (2010). use nalgebra::Matrix3; +use photom::{Arcseconds, Radians, MJDTT}; use crate::{ - constants::{ArcSec, Radian, RADEG, RADSEC, T2000}, + constants::{RADEG, RADSEC, T2000}, ref_system::rotmt, }; @@ -115,7 +116,7 @@ use crate::{ /// # See also /// * [`rotmt`] – constructs rotation matrices using this obliquity /// * [`rotpn`](crate::ref_system::rotpn) – applies obliquity rotation when transforming between ecliptic and equatorial frames -pub fn obleq(tjm: f64) -> Radian { +pub fn obleq(tjm: MJDTT) -> Radians { // Obliquity coefficients let ob0 = ((23.0 * 3600.0 + 26.0 * 60.0) + 21.448) * RADSEC; let ob1 = -46.815 * RADSEC; @@ -166,7 +167,7 @@ pub fn obleq(tjm: f64) -> Radian { /// * [`rnut80`] – uses these angles to build the nutation rotation matrix /// * [`rotpn`](crate::ref_system::rotpn) – applies nutation when transforming between Equt and Equm systems #[inline(always)] -pub fn nutn80(tjm: f64) -> (ArcSec, ArcSec) { +pub fn nutn80(tjm: MJDTT) -> (Arcseconds, Arcseconds) { // ---- time powers (Julian centuries from J2000) let t = (tjm - T2000) / 36525.0; let t2 = t * t; @@ -455,7 +456,7 @@ pub fn nutn80(tjm: f64) -> (ArcSec, ArcSec) { /// * [`obleq`] – computes the mean obliquity ε (radians) /// * [`rotmt`] – builds the individual axis rotation matrices /// * [`rotpn`](crate::ref_system::rotpn) – uses `rnut80` to transform between Equm and Equt systems -pub fn rnut80(tjm: f64) -> Matrix3 { +pub fn rnut80(tjm: MJDTT) -> Matrix3 { // Mean obliquity of the ecliptic at date (ε) let epsm = obleq(tjm); @@ -504,7 +505,7 @@ pub fn rnut80(tjm: f64) -> Matrix3 { /// # See also /// * [`obleq`] – Computes the mean obliquity of the ecliptic. /// * [`nutn80`] – Computes the 1980 IAU nutation model (Δψ and Δε). -pub fn equequ(tjm: f64) -> f64 { +pub fn equequ(tjm: MJDTT) -> Radians { // Compute the mean obliquity of the ecliptic (ε, in radians) let oblm = obleq(tjm); @@ -557,7 +558,7 @@ pub fn equequ(tjm: f64) -> f64 { /// # See also /// * [`rotmt`] – constructs the rotation matrices used here /// * [`rotpn`](crate::ref_system::rotpn) – uses `prec` when converting between epochs `"OFDATE"` and `"J2000"` -pub fn prec(tjm: f64) -> Matrix3 { +pub fn prec(tjm: MJDTT) -> Matrix3 { // Precession polynomial coefficients (in radians) let zed = 0.6406161 * RADEG; let zd = 0.6406161 * RADEG; diff --git a/src/env_state.rs b/src/env_state.rs deleted file mode 100644 index 67bb706..0000000 --- a/src/env_state.rs +++ /dev/null @@ -1,127 +0,0 @@ -//! # Outfit environment state -//! -//! This module defines [`crate::env_state::OutfitEnv`], the **shared environment object** used across -//! the `Outfit` library. It provides access to: -//! -//! - A persistent **HTTP client** (for downloading ephemerides, observatory lists, etc.). -//! - A **UT1 provider** from [hifitime](https://docs.rs/hifitime) to handle Earth rotation -//! parameters from JPL. -//! -//! This object is designed to be **cheaply cloneable** and passed to algorithms -//! that require access to external data sources or Earth orientation models. -//! -//! ## Overview -//! -//! The main responsibilities of `OutfitEnv` are: -//! -//! 1. Manage a global [`ureq::Agent`] HTTP client with sensible default settings. -//! 2. Download and initialize an [`hifitime::ut1::Ut1Provider`] from JPL’s `latest_eop2.long` file -//! (Earth orientation parameters) at startup. -//! 3. Provide simple utilities for performing HTTP GET requests. -//! -//! ## Structure -//! -//! ```text -//! OutfitEnv -//! ├── http_client (ureq::Agent) -//! └── ut1_provider (hifitime::Ut1Provider) -//! ``` -//! -//! ## Usage -//! -//! ```rust,ignore -//! use outfit::env_state::OutfitEnv; -//! -//! // Create a new environment (downloads UT1 data from JPL) -//! let env = OutfitEnv::new(); -//! -//! // Access the UT1 provider -//! let ut1 = &env.ut1_provider; -//! -//! // Make a GET request using the built-in HTTP client -//! let response = env.get_from_url("https://ssd.jpl.nasa.gov/api/horizons.api"); -//! println!("Response: {}", &response[..100.min(response.len())]); -//! ``` -//! -//! ## Notes -//! -//! - The [`crate::env_state::OutfitEnv`] struct is meant to be reused and shared between different -//! parts of the crate to avoid redundant downloads and HTTP session creation. -//! - The UT1 provider is initialized once at startup; if fresh data is needed, -//! the library must be restarted or the provider re-downloaded manually. -//! -//! ## See also -//! -//! - [`hifitime::ut1::Ut1Provider`] – Manages Earth orientation and UT1 corrections. -//! - [`ureq::Agent`] – Minimal HTTP client used internally. -use hifitime::ut1::Ut1Provider; -use std::convert::TryFrom; -use std::{fmt::Debug, time::Duration}; -use ureq::{ - http::{self, Uri}, - Agent, -}; - -/// This object is passed to the various functions in the library -/// to provide access to the state of the library -/// -/// # Fields -/// -/// * `http_client` - A reqwest client used to make HTTP requests -/// * `ut1_provider` - A provider used to get the current UT1 time -/// * `observatories` - A lazy map of observatories from the Minor Planet Center. -/// The key is the MPC code and the value is the observer -#[derive(Debug, Clone)] -pub struct OutfitEnv { - pub http_client: Agent, - pub ut1_provider: Ut1Provider, -} - -impl Default for OutfitEnv { - fn default() -> Self { - Self::new() - } -} - -impl OutfitEnv { - /// Create a new Outfit object - /// - /// Return - /// ------ - /// * A new Outfit object - /// - The UT1 provider is downloaded from the JPL - /// - The HTTP client is created with default settings - /// - The observatories are lazily loaded from the Minor Planet Center - pub fn new() -> Self { - let ut1_provider = OutfitEnv::initialize_ut1_provider(); - - let config = Agent::config_builder() - .timeout_global(Some(Duration::from_secs(10))) - .build(); - let agent: Agent = config.into(); - - OutfitEnv { - http_client: agent, - ut1_provider, - } - } - - fn initialize_ut1_provider() -> Ut1Provider { - Ut1Provider::download_from_jpl("latest_eop2.long") - .expect("Download of the JPL short time scale UT1 data failed") - } - - pub(crate) fn get_from_url(&self, url: U) -> String - where - Uri: TryFrom, - >::Error: Into, - { - self.http_client - .get(url) - .call() - .expect("Get request failed") - .body_mut() - .read_to_string() - .expect("Failed to read response body") - } -} diff --git a/src/error_models/data_models/cbm10.rules b/src/error_models/data_models/cbm10.rules deleted file mode 100644 index 5942367..0000000 --- a/src/error_models/data_models/cbm10.rules +++ /dev/null @@ -1,64 +0,0 @@ -! obscods catal rms(acosd) rmsd (arcsec) -699:c @ 0.93, 0.78 -608:c @ 1.26, 1.53 -644:c @ 0.47, 0.56 -106:c @ 1.02, 0.79 -D29:c @ 0.66, 0.59 -689:c @ 0.51, 0.63 -ALL:cc @ 1.02, 0.79 -ALL:cd @ 1.02, 0.79 -ALL:ce @ 0.66, 0.59 -ALL:cq @ 0.66, 0.59 -ALL:cr @ 0.66, 0.59 -ALL:ct @ 0.66, 0.59 -ALL:cu @ 0.66, 0.59 -ALL:co @ 0.99, 0.81 -ALL:cs @ 0.99, 0.81 -ALL:ca @ 1.17, 1.02 -ALL:cb @ 1.17, 1.02 -ALL:ch @ 0.90, 0.88 -ALL:ci @ 0.90, 0.88 -ALL:cj @ 0.90, 0.88 -ALL:cz @ 0.90, 0.88 -ALL:cm @ 1.11, 1.13 -ALL:cw @ 0.88, 0.71 -ALL:cf @ 1.45, 1.27 -ALL:cg @ 1.45, 1.27 -ALL:cL @ 0.50, 0.50 -704:cc @ 1.23, 1.19 -699:cc @ 0.93, 0.78 -691:cc @ 0.63, 0.68 -608:cc @ 1.26, 1.53 -703:cc @ 1.23, 1.13 -644:cc @ 0.47, 0.56 -703:ce @ 0.97, 0.91 -G96:ce @ 0.50, 0.42 -E12:ce @ 0.82, 0.85 -683:ce @ 1.21, 1.55 -699:co @ 0.84, 0.81 -644:co @ 0.36, 0.33 -691:co @ 0.50, 0.56 -704:cd @ 1.23, 1.19 -699:cd @ 0.93, 0.78 -691:cd @ 0.63, 0.68 -608:cd @ 1.26, 1.53 -703:cd @ 1.23, 1.13 -644:cd @ 0.47, 0.56 -703:cr @ 0.97, 0.91 -G96:cr @ 0.50, 0.42 -E12:cr @ 0.82, 0.85 -683:cr @ 1.21, 1.55 -699:cs @ 0.84, 0.81 -644:cs @ 0.36, 0.33 -691:cs @ 0.50, 0.56 -689:cg @ 0.51, 0.63 -645:ce @ 0.30, 0.30 -F51:cL @ 0.30, 0.30 -F51:ct @ 0.30, 0.30 -C51:cL @ 1.00, 1.00 -568:cL @ 0.30, 0.30 -568:ct @ 0.25, 0.25 -568:co @ 0.50, 0.50 -568:cs @ 0.50, 0.50 -W84:co @ 0.30, 0.30 -W84:cL @ 0.30, 0.30 \ No newline at end of file diff --git a/src/error_models/data_models/fcct14.rules b/src/error_models/data_models/fcct14.rules deleted file mode 100644 index 43369dc..0000000 --- a/src/error_models/data_models/fcct14.rules +++ /dev/null @@ -1,48 +0,0 @@ -ALL: c=cd @ 0.51, 0.40 ! CBM Generic Catalog weights -ALL: c=eqru @ 0.33, 0.30 -ALL: c=tL @ 0.25, 0.25 -ALL: c=os @ 0.50, 0.41 -ALL: c=ab @ 0.59, 0.51 -ALL: c=hijz @ 0.45, 0.44 -ALL: c=m @ 0.56, 0.57 -ALL: c=w @ 0.44, 0.36 -ALL: c=fg @ 0.73, 0.64 -ALL: c=UV @ 0.60, 0.60 -258: c=* @ 0.10, 0.10 -704: c=cd @ 0.62, 0.60 ! CBM Station-Catalog specific rules -699: c=cd @ 0.47, 0.39 -691: c=cd @ 0.32, 0.34 -608: c=cd @ 0.63, 0.77 -703: c=cd @ 0.62, 0.57 -644: c=cd @ 0.24, 0.28 -703: c=er @ 0.49, 0.46 -G96: c=erUV @ 0.25, 0.21 -E12: c=er @ 0.41, 0.43 -683: c=er @ 0.61, 0.78 -699: c=os @ 0.42, 0.41 -644: c=os @ 0.18, 0.17 -691: c=os @ 0.25, 0.28 -689: c=g @ 0.26, 0.32 -645: c=e @ 0.15, 0.15 ! New rules -F51: c=Lt @ 0.15, 0.15 -F51: c=UV @ 0.15, 0.15 -F52: c=Lt @ 0.15, 0.15 -F52: c=UV @ 0.15, 0.15 -568: c=L @ 0.15, 0.15 -568: c=t @ 0.13, 0.13 -568: c=os @ 0.25, 0.25 -568: c=UV @ 0.10, 0.10 -309: c=UV @ 0.15, 0.15 -H01: c=Lt @ 0.15, 0.15 -I41: c=UV @ 0.20, 0.20 -I41: c=N @ 0.40, 0.40 -673: c=* @ 0.30, 0.30 ! TMO -G45: c=* @ 0.50, 0.50 ! Space Survelliance Telescope -250: c=* @ 1.30, 1.30 ! Satellites: HST -249: c=* @ 60.0, 60.0 ! SOHO -C49: c=* @ 60.0, 60.0 ! STEREO-A -C50: c=* @ 60.0, 60.0 ! STEREO-B -C51: c=* @ 1.00, 1.00 ! WISE -T12: c=UV @ 0.10, 0.10 ! Tholen from UH88 with Gaia catalog -T09: c=UV @ 0.10, 0.10 ! Tholen from Subaru with Gaia catalog -T14: c=UV @ 0.10, 0.10 ! Tholen from CFHT with Gaia catalog diff --git a/src/error_models/data_models/vfcc17.rules b/src/error_models/data_models/vfcc17.rules deleted file mode 100644 index 1942c9f..0000000 --- a/src/error_models/data_models/vfcc17.rules +++ /dev/null @@ -1,100 +0,0 @@ -ALL t=PAN c=* p= > < 1890-01-01 @ 10.00, 10.00 -ALL t=PAN c=* p= > 1890-01-01 < 1950-01-01 @ 5.00, 5.00 -ALL t=PAN c=* p= > 1950-01-01 < @ 2.50, 2.50 -ALL t=cBCVn c=* p= > < @ 1.00, 1.00 ! Unknown catalog -ALL t=E c=* p= > < @ 0.20, 0.20 ! Occultations -ALL t=H c=* p= > < @ 0.40, 0.40 ! Hipparcos -ALL t=T c=* p= > < @ 0.50, 0.50 ! Transit circle -ALL t=e c=* p= > < @ 0.75, 0.75 ! Encoder -ALL t=M c=* p= > < @ 3.00, 3.00 ! Micrometer -ALL t=S c=* p= > < @ 1.50, 1.50 ! Satellite -ALL t=cC c=UVXW p= > < @ 0.60, 0.60 ! Gaia astrometric catalogs -F51 t=cC c=* p= > < @ 0.20, 0.20 -F52 t=cC c=* p= > < @ 0.20, 0.20 -G96 t=cC c=* p= > < @ 0.50, 0.50 -703 t=cC c=* p= > < 2014-01-01 @ 1.00, 1.00 -703 t=cC c=* p= > 2014-01-01 < @ 0.80, 0.80 -E12 t=cC c=* p= > < @ 0.75, 0.75 -704 t=cC c=* p= > < @ 1.00, 1.00 -691 t=cC c=* p= > < 2003-01-01 @ 0.60, 0.60 -691 t=cC c=* p= > 2003-01-01 < @ 0.50, 0.50 -291 t=cC c=* p= > < 2003-01-01 @ 0.60, 0.60 ! Updated -291 t=cC c=* p= > 2003-01-01 < @ 0.50, 0.50 ! Updated -644 t=cC c=* p= > < 2003-09-01 @ 0.60, 0.60 -644 t=cC c=* p= > 2003-09-01 < @ 0.40, 0.40 -699 t=cC c=* p= > < @ 0.80, 0.80 -G45 t=cC c=* p= > < @ 0.60, 0.60 -D29 t=cC c=* p= > < @ 0.75, 0.75 -T05 t=cC c=* p= > < @ 0.80, 0.80 -568 t=cC c=* p= > < @ 0.50, 0.50 ! Generic -568 t=cC c=t p=_ > < @ 0.20, 0.20 ! Micheli updated -568 t=cC c=q p=_ > < @ 0.20, 0.20 ! Micheli updated -568 t=cC c=UVXW p=_ > < @ 0.10, 0.10 ! Micheli updated -568 t=cC c=t p=2 > < @ 0.20, 0.20 ! Tholen -568 t=cC c=UVXW p=2 > < @ 0.10, 0.10 ! Tholen -568 t=cC c=os p=2 > < @ 0.50, 0.50 ! Tholen -568 t=cC c=UVXW p=^ > < @ 0.20, 0.20 ! Weryk new -T09 t=cC c=* p= > < @ 0.50, 0.50 ! Generic -T09 t=cC c=t p=0 > < @ 0.20, 0.20 ! Tholen -T09 t=cC c=UVX p=0 > < @ 0.10, 0.10 ! Tholen -T12 t=cC c=* p= > < 2022-10-06 @ 0.10, 0.10 ! Tholen Before 06 October 2022 -T12 t=cC c=* p= > 2022-10-06 < @ 0.50, 0.50 ! Generic New program codes, see MPEC 2022-T98 -T12 t=cC c=t p=0 > < 2022-10-06 @ 0.10, 0.10 ! Tholen Before 06 October 2022 -T12 t=cC c=t p=0 > 2022-10-06 < @ 0.20, 0.20 ! Tholen New program codes -T12 t=cC c=UVX p=0 > < 2022-10-06 @ 0.10, 0.10 ! Tholen Before 06 October 2022 -T12 t=cC c=UVX p=0 > 2022-10-06 < @ 0.10, 0.10 ! Tholen New program codes -T12 t=cC c=UVX p=1 > < 2022-10-06 @ 0.10, 0.10 ! Tholen Before 06 October 2022 -T12 t=cC c=UVX p=1 > 2022-10-06 < @ 0.20, 0.20 ! Weryk new New program code -T14 t=cC c=* p= > < @ 0.50, 0.50 ! Generic -T14 t=cC c=t p=0 > < @ 0.20, 0.20 ! Tholen -T14 t=cC c=UVX p=0 > < @ 0.10, 0.10 ! Tholen -T14 t=cC c=t p=7 > < @ 0.20, 0.20 ! Micheli updated -T14 t=cC c=UVX p=7 > < @ 0.10, 0.10 ! Micheli updated -T14 t=cC c=UVX p=3 > < @ 0.20, 0.20 ! Weryk new -H01 t=cC c=LtUVXW p= > < @ 0.30, 0.30 -673 t=cC c=* p= > < @ 0.30, 0.30 -645 t=cC c=* p= > < @ 0.30, 0.30 -689 t=cC c=* p= > < @ 0.50, 0.50 -J04 t=cC c=UVXWtLqrue p= > < @ 0.40, 0.40 ! Updated -Z84 t=cC c=UVXWtLqrue p= > < @ 0.40, 0.40 ! New -W84 t=cC c=* p= > < @ 0.50, 0.50 -950 t=cC c=UVXWtLqrue p= > < @ 0.50, 0.50 -F65 t=cC c=* p= > < @ 0.40, 0.40 -E10 t=cC c=* p= > < @ 0.40, 0.40 -W85 t=cC c=* p= > < @ 0.40, 0.40 -W86 t=cC c=* p= > < @ 0.40, 0.40 -W87 t=cC c=* p= > < @ 0.40, 0.40 -Q63 t=cC c=* p= > < @ 0.40, 0.40 -Q64 t=cC c=* p= > < @ 0.40, 0.40 -K91 t=cC c=* p= > < @ 0.40, 0.40 -K92 t=cC c=* p= > < @ 0.40, 0.40 -K93 t=cC c=* p= > < @ 0.40, 0.40 -V37 t=cC c=* p= > < @ 0.40, 0.40 -V39 t=cC c=* p= > < @ 0.40, 0.40 ! New -Z31 t=cC c=* p= > < @ 0.40, 0.40 ! New -Z24 t=cC c=* p= > < @ 0.40, 0.40 ! New -Y28 t=cC c=tUVXW p= > < 2015-01-01 @ 1.00, 1.00 ! New -Y28 t=cC c=tUVXW p= > 2015-01-01 < @ 0.30, 0.30 ! New -309 t=cC c=UVXW p=&% > < @ 0.20, 0.20 -309 t=cC c=tq p=&% > < @ 0.30, 0.30 -G83 t=cC c=UVXW p=2 > < @ 0.20, 0.20 -G83 t=cC c=tq p=2 > < @ 0.30, 0.30 -248 t=* c=* p= > < 1991-01-01 @ 0.20, 0.20 ! Hipparcos -248 t=* c=* p= > 1991-01-01 < @ 0.15, 0.15 ! Hipparcos -250 t=* c=* p= > < @ 1.30, 1.30 ! HST -249 t=* c=* p= > < @ 60.00, 60.00 ! SOHO -C49 t=* c=* p= > < @ 60.00, 60.00 ! STEREO-A -C50 t=* c=* p= > < @ 60.00, 60.00 ! STEREO-B -C51 t=* c=* p= > < @ 1.00, 1.00 ! WISE -C57 t=* c=* p= > < @ 5.00, 5.00 ! TESS -608 t=cC c=* p= > < @ 0.60, 0.60 ! New -Z18 t=cC c=tq p=1 > < @ 0.30, 0.30 ! Micheli New -Z18 t=cC c=UVXW p=1 > < @ 0.20, 0.20 ! Micheli New -T08 t=cC c=* p= > < @ 0.80, 0.80 ! New -258 t=cC c=* p= > < @ 0.50, 0.50 ! GAIA new -C65 t=cC c=UVXW p=3 > < @ 0.20, 0.20 ! Micheli new -094 t=cC c=UVXW p=9 > < @ 0.50, 0.50 ! Micheli new -181 t=cC c=UVXW p= > < 2019-01-01 @ 1.00, 1.00 ! New -181 t=cC c=UVXW p= > 2019-01-01 < @ 0.50, 0.50 ! New -M28 t=* c=* p= > < 2023-12-12 @ 3.00, 3.00 ! Bad observations from M28, biased fixed on Dec. 2023 -M28 t=* c=* p= > 2023-12-12 < @ 1.00, 1.00 ! Restore default RMS for M28 diff --git a/src/error_models/mod.rs b/src/error_models/mod.rs deleted file mode 100644 index aa00ffa..0000000 --- a/src/error_models/mod.rs +++ /dev/null @@ -1,418 +0,0 @@ -//! # Astrometric error models -//! -//! This module provides tools to **handle observation error models** used in orbit -//! determination. Error models define the astrometric biases and RMS values -//! associated with each observatory and star catalog, as recommended in the literature -//! (e.g., FCCT14, CBM10, VFCC17). -//! -//! ## Public API -//! -//! ### [`crate::error_models::ErrorModel`] -//! Enumeration of the supported astrometric error models: -//! -//! - `ErrorModel::FCCT14` – Farnocchia, Chesley, Chamberlin & Tholen (2014) -//! - `ErrorModel::CBM10` – Chesley, Baer & Monet (2010) -//! - `ErrorModel::VFCC17` – Vereš, Farnocchia, Chesley & Chamberlin (2017) -//! -//! You can create an [`crate::error_models::ErrorModel`] from a string with: -//! -//! ```rust, ignore -//! use outfit::error_models::ErrorModel; -//! let model: ErrorModel = "FCCT14".parse().unwrap(); -//! ``` -//! -//! ### [`crate::error_models::ErrorModelData`] -//! -//! ```text -//! type ErrorModelData = HashMap<(MpcCode, CatalogCode), (f32, f32)> -//! ``` -//! -//! This map associates an observatory (MPC code) and a star catalog code -//! with a pair `(bias_RMS, declination_RMS)`. -//! -//! The contents are loaded from reference files distributed with the crate. -//! -//! ### `ErrorModel::read_error_model_file` -//! -//! ```rust, ignore -//! use outfit::error_models::ErrorModel; -//! -//! let error_map = ErrorModel::FCCT14.read_error_model_file().unwrap(); -//! println!("{} entries", error_map.len()); -//! ``` -//! -//! This function reads the internal rules for the chosen model -//! and returns a [`crate::error_models::ErrorModelData`] structure ready to be queried. -//! -//! ### [`crate::error_models::get_bias_rms`] -//! -//! ```rust -//! use outfit::error_models::{ErrorModel, get_bias_rms}; -//! -//! let data = ErrorModel::FCCT14.read_error_model_file().unwrap(); -//! if let Some((bias_ra, bias_dec)) = get_bias_rms(&data, "699".to_string(), "c".to_string()) { -//! println!("Bias for MPC 699: RA = {bias_ra}, Dec = {bias_dec}"); -//! } -//! ``` -//! -//! This function looks up the `(RMS in RA, RMS in Dec)` for a given observatory -//! and star catalog code. If no exact match is found, the function falls back to -//! generic values (e.g. `ALL:c`). -//! -//! ## Typical usage -//! -//! 1. Choose an error model (e.g. `ErrorModel::FCCT14`). -//! 2. Load its table using [`read_error_model_file`](crate::error_models::ErrorModel::read_error_model_file). -//! 3. Use [`crate::error_models::get_bias_rms`] to obtain astrometric uncertainties for weighting residuals. -//! -//! ## References -//! -//! - Farnocchia, D., Chesley, S. R., Chamberlin, A. B., & Tholen, D. J. (2014) -//! - Chesley, S. R., Baer, J., & Monet, D. G. (2010) -//! - Vereš, P., Farnocchia, D., Chesley, S. R., & Chamberlin, A. B. (2017) -//! -//! These tables are essential for **realistic orbit determination** since they -//! ensure that observations are weighted according to their expected precision. -mod vfcc17; - -use std::{collections::HashMap, str::FromStr}; - -use nom::{ - branch::alt, - bytes::complete::{tag, take_until, take_while}, - character::complete::{char, multispace0}, - combinator::{map, opt}, - number::complete::float, - sequence::{preceded, separated_pair, terminated}, - IResult, Parser, -}; - -use crate::{constants::MpcCode, outfit_errors::OutfitError}; -use vfcc17::parse_vfcc17_line; - -type CatalogCode = String; -pub type ErrorModelData = HashMap<(MpcCode, CatalogCode), (f32, f32)>; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum ErrorModel { - FCCT14, - CBM10, - VFCC17, -} - -static FCCT14_RULES: &str = include_str!("data_models/fcct14.rules"); -static CBM10_RULES: &str = include_str!("data_models/cbm10.rules"); -static VFCC17_RULES: &str = include_str!("data_models/vfcc17.rules"); - -pub(in crate::error_models) type ParseResult<'a> = - IResult<&'a str, Vec<((MpcCode, CatalogCode), (f32, f32))>>; - -fn is_alphanum(c: char) -> bool { - c.is_alphanumeric() -} - -fn parse_station(input: &str) -> IResult<&str, &str> { - terminated(take_while(is_alphanum), tag(":")).parse(input) -} - -fn parse_rms_values(input: &str) -> IResult<&str, (f32, f32)> { - preceded( - multispace0, - preceded( - char('@'), - separated_pair( - preceded(multispace0, float), - char(','), - preceded(multispace0, float), - ), - ), - ) - .parse(input) -} - -fn parse_catalog_codes(input: &str) -> IResult<&str, Vec> { - preceded( - multispace0, - preceded( - // accepte soit "c=" soit rien du tout - alt((tag("c="), tag(""))), - map( - nom::bytes::complete::take_while(|c: char| c.is_alphabetic() || c == '*'), - |s: &str| s.chars().map(|c| c.to_string()).collect(), - ), - ), - ) - .parse(input) -} - -fn parse_full_line(input: &str) -> ParseResult { - let (input, remain) = opt(take_until("!")).parse(input)?; //ignore comments - let input = input.trim(); - - let input = remain.unwrap_or(input); - - map( - (parse_station, parse_catalog_codes, parse_rms_values), - |(station, catalogs, (rmsa, rmsd))| { - catalogs - .into_iter() - .map(|cat| ((station.to_string(), cat), (rmsa, rmsd))) - .collect() - }, - ) - .parse(input) -} - -fn parse_full_file(file: &str, parse_line: F) -> Result -where - F: Fn(&str) -> ParseResult, -{ - let error_map: ErrorModelData = file - .lines() - .filter(|line| !line.trim().is_empty() && !line.trim_start().starts_with('!')) - .map(|line| { - parse_line(line) - .map_err(|_e| OutfitError::NomParsingError(line.to_string())) - .map(|(_, pairs)| pairs) - }) - .collect::, OutfitError>>()? - .into_iter() - .flatten() - .collect(); - - Ok(error_map) -} - -impl ErrorModel { - /// Load the internal RMS/bias table for this astrometric error model. - /// - /// This function parses the reference file corresponding to the selected - /// [`ErrorModel`] variant (FCCT14, CBM10, or VFCC17) and returns a - /// [`ErrorModelData`] map containing the weighting coefficients - /// (RMS in right ascension and declination). - /// - /// # Returns - /// - /// A [`Result`] containing: - /// * `Ok(ErrorModelData)` – A hash map where each key is a pair `(MpcCode, CatalogCode)` - /// and the value is a tuple `(rms_ra, rms_dec)` in arcseconds. - /// * `Err(OutfitError)` – If the reference file could not be parsed. - /// - /// # Usage - /// - /// ``` - /// use outfit::error_models::ErrorModel; - /// - /// // Load FCCT14 error model data - /// let data = ErrorModel::FCCT14.read_error_model_file().unwrap(); - /// - /// println!("Number of entries: {}", data.len()); - /// - /// // Use the map later with `get_bias_rms` - /// ``` - /// - /// # See also - /// * [`get_bias_rms`] – Look up the bias and RMS values for a given station/catalog. - pub fn read_error_model_file(&self) -> Result { - let error_map: ErrorModelData = match self { - ErrorModel::FCCT14 => parse_full_file(FCCT14_RULES, parse_full_line)?, - ErrorModel::CBM10 => parse_full_file(CBM10_RULES, parse_full_line)?, - ErrorModel::VFCC17 => { - // Implement parsing logic for VFCC17 - parse_full_file(VFCC17_RULES, parse_vfcc17_line)? - } - }; - - Ok(error_map) - } -} - -impl FromStr for ErrorModel { - type Err = OutfitError; - - fn from_str(s: &str) -> Result { - match s { - "FCCT14" => Ok(ErrorModel::FCCT14), - "CBM10" => Ok(ErrorModel::CBM10), - "VFCC17" => Ok(ErrorModel::VFCC17), - _ => Err(OutfitError::InvalidErrorModel(format!( - "Invalid error model: {s}" - ))), - } - } -} - -/// Retrieve the astrometric bias and RMS values for a given observatory (MPC code) -/// and star catalog code from a preloaded [`ErrorModelData`] table. -/// -/// This function searches for a matching entry in the following priority order: -/// -/// 1. **Exact match**: `(mpc_code, catalog_code)` -/// 2. **Generic catalog fallback for the same observatory**: -/// * `(mpc_code, "e")` – generic `e` entry (elliptical) -// * `(mpc_code, "c")` – generic `c` entry (catalog-specific default) -/// 3. **Global fallback** (for any observatory): -/// * `("ALL", catalog_code)` -/// * `("ALL", "e")` -/// * `("ALL", "c")` -/// -/// The returned pair `(rms_ra, rms_dec)` corresponds to the weighting factors -/// (typically in arcseconds) used for astrometric residuals. -/// -/// # Arguments -/// -/// * `error_model` – The [`ErrorModelData`] hash map produced by -/// [`ErrorModel::read_error_model_file`](crate::error_models::ErrorModel::read_error_model_file). -/// * `mpc_code` – The Minor Planet Center observatory code. -/// * `catalog_code` – The star catalog identifier (single letter or string). -/// -/// # Returns -/// -/// * `Some((rms_ra, rms_dec))` – If a match is found in the table. -/// * `None` – If no matching entry exists (very rare). -/// -/// # Example -/// -/// ```rust, no_run -/// use outfit::error_models::{ErrorModel, get_bias_rms}; -/// -/// // Load error model data -/// let table = ErrorModel::FCCT14.read_error_model_file().unwrap(); -/// -/// // Query bias/RMS for observatory 699 (Catalina) with catalog code "c" -/// if let Some((rms_ra, rms_dec)) = get_bias_rms(&table, "699".to_string(), "c".to_string()) { -/// println!("699 / c -> RMS: RA = {rms_ra}, Dec = {rms_dec}"); -/// } -/// ``` -pub fn get_bias_rms( - error_model: &ErrorModelData, - mpc_code: MpcCode, - catalog_code: CatalogCode, -) -> Option<(f32, f32)> { - error_model - .get(&(mpc_code.clone(), catalog_code.clone())) - .cloned() - .or_else(|| { - error_model - .get(&(mpc_code.clone(), "e".to_string())) - .cloned() - }) - .or_else(|| error_model.get(&(mpc_code, "c".to_string())).cloned()) - .or_else(|| error_model.get(&("ALL".to_string(), catalog_code)).cloned()) - .or_else(|| { - error_model - .get(&("ALL".to_string(), "e".to_string())) - .cloned() - }) - .or_else(|| { - error_model - .get(&("ALL".to_string(), "c".to_string())) - .cloned() - }) -} - -impl TryFrom<&str> for ErrorModel { - type Error = OutfitError; - - fn try_from(value: &str) -> Result { - value.parse() - } -} - -#[cfg(test)] -mod test_error_model { - use super::*; - - #[test] - fn test_parse_fcct14_line() { - let line = "ALL: c=eqru @ 0.33, 0.30"; - let result = parse_full_line(line); - assert!(result.is_ok()); - let ((mpc_code, catalog_code), (rmsa, rmsd)) = &result.unwrap().1[0]; - assert_eq!(mpc_code, "ALL"); - assert_eq!(catalog_code, "e"); - assert_eq!(*rmsa, 0.33); - assert_eq!(*rmsd, 0.3); - - let line = "ALL: c=cd @ 0.51, 0.40 ! CBM Generic Catalog weights"; - let result = parse_full_line(line); - assert!(result.is_ok()); - let ((mpc_code, catalog_code), (rmsa, rmsd)) = &result.unwrap().1[0]; - assert_eq!(mpc_code, "ALL"); - assert_eq!(catalog_code, "c"); - assert_eq!(*rmsa, 0.51); - assert_eq!(*rmsd, 0.4); - - let line = "699:c @ 0.93, 0.78"; - let result = parse_full_line(line); - assert!(result.is_ok()); - let ((mpc_code, catalog_code), (rmsa, rmsd)) = &result.unwrap().1[0]; - assert_eq!(mpc_code, "699"); - assert_eq!(catalog_code, "c"); - assert_eq!(*rmsa, 0.93); - assert_eq!(*rmsd, 0.78); - } - - #[test] - fn test_read_error_model_file() { - let error_model = ErrorModel::FCCT14; - let result = error_model.read_error_model_file(); - assert!(result.is_ok()); - let data = result.unwrap(); - assert!(!data.is_empty()); - - let error_model = ErrorModel::CBM10; - let result = error_model.read_error_model_file(); - assert!(result.is_ok()); - let data = result.unwrap(); - assert!(!data.is_empty()); - - let error_model = ErrorModel::VFCC17; - let result = error_model.read_error_model_file(); - - assert!(result.is_ok()); - let data = result.unwrap(); - assert!(!data.is_empty()); - } - - #[test] - fn test_get_bias_rms() { - let error_model = ErrorModel::FCCT14.read_error_model_file().unwrap(); - let bias_rms = get_bias_rms(&error_model, "ALL".to_string(), "c".to_string()); - assert!(bias_rms.is_some()); - let (rmsa, rmsd) = bias_rms.unwrap(); - assert_eq!(rmsa, 0.51); - assert_eq!(rmsd, 0.4); - - let bias_rms = get_bias_rms(&error_model, "699".to_string(), "c".to_string()); - assert!(bias_rms.is_some()); - let (rmsa, rmsd) = bias_rms.unwrap(); - assert_eq!(rmsa, 0.47); - assert_eq!(rmsd, 0.39); - - let error_model = ErrorModel::CBM10.read_error_model_file().unwrap(); - let bias_rms = get_bias_rms(&error_model, "ALL".to_string(), "c".to_string()); - assert!(bias_rms.is_some()); - let (rmsa, rmsd) = bias_rms.unwrap(); - assert_eq!(rmsa, 0.5); - assert_eq!(rmsd, 0.5); - - let bias_rms = get_bias_rms(&error_model, "699".to_string(), "c".to_string()); - assert!(bias_rms.is_some()); - let (rmsa, rmsd) = bias_rms.unwrap(); - assert_eq!(rmsa, 0.84); - assert_eq!(rmsd, 0.81); - - let error_model = ErrorModel::VFCC17.read_error_model_file().unwrap(); - let bias_rms = get_bias_rms(&error_model, "ALL".to_string(), "U".to_string()); - assert!(bias_rms.is_some()); - let (rmsa, rmsd) = bias_rms.unwrap(); - assert_eq!(rmsa, 0.6); - assert_eq!(rmsd, 0.6); - let bias_rms = get_bias_rms(&error_model, "699".to_string(), "*".to_string()); - assert!(bias_rms.is_some()); - let (rmsa, rmsd) = bias_rms.unwrap(); - assert_eq!(rmsa, 0.8); - assert_eq!(rmsd, 0.8); - } -} diff --git a/src/error_models/vfcc17.rs b/src/error_models/vfcc17.rs deleted file mode 100644 index 3e580a9..0000000 --- a/src/error_models/vfcc17.rs +++ /dev/null @@ -1,96 +0,0 @@ -use nom::{ - bytes::complete::{tag, take_until, take_while1}, - character::complete::{char, multispace0}, - combinator::{map, opt}, - number::complete::float, - sequence::{preceded, separated_pair}, - IResult, Parser, -}; - -use crate::error_models::ParseResult; - -fn is_word_char(c: char) -> bool { - c.is_alphanumeric() || "*".contains(c) -} - -fn parse_word(input: &str) -> IResult<&str, &str> { - take_while1(is_word_char)(input) -} - -fn parse_station(input: &str) -> IResult<&str, &str> { - parse_word(input) -} - -fn parse_catalog_codes(input: &str) -> IResult<&str, Vec> { - preceded( - tag("c="), - map(take_while1(is_word_char), |s: &str| { - s.chars().map(|c| c.to_string()).collect() - }), - ) - .parse(input) -} - -fn parse_rms_values(input: &str) -> IResult<&str, (f32, f32)> { - preceded( - take_until("@"), - preceded( - tag("@"), - separated_pair( - preceded(multispace0, float), - preceded(multispace0, char(',')), - preceded(multispace0, float), - ), - ), - ) - .parse(input) -} - -pub fn parse_vfcc17_line(input: &str) -> ParseResult { - let (input, remain) = opt(take_until("!")).parse(input)?; // Ignore comments - let input = remain.unwrap_or(input).trim(); - - map( - ( - parse_station, - take_until("c="), - parse_catalog_codes, - parse_rms_values, - ), - |(station, _, catalogs, (rmsa, rmsd))| { - catalogs - .into_iter() - .map(|cat| ((station.to_string(), cat), (rmsa, rmsd))) - .collect() - }, - ) - .parse(input) -} - -#[cfg(test)] -mod test_vfcc17_parser { - use super::*; - - #[test] - fn test_vfcc17_parser() { - let input = "ALL t=cBCVn c=* p= > < @ 1.00, 1.00 ! Unknown catalog"; - let result = parse_vfcc17_line(input); - assert!(result.is_ok()); - let (_, parsed) = result.unwrap(); - assert_eq!(parsed.len(), 1); - assert_eq!(parsed[0].0 .0, "ALL"); - assert_eq!(parsed[0].0 .1, "*"); - assert_eq!(parsed[0].1 .0, 1.); - assert_eq!(parsed[0].1 .1, 1.); - - let input = "568 t=cC c=t p=_ > < @ 0.20, 0.20 ! Micheli updated "; - let result = parse_vfcc17_line(input); - assert!(result.is_ok()); - let (_, parsed) = result.unwrap(); - assert_eq!(parsed.len(), 1); - assert_eq!(parsed[0].0 .0, "568"); - assert_eq!(parsed[0].0 .1, "t"); - assert_eq!(parsed[0].1 .0, 0.2); - assert_eq!(parsed[0].1 .1, 0.2); - } -} diff --git a/src/initial_orbit_determination/gauss.rs b/src/initial_orbit_determination/gauss.rs index 178caf9..c5baa23 100644 --- a/src/initial_orbit_determination/gauss.rs +++ b/src/initial_orbit_determination/gauss.rs @@ -109,10 +109,12 @@ use std::ops::ControlFlow; use aberth::StopReason; use nalgebra::Matrix3; use nalgebra::Vector3; +use photom::Radians; +use photom::MJDTT; use rand_distr::StandardNormal; use smallvec::SmallVec; -use crate::constants::Radian; +use crate::constants::ROT_EQUMJ2000_TO_ECLMJ2000; use crate::constants::{GAUSS_GRAV, VLIGHT_AU}; use crate::initial_orbit_determination::gauss_result::GaussResult; @@ -120,7 +122,6 @@ use crate::initial_orbit_determination::IODParams; use crate::kepler::velocity_correction_with_guess; use crate::orb_elem::eccentricity_control; use crate::orbit_type::OrbitalElements; -use crate::outfit::Outfit; use crate::outfit_errors::OutfitError; use aberth::aberth; use rand::Rng; @@ -153,9 +154,9 @@ use rand::Rng; #[derive(Debug, PartialEq, Clone)] pub struct GaussObs { pub(crate) idx_obs: Vector3, - pub(crate) ra: Vector3, - pub(crate) dec: Vector3, - pub(crate) time: Vector3, + pub(crate) ra: Vector3, + pub(crate) dec: Vector3, + pub(crate) time: Vector3, pub(crate) observer_helio_position: Matrix3, } @@ -324,9 +325,9 @@ impl GaussObs { /// * [`GaussObs::prelim_orbit`] – Consumes each realization to compute a Gauss preliminary orbit. /// * [`estimate_best_orbit`](crate::observations::observations_ext::ObservationIOD::estimate_best_orbit) – High-level search loop that leverages this iterator with early pruning. pub fn realizations_iter<'a, R: Rng + 'a>( - &'a self, - errors_ra: &'a Vector3, - errors_dec: &'a Vector3, + self, + errors_ra: &Vector3, + errors_dec: &Vector3, n_realizations: usize, noise_scale: f64, rng: &'a mut R, @@ -427,7 +428,7 @@ impl GaussObs { /// * [`GaussObs::prelim_orbit`] – Compute a preliminary Gauss solution from each realization. /// * [`estimate_best_orbit`](crate::observations::observations_ext::ObservationIOD::estimate_best_orbit) – End-to-end search that consumes realizations. pub fn generate_noisy_realizations( - &self, + self, errors_ra: &Vector3, errors_dec: &Vector3, n_realizations: usize, @@ -880,7 +881,7 @@ impl GaussObs { /// /// Arguments /// --------- - /// * `state` – The outfit global state containing the rotation matrix + /// * `rot_equmj2000_to_eclmj2000` – rotation matrix from equatorial mean J2000 to ecliptic mean J2000 /// * `asteroid_position` – Cartesian heliocentric position vector of the object (in AU), in equatorial J2000 frame. /// * `asteroid_velocity` – Cartesian heliocentric velocity vector of the object (in AU/day), in equatorial J2000 frame. /// * `reference_epoch` – Epoch (in MJD TT) corresponding to the state vector, used as the reference time for the elements. @@ -908,16 +909,12 @@ impl GaussObs { /// * [`KeplerianElements`] – definition of the orbital elements struct. fn compute_orbit_from_state( &self, - state: &Outfit, &asteroid_position: &Vector3, &asteroid_velocity: &Vector3, reference_epoch: f64, ) -> Result { - // get the rotation matrix from equatorial mean J2000 to ecliptic mean J2000 - let roteqec = state.get_rot_equmj2000_to_eclmj2000(); - // Apply the transformation to position and velocity vectors - let matrix_elc_transform = roteqec.transpose(); + let matrix_elc_transform = ROT_EQUMJ2000_TO_ECLMJ2000.transpose(); let ecl_pos = matrix_elc_transform * asteroid_position; let ecl_vel = matrix_elc_transform * asteroid_velocity; @@ -1053,6 +1050,7 @@ impl GaussObs { /// /// Arguments /// ----------------- + /// * `rot_equmj2000_to_eclmj2000` – rotation matrix from equatorial mean J2000 to ecliptic mean J2000 /// * `pos_all_time`: `3×3` heliocentric positions at `t1|t2|t3` (AU). /// * `vel_t2`: heliocentric velocity at `t2` (AU/day). /// * `epoch`: reference epoch for the state (MJD TT). @@ -1068,14 +1066,13 @@ impl GaussObs { #[inline] fn build_result( &self, - state: &Outfit, pos_all_time: &Matrix3, vel_t2: &Vector3, epoch: f64, corrected: bool, ) -> Option { let r_t2: Vector3 = pos_all_time.column(1).into(); - match self.compute_orbit_from_state(state, &r_t2, vel_t2, epoch) { + match self.compute_orbit_from_state(&r_t2, vel_t2, epoch) { Ok(orbit) if corrected => Some(GaussResult::CorrectedOrbit(orbit)), Ok(orbit) => Some(GaussResult::PrelimOrbit(orbit)), Err(_) => None, @@ -1103,7 +1100,7 @@ impl GaussObs { /// /// Arguments /// ----------------- - /// * `state`: Global context (ephemerides, constants, settings). + /// * `rot_equmj2000_to_eclmj2000` – rotation matrix from equatorial mean J2000 to ecliptic mean J2000 /// * `iod_params`: Parameters controlling the IOD process, including root filtering and correction settings. /// /// Return @@ -1125,7 +1122,6 @@ impl GaussObs { /// * [`IODParams`] – Configuration parameters for the IOD process. pub fn prelim_orbit_all( &self, - state: &Outfit, iod_params: &IODParams, ) -> Result, OutfitError> { // 1) Core Gauss quantities @@ -1182,15 +1178,14 @@ impl GaussObs { iod_params.newton_eps, iod_params.newton_max_it, ) { - if let Some(res) = - self.build_result(state, &pos_cor, &v_cor, epoch_cor, true) + if let Some(res) = self.build_result(&pos_cor, &v_cor, epoch_cor, true) { if solutions.len() < iod_params.max_tested_solutions { solutions.push(res); } } } else if let Some(res) = - self.build_result(state, &pos_all, &v_pre, epoch_ref, false) + self.build_result(&pos_all, &v_pre, epoch_ref, false) { if solutions.len() < iod_params.max_tested_solutions { solutions.push(res); @@ -1224,7 +1219,7 @@ impl GaussObs { /// /// Arguments /// ----------------- - /// * `state`: The global context (ephemerides, constants, settings). + /// * `rot_equmj2000_to_eclmj2000` – rotation matrix from equatorial mean J2000 to ecliptic mean J2000 /// * `iod_params`: Parameters controlling the IOD process, including root filtering and correction settings. /// /// Return @@ -1244,12 +1239,8 @@ impl GaussObs { /// * [`prelim_orbit_all`](crate::initial_orbit_determination::gauss::GaussObs::prelim_orbit_all) – Enumerates and returns up to three acceptable solutions. /// * [`pos_and_vel_correction`](crate::initial_orbit_determination::gauss::GaussObs::pos_and_vel_correction) – Iterative velocity update (Lagrange f/g). /// * [`IODParams`] – Configuration parameters for the IOD process. - pub fn prelim_orbit( - &self, - state: &Outfit, - iod_params: &IODParams, - ) -> Result { - let all = self.prelim_orbit_all(state, iod_params)?; + pub fn prelim_orbit(&self, iod_params: &IODParams) -> Result { + let all = self.prelim_orbit_all(iod_params)?; if let Some(best_corr) = all .iter() .find(|s| matches!(s, GaussResult::CorrectedOrbit(_))) @@ -1432,14 +1423,10 @@ impl GaussObs { } #[cfg(test)] -#[cfg(feature = "jpl-download")] pub(crate) mod gauss_test { use super::*; - use crate::{ - orbit_type::{keplerian_element::KeplerianElements, orbit_type_test::approx_equal}, - unit_test_global::OUTFIT_HORIZON_TEST, - }; + use crate::orbit_type::{keplerian_element::KeplerianElements, orbit_type_test::approx_equal}; #[test] fn test_gauss_prelim() { @@ -1718,7 +1705,6 @@ pub(crate) mod gauss_test { #[test] fn test_solve_orbit() { - let env = &OUTFIT_HORIZON_TEST.0; let tol = 1e-13; let gauss = GaussObs { @@ -1747,7 +1733,7 @@ pub(crate) mod gauss_test { ), }; - let binding = gauss.prelim_orbit(env, &IODParams::default()).unwrap(); + let binding = gauss.prelim_orbit(&IODParams::default()).unwrap(); let prelim_orbit = binding.get_orbit(); // This is the expected orbit based on the Orbfit software @@ -1781,7 +1767,7 @@ pub(crate) mod gauss_test { .into(), }; - let binding = a.prelim_orbit(env, &IODParams::default()).unwrap(); + let binding = a.prelim_orbit(&IODParams::default()).unwrap(); let prelim_orbit_a = binding.get_orbit(); let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { @@ -1827,7 +1813,7 @@ pub(crate) mod gauss_test { ), }; - let binding = gauss.prelim_orbit(env, &IODParams::default()).unwrap(); + let binding = gauss.prelim_orbit(&IODParams::default()).unwrap(); let prelim_orbit_b = binding.get_orbit(); // This is the expected orbit based on the Orbfit software @@ -1983,8 +1969,13 @@ pub(crate) mod gauss_test { let mut rng = StdRng::seed_from_u64(42_u64); // seed for reproducibility - let realizations = - gauss.generate_noisy_realizations(&errors_ra, &errors_dec, 5, 1.0, &mut rng); + let realizations = gauss.clone().generate_noisy_realizations( + &errors_ra, + &errors_dec, + 5, + 1.0, + &mut rng, + ); assert_eq!(realizations.len(), 6); // 1 original + 5 noisy @@ -2017,8 +2008,13 @@ pub(crate) mod gauss_test { let mut rng = StdRng::seed_from_u64(123); - let realizations = - gauss.generate_noisy_realizations(&errors_ra, &errors_dec, 3, 1.0, &mut rng); + let realizations = gauss.clone().generate_noisy_realizations( + &errors_ra, + &errors_dec, + 3, + 1.0, + &mut rng, + ); for g in realizations { assert_eq!(g.ra, gauss.ra); @@ -2041,8 +2037,13 @@ pub(crate) mod gauss_test { let mut rng = StdRng::seed_from_u64(123); - let realizations = - gauss.generate_noisy_realizations(&errors_ra, &errors_dec, 0, 1.0, &mut rng); + let realizations = gauss.clone().generate_noisy_realizations( + &errors_ra, + &errors_dec, + 0, + 1.0, + &mut rng, + ); assert_eq!(realizations.len(), 1); // Only the original observation assert_eq!(realizations[0], gauss); @@ -2064,10 +2065,20 @@ pub(crate) mod gauss_test { let mut rng_low = StdRng::seed_from_u64(42); let mut rng_high = StdRng::seed_from_u64(42); // same seed - let low_noise = - gauss.generate_noisy_realizations(&errors_ra, &errors_dec, 1, 0.1, &mut rng_low); - let high_noise = - gauss.generate_noisy_realizations(&errors_ra, &errors_dec, 1, 10.0, &mut rng_high); + let low_noise = gauss.clone().generate_noisy_realizations( + &errors_ra, + &errors_dec, + 1, + 0.1, + &mut rng_low, + ); + let high_noise = gauss.clone().generate_noisy_realizations( + &errors_ra, + &errors_dec, + 1, + 10.0, + &mut rng_high, + ); let diff_low = (low_noise[1].ra - gauss.ra).norm(); let diff_high = (high_noise[1].ra - gauss.ra).norm(); diff --git a/src/initial_orbit_determination/mod.rs b/src/initial_orbit_determination/mod.rs index d13dc26..c63f45f 100644 --- a/src/initial_orbit_determination/mod.rs +++ b/src/initial_orbit_determination/mod.rs @@ -79,6 +79,7 @@ use std::fmt; pub mod gauss; pub mod gauss_result; +pub mod triplet_generation; /// Configuration parameters controlling the behavior of /// [`estimate_best_orbit`](crate::observations::observations_ext::ObservationIOD::estimate_best_orbit). @@ -634,6 +635,11 @@ impl IODParamsBuilder { Ok(self.params) } + + /// Create an [`IODParams`] directly from the builder's internal parameters without validation. + pub fn from_params(params: IODParams) -> Self { + Self { params } + } } impl fmt::Display for IODParams { diff --git a/src/initial_orbit_determination/triplet_generation/index_generator.rs b/src/initial_orbit_determination/triplet_generation/index_generator.rs new file mode 100644 index 0000000..0e9e0fd --- /dev/null +++ b/src/initial_orbit_determination/triplet_generation/index_generator.rs @@ -0,0 +1,657 @@ +//! # IOD Triplet Index Generator (lazy, windowed by time span) +//! +//! Streams index triplets `(i, j, k)` — called **anchor**, **middle**, **last** — that +//! satisfy a time-span constraint on the outer pair: +//! +//! $$dt\_min \leq t_k - t_i \leq dt\_max \quad \text{with } i < j < k$$ +//! +//! Indices refer to a *downsampled* view of the input observations (the +//! **reduced set**). They map directly to positions in the input slice. +//! +//! ## Input contract +//! +//! The observation slice passed to [`TripletIndexGenerator::from_observations`] +//! **must already be sorted in ascending time order**. No internal sorting is +//! performed. Violating this contract produces silently incorrect triplets. +//! +//! ## Algorithm +//! +//! For each anchor `i`, a two-pointer sweep finds the valid window +//! $[lo, hi]$ for `k` such that the time-span constraint holds. +//! `j` then ranges over `(i, hi)` and `k` over `(j, hi]`. +//! This gives ~$O(n^2)$ complexity versus $O(n^3)$ brute-force. +//! +//! ## Typical usage +//! +//! ```text +//! // observations must be sorted by ascending epoch before this call. +//! let gen = TripletIndexGenerator::from_observations(&obs, dt_min, dt_max, 200, usize::MAX); +//! for (i, j, k) in gen { +//! // i, j, k index directly into the (downsampled view of the) input slice. +//! } +//! ``` +//! +//! ## Notes +//! - `dt_min`/`dt_max` must share the same time unit as the observation epochs (TT/MJD). +//! - Fewer than 3 reduced observations or `dt_min > dt_max` → empty iterator. +//! - No ordering by heuristic is imposed; layer a best-K heap on top if needed. + +use photom::observation_dataset::observation::Observation; + +// --------------------------------------------------------------------------- +// Downsampling +// --------------------------------------------------------------------------- + +/// Select `max_keep` indices from `0..n` uniformly, always including `0` and `n-1`. +/// +/// This reduces the $O(n^3)$ triplet explosion while preserving the full time span. +/// +/// Behavior +/// ----------------- +/// | Condition | Result | +/// |--------------------|-------------------------------------| +/// | `n == 0` | `[]` | +/// | `max_keep >= n` | `[0, 1, …, n-1]` (identity) | +/// | `max_keep <= 3` | `[0, n/2, n-1]` | +/// | otherwise | `max_keep` uniformly spaced indices | +/// +/// Arguments +/// ----------------- +/// * `n` – Total number of points. +/// * `max_keep` – Maximum number of indices to return. +/// +/// Return +/// ---------- +/// Indices in **strictly ascending** order. +pub(crate) fn downsample_uniform_with_edges(n: usize, max_keep: usize) -> Vec { + match n { + 0 => vec![], + _ if max_keep >= n => (0..n).collect(), + _ if max_keep <= 3 => vec![0, n / 2, n - 1], + _ => (0..max_keep) + .map(|i| i * (n - 1) / (max_keep - 1)) + .collect(), + } +} + +// --------------------------------------------------------------------------- +// Feasible window for a fixed anchor +// --------------------------------------------------------------------------- + +/// Valid range of `last` indices for a fixed anchor `i`. +/// +/// `lo` is the smallest index `k > i` with $t_k - t_i \geq dt\_min$. +/// `hi` is the largest index `k > i` with $t_k - t_i \leq dt\_max$. +/// +/// The window is **empty** when `lo > hi` or no such `k` exists. +#[derive(Debug, Clone, Copy)] +struct LastWindow { + lo: usize, + hi: usize, +} + +impl LastWindow { + fn compute(anchor: usize, epochs: &[f64], dt_min: f64, dt_max: f64) -> Self { + let n = epochs.len(); + let t0 = epochs[anchor]; + + let mut lo = anchor + 2; + while lo < n && epochs[lo] - t0 < dt_min { + lo += 1; + } + + let mut hi = lo.saturating_sub(1).max(anchor + 1); + while hi + 1 < n && epochs[hi + 1] - t0 <= dt_max { + hi += 1; + } + + Self { lo, hi } + } + + fn is_empty(&self, anchor: usize, n: usize) -> bool { + self.lo >= n || self.lo > self.hi || self.hi <= anchor + 1 + } +} + +// --------------------------------------------------------------------------- +// TripletIndexGenerator +// --------------------------------------------------------------------------- + +/// Lazy iterator over time-feasible IOD triplet indices `(anchor, middle, last)`. +/// +/// # Input contract +/// +/// The observation slice passed to [`from_observations`](Self::from_observations) +/// **must be sorted in ascending time order** before construction. +/// +/// # Index space +/// +/// Indices yielded by the iterator refer directly to positions in the +/// (downsampled) input slice — no remapping is needed. +/// +/// See the [module-level documentation](self) for the algorithm and usage. +pub struct TripletIndexGenerator { + /// Epochs of the reduced set (TT/MJD), extracted from the downsampled positions. + epochs: Vec, + + // --- iteration state --- + anchor: usize, + middle: usize, + last: usize, + window: LastWindow, + + n: usize, + dt_min: f64, + dt_max: f64, + + /// Remaining triplets allowed before the iterator stops (`usize::MAX` = no cap). + remaining: usize, +} + +impl TripletIndexGenerator { + /// Construct directly from a reduced epoch vector. + /// + /// `epochs` must be in **ascending** order. + /// + /// Arguments + /// ----------------- + /// * `epochs` – Reduced epochs in ascending order. + /// * `dt_min`, `dt_max` – Time-span bounds on `(anchor, last)`. + /// * `cap` – Maximum triplets to yield (`usize::MAX` for no limit). + pub fn new(epochs: Vec, dt_min: f64, dt_max: f64, cap: usize) -> Self { + let n = epochs.len(); + let window = if n >= 3 { + LastWindow::compute(0, &epochs, dt_min, dt_max) + } else { + LastWindow { lo: n, hi: 0 } + }; + + Self { + n, + epochs, + dt_min, + dt_max, + anchor: 0, + middle: 1, + last: window.lo.max(2), + window, + remaining: cap, + } + } + + /// Build from a time-sorted observation slice, with optional downsampling. + /// + /// The input slice **must already be sorted in ascending time order**. + /// Downsampling via [`downsample_uniform_with_edges`] is applied, always + /// preserving the first and last observations. + /// + /// Arguments + /// ----------------- + /// * `observations` – Time-sorted observation slice (ascending epoch). + /// * `dt_min`, `dt_max` – Time-span bounds on `(anchor, last)`. + /// * `max_reduced` – Downsampling cap (uniform with endpoints). + /// * `cap` – Maximum triplets to yield (`usize::MAX` for no limit). + pub fn from_observations( + observations: &[&Observation], + dt_min: f64, + dt_max: f64, + max_reduced: usize, + cap: usize, + ) -> Self { + let keep = downsample_uniform_with_edges(observations.len(), max_reduced); + let epochs: Vec = keep.iter().map(|&i| observations[i].mjd_tt()).collect(); + Self::new(epochs, dt_min, dt_max, cap) + } + + /// Reduced epochs (TT/MJD), aligned with the indices yielded by the iterator. + pub fn reduced_times(&self) -> &[f64] { + &self.epochs + } + + fn advance_anchor(&mut self) -> bool { + self.anchor += 1; + if self.anchor + 2 >= self.n { + return false; + } + self.window = LastWindow::compute(self.anchor, &self.epochs, self.dt_min, self.dt_max); + self.middle = self.anchor + 1; + self.last = self.window.lo.max(self.middle + 1); + true + } + + #[inline] + fn reset_last_for_middle(&mut self) { + self.last = self.window.lo.max(self.middle + 1); + } +} + +impl Iterator for TripletIndexGenerator { + type Item = (usize, usize, usize); + + fn next(&mut self) -> Option { + if self.remaining == 0 { + return None; + } + + loop { + if self.anchor + 2 >= self.n { + return None; + } + + if self.window.is_empty(self.anchor, self.n) { + if !self.advance_anchor() { + return None; + } + continue; + } + + if self.middle >= self.window.hi { + if !self.advance_anchor() { + return None; + } + continue; + } + + if self.last <= self.middle { + self.reset_last_for_middle(); + } + + if self.last > self.window.hi { + self.middle += 1; + self.reset_last_for_middle(); + continue; + } + + let triplet = (self.anchor, self.middle, self.last); + self.last += 1; + self.remaining -= 1; + return Some(triplet); + } + } +} + +#[cfg(test)] +mod triplet_generator_tests { + use super::*; + use proptest::prelude::*; + + // ----------------------------------------------------------------------- + // Helpers + // ----------------------------------------------------------------------- + + /// Build a generator directly from a sorted epoch slice (no observations needed). + fn gen_from_epochs(epochs: Vec, dt_min: f64, dt_max: f64) -> TripletIndexGenerator { + TripletIndexGenerator::new(epochs, dt_min, dt_max, usize::MAX) + } + + /// Collect all triplets and verify every invariant inline. + fn collect_and_validate( + epochs: &[f64], + dt_min: f64, + dt_max: f64, + ) -> Vec<(usize, usize, usize)> { + let gen = gen_from_epochs(epochs.to_vec(), dt_min, dt_max); + let mut out = Vec::new(); + for (i, j, k) in gen { + assert!(i < j, "first < middle violated: ({i},{j},{k})"); + assert!(j < k, "middle < last violated: ({i},{j},{k})"); + let span = epochs[k] - epochs[i]; + assert!( + span >= dt_min - 1e-12, + "span {span} < dt_min {dt_min}: ({i},{j},{k})" + ); + assert!( + span <= dt_max + 1e-12, + "span {span} > dt_max {dt_max}: ({i},{j},{k})" + ); + out.push((i, j, k)); + } + out + } + + /// Brute-force reference: all (i,j,k) with i Vec<(usize, usize, usize)> { + let n = epochs.len(); + let mut out = Vec::new(); + for i in 0..n { + for j in (i + 1)..n { + for k in (j + 1)..n { + let span = epochs[k] - epochs[i]; + if span >= dt_min - 1e-12 && span <= dt_max + 1e-12 { + out.push((i, j, k)); + } + } + } + } + out + } + + // ----------------------------------------------------------------------- + // downsample_uniform_with_edges_indices + // ----------------------------------------------------------------------- + + #[test] + fn downsample_empty() { + assert!(downsample_uniform_with_edges(0, 10).is_empty()); + } + + #[test] + fn downsample_no_op_when_max_ge_n() { + let result = downsample_uniform_with_edges(5, 10); + assert_eq!(result, vec![0, 1, 2, 3, 4]); + } + + #[test] + fn downsample_exact_n() { + let result = downsample_uniform_with_edges(5, 5); + assert_eq!(result, vec![0, 1, 2, 3, 4]); + } + + #[test] + fn downsample_max_keep_3() { + // Always returns [0, mid, n-1]. + let result = downsample_uniform_with_edges(9, 3); + assert_eq!(result, vec![0, 4, 8]); + } + + #[test] + fn downsample_max_keep_le_3_small_n() { + let result = downsample_uniform_with_edges(3, 2); + // Edge case: max_keep ≤ 3 branch → [0, mid, n-1] = [0, 1, 2] + assert_eq!(result[0], 0); + assert_eq!(*result.last().unwrap(), 2); + } + + #[test] + fn downsample_endpoints_always_present() { + for n in 4..=20 { + for max_keep in 3..=n { + let result = downsample_uniform_with_edges(n, max_keep); + assert_eq!( + result[0], 0, + "first endpoint missing for n={n} max={max_keep}" + ); + assert_eq!( + *result.last().unwrap(), + n - 1, + "last endpoint missing for n={n} max={max_keep}" + ); + } + } + } + + #[test] + fn downsample_length_respects_max_keep() { + for n in 4..=30 { + for max_keep in 3..n { + let result = downsample_uniform_with_edges(n, max_keep); + assert!( + result.len() <= max_keep, + "len={} > max_keep={max_keep} for n={n}", + result.len() + ); + } + } + } + + #[test] + fn downsample_strictly_increasing() { + let result = downsample_uniform_with_edges(100, 10); + for w in result.windows(2) { + assert!(w[0] < w[1], "not strictly increasing: {:?}", result); + } + } + + // ----------------------------------------------------------------------- + // TripletIndexGenerator — edge cases + // ----------------------------------------------------------------------- + + #[test] + fn generator_empty_on_fewer_than_3_obs() { + for n in 0..=2 { + let epochs: Vec = (0..n).map(|i| i as f64).collect(); + let triplets = collect_and_validate(&epochs, 0.0, 10.0); + assert!(triplets.is_empty(), "expected empty for n={n}"); + } + } + + #[test] + fn generator_empty_when_dt_min_gt_dt_max() { + let epochs = vec![0.0, 1.0, 2.0, 3.0]; + let triplets = collect_and_validate(&epochs, 5.0, 2.0); + assert!(triplets.is_empty()); + } + + #[test] + fn generator_empty_when_all_spans_below_dt_min() { + // All spans ≤ 2, dt_min = 10. + let epochs = vec![0.0, 1.0, 2.0, 3.0]; + let triplets = collect_and_validate(&epochs, 10.0, 100.0); + assert!(triplets.is_empty()); + } + + #[test] + fn generator_empty_when_all_spans_above_dt_max() { + // All spans ≥ 3, dt_max = 1. + let epochs = vec![0.0, 10.0, 20.0, 30.0]; + let triplets = collect_and_validate(&epochs, 0.0, 1.0); + assert!(triplets.is_empty()); + } + + #[test] + fn generator_single_feasible_triplet() { + // Only (0,1,2) has span 2.0 ∈ [2, 2]. + let epochs = vec![0.0, 1.0, 2.0]; + let triplets = collect_and_validate(&epochs, 2.0, 2.0); + assert_eq!(triplets, vec![(0, 1, 2)]); + } + + #[test] + fn generator_matches_brute_force_small() { + let epochs = vec![0.0, 1.0, 2.0, 3.0, 4.0]; + let dt_min = 1.5; + let dt_max = 3.5; + + let mut got = collect_and_validate(&epochs, dt_min, dt_max); + let mut expected = brute_force(&epochs, dt_min, dt_max); + + got.sort(); + expected.sort(); + assert_eq!(got, expected); + } + + #[test] + fn generator_matches_brute_force_no_constraint() { + // dt_min = 0, dt_max = ∞ → all (i = (0..6).map(|i| i as f64).collect(); + + let mut got = collect_and_validate(&epochs, 0.0, f64::MAX); + let mut expected = brute_force(&epochs, 0.0, f64::MAX); + + got.sort(); + expected.sort(); + assert_eq!(got, expected); + } + + #[test] + fn generator_matches_brute_force_equal_spacing() { + let epochs: Vec = (0..7).map(|i| i as f64 * 2.0).collect(); + let dt_min = 3.0; + let dt_max = 9.0; + + let mut got = collect_and_validate(&epochs, dt_min, dt_max); + let mut expected = brute_force(&epochs, dt_min, dt_max); + + got.sort(); + expected.sort(); + assert_eq!(got, expected); + } + + #[test] + fn generator_no_duplicates() { + let epochs: Vec = (0..8).map(|i| i as f64).collect(); + let mut triplets = collect_and_validate(&epochs, 1.0, 6.0); + triplets.sort(); + triplets.dedup(); + let all = collect_and_validate(&epochs, 1.0, 6.0); + assert_eq!(triplets.len(), all.len(), "duplicates detected"); + } + + // ----------------------------------------------------------------------- + // max_triplets_to_yield cap + // ----------------------------------------------------------------------- + + #[test] + fn generator_respects_max_triplets_cap() { + let epochs: Vec = (0..10).map(|i| i as f64).collect(); + let cap = 5; + let gen = TripletIndexGenerator::new(epochs, 1.0, 20.0, cap); + let count = gen.count(); + assert_eq!(count, cap); + } + + #[test] + fn generator_cap_zero_yields_nothing() { + let epochs = vec![0.0, 1.0, 2.0, 3.0]; + let gen = TripletIndexGenerator::new(epochs, 0.0, 10.0, 0); + assert_eq!(gen.count(), 0); + } + + // ----------------------------------------------------------------------- + // reduced_to_original mapping + // ----------------------------------------------------------------------- + + #[test] + fn reduced_times_match_input_epochs() { + let epochs: Vec = (0..5).map(|i| i as f64).collect(); + let gen = TripletIndexGenerator::new(epochs.clone(), 0.0, 10.0, usize::MAX); + assert_eq!(gen.reduced_times(), epochs.as_slice()); + } + + #[test] + fn reduced_times_aligned_with_mapping() { + let epochs = vec![0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]; + let gen = TripletIndexGenerator::new(epochs.clone(), 0.0, 20.0, usize::MAX); + + // reduced_times length must match the number of epochs provided. + assert_eq!(gen.reduced_times().len(), epochs.len()); + } + + // ----------------------------------------------------------------------- + // EpochSortedIndices + // ----------------------------------------------------------------------- + + // (tested indirectly through from_observations; direct access is private) + + // ----------------------------------------------------------------------- + // Proptest: invariants hold for random inputs + // ----------------------------------------------------------------------- + + proptest! { + /// For random sorted epoch vectors and random dt windows, every yielded + /// triplet must satisfy i < j < k and dt_min ≤ t[k]-t[i] ≤ dt_max. + #[test] + fn prop_all_invariants_hold( + // Generate 3..=12 strictly increasing epochs starting near 0. + n in 3usize..=12, + steps in prop::collection::vec(0.1f64..5.0, 11), + dt_min in 0.0f64..10.0, + dt_range in 0.0f64..20.0, + ) { + let dt_max = dt_min + dt_range; + // Build epochs as cumulative sum of steps (strictly increasing). + let mut epochs = vec![0.0f64]; + for &s in steps.iter().take(n - 1) { + epochs.push(epochs.last().unwrap() + s); + } + + let _triplets = collect_and_validate(&epochs, dt_min, dt_max); + // collect_and_validate asserts invariants inline. + } + + /// Generator output matches brute-force for small random inputs. + #[test] + fn prop_matches_brute_force( + n in 3usize..=8, + steps in prop::collection::vec(0.5f64..3.0, 7), + dt_min in 0.0f64..5.0, + dt_range in 0.0f64..10.0, + ) { + let dt_max = dt_min + dt_range; + let mut epochs = vec![0.0f64]; + for &s in steps.iter().take(n - 1) { + epochs.push(epochs.last().unwrap() + s); + } + + let mut got = collect_and_validate(&epochs, dt_min, dt_max); + let mut expected = brute_force(&epochs, dt_min, dt_max); + got.sort(); + expected.sort(); + prop_assert_eq!(got, expected); + } + + /// No duplicate triplets regardless of input. + #[test] + fn prop_no_duplicates( + n in 3usize..=10, + steps in prop::collection::vec(0.1f64..4.0, 9), + dt_min in 0.0f64..5.0, + dt_range in 0.0f64..15.0, + ) { + let dt_max = dt_min + dt_range; + let mut epochs = vec![0.0f64]; + for &s in steps.iter().take(n - 1) { + epochs.push(epochs.last().unwrap() + s); + } + + let mut triplets = collect_and_validate(&epochs, dt_min, dt_max); + let total = triplets.len(); + triplets.sort(); + triplets.dedup(); + prop_assert_eq!(triplets.len(), total, "duplicate triplets found"); + } + + /// Cap is always respected. + #[test] + fn prop_cap_respected( + n in 3usize..=12, + steps in prop::collection::vec(0.5f64..3.0, 11), + cap in 0usize..=20, + ) { + let mut epochs = vec![0.0f64]; + for &s in steps.iter().take(n - 1) { + epochs.push(epochs.last().unwrap() + s); + } + let gen = TripletIndexGenerator::new( + epochs, 0.0, f64::MAX, cap, + ); + prop_assert!(gen.count() <= cap); + } + + /// downsample always returns endpoints and respects the length cap. + #[test] + fn prop_downsample_endpoints_and_length( + n in 1usize..=50, + max_keep in 3usize..=50, + ) { + let result = downsample_uniform_with_edges(n, max_keep); + prop_assert!(result.len() <= max_keep.min(n).max(3)); + if n >= 1 { + prop_assert_eq!(result[0], 0); + prop_assert_eq!(*result.last().unwrap(), n - 1); + } + } + + /// downsample output is strictly increasing. + #[test] + fn prop_downsample_strictly_increasing( + n in 2usize..=50, + max_keep in 3usize..=50, + ) { + let result = downsample_uniform_with_edges(n, max_keep); + for w in result.windows(2) { + prop_assert!(w[0] < w[1]); + } + } + } +} diff --git a/src/observations/triplets_iod.rs b/src/initial_orbit_determination/triplet_generation/mod.rs similarity index 54% rename from src/observations/triplets_iod.rs rename to src/initial_orbit_determination/triplet_generation/mod.rs index 8f53111..b5a4110 100644 --- a/src/observations/triplets_iod.rs +++ b/src/initial_orbit_determination/triplet_generation/mod.rs @@ -72,14 +72,18 @@ //! - [`triplet_weight`] – Spacing-based scoring rule. //! - [`GaussObs`] – Triplet container consumed by the Gauss IOD solver. //! - [`crate::observations::observations_ext::ObservationsExt::compute_triplets`] – Higher-level wrapper. + +pub mod index_generator; + use nalgebra::{Matrix3, Vector3}; +use photom::observation_dataset::observation::Observation; use std::cmp::Ordering; use std::collections::BinaryHeap; -use crate::constants::Observations; +use crate::cache::OutfitCache; use crate::initial_orbit_determination::gauss::GaussObs; -use crate::observations::triplets_generator::TripletIndexGenerator; -use crate::observations::Observation; +use crate::initial_orbit_determination::triplet_generation::index_generator::TripletIndexGenerator; +use crate::IODParams; /// Internal structure holding a weighted observation triplet during selection. /// @@ -269,62 +273,6 @@ fn s_gap(dt: f64, inv_dtw: f64) -> f64 { } } -/// Downsample observation indices while preserving endpoints and temporal coverage. -/// -/// If the input has more than `max_keep` points, this routine selects a subset of indices -/// **uniformly in time** while always including the **first** and **last** observation. -/// This reduces the `O(n³)` triplet explosion without losing global time-span information. -/// -/// Behavior -/// ----------------- -/// * If `n == 0`: returns `[]`. -/// * If `max_keep >= n`: returns all indices `0..n`. -/// * If `max_keep <= 3`: returns `[0, mid, n-1]` (with `mid = n/2`). -/// For `n < 3`, indices may repeat (callers should handle deduplication if needed). -/// * Otherwise: returns `max_keep` indices distributed uniformly between `1` and `n-2`, -/// plus the endpoints `0` and `n-1`. -/// -/// Arguments -/// ----------------- -/// * `n` – Total number of observations. -/// * `max_keep` – Maximum number of indices to return. -/// -/// Return -/// ---------- -/// * A `Vec` with the selected indices in **ascending** order. -/// -/// Remarks -/// ------------- -/// * Complexity: **O(max_keep)** after the trivial cases. -/// * The selection is **index-uniform** over the span `[1, n-2]`; if strictly -/// time-uniform selection is required, pre-sort observations by time first -/// (as done in [`generate_triplets`]). -/// -/// See also -/// ------------ -/// * [`generate_triplets`] – Uses this function before triplet enumeration. -pub(crate) fn downsample_uniform_with_edges_indices(n: usize, max_keep: usize) -> Vec { - match n { - 0 => Vec::new(), - _ if max_keep <= 3 => { - let mid = n / 2; - vec![0, mid, n - 1] - } - _ if max_keep >= n => (0..n).collect(), - _ => { - let slots = max_keep - 2; - std::iter::once(0) - .chain((0..slots).map(move |i| { - let fraction = (i + 1) as f64 / (slots + 1) as f64; - // distribute indices uniformly between 1 and n-2 - 1 + (fraction * (n - 2) as f64).floor() as usize - })) - .chain(std::iter::once(n - 1)) - .collect() - } - } -} - /// Generate and select **best-K** triplets of astrometric observations /// for Gauss Initial Orbit Determination (IOD), using a **lazy index stream** /// and a bounded **max-heap** on a spacing weight. @@ -334,269 +282,265 @@ pub(crate) fn downsample_uniform_with_edges_indices(n: usize, max_keep: usize) - /// This routine constructs good candidate triplets `(first, middle, last)` as inputs /// to the **Gauss method** while avoiding the `O(n³)` blow-up: /// -/// 1. **Sort & downsample (in `TripletIndexGenerator`)** – Observations are sorted by epoch -/// and uniformly thinned (keeping endpoints) to at most `max_obs_for_triplets`. +/// 1. **Downsample (in `TripletIndexGenerator`)** – Observations are uniformly thinned +/// (keeping endpoints) to at most `max_obs_for_triplets`. The input slice is assumed +/// to be **already sorted by ascending epoch**. /// 2. **Time-feasible enumeration (lazy)** – Indices `(i, j, k)` are streamed by /// `TripletIndexGenerator`, constrained by: /// `dt_min ≤ t[k] − t[i] ≤ dt_max` with `i < j < k`. /// 3. **Weight scoring** – Each feasible triplet receives a weight via [`triplet_weight`], /// favoring near-uniform spacing around `optimal_interval_time`. /// 4. **Best-K selection** – A bounded **max-heap** retains only the `max_triplet` -/// lowest-weight candidates (the heap’s `peek()` is the current **worst**). +/// lowest-weight candidates (the heap's `peek()` is the current **worst**). /// 5. **Materialization** – Only for the selected indices, we re-borrow `observations` -/// immutably and build [`GaussObs`] with precomputed observer heliocentric columns -/// (via [`Observation::get_observer_helio_position`]). +/// immutably and build [`GaussObs`] with precomputed observer heliocentric columns. /// -/// Design notes -/// ----------------- -/// * Enumeration and scoring happen on **reduced indices** (owned by the generator), +/// # Design notes +/// +/// - The input slice must be **sorted in ascending time order** before this call. +/// - Enumeration and scoring happen on reduced epoch indices owned by the generator, /// so there are **no overlapping borrows** of `observations`. -/// * The function avoids cloning the generator’s internal buffers (times, mapping); -/// we read them through short-lived immutable borrows between `next()` calls. -/// * The final `Vec` is **sorted by increasing weight** (best first). +/// - The final `Vec` is **sorted by increasing weight** (best first). /// -/// Arguments -/// ----------------- -/// * `observations` – Mutable set of astrometric observations; epochs are sorted **in-place**. -/// * `dt_min` – Minimum allowed time span (same units as `Observation::time`) between first and last. -/// * `dt_max` – Maximum allowed time span between first and last. -/// * `optimal_interval_time` – Target per-gap spacing used by [`triplet_weight`]. -/// * `max_obs_for_triplets` – Downsampling cap (uniform with edges). -/// * `max_triplet` – Number `K` of best triplets to return (heap capacity). +/// # Arguments /// -/// Return -/// ---------- -/// * A `Vec` of length `≤ max_triplet`, sorted by **ascending** heuristic weight. +/// - `observations` – Time-sorted observation slice (ascending epoch). +/// - `cache` – Precomputed heliocentric observer positions. +/// - `params` – IOD parameters controlling time bounds, downsampling cap, +/// optimal spacing, and the best-K limit. /// -/// Complexity -/// ----------------- -/// * Enumeration: typically ~`O(n²)` thanks to the per-anchor time window in +/// # Return +/// +/// - A `Vec` of length `≤ max_triplet`, sorted by **ascending** heuristic weight. +/// +/// # Complexity +/// +/// * Enumeration: typically ~$O(n^2)$ thanks to the per-anchor time window in /// [`TripletIndexGenerator`]. -/// * Selection: `O(n log K)` due to the bounded heap. -/// * Space: `O(1)` per yielded triplet during enumeration; only the final `K` are materialized. +/// * Selection: $O(n \log K)$ due to the bounded heap. +/// * Space: $O(1)$ per yielded triplet during enumeration; only the final `K` are materialized. +/// +/// # See also /// -/// See also -/// ------------ /// * [`TripletIndexGenerator`] – Streams time-feasible reduced indices lazily. /// * [`triplet_weight`] – Heuristic favoring evenly spaced triplets around a target gap. /// * [`GaussObs::realizations_iter`] – Lazy Monte-Carlo perturbations per triplet. -/// * [`ObservationsExt::compute_triplets`](crate::observations::observations_ext::ObservationsExt::compute_triplets) – Typical high-level wrapper. pub fn generate_triplets( - observations: &mut Observations, - dt_min: f64, - dt_max: f64, - optimal_interval_time: f64, - max_obs_for_triplets: usize, - max_triplet: u32, + observations: &[&Observation], + cache: &OutfitCache, + params: &IODParams, ) -> Vec { - if max_triplet == 0 { + if params.max_triplets == 0 || observations.len() < 3 { return Vec::new(); } - // --- Phase 1: enumerate feasible reduced indices & keep best-K by weight (no &Observation borrows). + // --- Phase 1: build the reduced-index stream and score all feasible triplets. let mut index_gen = TripletIndexGenerator::from_observations( observations, - dt_min, - dt_max, - max_obs_for_triplets, - usize::MAX, // scan all feasible triplets; the heap does best-K filtering + params.dt_min, + params.dt_max_triplet, + params.max_obs_for_triplets, + usize::MAX, ); - let k_cap = max_triplet as usize; - let mut heap: BinaryHeap = BinaryHeap::with_capacity(k_cap.saturating_add(1)); + let k_cap = params.max_triplets as usize; + let inv_dtw = params.optimal_interval_time.recip(); + let best_k = collect_best_k_triplets(&mut index_gen, k_cap, inv_dtw); - // Bounded push: maintain the K smallest weights in a BinaryHeap (max-heap). - let mut push_best_k = |cand: WeightedTriplet| { - if !cand.weight.is_finite() { - return; // guard against NaN/Inf + // --- Phase 2: materialize GaussObs for the selected indices. + // Indices in WeightedTriplet refer directly into the downsampled view of + // `observations` — no remapping is needed. + best_k + .into_iter() + .map(|wt| build_gauss_obs(cache, observations, wt)) + .collect() +} + +/// Consume the triplet stream and retain the `max_triplets` best candidates by ascending weight. +/// +/// Uses a bounded max-heap: when the heap is full, a new candidate replaces the +/// current worst only if its weight is strictly smaller. +/// +/// Returns candidates sorted by ascending weight. +fn collect_best_k_triplets( + gen: &mut TripletIndexGenerator, + max_triplets: usize, + inv_optimal_interval: f64, +) -> Vec { + let mut heap: BinaryHeap = + BinaryHeap::with_capacity(max_triplets.saturating_add(1)); + + while let Some((first, middle, last)) = gen.next() { + let times = gen.reduced_times(); + let weight = triplet_weight_with_inv( + times[first], + times[middle], + times[last], + inv_optimal_interval, + ); + + if !weight.is_finite() { + continue; } - if heap.len() < k_cap { - heap.push(cand); - } else if let Some(worst) = heap.peek() { - if cand.weight < worst.weight { - heap.pop(); - heap.push(cand); - } + + if heap.len() < max_triplets { + heap.push(WeightedTriplet { + weight, + first_idx: first, + middle_idx: middle, + last_idx: last, + }); + } else if heap.peek().map_or(false, |worst| weight < worst.weight) { + heap.pop(); + heap.push(WeightedTriplet { + weight, + first_idx: first, + middle_idx: middle, + last_idx: last, + }); } - }; - - // Consume the reduced-index stream. After each `next()`, take a short immutable - // borrow of the times to compute the weight (no overlap with the next `next()`). - - let inv_dtw = optimal_interval_time.recip(); // precompute once - while let Some((i, j, k)) = index_gen.next() { - let times = index_gen.reduced_times(); - let w = triplet_weight_with_inv(times[i], times[j], times[k], inv_dtw); - push_best_k(WeightedTriplet { - weight: w, - first_idx: i, - middle_idx: j, - last_idx: k, - }); } - // Best-K by ascending weight. - let mut best_reduced = heap.into_sorted_vec(); - best_reduced.sort_by(|a, b| a.weight.partial_cmp(&b.weight).unwrap()); // defensive - - // --- Phase 2: materialize GaussObs for the selected indices (immutable borrows now safe). - let mapping = index_gen.selected_original_indices(); + // Max-heap → ascending weight order. + let mut result = heap.into_vec(); + result.sort_unstable_by(|a, b| a.weight.partial_cmp(&b.weight).unwrap_or(Ordering::Equal)); + result +} - best_reduced - .into_iter() - .map(|wt| { - let (i, j, k) = (wt.first_idx, wt.middle_idx, wt.last_idx); - - // reduced → original indices - let oi = mapping[i]; - let oj = mapping[j]; - let ok = mapping[k]; - - // Immutable borrows of the original observations occur only here. - let o1: &Observation = &observations[oi]; - let o2: &Observation = &observations[oj]; - let o3: &Observation = &observations[ok]; - - // Observer 3×3 matrix (columns = heliocentric observer positions at each epoch). - let observer_matrix: Matrix3 = Matrix3::from_columns(&[ - o1.get_observer_helio_position(), - o2.get_observer_helio_position(), - o3.get_observer_helio_position(), - ]); - - GaussObs::with_observer_position( - Vector3::new(oi, oj, ok), - Vector3::new(o1.ra, o2.ra, o3.ra), - Vector3::new(o1.dec, o2.dec, o3.dec), - Vector3::new(o1.time, o2.time, o3.time), - observer_matrix, - ) - }) - .collect() +/// Materialize a single [`GaussObs`] from a [`WeightedTriplet`]. +/// +/// Indices in `wt` map directly into `observations` — no remapping is needed +/// since [`TripletIndexGenerator`] works on the input slice as-is. +fn build_gauss_obs( + cache: &OutfitCache, + observations: &[&Observation], + wt: WeightedTriplet, +) -> GaussObs { + let o1 = &observations[wt.first_idx]; + let o2 = &observations[wt.middle_idx]; + let o3 = &observations[wt.last_idx]; + + let observer_matrix = Matrix3::from_columns(&[ + *cache.get_helio_position(o1.index()), + *cache.get_helio_position(o2.index()), + *cache.get_helio_position(o3.index()), + ]); + + let (o1_ra, o1_dec) = (o1.equ_coord().ra, o1.equ_coord().dec); + let (o2_ra, o2_dec) = (o2.equ_coord().ra, o2.equ_coord().dec); + let (o3_ra, o3_dec) = (o3.equ_coord().ra, o3.equ_coord().dec); + + GaussObs::with_observer_position( + Vector3::new(wt.first_idx, wt.middle_idx, wt.last_idx), + Vector3::new(o1_ra, o2_ra, o3_ra), + Vector3::new(o1_dec, o2_dec, o3_dec), + Vector3::new(o1.mjd_tt(), o2.mjd_tt(), o3.mjd_tt()), + observer_matrix.map(|x| x.into_inner()), + ) } #[cfg(test)] mod triplets_iod_tests { - - #[cfg(feature = "jpl-download")] - use approx::assert_relative_eq; - use super::*; - #[cfg(feature = "jpl-download")] - pub(crate) fn assert_gauss_obs_approx_eq(a: &GaussObs, b: &GaussObs, tol: f64) { - assert_eq!(a.idx_obs, b.idx_obs); - assert_relative_eq!(a.ra, b.ra, max_relative = tol); - assert_relative_eq!(a.dec, b.dec, max_relative = tol); - assert_relative_eq!(a.time, b.time, max_relative = tol); - } - #[test] - #[cfg(feature = "jpl-download")] fn test_compute_triplets() { - use camino::Utf8Path; + use crate::cache::OutfitCache; + use crate::test_fixture::{DATASET_2015AB, JPL_EPHEM_HORIZON, UT1_PROVIDER}; + use crate::IODParams; + use photom::observer::error_model::{ModelCorrection, ObsErrorModel}; + + // The error model must be set before building the cache. + let dataset = DATASET_2015AB + .clone() + .with_error_model(ObsErrorModel::FCCT14) + .apply_batch_rms_correction(30.0); + + // Build the cache from the real 2015AB dataset. + let cache = OutfitCache::build(&dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + // Pick a trajectory with enough observations. + let traj = dataset + .materialize_trajectory("K09R05F") + .unwrap() + .collect_into_vec(); + + assert!( + traj.len() >= 3, + "trajectory must have at least 3 observations" + ); - use crate::{ - trajectories::trajectory_file::TrajectoryFile, unit_test_global::OUTFIT_HORIZON_TEST, - TrajectorySet, + let params = IODParams { + dt_min: 0.03, + dt_max_triplet: 150.0, + optimal_interval_time: 20.0, + max_obs_for_triplets: traj.len(), + max_triplets: 10, + ..Default::default() }; - let mut env_state = OUTFIT_HORIZON_TEST.0.clone(); - let mut traj_set = - TrajectorySet::new_from_80col(&mut env_state, Utf8Path::new("tests/data/2015AB.obs")); - - let traj_number = crate::constants::ObjectNumber::String("K09R05F".into()); - let traj_len = traj_set - .get(&traj_number) - .expect("Failed to get trajectory") - .len(); - - let traj_mut = traj_set - .get_mut(&traj_number) - .expect("Failed to get trajectory"); + let triplets = generate_triplets(&traj, &cache, ¶ms); - let triplets = generate_triplets(traj_mut, 0.03, 150.0, 20.0, traj_len, 10); + // We should get at least one triplet back. + assert!(!triplets.is_empty(), "expected at least one triplet"); - assert_eq!( + // No more than max_triplets. + assert!( + triplets.len() <= params.max_triplets as usize, + "got {} triplets, expected ≤ {}", triplets.len(), - 10, - "Expected 10 triplets, got {}", - triplets.len() + params.max_triplets ); - let expected_triplets = GaussObs { - idx_obs: [[23, 24, 33]].into(), - ra: [[1.6893715963476699, 1.689861452091063, 1.7527345385664372]].into(), - dec: [[1.082468037385525, 0.9436790189346231, 0.8273762407899986]].into(), - time: [[57028.479297592596, 57049.2318575926, 57063.97711759259]].into(), - observer_helio_position: [ - [-0.2645666171486676, 0.8689351643673471, 0.3766996211112465], - [-0.5889735526502539, 0.7240117187952059, 0.3138734206791042], - [-0.7743874438017259, 0.5612884709246775, 0.2433497107566823], - ] - .into(), - }; - - assert_gauss_obs_approx_eq(&triplets[0], &expected_triplets, 1e-12); - - let expected_triplet = GaussObs { - idx_obs: [[21, 25, 33]].into(), - ra: [[1.6894680985108947, 1.6898894500811472, 1.7527345385664372]].into(), - dec: [[1.0825984522657437, 0.9435805047946215, 0.8273762407899986]].into(), - time: [[57028.45404759259, 57049.245147592585, 57063.97711759259]].into(), - observer_helio_position: [ - [-0.26413563361674103, 0.8690466209095019, 0.3767466856686271], - [-0.5891631852172257, 0.7238872516832191, 0.3138186516545291], - [-0.7743874438017259, 0.5612884709246775, 0.2433497107566823], - ] - .into(), - }; + // Triplets must be sorted by ascending weight (best first). + // We verify this by re-computing weights and checking order. + for window in triplets.windows(2) { + let t1 = &window[0].time; + let t2 = &window[1].time; + let w1 = triplet_weight(t1[0], t1[1], t1[2], params.optimal_interval_time); + let w2 = triplet_weight(t2[0], t2[1], t2[2], params.optimal_interval_time); + assert!( + w1 <= w2 + 1e-12, + "triplets not sorted by ascending weight: w1={w1} > w2={w2}" + ); + } - assert_gauss_obs_approx_eq(&triplets[9], &expected_triplet, 1e-12); + // Each triplet's indices must be strictly increasing. + for t in &triplets { + assert!( + t.idx_obs[0] < t.idx_obs[1] && t.idx_obs[1] < t.idx_obs[2], + "triplet indices not strictly increasing: {:?}", + t.idx_obs + ); + } } mod downsampling_observations_tests { - use nalgebra::Vector3; - - use super::*; - - fn make_obs(n: usize) -> Observations { - (0..n) - .map(|i| Observation { - observer: 0, - ra: 0.0, - dec: 0.0, - error_ra: 0.0, - error_dec: 0.0, - time: i as f64, - observer_earth_position: Vector3::zeros(), - observer_helio_position: Vector3::zeros(), - }) - .collect() - } + + use crate::initial_orbit_determination::triplet_generation::index_generator::downsample_uniform_with_edges; #[test] fn returns_all_when_max_keep_ge_n() { let n = 5; - let indices = downsample_uniform_with_edges_indices(n, 5); + let indices = downsample_uniform_with_edges(n, 5); assert_eq!(indices, vec![0, 1, 2, 3, 4]); - let indices = downsample_uniform_with_edges_indices(n, 10); + let indices = downsample_uniform_with_edges(n, 10); assert_eq!(indices, vec![0, 1, 2, 3, 4]); } #[test] fn empty_input_returns_empty() { - assert!(downsample_uniform_with_edges_indices(0, 0).is_empty()); - assert!(downsample_uniform_with_edges_indices(0, 10).is_empty()); + assert!(downsample_uniform_with_edges(0, 0).is_empty()); + assert!(downsample_uniform_with_edges(0, 10).is_empty()); } #[test] fn max_keep_less_than_three_returns_first_middle_last() { let n = 10; let mid = n / 2; - for max_keep in [0, 1, 2] { - let indices = downsample_uniform_with_edges_indices(n, max_keep); + for max_keep in [1, 2, 3] { + let indices = downsample_uniform_with_edges(n, max_keep); assert_eq!(indices, vec![0, mid, n - 1]); } } @@ -604,11 +548,11 @@ mod triplets_iod_tests { #[test] fn max_keep_three_exactly_returns_first_middle_last() { let n = 10; - let indices = downsample_uniform_with_edges_indices(n, 3); + let indices = downsample_uniform_with_edges(n, 3); assert_eq!(indices, vec![0, n / 2, n - 1]); let n = 3; - let indices = downsample_uniform_with_edges_indices(n, 3); + let indices = downsample_uniform_with_edges(n, 3); assert_eq!(indices, vec![0, 1, 2]); } @@ -616,13 +560,13 @@ mod triplets_iod_tests { fn downsampling_uniformity_for_general_case() { let n = 10; let max_keep = 5; - let indices = downsample_uniform_with_edges_indices(n, max_keep); + let indices = downsample_uniform_with_edges(n, max_keep); assert_eq!(indices.len(), max_keep); assert_eq!(indices.first().unwrap(), &0); assert_eq!(indices.last().unwrap(), &(n - 1)); - // Indices doivent être strictement croissants + // Indices must be strictly increasing assert!(indices.windows(2).all(|w| w[1] > w[0])); } @@ -630,22 +574,11 @@ mod triplets_iod_tests { fn works_with_large_data() { let n = 1000; let max_keep = 100; - let indices = downsample_uniform_with_edges_indices(n, max_keep); + let indices = downsample_uniform_with_edges(n, max_keep); assert_eq!(indices.len(), max_keep); assert_eq!(indices.first().unwrap(), &0); assert_eq!(indices.last().unwrap(), &(n - 1)); } - - #[test] - fn indices_match_observations() { - let obs = make_obs(10); - let max_keep = 5; - let indices = downsample_uniform_with_edges_indices(obs.len(), max_keep); - - // Vérifie que les indices correspondent bien aux temps dans obs - let times: Vec<_> = indices.iter().map(|&i| obs[i].time).collect(); - assert!(times.windows(2).all(|w| w[1] > w[0])); - } } } diff --git a/src/jpl_ephem/download_jpl_file.rs b/src/jpl_ephem/download_jpl_file.rs index e14641e..8e14321 100644 --- a/src/jpl_ephem/download_jpl_file.rs +++ b/src/jpl_ephem/download_jpl_file.rs @@ -43,9 +43,7 @@ use camino::{Utf8Path, Utf8PathBuf}; use directories::BaseDirs; use std::{fs, str::FromStr}; -#[cfg(feature = "jpl-download")] use tokio::{fs::File, io::AsyncWriteExt}; -#[cfg(feature = "jpl-download")] use tokio_stream::StreamExt; use super::{horizon::horizon_version::JPLHorizonVersion, naif::naif_version::NaifVersion}; @@ -139,7 +137,6 @@ impl EphemFileSource { /// See also /// -------- /// * [`EphemFileSource::get_version_url`] - #[cfg(feature = "jpl-download")] fn get_baseurl(&self) -> &str { match self { EphemFileSource::JPLHorizon(_) => "https://ssd.jpl.nasa.gov/ftp/eph/planets/Linux/", @@ -157,7 +154,6 @@ impl EphemFileSource { /// -------- /// * [`JPLHorizonVersion::get_filename`] /// * [`NaifVersion::get_filename`] - #[cfg(feature = "jpl-download")] pub fn get_version_url(&self) -> String { let base_url = self.get_baseurl(); match self { @@ -210,7 +206,6 @@ impl EphemFileSource { /// See also /// -------- /// * [`EphemFileSource::get_version_url`] — Compose the URL for a versioned file. -#[cfg(feature = "jpl-download")] pub async fn download_big_file(url: &str, path: &Utf8Path) -> Result<(), OutfitError> { let mut file = File::create(path).await?; println!("Downloading {url}..."); @@ -296,7 +291,6 @@ impl EphemFilePath { if local_file.exists() { Ok(local_file) } else { - #[cfg(feature = "jpl-download")] { let url = file_source.get_version_url(); @@ -308,10 +302,6 @@ impl EphemFilePath { Ok(local_file) } - #[cfg(not(feature = "jpl-download"))] - { - Err(OutfitError::JPLFileNotFound(local_file.path().to_string())) - } } } @@ -395,7 +385,6 @@ impl TryFrom for EphemFilePath { mod jpl_reader_test { /// If `jpl-download` is **not** enabled, requesting a missing file must error. #[test] - #[cfg(not(feature = "jpl-download"))] fn test_no_feature_download_jpl_ephem() { use super::*; let file_source = "naif:DE442".try_into().unwrap(); diff --git a/src/jpl_ephem/horizon/horizon_data.rs b/src/jpl_ephem/horizon/horizon_data.rs index b3bca4a..274300d 100644 --- a/src/jpl_ephem/horizon/horizon_data.rs +++ b/src/jpl_ephem/horizon/horizon_data.rs @@ -34,7 +34,7 @@ use nom::{ IResult, Parser, }; -use crate::{constants::MJD, jpl_ephem::download_jpl_file::EphemFilePath}; +use crate::{constants::MJDET, jpl_ephem::download_jpl_file::EphemFilePath}; use super::{ horizon_ids::HorizonID, horizon_records::HorizonRecord, horizon_version::JPLHorizonVersion, @@ -708,7 +708,7 @@ impl HorizonData { /// See also /// ------------ /// * [`HorizonData::get_record_horizon`] – retrieves the actual record for a body. - fn get_record_index(&self, et: MJD) -> (usize, f64) { + fn get_record_index(&self, et: MJDET) -> (usize, f64) { // ephem_start and ephem_end are in JD let (ephem_start, ephem_end, ephem_step) = ( self.header.start_period, @@ -760,7 +760,7 @@ impl HorizonData { /// See also /// ------------ /// * [`HorizonRecord::interpolate`] – evaluate Chebyshev polynomials. - fn get_record_horizon(&self, body: u8, et: MJD) -> Option<(&HorizonRecord, f64)> { + fn get_record_horizon(&self, body: u8, et: MJDET) -> Option<(&HorizonRecord, f64)> { let (nr, tau) = self.get_record_index(et); let records = &self.records[nr]; @@ -810,7 +810,7 @@ impl HorizonData { &self, target: HorizonID, center: HorizonID, - et: MJD, + et: MJDET, compute_velocity: bool, compute_acceleration: bool, ) -> InterpResult { @@ -850,17 +850,19 @@ impl HorizonData { #[cfg(test)] mod test_horizon_reader { - #[cfg(feature = "jpl-download")] use super::*; - #[cfg(feature = "jpl-download")] - use crate::unit_test_global::JPL_EPHEM_HORIZON; + use crate::test_fixture::JPL_EPHEM_HORIZON; + + fn get_horizon_data() -> HorizonData { + JPL_EPHEM_HORIZON.clone().try_into_horizon().unwrap() + } #[test] - #[cfg(feature = "jpl-download")] fn test_jpl_reader_from_horizon() { + let horizon_data = get_horizon_data(); assert_eq!( - JPL_EPHEM_HORIZON.header, + horizon_data.header, HorizonHeader { jpl_version: "DE440".to_string(), ipt: [ @@ -888,17 +890,15 @@ mod test_horizon_reader { } ); - assert_eq!(JPL_EPHEM_HORIZON.records.len(), 12556); + let horizon_data = get_horizon_data(); + assert_eq!(horizon_data.records.len(), 12556); assert_eq!( - JPL_EPHEM_HORIZON - .records - .iter() - .fold(0, |acc, x| acc + x.len()), + horizon_data.records.iter().fold(0, |acc, x| acc + x.len()), 150672 ); assert_eq!( - &JPL_EPHEM_HORIZON.records[0].get(&0).unwrap()[0], + &horizon_data.records[0].get(&0).unwrap()[0], &HorizonRecord { start_jd: 2287184.5, end_jd: 2287216.5, @@ -955,9 +955,9 @@ mod test_horizon_reader { } #[test] - #[cfg(feature = "jpl-download")] fn test_get_record_from_horizon() { - let (record, tau) = JPL_EPHEM_HORIZON + let horizon_data = get_horizon_data(); + let (record, tau) = horizon_data .get_record_horizon(4, 57028.479297592596) .unwrap(); @@ -1003,18 +1003,18 @@ mod test_horizon_reader { } #[test] - #[cfg(feature = "jpl-download")] fn test_get_record_index() { - let (index, tau) = JPL_EPHEM_HORIZON.get_record_index(57028.479297592596); + let horizon_data = get_horizon_data(); + let (index, tau) = horizon_data.get_record_index(57028.479297592596); assert_eq!(index, 5307); assert_eq!(tau, 0.6399780497686152); } #[test] - #[cfg(feature = "jpl-download")] fn test_interpolation_from_horizon() { - let (record, tau) = JPL_EPHEM_HORIZON + let horizon_data = get_horizon_data(); + let (record, tau) = horizon_data .get_record_horizon(10, 57028.479297592596) .unwrap(); @@ -1031,7 +1031,8 @@ mod test_horizon_reader { } ); - let (record, tau) = JPL_EPHEM_HORIZON + let horizon_data = get_horizon_data(); + let (record, tau) = horizon_data .get_record_horizon(10, 57_049.231_857_592_59) .unwrap(); @@ -1048,7 +1049,8 @@ mod test_horizon_reader { } ); - let (record, tau) = JPL_EPHEM_HORIZON + let horizon_data = get_horizon_data(); + let (record, tau) = horizon_data .get_record_horizon(10, 60781.51949044435) .unwrap(); let res = record.interpolate(tau, true, true, 2); @@ -1068,9 +1070,9 @@ mod test_horizon_reader { } #[test] - #[cfg(feature = "jpl-download")] fn test_target_center_interpolation() { - let interp = JPL_EPHEM_HORIZON.ephemeris( + let horizon_data = get_horizon_data(); + let interp = horizon_data.ephemeris( HorizonID::Earth, HorizonID::Sun, 60781.51949044435, @@ -1106,7 +1108,8 @@ mod test_horizon_reader { } ); - let interp = JPL_EPHEM_HORIZON.ephemeris( + let horizon_data = get_horizon_data(); + let interp = horizon_data.ephemeris( HorizonID::Mars, HorizonID::Sun, 60781.51949044435, @@ -1137,7 +1140,8 @@ mod test_horizon_reader { } ); - let interp = JPL_EPHEM_HORIZON.ephemeris( + let horizon_data = get_horizon_data(); + let interp = horizon_data.ephemeris( HorizonID::Earth, HorizonID::Sun, 52550.18467592593, diff --git a/src/jpl_ephem/mod.rs b/src/jpl_ephem/mod.rs index 31326b9..7e93071 100644 --- a/src/jpl_ephem/mod.rs +++ b/src/jpl_ephem/mod.rs @@ -168,4 +168,22 @@ impl JPLEphem { } } } + + pub fn try_into_horizon(self) -> Result { + match self { + JPLEphem::HorizonFile(horizon_data) => Ok(horizon_data), + _ => Err(OutfitError::InvalidJPLEphemFileSource( + "Expected a JPL Horizon source".to_string(), + )), + } + } + + pub fn try_into_naif(self) -> Result { + match self { + JPLEphem::NaifFile(naif_data) => Ok(naif_data), + _ => Err(OutfitError::InvalidJPLEphemFileSource( + "Expected a NAIF source".to_string(), + )), + } + } } diff --git a/src/jpl_ephem/naif/naif_data.rs b/src/jpl_ephem/naif/naif_data.rs index 4f2de84..1a7a2b0 100644 --- a/src/jpl_ephem/naif/naif_data.rs +++ b/src/jpl_ephem/naif/naif_data.rs @@ -277,23 +277,23 @@ impl NaifData { #[cfg(test)] mod test_naif_file { - #[cfg(feature = "jpl-download")] use super::*; - #[cfg(feature = "jpl-download")] use crate::jpl_ephem::naif::naif_ids::{ planet_bary::PlanetaryBary, solar_system_bary::SolarSystemBary, }; - #[cfg(feature = "jpl-download")] - use crate::unit_test_global::JPL_EPHEM_NAIF; - #[cfg(feature = "jpl-download")] + use crate::test_fixture::JPL_EPHEM_NAIF; use hifitime::Epoch; + fn get_naif_data() -> NaifData { + JPL_EPHEM_NAIF.clone().try_into_naif().unwrap() + } + #[test] - #[cfg(feature = "jpl-download")] fn test_jpl_reader_from_naif() { + let naif_data = get_naif_data(); assert_eq!( - JPL_EPHEM_NAIF.daf_header, + naif_data.daf_header, DAFHeader { idword: "DAF/SPK".to_string(), internal_filename: "NIO2SPK".to_string(), @@ -308,7 +308,7 @@ mod test_naif_file { ); assert_eq!( - JPL_EPHEM_NAIF.header, + naif_data.header, JPLEphemHeader { version: "DE440".to_string(), creation_date: "25 June 2020".to_string(), @@ -319,7 +319,7 @@ mod test_naif_file { } ); - let record_earth_sun = JPL_EPHEM_NAIF + let record_earth_sun = naif_data .get_records( NaifIds::PB(PlanetaryBary::EarthMoon), NaifIds::SSB(SolarSystemBary::SSB), @@ -412,12 +412,12 @@ mod test_naif_file { } #[test] - #[cfg(feature = "jpl-download")] fn test_get_record() { let date_str = "2024-04-10T12:30:45"; let epoch = Epoch::from_gregorian_str(date_str).unwrap(); - let record = JPL_EPHEM_NAIF + let naif_data = get_naif_data(); + let record = naif_data .get_record( NaifIds::PB(PlanetaryBary::EarthMoon), NaifIds::SSB(SolarSystemBary::SSB), @@ -480,11 +480,10 @@ mod test_naif_file { } #[test] - #[cfg(feature = "jpl-download")] fn test_jpl_ephemeris() { let epoch1 = Epoch::from_mjd_in_time_scale(57028.479297592596, hifitime::TimeScale::TT); - let interp = JPL_EPHEM_NAIF.ephemeris( + let interp = get_naif_data().ephemeris( NaifIds::PB(PlanetaryBary::EarthMoon), NaifIds::SSB(SolarSystemBary::SSB), epoch1.to_et_seconds(), @@ -512,7 +511,7 @@ mod test_naif_file { ); let epoch2 = Epoch::from_mjd_in_time_scale(57_049.231_857_592_59, hifitime::TimeScale::TT); - let interp = JPL_EPHEM_NAIF.ephemeris( + let interp = get_naif_data().ephemeris( NaifIds::PB(PlanetaryBary::EarthMoon), NaifIds::SSB(SolarSystemBary::SSB), epoch2.to_et_seconds(), diff --git a/src/lib.rs b/src/lib.rs index 3e3608c..e3205f8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -258,12 +258,6 @@ pub mod conversion; /// Earth orientation parameters and related corrections (nutation, precession). pub mod earth_orientation; -/// Environment state: ephemerides, dynamical models, configuration. -pub mod env_state; - -/// Error models used for weighting astrometric residuals. -pub mod error_models; - /// Initial Orbit Determination algorithms (Gauss method). pub mod initial_orbit_determination; @@ -276,21 +270,9 @@ pub mod kepler; /// Orbital types and conversions between them. pub mod orbit_type; -/// Observation handling (RA, DEC, times). -pub mod observations; - -/// Trajectory management and file I/O. -pub mod trajectories; - -/// Observers and observatory positions. -pub mod observers; - /// Orbital elements utilities (conversion, normalization). pub mod orb_elem; -/// Main Outfit struct: central orchestrator for orbit determination. -pub mod outfit; - /// Errors returned by Outfit operations. pub mod outfit_errors; @@ -300,40 +282,28 @@ pub mod ref_system; /// Time management and conversions (UTC, TDB, TT). pub mod time; +pub mod cache; +pub mod obs_dataset; +pub mod observation_ephemeris; +pub mod observer_extension; +pub mod trajectory; + // === Public API FACADE ===================================================== // Re-export carefully curated symbols for a simple, stable top-level API. // Users can import from `outfit::...` without diving into deep module paths. -// Core orchestrator -pub use crate::outfit::Outfit; - -// Core data types & units -pub use crate::constants::Observations; -pub use crate::constants::{ArcSec, Degree, ObjectNumber, MJD}; -pub use crate::observers::Observer; -pub use crate::trajectories::TrajectorySet; - // Orbital element representations pub use crate::orbit_type::{ cometary_element::CometaryElements, equinoctial_element::EquinoctialElements, keplerian_element::KeplerianElements, OrbitalElements, }; -// Error handling and models -pub use crate::error_models::ErrorModel; pub use crate::outfit_errors::OutfitError; // IOD (Gauss) key types pub use crate::initial_orbit_determination::gauss_result::GaussResult; pub use crate::initial_orbit_determination::IODParams; -// Frequently-used extension traits (ergonomic entry points) and key types -pub use crate::observations::display::ObservationsDisplayExt; -pub use crate::observations::observations_ext::ObservationIOD; -pub use crate::trajectories::trajectory_file::TrajectoryFile; -pub use crate::trajectories::trajectory_fit::FullOrbitResult; -pub use crate::trajectories::trajectory_fit::TrajectoryFit; - // Selected constants that are widely useful pub use crate::constants::{ AU, GAUSS_GRAV, RADEG, RADH, RADSEC, SECONDS_PER_DAY, T2000, VLIGHT_AU, @@ -352,55 +322,45 @@ pub type Result = core::result::Result; /// use outfit::prelude::*; /// ``` pub mod prelude { - pub use crate::{ - ArcSec, Degree, ErrorModel, FullOrbitResult, GaussResult, IODParams, JPLEphem, - ObjectNumber, ObservationIOD, Observer, Outfit, OutfitError, TrajectoryFile, TrajectorySet, - MJD, - }; + pub use crate::{GaussResult, IODParams, JPLEphem, OutfitError}; // Optionally include widely-used constants: pub use crate::{AU, GAUSS_GRAV, RADEG, RADH, RADSEC, SECONDS_PER_DAY, T2000, VLIGHT_AU}; } // === Tests support ========================================================== -#[cfg(all(test, feature = "jpl-download"))] -pub(crate) mod unit_test_global { +#[cfg(test)] +pub(crate) mod test_fixture { use std::sync::LazyLock; - use camino::Utf8Path; + use hifitime::ut1::Ut1Provider; + use photom::observation_dataset::ObsDataset; - use crate::{ - error_models::ErrorModel, - jpl_ephem::{horizon::horizon_data::HorizonData, naif::naif_data::NaifData}, - outfit::Outfit, - trajectories::trajectory_file::TrajectoryFile, - trajectories::TrajectorySet, - }; + use crate::{jpl_ephem::download_jpl_file::EphemFileSource, JPLEphem}; - pub(crate) static OUTFIT_NAIF_TEST: LazyLock = - LazyLock::new(|| Outfit::new("naif:DE440", ErrorModel::FCCT14).unwrap()); - - pub(crate) static OUTFIT_HORIZON_TEST: LazyLock<(Outfit, TrajectorySet)> = - LazyLock::new(|| { - let mut env = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); + pub(crate) static UT1_PROVIDER: LazyLock = LazyLock::new(|| { + Ut1Provider::download_from_jpl("latest_eop2.long") + .expect("Download of the JPL short time scale UT1 data failed") + }); - let path_file = Utf8Path::new("tests/data/2015AB.obs"); - let traj_set = TrajectorySet::new_from_80col(&mut env, path_file); - (env, traj_set) - }); + pub(crate) static JPL_EPHEM_HORIZON: LazyLock = LazyLock::new(|| { + let jpl_file: EphemFileSource = "horizon:DE440" + .try_into() + .expect("Failed to parse JPL ephemeris source"); + let jpl_ephem = + JPLEphem::new(&jpl_file).expect("Failed to load JPL ephemeris from Horizon"); + jpl_ephem + }); - pub(crate) static JPL_EPHEM_HORIZON: LazyLock<&HorizonData> = LazyLock::new(|| { - let jpl_ephem = OUTFIT_HORIZON_TEST.0.get_jpl_ephem().unwrap(); - match jpl_ephem { - crate::jpl_ephem::JPLEphem::HorizonFile(horizon_data) => horizon_data, - _ => panic!("JPL ephemeris is not a Horizon file"), - } + pub(crate) static JPL_EPHEM_NAIF: LazyLock = LazyLock::new(|| { + let jpl_file: EphemFileSource = "naif:DE440" + .try_into() + .expect("Failed to parse JPL ephemeris source"); + let jpl_ephem = JPLEphem::new(&jpl_file).expect("Failed to load JPL ephemeris from Naif"); + jpl_ephem }); - pub(crate) static JPL_EPHEM_NAIF: LazyLock<&NaifData> = LazyLock::new(|| { - let jpl_ephem = OUTFIT_NAIF_TEST.get_jpl_ephem().unwrap(); - match jpl_ephem { - crate::jpl_ephem::JPLEphem::NaifFile(naif_data) => naif_data, - _ => panic!("JPL ephemeris is not a Naif file"), - } + pub(crate) static DATASET_2015AB: LazyLock = LazyLock::new(|| { + ObsDataset::from_mpc_80_col("tests/data/2015AB.obs") + .expect("Failed to load test dataset 2015AB") }); } diff --git a/src/obs_dataset.rs b/src/obs_dataset.rs new file mode 100644 index 0000000..74aa411 --- /dev/null +++ b/src/obs_dataset.rs @@ -0,0 +1,113 @@ +use ahash::AHashMap; +use hifitime::ut1::Ut1Provider; +use photom::{ + observation_dataset::{observation::Observation, ObsDataset}, + observer::error_model::ModelCorrection, + TrajId, +}; + +use crate::{ + cache::OutfitCache, trajectory::TrajectoryFit, GaussResult, IODParams, JPLEphem, OutfitError, +}; + +pub type IODRMS = f64; + +/// Full batch orbit determination results. +/// +/// Each entry maps an [`TrajId`] to the outcome of a full +/// Initial Orbit Determination (IOD) attempt on its set of observations. +/// +/// Internally, this is implemented as: +/// +/// ```ignore +/// HashMap, RandomState> +/// ``` +/// +/// Return semantics +/// ----------------- +/// * `Ok((GaussResult, IODRMS))` – a successful IOD with its RMS of normalized residuals. +/// * `Err(OutfitError)` – a failure isolated to that object. +pub type FullOrbitResult = AHashMap>; + +pub trait FitIOD { + fn fit_full_iod( + self, + jpl: &JPLEphem, + ut1_provider: &Ut1Provider, + params: &IODParams, + rng: &mut impl rand::Rng, + ) -> Result; + + fn fit_iod( + self, + traj: impl Into, + jpl: &JPLEphem, + ut1_provider: &Ut1Provider, + params: &IODParams, + rng: &mut impl rand::Rng, + ) -> Result<(GaussResult, IODRMS), OutfitError>; +} + +impl FitIOD for ObsDataset { + fn fit_iod( + self, + traj: impl Into, + jpl: &JPLEphem, + ut1_provider: &Ut1Provider, + params: &IODParams, + rng: &mut impl rand::Rng, + ) -> Result<(GaussResult, IODRMS), OutfitError> { + let corrected_dataset = self + .apply_model_errors() + .apply_batch_rms_correction(params.gap_max); + + let cache = OutfitCache::build(&corrected_dataset, jpl, ut1_provider)?; + + fit_single_traj(&traj.into(), &corrected_dataset, &cache, jpl, params, rng) + } + + fn fit_full_iod( + self, + jpl: &JPLEphem, + ut1_provider: &Ut1Provider, + params: &IODParams, + rng: &mut impl rand::Rng, + ) -> Result { + let corrected_dataset = self + .apply_model_errors() + .apply_batch_rms_correction(params.gap_max); + + let cache = OutfitCache::build(&corrected_dataset, jpl, ut1_provider)?; + + let results: FullOrbitResult = corrected_dataset + .iter_traj_id() + .into_iter() + .flatten() + .map(|traj| { + println!("Fitting IOD for Trajectory ID: {}", traj); + let result = fit_single_traj(traj, &corrected_dataset, &cache, jpl, params, rng); + (traj.clone(), result) + }) + .collect(); + + Ok(results) + } +} + +fn fit_single_traj( + traj: &TrajId, + corrected_dataset: &ObsDataset, + cache: &OutfitCache, + jpl: &JPLEphem, + params: &IODParams, + rng: &mut impl rand::Rng, +) -> Result<(GaussResult, IODRMS), OutfitError> { + let materialized_traj = corrected_dataset + .materialize_trajectory(traj) + .ok_or_else(|| OutfitError::TrajectoryIdNotFound(traj.clone()))?; + + let mut obs_vec_refs: Vec<&Observation> = materialized_traj.iter().collect(); + obs_vec_refs.sort_by(|a, b| a.mjd_tt().total_cmp(&b.mjd_tt())); + + obs_vec_refs.estimate_best_orbit(cache, jpl, params, rng) +} diff --git a/src/observation_ephemeris.rs b/src/observation_ephemeris.rs new file mode 100644 index 0000000..824ed13 --- /dev/null +++ b/src/observation_ephemeris.rs @@ -0,0 +1,954 @@ +use std::f64::consts::PI; + +use hifitime::Epoch; +use nalgebra::Vector3; +use photom::{ + constants::DPI, coordinates::equatorial::EquCoord, + observation_dataset::observation::Observation, +}; + +use crate::{ + cache::OutfitCache, constants::ROT_EQUMJ2000_TO_ECLMJ2000, conversion::cartesion_from_vec, + EquinoctialElements, JPLEphem, OutfitError, VLIGHT_AU, +}; + +pub trait ObservationEphemeris { + /// Compute the apparent equatorial coordinates (RA, DEC) of a solar system body + /// as seen by this observation’s site at its epoch. + /// + /// Overview + /// ----------------- + /// This method determines the apparent sky position of a target body, + /// described by equinoctial orbital elements, as seen from the observing site + /// corresponding to this [`Observation`]. + /// + /// The computation steps are: + /// 1. **Orbit propagation** – Propagate the body’s state from its reference epoch to the observation epoch using a two-body model. + /// 2. **Reference frame handling** – Retrieve Earth’s barycentric position from the JPL ephemeris and transform to *ecliptic mean J2000*. + /// 3. **Observer position** – Compute the observer’s heliocentric position (Earth + site geocentric offset). + /// 4. **Light-time and aberration correction** – Form the observer–object vector and correct for aberration. + /// 5. **Conversion to equatorial coordinates** – Convert the corrected line-of-sight vector to (RA, DEC). + /// + /// Arguments + /// ----------------- + /// * `state` – Global environment providing ephemerides, UT1 provider, and frame utilities. + /// * `equinoctial_element` – Orbital elements of the target body. + /// + /// Return + /// ---------- + /// * `Result<(f64, f64), OutfitError>` – The apparent right ascension and declination `[rad]`. + /// + /// Units + /// ---------- + /// * Positions: AU + /// * Velocities: AU/day + /// * Angles: radians + /// * Time: MJD TT + /// + /// Errors + /// ---------- + /// Returns [`OutfitError`] if: + /// - Orbit propagation fails, + /// - Ephemeris data is unavailable, + /// - Reference-frame transformation fails. + /// + /// See also + /// ------------ + /// * [`EquinoctialElements::solve_two_body_problem`] – Orbit propagation. + /// * [`Observer::pvobs`] – Computes observer’s geocentric position. + /// * [`correct_aberration`] – Aberration correction. + /// * [`cartesian_to_radec`] – Convert Cartesian vectors to (RA, DEC). + fn compute_apparent_position( + &self, + cache: &OutfitCache, + jpl: &JPLEphem, + equinoctial_element: &EquinoctialElements, + ) -> Result<(f64, f64), OutfitError>; + + /// Compute the normalized squared astrometric residuals (RA, DEC) + /// between an observed position and a propagated ephemeris. + /// + /// Overview + /// ----------------- + /// This method compares the actual astrometric measurement stored in `self` + /// against the expected position of the target body propagated from + /// equinoctial elements. + /// It returns a scalar representing the sum of squared, normalized residuals + /// in RA and DEC. + /// + /// Arguments + /// ----------------- + /// * `state` – Global environment providing ephemerides and time conversions. + /// * `equinoctial_element` – Orbital elements of the target body. + /// + /// Return + /// ---------- + /// * `Result` – Dimensionless scalar value representing the weighted sum + /// of squared residuals. Equivalent to a chi² contribution for a single observation (without division by 2). + /// + /// Remarks + /// ---------- + /// * Residuals are normalized by the astrometric uncertainties `error_ra` and `error_dec`. + /// * RA residuals are multiplied by `cos(dec)` to account for projection effects. + /// * All angles are in radians. + /// + /// Errors + /// ---------- + /// Returns [`OutfitError`] if propagation or ephemeris lookup fails. + /// + /// See also + /// ------------ + /// * [`compute_apparent_position`](crate::observations::Observation::compute_apparent_position) – Used internally to obtain predicted RA/DEC. + /// * [`Observer::pvobs`] – Computes observer’s geocentric position. + /// * [`correct_aberration`] – Applies aberration correction. + /// * [`cartesian_to_radec`] – Converts 3D vectors to (RA, DEC). + /// * [`EquinoctialElements::solve_two_body_problem`] – Two-body propagation. + fn ephemeris_error( + &self, + cache: &OutfitCache, + jpl: &JPLEphem, + equinoctial_element: &EquinoctialElements, + ) -> Result; +} + +impl ObservationEphemeris for Observation { + fn compute_apparent_position( + &self, + cache: &OutfitCache, + jpl: &JPLEphem, + equinoctial_element: &EquinoctialElements, + ) -> Result<(f64, f64), OutfitError> { + // Hyperbolic/parabolic orbits (e >= 1) are not yet supported + if equinoctial_element.eccentricity() >= 1.0 { + return Err(OutfitError::InvalidOrbit( + "Eccentricity >= 1 is not yet supported".to_string(), + )); + } + + // 1. Propagate asteroid position/velocity in ecliptic J2000 + let (cart_pos_ast, cart_pos_vel, _) = equinoctial_element.solve_two_body_problem( + 0., + self.mjd_tt() - equinoctial_element.reference_epoch, + false, + )?; + + // 2. Observation time in TT + let obs_mjd = Epoch::from_mjd_in_time_scale(self.mjd_tt(), hifitime::TimeScale::TT); + + // 3. Earth's barycentric position in ecliptic J2000 + let (earth_position, _) = jpl.earth_ephemeris(&obs_mjd, false); + + let earth_pos_eclj2000 = ROT_EQUMJ2000_TO_ECLMJ2000.transpose() * earth_position; + let cart_pos_ast_eclj2000 = ROT_EQUMJ2000_TO_ECLMJ2000 * cart_pos_ast; + let cart_pos_vel_eclj2000 = ROT_EQUMJ2000_TO_ECLMJ2000 * cart_pos_vel; + + // 4. Observer heliocentric position + let geo_obs_pos = cache + .get_observer_geocentric_position(self.index()) + .map(|x| x.into_inner()); + let xobs = geo_obs_pos + earth_pos_eclj2000; + let obs_on_earth = ROT_EQUMJ2000_TO_ECLMJ2000 * xobs; + + // 5. Relative position and aberration correction + let relative_position = cart_pos_ast_eclj2000 - obs_on_earth; + let corrected_pos = correct_aberration(relative_position, cart_pos_vel_eclj2000); + let cartesion_pos = cartesion_from_vec(corrected_pos); + + // 6. Convert to equatorial coordinates + let equatorial_pos: EquCoord = cartesion_pos.into(); + + Ok((equatorial_pos.ra, equatorial_pos.dec)) + } + + fn ephemeris_error( + &self, + cache: &OutfitCache, + jpl: &JPLEphem, + equinoctial_element: &EquinoctialElements, + ) -> Result { + let (alpha, delta) = self.compute_apparent_position(cache, jpl, equinoctial_element)?; + + let (self_ra, self_ra_err, self_dec, self_dec_err) = ( + self.equ_coord().ra, + self.equ_coord().ra_error, + self.equ_coord().dec, + self.equ_coord().dec_error, + ); + + // ΔRA with wrapping to [-π, π] + let mut diff_alpha = (self_ra - alpha) % DPI; + if diff_alpha > PI { + diff_alpha -= DPI; + } + + let diff_delta = self_dec - delta; + + // Weighted RMS + let rms_ra = (self_dec.cos() * (diff_alpha / self_ra_err)).powi(2); + let rms_dec = (diff_delta / self_dec_err).powi(2); + + Ok(rms_ra + rms_dec) + } +} + +/// Apply stellar aberration correction to a relative position vector. +/// +/// This function computes the apparent position of a target object by applying +/// the first-order correction for stellar aberration due to the observer's velocity. +/// It assumes the classical limit (v ≪ c), using a linear time-delay model. +/// +/// Arguments +/// --------- +/// * `xrel`: relative position vector from observer to object \[AU\]. +/// * `vrel`: velocity of the observer relative to the barycenter \[AU/day\]. +/// +/// Returns +/// -------- +/// * Corrected position vector (same units and directionality as `xrel`), +/// shifted by the aberration effect. +/// +/// Formula +/// ------- +/// The corrected position is given by: +/// ```text +/// x_corr = xrel − (‖xrel‖ / c) · vrel +/// ``` +/// where `c` is the speed of light in AU/day (`VLIGHT_AU`). +/// +/// Remarks +/// ------- +/// * This function does **not** normalize the output. +/// * Suitable for use in astrometric modeling or when computing apparent direction +/// of celestial objects as seen from a moving observer. +pub fn correct_aberration(xrel: Vector3, vrel: Vector3) -> Vector3 { + let norm_vector = xrel.norm(); + let dt = norm_vector / VLIGHT_AU; + xrel - dt * vrel +} + +#[cfg(test)] +mod test_observations_ephemeris { + use super::*; + + mod tests_compute_apparent_position { + + use crate::test_fixture::{JPL_EPHEM_HORIZON, UT1_PROVIDER}; + + use super::*; + use approx::assert_relative_eq; + use photom::{ + observation_dataset::{observation::ObservationInput, ObsDataset}, + observer::error_model::{ModelCorrection, ObsErrorModel}, + photometry::{Filter, Photometry}, + MJDTT, + }; + + /// Helper: simple circular equinoctial elements for a 1 AU, zero inclination orbit. + fn simple_circular_elements(epoch: f64) -> EquinoctialElements { + EquinoctialElements { + reference_epoch: epoch, + semi_major_axis: 1.0, + eccentricity_sin_lon: 0.0, + eccentricity_cos_lon: 0.0, + tan_half_incl_sin_node: 0.0, + tan_half_incl_cos_node: 0.0, + mean_longitude: 0.0, + } + } + + fn obsdataset_with_observation_time(t_epoch: MJDTT) -> ObsDataset { + let observation_input = ObservationInput::new( + 0, + EquCoord { + ra: 0.0, + ra_error: 0.0, + dec: 0.0, + dec_error: 0.0, + }, + Photometry { + magnitude: 0.0, + error: 0.0, + filter: Filter::Int(0), + }, + t_epoch, + Some(photom::observer::dataset::ObserverId::MpcCode(*b"F51")), + ); + + ObsDataset::empty() + .push_observation(vec![observation_input]) + .unwrap() + .0 + .with_error_model(ObsErrorModel::FCCT14) + .apply_model_errors() + } + + #[test] + fn test_compute_apparent_position_nominal() { + let t_obs = 59000.0; // MJD + + let obs_dataset = obsdataset_with_observation_time(t_obs); + let cache = + OutfitCache::build(&obs_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + let equinoctial = simple_circular_elements(t_obs); + + let (ra, dec) = obs_dataset + .get_observation(0) + .unwrap() + .compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial) + .expect("Computation should succeed"); + + assert!(ra.is_finite()); + assert!(dec.is_finite()); + assert!((0.0..2.0 * std::f64::consts::PI).contains(&ra)); + assert!((-std::f64::consts::FRAC_PI_2..std::f64::consts::FRAC_PI_2).contains(&dec)); + } + + #[test] + fn test_compute_apparent_position_same_epoch() { + let t_epoch = 60000.0; + + let obs_dataset = obsdataset_with_observation_time(t_epoch); + let cache = + OutfitCache::build(&obs_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + let equinoctial = simple_circular_elements(t_epoch); + + let obs = obs_dataset.get_observation(0).unwrap(); + + let (ra1, dec1) = obs + .compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + let (ra2, dec2) = obs + .compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + + // The same input should always produce the same result + assert_relative_eq!(ra1, ra2, epsilon = 1e-14); + assert_relative_eq!(dec1, dec2, epsilon = 1e-14); + } + + #[test] + fn test_apparent_position_for_distant_object() { + let t_obs = 59000.0; + + let obs_dataset = obsdataset_with_observation_time(t_obs); + let cache = + OutfitCache::build(&obs_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + let mut equinoctial = simple_circular_elements(t_obs); + + // Objet far away + equinoctial.semi_major_axis = 100.0; + + let obs = obs_dataset.get_observation(0).unwrap(); + + let (ra, dec) = obs + .compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial) + .expect("Should compute apparent position for distant object"); + + assert!(ra.is_finite()); + assert!(dec.is_finite()); + } + + #[test] + fn test_compute_apparent_position_propagation_failure() { + let obs_dataset = obsdataset_with_observation_time(0.0); + let cache = + OutfitCache::build(&obs_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + // Invalid orbital elements to force failure in solve_two_body_problem + let equinoctial = EquinoctialElements { + reference_epoch: 59000.0, + semi_major_axis: -1.0, // Physically invalid + eccentricity_sin_lon: 0.0, + eccentricity_cos_lon: 0.0, + tan_half_incl_sin_node: 0.0, + tan_half_incl_cos_node: 0.0, + mean_longitude: 0.0, + }; + + let obs = obs_dataset.get_observation(0).unwrap(); + + let result = obs.compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial); + assert!(result.is_err(), "Invalid elements should trigger an error"); + } + + mod proptests_apparent_position { + use super::*; + use crate::test_fixture::UT1_PROVIDER; + use photom::{ + observation_dataset::{observation::ObservationInput, ObsDataset}, + observer::{ + dataset::ObserverId, + error_model::{ModelCorrection, ObsErrorModel}, + Observer, + }, + photometry::{Filter, Photometry}, + }; + use proptest::prelude::*; + + fn arb_equinoctial_elements() -> impl Strategy { + ( + 58000.0..62000.0f64, + 0.5..30.0f64, + -0.5..0.5f64, + -0.5..0.5f64, + -0.5..0.5f64, + -0.5..0.5f64, + 0.0..(2.0 * std::f64::consts::PI), + ) + .prop_map(|(epoch, a, h, k, p, q, lambda)| { + EquinoctialElements { + reference_epoch: epoch, + semi_major_axis: a, + eccentricity_sin_lon: h, + eccentricity_cos_lon: k, + tan_half_incl_sin_node: p, + tan_half_incl_cos_node: q, + mean_longitude: lambda, + } + }) + } + + fn arb_observer() -> impl Strategy { + (-180.0..180.0f64, -90.0..90.0f64, 0.0..5.0f64).prop_map(|(lon, lat, elev)| { + Observer::new(lon.to_radians(), lat.to_radians(), elev, None, None, None) + .unwrap() + }) + } + + fn arb_extreme_equinoctial_elements() -> impl Strategy { + ( + 58000.0..62000.0f64, + 0.1..50.0f64, + -0.99..0.99f64, + -0.99..0.99f64, + -1.0..1.0f64, + -1.0..1.0f64, + 0.0..(2.0 * std::f64::consts::PI), + ) + .prop_map(|(epoch, a, h, k, p, q, lambda)| EquinoctialElements { + reference_epoch: epoch, + semi_major_axis: a, + eccentricity_sin_lon: h, + eccentricity_cos_lon: k, + tan_half_incl_sin_node: p, + tan_half_incl_cos_node: q, + mean_longitude: lambda, + }) + .prop_filter( + "Only bound (elliptical) orbits are supported", + |elem: &EquinoctialElements| { + let e = (elem.eccentricity_sin_lon.powi(2) + + elem.eccentricity_cos_lon.powi(2)) + .sqrt(); + e < 0.99 + }, + ) + } + + fn make_obs_dataset_and_cache( + t_obs: f64, + observer_id: ObserverId, + ) -> (ObsDataset, OutfitCache) { + let observation_input = ObservationInput::new( + 0, + EquCoord { + ra: 0.0, + ra_error: 0.0, + dec: 0.0, + dec_error: 0.0, + }, + Photometry { + magnitude: 0.0, + error: 0.0, + filter: Filter::Int(0), + }, + t_obs, + Some(observer_id), + ); + + let obs_dataset = ObsDataset::empty() + .push_observation(vec![observation_input]) + .unwrap() + .0 + .with_error_model(ObsErrorModel::FCCT14) + .apply_model_errors(); + + let cache = + OutfitCache::build(&obs_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + (obs_dataset, cache) + } + + fn make_obs_dataset_and_cache_with_custom_observer( + t_obs: f64, + observer: Observer, + ) -> (ObsDataset, OutfitCache) { + let (obs_dataset_with_obs, observer_id) = + ObsDataset::empty().push_observer(observer); + + let observation_input = ObservationInput::new( + 0, + EquCoord { + ra: 0.0, + ra_error: 0.0, + dec: 0.0, + dec_error: 0.0, + }, + Photometry { + magnitude: 0.0, + error: 0.0, + filter: Filter::Int(0), + }, + t_obs, + Some(observer_id), + ); + + let obs_dataset = obs_dataset_with_obs + .push_observation(vec![observation_input]) + .unwrap() + .0 + .with_error_model(ObsErrorModel::FCCT14) + .apply_model_errors(); + + let cache = + OutfitCache::build(&obs_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + (obs_dataset, cache) + } + + proptest! { + #[test] + fn proptest_ra_dec_are_finite_and_in_range( + equinoctial in arb_equinoctial_elements(), + obs_time in 58000.0f64..62000.0 + ) { + let (obs_dataset, cache) = make_obs_dataset_and_cache( + obs_time, + photom::observer::dataset::ObserverId::MpcCode(*b"F51"), + ); + + let obs = obs_dataset.get_observation(0).unwrap(); + let result = obs.compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial); + + if let Ok((ra, dec)) = result { + prop_assert!(ra.is_finite()); + prop_assert!(dec.is_finite()); + prop_assert!((0.0..2.0 * std::f64::consts::PI).contains(&ra)); + prop_assert!((-std::f64::consts::FRAC_PI_2..std::f64::consts::FRAC_PI_2).contains(&dec)); + } + } + + #[test] + fn proptest_repeatability( + equinoctial in arb_equinoctial_elements(), + obs_time in 58000.0f64..62000.0 + ) { + let (obs_dataset, cache) = make_obs_dataset_and_cache( + obs_time, + photom::observer::dataset::ObserverId::MpcCode(*b"F51"), + ); + + let obs = obs_dataset.get_observation(0).unwrap(); + + let r1 = obs.compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial); + let r2 = obs.compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial); + + prop_assert_eq!(r1, r2); + } + + #[test] + fn proptest_small_time_change_has_small_effect( + equinoctial in arb_equinoctial_elements(), + obs_time in 58000.0f64..62000.0 + ) { + let (obs_dataset, cache) = make_obs_dataset_and_cache( + obs_time, + photom::observer::dataset::ObserverId::MpcCode(*b"F51"), + ); + let (obs_dataset_eps, cache_eps) = make_obs_dataset_and_cache( + obs_time + 1e-3, + photom::observer::dataset::ObserverId::MpcCode(*b"F51"), + ); + + let obs = obs_dataset.get_observation(0).unwrap(); + let obs_eps = obs_dataset_eps.get_observation(0).unwrap(); + + let r1 = obs.compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial); + let r2 = obs_eps.compute_apparent_position(&cache_eps, &JPL_EPHEM_HORIZON, &equinoctial); + + if let (Ok((ra1, dec1)), Ok((ra2, dec2))) = (r1, r2) { + let dra = (ra1 - ra2).abs(); + let ddec = (dec1 - dec2).abs(); + + prop_assert!(dra < 1.0, "RA jump too large: {}", dra); + prop_assert!(ddec < 1.0, "DEC jump too large: {}", ddec); + } + } + + #[test] + fn proptest_ra_dec_valid_for_extreme_orbits_and_observers( + equinoctial in arb_extreme_equinoctial_elements(), + observer in arb_observer(), + obs_time in 58000.0f64..62000.0 + ) { + let (obs_dataset, cache) = + make_obs_dataset_and_cache_with_custom_observer(obs_time, observer); + + let obs = obs_dataset.get_observation(0).unwrap(); + let result = obs.compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial); + + if let Ok((ra, dec)) = result { + prop_assert!(ra.is_finite()); + prop_assert!(dec.is_finite()); + prop_assert!((0.0..2.0 * std::f64::consts::PI).contains(&ra)); + prop_assert!((-std::f64::consts::FRAC_PI_2..std::f64::consts::FRAC_PI_2).contains(&dec)); + } + } + } + + #[test] + fn test_hyperbolic_orbit_returns_error() { + let t_obs = 59000.0; + let (obs_dataset, cache) = make_obs_dataset_and_cache( + t_obs, + photom::observer::dataset::ObserverId::MpcCode(*b"F51"), + ); + + let equinoctial = EquinoctialElements { + reference_epoch: t_obs, + semi_major_axis: 1.0, + eccentricity_sin_lon: 0.8, + eccentricity_cos_lon: 0.8, // e ≈ 1.13 > 1 + tan_half_incl_sin_node: 0.0, + tan_half_incl_cos_node: 0.0, + mean_longitude: 0.0, + }; + + let obs = obs_dataset.get_observation(0).unwrap(); + let result = + obs.compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial); + + assert!( + result.is_err(), + "Hyperbolic or parabolic orbits should currently return an error" + ); + } + } + } + + mod tests_ephemeris_error { + use super::*; + use crate::test_fixture::{JPL_EPHEM_HORIZON, UT1_PROVIDER}; + use approx::assert_relative_eq; + use photom::{ + observation_dataset::{observation::ObservationInput, ObsDataset}, + observer::{ + error_model::{ModelCorrection, ObsErrorModel}, + mpc::MpcCode, + Observer, + }, + photometry::{Filter, Photometry}, + }; + + fn simple_equinoctial(epoch: f64) -> EquinoctialElements { + EquinoctialElements { + reference_epoch: epoch, + semi_major_axis: 1.0, + eccentricity_sin_lon: 0.0, + eccentricity_cos_lon: 0.0, + tan_half_incl_sin_node: 0.0, + tan_half_incl_cos_node: 0.0, + mean_longitude: 0.0, + } + } + + fn make_obs_dataset_and_cache_mpc( + ra: f64, + ra_error: f64, + dec: f64, + dec_error: f64, + t_obs: f64, + mpc_code: MpcCode, + ) -> (ObsDataset, OutfitCache) { + let observation_input = ObservationInput::new( + 0, + EquCoord { + ra, + ra_error, + dec, + dec_error, + }, + Photometry { + magnitude: 0.0, + error: 0.0, + filter: Filter::Int(0), + }, + t_obs, + Some(photom::observer::dataset::ObserverId::MpcCode(mpc_code)), + ); + + let obs_dataset = ObsDataset::empty() + .push_observation(vec![observation_input]) + .unwrap() + .0 + .with_error_model(ObsErrorModel::FCCT14) + .apply_model_errors(); + + let cache = + OutfitCache::build(&obs_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + (obs_dataset, cache) + } + + fn make_obs_dataset_and_cache_custom( + ra: f64, + ra_error: f64, + dec: f64, + dec_error: f64, + t_obs: f64, + observer: Observer, + ) -> (ObsDataset, OutfitCache) { + let (dataset_with_obs, observer_id) = ObsDataset::empty().push_observer(observer); + + let observation_input = ObservationInput::new( + 0, + EquCoord { + ra, + ra_error, + dec, + dec_error, + }, + Photometry { + magnitude: 0.0, + error: 0.0, + filter: Filter::Int(0), + }, + t_obs, + Some(observer_id), + ); + + let obs_dataset = dataset_with_obs + .push_observation(vec![observation_input]) + .unwrap() + .0 + .with_error_model(ObsErrorModel::FCCT14) + .apply_model_errors(); + + let cache = + OutfitCache::build(&obs_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + (obs_dataset, cache) + } + + #[test] + fn test_ephem_error() { + let (obs_dataset, cache) = make_obs_dataset_and_cache_mpc( + 1.7899347771316527, + 1.770_024_520_608_546E-6, + 0.778_996_538_107_973_6, + 1.259_582_891_829_317_7E-6, + 57070.262067592594, + *b"F51", + ); + + let equinoctial_element = EquinoctialElements { + reference_epoch: 57_049.242_334_573_75, + semi_major_axis: 1.8017360713154256, + eccentricity_sin_lon: 0.269_373_680_909_227_2, + eccentricity_cos_lon: 8.856_415_260_013_56E-2, + tan_half_incl_sin_node: 8.089_970_166_396_302E-4, + tan_half_incl_cos_node: 0.10168201109730375, + mean_longitude: 1.6936970079414786, + }; + + let obs = obs_dataset.get_observation(0).unwrap(); + let rms_error = obs.ephemeris_error(&cache, &JPL_EPHEM_HORIZON, &equinoctial_element); + assert_eq!(rms_error.unwrap(), 75.00445641224026); + } + + #[test] + fn test_zero_error_when_positions_match() { + let t_obs = 59000.0; + let equinoctial = simple_equinoctial(t_obs); + + let (obs_dataset, cache) = + make_obs_dataset_and_cache_mpc(0.0, 1e-6, 0.0, 1e-6, t_obs, *b"F51"); + + let obs = obs_dataset.get_observation(0).unwrap(); + let (alpha, delta) = obs + .compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + + let (obs_dataset_match, cache_match) = + make_obs_dataset_and_cache_mpc(alpha, 1e-6, delta, 1e-6, t_obs, *b"F51"); + + let obs_match = obs_dataset_match.get_observation(0).unwrap(); + let error = obs_match + .ephemeris_error(&cache_match, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + + assert_relative_eq!(error, 0.0, epsilon = 1e-14); + } + + #[test] + fn test_error_increases_with_offset() { + let t_obs = 59000.0; + let equinoctial = simple_equinoctial(t_obs); + + let (obs_dataset, cache) = + make_obs_dataset_and_cache_mpc(0.0, 1e-3, 0.0, 1e-3, t_obs, *b"F51"); + + let obs = obs_dataset.get_observation(0).unwrap(); + let (alpha, delta) = obs + .compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + + let (obs_dataset_offset, cache_offset) = + make_obs_dataset_and_cache_mpc(alpha + 1e-3, 1e-3, delta, 1e-3, t_obs, *b"F51"); + + let obs_offset = obs_dataset_offset.get_observation(0).unwrap(); + let err = obs_offset + .ephemeris_error(&cache_offset, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + + assert!(err > 0.0); + } + + #[test] + fn test_ra_wrapping_invariance() { + let t_obs = 59000.0; + let equinoctial = simple_equinoctial(t_obs); + + let (obs_dataset, cache) = + make_obs_dataset_and_cache_mpc(0.0, 1e-6, 0.0, 1e-6, t_obs, *b"F51"); + + let obs = obs_dataset.get_observation(0).unwrap(); + let (alpha, delta) = obs + .compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + + let (obs_dataset_wrapped, cache_wrapped) = make_obs_dataset_and_cache_mpc( + alpha + std::f64::consts::TAU, + 1e-6, + delta, + 1e-6, + t_obs, + *b"F51", + ); + + let obs_wrapped = obs_dataset_wrapped.get_observation(0).unwrap(); + let err = obs_wrapped + .ephemeris_error(&cache_wrapped, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + + assert_relative_eq!(err, 0.0, epsilon = 1e-12); + } + + #[test] + fn test_large_uncertainty_downweights_error() { + let t_obs = 59000.0; + let equinoctial = simple_equinoctial(t_obs); + + let (obs_dataset, cache) = + make_obs_dataset_and_cache_mpc(0.0, 1.0, 0.0, 1.0, t_obs, *b"F51"); + + let obs = obs_dataset.get_observation(0).unwrap(); + let (alpha, delta) = obs + .compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + + let (obs_dataset_large, cache_large) = make_obs_dataset_and_cache_mpc( + alpha + 0.1, + 10.0, + delta + 0.1, + 10.0, + t_obs, + *b"F51", + ); + + let obs_large = obs_dataset_large.get_observation(0).unwrap(); + let err = obs_large + .ephemeris_error(&cache_large, &JPL_EPHEM_HORIZON, &equinoctial) + .unwrap(); + + assert!( + err < 1.0, + "Large uncertainties should reduce the error contribution" + ); + } + + mod proptests_ephemeris_error { + use super::*; + use proptest::prelude::*; + + fn arb_observer() -> impl Strategy { + (-180.0..180.0f64, -90.0..90.0f64, 0.0..5000.0f64).prop_map(|(lon, lat, elev)| { + Observer::new(lon.to_radians(), lat.to_radians(), elev, None, None, None) + .unwrap() + }) + } + + fn arb_elliptical_equinoctial() -> impl Strategy { + ( + 58000.0..62000.0f64, + 0.5..20.0f64, + -0.8..0.8f64, + -0.8..0.8f64, + -0.8..0.8f64, + -0.8..0.8f64, + 0.0..std::f64::consts::TAU, + ) + .prop_map(|(epoch, a, h, k, p, q, l)| EquinoctialElements { + reference_epoch: epoch, + semi_major_axis: a, + eccentricity_sin_lon: h, + eccentricity_cos_lon: k, + tan_half_incl_sin_node: p, + tan_half_incl_cos_node: q, + mean_longitude: l, + }) + .prop_filter("Bound orbits only", |e: &EquinoctialElements| { + e.eccentricity() < 1.0 + }) + } + + proptest! { + #[test] + fn proptest_error_is_non_negative( + equinoctial in arb_elliptical_equinoctial(), + observer in arb_observer(), + obs_time in 58000.0f64..62000.0 + ) { + let (obs_dataset, cache) = + make_obs_dataset_and_cache_custom(0.0, 1e-3, 0.0, 1e-3, obs_time, observer); + + let obs = obs_dataset.get_observation(0).unwrap(); + let result = obs.ephemeris_error(&cache, &JPL_EPHEM_HORIZON, &equinoctial); + + if let Ok(val) = result { + prop_assert!(val.is_finite()); + prop_assert!(val >= 0.0); + } + } + + #[test] + fn proptest_error_downweights_large_uncertainties( + equinoctial in arb_elliptical_equinoctial(), + observer in arb_observer(), + obs_time in 58000.0f64..62000.0 + ) { + let (obs_dataset, cache) = + make_obs_dataset_and_cache_custom(0.5, 100.0, 0.5, 100.0, obs_time, observer); + + let obs = obs_dataset.get_observation(0).unwrap(); + let result = obs.ephemeris_error(&cache, &JPL_EPHEM_HORIZON, &equinoctial); + + if let Ok(val) = result { + prop_assert!(val < 1.0); + } + } + } + } + } +} diff --git a/src/observations/display.rs b/src/observations/display.rs deleted file mode 100644 index 43a3091..0000000 --- a/src/observations/display.rs +++ /dev/null @@ -1,912 +0,0 @@ -//! # Tabular display for astrometric observations -//! -//! Pretty, zero-copy renderers to print an [`Observations`] collection -//! (a `SmallVec<[Observation; 6]>`) as a **table**. -//! -//! ## Overview -//! -//! The main entry point is the display adaptor [`ObservationsDisplay`]. It **borrows** -//! your observations and renders a formatted table when used with Rust formatting -//! (`{}` or `{:#}`), without cloning or moving data. -//! -//! Three layouts are available: -//! -//! - **Default** (compact, fixed-width): -//! `# | Site | MJD (TT) | RA[hms] ±σ["] | DEC[dms] ±σ["]` -//! - **Wide** (diagnostic, uses `comfy-table`): -//! adds `JD (TT) | RA [rad] | DEC [rad] | |r_geo| AU | |r_hel| AU` -//! - **ISO** (timestamp-centric, uses `comfy-table`): -//! replaces MJD/JD with `ISO (TT)` and `ISO (UTC)` -//! -//! ## Units & Conventions -//! -//! - **Time**: MJD/JD columns are on the **TT** scale. In ISO mode, both **TT** and **UTC** -//! timestamps are shown (UTC includes leap seconds via `hifitime`). -//! - **Angles**: RA/DEC are formatted in sexagesimal (RA in **hours**, DEC in **degrees**). -//! - **Uncertainties**: printed in **arcseconds**, converted from radians with [`RAD2ARC`]. -//! - **Positions**: vector norms (wide mode) are in **AU**, conventional **equatorial mean J2000**. -//! -//! ## Precision & Sorting -//! -//! - `with_seconds_precision(p)` — controls fractional digits for sexagesimal and ISO seconds. -//! - `with_distance_precision(p)` — controls fixed-point digits for AU distances (wide mode). -//! - `sorted()` — prints rows **sorted by epoch** (MJD TT ascending). The first column `#` -//! always shows the **original index** (pre-sort) for traceability. -//! -//! ## Observer names -//! -//! If you pass an [`Outfit`] with [`ObservationsDisplay::with_env`], site labels render -//! as `"Name (#id)"` when available; otherwise the numeric **site id** is shown. -//! -//! ## Performance -//! -//! - The adaptor never clones/moves `Observation`s. It sorts a **vector of indices** when -//! `sorted()` is used, and builds small transient strings per row (sexagesimal & ISO). -//! - **Default** layout writes fixed-width lines directly. -//! **Wide** and **ISO** layouts use [`comfy-table`] to build the table; this is still fast -//! but implies allocating the table representation before printing. -//! -//! ## Quick examples -//! -//! ```rust,ignore -//! use outfit::observations::display::ObservationsDisplayExt; -//! -//! // 1) Compact table (fixed-width), sorted by epoch -//! println!("{}", observations.show().sorted()); -//! -//! // 2) Wide table (adds JD, radians, |r| in AU), with custom precisions -//! println!("{}", observations -//! .table_wide() -//! .with_seconds_precision(4) -//! .with_distance_precision(8) -//! .sorted()); -//! -//! // 3) ISO table (ISO TT + ISO UTC), resolve site names via Outfit -//! println!("{}", observations -//! .table_iso() -//! .with_env(&env) -//! .with_seconds_precision(4) -//! .sorted()); -//! -//! // 4) Owned string (compact, unsorted) -//! let s = observations.show_string(); -//! ``` -//! -//! ## See also -//! -//! - [`Observation`] — single-observation pretty-printer and helpers. -//! - [`crate::conversion::ra_hms_prec`] / [`crate::conversion::dec_sdms_prec`] -//! — sexagesimal decomposition with carry. -//! - [`crate::time::fmt_ss`] — seconds string `"SS.sss"` with 2-digit integer part. -//! - [`crate::time::iso_tt_from_epoch`] / [`crate::time::iso_utc_from_epoch`] -//! — ISO renderers via `hifitime`. -//! -//! [`comfy-table`]: https://crates.io/crates/comfy-table -use std::fmt; - -use hifitime::{Epoch, TimeScale}; - -use crate::constants::{JDTOMJD, RAD2ARC}; -use crate::conversion::{dec_sdms_prec, ra_hms_prec}; -use crate::observations::Observation; -use crate::time::{fmt_ss, iso_tt_from_epoch, iso_utc_from_epoch}; -use crate::{Observations, Outfit}; - -use comfy_table::{presets::UTF8_FULL, Cell, CellAlignment, ContentArrangement, Row, Table}; - -/// Internal layout selector for the table renderer. -/// -/// This enum is crate-internal and selects the columns printed by -/// [`ObservationsDisplay`]. It is not part of the public API. -/// -/// Variants -/// ----------------- -/// * `Default` — Compact columns: MJD(TT), RA±σ, DEC±σ. -/// * `Wide` — Adds JD(TT), RA/DEC in radians, and AU vector norms. -/// * `Iso` — Replaces MJD/JD with `ISO (TT)` and `ISO (UTC)`. -enum TableMode { - Default, // MJD(TT) + RA/DEC ±σ - Wide, // + JD(TT), RA/DEC [rad], |r_geo|, |r_hel| - Iso, // ISO TT + ISO UTC instead of MJD/JD -} - -/// Display adaptor to render an [`Observations`] collection as a **table**. -/// -/// Render modes -/// ----------------- -/// * **Default** (via [`ObservationsDisplayExt::show`]): -/// columns `# | Site | MJD (TT) | RA[hms] ±σ["] | DEC[dms] ±σ["]`. -/// * **Wide** (via [`ObservationsDisplayExt::table_wide`]): -/// adds `JD (TT) | RA [rad] | DEC [rad] | |r_geo| AU | |r_hel| AU`. -/// * **ISO** (via [`ObservationsDisplayExt::table_iso`]): -/// replaces MJD/JD with `ISO (TT)` and `ISO (UTC)` timestamps. -/// -/// Precision -/// ----------------- -/// * `sec_prec` controls the number of fractional digits for sexagesimal seconds -/// **and** ISO seconds. -/// * `dist_prec` controls fixed-point digits for AU distances (wide mode). -/// -/// Sorting -/// ----------------- -/// * Call [`Self::sorted`] to display rows **sorted by MJD (TT)** in ascending order. -/// * The `#` column always shows the **original index** (pre-sort) for traceability. -/// * Ties (identical epochs) keep a stable order by original index. -/// -/// See also -/// ------------ -/// * [`ObservationsDisplayExt`] – Ergonomic builders for each mode. -/// * [`Observation`] – Per-row semantics used to derive the columns. -pub struct ObservationsDisplay<'a> { - /// Borrowed collection to render. No allocation or copying occurs. - obs: &'a Observations, - /// Optional Outfit environment to resolve observer names. - env: Option<&'a Outfit>, - /// Column layout selector (default / wide / iso). - mode: TableMode, - /// Fractional digits for sexagesimal and ISO seconds (default = 3). - sec_prec: usize, - /// Fixed-point digits for AU distances in wide mode (default = 6). - dist_prec: usize, - /// If `true`, rows are printed **sorted by epoch** (MJD TT) ascending. - sorted: bool, -} - -/// Pre-computed, per-row fields shared across all modes. -/// -/// Notes -/// ---------- -/// * This structure is internal to avoid recomputing formatting across modes. -/// * Optional fields are only populated in the relevant mode (e.g., `jd_tt` in **Wide**). -struct RowFields { - i: usize, - site_label: String, - // Base time & angles - mjd_tt: f64, - ra_rad: f64, - dec_rad: f64, - // Rendered sexagesimal with uncertainties - ra_str: String, - dec_str: String, - // Optional extras by mode - jd_tt: Option, - r_geo: Option, - r_hel: Option, - iso_tt: Option, - iso_utc: Option, -} - -impl<'a> ObservationsDisplay<'a> { - /// Build a new table adaptor (default: **compact** columns). - /// - /// Arguments - /// ----------------- - /// * `obs` – Borrowed observation container to render. - /// - /// Return - /// ---------- - /// * An `ObservationsDisplay` configured for the **Default** mode. - /// - /// See also - /// ------------ - /// * [`Self::wide`] – Enable the wide layout. - /// * [`Self::iso`] – Enable the ISO layout. - pub fn new(obs: &'a Observations) -> Self { - Self { - obs, - env: None, - mode: TableMode::Default, - sec_prec: 3, - dist_prec: 6, - sorted: false, - } - } - - /// Switch to **wide** mode (adds JD, radians, vector norms). - /// - /// Adds the following columns: - /// - `JD (TT)` - /// - `RA [rad]`, `DEC [rad]` - /// - `|r_geo| AU`, `|r_hel| AU` - /// - /// Arguments - /// ----------------- - /// * `yes` – If `true`, selects the **Wide** layout; otherwise resets to **Default**. - /// - /// Return - /// ---------- - /// * `Self` (builder style), allowing chained configuration. - /// - /// See also - /// ------------ - /// * [`ObservationsDisplayExt::table_wide`] - pub fn wide(mut self, yes: bool) -> Self { - self.mode = if yes { - TableMode::Wide - } else { - TableMode::Default - }; - self - } - - /// Switch to **ISO** mode (replace MJD/JD with ISO TT and ISO UTC columns). - /// - /// Replaces the time columns with: - /// - `ISO (TT)` — Gregorian breakdown on TT, - /// - `ISO (UTC)` — TT converted to UTC (leap seconds handled by `hifitime`). - /// - /// Return - /// ---------- - /// * `Self` (builder style), allowing chained configuration. - /// - /// Notes - /// ---------- - /// * ISO strings are produced via `hifitime`, using leap-second tables for UTC. - /// * This mode uses [`comfy-table`](https://docs.rs/comfy-table/latest/comfy_table/). - /// - /// See also - /// ------------ - /// * [`ObservationsDisplayExt::table_iso`] - pub fn iso(mut self) -> Self { - self.mode = TableMode::Iso; - self - } - - /// Set seconds precision for **sexagesimal** and **ISO** seconds. - /// - /// Arguments - /// ----------------- - /// * `p` – Number of fractional digits to render (typ. `0..=9`). - /// - /// Return - /// ---------- - /// * `Self` (builder style). - /// - /// Notes - /// ---------- - /// * Affects both RA/DEC seconds and ISO seconds. - pub fn with_seconds_precision(mut self, p: usize) -> Self { - self.sec_prec = p; - self - } - - /// Set decimal precision for **AU** distances (wide mode only). - /// - /// Arguments - /// ----------------- - /// * `p` – Fixed-point fractional digits for the `|r_geo|` and `|r_hel|` columns. - /// - /// Return - /// ---------- - /// * `Self` (builder style). - pub fn with_distance_precision(mut self, p: usize) -> Self { - self.dist_prec = p; - self - } - - /// Enable/disable **time-sorted** display. - /// - /// Arguments - /// ----------------- - /// * `yes` – If `true`, rows are sorted by `Observation::time` (MJD TT) ascending. - /// - /// Return - /// ---------- - /// * `Self` (builder style), allowing chained configuration. - /// - /// Notes - /// ---------- - /// * Sorting uses a **stable** index order (no reordering or cloning of observations). - /// * The `#` column prints the **original index** (pre-sort). - pub fn sorted(mut self) -> Self { - self.sorted = true; - self - } - - /// Attach an [`Outfit`] to resolve **observer names** in the `Site` column. - /// - /// If a name is available, rows show `"Name (#id)"`. Otherwise the numeric - /// site id is displayed. - /// - /// Example - /// ------- - /// ```rust,no_run - /// println!("{}", observations.table_iso().with_env(&env).sorted()); - /// ``` - /// - /// Arguments - /// ----------------- - /// * `env` – The [`Outfit`] environment to use for resolving observer names. - pub fn with_env(mut self, env: &'a Outfit) -> Self { - self.env = Some(env); - self - } - - /// Generate the label for the observer site of a given observation. - /// - /// Arguments - /// ----------------- - /// * `i` – Original index of the observation (pre-sort). - /// - /// Return - /// ----------------- - /// * A string label for the site, either `"Name (#id)"` or `"#id"`. - fn site_label(&self, i: usize) -> String { - if let Some(env) = self.env { - let site_id = self.obs[i].observer; - let site = env.get_observer_from_uint16(site_id); - if let Some(name) = site.name.as_deref() { - if !name.is_empty() { - return format!("{name} (#{site_id})"); - } - } - format!("Site ID #{site_id}") - } else { - // No environment: keep a compact ID for compatibility - format!("{}", self.obs[i].observer) - } - } - - /// Write the table header according to the selected mode. - fn write_header(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self.mode { - TableMode::Default => { - writeln!( - f, - "{:>3} {:>5} {:>14} {:>20} {:>20}", - "#", "Site", "MJD (TT)", "RA ±σ[arcsec]", "DEC ±σ[arcsec]" - ) - } - TableMode::Wide => { - writeln!( - f, - "{:>3} {:>5} {:>14} {:>14} {:>26} {:>11} {:>26} {:>11} {:>12} {:>12}", - "#", - "Site", - "MJD (TT)", - "JD (TT)", - "RA ±σ[arcsec]", - "RA [rad]", - "DEC ±σ[arcsec]", - "DEC [rad]", - "|r_geo| AU", - "|r_hel| AU" - ) - } - TableMode::Iso => { - writeln!( - f, - "{:>3} {:>5} {:>26} {:>26} {:>26} {:>26}", - "#", "Site", "ISO (TT)", "ISO (UTC)", "RA ±σ[arcsec]", "DEC ±σ[arcsec]" - ) - } - } - } - - /// Build an iterator over `(original_index, &Observation)` honoring the `sorted` flag. - /// - /// Return - /// ---------- - /// * A boxed iterator over `(index_before_sort, &Observation)`. - /// - /// Notes - /// ---------- - /// * When `sorted == true`, indices are ordered by MJD(TT) ascending, with a stable - /// tie-break on the original index. - fn row_iter(&self) -> Box + '_> { - if self.sorted { - use std::cmp::Ordering; - let mut order: Vec = (0..self.obs.len()).collect(); - order.sort_by(|&a, &b| { - let ta: f64 = self.obs[a].time; - let tb: f64 = self.obs[b].time; - match ta.partial_cmp(&tb) { - Some(ord) => ord, - None => Ordering::Equal, // NaN-safe - } - .then_with(|| a.cmp(&b)) - }); - Box::new(order.into_iter().map(|i| (i, &self.obs[i]))) - } else { - Box::new(self.obs.iter().enumerate()) - } - } - - /// Compute common formatted values once for a given row. - /// - /// Arguments - /// ----------------- - /// * `i` – Original index of the observation (pre-sort). - /// * `o` – Borrowed [`Observation`] for this row. - /// - /// Return - /// ---------- - /// * A populated [`RowFields`] struct reused by the row writer. - fn format_row_fields(&self, i: usize, o: &Observation) -> RowFields { - let sp = self.sec_prec; - - // Sexagesimal decomposition - let ra_rad: f64 = o.ra; - let dec_rad: f64 = o.dec; - let (hh, mm, ss) = ra_hms_prec(ra_rad, sp); - let (sgn, dd, dm, ds) = dec_sdms_prec(dec_rad, sp); - let ss_s = fmt_ss(ss, sp); - let ds_s = fmt_ss(ds, sp); - - // Uncertainties [arcsec] - let sra_as = o.error_ra * RAD2ARC; - let sdec_as = o.error_dec * RAD2ARC; - - // Common formatted strings - let ra_str = format!("{hh:02}h{mm:02}m{ss_s}s ± {sra_as:.3}\""); - let dec_str = format!("{sgn}{dd:02}°{dm:02}'{ds_s}\" ± {sdec_as:.3}\""); - - // Base time - let mjd_tt: f64 = o.time; - - // Mode-dependent extras (computed lazily below) - let (jd_tt, r_geo, r_hel, iso_tt, iso_utc) = match self.mode { - TableMode::Default => (None, None, None, None, None), - TableMode::Wide => { - let jd = mjd_tt + JDTOMJD; - let g = o.observer_earth_position.norm(); - let h = o.observer_helio_position.norm(); - (Some(jd), Some(g), Some(h), None, None) - } - TableMode::Iso => { - let epoch_tt = Epoch::from_mjd_in_time_scale(mjd_tt, TimeScale::TT); - let tt_str = iso_tt_from_epoch(epoch_tt, sp); - let utc_str = iso_utc_from_epoch(epoch_tt, sp); - (None, None, None, Some(tt_str), Some(utc_str)) - } - }; - - RowFields { - i, - site_label: self.site_label(i), - mjd_tt, - ra_rad, - dec_rad, - ra_str, - dec_str, - jd_tt, - r_geo, - r_hel, - iso_tt, - iso_utc, - } - } - - /// Render the WIDE table using comfy-table. - fn render_wide_comfy(&self) -> String { - let mut table = Table::new(); - table - .load_preset(UTF8_FULL) - .set_content_arrangement(ContentArrangement::Dynamic); - - // Header - table.set_header(vec![ - Cell::new("#"), - Cell::new("Site"), - Cell::new("MJD (TT)"), - Cell::new("JD (TT)"), - Cell::new("RA ±σ[arcsec]"), - Cell::new("RA [rad]"), - Cell::new("DEC ±σ[arcsec]"), - Cell::new("DEC [rad]"), - Cell::new("|r_geo| AU"), - Cell::new("|r_hel| AU"), - ]); - - // Rows - for (i, o) in self.row_iter() { - let r = self.format_row_fields(i, o); - let dp = self.dist_prec; - - table.add_row(Row::from(vec![ - Cell::new(r.i).set_alignment(CellAlignment::Right), - Cell::new(r.site_label).set_alignment(CellAlignment::Right), - Cell::new(format!("{:.6}", r.mjd_tt)).set_alignment(CellAlignment::Right), - Cell::new(format!("{:.6}", r.jd_tt.unwrap_or_default())) - .set_alignment(CellAlignment::Right), - Cell::new(r.ra_str.clone()).set_alignment(CellAlignment::Right), - Cell::new(format!("{:.7}", r.ra_rad)).set_alignment(CellAlignment::Right), - Cell::new(r.dec_str.clone()).set_alignment(CellAlignment::Right), - Cell::new(format!("{:.7}", r.dec_rad)).set_alignment(CellAlignment::Right), - Cell::new(format!("{:.*}", dp, r.r_geo.unwrap_or_default())) - .set_alignment(CellAlignment::Right), - Cell::new(format!("{:.*}", dp, r.r_hel.unwrap_or_default())) - .set_alignment(CellAlignment::Right), - ])); - } - - table.to_string() - } - - /// Render the ISO table using comfy-table. - fn render_iso_comfy(&self) -> String { - let mut table = Table::new(); - table - .load_preset(UTF8_FULL) - .set_content_arrangement(ContentArrangement::Dynamic); - - // Header - table.set_header(vec![ - Cell::new("#"), - Cell::new("Site"), - Cell::new("ISO (TT)"), - Cell::new("ISO (UTC)"), - Cell::new("RA ±σ[arcsec]"), - Cell::new("DEC ±σ[arcsec]"), - ]); - - // Rows - for (i, o) in self.row_iter() { - let r = self.format_row_fields(i, o); - table.add_row(Row::from(vec![ - Cell::new(r.i).set_alignment(CellAlignment::Right), - Cell::new(r.site_label).set_alignment(CellAlignment::Right), - Cell::new(r.iso_tt.as_deref().unwrap_or("")).set_alignment(CellAlignment::Right), - Cell::new(r.iso_utc.as_deref().unwrap_or("")).set_alignment(CellAlignment::Right), - Cell::new(r.ra_str.clone()).set_alignment(CellAlignment::Right), - Cell::new(r.dec_str.clone()).set_alignment(CellAlignment::Right), - ])); - } - - table.to_string() - } - - /// Write a single table row using pre-computed [`RowFields`]. - /// - /// Arguments - /// ----------------- - /// * `f` – Destination formatter. - /// * `r` – Pre-formatted row fields. - fn write_row(&self, f: &mut fmt::Formatter<'_>, r: &RowFields) -> fmt::Result { - match self.mode { - TableMode::Default => { - writeln!( - f, - "{i:>3} {site:>5} {mjd:>14.6} {ra:>20} {dec:>20}", - i = r.i, - site = r.site_label, - mjd = r.mjd_tt, - ra = r.ra_str, - dec = r.dec_str - ) - } - TableMode::Wide => { - let dp = self.dist_prec; - writeln!( - f, - "{i:>3} {site:>5} {mjd:>14.6} {jd:>14.6} {ra:>20} {ra_rad:>11.7} {dec:>20} {dec_rad:>11.7} {rgeo:>12.dp$} {rhel:>12.dp$}", - i = r.i, - site = r.site_label, - mjd = r.mjd_tt, - jd = r.jd_tt.unwrap_or_default(), - ra = r.ra_str, - ra_rad = r.ra_rad, - dec = r.dec_str, - dec_rad = r.dec_rad, - rgeo = r.r_geo.unwrap_or_default(), - rhel = r.r_hel.unwrap_or_default(), - dp = dp - ) - } - TableMode::Iso => { - writeln!( - f, - "{i:>3} {site:>5} {iso_tt:>26} {iso_utc:>26} {ra:>20} {dec:>20}", - i = r.i, - site = r.site_label, - iso_tt = r.iso_tt.as_deref().unwrap_or(""), - iso_utc = r.iso_utc.as_deref().unwrap_or(""), - ra = r.ra_str, - dec = r.dec_str - ) - } - } - } -} - -/// Ergonomic extension to create table adaptors from an [`Observations`] collection. -/// -/// Provided builders -/// ----------------- -/// * [`ObservationsDisplayExt::show`] – Default compact table. -/// * [`ObservationsDisplayExt::table_wide`] – Wide table with diagnostics. -/// * [`ObservationsDisplayExt::table_iso`] – ISO-centric table (TT + UTC). -/// -/// Examples -/// ---------- -/// ```rust,ignore -/// println!("{}", observations.show()); // Default -/// println!("{}", observations.table_wide()); // Wide -/// println!("{}", observations.table_iso()); // ISO -/// println!("{}", observations.show().with_seconds_precision(4)); -/// ``` -pub trait ObservationsDisplayExt { - /// Wide table (adds JD, RA/DEC in radians, vector norms in AU). - /// - /// Return - /// ---------- - /// * A configured [`ObservationsDisplay`] in **Wide** mode. - fn table_wide(&self) -> ObservationsDisplay<'_>; - - /// ISO table (replaces MJD/JD with `ISO (TT)` and `ISO (UTC)`). - /// - /// Return - /// ---------- - /// * A configured [`ObservationsDisplay`] in **ISO** mode. - fn table_iso(&self) -> ObservationsDisplay<'_>; - - /// Create a zero-allocation display adaptor (Default/compact mode). - /// - /// Examples - /// ---------- - /// ```rust,ignore - /// // Compact table - /// println!("{}", observations.show()); - /// - /// // Derive other modes from it (builder style) - /// println!("{}", observations.show().wide(true)); // Wide - /// println!("{}", observations.show().iso()); // ISO - /// ``` - fn show(&self) -> ObservationsDisplay<'_>; - - /// Convenience: return a formatted `String` in **compact** mode. - /// - /// Return - /// ---------- - /// * An owned `String` containing the compact table. - fn show_string(&self) -> String { - format!("{}", self.show()) - } -} - -impl ObservationsDisplayExt for Observations { - fn table_wide(&self) -> ObservationsDisplay<'_> { - ObservationsDisplay::new(self).wide(true) - } - fn table_iso(&self) -> ObservationsDisplay<'_> { - ObservationsDisplay::new(self).iso() - } - fn show(&self) -> ObservationsDisplay<'_> { - ObservationsDisplay::new(self) - } -} - -impl fmt::Display for ObservationsDisplay<'_> { - /// Render the table according to the selected mode. - /// - /// Notes - /// ---------- - /// * Rows are printed in the **current order** unless `sorted(true)` is set. - /// * When sorted, ordering is by MJD(TT) ascending, with ties broken by original index. - /// * Numeric fields are right-aligned; headers have fixed widths for readability. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let n = self.obs.len(); - writeln!(f, "Observations (n={n})")?; - writeln!(f, "-------------------")?; - - match self.mode { - TableMode::Wide => { - // comfy-table rendering - let out = self.render_wide_comfy(); - f.write_str(&out)?; - } - TableMode::Iso => { - // comfy-table rendering - let out = self.render_iso_comfy(); - f.write_str(&out)?; - } - TableMode::Default => { - // Legacy compact mode: keep your existing fixed-width rendering - self.write_header(f)?; - for (i, o) in self.row_iter() { - let row = self.format_row_fields(i, o); - self.write_row(f, &row)?; - } - } - } - Ok(()) - } -} - -#[cfg(test)] -mod observation_display_tests { - use super::*; - use crate::observations::display::ObservationsDisplayExt; - use crate::Observations; - use nalgebra::Vector3; - - /// Build a minimal Observation for tests. - /// Angles are provided in degrees; uncertainties in arcseconds; time is MJD (TT). - fn make_obs( - site: u16, - ra_deg: f64, - dec_deg: f64, - err_arcsec: f64, - mjd_tt: f64, - rgeo: (f64, f64, f64), - rhel: (f64, f64, f64), - ) -> Observation { - // Convert helpers - let ra_rad = ra_deg.to_radians(); - let dec_rad = dec_deg.to_radians(); - let err_rad = (err_arcsec / 3600.0).to_radians(); - - Observation { - observer: site, - ra: ra_rad, // Radian from f64 - error_ra: err_rad, // Radian from f64 - dec: dec_rad, // Radian from f64 - error_dec: err_rad, // Radian from f64 - time: mjd_tt, // MJD from f64 - observer_earth_position: Vector3::new(rgeo.0, rgeo.1, rgeo.2), - observer_helio_position: Vector3::new(rhel.0, rhel.1, rhel.2), - } - } - - /// Build a small, heterogeneous set of observations for table tests. - fn sample_observations() -> Observations { - let mut obs: Observations = Observations::default(); - // idx = 0 (later than #1), zero vectors to simplify wide-mode distance checks - obs.push(make_obs( - 809, - 0.0, - 0.0, - 1.0, - 60000.123456, - (0.0, 0.0, 0.0), - (0.0, 0.0, 0.0), - )); - // idx = 1 (earliest), negative DEC to verify sign & DMS formatting - obs.push(make_obs( - 2, - 0.0, - -10.0, - 0.5, - 59000.0, - (0.0, 0.0, 0.0), - (0.0, 0.0, 0.0), - )); - // idx = 2 (latest), non-zero vectors to exercise wide-mode distances (1 and 2 AU) - obs.push(make_obs( - 500, - 180.0, - 20.0, - 1.2, - 60001.0, - (1.0, 0.0, 0.0), - (0.0, 2.0, 0.0), - )); - obs - } - - #[test] - fn default_headers_and_basic_format() { - let obs = sample_observations(); - let s = format!("{}", obs.show()); // Default, unsorted - - // Headers present - assert!(s.contains("MJD (TT)")); - assert!(s.contains("RA ±σ[arcsec]")); - assert!(s.contains("DEC ±σ[arcsec]")); - - // RA/DEC sexagesimal + uncertainties for idx 0 (RA=0h, DEC=+0°) - // Cells do not include 'RA=' / 'DEC=' prefixes in the table. - assert!(s.contains("00h00m00.000s ± 1.000\"")); - assert!(s.contains("+00°00'00.000\" ± 1.000\"")); - } - - #[test] - fn dec_negative_sign_is_preserved_in_table() { - let obs = sample_observations(); - let s = format!("{}", obs.show()); // Default, unsorted - // idx 1 has DEC = -10° (no 'DEC=' prefix in table cells) - assert!( - s.contains("-10°00'00.000\""), - "Negative DEC sign or DMS formatting incorrect: {s}" - ); - // And its sigma is 0.500" - assert!(s.contains("± 0.500\"")); - } - - #[test] - fn sorted_orders_by_time_and_keeps_original_index() { - let obs = sample_observations(); - let s = format!("{}", obs.show().sorted()); - - // Split lines: title, underline, header, then data rows... - let mut lines = s.lines(); - let _title = lines.next().unwrap_or_default(); - let _rule = lines.next().unwrap_or_default(); - let _hdr = lines.next().unwrap_or_default(); - - // First data row should correspond to the earliest epoch (idx = 1) - let first_row = lines.next().unwrap_or_default(); - assert!( - first_row.trim_start().starts_with("1"), - "Expected first printed row to be original index 1, got: {first_row}" - ); - // A later row should include index 0 (natural order changed by sort) - let rest = lines.collect::>().join("\n"); - assert!( - rest.contains("\n 0") || rest.starts_with(" 0"), - "Index 0 should also appear." - ); - } - - #[test] - fn wide_mode_headers_and_radians_and_distances() { - let obs = sample_observations(); - let s = format!("{}", obs.table_wide()); // Wide, unsorted - - // Headers present - assert!(s.contains("JD (TT)")); - assert!(s.contains("RA [rad]")); - assert!(s.contains("DEC [rad]")); - assert!(s.contains("|r_geo| AU")); - assert!(s.contains("|r_hel| AU")); - - // idx 1 has DEC = -10° => about -0.1745329 rad (7 decimals printed) - assert!( - s.contains("-0.1745329"), - "Expected DEC in radians around -0.1745329 rad in wide mode: {s}" - ); - - // idx 0 vectors are zeros => distances should include 0.000000 - assert!( - s.contains(" 0.000000"), - "Expected at least one zero distance in wide mode for idx 0: {s}" - ); - - // idx 2 vectors norms are 1 AU and 2 AU - assert!( - s.contains(" 1.000000") && s.contains(" 2.000000"), - "Expected distances 1.000000 and 2.000000 AU for idx 2: {s}" - ); - } - - #[test] - fn iso_mode_headers_and_suffixes() { - let obs = sample_observations(); - let s = format!("{}", obs.table_iso()); // ISO, unsorted - - // Headers present - assert!(s.contains("ISO (TT)")); - assert!(s.contains("ISO (UTC)")); - - // Body should contain ' TT' and 'Z' suffixes (at least once) - assert!(s.contains(" TT"), "TT suffix missing in ISO TT column: {s}"); - assert!(s.contains('Z'), "Z suffix missing in ISO UTC column: {s}"); - } - - #[test] - fn seconds_and_distance_precision_knobs() { - let obs = sample_observations(); - - // Seconds precision = 4: "00.0000" for RA seconds at 0h (no 'RA=' prefix in table cells) - let s_iso = format!("{}", obs.table_iso().with_seconds_precision(4)); - assert!( - s_iso.contains("00h00m00.0000s"), - "Seconds precision not applied: {s_iso}" - ); - - // Distance precision = 4: look for " 0.0000" in wide mode (idx 0 has zero vectors) - let s_wide = format!("{}", obs.table_wide().with_distance_precision(4)); - assert!( - s_wide.contains(" 0.0000"), - "Distance precision not applied (expected 4 decimals): {s_wide}" - ); - } - - #[test] - fn show_string_matches_display_default() { - let obs = sample_observations(); - let s1 = obs.show_string(); - let s2 = format!("{}", obs.show()); - assert_eq!(s1, s2, "show_string() must match Display in default mode"); - } -} diff --git a/src/observations/mod.rs b/src/observations/mod.rs deleted file mode 100644 index 10168d1..0000000 --- a/src/observations/mod.rs +++ /dev/null @@ -1,1498 +0,0 @@ -//! # Observations: ingestion, representation, and sky-projection utilities -//! -//! This module defines the core types and helpers to **ingest**, **store**, and **use** -//! optical astrometric observations for orbit determination workflows. -//! -//! ## What lives here? -//! -//! - [`Observation`](crate::observations::Observation) — a single astrometric measurement (RA/DEC at an epoch) with: -//! - the observing site identifier (`u16`), -//! - precomputed **geocentric** and **heliocentric** site positions at the epoch, -//! - astrometric uncertainties for RA/DEC. -//! -//! - Parsing & I/O: -//! - `from_80col` (private) and `extract_80col` (private) — read **80-column MPC** formatted files. -//! - [`ades_reader`](crate::trajectories::ades_reader) — ADES ingestion utilities (XML/CSV). -//! - `parquet_reader` (private) — internal helpers to read columnar batches. -//! -//! - Batch/transform helpers: -//! - [`trajectory_file`](crate::trajectories::trajectory_file) — build batches of observations (RA/DEC/time + σ) and convert to [`Observation`](crate::observations::Observation)s. -//! - [`observations_ext`](crate::observations::observations_ext) — higher-level operations on collections (triplet selection, RMS windows, metrics). -//! - [`triplets_iod`](crate::observations::triplets_iod) — construction of observation triplets for **Gauss IOD**. -//! -//! ## Units & reference frames -//! -//! - **Angles**: radians -//! - **Time**: MJD (TT scale) -//! - **Positions**: AU, **equatorial mean J2000** (J2000/ICRS-aligned) -//! -//! These conventions are enforced by [`Observation::new`](crate::observations::Observation::new), which computes and stores both -//! the **geocentric** and **heliocentric** site positions at the observation epoch using the -//! [`Outfit`](crate::outfit::Outfit) environment (UT1 provider, JPL ephemerides, site database). -//! -//! ## Typical workflow -//! -//! 1. **Ingest** observations: -//! - From MPC 80-col: \[`extract_80col`\] → `Vec` + object identifier. -//! - From ADES: via [`ades_reader`](crate::trajectories::ades_reader) into typed batches, then \[`observation_from_batch`\]. -//! -//! 2. **Precompute/Access positions** per observation: -//! - `get_observer_earth_position()` — geocentric site vector at epoch. -//! - `get_observer_helio_position()` — heliocentric site vector at epoch. -//! -//! 3. **Project to sky** (prediction / fitting): -//! - [`Observation::compute_apparent_position`](crate::observations::Observation::compute_apparent_position) — propagate an orbit (equinoctial elements), -//! apply frame transforms + aberration, and return apparent `(RA, DEC)`. -//! - [`Observation::ephemeris_error`](crate::observations::Observation::ephemeris_error) — normalized squared residual for a single observation. -//! -//! 4. **Build triplets and run IOD**: -//! - Use [`observations_ext`](crate::observations::observations_ext) / [`triplets_iod`](crate::observations::triplets_iod) to form high-quality triplets and feed -//! them to the Gauss solver (see `initial_orbit_determination::gauss`). -//! -//! ## Key types & functions -//! -//! - [`Observation`](crate::observations::Observation) — single measurement with site & precomputed positions. -//! - [`Observation::compute_apparent_position`](crate::observations::Observation::compute_apparent_position) — apparent `(RA, DEC)` from an orbit. -//! - [`Observation::ephemeris_error`](crate::observations::Observation::ephemeris_error) — per-observation χ²-like contribution. -//! -//! ## Example -//! -//! ```rust,no_run -//! use outfit::observations::Observation; -//! use outfit::outfit::Outfit; -//! use outfit::error_models::ErrorModel; -//! use outfit::constants::RADSEC; -//! -//! # use outfit::orbit_type::equinoctial_element::EquinoctialElements; -//! -//! let mut env = Outfit::new("horizon:DE440", ErrorModel::FCCT14)?; -//! -//! // Example: build one Observation manually -//! let obs = Observation::new( -//! &env, -//! 0, -//! 1.234, // RA [rad] -//! 0.5 * RADSEC, // σ_RA [rad] -//! 0.567, // DEC [rad] -//! 0.5 * RADSEC, // σ_DEC [rad] -//! 60300.0, // MJD (TT) -//! )?; -//! -//! // Predict apparent position for this observation given an orbit -//! # let eq: EquinoctialElements = unimplemented!(); -//! # let (_ra, _dec) = obs.compute_apparent_position(&env, &eq)?; -//! # Ok::<(), outfit::outfit_errors::OutfitError>(()) -//! ``` -//! -//! ## See also -//! -//! - [`initial_orbit_determination::gauss`] — Gauss IOD over observation triplets. -//! - [`observers`] — site database, Earth-fixed coordinates, and transformations. -//! - [`orbit_type::equinoctial_element::EquinoctialElements`] — propagation utilities used here. -//! - [`cartesian_to_radec`](crate::conversion::cartesian_to_radec) and [`correct_aberration`](crate::observations::correct_aberration) — sky-projection helpers. -pub mod display; -pub mod observations_ext; -pub mod triplets_generator; -pub mod triplets_iod; - -use crate::{ - constants::{Observations, Radian, DPI, JDTOMJD, MJD, RAD2ARC, VLIGHT_AU}, - conversion::{cartesian_to_radec, dec_sdms_prec, fmt_vec3_au, ra_hms_prec}, - observers::Observer, - orbit_type::equinoctial_element::EquinoctialElements, - outfit::Outfit, - outfit_errors::OutfitError, - time::{fmt_ss, iso_tt_from_epoch, iso_utc_from_epoch}, -}; -use hifitime::{Epoch, TimeScale}; -use nalgebra::Vector3; -use std::{f64::consts::PI, fmt}; - -/// Astrometric observation with site and precomputed observer positions. -/// -/// This structure represents a single optical astrometric measurement -/// (right ascension/declination at a given epoch) together with: -/// - the associated observing site identifier, -/// - the observer’s **geocentric** position vector at the epoch, and -/// - the observer’s **heliocentric** position vector at the epoch. -/// -/// Units & frames: -/// - Angles are stored in **radians**. -/// - Times are stored as **MJD (TT scale)**. -/// - Position vectors are expressed in **AU**, in the **equatorial mean J2000** frame. -/// -/// Fields -/// ----------------- -/// * `observer` – Site identifier (`u16`) referencing an [`Observer`] known by the [`Outfit`] state. -/// * `ra` – Right ascension `[rad]`. -/// * `error_ra` – Uncertainty on right ascension `[rad]`. -/// * `dec` – Declination `[rad]`. -/// * `error_dec` – Uncertainty on declination `[rad]`. -/// * `time` – Observation epoch as MJD (TT scale). -/// * `observer_earth_position` – Geocentric position of the observer at `time` (AU, equatorial mean J2000). -/// * `observer_helio_position` – Heliocentric position of the observer at `time` (AU, equatorial mean J2000). -#[derive(Debug, Clone, PartialEq, Copy)] -pub struct Observation { - pub(crate) observer: u16, - pub ra: Radian, - pub error_ra: Radian, - pub dec: Radian, - pub error_dec: Radian, - pub time: MJD, - pub(crate) observer_earth_position: Vector3, - pub(crate) observer_helio_position: Vector3, -} - -impl Observation { - /// Create a new astrometric observation and precompute observer positions. - /// - /// This constructor stores the astrometric angles and time, and computes the observer’s - /// **geocentric** and **heliocentric** position vectors at the same epoch using the - /// provided [`Outfit`] environment (UT1 provider, ephemerides, and site metadata). - /// - /// Arguments - /// ----------------- - /// * `state` – Global environment providing ephemerides, UT1 provider and site database. - /// * `observer` – Site identifier (`u16`) referencing an [`Observer`] known by `state`. - /// * `ra` – Right ascension `[rad]`. - /// * `error_ra` – Uncertainty on right ascension `[rad]`. - /// * `dec` – Declination `[rad]`. - /// * `error_dec` – Uncertainty on declination `[rad]`. - /// * `time` – Observation epoch as **MJD (TT scale)**. - /// - /// Return - /// ---------- - /// * A `Result` with the newly created [`Observation`], or an [`OutfitError`] if: - /// - the observer cannot be resolved in `state`, - /// - the UT1 provider / ephemeris computation fails. - /// - /// Remarks - /// ------------ - /// * `pvobs` computes the geocentric position (and velocity) of the observer from Earth rotation and site coordinates. - /// * `helio_position` converts the geocentric position to the heliocentric frame using the selected JPL ephemeris. - /// * Both positions are expressed in **AU**, **equatorial mean J2000**. - /// - /// See also - /// ------------ - /// * [`Observer::pvobs`] – Geocentric position/velocity of the observing site. - /// * [`Observer::helio_position`] – Heliocentric position of the observing site. - /// * [`crate::trajectories::batch_reader::ObservationBatch`] – Batch operations on observations. - pub fn new( - state: &Outfit, - observer: u16, - ra: Radian, - error_ra: Radian, - dec: Radian, - error_dec: Radian, - time: MJD, - ) -> Result { - // Observation time in TT - let obs_mjd = Epoch::from_mjd_in_time_scale(time, hifitime::TimeScale::TT); - let obs = state.get_observer_from_uint16(observer); - let (geo_obs_pos, _) = obs.pvobs(&obs_mjd, state.get_ut1_provider())?; - let helio_obs_pos = obs.helio_position(state, &obs_mjd, &geo_obs_pos)?; - - Ok(Observation { - observer, - ra, - error_ra, - dec, - error_dec, - time, - observer_earth_position: geo_obs_pos, - observer_helio_position: helio_obs_pos, - }) - } - - /// Construct an [`Observation`] from precomputed observer positions. - /// - /// This constructor is a **fast-path alternative** to [`Observation::new`]: - /// it skips all ephemeris calls by directly injecting the observer’s - /// geocentric and heliocentric positions. This is useful in ingestion - /// pipelines (e.g. Parquet readers) where positions can be cached and - /// reused for multiple observations sharing the same `(observer, time)`. - /// - /// Arguments - /// ----------------- - /// * `observer` – Packed observer identifier (`u16`). - /// * `ra`, `error_ra` – Right ascension in radians and its 1-σ uncertainty (radians). - /// * `dec`, `error_dec` – Declination in radians and its 1-σ uncertainty (radians). - /// * `time` – Observation epoch in Modified Julian Date (TT scale). - /// * `observer_earth_position` – Geocentric observer position vector (AU, equatorial mean J2000). - /// * `observer_helio_position` – Heliocentric observer position vector (AU, equatorial mean J2000). - /// - /// Return - /// ---------- - /// * A fully initialized [`Observation`] where astrometric quantities are set - /// and observer positions are trusted to be externally consistent. - /// - /// Remarks - /// ------------ - /// * Use this constructor only when you can guarantee that positions were - /// computed consistently with the same environment (`Outfit`, UT1, ephemerides). - /// * All getter methods behave identically to those of [`Observation::new`]. - /// - /// See also - /// ------------ - /// * [`Observation::new`] – Computes positions internally (slower, but self-contained). - /// * [`Observer::pvobs`] – Routine for geocentric position/velocity. - /// * [`Observer::helio_position`] – Routine for heliocentric position. - #[allow(clippy::too_many_arguments)] - pub fn with_positions( - observer: u16, - ra: Radian, - error_ra: Radian, - dec: Radian, - error_dec: Radian, - time: MJD, - observer_earth_position: Vector3, - observer_helio_position: Vector3, - ) -> Self { - Self { - observer, - ra, - error_ra, - dec, - error_dec, - time, - observer_earth_position, - observer_helio_position, - } - } - - /// Get the observer heliocentric position at the observation epoch. - /// - /// Arguments - /// ----------------- - /// * *(none)* – Accessor method. - /// - /// Return - /// ---------- - /// * A copy of the `3D` position vector (AU, equatorial mean J2000) of the observer - /// at `self.time` (MJD TT). - /// - /// See also - /// ------------ - /// * [`Observation::new`] – Computes and stores this vector at construction. - /// * [`Observer::helio_position`] – Underlying routine used to compute the value. - pub fn get_observer_helio_position(&self) -> Vector3 { - self.observer_helio_position - } - - /// Get the observer geocentric position at the observation epoch. - /// - /// Arguments - /// ----------------- - /// * *(none)* – Accessor method. - /// - /// Return - /// ---------- - /// * A copy of the `3D` position vector (AU, equatorial mean J2000) of the observer - /// relative to the Earth’s center at `self.time` (MJD TT). - /// - /// Remarks - /// ------------ - /// * This vector is computed at construction via [`Observer::pvobs`]. - /// * Units are astronomical units (AU), in the equatorial mean J2000 frame. - /// - /// See also - /// ------------ - /// * [`Observation::new`] – Computes and stores this vector at construction. - /// * [`Observer::pvobs`] – Underlying routine used to compute the value. - pub fn get_observer_earth_position(&self) -> Vector3 { - self.observer_earth_position - } - - /// Get the observer from the observation - /// - /// Arguments - /// --------- - /// * `env_state`: a mutable reference to the Outfit instance - /// - /// Return - /// ------ - /// * The observer - pub fn get_observer<'a>(&self, env_state: &'a Outfit) -> &'a Observer { - env_state.get_observer_from_uint16(self.observer) - } - - /// Compute the apparent equatorial coordinates (RA, DEC) of a solar system body - /// as seen by this observation’s site at its epoch. - /// - /// Overview - /// ----------------- - /// This method determines the apparent sky position of a target body, - /// described by equinoctial orbital elements, as seen from the observing site - /// corresponding to this [`Observation`]. - /// - /// The computation steps are: - /// 1. **Orbit propagation** – Propagate the body’s state from its reference epoch to the observation epoch using a two-body model. - /// 2. **Reference frame handling** – Retrieve Earth’s barycentric position from the JPL ephemeris and transform to *ecliptic mean J2000*. - /// 3. **Observer position** – Compute the observer’s heliocentric position (Earth + site geocentric offset). - /// 4. **Light-time and aberration correction** – Form the observer–object vector and correct for aberration. - /// 5. **Conversion to equatorial coordinates** – Convert the corrected line-of-sight vector to (RA, DEC). - /// - /// Arguments - /// ----------------- - /// * `state` – Global environment providing ephemerides, UT1 provider, and frame utilities. - /// * `equinoctial_element` – Orbital elements of the target body. - /// - /// Return - /// ---------- - /// * `Result<(f64, f64), OutfitError>` – The apparent right ascension and declination `[rad]`. - /// - /// Units - /// ---------- - /// * Positions: AU - /// * Velocities: AU/day - /// * Angles: radians - /// * Time: MJD TT - /// - /// Errors - /// ---------- - /// Returns [`OutfitError`] if: - /// - Orbit propagation fails, - /// - Ephemeris data is unavailable, - /// - Reference-frame transformation fails. - /// - /// See also - /// ------------ - /// * [`EquinoctialElements::solve_two_body_problem`] – Orbit propagation. - /// * [`Observer::pvobs`] – Computes observer’s geocentric position. - /// * [`correct_aberration`] – Aberration correction. - /// * [`cartesian_to_radec`] – Convert Cartesian vectors to (RA, DEC). - pub fn compute_apparent_position( - &self, - state: &Outfit, - equinoctial_element: &EquinoctialElements, - ) -> Result<(f64, f64), OutfitError> { - // Hyperbolic/parabolic orbits (e >= 1) are not yet supported - if equinoctial_element.eccentricity() >= 1.0 { - return Err(OutfitError::InvalidOrbit( - "Eccentricity >= 1 is not yet supported".to_string(), - )); - } - - // 1. Propagate asteroid position/velocity in ecliptic J2000 - let (cart_pos_ast, cart_pos_vel, _) = equinoctial_element.solve_two_body_problem( - 0., - self.time - equinoctial_element.reference_epoch, - false, - )?; - - // 2. Observation time in TT - let obs_mjd = Epoch::from_mjd_in_time_scale(self.time, hifitime::TimeScale::TT); - - // 3. Earth's barycentric position in ecliptic J2000 - let (earth_position, _) = state.get_jpl_ephem()?.earth_ephemeris(&obs_mjd, false); - - // 4. get rotation from equatorial mean J2000 to ecliptic mean J2000 - let matrix_elc_transform = state.get_rot_equmj2000_to_eclmj2000(); - - let earth_pos_eclj2000 = matrix_elc_transform.transpose() * earth_position; - let cart_pos_ast_eclj2000 = matrix_elc_transform * cart_pos_ast; - let cart_pos_vel_eclj2000 = matrix_elc_transform * cart_pos_vel; - - // 5. Observer heliocentric position - let geo_obs_pos = self.observer_earth_position; - let xobs = geo_obs_pos + earth_pos_eclj2000; - let obs_on_earth = matrix_elc_transform * xobs; - - // 6. Relative position and aberration correction - let relative_position = cart_pos_ast_eclj2000 - obs_on_earth; - let corrected_pos = correct_aberration(relative_position, cart_pos_vel_eclj2000); - - // 7. Convert to RA/DEC - let (alpha, delta, _) = cartesian_to_radec(corrected_pos); - Ok((alpha, delta)) - } - - /// Compute the normalized squared astrometric residuals (RA, DEC) - /// between an observed position and a propagated ephemeris. - /// - /// Overview - /// ----------------- - /// This method compares the actual astrometric measurement stored in `self` - /// against the expected position of the target body propagated from - /// equinoctial elements. - /// It returns a scalar representing the sum of squared, normalized residuals - /// in RA and DEC. - /// - /// Arguments - /// ----------------- - /// * `state` – Global environment providing ephemerides and time conversions. - /// * `equinoctial_element` – Orbital elements of the target body. - /// - /// Return - /// ---------- - /// * `Result` – Dimensionless scalar value representing the weighted sum - /// of squared residuals. Equivalent to a chi² contribution for a single observation (without division by 2). - /// - /// Remarks - /// ---------- - /// * Residuals are normalized by the astrometric uncertainties `error_ra` and `error_dec`. - /// * RA residuals are multiplied by `cos(dec)` to account for projection effects. - /// * All angles are in radians. - /// - /// Errors - /// ---------- - /// Returns [`OutfitError`] if propagation or ephemeris lookup fails. - /// - /// See also - /// ------------ - /// * [`compute_apparent_position`](crate::observations::Observation::compute_apparent_position) – Used internally to obtain predicted RA/DEC. - /// * [`Observer::pvobs`] – Computes observer’s geocentric position. - /// * [`correct_aberration`] – Applies aberration correction. - /// * [`cartesian_to_radec`] – Converts 3D vectors to (RA, DEC). - /// * [`EquinoctialElements::solve_two_body_problem`] – Two-body propagation. - pub fn ephemeris_error( - &self, - state: &Outfit, - equinoctial_element: &EquinoctialElements, - ) -> Result { - let (alpha, delta) = self.compute_apparent_position(state, equinoctial_element)?; - - // ΔRA with wrapping to [-π, π] - let mut diff_alpha = (self.ra - alpha) % DPI; - if diff_alpha > PI { - diff_alpha -= DPI; - } - - let diff_delta = self.dec - delta; - - // Weighted RMS - let rms_ra = (self.dec.cos() * (diff_alpha / self.error_ra)).powi(2); - let rms_dec = (diff_delta / self.error_dec).powi(2); - - Ok(rms_ra + rms_dec) - } -} - -/// Apply stellar aberration correction to a relative position vector. -/// -/// This function computes the apparent position of a target object by applying -/// the first-order correction for stellar aberration due to the observer's velocity. -/// It assumes the classical limit (v ≪ c), using a linear time-delay model. -/// -/// Arguments -/// --------- -/// * `xrel`: relative position vector from observer to object \[AU\]. -/// * `vrel`: velocity of the observer relative to the barycenter \[AU/day\]. -/// -/// Returns -/// -------- -/// * Corrected position vector (same units and directionality as `xrel`), -/// shifted by the aberration effect. -/// -/// Formula -/// ------- -/// The corrected position is given by: -/// ```text -/// x_corr = xrel − (‖xrel‖ / c) · vrel -/// ``` -/// where `c` is the speed of light in AU/day (`VLIGHT_AU`). -/// -/// Remarks -/// ------- -/// * This function does **not** normalize the output. -/// * Suitable for use in astrometric modeling or when computing apparent direction -/// of celestial objects as seen from a moving observer. -pub fn correct_aberration(xrel: Vector3, vrel: Vector3) -> Vector3 { - let norm_vector = xrel.norm(); - let dt = norm_vector / VLIGHT_AU; - xrel - dt * vrel -} - -impl fmt::Display for Observation { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - // Extract numeric values (adapt if Radian/MJD are newtypes). - let ra_rad: f64 = self.ra; - let dec_rad: f64 = self.dec; - let sra_as: f64 = self.error_ra * RAD2ARC; - let sdec_as: f64 = self.error_dec * RAD2ARC; - let mjd_tt: f64 = self.time; - let jd_tt = mjd_tt + JDTOMJD; - - // Formatting precisions - let sec_prec = 3; - let pos_prec = 6; - - // Sexagesimal angles with carry-safe rounding - let (rh, rm, rs) = ra_hms_prec(ra_rad, sec_prec); - let (sgn, dd, dm, ds) = dec_sdms_prec(dec_rad, sec_prec); - let rs_s = fmt_ss(rs, sec_prec); - let ds_s = fmt_ss(ds, sec_prec); - - if f.alternate() { - // Pretty multi-line variant with {:#} - let site = self.observer; - let r_geo = fmt_vec3_au(&self.observer_earth_position, pos_prec); - let r_hel = fmt_vec3_au(&self.observer_helio_position, pos_prec); - - // Build TT epoch and derive both TT ISO & UTC ISO via hifitime. - let epoch_tt = Epoch::from_mjd_in_time_scale(mjd_tt, TimeScale::TT); - let iso_tt = iso_tt_from_epoch(epoch_tt, sec_prec); - let iso_utc = iso_utc_from_epoch(epoch_tt, sec_prec); - - writeln!(f, "Astrometric observation")?; - writeln!(f, "----------------------")?; - writeln!(f, "Site ID : {site}")?; - writeln!(f, "Epoch (TT) : MJD {mjd_tt:.6}, JD {jd_tt:.6}")?; - writeln!(f, "Epoch (ISO TT) : {iso_tt}")?; - writeln!(f, "Epoch (ISO UTC): {iso_utc}")?; - writeln!( - f, - "RA / σ : {rh:02}h {rm:02}m {rs_s}s (σ = {sra_as:.3}\" )" - )?; - writeln!( - f, - "DEC / σ : {sgn}{dd:02}° {dm:02}' {ds_s}\" (σ = {sdec_as:.3}\" )" - )?; - writeln!(f, "Observer (geo) : {r_geo}")?; - writeln!(f, "Observer (hel) : {r_hel}") - } else { - // Compact single line — keep the original contract so existing tests still pass. - let site = self.observer; - let r_geo = fmt_vec3_au(&self.observer_earth_position, pos_prec); - let r_hel = fmt_vec3_au(&self.observer_helio_position, pos_prec); - - write!( - f, - "Obs(site={site}, MJD={mjd_tt:.6} TT, RA={rh:02}h{rm:02}m{rs_s}s ± {sra_as:.3}\", \ -DEC={sgn}{dd:02}°{dm:02}'{ds_s}\" ± {sdec_as:.3}\", r_geo={r_geo}, r_hel={r_hel})" - ) - } - } -} - -#[cfg(test)] -#[cfg(feature = "jpl-download")] -mod test_observations { - - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - - use super::*; - - mod tests_compute_apparent_position { - - use super::*; - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - use approx::assert_relative_eq; - - /// Helper: simple circular equinoctial elements for a 1 AU, zero inclination orbit. - fn simple_circular_elements(epoch: f64) -> EquinoctialElements { - EquinoctialElements { - reference_epoch: epoch, - semi_major_axis: 1.0, - eccentricity_sin_lon: 0.0, - eccentricity_cos_lon: 0.0, - tan_half_incl_sin_node: 0.0, - tan_half_incl_cos_node: 0.0, - mean_longitude: 0.0, - } - } - - #[test] - fn test_compute_apparent_position_nominal() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let t_obs = 59000.0; // MJD - let equinoctial = simple_circular_elements(t_obs); - - let obs = Observation::new(state, observer_code, 0.0, 0.0, 0.0, 0.0, t_obs).unwrap(); - - let (ra, dec) = obs - .compute_apparent_position(state, &equinoctial) - .expect("Computation should succeed"); - - assert!(ra.is_finite()); - assert!(dec.is_finite()); - assert!((0.0..2.0 * std::f64::consts::PI).contains(&ra)); - assert!((-std::f64::consts::FRAC_PI_2..std::f64::consts::FRAC_PI_2).contains(&dec)); - } - - #[test] - fn test_compute_apparent_position_same_epoch() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let t_epoch = 60000.0; - let equinoctial = simple_circular_elements(t_epoch); - - let obs = Observation::new(state, observer_code, 0.0, 0.0, 0.0, 0.0, t_epoch).unwrap(); - - let (ra1, dec1) = obs.compute_apparent_position(state, &equinoctial).unwrap(); - let (ra2, dec2) = obs.compute_apparent_position(state, &equinoctial).unwrap(); - - // The same input should always produce the same result - assert_relative_eq!(ra1, ra2, epsilon = 1e-14); - assert_relative_eq!(dec1, dec2, epsilon = 1e-14); - } - - #[test] - fn test_apparent_position_for_distant_object() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - let t_obs = 59000.0; - let mut equinoctial = simple_circular_elements(t_obs); - - // Objet far away - equinoctial.semi_major_axis = 100.0; - - let obs = Observation::new(state, observer_code, 0.0, 0.0, 0.0, 0.0, t_obs).unwrap(); - - let (ra, dec) = obs - .compute_apparent_position(state, &equinoctial) - .expect("Should compute apparent position for distant object"); - - assert!(ra.is_finite()); - assert!(dec.is_finite()); - } - - #[test] - fn test_compute_apparent_position_propagation_failure() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - // Invalid orbital elements to force failure in solve_two_body_problem - let equinoctial = EquinoctialElements { - reference_epoch: 59000.0, - semi_major_axis: -1.0, // Physically invalid - eccentricity_sin_lon: 0.0, - eccentricity_cos_lon: 0.0, - tan_half_incl_sin_node: 0.0, - tan_half_incl_cos_node: 0.0, - mean_longitude: 0.0, - }; - - let obs = Observation::new(state, observer_code, 0.0, 0.0, 0.0, 0.0, 59000.0).unwrap(); - - let result = obs.compute_apparent_position(state, &equinoctial); - assert!(result.is_err(), "Invalid elements should trigger an error"); - } - - mod proptests_apparent_position { - use std::sync::Arc; - - use super::*; - use proptest::prelude::*; - - /// Strategy: generates random but reasonable equinoctial elements - /// for property-based tests. - fn arb_equinoctial_elements() -> impl Strategy { - ( - 58000.0..62000.0, // reference_epoch (MJD) - 0.5..30.0, // semi-major axis (AU) - -0.5..0.5, // h = e * sin(Ω+ω) - -0.5..0.5, // k = e * cos(Ω+ω) - -0.5..0.5, // p = tan(i/2)*sin Ω - -0.5..0.5, // q = tan(i/2)*cos Ω - 0.0..(2.0 * std::f64::consts::PI), // mean longitude (rad) - ) - .prop_map(|(epoch, a, h, k, p, q, lambda)| { - EquinoctialElements { - reference_epoch: epoch, - semi_major_axis: a, - eccentricity_sin_lon: h, - eccentricity_cos_lon: k, - tan_half_incl_sin_node: p, - tan_half_incl_cos_node: q, - mean_longitude: lambda, - } - }) - } - - /// Strategy: generates random observer locations on Earth. - /// - longitude in [-180, 180] degrees - /// - latitude in [-90, 90] degrees - /// - elevation from 0 to 5 km - fn arb_observer() -> impl Strategy { - (-180.0..180.0, -90.0..90.0, 0.0..5.0).prop_map(|(lon, lat, elev)| { - Observer::new(lon, lat, elev, None, None, None).unwrap() - }) - } - - /// Strategy: generates equinoctial elements with a wide range, - /// including extreme eccentricities and inclinations. - fn arb_extreme_equinoctial_elements() -> impl Strategy { - ( - 58000.0..62000.0, - 0.1..50.0, - -0.99..0.99, - -0.99..0.99, - -1.0..1.0, - -1.0..1.0, - 0.0..(2.0 * std::f64::consts::PI), - ) - .prop_map(|(epoch, a, h, k, p, q, lambda)| EquinoctialElements { - reference_epoch: epoch, - semi_major_axis: a, - eccentricity_sin_lon: h, - eccentricity_cos_lon: k, - tan_half_incl_sin_node: p, - tan_half_incl_cos_node: q, - mean_longitude: lambda, - }) - // Filter out cases where eccentricity >= 1 - .prop_filter( - "Only bound (elliptical) orbits are supported", - |elem: &EquinoctialElements| { - let e = (elem.eccentricity_sin_lon.powi(2) - + elem.eccentricity_cos_lon.powi(2)) - .sqrt(); - e < 0.99 - }, - ) - } - - proptest! { - /// Property test: RA and DEC are always finite and in the expected ranges. - #[test] - fn proptest_ra_dec_are_finite_and_in_range( - equinoctial in arb_equinoctial_elements(), - obs_time in 58000.0f64..62000.0 - ) { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let obs = Observation::new( - state, - observer_code, - 0.0, - 0.0, - 0.0, - 0.0, - obs_time, - ).unwrap(); - - let result = obs.compute_apparent_position(state, &equinoctial); - - if let Ok((ra, dec)) = result { - // Invariant: returned values must be finite - prop_assert!(ra.is_finite()); - prop_assert!(dec.is_finite()); - - // RA must be in [0, 2π), DEC must be in [-π/2, π/2] - prop_assert!((0.0..2.0 * std::f64::consts::PI).contains(&ra)); - prop_assert!((-std::f64::consts::FRAC_PI_2..std::f64::consts::FRAC_PI_2).contains(&dec)); - } - } - - /// Property test: Calling the function twice with the same inputs must produce exactly - /// the same output (determinism). - #[test] - fn proptest_repeatability( - equinoctial in arb_equinoctial_elements(), - obs_time in 58000.0f64..62000.0 - ) { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let obs = Observation::new( - state, - observer_code, - 0.0, - 0.0, - 0.0, - 0.0, - obs_time, - ).unwrap(); - - let r1 = obs.compute_apparent_position(state, &equinoctial); - let r2 = obs.compute_apparent_position(state, &equinoctial); - - // Invariant: repeated computation with the same input should be identical - prop_assert_eq!(r1, r2); - } - - /// Property test: A very small change in observation time (1e-3 days ≈ 1.4 min) - /// should not cause huge jumps in the resulting RA/DEC. - #[test] - fn proptest_small_time_change_has_small_effect( - equinoctial in arb_equinoctial_elements(), - obs_time in 58000.0f64..62000.0 - ) { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let obs = Observation::new( - state, - observer_code, - 0.0, - 0.0, - 0.0, - 0.0, - obs_time, - ).unwrap(); - - let obs_eps = Observation { - time: obs_time + 1e-3, // shift by 1.4 minutes - ..obs - }; - - let r1 = obs.compute_apparent_position(state, &equinoctial); - let r2 = obs_eps.compute_apparent_position(state, &equinoctial); - - if let (Ok((ra1, dec1)), Ok((ra2, dec2))) = (r1, r2) { - let dra = (ra1 - ra2).abs(); - let ddec = (dec1 - dec2).abs(); - - // Invariant: no catastrophic jumps (> 1 radian) for a small time shift - prop_assert!(dra < 1.0); - prop_assert!(ddec < 1.0); - } - } - } - - proptest! { - /// Property: RA/DEC remain finite and in valid ranges for extreme orbits and random observers. - #[test] - fn proptest_ra_dec_valid_for_extreme_orbits_and_observers( - equinoctial in arb_extreme_equinoctial_elements(), - observer in arb_observer(), - obs_time in 58000.0f64..62000.0 - ) { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.add_observer_internal(Arc::new(observer)); - - let obs = Observation::new( - state, - observer_code, - 0.0, - 0.0, - 0.0, - 0.0, - obs_time, - ).unwrap(); - - let result = obs.compute_apparent_position(state, &equinoctial); - - if let Ok((ra, dec)) = result { - // Values must be finite - prop_assert!(ra.is_finite()); - prop_assert!(dec.is_finite()); - // Angles must be within their valid intervals - prop_assert!((0.0..2.0 * std::f64::consts::PI).contains(&ra)); - prop_assert!((-std::f64::consts::FRAC_PI_2..std::f64::consts::FRAC_PI_2).contains(&dec)); - } - } - } - - #[test] - fn test_hyperbolic_orbit_returns_error() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let obs = - Observation::new(state, observer_code, 0.0, 0.0, 0.0, 0.0, 59000.0).unwrap(); - - let equinoctial = EquinoctialElements { - reference_epoch: 59000.0, - semi_major_axis: 1.0, - eccentricity_sin_lon: 0.8, - eccentricity_cos_lon: 0.8, // e ≈ 1.13 > 1 - tan_half_incl_sin_node: 0.0, - tan_half_incl_cos_node: 0.0, - mean_longitude: 0.0, - }; - - let result = obs.compute_apparent_position(state, &equinoctial); - assert!( - result.is_err(), - "Hyperbolic or parabolic orbits should currently return an error" - ); - } - } - } - - #[test] - fn test_new_observation() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let observation = - Observation::new(state, observer_code, 1.0, 0.1, 2.0, 0.2, 59000.0).unwrap(); - assert_eq!( - observation, - Observation { - observer: 2, - ra: 1.0, - error_ra: 0.1, - dec: 2.0, - error_dec: 0.2, - time: 59000.0, - observer_earth_position: [ - -1.4662164592060655e-6, - 4.2560356749756634e-5, - -2.1126391698196086e-6 - ] - .into(), - observer_helio_position: [ - -0.35113019606349866, - -0.8726512942340473, - -0.37829699890414364 - ] - .into(), - } - ); - - let observation_2 = Observation::new( - state, - 2, - 343.097_375, - 2.777_777_777_777_778E-6, - -14.784833333333333, - 2.777_777_777_777_778E-5, - 59001.0, - ) - .unwrap(); - - assert_eq!( - observation_2, - Observation { - observer: 2, - ra: 343.097375, - error_ra: 2.777777777777778e-6, - dec: -14.784833333333333, - error_dec: 2.777777777777778e-5, - time: 59001.0, - observer_earth_position: [ - -2.1521316017998277e-6, - 4.2531873012231404e-5, - -2.0988352183088593e-6 - ] - .into(), - observer_helio_position: [ - -0.33522248840408125, - -0.8780465618894304, - -0.380635845615707 - ] - .into(), - } - ); - } - - mod tests_ephemeris_error { - use super::*; - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - use approx::assert_relative_eq; - - fn simple_equinoctial(epoch: f64) -> EquinoctialElements { - EquinoctialElements { - reference_epoch: epoch, - semi_major_axis: 1.0, - eccentricity_sin_lon: 0.0, - eccentricity_cos_lon: 0.0, - tan_half_incl_sin_node: 0.0, - tan_half_incl_cos_node: 0.0, - mean_longitude: 0.0, - } - } - - #[test] - fn test_ephem_error() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let obs = Observation::new( - state, - observer_code, - 1.7899347771316527, - 1.770_024_520_608_546E-6, - 0.778_996_538_107_973_6, - 1.259_582_891_829_317_7E-6, - 57070.262067592594, - ) - .unwrap(); - - let equinoctial_element = EquinoctialElements { - reference_epoch: 57_049.242_334_573_75, - semi_major_axis: 1.8017360713154256, - eccentricity_sin_lon: 0.269_373_680_909_227_2, - eccentricity_cos_lon: 8.856_415_260_013_56E-2, - tan_half_incl_sin_node: 8.089_970_166_396_302E-4, - tan_half_incl_cos_node: 0.10168201109730375, - mean_longitude: 1.6936970079414786, - }; - - let rms_error = obs.ephemeris_error(&OUTFIT_HORIZON_TEST.0, &equinoctial_element); - assert_eq!(rms_error.unwrap(), 75.00445641224026); - } - - /// When the observed RA/DEC exactly match the propagated RA/DEC, - /// the ephemeris_error must be zero. - #[test] - fn test_zero_error_when_positions_match() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let t_obs = 59000.0; - let equinoctial = simple_equinoctial(t_obs); - - // Compute the propagated position - let obs = Observation::new(state, observer_code, 0.0, 1e-6, 0.0, 1e-6, t_obs).unwrap(); - let (alpha, delta) = obs.compute_apparent_position(state, &equinoctial).unwrap(); - - // New observation with exact same RA/DEC - let obs_match = - Observation::new(state, observer_code, alpha, 1e-6, delta, 1e-6, t_obs).unwrap(); - - let error = obs_match.ephemeris_error(state, &equinoctial).unwrap(); - assert_relative_eq!(error, 0.0, epsilon = 1e-14); - } - - /// Error grows if RA is off by a known amount - #[test] - fn test_error_increases_with_offset() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let t_obs = 59000.0; - let equinoctial = simple_equinoctial(t_obs); - - let base_obs = Observation { - observer: observer_code, - ra: 0.0, - error_ra: 1e-3, - dec: 0.0, - error_dec: 1e-3, - time: t_obs, - observer_earth_position: Vector3::zeros(), - observer_helio_position: Vector3::zeros(), - }; - let (alpha, delta) = base_obs - .compute_apparent_position(state, &equinoctial) - .unwrap(); - - // Same dec, but RA offset by 1 milliradian - let obs_offset = Observation { - observer: 0, - ra: alpha + 1e-3, - error_ra: 1e-3, - dec: delta, - error_dec: 1e-3, - time: t_obs, - observer_earth_position: Vector3::zeros(), - observer_helio_position: Vector3::zeros(), - }; - - let err = obs_offset.ephemeris_error(state, &equinoctial).unwrap(); - assert!(err > 0.0); - } - - /// Check that wrapping of RA (close to 2π) does not affect the error - #[test] - fn test_ra_wrapping_invariance() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let t_obs = 59000.0; - let equinoctial = simple_equinoctial(t_obs); - - let base_obs = - Observation::new(state, observer_code, 0.0, 1e-6, 0.0, 1e-6, t_obs).unwrap(); - let (alpha, delta) = base_obs - .compute_apparent_position(state, &equinoctial) - .unwrap(); - - // Same position but RA shifted by ±2π - let obs_wrapped = Observation::new( - state, - observer_code, - alpha + std::f64::consts::TAU, - 1e-6, - delta, - 1e-6, - t_obs, - ) - .unwrap(); - - let err1 = obs_wrapped.ephemeris_error(state, &equinoctial).unwrap(); - assert_relative_eq!(err1, 0.0, epsilon = 1e-12); - } - - /// When RA/DEC uncertainties are very large, error is small even with a mismatch. - #[test] - fn test_large_uncertainty_downweights_error() { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.uint16_from_mpc_code(&"F51".to_string()); - - let t_obs = 59000.0; - let equinoctial = simple_equinoctial(t_obs); - - let base_obs = - Observation::new(state, observer_code, 0.0, 1.0, 0.0, 1.0, t_obs).unwrap(); - let (alpha, delta) = base_obs - .compute_apparent_position(state, &equinoctial) - .unwrap(); - - let obs_large_uncertainty = Observation::new( - state, - observer_code, - alpha + 0.1, - 10.0, - delta + 0.1, - 10.0, - t_obs, - ) - .unwrap(); - - let err = obs_large_uncertainty - .ephemeris_error(state, &equinoctial) - .unwrap(); - assert!( - err < 1.0, - "Large uncertainties should reduce the error contribution" - ); - } - - mod proptests_ephemeris_error { - use std::sync::Arc; - - use super::*; - use proptest::prelude::*; - - fn arb_observer() -> impl Strategy { - (-180.0..180.0, -90.0..90.0, 0.0..5.0).prop_map(|(lon, lat, elev)| { - Observer::new(lon, lat, elev, None, None, None).unwrap() - }) - } - - fn arb_elliptical_equinoctial() -> impl Strategy { - ( - 58000.0..62000.0, - 0.5..20.0, - -0.8..0.8, - -0.8..0.8, - -0.8..0.8, - -0.8..0.8, - 0.0..std::f64::consts::TAU, - ) - .prop_map(|(epoch, a, h, k, p, q, l)| EquinoctialElements { - reference_epoch: epoch, - semi_major_axis: a, - eccentricity_sin_lon: h, - eccentricity_cos_lon: k, - tan_half_incl_sin_node: p, - tan_half_incl_cos_node: q, - mean_longitude: l, - }) - .prop_filter("Bound orbits only", |e: &EquinoctialElements| { - e.eccentricity() < 1.0 - }) - } - - proptest! { - /// Property: error is always non-negative and finite for valid inputs - #[test] - fn proptest_error_is_non_negative( - equinoctial in arb_elliptical_equinoctial(), - observer in arb_observer(), - obs_time in 58000.0f64..62000.0 - ) { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.add_observer_internal(Arc::new(observer)); - let obs = Observation::new(state, observer_code, - 0.0, - 1e-3, - 0.0, - 1e-3, - obs_time,).unwrap(); - - let result = obs.ephemeris_error(state, &equinoctial); - if let Ok(val) = result { - prop_assert!(val.is_finite()); - prop_assert!(val >= 0.0); - } - } - - /// Property: If uncertainties are huge, the error must be small - #[test] - fn proptest_error_downweights_large_uncertainties( - equinoctial in arb_elliptical_equinoctial(), - observer in arb_observer(), - obs_time in 58000.0f64..62000.0 - ) { - let state = &mut OUTFIT_HORIZON_TEST.0.clone(); - let observer_code = state.add_observer_internal(Arc::new(observer)); - let obs = Observation::new(state, observer_code, - 0.5, - 100.0, - 0.5, - 100.0, - obs_time,).unwrap(); - - let result = obs.ephemeris_error(state, &equinoctial); - if let Ok(val) = result { - prop_assert!(val < 1.0); - } - } - } - } - } - - #[cfg(test)] - mod display_obs_tests { - use super::*; - use nalgebra::Vector3; - - // --- Helpers ------------------------------------------------------------- - - /// Convert arcseconds to radians. - fn arcsec_to_rad(asx: f64) -> f64 { - asx / 206_264.806_247_096_37 - } - - /// Build an Observation with full control on fields. - /// This stays in the same module (pub(crate) fields are accessible here). - #[allow(clippy::too_many_arguments)] - fn make_obs( - site: u16, - ra_rad: f64, - dec_rad: f64, - sra_arcsec: f64, - sdec_arcsec: f64, - mjd_tt: f64, - geo: (f64, f64, f64), - hel: (f64, f64, f64), - ) -> Observation { - Observation { - observer: site, - ra: Radian::from(ra_rad), - error_ra: Radian::from(arcsec_to_rad(sra_arcsec)), - dec: Radian::from(dec_rad), - error_dec: Radian::from(arcsec_to_rad(sdec_arcsec)), - time: MJD::from(mjd_tt), - observer_earth_position: Vector3::new(geo.0, geo.1, geo.2), - observer_helio_position: Vector3::new(hel.0, hel.1, hel.2), - } - } - - // --- Tests --------------------------------------------------------------- - - #[test] - fn display_compact_basic() { - // Case: RA=0, DEC=0, uncertainties = 1.0 arcsec, simple positions. - let obs = make_obs( - 809, - 0.0, - 0.0, - 1.0, - 1.0, - 60000.123456, // MJD (TT) - (0.123456789, -1.0, 0.000042), - (0.0, 1.234567, -0.5), - ); - - let s = format!("{obs}"); - - // Site and MJD - assert!( - s.contains("site=809"), - "site field not present/incorrect: {s}" - ); - assert!( - s.contains("MJD=60000.123456"), - "MJD formatting to 6 decimals expected: {s}" - ); - - // RA/DEC with uncertainties in arcsec; 3 decimals on seconds and uncertainties. - // RA=0 -> 00h00m00.000s; DEC=+00°00'00.000" - assert!( - s.contains("RA=00h00m00.000s ± 1.000\""), - "RA sexagesimal or sigma not formatted as expected: {s}" - ); - assert!( - s.contains("DEC=+00°00'00.000\" ± 1.000\""), - "DEC sexagesimal or sigma not formatted as expected: {s}" - ); - - // JD = MJD + 2400000.5 is only printed in pretty mode, so not checked here. - - // Vectors formatted with 6 decimals and 'AU' tag - assert!( - s.contains("r_geo=[ 0.123457, -1.000000, 0.000042 ] AU"), - "Geocentric vector formatting/precision mismatch: {s}" - ); - assert!( - s.contains("r_hel=[ 0.000000, 1.234567, -0.500000 ] AU"), - "Heliocentric vector formatting/precision mismatch: {s}" - ); - } - - #[test] - fn display_pretty_multiline() { - // Non-zero RA/DEC to exercise general formatting. - // RA = 2h 30m 15s -> in radians; DEC = +12° 34' 56" - let ra_hours = 2.0 + 30.0 / 60.0 + 15.0 / 3600.0; - let ra_rad = ra_hours * std::f64::consts::PI / 12.0; - let dec_deg: f64 = 12.0 + 34.0 / 60.0 + 56.0 / 3600.0; - let dec_rad = dec_deg.to_radians(); - - let obs = make_obs( - 500, - ra_rad, - dec_rad, - 0.321, // arcsec - 0.789, // arcsec - 60200.5, - (1.0, 2.0, 3.0), - (-0.1, 0.2, -0.3), - ); - - let s = format!("{obs:#}"); - - // Header and labels should be present (human-readable multi-line) - assert!( - s.starts_with("Astrometric observation"), - "Pretty header missing: {s}" - ); - assert!( - s.contains("Site ID : 500"), - "Pretty site line missing: {s}" - ); - - // Epoch line with MJD and JD - assert!( - s.contains("Epoch (TT) : MJD 60200.500000, JD 2460201.000000"), - "Epoch line with JD=MJD+2400000.5 expected: {s}" - ); - - // RA/σ line (check fragments to avoid locale/spacing issues) - assert!(s.contains("RA / σ : "), "RA line missing: {s}"); - assert!( - s.contains("h") && s.contains("m") && s.contains("s"), - "RA HMS units missing: {s}" - ); - assert!( - s.contains("(σ = 0.321"), - "RA sigma arcsec missing/incorrect: {s}" - ); - - // DEC/σ line with sign and DMS glyphs - assert!(s.contains("DEC / σ : +"), "DEC sign missing: {s}"); - assert!( - s.contains("°") && s.contains("'") && s.contains("\""), - "DEC units missing: {s}" - ); - assert!( - s.contains("(σ = 0.789"), - "DEC sigma arcsec missing/incorrect: {s}" - ); - - // Vectors lines - assert!( - s.contains("Observer (geo) : [ 1.000000, 2.000000, 3.000000 ] AU"), - "Geo vector line mismatch: {s}" - ); - assert!( - s.contains("Observer (hel) : [ -0.100000, 0.200000, -0.300000 ] AU"), - "Hel vector line mismatch: {s}" - ); - } - - #[test] - fn ra_wraps_into_24h() { - // RA slightly negative should wrap to near 24h in display. - let tiny = 1e-6; - let obs = make_obs( - 1, - -tiny, // slightly negative angle - 0.0, - 0.1, - 0.1, - 59000.0, - (0.0, 0.0, 0.0), - (0.0, 0.0, 0.0), - ); - - let s = format!("{obs}"); - - // Expect "23h59m..." rather than negative hours - assert!( - s.contains("RA=23h59m") || s.contains("RA=24h00m"), - "RA should wrap to [0, 24h): {s}" - ); - assert!( - !s.contains("-"), - "RA string must not contain a negative sign after wrapping: {s}" - ); - } - - #[test] - fn dec_negative_sign_is_preserved() { - // DEC = -10° 00' 00" - let dec_rad = (-10.0f64).to_radians(); - let obs = make_obs( - 2, - 0.0, - dec_rad, - 0.5, - 0.5, - 59000.0, - (0.0, 0.0, 0.0), - (0.0, 0.0, 0.0), - ); - - let s = format!("{obs}"); - - assert!( - s.contains("DEC=-10°00'00.000\""), - "Negative DEC sign or DMS formatting incorrect: {s}" - ); - } - - #[test] - fn uncertainties_are_in_arcseconds() { - // Store uncertainties in radians corresponding to 2.345 arcsec. - let asx = 2.345; - let obs = make_obs( - 3, - 0.0, - 0.0, - asx, // provided in arcsec, helper converts to rad - asx, - 60001.0, - (0.0, 0.0, 0.0), - (0.0, 0.0, 0.0), - ); - - let s1 = format!("{obs}"); - let s2 = format!("{obs:#}"); - - // Both compact and pretty should surface the same arcsec value to 3 decimals. - assert!( - s1.contains("± 2.345\"") && s2.contains("(σ = 2.345"), - "Arcsecond uncertainties not printed as expected.\nCompact: {s1}\nPretty:\n{s2}" - ); - } - - #[test] - fn vector_precision_and_units() { - // Ensure 6-decimal rounding and AU suffix are stable. - let obs = make_obs( - 4, - 0.0, - 0.0, - 1.0, - 1.0, - 60010.0, - (0.9999996, -0.9999996, 0.12345649), - (1.23456749, -1.23456751, 2.00000049), - ); - - let s = format!("{obs}"); - - // Rounded at 6 decimals, with AU suffix. - assert!( - s.contains("r_geo=[ 1.000000, -1.000000, 0.123456 ] AU"), - "Geo rounding/units mismatch: {s}" - ); - assert!( - s.contains("r_hel=[ 1.234567, -1.234568, 2.000000 ] AU"), - "Hel rounding/units mismatch: {s}" - ); - } - } -} diff --git a/src/observations/observations_ext.rs b/src/observations/observations_ext.rs deleted file mode 100644 index b94f22e..0000000 --- a/src/observations/observations_ext.rs +++ /dev/null @@ -1,1245 +0,0 @@ -//! # Observation extensions for orbit determination -//! -//! This module extends the base [`Observations`] collection with methods -//! essential for **initial orbit determination (IOD)** and orbit quality -//! assessment. -//! It provides two core traits: -//! -//! ## [`ObservationsExt`] -//! -//! High-level utilities for processing and analyzing sets of [`Observation`]s: -//! -//! - **Triplet generation**: [`compute_triplets`](ObservationsExt::compute_triplets) -//! Build optimized triplets of three observations for Gauss IOD. -//! -//! - **RMS evaluation**: [`select_rms_interval`](ObservationsExt::select_rms_interval), -//! [`rms_orbit_error`](ObservationsExt::rms_orbit_error) -//! Select subsets of observations around a triplet and compute RMS residuals -//! for candidate orbits. -//! -//! - **Error handling**: [`apply_batch_rms_correction`](ObservationsExt::apply_batch_rms_correction) -//! Apply statistical corrections to observational errors based on temporal clustering. -//! -//! - **Uncertainty extraction**: [`extract_errors`](ObservationsExt::extract_errors) -//! Retrieve RA/DEC uncertainties for a given triplet. -//! -//! ## [`ObservationIOD`] -//! -//! A high-level trait encapsulating the full **initial orbit determination workflow**: -//! -//! 1. Apply uncertainty calibration with [`ObservationsExt::apply_batch_rms_correction`], -//! 2. Generate candidate triplets with [`ObservationsExt::compute_triplets`], -//! 3. Perform Monte Carlo perturbations to simulate astrometric noise, -//! 4. Run the Gauss method on each triplet, -//! 5. Select the orbit with the lowest RMS over the full arc using [`ObservationsExt::rms_orbit_error`]. -//! -//! This workflow is designed for **short arcs** (newly discovered asteroids, comets, NEOs), -//! where only a handful of observations are available. -//! -//! ## Typical usage -//! -//! ```rust, no_run -//! use rand::{rngs::StdRng, SeedableRng}; -//! use outfit::initial_orbit_determination::IODParams; -//! use outfit::constants::Observations; -//! use outfit::observations::observations_ext::ObservationIOD; -//! -//! let params = IODParams::builder() -//! .n_noise_realizations(50) -//! .noise_scale(1.0) -//! .dtmax(30.0) -//! .max_triplets(20) -//! .build().unwrap(); -//! -//! let observations: Observations = unimplemented!(); // Load observations here -//! let state = unimplemented!(); // Outfit environment -//! let error_model = unimplemented!(); // Astrometric error model -//! let mut rng = StdRng::seed_from_u64(123); -//! -//! let (best_orbit, rms) = observations.estimate_best_orbit( -//! &state, &error_model, &mut rng, ¶ms -//! ).unwrap(); -//! println!("Best preliminary orbit RMS = {rms}"); -//! ``` -//! -//! ## References -//! -//! * Danby, J.M.A. (1992). *Fundamentals of Celestial Mechanics* (2nd ed.). -//! Willmann-Bell. Classic reference for Gauss, Laplace, and related IOD methods. -//! -//! * Milani, A., & Gronchi, G. F. (2009). *Theory of Orbit Determination*. -//! Cambridge University Press. [doi:10.1017/CBO9781139175371](https://doi.org/10.1017/CBO9781139175371) -//! -//! * Carpino, M., Milani, A., & Chesley, S. R. (2003). *OrbFit: Software for Preliminary Orbit Determination*. -//! [https://adams.dm.unipi.it/orbfit/](https://adams.dm.unipi.it/orbfit/) -//! -//! ## See also -//! -//! - [`Observation`] – Representation of a single astrometric measurement. -//! - [`GaussObs`] – Structure encoding a triplet of observations for Gauss IOD. -//! - [`GaussResult`] – Output of the Gauss preliminary orbit solver. -//! - [`IODParams`] – Parameters controlling IOD (triplet constraints, noise realizations). -use itertools::Itertools; -use nalgebra::Vector3; -use std::{collections::VecDeque, ops::ControlFlow}; - -use crate::{ - constants::{Observations, Radian}, - error_models::ErrorModel, - initial_orbit_determination::{gauss::GaussObs, gauss_result::GaussResult, IODParams}, - observations::{triplets_iod::generate_triplets, Observation}, - orbit_type::equinoctial_element::EquinoctialElements, - outfit::Outfit, - outfit_errors::OutfitError, -}; - -/// Extension trait for [`Observations`] providing high-level operations -/// commonly used in orbit determination workflows. -/// -/// This trait adds methods to process and analyze a collection of -/// astrometric [`Observation`] objects, including: -/// -/// * Selection of observation triplets optimized for initial orbit determination (IOD). -/// * Selection of subsets of observations for root-mean-square (RMS) error calculation. -/// * Computation of orbit quality metrics (RMS of astrometric residuals). -/// * Statistical corrections of observational errors based on temporal clustering. -/// * Extraction of astrometric uncertainties for given observation indices. -/// -/// # Typical usage -/// -/// This trait is intended to be implemented on: -/// -/// ```rust, ignore -/// pub type Observations = SmallVec<[Observation; 6]>; -/// ``` -/// -/// It provides functionality essential for the Gauss method and related -/// algorithms used in preliminary orbit determination. -/// -/// # Provided methods -/// - [`compute_triplets`](ObservationsExt::compute_triplets): -/// Build time-filtered triplets of observations, sorted by weight. -/// - [`select_rms_interval`](ObservationsExt::select_rms_interval): -/// Given a triplet, determine which observations lie in an expanded time window. -/// - [`rms_orbit_error`](ObservationsExt::rms_orbit_error): -/// Evaluate the fit of an orbit by computing RMS residuals. -/// - [`apply_batch_rms_correction`](ObservationsExt::apply_batch_rms_correction): -/// Apply correlation-based scaling factors to astrometric errors based on temporal clustering. -/// - [`extract_errors`](ObservationsExt::extract_errors): -/// Retrieve the RA/DEC uncertainties for a given triplet of observations. -/// -/// # See also -/// * [`GaussObs`] – Data structure used to represent a triplet of observations. -/// * [`Outfit`] – Global state providing ephemerides and reference frames. -/// * [`KeplerianElements`](crate::orbit_type::keplerian_element::KeplerianElements) – Orbital elements used to propagate orbits. -/// * [`Observation`] – Individual observation data structure. -/// -/// # References -/// -/// * Danby, J.M.A. (1992). *Fundamentals of Celestial Mechanics* (2nd ed.). -/// Willmann-Bell. -/// Classic reference for preliminary orbit determination methods -/// (Gauss, Laplace, Vaisala) and iterative improvement techniques. -/// -/// * Milani, A., & Gronchi, G. F. (2009). *Theory of Orbit Determination*. -/// Cambridge University Press. -/// Comprehensive modern treatment of statistical orbit determination, -/// including least-squares methods, weighting, and correlation handling. -/// [https://doi.org/10.1017/CBO9781139175371](https://doi.org/10.1017/CBO9781139175371) -/// -/// * Carpino, M., Milani, A., & Chesley, S. R. (2003). *OrbFit: Software for Preliminary Orbit Determination*. -/// Technical documentation distributed with the OrbFit package: -/// [https://adams.dm.unipi.it/orbfit/](https://adams.dm.unipi.it/orbfit/) -/// -/// These references describe the algorithms used for: -/// - Building and filtering observation triplets (Gauss method) -/// - Propagating trial orbits and refining them via differential corrections -/// - Handling of astrometric uncertainties and RMS weighting. -/// -/// This trait is central to orbit determination pipelines and is designed -/// to work with small batches of observations (often < 100 per object). -pub trait ObservationsExt { - /// Compute **time-feasible, best-K** triplets of observations for Gauss IOD, - /// leveraging a lazy **index stream** and a bounded **max-heap** on spacing weight. - /// - /// Overview - /// ----------------- - /// This method is a convenience wrapper around [`generate_triplets`]. It operates - /// directly on `self` (the current observation set) and returns up to `max_triplet` - /// **best-scored** candidates for the Gauss preliminary solution. Internally it: - /// - /// 1) Uses a `TripletIndexGenerator` that: - /// - sorts epochs in place, - /// - downsamples to at most `max_obs_for_triplets` (uniform with edges), - /// - lazily **streams reduced indices** `(first, middle, last)` constrained by: - /// `dt_min ≤ t[last] − t[first] ≤ dt_max`. - /// 2) Scores each feasible triplet with [`triplet_weight`](crate::observations::triplets_iod::triplet_weight) against `optimal_interval_time`. - /// 3) Keeps only the **K** smallest weights in a bounded **max-heap** (best-K selection). - /// 4) Materializes the survivors as [`GaussObs`] by (re)borrowing `self` immutably. - /// - /// Compared to brute-force `O(n³)`, the time-windowed enumeration drives the effective - /// cost toward ~`O(n²)` in typical time distributions, plus `O(n log K)` for heap updates. - /// - /// Arguments - /// ----------------- - /// * `dt_min` – Minimum allowed timespan `[same units as Observation::time]` between the first and last epoch of a triplet. - /// * `dt_max` – Maximum allowed timespan between the first and last epoch of a triplet. - /// * `optimal_interval_time` – Target per-gap spacing (e.g., days) used by [`triplet_weight`](crate::observations::triplets_iod::triplet_weight). - /// * `max_obs_for_triplets` – Upper bound on observations kept after downsampling (uniform with endpoints). - /// * `max_triplet` – Number `K` of best-scoring triplets to return. - /// - /// Return - /// ---------- - /// * A `Vec` of length `≤ max_triplet`, **sorted by increasing weight** - /// (best geometric spacing first), ready to be passed to `GaussObs::prelim_orbit`. - /// - /// Remarks - /// ------------- - /// * Sorting is **in-place**; call sites should not rely on original ordering afterward. - /// * The generator avoids overlapping borrows of `self`; only the final K triplets are materialized. - /// * For robustness studies, each returned triplet can be expanded with - /// `GaussObs::realizations_iter` (lazy Monte-Carlo noise). - /// - /// Complexity - /// ----------------- - /// * Enumeration: ~`O(n²)` (per-anchor time window). - /// * Selection: `O(n log K)` (bounded max-heap). - /// * Space: `O(1)` per yielded candidate; only K triplets are allocated at the end. - /// - /// See also - /// ------------ - /// * [`generate_triplets`] – Low-level function performing the selection (index stream + heap + materialization). - /// * [`TripletIndexGenerator`](crate::observations::triplets_generator::TripletIndexGenerator) – Lazy stream of reduced indices constrained by `(dt_min, dt_max)`. - /// * [`triplet_weight`](crate::observations::triplets_iod::triplet_weight) – Spacing heuristic around `optimal_interval_time`. - /// * [`GaussObs::realizations_iter`] – On-the-fly noisy realizations for a given triplet. - fn compute_triplets( - &mut self, - dt_min: f64, - dt_max: f64, - optimal_interval_time: f64, - max_obs_for_triplets: usize, - max_triplet: u32, - ) -> Vec; - - /// Select the interval of observations for RMS calculation. - /// - /// This function selects the interval of observations for RMS calculation based on the provided triplet. - /// It computes the maximum allowed interval and finds the start and end indices of the observations - /// within that interval. - /// - /// Arguments - /// --------- - /// * `triplets`: A reference to a `GaussObs` representing the triplet of observations. - /// * `extf`: A `f64` representing the external factor for the interval calculation. - /// * `dtmax`: A `f64` representing the maximum allowed interval. - /// - /// Return - /// ------ - /// * A `Result` containing a tuple of start and end indices of the observations within the interval, - /// or an `OutfitError` if an error occurs. - fn select_rms_interval( - &self, - triplets: &GaussObs, - extf: f64, - dtmax: f64, - ) -> Result<(usize, usize), OutfitError>; - - /// Evaluate the orbit quality by computing the RMS of normalized astrometric residuals - /// over a time window centered on a Gauss triplet. - /// - /// Scientific context - /// ------------------- - /// This function measures how well a preliminary orbit reproduces the observed - /// astrometry (RA, DEC). It computes the **root-mean-square (RMS)** of the - /// normalized residuals between predicted and observed positions, aggregated over - /// a set of observations surrounding a Gauss triplet. - /// - /// Interval selection - /// ------------------- - /// The observation arc is defined by: - /// * `extf` – fractional extension factor applied around the triplet center, - /// * `dtmax` – absolute maximum time span (days) allowed for the arc. - /// - /// The effective interval is determined by - /// [`select_rms_interval`](Self::select_rms_interval), which returns the first - /// and last indices of the observations to include. - /// - /// Computation - /// ------------ - /// * Each observation contributes a squared normalized residual - /// from [`Observation::ephemeris_error`](crate::observations::Observation::ephemeris_error). - /// * The final RMS is - /// - /// ```text - /// RMS = √[ (1 / (2N)) · Σᵢ (ΔRAᵢ² + ΔDECᵢ²) ] - /// ``` - /// - /// where `N` is the number of observations in the selected interval. - /// - /// Pruning mode - /// ------------ - /// If `prune_if_rms_ge` is set: - /// * The summation stops early once the partial RMS reaches the threshold, - /// returning the pruning value directly. - /// * If `prune_if_rms_ge = ∞`, no early exit occurs (equivalent to no pruning). - /// - /// Arguments - /// ---------- - /// * `state` – Global context providing ephemerides, Earth orientation, and time conversion. - /// * `triplets` – The Gauss triplet that defined the preliminary orbit. - /// * `orbit_element` – The orbit (in equinoctial elements) to be tested against the arc. - /// * `extf` – Fractional time extension of the interval around the triplet. - /// * `dtmax` – Maximum arc duration (days). - /// * `prune_if_rms_ge` – Optional RMS cutoff for early termination (see *Pruning mode*). - /// - /// Return - /// ------- - /// * `Ok(rms)` – RMS of the normalized astrometric residuals (radians). - /// * `Err(OutfitError)` – If interval selection fails or propagation/ephemeris lookup fails. - /// - /// Units - /// ------- - /// * The returned RMS is dimensionless but expressed in **radians**. - fn rms_orbit_error( - &self, - state: &Outfit, - triplets: &GaussObs, - orbit_element: &EquinoctialElements, - extf: f64, - dtmax: f64, - prune_if_rms_ge: Option, - ) -> Result; - - /// Apply RMS correction based on temporally clustered batches of observations. - /// - /// This method adjusts the astrometric uncertainties (`error_ra`, `error_dec`) of each observation - /// based on the local density of observations in time and observer identity. Observations that are - /// close in time (within 8 hours) and come from the same observer are grouped into batches, and a - /// correction factor is applied to reflect statistical correlation or improvement due to redundancy. - /// - /// # Arguments - /// --------------- - /// * `error_model` - The error model to use when applying the batch correction. Supported values include: - /// - `"vfcc17"`: uses a reduced factor `√(n × 0.25)` if the batch has at least 5 observations, - /// - any other string: uses the standard `√n` factor. - /// * `gap_max` - The maximum time gap (in days) to consider observations as part of the same batch. - /// - /// # Behavior - /// ---------- - /// - Observations are grouped by `observer` and sorted in time. - /// - A batch is formed when consecutive observations from the same observer are spaced by less than 8 hours. - /// - Each observation in a batch of size `n` receives a correction: - /// - `√n` for standard models, - /// - `√(n × 0.25)` for `vfcc17` when `n ≥ 5`. - /// - If `n < 5` with `vfcc17`, it falls back to `√n`. - /// - Observations with fixed weights (`force_w`) are not affected (not yet implemented in this version). - /// - /// # Returns - /// ---------- - /// * `()` - This function modifies the observations in-place; it does not return a value. - /// - /// # Computation Details - /// ---------- - /// - The time comparison is based on Modified Julian Date (`MJD`), and the batch window is fixed at 8 hours (i.e., `8.0 / 24.0` days). - /// - The error fields `error_ra` and `error_dec` are both scaled by the same batch correction factor. - /// - /// # Units - /// ---------- - /// - Input and output uncertainties (`error_ra`, `error_dec`) are expressed in **radians**. - fn apply_batch_rms_correction(&mut self, error_model: &ErrorModel, gap_max: f64); - - /// Extract astrometric uncertainties (RA and DEC) for a set of three observations. - /// - /// Given a triplet of observation indices, this function retrieves the corresponding - /// astrometric errors in right ascension and declination from the observation set. - /// - /// # Arguments - /// --------------- - /// * `idx_obs` - A vector of three indices referring to the observations used in the triplet. - /// - /// # Returns - /// --------------- - /// * A tuple of two `Vector3`: - /// - The first vector contains the RA uncertainties in radians. - /// - The second vector contains the DEC uncertainties in radians. - /// - /// # Panics - /// --------------- - /// This function will panic if any index in `idx_obs` is out of bounds of the observation set. - fn extract_errors(&self, idx_obs: Vector3) -> (Vector3, Vector3); -} - -/// Trait for performing Initial Orbit Determination (IOD) on a set of astrometric observations. -/// -/// This trait encapsulates high-level algorithms to derive a **preliminary orbit** -/// from a time series of astrometric observations, using the **Gauss method**. -/// It focuses on searching for the best-fitting orbit over all valid triplets of observations. -/// -/// ## Purpose -/// -/// The main goal of this trait is to automate the process of: -/// 1. Building candidate triplets of observations (see [`compute_triplets`](ObservationsExt::compute_triplets)), -/// 2. Estimating a preliminary orbit for each triplet using the Gauss method, -/// 3. Perturbing triplets with Gaussian noise to simulate observational uncertainties, -/// 4. Selecting the orbit that minimizes the root-mean-square (RMS) of astrometric residuals -/// when compared to the entire set of observations. -/// -/// This process is the standard entry point for orbit determination workflows. -/// It is designed for **short observational arcs**, such as those of newly discovered asteroids. -/// -/// ## Typical usage -/// -/// ```rust, no_run -/// use rand::{rngs::StdRng, SeedableRng}; -/// use outfit::initial_orbit_determination::IODParams; -/// use outfit::constants::Observations; -/// use outfit::observations::observations_ext::ObservationIOD; -/// -/// let params = IODParams::builder() -/// .n_noise_realizations(100) -/// .noise_scale(1.0) -/// .dtmax(30.0) -/// .max_triplets(50) -/// .build().unwrap(); -/// -/// let observations: Observations = unimplemented!(); // Your observations here -/// let state = unimplemented!(); // Your state here -/// let error_model = unimplemented!(); // Your error model here -/// let mut rng = StdRng::seed_from_u64(42); -/// -/// let (best_orbit, rms) = observations.estimate_best_orbit( -/// &state, &error_model, &mut rng, ¶ms).unwrap(); -/// println!("Best preliminary orbit RMS = {rms}"); -/// ``` -/// -/// ## Algorithmic steps -/// -/// 1. **Batch uncertainty correction:** -/// Observations are first passed through [`ObservationsExt::apply_batch_rms_correction`]. -/// -/// 2. **Triplet generation:** -/// Valid combinations of three observations are extracted with [`ObservationsExt::compute_triplets`], -/// using the configuration parameters from [`IODParams`] (e.g., `dt_min`, `dt_max_triplet`, -/// `optimal_interval_time`, `max_obs_for_triplets`, `max_triplets`). -/// -/// 3. **Orbit estimation:** -/// For each triplet, `n_noise_realizations` noisy variants are generated (Monte Carlo) -/// and processed by the Gauss method to obtain preliminary orbital elements. -/// -/// 4. **Orbit evaluation:** -/// Each preliminary orbit is propagated and compared to the full observation arc using -/// [`ObservationsExt::rms_orbit_error`]. The orbit with the smallest RMS is returned. -/// -/// ## Performance considerations -/// -/// * Typically applied to **short arcs with tens of observations**. -/// * The number of triplets can be limited via `params.max_triplets`. -/// * The Monte Carlo loop (`params.n_noise_realizations`) dominates runtime. -/// -/// ## Returns -/// -/// * `Ok((Some(best_orbit), best_rms))` – if a valid orbit was found, -/// * `Ok((None, f64::MAX))` – if no valid orbit could be estimated, -/// * `Err(OutfitError)` – if an error occurs during propagation or fitting. -/// -/// ## Parameters -/// -/// * [`IODParams`] – Controls the noise sampling, temporal constraints on triplets, -/// and the maximum number of triplets to evaluate. -/// -/// ## See also -/// -/// * [`ObservationsExt::compute_triplets`] – Generates candidate triplets from the observation set. -/// * [`ObservationsExt::rms_orbit_error`] – Evaluates the quality of an orbit over the full arc. -/// * [`GaussResult`] – Data structure holding the result of a single Gauss method run. -/// * [`KeplerianElements`](crate::orbit_type::keplerian_element::KeplerianElements) – Orbital elements returned by successful preliminary orbit estimation. -/// * [`IODParams`] – Groups all configuration options for IOD. -pub trait ObservationIOD { - /// Estimate the best-fitting preliminary orbit from a full set of astrometric observations. - /// - /// This method searches for the best preliminary orbit by evaluating a limited number of - /// observation triplets generated from the dataset. The process includes: - /// - /// 1. **Error calibration**: - /// Observations are first preprocessed with [`ObservationsExt::apply_batch_rms_correction`] to account for - /// temporal clustering and observer-specific error models. - /// - /// 2. **Triplet generation**: - /// Candidate triplets are generated using [`ObservationsExt::compute_triplets`], which: - /// * Sorts observations by time, - /// * Optionally downsamples the dataset to at most `params.max_obs_for_triplets` points - /// (uniform in time, always keeping the first and last), - /// * Filters valid triplets according to `params.dt_min`, `params.dt_max_triplet`, - /// and `params.optimal_interval_time`. - /// - /// 3. **Monte Carlo noise sampling**: - /// For each triplet, `params.n_noise_realizations` perturbed versions are created using - /// Gaussian noise scaled by `params.noise_scale` times the nominal astrometric uncertainties. - /// - /// 4. **Orbit estimation and selection**: - /// For each (possibly perturbed) triplet, a preliminary orbit is computed with the Gauss method. - /// The resulting orbit is evaluated over the full set of observations using [`ObservationsExt::rms_orbit_error`]. - /// The orbit with the smallest RMS is returned. - /// - /// # Arguments - /// - /// * `state` – - /// Global [`Outfit`] state, providing ephemerides and time conversions. - /// * `error_model` – - /// The astrometric error model (typically per-band or per-observatory). - /// * `rng` – - /// A random number generator used to draw Gaussian perturbations. - /// * `params` – - /// Parameters controlling the initial orbit determination, including: - /// * `n_noise_realizations`: number of noisy triplet variants generated per original triplet, - /// * `noise_scale`: scaling factor for the noise, - /// * `extf`: extrapolation factor for RMS evaluation, - /// * `dtmax`: maximum time interval for RMS evaluation, - /// * `dt_min`, `dt_max_triplet`, `optimal_interval_time`: constraints on triplet spans, - /// * `max_obs_for_triplets`: maximum number of observations to keep when building triplets, - /// * `max_triplets`: maximum number of triplets to process, - /// * `gap_max`: maximum allowed time gap within a batch for RMS corrections. - /// - /// # Returns - /// - /// * `Ok((Some(best_orbit), best_rms))` – The best preliminary orbit found and its RMS. - /// * `Ok((None, f64::MAX))` – No valid orbit could be estimated. - /// * `Err(e)` – An error occurred during orbit estimation or RMS evaluation. - /// - /// # Notes - /// - /// - RMS values are computed with [`ObservationsExt::rms_orbit_error`], which accounts for - /// light-time correction and ephemeris propagation. - /// - Each triplet can produce several preliminary orbit candidates due to - /// noise realizations. - /// - The `max_obs_for_triplets` parameter is crucial for large datasets, - /// as it avoids the combinatorial explosion of triplets. - /// - /// # See also - /// - /// * [`ObservationsExt::compute_triplets`] – Selects triplets from the observation set. - /// * [`GaussObs::generate_noisy_realizations`] – Creates perturbed triplets with Gaussian noise. - /// * [`GaussObs::prelim_orbit`] – Computes a preliminary orbit from a single triplet. - /// * [`ObservationsExt::rms_orbit_error`] – Measures the goodness-of-fit of an orbit against observations. - /// * [`IODParams`] – Configuration options for the IOD process. - fn estimate_best_orbit( - &mut self, - state: &Outfit, - error_model: &ErrorModel, - rng: &mut impl rand::Rng, - params: &IODParams, - ) -> Result<(GaussResult, f64), OutfitError>; -} - -impl ObservationsExt for Observations { - fn compute_triplets( - &mut self, - dt_min: f64, - dt_max: f64, - optimal_interval_time: f64, - max_obs_for_triplets: usize, - max_triplet: u32, - ) -> Vec { - generate_triplets( - self, - dt_min, - dt_max, - optimal_interval_time, - max_obs_for_triplets, - max_triplet, - ) - } - - fn select_rms_interval( - &self, - triplets: &GaussObs, - extf: f64, - dtmax: f64, - ) -> Result<(usize, usize), OutfitError> { - let nobs = self.len(); - - let idx_obs1 = triplets.idx_obs[0]; - let obs1 = self - .get(idx_obs1) - .ok_or(OutfitError::ObservationNotFound(idx_obs1))?; - - let idx_obs3 = triplets.idx_obs[2]; - let obs3 = self - .get(idx_obs3) - .ok_or(OutfitError::ObservationNotFound(idx_obs3))?; - - let first_obs = self.first().ok_or(OutfitError::ObservationNotFound(0))?; - let last_obs = self - .last() - .ok_or(OutfitError::ObservationNotFound(nobs - 1))?; - // Step 1: Compute the maximum allowed interval - let mut dt = if extf >= 0.0 { - (obs3.time - obs1.time) * extf - } else { - 10.0 * (last_obs.time - first_obs.time) - }; - - if dtmax >= 0.0 { - dt = dt.max(dtmax); - } - - let mut i_start = 0; - - for i in (0..=idx_obs1).rev() { - if let Some(obs_i) = self.get(i) { - if obs1.time - obs_i.time > dt { - break; - } - i_start = i; - } - } - - let mut i_end = nobs - 1; - - for i in idx_obs3..nobs { - if let Some(obs_i) = self.get(i) { - if obs_i.time - obs3.time > dt { - break; - } - i_end = i; - } - } - - Ok((i_start, i_end)) - } - - fn rms_orbit_error( - &self, - state: &Outfit, - triplets: &GaussObs, - orbit_element: &EquinoctialElements, - extf: f64, - dtmax: f64, - prune_if_rms_ge: Option, - ) -> Result { - // Select the time interval [start_obs_rms, end_obs_rms] over which the RMS - // error is evaluated. The interval depends on the triplet and on external - // filtering parameters (extf, dtmax). - let (start_obs_rms, end_obs_rms) = self.select_rms_interval(triplets, extf, dtmax)?; - - // Number of observations contributing to the RMS - let n_obs = (end_obs_rms - start_obs_rms + 1) as f64; - - // Denominator of the RMS formula: here weighted by 2.0 for consistency - // with the convention used elsewhere in the code. - let denom = 2.0 * n_obs; - - // ========================================================================= - // Case 1: No pruning → behave like the "classical" RMS definition - // ========================================================================= - if prune_if_rms_ge.is_none() { - // Accumulate the squared ephemeris errors for each observation - let sum = self[start_obs_rms..=end_obs_rms] - .iter() - .map(|obs| obs.ephemeris_error(state, orbit_element)) - // try_fold propagates errors from ephemeris_error while summing - .try_fold(0.0, |acc, term| term.map(|v| acc + v))?; - - // Final RMS = sqrt( sum / denom ) - return Ok((sum / denom).sqrt()); - } - - // ========================================================================= - // Case 2: Pruning enabled → early stop if RMS exceeds a threshold - // ========================================================================= - let prune = prune_if_rms_ge.unwrap(); - - // Convert the RMS cutoff into a sum cutoff: - // RMS² = sum / denom → stop if sum ≥ (prune² * denom). - let sum_cutoff = if prune.is_finite() { - prune * prune * denom - } else { - f64::INFINITY // "no real cutoff" if prune = ∞ - }; - - // Iterate over observations and accumulate squared errors. - // We use ControlFlow to allow early exit: - // - Continue(sum): keep summing, - // - Break(value): stop early and return the pruning threshold. - let folded: ControlFlow = self[start_obs_rms..=end_obs_rms] - .iter() - .map(|obs| obs.ephemeris_error(state, orbit_element)) - .try_fold(0.0, |acc, term| match term { - Ok(v) => { - let new_sum = acc + v; - if new_sum >= sum_cutoff { - // Early exit: threshold reached, return directly - ControlFlow::Break(prune) - } else { - ControlFlow::Continue(new_sum) - } - } - // In case of error in ephemeris_error, also exit with pruning value. - Err(_) => ControlFlow::Break(prune), - }); - - // Final RMS depending on whether we exited early or not - match folded { - ControlFlow::Continue(sum) => Ok((sum / denom).sqrt()), - ControlFlow::Break(rms) => Ok(rms), - } - } - - fn apply_batch_rms_correction(&mut self, error_model: &ErrorModel, gap_max: f64) { - // Step 1: Sort in time - self.sort_by(|a, b| a.time.partial_cmp(&b.time).unwrap()); - - // Step 2: Group by observer - for (_observer_id, group) in &self.into_iter().chunk_by(|obs| obs.observer) { - // Step 3: Batch grouping using sliding window - let mut batch: VecDeque<&mut Observation> = VecDeque::new(); - let mut iter = group.peekable(); - - while let Some(obs) = iter.next() { - batch.push_back(obs); - - // Extend batch while within gap_max - while let Some(next) = iter.peek() { - let dt = next.time - - batch - .back() - .expect("in apply_batch_rms_correction: batch should not be empty") - .time; - if dt <= gap_max { - batch.push_back(iter.next().expect( - "in apply_batch_rms_correction: next in batch should not be None", - )); - } else { - break; - } - } - - // Apply correction to current batch - let n = batch.len(); - if n > 0 { - let factor = match error_model { - ErrorModel::VFCC17 if n >= 5 => (n as f64 * 0.25).sqrt(), - _ => (n as f64).sqrt(), - }; - - for obs in batch.drain(..) { - obs.error_ra *= factor; - obs.error_dec *= factor; - } - } - } - } - } - - fn extract_errors(&self, idx_obs: Vector3) -> (Vector3, Vector3) { - let (errors_ra, errors_dec): (Vec<_>, Vec<_>) = idx_obs - .into_iter() - .map(|i| { - let obs = &self[*i]; - (obs.error_ra, obs.error_dec) - }) - .unzip(); - - ( - Vector3::from_column_slice(&errors_ra), - Vector3::from_column_slice(&errors_dec), - ) - } -} - -impl ObservationIOD for Observations { - fn estimate_best_orbit( - &mut self, - state: &Outfit, - error_model: &ErrorModel, - rng: &mut impl rand::Rng, - params: &IODParams, - ) -> Result<(GaussResult, f64), OutfitError> { - // --- Stage 1: Calibrate uncertainties once for the whole batch. - // This aligns quoted per-obs errors with empirical RMS statistics. - self.apply_batch_rms_correction(error_model, params.gap_max); - - // --- Stage 2: Enumerate candidate triplets under temporal constraints. - let triplets = self.compute_triplets( - params.dt_min, - params.dt_max_triplet, - params.optimal_interval_time, - params.max_obs_for_triplets, - params.max_triplets, - ); - - if triplets.is_empty() { - let span = if self.is_empty() { - 0.0 - } else { - self.last().unwrap().time - self.first().unwrap().time - }; - return Err(OutfitError::NoFeasibleTriplets { - span, - n_obs: self.len(), - dt_min: params.dt_min, - dt_max: params.dt_max_triplet, - }); - } - - // Current best (lowest) RMS and its orbit. - // Using +∞ avoids Option branching in the hot path. - let mut best_rms = f64::INFINITY; - let mut best_orbit: Option = None; - - // Keep the last encountered error so that we can report something meaningful if *all* fail. - // We don't clone: we keep only the most recent error by moving it in. - let mut last_error: Option = None; - - // For diagnostics, count how many realizations we actually attempted. - let mut n_attempts: usize = 0; - - // --- Stage 3: Explore each triplet. - for triplet in triplets { - // Extract 1-σ astrometric uncertainties for the three obs of this triplet. - let (error_ra, error_dec) = self.extract_errors(triplet.idx_obs); - - // --- Stage 4: For each (lazy) noisy realization of this triplet... - // The iterator yields the original triplet first, then noisy copies. - for realization in triplet.realizations_iter( - &error_ra, - &error_dec, - params.n_noise_realizations, - params.noise_scale, - rng, - ) { - n_attempts += 1; - - // 4.a) Preliminary Gauss solution on the current realization. - let gauss_res = match realization.prelim_orbit(state, params) { - Ok(res) => res, - Err(e) => { - // Record the failure and continue exploring. - last_error = Some(e); - continue; - } - }; - - // 4.b) Convert to the element set required by the scorer. - let equinoctial_elements = gauss_res.get_orbit().to_equinoctial()?; - - // 4.c) Score orbit vs. full observation set (RMS residual). - let rms = match self.rms_orbit_error( - state, - &realization, - &equinoctial_elements, - params.extf, - params.dtmax, - Some(best_rms), - ) { - Ok(v) => { - if !v.is_finite() { - last_error = Some(OutfitError::NonFiniteScore(v)); - continue; - } else { - v - } - } - Err(e) => { - last_error = Some(e); - continue; - } - }; - - // 4.d) Keep the best candidate so far. - if rms < best_rms { - best_rms = rms; - best_orbit = Some(gauss_res); - } - } - } - - // --- Stage 5: If at least one candidate succeeded, return the best; otherwise, propagate an error. - if let Some(orbit) = best_orbit { - Ok((orbit, best_rms)) - } else { - // If nothing succeeded, propagate a structured error with the last underlying cause. - // Fallback to a domain-specific unit error if we never captured any (e.g., no attempts). - let root_cause = match last_error { - Some(e) => e, - None => panic!("In estimate_best_orbit: no error captured but best_orbit is None, this should not happen"), - }; - Err(OutfitError::NoViableOrbit { - cause: Box::new(root_cause), - attempts: n_attempts, - }) - } - } -} - -#[cfg(test)] -mod test_obs_ext { - - use crate::error_models::ErrorModel; - - use super::*; - - #[test] - #[cfg(feature = "jpl-download")] - fn test_select_rms_interval() { - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - - let mut traj_set = OUTFIT_HORIZON_TEST.1.clone(); - - let traj_number = crate::constants::ObjectNumber::String("K09R05F".into()); - let traj_len = traj_set - .get(&traj_number) - .expect("Failed to get trajectory") - .len(); - - let traj = traj_set - .get_mut(&traj_number) - .expect("Failed to get trajectory"); - - let triplets = traj.compute_triplets(0.03, 150.0, 20.0, traj_len, 10); - let (u1, u2) = traj - .select_rms_interval(triplets.first().unwrap(), -1., 30.) - .unwrap(); - - assert_eq!(u1, 0); - assert_eq!(u2, 36); - - let (u1, u2) = traj - .select_rms_interval(triplets.first().unwrap(), 10., 30.) - .unwrap(); - - assert_eq!(u1, 14); - assert_eq!(u2, 36); - - let (u1, u2) = traj - .select_rms_interval(triplets.first().unwrap(), 0.001, 3.) - .unwrap(); - - assert_eq!(u1, 17); - assert_eq!(u2, 33); - } - - #[test] - #[cfg(feature = "jpl-download")] - fn test_rms_trajectory() { - use nalgebra::Matrix3; - - use crate::{ - orbit_type::keplerian_element::KeplerianElements, unit_test_global::OUTFIT_HORIZON_TEST, - }; - - let mut traj_set = OUTFIT_HORIZON_TEST.1.clone(); - - let traj = traj_set - .get_mut(&crate::constants::ObjectNumber::String("K09R05F".into())) - .expect("Failed to get trajectory"); - - traj.apply_batch_rms_correction(&ErrorModel::FCCT14, 8.0 / 24.0); - - let triplets = GaussObs { - idx_obs: Vector3::new(34, 35, 36), - ra: [[ - 1.789_797_623_341_267, - 1.789_865_909_348_251, - 1.7899347771316527, - ]] - .into(), - dec: [[ - 0.779_178_052_350_181, - 0.779_086_664_971_291_9, - 0.778_996_538_107_973_6, - ]] - .into(), - time: [[ - 57070.238017592594, - 57_070.250_007_592_59, - 57070.262067592594, - ]] - .into(), - observer_helio_position: Matrix3::zeros(), - }; - - let kepler = KeplerianElements { - reference_epoch: 57_049.242_334_573_75, - semi_major_axis: 1.8017360713154256, - eccentricity: 0.283_559_145_668_705_7, - inclination: 0.20267383288689386, - ascending_node_longitude: 7.955_979_023_693_781E-3, - periapsis_argument: 1.2451951387589135, - mean_anomaly: 0.44054589015887125, - }; - - let rms = traj - .rms_orbit_error( - &OUTFIT_HORIZON_TEST.0, - &triplets, - &kepler.into(), - -1.0, - 30., - None, - ) - .unwrap(); - - assert_eq!(rms, 68.88650730830162); - } - - mod test_batch_rms_correction { - use crate::constants::MJD; - use approx::assert_ulps_eq; - use smallvec::smallvec; - - use super::*; - - fn obs(observer: u16, time: MJD) -> Observation { - Observation { - observer, - ra: 1.0, - error_ra: 1e-6, - dec: 0.5, - error_dec: 2e-6, - time, - observer_earth_position: Vector3::zeros(), - observer_helio_position: Vector3::zeros(), - } - } - - #[test] - fn test_single_batch_vfcc17_large() { - let base_time = 59000.0; - let mut obs: Observations = smallvec![ - obs(1, base_time), - obs(1, base_time + 0.01), - obs(1, base_time + 0.02), - obs(1, base_time + 0.03), - obs(1, base_time + 0.04), // n = 5 - ]; - - obs.apply_batch_rms_correction(&ErrorModel::VFCC17, 8.0 / 24.0); - - let factor = (5.0_f64 * 0.25_f64).sqrt(); - for ob in &obs { - assert_ulps_eq!(ob.error_ra, 1e-6 * factor, max_ulps = 2); - assert_ulps_eq!(ob.error_dec, 2e-6 * factor, max_ulps = 2); - } - } - - #[test] - fn test_single_batch_small_n() { - let base_time = 59000.0; - let mut obs: Observations = smallvec![ - obs(2, base_time), - obs(2, base_time + 0.01), // n = 2 - ]; - - obs.apply_batch_rms_correction(&ErrorModel::FCCT14, 8.0 / 24.0); - - let factor = (2.0f64).sqrt(); - for ob in &obs { - assert_ulps_eq!(ob.error_ra, 1e-6 * factor, max_ulps = 2); - assert_ulps_eq!(ob.error_dec, 2e-6 * factor, max_ulps = 2); - } - } - - #[test] - fn test_multiple_batches_same_observer() { - let base_time = 59000.0; - let mut obs: Observations = smallvec![ - obs(3, base_time), - obs(3, base_time + 0.01), // batch 1 (n = 2) - obs(3, base_time + 1.0), // isolated, batch 2 (n = 1) - ]; - - obs.apply_batch_rms_correction(&ErrorModel::FCCT14, 8.0 / 24.0); - - let factor1 = (2.0f64).sqrt(); - let factor2 = 1.0; - - assert_ulps_eq!(obs[0].error_ra, 1e-6 * factor1, max_ulps = 2); - assert_ulps_eq!(obs[1].error_ra, 1e-6 * factor1, max_ulps = 2); - assert_ulps_eq!(obs[2].error_ra, 1e-6 * factor2, max_ulps = 2); - } - - #[test] - fn test_different_observers_are_not_grouped() { - let base_time = 59000.0; - let mut obs: Observations = smallvec![ - obs(10, base_time), - obs(11, base_time + 0.01), - obs(12, base_time + 0.02), - ]; - - obs.apply_batch_rms_correction(&ErrorModel::FCCT14, 8.0 / 24.0); - - for ob in &obs { - assert_ulps_eq!(ob.error_ra, 1e-6, max_ulps = 2); - assert_ulps_eq!(ob.error_dec, 2e-6, max_ulps = 2); - } - } - - #[test] - fn test_batch_gaps_exceed_gapmax() { - let mut obs: Observations = smallvec![ - obs(5, 59000.0), - obs(5, 59001.0), // > 8h => separate - ]; - - obs.apply_batch_rms_correction(&ErrorModel::FCCT14, 8.0 / 24.0); - - for ob in &obs { - assert_ulps_eq!(ob.error_ra, 1e-6, max_ulps = 2); - assert_ulps_eq!(ob.error_dec, 2e-6, max_ulps = 2); - } - } - - #[test] - #[cfg(feature = "jpl-download")] - fn test_batch_real_data() { - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - - let mut traj_set = OUTFIT_HORIZON_TEST.1.clone(); - - let traj = traj_set - .get_mut(&crate::constants::ObjectNumber::String("K09R05F".into())) - .expect("Failed to get trajectory"); - - traj.apply_batch_rms_correction(&ErrorModel::FCCT14, 8.0 / 24.0); - - assert_ulps_eq!(traj[0].error_ra, 2.507075226057322e-6, max_ulps = 2); - assert_ulps_eq!(traj[0].error_dec, 2.036217397086327e-6, max_ulps = 2); - - assert_ulps_eq!(traj[1].error_ra, 2.5070681687218917e-6, max_ulps = 2); - assert_ulps_eq!(traj[1].error_dec, 2.036217397086327e-6, max_ulps = 2); - - assert_ulps_eq!(traj[2].error_ra, 2.507_059_507_890_695_2E-6, max_ulps = 2); - assert_ulps_eq!(traj[2].error_dec, 2.036217397086327e-6, max_ulps = 2); - } - } - - mod test_extract_errors { - use super::*; - use approx::assert_ulps_eq; - use smallvec::smallvec; - - fn make_observations() -> Observations { - smallvec![ - Observation { - observer: 0, - ra: 1.0, - dec: 0.5, - error_ra: 1e-6, - error_dec: 2e-6, - time: 59000.0, - observer_earth_position: Vector3::zeros(), - observer_helio_position: Vector3::zeros(), - }, - Observation { - observer: 0, - ra: 1.1, - dec: 0.6, - error_ra: 3e-6, - error_dec: 4e-6, - time: 59000.1, - observer_earth_position: Vector3::zeros(), - observer_helio_position: Vector3::zeros(), - }, - Observation { - observer: 0, - ra: 1.2, - dec: 0.7, - error_ra: 5e-6, - error_dec: 6e-6, - time: 59000.2, - observer_earth_position: Vector3::zeros(), - observer_helio_position: Vector3::zeros(), - }, - ] - } - - #[test] - fn test_extract_errors_basic() { - let obs = make_observations(); - let idx_obs = Vector3::new(0, 1, 2); - - let (ra_errors, dec_errors) = obs.extract_errors(idx_obs); - - assert_ulps_eq!(ra_errors[0], 1e-6, max_ulps = 2); - assert_ulps_eq!(ra_errors[1], 3e-6, max_ulps = 2); - assert_ulps_eq!(ra_errors[2], 5e-6, max_ulps = 2); - - assert_ulps_eq!(dec_errors[0], 2e-6, max_ulps = 2); - assert_ulps_eq!(dec_errors[1], 4e-6, max_ulps = 2); - assert_ulps_eq!(dec_errors[2], 6e-6, max_ulps = 2); - } - - #[test] - #[should_panic(expected = "index out of bounds")] - fn test_extract_errors_out_of_bounds() { - let obs = make_observations(); - let idx_obs = Vector3::new(0, 1, 10); // 10 is out of bounds - let _ = obs.extract_errors(idx_obs); - } - } - - #[test] - #[cfg(feature = "jpl-download")] - fn test_estimate_best_orbit() { - use approx::assert_relative_eq; - use rand::{rngs::StdRng, SeedableRng}; - - use crate::{ - orbit_type::{ - keplerian_element::KeplerianElements, orbit_type_test::approx_equal, - OrbitalElements, - }, - unit_test_global::OUTFIT_HORIZON_TEST, - }; - - let mut traj_set = OUTFIT_HORIZON_TEST.1.clone(); - - let traj_number = crate::constants::ObjectNumber::String("K09R05F".into()); - let traj_len = traj_set - .get(&traj_number) - .expect("Failed to get trajectory") - .len(); - - let traj = traj_set - .get_mut(&traj_number) - .expect("Failed to get trajectory"); - - let mut rng = StdRng::seed_from_u64(42_u64); // seed for reproducibility - - let gap_max = 8.0 / 24.0; // 8 hours in days - - let params = IODParams { - n_noise_realizations: 5, - max_obs_for_triplets: traj_len, - gap_max, - ..Default::default() - }; - - let (best_orbit, best_rms) = traj - .estimate_best_orbit( - &OUTFIT_HORIZON_TEST.0, - &ErrorModel::FCCT14, - &mut rng, - ¶ms, - ) - .unwrap(); - - let binding = best_orbit; - let orbit = binding.get_orbit(); - - let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { - reference_epoch: 57049.22904488294, - semi_major_axis: 1.801748431600605, - eccentricity: 0.283572284127787, - inclination: 0.20266779609836036, - ascending_node_longitude: 0.008022659889281067, - periapsis_argument: 1.245060173584828, - mean_anomaly: 0.44047943792316746, - }); - - assert!(approx_equal(orbit, &expected_orbit, 1e-14)); - assert_relative_eq!(best_rms, 55.14810894219461, epsilon = 1e-14); - } -} diff --git a/src/observations/triplets_generator.rs b/src/observations/triplets_generator.rs deleted file mode 100644 index 3ff4cb9..0000000 --- a/src/observations/triplets_generator.rs +++ /dev/null @@ -1,323 +0,0 @@ -//! # IOD Triplet Index Generator (lazy, windowed by time span) -//! -//! Streams **reduced indices** `(first, middle, last)` of time-feasible IOD triplets, -//! after sorting and downsampling the input observations. This is intended to be the -//! *index-level* counterpart of a Gauss triplet generator, allowing clients to compute -//! their own heuristics (e.g., a spacing weight) before materializing actual `GaussObs`. -//! -//! ## What “reduced indices” means -//! The generator first downsamples the full observation set to a smaller, **time-sorted** -//! subset (the “reduced” view). Indices yielded by the iterator refer to this reduced -//! view; use `selected_original_indices()` to map **reduced → original** indices. -//! -//! ## Feasibility constraints -//! For each yielded triplet `(first, middle, last)` with `first < middle < last`, the -//! following time-span constraint holds: -//! -//! ```text -//! dt_min ≤ t[last] - t[first] ≤ dt_max -//! ``` -//! -//! where `t[*]` are the **reduced** epochs (same units as your observation times, e.g. TT/MJD). -//! -//! ## Why this generator? -//! - **Lazy**: no intermediate `Vec` of triplets; you can start consuming immediately. -//! - **Better complexity**: a per-anchor two-pointer window on `last` reduces the -//! effective cost towards ~`O(n²)` in typical time distributions (vs. `O(n³)` brute force). -//! - **No overlapping borrows**: the generator **owns** its internal buffers (times, -//! mapping), so you can iterate without holding long-lived borrows of the input. -//! -//! ## Typical flow -//! 1. Build with `TripletIndexGenerator::from_observations(...)` (sorts + downsamples). -//! 2. Iterate lazily over `(i, j, k)` **reduced** indices. -//! 3. If needed, map to originals via `gen.selected_original_indices()[i]`. -//! 4. (Optional) Compute a heuristic (e.g., spacing weight) and keep the best-K with a heap. -//! 5. Only then materialize full `GaussObs` from the original observations. -//! -//! ## Invariants per anchor -//! - `first < middle < last` always holds. -//! - For the current `first`, the **feasible window** for `last` is -//! `[last_lower_bound_reduced_idx, last_upper_bound_reduced_idx]` such that -//! `dt_min ≤ t[last] - t[first] ≤ dt_max`. -//! - The initial `middle` is `first + 1` and the initial `last` is -//! `max(last_lower_bound_reduced_idx, middle + 1)`. -//! -//! ## Complexity -//! - Time: typically ~`O(n²)` (one window sweep per anchor). -//! - Space: `O(1)` per yielded triplet (the generator holds only the reduced times and mapping). -//! -//! ## Notes & pitfalls -//! - `dt_min`/`dt_max` must be in the **same time units** as your observation epochs. -//! - If `dt_min > dt_max` or there are fewer than 3 reduced observations, the iterator is empty. -//! - The generator **does not** impose any ordering by a heuristic (e.g., “optimal interval”); -//! it only ensures time-feasibility. Best-first strategies should be layered on top. -//! -//! ## See also -//! - A Gauss triplet generator that yields `GaussObs` and can be combined with Monte-Carlo -//! perturbations (`realizations_iter`). -//! - An IOD search routine (e.g., `estimate_best_orbit`) that consumes indices for early-stop. - -use crate::observations::{triplets_iod::downsample_uniform_with_edges_indices, Observations}; - -/// Stream-only generator of **reduced indices** `(first, middle, last)` -/// for time-feasible IOD triplets. -/// -/// Arguments -/// ----------------- -/// * `dt_min` – Minimum allowed time span between **first** and **last**. -/// * `dt_max` – Maximum allowed time span between **first** and **last**. -/// * `max_triplets_to_yield` – Optional cap on the number of yielded triplets (use `usize::MAX` for no cap). -/// -/// Return -/// ---------- -/// * Implements `Iterator` where the tuple contains -/// **reduced** indices `(first, middle, last)`. -/// -/// See also -/// ------------ -/// * [`selected_original_indices`](TripletIndexGenerator::selected_original_indices) – Map reduced indices back to original ones. -/// * A `GaussObs`-level generator if you need full triplets instead of indices. -pub struct TripletIndexGenerator { - /// Map reduced index → original index (owned). - reduced_to_original_index: Vec, - /// Epochs of the reduced observations (same units as input times; owned). - reduced_epochs_tt_mjd: Vec, - - /// Current **first** (anchor) index in reduced space. - first_reduced_idx: usize, - /// Current **middle** index in reduced space. - middle_reduced_idx: usize, - /// Current **last** index in reduced space. - last_reduced_idx: usize, - - /// Lower bound (inclusive) for `last` given the current `first`. - last_lower_bound_reduced_idx: usize, - /// Upper bound (inclusive) for `last` given the current `first`. - last_upper_bound_reduced_idx: usize, - - /// Number of reduced observations. - reduced_len: usize, - - /// Time-window constraints on `(first, last)`. - dt_min: f64, - dt_max: f64, - - /// Count of triplets yielded so far (monotonic). - yielded_triplets_count: usize, - /// Hard cap on the number of triplets to yield. - max_triplets_to_yield: usize, -} - -impl TripletIndexGenerator { - /// Build a generator from a full observation set: - /// - Sorts by time (in-place), - /// - Downsamples to at most `max_obs_for_triplets`, - /// - Caches reduced epochs and the reduced→original mapping (both **owned**), - /// - Positions on the first feasible window if any. - /// - /// Arguments - /// ----------------- - /// * `observations` – The full set; will be **sorted by time in place**. - /// * `dt_min`, `dt_max` – Time-span constraints on `(first, last)`. - /// * `max_obs_for_triplets` – Downsampling cap (uniform with edges). - /// * `max_triplets_to_yield` – Upper bound on yielded triplets (`usize::MAX` for no cap). - /// - /// Return - /// ---------- - /// * A `TripletIndexGenerator` positioned at the first feasible window, - /// or “empty” if fewer than 3 reduced observations remain. - /// - /// See also - /// ------------ - /// * [`TripletIndexGenerator::selected_original_indices`] - /// * [`TripletIndexGenerator::reduced_times`] - pub fn from_observations( - observations: &mut Observations, - dt_min: f64, - dt_max: f64, - max_obs_for_triplets: usize, - max_triplets_to_yield: usize, - ) -> Self { - // 1) Sort by epoch (ascending) - observations.sort_by(|a, b| a.time.partial_cmp(&b.time).unwrap()); - - // 2) Downsample → keep indices only (no long borrows) - let reduced_to_original_index = - downsample_uniform_with_edges_indices(observations.len(), max_obs_for_triplets); - - // 3) Cache reduced epochs (owned) aligned with reduced indices - let reduced_epochs_tt_mjd: Vec = reduced_to_original_index - .iter() - .map(|&orig| observations[orig].time) - .collect(); - - let reduced_len = reduced_epochs_tt_mjd.len(); - - // Initialize; the precise window is set by `init_last_window_for_first` - let mut gen = Self { - reduced_to_original_index, - reduced_epochs_tt_mjd, - first_reduced_idx: 0, - middle_reduced_idx: 1, - last_reduced_idx: 2, - last_lower_bound_reduced_idx: 2, - last_upper_bound_reduced_idx: 1, // sentinel; will be recomputed - reduced_len, - dt_min, - dt_max, - yielded_triplets_count: 0, - max_triplets_to_yield, - }; - - if gen.reduced_len >= 3 { - gen.init_last_window_for_first(); - } - gen - } - - /// Access the reduced→original index mapping. - /// - /// Return - /// ---------- - /// * A slice of original indices; `selected_original_indices()[r]` maps reduced `r` → original. - /// - /// See also - /// ------------ - /// * [`TripletIndexGenerator::reduced_times`] - pub fn selected_original_indices(&self) -> &[usize] { - &self.reduced_to_original_index - } - - /// Access the reduced epochs (TT/MJD). - /// - /// Return - /// ---------- - /// * A slice of epochs aligned with reduced indices. - pub fn reduced_times(&self) -> &[f64] { - &self.reduced_epochs_tt_mjd - } - - /// Recompute the feasible `last` window `[lower, upper]` for the current `first`. - /// - /// Invariants - /// ----------------- - /// * `lower` is the earliest `last` with `t[last] - t[first] ≥ dt_min`. - /// * `upper` is the latest `last` with `t[last] - t[first] ≤ dt_max`. - /// * `middle = first + 1`. - /// * `last = max(lower, middle + 1)`. - fn init_last_window_for_first(&mut self) { - let first = self.first_reduced_idx; - - // Lower bound (earliest last satisfying the min span; need one middle in (first, last)) - let mut lower = first + 2; - while lower < self.reduced_len - && (self.reduced_epochs_tt_mjd[lower] - self.reduced_epochs_tt_mjd[first]) < self.dt_min - { - lower += 1; - } - - // Upper bound (latest last satisfying the max span) - let mut upper = lower.saturating_sub(1).max(first + 1); - while (upper + 1) < self.reduced_len - && (self.reduced_epochs_tt_mjd[upper + 1] - self.reduced_epochs_tt_mjd[first]) - <= self.dt_max - { - upper += 1; - } - - self.last_lower_bound_reduced_idx = lower; - self.last_upper_bound_reduced_idx = upper; - - self.middle_reduced_idx = first + 1; - self.last_reduced_idx = self - .last_lower_bound_reduced_idx - .max(self.middle_reduced_idx + 1); - } - - /// Move to the next `first` anchor and refresh its feasible `last` window. - /// - /// Return - /// ---------- - /// * `true` if there are still enough reduced observations to form a triplet; `false` otherwise. - fn advance_first_anchor(&mut self) -> bool { - self.first_reduced_idx += 1; - if self.first_reduced_idx + 2 >= self.reduced_len { - return false; - } - self.init_last_window_for_first(); - true - } - - /// Whether the current `(first, middle, last)` window is empty. - /// - /// Return - /// ---------- - /// * `true` if the time-feasible window is empty or invalid; `false` otherwise. - fn last_window_is_empty(&self) -> bool { - self.last_lower_bound_reduced_idx >= self.reduced_len - || self.last_lower_bound_reduced_idx <= self.first_reduced_idx + 1 - || self.last_upper_bound_reduced_idx <= self.first_reduced_idx + 1 - || self.last_lower_bound_reduced_idx > self.last_upper_bound_reduced_idx - } -} - -impl Iterator for TripletIndexGenerator { - type Item = (usize, usize, usize); // reduced indices (first, middle, last) - - fn next(&mut self) -> Option { - // Respect the optional global cap. - if self.yielded_triplets_count >= self.max_triplets_to_yield { - return None; - } - - while self.first_reduced_idx + 2 < self.reduced_len { - // If the current last-window is empty, move to the next anchor. - if self.last_window_is_empty() { - if !self.advance_first_anchor() { - return None; - } - continue; - } - - // If `middle` reached the upper bound, switch to the next `first`. - if self.middle_reduced_idx >= self.last_upper_bound_reduced_idx { - if !self.advance_first_anchor() { - return None; - } - continue; - } - - // Ensure `last` is within the feasible window and respects `middle < last`. - if self.last_reduced_idx < self.last_lower_bound_reduced_idx - || self.last_reduced_idx <= self.middle_reduced_idx - { - self.last_reduced_idx = self - .last_lower_bound_reduced_idx - .max(self.middle_reduced_idx + 1); - } - - // If `last` exceeded the window, advance `middle` and reset `last`. - if self.last_reduced_idx > self.last_upper_bound_reduced_idx { - self.middle_reduced_idx += 1; - self.last_reduced_idx = self - .last_lower_bound_reduced_idx - .max(self.middle_reduced_idx + 1); - continue; - } - - // We have a feasible triplet (first, middle, last). - let i = self.first_reduced_idx; - let j = self.middle_reduced_idx; - let k = self.last_reduced_idx; - - // Prepare the next candidate by advancing `last`. - self.last_reduced_idx += 1; - - self.yielded_triplets_count += 1; - return Some((i, j, k)); - } - - // No more anchors → enumeration complete. - None - } -} diff --git a/src/observer_extension.rs b/src/observer_extension.rs new file mode 100644 index 0000000..ad6329b --- /dev/null +++ b/src/observer_extension.rs @@ -0,0 +1,191 @@ +use hifitime::{ut1::Ut1Provider, Epoch}; +use nalgebra::Vector3; +use ordered_float::NotNan; +use photom::{constants::ERAU, observer::Observer}; + +use crate::{ + cache::{ + observer_centric_cache::{ + ObserverGeocentricPosition, ObserverGeocentricVelocity, ObserverHeliocentricPosition, + }, + observer_fixed_cache::{ObserverFixedCache, ObserverFixedPosition, ObserverFixedVelocity}, + }, + constants::{EARTH_ROTATION, ROT_ECLMJ2000_TO_EQUMJ2000}, + conversion::ToNotNan, + earth_orientation::equequ, + ref_system::{rotmt, rotpn, RefEpoch, RefSystem}, + time::gmst, + JPLEphem, OutfitError, +}; + +pub(crate) trait ResolvedObserver { + /// Get the fixed position of an observatory using its geographic coordinates + /// + /// Return + /// ------ + /// * observer fixed coordinates vector on the Earth (not corrected from Earth motion) + /// * units is AU + fn earth_fixed_position(&self) -> Result; + + /// Get the fixed velocity of an observatory due to Earth rotation, using its geographic coordinates + /// + /// Return + /// ------ + /// * observer fixed velocity vector due to Earth rotation, in the Earth-fixed frame (not corrected from Earth motion) + /// * units is AU/day + fn earth_fixed_velocity(&self) -> Result; + + /// Compute the observer’s geocentric position and velocity in the ecliptic J2000 frame. + /// + /// This function calculates the position and velocity of a ground-based observer relative to the Earth's + /// center of mass, accounting for Earth rotation (via GMST), nutation, and the observer’s geographic location. + /// The result is expressed in the ecliptic mean J2000 frame, suitable for use in orbital initial determination. + /// + /// Arguments + /// --------- + /// * `observer`: a reference to an [`Observer`] containing the site longitude and parallax parameters. + /// * `tmjd`: observation epoch as a [`hifitime::Epoch`] in TT. + /// * `ut1_provider`: a reference to a [`hifitime::ut1::Ut1Provider`] for accurate UT1 conversion. + /// + /// Returns + /// -------- + /// * `(dx, dv)` – Tuple of: + /// - `dx`: observer geocentric position vector in ecliptic mean J2000 frame \[AU\]. + /// - `dv`: observer velocity vector due to Earth's rotation, in the same frame \[AU/day\]. + /// + /// Remarks + /// ------- + /// * Internally, this function: + /// 1. get the body-fixed coordinates of the observer. + /// 2. get its rotational velocity: `v = ω × r`. + /// 3. Applies Earth orientation corrections using: + /// - Greenwich Mean Sidereal Time (GMST), + /// - Equation of the equinoxes, + /// - Precession and nutation transformation (`rotpn`). + /// 4. Returns position and velocity in the J2000 ecliptic frame (used in classical orbital mechanics). + /// + /// # See also + /// * [`Observer::body_fixed_coord`] – observer's base vector in Earth-fixed frame + /// * [`rotpn`] – rotation between reference frames + /// * [`gmst`], [`equequ`] – time-dependent Earth orientation + fn pvobs( + tmjd: &Epoch, + ut1_provider: &Ut1Provider, + observer_fixed_vectors: &ObserverFixedCache, + ) -> Result<(ObserverGeocentricPosition, ObserverGeocentricVelocity), OutfitError>; + + /// Compute the observer’s heliocentric position in the **equatorial mean J2000** frame. + /// + /// This method forms the full heliocentric position of the observing site by combining: + /// - the site **geocentric** position vector at `epoch`, and + /// - the Earth’s **heliocentric** position from the JPL ephemerides. + /// + /// The input geocentric vector is assumed to be expressed in the **ecliptic mean J2000** frame + /// (AU). It is rotated to **equatorial mean J2000**, then added to Earth’s heliocentric + /// position (also in equatorial mean J2000). + /// + /// Arguments + /// ----------------- + /// * `jpl` – [`JPLEphem`] providing Earth's heliocentric state. + /// * `epoch` – Observation epoch in the **TT** time scale. + /// * `observer_geocentric_position` – Geocentric site position **in ecliptic mean J2000** (AU). + /// + /// Return + /// ---------- + /// * `Result` – Observer’s **heliocentric** position at `epoch`, + /// in **AU**, expressed in **equatorial mean J2000**. + /// + /// Remarks + /// ------------- + /// * If your geocentric site vector is already in **equatorial** J2000, rotate it to + /// **ecliptic** before calling this method, or adapt the rotation accordingly. + /// * This routine is typically used internally when constructing per-observation geometry + /// (e.g., within `Observation::new`), ensuring consistent frames for Gauss IOD. + /// + /// See also + /// ------------ + /// * [`Observer::pvobs`] – Geocentric position (and velocity) of the site at `epoch`. + /// * [`Outfit::get_jpl_ephem`] – Access Earth’s heliocentric state from JPL ephemerides. + /// * [`Outfit::get_rot_eclmj2000_to_equmj2000`] – Rotation between ecliptic and equatorial J2000. + fn helio_position( + jpl: &JPLEphem, + epoch: &Epoch, + observer_geocentric_position: &ObserverGeocentricPosition, + ) -> Result; +} + +impl ResolvedObserver for Observer { + fn earth_fixed_position(&self) -> Result { + let (sin_lon, cos_lon): (NotNan, NotNan) = { + let (s, c) = self.longitude.sin_cos(); + (s.to_notnan()?, c.to_notnan()?) + }; + let erau_not_nan = ERAU.to_notnan()?; + + Ok(Vector3::new( + erau_not_nan * self.rho_cos_phi * cos_lon, + erau_not_nan * self.rho_cos_phi * sin_lon, + erau_not_nan * self.rho_sin_phi, + )) + } + + #[inline] + fn earth_fixed_velocity(&self) -> Result { + Ok(EARTH_ROTATION + .to_notnan()? + .cross(&self.earth_fixed_position()?)) + } + + fn pvobs( + tmjd: &Epoch, + ut1_provider: &Ut1Provider, + observer_fixed_vectors: &ObserverFixedCache, + ) -> Result<(ObserverGeocentricPosition, ObserverGeocentricVelocity), OutfitError> { + // Get observer position and velocity in the Earth-fixed frame + let dxbf = observer_fixed_vectors.position(); + let dvbf = observer_fixed_vectors.velocity(); + + // deviation from Orbfit, use of another conversion from MJD UTC (ET scale) to UT1 scale + // based on the hifitime crate + let mjd_ut1 = tmjd.to_ut1(ut1_provider); + let tut = mjd_ut1.to_mjd_tai_days(); + + // Compute the Greenwich sideral apparent time + let gast = gmst(tut) + equequ(tmjd.to_mjd_tt_days()); + + // Earth rotation matrix + let rot = rotmt(-gast, 2); + + // Compute the rotation matrix from equatorial mean J2000 to ecliptic mean J2000 + let rer_sys1 = RefSystem::Equt(RefEpoch::Epoch(tmjd.to_mjd_tt_days())); + let rer_sys2 = RefSystem::Eclm(RefEpoch::J2000); + let rot1 = rotpn(&rer_sys1, &rer_sys2)?; + + let rot1_mat = rot1.transpose().to_notnan()?; + let rot_mat = rot.transpose().to_notnan()?; + + let rotmat = rot1_mat * rot_mat; + + // Apply transformation to the observer position and velocity + let dx = rotmat * dxbf; + let dv = rotmat * dvbf; + + Ok((dx, dv)) + } + + fn helio_position( + jpl: &JPLEphem, + epoch: &Epoch, + observer_geocentric_position: &ObserverGeocentricPosition, + ) -> Result { + // Earth's heliocentric position + let earth_pos = jpl.earth_ephemeris(epoch, false).0.to_notnan()?; + + // Transform observer position from ecliptic to equatorial J2000 + let rot_matrix = ROT_ECLMJ2000_TO_EQUMJ2000.to_notnan()?.transpose(); + + let helio_pos = earth_pos + rot_matrix * observer_geocentric_position; + + Ok(helio_pos) + } +} diff --git a/src/observers/bimap.rs b/src/observers/bimap.rs deleted file mode 100644 index dd9ec03..0000000 --- a/src/observers/bimap.rs +++ /dev/null @@ -1,224 +0,0 @@ -use std::collections::HashMap; -use std::hash::Hash; - -#[derive(Debug, Clone)] -pub struct BiMap -where - K: Eq + Hash + Clone, - V: Eq + Hash + Clone, -{ - forward: HashMap, - reverse: HashMap, -} - -impl Default for BiMap -where - K: Eq + Hash + Clone, - V: Eq + Hash + Clone, -{ - fn default() -> Self { - Self::new() - } -} - -impl BiMap -where - K: Eq + Hash + Clone, - V: Eq + Hash + Clone, -{ - pub fn new() -> Self { - Self { - forward: HashMap::new(), - reverse: HashMap::new(), - } - } - - pub fn entry_or_insert_by_key(&mut self, key: K, value: V) -> &mut V { - self.forward.entry(key.clone()).or_insert_with(|| { - self.reverse.insert(value.clone(), key); - value - }) - } - - pub fn entry_or_insert_by_value(&mut self, value: V, key: K) -> &mut K { - self.reverse.entry(value.clone()).or_insert_with(|| { - self.forward.insert(key.clone(), value); - key - }) - } - - pub fn insert(&mut self, key: K, value: V) { - self.forward.insert(key.clone(), value.clone()); - self.reverse.insert(value, key); - } - - pub fn get_by_key(&self, key: &K) -> Option<&V> { - self.forward.get(key) - } - - pub fn get_by_value(&self, value: &V) -> Option<&K> { - self.reverse.get(value) - } - - pub fn remove_by_key(&mut self, key: &K) { - if let Some(val) = self.forward.remove(key) { - self.reverse.remove(&val); - } - } - - pub fn remove_by_value(&mut self, value: &V) { - if let Some(key) = self.reverse.remove(value) { - self.forward.remove(&key); - } - } - - pub fn len(&self) -> usize { - self.forward.len() - } - - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - - // --------------------------- - // Iteration helpers (immutable) - // --------------------------- - - /// Iterate over (&K, &V) using the forward map. - /// - /// Return - /// ---------- - /// * An iterator yielding `(&K, &V)` pairs. Order is not guaranteed. - /// - /// See also - /// ------------ - /// * [`BiMap::iter_rev`] - /// * [`BiMap::keys`], [`BiMap::values`] - pub fn iter(&self) -> impl Iterator { - self.forward.iter() - } - - /// Iterate over (&V, &K) using the reverse map. - /// - /// Return - /// ---------- - /// * An iterator yielding `(&V, &K)` pairs. Order is not guaranteed. - /// - /// See also - /// ------------ - /// * [`BiMap::iter`] - pub fn iter_rev(&self) -> impl Iterator { - self.reverse.iter() - } - - /// Iterate over keys (&K). - pub fn keys(&self) -> impl Iterator { - self.forward.keys() - } - - /// Iterate over values (&V). - pub fn values(&self) -> impl Iterator { - self.forward.values() - } -} - -// --------------------------- -// IntoIterator implementations -// --------------------------- - -impl<'a, K, V> IntoIterator for &'a BiMap -where - K: Eq + Hash + Clone, - V: Eq + Hash + Clone, -{ - type Item = (&'a K, &'a V); - type IntoIter = std::collections::hash_map::Iter<'a, K, V>; - - /// Consume `&BiMap` into an iterator over `(&K, &V)` on the forward map. - fn into_iter(self) -> Self::IntoIter { - self.forward.iter() - } -} - -impl<'a, K, V> IntoIterator for &'a mut BiMap -where - K: Eq + Hash + Clone, - V: Eq + Hash + Clone, -{ - type Item = (&'a K, &'a mut V); - type IntoIter = std::collections::hash_map::IterMut<'a, K, V>; - - /// Consume `&mut BiMap` into an iterator over `(&K, &mut V)` on the forward map. - /// - /// Warning - /// ------- - /// Mutating values can desynchronize the reverse map if you change logical identity. - /// Use with care; prefer removing/re-inserting pairs instead. - fn into_iter(self) -> Self::IntoIter { - self.forward.iter_mut() - } -} - -impl IntoIterator for BiMap -where - K: Eq + Hash + Clone, - V: Eq + Hash + Clone, -{ - type Item = (K, V); - type IntoIter = std::collections::hash_map::IntoIter; - - /// Consume the bimap and iterate over owned `(K, V)` pairs using the forward map. - fn into_iter(self) -> Self::IntoIter { - self.forward.into_iter() - } -} - -#[cfg(test)] -mod bimap_iter_tests { - use super::*; - use std::collections::HashSet; - - #[test] - fn iter_and_iter_rev_cover_same_pairs() { - let mut m = BiMap::new(); - m.insert("a", 1); - m.insert("b", 2); - m.insert("c", 3); - - let fwd: HashSet<_> = m.iter().map(|(k, v)| ((*k).to_string(), *v)).collect(); - let rev: HashSet<_> = m.iter_rev().map(|(v, k)| ((*k).to_string(), *v)).collect(); - assert_eq!(fwd, rev); - } - - #[test] - fn into_iterator_by_ref_and_by_value() { - let mut m = BiMap::new(); - m.insert("x", 10); - m.insert("y", 20); - - // &BiMap - let pairs_ref: HashSet<_> = (&m) - .into_iter() - .map(|(k, v)| ((*k).to_string(), *v)) - .collect(); - assert!(pairs_ref.contains(&("x".to_string(), 10))); - assert!(pairs_ref.contains(&("y".to_string(), 20))); - - // BiMap (by value) - let pairs_val: HashSet<_> = m.into_iter().collect(); - assert!(pairs_val.contains(&("x", 10))); - assert!(pairs_val.contains(&("y", 20))); - // m is moved here; no further use - } - - #[test] - fn keys_and_values_match_len() { - let mut m = BiMap::new(); - m.insert(1, "one"); - m.insert(2, "two"); - m.insert(3, "three"); - - assert_eq!(m.len(), m.keys().count()); - assert_eq!(m.len(), m.values().count()); - } -} diff --git a/src/observers/mod.rs b/src/observers/mod.rs deleted file mode 100644 index eb0412d..0000000 --- a/src/observers/mod.rs +++ /dev/null @@ -1,1140 +0,0 @@ -//! # Observer & Site Geometry (top-level module) -//! -//! This module gathers **observer/site handling** and associated geometry utilities used in -//! orbit determination. It provides: -//! -//! - A robust [`Observer`](crate::observers::Observer) type storing **geocentric parallax coordinates** (ρ·cosφ, ρ·sinφ), -//! geodetic longitude, optional astrometric accuracies, and **precomputed body-fixed** position -//! and velocity vectors. -//! - High-level routines to compute the observer’s **geocentric PV** in the ecliptic J2000 frame -//! ([`Observer::pvobs`](crate::observers::Observer::pvobs)) and its **heliocentric equatorial position** ([`Observer::helio_position`](crate::observers::Observer::helio_position)). -//! - Helpers to convert geodetic latitude/elevation to normalized parallax coordinates -//! ([`geodetic_to_parallax`](crate::observers::geodetic_to_parallax)) and to lift optional floats into NaN-safe values -//! ([`to_opt_notnan`](crate::observers::to_opt_notnan)). -//! - A convenience function to compute **three observers’ heliocentric positions** at three epochs -//! in one call ([`helio_obs_pos`](crate::observers::helio_obs_pos)) — useful for Gauss/Vaisala IOD triplets. -//! -//! ## Frames & conventions -//! -//! - **Earth-fixed (body-fixed)**: the frame in which site coordinates and rotation rate are defined. -//! - **Ecliptic mean J2000**: default geocentric output of [`Observer::pvobs`](crate::observers::Observer::pvobs) (ICRS ecliptic plane). -//! - **Equatorial mean J2000**: default heliocentric output of [`Observer::helio_position`](crate::observers::Observer::helio_position) and -//! [`helio_obs_pos`](crate::observers::helio_obs_pos) (ICRS-aligned). -//! -//! ```text -//! Body-fixed --(Earth rotation)--> Earth-equatorial --(precession+nutation)--> Ecliptic J2000 -//! \-> Equatorial J2000 -//! ``` -//! -//! Internally, time-dependent Earth orientation uses **GMST** and the **equation of the equinoxes**, -//! and frame changes are performed via [`rotpn`](crate::ref_system::rotpn) / [`rotmt`](crate::ref_system::rotmt) utilities. -//! -//! ## Units -//! -//! - Longitudes: **degrees** (east positive). -//! - Geocentric parallax (ρ·cosφ, ρ·sinφ): **Earth radii** (dimensionless scaling of geocentric distance). -//! - Positions: **AU**. -//! - Velocities: **AU/day** (from `ω × r`, with `ω = (0, 0, 2π·1.00273790934)` rad/day). -//! - `ra_accuracy`, `dec_accuracy`: **radians**. -//! -//! ## Data flow (typical IOD usage) -//! -//! 1. Build an [`Observer`](crate::observers::Observer) from geodetic inputs (`longitude`, `latitude`, `elevation`) via -//! [`Observer::new`](crate::observers::Observer::new) (internally calls [`geodetic_to_parallax`](crate::observers::geodetic_to_parallax)) **or** from known (ρ·cosφ, ρ·sinφ) -//! via [`Observer::from_parallax`](crate::observers::Observer::from_parallax). -//! 2. Compute geocentric PV in **ecliptic J2000** with [`Observer::pvobs`](crate::observers::Observer::pvobs) (needs UT1 provider). -//! 3. Obtain Earth heliocentric state from JPL ephemerides and sum to get the observer’s -//! **heliocentric equatorial** position with [`Observer::helio_position`](crate::observers::Observer::helio_position). -//! 4. For triplets, call [`helio_obs_pos`](crate::observers::helio_obs_pos) to get the 3×3 matrix of heliocentric positions. -//! -//! ## Quick start -//! -//! ```rust,no_run -//! use hifitime::{Epoch, TimeScale}; -//! use nalgebra::{Vector3, Matrix3}; -//! use outfit::outfit::Outfit; -//! use outfit::error_models::ErrorModel; -//! use outfit::observers::{Observer, helio_obs_pos}; -//! -//! // 1) Environment (JPL ephem + UT1) and site -//! let state = Outfit::new("horizon:DE440", ErrorModel::FCCT14)?; -//! let site = Observer::new(203.74409, 20.707233557, 3067.694, Some("Pan-STARRS 1".into()), None, None)?; -//! -////! // 2) Geocentric PV (ecliptic J2000) -//! let t = Epoch::from_mjd_in_time_scale(57028.479297592596, TimeScale::TT); -//! let (_x_ecl, _v_ecl) = site.pvobs(&t, state.get_ut1_provider())?; -//! -//! // 3) Heliocentric position (equatorial J2000) -//! let r_helio_eq = site.helio_position(&state, &t, &Vector3::identity())?; -//! -//! // 4) Batch (3 observers, 3 epochs) -//! let tmjd = Vector3::new(57028.479297592596, 57049.24514759259, 57063.97711759259); -//! let R: Matrix3 = helio_obs_pos([&site, &site, &site], &tmjd, &state)?; -//! # Ok::<(), outfit::outfit_errors::OutfitError>(()) -//! ``` -//! -//! ## Design & invariants -//! -//! - [`Observer`](crate::observers::Observer) stores **precomputed body-fixed** position and velocity to avoid recomputing -//! `ω × r` and trigonometric terms at every call. This is beneficial in tight IOD loops. -//! - `NotNan` is used for fields where **NaN must be forbidden** (e.g., site geometry). -//! Use [`to_opt_notnan`](crate::observers::to_opt_notnan) for optional measurement accuracies. -//! - The geodetic-to-parallax conversion accounts for Earth oblateness via -//! [`EARTH_MAJOR_AXIS`](crate::constants::EARTH_MAJOR_AXIS) / [`EARTH_MINOR_AXIS`](crate::constants::EARTH_MINOR_AXIS). -//! -//! ## Errors -//! -//! - Constructors and helpers return [`OutfitError`](crate::outfit_errors::OutfitError) when NaNs are encountered or a frame -//! conversion fails; [`to_opt_notnan`](crate::observers::to_opt_notnan) returns `ordered_float::FloatIsNan` if given `Some(NaN)`. -//! -//! ## Testing -//! -//! The module includes unit tests for site construction, body-fixed coordinates, -//! geocentric PV against known values, and multi-epoch heliocentric positions (behind the -//! `jpl-download` feature). -//! -//! ## See also -//! ------------ -//! * [`Observer`](crate::observers::Observer) – Site container with precomputed body-fixed state. -//! * [`Observer::pvobs`](crate::observers::Observer::pvobs) – Geocentric PV in **ecliptic J2000**. -//! * [`Observer::helio_position`](crate::observers::Observer::helio_position) – Heliocentric **equatorial J2000** position. -//! * [`helio_obs_pos`](crate::observers::helio_obs_pos) – Batch heliocentric positions for triplets. -//! * [`geodetic_to_parallax`](crate::observers::geodetic_to_parallax) – Geodetic latitude/elevation → (ρ·cosφ, ρ·sinφ). -//! * [`rotpn`](crate::ref_system::rotpn), [`rotmt`](crate::ref_system::rotmt) – Reference-frame transformations. -//! * [`gmst`](crate::time::gmst), [`equequ`](crate::earth_orientation::equequ) – Earth orientation (sidereal time & equation of equinoxes). -//! * [`Outfit`](crate::outfit::Outfit) – Access to JPL ephemerides and UT1 provider. - -pub mod bimap; -pub mod observatories; - -use hifitime::ut1::Ut1Provider; -use hifitime::Epoch; -use nalgebra::{Matrix3, Vector3}; -use ordered_float::NotNan; - -use crate::constants::{Degree, Meter, EARTH_MAJOR_AXIS, EARTH_MINOR_AXIS, MJD}; -use crate::constants::{DPI, ERAU}; -use crate::earth_orientation::equequ; -use crate::outfit::Outfit; -use crate::outfit_errors::OutfitError; -use crate::ref_system::{rotmt, rotpn, RefEpoch, RefSystem}; -use crate::time::gmst; -use std::fmt; - -/// Convert an `Option` into an `Option>`, propagating `NaN` as an error. -/// -/// This helper lifts a possibly missing floating-point value into a `NotNan` container -/// while keeping the outer `Option`. If the inner value is `Some(x)` and `x.is_nan()`, -/// the function returns `Err(FloatIsNan)`. If it is `None`, the result is `Ok(None)`. -/// -/// Arguments -/// ----------------- -/// * `x`: The optional floating-point value to wrap. -/// -/// Return -/// ---------- -/// * A `Result` containing `Some(NotNan)` when `x` is finite, `Ok(None)` when `x` is `None`, -/// or an error if `x` is `NaN`. -/// -/// Errors -/// ---------- -/// * `ordered_float::FloatIsNan` if `x` is `Some(NaN)`. -/// -/// See also -/// ------------ -/// * [`ordered_float::NotNan`] – NaN-forbidding wrapper used across the crate. -#[inline] -pub fn to_opt_notnan(x: Option) -> Result>, ordered_float::FloatIsNan> { - x.map(NotNan::new).transpose() -} - -/// Observer geocentric parameters and precomputed body-fixed state. -/// -/// This struct stores: -/// - The observer's **geocentric parallax coordinates** (ρ·cosφ, ρ·sinφ), where ρ is the -/// geocentric distance in **Earth radii** and φ is the **geocentric** latitude. -/// - The **geodetic longitude** (degrees, east of Greenwich). -/// - Optional **astrometric accuracies** for right ascension and declination (radians). -/// - Precomputed **body-fixed** position and velocity vectors used in orbit determination. -/// -/// Units -/// ----- -/// * `longitude`: degrees (east positive). -/// * `rho_cos_phi`, `rho_sin_phi`: Earth radii (dimensionless scale factor ρ times trig of φ). -/// * `observer_fixed_coord`: astronomical units (AU). -/// * `observer_velocity`: AU/day (from Earth rotation cross product). -/// * `ra_accuracy`, `dec_accuracy`: radians. -/// -/// Notes -/// ----- -/// The precomputed body-fixed vectors assume a constant Earth rotation rate -/// ω = (0, 0, 2π·1.00273790934) rad/day. Position is scaled by `ERAU` (Earth radius in AU), -/// hence the resulting velocity is in AU/day. -/// -/// See also -/// ------------ -/// * [`geodetic_to_parallax`] – Converts geodetic latitude/elevation to (ρ·cosφ, ρ·sinφ). -/// * [`Observer::new`] – Construct from geodetic longitude/latitude/elevation. -/// * [`Observer::from_parallax`] – Construct directly from (ρ·cosφ, ρ·sinφ). -/// * [`crate::ref_system::rotpn`] – Reference frame rotations used elsewhere in the pipeline. -#[derive(Debug, PartialEq, Eq, Hash, Clone)] -pub struct Observer { - /// Geodetic longitude in **degrees** east of Greenwich. - pub longitude: NotNan, - - /// ρ·cosφ (geocentric latitude φ), in **Earth radii** (dimensionless scale). - pub rho_cos_phi: NotNan, - - /// ρ·sinφ (geocentric latitude φ), in **Earth radii** (dimensionless scale). - pub rho_sin_phi: NotNan, - - /// Optional human-readable site name. - pub name: Option, - - /// Right ascension measurement accuracy, in **radians** (optional). - pub ra_accuracy: Option>, - - /// Declination measurement accuracy, in **radians** (optional). - pub dec_accuracy: Option>, - - /// Precomputed **body-fixed** position of the observer in **AU**. - observer_fixed_coord: Vector3>, - - /// Precomputed **body-fixed** velocity of the observer in **AU/day**. - observer_velocity: Vector3>, -} - -impl Observer { - /// Create a new observer from geodetic coordinates. - /// - /// This constructor converts `(latitude, elevation)` into geocentric parallax - /// coordinates `(ρ·cosφ, ρ·sinφ)` using [`geodetic_to_parallax`], builds the - /// body-fixed position vector in **AU** (scaled by `ERAU`), and computes the - /// body-fixed velocity as `ω × r` with `ω = (0, 0, 2π·1.00273790934)` in rad/day, - /// yielding **AU/day**. - /// - /// Arguments - /// ----------------- - /// * `longitude`: Geodetic longitude in **degrees** (east positive). - /// * `latitude`: Geodetic latitude in **degrees**. - /// * `elevation`: Height above the reference ellipsoid in **meters**. - /// * `name`: Optional site name. - /// * `ra_accuracy`: Optional RA accuracy in **radians**. - /// * `dec_accuracy`: Optional DEC accuracy in **radians**. - /// - /// Return - /// ---------- - /// * A constructed [`Observer`] with precomputed body-fixed state. - /// - /// Errors - /// ---------- - /// * [`OutfitError`] if the inputs cannot be represented as `NotNan` (e.g., NaN encountered). - /// - /// See also - /// ------------ - /// * [`geodetic_to_parallax`] – Geodetic-to-geocentric parallax conversion. - /// * [`Observer::from_parallax`] – Build directly from (ρ·cosφ, ρ·sinφ). - /// * [`crate::ref_system::rotpn`] – Frame rotation utilities used later in the pipeline. - pub fn new( - longitude: Degree, - latitude: Degree, - elevation: Meter, - name: Option, - ra_accuracy: Option, - dec_accuracy: Option, - ) -> Result { - let (rho_cos_phi, rho_sin_phi) = geodetic_to_parallax(latitude, elevation); - - // Angular velocity of Earth rotation (rad/day) on the z-axis. - let omega: Vector3> = Vector3::new( - NotNan::new(0.0)?, - NotNan::new(0.0)?, - NotNan::new(DPI * 1.00273790934)?, - ); - - // Body-fixed position in AU from (ρ·cosφ, ρ·sinφ) scaled by Earth radius (AU). - let lon_radians = longitude.to_radians(); - let body_fixed_coord: Vector3> = Vector3::new( - NotNan::new(ERAU * rho_cos_phi * lon_radians.cos())?, - NotNan::new(ERAU * rho_cos_phi * lon_radians.sin())?, - NotNan::new(ERAU * rho_sin_phi)?, - ); - - // Body-fixed velocity from Earth rotation. - let dvbf = omega.cross(&body_fixed_coord); - - Ok(Observer { - longitude: NotNan::try_from(longitude)?, - rho_cos_phi: NotNan::try_from(rho_cos_phi)?, - rho_sin_phi: NotNan::try_from(rho_sin_phi)?, - name, - ra_accuracy: to_opt_notnan(ra_accuracy)?, - dec_accuracy: to_opt_notnan(dec_accuracy)?, - observer_fixed_coord: body_fixed_coord, - observer_velocity: dvbf, - }) - } - - /// Create a new observer from geocentric parallax coordinates. - /// - /// This constructor skips the geodetic-to-parallax conversion and directly uses - /// `(ρ·cosφ, ρ·sinφ)` to build the body-fixed position in **AU** (scaled by `ERAU`), - /// and the body-fixed velocity in **AU/day** as `ω × r` with - /// `ω = (0, 0, 2π·1.00273790934)` rad/day. - /// - /// Arguments - /// ----------------- - /// * `longitude`: Geodetic longitude in **degrees** (east positive). - /// * `rho_cos_phi`: ρ·cosφ in **Earth radii** (dimensionless). - /// * `rho_sin_phi`: ρ·sinφ in **Earth radii** (dimensionless). - /// * `name`: Optional site name. - /// * `ra_accuracy`: Optional RA accuracy in **radians**. - /// * `dec_accuracy`: Optional DEC accuracy in **radians**. - /// - /// Return - /// ---------- - /// * A constructed [`Observer`] with precomputed body-fixed state. - /// - /// Errors - /// ---------- - /// * [`OutfitError`] if inputs cannot be represented as `NotNan` (e.g., NaN encountered). - /// - /// See also - /// ------------ - /// * [`Observer::new`] – Build from geodetic latitude and elevation. - /// * [`geodetic_to_parallax`] – For the forward conversion when geodetic inputs are available. - pub fn from_parallax( - longitude: Degree, - rho_cos_phi: f64, - rho_sin_phi: f64, - name: Option, - ra_accuracy: Option, - dec_accuracy: Option, - ) -> Result { - // Angular velocity of Earth rotation (rad/day) on the z-axis. - let omega: Vector3> = Vector3::new( - NotNan::new(0.0)?, - NotNan::new(0.0)?, - NotNan::new(DPI * 1.00273790934)?, - ); - - // Body-fixed position in AU from (ρ·cosφ, ρ·sinφ) scaled by Earth radius (AU). - let lon_radians = longitude.to_radians(); - let body_fixed_coord: Vector3> = Vector3::new( - NotNan::new(ERAU * rho_cos_phi * lon_radians.cos())?, - NotNan::new(ERAU * rho_cos_phi * lon_radians.sin())?, - NotNan::new(ERAU * rho_sin_phi)?, - ); - - // Body-fixed velocity from Earth rotation. - let dvbf = omega.cross(&body_fixed_coord); - - Ok(Observer { - longitude: NotNan::try_from(longitude)?, - rho_cos_phi: NotNan::try_from(rho_cos_phi)?, - rho_sin_phi: NotNan::try_from(rho_sin_phi)?, - name, - ra_accuracy: to_opt_notnan(ra_accuracy)?, - dec_accuracy: to_opt_notnan(dec_accuracy)?, - observer_fixed_coord: body_fixed_coord, - observer_velocity: dvbf, - }) - } - - /// Get the fixed position of an observatory using its geographic coordinates - /// - /// Argument - /// -------- - /// * longitude: observer longitude in Degree - /// * latitude: observer latitude in Degree - /// * height: observer height in Degree - /// - /// Return - /// ------ - /// * observer fixed coordinates vector on the Earth (not corrected from Earth motion) - /// * units is AU - pub fn body_fixed_coord(&self) -> Vector3 { - let lon_radians = self.longitude.to_radians(); - - Vector3::new( - ERAU * self.rho_cos_phi.into_inner() * lon_radians.cos(), - ERAU * self.rho_cos_phi.into_inner() * lon_radians.sin(), - ERAU * self.rho_sin_phi.into_inner(), - ) - } - - /// Compute the observer’s geocentric position and velocity in the ecliptic J2000 frame. - /// - /// This function calculates the position and velocity of a ground-based observer relative to the Earth's - /// center of mass, accounting for Earth rotation (via GMST), nutation, and the observer’s geographic location. - /// The result is expressed in the ecliptic mean J2000 frame, suitable for use in orbital initial determination. - /// - /// Arguments - /// --------- - /// * `observer`: a reference to an [`Observer`] containing the site longitude and parallax parameters. - /// * `tmjd`: observation epoch as a [`hifitime::Epoch`] in TT. - /// * `ut1_provider`: a reference to a [`hifitime::ut1::Ut1Provider`] for accurate UT1 conversion. - /// - /// Returns - /// -------- - /// * `(dx, dv)` – Tuple of: - /// - `dx`: observer geocentric position vector in ecliptic mean J2000 frame \[AU\]. - /// - `dv`: observer velocity vector due to Earth's rotation, in the same frame \[AU/day\]. - /// - /// Remarks - /// ------- - /// * Internally, this function: - /// 1. get the body-fixed coordinates of the observer. - /// 2. get its rotational velocity: `v = ω × r`. - /// 3. Applies Earth orientation corrections using: - /// - Greenwich Mean Sidereal Time (GMST), - /// - Equation of the equinoxes, - /// - Precession and nutation transformation (`rotpn`). - /// 4. Returns position and velocity in the J2000 ecliptic frame (used in classical orbital mechanics). - /// - /// # See also - /// * [`Observer::body_fixed_coord`] – observer's base vector in Earth-fixed frame - /// * [`rotpn`] – rotation between reference frames - /// * [`gmst`], [`equequ`] – time-dependent Earth orientation - pub fn pvobs( - &self, - tmjd: &Epoch, - ut1_provider: &Ut1Provider, - ) -> Result<(Vector3, Vector3), OutfitError> { - // Get observer position and velocity in the Earth-fixed frame - let dxbf = self.observer_fixed_coord.map(|x| x.into_inner()); - let dvbf = self.observer_velocity.map(|x| x.into_inner()); - - // deviation from Orbfit, use of another conversion from MJD UTC (ET scale) to UT1 scale - // based on the hifitime crate - let mjd_ut1 = tmjd.to_ut1(ut1_provider); - let tut = mjd_ut1.to_mjd_tai_days(); - - // Compute the Greenwich sideral apparent time - let gast = gmst(tut) + equequ(tmjd.to_mjd_tt_days()); - - // Earth rotation matrix - let rot = rotmt(-gast, 2); - - // Compute the rotation matrix from equatorial mean J2000 to ecliptic mean J2000 - let rer_sys1 = RefSystem::Equt(RefEpoch::Epoch(tmjd.to_mjd_tt_days())); - let rer_sys2 = RefSystem::Eclm(RefEpoch::J2000); - let rot1 = rotpn(&rer_sys1, &rer_sys2)?; - - let rot1_mat = rot1.transpose(); - let rot_mat = rot.transpose(); - - let rotmat = rot1_mat * rot_mat; - - // Apply transformation to the observer position and velocity - let dx = rotmat * dxbf; - let dv = rotmat * dvbf; - - Ok((dx, dv)) - } - - /// Compute the observer’s heliocentric position in the **equatorial mean J2000** frame. - /// - /// This method forms the full heliocentric position of the observing site by combining: - /// - the site **geocentric** position vector at `epoch`, and - /// - the Earth’s **heliocentric** position from the JPL ephemerides. - /// - /// The input geocentric vector is assumed to be expressed in the **ecliptic mean J2000** frame - /// (AU). It is rotated to **equatorial mean J2000**, then added to Earth’s heliocentric - /// position (also in equatorial mean J2000). - /// - /// Arguments - /// ----------------- - /// * `state` – [`Outfit`] environment providing JPL ephemerides and frame rotations. - /// * `epoch` – Observation epoch in the **TT** time scale. - /// * `observer_geocentric_position` – Geocentric site position **in ecliptic mean J2000** (AU). - /// - /// Return - /// ---------- - /// * `Result, OutfitError>` – Observer’s **heliocentric** position at `epoch`, - /// in **AU**, expressed in **equatorial mean J2000**. - /// - /// Remarks - /// ------------- - /// * If your geocentric site vector is already in **equatorial** J2000, rotate it to - /// **ecliptic** before calling this method, or adapt the rotation accordingly. - /// * This routine is typically used internally when constructing per-observation geometry - /// (e.g., within `Observation::new`), ensuring consistent frames for Gauss IOD. - /// - /// See also - /// ------------ - /// * [`Observer::pvobs`] – Geocentric position (and velocity) of the site at `epoch`. - /// * [`Outfit::get_jpl_ephem`] – Access Earth’s heliocentric state from JPL ephemerides. - /// * [`Outfit::get_rot_eclmj2000_to_equmj2000`] – Rotation between ecliptic and equatorial J2000. - pub fn helio_position( - &self, - state: &Outfit, - epoch: &Epoch, - observer_geocentric_position: &Vector3, - ) -> Result, OutfitError> { - let jpl = state.get_jpl_ephem().unwrap(); - - // Earth's heliocentric position - let earth_pos = jpl.earth_ephemeris(epoch, false).0; - - // Transform observer position from ecliptic to equatorial J2000 - let rot_matrix = state.get_rot_eclmj2000_to_equmj2000().transpose(); - - Ok(earth_pos + rot_matrix * observer_geocentric_position) - } - - /// Recover geodetic latitude and ellipsoidal height (WGS-84) from parallax constants. - /// - /// Inverts the stored parallax coordinates `(ρ·cosφ, ρ·sinφ)` to the **geodetic** - /// latitude `φ` (degrees) and the ellipsoidal height `h` (meters) above the - /// WGS-84 reference ellipsoid. The computation uses **Bowring’s closed-form** - /// formula (no iteration), which is usually sufficient for double-precision - /// accuracy at the centimeter level or better. - /// - /// Units & model - /// ------------- - /// * Inputs: `ρ·cosφ` and `ρ·sinφ` are dimensionless, expressed in **Earth radii** - /// (normalized by the equatorial radius). They are scaled internally by `a` - /// (the equatorial radius) to meters. - /// * Output: latitude in **degrees**, height in **meters** (ellipsoidal height, not geoid/orthometric). - /// * Ellipsoid: WGS-84 radii from `constants.rs` (`EARTH_MAJOR_AXIS` = `a`, `EARTH_MINOR_AXIS` = `b`). - /// If you prefer exact GRS-80 reproduction, use consistent `b` there; the difference vs WGS-84 is sub-millimetric. - /// - /// Notes - /// ----- - /// * This routine **does not** compute the geodetic longitude; it only returns `(lat, h)`. - /// Your `Observer` already stores the geodetic longitude independently. - /// * Numerical robustness is good across latitudes, including near the poles. - /// * If you require bit-for-bit parity with an external reference using a different ellipsoid, - /// ensure `a`/`b` match that reference. - /// - /// Arguments - /// ----------------- - /// * None. - /// - /// Return - /// ---------- - /// * `(geodetic_latitude_deg, height_meters)` — latitude in degrees, ellipsoidal height in meters. - /// - /// See also - /// ------------ - /// * [`geodetic_to_parallax`] – Forward conversion used at construction. - /// * [`Observer::from_parallax`] – Builds an observer from `(ρ·cosφ, ρ·sinφ)`. - /// * `constants::EARTH_MAJOR_AXIS` / `constants::EARTH_MINOR_AXIS` – Ellipsoid radii used here. - pub fn geodetic_lat_height_wgs84(&self) -> (f64, f64) { - let a = EARTH_MAJOR_AXIS; - let b = EARTH_MINOR_AXIS; - let e2 = 1.0 - (b * b) / (a * a); - let ep2 = (a * a) / (b * b) - 1.0; - - let p = self.rho_cos_phi.into_inner() * a; // distance in equatorial plane [m] - let z = self.rho_sin_phi.into_inner() * a; // z [m] - - // Bowring’s formula: - let theta = (z * a).atan2(p * b); - let st = theta.sin(); - let ct = theta.cos(); - let phi = (z + ep2 * b * st.powi(3)).atan2(p - e2 * a * ct.powi(3)); - - let s = phi.sin(); - let n = a / (1.0 - e2 * s * s).sqrt(); - let h = p / phi.cos() - n; - - (phi.to_degrees(), h) - } -} - -impl fmt::Display for Observer { - /// Pretty-print an observer with optional verbose details using `{:#}` formatting. - /// - /// Default formatting (`{}`) prints a compact one-liner: - /// `Name (lon: XX.XXXXXX°, lat: YY.YYYYYY° geodetic, elev: Z.ZZ km)`. - /// - /// Alternate formatting (`{:#}`) prints a multi-line detailed block including: - /// - Parallax constants `(ρ·cosφ, ρ·sinφ)`, - /// - Geocentric latitude `φ_geo` and geocentric distance `ρ` (Earth radii), - /// - Astrometric 1-σ accuracies in arcseconds (if available). - /// - /// Arguments - /// ----------------- - /// * `self`: The observer to format. - /// - /// Return - /// ---------- - /// * A human-readable representation suitable for logs and diagnostics. - /// - /// See also - /// ------------ - /// * [`Observer::geodetic_lat_height_wgs84`] – Geodetic latitude (deg) and ellipsoidal height (m). - /// * [`geodetic_to_parallax`] – Forward conversion to `(ρ·cosφ, ρ·sinφ)`. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - // Friendly name - let name = self.name.as_deref().unwrap_or("Unnamed"); - - // Geodetic latitude (deg) and height (m -> km) - let (lat_deg, h_m) = self.geodetic_lat_height_wgs84(); - - // Geodetic longitude in degrees - let lon_deg = self.longitude.into_inner(); - - // Geocentric latitude and ρ from parallax constants - let rc = self.rho_cos_phi.into_inner(); - let rs = self.rho_sin_phi.into_inner(); - let phi_geo_deg = rs.atan2(rc).to_degrees(); - let rho_re = rc.hypot(rs); - - // Astrometric accuracies (radians -> arcseconds) - const RAD2AS: f64 = 206_264.806_247_096_36; - let ra_sigma_as = self - .ra_accuracy - .map(|v| format!("{:.3}″", v.into_inner() * RAD2AS)) - .unwrap_or_else(|| "—".to_string()); - let dec_sigma_as = self - .dec_accuracy - .map(|v| format!("{:.3}″", v.into_inner() * RAD2AS)) - .unwrap_or_else(|| "—".to_string()); - - if f.alternate() { - // Verbose, multi-line format (triggered by "{:#}") - writeln!( - f, - "{name} (lon: {lon_deg:.6}°, lat: {lat_deg:.6}° geodetic, elev: {h_m:.2} m)" - )?; - writeln!( - f, - " parallax: ρ·cosφ={rc:.9}, ρ·sinφ={rs:+.9} | φ_geo={phi_geo_deg:+.6}° ρ={rho_re:.6} RE" - )?; - write!(f, " astrometric 1σ: RA={ra_sigma_as}, DEC={dec_sigma_as}") - } else { - // Compact, single-line format (triggered by "{}") - write!( - f, - "{name} (lon: {lon_deg:.6}°, lat: {lat_deg:.6}° geodetic, elev: {h_m:.2} m)" - ) - } - } -} - -/// Convert geodetic latitude and height into normalized parallax coordinates -/// on the Earth. -/// -/// This transformation is used to compute the observer's position on Earth -/// in a way that accounts for the Earth's oblateness. The resulting values -/// are dimensionless and are expressed in units of the Earth's equatorial -/// radius (`EARTH_MAJOR_AXIS`). -/// -/// Arguments -/// --------- -/// * `lat` - Geodetic latitude of the observer in **radians**. -/// * `height` - Observer's altitude above the reference ellipsoid in **meters**. -/// -/// Returns -/// ------- -/// A tuple `(rho_cos_phi, rho_sin_phi)`: -/// * `rho_cos_phi`: normalized distance of the observer projected on -/// the Earth's equatorial plane. -/// * `rho_sin_phi`: normalized distance of the observer projected on -/// the Earth's rotation (polar) axis. -/// -/// Details -/// ------- -/// The computation uses the reference ellipsoid defined by: -/// * `EARTH_MAJOR_AXIS`: Equatorial radius (m), -/// * `EARTH_MINOR_AXIS`: Polar radius (m). -/// -/// The formula comes from standard geodetic to geocentric conversion: -/// -/// ```text -/// u = atan( (sin φ * (b/a)) / cos φ ) -/// ρ_sinφ = (b/a) * sin u + (h/a) * sin φ -/// ρ_cosφ = cos u + (h/a) * cos φ -/// ``` -/// -/// where `a` and `b` are the Earth's semi-major and semi-minor axes, -/// and `h` is the height above the ellipsoid. -/// -/// See also -/// -------- -/// * [`Observer::body_fixed_coord`] – Uses this function to compute -/// the observer's fixed position in Earth-centered coordinates. -pub fn lat_alt_to_parallax(lat: f64, height: f64) -> (f64, f64) { - // Ratio of the Earth's minor to major axis (flattening factor) - let axis_ratio = EARTH_MINOR_AXIS / EARTH_MAJOR_AXIS; - - // Compute the auxiliary angle u (parametric latitude) - // This corrects for the Earth's oblateness. - let u = (lat.sin() * axis_ratio).atan2(lat.cos()); - - // Compute the normalized distance along the polar axis - let rho_sin_phi = axis_ratio * u.sin() + (height / EARTH_MAJOR_AXIS) * lat.sin(); - - // Compute the normalized distance along the equatorial plane - let rho_cos_phi = u.cos() + (height / EARTH_MAJOR_AXIS) * lat.cos(); - - (rho_cos_phi, rho_sin_phi) -} - -/// Convert geodetic latitude (in degrees) and height (in meters) -/// into normalized parallax coordinates. -/// -/// This is a convenience wrapper around [`lat_alt_to_parallax`] that -/// performs the degrees-to-radians conversion before calling the main -/// function. -/// -/// Arguments -/// --------- -/// * `lat` - Geodetic latitude of the observer in **degrees**. -/// * `height` - Observer's altitude above the reference ellipsoid in **meters**. -/// -/// Returns -/// ------- -/// A tuple `(rho_cos_phi, rho_sin_phi)`: -/// * `rho_cos_phi`: normalized distance of the observer projected on -/// the Earth's equatorial plane. -/// * `rho_sin_phi`: normalized distance of the observer projected on -/// the Earth's rotation (polar) axis. -/// -/// Details -/// ------- -/// This function simply converts `lat` to radians and delegates the -/// computation to [`lat_alt_to_parallax`]. -/// -/// See also -/// -------- -/// * [`lat_alt_to_parallax`] – Performs the actual computation given latitude in radians. -pub fn geodetic_to_parallax(lat: f64, height: f64) -> (f64, f64) { - // Convert latitude from degrees to radians - let latitude_rad = lat.to_radians(); - - // Call the main routine that works with radians - let (rho_cos_phi, rho_sin_phi) = lat_alt_to_parallax(latitude_rad, height); - - (rho_cos_phi, rho_sin_phi) -} - -/// Compute the heliocentric positions of three observers at their respective epochs, -/// expressed in the **equatorial mean J2000** frame (ICRS-aligned). -/// -/// Overview -/// ----------------- -/// This routine builds a `3×3` matrix of observer positions by combining: -/// - the **geocentric site position** of each observer (from [`Observer::pvobs`]), -/// - the Earth’s **heliocentric barycentric position** from JPL ephemerides, -/// - a frame transformation from **ecliptic mean J2000** (site positions) to -/// **equatorial mean J2000** (final output). -/// -/// The result is a compact representation where each column corresponds to one -/// observer/epoch pair: -/// `observers[0] ↔ mjd_tt.x`, -/// `observers[1] ↔ mjd_tt.y`, -/// `observers[2] ↔ mjd_tt.z`. -/// -/// Arguments -/// ----------------- -/// * `observers` – Array of three [`Observer`] references, each encoding the site geometry -/// (longitude, normalized geocentric radius components, etc.). -/// * `mjd_tt` – [`Vector3`] of observation epochs in Terrestrial Time (TT), one per observer. -/// * `state` – [`Outfit`] environment providing: -/// - JPL planetary ephemerides (via [`Outfit::get_jpl_ephem`]), -/// - UT1 provider for Earth rotation/orientation (via [`Outfit::get_ut1_provider`]). -/// -/// Return -/// ---------- -/// * `Result, OutfitError>` – A 3×3 matrix of observer heliocentric positions, with: -/// - **Columns** = `[r₁, r₂, r₃]`, one per observer/epoch, -/// - **Units** = astronomical units (AU), -/// - **Frame** = equatorial mean J2000 (ICRS-aligned). -/// -/// Remarks -/// ------------- -/// * For each observer/time pair: -/// 1. The site’s **geocentric position** is computed via [`Observer::pvobs`] (AU, ecliptic J2000). -/// 2. Earth’s heliocentric position is retrieved from the JPL ephemeris. -/// 3. The site position is rotated into **equatorial mean J2000** using the frame rotation. -/// 4. The Earth + rotated site vectors give the full heliocentric observer position. -/// * This function is mainly used during **Gauss IOD** preparation to populate the -/// observer position matrix stored in [`GaussObs`](crate::initial_orbit_determination::gauss::GaussObs). -/// -/// See also -/// ------------ -/// * [`Observer::pvobs`] – Geocentric observer position at a given epoch (ecliptic J2000). -/// * [`Observer::helio_position`] – Per-observer heliocentric position (equatorial J2000). -/// * [`Outfit::get_jpl_ephem`] – Access to planetary ephemerides (Earth state). -/// * [`Outfit::get_ut1_provider`] – Provides Earth orientation parameters (ΔUT1). -pub fn helio_obs_pos( - observers: [&Observer; 3], - mjd_tt: &Vector3, - state: &Outfit, -) -> Result, OutfitError> { - let epochs = [ - Epoch::from_mjd_in_time_scale(mjd_tt.x, hifitime::TimeScale::TT), - Epoch::from_mjd_in_time_scale(mjd_tt.y, hifitime::TimeScale::TT), - Epoch::from_mjd_in_time_scale(mjd_tt.z, hifitime::TimeScale::TT), - ]; - - let pvobs1 = observers[0].pvobs(&epochs[0], state.get_ut1_provider())?; - let pvobs2 = observers[1].pvobs(&epochs[1], state.get_ut1_provider())?; - let pvobs3 = observers[2].pvobs(&epochs[2], state.get_ut1_provider())?; - - let positions = [ - observers[0].helio_position(state, &epochs[0], &pvobs1.0)?, - observers[1].helio_position(state, &epochs[1], &pvobs2.0)?, - observers[2].helio_position(state, &epochs[2], &pvobs3.0)?, - ]; - - Ok(Matrix3::from_columns(&positions)) -} - -#[cfg(test)] -mod observer_test { - - use crate::{error_models::ErrorModel, outfit::Outfit}; - - use super::*; - - #[test] - fn test_observer_constructor() { - let observer = Observer::new(0.0, 0.0, 0.0, None, None, None).unwrap(); - assert_eq!(observer.longitude, 0.0); - assert_eq!(observer.rho_cos_phi, 1.0); - assert_eq!(observer.rho_sin_phi, 0.0); - - let observer = Observer::new( - 289.25058, - -30.2446, - 2647., - Some("Rubin Observatory".to_string()), - Some(0.0001), - Some(0.0001), - ) - .unwrap(); - - assert_eq!(observer.longitude, 289.25058); - assert_eq!(observer.rho_cos_phi, 0.8649760504617418); - assert_eq!(observer.rho_sin_phi, -0.5009551027512434); - } - - #[test] - fn body_fixed_coord_test() { - // longitude, latitude and height of Pan-STARRS 1, Haleakala - let (lon, lat, h) = (203.744090000, 20.707233557, 3067.694); - let pan_starrs = Observer::new(lon, lat, h, None, None, None).unwrap(); - assert_eq!( - pan_starrs.body_fixed_coord(), - Vector3::new( - -0.00003653799439776371, - -0.00001607260397528885, - 0.000014988110430544328 - ) - ); - - assert_eq!( - pan_starrs.observer_fixed_coord, - Vector3::new( - NotNan::new(-0.00003653799439776371).unwrap(), - NotNan::new(-0.00001607260397528885).unwrap(), - NotNan::new(0.000014988110430544328).unwrap() - ) - ) - } - - #[test] - fn pvobs_test() { - let state = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); - let tmjd = 57028.479297592596; - let epoch = Epoch::from_mjd_in_time_scale(tmjd, hifitime::TimeScale::TT); - // longitude, latitude and height of Pan-STARRS 1, Haleakala - let (lon, lat, h) = (203.744090000, 20.707233557, 3067.694); - let pan_starrs = - Observer::new(lon, lat, h, Some("Pan-STARRS 1".to_string()), None, None).unwrap(); - - let (observer_position, observer_velocity) = - &pan_starrs.pvobs(&epoch, state.get_ut1_provider()).unwrap(); - - assert_eq!( - observer_position.as_slice(), - [ - -2.086211182493635e-5, - 3.718476815327979e-5, - 2.4978996447997476e-7 - ] - ); - assert_eq!( - observer_velocity.as_slice(), - [ - -0.0002143246535691577, - -0.00012059801691431748, - 5.262184624215718e-5 - ] - ); - } - - #[test] - fn geodetic_to_parallax_test() { - // latitude and height of Pan-STARRS 1, Haleakala - let (pxy1, pz1) = geodetic_to_parallax(20.707233557, 3067.694); - assert_eq!(pxy1, 0.9362410003211518); - assert_eq!(pz1, 0.35154299856304305); - } - - #[test] - #[cfg(feature = "jpl-download")] - fn test_helio_pos_obs() { - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - - let tmjd = Vector3::new( - 57028.479297592596, - 57_049.245_147_592_59, - 57_063.977_117_592_59, - ); - - // longitude, latitude and height of Pan-STARRS 1, Haleakala - let (lon, lat, h) = (203.744090000, 20.707233557, 3067.694); - let pan_starrs = - Observer::new(lon, lat, h, Some("Pan-STARRS 1".to_string()), None, None).unwrap(); - - // Now we need a Vector3 with three identical copies - let observers = [&pan_starrs, &pan_starrs, &pan_starrs]; - - let helio_pos = helio_obs_pos(observers, &tmjd, &OUTFIT_HORIZON_TEST.0).unwrap(); - - assert_eq!( - helio_pos.as_slice(), - [ - -0.2645666171464416, - 0.8689351643701766, - 0.3766996211107864, - -0.5891631852137064, - 0.7238872516824697, - 0.3138186516540669, - -0.7743280306286537, - 0.5612532665812755, - 0.24333415479994636 - ] - ); - } - - #[cfg(test)] - mod geodetic_inverse_tests { - use super::*; - use crate::constants::Degree; - use approx::assert_abs_diff_eq; - - /// Round-trip a single site through (lon, lat, h) -> parallax -> inverse - /// and check that we recover the original geodetic latitude & height. - /// - /// Notes - /// ----- - /// * `Observer::new` is given `h_m` in meters (as per current API usage). - /// * `geodetic_lat_height_wgs84()` returns height in **meters**; we convert to meters. - fn roundtrip_site(name: &str, lon_deg: Degree, lat_deg: Degree, h_m: f64) { - // Build observer (forward: geodetic -> parallax is done inside `Observer::new`) - let obs = Observer::new(lon_deg, lat_deg, h_m, Some(name.to_string()), None, None) - .expect("Failed to create observer"); - - // Inverse: parallax -> geodetic (WGS-84) - let (lat_rec_deg, h_rec_m) = obs.geodetic_lat_height_wgs84(); - - // Tolerances: - // - Latitude: 1e-6 deg (~3.6 mas) – tight but should pass for double precision Bowring + 0–1 Newton step - // - Height: 1e-2 m - let tol_lat_deg = 1e-6; - let tol_h_m = 1e-2; - - assert_abs_diff_eq!(lat_rec_deg, lat_deg, epsilon = tol_lat_deg); - assert_abs_diff_eq!(h_rec_m, h_m, epsilon = tol_h_m); - } - - /// See also - /// ------------ - /// * [`Observer::new`] – Forward geodetic->parallax conversion under test by round-trip. - /// * [`Observer::from_parallax`] – Alternative constructor, if you want to inject ρ·cosφ/ρ·sinφ. - /// * `geodetic_to_parallax` – The forward routine used internally by `Observer::new`. - - #[test] - fn geodetic_roundtrip_known_observatories_wgs84() { - // NOTE: - // The heights below are commonly quoted "above sea level" (orthometric). - // For pure algorithmic round-trip testing, that's acceptable because we feed - // the same height into forward and inverse. If you want strict ellipsoidal - // (h) values, substitute official WGS-84 heights here. - let sites: &[(&str, Degree, Degree, f64)] = &[ - // name, lon_deg (E+), lat_deg (N+), height_m - ("Haleakala (PS1 I41)", -156.2575, 20.7075, 3055.0), - ("Mauna Kea (CFHT)", -155.4700, 19.8261, 4205.0), - ("ESO Paranal", -70.4025, -24.6252, 2635.0), - ("Cerro Pachon (Rubin)", -70.7366, -30.2407, 2663.0), - ("La Silla", -70.7346, -29.2613, 2400.0), - ("Kitt Peak", -111.5967, 31.9583, 2096.0), - ("Roque de los Muchachos", -17.8947, 28.7606, 2396.0), - ]; - - for (name, lon, lat, h_m) in sites.iter().copied() { - roundtrip_site(name, lon, lat, h_m); - } - } - - #[test] - fn geodetic_roundtrip_extremes_equator_and_pole() { - // Equator, sea level - roundtrip_site("Equator (0°, 0 m)", 0.0, 0.0, 0.0); - - // Near-North-Pole and Near-South-Pole with modest height - roundtrip_site("Near North Pole", 0.0, 89.999, 1000.0); - roundtrip_site("Near South Pole", 0.0, -89.999, 1000.0); - } - - #[test] - fn geodetic_roundtrip_high_altitude_and_negative() { - // Very high site (simulate balloon/aircraft) - roundtrip_site("High Alt 10 m", 10.0, 45.0, 10_000.0); - - // Negative height (below ellipsoid, synthetic but tests robustness) - roundtrip_site("Below ellipsoid -50 m", -30.0, -10.0, -50.0); - } - } - - #[cfg(test)] - mod observer_display_tests { - use super::*; - - /// Convert arcseconds to radians. - #[inline] - fn arcsec_to_rad(as_val: f64) -> f64 { - // 1 arcsec = π / (180 * 3600) rad - std::f64::consts::PI / (180.0 * 3600.0) * as_val - } - - /// Helper to build an Observer with optional RA/DEC accuracies (in arcseconds). - fn make_observer_with_acc( - name: Option<&str>, - lon_deg: f64, - lat_deg: f64, - elev_m: f64, - ra_as: Option, - dec_as: Option, - ) -> Observer { - let ra_sigma = ra_as.map(arcsec_to_rad); - let dec_sigma = dec_as.map(arcsec_to_rad); - - Observer::new( - lon_deg, - lat_deg, - elev_m, // elevation in meters - name.map(|s| s.to_string()), - ra_sigma, - dec_sigma, - ) - .expect("Failed to create Observer") - } - - /// Compact formatting must be a single line with name/lon/lat/elev. - #[test] - fn display_compact_single_line() { - let obs = make_observer_with_acc(Some("TestSite"), 10.0, 0.0, 0.0, None, None); - - let s = format!("{obs}"); - // Must not contain newlines in compact form - assert!( - !s.contains('\n'), - "Compact format should be single-line, got:\n{s}" - ); - - // Must contain expected fragments (predictable numbers) - assert!( - s.contains("TestSite (lon: 10.000000°"), - "Missing name/lon fragment. Got:\n{s}" - ); - assert!( - s.contains("lat: 0.000000° geodetic"), - "Missing geodetic latitude fragment. Got:\n{s}" - ); - assert!( - s.contains("elev: 0.00 m"), - "Missing elevation fragment (m). Got:\n{s}" - ); - } - - /// Alternate formatting must be multi-line and include parallax & uncertainties. - #[test] - fn display_verbose_multiline_with_sections() { - let obs = make_observer_with_acc(Some("VerboseSite"), -70.0, -30.0, 2400.0, None, None); - - let s = format!("{obs:#}"); - - // Must contain multiple lines and the expected section headers/fragments - assert!( - s.contains('\n'), - "Verbose format should be multi-line. Got:\n{s}" - ); - assert!( - s.starts_with("VerboseSite (lon: -70.000000°"), - "First line should start with site name and lon. Got:\n{s}" - ); - assert!( - s.contains("\n parallax: ρ·cosφ="), - "Missing 'parallax:' line. Got:\n{s}" - ); - assert!( - s.contains("φ_geo=") && s.contains("ρ="), - "Missing φ_geo/ρ fragments. Got:\n{s}" - ); - assert!( - s.contains("\n astrometric 1σ: RA=—, DEC=—"), - "Missing astrometric 1σ line with em-dashes for None. Got:\n{s}" - ); - } - - /// When RA/DEC accuracies are provided, they must be printed in arcseconds with three decimals. - #[test] - fn display_verbose_shows_ra_dec_sigmas() { - // RA = 1.0″, DEC = 2.5″ (passed in arcseconds, converted to radians internally) - let obs = make_observer_with_acc(Some("AccSite"), 0.0, 0.0, 0.0, Some(1.0), Some(2.5)); - - let s = format!("{obs:#}"); - - assert!( - s.contains("astrometric 1σ: RA=1.000″, DEC=2.500″"), - "Expected RA/DEC sigma in arcseconds with 3 decimals. Got:\n{s}" - ); - } - - /// Name fallback should be "Unnamed" when not provided. - #[test] - fn display_uses_unnamed_when_missing() { - let obs = make_observer_with_acc(None, 5.0, 0.0, 0.0, None, None); - let s = format!("{obs}"); - assert!( - s.starts_with("Unnamed (lon: 5.000000°"), - "Expected 'Unnamed' fallback. Got:\n{s}" - ); - } - - /// Basic numeric sanity: geodetic height is shown in kilometers in the display. - /// For a 3055 m elevation, we expect ~3.055 km (rounded to 2 decimals). - #[test] - fn display_elevation_shown_in_km() { - let obs = make_observer_with_acc( - Some("Haleakala-ish"), - -156.2575, - 20.7075, - 3055.0, - None, - None, - ); - - let s = format!("{obs}"); - // Check the km conversion and rounding only; don't assert on latitude value here. - assert!( - s.contains("elev: 3055.00 m"), - "Expected elevation ~3055 m rounded to 2 decimals. Got:\n{s}" - ); - - // Optional: ensure lon is printed correctly - assert!( - s.contains("lon: -156.257500°"), - "Longitude formatting mismatch. Got:\n{s}" - ); - } - } -} diff --git a/src/observers/observatories.rs b/src/observers/observatories.rs deleted file mode 100644 index 636947b..0000000 --- a/src/observers/observatories.rs +++ /dev/null @@ -1,238 +0,0 @@ -use super::bimap::BiMap; -use super::Observer; -use crate::constants::{Degree, Kilometer, MpcCodeObs}; -use std::{ - fmt, - sync::{Arc, OnceLock}, -}; - -#[derive(Debug, Clone)] -pub(crate) struct Observatories { - pub(crate) mpc_code_obs: OnceLock, - obs_to_uint16: BiMap, u16>, -} - -impl Observatories { - pub(crate) fn new() -> Self { - Observatories { - mpc_code_obs: OnceLock::new(), - obs_to_uint16: BiMap::new(), - } - } - - pub(crate) fn create_observer( - &mut self, - longitude: Degree, - latitude: Degree, - elevation: Kilometer, - name: Option, - ) -> Arc { - let obs = Observer::new(longitude, latitude, elevation, name.clone(), None, None) - .expect("Failed to create observer"); - let arc_observer = Arc::new(obs); - self.obs_to_uint16 - .entry_or_insert_by_key(arc_observer.clone(), self.obs_to_uint16.len() as u16); - arc_observer - } - - pub(crate) fn add_observer(&mut self, observer: Arc) -> u16 { - let obs_idx = self.obs_to_uint16.len() as u16; - *self.obs_to_uint16.entry_or_insert_by_key(observer, obs_idx) - } - - /// Get an observer from an observer index - /// - /// Arguments - /// --------- - /// * `observer_idx`: the observer index - /// - /// Return - /// ------ - /// * The observer - pub(crate) fn get_observer_from_uint16(&self, observer_idx: u16) -> &Observer { - self.obs_to_uint16 - .get_by_value(&observer_idx) - .unwrap_or_else(|| panic!("Observer index not found: {observer_idx}")) - } - - /// Get an observer index from an observer - /// If the observer is not already in the bimap, it is added - /// - /// Arguments - /// --------- - /// * `observer`: the observer - /// - /// Return - /// ------ - /// * The observer index - pub(crate) fn uint16_from_observer(&mut self, observer: Arc) -> u16 { - let obs_idx = self.obs_to_uint16.len() as u16; - *self.obs_to_uint16.entry_or_insert_by_key(observer, obs_idx) - } -} - -impl fmt::Display for Observatories { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - if self.obs_to_uint16.is_empty() { - if self.mpc_code_obs.get().is_none() { - writeln!(f, "No observatories defined (user or MPC).\nTrying to get an observer from the MPC or insert a new one to initialize the observatory list.")?; - return Ok(()); - } else { - writeln!(f, "No user-defined observers.")?; - } - } - - writeln!(f, "User-defined observers:")?; - for obs in self.obs_to_uint16.keys() { - let (lat, height) = obs.geodetic_lat_height_wgs84(); - - writeln!( - f, - " {} (lon: {:.6}°, lat: {:.6}°, elev: {:.2} km)", - obs.name.clone().unwrap_or_else(|| "Unnamed".to_string()), - obs.longitude, - lat, - height - )?; - } - - if let Some(mpc_code_obs) = self.mpc_code_obs.get() { - writeln!(f, "MPC observers:")?; - for (code, obs) in mpc_code_obs.iter() { - let (lat, height) = obs.geodetic_lat_height_wgs84(); - - writeln!( - f, - " {} [{}] (lon: {:.6}°, lat: {:.6}°, elev: {:.2} km)", - obs.name.clone().unwrap_or_else(|| "Unnamed".to_string()), - code, - obs.longitude, - lat, - height - )?; - } - } - - Ok(()) - } -} - -#[cfg(test)] -mod observatories_test { - use super::*; - - #[test] - fn test_observatories() { - let mut observatories = Observatories::new(); - let obs = observatories.create_observer(1.0, 2.0, 3.0, Some("Test".to_string())); - assert_eq!(obs.longitude, 1.0); - assert_eq!(obs.rho_cos_phi, 0.999395371426802); - assert_eq!(obs.rho_sin_phi, 0.0346660237964843); - assert_eq!(obs.name, Some("Test".to_string())); - assert_eq!(observatories.obs_to_uint16.len(), 1); - let observer = observatories.get_observer_from_uint16(0); - assert_eq!(observer.name, Some("Test".to_string())); - - observatories.create_observer(4.0, 5.0, 6.0, Some("Test2".to_string())); - assert_eq!(observatories.obs_to_uint16.len(), 2); - let observer = observatories.get_observer_from_uint16(1); - assert_eq!(observer.name, Some("Test2".to_string())); - } - - #[cfg(test)] - mod observatories_display_tests { - use super::*; - - /// Ensure the "user-defined" section is printed and includes both user observers. - /// - /// Notes - /// ----- - /// * We don't assume any iteration order (HashMap-backed bi-map). - /// * We check for the header and the presence of each observer line fragment. - #[test] - fn display_user_defined_only() { - let mut obs = Observatories::new(); - - // Build two user-defined observers (elevation in kilometers). - obs.create_observer(10.0, 0.0, 0.0, Some("UserA".to_string())); - obs.create_observer(20.0, 45.0, 2.0, Some("UserB".to_string())); - - let s = format!("{obs}"); - - // Header must be present - assert!( - s.starts_with("User-defined observers:\n"), - "Missing 'User-defined observers:' header. Got:\n{s}" - ); - - // Each user observer should be listed with their name and longitude fragment - assert!( - s.contains("UserA (lon: 10.000000°"), - "Missing formatted line for UserA. Got:\n{s}" - ); - assert!( - s.contains("UserB (lon: 20.000000°"), - "Missing formatted line for UserB. Got:\n{s}" - ); - - // The MPC section should not appear if not initialized - assert!( - !s.contains("MPC observers:"), - "Unexpected 'MPC observers:' section when OnceLock is unset. Got:\n{s}" - ); - } - - /// If the MPC table is initialized, ensure the "MPC observers" section appears. - /// - /// Notes - /// ----- - /// * We set the OnceLock with a single entry. - /// * We only check for presence of the section and the MPC code tag. - #[test] - fn display_includes_mpc_section_when_set() { - let mut obs = Observatories::new(); - - // One user-defined observer so the first section is non-empty. - obs.create_observer(0.0, 0.0, 0.0, Some("UserOnly".to_string())); - - // Prepare an MPC observer entry. - let mpc_site = Observer::new( - -156.2575, - 20.7075, - 3.055, - Some("Haleakala".to_string()), - None, - None, - ) - .expect("Failed to create MPC observer"); - - // Build an MpcCodeObs map with a single code. - // If your `MpcCodeObs` is a type alias, this should compile as-is. - // Example: `pub type MpcCodeObs = std::collections::HashMap` (or Arc). - let mut mpc_table: MpcCodeObs = Default::default(); - // Adjust Arc vs Observer depending on your alias: - // If it is `HashMap>`, wrap with `Arc::new(mpc_site)`. - use std::sync::Arc; - mpc_table.insert("I41".to_string(), Arc::new(mpc_site)); - - // Initialize the OnceLock (only once) - obs.mpc_code_obs - .set(mpc_table) - .expect("OnceLock was already initialized"); - - let s = format!("{obs}"); - - // MPC section header must be present now - assert!( - s.contains("MPC observers:"), - "Missing 'MPC observers:' header after setting OnceLock. Got:\n{s}" - ); - - // The code tag should appear in the MPC line - assert!( - s.contains("[I41]"), - "Missing MPC code tag '[I41]' in output. Got:\n{s}" - ); - } - } -} diff --git a/src/outfit.rs b/src/outfit.rs deleted file mode 100644 index cb3aece..0000000 --- a/src/outfit.rs +++ /dev/null @@ -1,676 +0,0 @@ -//! # Outfit: environment, ephemerides, and observatory registry -//! -//! This module defines the [`Outfit`](crate::outfit::Outfit) struct, the central façade that wires together: -//! -//! 1. **Environment state** ([`OutfitEnv`](crate::env_state::OutfitEnv)) — providers and configuration (e.g., UT1). -//! 2. **JPL ephemerides access** — lazy, cached handle over a chosen source -//! ([`EphemFileSource`](crate::jpl_ephem::download_jpl_file::EphemFileSource) → [`JPLEphem`](crate::jpl_ephem::JPLEphem)). -//! 3. **Observatory registry** — MPC Observatory Codes parsed into [`Observer`](crate::observers::Observer) instances, -//! with stable integer IDs for compact indexing and storage. -//! 4. **Astrometric error models** — per-site bias/RMS lookup for RA/DEC accuracies. -//! -//! The design emphasizes *lazy initialization* and *idempotent caching*: -//! - The ephemeris file is opened on first use via [`OnceCell`](once_cell::sync::OnceCell), then reused. -//! - The MPC observatory table is fetched and parsed once, then retained. -//! -//! ## Key responsibilities -//! -//! - Single source of truth for **JPL ephemerides** (HORIZONS/NAIF) through [`get_jpl_ephem`](crate::outfit::Outfit::get_jpl_ephem) -//! - Access to **UT1 provider** for Earth-rotation dependent calculations -//! - **MPC observatory code → Observer** resolution and the inverse (**Observer → u16 index**) -//! - Enrichment of observers with **bias/RMS** angular accuracies from the configured -//! [`ErrorModel`](crate::error_models::ErrorModel) (e.g., *FCCT14*) -//! -//! ## Typical usage -//! -//! ```rust, no_run -//! use outfit::outfit::Outfit; -//! use outfit::error_models::ErrorModel; -//! -//! // Instantiate the context with a JPL source and an error model -//! let outfit = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); -//! -//! // On-demand: the ephemeris is opened only once and cached -//! let jpl = outfit.get_jpl_ephem().unwrap(); -//! -//! // Resolve an observer by MPC code -//! let haleakala = outfit.get_observer_from_mpc_code(&"F51".into()); -//! ``` -//! -//! ## Notes -//! -//! - The MPC table is pulled from: -//! `https://www.minorplanetcenter.net/iau/lists/ObsCodes.html` -//! and minimally parsed from its `
` text block.
-//! - Per-site **RA/DEC accuracies** (bias+RMS) are looked up with [`get_bias_rms`](crate::error_models::get_bias_rms),
-//!   currently assuming catalog code `"c"` unless indicated otherwise (TODO).
-//!
-//! ## See also
-//! ------------
-//! * [`JPLEphem`](crate::jpl_ephem::JPLEphem) – Ephemerides access layer.
-//! * [`Observer`](crate::observers::Observer) – Geodetic/parallax observer representation with optional RA/DEC accuracies.
-//! * [`ErrorModel`](crate::error_models::ErrorModel) / [`get_bias_rms`](crate::error_models::get_bias_rms) – Site accuracy enrichment.
-//! * [`OutfitEnv`](crate::env_state::OutfitEnv) – Providers (e.g., UT1) and environment state.
-//! * [`EphemFileSource`](crate::jpl_ephem::download_jpl_file::EphemFileSource) – Source selection for JPL files (HORIZONS/NAIF).
-//!
-//! ## Panics & errors
-//!
-//! - Functions that *must* find an MPC code will `panic!` if the code is unknown.
-//!   Prefer adding a fallible variant if you need graceful handling.
-//! - I/O and parsing failures are surfaced as [`OutfitError`](crate::outfit_errors::OutfitError) where applicable.
-
-use std::{collections::HashMap, fmt, sync::Arc};
-
-use nalgebra::Matrix3;
-use once_cell::sync::OnceCell;
-
-use crate::{
-    constants::{Degree, Kilometer, MpcCode, MpcCodeObs},
-    env_state::OutfitEnv,
-    error_models::{get_bias_rms, ErrorModel, ErrorModelData},
-    jpl_ephem::download_jpl_file::EphemFileSource,
-    observers::{observatories::Observatories, Observer},
-    outfit_errors::OutfitError,
-    ref_system::{rotpn, RefEpoch, RefSystem},
-};
-
-use crate::jpl_ephem::JPLEphem;
-
-#[derive(Debug, Clone)]
-pub struct Outfit {
-    env_state: OutfitEnv,
-    observatories: Observatories,
-    jpl_source: EphemFileSource,
-    jpl_ephem: OnceCell,
-    pub error_model: ErrorModel,
-    error_model_data: ErrorModelData,
-    rot_equmj2000_to_eclmj2000: Matrix3,
-    rot_eclmj2000_to_equmj2000: Matrix3,
-}
-
-impl Outfit {
-    /// Construct a new [`Outfit`] context.
-    ///
-    /// Initializes the environment, sets the JPL ephemerides source, and loads the configured
-    /// error model from disk. The ephemeris file itself is **not** opened yet; it is lazily
-    /// initialized the first time [`get_jpl_ephem`](crate::outfit::Outfit::get_jpl_ephem) is called.
-    ///
-    /// Arguments
-    /// -----------------
-    /// * `jpl_file`: A source descriptor resolvable into an [`EphemFileSource`]
-    ///   (e.g., `"horizon:DE440"` or a NAIF path).
-    /// * `error_model`: The site accuracy model to load (e.g., [`ErrorModel::FCCT14`]).
-    ///
-    /// Return
-    /// ----------
-    /// * A new [`Outfit`] instance or an [`OutfitError`] if the error model cannot be read.
-    ///
-    /// See also
-    /// ------------
-    /// * [`get_jpl_ephem`](crate::outfit::Outfit::get_jpl_ephem) – Lazy initialization and access to the ephemeris handle.
-    /// * [`ErrorModel::read_error_model_file`](crate::error_models::ErrorModel::read_error_model_file) – Underlying loader for the model data.
-    pub fn new(jpl_file: &str, error_model: ErrorModel) -> Result {
-        let rot1 = rotpn(
-            &RefSystem::Equm(RefEpoch::J2000),
-            &RefSystem::Eclm(RefEpoch::J2000),
-        )?;
-
-        let rot2 = rotpn(
-            &RefSystem::Eclm(RefEpoch::J2000),
-            &RefSystem::Equm(RefEpoch::J2000),
-        )?;
-
-        Ok(Outfit {
-            env_state: OutfitEnv::new(),
-            observatories: Observatories::new(),
-            jpl_source: jpl_file.try_into()?,
-            jpl_ephem: OnceCell::new(),
-            error_model,
-            error_model_data: error_model.read_error_model_file()?,
-            rot_equmj2000_to_eclmj2000: rot1,
-            rot_eclmj2000_to_equmj2000: rot2,
-        })
-    }
-
-    /// Get the rotation matrix from equatorial J2000 to ecliptic J2000.
-    /// This matrix is used to transform coordinates from the equatorial frame to the ecliptic frame.
-    pub fn get_rot_equmj2000_to_eclmj2000(&self) -> &Matrix3 {
-        &self.rot_equmj2000_to_eclmj2000
-    }
-
-    pub fn get_rot_eclmj2000_to_equmj2000(&self) -> &Matrix3 {
-        &self.rot_eclmj2000_to_equmj2000
-    }
-
-    /// Get the lazily-initialized JPL ephemerides handle.
-    ///
-    /// If this is the first call, the ephemeris is opened and cached in an internal [`OnceCell`].
-    /// Subsequent calls return the same reference.
-    ///
-    /// Arguments
-    /// -----------------
-    /// *None*
-    ///
-    /// Return
-    /// ----------
-    /// * `&JPLEphem` on success, or an [`OutfitError`] if the source cannot be opened.
-    ///
-    /// See also
-    /// ------------
-    /// * [`EphemFileSource`] – Source configuration.
-    /// * [`OnceCell::get_or_try_init`] – Lazy initialization helper.
-    pub fn get_jpl_ephem(&self) -> Result<&JPLEphem, OutfitError> {
-        self.jpl_ephem
-            .get_or_try_init(|| JPLEphem::new(&self.jpl_source))
-    }
-
-    /// Access the UT1 provider from the environment.
-    ///
-    /// This is useful for Earth-rotation dependent calculations (e.g., GMST, sidereal time).
-    ///
-    /// Arguments
-    /// -----------------
-    /// *None*
-    ///
-    /// Return
-    /// ----------
-    /// * A reference to the [`hifitime::ut1::Ut1Provider`].
-    ///
-    /// See also
-    /// ------------
-    /// * [`OutfitEnv`] – Environment state and providers.
-    pub fn get_ut1_provider(&self) -> &hifitime::ut1::Ut1Provider {
-        &self.env_state.ut1_provider
-    }
-
-    /// Get the lazily built MPC observatory map (MPC code → [`Observer`]).
-    ///
-    /// The map is fetched and parsed from the MPC HTML table on first use, then cached.
-    ///
-    /// Return
-    /// ----------
-    /// * A reference to the shared map: [`MpcCodeObs`] = `HashMap>`.
-    ///
-    /// See also
-    /// ------------
-    /// * [`init_observatories`](crate::outfit::Outfit::init_observatories) – Builder invoked on first access.
-    /// * [`get_observer_from_mpc_code`](crate::outfit::Outfit::get_observer_from_mpc_code) – Convenience accessor for one site.
-    pub(crate) fn get_observatories(&self) -> &MpcCodeObs {
-        self.observatories
-            .mpc_code_obs
-            .get_or_init(|| self.init_observatories())
-    }
-
-    /// Resolve an [`Observer`] from a given MPC observatory code.
-    ///
-    /// This accessor panics if the code is unknown. Use it when unknown codes are exceptional.
-    ///
-    /// Arguments
-    /// -----------------
-    /// * `mpc_code`: The MPC observatory code (e.g., `"F51"`).
-    ///
-    /// Return
-    /// ----------
-    /// * An `Arc` for the requested site.
-    pub fn get_observer_from_mpc_code(&self, mpc_code: &MpcCode) -> Arc {
-        self.get_observatories()
-            .get(mpc_code)
-            .unwrap_or_else(|| panic!("MPC code not found: {mpc_code}"))
-            .clone()
-    }
-
-    /// Build the MPC observatory registry by fetching and parsing the MPC list.
-    ///
-    /// For each row, the routine extracts:
-    /// - Longitude (deg), ρ·cosφ, ρ·sinφ (parallax factors),
-    /// - Human-readable name,
-    /// - Optional RA/DEC accuracies derived from the loaded [`ErrorModelData`]
-    ///   via [`get_bias_rms`] (currently using catalog code `"c"`, TODO).
-    ///
-    /// Return
-    /// ----------
-    /// * A freshly constructed [`MpcCodeObs`] map.
-    ///
-    /// See also
-    /// ------------
-    /// * [`get_observatories`](crate::outfit::Outfit::get_observatories) – Lazy wrapper that caches this map.
-    /// * [`get_bias_rms`] – Site accuracy lookup by (mpc_code, catalog_code).
-    pub(crate) fn init_observatories(&self) -> MpcCodeObs {
-        let mut observatories: MpcCodeObs = HashMap::new();
-
-        let mpc_code_response = self
-            .env_state
-            .get_from_url("https://www.minorplanetcenter.net/iau/lists/ObsCodes.html");
-
-        let mpc_code_csv = mpc_code_response
-            .trim()
-            .strip_prefix("
")
-            .and_then(|s| s.strip_suffix("
")) - .expect("Failed to strip pre tags"); - - for lines in mpc_code_csv.lines().skip(2) { - let line = lines.trim(); - - if let Some((code, remain)) = line.split_at_checked(3) { - let remain = remain.trim_end(); - - let (longitude, cos, sin, name) = parse_remain(remain, code); - - // TODO: support per-site catalog codes (not always "c") - let bias_rms = - get_bias_rms(&self.error_model_data, code.to_string(), "c".to_string()); - - let observer = Observer::from_parallax( - longitude as f64, - cos as f64, - sin as f64, - Some(name), - bias_rms.map(|(ra, _)| ra as f64), - bias_rms.map(|(_, dec)| dec as f64), - ) - .expect("Failed to create observer"); - observatories.insert(code.to_string(), Arc::new(observer)); - }; - } - observatories - } - - /// Convert an MPC code to its stable 16-bit observatory index. - /// - /// Useful for compact storage of observer references in catalogs, measurements, - /// and ephemeris products. - /// - /// Arguments - /// ----------------- - /// * `mpc_code`: The MPC observatory code. - /// - /// Return - /// ---------- - /// * The `u16` index associated with the given observer. - /// - /// See also - /// ------------ - /// * [`get_observer_from_mpc_code`](crate::outfit::Outfit::get_observer_from_mpc_code) – Resolve the observer first (panic on unknown). - /// * [`uint16_from_observer`](crate::outfit::Outfit::uint16_from_observer) – Indexing for arbitrary/new observers. - pub(crate) fn uint16_from_mpc_code(&mut self, mpc_code: &MpcCode) -> u16 { - let observer = self.get_observer_from_mpc_code(mpc_code); - self.observatories.uint16_from_observer(observer) - } - - /// Convert an [`Observer`] handle to its stable 16-bit index. - /// - /// Arguments - /// ----------------- - /// * `observer`: The observer to be indexed. - /// - /// Return - /// ---------- - /// * The `u16` index associated with this observer (inserting if new). - /// - /// See also - /// ------------ - /// * [`get_observer_from_uint16`](crate::outfit::Outfit::get_observer_from_uint16) – Recover a reference from an index. - /// * [`new_observer`](crate::outfit::Outfit::new_observer) – Create and register a new custom observer. - pub(crate) fn uint16_from_observer(&mut self, observer: Arc) -> u16 { - self.observatories.uint16_from_observer(observer) - } - - /// Recover an [`Observer`] reference from a 16-bit index. - /// - /// Arguments - /// ----------------- - /// * `observer_idx`: The previously assigned index. - /// - /// Return - /// ---------- - /// * A reference to the corresponding [`Observer`]. - /// - /// See also - /// ------------ - /// * [`uint16_from_observer`](crate::outfit::Outfit::uint16_from_observer) – Assign/lookup indices. - /// * [`get_observer_from_mpc_code`](crate::outfit::Outfit::get_observer_from_mpc_code) – Resolve by MPC code instead. - pub(crate) fn get_observer_from_uint16(&self, observer_idx: u16) -> &Observer { - self.observatories.get_observer_from_uint16(observer_idx) - } - - /// Create and register a new **custom** observer. - /// - /// This helper converts geodetic inputs to the internal parallax representation - /// (ρ·cosφ, ρ·sinφ) and stores the new [`Observer`] with an optional display name. - /// - /// Arguments - /// ----------------- - /// * `longitude`: Geodetic longitude in **degrees** (east-positive). - /// * `latitude`: Geodetic latitude in **degrees**. - /// * `elevation`: Elevation in **kilometers** above the ellipsoid/geoid (model-dependent). - /// * `name`: Optional human-readable name for the site. - /// - /// Return - /// ---------- - /// * An `Arc` handle to the newly created observer. - pub fn new_observer( - &mut self, - longitude: Degree, - latitude: Degree, - elevation: Kilometer, - name: Option, - ) -> Arc { - self.observatories - .create_observer(longitude, latitude, elevation, name) - } - - pub(crate) fn add_observer_internal(&mut self, observer: Arc) -> u16 { - self.observatories.add_observer(observer) - } - - pub fn add_observer(&mut self, observer: Arc) { - self.add_observer_internal(observer); - } - - /// Render the current observatories into a newly allocated `String`. - /// - /// This is a convenience wrapper around the `Display` implementation of - /// the internal struct \[`Observatories`\]. It materializes the formatted list (user-defined - /// observers first, then MPC sites if available) into a `String`. - /// - /// Output format - /// ------------- - /// * Longitude and latitude are shown in **degrees**. - /// * Elevation is shown in **kilometers**. - /// * User-defined observers are listed first; if initialized, the - /// **MPC observers** section follows. - /// * The relative order within each section is not guaranteed to be stable. - /// - /// Arguments - /// ----------------- - /// * None. - /// - /// Return - /// ---------- - /// * A `String` containing the formatted observatories. - /// - /// See also - /// ------------ - /// * [`Outfit::show_observatories`] – Allocation-free display adaptor. - /// * [`Observer::geodetic_lat_height_wgs84`] – Provides latitude/height used in the listing. - #[inline] - pub fn show_observatories_string(&self) -> String { - self.observatories.to_string() - } - - /// Pretty-print the current set of observatories without allocating a `String`. - /// - /// Returns a lightweight `Display` adaptor over the internal \[`Observatories`\] - /// collection. Use with `format!`, `println!`, log macros, or any consumer of - /// `fmt::Display`. User-defined observers are printed first, followed by the - /// **MPC observers** section if the MPC table has been initialized. - /// - /// Output format - /// ------------- - /// * Longitude and latitude are shown in **degrees**. - /// * Elevation is shown in **kilometers**. - /// * The relative order within each section is not guaranteed to be stable. - /// - /// Arguments - /// ----------------- - /// * None. - /// - /// Return - /// ---------- - /// * An [`ObservatoriesView`] display adaptor (zero-copy) suitable for `fmt::Display`. - /// - /// See also - /// ------------ - /// * [`Outfit::show_observatories_string`] – Eager, allocated `String`. - /// * [`Observer::geodetic_lat_height_wgs84`] – Provides latitude/height used in the listing. - #[inline] - pub fn show_observatories(&self) -> ObservatoriesView<'_> { - ObservatoriesView(&self.observatories) - } -} - -/// Lightweight, zero-allocation display adaptor for the internal private struct \[`Observatories`\]. -/// -/// This type borrows the internal \[`Observatories`\] and implements `fmt::Display`, -/// allowing you to pretty-print the full list of observers without allocating an -/// intermediate `String`. It simply delegates to the `Display` implementation -/// of \[`Observatories`\]. -/// -/// Output format -/// ------------- -/// * User-defined observers are listed first. -/// * If initialized, an **MPC observers** section follows. -/// * Longitudes/latitudes are shown in **degrees**; elevation is shown in **kilometers**. -/// * Relative order within each section is not guaranteed to be stable (hash-map backed). -/// -/// Example -/// ----------------- -/// ```rust, no_run -/// # use outfit::outfit::Outfit; -/// # use outfit::error_models::ErrorModel; -/// let outfit = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); -/// // Print to stdout without allocating a String: -/// println!("{}", outfit.show_observatories()); -/// // Or, if you need a String, use: -/// let s = outfit.show_observatories_string(); -/// assert!(s.contains("User-defined observers:")); -/// ``` -/// -/// Arguments -/// ----------------- -/// * None (constructed by [`Outfit::show_observatories`]). -/// -/// Return -/// ---------- -/// * A display adaptor suitable for `format!`, `println!`, and any `fmt::Display` consumer. -/// -/// See also -/// ------------ -/// * [`Outfit::show_observatories`] – Returns this adaptor. -/// * [`Outfit::show_observatories_string`] – Allocating `String` convenience. -/// * [`Observer::geodetic_lat_height_wgs84`] – Provides latitude/height used in the listing. -pub struct ObservatoriesView<'a>(&'a Observatories); - -impl<'a> fmt::Display for ObservatoriesView<'a> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - // Delegate to Observatories' Display without allocating - write!(f, "{}", self.0) - } -} - -/// Parse a fixed-width float slice from an MPC observatory line. -/// -/// Arguments -/// ----------------- -/// * `s`: Full line (trailing part after the 3-char MPC code). -/// * `slice`: Byte range selecting the numeric field. -/// * `code`: MPC code (for diagnostics). -/// -/// Return -/// ---------- -/// * `Ok(f32)` parsed value, or the parsing error. -/// -/// See also -/// ------------ -/// * [`parse_remain`] – Higher-level field extraction for one line. -fn parse_f32( - s: &str, - slice: std::ops::Range, - code: &str, -) -> Result { - s.get(slice) - .unwrap_or_else(|| panic!("Failed to parse float for observer code: {code}")) - .trim() - .parse() -} - -/// Extract longitude, ρ·cosφ, ρ·sinφ, and name from a fixed-width MPC row. -/// -/// This helper returns partial values (with zeros) if any field fails to parse, -/// allowing the caller to still record the site name while signaling missing data -/// implicitly through zeros. -/// -/// Arguments -/// ----------------- -/// * `remain`: Fixed-width tail of the line (after the 3-char MPC code). -/// * `code`: MPC code (for diagnostics). -/// -/// Return -/// ---------- -/// * `(longitude_deg, rho_cos_phi, rho_sin_phi, name)` -fn parse_remain(remain: &str, code: &str) -> (f32, f32, f32, String) { - let name = remain - .get(27..) - .unwrap_or_else(|| panic!("Failed to parse name value for code: {code}")); - - let Some(longitude) = parse_f32(remain, 1..10, code).ok() else { - return (0.0, 0.0, 0.0, name.to_string()); - }; - - let Some(cos) = parse_f32(remain, 10..18, code).ok() else { - return (longitude, 0.0, 0.0, name.to_string()); - }; - - let Some(sin) = parse_f32(remain, 18..27, code).ok() else { - return (longitude, cos, 0.0, name.to_string()); - }; - (longitude, cos, sin, name.to_string()) -} - -#[cfg(test)] -mod outfit_show_observatories_tests { - use super::*; - use std::sync::Arc; - - /// Build a lightweight Outfit for display tests, then add zero or more user observers. - /// - /// Notes - /// ----- - /// * Uses the public `Outfit::new(...)` constructor to avoid touching private internals. - /// * If your `Outfit::new` signature changes, adjust here accordingly. - fn build_outfit_with_users(users: &[(&str, f64, f64, f64)]) -> Outfit { - // Pick a reasonable default error model; adjust if your API differs. - let mut outfit = Outfit::new("horizon:DE440", crate::error_models::ErrorModel::FCCT14) - .expect("Failed to construct Outfit for display tests"); - - for (name, lon_deg, lat_deg, elev_km) in users.iter().copied() { - let obs = Observer::new( - lon_deg, - lat_deg, - elev_km, - Some(name.to_string()), - None, - None, - ) - .expect("Failed to create user observer"); - // If your API differs, replace with the appropriate method to register observers: - outfit.add_observer(Arc::new(obs)); - } - outfit - } - - /// Ensure the string rendering equals the Display adaptor output when there are no observers. - #[test] - fn show_observatories_empty() { - let outfit = build_outfit_with_users(&[]); - - let s_string = outfit.show_observatories_string(); - let s_view = format!("{}", outfit.show_observatories()); - - assert_eq!( - s_string, s_view, - "String output and Display adaptor should match" - ); - assert!( - s_string.starts_with("No observatories defined (user or MPC)."), - "Missing 'User-defined observers:' header. Got:\n{s_string}" - ); - assert!( - !s_string.contains("MPC observers:"), - "Should not show 'MPC observers:' when OnceLock is unset. Got:\n{s_string}" - ); - } - - /// After adding user-defined observers, they should appear in the output. - #[test] - fn show_observatories_with_users() { - let outfit = build_outfit_with_users(&[ - ("UserA", 10.0, 0.0, 0.0), - ("UserB", 20.0, 45.0, 2.0), // 2 km elevation - ]); - - let s_string = outfit.show_observatories_string(); - let s_view = format!("{}", outfit.show_observatories()); - - assert_eq!( - s_string, s_view, - "String output and Display adaptor should match" - ); - - // Headers and user names should be present - assert!( - s_string.starts_with("User-defined observers:\n"), - "Missing 'User-defined observers:' header. Got:\n{s_string}" - ); - assert!( - s_string.contains("UserA (lon: 10.000000°"), - "Missing formatted line for UserA. Got:\n{s_string}" - ); - assert!( - s_string.contains("UserB (lon: 20.000000°"), - "Missing formatted line for UserB. Got:\n{s_string}" - ); - } - - /// If the MPC table is initialized, the MPC section should appear. - /// - /// Notes - /// ----- - /// * This test accesses the OnceLock inside `observatories` to inject a minimal MPC table. - /// * If your `MpcCodeObs` stores `Arc` instead of `Observer`, wrap with `Arc::new`. - #[test] - fn show_observatories_with_mpc_section() { - let outfit = build_outfit_with_users(&[("UserOnly", 0.0, 0.0, 0.0)]); - - // Build a minimal MPC table with one entry - let mpc_site = Observer::new( - -156.2575, - 20.7075, - 3.055, - Some("Haleakala".to_string()), - None, - None, - ) - .expect("Failed to create MPC observer"); - - // If MpcCodeObs = HashMap>, wrap with Arc::new. - // If it is HashMap, remove Arc::new below. - let mut mpc_table: crate::constants::MpcCodeObs = Default::default(); - // Uncomment ONE of the two lines below depending on your alias: - // mpc_table.insert("I41".to_string(), mpc_site); // if value is Observer - mpc_table.insert("I41".to_string(), Arc::new(mpc_site)); // if value is Arc - - // Initialize the OnceLock - outfit - .observatories - .mpc_code_obs - .set(mpc_table) - .expect("OnceLock already initialized"); - - let s_string = outfit.show_observatories_string(); - let s_view = format!("{}", outfit.show_observatories()); - - assert_eq!( - s_string, s_view, - "String output and Display adaptor should match" - ); - assert!( - s_string.contains("MPC observers:"), - "Missing 'MPC observers:' header after setting OnceLock. Got:\n{s_string}" - ); - assert!( - s_string.contains("[I41]"), - "Missing MPC code tag '[I41]' in output. Got:\n{s_string}" - ); - } -} diff --git a/src/outfit_errors.rs b/src/outfit_errors.rs index a86ae10..c78e691 100644 --- a/src/outfit_errors.rs +++ b/src/outfit_errors.rs @@ -135,8 +135,10 @@ //! * [`ParseObsError`](crate::trajectories::mpc_80col_reader::ParseObsError) – observation parsing errors. //! * [`roots::SearchError`] – wrapped in [`RootFindingError`](crate::outfit_errors::OutfitError::RootFindingError). //! * [`rand_distr::NormalError`] – wrapped in [`NoiseInjectionError`](crate::outfit_errors::OutfitError::NoiseInjectionError). - -use crate::trajectories::mpc_80col_reader::ParseObsError; +use photom::{ + observation_dataset::{ObsDatasetError, ObsId}, + TrajId, +}; use thiserror::Error; #[derive(Error, Debug)] @@ -159,7 +161,6 @@ pub enum OutfitError { #[error("Filesystem I/O error: {0}")] IoError(#[from] std::io::Error), - #[cfg(feature = "jpl-download")] #[error("HTTP request failed (reqwest): {0}")] ReqwestError(#[from] reqwest::Error), @@ -187,9 +188,6 @@ pub enum OutfitError { #[error("Parsing error (nom): {0}")] NomParsingError(String), - #[error("Parsing error in 80-column observation file: {0}")] - Parsing80ColumnFileError(ParseObsError), - #[error("Gaussian noise generation failed: {0:?}")] NoiseInjectionError(rand_distr::NormalError), @@ -253,6 +251,24 @@ pub enum OutfitError { #[error("Non-finite score encountered: {0}")] NonFiniteScore(f64), + + #[error("The provided observation {0} has no associated observer (ObserverId is None)")] + ObserverIdIsNone(ObsId), + + #[error(transparent)] + ObsDatasetError(#[from] ObsDatasetError), + + #[error("Observer dataset error: {0}")] + ObsDatasetErrorRef(String), + + #[error("Trajectory ID not found in dataset: {0}")] + TrajectoryIdNotFound(TrajId), +} + +impl From<&ObsDatasetError> for OutfitError { + fn from(e: &ObsDatasetError) -> Self { + OutfitError::ObsDatasetErrorRef(e.to_string()) + } } impl From for OutfitError { @@ -279,7 +295,6 @@ impl PartialEq for OutfitError { // Opaque external error kinds compare equal by variant only (UreqHttpError(_), UreqHttpError(_)) => true, (IoError(_), IoError(_)) => true, - #[cfg(feature = "jpl-download")] (ReqwestError(_), ReqwestError(_)) => true, (Parquet(_), Parquet(_)) => true, @@ -291,7 +306,6 @@ impl PartialEq for OutfitError { (InvalidErrorModel(a), InvalidErrorModel(b)) => a == b, (InvalidErrorModelFilePath(a), InvalidErrorModelFilePath(b)) => a == b, (NomParsingError(a), NomParsingError(b)) => a == b, - (Parsing80ColumnFileError(a), Parsing80ColumnFileError(b)) => a == b, (NoiseInjectionError(a), NoiseInjectionError(b)) => a == b, (InvalidSpkDataType(a), InvalidSpkDataType(b)) => a == b, (InvalidIODParameter(a), InvalidIODParameter(b)) => a == b, diff --git a/src/trajectories/ades_reader.rs b/src/trajectories/ades_reader.rs deleted file mode 100644 index c89c5a2..0000000 --- a/src/trajectories/ades_reader.rs +++ /dev/null @@ -1,257 +0,0 @@ -use std::str::FromStr; - -use camino::Utf8Path; -use hifitime::Epoch; -use quick_xml::de::from_str; -use serde::{Deserialize, Deserializer}; -use smallvec::SmallVec; - -use crate::{ - constants::{ArcSec, ObjectNumber}, - outfit::Outfit, - TrajectorySet, -}; - -use crate::observations::Observation; - -#[derive(Debug, Deserialize)] -struct StructuredAdes { - #[serde(rename = "obsBlock")] - obs_blocks: Vec, -} - -#[derive(Debug, Deserialize)] -struct FlatAdes { - #[serde(rename = "optical")] - opticals: Vec, -} - -#[derive(Debug, Deserialize)] -struct ObsBlock { - #[serde(rename = "obsContext")] - obs_context: ObsContext, - - #[serde(rename = "obsData")] - obs_data: ObsData, -} - -#[derive(Debug, Deserialize)] -struct ObsContext { - observatory: Observatory, -} - -#[derive(Debug, Deserialize)] -struct Observatory { - #[serde(rename = "mpcCode")] - mpc_code: String, -} - -#[derive(Debug, Deserialize)] -struct ObsData { - #[serde(rename = "optical")] - opticals: Vec, -} - -#[derive(Debug, Deserialize)] -struct OpticalObs { - #[serde(rename = "permID")] - perm_id: Option, - #[serde(rename = "provID")] - prov_id: Option, - #[serde(rename = "trkSub")] - trk_sub: Option, - - #[serde(rename = "obsTime", deserialize_with = "deserialize_mjd")] - obs_time: f64, - - ra: f64, - dec: f64, - - #[serde(rename = "precRA")] - prec_ra: Option, - #[serde(rename = "precDec")] - prec_dec: Option, - - #[serde(rename = "rmsRA")] - rms_ra: Option, - #[serde(rename = "rmsDec")] - rms_dec: Option, - - stn: String, -} - -impl OpticalObs { - /// Returns the trajectory ID for the optical observation. - /// It first checks for a `perm_id`, then a `prov_id`, and finally falls back to `trk_sub`. - /// If none of these are available, it panics with an error message. - /// The ID is parsed as a `u32` if possible, otherwise it is returned as a string. - /// - /// Return - /// ------ - /// * An `ObjectNumber` representing the trajectory ID. - /// * If the ID is a valid `u32`, it is returned as `ObjectNumber::Int(id)`. - /// * If the ID is not a valid `u32`, it is returned as `ObjectNumber::String(id)`. - /// * If no ID is found, it panics with an error message. - fn get_id(&self) -> ObjectNumber { - let id = self - .perm_id - .clone() - .or_else(|| self.prov_id.clone()) - .unwrap_or_else(|| self.trk_sub.clone().expect("No ID found")); - if let Ok(id) = id.parse::() { - ObjectNumber::Int(id) - } else { - ObjectNumber::String(id) - } - } - - fn to_observation( - &self, - state: &Outfit, - observer_idx: u16, - error_ra: Option, - error_dec: Option, - ) -> Observation { - let error_ra = self.rms_ra.unwrap_or_else(|| { - self.prec_ra - .unwrap_or_else(|| error_ra.expect("No error for RA when parsing ADES file")) - }); - - let error_dec = self.rms_dec.unwrap_or_else(|| { - self.prec_dec - .unwrap_or_else(|| error_dec.expect("No error for Dec when parsing ADES file")) - }); - Observation::new( - state, - observer_idx, - self.ra, - error_ra, - self.dec, - error_dec, - self.obs_time, - ) - .expect("Failed to create observation from ADES") - } -} - -/// Deserialize a date string in the format "YYYY-MM-DDTHH:MM:SS" into a floating-point number -/// representing the Modified Julian Date (MJD). -/// The date string is expected to be in UTC. -/// -/// Arguments -/// --------- -/// * `deserializer`: The deserializer to use for the date string. -/// -/// Return -/// ------ -/// * A `Result` containing the parsed MJD as a `f64` or an error if the parsing fails. -fn deserialize_mjd<'de, D>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - let date_str = String::deserialize(deserializer)?; - - let time = Epoch::from_str(&date_str).map_err(serde::de::Error::custom)?; - - Ok(time.to_mjd_utc_days()) -} - -/// Parses a `FlatAdes` file and populates the given `Outfit` and `TrajectorySet`. -/// It iterates through the optical observations, extracting the observer's MPC code and -/// creating an `Observation` for each optical observation. -/// The observations are then added to the `TrajectorySet` using the trajectory ID. -/// If a new observatory is found, it is added to the `Outfit` observatory set. -/// -/// Arguments -/// --------- -/// * `outfit`: A mutable reference to the `Outfit` instance. -/// * `flat_ades`: A reference to the `FlatAdes` instance. -/// * `trajs`: A mutable reference to the `TrajectorySet` instance. -fn parse_flat_ades( - outfit: &mut Outfit, - flat_ades: &FlatAdes, - trajs: &mut TrajectorySet, - error_ra: Option, - error_dec: Option, -) { - for optical in &flat_ades.opticals { - let traj_id = optical.get_id(); - let observer = outfit.uint16_from_mpc_code(&optical.stn); - let observation = optical.to_observation(outfit, observer, error_ra, error_dec); - trajs - .entry(traj_id) - .or_insert_with(|| SmallVec::with_capacity(10)) - .push(observation); - } -} - -/// Parses a `StructuredAdes` file and populates the given `Outfit` and `TrajectorySet`. -/// It iterates through the observation blocks, extracting the observer's MPC code and -/// creating an `Observation` for each optical observation. -/// The observations are then added to the `TrajectorySet` using the trajectory ID. -/// If a new observatory is found, it is added to the `Outfit` observatory set. -/// -/// Arguments -/// --------- -/// * `outfit`: A mutable reference to the `Outfit` instance. -/// * `structured_ades`: A reference to the `StructuredAdes` instance. -/// * `trajs`: A mutable reference to the `TrajectorySet` instance. -fn parse_structured_ades( - outfit: &mut Outfit, - structured_ades: &StructuredAdes, - trajs: &mut TrajectorySet, - error_ra: Option, - error_dec: Option, -) { - for obs_block in &structured_ades.obs_blocks { - let obs_context = &obs_block.obs_context; - let mpc_code = &obs_context.observatory.mpc_code; - let observer = outfit.uint16_from_mpc_code(mpc_code); - - for optical in &obs_block.obs_data.opticals { - let observation = optical.to_observation(outfit, observer, error_ra, error_dec); - let traj_id = optical.get_id(); - trajs - .entry(traj_id) - .or_insert_with(|| SmallVec::with_capacity(10)) - .push(observation); - } - } -} - -/// Parses an ADES file and populates the given `Outfit` and `TrajectorySet`. -/// It first attempts to parse the file as a `FlatAdes`, and if that fails, it tries to parse it as a `StructuredAdes`. -/// If both parsing attempts fail, it panics with an error message. -/// If new observatory are found, they are added to the `Outfit` observatory set. -/// -/// Arguments -/// --------- -/// * `outfit`: A mutable reference to the `Outfit` instance. -/// * `ades`: A reference to the ADES file path. -/// * `trajs`: A mutable reference to the `TrajectorySet` instance. -pub(crate) fn parse_ades( - outfit: &mut Outfit, - ades: &Utf8Path, - trajs: &mut TrajectorySet, - error_ra: Option, - error_dec: Option, -) { - let xml = std::fs::read_to_string(ades) - .unwrap_or_else(|_| panic!("Failed to read ADES file: {ades}")); - - match from_str::(&xml) { - Ok(flat_ades) => { - parse_flat_ades(outfit, &flat_ades, trajs, error_ra, error_dec); - } - Err(flat_err) => match from_str::(&xml) { - Ok(structured_ades) => { - parse_structured_ades(outfit, &structured_ades, trajs, error_ra, error_dec); - } - Err(structured_err) => { - panic!( - "Failed to parse ADES file:\n- Flat error: {flat_err}\n- Structured error: {structured_err}" - ); - } - }, - } -} diff --git a/src/trajectories/batch_reader.rs b/src/trajectories/batch_reader.rs deleted file mode 100644 index 1d7021a..0000000 --- a/src/trajectories/batch_reader.rs +++ /dev/null @@ -1,432 +0,0 @@ -//! # Single-Observer Astrometric Batch Ingestion -//! -//! This module provides the [`ObservationBatch`] type, which groups multiple -//! astrometric detections from a **single observer** into a compact container. -//! Such a batch can then be expanded into concrete [`Observation`]s and stored -//! in a [`TrajectorySet`]. -//! -//! ## Overview -//! ----------------- -//! A wide-field survey typically delivers angle-only astrometry (RA/DEC, with -//! per-epoch timestamps). [`ObservationBatch`] wraps such measurements, together -//! with uniform error estimates, into a structured form ready for ingestion into -//! orbit-determination pipelines. -//! -//! To actually turn batches into stored observations, use the trait -//! [`TrajectoryFile`](crate::trajectories::trajectory_file::TrajectoryFile): -//! - [`TrajectoryFile::new_from_vec`](crate::trajectories::trajectory_file::TrajectoryFile::new_from_vec) — build a new [`TrajectorySet`] from a batch. -//! - [`TrajectoryFile::add_from_vec`](crate::trajectories::trajectory_file::TrajectoryFile::add_from_vec) — append a batch into an existing [`TrajectorySet`]. -//! -//! Both methods transparently handle the internal expansion of a batch into -//! per-sample [`Observation`]s (site position lookups, heliocentric positions, -//! RA/DEC/error propagation, etc.). -//! -//! ## Units & Conventions -//! ----------------- -//! - **Angles:** Right ascension and declination in **radians**. -//! If your upstream data are in **degrees/arcseconds**, use -//! [`ObservationBatch::from_degrees_owned`] to convert once at construction. -//! - **Uncertainties:** 1-σ errors in RA/DEC (radians). For arcsecond inputs, -//! the degree-based constructor performs the conversion for you. -//! - **Epochs:** Times in **MJD (TT)** (days). Convert UTC/TAI upstream. -//! - **Observer:** All rows in a batch must come from the **same** observer. -//! -//! ## Invariants -//! ----------------- -//! - `trajectory_id.len() == ra.len() == dec.len() == time.len()` -//! - All angles and uncertainties are in **radians**. -//! - All epochs are in **MJD (TT)**. -//! - Batch content belongs to a **single observer**. -//! -//! ## Construction Paths -//! ----------------- -//! - [`ObservationBatch::from_radians_borrowed`] — zero-copy when your pipeline already -//! provides radians and MJD (TT). -//! - [`ObservationBatch::from_degrees_owned`] — converts degrees/arcseconds → radians -//! once and stores owned buffers. -//! -//! ## Example -//! ----------------- -//! ```rust,no_run -//! use std::sync::Arc; -//! use outfit::{ -//! Outfit, Observer, TrajectorySet, TrajectoryFile, ErrorModel, -//! trajectories::batch_reader::ObservationBatch, -//! }; -//! -//! // Inputs in degrees / arcseconds (mixed objects: 0 and 1). -//! let traj_id = vec![0_u32, 0, 1]; -//! let ra_deg = vec![210.01, 210.02, 211.00]; -//! let dec_deg = vec![-5.00, -4.99, -4.00]; -//! let mjd_tt = vec![60345.12, 60345.13, 60345.20]; -//! -//! let batch = ObservationBatch::from_degrees_owned( -//! &traj_id, &ra_deg, &dec_deg, 0.5, 0.5, &mjd_tt -//! ); -//! -//! // Global environment and observer. -//! let mut outfit = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); -//! let observer = outfit.get_observer_from_mpc_code(&"I41".to_string()); -//! -//! // Build a new TrajectorySet directly from the batch. -//! let traj_set = TrajectorySet::new_from_vec(&mut outfit, &batch, observer.clone()) -//! .expect("ingestion OK"); -//! -//! // Or append to an existing set: -//! let mut other = TrajectorySet::default(); -//! other.add_from_vec(&mut outfit, &batch, observer).expect("append OK"); -//! ``` -//! -//! ## Notes -//! ----------------- -//! - Internally, ingestion is performed by a crate-private routine -//! (`observation_from_batch`) which expands the batch into per-sample -//! [`Observation`]s and caches observer positions per epoch. Users should rely -//! on the public `TrajectoryFile` methods instead. -//! - For multi-observer datasets, create one [`ObservationBatch`] per observer, -//! then ingest them separately. -//! -//! ## See also -//! ------------ -//! * [`ObservationBatch::from_radians_borrowed`] – Zero-copy construction. -//! * [`ObservationBatch::from_degrees_owned`] – Convert degrees/arcseconds once. -//! * [`TrajectoryFile::new_from_vec`](crate::trajectories::trajectory_file::TrajectoryFile::new_from_vec) – Public entry point for batch ingestion. -//! * [`TrajectoryFile::add_from_vec`](crate::trajectories::trajectory_file::TrajectoryFile::add_from_vec) – Append batch into an existing set. -use std::{borrow::Cow, sync::Arc}; - -use ahash::RandomState; -use hifitime::Epoch; -use nalgebra::Vector3; -use ordered_float::OrderedFloat; -use smallvec::SmallVec; - -use crate::{ - constants::Radian, conversion::arcsec_to_rad, observations::Observation, - trajectories::parquet_reader::FastHashMap, ArcSec, Degree, ObjectNumber, Observer, Outfit, - OutfitError, TrajectorySet, MJD, -}; - -/// Batch of observations from a single observer (angles in **radians**). -/// -/// This container groups multiple astrometric measurements sharing the same -/// observer into a single batch, ready to be expanded into -/// [`Observation`]s and stored in a -/// [`TrajectorySet`]. -/// -/// Each measurement includes: -/// - A trajectory identifier (`trajectory_id`) so that a single batch can hold -/// observations for multiple objects simultaneously. -/// - Right ascension and declination in **radians**, with uniform 1-σ uncertainties -/// (also in **radians**). -/// - Epochs in **MJD (TT)** (days). -/// -/// Fields -/// ----------------- -/// * `trajectory_id` — Integer trajectory IDs (object numbers). Length must match `ra`/`dec`/`time`. -/// * `ra` — Right ascension values (**radians**). Length must match `dec`, `time`, and `trajectory_id`. -/// * `error_ra` — 1-σ uncertainty on right ascension (**radians**) applied uniformly to the batch. -/// * `dec` — Declination values (**radians**). Length must match `ra`, `time`, and `trajectory_id`. -/// * `error_dec` — 1-σ uncertainty on declination (**radians**) applied uniformly to the batch. -/// * `time` — Observation epochs as **MJD (TT)** (days). Length must match `ra`/`dec`/`trajectory_id`. -/// -/// Invariants -/// ----------------- -/// * `trajectory_id.len() == ra.len() == dec.len() == time.len()` -/// * Angles and uncertainties are expressed in **radians**. -/// * Time scale is **TT** (use appropriate conversion if your source data are in UTC/TAI). -/// -/// Construction -/// ----------------- -/// Prefer the dedicated constructors: -/// * [`ObservationBatch::from_radians_borrowed`] — zero-copy when your inputs are already in radians. -/// * [`ObservationBatch::from_degrees_owned`] — converts degrees/arcseconds once into owned buffers. -/// -/// Example -/// ----------------- -/// ```rust, no_run -/// # use outfit::trajectories::batch_reader::ObservationBatch; -/// # let (traj_id, ra_deg, dec_deg, mjd) = (vec![0, 0, 1], vec![14.62, 14.63, 15.01], vec![9.98, 10.01, 11.02], vec![43785.35, 43785.36, 43785.40]); -/// // Inputs in degrees / arcseconds (converted once to radians internally): -/// let batch = ObservationBatch::from_degrees_owned(&traj_id, &ra_deg, &dec_deg, 0.5, 0.5, &mjd); -/// -/// // Or, if you already have radians: -/// // let batch = ObservationBatch::from_radians_borrowed(&ra_rad, &dec_rad, err_ra_rad, err_dec_rad, &mjd); -/// ``` -/// -/// See also -/// ------------ -/// * [`ObservationBatch::from_radians_borrowed`] – Borrow slices already in radians (zero-copy). -/// * [`ObservationBatch::from_degrees_owned`] – Convert degrees/arcseconds → radians once. -/// * [`conversion::arcsec_to_rad`](crate::conversion::arcsec_to_rad) – Arcseconds → radians helper. -#[derive(Debug, Clone)] -pub struct ObservationBatch<'a> { - pub trajectory_id: Cow<'a, [u32]>, - - /// Right ascension values (**radians**). Must have the same length as `dec` and `time`. - pub ra: Cow<'a, [Radian]>, - - /// 1-σ uncertainty on right ascension (**radians**), applied uniformly to the batch. - /// Note: the weighting scheme accounts for the RA geometry (e.g., cos δ factors) downstream. - pub error_ra: Radian, - - /// Declination values (**radians**). Must have the same length as `ra` and `time`. - pub dec: Cow<'a, [Radian]>, - - /// 1-σ uncertainty on declination (**radians**), applied uniformly to the batch. - pub error_dec: Radian, - - /// Observation epochs as **MJD (TT)**, in days. Must have the same length as `ra`/`dec`. - pub time: Cow<'a, [MJD]>, -} - -impl<'a> ObservationBatch<'a> { - /// Construct a batch by **borrowing** slices that are already in radians. - /// - /// The returned batch holds `Cow::Borrowed` views of the provided slices, - /// performing **no allocation** and **no unit conversion**. - /// Use this when your upstream pipeline already provides: - /// - Trajectory identifiers (`trajectory_id`) - /// - Right ascension / declination in **radians** - /// - Uncertainties in **radians** - /// - Epochs in **MJD (TT)** - /// - /// Arguments - /// ----------------- - /// * `trajectory_id` — Integer trajectory IDs; length must match all angle/time slices. - /// * `ra_rad` — Right ascension values in **radians** (borrowed). - /// * `dec_rad` — Declination values in **radians** (borrowed). - /// * `error_ra_rad` — 1-σ uncertainty on RA in **radians**, applied uniformly to the batch. - /// * `error_dec_rad` — 1-σ uncertainty on DEC in **radians**, applied uniformly to the batch. - /// * `time_mjd` — Observation epochs as **MJD (TT)** (borrowed). - /// - /// Return - /// ---------- - /// * A batch borrowing the provided slices (**zero-copy**). - /// - /// Invariants - /// ---------- - /// * `trajectory_id.len() == ra_rad.len() == dec_rad.len() == time_mjd.len()` - /// - /// Panics - /// ---------- - /// * Debug builds only: panics if the slice lengths do not match. - /// - /// Complexity - /// ---------- - /// * O(1) — no allocation, no conversion. - /// - /// See also - /// ------------ - /// * [`ObservationBatch::from_degrees_owned`] – Convert degrees/arcseconds → radians and own the buffers. - /// * [`conversion::arcsec_to_rad`](crate::conversion::arcsec_to_rad) – Arcseconds → radians helper. - pub fn from_radians_borrowed( - trajectory_id: &'a [u32], - ra_rad: &'a [Radian], - dec_rad: &'a [Radian], - error_ra_rad: Radian, - error_dec_rad: Radian, - time_mjd: &'a [MJD], - ) -> Self { - debug_assert_eq!(ra_rad.len(), dec_rad.len(), "RA/DEC length mismatch"); - debug_assert_eq!(ra_rad.len(), time_mjd.len(), "RA/time length mismatch"); - - Self { - trajectory_id: Cow::Borrowed(trajectory_id), - ra: Cow::Borrowed(ra_rad), - dec: Cow::Borrowed(dec_rad), - time: Cow::Borrowed(time_mjd), - error_ra: error_ra_rad, - error_dec: error_dec_rad, - } - } - - /// Construct a batch from **degrees** (angles) and **arcseconds** (uncertainties), - /// converting to **radians** and **owning** the resulting buffers. - /// - /// Use this when your inputs come from common astrometric formats (e.g., MPC/ADES) - /// that report RA/DEC in degrees and uncertainties in arcseconds. - /// Conversion is performed **once** at construction; downstream code operates purely in radians. - /// - /// Arguments - /// ----------------- - /// * `trajectory_id` — Integer trajectory IDs; length must match all angle/time slices. - /// * `ra_deg` — Right ascension in **degrees** (borrowed); converted to radians. - /// * `dec_deg` — Declination in **degrees** (borrowed); converted to radians. - /// * `error_ra_arcsec` — 1-σ uncertainty on RA in **arcseconds**; converted to radians. - /// * `error_dec_arcsec` — 1-σ uncertainty on DEC in **arcseconds**; converted to radians. - /// * `time_mjd` — Observation epochs as **MJD (TT)** (borrowed; cloned to owned buffer). - /// - /// Return - /// ---------- - /// * A batch **owning** converted buffers (no dangling slices). - /// - /// Invariants - /// ---------- - /// * `trajectory_id.len() == ra_deg.len() == dec_deg.len() == time_mjd.len()` - /// - /// Panics - /// ---------- - /// * Panics if the slice lengths do not match. - /// - /// Complexity - /// ---------- - /// * O(n) for the degree→radian and arcsec→radian conversions + one `to_vec()` for time. - /// - /// See also - /// ------------ - /// * [`ObservationBatch::from_radians_borrowed`] – Zero-copy constructor when inputs are already in radians. - /// * [`conversion::arcsec_to_rad`](crate::conversion::arcsec_to_rad) – Arcseconds → radians helper. - pub fn from_degrees_owned( - trajectory_id: &'a [u32], - ra_deg: &[Degree], - dec_deg: &[Degree], - error_ra_arcsec: ArcSec, - error_dec_arcsec: ArcSec, - time_mjd: &[MJD], - ) -> Self { - debug_assert_eq!(ra_deg.len(), dec_deg.len(), "RA/DEC length mismatch"); - debug_assert_eq!(ra_deg.len(), time_mjd.len(), "RA/time length mismatch"); - - let ra: Vec = ra_deg.iter().map(|&d| d.to_radians()).collect(); - let dec: Vec = dec_deg.iter().map(|&d| d.to_radians()).collect(); - let time: Vec = time_mjd.to_vec(); - - Self { - trajectory_id: Cow::Owned(trajectory_id.to_vec()), - ra: Cow::Owned(ra), - dec: Cow::Owned(dec), - time: Cow::Owned(time), - error_ra: arcsec_to_rad(error_ra_arcsec), - error_dec: arcsec_to_rad(error_dec_arcsec), - } - } -} - -/// Expand a single-observer batch into concrete [`Observation`]s and append them into a [`TrajectorySet`]. -/// -/// This routine ingests an [`ObservationBatch`] whose angles and uncertainties are in **radians** -/// and whose epochs are **MJD (TT)**, then materializes per-sample [`Observation`]s enriched with -/// site geocentric and heliocentric positions. All measurements are assumed to come from the **same -/// observer** (hence a single `observer: Arc` argument). -/// -/// For performance, it: -/// - resolves the observer into a compact `u16` **once** (hot path), -/// - pre-fetches the UT1 provider **once**, -/// - caches observer positions by epoch: **MJD(TT) → (geo_pos, helio_pos)**, -/// so repeated timestamps incur **no extra** position computation. -/// -/// Internally, epoch keys are wrapped in `OrderedFloat` to enable their use in a hash map -/// (total order on `f64` while rejecting `NaN` inputs by construction). -/// -/// Arguments -/// ----------------- -/// * `trajectories` — Target container to receive observations, bucketed by `trajectory_id`. -/// * `env_state` — Global [`Outfit`] state (ephemerides, EOP/UT1 providers, etc.). -/// * `batch` — Angles and 1-σ uncertainties in **radians**; epochs as **MJD (TT)**; includes `trajectory_id`. -/// * `observer` — The (single) observer for **all** samples in `batch`. -/// -/// Return -/// ---------- -/// * `Ok(())` if all observations were successfully appended into `trajectories`, -/// * `Err(OutfitError)` if site position or heliocentric position computations fail. -/// -/// Panics -/// ---------- -/// * **Debug builds only**: length mismatches across `ra/dec/time/trajectory_id` trigger `debug_assert!`. -/// -/// Complexity -/// ---------- -/// * Time: **O(n)**, with at most **O(u)** geocentric/heliocentric computations where `u` is the number of -/// **unique** epochs in the batch (`u ≤ n`) thanks to the epoch→position cache. -/// * Space: **O(u)** for the epoch→position cache. -/// -/// Notes -/// ---------- -/// * Input angles (RA/DEC) and uncertainties **must already be in radians**. If your source is degrees/arcsec, -/// build the batch via [`ObservationBatch::from_degrees_owned`] (conversion done once at construction). -/// * Epochs are expected as **TT**. Convert upstream if your pipeline feeds UTC/TAI. -/// * This function mutates `trajectories` and reads from `env_state`. If you need parallelization, consider -/// extracting immutable position providers beforehand, or designing providers that accept shared references. -/// -/// See also -/// ------------ -/// * [`ObservationBatch::from_radians_borrowed`] – Zero-copy batch when inputs are already radians. -/// * [`ObservationBatch::from_degrees_owned`] – Degree/arcsec → rad conversion once at construction. -/// * [`parquet_to_trajset`] – Parquet ingestion using the same unit/weighting logic. -/// * [`conversion::arcsec_to_rad`] – Arcseconds → radians helper. -pub(crate) fn observation_from_batch( - trajectories: &mut TrajectorySet, - env_state: &mut Outfit, - batch: &ObservationBatch<'_>, - observer: Arc, -) -> Result<(), OutfitError> { - // --- Fast sanity checks (debug only) --------------------------------------- - // All slices must be aligned one-to-one. These checks are enforced at construction - // time for production, but we keep them here in debug builds to catch regressions. - debug_assert_eq!(batch.ra.len(), batch.dec.len(), "RA/DEC length mismatch"); - debug_assert_eq!(batch.ra.len(), batch.time.len(), "RA/time length mismatch"); - debug_assert_eq!( - batch.ra.len(), - batch.trajectory_id.len(), - "RA/trajectory_id length mismatch" - ); - - // Resolve observer ID once (hot path avoids map lookups later). - let uint16_obs = env_state.uint16_from_observer(observer.clone()); - - // Pre-fetch UT1 provider once. - let ut1 = env_state.get_ut1_provider(); - - // Heuristic: many surveys repeat epochs per exposure → cache a fraction of N. - let n = batch.ra.len(); - let est_cache_cap = (n / 4).clamp(64, 4096); - let mut pos_cache: FastHashMap, (Vector3, Vector3)> = - FastHashMap::with_capacity_and_hasher(est_cache_cap, RandomState::default()); - - // Safe and fast: iterators avoid per-iteration bounds checks - let ra_it = batch.ra.iter().copied(); - let dec_it = batch.dec.iter().copied(); - let time_it = batch.time.iter().copied(); - let id_it = batch.trajectory_id.iter().copied(); - - for ((ra, dec), (mjd_tt, traj_id)) in ra_it.zip(dec_it).zip(time_it.zip(id_it)) { - // Use OrderedFloat to permit f64 as a key with a total order. - let key = OrderedFloat(mjd_tt); - - // Compute (or reuse) positions at this epoch. - let (geo_pos, helio_pos) = if let Some(&(geo, helio)) = pos_cache.get(&key) { - (geo, helio) - } else { - let epoch = Epoch::from_mjd_in_time_scale(mjd_tt, hifitime::TimeScale::TT); - - // Geocentric position (velocity returned but unused here). - let (geo, _vel) = observer.pvobs(&epoch, ut1)?; - - // Heliocentric position (uses geocentric position). - let helio = observer.helio_position(env_state, &epoch, &geo)?; - - pos_cache.insert(key, (geo, helio)); - (geo, helio) - }; - - // Build observation and append to the right trajectory bucket. - let obs = Observation::with_positions( - uint16_obs, - ra, // radians - batch.error_ra, // radians - dec, // radians - batch.error_dec, // radians - mjd_tt, // MJD(TT) - geo_pos, - helio_pos, - ); - - let obj = ObjectNumber::Int(traj_id); - trajectories - .entry(obj) - .or_insert_with(|| SmallVec::with_capacity(32)) - .push(obs); - } - - Ok(()) -} diff --git a/src/trajectories/mod.rs b/src/trajectories/mod.rs deleted file mode 100644 index e04349f..0000000 --- a/src/trajectories/mod.rs +++ /dev/null @@ -1,121 +0,0 @@ -//! # Trajectories: ingestion, storage, and batch IOD -//! -//! High-level facilities to **ingest**, **store**, and **process** astrometric observations -//! grouped by object. The central type is [`TrajectorySet`], a fast hash map that buckets -//! time-ordered observations per [`ObjectNumber`]. Public helpers let you build a set from -//! multiple formats (MPC 80-column, Parquet, ADES, or in-memory batches) and run a -//! **Gauss-based Initial Orbit Determination (IOD)** over all objects. -//! -//! Modules -//! ----------------- -//! * [`batch_reader`](crate::trajectories::batch_reader) – Zero-copy container and routines to expand single-observer batches -//! into concrete [`Observation`](crate::observations::Observation)s. -//! * [`mpc_80col_reader`](crate::trajectories::mpc_80col_reader) – Minimal MPC **80-column** file reader. -//! * [`parquet_reader`](crate::trajectories::parquet_reader) – Arrow/Parquet-based ingestion (`ra`, `dec`, `jd`, `trajectory_id`). -//! * [`ades_reader`](crate::trajectories::ades_reader) – ADES (MPC XML/JSON) ingestion. -//! * [`trajectory_file`](crate::trajectories::trajectory_file) – **Public** trait exposing `new_from_*` and `add_from_*` helpers -//! to construct/extend a [`TrajectorySet`] from the above sources. -//! * [`trajectory_fit`](crate::trajectories::trajectory_fit) – Batch Gauss IOD over a set (`TrajectoryFit` trait, results & stats). -//! * *(crate-private)* `progress_bar` – Optional progress UI when the `progress` feature is enabled. -//! -//! Data Model -//! ----------------- -//! * **Key:** [`ObjectNumber`] (logical object identifier). -//! * **Value:** `Observations` = `SmallVec` time-ordered per object. -//! * **Set:** [`TrajectorySet`] = `HashMap` -//! for fast hashing and predictable performance on large catalogs. -//! -//! Ingestion Sources -//! ----------------- -//! Use the [`trajectory_file::TrajectoryFile`](crate::trajectories::trajectory_file) trait (implemented for [`TrajectorySet`]): -//! * **80-col MPC** — `new_from_80col`, `add_from_80col` (fail-fast on parse errors). -//! * **Parquet** — `new_from_parquet`, `add_from_parquet` (propagate `OutfitError` on I/O/schema). -//! * **ADES** — `new_from_ades`, `add_from_ades` (error policy handled in the parser). -//! * **In-memory batch** (single observer) — `new_from_vec`, `add_from_vec` -//! using [`batch_reader::ObservationBatch`](crate::trajectories::batch_reader::ObservationBatch) (angles/σ in **radians**, epochs in **MJD (TT)**). -//! -//! Units & Time Scales -//! ----------------- -//! * Internal angles are **radians**; readers convert from **degrees/arcsec** as needed. -//! * Epochs are **MJD (TT)**; Parquet `"jd"` (assumed **TT**) is converted via -//! [`constants::JDTOMJD`](crate::constants::JDTOMJD). -//! * Single-observer batches carry uniform 1-σ uncertainties (radians) applied per component. -//! -//! Batch IOD -//! ----------------- -//! Use [`trajectory_fit::TrajectoryFit::estimate_all_orbits`](crate::trajectories::trajectory_fit::TrajectoryFit::estimate_all_orbits) to run Gauss IOD over the set. -//! Returns a map `ObjectNumber → Result<(GaussResult, rms), OutfitError>`. Errors are **per-object** -//! and do not abort other objects. A cooperative-cancel variant is also available. -//! -//! Performance Notes -//! ----------------- -//! * Ingestion paths project only required columns and cache site positions by epoch. -//! * [`TrajectorySet`] uses `ahash` for speed; no deduplication is performed on `add_*` methods. -//! * Ordering is preserved as provided by sources; sorting by time is not enforced here. -//! -//! Feature Flags -//! ----------------- -//! * `progress` — Enables a live progress bar and timing during batch IOD. See -//! [`trajectory_fit`](crate::trajectories::trajectory_fit) for details. The UI is crate-internal and optional. -//! -//! Quick-Start -//! ----------------- -//! ```rust,no_run -//! use rand::SeedableRng; -//! use std::sync::Arc; -//! use camino::Utf8Path; -//! use outfit::{Outfit, TrajectorySet}; -//! use outfit::observers::Observer; -//! use outfit::trajectories::trajectory_file::TrajectoryFile; -//! use outfit::trajectories::trajectory_fit::TrajectoryFit; -//! use outfit::initial_orbit_determination::IODParams; -//! -//! # fn run() -> Result<(), outfit::outfit_errors::OutfitError> { -//! let mut state = Outfit::new("horizon:DE440", outfit::error_models::ErrorModel::FCCT14)?; -//! let observer: Arc = state.get_observer_from_mpc_code(&"I41".into()); -//! -//! // Ingest from Parquet, then append 80-column MPC -//! let mut trajs: TrajectorySet = TrajectorySet::new_from_parquet( -//! &mut state, Utf8Path::new("obs.parquet"), observer.clone(), 0.5, 0.5, Some(8192) -//! )?; -//! trajs.add_from_80col(&mut state, Utf8Path::new("obs_80col.txt")); -//! -//! // Batch IOD -//! let mut rng = rand::rngs::StdRng::from_os_rng(); -//! let params = IODParams::builder().max_triplets(32).build()?; -//! let results = trajs.estimate_all_orbits(&state, &mut rng, ¶ms); -//! # Ok(()) } -//! ``` -//! -//! See also -//! ------------ -//! * [`trajectory_file`](crate::trajectories::trajectory_file) – Public ingestion API. -//! * [`batch_reader`](crate::trajectories::batch_reader) – Batch expansion for single-observer inputs. -//! * [`parquet_reader`](crate::trajectories::parquet_reader), [`mpc_80col_reader`](crate::trajectories::mpc_80col_reader), [`ades_reader`](crate::trajectories::ades_reader) – File readers. -//! * [`trajectory_fit`](crate::trajectories::trajectory_fit) – Batch IOD, results, and statistics. -//! * [`crate::observations::Observation`] – Atomic astrometric sample. -//! -//! --- -use std::collections::HashMap; - -use ahash::RandomState; - -use crate::{constants::Observations, ObjectNumber}; - -pub mod ades_reader; -pub mod batch_reader; -pub mod mpc_80col_reader; -pub mod parquet_reader; -pub mod trajectory_file; -pub mod trajectory_fit; - -#[cfg(feature = "progress")] -pub(crate) mod progress_bar; - -/// A full set of trajectories for multiple objects. -/// -/// The key is the [`ObjectNumber`] (identifier of an object). -/// The value is the list of [`Observation`](crate::observations::Observation) associated with this object. -/// -/// Uses [`ahash`](https://docs.rs/ahash) for fast hashing. -pub type TrajectorySet = HashMap; diff --git a/src/trajectories/mpc_80col_reader.rs b/src/trajectories/mpc_80col_reader.rs deleted file mode 100644 index b66a401..0000000 --- a/src/trajectories/mpc_80col_reader.rs +++ /dev/null @@ -1,345 +0,0 @@ -//! # MPC 80-Column Observation Reader -//! -//! Utilities to parse **MPC 80-column** astrometric observations and turn them into -//! [`Observation`] values usable by the orbit-determination pipeline. -//! -//! ## Overview -//! ----------------- -//! This module provides: -//! - A small error type [`ParseObsError`] describing MPC parsing failures. -//! - A crate-internal line parser (`from_80col`) that converts a single 80-col line -//! into an [`Observation`] with angles in **radians** and time in **MJD (TT)**. -//! - A crate-visible batch routine \[`extract_80col`\] that reads an entire file, -//! returns all parsed [`Observation`]s, and extracts the **object number** from -//! the header line. -//! -//! The implementation enforces **MPC CCD** observations (rejects non-CCD lines) and -//! converts RA/Dec strings using robust helpers (`parse_ra_to_deg`, `parse_dec_to_deg`), -//! then applies uncertainty handling that accounts for `cos δ` on the RA component. -//! -//! ## Units & Conventions -//! ----------------- -//! - **Input format:** MPC 80-column fixed-width ASCII lines. -//! - **Angles:** RA/Dec are parsed from strings into **degrees**, then converted to -//! **radians**. -//! - **Uncertainties:** parsed in input units (hour/deg for RA/Dec) and mapped to -//! **radians**; RA uncertainties are divided by `cos δ`. -//! - **Time scale:** Observing time is parsed from fractional date and converted -//! to **MJD (TT)** via [`frac_date_to_mjd`]. -//! - **Observer site:** Extracted from columns 77–80 (MPC code), mapped to the -//! compact `u16` site id via \[`Outfit::uint16_from_mpc_code`\]. -//! -//! ## File-Level Object Number -//! ----------------- -//! \[`extract_80col`\] retrieves an **object number** from the first line using the -//! conventional MPC header locations (columns `0..5` or fallback to `5..12`), trims -//! leading zeros, and returns it as an [`ObjectNumber::String`]. -//! -//! ## Error Handling -//! ----------------- -//! Parser failures are wrapped into [`OutfitError::Parsing80ColumnFileError`] with a -//! [`ParseObsError`] payload for precise diagnostics (e.g. *line too short*, -//! *invalid RA*, *invalid date*). Non-CCD lines are filtered out by default. -//! -//! ## See also -//! ------------ -//! * [`parse_ra_to_deg`] – RA string → degrees with uncertainty. -//! * [`parse_dec_to_deg`] – Dec string → degrees with uncertainty. -//! * [`frac_date_to_mjd`] – Fractional date → MJD (TT). -//! * [`Observation`] – Internal astrometric sample type. -//! * [`ObjectNumber`] – Logical object identifier. -//! * [`Outfit`] – Global state (site registry, time scales, etc.). -use std::ops::Range; - -use camino::Utf8Path; -use thiserror::Error; - -use crate::{ - constants::Observations, - conversion::{parse_dec_to_deg, parse_ra_to_deg}, - observations::Observation, - time::frac_date_to_mjd, - ObjectNumber, Outfit, OutfitError, RADH, RADSEC, -}; - -/// Line-level parsing errors for MPC 80-column observations. -/// -/// Variants -/// ----------------- -/// * `TooShortLine` – The line does not reach 80 characters. -/// * `NotCCDObs` – The line is not flagged as a CCD observation (column 15 is `'s'`). -/// * `InvalidRA` – Failed to parse RA field (`line[32..44]`); payload carries the offending slice. -/// * `InvalidDec` – Failed to parse Dec field (`line[44..56]`); payload carries the offending slice. -/// * `InvalidDate` – Failed to parse fractional date (`line[15..32]`); payload carries the offending slice. -/// -/// See also -/// ------------ -/// * [`parse_ra_to_deg`] – Robust RA parser with uncertainty extraction. -/// * [`parse_dec_to_deg`] – Robust Dec parser with uncertainty extraction. -/// * [`frac_date_to_mjd`] – Converts fractional date to MJD (TT). -#[derive(Error, Debug, PartialEq)] -pub enum ParseObsError { - #[error("The line is too short")] - TooShortLine, - #[error("The line is not a CCD observation")] - NotCCDObs, - #[error("Error parsing RA: {0}")] - InvalidRA(String), - #[error("Invalid Dec value: {0}")] - InvalidDec(String), - #[error("Invalid date: {0}")] - InvalidDate(String), -} - -/// Parse a single **MPC 80-column** line into an [`Observation`] (crate-private helper). -/// -/// This routine enforces **CCD** observations, parses RA/Dec/time fields, maps the -/// MPC site code to the compact observer id, and builds an [`Observation`] in **radians** -/// with a **MJD (TT)** epoch. RA uncertainties are divided by `cos δ` to reflect -/// the geometry on the sphere. -/// -/// Arguments -/// ----------------- -/// * `env_state` – Global state used to resolve MPC site codes and build observations. -/// * `line` – A single 80-column ASCII line. -/// -/// Return -/// ---------- -/// * A parsed [`Observation`] or an [`OutfitError::Parsing80ColumnFileError`] on failure. -/// -/// Panics -/// ---------- -/// * Never panics directly; errors are surfaced as [`OutfitError`]. Bounds use fixed slices. -/// -/// Field Layout (MPC 80-col subset used here) -/// ----------------- -/// * `15..32` – Fractional date (UTC-like string expected by `frac_date_to_mjd`). -/// * `32..44` – Right ascension string (parsed by `parse_ra_to_deg`). -/// * `44..56` – Declination string (parsed by `parse_dec_to_deg`). -/// * `77..80` – MPC site code. -/// -/// See also -/// ------------ -/// * [`parse_ra_to_deg`] – RA parsing (degrees + uncertainty). -/// * [`parse_dec_to_deg`] – Dec parsing (degrees + uncertainty). -/// * [`frac_date_to_mjd`] – Fractional date → MJD (TT). -fn from_80col(env_state: &mut Outfit, line: &str) -> Result { - if line.len() < 80 { - return Err(OutfitError::Parsing80ColumnFileError( - ParseObsError::TooShortLine, - )); - } - - if line.chars().nth(14) == Some('s') { - return Err(OutfitError::Parsing80ColumnFileError( - ParseObsError::NotCCDObs, - )); - } - - let (ra, error_ra) = parse_ra_to_deg(line[32..44].trim()).ok_or_else(|| { - OutfitError::Parsing80ColumnFileError(ParseObsError::InvalidRA( - line[32..44].trim().to_string(), - )) - })?; - - let (dec, error_dec) = parse_dec_to_deg(line[44..56].trim()).ok_or_else(|| { - OutfitError::Parsing80ColumnFileError(ParseObsError::InvalidDec( - line[44..56].trim().to_string(), - )) - })?; - - let time = frac_date_to_mjd(line[15..32].trim()).map_err(|_| { - OutfitError::Parsing80ColumnFileError(ParseObsError::InvalidDate( - line[15..32].trim().to_string(), - )) - })?; - - let observer_id = env_state.uint16_from_mpc_code(&line[77..80].trim().into()); - let observer = env_state.get_observer_from_uint16(observer_id); - - let max_rms = |observation_error: f64, observer_error: f64, factor: f64| { - f64::max(observation_error, observer_error * factor) - }; - - let dec_radians = dec.to_radians(); - let dec_rad_cos = dec_radians.cos(); - - let ra_error = max_rms( - (error_ra * RADH) / dec_rad_cos, - observer.ra_accuracy.map(|v| v.into_inner()).unwrap_or(0.0), - RADSEC / dec_rad_cos, - ); - - let dec_error = max_rms( - error_dec.to_radians(), - observer.dec_accuracy.map(|v| v.into_inner()).unwrap_or(0.0), - RADSEC, - ); - - let observation = Observation::new( - env_state, - observer_id, - ra.to_radians(), - ra_error, - dec_radians, - dec_error, - time, - )?; - Ok(observation) -} - -/// Read a full **MPC 80-column** file, returning parsed observations and the object number. -/// -/// Lines that are not CCD observations are **silently skipped**. Any other parsing error -/// triggers a panic with context (the current strategy is fail-fast for corrupted inputs). -/// The object number is extracted from the first line (`0..5`, fallback `5..12`), trimming -/// leading zeros. -/// -/// Arguments -/// ----------------- -/// * `env_state` – Global state used to resolve MPC site codes and build observations. -/// * `colfile` – Path to the MPC 80-column file. -/// -/// Return -/// ---------- -/// * A tuple `(observations, object_number)` where: -/// - `observations` is a `Vec` with angles in **radians** and epochs in **MJD (TT)**, -/// - `object_number` is the header-derived [`ObjectNumber::String`]. -/// -/// Panics -/// ---------- -/// * Panics if the file cannot be read or if a non-CCD line fails to parse for reasons -/// other than the expected `NotCCDObs` (fail-fast behavior). -/// -/// See also -/// ------------ -/// * [`Observation`] – Parsed astrometric sample. -/// * [`ObjectNumber`] – Identifier extracted from header columns. -/// * [`parse_ra_to_deg`], [`parse_dec_to_deg`], [`frac_date_to_mjd`] – Parsing helpers. -pub(crate) fn extract_80col( - env_state: &mut Outfit, - colfile: &Utf8Path, -) -> Result<(Observations, ObjectNumber), OutfitError> { - let file_content = std::fs::read_to_string(colfile) - .unwrap_or_else(|_| panic!("Could not read file {}", colfile.as_str())); - - let first_line = file_content - .lines() - .next() - .unwrap_or_else(|| panic!("Could not read first line of file {}", colfile.as_str())); - - fn get_object_number(line: &str, range: Range) -> String { - line[range].trim_start_matches('0').trim().to_string() - } - - let mut object_number = get_object_number(first_line, 0..5); - if object_number.is_empty() { - object_number = get_object_number(first_line, 5..12); - } - - Ok(( - file_content - .lines() - .filter_map(|line| match from_80col(env_state, line) { - Ok(obs) => Some(obs), - Err(OutfitError::Parsing80ColumnFileError(ParseObsError::NotCCDObs)) => None, - Err(e) => panic!("Error parsing line: {e:?}"), - }) - .collect(), - ObjectNumber::String(object_number), - )) -} - -#[cfg(test)] -#[cfg(feature = "jpl-download")] -mod mpc_80col_test { - use super::*; - - #[test] - fn test_from_80col_valid_line() { - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - - let line = - " K09R05F C2009 09 15.23433 22 52 22.62 -14 47 03.2 20.8 Vr~097wG96"; - - let mut env_state = OUTFIT_HORIZON_TEST.0.clone(); - let result = from_80col(&mut env_state, line); - - assert!(result.is_ok()); - let obs = result.unwrap(); - - assert_eq!( - obs, - Observation { - observer: 0, - ra: 5.988124307160555, - error_ra: 1.2535340843609459e-6, - dec: -0.25803335512429054, - error_dec: 1.0181086985431635e-6, - time: 55089.23509601851, - observer_earth_position: [ - 3.0499942822953885e-5, - -8.594304778250371e-6, - 2.8491013919142154e-5 - ] - .into(), - observer_helio_position: [ - 0.9968138444702415, - -0.12221921296802639, - -0.05295724448160355 - ] - .into(), - } - ); - } - - #[test] - fn test_from_80col_too_short_line() { - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - - let line = "short line"; - let mut env_state = OUTFIT_HORIZON_TEST.0.clone(); - let result = from_80col(&mut env_state, line); - - assert!(matches!( - result, - Err(OutfitError::Parsing80ColumnFileError( - ParseObsError::TooShortLine - )) - )); - } - - #[test] - fn test_from_80col_invalid_date() { - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - - let line = - " K09R05F C20xx 09 15.23433 22 52 22.62 -14 47 03.2 20.8 Vr~097wG96"; - let mut env_state = OUTFIT_HORIZON_TEST.0.clone(); - let result = from_80col(&mut env_state, line); - - assert!(matches!( - result, - Err(OutfitError::Parsing80ColumnFileError( - ParseObsError::InvalidDate(_) - )) - )); - } - - #[test] - fn test_from_80col_invalid_ra_dec() { - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - - let line = - " K09R05F C2009 09 15.23433 XX YY ZZ.ZZ -AA BB CC.C 20.8 Vr~097wG96"; - let mut env_state = OUTFIT_HORIZON_TEST.0.clone(); - let result = from_80col(&mut env_state, line); - - assert!(matches!( - result, - Err(OutfitError::Parsing80ColumnFileError( - ParseObsError::InvalidRA(_) - )) - )); - } -} diff --git a/src/trajectories/parquet_reader.rs b/src/trajectories/parquet_reader.rs deleted file mode 100644 index 4a16de9..0000000 --- a/src/trajectories/parquet_reader.rs +++ /dev/null @@ -1,362 +0,0 @@ -//! # Parquet Reader for Astrometric Observations -//! -//! High-throughput ingestion of angle-only astrometric detections from **Apache Parquet** -//! into a [`TrajectorySet`]. This module focuses on a minimal, column-projected read path, -//! converts **JD→MJD (TT)**, and constructs [`Observation`]s while caching observer positions -//! by unique epoch to avoid repeated ephemeris calls. -//! -//! ## Overview -//! ----------------- -//! The primary entry point is a crate-internal routine that reads Parquet record batches, -//! projects only the required columns, and appends parsed samples to an existing -//! [`TrajectorySet`]. It is typically called by higher-level, public ingestion helpers -//! (e.g., methods exposed by a `TrajectoryFile` trait). -//! -//! Key design points: -//! - **Projection-first**: materialize only the columns used by Outfit. -//! - **Typed downcast once per batch**: avoid per-row dynamic checks. -//! - **Fast path for non-null columns**: iterate over `&[f64]` / `&[u32]` slices. -//! - **Epoch→position cache**: compute `(geo_pos, helio_pos)` at most once per unique MJD(TT). -//! -//! ## Expected Parquet Schema -//! ----------------- -//! The input file must contain (at least) the following leaf columns: -//! - `ra: Float64` — Right ascension in **degrees**. -//! - `dec: Float64` — Declination in **degrees**. -//! - `jd: Float64` — Epoch in **Julian Date (TT)**. -//! - `trajectory_id: UInt32` — Grouping key used as [`ObjectNumber::Int`]. -//! -//! Columns are accessed by **name** at setup (to build the projection mask) and then by -//! **index** in the hot loop. If a required column is missing, a clean `io::Error` is returned. -//! -//! ## Units & Conventions -//! ----------------- -//! - **Angles:** `ra`, `dec` are stored in **degrees** on disk and converted to **radians** -//! before building [`Observation`]s. -//! - **Uncertainties:** provided as **arcseconds** at call-site, converted to **radians** once; -//! applied uniformly to all rows of the file (per-component). -//! - **Time scale:** `jd` is assumed to be **TT** on disk. It is converted to **MJD (TT)** -//! via subtraction by [`JDTOMJD`]. -//! - **Observer:** the file is read under a **single** [`Observer`]. If you ingest heterogeneous -//! observers, extend the cache key to `(observer_id, mjd_tt)` or build one cache per observer. -//! -//! ## Null Handling Policy -//! ----------------- -//! Two execution paths: -//! - **No nulls** (fast path): raw slice iteration with minimal overhead. -//! - **With nulls** (fallback): per-row checks; incomplete rows are **skipped** to preserve -//! correctness. Prefer cleaning datasets upstream for best performance. -//! -//! ## Performance Notes -//! ----------------- -//! - **Projection** avoids unnecessary I/O and deserialization. -//! - **Batch size** (`8192` by default) amortizes decompression and Arrow decoding; -//! tune between `8k` and `64k` depending on storage/CPU. -//! - **Caching** uses `FastHashMap, (Vector3, Vector3)>` -//! keyed by MJD(TT), typically yielding large savings whenever exposures share timestamps. -//! - **Zero-ephemeris constructor**: [`Observation::with_positions`] prevents recomputing -//! positions during construction. -//! -//! ## Error Handling -//! ----------------- -//! - I/O and schema issues surface as `io::Error` or `ParquetError` wrapped into [`OutfitError`]. -//! - Ephemeris/observer computations (`pvobs`, `helio_position`) may return [`OutfitError`]. -//! - Missing required columns produce an `io::ErrorKind::NotFound` with a clear message. -//! -//! > **Note** -//! > This reader is **crate-private** and is used under the hood by higher-level, -//! > public ingestion helpers (e.g., methods implementing a `TrajectoryFile` trait). -//! -//! ## See also -//! ------------ -//! * [`Observation::with_positions`] – Lagrange-friendly constructor with precomputed positions. -//! * [`Observer::pvobs`] – Geocentric site position at epoch. -//! * [`Observer::helio_position`] – Heliocentric site position at epoch. -//! * [`JDTOMJD`] – Constant used for `JD → MJD (TT)` conversion. -//! * [`ObjectNumber`] – Key type for per-object bucketing in [`TrajectorySet`]. -use arrow_array::Array; -use hifitime::Epoch; -use nalgebra::Vector3; -use ordered_float::OrderedFloat; -use parquet::errors::ParquetError; -use smallvec::SmallVec; -use std::collections::hash_map::Entry; -use std::io; -use std::sync::Arc; - -use crate::constants::ArcSec; -use crate::conversion::arcsec_to_rad; -use crate::observers::Observer; -use crate::outfit::Outfit; -use crate::outfit_errors::OutfitError; -use crate::TrajectorySet; -use crate::{ - constants::{ObjectNumber, JDTOMJD}, - observations::Observation, -}; -use arrow_array::array::{Float64Array, UInt32Array}; -use camino::Utf8Path; -use parquet::arrow::{arrow_reader::ParquetRecordBatchReaderBuilder, ProjectionMask}; - -use ahash::RandomState; -use std::collections::HashMap; - -pub type FastHashMap = HashMap; - -/// Load astrometric observations from a Parquet file into an existing [`TrajectorySet`]. -/// -/// This routine deserializes batches of observations from a Parquet file, converts -/// Julian Dates (JD) to Modified Julian Dates (MJD; TT scale), and constructs [`Observation`] -/// instances with the provided astrometric uncertainties. To avoid redundant and costly -/// ephemeris computations, it caches the observer's geocentric and heliocentric positions -/// per unique `(observer, time)` encountered during the read. -/// -/// Arguments -/// ----------------- -/// * `trajectories` – The mutable [`TrajectorySet`] to which observations are appended. -/// * `env_state` – Global environment providing ephemerides, Earth orientation data, -/// and observer definitions. -/// * `parquet` – Path to the input Parquet file containing the columns -/// `ra`, `dec`, `jd`, and `trajectory_id`. -/// The `ra` and `dec` columns have to be in degrees and of type `Float64`. -/// The `jd` column has to be in Julian Date (TT) and of type `Float64`. -/// The `trajectory_id` column has to be of type `UInt32` and is used to group -/// observations by object. -/// * `observer` – The [`Observer`] associated with all observations in this file. -/// * `error_ra` – Right ascension astrometric uncertainty (radians). -/// * `error_dec` – Declination astrometric uncertainty (radians). -/// * `batch_size` – Optional Arrow reader batch size (default: 8192 rows). -/// -/// Performance notes -/// ----------------- -/// * Projects only the required columns and accesses them by **index** to avoid -/// per-batch name lookups. -/// * Uses a per-file cache keyed by MJD (TT) to store `(geo_pos, helio_pos)` and -/// reuse them across batches and rows. -/// * Fast path when all columns are non-null: iterates over raw slices (`&[f64]`, `&[u32]`) -/// for minimal overhead. -/// * Downcasts to concrete Arrow arrays once per batch (not per row). -/// -/// Return -/// ---------- -/// * No return value. Observations are appended in-place to `trajectories`. -/// -/// See also -/// ------------ -/// * [`Observation::with_positions`] – Zero-ephemeris constructor used here. -/// * [`Observer::pvobs`] – Geocentric observer position (and velocity). -/// * [`Observer::helio_position`] – Heliocentric observer position. -pub(crate) fn parquet_to_trajset( - trajectories: &mut TrajectorySet, - env_state: &mut Outfit, - parquet: &Utf8Path, - observer: Arc, - error_ra: ArcSec, - error_dec: ArcSec, - batch_size: Option, -) -> Result<(), OutfitError> { - // Convert arcsecond uncertainties to radians once (cheap). - let error_ra_rad = arcsec_to_rad(error_ra); - let error_dec_rad = arcsec_to_rad(error_dec); - - // Resolve observer to its compact u16 key once (hot path avoids map lookups later). - let uint16_obs = env_state.uint16_from_observer(observer); - - // Open file and inspect Parquet metadata (I/O and schema discovery happen here). - let file = std::fs::File::open(parquet)?; - let builder = ParquetRecordBatchReaderBuilder::try_new(file)?; - - let parquet_metadata = builder.metadata(); - let schema_descr = parquet_metadata.file_metadata().schema_descr(); - - // Build a stable projection mask to materialize **only** the columns used by Outfit. - // We rely on the projection order to index columns directly in the hot loop. - let all_fields = schema_descr.columns(); - let column_names = ["ra", "dec", "jd", "trajectory_id"]; - let projection_indices: Vec = column_names - .iter() - .map(|name| { - all_fields - .iter() - .position(|f| f.name() == *name) - // If not found, surface a clean error instead of panicking. - .ok_or_else(|| { - io::Error::new( - io::ErrorKind::NotFound, - format!("Column '{name}' not found in schema"), - ) - }) - }) - .collect::>()?; - let mask = ProjectionMask::leaves(schema_descr, projection_indices); - - // A larger batch often amortizes decompression + Arrow deserialization cost. - // Tune with benches (8192–65536) depending on your I/O and CPU characteristics. - let batch_size = batch_size.unwrap_or(8192); - let reader = builder - .with_projection(mask) - .with_batch_size(batch_size) - .build()?; - - // Pre-fetch shared providers and observer reference to avoid repeated lookups in the hot loop. - let ut1 = env_state.get_ut1_provider(); - let obs_ref = env_state.get_observer_from_uint16(uint16_obs); - - // Cache MJD(TT) → (geo_pos, helio_pos). - // Note: we assume here the file contains a **single** observer. If you ingest multiple - // observers, extend the key to (observer_id, time), e.g. by packing into a u64 or using a tuple. - let mut pos_cache: FastHashMap, (Vector3, Vector3)> = - FastHashMap::with_capacity_and_hasher(4096, RandomState::default()); - - // Iterate over Parquet record batches - for maybe_batch in reader { - // I/O boundary; failures here usually indicate corruption or incompatible schema. - let batch = maybe_batch.map_err(ParquetError::from)?; - let len = batch.num_rows(); - - // Projected columns by index: [0]=ra, [1]=dec, [2]=jd, [3]=trajectory_id - // We downcast **once** per batch (cheap) and reuse typed views in the row loop. - let ra_arr = batch - .column(0) - .as_any() - .downcast_ref::() - .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "ra must be Float64Array"))?; - let dec_arr = batch - .column(1) - .as_any() - .downcast_ref::() - .ok_or_else(|| { - io::Error::new(io::ErrorKind::InvalidData, "dec must be Float64Array") - })?; - let jd_arr = batch - .column(2) - .as_any() - .downcast_ref::() - .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "jd must be Float64Array"))?; - let tid_arr = batch - .column(3) - .as_any() - .downcast_ref::() - .ok_or_else(|| { - io::Error::new( - io::ErrorKind::InvalidData, - "trajectory_id must be UInt32Array", - ) - })?; - - // Fast path when all projected columns have no nulls. - // This unlocks tight, bounds-checked loops on `&[T]` slices without per-row Option unwrapping. - let no_nulls = ra_arr.nulls().is_none() - && dec_arr.nulls().is_none() - && jd_arr.nulls().is_none() - && tid_arr.nulls().is_none(); - - if no_nulls { - // Raw slice views (zero allocs, no per-element downcast/boxing). - let ra_vals: &[f64] = ra_arr.values(); - let dec_vals: &[f64] = dec_arr.values(); - let jd_vals: &[f64] = jd_arr.values(); - let tid_vals: &[u32] = tid_arr.values(); - - // Hot loop: build `Observation`s with positions sourced from the per-file cache. - for i in 0..len { - // Convert degrees → radians (fast path: one multiply each). - let ra_rad = ra_vals[i].to_radians(); - let dec_rad = dec_vals[i].to_radians(); - - // Convert JD → MJD(TT). Assumes `jd` is already in TT scale in the file; - // if not, convert scales here before caching. - let mjd_time = jd_vals[i] - JDTOMJD; - // Using OrderedFloat to allow float keys in a hash map (with a total order). - let key = OrderedFloat(mjd_time); - - // Compute observer positions once per unique epoch. - // We handle errors with `?` while using the entry API (no closures returning Result). - let (geo_pos, helio_pos) = match pos_cache.entry(key) { - Entry::Occupied(e) => *e.get(), - Entry::Vacant(v) => { - let epoch = - Epoch::from_mjd_in_time_scale(mjd_time, hifitime::TimeScale::TT); - - // Geocentric position (velocity unused here, but available if needed). - let (geo, _vel) = obs_ref.pvobs(&epoch, ut1)?; - // Heliocentric position (requires geocentric as input). - let helio = obs_ref.helio_position(env_state, &epoch, &geo)?; - - v.insert((geo, helio)); - (geo, helio) - } - }; - - // Zero-ephemeris constructor: avoids recomputing positions at construction. - let obs = Observation::with_positions( - uint16_obs, - ra_rad, - error_ra_rad, - dec_rad, - error_dec_rad, - mjd_time, - geo_pos, - helio_pos, - ); - - // Group observations by `trajectory_id` (ObjectNumber::Int). - let obj = ObjectNumber::Int(tid_vals[i]); - trajectories - .entry(obj) - .or_insert_with(|| SmallVec::with_capacity(32)) - .push(obs); - } - } else { - // Safety fallback: if any column contains nulls, we check row-by-row and skip incomplete rows. - // This path is slower, but maintains correctness for sparse/missing data. - for i in 0..len { - if ra_arr.is_null(i) - || dec_arr.is_null(i) - || jd_arr.is_null(i) - || tid_arr.is_null(i) - { - continue; // Drop incomplete rows (policy: skip; alternatively, surface an error) - } - - let ra_rad: f64 = ra_arr.value(i).to_radians(); - let dec_rad = dec_arr.value(i).to_radians(); - let mjd_time = jd_arr.value(i) - JDTOMJD; - let tid = tid_arr.value(i); - let key = OrderedFloat(mjd_time); - - let (geo_pos, helio_pos) = match pos_cache.entry(key) { - Entry::Occupied(e) => *e.get(), - Entry::Vacant(v) => { - let epoch = - Epoch::from_mjd_in_time_scale(mjd_time, hifitime::TimeScale::TT); - - let (geo, _vel) = obs_ref.pvobs(&epoch, ut1)?; - let helio = obs_ref.helio_position(env_state, &epoch, &geo)?; - - v.insert((geo, helio)); - (geo, helio) - } - }; - - let obs = Observation::with_positions( - uint16_obs, - ra_rad, - error_ra_rad, - dec_rad, - error_dec_rad, - mjd_time, - geo_pos, - helio_pos, - ); - - trajectories - .entry(ObjectNumber::Int(tid)) - .or_insert_with(|| SmallVec::with_capacity(32)) - .push(obs); - } - } - } - - Ok(()) -} diff --git a/src/trajectories/progress_bar.rs b/src/trajectories/progress_bar.rs deleted file mode 100644 index 40ecba4..0000000 --- a/src/trajectories/progress_bar.rs +++ /dev/null @@ -1,115 +0,0 @@ -//! Lightweight iteration timing utilities. -//! -//! This module provides helpers to measure and report iteration times -//! in long-running loops, e.g. when combined with a progress bar -//! (see the `progress` feature). -//! -//! Components -//! ----------------- -//! * [`IterTimer`] – Tracks per-iteration durations and computes a -//! smoothed **exponential moving average** (EMA). -//! Useful to get a stable estimate of iteration time even when -//! individual steps fluctuate. -//! -//! * [`fmt_dur`] – Human-readable formatter for [`Duration`] values, -//! producing strings like `"253µs"`, `"42ms"`, or `"3.14s"` depending -//! on the scale. -//! -//! Usage -//! ----------------- -//! Typical workflow inside a loop: -//! -//! ```rust, no_run -//! use std::time::Duration; -//! use your_crate::iter_timer::{IterTimer, fmt_dur}; -//! -//! let mut timer = IterTimer::new(0.2); // smoothing factor α = 0.2 -//! -//! for i in 0..10 { -//! // ... some expensive work ... -//! -//! let dt = timer.tick(); -//! println!( -//! "iter {i} took {}, EMA = {}", -//! fmt_dur(dt), -//! fmt_dur(timer.avg()) -//! ); -//! } -//! ``` -//! -//! Design notes -//! ----------------- -//! * The EMA update rule is: -//! `ema ← α·dt + (1–α)·ema` -//! with `α ∈ (0,1]`. -//! - `α = 1.0` → no smoothing (EMA = last sample). -//! - small `α` → stronger smoothing, slower adaptation. -//! -//! * [`IterTimer::tick`] must be called at each iteration boundary. -//! The first tick initializes the average to the first duration. -//! -//! * [`IterTimer::avg`] returns the smoothed duration as a [`Duration`]. -//! -//! * This module is enabled only with the `progress` feature. -#[cfg(feature = "progress")] -use std::time::{Duration, Instant}; - -pub struct IterTimer { - last: Instant, - ema_ns: f64, - alpha: f64, - count: u64, -} - -impl IterTimer { - pub fn new(alpha: f64) -> Self { - Self { - last: Instant::now(), - ema_ns: 0.0, - alpha, - count: 0, - } - } - - #[inline] - pub fn tick(&mut self) -> Duration { - let now = Instant::now(); - let dt = now.duration_since(self.last); - self.last = now; - self.count += 1; - - let dt_ns = dt.as_nanos() as f64; - self.ema_ns = if self.count == 1 { - dt_ns - } else { - self.alpha * dt_ns + (1.0 - self.alpha) * self.ema_ns - }; - - dt - } - - #[inline] - pub fn avg(&self) -> Duration { - if self.count == 0 { - Duration::from_nanos(0) - } else { - Duration::from_nanos(self.ema_ns as u64) - } - } -} - -#[inline] -pub fn fmt_dur(d: Duration) -> String { - let us = d.as_micros(); - if us < 1_000 { - format!("{us}µs") - } else { - let ms = d.as_millis(); - if ms < 1_000 { - format!("{ms}ms") - } else { - let s = d.as_secs_f32(); - format!("{s:.2}s") - } - } -} diff --git a/src/trajectories/trajectory_file.rs b/src/trajectories/trajectory_file.rs deleted file mode 100644 index 7a104a6..0000000 --- a/src/trajectories/trajectory_file.rs +++ /dev/null @@ -1,513 +0,0 @@ -//! # Trajectory ingestion and batch Initial Orbit Determination (IOD) -//! -//! High-level utilities to **build and extend** a [`TrajectorySet`] from multiple sources -//! (MPC 80-column, Parquet, ADES, or in-memory batches) and to run a **Gauss-based IOD** -//! over all trajectories. -//! -//! ## Overview -//! ----------------- -//! This module exposes the [`TrajectoryFile`] trait implemented for [`TrajectorySet`]. -//! It provides: -//! - Constructors that **create** a new set from a given source (`new_from_*`), -//! - Appenders that **extend** an existing set (`add_from_*`), -//! - Convenience methods to ingest **in-memory batches** (single observer) via -//! [`ObservationBatch`]. -//! -//! Internally, ingestion from in-memory batches uses a crate-private routine -//! `observation_from_batch` (unit/scale/caching logic). End users should interact only -//! with the public `new_from_vec` / `add_from_vec` methods. -//! -//! ## Data model -//! ----------------- -//! - A [`TrajectorySet`] is a `HashMap` storing a -//! time-ordered list of astrometric observations per object. -//! - [`ObservationBatch`] is a thin container (borrowed/owned) for angle-only astrometry -//! from a **single observer** with uniform uncertainties; it is expanded into concrete -//! [`Observation`](crate::observations::Observation)s and grouped by `trajectory_id`. -//! - Batch IOD returns a -//! [`FullOrbitResult`](crate::trajectories::trajectory_fit::FullOrbitResult), i.e. a map -//! `ObjectNumber → Result<(Option, f64), OutfitError>`. -//! -//! ## Ingestion sources & signatures -//! ----------------- -//! **MPC 80-column** -//! - [`TrajectoryFile::new_from_80col`] → `Self` -//! Reads a file, extracts `(Observations, ObjectNumber)` and **inserts** into a new set. -//! **Panics** on extraction failure (internal `expect`). -//! - [`TrajectoryFile::add_from_80col`] → `()` -//! Reads and **inserts** into an existing set. **Panics** on extraction failure. -//! -//! **Parquet** (`"ra"`, `"dec"`, `"jd"`, `"trajectory_id"`) -//! - [`TrajectoryFile::new_from_parquet`] → `Result` -//! Creates a new set; errors are propagated. -//! - [`TrajectoryFile::add_from_parquet`] → `Result<(), OutfitError>` -//! Appends to an existing set; errors are propagated. -//! *Units on disk:* `ra/dec` in **degrees**, `jd` in **JD (TT)**. Internally converted to -//! **radians** and **MJD (TT)** (via [`JDTOMJD`](crate::constants::JDTOMJD)). Per-file -//! uncertainties are passed in **arcseconds**. -//! -//! **ADES (MPC XML/JSON)** -//! - [`TrajectoryFile::new_from_ades`] → `Self` -//! - [`TrajectoryFile::add_from_ades`] → `()` -//! Both delegate to `parse_ades` and **do not return a `Result`** (errors are handled -//! inside the parser or may panic depending on its policy). -//! -//! **In-memory batches (single observer)** -//! - [`TrajectoryFile::new_from_vec`] → `Result` -//! - [`TrajectoryFile::add_from_vec`] → `Result<(), OutfitError>` -//! Expand an [`ObservationBatch`] (RA/DEC/σ in **radians**, epochs in **MJD (TT)**) -//! into per-sample [`Observation`](crate::observations::Observation)s using the shared -//! [`Outfit`] state and **append/group** by `trajectory_id`. -//! -//! ## Units & time scales -//! ----------------- -//! - **Angles**: internal [`Observation`](crate::observations::Observation)s store RA/DEC in **radians**. -//! Parquet/80-column/ADES readers perform degree→radian conversions as needed. -//! - **Uncertainties**: expected in **arcseconds** at call-site for Parquet/ADES; for -//! in-memory batches they must already be in **radians** (uniform per batch). -//! - **Times**: internal epochs are **MJD (TT)**. Parquet `"jd"` values are assumed **TT** -//! and converted via [`JDTOMJD`](crate::constants::JDTOMJD). 80-col/ADES readers apply their respective conversions. -//! -//! ## Duplicates & ordering -//! ----------------- -//! - **No deduplication** is performed by any `add_*` method. Users must avoid re-ingesting -//! the same file/batch twice if duplicates are undesirable. -//! - Observations are stored **as provided**; ordering by time is not enforced here. -//! -//! ## Error semantics -//! ----------------- -//! - Methods returning `Result<_, OutfitError>` propagate I/O/schema/ephemeris errors. -//! - `new_from_80col` / `add_from_80col` use `expect(...)` internally and therefore may **panic** -//! on parse/read failures (fail-fast behavior). -//! - `new_from_ades` / `add_from_ades` currently **do not** return a `Result`; error handling -//! is delegated to `parse_ades` (which may log or panic depending on implementation). -//! -//! ## Batch IOD -//! ----------------- -//! Use [`crate::trajectories::trajectory_fit::TrajectoryFit::estimate_all_orbits`] to run the -//! full Gauss IOD over each `(ObjectNumber → Observations)` pair. Outcomes per object: -//! - `Ok(Some(GaussResult))` + RMS — a viable preliminary/corrected orbit, -//! - `Ok(None)` — pipeline executed but no acceptable solution kept, -//! - `Err(OutfitError)` — failure **isolated** to that object. -//! -//! ## Example -//! ----------------- -//! ```no_run -//! use std::sync::Arc; -//! use camino::Utf8Path; -//! use rand::SeedableRng; -//! use outfit::outfit::Outfit; -//! use outfit::observers::Observer; -//! use outfit::trajectories::trajectory_file::TrajectoryFile; -//! use outfit::TrajectoryFit; -//! use outfit::initial_orbit_determination::IODParams; -//! use outfit::TrajectorySet; -//! -//! # fn demo() -> Result<(), outfit::outfit_errors::OutfitError> { -//! let mut state = Outfit::new("horizon:DE440", outfit::error_models::ErrorModel::FCCT14)?; -//! let observer: Arc = state.get_observer_from_mpc_code(&"I41".into()); -//! -//! // 1) From Parquet (propagates errors) -//! let mut trajs: TrajectorySet = TrajectorySet::new_from_parquet( -//! &mut state, -//! Utf8Path::new("observations.parquet"), -//! observer.clone(), -//! 0.5, 0.5, -//! Some(8192), -//! )?; -//! -//! // 2) From MPC 80-column (may panic on parse error) -//! trajs.add_from_80col(&mut state, Utf8Path::new("obs_80col.txt")); -//! -//! // 3) Run batch IOD -//! let mut rng = rand::rngs::StdRng::from_os_rng(); -//! let params = IODParams::builder().max_triplets(32).build()?; -//! let results = trajs.estimate_all_orbits(&state, &mut rng, ¶ms); -//! # Ok(()) } -//! ``` -//! -//! ## See also -//! ------------ -//! * [`TrajectoryFile`] – Public ingestion API surface. -//! * [`ObservationBatch`] – Zero-copy batch container (single observer). -//! * [`crate::trajectories::trajectory_fit::TrajectoryFit::estimate_all_orbits`] – Batch Gauss IOD. -//! * [`Outfit`] – Ephemerides, reference frames, and observer registry. -use std::{collections::HashMap, sync::Arc}; - -use super::batch_reader::observation_from_batch; -use crate::constants::ArcSec; -use crate::observers::Observer; -use crate::outfit::Outfit; -use crate::outfit_errors::OutfitError; -use crate::trajectories::batch_reader::ObservationBatch; -use crate::TrajectorySet; -use camino::Utf8Path; - -use super::ades_reader::parse_ades; -use super::mpc_80col_reader::extract_80col; -use super::parquet_reader::parquet_to_trajset; - -/// A trait for the TrajectorySet type definition. -/// This trait provides methods to create a TrajectorySet from different sources. -/// It allows to create a TrajectorySet from an 80 column file, a parquet file, or an ADES file. -/// It also allows to add observations to an existing TrajectorySet from these sources. -/// The methods are: -/// * `from_80col`: Create a TrajectorySet from an 80 column file. -/// * `add_80col`: Add observations to a TrajectorySet from an 80 column file. -/// * `new_from_vec`: Create a TrajectorySet from a vector of observations. -/// * `add_from_vec`: Add observations to a TrajectorySet from a vector of observations. -/// * `new_from_parquet`: Create a TrajectorySet from a parquet file. -/// * `add_from_parquet`: Add observations to a TrajectorySet from a parquet file. -/// * `new_from_ades`: Create a TrajectorySet from an ADES file. -/// * `add_from_ades`: Add observations to a TrajectorySet from an ADES file. -/// -/// Note -/// ---- -/// * Warning: No check is done for duplicated observations for every add method. -/// * The user shoud be careful to not add the same observation or same file twice -pub trait TrajectoryFile { - /// Create a TrajectorySet from an 80 column file - /// The trajectory are added in place in the TrajectorySet. - /// If a trajectory id already exists, the observations are added to the existing trajectory. - /// - /// Arguments - /// --------- - /// * `env_state`: a mutable reference to the Outfit instance - /// * `colfile`: a path to an 80 column file - /// - /// Return - /// ------ - /// * a TrajectorySet containing the observations from the 80 column file - /// - /// Note - /// ---- - /// * The 80 column file must respect the MPC format. - /// * ref: - fn new_from_80col(env_state: &mut Outfit, colfile: &Utf8Path) -> Self; - - /// Add a set of trajectories from an 80 column file to a TrajectorySet - /// The trajectory are added in place in the TrajectorySet. - /// If a trajectory id already exists, the observations are added to the existing trajectory. - /// - /// Arguments - /// --------- - /// * `env_state`: a mutable reference to the Outfit instance - /// * `colfile`: a path to an 80 column file - /// - /// Note - /// ---- - /// * The 80 column file must respect the MPC format. - /// * ref: - fn add_from_80col(&mut self, env_state: &mut Outfit, colfile: &Utf8Path); - - /// Create a new [`TrajectorySet`] from a batch of observations taken by a single observer. - /// - /// This constructor consumes an [`ObservationBatch`] and groups its observations - /// into trajectories, keyed by their `trajectory_id`. - /// Each observation in the batch must have been recorded by the **same observer**, - /// but may belong to **different objects** (distinguished by `trajectory_id`). - /// - /// Arguments - /// ----------------- - /// * `env_state` — Mutable reference to the global [`Outfit`] state (used for ephemerides, UT1, etc.). - /// * `batch` — An [`ObservationBatch`] containing RA/DEC/epoch values (radians + MJD/TT) and trajectory IDs. - /// * `observer` — The observer that recorded all observations in the batch. - /// - /// Return - /// ----------------- - /// * `Ok(Self)` — A new [`TrajectorySet`] containing one or more trajectories populated from the batch. - /// * `Err(OutfitError)` — If observation construction or position computations fail. - /// - /// Invariants - /// ----------------- - /// * `batch.trajectory_id.len() == batch.ra.len() == batch.dec.len() == batch.time.len()` - /// * Angles and uncertainties in the batch must already be in **radians**. - /// - /// Example - /// ----------------- - /// ```rust, no_run - /// # use outfit::trajectories::batch_reader::ObservationBatch; - /// # use outfit::TrajectorySet; - /// # use outfit::TrajectoryFile; - /// # use outfit::{Outfit, ErrorModel}; - /// # use std::sync::Arc; - /// # let mut env = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); - /// # let observer = env.get_observer_from_mpc_code(&"I41".to_string()); - /// # let (traj_id, ra_deg, dec_deg, mjd) = (vec![0, 0, 1], vec![14.62, 14.63, 15.01], vec![9.98, 10.01, 11.02], vec![43785.35, 43785.36, 43785.40]); - /// let batch = ObservationBatch::from_degrees_owned(&traj_id, &ra_deg, &dec_deg, 0.5, 0.5, &mjd); - /// - /// // Build a trajectory set directly from the batch: - /// let ts = TrajectorySet::new_from_vec(&mut env, &batch, observer).unwrap(); - /// ``` - fn new_from_vec( - env_state: &mut Outfit, - batch: &ObservationBatch<'_>, - observer: Arc, - ) -> Result - where - Self: Sized; - - /// Add the observations from a batch to an existing [`TrajectorySet`]. - /// - /// This method inserts all observations from the provided [`ObservationBatch`] into - /// the current set, grouping them into trajectories by `trajectory_id`. - /// Each observation in the batch must have been recorded by the **same observer**, - /// but may belong to multiple distinct objects. - /// - /// Arguments - /// ----------------- - /// * `env_state` — Mutable reference to the global [`Outfit`] state (used for ephemerides, UT1, etc.). - /// * `batch` — An [`ObservationBatch`] containing RA/DEC/epoch values (radians + MJD/TT) and trajectory IDs. - /// * `observer` — The observer that recorded all observations in the batch. - /// - /// Return - /// ----------------- - /// * `Ok(())` — If all observations were successfully inserted into the `TrajectorySet`. - /// * `Err(OutfitError)` — If observation construction or position computations fail. - /// - /// Example - /// ----------------- - /// ```rust, no_run - /// use outfit::trajectories::batch_reader::ObservationBatch; - /// use outfit::TrajectorySet; - /// use outfit::TrajectoryFile; - /// use outfit::{Outfit, ErrorModel}; - /// use std::sync::Arc; - /// use ahash::RandomState; - /// use std::collections::HashMap; - /// - /// let mut env = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); - /// let observer = env.get_observer_from_mpc_code(&"I41".to_string()); - /// let (traj_id, ra_deg, dec_deg, mjd) = (vec![0, 0, 1], vec![14.62, 14.63, 15.01], vec![9.98, 10.01, 11.02], vec![43785.35, 43785.36, 43785.40]); - /// let batch = ObservationBatch::from_degrees_owned(&traj_id, &ra_deg, &dec_deg, 0.5, 0.5, &mjd); - /// - /// let mut ts = HashMap::with_hasher(RandomState::new()); - /// ts.add_from_vec(&mut env, &batch, observer).unwrap(); - /// ``` - fn add_from_vec( - &mut self, - env_state: &mut Outfit, - batch: &ObservationBatch<'_>, - observer: Arc, - ) -> Result<(), OutfitError>; - - /// Create a new [`TrajectorySet`] from a Parquet file. - /// - /// This function reads a Parquet file containing astrometric observations - /// and constructs a full [`TrajectorySet`]. Each observation is associated - /// with the provided `observer` and assigned constant uncertainties in - /// right ascension and declination. - /// - /// Arguments - /// ----------------- - /// * `env_state` – Global environment providing ephemerides, UT1 provider, and observer mapping. - /// * `parquet` – Path to the input Parquet file. - /// * `observer` – Observer metadata (shared reference, resolved once to a compact id). - /// * `error_ra` – 1-σ uncertainty in right ascension \[arcsec\], applied uniformly. - /// * `error_dec` – 1-σ uncertainty in declination \[arcsec\], applied uniformly. - /// * `batch_size` – Record batch size for Parquet reader; defaults to 2048 if `None`. - /// - /// Return - /// ---------- - /// * `Ok(TrajectorySet)` – A new set of trajectories populated from the file. - /// * `Err(OutfitError)` – If the file cannot be opened, parsed, or contains invalid data. - /// - /// Notes - /// ---------- - /// * The Parquet file must contain the following columns: `"ra"`, `"dec"`, `"jd"`, `"trajectory_id"`. - /// * The `"jd"` values are assumed to be in TT scale and are converted internally to MJD via [`JDTOMJD`](crate::constants::JDTOMJD). - /// * The `ra` and `dec` columns have to be in degrees and of type `Float64`. - /// * The `jd` column has to be in Julian Date (TT) and of type `Float64`. - /// * The `trajectory_id` column has to be of type `UInt32` and is used to group - /// observations by object. - /// - /// See also - /// ------------ - /// * [`add_from_parquet`](crate::trajectories::trajectory_file::TrajectoryFile::add_from_parquet) – Adds observations from a Parquet file to an existing set. - fn new_from_parquet( - env_state: &mut Outfit, - parquet: &Utf8Path, - mpc_code: Arc, - error_ra: ArcSec, - error_dec: ArcSec, - batch_size: Option, - ) -> Result - where - Self: Sized; - - /// Add observations from a Parquet file to an existing [`TrajectorySet`]. - /// - /// This function appends new observations (grouped by `trajectory_id`) - /// to the current set. The same `observer` and astrometric uncertainties - /// are applied to all ingested rows. - /// - /// Arguments - /// ----------------- - /// * `env_state` – Global environment providing ephemerides, UT1 provider, and observer mapping. - /// * `parquet` – Path to the input Parquet file. - /// * `observer` – Observer metadata (shared reference, resolved once to a compact id). - /// * `error_ra` – 1-σ uncertainty in right ascension \[arcsec\], applied uniformly. - /// * `error_dec` – 1-σ uncertainty in declination \[arcsec\], applied uniformly. - /// * `batch_size` – Record batch size for Parquet reader; defaults to 2048 if `None`. - /// - /// Return - /// ---------- - /// * `Ok(())` – On successful ingestion, with the internal set updated in place. - /// * `Err(OutfitError)` – If the file cannot be opened, parsed, or contains invalid data. - /// - /// Notes - /// ---------- - /// * The Parquet file must contain the following columns: `"ra"`, `"dec"`, `"jd"`, `"trajectory_id"`. - /// * The `"jd"` values are assumed to be in TT scale and are converted internally to MJD via [`JDTOMJD`](crate::constants::JDTOMJD). - /// * The `ra` and `dec` columns have to be in degrees and of type `Float64`. - /// * The `jd` column has to be in Julian Date (TT) and of type `Float64`. - /// * The `trajectory_id` column has to be of type `UInt32` and is used to group - /// observations by object. - /// - /// See also - /// ------------ - /// * [`new_from_parquet`](crate::trajectories::trajectory_file::TrajectoryFile::new_from_parquet) – Creates a brand new set from a Parquet file. - fn add_from_parquet( - &mut self, - env_state: &mut Outfit, - parquet: &Utf8Path, - observer: Arc, - error_ra: ArcSec, - error_dec: ArcSec, - batch_size: Option, - ) -> Result<(), OutfitError>; - - /// Add a set of trajectories to a TrajectorySet from an ADES file - /// - /// Arguments - /// --------- - /// * `env_state`: a mutable reference to the Outfit instance - /// * `ades`: a path to an ADES file - /// * `error_ra`: the error in right ascension (if some values are given, the error ra is supposed to be the same for all observations) - /// * `error_dec`: the error in declination (if some values are given, the error dec is supposed to be the same for all observations) - /// - /// Note - /// ---- - /// * The ADES file must respect the MPC format. - /// * ref: - fn new_from_ades( - env_state: &mut Outfit, - ades: &Utf8Path, - error_ra: Option, - error_dec: Option, - ) -> Self; - - /// Create a TrajectorySet from an ADES file - /// - /// Arguments - /// --------- - /// * `env_state`: a mutable reference to the Outfit instance - /// * `ades`: a path to an ADES file - /// * `error_ra`: the error in right ascension (if some values are given, the error ra is supposed to be the same for all observations) - /// * `error_dec`: the error in declination (if some values are given, the error dec is supposed to be the same for all observations) - /// - /// Return - /// ------ - /// * a TrajectorySet containing the observations from the ADES file - /// - /// Note - /// ---- - /// * The ADES file must respect the MPC format. - /// * ref: - fn add_from_ades( - &mut self, - env_state: &mut Outfit, - ades: &Utf8Path, - error_ra: Option, - error_dec: Option, - ); -} - -impl TrajectoryFile for TrajectorySet { - fn new_from_vec( - env_state: &mut Outfit, - batch: &ObservationBatch<'_>, - observer: Arc, - ) -> Result { - let mut traj_set: TrajectorySet = HashMap::default(); - observation_from_batch(&mut traj_set, env_state, batch, observer)?; - Ok(traj_set) - } - - fn add_from_vec( - &mut self, - env_state: &mut Outfit, - batch: &ObservationBatch<'_>, - observer: Arc, - ) -> Result<(), OutfitError> { - observation_from_batch(self, env_state, batch, observer)?; - Ok(()) - } - - fn add_from_parquet( - &mut self, - env_state: &mut Outfit, - parquet: &Utf8Path, - observer: Arc, - error_ra: ArcSec, - error_dec: ArcSec, - batch_size: Option, - ) -> Result<(), OutfitError> { - parquet_to_trajset( - self, env_state, parquet, observer, error_ra, error_dec, batch_size, - ) - } - - fn new_from_parquet( - env_state: &mut Outfit, - parquet: &Utf8Path, - observer: Arc, - error_ra: ArcSec, - error_dec: ArcSec, - batch_size: Option, - ) -> Result - where - Self: Sized, - { - let mut trajs: TrajectorySet = HashMap::default(); - parquet_to_trajset( - &mut trajs, env_state, parquet, observer, error_ra, error_dec, batch_size, - )?; - Ok(trajs) - } - - fn new_from_80col(env_state: &mut Outfit, colfile: &Utf8Path) -> Self { - let mut traj_set: TrajectorySet = HashMap::default(); - let (observations, object_number) = - extract_80col(env_state, colfile).expect("Failed to extract 80col data"); - traj_set.insert(object_number, observations); - traj_set - } - - fn add_from_80col(&mut self, env_state: &mut Outfit, colfile: &Utf8Path) { - let (observations, object_number) = - extract_80col(env_state, colfile).expect("Failed to extract 80col data"); - self.insert(object_number, observations); - } - - fn add_from_ades( - &mut self, - env_state: &mut Outfit, - ades: &Utf8Path, - error_ra: Option, - error_dec: Option, - ) { - parse_ades(env_state, ades, self, error_ra, error_dec); - } - - fn new_from_ades( - env_state: &mut Outfit, - ades: &Utf8Path, - error_ra: Option, - error_dec: Option, - ) -> Self { - let mut trajs: TrajectorySet = HashMap::default(); - parse_ades(env_state, ades, &mut trajs, error_ra, error_dec); - trajs - } -} diff --git a/src/trajectories/trajectory_fit.rs b/src/trajectories/trajectory_fit.rs deleted file mode 100644 index 15f2d89..0000000 --- a/src/trajectories/trajectory_fit.rs +++ /dev/null @@ -1,1596 +0,0 @@ -//! # Batch Gauss IOD over Trajectory Sets -//! -//! Run a full **Gauss-based Initial Orbit Determination (IOD)** over a -//! [`TrajectorySet`], collect **per-object outcomes**, and expose convenience -//! helpers to query or extract solutions and summarize observation counts. -//! -//! ## Overview -//! ----------------- -//! A [`TrajectorySet`] maps each [`ObjectNumber`] to its time-ordered -//! [`Observations`]. This module implements the [`TrajectoryFit`] trait on -//! `TrajectorySet`, providing: -//! -//! * `estimate_all_orbits` – run the Gauss IOD pipeline on **every object**, -//! * `estimate_all_orbits_with_cancel` – same, with **cooperative cancellation**, -//! * `total_observations` / `number_of_trajectories` – quick set-level metrics, -//! * `obs_count_stats` – summary statistics on observation counts, -//! * `gauss_result_for` / `take_gauss_result` – ergonomic access to results. -//! -//! All objects are processed with the same [`Outfit`] state (ephemerides, error -//! model, frames), a caller-provided RNG, and a single [`IODParams`] configuration. -//! -//! ## Result Model -//! ----------------- -//! Batch outcomes are returned as a [`FullOrbitResult`]: -//! -//! ```text -//! ObjectNumber → Result<(GaussResult, rms: f64), OutfitError> -//! ``` -//! -//! * `Ok((GaussResult, rms))` – the best preliminary/corrected orbit and its RMS -//! of normalized astrometric residuals, -//! * `Err(OutfitError)` – a failure **isolated** to that object (other objects -//! continue to be processed). -//! -//! Use [`gauss_result_for`] to **borrow** a solution and its RMS, or -//! [`take_gauss_result`] to **move** them out of the map. -//! -//! ## Execution Modes -//! ----------------- -//! ### Progress UI (feature: `progress`) -//! When compiled with the `progress` feature, `estimate_all_orbits` renders a -//! live progress bar (via `indicatif`) and reports per-iteration timing via -//! a lightweight moving average to help diagnose throughput bottlenecks. -//! -//! ### Cooperative cancellation -//! `estimate_all_orbits_with_cancel` periodically calls a user-provided -//! closure `should_cancel()` based on **wall-clock intervals** (not iteration -//! counts) to keep cancellation latency stable even if some objects are slow. -//! -//! ## Performance Notes -//! ----------------- -//! * The loop walks the underlying map once; overall time scales with the number -//! of objects × the cost of `ObservationIOD::estimate_best_orbit` (triplet -//! enumeration, scoring, optional correction). -//! * Results are accumulated in a `HashMap` that uses `ahash::RandomState`, -//! matching the default hasher used elsewhere in the crate. -//! * No mutation of the observations themselves; only per-object IOD is performed. -//! -//! ## Error Semantics -//! ----------------- -//! * Failures are **per-object**: an error for one object does **not** abort -//! the batch. -//! * The returned map contains **one entry per processed object**, -//! each entry being either `Ok((GaussResult, rms))` or `Err(OutfitError)`. -//! -//! ## Examples -//! ----------------- -//! Minimal end-to-end run (no progress UI): -//! -//! ```rust,no_run -//! use rand::SeedableRng; -//! use outfit::{Outfit, TrajectorySet}; -//! use outfit::initial_orbit_determination::IODParams; -//! use outfit::trajectories::trajectory_fit::TrajectoryFit; -//! -//! # fn demo(mut trajs: TrajectorySet) -> Result<(), outfit::outfit_errors::OutfitError> { -//! let state = Outfit::new("horizon:DE440", outfit::error_models::ErrorModel::FCCT14)?; -//! let mut rng = rand::rngs::StdRng::from_os_rng(); -//! let params = IODParams::builder().max_triplets(32).build()?; -//! -//! let results = trajs.estimate_all_orbits(&state, &mut rng, ¶ms); -//! for (obj, res) in &results { -//! match res { -//! Ok((g, rms)) => eprintln!("{obj:?}: orbit={} rms={:.4}", g, rms), -//! Err(e) => eprintln!("{obj:?}: error={e}"), -//! } -//! } -//! # Ok(()) } -//! ``` -//! -//! Cooperative cancellation (poll every ~20 ms): -//! -//! ```rust,no_run -//! use std::sync::atomic::{AtomicBool, Ordering}; -//! use outfit::trajectories::trajectory_fit::TrajectoryFit; -//! -//! # fn cancelable(mut trajs: outfit::TrajectorySet, -//! # state: &outfit::Outfit, -//! # rng: &mut impl rand::Rng, -//! # params: &outfit::IODParams, -//! # ) -> outfit::trajectories::trajectory_fit::FullOrbitResult { -//! let stop = AtomicBool::new(false); -//! // … flip `stop` from another thread / signal handler … -//! -//! trajs.estimate_all_orbits_with_cancel(state, rng, params, || stop.load(Ordering::Relaxed)) -//! # } -//! ``` -//! -//! Quick stats for logging/reporting: -//! -//! ```rust -//! use outfit::trajectories::trajectory_fit::TrajectoryFit; -//! -//! fn summarize(set: &outfit::TrajectorySet) { -//! let n_obj = set.number_of_trajectories(); -//! let n_obs = set.total_observations(); -//! if let Some(stats) = set.obs_count_stats() { -//! eprintln!("Trajectories: {n_obj}, Observations: {n_obs}"); -//! eprintln!("{:#}", stats); -//! } -//! } -//! ``` -//! -//! ## See also -//! ------------ -//! * [`TrajectoryFit`] – Trait implemented by `TrajectorySet` for batch IOD and stats. -//! * [`ObservationIOD::estimate_best_orbit`] – Per-object Gauss IOD (called internally). -//! * [`GaussResult`] – Preliminary/corrected orbit container. -//! * [`IODParams`] – Tuning for triplet generation, scoring, correction. -//! * [`gauss_result_for`] / [`take_gauss_result`] – Accessors for the `FullOrbitResult` map. -use std::{collections::HashMap, fmt}; - -use ahash::RandomState; -use rand::Rng; - -use crate::{ - constants::Observations, GaussResult, IODParams, ObjectNumber, ObservationIOD, Outfit, - OutfitError, TrajectorySet, -}; - -use std::time::{Duration, Instant}; - -#[cfg(feature = "progress")] -use super::progress_bar::IterTimer; -#[cfg(feature = "progress")] -use indicatif::{ProgressBar, ProgressStyle}; - -#[cfg(feature = "parallel")] -use rayon::prelude::*; -#[cfg(feature = "parallel")] -use std::{ - hash::{Hash, Hasher}, - mem, -}; - -/// Full batch orbit determination results. -/// -/// Each entry maps an [`ObjectNumber`] to the outcome of a full -/// Initial Orbit Determination (IOD) attempt on its set of observations. -/// -/// Internally, this is implemented as: -/// -/// ```ignore -/// HashMap, RandomState> -/// ``` -/// -/// Return semantics -/// ----------------- -/// * `Ok((GaussResult, f64))` – a successful IOD with its RMS of normalized residuals. -/// * `Err(OutfitError)` – a failure isolated to that object. -pub type FullOrbitResult = - HashMap, RandomState>; - -/// Borrow a Gauss solution (if any) and its RMS for a given key. -/// -/// Arguments -/// ----------------- -/// * `all`: The map of all IOD outcomes. -/// * `key`: The object identifier. -/// -/// Return -/// ---------- -/// * `Ok(Some((&GaussResult, f64)))` – a solution is present for the key. -/// * `Ok(None)` – key absent. -/// * `Err(&OutfitError)` – the IOD attempt failed for that key. -/// -/// See also -/// ------------ -/// * [`GaussResult`] – Gauss IOD output structure. -pub fn gauss_result_for<'a>( - all: &'a FullOrbitResult, - key: &ObjectNumber, -) -> Result, &'a OutfitError> { - match all.get(key) { - None => Ok(None), - Some(Err(e)) => Err(e), - Some(Ok((g, rms))) => Ok(Some((g, *rms))), - } -} - -/// Take ownership of the solution for `key`, removing it from the map. -/// -/// Arguments -/// ----------------- -/// * `all`: The map of all IOD outcomes (consumed entry will be removed). -/// * `key`: The object identifier to extract. -/// -/// Return -/// ---------- -/// * `Ok(Some((GaussResult, f64)))` – ownership of the solution and its RMS. -/// * `Ok(None)` – key absent. -/// * `Err(OutfitError)` – the IOD attempt failed for that key. -/// -/// See also -/// ------------ -/// * [`gauss_result_for`] – Borrowing accessor. -pub fn take_gauss_result( - all: &mut FullOrbitResult, - key: &ObjectNumber, -) -> Result, OutfitError> { - match all.remove(key) { - None => Ok(None), - Some(Err(e)) => Err(e), - Some(Ok((g, rms))) => Ok(Some((g, rms))), - } -} - -/// Summary statistics for per-trajectory observation counts. -/// -/// Each [`TrajectorySet`] entry (one object) has an associated -/// [`Observations`] container. This structure stores basic distribution -/// statistics on the **number of observations per trajectory**, as -/// returned by [`obs_count_stats`](crate::trajectories::trajectory_fit::TrajectoryFit::obs_count_stats). -/// -/// Fields -/// ----------------- -/// * `min` – smallest number of observations in any trajectory. -/// * `p25` – 25th percentile (first quartile) of observation counts. -/// * `median` – 50th percentile (second quartile). -/// * `p95` – 95th percentile, indicating the upper tail of the distribution. -/// * `max` – largest number of observations in any trajectory. -/// -/// Percentiles are computed using the *nearest-rank* method: -/// the index is `round(q × (N-1))` for quantile `q ∈ [0,1]`, clamped to valid range. -/// This convention makes results stable even for small sample sizes. -/// -/// Display -/// ----------------- -/// * `format!("{}", stats)` – compact single-line summary, e.g.: -/// ```text -/// min=2, p25=4, median=8, p95=15, max=20 -/// ``` -/// -/// * `format!("{:#}", stats)` – pretty multi-line table, e.g.: -/// ```text -/// Observation count per trajectory — summary -/// ----------------------------------------- -/// min : 2 -/// p25 : 4 -/// median : 8 -/// p95 : 15 -/// max : 20 -/// ``` -/// -/// See also -/// ------------ -/// * [`obs_count_stats`](crate::trajectories::trajectory_fit::TrajectoryFit::obs_count_stats) – Computes these statistics from a [`TrajectorySet`]. -#[derive(Debug, Clone, Copy)] -pub struct ObsCountStats { - pub min: usize, - pub p25: usize, - pub median: usize, - pub p95: usize, - pub max: usize, -} - -impl fmt::Display for ObsCountStats { - /// Compact by default; pretty multi-line when using the alternate flag (`{:#}`). - /// - /// See also - /// ------------ - /// * [`obs_count_stats`](crate::trajectories::trajectory_fit::TrajectoryFit::obs_count_stats) – Builder of these summary statistics. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - if f.alternate() { - // Pretty, multi-line, aligned output (ASCII-only for portability). - writeln!(f, "Observation count per trajectory — summary")?; - writeln!(f, "-----------------------------------------")?; - writeln!(f, "min : {}", self.min)?; - writeln!(f, "p25 : {}", self.p25)?; - writeln!(f, "median : {}", self.median)?; - writeln!(f, "p95 : {}", self.p95)?; - write!(f, "max : {}", self.max) - } else { - // Compact single-line for logs and quick prints. - write!( - f, - "min={}, p25={}, median={}, p95={}, max={}", - self.min, self.p25, self.median, self.p95, self.max - ) - } - } -} - -// ============================================================================ -// Factorized core + progress abstraction + cancel config -// ============================================================================ - -/// Cancellation guard polled at fixed wall-clock intervals. -/// -/// A `CancelCfg` lets the main loop periodically check whether the user -/// or an external controller has requested an early stop. The loop itself -/// decides *when* to poll based on the `interval`, and *how* to react -/// based on the `should_cancel` callback. -/// -/// Arguments -/// ----------------- -/// * `interval`: Minimum wall-clock delay between two cancellation checks. -/// This prevents the loop from calling the callback at every -/// iteration, which would be too costly. -/// * `should_cancel`: User-provided closure returning `true` when cancellation -/// is requested. If `true`, the loop terminates gracefully. -/// -/// See also -/// ------------ -/// * [`estimate_all_orbits_core`] – Main iteration loop that evaluates this configuration. -struct CancelCfg { - interval: Duration, - should_cancel: F, -} - -/// Abstract interface for reporting progress to the outside world. -/// -/// The purpose of this trait is to **decouple the heavy numerical loop** -/// from any particular UI backend. The core orbit determination logic -/// always calls into a `ProgressSink`, but the actual implementation -/// depends on the build: -/// -/// * with the `progress` feature, it is backed by an [`indicatif`] progress bar, -/// * otherwise, a no-op implementation is used, so the loop compiles without UI. -/// -/// This abstraction ensures that the loop has a consistent lifecycle: -/// 1. [`start`] is called once with the total number of objects. -/// 2. [`on_iter`] is called at the beginning of each iteration (e.g. to refresh messages). -/// 3. [`inc`] is called once per completed iteration. -/// 4. [`on_interrupt`] is called right before exiting due to cancellation. -/// 5. [`finish`] is always called at the end, successful or not. -/// -/// By default, all methods are no-ops, so implementors only override the -/// subset they need. -trait ProgressSink { - /// Called once before entering the main loop, with the total number of items. - fn start(&mut self, _total: u64) {} - /// Called at the beginning of each iteration (e.g., refresh UI or logs). - fn on_iter(&mut self) {} - /// Increment the progress by one step. - fn inc(&mut self) {} - /// Called once if the loop exits because of cancellation. - fn on_interrupt(&mut self) {} - /// Called once at the very end, regardless of success or cancellation. - fn finish(&mut self) {} -} - -/// Default no-op implementation, used when the `progress` feature is disabled. -impl ProgressSink for () {} - -/// Blanket implementation so that `&mut T` also implements [`ProgressSink`]. -/// -/// This lets tests pass `&mut MockProgress` directly, while the core API -/// continues to accept progress sinks by value. -impl ProgressSink for &mut T { - #[inline] - fn start(&mut self, total: u64) { - (**self).start(total) - } - #[inline] - fn on_iter(&mut self) { - (**self).on_iter() - } - #[inline] - fn inc(&mut self) { - (**self).inc() - } - #[inline] - fn on_interrupt(&mut self) { - (**self).on_interrupt() - } - #[inline] - fn finish(&mut self) { - (**self).finish() - } -} - -/// Concrete type selected depending on the `progress` feature: -/// * [`IndicatifProgress`] when enabled, -/// * [`()`] (no-op) when disabled. -#[cfg(feature = "progress")] -type ProgressImpl = IndicatifProgress; -#[cfg(not(feature = "progress"))] -type ProgressImpl = (); - -/// Central loop that runs orbit estimation for each trajectory. -/// -/// This function is the **engine** behind the public APIs: -/// [`TrajectoryFit::estimate_all_orbits`] and -/// [`TrajectoryFit::estimate_all_orbits_with_cancel`]. -/// -/// It consumes a [`TrajectorySet`] and tries to estimate the best orbit -/// for each contained object. Along the way it reports progress, and it -/// may stop early if the provided cancellation config triggers. -/// -/// Arguments -/// ----------------- -/// * `set`: The trajectory set to process (mutable, results are inserted). -/// * `state`: Global environment providing ephemerides, constants, and frames. -/// * `rng`: Random number generator used for noisy triplet realizations. -/// * `params`: IOD parameters controlling triplet generation and scoring. -/// * `cancel`: Optional cancellation guard (poll interval + callback). -/// * `progress`: Progress reporting sink (indicatif bar or no-op). -/// -/// Return -/// ---------- -/// * A [`FullOrbitResult`], i.e. a map from object → `Ok((GaussResult, rms))` -/// or `Err(OutfitError)` depending on whether orbit estimation succeeded. -/// -/// See also -/// ------------ -/// * [`TrajectoryFit::estimate_all_orbits`] – Public API without cancellation. -/// * [`TrajectoryFit::estimate_all_orbits_with_cancel`] – Public API with cancellation. -fn estimate_all_orbits_core( - set: &mut TrajectorySet, - state: &Outfit, - rng: &mut impl Rng, - params: &IODParams, - mut cancel: Option>, - mut progress: P, -) -> FullOrbitResult -where - F: FnMut() -> bool, - P: ProgressSink, -{ - let total = set.len() as u64; - progress.start(total.max(1)); - - let mut results: FullOrbitResult = HashMap::default(); - let mut last_poll = Instant::now(); - - for (obj, observations) in set.iter_mut() { - // --- Timer-based cancellation (if configured) - if let Some(CancelCfg { - interval, - should_cancel, - }) = cancel.as_mut() - { - if last_poll.elapsed() >= *interval { - if should_cancel() { - progress.on_interrupt(); - break; - } - last_poll = Instant::now(); - } - } - - progress.on_iter(); - - // Core work - let res = observations.estimate_best_orbit(state, &state.error_model, rng, params); - results.insert(obj.clone(), res); - - progress.inc(); - } - - progress.finish(); - results -} - -// --------------------------- Progress (indicatif) ---------------------------- -#[cfg(feature = "progress")] -mod progress_impl { - use super::IterTimer; - use super::ProgressSink; - use crate::trajectories::progress_bar::fmt_dur; - - /// Progress sink backed by `indicatif`. - /// - /// See also - /// ------------ - /// * [`estimate_all_orbits_core`] – Calls into this sink at key lifecycle moments. - pub(super) struct IndicatifProgress { - pb: super::ProgressBar, - it_timer: IterTimer, - } - - impl Default for IndicatifProgress { - fn default() -> Self { - // The actual length is set in `start()`. - let pb = super::ProgressBar::new(1); - Self { - pb, - it_timer: IterTimer::new(0.2), - } - } - } - - impl ProgressSink for IndicatifProgress { - fn start(&mut self, total: u64) { - self.pb.set_length(total.max(1)); - self.pb.set_style( - super::ProgressStyle::with_template( - "{bar:40.cyan/blue} {pos}/{len} ({percent:>3}%) \ - | {per_sec} | ETA {eta_precise} | {msg}", - ) - .expect("indicatif template"), - ); - self.pb - .enable_steady_tick(super::Duration::from_millis(200)); - } - - fn on_iter(&mut self) { - let last = self.it_timer.tick(); - let avg = self.it_timer.avg(); - self.pb - .set_message(format!("last: {}, avg: {}", fmt_dur(last), fmt_dur(avg))); - } - - fn inc(&mut self) { - self.pb.inc(1); - } - - fn on_interrupt(&mut self) { - self.pb.set_message("Interrupted"); - } - - fn finish(&mut self) { - self.pb.disable_steady_tick(); - self.pb.finish_and_clear(); - } - } -} - -#[cfg(feature = "progress")] -use progress_impl::IndicatifProgress; - -// --------------------------- Parallel features ---------------------------- - -#[cfg(feature = "parallel")] -/// Generate a new 64-bit pseudo-random value using the **SplitMix64** algorithm. -/// This is a simple, fast, and reproducible way to decorrelate seeds for parallel RNGs. -/// -/// Arguments -/// ----------------- -/// * `x`: Input state (a `u64` value, typically a hash or a base seed). -/// -/// Return -/// ---------- -/// * A `u64` pseudo-random value, suitable for seeding RNGs (e.g., `StdRng`). -/// -/// See also -/// ------------ -/// * [`seed_for_object`] – Derives per-object seeds from a base seed and object hash. -#[inline] -fn splitmix64(mut x: u64) -> u64 { - // SplitMix64 constants and shifts from Steele et al. (2014). - x = x.wrapping_add(0x9E3779B97F4A7C15); - let mut z = x; - z = (z ^ (z >> 30)).wrapping_mul(0xBF58476D1CE4E5B9); - z = (z ^ (z >> 27)).wrapping_mul(0x94D049BB133111EB); - z ^ (z >> 31) -} - -#[cfg(feature = "parallel")] -/// Derive a **deterministic per-object RNG seed** from a global base seed. -/// -/// Each object is first hashed with the crate’s default hasher (`ahash`), and the -/// resulting 64-bit value is mixed with the base seed via [`splitmix64`]. -/// This ensures that: -/// - Each object gets a **stable, reproducible seed** (same input → same output). -/// - Seeds are decorrelated even across many objects. -/// - Parallel runs remain deterministic regardless of thread scheduling. -/// -/// Arguments -/// ----------------- -/// * `base`: A global base seed (drawn once per batch). -/// * `obj`: The [`ObjectNumber`] used as key to derive the per-object seed. -/// -/// Return -/// ---------- -/// * A `u64` deterministic RNG seed for the given object. -/// -/// See also -/// ------------ -/// * [`splitmix64`] – Core mixing function. -/// * [`ObjectNumber`] – Object identifier used in Outfit (MPC number or string). -#[inline] -fn seed_for_object(base: u64, obj: &ObjectNumber) -> u64 { - // Hash object key with the same family used elsewhere (ahash). - let mut h = ahash::AHasher::default(); - obj.hash(&mut h); - let obj_h = h.finish(); - - // Mix base seed and object hash through SplitMix64. - splitmix64(base ^ obj_h) -} - -// ============================================================================ -// Public trait + factorized implementation -// ============================================================================ - -pub trait TrajectoryFit { - /// Run Gauss-based Initial Orbit Determination (IOD) for **every trajectory** in the set. - /// - /// This method iterates over each `(ObjectNumber → Observations)` entry and applies the - /// full IOD pipeline: candidate triplet enumeration, preliminary Gauss solution, and - /// scoring / selection of the best orbit. It aggregates results into a [`FullOrbitResult`]. - /// - /// Mutation semantics - /// ----------------- - /// * This function requires `&mut self` and may **reorder observations in-place** (e.g., - /// by time) and/or **update batch-level calibration** data (RMS scaling of quoted errors). - /// * The underlying astrometric measurements (RA/DEC/time) remain semantically identical, - /// but their **container order** and **per-observation uncertainty metadata** may change - /// due to calibration and sorting steps used by the estimator. - /// * If you rely on a specific iteration order elsewhere, do not assume it is preserved. - /// - /// Determinism - /// ----------------- - /// * With a fixed RNG seed, the procedure is deterministic given identical inputs and params. - /// - /// Arguments - /// ----------------- - /// * `state`: Global environment providing ephemerides, constants, and reference frames. - /// * `rng`: Random number generator used for noisy triplet realizations (e.g., [`StdRng`](rand::rngs::StdRng)). - /// * `params`: IOD parameters controlling triplet generation, scoring, and correction loops. - /// - /// Return - /// ---------- - /// * A [`FullOrbitResult`] mapping each object to either: - /// * `Ok((GaussResult, f64))` – selected orbit and its RMS, - /// * `Err(OutfitError)` – diagnostic if no acceptable solution was found. - /// - /// Notes - /// ---------- - /// * Failures are isolated: one object failing does not prevent others from being processed. - /// * Runtime scales with the number of trajectories and candidate triplets per trajectory. - /// - /// See also - /// ------------ - /// * [`ObservationIOD::estimate_best_orbit`] – Per-trajectory IOD with best-orbit selection. - /// * [`TrajectoryFit::estimate_all_orbits_with_cancel`] – Same API with cooperative cancellation. - /// * [`IODParams`] – Tuning parameters for IOD batch execution. - fn estimate_all_orbits( - &mut self, - state: &Outfit, - rng: &mut impl Rng, - params: &IODParams, - ) -> FullOrbitResult; - - /// Count the total number of [`Observation`](crate::observations::Observation) entries across all trajectories. - /// - /// This method iterates once over all values in the [`TrajectorySet`], - /// summing the length of each [`Observations`] container. - /// - /// Return - /// ---------- - /// * The total number of observations across all objects. - fn total_observations(&self) -> usize; - - /// Compute distribution statistics for the number of observations per trajectory. - /// - /// Each trajectory (one object in the [`TrajectorySet`]) has an associated - /// [`Observations`] container. This function collects their sizes and computes: - /// - /// * `min` – smallest number of observations in any trajectory, - /// * `p25` – 25th percentile (first quartile), - /// * `median` – 50th percentile (second quartile), - /// * `p95` – 95th percentile (upper tail indicator), - /// * `max` – largest number of observations in any trajectory. - /// - /// Percentiles are computed using the *nearest-rank* method: - /// the index is `round(q × (N-1))` for quantile `q ∈ [0,1]`, clamped to valid range. - /// This makes results robust even for small datasets. - /// - /// Return - /// ---------- - /// * `None` if the set is empty. - /// * `Some(ObsCountStats)` containing the summary statistics otherwise. - /// - /// See also - /// ------------ - /// * [`total_observations`](crate::trajectories::trajectory_fit::TrajectoryFit::total_observations) – Sum of all observations across trajectories. - fn obs_count_stats(&self) -> Option; - - /// Return the number of distinct trajectories (objects) in the set. - /// - /// This is simply the number of keys in the underlying map. - /// - /// Return - /// ------ - /// * The number of distinct trajectories (objects) in the set. - /// - /// See also - /// ------------ - /// * [`total_observations`](crate::trajectories::trajectory_fit::TrajectoryFit::total_observations) – Sum of all observations across trajectories. - /// * [`obs_count_stats`](crate::trajectories::trajectory_fit::TrajectoryFit::obs_count_stats) – Statistics on the number of observations per trajectory. - fn number_of_trajectories(&self) -> usize; - - /// Run Gauss-based IOD for all trajectories, with **cooperative cancellation** support. - /// - /// Behaves like [`TrajectoryFit::estimate_all_orbits`], but periodically polls a user - /// callback to decide whether to stop early. Returns **partial results** if cancelled. - /// - /// Mutation semantics - /// ----------------- - /// * Same as the non-cancellable variant: the method may **reorder observations in-place** - /// and update **per-batch calibration** (e.g., RMS alignment of quoted errors). - /// - /// Cancellation model - /// ----------------- - /// * The loop polls `should_cancel` at ~20 ms wall-clock intervals. When it returns `true`, - /// the loop terminates gracefully, calls `on_interrupt()` on the progress sink (if any), - /// and returns the results accumulated so far. - /// - /// Determinism - /// ----------------- - /// * With a fixed RNG seed, behavior is deterministic except for the **cut point** at which - /// cancellation is observed (timing dependent). - /// - /// Arguments - /// ----------------- - /// * `state`: Global environment and reference frames. - /// * `rng`: Random number generator for noisy triplet realizations. - /// * `params`: IOD parameters. - /// * `should_cancel`: Closure polled periodically; return `true` to request early stop. - /// - /// Return - /// ---------- - /// * A [`FullOrbitResult`]: - /// * Complete if the loop ran to completion, - /// * Partial if cancellation was triggered mid-way. - /// - /// See also - /// ------------ - /// * [`TrajectoryFit::estimate_all_orbits`] – Non-cancellable variant. - fn estimate_all_orbits_with_cancel( - &mut self, - state: &Outfit, - rng: &mut impl Rng, - params: &IODParams, - should_cancel: F, - ) -> FullOrbitResult - where - F: FnMut() -> bool; - - /// Run Gauss-based Initial Orbit Determination (IOD) over all trajectories - /// using **parallel batches**. - /// - /// The [`TrajectorySet`] is split into chunks of size `batch_size`. Each chunk - /// is assigned to a Rayon worker thread, and objects inside a chunk are processed - /// sequentially for cache efficiency. A single `base_seed` is drawn from `rng`, - /// and a stable per-object seed is derived deterministically to guarantee - /// reproducibility regardless of parallel scheduling. - /// - /// Threading model - /// ----------------- - /// * This function uses the **global Rayon thread pool** by default. - /// * The number of worker threads is controlled by the environment variable - /// `RAYON_NUM_THREADS`. For example: - /// - /// ```bash - /// RAYON_NUM_THREADS=4 cargo run --release - /// ``` - /// - /// will cap Rayon to 4 threads across the entire program. - /// * If the variable is unset, Rayon defaults to the number of logical CPUs. - /// - /// Mutation semantics - /// ----------------- - /// * As in the sequential version, this method may **reorder observations** - /// and **update per-batch calibration** (e.g. RMS scaling of quoted errors). - /// * Each trajectory’s observation container is reinserted after processing, - /// so `self` remains valid and complete. - /// - /// Arguments - /// ----------------- - /// * `state`: Global environment (ephemerides, constants, frames). - /// * `rng`: Random number generator, used only once to draw a base seed. - /// * `params`: IOD parameters controlling triplet generation, scoring, correction. - /// * `batch_size`: Number of trajectories per parallel batch. Must be ≥ 1. - /// - /// Return - /// ---------- - /// * A [`FullOrbitResult`] mapping each object to either: - /// * `Ok((GaussResult, f64))` – best orbit and its RMS, - /// * `Err(OutfitError)` – diagnostic if no acceptable orbit was found. - /// - /// See also - /// ------------ - /// * [`TrajectoryFit::estimate_all_orbits`] – Sequential variant. - /// * [`TrajectoryFit::estimate_all_orbits_with_cancel`] – Sequential variant with cooperative cancellation. - #[cfg(feature = "parallel")] - fn estimate_all_orbits_in_batches_parallel( - &mut self, - state: &Outfit, - rng: &mut impl rand::Rng, - params: &IODParams, - ) -> FullOrbitResult; -} - -impl TrajectoryFit for TrajectorySet { - fn estimate_all_orbits( - &mut self, - state: &Outfit, - rng: &mut impl Rng, - params: &IODParams, - ) -> FullOrbitResult { - // `ProgressImpl` is `IndicatifProgress` when feature=progress, `()` otherwise. - estimate_all_orbits_core( - self, - state, - rng, - params, - None:: bool>>, - ProgressImpl::default(), - ) - } - - fn estimate_all_orbits_with_cancel( - &mut self, - state: &Outfit, - rng: &mut impl Rng, - params: &IODParams, - mut should_cancel: F, - ) -> FullOrbitResult - where - F: FnMut() -> bool, - { - let cancel = CancelCfg { - interval: Duration::from_millis(20), - should_cancel: &mut should_cancel, - }; - estimate_all_orbits_core( - self, - state, - rng, - params, - Some(cancel), - ProgressImpl::default(), - ) - } - - #[cfg(feature = "parallel")] - fn estimate_all_orbits_in_batches_parallel( - &mut self, - state: &Outfit, - rng: &mut impl rand::Rng, - params: &IODParams, - ) -> FullOrbitResult { - // Draw a single base seed once; per-object seeds derived deterministically. - let base_seed: u64 = rng.random(); - - // Take the whole map so we can own/mutate Observations per object off-thread. - let mut old: TrajectorySet = mem::take(self); - let mut entries: Vec<(ObjectNumber, Observations)> = old.drain().collect(); - - let total_items = entries.len() as u64; - - // Materialize batches **by move** (no clone of Observations). - let mut batches: Vec> = - Vec::with_capacity(entries.len().div_ceil(params.batch_size.max(1))); - while !entries.is_empty() { - let take_n = entries.len().min(params.batch_size); - batches.push(entries.drain(..take_n).collect()); - } - - // Global progress bar (thread-safe) under the `progress` feature. - #[cfg(feature = "progress")] - let pb = { - use indicatif::{ProgressBar, ProgressStyle}; - let pb = ProgressBar::new(total_items.max(1)); - pb.set_style( - ProgressStyle::with_template( - "{bar:40.cyan/blue} {pos}/{len} ({percent:>3}%) \ - | {per_sec} | ETA {eta_precise} | parallel batches", - ) - .expect("indicatif template"), - ); - pb.enable_steady_tick(std::time::Duration::from_millis(200)); - pb - }; - - // Process batches in parallel; each batch processed sequentially for locality. - #[allow(clippy::type_complexity)] - let mut per_batch: Vec< - Vec<( - ObjectNumber, - Result<(GaussResult, f64), OutfitError>, - Observations, - )>, - > = batches - .into_par_iter() - .map(|mut batch| { - let mut out: Vec<( - ObjectNumber, - Result<(GaussResult, f64), OutfitError>, - Observations, - )> = Vec::with_capacity(batch.len()); - - for (obj, mut obs) in batch.drain(..) { - use rand::SeedableRng; - - let local_seed = seed_for_object(base_seed, &obj); - let mut local_rng = rand::rngs::StdRng::seed_from_u64(local_seed); - - let res = - obs.estimate_best_orbit(state, &state.error_model, &mut local_rng, params); - - // Thread-safe progress increment. - #[cfg(feature = "progress")] - pb.inc(1); - - out.push((obj, res, obs)); - } - out - }) - .collect(); - - // Finalize progress. - #[cfg(feature = "progress")] - { - pb.disable_steady_tick(); - pb.finish_and_clear(); - } - - // Reinsert mutated observations and build results map with the same hasher. - let mut results: FullOrbitResult = HashMap::with_hasher(ahash::RandomState::new()); - for batch in per_batch.drain(..) { - for (obj, res, obs) in batch { - self.insert(obj.clone(), obs); - results.insert(obj, res); - } - } - results - } - - #[inline] - fn total_observations(&self) -> usize { - self.values().map(|obs: &Observations| obs.len()).sum() - } - - #[inline] - fn number_of_trajectories(&self) -> usize { - self.len() - } - - fn obs_count_stats(&self) -> Option { - // Collect sizes (one pass, O(N)) - let mut counts: Vec = self.values().map(|obs| obs.len()).collect(); - if counts.is_empty() { - return None; - } - - // Sort once, O(N log N). `unstable` is fine since we only need order. - counts.sort_unstable(); - - #[inline] - fn q_index(n: usize, q: f64) -> usize { - // Nearest-rank on [0, n-1] using linear index; robust for small n. - let pos = q * (n as f64 - 1.0); - let idx = pos.round() as isize; - idx.clamp(0, (n as isize) - 1) as usize - } - - let n = counts.len(); - let min = counts[0]; - let max = counts[n - 1]; - let p25 = counts[q_index(n, 0.25)]; - let median = counts[q_index(n, 0.50)]; - let p95 = counts[q_index(n, 0.95)]; - - Some(ObsCountStats { - min, - p25, - median, - p95, - max, - }) - } -} - -#[cfg(test)] -#[cfg(feature = "jpl-download")] -mod tests_estimate_all_orbits { - use crate::{ - observations::Observation, unit_test_global::OUTFIT_HORIZON_TEST, KeplerianElements, - }; - - use super::*; - use approx::assert_relative_eq; - use rand::SeedableRng; - use smallvec::SmallVec; - use std::{ - f64::consts::PI, - sync::atomic::{AtomicUsize, Ordering}, - }; - - // ------------------------------- - // Test fixtures (lightweight) - // ------------------------------- - - /// Build a tiny TrajectorySet with N empty observation lists. - /// - /// Note: This assumes `TrajectorySet` is a HashMap-like structure - /// and `ObjectNumber::Int(u64)` exists. Adjust if needed. - fn make_set(n: usize) -> TrajectorySet { - let mut set: TrajectorySet = std::collections::HashMap::with_hasher(RandomState::new()); - for i in 0..n { - // If your ObjectNumber uses a different constructor, adjust here. - let key = ObjectNumber::Int(i as u32); - // If Observations is not a Vec, adapt this to your type. - let obs: Observations = Default::default(); - set.insert(key, obs); - } - set - } - - /// Dummy `Outfit` and `IODParams` for tests that do not reach the estimator. - /// - /// We never call the estimator in cancellation-first tests, so these values - /// are placeholders to satisfy the function signatures. - fn dummy_env() -> (Outfit, IODParams) { - let env = OUTFIT_HORIZON_TEST.0.clone(); - let params = IODParams::builder() - .n_noise_realizations(10) - .noise_scale(1.0) - .max_obs_for_triplets(12) - .max_triplets(30) - .build() - .unwrap(); - (env, params) - } - - // ------------------------------- - // Unit tests: cancellation logic - // ------------------------------- - - /// Cancellation fires before the first object is processed: result should be empty. - /// - /// This test calls the factorized core with `interval = 0 ms` and a callback - /// that immediately requests cancellation. The estimator is never invoked. - #[test] - fn core_cancel_before_any_work() { - let mut set = make_set(5); - let (env, params) = dummy_env(); - let mut rng = rand::rngs::StdRng::seed_from_u64(42); - - // Cancel immediately on the very first poll. - let mut cancel_called = 0usize; - let mut should_cancel = || { - cancel_called += 1; - true - }; - - let cancel = CancelCfg { - interval: Duration::from_millis(0), - should_cancel: &mut should_cancel, - }; - - // Use no-op progress sink: works with or without the `progress` feature. - let results = estimate_all_orbits_core(&mut set, &env, &mut rng, ¶ms, Some(cancel), ()); - - assert!(results.is_empty(), "No object should have been processed"); - assert!( - cancel_called >= 1, - "Cancellation should have been polled at least once" - ); - } - - /// Cancellation after exactly one iteration: we expect exactly one entry in the map. - /// - /// IMPORTANT: This test *may* reach the estimator if the cancellation poll - /// happens after the first object. We therefore keep the set size to 1 so - /// we never process more than one. If your estimator requires real env/params, - /// mark this test as `#[ignore]` until you wire a small valid fixture. - #[test] - fn core_cancel_after_one_object() { - let mut set = make_set(2); - let (env, params) = dummy_env(); - let mut rng = rand::rngs::StdRng::seed_from_u64(123); - - let polls = AtomicUsize::new(0); - // First poll = false (let the first object run), next polls = true. - let mut should_cancel = || { - let c = polls.fetch_add(1, Ordering::Relaxed); - c >= 1 - }; - - let cancel = CancelCfg { - interval: Duration::from_millis(0), // poll at every loop entry - should_cancel: &mut should_cancel, - }; - - let results = estimate_all_orbits_core(&mut set, &env, &mut rng, ¶ms, Some(cancel), ()); - - assert_eq!( - results.len(), - 1, - "Exactly one object should have been processed before cancel" - ); - } - - // ------------------------------- - // Unit tests: progress plumbing - // ------------------------------- - - /// Mock progress sink to observe lifecycle calls. - #[derive(Default)] - struct MockProgress { - started_with: Option, - it_calls: usize, - inc_calls: usize, - interrupted: bool, - finished: bool, - } - - impl ProgressSink for MockProgress { - fn start(&mut self, total: u64) { - self.started_with = Some(total); - } - fn on_iter(&mut self) { - self.it_calls += 1; - } - fn inc(&mut self) { - self.inc_calls += 1; - } - fn on_interrupt(&mut self) { - self.interrupted = true; - } - fn finish(&mut self) { - self.finished = true; - } - } - - /// Progress sink should receive `start`, `on_interrupt`, and `finish` when cancelling before work. - #[test] - fn progress_calls_when_cancelled_immediately() { - let mut set = make_set(3); - let (env, params) = dummy_env(); - let mut rng = rand::rngs::StdRng::seed_from_u64(7); - - let mut should_cancel = || true; - let cancel = CancelCfg { - interval: Duration::from_millis(0), - should_cancel: &mut should_cancel, - }; - - let mut mock = MockProgress::default(); - let results = - estimate_all_orbits_core(&mut set, &env, &mut rng, ¶ms, Some(cancel), &mut mock); - - assert!(results.is_empty()); - assert_eq!(mock.started_with, Some(3)); - assert!(mock.interrupted, "on_interrupt() must be called"); - assert!(mock.finished, "finish() must be called"); - // No iteration advanced, so no inc() and on_iter() expected. - assert_eq!(mock.it_calls, 0); - assert_eq!(mock.inc_calls, 0); - } - - // ------------------------------- - // Integration tests - // ------------------------------- - - #[inline] - fn angle_abs_diff(a: f64, b: f64) -> f64 { - let tau = 2.0 * PI; - let mut d = (a - b) % tau; - if d > PI { - d -= tau; - } - if d < -PI { - d += tau; - } - d.abs() - } - - pub fn assert_keplerian_approx_eq( - got: &KeplerianElements, - exp: &KeplerianElements, - abs_eps: f64, - rel_eps: f64, - ) { - // Scalars (non-angular) - assert_relative_eq!( - got.reference_epoch, - exp.reference_epoch, - epsilon = abs_eps, - max_relative = rel_eps - ); - assert_relative_eq!( - got.semi_major_axis, - exp.semi_major_axis, - epsilon = abs_eps, - max_relative = rel_eps - ); - assert_relative_eq!( - got.eccentricity, - exp.eccentricity, - epsilon = abs_eps, - max_relative = rel_eps - ); - - // Angles (radians), compare with wrap-around - for (name, g, e) in [ - ("inclination", got.inclination, exp.inclination), - ( - "ascending_node_longitude", - got.ascending_node_longitude, - exp.ascending_node_longitude, - ), - ( - "periapsis_argument", - got.periapsis_argument, - exp.periapsis_argument, - ), - ("mean_anomaly", got.mean_anomaly, exp.mean_anomaly), - ] { - let diff = angle_abs_diff(g, e); - // Allow absolute OR relative tolerance (whichever is larger). - let tol = abs_eps.max(rel_eps * e.abs()); - assert!( - diff <= tol, - "Angle {name:?} differs too much: |Δ| = {diff:.6e} > tol {tol:.6e} (got={g:.15}, exp={e:.15})" - ); - } - } - - /// Estimate on an empty-observation set should return one entry per object with errors. - #[test] - fn public_no_progress_runs_all_objects() { - let mut set = OUTFIT_HORIZON_TEST.1.clone(); - - // TODO: replace with real constructors in your codebase: - let (env, params) = dummy_env(); - let mut rng = rand::rngs::StdRng::seed_from_u64(777); - - use super::TrajectoryFit; - let results = set.estimate_all_orbits(&env, &mut rng, ¶ms); - - let string_id = "K09R05F"; - let orbit = gauss_result_for(&results, &string_id.into()) - .unwrap() - .unwrap() - .0 - .as_inner() - .as_keplerian() - .unwrap(); - - let expected = KeplerianElements { - reference_epoch: 57049.25533417104, - semi_major_axis: 1.8017448718161189, - eccentricity: 0.283572382702194, - inclination: 0.2026747553253312, - ascending_node_longitude: 0.0079836299943183, - periapsis_argument: 1.245049339166438, - mean_anomaly: 0.4406946018418537, - }; - - assert_keplerian_approx_eq(orbit, &expected, 1e-6, 1e-6); - } - - /// Public cancellation API should return a partial map when cancelling quickly. - #[test] - fn public_with_cancel_returns_partial() { - let mut set = OUTFIT_HORIZON_TEST.1.clone(); - - // TODO: replace with real constructors in your codebase: - let (env, params) = dummy_env(); - let mut rng = rand::rngs::StdRng::seed_from_u64(42); - - use super::TrajectoryFit; - // Callback cancels immediately; public API polls every ~20ms. - // Depending on estimator speed, a few items may slip in before first poll. - let results = set.estimate_all_orbits_with_cancel(&env, &mut rng, ¶ms, || true); - - assert!( - results.len() <= 50, - "Result map cannot exceed the number of objects" - ); - assert!( - !results.is_empty(), - "Depending on timing, a few items may be processed before first poll" - ); - } - - // ------------------------------- - // Accessor helpers tests - // ------------------------------- - - /// `gauss_result_for` should distinguish: missing key, error entry, ok entry. - #[test] - fn gauss_accessors_err_and_missing() { - let mut all: FullOrbitResult = HashMap::with_hasher(RandomState::new()); - let k1 = ObjectNumber::Int(1); - let k2 = ObjectNumber::Int(2); - - // Insert an error entry for k1. Construct an OutfitError if you have a cheap variant. - // If construction is non-trivial, you can skip inserting and just test "missing". - all.insert( - k1.clone(), - Err(OutfitError::InvalidIODParameter("test".into())), - ); - - // Missing key: - assert!(matches!(gauss_result_for(&all, &k2), Ok(None))); - - // Error key: - match gauss_result_for(&all, &k1) { - Err(e) => { - // Just check we got *some* error reference back. - let _ = format!("{e}"); - } - other => panic!("expected Err(&OutfitError), got {other:?}"), - } - - // Take on missing: - assert!(matches!(take_gauss_result(&mut all, &k2), Ok(None))); - - // Take on error: - match take_gauss_result(&mut all, &k1) { - Err(e) => { - let _ = format!("{e}"); - } - other => panic!("expected Err(OutfitError), got {other:?}"), - } - } - - /// Stats over per-trajectory observation counts. - #[test] - fn obs_count_stats_basic() { - use std::collections::HashMap; - - // Helper: build a dummy Observation for tests only. - #[inline] - fn dummy_observation() -> Observation { - // SAFETY (tests only): - // This assumes `Observation` is plain-old-data (floats, ints) and `Copy`, - // i.e. no heap-owned fields (String, Vec, Arc, etc.) and no Drop. - // Si ce n’est pas vrai dans ton code, remplace cette fonction par - // un vrai constructeur de test qui remplit des champs plausibles. - assert_is_copy::(); - unsafe { std::mem::MaybeUninit::::zeroed().assume_init() } - } - - // Compile-time check: force `Observation: Copy` pour que le zero-init soit sûr. - #[inline(always)] - fn assert_is_copy() {} - - // Cas vide. - let set = make_set(0); - assert!(set.obs_count_stats().is_none(), "Empty set → None"); - - // Build uneven counts: 2, 4, 8, 16, 16 - let mut set: TrajectorySet = HashMap::with_hasher(RandomState::new()); - - let mut push_n = |id: u32, n: usize| { - let mut v: Observations = SmallVec::with_capacity(n); - for _ in 0..n { - v.push(dummy_observation()); - } - set.insert(ObjectNumber::Int(id), v); - }; - - push_n(1, 2); - push_n(2, 4); - push_n(3, 8); - push_n(4, 16); - push_n(5, 16); - - let stats = set.obs_count_stats().expect("non-empty"); - assert_eq!(stats.min, 2); - assert_eq!(stats.max, 16); - assert_eq!(stats.median, 8); - assert_eq!(stats.p25, 4); - assert_eq!(stats.p95, 16); - } - - #[cfg(test)] - #[cfg(feature = "parallel")] - mod tests_estimate_orbit_parallel_batches { - use super::*; - use ahash::RandomState; - use rand::SeedableRng; - - // Reuse helpers and fixtures style from your existing tests. - // If these are private in another module, duplicate minimal versions here. - - /// Build a tiny TrajectorySet with N empty observation lists. - /// - /// Note: This assumes `TrajectorySet` is a HashMap-like structure - /// and `ObjectNumber::Int(u32)` exists. Adjust if needed. - fn make_set(n: usize) -> TrajectorySet { - let mut set: TrajectorySet = std::collections::HashMap::with_hasher(RandomState::new()); - for i in 0..n { - set.insert(ObjectNumber::Int(i as u32), Default::default()); - } - set - } - - #[inline] - fn total_obs(set: &TrajectorySet) -> usize { - set.values().map(|v: &Observations| v.len()).sum() - } - - // ------------------------------- - // Unit tests: basic shape/edges - // ------------------------------- - - /// Parallel-batched IOD over an empty set should return an empty map. - #[test] - fn parallel_batches_empty_set_is_empty() { - let mut set = make_set(0); - - // Dummy env/params: estimator is never reached for empty set. - // If you need to compile without jpl, use the same `dummy_env()` strategy as your seq tests. - let env = dummy_env().0; - let params = IODParams::builder().batch_size(1024).build().unwrap(); - - let mut rng = rand::rngs::StdRng::seed_from_u64(1); - let results = set.estimate_all_orbits_in_batches_parallel(&env, &mut rng, ¶ms); - assert!(results.is_empty(), "Empty input → empty results"); - assert_eq!(set.len(), 0, "Set remains empty"); - } - - /// Batch-size boundaries (1 and very large) should produce exactly one entry per object. - /// - /// We don't assert on Ok/Err, only that every object was processed and observations were reintegrated. - #[test] - fn parallel_batches_size_edges_cover_all_objects() { - for &batch_size in &[1usize, 10_000usize] { - let mut set = make_set(7); - - // Build a dummy env that lets the code run without panicking even if estimator errs. - // The estimator may return Err for empty observations — it's fine for this test. - let env = dummy_env().0; - let params = IODParams::builder().batch_size(batch_size).build().unwrap(); - - let before_n = set.len(); - let before_tot = total_obs(&set); - - let mut rng = rand::rngs::StdRng::seed_from_u64(42); - let results = set.estimate_all_orbits_in_batches_parallel(&env, &mut rng, ¶ms); - - assert_eq!(results.len(), before_n, "Exactly one entry per object"); - assert_eq!(set.len(), before_n, "All objects reinserted in set"); - assert_eq!( - total_obs(&set), - before_tot, - "Total number of observations is preserved (reorder/calibration only)" - ); - } - } - - /// Using the same input and RNG seed must be deterministic across runs, regardless of scheduling. - /// This checks **one specific object** for identical formatted outcome (Ok/Err shape and RMS). - #[test] - fn parallel_batches_deterministic_across_runs_with_same_seed() { - // Small synthetic set; estimator likely returns Err for empty observations. - // Determinism check focuses on the *presence* and *shape* of results. - let build_set = || make_set(5); - let env = dummy_env().0; - let params = IODParams::builder().batch_size(2).build().unwrap(); - - let key = ObjectNumber::Int(2); - - let run_once = |seed: u64| { - let mut set = build_set(); - let mut rng = rand::rngs::StdRng::seed_from_u64(seed); - let results = set.estimate_all_orbits_in_batches_parallel(&env, &mut rng, ¶ms); - // Record a stable string representation for that key. - match results.get(&key) { - None => "None".to_string(), - Some(Ok((_g, rms))) => format!("Ok rms={rms:.12e}"), - Some(Err(e)) => format!("Err: {e}"), - } - }; - - let a = run_once(0xDEADBEEF); - let b = run_once(0xDEADBEEF); - assert_eq!(a, b, "Same seed/input → identical outcome formatting"); - } - - // ------------------------------- - // Integration tests with JPL env - // ------------------------------- - - mod with_ephem { - use super::*; - use approx::assert_relative_eq; - - use crate::unit_test_global::OUTFIT_HORIZON_TEST; - - /// Parallel batched results should match the known-good orbit (as in the sequential test). - #[test] - fn parallel_batches_return_orbit() { - // Use the same fixture you use elsewhere. - let mut set = OUTFIT_HORIZON_TEST.1.clone(); - let (env, params) = { - // If you have a helper `dummy_env()` in the seq tests, keep the same one: - let env = OUTFIT_HORIZON_TEST.0.clone(); - let params = IODParams::builder() - .n_noise_realizations(10) - .noise_scale(1.0) - .max_obs_for_triplets(12) - .max_triplets(30) - .batch_size(1) - .build() - .unwrap(); - (env, params) - }; - let mut rng = rand::rngs::StdRng::seed_from_u64(42); - - // Choose a batch size that is neither 1 nor huge to exercise chunking logic. - let results = set.estimate_all_orbits_in_batches_parallel(&env, &mut rng, ¶ms); - - // Same canonical object as in your sequential test: - let string_id = "K09R05F"; - let orbit = gauss_result_for(&results, &string_id.into()); - - assert!(orbit.is_ok(), "Result entry should be Ok"); - } - - /// Parallel batched determinism across different batch sizes. - /// - /// With same RNG seed + inputs, changing only `batch_size` should not affect results. - #[test] - fn parallel_batches_results_independent_of_batch_size() { - let mut set1 = OUTFIT_HORIZON_TEST.1.clone(); - let mut set2 = OUTFIT_HORIZON_TEST.1.clone(); - let (env, params) = { - let env = OUTFIT_HORIZON_TEST.0.clone(); - let params = IODParams::builder() - .n_noise_realizations(10) - .noise_scale(1.0) - .max_obs_for_triplets(12) - .max_triplets(30) - .batch_size(64) - .build() - .unwrap(); - (env, params) - }; - - let seed = 0xABCDEF0123456789; - let mut rng1 = rand::rngs::StdRng::seed_from_u64(seed); - let mut rng2 = rand::rngs::StdRng::seed_from_u64(seed); - - let res1 = set1.estimate_all_orbits_in_batches_parallel(&env, &mut rng1, ¶ms); - - let params2 = IODParams { - batch_size: 4096, - ..params.clone() - }; - - let res2 = set2.estimate_all_orbits_in_batches_parallel(&env, &mut rng2, ¶ms2); - - // Compare a known object Keplerian solution (same as above). - let key = "K09R05F".into(); - let k1 = gauss_result_for(&res1, &key) - .unwrap() - .unwrap() - .0 - .as_inner() - .as_keplerian() - .unwrap(); - let k2 = gauss_result_for(&res2, &key) - .unwrap() - .unwrap() - .0 - .as_inner() - .as_keplerian() - .unwrap(); - - // Tight numerical equality (same seed → same triplet noise → identical orbit). - assert_relative_eq!(k1.reference_epoch, k2.reference_epoch, epsilon = 0.0); - assert_relative_eq!(k1.semi_major_axis, k2.semi_major_axis, epsilon = 0.0); - assert_relative_eq!(k1.eccentricity, k2.eccentricity, epsilon = 0.0); - assert_relative_eq!(k1.inclination, k2.inclination, epsilon = 0.0); - assert_relative_eq!( - k1.ascending_node_longitude, - k2.ascending_node_longitude, - epsilon = 0.0 - ); - assert_relative_eq!(k1.periapsis_argument, k2.periapsis_argument, epsilon = 0.0); - assert_relative_eq!(k1.mean_anomaly, k2.mean_anomaly, epsilon = 0.0); - } - } - } -} diff --git a/src/trajectory.rs b/src/trajectory.rs new file mode 100644 index 0000000..bea91cf --- /dev/null +++ b/src/trajectory.rs @@ -0,0 +1,810 @@ +use std::ops::ControlFlow; + +use nalgebra::Vector3; +use photom::{observation_dataset::observation::Observation, Radians}; + +use crate::{ + cache::OutfitCache, + initial_orbit_determination::{gauss::GaussObs, triplet_generation::generate_triplets}, + obs_dataset::IODRMS, + observation_ephemeris::ObservationEphemeris, + EquinoctialElements, GaussResult, IODParams, JPLEphem, OutfitError, +}; + +pub(crate) trait TrajectoryFit { + /// Extract astrometric uncertainties (RA and DEC) for a set of three observations. + /// + /// Given a triplet of observation indices, this function retrieves the corresponding + /// astrometric errors in right ascension and declination from the observation set. + /// + /// # Arguments + /// + /// - `idx_obs` - A vector of three indices referring to the observations used in the triplet. + /// + /// # Returns + /// + /// - A tuple of two `Vector3`: + /// - The first vector contains the RA uncertainties in radians. + /// - The second vector contains the DEC uncertainties in radians. + /// + /// # Panics + /// + /// This function will panic if any index in `idx_obs` is out of bounds of the observation set. + fn extract_errors(&self, idx_obs: Vector3) -> (Vector3, Vector3); + + /// Compute **time-feasible, best-K** triplets of observations for Gauss IOD, + /// leveraging a lazy **index stream** and a bounded **max-heap** on spacing weight. + /// + /// Overview + /// ----------------- + /// This method is a convenience wrapper around [`generate_triplets`]. It operates + /// directly on `self` (the current observation set) and returns up to `max_triplet` + /// **best-scored** candidates for the Gauss preliminary solution. Internally it: + /// + /// 1) Uses a `TripletIndexGenerator` that: + /// - sorts epochs in place, + /// - downsamples to at most `max_obs_for_triplets` (uniform with edges), + /// - lazily **streams reduced indices** `(first, middle, last)` constrained by: + /// `dt_min ≤ t[last] − t[first] ≤ dt_max`. + /// 2) Scores each feasible triplet with [`triplet_weight`](crate::observations::triplets_iod::triplet_weight) against `optimal_interval_time`. + /// 3) Keeps only the **K** smallest weights in a bounded **max-heap** (best-K selection). + /// 4) Materializes the survivors as [`GaussObs`] by (re)borrowing `self` immutably. + /// + /// Compared to brute-force `O(n³)`, the time-windowed enumeration drives the effective + /// cost toward ~`O(n²)` in typical time distributions, plus `O(n log K)` for heap updates. + /// + /// Arguments + /// ----------------- + /// * `dt_min` – Minimum allowed timespan `[same units as Observation::time]` between the first and last epoch of a triplet. + /// * `dt_max` – Maximum allowed timespan between the first and last epoch of a triplet. + /// * `optimal_interval_time` – Target per-gap spacing (e.g., days) used by [`triplet_weight`](crate::observations::triplets_iod::triplet_weight). + /// * `max_obs_for_triplets` – Upper bound on observations kept after downsampling (uniform with endpoints). + /// * `max_triplet` – Number `K` of best-scoring triplets to return. + /// + /// Return + /// ---------- + /// * A `Vec` of length `≤ max_triplet`, **sorted by increasing weight** + /// (best geometric spacing first), ready to be passed to `GaussObs::prelim_orbit`. + /// + /// Remarks + /// ------------- + /// * Sorting is **in-place**; call sites should not rely on original ordering afterward. + /// * The generator avoids overlapping borrows of `self`; only the final K triplets are materialized. + /// * For robustness studies, each returned triplet can be expanded with + /// `GaussObs::realizations_iter` (lazy Monte-Carlo noise). + /// + /// Complexity + /// ----------------- + /// * Enumeration: ~`O(n²)` (per-anchor time window). + /// * Selection: `O(n log K)` (bounded max-heap). + /// * Space: `O(1)` per yielded candidate; only K triplets are allocated at the end. + /// + /// See also + /// ------------ + /// * [`generate_triplets`] – Low-level function performing the selection (index stream + heap + materialization). + /// * [`TripletIndexGenerator`](crate::observations::triplets_generator::TripletIndexGenerator) – Lazy stream of reduced indices constrained by `(dt_min, dt_max)`. + /// * [`triplet_weight`](crate::observations::triplets_iod::triplet_weight) – Spacing heuristic around `optimal_interval_time`. + /// * [`GaussObs::realizations_iter`] – On-the-fly noisy realizations for a given triplet. + fn compute_triplets(&self, cache: &OutfitCache, params: &IODParams) -> Vec; + + /// Select the interval of observations for RMS calculation. + /// + /// This function selects the interval of observations for RMS calculation based on the provided triplet. + /// It computes the maximum allowed interval and finds the start and end indices of the observations + /// within that interval. + /// + /// Arguments + /// --------- + /// * `triplets`: A reference to a `GaussObs` representing the triplet of observations. + /// * `extf`: A `f64` representing the external factor for the interval calculation. + /// * `dtmax`: A `f64` representing the maximum allowed interval. + /// + /// Return + /// ------ + /// * A `Result` containing a tuple of start and end indices of the observations within the interval, + /// or an `OutfitError` if an error occurs. + fn select_rms_interval( + &self, + triplets: &GaussObs, + params: &IODParams, + ) -> Result<(usize, usize), OutfitError>; + + /// Evaluate the orbit quality by computing the RMS of normalized astrometric residuals + /// over a time window centered on a Gauss triplet. + /// + /// Scientific context + /// ------------------- + /// This function measures how well a preliminary orbit reproduces the observed + /// astrometry (RA, DEC). It computes the **root-mean-square (RMS)** of the + /// normalized residuals between predicted and observed positions, aggregated over + /// a set of observations surrounding a Gauss triplet. + /// + /// Interval selection + /// ------------------- + /// The observation arc is defined by: + /// * `extf` – fractional extension factor applied around the triplet center, + /// * `dtmax` – absolute maximum time span (days) allowed for the arc. + /// + /// The effective interval is determined by + /// [`select_rms_interval`](Self::select_rms_interval), which returns the first + /// and last indices of the observations to include. + /// + /// Computation + /// ------------ + /// * Each observation contributes a squared normalized residual + /// from [`Observation::ephemeris_error`](crate::observations::Observation::ephemeris_error). + /// * The final RMS is + /// + /// ```text + /// RMS = √[ (1 / (2N)) · Σᵢ (ΔRAᵢ² + ΔDECᵢ²) ] + /// ``` + /// + /// where `N` is the number of observations in the selected interval. + /// + /// Pruning mode + /// ------------ + /// If `prune_if_rms_ge` is set: + /// * The summation stops early once the partial RMS reaches the threshold, + /// returning the pruning value directly. + /// * If `prune_if_rms_ge = ∞`, no early exit occurs (equivalent to no pruning). + /// + /// Arguments + /// ---------- + /// * `state` – Global context providing ephemerides, Earth orientation, and time conversion. + /// * `triplets` – The Gauss triplet that defined the preliminary orbit. + /// * `orbit_element` – The orbit (in equinoctial elements) to be tested against the arc. + /// * `extf` – Fractional time extension of the interval around the triplet. + /// * `dtmax` – Maximum arc duration (days). + /// * `prune_if_rms_ge` – Optional RMS cutoff for early termination (see *Pruning mode*). + /// + /// Return + /// ------- + /// * `Ok(rms)` – RMS of the normalized astrometric residuals (radians). + /// * `Err(OutfitError)` – If interval selection fails or propagation/ephemeris lookup fails. + /// + /// Units + /// ------- + /// * The returned RMS is dimensionless but expressed in **radians**. + fn rms_orbit_error( + &self, + cache: &OutfitCache, + jpl: &JPLEphem, + triplets: &GaussObs, + orbit_element: &EquinoctialElements, + params: &IODParams, + prune_if_rms_ge: Option, + ) -> Result; + + /// Estimate the best-fitting preliminary orbit from a full set of astrometric observations. + /// + /// This method searches for the best preliminary orbit by evaluating a limited number of + /// observation triplets generated from the dataset. The process includes: + /// + /// 1. **Error calibration**: + /// Observations are first preprocessed with [`ObservationsExt::apply_batch_rms_correction`] to account for + /// temporal clustering and observer-specific error models. + /// + /// 2. **Triplet generation**: + /// Candidate triplets are generated using [`ObservationsExt::compute_triplets`], which: + /// * Sorts observations by time, + /// * Optionally downsamples the dataset to at most `params.max_obs_for_triplets` points + /// (uniform in time, always keeping the first and last), + /// * Filters valid triplets according to `params.dt_min`, `params.dt_max_triplet`, + /// and `params.optimal_interval_time`. + /// + /// 3. **Monte Carlo noise sampling**: + /// For each triplet, `params.n_noise_realizations` perturbed versions are created using + /// Gaussian noise scaled by `params.noise_scale` times the nominal astrometric uncertainties. + /// + /// 4. **Orbit estimation and selection**: + /// For each (possibly perturbed) triplet, a preliminary orbit is computed with the Gauss method. + /// The resulting orbit is evaluated over the full set of observations using [`ObservationsExt::rms_orbit_error`]. + /// The orbit with the smallest RMS is returned. + /// + /// # Arguments + /// + /// * `state` – + /// Global [`Outfit`] state, providing ephemerides and time conversions. + /// * `error_model` – + /// The astrometric error model (typically per-band or per-observatory). + /// * `rng` – + /// A random number generator used to draw Gaussian perturbations. + /// * `params` – + /// Parameters controlling the initial orbit determination, including: + /// * `n_noise_realizations`: number of noisy triplet variants generated per original triplet, + /// * `noise_scale`: scaling factor for the noise, + /// * `extf`: extrapolation factor for RMS evaluation, + /// * `dtmax`: maximum time interval for RMS evaluation, + /// * `dt_min`, `dt_max_triplet`, `optimal_interval_time`: constraints on triplet spans, + /// * `max_obs_for_triplets`: maximum number of observations to keep when building triplets, + /// * `max_triplets`: maximum number of triplets to process, + /// * `gap_max`: maximum allowed time gap within a batch for RMS corrections. + /// + /// # Returns + /// + /// * `Ok((Some(best_orbit), best_rms))` – The best preliminary orbit found and its RMS. + /// * `Ok((None, f64::MAX))` – No valid orbit could be estimated. + /// * `Err(e)` – An error occurred during orbit estimation or RMS evaluation. + /// + /// # Notes + /// + /// - RMS values are computed with [`ObservationsExt::rms_orbit_error`], which accounts for + /// light-time correction and ephemeris propagation. + /// - Each triplet can produce several preliminary orbit candidates due to + /// noise realizations. + /// - The `max_obs_for_triplets` parameter is crucial for large datasets, + /// as it avoids the combinatorial explosion of triplets. + /// + /// # See also + /// + /// * [`ObservationsExt::compute_triplets`] – Selects triplets from the observation set. + /// * [`GaussObs::generate_noisy_realizations`] – Creates perturbed triplets with Gaussian noise. + /// * [`GaussObs::prelim_orbit`] – Computes a preliminary orbit from a single triplet. + /// * [`ObservationsExt::rms_orbit_error`] – Measures the goodness-of-fit of an orbit against observations. + /// * [`IODParams`] – Configuration options for the IOD process. + fn estimate_best_orbit( + &self, + cache: &OutfitCache, + jpl: &JPLEphem, + params: &IODParams, + rng: &mut impl rand::Rng, + ) -> Result<(GaussResult, IODRMS), OutfitError>; +} + +impl TrajectoryFit for Vec<&Observation> { + fn extract_errors(&self, idx_obs: Vector3) -> (Vector3, Vector3) { + let [i, j, k] = [idx_obs[0], idx_obs[1], idx_obs[2]]; + let [c1, c2, c3] = [ + self[i].equ_coord(), + self[j].equ_coord(), + self[k].equ_coord(), + ]; + ( + Vector3::new(c1.ra_error, c2.ra_error, c3.ra_error), + Vector3::new(c1.dec_error, c2.dec_error, c3.dec_error), + ) + } + + fn compute_triplets(&self, cache: &OutfitCache, params: &IODParams) -> Vec { + generate_triplets(self, cache, params) + } + + fn select_rms_interval( + &self, + triplets: &GaussObs, + params: &IODParams, + ) -> Result<(usize, usize), OutfitError> { + let nobs = self.len(); + + let idx_obs1 = triplets.idx_obs[0]; + let obs1 = self + .get(idx_obs1) + .ok_or(OutfitError::ObservationNotFound(idx_obs1))?; + + let idx_obs3 = triplets.idx_obs[2]; + let obs3 = self + .get(idx_obs3) + .ok_or(OutfitError::ObservationNotFound(idx_obs3))?; + + let first_obs = self.first().ok_or(OutfitError::ObservationNotFound(0))?; + let last_obs = self + .last() + .ok_or(OutfitError::ObservationNotFound(nobs - 1))?; + + // Step 1: Compute the maximum allowed interval + let mut dt = if params.extf >= 0.0 { + (obs3.mjd_tt() - obs1.mjd_tt()) * params.extf + } else { + 10.0 * (last_obs.mjd_tt() - first_obs.mjd_tt()) + }; + + if params.dtmax >= 0.0 { + dt = dt.max(params.dtmax); + } + + let mut i_start = 0; + + for i in (0..=idx_obs1).rev() { + if let Some(obs_i) = self.get(i) { + if obs1.mjd_tt() - obs_i.mjd_tt() > dt { + break; + } + i_start = i; + } + } + + let mut i_end = nobs - 1; + + for i in idx_obs3..nobs { + if let Some(obs_i) = self.get(i) { + if obs_i.mjd_tt() - obs3.mjd_tt() > dt { + break; + } + i_end = i; + } + } + + Ok((i_start, i_end)) + } + + fn rms_orbit_error( + &self, + cache: &OutfitCache, + jpl: &JPLEphem, + triplets: &GaussObs, + orbit_element: &EquinoctialElements, + params: &IODParams, + prune_if_rms_ge: Option, + ) -> Result { + // Select the time interval [start_obs_rms, end_obs_rms] over which the RMS + // error is evaluated. The interval depends on the triplet and on external + // filtering parameters (extf, dtmax). + let (start_obs_rms, end_obs_rms) = self.select_rms_interval(triplets, params)?; + + // Number of observations contributing to the RMS + let n_obs = (end_obs_rms - start_obs_rms + 1) as f64; + + // Denominator of the RMS formula: here weighted by 2.0 for consistency + // with the convention used elsewhere in the code. + let denom = 2.0 * n_obs; + + // ========================================================================= + // Case 1: No pruning → behave like the "classical" RMS definition + // ========================================================================= + if prune_if_rms_ge.is_none() { + // Accumulate the squared ephemeris errors for each observation + let sum = self[start_obs_rms..=end_obs_rms] + .iter() + .map(|obs| obs.ephemeris_error(cache, jpl, orbit_element)) + // try_fold propagates errors from ephemeris_error while summing + .try_fold(0.0, |acc, term| term.map(|v| acc + v))?; + + // Final RMS = sqrt( sum / denom ) + return Ok((sum / denom).sqrt()); + } + + // ========================================================================= + // Case 2: Pruning enabled → early stop if RMS exceeds a threshold + // ========================================================================= + let prune = prune_if_rms_ge.unwrap(); + + // Convert the RMS cutoff into a sum cutoff: + // RMS² = sum / denom → stop if sum ≥ (prune² * denom). + let sum_cutoff = if prune.is_finite() { + prune * prune * denom + } else { + f64::INFINITY // "no real cutoff" if prune = ∞ + }; + + // Iterate over observations and accumulate squared errors. + // We use ControlFlow to allow early exit: + // - Continue(sum): keep summing, + // - Break(value): stop early and return the pruning threshold. + let folded: ControlFlow = self[start_obs_rms..=end_obs_rms] + .iter() + .map(|obs| obs.ephemeris_error(cache, jpl, orbit_element)) + .try_fold(0.0, |acc, term| match term { + Ok(v) => { + let new_sum = acc + v; + if new_sum >= sum_cutoff { + // Early exit: threshold reached, return directly + ControlFlow::Break(prune) + } else { + ControlFlow::Continue(new_sum) + } + } + // In case of error in ephemeris_error, also exit with pruning value. + Err(_) => ControlFlow::Break(prune), + }); + + // Final RMS depending on whether we exited early or not + match folded { + ControlFlow::Continue(sum) => Ok((sum / denom).sqrt()), + ControlFlow::Break(rms) => Ok(rms), + } + } + + fn estimate_best_orbit( + &self, + cache: &OutfitCache, + jpl: &JPLEphem, + params: &IODParams, + rng: &mut impl rand::Rng, + ) -> Result<(GaussResult, IODRMS), OutfitError> { + // Placeholder for the actual orbit estimation logic. + // This would involve: + // 1. Extracting the relevant observations for this trajectory. + // 2. Applying the Gauss method to compute the initial orbit. + // 3. Calculating the RMS of normalized residuals. + // 4. Returning either a successful result or an error. + + let triplets = self.compute_triplets(cache, params); + + if triplets.is_empty() { + let span = if self.is_empty() { + 0.0 + } else { + self.last().unwrap().mjd_tt() - self.first().unwrap().mjd_tt() + }; + return Err(OutfitError::NoFeasibleTriplets { + span, + n_obs: self.len(), + dt_min: params.dt_min, + dt_max: params.dt_max_triplet, + }); + } + + // Current best (lowest) RMS and its orbit. + // Using +∞ avoids Option branching in the hot path. + let mut best_rms = f64::INFINITY; + let mut best_orbit: Option = None; + + // Keep the last encountered error so that we can report something meaningful if *all* fail. + // We don't clone: we keep only the most recent error by moving it in. + let mut last_error: Option = None; + + // For diagnostics, count how many realizations we actually attempted. + let mut n_attempts: usize = 0; + + for triplet in triplets { + // Extract 1-σ astrometric uncertainties for the three obs of this triplet. + let (error_ra, error_dec) = self.extract_errors(triplet.idx_obs); + + // --- Stage 4: For each (lazy) noisy realization of this triplet... + // The iterator yields the original triplet first, then noisy copies. + for realization in triplet.realizations_iter( + &error_ra, + &error_dec, + params.n_noise_realizations, + params.noise_scale, + rng, + ) { + n_attempts += 1; + + // 4.a) Preliminary Gauss solution on the current realization. + let gauss_res = match realization.prelim_orbit(params) { + Ok(res) => res, + Err(e) => { + // Record the failure and continue exploring. + last_error = Some(e); + continue; + } + }; + + // 4.b) Convert to the element set required by the scorer. + let equinoctial_elements = gauss_res.get_orbit().to_equinoctial()?; + + // 4.c) Score orbit vs. full observation set (RMS residual). + let rms = match self.rms_orbit_error( + cache, + jpl, + &realization, + &equinoctial_elements, + params, + Some(best_rms), + ) { + Ok(v) => { + if !v.is_finite() { + last_error = Some(OutfitError::NonFiniteScore(v)); + continue; + } else { + v + } + } + Err(e) => { + last_error = Some(e); + continue; + } + }; + + // 4.d) Keep the best candidate so far. + if rms < best_rms { + best_rms = rms; + best_orbit = Some(gauss_res); + } + } + } + + // --- Stage 5: If at least one candidate succeeded, return the best; otherwise, propagate an error. + if let Some(orbit) = best_orbit { + Ok((orbit, best_rms)) + } else { + // If nothing succeeded, propagate a structured error with the last underlying cause. + // Fallback to a domain-specific unit error if we never captured any (e.g., no attempts). + let root_cause = match last_error { + Some(e) => e, + None => panic!("In estimate_best_orbit: no error captured but best_orbit is None, this should not happen"), + }; + Err(OutfitError::NoViableOrbit { + cause: Box::new(root_cause), + attempts: n_attempts, + }) + } + } +} + +#[cfg(test)] +mod test_obs_ext { + use nalgebra::Matrix3; + use photom::observer::error_model::{ModelCorrection, ObsErrorModel}; + + use crate::{ + initial_orbit_determination::IODParamsBuilder, + orbit_type::orbit_type_test::approx_equal, + test_fixture::{DATASET_2015AB, JPL_EPHEM_HORIZON, UT1_PROVIDER}, + KeplerianElements, OrbitalElements, + }; + + use approx::assert_relative_eq; + use rand::{rngs::StdRng, SeedableRng}; + + use super::*; + + #[test] + fn test_select_rms_interval() { + let traj = DATASET_2015AB + .materialize_trajectory("K09R05F") + .unwrap() + .collect_into_vec(); + let traj_len = traj.len(); + + let cache = OutfitCache::build(&DATASET_2015AB, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + let iod_params = IODParams { + dt_min: 0.03, + dt_max_triplet: 150.0, + optimal_interval_time: 20.0, + max_obs_for_triplets: traj_len, + max_triplets: 10, + extf: -1.0, + dtmax: 30., + ..Default::default() + }; + + let triplets = traj.compute_triplets(&cache, &iod_params); + let (u1, u2) = traj + .select_rms_interval(triplets.first().unwrap(), &iod_params) + .unwrap(); + + assert_eq!(u1, 0); + assert_eq!(u2, 36); + + let new_params = IODParamsBuilder::from_params(iod_params) + .extf(10.) + .build() + .unwrap(); + + let (u1, u2) = traj + .select_rms_interval(triplets.first().unwrap(), &new_params) + .unwrap(); + + assert_eq!(u1, 14); + assert_eq!(u2, 36); + + let new_params = IODParamsBuilder::from_params(new_params) + .extf(0.001) + .dtmax(3.) + .build() + .unwrap(); + + let (u1, u2) = traj + .select_rms_interval(triplets.first().unwrap(), &new_params) + .unwrap(); + + assert_eq!(u1, 17); + assert_eq!(u2, 33); + } + + #[test] + fn test_rms_trajectory() { + let iod_params = IODParams { + extf: -1.0, + dtmax: 30., + ..Default::default() + }; + + let corrected_dataset = DATASET_2015AB + .clone() + .with_error_model(ObsErrorModel::FCCT14) + .apply_batch_rms_correction(iod_params.gap_max); + + let traj = corrected_dataset + .materialize_trajectory("K09R05F") + .unwrap() + .collect_into_vec(); + + let cache = + OutfitCache::build(&corrected_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + let triplets = GaussObs { + idx_obs: Vector3::new(34, 35, 36), + ra: [[ + 1.789_797_623_341_267, + 1.789_865_909_348_251, + 1.7899347771316527, + ]] + .into(), + dec: [[ + 0.779_178_052_350_181, + 0.779_086_664_971_291_9, + 0.778_996_538_107_973_6, + ]] + .into(), + time: [[ + 57070.238017592594, + 57_070.250_007_592_59, + 57070.262067592594, + ]] + .into(), + observer_helio_position: Matrix3::zeros(), + }; + + let kepler = KeplerianElements { + reference_epoch: 57_049.242_334_573_75, + semi_major_axis: 1.8017360713154256, + eccentricity: 0.283_559_145_668_705_7, + inclination: 0.20267383288689386, + ascending_node_longitude: 7.955_979_023_693_781E-3, + periapsis_argument: 1.2451951387589135, + mean_anomaly: 0.44054589015887125, + }; + + let rms = traj + .rms_orbit_error( + &cache, + &JPL_EPHEM_HORIZON, + &triplets, + &kepler.into(), + &iod_params, + None, + ) + .unwrap(); + + assert_eq!(rms, 68.88650730830162); + } + + mod proptests_extract_errors { + use super::*; + use photom::{ + coordinates::equatorial::EquCoord, + observation_dataset::{observation::ObservationInput, ObsDataset}, + observer::dataset::ObserverId, + photometry::{Filter, Photometry}, + }; + use proptest::prelude::*; + + fn arb_equ_coord() -> impl Strategy { + ( + 0.0..(2.0 * std::f64::consts::PI), + 0.0..0.01f64, + (-std::f64::consts::FRAC_PI_2)..std::f64::consts::FRAC_PI_2, + 0.0..0.01f64, + ) + .prop_map(|(ra, ra_error, dec, dec_error)| EquCoord { + ra, + ra_error, + dec, + dec_error, + }) + } + + fn make_obs_dataset_with_coords(coords: Vec) -> ObsDataset { + let inputs: Vec = coords + .into_iter() + .enumerate() + .map(|(i, equ_coord)| { + ObservationInput::new( + i as u64, + equ_coord, + Photometry { + magnitude: 20.0, + error: 0.1, + filter: Filter::Int(0), + }, + 59000.0, + Some(ObserverId::MpcCode(*b"F51")), + ) + }) + .collect(); + + ObsDataset::default().push_observation(inputs).unwrap().0 + } + + proptest! { + /// `extract_errors` must return the `ra_error` and `dec_error` of each + /// indexed observation, in the correct vector positions. + #[test] + fn proptest_extract_errors_returns_correct_components( + coord0 in arb_equ_coord(), + coord1 in arb_equ_coord(), + coord2 in arb_equ_coord(), + ) { + let dataset = make_obs_dataset_with_coords(vec![coord0, coord1, coord2]); + let obs: Vec<&Observation> = (0..3) + .map(|i| dataset.get_observation(i).unwrap()) + .collect(); + + let idx = Vector3::new(0usize, 1, 2); + let (ra_errors, dec_errors) = obs.extract_errors(idx); + + prop_assert_eq!(ra_errors[0], coord0.ra_error); + prop_assert_eq!(ra_errors[1], coord1.ra_error); + prop_assert_eq!(ra_errors[2], coord2.ra_error); + prop_assert_eq!(dec_errors[0], coord0.dec_error); + prop_assert_eq!(dec_errors[1], coord1.dec_error); + prop_assert_eq!(dec_errors[2], coord2.dec_error); + } + + /// The index order passed to `extract_errors` must determine which + /// observation's error ends up at which vector position. + #[test] + fn proptest_extract_errors_respects_index_order( + coord0 in arb_equ_coord(), + coord1 in arb_equ_coord(), + coord2 in arb_equ_coord(), + ) { + let dataset = make_obs_dataset_with_coords(vec![coord0, coord1, coord2]); + let obs: Vec<&Observation> = (0..3) + .map(|i| dataset.get_observation(i).unwrap()) + .collect(); + + // Permuted index: (2, 0, 1) + let idx = Vector3::new(2usize, 0, 1); + let (ra_errors, dec_errors) = obs.extract_errors(idx); + + prop_assert_eq!(ra_errors[0], coord2.ra_error); + prop_assert_eq!(ra_errors[1], coord0.ra_error); + prop_assert_eq!(ra_errors[2], coord1.ra_error); + prop_assert_eq!(dec_errors[0], coord2.dec_error); + prop_assert_eq!(dec_errors[1], coord0.dec_error); + prop_assert_eq!(dec_errors[2], coord1.dec_error); + } + } + } + + #[test] + fn test_estimate_best_orbit() { + let mut rng = StdRng::seed_from_u64(42_u64); // seed for reproducibility + + let iod_params = IODParams::default(); + + let corrected_dataset = DATASET_2015AB + .clone() + .with_error_model(ObsErrorModel::FCCT14) + .apply_batch_rms_correction(iod_params.gap_max); + + let traj = corrected_dataset + .materialize_trajectory("K09R05F") + .unwrap() + .collect_into_vec(); + + let iod_params = IODParamsBuilder::from_params(iod_params) + .n_noise_realizations(5) + .max_obs_for_triplets(traj.len()) + .build() + .unwrap(); + + let cache = + OutfitCache::build(&corrected_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + + let (best_orbit, best_rms) = traj + .estimate_best_orbit(&cache, &JPL_EPHEM_HORIZON, &iod_params, &mut rng) + .unwrap(); + + let binding = best_orbit; + let orbit = binding.get_orbit(); + + let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { + reference_epoch: 57049.22904488294, + semi_major_axis: 1.801748431600605, + eccentricity: 0.283572284127787, + inclination: 0.20266779609836036, + ascending_node_longitude: 0.008022659889281067, + periapsis_argument: 1.245060173584828, + mean_anomaly: 0.44047943792316746, + }); + + assert!(approx_equal(orbit, &expected_orbit, 1e-14)); + assert_relative_eq!(best_rms, 55.14810894219461, epsilon = 1e-14); + } +} diff --git a/tests/outfit_struct_test.rs b/tests/outfit_struct_test.rs deleted file mode 100644 index 2e9c42c..0000000 --- a/tests/outfit_struct_test.rs +++ /dev/null @@ -1,18 +0,0 @@ -use outfit::{error_models::ErrorModel, outfit::Outfit}; - -#[test] -fn test_outfit_observer_management() { - let mut outfit = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); - - let obs1 = outfit.new_observer(51.58206, -73.06644, 100., Some("Test Observer 1".into())); - assert_eq!(obs1.name, Some("Test Observer 1".to_string())); - assert_eq!(obs1.longitude, 51.58206); - assert_eq!(obs1.rho_cos_phi, 0.29216347396649495); - assert_eq!(obs1.rho_sin_phi, -0.9531782585730825); - - let obs2 = outfit.new_observer(52.58206, 23.4587, 1423., Some("Test Observer 2".into())); - assert_eq!(obs2.name, Some("Test Observer 2".to_string())); - assert_eq!(obs2.longitude, 52.58206); - assert_eq!(obs2.rho_cos_phi, 0.9180389162887692); - assert_eq!(obs2.rho_sin_phi, 0.39572170773696747); -} diff --git a/tests/reader_80col_test.rs b/tests/reader_80col_test.rs deleted file mode 100644 index 1582ef6..0000000 --- a/tests/reader_80col_test.rs +++ /dev/null @@ -1,57 +0,0 @@ -use camino::Utf8Path; -use outfit::constants::ObjectNumber; -use outfit::error_models::ErrorModel; -use outfit::outfit::Outfit; -use outfit::trajectories::trajectory_file::TrajectoryFile; -use outfit::TrajectorySet; - -#[test] -fn test_80col_reader() { - let mut env_state = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); - - let path_file = Utf8Path::new("tests/data/33803.obs"); - let mut traj_set = TrajectorySet::new_from_80col(&mut env_state, path_file); - - let obs_33803 = traj_set.get(&ObjectNumber::String("33803".into())).unwrap(); - assert_eq!(traj_set.len(), 1); - assert_eq!(obs_33803.len(), 129); - assert_eq!(obs_33803[0].time, 60324.52016874074); - assert_eq!(obs_33803[0].ra, 3.5491391785131814); - assert_eq!(obs_33803[0].dec, -0.15949710761897423); - assert_eq!( - obs_33803[0].get_observer(&env_state).name, - Some("Mt. Lemmon Survey".to_string()) - ); - - let path_file = Utf8Path::new("tests/data/8467.obs"); - traj_set.add_from_80col(&mut env_state, path_file); - assert_eq!(traj_set.len(), 2); - let obs_8467 = traj_set.get(&ObjectNumber::String("8467".into())).unwrap(); - assert_eq!(obs_8467.len(), 61); - assert_eq!(obs_8467[0].time, 60647.053230740734); - assert_eq!(obs_8467[0].ra, 0.10365423161131723); - assert_eq!(obs_8467[0].dec, 0.1400047372376524); - assert_eq!( - obs_8467[0].get_observer(&env_state).name, - Some("ATLAS Chile, Rio Hurtado".to_string()) - ); - - let path_file = Utf8Path::new("tests/data/K25D50B.obs"); - traj_set.add_from_80col(&mut env_state, path_file); - assert_eq!(traj_set.len(), 3); - let obs_k25 = traj_set - .get(&ObjectNumber::String("K25D50B".into())) - .unwrap(); - assert_eq!(obs_k25.len(), 20); - assert_eq!(obs_k25[0].time, 60732.28129074074); - assert_eq!(obs_k25[0].ra, 2.6992652800547146); - assert_eq!(obs_k25[0].dec, 0.5231308334332919); - assert_eq!( - obs_k25[0].get_observer(&env_state).name, - Some("Kitt Peak-Bok".to_string()) - ); - assert_eq!( - obs_k25[19].get_observer(&env_state).name, - Some("Steward Observatory, Kitt Peak-Spacewatch".to_string()) - ); -} diff --git a/tests/test_gauss_iod.rs b/tests/test_gauss_iod.rs index fbaec35..c470136 100644 --- a/tests/test_gauss_iod.rs +++ b/tests/test_gauss_iod.rs @@ -1,66 +1,62 @@ -#![cfg(feature = "jpl-download")] - mod common; use approx::assert_relative_eq; -use camino::Utf8Path; -use outfit::constants::ObjectNumber; -use outfit::error_models::ErrorModel; -use outfit::initial_orbit_determination::gauss_result::GaussResult; +use hifitime::ut1::Ut1Provider; use outfit::initial_orbit_determination::IODParams; -use outfit::observations::observations_ext::ObservationIOD; +use outfit::jpl_ephem::download_jpl_file::EphemFileSource; +use outfit::obs_dataset::FitIOD; use outfit::orbit_type::keplerian_element::KeplerianElements; use outfit::orbit_type::OrbitalElements; -use outfit::outfit::Outfit; -use outfit::outfit_errors::OutfitError; -use outfit::trajectories::trajectory_file::TrajectoryFile; -use outfit::TrajectorySet; +use outfit::JPLEphem; +use photom::observation_dataset::ObsDataset; use rand::rngs::StdRng; use rand::SeedableRng; use crate::common::approx_equal; -fn run_iod( - env_state: &mut Outfit, - traj_set: &mut TrajectorySet, - traj_number: &ObjectNumber, -) -> Result<(GaussResult, f64), OutfitError> { - let obs = traj_set.get_mut(traj_number).unwrap(); - let mut rng = StdRng::seed_from_u64(42_u64); // seed for reproducibility - - let default = IODParams::builder() - .n_noise_realizations(10) - .noise_scale(1.1) - .max_obs_for_triplets(obs.len()) - .max_triplets(30) - .build()?; - - obs.estimate_best_orbit(env_state, &ErrorModel::FCCT14, &mut rng, &default) -} - #[test] fn test_gauss_iod() { let test_max_relative = 1e-11; let test_epsilon = 1e-11; - let mut env_state = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); + let ut1_provider = Ut1Provider::download_from_jpl("latest_eop2.long") + .expect("Download of the JPL short time scale UT1 data failed"); - let path_file = Utf8Path::new("tests/data/2015AB.obs"); - let mut traj_set = TrajectorySet::new_from_80col(&mut env_state, path_file); + let jpl_file: EphemFileSource = "naif:DE440" + .try_into() + .expect("Failed to parse JPL ephemeris source"); + let jpl_ephem = JPLEphem::new(&jpl_file).expect("Failed to load JPL ephemeris from Naif"); - let path_file = Utf8Path::new("tests/data/8467.obs"); - traj_set.add_from_80col(&mut env_state, path_file); + let (obs_dataset, errors) = ObsDataset::from_mpc_80_col_files(&[ + "tests/data/2015AB.obs", + "tests/data/8467.obs", + "tests/data/33803.obs", + ]); - let path_file = Utf8Path::new("tests/data/33803.obs"); - traj_set.add_from_80col(&mut env_state, path_file); + if !errors.is_empty() { + panic!("Failed to load observation datasets: {:?}", errors); + } - let (best_orbit, best_rms) = run_iod( - &mut env_state, - &mut traj_set, - &ObjectNumber::String("K09R05F".into()), - ) - .unwrap(); + let default = IODParams::builder() + .n_noise_realizations(10) + .noise_scale(1.1) + .max_obs_for_triplets(130) // number of observation for the largest trajectory in the dataset + .max_triplets(30) + .build() + .unwrap(); + + let mut full_orbit = obs_dataset + .fit_full_iod( + &jpl_ephem, + &ut1_provider, + &default, + &mut StdRng::seed_from_u64(42), + ) + .unwrap(); + + let (best_orbit, best_rms) = full_orbit.remove(&"K09R05F".into()).unwrap().unwrap(); + let orbit = best_orbit.get_orbit(); let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { reference_epoch: 57049.22904452732, @@ -72,8 +68,6 @@ fn test_gauss_iod() { mean_anomaly: 0.44069989140091426, }); - let orbit = best_orbit.get_orbit(); - assert!(approx_equal(&expected_orbit, orbit, test_epsilon)); assert_relative_eq!( best_rms, @@ -82,13 +76,6 @@ fn test_gauss_iod() { max_relative = test_max_relative ); - let (best_orbit, best_rms) = run_iod( - &mut env_state, - &mut traj_set, - &ObjectNumber::String("8467".into()), - ) - .unwrap(); - let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { reference_epoch: 60672.24113100201, semi_major_axis: 3.189546977249391, @@ -99,6 +86,7 @@ fn test_gauss_iod() { mean_anomaly: 4.85070383704545, }); + let (best_orbit, best_rms) = full_orbit.remove(&"8467".into()).unwrap().unwrap(); let orbit = best_orbit.get_orbit(); assert!(approx_equal(&expected_orbit, orbit, test_epsilon)); @@ -109,13 +97,6 @@ fn test_gauss_iod() { max_relative = test_max_relative ); - let (best_orbit, best_rms) = run_iod( - &mut env_state, - &mut traj_set, - &ObjectNumber::String("33803".into()), - ) - .unwrap(); - let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { reference_epoch: 60465.26778016307, semi_major_axis: 2.192136202201971, @@ -126,6 +107,7 @@ fn test_gauss_iod() { mean_anomaly: 4.9466622638827324, }); + let (best_orbit, best_rms) = full_orbit.remove(&"33803".into()).unwrap().unwrap(); let orbit = best_orbit.get_orbit(); assert!(approx_equal(&expected_orbit, orbit, test_epsilon)); diff --git a/tests/test_read_ades.rs b/tests/test_read_ades.rs deleted file mode 100644 index 32d9d32..0000000 --- a/tests/test_read_ades.rs +++ /dev/null @@ -1,56 +0,0 @@ -use camino::Utf8Path; -use outfit::constants::ObjectNumber; -use outfit::error_models::ErrorModel; -use outfit::outfit::Outfit; -use outfit::trajectories::trajectory_file::TrajectoryFile; -use outfit::TrajectorySet; - -#[test] -fn test_read_ades() { - let mut outfit = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); - - let mut traj_set = TrajectorySet::new_from_ades( - &mut outfit, - Utf8Path::new("tests/data/example_ades.xml"), - None, - None, - ); - assert_eq!(traj_set.len(), 4); - assert_eq!(traj_set.get(&ObjectNumber::Int(1234457)).unwrap().len(), 1); - - traj_set.add_from_ades( - &mut outfit, - Utf8Path::new("tests/data/example_ades2.xml"), - None, - None, - ); - - assert_eq!(traj_set.len(), 7); - let traj = traj_set - .get(&ObjectNumber::String("2016 RD34".into())) - .unwrap(); - assert_eq!(traj.len(), 2); - let obs = traj.first().unwrap().get_observer(&outfit); - assert_eq!( - *obs.name.as_ref().unwrap(), - "University of Hawaii 88-inch telescope, Maunakea".to_string() - ); - - traj_set.add_from_ades( - &mut outfit, - Utf8Path::new("tests/data/flat_ades.xml"), - None, - None, - ); - assert_eq!(traj_set.len(), 41); - - let traj = traj_set - .get(&ObjectNumber::String("D/1993 F2-W".into())) - .unwrap(); - - assert_eq!(traj.len(), 1); - assert_eq!( - traj.first().unwrap().get_observer(&outfit).name, - Some("La Palma".into()) - ); -} From 7b935f7d15f613a6a6a5e8c9393817756648684a Mon Sep 17 00:00:00 2001 From: Roman Date: Thu, 30 Apr 2026 09:20:50 +0200 Subject: [PATCH 02/47] fix some tests --- src/cache/observer_centric_cache.rs | 11 +++++++++-- src/cache/observer_fixed_cache.rs | 1 + src/jpl_ephem/download_jpl_file.rs | 16 ---------------- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/cache/observer_centric_cache.rs b/src/cache/observer_centric_cache.rs index aa48a9a..cc4375f 100644 --- a/src/cache/observer_centric_cache.rs +++ b/src/cache/observer_centric_cache.rs @@ -154,8 +154,15 @@ mod observer_test { #[test] fn test_helio_pos_obs() { - let (lon, lat, h) = (203.744090000, 20.707233557, 3067.694); - let pan_starrs = to_observer(lon, lat, h, Some("Pan-STARRS 1".to_string()), None, None); + let (lon, lat, h) = (203.744090000_f64, 20.707233557_f64, 3067.694_f64); + let pan_starrs = to_observer( + lon.to_radians(), + lat.to_radians(), + h, + Some("Pan-STARRS 1".to_string()), + None, + None, + ); let observer_fixed_cache: ObserverFixedCache = (&pan_starrs).try_into().unwrap(); let cases = [ diff --git a/src/cache/observer_fixed_cache.rs b/src/cache/observer_fixed_cache.rs index 09b1664..16dc251 100644 --- a/src/cache/observer_fixed_cache.rs +++ b/src/cache/observer_fixed_cache.rs @@ -13,6 +13,7 @@ pub type ObserverFixedPosition = Vector3>; /// Precomputed **body-fixed** velocity of the observer in **AU/day**. pub type ObserverFixedVelocity = Vector3>; +#[derive(Debug)] pub struct ObserverFixedCache { observer_fixed_positions: ObserverFixedPosition, observer_fixed_velocities: ObserverFixedVelocity, diff --git a/src/jpl_ephem/download_jpl_file.rs b/src/jpl_ephem/download_jpl_file.rs index 8e14321..fceac47 100644 --- a/src/jpl_ephem/download_jpl_file.rs +++ b/src/jpl_ephem/download_jpl_file.rs @@ -380,19 +380,3 @@ impl TryFrom for EphemFilePath { } } } - -#[cfg(test)] -mod jpl_reader_test { - /// If `jpl-download` is **not** enabled, requesting a missing file must error. - #[test] - fn test_no_feature_download_jpl_ephem() { - use super::*; - let file_source = "naif:DE442".try_into().unwrap(); - - let result = EphemFilePath::get_ephemeris_file(&file_source); - assert!( - result.is_err(), - "feature jpl-download is enabled, weird ..." - ); - } -} From 6090998210e793d155586ce495698269c905e4d6 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 1 May 2026 09:09:50 +0200 Subject: [PATCH 03/47] change rms and estimate_best_orbit tests according to the changes when parsing the astrometric error from a 80 column MPC file made in the photom crate --- src/obs_dataset.rs | 2 ++ src/observation_ephemeris.rs | 34 +++++++++++++++++++++++++--------- src/trajectory.rs | 28 +++++++++++++++++----------- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/obs_dataset.rs b/src/obs_dataset.rs index 74aa411..bb9a538 100644 --- a/src/obs_dataset.rs +++ b/src/obs_dataset.rs @@ -10,6 +10,8 @@ use crate::{ cache::OutfitCache, trajectory::TrajectoryFit, GaussResult, IODParams, JPLEphem, OutfitError, }; +/// Type alias for the RMS of normalized residuals from an IOD fit. +/// This is a single scalar value representing the overall fit quality of the IOD solution. pub type IODRMS = f64; /// Full batch orbit determination results. diff --git a/src/observation_ephemeris.rs b/src/observation_ephemeris.rs index 824ed13..aa93df8 100644 --- a/src/observation_ephemeris.rs +++ b/src/observation_ephemeris.rs @@ -672,6 +672,7 @@ mod test_observations_ephemeris { dec_error: f64, t_obs: f64, mpc_code: MpcCode, + apply_model_errors: bool, ) -> (ObsDataset, OutfitCache) { let observation_input = ObservationInput::new( 0, @@ -694,8 +695,13 @@ mod test_observations_ephemeris { .push_observation(vec![observation_input]) .unwrap() .0 - .with_error_model(ObsErrorModel::FCCT14) - .apply_model_errors(); + .with_error_model(ObsErrorModel::FCCT14); + + let obs_dataset = if apply_model_errors { + obs_dataset.apply_model_errors() + } else { + obs_dataset + }; let cache = OutfitCache::build(&obs_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); @@ -750,6 +756,7 @@ mod test_observations_ephemeris { 1.259_582_891_829_317_7E-6, 57070.262067592594, *b"F51", + false, ); let equinoctial_element = EquinoctialElements { @@ -773,7 +780,7 @@ mod test_observations_ephemeris { let equinoctial = simple_equinoctial(t_obs); let (obs_dataset, cache) = - make_obs_dataset_and_cache_mpc(0.0, 1e-6, 0.0, 1e-6, t_obs, *b"F51"); + make_obs_dataset_and_cache_mpc(0.0, 1e-6, 0.0, 1e-6, t_obs, *b"F51", true); let obs = obs_dataset.get_observation(0).unwrap(); let (alpha, delta) = obs @@ -781,7 +788,7 @@ mod test_observations_ephemeris { .unwrap(); let (obs_dataset_match, cache_match) = - make_obs_dataset_and_cache_mpc(alpha, 1e-6, delta, 1e-6, t_obs, *b"F51"); + make_obs_dataset_and_cache_mpc(alpha, 1e-6, delta, 1e-6, t_obs, *b"F51", true); let obs_match = obs_dataset_match.get_observation(0).unwrap(); let error = obs_match @@ -797,15 +804,22 @@ mod test_observations_ephemeris { let equinoctial = simple_equinoctial(t_obs); let (obs_dataset, cache) = - make_obs_dataset_and_cache_mpc(0.0, 1e-3, 0.0, 1e-3, t_obs, *b"F51"); + make_obs_dataset_and_cache_mpc(0.0, 1e-3, 0.0, 1e-3, t_obs, *b"F51", true); let obs = obs_dataset.get_observation(0).unwrap(); let (alpha, delta) = obs .compute_apparent_position(&cache, &JPL_EPHEM_HORIZON, &equinoctial) .unwrap(); - let (obs_dataset_offset, cache_offset) = - make_obs_dataset_and_cache_mpc(alpha + 1e-3, 1e-3, delta, 1e-3, t_obs, *b"F51"); + let (obs_dataset_offset, cache_offset) = make_obs_dataset_and_cache_mpc( + alpha + 1e-3, + 1e-3, + delta, + 1e-3, + t_obs, + *b"F51", + true, + ); let obs_offset = obs_dataset_offset.get_observation(0).unwrap(); let err = obs_offset @@ -821,7 +835,7 @@ mod test_observations_ephemeris { let equinoctial = simple_equinoctial(t_obs); let (obs_dataset, cache) = - make_obs_dataset_and_cache_mpc(0.0, 1e-6, 0.0, 1e-6, t_obs, *b"F51"); + make_obs_dataset_and_cache_mpc(0.0, 1e-6, 0.0, 1e-6, t_obs, *b"F51", true); let obs = obs_dataset.get_observation(0).unwrap(); let (alpha, delta) = obs @@ -835,6 +849,7 @@ mod test_observations_ephemeris { 1e-6, t_obs, *b"F51", + true, ); let obs_wrapped = obs_dataset_wrapped.get_observation(0).unwrap(); @@ -851,7 +866,7 @@ mod test_observations_ephemeris { let equinoctial = simple_equinoctial(t_obs); let (obs_dataset, cache) = - make_obs_dataset_and_cache_mpc(0.0, 1.0, 0.0, 1.0, t_obs, *b"F51"); + make_obs_dataset_and_cache_mpc(0.0, 1.0, 0.0, 1.0, t_obs, *b"F51", true); let obs = obs_dataset.get_observation(0).unwrap(); let (alpha, delta) = obs @@ -865,6 +880,7 @@ mod test_observations_ephemeris { 10.0, t_obs, *b"F51", + true, ); let obs_large = obs_dataset_large.get_observation(0).unwrap(); diff --git a/src/trajectory.rs b/src/trajectory.rs index bea91cf..d471376 100644 --- a/src/trajectory.rs +++ b/src/trajectory.rs @@ -542,13 +542,19 @@ mod test_obs_ext { #[test] fn test_select_rms_interval() { - let traj = DATASET_2015AB + let corrected_dataset = DATASET_2015AB + .clone() + .with_error_model(ObsErrorModel::FCCT14) + .apply_model_errors(); + + let traj = corrected_dataset .materialize_trajectory("K09R05F") .unwrap() .collect_into_vec(); let traj_len = traj.len(); - let cache = OutfitCache::build(&DATASET_2015AB, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); + let cache = + OutfitCache::build(&corrected_dataset, &JPL_EPHEM_HORIZON, &UT1_PROVIDER).unwrap(); let iod_params = IODParams { dt_min: 0.03, @@ -660,7 +666,7 @@ mod test_obs_ext { ) .unwrap(); - assert_eq!(rms, 68.88650730830162); + assert_eq!(rms, 153.84607281520138); } mod proptests_extract_errors { @@ -795,16 +801,16 @@ mod test_obs_ext { let orbit = binding.get_orbit(); let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { - reference_epoch: 57049.22904488294, - semi_major_axis: 1.801748431600605, - eccentricity: 0.283572284127787, - inclination: 0.20266779609836036, - ascending_node_longitude: 0.008022659889281067, - periapsis_argument: 1.245060173584828, - mean_anomaly: 0.44047943792316746, + reference_epoch: 57049.22904475403, + semi_major_axis: 1.8017609974509807, + eccentricity: 0.2835733667643381, + inclination: 0.20267686119302475, + ascending_node_longitude: 0.00799201841873464, + periapsis_argument: 1.245034216916367, + mean_anomaly: 0.4405089048961484, }); assert!(approx_equal(orbit, &expected_orbit, 1e-14)); - assert_relative_eq!(best_rms, 55.14810894219461, epsilon = 1e-14); + assert_relative_eq!(best_rms, 222.16583195747745, epsilon = 1e-14); } } From 040a53cea4233d6a5c2e7cd0ee912e33d79f506c Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 19 May 2026 09:24:43 +0200 Subject: [PATCH 04/47] derive debug for cache structures, fix non-determinism for full iod with rng per traj, fix inconsistency index due to a sort by time in the apply_batch_rms_correction method within the photom crate --- Cargo.toml | 1 + src/cache/mod.rs | 1 + src/cache/observer_centric_cache.rs | 1 + src/constants.rs | 7 ++ src/obs_dataset.rs | 36 ++++++++-- src/observer_extension.rs | 2 +- tests/test_cache_consistency.rs | 107 ++++++++++++++++++++++++++++ tests/test_gauss_iod.rs | 59 +++++++-------- 8 files changed, 177 insertions(+), 37 deletions(-) create mode 100644 tests/test_cache_consistency.rs diff --git a/Cargo.toml b/Cargo.toml index 150d3bb..8d94981 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,6 +54,7 @@ roots = { version = "0.0.8", default-features = false } rand = { version = "0.9.2", default-features = false, features = [ "std_rng", "os_rng", + "small_rng" ] } rand_distr = { version = "0.5.1", default-features = false } diff --git a/src/cache/mod.rs b/src/cache/mod.rs index 345c720..2110e15 100644 --- a/src/cache/mod.rs +++ b/src/cache/mod.rs @@ -22,6 +22,7 @@ use crate::{ /// Built once before any trajectory fitting. Each entry is keyed by the /// observation's [`ObsIndex`], which is stable for the lifetime of the /// [`ObsDataset`]. +#[derive(Debug)] pub struct OutfitCache { /// len == number of observations in the dataset. Indexed by [`ObsIndex`]. observer_centric: CentricObserverCache, diff --git a/src/cache/observer_centric_cache.rs b/src/cache/observer_centric_cache.rs index cc4375f..feee960 100644 --- a/src/cache/observer_centric_cache.rs +++ b/src/cache/observer_centric_cache.rs @@ -17,6 +17,7 @@ pub type ObserverGeocentricVelocity = Vector3>; pub type ObserverHeliocentricPosition = Vector3>; /// Geocentric and heliocentric observer positions for a single observation epoch. +#[derive(Debug)] pub struct ObserverCentricCache { pub geo_position: ObserverGeocentricPosition, pub geo_velocity: ObserverGeocentricVelocity, diff --git a/src/constants.rs b/src/constants.rs index 1e81aff..820a71d 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -75,10 +75,15 @@ pub const VLIGHT_AU: f64 = VLIGHT / AU * SECONDS_PER_DAY; // Angular velocity of Earth rotation (rad/day) on the z-axis. pub const EARTH_ROTATION: Vector3 = Vector3::new(0.0, 0.0, DPI * 1.00273790934); +/// Hard coded rotation matrices for coordinate transformations between mean equatorial J2000 and mean ecliptic J2000 frames. +/// Can be computed using the rotpn function in the ref_system module + /// Rotation matrix from mean equatorial J2000 to mean ecliptic J2000. /// /// Rotation of $-\varepsilon$ around the X-axis, where $\varepsilon$ is the /// obliquity of the ecliptic at J2000. +/// +/// call rotpn(RefSystem::Equm(RefEpoch::J2000), RefSystem::Eclm(RefEpoch::J2000)) for same computed result pub const ROT_EQUMJ2000_TO_ECLMJ2000: Matrix3 = Matrix3::new( 1.00000000000000000e0, 0.00000000000000000e0, @@ -94,6 +99,8 @@ pub const ROT_EQUMJ2000_TO_ECLMJ2000: Matrix3 = Matrix3::new( /// Rotation matrix from mean ecliptic J2000 to mean equatorial J2000. /// /// Transpose (inverse) of [`ROT_EQUMJ2000_TO_ECLMJ2000`]. +/// +/// call rotpn(RefSystem::Eclm(RefEpoch::J2000), RefSystem::Equm(RefEpoch::J2000)) for same computed result pub const ROT_ECLMJ2000_TO_EQUMJ2000: Matrix3 = Matrix3::new( 1.00000000000000000e0, 0.00000000000000000e0, diff --git a/src/obs_dataset.rs b/src/obs_dataset.rs index bb9a538..8892dca 100644 --- a/src/obs_dataset.rs +++ b/src/obs_dataset.rs @@ -2,9 +2,10 @@ use ahash::AHashMap; use hifitime::ut1::Ut1Provider; use photom::{ observation_dataset::{observation::Observation, ObsDataset}, - observer::error_model::ModelCorrection, + observer::error_model::{ModelCorrection, ObsErrorModel}, TrajId, }; +use rand::{rngs::SmallRng, SeedableRng}; use crate::{ cache::OutfitCache, trajectory::TrajectoryFit, GaussResult, IODParams, JPLEphem, OutfitError, @@ -37,6 +38,7 @@ pub trait FitIOD { jpl: &JPLEphem, ut1_provider: &Ut1Provider, params: &IODParams, + error_model: ObsErrorModel, rng: &mut impl rand::Rng, ) -> Result; @@ -46,6 +48,7 @@ pub trait FitIOD { jpl: &JPLEphem, ut1_provider: &Ut1Provider, params: &IODParams, + error_model: ObsErrorModel, rng: &mut impl rand::Rng, ) -> Result<(GaussResult, IODRMS), OutfitError>; } @@ -57,10 +60,11 @@ impl FitIOD for ObsDataset { jpl: &JPLEphem, ut1_provider: &Ut1Provider, params: &IODParams, + error_model: ObsErrorModel, rng: &mut impl rand::Rng, ) -> Result<(GaussResult, IODRMS), OutfitError> { let corrected_dataset = self - .apply_model_errors() + .with_error_model(error_model) .apply_batch_rms_correction(params.gap_max); let cache = OutfitCache::build(&corrected_dataset, jpl, ut1_provider)?; @@ -73,22 +77,40 @@ impl FitIOD for ObsDataset { jpl: &JPLEphem, ut1_provider: &Ut1Provider, params: &IODParams, + error_model: ObsErrorModel, rng: &mut impl rand::Rng, ) -> Result { let corrected_dataset = self + .with_error_model(error_model) .apply_model_errors() .apply_batch_rms_correction(params.gap_max); let cache = OutfitCache::build(&corrected_dataset, jpl, ut1_provider)?; + // Draw a single base seed from the caller's RNG. + // All per-trajectory RNGs are derived from this seed → deterministic + // regardless of trajectory ordering or parallelism. + let base_seed: u64 = rng.random(); + let results: FullOrbitResult = corrected_dataset .iter_traj_id() .into_iter() .flatten() - .map(|traj| { - println!("Fitting IOD for Trajectory ID: {}", traj); - let result = fit_single_traj(traj, &corrected_dataset, &cache, jpl, params, rng); - (traj.clone(), result) + .map(|traj_id| { + // Derive a per-trajectory seed from the base seed and the trajectory ID. + // Two trajectories with different IDs always get independent sequences. + let traj_seed = base_seed ^ traj_id.stable_hash(); + let mut local_rng = SmallRng::seed_from_u64(traj_seed); + + let result = fit_single_traj( + &traj_id, + &corrected_dataset, + &cache, + jpl, + params, + &mut local_rng, + ); + (traj_id.clone(), result) }) .collect(); @@ -108,7 +130,7 @@ fn fit_single_traj( .materialize_trajectory(traj) .ok_or_else(|| OutfitError::TrajectoryIdNotFound(traj.clone()))?; - let mut obs_vec_refs: Vec<&Observation> = materialized_traj.iter().collect(); + let mut obs_vec_refs: Vec<&Observation> = materialized_traj.collect_into_vec(); obs_vec_refs.sort_by(|a, b| a.mjd_tt().total_cmp(&b.mjd_tt())); obs_vec_refs.estimate_best_orbit(cache, jpl, params, rng) diff --git a/src/observer_extension.rs b/src/observer_extension.rs index ad6329b..17cdaea 100644 --- a/src/observer_extension.rs +++ b/src/observer_extension.rs @@ -18,7 +18,7 @@ use crate::{ JPLEphem, OutfitError, }; -pub(crate) trait ResolvedObserver { +pub trait ResolvedObserver { /// Get the fixed position of an observatory using its geographic coordinates /// /// Return diff --git a/tests/test_cache_consistency.rs b/tests/test_cache_consistency.rs new file mode 100644 index 0000000..c91ac24 --- /dev/null +++ b/tests/test_cache_consistency.rs @@ -0,0 +1,107 @@ +use approx::assert_abs_diff_eq; +use camino::Utf8Path; +use hifitime::ut1::Ut1Provider; +use nalgebra::Vector3; +use outfit::{ + cache::OutfitCache, jpl_ephem::download_jpl_file::EphemFileSource, IODParams, JPLEphem, +}; +use photom::{ + observation_dataset::ObsDataset, + observer::error_model::{ModelCorrection, ObsErrorModel}, +}; + +const POSITION_EPSILON: f64 = 1e-12; + +struct CacheFixture { + ut1_provider: Ut1Provider, + jpl_ephem: JPLEphem, + default_params: IODParams, +} + +impl CacheFixture { + fn new() -> Self { + let ut1_provider = Ut1Provider::download_from_jpl("latest_eop2.long") + .expect("Download of the JPL short time scale UT1 data failed"); + + let jpl_file: EphemFileSource = "horizon:DE440" + .try_into() + .expect("Failed to parse JPL ephemeris source"); + let jpl_ephem = + JPLEphem::new(&jpl_file).expect("Failed to load JPL ephemeris from Horizon"); + + Self { + ut1_provider, + jpl_ephem, + default_params: IODParams::default(), + } + } + + fn build_cache>(&self, paths: &[P]) -> (OutfitCache, ObsDataset) { + let (obs_dataset, _) = ObsDataset::from_mpc_80_col_files(paths); + + let obs_dataset = obs_dataset + .with_error_model(ObsErrorModel::FCCT14) + .apply_batch_rms_correction(self.default_params.gap_max); + + let cache = OutfitCache::build(&obs_dataset, &self.jpl_ephem, &self.ut1_provider) + .expect("Failed to build outfit cache"); + + (cache, obs_dataset) + } +} + +fn assert_helio_position(cache: &OutfitCache, obs_dataset: &ObsDataset, trajectory_id: &str) { + let traj = obs_dataset + .materialize_trajectory(trajectory_id) + .unwrap() + .collect_into_vec(); + + let checks: &[(usize, [f64; 3])] = &[ + ( + 0, + [0.996798968524259, -0.12232935537370689, -0.0530044254994447], + ), + ( + traj.len() / 2, + [-0.2588304494454786, 0.8703635675926336, 0.3773300400916685], + ), + ( + traj.len() - 1, + [-0.8383497659757538, 0.479843435538848, 0.20801659206288547], + ), + ]; + + for (idx, expected) in checks { + let obs = &traj[*idx]; + let helio_pos = cache + .get_centric(obs.index()) + .helio_position + .map(|x| x.into_inner()); + + assert_abs_diff_eq!( + helio_pos, + Vector3::from(*expected), + epsilon = POSITION_EPSILON + ); + } +} + +#[test] +fn test_cache_consistency() { + let fixture = CacheFixture::new(); + + let dataset_combinations: &[&[&str]] = &[ + &["tests/data/2015AB.obs"], + &["tests/data/8467.obs", "tests/data/2015AB.obs"], + &[ + "tests/data/2015AB.obs", + "tests/data/8467.obs", + "tests/data/33803.obs", + ], + ]; + + for paths in dataset_combinations { + let (cache, obs_dataset) = fixture.build_cache(paths); + assert_helio_position(&cache, &obs_dataset, "K09R05F"); + } +} diff --git a/tests/test_gauss_iod.rs b/tests/test_gauss_iod.rs index c470136..4cd9885 100644 --- a/tests/test_gauss_iod.rs +++ b/tests/test_gauss_iod.rs @@ -9,13 +9,13 @@ use outfit::orbit_type::keplerian_element::KeplerianElements; use outfit::orbit_type::OrbitalElements; use outfit::JPLEphem; use photom::observation_dataset::ObsDataset; +use photom::observer::error_model::ObsErrorModel; use rand::rngs::StdRng; use rand::SeedableRng; use crate::common::approx_equal; #[test] - fn test_gauss_iod() { let test_max_relative = 1e-11; let test_epsilon = 1e-11; @@ -23,10 +23,10 @@ fn test_gauss_iod() { let ut1_provider = Ut1Provider::download_from_jpl("latest_eop2.long") .expect("Download of the JPL short time scale UT1 data failed"); - let jpl_file: EphemFileSource = "naif:DE440" + let jpl_file: EphemFileSource = "horizon:DE440" .try_into() .expect("Failed to parse JPL ephemeris source"); - let jpl_ephem = JPLEphem::new(&jpl_file).expect("Failed to load JPL ephemeris from Naif"); + let jpl_ephem = JPLEphem::new(&jpl_file).expect("Failed to load JPL ephemeris from Horizon"); let (obs_dataset, errors) = ObsDataset::from_mpc_80_col_files(&[ "tests/data/2015AB.obs", @@ -51,6 +51,7 @@ fn test_gauss_iod() { &jpl_ephem, &ut1_provider, &default, + ObsErrorModel::FCCT14, &mut StdRng::seed_from_u64(42), ) .unwrap(); @@ -59,61 +60,61 @@ fn test_gauss_iod() { let orbit = best_orbit.get_orbit(); let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { - reference_epoch: 57049.22904452732, - semi_major_axis: 1.8017634341924542, - eccentricity: 0.28360400982137396, - inclination: 0.20267485730439427, - ascending_node_longitude: 0.00810182022710516, - periapsis_argument: 1.2445523487100616, - mean_anomaly: 0.44069989140091426, + reference_epoch: 57049.2684537375, + semi_major_axis: 1.801740835743616, + eccentricity: 0.28356259478492557, + inclination: 0.2026828189979528, + ascending_node_longitude: 0.007951791820548622, + periapsis_argument: 1.2450647642587158, + mean_anomaly: 0.4408048786626789, }); assert!(approx_equal(&expected_orbit, orbit, test_epsilon)); assert_relative_eq!( best_rms, - 47.67954270293223, + 66.97479288637471, epsilon = test_epsilon, max_relative = test_max_relative ); let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { - reference_epoch: 60672.24113100201, - semi_major_axis: 3.189546977249391, - eccentricity: 0.05434034666134485, - inclination: 0.18343383575588465, - ascending_node_longitude: 0.03253594968161228, - periapsis_argument: 2.0197545218038355, - mean_anomaly: 4.85070383704545, + reference_epoch: 60672.2443617134, + semi_major_axis: 3.2199380906809876, + eccentricity: 0.0624192099888107, + inclination: 0.1829771029880289, + ascending_node_longitude: 0.030775930195064964, + periapsis_argument: 1.9053705720223801, + mean_anomaly: 4.980622835177979, }); - let (best_orbit, best_rms) = full_orbit.remove(&"8467".into()).unwrap().unwrap(); + let (best_orbit, best_rms) = full_orbit.remove(&8467_u32.into()).unwrap().unwrap(); let orbit = best_orbit.get_orbit(); assert!(approx_equal(&expected_orbit, orbit, test_epsilon)); assert_relative_eq!( best_rms, - 0.550927559734816, + 0.5739558189489471, epsilon = test_epsilon, max_relative = test_max_relative ); let expected_orbit = OrbitalElements::Keplerian(KeplerianElements { - reference_epoch: 60465.26778016307, - semi_major_axis: 2.192136202201971, - eccentricity: 0.2042936374305811, - inclination: 0.1189651192106584, - ascending_node_longitude: 3.091130251223283, - periapsis_argument: 2.4714439663661487, - mean_anomaly: 4.9466622638827324, + reference_epoch: 60465.26777915681, + semi_major_axis: 2.1874983804796972, + eccentricity: 0.20256414489486008, + inclination: 0.11906245183260411, + ascending_node_longitude: 3.0918063960305293, + periapsis_argument: 2.4793248309745692, + mean_anomaly: 4.934465465531324, }); - let (best_orbit, best_rms) = full_orbit.remove(&"33803".into()).unwrap().unwrap(); + let (best_orbit, best_rms) = full_orbit.remove(&33803_u32.into()).unwrap().unwrap(); let orbit = best_orbit.get_orbit(); assert!(approx_equal(&expected_orbit, orbit, test_epsilon)); assert_relative_eq!( best_rms, - 6.319395085728921, + 18.963755528781288, epsilon = test_epsilon, max_relative = test_max_relative ); From 9b8319442c2ccc6d1026786f869815e547b98965 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 19 May 2026 15:27:02 +0200 Subject: [PATCH 05/47] remove old benchs and examples, add new tests from parquet file to orbit --- Cargo.lock | 2057 +++++++++++++++++++----- Cargo.toml | 69 +- benches/gauss_prelim_orbit.rs | 148 -- benches/load_parquet.rs | 54 - benches/outfit_gauss_iod.rs | 122 -- benches/solve_kepler_equation.rs | 161 -- examples/gauss_iod_once.rs | 95 -- examples/parquet_to_orbit.rs | 659 -------- src/initial_orbit_determination/mod.rs | 26 - src/outfit_errors.rs | 4 - tests/data/test_data_traj_str.parquet | Bin 0 -> 19876139 bytes tests/test_iod_from_polars.rs | 144 ++ tests/trajectories_from_parquet.rs | 69 - tests/trajectories_from_vec.rs | 68 - tests/vec_to_iod.rs | 281 ---- 15 files changed, 1848 insertions(+), 2109 deletions(-) delete mode 100644 benches/gauss_prelim_orbit.rs delete mode 100644 benches/load_parquet.rs delete mode 100644 benches/outfit_gauss_iod.rs delete mode 100644 benches/solve_kepler_equation.rs delete mode 100644 examples/gauss_iod_once.rs delete mode 100644 examples/parquet_to_orbit.rs create mode 100644 tests/data/test_data_traj_str.parquet create mode 100644 tests/test_iod_from_polars.rs delete mode 100644 tests/trajectories_from_parquet.rs delete mode 100644 tests/trajectories_from_vec.rs delete mode 100644 tests/vec_to_iod.rs diff --git a/Cargo.lock b/Cargo.lock index 781cb90..9ad6768 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,8 +35,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "const-random", - "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -51,6 +49,33 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -88,110 +113,94 @@ dependencies = [ ] [[package]] -name = "arrayvec" -version = "0.7.6" +name = "ar_archive_writer" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" +dependencies = [ + "object", +] [[package]] -name = "arrow-array" -version = "54.3.1" +name = "argminmax" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12fcdb3f1d03f69d3ec26ac67645a8fe3f878d77b5ebb0b15d64a116c212985" +checksum = "70f13d10a41ac8d2ec79ee34178d61e6f47a29c2edfe7ef1721c7383b0359e65" dependencies = [ - "ahash", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "chrono", "half", - "hashbrown 0.15.5", - "num", + "num-traits", ] [[package]] -name = "arrow-buffer" -version = "54.3.1" +name = "array-init-cursor" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "263f4801ff1839ef53ebd06f99a56cecd1dbaf314ec893d93168e2e860e0291c" -dependencies = [ - "bytes", - "half", - "num", -] +checksum = "ed51fe0f224d1d4ea768be38c51f9f831dee9d05c163c11fba0b8c44387b1fc3" [[package]] -name = "arrow-cast" -version = "54.3.1" +name = "arrayref" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede6175fbc039dfc946a61c1b6d42fd682fcecf5ab5d148fbe7667705798cac9" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", - "atoi", - "base64", - "chrono", - "half", - "lexical-core", - "num", - "ryu", -] +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] -name = "arrow-data" -version = "54.3.1" +name = "async-channel" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfdd7d99b4ff618f167e548b2411e5dd2c98c0ddebedd7df433d34c20a4429" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ - "arrow-buffer", - "arrow-schema", - "half", - "num", + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", ] [[package]] -name = "arrow-ipc" -version = "54.3.1" +name = "async-stream" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ff528658b521e33905334723b795ee56b393dbe9cf76c8b1f64b648c65a60c" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "flatbuffers", + "async-stream-impl", + "futures-core", + "pin-project-lite", ] [[package]] -name = "arrow-schema" -version = "54.3.1" +name = "async-stream-impl" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cfaf5e440be44db5413b75b72c2a87c1f8f0627117d110264048f2969b99e9" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "arrow-select" -version = "54.3.1" +name = "async-trait" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69efcd706420e52cd44f5c4358d279801993846d1c2a8e52111853d61d55a619" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ - "ahash", - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "num", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "atoi" -version = "2.0.0" +name = "atoi_simd" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +checksum = "8ad17c7c205c2c28b527b9845eeb91cf1b4d008b438f98ce0e628227a822758e" dependencies = [ - "num-traits", + "debug_unsafe", ] [[package]] @@ -218,7 +227,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -227,6 +236,26 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -244,15 +273,62 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +dependencies = [ + "serde_core", +] [[package]] -name = "bitflags" -version = "2.11.1" +name = "blake3" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "boxcar" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e" + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] [[package]] name = "bumpalo" @@ -271,18 +347,29 @@ name = "bytemuck" version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] [[package]] -name = "byteorder" -version = "1.5.0" +name = "bytemuck_derive" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] [[package]] name = "camino" @@ -296,13 +383,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" -version = "1.2.60" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -318,15 +416,38 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ + "android-tzdata", "iana-time-zone", "num-traits", - "windows-link", + "serde", + "windows-link 0.1.3", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf", ] [[package]] @@ -387,39 +508,49 @@ version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" dependencies = [ + "crossterm", "unicode-segmentation", "unicode-width", ] [[package]] -name = "console" -version = "0.16.3" +name = "compact_str" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" dependencies = [ - "encode_unicode", - "libc", - "windows-sys 0.61.2", + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "serde", + "static_assertions", ] [[package]] -name = "const-random" -version = "0.1.18" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "const-random-macro", + "crossbeam-utils", ] [[package]] -name = "const-random-macro" -version = "0.1.16" +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "core-foundation" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ - "getrandom 0.2.17", - "once_cell", - "tiny-keccak", + "core-foundation-sys", + "libc", ] [[package]] @@ -428,6 +559,33 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + [[package]] name = "criterion" version = "0.5.1" @@ -464,6 +622,15 @@ dependencies = [ "itertools 0.10.5", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -483,18 +650,76 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags", + "crossterm_winapi", + "document-features", + "parking_lot", + "rustix", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + [[package]] name = "crunchy" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "debug_unsafe" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eed2c4702fa172d1ce21078faa7c5203e69f5394d48cc436d25928394a867a2" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "directories" version = "6.0.0" @@ -528,16 +753,25 @@ dependencies = [ ] [[package]] -name = "either" -version = "1.15.0" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] [[package]] -name = "encode_unicode" -version = "1.0.0" +name = "dyn-clone" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "equivalent" @@ -556,41 +790,87 @@ dependencies = [ ] [[package]] -name = "fastrand" -version = "2.4.1" +name = "ethnum" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" [[package]] -name = "find-msvc-tools" -version = "0.1.9" +name = "event-listener" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] [[package]] -name = "flatbuffers" -version = "24.12.23" +name = "event-listener-strategy" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1baf0dbf96932ec9a3038d57900329c015b0bfb7b63d904f3bc27e2b02a096" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "bitflags 1.3.2", - "rustc_version", + "event-listener", + "pin-project-lite", ] [[package]] -name = "fnv" -version = "1.0.7" +name = "fallible-streaming-iterator" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] -name = "foldhash" -version = "0.1.5" +name = "fast-float2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" [[package]] -name = "form_urlencoded" +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" @@ -598,6 +878,31 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs4" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8640e34b88f7652208ce9e88b1a37a2ae95227d84abec377ccd3c5cfeb141ed4" +dependencies = [ + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.32" @@ -605,6 +910,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -613,6 +919,17 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.32" @@ -648,6 +965,7 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -658,6 +976,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -694,6 +1022,7 @@ dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", + "rand_core 0.10.1", "wasip2", "wasip3", ] @@ -704,11 +1033,17 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "h2" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" dependencies = [ "atomic-waker", "bytes", @@ -729,9 +1064,11 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ + "bytemuck", "cfg-if", "crunchy", "num-traits", + "serde", "zerocopy", ] @@ -741,14 +1078,30 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "allocator-api2", + "equivalent", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", + "rayon", + "serde", + "serde_core", ] [[package]] name = "hashbrown" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -762,11 +1115,17 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "hifitime" -version = "4.2.6" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f1dfc1be6cd1c3a44704db0a8800aa53ebb07a9509535a0261cd387eedee7c" +checksum = "a978b79fb40cea4c6592890ffe0021dfea5c51a107fbac565abae82fd24a15af" dependencies = [ "js-sys", "lexical-core", @@ -781,6 +1140,15 @@ dependencies = [ "web-time", ] +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "http" version = "1.4.0" @@ -820,6 +1188,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + [[package]] name = "husky-rs" version = "0.1.5" @@ -857,6 +1231,7 @@ dependencies = [ "hyper", "hyper-util", "rustls", + "rustls-native-certs", "tokio", "tokio-rustls", "tower-service", @@ -1011,9 +1386,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1026,44 +1401,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.17.0", + "hashbrown 0.17.1", "serde", "serde_core", ] -[[package]] -name = "indicatif" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" -dependencies = [ - "console", - "portable-atomic", - "unit-prefix", -] - -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - [[package]] name = "ipnet" version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is-terminal" version = "0.4.17" @@ -1099,11 +1447,21 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + [[package]] name = "js-sys" -version = "0.3.95" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ "cfg-if", "futures-util", @@ -1126,8 +1484,6 @@ dependencies = [ "lexical-parse-float", "lexical-parse-integer", "lexical-util", - "lexical-write-float", - "lexical-write-integer", ] [[package]] @@ -1155,25 +1511,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" -[[package]] -name = "lexical-write-float" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" -dependencies = [ - "lexical-util", - "lexical-write-integer", -] - -[[package]] -name = "lexical-write-integer" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" -dependencies = [ - "lexical-util", -] - [[package]] name = "libc" version = "0.2.186" @@ -1207,6 +1544,21 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.29" @@ -1219,6 +1571,25 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "lz4" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" +dependencies = [ + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "matrixmultiply" version = "0.3.10" @@ -1235,6 +1606,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1242,6 +1622,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -1292,17 +1673,12 @@ dependencies = [ ] [[package]] -name = "num" -version = "0.4.3" +name = "now" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +checksum = "6d89e9874397a1f0a52fc1f197a8effd9735223cb2390e9dcc83ac6cd02923d0" dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", + "chrono", ] [[package]] @@ -1325,22 +1701,22 @@ dependencies = [ ] [[package]] -name = "num-integer" -version = "0.1.46" +name = "num-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "num-traits", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "num-iter" -version = "0.1.45" +name = "num-integer" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", - "num-integer", "num-traits", ] @@ -1374,6 +1750,43 @@ dependencies = [ "memchr", ] +[[package]] +name = "object_store" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622acbc9100d3c10e2ee15804b0caa40e55c933d5aa53814cd520805b7958a49" +dependencies = [ + "async-trait", + "base64", + "bytes", + "chrono", + "form_urlencoded", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body-util", + "humantime", + "hyper", + "itertools 0.14.0", + "parking_lot", + "percent-encoding", + "quick-xml", + "rand 0.10.1", + "reqwest", + "ring", + "serde", + "serde_json", + "serde_urlencoded", + "thiserror", + "tokio", + "tracing", + "url", + "walkdir", + "wasm-bindgen-futures", + "web-time", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -1387,19 +1800,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] -name = "option-ext" -version = "0.2.0" +name = "openssl-probe" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] -name = "ordered-float" -version = "2.10.1" +name = "option-ext" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" @@ -1419,29 +1829,21 @@ dependencies = [ "aberth", "ahash", "approx", - "arrow-array", "camino", - "comfy-table", "criterion", "directories", "hifitime", "husky-rs", - "indicatif", - "itertools 0.14.0", "nalgebra", "nom", - "once_cell", - "ordered-float 5.3.0", - "parquet", + "ordered-float", "photom", + "polars", "proptest", - "quick-xml 0.37.5", "rand 0.9.4", "rand_distr", - "rayon", "reqwest", "roots", - "serde", "smallvec", "thiserror", "tokio", @@ -1461,45 +1863,64 @@ dependencies = [ ] [[package]] -name = "parquet" -version = "54.3.1" +name = "parking" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb15796ac6f56b429fd99e33ba133783ad75b27c36b4b5ce06f1f82cc97754e" -dependencies = [ - "ahash", - "arrow-array", - "arrow-buffer", - "arrow-cast", - "arrow-data", - "arrow-ipc", - "arrow-schema", - "arrow-select", - "base64", - "bytes", - "chrono", - "half", - "hashbrown 0.15.5", - "num", - "num-bigint", - "paste", - "seq-macro", - "snap", - "thrift", - "twox-hash", -] +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] -name = "paste" -version = "1.0.15" +name = "parking_lot" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] [[package]] -name = "percent-encoding" -version = "2.3.2" +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher", +] + [[package]] name = "photom" version = "0.1.0" @@ -1510,8 +1931,9 @@ dependencies = [ "hifitime", "itertools 0.14.0", "nom", - "ordered-float 5.3.0", - "quick-xml 0.39.2", + "ordered-float", + "polars", + "quick-xml", "serde", "thiserror", "ureq", @@ -1523,6 +1945,22 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "planus" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3daf8e3d4b712abe1d690838f6e29fb76b76ea19589c4afa39ec30e12f62af71" +dependencies = [ + "array-init-cursor", + "hashbrown 0.15.5", +] + [[package]] name = "plotters" version = "0.3.7" @@ -1552,10 +1990,555 @@ dependencies = [ ] [[package]] -name = "portable-atomic" -version = "1.13.1" +name = "polars" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899852b723e563dc3cbdc7ea833b14ec44e61309f55df29ba86d45cfd6bc141a" +dependencies = [ + "getrandom 0.2.17", + "getrandom 0.3.4", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-core", + "polars-error", + "polars-io", + "polars-lazy", + "polars-ops", + "polars-parquet", + "polars-sql", + "polars-time", + "polars-utils", + "version_check", +] + +[[package]] +name = "polars-arrow" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f672743a042b72ace4f88b29f8205ab200b29c5ac976c0560899680c07d2d09" +dependencies = [ + "atoi_simd", + "bitflags", + "bytemuck", + "bytes", + "chrono", + "chrono-tz", + "dyn-clone", + "either", + "ethnum", + "getrandom 0.2.17", + "getrandom 0.3.4", + "half", + "hashbrown 0.16.1", + "itoa", + "lz4", + "num-traits", + "polars-arrow-format", + "polars-buffer", + "polars-error", + "polars-schema", + "polars-utils", + "serde", + "simdutf8", + "streaming-iterator", + "strum_macros", + "version_check", + "zstd", +] + +[[package]] +name = "polars-arrow-format" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a556ac0ee744e61e167f34c1eb0013ce740e0ee6cd8c158b2ec0b518f10e6675" +dependencies = [ + "planus", + "serde", +] + +[[package]] +name = "polars-buffer" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7011424c3a79ca9c1272c7b4f5fe98695d3bed45595e37bb23c16a2978c80c" +dependencies = [ + "bytemuck", + "either", + "serde", + "version_check", +] + +[[package]] +name = "polars-compute" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a32eca8e08ac4cc5de2ac3996d2b38567bba72cdb19bbfd94c370193ed51dd" +dependencies = [ + "atoi_simd", + "bytemuck", + "chrono", + "either", + "fast-float2", + "hashbrown 0.16.1", + "itoa", + "num-traits", + "polars-arrow", + "polars-buffer", + "polars-error", + "polars-utils", + "rand 0.9.4", + "serde", + "strength_reduce", + "strum_macros", + "version_check", + "zmij", +] + +[[package]] +name = "polars-core" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726296966d04268ee9679c2062af2d06c83c7a87379be471defe616b244c5029" +dependencies = [ + "bitflags", + "boxcar", + "bytemuck", + "chrono", + "chrono-tz", + "comfy-table", + "either", + "getrandom 0.3.4", + "hashbrown 0.16.1", + "indexmap", + "itoa", + "num-traits", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-dtype", + "polars-error", + "polars-row", + "polars-schema", + "polars-utils", + "rand 0.9.4", + "rand_distr", + "rayon", + "regex", + "serde", + "serde_json", + "strum_macros", + "uuid", + "version_check", + "xxhash-rust", +] + +[[package]] +name = "polars-dtype" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51976dc46d42cd1e7ca252a9e3bdc90c63b0bfa7030047ebaf5250c2b7838fa6" +dependencies = [ + "boxcar", + "hashbrown 0.16.1", + "polars-arrow", + "polars-error", + "polars-utils", + "serde", + "uuid", +] + +[[package]] +name = "polars-error" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c13126f8baebc13dadf26a80dcf69a607977fc8a67b18671ad2cefc713a7bdd" +dependencies = [ + "object_store", + "parking_lot", + "polars-arrow-format", + "regex", + "signal-hook", + "simdutf8", +] + +[[package]] +name = "polars-expr" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "2151f54b0ae5d6b86c3c47df0898ff90edfe774807823f742f36e44973d51ea1" +dependencies = [ + "bitflags", + "hashbrown 0.16.1", + "num-traits", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-core", + "polars-io", + "polars-ops", + "polars-plan", + "polars-row", + "polars-time", + "polars-utils", + "rand 0.9.4", + "rayon", + "recursive", + "regex", + "version_check", +] + +[[package]] +name = "polars-io" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059724d7762d7332cbc225e6504d996091b28fa1337716e06e5a81d9e54a34ad" +dependencies = [ + "async-trait", + "atoi_simd", + "blake3", + "bytes", + "chrono", + "fast-float2", + "fs4", + "futures", + "glob", + "hashbrown 0.16.1", + "home", + "itoa", + "memchr", + "memmap2", + "num-traits", + "object_store", + "percent-encoding", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-core", + "polars-error", + "polars-parquet", + "polars-schema", + "polars-time", + "polars-utils", + "rayon", + "regex", + "reqwest", + "serde", + "serde_json", + "simdutf8", + "tokio", + "zmij", +] + +[[package]] +name = "polars-lazy" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e1e24d4db8c349e9576564cfff47a3f08bb831dba9168f6599be178bc725e8" +dependencies = [ + "bitflags", + "chrono", + "either", + "memchr", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-core", + "polars-expr", + "polars-io", + "polars-mem-engine", + "polars-ops", + "polars-plan", + "polars-stream", + "polars-time", + "polars-utils", + "rayon", + "version_check", +] + +[[package]] +name = "polars-mem-engine" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c394e4cd90186043d4051ce118e90794afbe81ac5eb9a51e358a56728e8ebde3" +dependencies = [ + "memmap2", + "polars-arrow", + "polars-core", + "polars-error", + "polars-expr", + "polars-io", + "polars-ops", + "polars-plan", + "polars-time", + "polars-utils", + "rayon", + "recursive", +] + +[[package]] +name = "polars-ops" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e47b2d9b3627662650da0a8c76ce5101ed1c61b104cb2b3663e0dc711571b12" +dependencies = [ + "argminmax", + "base64", + "bytemuck", + "chrono", + "chrono-tz", + "either", + "hashbrown 0.16.1", + "hex", + "indexmap", + "libm", + "memchr", + "num-traits", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-core", + "polars-error", + "polars-schema", + "polars-utils", + "rayon", + "regex", + "regex-syntax", + "strum_macros", + "unicode-normalization", + "unicode-reverse", + "version_check", +] + +[[package]] +name = "polars-parquet" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436bae3e89438cafe69400e7567057d7d9820d21ac9a4f69a33b413f2666f03d" +dependencies = [ + "async-stream", + "base64", + "brotli", + "bytemuck", + "ethnum", + "flate2", + "futures", + "hashbrown 0.16.1", + "lz4", + "num-traits", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-error", + "polars-parquet-format", + "polars-utils", + "regex", + "serde", + "simdutf8", + "snap", + "streaming-decompression", + "zstd", +] + +[[package]] +name = "polars-parquet-format" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c025243dcfe8dbc57e94d9f82eb3bef10b565ab180d5b99bed87fd8aea319ce1" +dependencies = [ + "async-trait", + "futures", +] + +[[package]] +name = "polars-plan" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7930d5ae1d006179e65f01af57c859307b5875a4cc078dc75257250b9ae5162" +dependencies = [ + "bitflags", + "blake3", + "bytemuck", + "bytes", + "chrono", + "chrono-tz", + "either", + "futures", + "hashbrown 0.16.1", + "memmap2", + "num-traits", + "percent-encoding", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-core", + "polars-error", + "polars-io", + "polars-ops", + "polars-parquet", + "polars-time", + "polars-utils", + "rayon", + "recursive", + "regex", + "sha2", + "slotmap", + "strum_macros", + "tokio", + "version_check", +] + +[[package]] +name = "polars-row" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ea1a4554fe06442db1d6229235cd358e8eacba96aed8718f612caf3e3a646" +dependencies = [ + "bitflags", + "bytemuck", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-dtype", + "polars-error", + "polars-utils", +] + +[[package]] +name = "polars-schema" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d688e73f9156f93cb29350be144c8f1e84c1bc705f00ee7f15eb9706a7971273" +dependencies = [ + "indexmap", + "polars-error", + "polars-utils", + "serde", + "version_check", +] + +[[package]] +name = "polars-sql" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "100415f86069d7e9fbf54737148fc161a7c7316a6a7d375fb6cfc7fc64f570ae" +dependencies = [ + "bitflags", + "hex", + "polars-core", + "polars-error", + "polars-lazy", + "polars-ops", + "polars-plan", + "polars-time", + "polars-utils", + "regex", + "serde", + "sqlparser", +] + +[[package]] +name = "polars-stream" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65a0c054bdf16efd16bbc587e8d5418ae28464d61afd735513579cd3c338fa70" +dependencies = [ + "async-channel", + "async-trait", + "atomic-waker", + "bitflags", + "bytes", + "chrono-tz", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-queue", + "crossbeam-utils", + "futures", + "memchr", + "memmap2", + "num-traits", + "parking_lot", + "percent-encoding", + "pin-project-lite", + "polars-arrow", + "polars-buffer", + "polars-compute", + "polars-core", + "polars-error", + "polars-expr", + "polars-io", + "polars-mem-engine", + "polars-ops", + "polars-parquet", + "polars-plan", + "polars-time", + "polars-utils", + "rand 0.9.4", + "rayon", + "recursive", + "slotmap", + "tokio", + "version_check", +] + +[[package]] +name = "polars-time" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e80404e1e418c997230e3b2972c3be331f45df8bdd3150fe3bef562c7a332f" +dependencies = [ + "atoi_simd", + "bytemuck", + "chrono", + "chrono-tz", + "now", + "num-traits", + "polars-arrow", + "polars-compute", + "polars-core", + "polars-error", + "polars-ops", + "polars-utils", + "rayon", + "regex", + "strum_macros", +] + +[[package]] +name = "polars-utils" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c97cabf53eb8fbf6050cde3fef8f596c51cc25fd7d55fbde108d815ee6674abf" +dependencies = [ + "argminmax", + "bincode", + "bytemuck", + "bytes", + "compact_str", + "either", + "flate2", + "foldhash 0.2.0", + "half", + "hashbrown 0.16.1", + "indexmap", + "libc", + "memmap2", + "num-derive", + "num-traits", + "polars-error", + "rand 0.9.4", + "raw-cpuid", + "rayon", + "regex", + "rmp-serde", + "serde", + "serde_json", + "serde_stacker", + "slotmap", + "stacker", + "uuid", + "version_check", +] [[package]] name = "potential_utf" @@ -1624,7 +2607,7 @@ checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.11.1", + "bitflags", "num-traits", "rand 0.9.4", "rand_chacha", @@ -1636,26 +2619,26 @@ dependencies = [ ] [[package]] -name = "quick-error" -version = "1.2.3" +name = "psm" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +checksum = "645dbe486e346d9b5de3ef16ede18c26e6c70ad97418f4874b8b1889d6e761ea" +dependencies = [ + "ar_archive_writer", + "cc", +] [[package]] -name = "quick-xml" -version = "0.37.5" +name = "quick-error" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" -dependencies = [ - "memchr", - "serde", -] +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quick-xml" -version = "0.39.2" +version = "0.39.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" dependencies = [ "memchr", "serde", @@ -1757,6 +2740,17 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.9.0" @@ -1785,6 +2779,12 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "rand_distr" version = "0.5.1" @@ -1804,6 +2804,15 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags", +] + [[package]] name = "rawpointer" version = "0.2.1" @@ -1830,6 +2839,35 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "recursive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0786a43debb760f491b1bc0269fe5e84155353c67482b9e60d0cfb596054b43e" +dependencies = [ + "recursive-proc-macro-impl", + "stacker", +] + +[[package]] +name = "recursive-proc-macro-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.5.2" @@ -1893,6 +2931,7 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", + "rustls-native-certs", "rustls-pki-types", "serde", "serde_json", @@ -1916,14 +2955,33 @@ dependencies = [ name = "ring" version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", + "rmp", + "serde", ] [[package]] @@ -1944,22 +3002,13 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - [[package]] name = "rustix" version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -1968,9 +3017,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.39" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "log", "once_cell", @@ -1981,11 +3030,23 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "web-time", "zeroize", @@ -2045,16 +3106,48 @@ dependencies = [ ] [[package]] -name = "semver" -version = "1.0.28" +name = "schannel" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] [[package]] -name = "seq-macro" -version = "0.3.6" +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -2099,6 +3192,17 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_stacker" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4936375d50c4be7eff22293a9344f8e46f323ed2b3c243e52f89138d9bb0f4a" +dependencies = [ + "serde", + "serde_core", + "stacker", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2111,12 +3215,43 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a0c28ca5908dbdbcd52e6fdaa00358ab88637f8ab33e1f188dd510eb44b53d" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + [[package]] name = "simba" version = "0.9.1" @@ -2130,12 +3265,39 @@ dependencies = [ "wide", ] +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + [[package]] name = "slab" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.15.1" @@ -2180,18 +3342,86 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "sqlparser" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505aa16b045c4c1375bf5f125cce3813d0176325bfe9ffc4a903f423de7774ff" +dependencies = [ + "log", + "recursive", + "sqlparser_derive", +] + +[[package]] +name = "sqlparser_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028e551d5e270b31b9f3ea271778d9d827148d4287a5d96167b6bb9787f5cc38" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "stacker" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "640c8cdd92b6b12f5bcb1803ca3bbf5ab96e5e6b6b96b9ab77dabe9e880b3190" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.61.2", +] + [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "streaming-decompression" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf6cc3b19bfb128a8ad11026086e31d3ce9ad23f8ea37354b31383a187c44cf3" +dependencies = [ + "fallible-streaming-iterator", +] + +[[package]] +name = "streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" + +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "subtle" version = "2.6.1" @@ -2295,26 +3525,6 @@ dependencies = [ "syn", ] -[[package]] -name = "thrift" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" -dependencies = [ - "byteorder", - "integer-encoding", - "ordered-float 2.10.1", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinystr" version = "0.8.3" @@ -2352,18 +3562,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", "mio", "pin-project-lite", "socket2", + "tokio-macros", "windows-sys 0.61.2", ] +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tokio-rustls" version = "0.26.4" @@ -2415,20 +3637,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.11.1", + "bitflags", "bytes", "futures-util", "http", "http-body", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -2450,9 +3672,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tracing-core" version = "0.1.36" @@ -2468,16 +3702,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "twox-hash" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" -dependencies = [ - "cfg-if", - "static_assertions", -] - [[package]] name = "typenum" version = "1.20.0" @@ -2496,6 +3720,24 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-reverse" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6f4888ebc23094adfb574fdca9fdc891826287a6397d2cd28802ffd6f20c76" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "unicode-segmentation" version = "1.13.2" @@ -2514,18 +3756,18 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unit-prefix" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" - [[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + [[package]] name = "ureq" version = "3.3.0" @@ -2578,12 +3820,30 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + [[package]] name = "wait-timeout" version = "0.2.1" @@ -2638,9 +3898,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.118" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -2651,9 +3911,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.68" +version = "0.4.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" dependencies = [ "js-sys", "wasm-bindgen", @@ -2661,9 +3921,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.118" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2671,9 +3931,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.118" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -2684,9 +3944,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.118" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] @@ -2732,7 +3992,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags", "hashbrown 0.15.5", "indexmap", "semver", @@ -2740,9 +4000,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.95" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" dependencies = [ "js-sys", "wasm-bindgen", @@ -2777,6 +4037,22 @@ dependencies = [ "safe_arch", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + [[package]] name = "winapi-util" version = "0.1.11" @@ -2786,6 +4062,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-core" version = "0.62.2" @@ -2794,7 +4076,7 @@ checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link", + "windows-link 0.2.1", "windows-result", "windows-strings", ] @@ -2821,6 +4103,12 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-link" version = "0.2.1" @@ -2833,7 +4121,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -2842,7 +4130,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -2854,6 +4142,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.60.2" @@ -2869,7 +4166,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -2894,7 +4191,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link", + "windows-link 0.2.1", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -3065,7 +4362,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags", "indexmap", "log", "serde", @@ -3101,6 +4398,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + [[package]] name = "yoke" version = "0.8.2" @@ -3146,9 +4449,9 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] @@ -3204,8 +4507,42 @@ dependencies = [ "syn", ] +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index 8d94981..a647e61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,36 +25,23 @@ photom = { version = "0.1.0", path = "../photom" } aberth = { version = "0.4.1", default-features = false } ahash = { version = "0.8.11", default-features = false } -arrow-array = { version = "54.3.1", default-features = false } camino = { version = "1.1.9", default-features = false } directories = "6.0.0" hifitime = { version = "4.2.0", default-features = false, features = [ "ut1", "std", ] } -itertools = { version = "0.14.0", default-features = false, features = [ - "use_std", -] } nalgebra = { version = "0.33.2" } ordered-float = { version = "5.0.0", default-features = false } -parquet = { version = "54.2.1", default-features = false, features = [ - "arrow", - "snap", -] } -quick-xml = { version = "0.37.3", features = [ - "serialize", -], default-features = false } -serde = { version = "1.0", features = ["derive"], default-features = false } smallvec = { version = "1.14.0", default-features = false } thiserror = { version = "2.0.12", default-features = false } ureq = { version = "3.0.10", default-features = false, features = ["rustls"] } nom = { version = "8.0.0" } -once_cell = { version = "1.21.3", default-features = false } roots = { version = "0.0.8", default-features = false } rand = { version = "0.9.2", default-features = false, features = [ "std_rng", "os_rng", - "small_rng" + "small_rng", ] } rand_distr = { version = "0.5.1", default-features = false } @@ -70,9 +57,6 @@ tokio = { version = "1.44.1", default-features = false, features = [ "io-util", ] } tokio-stream = { version = "0.1.17", default-features = false } -indicatif = { version = "0.18", optional = true, default-features = false } -rayon = { version = "1.11.0", optional = true, default-features = false } -comfy-table = { version = "7.1.4", default-features = false } [dev-dependencies] approx = { version = "0.5.1", default-features = false } @@ -80,51 +64,12 @@ criterion = { version = "0.5.1", features = ["html_reports"] } husky-rs = "0.1.5" proptest = "1.7.0" -photom = { version = "0.1.0", path = "../photom", features = ["mpc_80_col", "ades"] } - -[features] -progress = ["dep:indicatif"] -parallel = ["dep:rayon"] - -[[test]] -name = "test_large_parquet" -path = "tests/trajectories_from_parquet.rs" -required-features = ["jpl-download"] - -[[test]] -name = "test_trajectories_from_vec" -path = "tests/trajectories_from_vec.rs" -required-features = ["jpl-download"] - -[[example]] -name = "gauss_iod_once" -path = "examples/gauss_iod_once.rs" -required-features = ["jpl-download"] - -[[example]] -name = "parquet_to_orbit" -path = "examples/parquet_to_orbit.rs" -required-features = ["jpl-download"] - -[[bench]] -name = "load_parquet" -harness = false -required-features = ["jpl-download"] - -[[bench]] -name = "outfit_gauss_iod" -harness = false -required-features = ["jpl-download"] - -[[bench]] -name = "solve_kepler_equation" -harness = false -required-features = ["jpl-download"] - -[[bench]] -name = "gauss_prelim_orbit" -harness = false -required-features = ["jpl-download"] +photom = { version = "0.1.0", path = "../photom", features = [ + "mpc_80_col", + "ades", + "polars", +] } +polars = { version = "0.53.0", features = ["is_in"] } [profile.bench] opt-level = 3 diff --git a/benches/gauss_prelim_orbit.rs b/benches/gauss_prelim_orbit.rs deleted file mode 100644 index 7621ca1..0000000 --- a/benches/gauss_prelim_orbit.rs +++ /dev/null @@ -1,148 +0,0 @@ -//! Benchmarks for GaussObs::prelim_orbit (single-threaded) -//! -//! Exemples d'exécution : -//! cargo bench --bench gauss_prelim_orbit --features jpl-download -//! cargo bench gauss_prelim_orbit -- gauss_prelim_orbit/single_call -//! cargo bench gauss_prelim_orbit -- gauss_prelim_orbit/batch_100 -//! cargo bench gauss_prelim_orbit -- gauss_prelim_orbit/noisy_batch_100 -//! -//! Astuce : vous pouvez aussi lancer en ligne de commande avec -//! RAYON_NUM_THREADS=1 cargo bench --bench gauss_prelim_orbit - -#![cfg_attr(not(feature = "jpl-download"), allow(dead_code))] - -use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; -use nalgebra::{Matrix3, Vector3}; - -use outfit::initial_orbit_determination::gauss::GaussObs; -use outfit::initial_orbit_determination::gauss_result::GaussResult; -use outfit::initial_orbit_determination::IODParams; -use outfit::outfit::Outfit; -use outfit::outfit_errors::OutfitError; -use rand::SeedableRng; - -/// Build global Outfit state (ephemerides, frames, etc.) -/// Note: keep this outside the hot loops. -fn build_state() -> Result { - // English in-code comments per user preference: - // Using FCCT14 as in production; adjust if you want to compare error models. - use outfit::error_models::ErrorModel; - Outfit::new("horizon:DE440", ErrorModel::FCCT14) -} - -/// Deterministic GaussObs fixture (angles in radians, times in MJD TT) -fn make_fixture_gaussobs() -> GaussObs { - let idx_obs = Vector3::new(0, 1, 2); - let ra = Vector3::new(1.6894680985108945, 1.6898614520910629, 1.7526450904422723); - let dec = Vector3::new( - 1.0825984522657437, - 0.943_679_018_934_623_1, - 0.827_517_321_571_201_4, - ); - let time = Vector3::new( - 57_028.454_047_592_59, - 57_049.231_857_592_59, - 57_063.959_487_592_59, - ); - - let observer_helio_position = Matrix3::new( - -0.264_135_633_607_079, - -0.588_973_552_650_573_5, - -0.774_192_148_350_372, - 0.869_046_620_910_086, - 0.724_011_718_791_646, - 0.561_510_219_548_918_2, - 0.376_746_685_666_572_5, - 0.313_873_420_677_094, - 0.243_444_791_401_658_5, - ); - - GaussObs::with_observer_position(idx_obs, ra, dec, time, observer_helio_position) -} - -/// Force Rayon (if used by downstream code) to a single worker thread. -/// Must be called before any Rayon pool is created by dependencies. -fn force_single_thread_pool() { - // Pure env-var approach: works even if we don't depend on rayon directly. - // Must be set very early, before any rayon usage. - std::env::set_var("RAYON_NUM_THREADS", "1"); - - // If you prefer hard enforcement and have rayon as a dev-dependency, - // you could uncomment this block (but it's optional): - // - // #[cfg(any())] - // { - // let _ = rayon::ThreadPoolBuilder::new() - // .num_threads(1) - // .build_global(); - // // Ignore the error if the global pool was already built. - // } -} - -fn bench_prelim_orbit(c: &mut Criterion) { - // Ensure single-threaded execution before anything else touches Rayon. - force_single_thread_pool(); - - let mut group = c.benchmark_group("gauss_prelim_orbit"); - - // Build global state once (outside hot loops). - let state = build_state().expect("Outfit state"); - - // Deterministic fixture. - let gauss = make_fixture_gaussobs(); - - // 1) Single call - group.bench_function("single_call", |b| { - b.iter(|| { - let res = gauss.prelim_orbit(black_box(&state), &IODParams::default()); - match res { - Ok(GaussResult::PrelimOrbit(_)) | Ok(GaussResult::CorrectedOrbit(_)) => {} - Err(e) => panic!("prelim_orbit failed: {e:?}"), - } - }) - }); - - // 2) Batch 100: reuse same input, measure algorithmic cost only - group.bench_function("batch_100", |b| { - b.iter_batched( - || gauss.clone(), - |g| { - for _ in 0..100 { - let res = g.prelim_orbit(&state, &IODParams::default()); - black_box(&res); - } - }, - BatchSize::SmallInput, - ) - }); - - // 3) Noisy: generate one noisy realization then run prelim_orbit - group.bench_function("noisy_single_call", |b| { - b.iter_batched( - || gauss.clone(), - |g| { - // 0.3" ≈ 1.454e-6 rad; use your production noise scale if different. - let sigma_rad = 1.5e-6_f64; - let mut rng = rand::rngs::StdRng::seed_from_u64(42); - let noisy = g.generate_noisy_realizations( - &(Vector3::zeros().add_scalar(1.0) * sigma_rad), - &(Vector3::zeros().add_scalar(1.0) * sigma_rad), - 100, - 1.0, - &mut rng, - ); - - for gg in noisy { - let res = gg.prelim_orbit(&state, &IODParams::default()); - black_box(&res); - } - }, - BatchSize::SmallInput, - ) - }); - - group.finish(); -} - -criterion_group!(gauss_benches, bench_prelim_orbit); -criterion_main!(gauss_benches); diff --git a/benches/load_parquet.rs b/benches/load_parquet.rs deleted file mode 100644 index c3580d1..0000000 --- a/benches/load_parquet.rs +++ /dev/null @@ -1,54 +0,0 @@ -use camino::Utf8Path; -use criterion::Throughput; -use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; -use outfit::error_models::ErrorModel; -use outfit::outfit::Outfit; -use outfit::trajectories::trajectory_file::TrajectoryFile; -use outfit::TrajectorySet; - -fn bench_load_parquet(c: &mut Criterion) { - let mut outfit = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); - let path = Utf8Path::new("tests/data/test_from_fink.parquet"); - let ztf_observer = outfit.get_observer_from_mpc_code(&"I41".into()); - - let mut batch_group = c.benchmark_group("batch_sizes"); - - for batch_size in [ - Some(2), - Some(4), - Some(8), - Some(16), - Some(32), - Some(64), - Some(128), - Some(256), - Some(512), - Some(1024), - Some(2048), - Some(4096), - Some(65536), - ] - .iter() - { - batch_group.throughput(Throughput::Elements(1)); - batch_group.bench_with_input( - BenchmarkId::from_parameter(format!("{batch_size:?}")), - batch_size, - |b, batch_size| { - b.iter(|| { - let _ = TrajectorySet::new_from_parquet( - &mut outfit, - path, - ztf_observer.clone(), - 0.5, - 0.5, - *batch_size, - ); - }) - }, - ); - } -} - -criterion_group!(benches, bench_load_parquet); -criterion_main!(benches); diff --git a/benches/outfit_gauss_iod.rs b/benches/outfit_gauss_iod.rs deleted file mode 100644 index d9acdc2..0000000 --- a/benches/outfit_gauss_iod.rs +++ /dev/null @@ -1,122 +0,0 @@ -// benches/outfit_gauss_iod.rs - -#[cfg(feature = "jpl-download")] -mod benches_impl { - use std::cell::RefCell; - - use camino::Utf8Path; - use criterion::{black_box, BatchSize, Criterion}; - use outfit::constants::ObjectNumber; - use outfit::error_models::ErrorModel; - use outfit::initial_orbit_determination::gauss_result::GaussResult; - use outfit::initial_orbit_determination::IODParams; - use outfit::observations::observations_ext::ObservationIOD; - use outfit::outfit::Outfit; - use outfit::outfit_errors::OutfitError; - use outfit::trajectories::trajectory_file::TrajectoryFile; - use outfit::TrajectorySet; - use rand::rngs::StdRng; - use rand::SeedableRng; - - /// Run Gauss IOD on a single trajectory and return the best orbit + RMS. - fn run_iod( - env_state: &mut Outfit, - traj_set: &mut TrajectorySet, - traj_number: &ObjectNumber, - ) -> Result<(GaussResult, f64), OutfitError> { - let obs = traj_set.get_mut(traj_number).expect("trajectory not found"); - let mut rng = StdRng::seed_from_u64(42); - - let params = IODParams::builder() - .n_noise_realizations(10) - .noise_scale(1.1) - .max_obs_for_triplets(obs.len()) - .max_triplets(30) - .build()?; - - obs.estimate_best_orbit(env_state, &ErrorModel::FCCT14, &mut rng, ¶ms) - } - - /// Prepare environment with DE440 and 3 trajectories. - fn prepare_env() -> (Outfit, TrajectorySet, [ObjectNumber; 3]) { - let mut env = Outfit::new("horizon:DE440", ErrorModel::FCCT14).expect("Outfit init"); - - let mut set = - TrajectorySet::new_from_80col(&mut env, Utf8Path::new("tests/data/2015AB.obs")); - set.add_from_80col(&mut env, Utf8Path::new("tests/data/8467.obs")); - set.add_from_80col(&mut env, Utf8Path::new("tests/data/33803.obs")); - - let ids = [ - ObjectNumber::String("K09R05F".into()), - ObjectNumber::String("8467".into()), - ObjectNumber::String("33803".into()), - ]; - - (env, set, ids) - } - - /// End-to-end benchmark. - pub fn bench_gauss_iod_e2e(c: &mut Criterion) { - c.bench_function("gauss_iod_e2e_all", |b| { - b.iter_batched( - prepare_env, - |(mut env, mut set, ids)| { - for id in &ids { - let res = run_iod(&mut env, &mut set, id).expect("IOD"); - black_box(res); - } - }, - BatchSize::SmallInput, - ) - }); - } - - /// Core benchmark. - pub fn bench_gauss_iod_core(c: &mut Criterion) { - let (env0, _set_once, _ids) = prepare_env(); - let env = RefCell::new(env0); - let target = ObjectNumber::String("K09R05F".into()); - let obs_path = Utf8Path::new("tests/data/2015AB.obs"); - - c.bench_function("gauss_iod_core_single_refcell", |b| { - b.iter_batched( - || { - let mut env_borrow = env.borrow_mut(); - TrajectorySet::new_from_80col(&mut env_borrow, obs_path) - }, - |mut set| { - let mut env_borrow = env.borrow_mut(); - let res = run_iod(&mut env_borrow, &mut set, &target).expect("IOD"); - black_box(res); - }, - BatchSize::SmallInput, - ) - }); - } -} - -#[cfg(feature = "jpl-download")] -use criterion::{criterion_group, criterion_main, Criterion}; - -#[cfg(feature = "jpl-download")] -criterion_group!( - name = benches; - config = Criterion::default() - .sample_size(30) - .warm_up_time(std::time::Duration::from_secs(5)) - .measurement_time(std::time::Duration::from_secs(25)) - .with_plots(); - targets = benches_impl::bench_gauss_iod_e2e, benches_impl::bench_gauss_iod_core -); - -#[cfg(feature = "jpl-download")] -criterion_main!(benches); - -// Fallback quand la feature est absente : fournit une main au crate. -#[cfg(not(feature = "jpl-download"))] -fn main() { - eprintln!( - "This benchmark requires the `jpl-download` feature. \ - Run with: `cargo bench --features jpl-download`" - ); -} diff --git a/benches/solve_kepler_equation.rs b/benches/solve_kepler_equation.rs deleted file mode 100644 index e6a1af5..0000000 --- a/benches/solve_kepler_equation.rs +++ /dev/null @@ -1,161 +0,0 @@ -use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; -use rand::rngs::StdRng; -use rand::{Rng, SeedableRng}; - -use outfit::orbit_type::equinoctial_element::EquinoctialElements; - -/// Uniform random in [0, 2π) -#[inline] -fn rand_angle(rng: &mut StdRng) -> f64 { - let two_pi = std::f64::consts::TAU; - rng.random::() * two_pi -} - -/// Build equinoctial elements with only h,k,λ set (others neutral). -#[inline] -fn make_equinoctial(h: f64, k: f64, lambda: f64) -> EquinoctialElements { - EquinoctialElements { - reference_epoch: 59000.0, - semi_major_axis: 1.0, // not used here - eccentricity_sin_lon: h, - eccentricity_cos_lon: k, - tan_half_incl_sin_node: 0.0, - tan_half_incl_cos_node: 0.0, - mean_longitude: lambda, - } -} - -/// Adjust λ so that λ >= ϖ, mimicking the production path in solve_two_body_problem. -#[inline] -fn align_lambda_with_periapsis(lambda: f64, w: f64) -> f64 { - let mut lam = lambda.rem_euclid(std::f64::consts::TAU); - let w_mod = w.rem_euclid(std::f64::consts::TAU); - if lam < w_mod { - lam += std::f64::consts::TAU; - } - lam -} - -/// Typical regime: e ∈ [0.0, 0.7] -fn bench_typical(c: &mut Criterion) { - let mut rng = StdRng::seed_from_u64(0xDEADBEEF); - let samples = 10_000usize; - - c.bench_function("solve_kepler_equation/typical_e<=0.7", |b| { - b.iter_batched( - || { - // Pre-generate inputs to avoid RNG cost in the timed section - (0..samples) - .map(|_| { - let e = rng.random_range(0.0..=0.7); - let w = rand_angle(&mut rng); - let lambda = align_lambda_with_periapsis(rand_angle(&mut rng), w); - let h = e * w.sin(); - let k = e * w.cos(); - (h, k, lambda, w) - }) - .collect::>() - }, - |cases| { - // Benchmark only the solver calls - for (h, k, lambda, w) in cases { - let equ = make_equinoctial(h, k, lambda); - let f = equ - .solve_kepler_equation(black_box(lambda), black_box(w)) - .unwrap(); - black_box(f); - } - }, - BatchSize::LargeInput, - ) - }); -} - -/// High-eccentricity (still elliptic): e ∈ [0.7, 0.9] -fn bench_high_e(c: &mut Criterion) { - let mut rng = StdRng::seed_from_u64(0xBADF00D); - let samples = 10_000usize; - - c.bench_function("solve_kepler_equation/high_e_0.7..0.9", |b| { - b.iter_batched( - || { - (0..samples) - .map(|_| { - let e = rng.random_range(0.7..0.9); - let w = rand_angle(&mut rng); - let lambda = align_lambda_with_periapsis(rand_angle(&mut rng), w); - let h = e * w.sin(); - let k = e * w.cos(); - (h, k, lambda, w) - }) - .collect::>() - }, - |cases| { - for (h, k, lambda, w) in cases { - let equ = make_equinoctial(h, k, lambda); - let _ = equ.solve_kepler_equation(black_box(lambda), black_box(w)); - } - }, - BatchSize::LargeInput, - ) - }); -} - -/// Near-circular regime: e ≈ 1e-12 -fn bench_near_circular(c: &mut Criterion) { - let mut rng = StdRng::seed_from_u64(0xFEEDFACE); - let samples = 10_000usize; - let e = 1e-12; - - c.bench_function("solve_kepler_equation/near_circular_e=1e-12", |b| { - b.iter_batched( - || { - (0..samples) - .map(|_| { - let w = rand_angle(&mut rng); - let lambda = align_lambda_with_periapsis(rand_angle(&mut rng), w); - let h = e * w.sin(); - let k = e * w.cos(); - (h, k, lambda, w) - }) - .collect::>() - }, - |cases| { - for (h, k, lambda, w) in cases { - let equ = make_equinoctial(h, k, lambda); - let f = equ - .solve_kepler_equation(black_box(lambda), black_box(w)) - .unwrap(); - black_box(f); - } - }, - BatchSize::LargeInput, - ) - }); -} - -/// Fixed “stress” case (from a previous failing input), useful for stability profiling. -fn bench_fixed_stress(c: &mut Criterion) { - // Example numbers; feel free to replace with your own worst-case input. - let e = 0.75_f64; - let w = -2.823_013_355_485_587_6_f64; - let lambda = 5.930_860_541_086_263_f64; - let h = e * w.sin(); - let k = e * w.cos(); - let lambda = align_lambda_with_periapsis(lambda, w); - let equ = make_equinoctial(h, k, lambda); - - c.bench_function("solve_kepler_equation/fixed_stress_case", |b| { - b.iter(|| { - let f = equ.solve_kepler_equation(black_box(lambda), black_box(w)); - black_box(f.ok()); - }) - }); -} - -criterion_group!( - name = benches; - config = Criterion::default(); - targets = bench_typical, bench_high_e, bench_near_circular, bench_fixed_stress -); -criterion_main!(benches); diff --git a/examples/gauss_iod_once.rs b/examples/gauss_iod_once.rs deleted file mode 100644 index d8db3e5..0000000 --- a/examples/gauss_iod_once.rs +++ /dev/null @@ -1,95 +0,0 @@ -#![cfg(feature = "jpl-download")] -use std::env; - -use camino::Utf8Path; -use rand::rngs::StdRng; -use rand::SeedableRng; - -use std::{thread, time::Duration}; - -use outfit::prelude::*; // Import most common Outfit types and traits - -/// Run Gauss IOD on a single trajectory and return the best orbit and RMS. -/// -/// Arguments -/// ----------------- -/// * `env_state`: The global environment (ephemeris, EOP, error model). -/// * `traj_set`: The trajectory container with parsed observations. -/// * `traj_number`: The object identifier present in `traj_set`. -/// -/// Return -/// ---------- -/// * `Ok((Option, f64))` — the best orbit (if any) and its RMS in mas. -/// * `Err(OutfitError)` — if the IOD pipeline fails. -/// -/// See also -/// ------------ -/// * [`ObservationIOD::estimate_best_orbit`] – High-level Gauss IOD entry point. -/// * [`IODParams`] – Controls triplet selection and stochastic noise. -/// * [`ErrorModel::FCCT14`] – Default astrometric error model used here. -fn run_iod_once( - env_state: &mut Outfit, - traj_set: &mut TrajectorySet, - traj_number: &ObjectNumber, -) -> Result<(GaussResult, f64), OutfitError> { - let obs = traj_set - .get_mut(traj_number) - .expect("trajectory not found in set"); - let mut rng = StdRng::seed_from_u64(42); - - let params = IODParams::builder() - .n_noise_realizations(10) - .noise_scale(1.1) - .max_obs_for_triplets(obs.len()) - .max_triplets(30) - .build()?; - - obs.estimate_best_orbit(env_state, &ErrorModel::FCCT14, &mut rng, ¶ms) -} - -/// Minimal driver: load three test trajectories, run IOD for the requested object once. -/// Usage: -/// gauss_iod_once [--verbose] -/// Example: -/// gauss_iod_once K09R05F --verbose -fn main() -> Result<(), OutfitError> { - let mut args = env::args().skip(1).collect::>(); - let verbose = if let Some(pos) = args.iter().position(|a| a == "--verbose") { - args.remove(pos); - true - } else { - false - }; - - let object = args - .first() - .cloned() - .unwrap_or_else(|| "K09R05F".to_string()); - let obj = ObjectNumber::String(object); - - // Warm environment (will read DE440 from cache if already downloaded). - let mut env = Outfit::new("horizon:DE440", ErrorModel::FCCT14)?; - - // Parse observations (adjust paths if needed). - let mut set = TrajectorySet::new_from_80col(&mut env, Utf8Path::new("tests/data/2015AB.obs")); - set.add_from_80col(&mut env, Utf8Path::new("tests/data/8467.obs")); - set.add_from_80col(&mut env, Utf8Path::new("tests/data/33803.obs")); - - // Run IOD once for the requested object. - let (best, rms) = run_iod_once(&mut env, &mut set, &obj)?; - - thread::sleep(Duration::from_millis(500)); // pause 0,5 s - - // Run IOD once for the requested object. - let (best2, rms2) = run_iod_once(&mut env, &mut set, &obj)?; - - if verbose { - eprintln!("[gauss_iod_once] object = {obj:?}, rms(mas) = {rms}"); - eprintln!("[gauss_iod_once] orbit = {:?}", best.get_orbit()); - - eprintln!("[gauss_iod_once] object = {obj:?}, rms(mas) = {rms2}"); - eprintln!("[gauss_iod_once] orbit = {:?}", best2.get_orbit()); - } - - Ok(()) -} diff --git a/examples/parquet_to_orbit.rs b/examples/parquet_to_orbit.rs deleted file mode 100644 index 3f94f8d..0000000 --- a/examples/parquet_to_orbit.rs +++ /dev/null @@ -1,659 +0,0 @@ -#![cfg(feature = "jpl-download")] -#![allow(non_snake_case)] -use camino::Utf8Path; -use outfit::trajectories::trajectory_fit::TrajectoryFit; -use rand::rngs::StdRng; -use rand::SeedableRng; - -use outfit::constants::ObjectNumber; -use outfit::initial_orbit_determination::gauss_result::GaussResult; -use std::collections::{BTreeMap, HashMap}; -use std::hash::BuildHasher; - -use outfit::prelude::*; - -// ======================= orbit classification ======================= - -/// A coarse taxonomy for small-body orbits in the Solar System. -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -enum OrbitClass { - /// Interior-Earth Objects: a < 1 AU and Q < 0.983 AU (entirely inside Earth's orbit) - Atira, - /// a < 1 AU and Q > 0.983 AU (crosses Earth's orbit from the inside) - Aten, - /// a ≥ 1 AU and q ≤ 1.017 AU (Earth-crossing from the outside) - Apollo, - /// 1.017 < q < 1.3 AU (near-Earth but non-crossing) - Amor, - /// Near-Earth Object fallback: q < 1.3 AU but not Atira/Aten/Apollo/Amor - Neo, - Hungaria, - MainBelt, - Hilda, - Centaur, - /// Trans-Neptunian Object - Tno, - /// a < 1 AU (non-Atira/Aten) — inner resonant / Vulcanoid-like - Inner, - Other, -} - -/// Classify an orbit using simple rules on a, e (→ q, Q) and inclination i (rad). -/// -/// Rules (coarse): -/// ----------------- -/// * q = a(1-e), Q = a(1+e) -/// * **Atira**: a < 1.0 AU and **Q < 0.983 AU** (entirely interior to Earth's orbit) -/// * **Aten**: a < 1.0 AU and **Q > 0.983 AU** (Earth-crossing from the inside) -/// * **Apollo**: a ≥ 1.0 AU and q ≤ 1.017 AU -/// * **Amor**: 1.017 < q < 1.3 AU -/// * **NEO**: q < 1.3 AU (and not Atira/Aten/Apollo/Amor) -/// * **Hungaria**: 1.78 ≤ a ≤ 2.0 AU and i > 16° -/// * **Hilda**: a ≈ 3.9 AU (here 3.7–4.1 AU) -/// * **Main belt**: 2.0 ≤ a ≤ 3.5 AU and e < 0.35 -/// * **Centaur**: 5 < a < 30 AU -/// * **TNO**: a ≥ 30 AU -/// * **Inner**: a < 1 AU (non-Atira/Aten) -/// * **Other**: fallback -fn classify_orbit(a: f64, e: f64, i_rad: f64) -> OrbitClass { - let q = a * (1.0 - e); - let Q = a * (1.0 + e); - let i_deg = i_rad.to_degrees(); - - // Use aphelion Q to split Atira vs Aten when a<1 AU - if a < 1.0 && Q < 0.983 { - return OrbitClass::Atira; - } - if a < 1.0 && Q > 0.983 { - return OrbitClass::Aten; - } - if a >= 1.0 && q <= 1.017 { - return OrbitClass::Apollo; - } - if q > 1.017 && q < 1.3 { - return OrbitClass::Amor; - } - if q < 1.3 { - return OrbitClass::Neo; - } - - if (1.78..=2.0).contains(&a) && i_deg > 16.0 { - return OrbitClass::Hungaria; - } - if (3.7..=4.1).contains(&a) { - return OrbitClass::Hilda; - } - if (2.0..=3.5).contains(&a) && e < 0.35 { - return OrbitClass::MainBelt; - } - if (5.0..30.0).contains(&a) { - return OrbitClass::Centaur; - } - if a >= 30.0 { - return OrbitClass::Tno; - } - if a < 1.0 { - return OrbitClass::Inner; - } - OrbitClass::Other -} - -/// Extract a reference to `KeplerianElements` from a `GaussResult` if available. -fn kepler_of(res: &GaussResult) -> Option<&outfit::KeplerianElements> { - match res { - GaussResult::CorrectedOrbit(k) => k.as_keplerian(), - GaussResult::PrelimOrbit(k) => k.as_keplerian(), - } -} - -// ======================= reporting structs ======================= - -#[derive(Debug, Clone)] -struct ErrorStats { - count: usize, - samples: Vec, - attempts_sum: usize, - attempts_n: usize, -} - -#[derive(Debug, Clone)] -struct OrbitElementStats { - // distribution statistics for successes - a_min: f64, - a_max: f64, - a_mean: f64, - a_median: f64, - a_p95: f64, - e_min: f64, - e_max: f64, - e_mean: f64, - e_median: f64, - e_p95: f64, - i_min: f64, - i_max: f64, - i_mean: f64, - i_median: f64, - i_p95: f64, // radians - q_min: f64, - q_max: f64, - q_mean: f64, - q_median: f64, - q_p95: f64, - Q_min: f64, - Q_max: f64, - Q_mean: f64, - Q_median: f64, - Q_p95: f64, - // class counts - class_counts: BTreeMap, -} - -#[derive(Debug, Clone)] -struct IodBatchSummary { - total_objects: usize, - succeeded_total: usize, - corrected_count: usize, - prelim_count: usize, - failed_total: usize, - - // RMS stats on successes - rms_min: f64, - rms_max: f64, - rms_mean: f64, - rms_median: f64, - rms_p95: f64, - - // Attempts aggregated from NoViableOrbit - attempts_sum: usize, - attempts_mean: f64, - attempts_p95: f64, - - // Errors (stable kind → stats) - error_stats: BTreeMap<&'static str, ErrorStats>, - - // Orbit elements & classes (only successes) - elements: Option, - - // Top/bottom objects by RMS - best_k: Vec<(ObjectNumber, f64)>, - worst_k: Vec<(ObjectNumber, f64)>, -} - -// ======================= summarizer ======================= -#[allow(clippy::type_complexity)] -fn summarize_estimates( - results: &HashMap, S>, - k: usize, -) -> IodBatchSummary -where - S: BuildHasher, -{ - const MAX_SAMPLES_PER_KIND: usize = 3; - - let mut rms_values: Vec<(ObjectNumber, f64, bool)> = Vec::new(); - let mut corrected_count = 0usize; - let mut prelim_count = 0usize; - - let mut buckets: BTreeMap<&'static str, ErrorStats> = BTreeMap::new(); - let mut attempts_all: Vec = Vec::new(); - - // collect successful orbit elements - let mut a: Vec = Vec::new(); - let mut e: Vec = Vec::new(); - let mut i: Vec = Vec::new(); - let mut q: Vec = Vec::new(); - let mut Q: Vec = Vec::new(); - let mut class_counts: BTreeMap = BTreeMap::new(); - - for (obj, res) in results { - match res { - Ok((orbit_res, rms)) => { - let corrected = matches!(orbit_res, GaussResult::CorrectedOrbit(_)); - if corrected { - corrected_count += 1; - } else { - prelim_count += 1; - } - rms_values.push((obj.clone(), *rms, corrected)); - - if let Some(kep) = kepler_of(orbit_res) { - let a_au = kep.semi_major_axis; - let e_ = kep.eccentricity; - let i_rad = kep.inclination; - let q_au = a_au * (1.0 - e_); - let Q_au = a_au * (1.0 + e_); - a.push(a_au); - e.push(e_); - i.push(i_rad); - q.push(q_au); - Q.push(Q_au); - - let cls = classify_orbit(a_au, e_, i_rad); - *class_counts.entry(cls).or_default() += 1; - } - } - Err(e) => { - let (stable_key, sample_msg, attempts) = flatten_error_for_bucket(e); - let entry = buckets.entry(stable_key).or_insert_with(|| ErrorStats { - count: 0, - samples: Vec::new(), - attempts_sum: 0, - attempts_n: 0, - }); - entry.count += 1; - if let Some(n) = attempts { - entry.attempts_sum += n; - entry.attempts_n += 1; - attempts_all.push(n); - } - if entry.samples.len() < MAX_SAMPLES_PER_KIND { - entry.samples.push(sample_msg); - } - } - } - } - - let total_objects = results.len(); - let succeeded_total = corrected_count + prelim_count; - let failed_total = total_objects.saturating_sub(succeeded_total); - - // ----- RMS stats - let mut rms_only: Vec = rms_values.iter().map(|(_, r, _)| *r).collect(); - rms_only.sort_by(|a, b| a.partial_cmp(b).unwrap()); - let (rms_min, rms_max, rms_mean, rms_median, rms_p95) = if rms_only.is_empty() { - (f64::NAN, f64::NAN, f64::NAN, f64::NAN, f64::NAN) - } else { - let min = *rms_only.first().unwrap(); - let max = *rms_only.last().unwrap(); - let mean = rms_only.iter().sum::() / (rms_only.len() as f64); - let median = percentile_sorted(&rms_only, 50.0); - let p95 = percentile_sorted(&rms_only, 95.0); - (min, max, mean, median, p95) - }; - - // ----- attempts stats - attempts_all.sort_unstable(); - let attempts_sum = attempts_all.iter().copied().sum::(); - let attempts_mean = if attempts_all.is_empty() { - f64::NAN - } else { - attempts_sum as f64 / attempts_all.len() as f64 - }; - let attempts_p95 = if attempts_all.is_empty() { - f64::NAN - } else { - percentile_sorted_usize(&attempts_all, 95.0) as f64 - }; - - // ----- orbit element stats - let elements = if a.is_empty() { - None - } else { - a.sort_by(|x, y| x.partial_cmp(y).unwrap()); - e.sort_by(|x, y| x.partial_cmp(y).unwrap()); - i.sort_by(|x, y| x.partial_cmp(y).unwrap()); - q.sort_by(|x, y| x.partial_cmp(y).unwrap()); - Q.sort_by(|x, y| x.partial_cmp(y).unwrap()); - - let a_stats = ( - a[0], - *a.last().unwrap(), - mean(&a), - percentile_sorted(&a, 50.0), - percentile_sorted(&a, 95.0), - ); - let e_stats = ( - e[0], - *e.last().unwrap(), - mean(&e), - percentile_sorted(&e, 50.0), - percentile_sorted(&e, 95.0), - ); - let i_stats = ( - i[0], - *i.last().unwrap(), - mean(&i), - percentile_sorted(&i, 50.0), - percentile_sorted(&i, 95.0), - ); - let q_stats = ( - q[0], - *q.last().unwrap(), - mean(&q), - percentile_sorted(&q, 50.0), - percentile_sorted(&q, 95.0), - ); - let Q_stats = ( - Q[0], - *Q.last().unwrap(), - mean(&Q), - percentile_sorted(&Q, 50.0), - percentile_sorted(&Q, 95.0), - ); - - Some(OrbitElementStats { - a_min: a_stats.0, - a_max: a_stats.1, - a_mean: a_stats.2, - a_median: a_stats.3, - a_p95: a_stats.4, - e_min: e_stats.0, - e_max: e_stats.1, - e_mean: e_stats.2, - e_median: e_stats.3, - e_p95: e_stats.4, - i_min: i_stats.0, - i_max: i_stats.1, - i_mean: i_stats.2, - i_median: i_stats.3, - i_p95: i_stats.4, - q_min: q_stats.0, - q_max: q_stats.1, - q_mean: q_stats.2, - q_median: q_stats.3, - q_p95: q_stats.4, - Q_min: Q_stats.0, - Q_max: Q_stats.1, - Q_mean: Q_stats.2, - Q_median: Q_stats.3, - Q_p95: Q_stats.4, - class_counts, - }) - }; - - // ----- Top/Bottom K by RMS - rms_values.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap()); - let best_k = rms_values - .iter() - .take(k) - .map(|(o, r, _)| (o.clone(), *r)) - .collect(); - let worst_k = rms_values - .iter() - .rev() - .take(k) - .map(|(o, r, _)| (o.clone(), *r)) - .collect(); - - IodBatchSummary { - total_objects, - succeeded_total, - corrected_count, - prelim_count, - failed_total, - rms_min, - rms_max, - rms_mean, - rms_median, - rms_p95, - attempts_sum, - attempts_mean, - attempts_p95, - error_stats: buckets, - elements, - best_k, - worst_k, - } -} - -// ======================= printer ======================= - -fn print_summary(sum: &IodBatchSummary) { - println!("\n=== IOD Batch Summary ==="); - println!("Objects total ........ : {}", sum.total_objects); - println!( - " Success total ...... : {} (Corrected: {}, Prelim: {})", - sum.succeeded_total, sum.corrected_count, sum.prelim_count - ); - println!(" Failures total ..... : {}", sum.failed_total); - - println!("\n-- RMS on successes --"); - println!( - " min / median / mean / p95 / max : {:.6} / {:.6} / {:.6} / {:.6} / {:.6}", - sum.rms_min, sum.rms_median, sum.rms_mean, sum.rms_p95, sum.rms_max - ); - - if let Some(el) = &sum.elements { - println!("\n-- Orbit elements (successes only) --"); - println!( - " a [AU] : min={:.6} median={:.6} mean={:.6} p95={:.6} max={:.6}", - el.a_min, el.a_median, el.a_mean, el.a_p95, el.a_max - ); - println!( - " e [-] : min={:.6} median={:.6} mean={:.6} p95={:.6} max={:.6}", - el.e_min, el.e_median, el.e_mean, el.e_p95, el.e_max - ); - println!( - " i [deg] : min={:.6} median={:.6} mean={:.6} p95={:.6} max={:.6}", - el.i_min.to_degrees(), - el.i_median.to_degrees(), - el.i_mean.to_degrees(), - el.i_p95.to_degrees(), - el.i_max.to_degrees() - ); - println!( - " q [AU] : min={:.6} median={:.6} mean={:.6} p95={:.6} max={:.6}", - el.q_min, el.q_median, el.q_mean, el.q_p95, el.q_max - ); - println!( - " Q [AU] : min={:.6} median={:.6} mean={:.6} p95={:.6} max={:.6}", - el.Q_min, el.Q_median, el.Q_mean, el.Q_p95, el.Q_max - ); - - println!("\n-- Orbit classes (counts) --"); - if el.class_counts.is_empty() { - println!(" (none)"); - } else { - for (cls, cnt) in &el.class_counts { - println!(" {:<10} : {}", format!("{cls:?}"), cnt); - } - } - } else { - println!("\n-- Orbit elements --\n (no successful orbits)"); - } - - println!("\n-- Failure breakdown (by error kind) --"); - if sum.error_stats.is_empty() { - println!(" (none)"); - } else { - for (kind, stats) in &sum.error_stats { - let attempts_avg = if stats.attempts_n > 0 { - stats.attempts_sum as f64 / stats.attempts_n as f64 - } else { - f64::NAN - }; - println!( - " {:<28} : {:>4} attempts(sum/avg on carrying) = {}/{}", - kind, - stats.count, - stats.attempts_sum, - fmt_opt(attempts_avg) - ); - for (i, sample) in stats.samples.iter().take(3).enumerate() { - println!(" · example[{i}] {sample}"); - } - } - } - - println!("\n-- Attempts (global from NoViableOrbit) --"); - if sum.attempts_sum == 0 && sum.failed_total > 0 { - println!(" (no attempts recorded in errors)"); - } else if sum.failed_total == 0 { - println!(" (no failures)"); - } else { - println!( - " sum / mean / p95 : {} / {:.2} / {:.0}", - sum.attempts_sum, sum.attempts_mean, sum.attempts_p95 - ); - } - - println!("\n-- Best by RMS --"); - if sum.best_k.is_empty() { - println!(" (no successes)"); - } else { - for (obj, rms) in &sum.best_k { - println!(" {:>8} rms={:.6}", display_obj(obj), rms); - } - } - - println!("\n-- Worst by RMS --"); - if sum.worst_k.is_empty() { - println!(" (no successes)"); - } else { - for (obj, rms) in &sum.worst_k { - println!(" {:>8} rms={:.6}", display_obj(obj), rms); - } - } - println!(); -} - -// ======================= small helpers ======================= - -fn flatten_error_for_bucket(e: &OutfitError) -> (&'static str, String, Option) { - use OutfitError::*; - match e { - NoViableOrbit { cause, attempts } => { - let (k, _, _) = flatten_error_for_bucket(cause); - (k, format!("{e}"), Some(*attempts)) - } - NoFeasibleTriplets { .. } => ("NoFeasibleTriplets", format!("{e}"), None), - - // Numerical / algebraic failures - GaussNoRootsFound => ("GaussNoRootsFound", format!("{e}"), None), - PolynomialRootFindingFailed => ("PolynomialRootFindingFailed", format!("{e}"), None), - SpuriousRootDetected => ("SpuriousRootDetected", format!("{e}"), None), - SingularDirectionMatrix => ("SingularDirectionMatrix", format!("{e}"), None), - RmsComputationFailed(_) => ("RmsComputationFailed", format!("{e}"), None), - GaussPrelimOrbitFailed(_) => ("GaussPrelimOrbitFailed", format!("{e}"), None), - RootFindingError(_) => ("RootFindingError", format!("{e}"), None), - InvalidFloatValue(_) => ("InvalidFloatValue", format!("{e}"), None), - NonFiniteScore(_) => ("NonFiniteScore", format!("{e}"), None), - - // Orbit / reference frame - InvalidOrbit(_) => ("InvalidOrbit", format!("{e}"), None), - InvalidIODParameter(_) => ("InvalidIODParameter", format!("{e}"), None), - InvalidConversion(_) => ("InvalidConversion", format!("{e}"), None), - InvalidRefSystem(_) => ("InvalidRefSystem", format!("{e}"), None), - VelocityCorrectionError(_) => ("VelocityCorrectionError", format!("{e}"), None), - - // Observation handling - ObservationNotFound(_) => ("ObservationNotFound", format!("{e}"), None), - - // Parsing / ingestion - NomParsingError(_) => ("NomParsingError", format!("{e}"), None), - Parsing80ColumnFileError(_) => ("Parsing80ColumnFileError", format!("{e}"), None), - Parquet(_) => ("Parquet", format!("{e}"), None), - - // Error model - InvalidErrorModel(_) => ("InvalidErrorModel", format!("{e}"), None), - InvalidErrorModelFilePath(_) => ("InvalidErrorModelFilePath", format!("{e}"), None), - - // Ephemerides / SPK - InvalidJPLStringFormat(_) => ("InvalidJPLStringFormat", format!("{e}"), None), - InvalidJPLEphemFileSource(_) => ("InvalidJPLEphemFileSource", format!("{e}"), None), - InvalidJPLEphemFileVersion(_) => ("InvalidJPLEphemFileVersion", format!("{e}"), None), - JPLFileNotFound(_) => ("JPLFileNotFound", format!("{e}"), None), - InvalidSpkDataType(_) => ("InvalidSpkDataType", format!("{e}"), None), - - // I/O - IoError(_) => ("IoError", format!("{e}"), None), - UreqHttpError(_) => ("UreqHttpError", format!("{e}"), None), - #[cfg(feature = "jpl-download")] - ReqwestError(_) => ("ReqwestError", format!("{e}"), None), - Utf8PathError(_) => ("Utf8PathError", format!("{e}"), None), - UnableToCreateBaseDir(_) => ("UnableToCreateBaseDir", format!("{e}"), None), - InvalidUrl(_) => ("InvalidUrl", format!("{e}"), None), - - // Stochastic - NoiseInjectionError(_) => ("NoiseInjectionError", format!("{e}"), None), - } -} - -fn percentile_sorted(sorted: &[f64], p: f64) -> f64 { - if sorted.is_empty() { - return f64::NAN; - } - let q = p.clamp(0.0, 100.0); - let idx = ((q / 100.0) * ((sorted.len() - 1) as f64)).round() as usize; - sorted[idx] -} - -fn percentile_sorted_usize(sorted: &[usize], p: f64) -> usize { - if sorted.is_empty() { - return 0; - } - let q = p.clamp(0.0, 100.0); - let idx = ((q / 100.0) * ((sorted.len() - 1) as f64)).round() as usize; - sorted[idx] -} - -fn mean(v: &[f64]) -> f64 { - if v.is_empty() { - f64::NAN - } else { - v.iter().sum::() / v.len() as f64 - } -} - -fn display_obj(id: &ObjectNumber) -> String { - match id { - ObjectNumber::Int(n) => format!("{n}"), - ObjectNumber::String(s) => s.clone(), - } -} - -fn fmt_opt(x: f64) -> String { - if x.is_finite() { - format!("{x:.2}") - } else { - "-".to_string() - } -} - -fn main() -> Result<(), OutfitError> { - let mut env_state = Outfit::new("horizon:DE440", ErrorModel::FCCT14).unwrap(); - - let test_data = "tests/data/test_from_fink.parquet"; - - println!("Loading observations from {test_data}"); - let path_file = Utf8Path::new(test_data); - - let ztf_observer = env_state.get_observer_from_mpc_code(&"I41".into()); - - let mut traj_set = - TrajectorySet::new_from_parquet(&mut env_state, path_file, ztf_observer, 0.5, 0.5, None)?; - - println!( - "Loading done: {} trajectories / {} observations", - traj_set.len(), - traj_set.total_observations() - ); - - println!("Trajectory Set statistics:"); - println!( - "{:#}", - traj_set.obs_count_stats().expect("TrajSet is empty") - ); - println!("--------------------------\n"); - - let mut rng = StdRng::from_os_rng(); - - let params = IODParams::builder() - .n_noise_realizations(10) - .noise_scale(1.1) - .max_obs_for_triplets(12) - .max_triplets(30) - .build()?; - - println!("Estimating orbits with params: {params:#}"); - println!("Orbit estimation in progress... (this may take a while)"); - - let orbits = traj_set.estimate_all_orbits(&env_state, &mut rng, ¶ms); - - println!("Orbit estimation done."); - - let summary = summarize_estimates(&orbits, 5); - print_summary(&summary); - - Ok(()) -} diff --git a/src/initial_orbit_determination/mod.rs b/src/initial_orbit_determination/mod.rs index c63f45f..a66a392 100644 --- a/src/initial_orbit_determination/mod.rs +++ b/src/initial_orbit_determination/mod.rs @@ -255,11 +255,6 @@ pub struct IODParams { pub newton_max_it: usize, /// Maximum allowed imaginary part magnitude for complex roots promoted to real (AU). pub root_imag_eps: f64, - - // --- Multi-threading (if enabled) --- - #[cfg(feature = "parallel")] - /// Number of trajectory batches to process in parallel (if `> 1` and `rayon` feature enabled). - pub batch_size: usize, } impl IODParams { @@ -341,10 +336,6 @@ impl Default for IODParams { newton_eps: 1.0e-10, newton_max_it: 50, root_imag_eps: 1.0e-6, - - // Multi-threading (if enabled) - #[cfg(feature = "parallel")] - batch_size: 4, } } } @@ -465,13 +456,6 @@ impl IODParamsBuilder { self } - // --- Multi-threading (if enabled) --- - #[cfg(feature = "parallel")] - pub fn batch_size(mut self, v: usize) -> Self { - self.params.batch_size = v; - self - } - // ---- Numeric helpers for PartialOrd (handle NaN as invalid) ---- /// Return true iff x > 0.0 and comparable (i.e., not NaN). @@ -780,16 +764,6 @@ impl fmt::Display for IODParams { "Max Gauss solutions kept" )?; - // --- Multi-threading (if enabled) --- - #[cfg(feature = "parallel")] - { - line!( - "batch_size = {}", - self.batch_size, - "Number of trajectory batches to process in parallel" - )?; - } - Ok(()) } else { write!( diff --git a/src/outfit_errors.rs b/src/outfit_errors.rs index c78e691..6f403c2 100644 --- a/src/outfit_errors.rs +++ b/src/outfit_errors.rs @@ -230,9 +230,6 @@ pub enum OutfitError { #[error("Gauss preliminary orbit determination failed: {0}")] GaussPrelimOrbitFailed(String), - #[error(transparent)] - Parquet(#[from] parquet::errors::ParquetError), - #[error("No viable orbit could be determined after {attempts} attempts: {cause}")] NoViableOrbit { cause: Box, @@ -296,7 +293,6 @@ impl PartialEq for OutfitError { (UreqHttpError(_), UreqHttpError(_)) => true, (IoError(_), IoError(_)) => true, (ReqwestError(_), ReqwestError(_)) => true, - (Parquet(_), Parquet(_)) => true, (UnableToCreateBaseDir(a), UnableToCreateBaseDir(b)) => a == b, (Utf8PathError(a), Utf8PathError(b)) => a == b, diff --git a/tests/data/test_data_traj_str.parquet b/tests/data/test_data_traj_str.parquet new file mode 100644 index 0000000000000000000000000000000000000000..52300babe06ae47dc1cd9e0e8b9cd87260352f8e GIT binary patch literal 19876139 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 n-|FdG=?# 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%0DZu>Wswc<_9f;~+6uB(6oZ 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 FBSv?ykrsauNV|tP(QT(%UFqX!pDq* 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

?ELT$=5;=G##GGbYi@>Zf$sf76B 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

m8(L6qCfqVm?0YM`Pd_-tE(*pukYU z28^d^`68x(Oz0x^4j^`kapPfWIXLqKW!$Ug3Jxn#q5l${Esm7{aIftQD@DD}f7{+v zKoG;@U$ROtIv(Ku6|%9x$!hmsst9ji8u7m+XmHUpqyG&tlb@I%z#{%dhu=~?rusu+dA2;8ZDOaz`wa^(KMH8xuc!*z`u}%-3`p#AN}skQxynA%sX{;2#2TV z+s%vHP6bZyH*Ih#oH==3dd(x!803A&>BmvOJu9$_dIF8{Y#?gF8`0C}1Da--EH-&2 z+CpXp2gbcn8;YoX&A9j5M?|Oyo982KKD*!%Jtq-jh@}?v49VdPnIc8^GC*UuSY_;a zuJsL&>+Lh26RxKMA)bXOS?N41dv3D2__$&1-!#}S8Gxw%3*+;`3@BswR>&0E;~KlS zPx4HO&xm`;M1C=S47#_>3bC$D$!-jNQO|SIuf!!sPT`8{rvt`Q!b4 zQ-~;d<{7GNY7ffkvj$NPq_D5gs7+W8sOWk2bhC!cC&6=Pt=r=n5zm`o&}MvTdwv4S zV~Y*|&zXWA=v=6IeuNNageRG2B5esyjTWCFGevZH>pX|)k%R-S9VII$06I*e!YEVJzD7 zV#GVJ$5EFo5Z;VnBao(ey*CqCZGZH^YXh_6t1 z_KV;+UqQpZ=hS#GlSPAIiys0zLH|6)o|#UL=wLwEeMX? zP<47S9ep#v<5E+n&9SIak`%BE$C_FAxJ-$0`~^b;prb9vXzuyv_C0npxS|Q~%Nqgh zW0SnpcZMJ;)Hx;ZA`}QxJBz#txByT~yW{Os8|2Kchc}f6(MHw?@2562C~x$5JME7B zkx_a(;56N3x;?g=^RX~S>ez0GpIL3yagZKcO2k4O2f@G?V^8w9$7|a-V>%v!V?*AW zBF9*|$}A;WI9{@;YYKtw7;;44irBnkz0fEeh3Aq1yc#}xV!ToH;rRw1QJ(QTY#6_%4JV4^Lc=SvZ(eK?sXu8Ju2%T!3*Jbu+( zprM1*v2Cp5j;_b!Jvi9zoT?t@DHI`rYtP%M%@0&M7;mZ}DIBtc$6si4SfRyu{Fz$k z3I+D~3maT&14nEIsbkr@MjpG$ z2GRXN;SC^a3J=;R?*^7kZe@&b083p&88_iO;61>s6VvtZO~JtuH_EMdS7;AF!WC~1 zm#1`ofOvDEg>kX1^A39f$IMxfcbF+tDH0@av&~E@1xfEX7Z5`6On9qE;N?Ld>pLg5 zAr5=h=*REc{kDZIDbFlw6Fw}}iyM~+mzQJ9I+#_YpeN2-fh4|s1GZBNLC;CRzG zP<58~_|7r(g~_gxw~-+VLFz&iJbQUtW?ob!#5Gt52+)T?2q>VDNl-MXuO32%&MtS_|{N3wFl+&je(6E zj00)j6iN*vHP7CEu9AaL+`NTm1tSlM-giu9c+v*G=c4G&(%A9t(=EK=fyo;VMvD+v zy6>+ET1+v}Ta7~-ngDt4GF+9lNc9F&F^dMP_HL2;4ZuOodqpk)B*+fON(2;<(S{di z$+74VVW}pb<68upSQHG8XKS(TSq(fuA{;wHh=q#a<`|K)&ihatce-@}apB__jTPN7 zbQF(C0Z%lU;BlN%@cfmU@_J|!uzBik!gG8;ZcL!K71`|lUzl_w`B+~RA(dy#H2F5p= zBO#otIqxD$IF=+Jz6IG%*G`PS9T}{JVETJ2SrO%m%9yt$6T~&P-#3>I81NL8y-!uI zpnwK>ygMn>4RIuWn__{S^Tu4FLkvTnHxU_+ zewZJehP znR)PR6@mnpG<2S&5}*Rfn|hv`B)j6`>iO+m6fNC6_q`f@W^jGxTQkvl>EYSM*n<{6 zWu8%JodAJ#`^+QMhk>fb=M+ao^WgA4%NenmF^T8dyNJTfSJX2K%{D<$#OJ0tyI!`a zK1apK8(OP87A`(7ZaJVsK;(JH)D1elspleAPh>V9Jnu+DI@`4QjM@10F%net`Qcv< zSuA97*!x$kFhCr`ANR7kf#*+6#J#OZzEz1oaz?}MrE`T!3_HJj@1Ta+ymERkp3^i? z@F4sfCe|ohh5sdh!*n(Ujeij|0r2(X^6$~?Piv;xzYOv$fZG)VV$<|FgVT~ONIKrM zWK4JuG(H;**j!@S^fqzHntLvo+ zo(IPtxM~c+Ky$q2MI0O=tZx8vl6IfC&xbW!Q*{tNM=mbWE)hO!zA9N0fTO4pAP_`2 zF-S-VaY7|f%4w_v5qv^`AQ;Gj`4Dn`^Ll13yQ=UubJ2_WB1xtNFwV)heM#b#QH*+v z{F%HJ#!wcPX=9<-V1o55G4v$V(?x`<2jZFAh90&-hioiG>~HGGy|$e1mJ~nED140Q zh%Sz#4#r!f$xc~|jr4SmBHcD-d&X(MEW zL2^Fqbq9$Jdcz3n!V=EtLavo@GecIx?!Wj4)dW z1Iw;EX&JC7pZ?xtZ;NKmDH*S2ZK`eGI)&_T6Wg6)E7NH(Gg&T}V|lZ-^wYDwJ>{ip z)U;*whP_Jb=>fhPsyY%k40xCfZr< zmQdZC^KQs-XcNOeCiYgt#LxDx=l0OrIE0x!r>D1kgslQ@j)htjFA#8Bp#w-Uo?SPX zpFI~Y)T}4-ikbCc4qUuK$hLFvklk&TSzYO7<16d%$cKZqJrqn7PZVoNWQ-uZhOQ}d%Q^HditPxI^3a;eMUX(t281xU-;vPR>^FoC)l5DbJ)b`bu| zbP;hW&cwZxG*OI#qQJWf4Kpm2f%w~fL z0mZY7JnsT11IJrVPK7y-wTvVz@Y6k31-mBqEIAr&r(pl=z6c7 zli-l7!lU*ar0$81f&$N)KUuzNu%1CYW(jhV;n^%utioaF^J@}5OH#qoXGOI;5P`YR zj#33)yIh}31AO;vn>U3K? zD=1U)rT08b)fVM>nLe}a$yjVeu5pr{Ey$_}qT|c62P`Alcro+*VTxEM2N}<0LsV!` zv+vzd1#C_Zp1%ZeQ*iW+X9|TLDMB z$$+L6)ar8tHlKdEwik1|(R6jDcds5R8q74JxEJkQ5Ifo2n})@VisOuX^8_DapH=>? z`a%o*G4L-~kOEd0pgb>`)Zu7@z%%EYMy@Vfp84YPqm@@RctOumM&u`_7`EQLdHzcz z;ugpG9OKeQQPS#}(6W{WC5Y!)PNPlIC;ui!Xkce-?B5zz0E1{j@)#W|^U^SUg6Z8` z0|=2yOm^?%Ba2kZ%6lE}tRyLMpJn6`G6oqaL*tk+aIB0>)Uj%h4NYrwkFj9ST&qVi z8*d2zzF$BY64WNb8?$-9ks|d?BWsS6D5&Q!DWwECJUlxgx?;t$z%!O8H%3xd z&xB7xhcKo*CvHkHHS_fh1j-&C1N1zz=BfaljAMuSyoAhT8#%1!)h?i~DKpQF3E+HO zi#(Uc)ve~rx9J-lSPs74R%}}hqKKzlRI`Xb+IfbLLy38>JY}Kf(fSW#Bz4>Dn{&W9!+HbcS1ns<-WhHe(+Y zy!#qC*&yJ1`z>x5(FXO-QHA@11DiR zfY>m@N%f6^O;{HvspBys3?8yb9v@29&Ad6*5jg@&F>?IKrpBUa+Hs@d4nr)7$B_## zrIHbh6hs_L2{mJagO_7Y4zQHFa>s^9RTh*{IDRDXm!(0=ag#a~nEc#1mLy;TH|zBn zaexUYJ+2%#>KcN$8a?JAxuXu|clMY;n1ydf9v{dPoIz%Hy!RbA1)F2`jf++_4S-pfPA?9K#SRkpMQxu?zrM zxJL($PXwXK#$a+hXA8G0rFbl3jup(q1;=??6ilv}I^OX;;06!%IBg5tB`ugM1#{eJ z5MZ<7@r*#WFpYP|-r7zMUn0j?@I1VcEjh;WXPHZw;rNWu92}fBZv&lKW@2mJMUIzg zxL$7y1g<2IRdd`Wl#4(tiQ_Ird`{yU9Cz{30!)ky$5?!5+0dhUEaq(xtnbHZB=x}9 zXdIgv%I!hN#ycuf=tmFTH-JwdNU{!&^)%K+{b6|rRhhDB3w=Xa>KO{oyr*QO7JW&1 zXW3cgG|}a)g{TEWG{ZX!O@}=={OY}Uzxd*na&{RUdaGE|Iy@->OnLE^vFpUn8s+uqcBJpkzB8L@~ulLeb0XwMz?=ciwVj9T4VMP9@7P`H? zl?nQ2wY+Q0mC*ul;tj^;YzPptw}>*e%%9x1+t*D9lf*C-?{>60P{QloC1JI}f~WUb zU*z0Yhc}r9AQU@@ym1l|1t=X-CK}&#{;tZE4alIZhRW;6`TPJ7|~3 zuI`dIP*({#ZA{0Jb7&f8Kph_;Dtxj`Jst&u1<$Y^%i=Xu%#_RkIxZvX+~Wo3xCG}5 zq8~}`I#WCxiBg}j0(hCkvh*G^pkcpcG8qu}Y(#?dst&=k4*<`)*7IxtPtZji)!VA` z)Rw@9_l`O-OuT8{T`X9r>2rD$nnfL$-0?QDhRUAasN|hDmCMjJ1p(em=s3O5ZFw`I zy}+;_zs`A(tBNa_>x-jh2mDx7*ZnbQ-ht9N1*NyfLOw+}N6I*Xv*Nz}kN ztWtY-IzL%DI8895T1wJh}e$k-;Ou(wmALmr5e9Z%@iRs2~#GC-NuPChD6{z}vTq zgZJR$=ZxAp?Xc&G0emCu48A(V~~k=u8cgZG1{Ih48qN*Gv?WBj~51b%`*!T zw;>?JJ>xt+Qzy=65q2pCFQ`5PBB)Ct2Ff#H&vsIXd z6j1lJ{Uq?UV8t^T?UFOU^GtUORWdO=Gl_5l%aJ z8qZEnhj>Z;JfFD{Y1YN#8M3m{!RLc}?d0KtSBm4`8X#Ibg}D72fW_qq0zdxEY6D~% zuzGK5l9jGD0{6O^EG#<$dM_F}iAe6;{-prv#e%za?-Dl7H6uayj={1;HqP(fQ#*7~ zY>2q`$_^~EqoMy!S-HVQ68$&BkzRn$F#o<6QGnk0SIvc=Sy+dEzna)FgDml{0;4KC zX@vg<^?)q{VBp?7T3K-2T>VQmVRaS`(7zpEc#ZwQ`#0*cRCSNbzf(VLN=IA%l>+g} zAdJbquzublHE;K78c{0y0pVUaJ|gqJ-hUZT!LZ;o^sie06-sLOcoy)a#es##=ch*T zP{8Hc=}`%;isA*Oi|_e_HLQ|s@Q!evTl6>3ehpX=Ri** z$T4}_^$k5Di1BuV%b*}J#M^`l40+y8-*$9+R2}}_c_O?iWJr1IZGxe=oO>$@!Jr)A z_4aWk&z0xn`>)PW6Hz#CM8+a281g+i1p{KG&s+5Xgc?g^Z!95pdj;6r3mw)&Ie2f$ zG!-x?IKInJwdIpHNPVYmiF6aqTMY;%Z&!Mrg;Lnv!by0h!tIJ+B>KEWY6D0T#j}S# ztU@7x&rB-jv{pFqc9Yl!$;bOFBp?e(K=3!KL>l!>0lP}kfPI%aBOu8;<;~*^Rsj@W z@58#mH!d^Ys0qAcUmf46e2XTAa^FKt*;e>bc<*>3W7;M4Jy_)>ND93-kpPf8HlN;} zUpW`pT)e3W<$%NG>5VC;UmMFTrd@c0im?`HtbI=^atLst=>3E#Pspu;_Y)4C7lZVU zgdl`0Qum!@i{C7sdY=&lLBvSF`wJ0*Iy%JOm{;ut?Mtd0FYhf!4F%8hXmdn(;8*Tg`zmNBcg8wQHEp4G!Rr(vW_)Rx4?AU9CKk~$B5bO@#@79`eeodSQ27p^c%(AU>ANUI zQdFxEVNs0H2xFJ90*gI2#z=M?BDV9)7-=lm!7z!{Zo>55A(}O@Oo-$81i|z^p+z zW-0fSx zbXmAk<#^4Fsznr`Zz?Ghax$QJL)m>m!{XxIgr!z%vCJEY%mFLS+PBc8+mV2?H&8AR zsa2V`ge)z07(TqMj6?u2LU#NG2BUGN&;jatT*3&GAf?~&TZ77P4h_dLoQ&*PYI6KF zF@|Z2-Eo_sFf>QYagI=2AaV&I6$r;lL8l6qKpk@kQ_5At@EFc-f@%@D;}W&ljI;4WL`yp<_Ix1+1`($9TFJ*g`lS%SGm(rF4=b z=Gdjf%j4V~Nx52vj(5wL zaXncbtE#dgK%$S=2nj$)G{Q-Wq`Bta=7!eBMWR{8t;zw<|oQC%=Tz| zRaO};zfZff!$6fp$g7>eIuaw4c(e#4taP|F{FrB7L#p}lvA-@aQZJBv?1LR!STM4a zA(4*p;$`4tPO-Tr@)(}1K^!l~23FoR!4M3J&e3;u9*8$Kj9kQA6$3vXuzRJwQh9Ks z>0WSFWohand_*D}4U-YDE+UFE*YL{yYtIkR6$r?W5EUUNKYsWZoDaH%gi}s-3FO9? zz{t^_M96maxqd9vjBE{|8z-R!LWwCzIzI-4)I^ui)y488%ZTt$qDWo=ew5B@h{F-a(a52Pz|nhe#BHWlM;%kEru$YJ-G~hd_}f7mA|By(%H+)X8w= zV3MD%LPW&)4=^!eip1w0)?_iIFu?I0qND&TV>RJdD)7Eav)=ql$Y~DckS53KFx9UI zsNP|TLjn;z&^+tR8iOcXVw^*XHiSZb<{Wmg?W#yBa1XmI?t*Vg4!Gbv(*QHE zc+TQCVNs2Zx2>wEgIN~uJiBBLRscR5n6euQ8s(Yj>42W->3bJ61ei_8H=0o}Vta(o zVk%H{sbW1-P|Z(yK0-@idB1+Iyh(b!J2#mO2SMMZG_+t4y1vt3{*P_&P3OP_TRB9Y zs~E^I)3Wod)QYtvr|)}8SwCPzVz~Df$&(p7Z13IM0CWI|!@omdZ*GE={40Wxz~qwD zb6<|ytxodXWK`(3gT^z4%{^_K3Z6M=!PahKd6v3jWgFM2KgyS<~hA2VZzvo9s7m;y*|CU*js^SUo-#W%yB01(f zchRbog5z=T6VjdvpHcT7!2@G46zSeHo2G$6aqjIwbr(8i>t63x*=eYodpp^b7*OW9 z_i;mpOwfci&+aWs!o-He+B1o!K}ZON&y_m5x|E1=%$KJ^o{hD)2`CO`^k9$4jCMWn z;rBKn*dNZ~%$c*}-9vJU-IN;7cDG&XV9|K~9E4Cu1k$sU#N4IqjvT7la}_H2iKrVw`wxjgiB}tebb6J80nkg1jk#bV=+nP};Ba%m)sFHx{8*DaOXAt?3OOT=PuYW5d2;VMAg7)$9aLbV;W2x=MV~{ z)Ar=JMbL-_d^=9t0OqL5_ISmSBztS%9Dm6Q1>{k3-1g)1rG)92#S>Fh3}nYK8V?)j zhB+SfcFC?b9+UbQ!VrRSED9B*_7BE!?VGD)p2lM}PCBSHtcnJn_XRsInh=tBI}l-- z3ZUqCi(ZtN8)lAaCCtbY_jzn)YjKKS(J^ioyg$sh<2HJTL}*R$HhM9Ige%cI0H6UE zRE2M(Gg(=Wmv1T|Ct60tca$kw>K8Z1yR{oCsWjgj;+U{W^}Qbe*?L0e`91^S_NRyK z4P=9985jZHJh-&}?9qG|WRXk0q+_m8c{!pzMu4Al8q%5FSYPtY9^aYm>KuZ39Eo(b3gPj%$Pgm*% z^8F{Hu#C~>+p)HCS4--BCAEW9gPr#ev!0{}&R!7O=EvdG|1_pw+nFyUaMMlUe^9`B`#1&~T!+T67S|eMQH>&Cd zBvKLY#}iIeUs!n~5>BB@LZ_wPoPR3*L*u>1tLrQS?eh@cZ6h_{{bUOBN(V1*Jw9s{ zZ2g{tRwtBJ&AxXrQMFo_c&k##bHXz8KJin-z+CIQ5i8fLBf$Hy%I2Oiw(qt*um~W) zc#oJRQOlO({bvMa6^E7gk181U8W_Go>AL=4Pv3?~eonF8-a^*+!EvK~^XQVN;xWp* z2dSGb%-6RNBMx$h!rp;YDFVG<-bZ%D3{ivgPV$z=K%|WK57B(bPK0;h01|^pWA7t) zTdN7uyqy%C{fI)~EhYoi-Uh_?8ZaWj;8}QHlHE}xVDVjxMsmg#%I64P&cvP|@$3YO zl;y;pFBsT8(xmFGW&;5-Zd%{D8N!E*LR8E4fa0^C9@i~T#pgyeC>B(aJqs!^1$@KL za%j$C*~~t>aGVt)wBb1r_5!EY-rLR&GN6}k&reYhk>aFyK5O$q!-o1Cgl`u{h9A#^ zEADXHsCed_9W!MN?wOH`02c=e&$N?Va)}Q2HrNB_(eA=C=YaulO(mXZwOjyEWBoV4 zlo2aJqxY5;$WkKVcdu$0HK~6F?iJ(3Gu3Ity>R+q=bnK5>m%Y6(u$IQ2}C)8n*{FP zsScfvX%GIjT5GXH&d|R$oMOZL*8Y_N=Ev&=yB7`Rnc?Svf0uA%T9zreH#NuBtK*V; zon%;mI3o96Rwqm@?+~~*4ur0+2e$uCP-9agE8*V?dPrPJz`a*Z0i&NH0Pajq9e~H2v)p4c%yH<4eVC?JP1v-pW{8;_hsI~LTklDXLcUmwk zAoH)!3<6%9%={Z<4~x1AkpI@0lIF;SsQ08^A`TT!o+n&6Q$%9JbCGHGq|*0xqahAK zg|cHab67Z_vc0cn9Bu_6eb2!4vPbFpj_iV@g`UherXdB^B`MxjZeG_IkKT!Gw4#{S zcn6{xAykp#ZRC_ysm9YAi<{39D1zQ?lxZ^BG;pV+E2b%^p{%!Dl1~;2 zx;NVtCV<6QPGLO$BEoR29&}fTBGEX;L#*^U%6mR+0Rv3w?Q@n>5T9T)JRk1KqnFqf z)AD&rj@`*PcR;K(o|SkeL0HwicSvbp(3LXJL#hmV#u0i>&63$LjqE+i@H_*?ZJf^X zY~`$Oj8ERPlPZ9365u_Dd71PuEBLmx(q@vyV`E+o$nRNvSF{yhW8O(OQx^=$N_c1T-(juH|; z^{stB(ZGex=0Ma1Bv-L0PwbnK&+rh*nD=1^!Gn`3``gTwvrPz8-n6+M z#$qF%h3wj3kfwMBP$DZ$*y0=3>Jo(H(HqSo4a+Nl&qE*rJpNI>Z87o4`mWv%+zj&Y zlzk61fDN@(d6W2WOlDxNrwlk-nh3_LHb+jN@ zdznPhXD(3&K_-< zso+bN#oMwH^GHkt7;4_BaCHI}Ti>fO%xGC+eMcT`iH6WS%ORYvBu3s^5{;}-vUtk| z$%b*_<($l6*TMtK&t9iMJ(PA7o_NTe8xCmfQ$$Dpf+f)jhtyyvkrQ9CAD= z0h4-xzKg)InG9A+R78)#>|wJYitRBRH(p>mY>z!-(@JqO9B&S((YOcc_)B3FjVS`h zvU^~d@TfUH6BZ}MlConnC$gdlo#WZVu_CS`j?Z*i^3`GVodl#9zzfYA!Pgrk9gjEM zl7^v8A8!_IB9o9*yp2+q(6lJ>Mu2KGqfFp?LS747qk6kZT1j&N#5*n54)QYa-IXZ` z6`J%G(=jB~rOo?&YH&$T-gur_#^`i;zv!?aYE3#0z`DL$Qk-u?uBIcXdESd#0`ABeeP7zCQ>m2ZEehc4c;4m| zzRhxk4mQ!g`5=E>V<5iu4jm`y)ZT-6lADsLZ$Q5_8p53rI|Qmcbvs;uc?I`Tfw89a7CWH9AiNxGp0rL_)8u} zFR&qw?|5Z>VRbrI(?NDpR>qDG$F^4Lk~GcUL84962G^>O?k!b`U{DRj`^g94Un313Y@_10oY$cos$B7Uelmd}(tiuz`0tV1y$E`ec^>*wi zK#Zc`h2u;RxJMK@Q9o;r9nrc_7J)n7bh2QRwaqb?3`IUjB97g-uF9~|I&O3HBt$vl zJwU`)U)_N>RGKxOEsz|iGD;zRB5^EQqNt9mkK;9D8nN_&y^&;x#68)0Gu2u0$-z0+ zBc}!eHVNKBbjC!&vN&3VQ7u`v2S-aAoq>s%p4^d^KTdjfT`2696Oh~LR54N$VVv2rub zxF*lQ3rC|$k@hyo=4fBt8F|pGIGUH0!VE4XLD;r5?_AahIQnY32Evja7caDm3g>{3nk#lNKD##zQkf!;$Vfw zyXDZcmqwazVvkz^7G7#bUCJ8 zht5Wc<|nw}#Mwlw-7+8(<7`PX?_@};a5Y3b6F)EzzlQ56NgGDS)$ru3d?YD-+Nx40 zqng;S)qVcyh&uB#0%Tcq!AK%Dy)4HmmpGGr3YT^&YVPV{pQbV7JflwLra&CpqAf4; z`r!jgildhe8A>vcv2I@-yp_b?xOUgmo<0X0o2H`aZIUC{8126f^*^IbR<6wE` zYjqMPL}|tR8V1R?A)seZ(^UjYq`SIW7A!0uYGGHi)N>%D%KfW^bhpfnZOkrn$`SD}5) zBlxkxG(fpoBEI1Vi7^CQOuRmfc$nqb3JWa0P8RfphT)Jy6fe7wp|#4%QirD@i4y}v z3_q<9sBg{PTurbF$A!}YSIfbtWOS?JZ4;J^{jpFz+nB7QCh6(hCd}n+%IY{9rHlyz z@&bH~&h2eWY1P@Z@U(2YC7mtkO@bG<1qMPFyUo> za+pG;o_tIV;?pgm>dW>{@7Tc=akSMfLQqI=KBj4+RRRA{{O+ zCgycUrPk=jg0ut~(q{2tVPr&DP9vNv2~^&I1SRf;qj!LT%la0Vm$VyPN*qL;CQ}4P z-bDmueNMp%a}lL!(9+T{+(L>}I~F=zI2xQILu@SEe)hUYXlWSaYGJo8AYBMJT8;%j z=)|(Q8W|N}WCjEdR>EMQls(%at1f@`e{ z%^w5<7(<^~^8nR-nm(7!E_tDtK5u$`R_PL-OCLZvWt6NN03pHiVG9dBbxNNHlia?s z?eU)N>~dA$^nRU^3i={?(^h#P26oJQ_5~o)7Nut`6al=98lUZiSV2(KeJ;`C0UD*G z=N7d%Tx@Xj&Qpp(knHdIY6np+2Ega1FDg+LIL}pDViBmqc)n11;LD4}=O0!ZlTALJ z2~dscggo(fy>TJy44ii>(HTB5p6^#DCPuKb&jZr%@<%i9Jc-#@FUvBw@I1Quw$R z4&xTvU7CB74mm;Zpx!&eOa>$~Eb)Wy8OaO=Vl^C}9lsus$%*hBfy|(cGd9l?96h({}6jnH;3)G3z?7| zs_F5ooTxcD47`03^kpgldw+$HpaG)wS?UssY7Zc#OV651NTeZy@XQ(o6bTEP=gb0@ zyKSVNb;LgLGo*b+JcD3l)yDIY2B@`zea}|NRu|kwK1;?9idF7DC$`{Xi-dfp45Wlm z3-|U?!$(r5iT4*Vp|Cl0JX?5!M35`@JfMXp)hX+O)e zS#L600#is~J|``yoT5T}hKh_`BVzWZEgS+RYREH!EvGTGa-XO01ZV=c_l&jRip&Yv z=d(FemR86;Px&qjjP$Hx&9srUp6eD=v64vOxo-^+AAgL`l0+P6+0s5M0gYT6`+0^0 zaNr3y#&eYG#wzkJps&R3F*EOk;>2#w0S4m(13uk>-{=J1rIt&@6OUvG)I1K${Yry z%xvFXMoh>J?D95^?U7YQ=-wtq{N$=s{(As+wZo~~y|5)NOWlxoR(h=^>u~t|vqmp4 zU(Z%}7L4eNblw{z3=##aRC+d%-|O83Zsl; z)i;>{RP&BuUy%6%#_aeGCMIMMr8fn*EiRnlouNz|LR_o&Qi;19B*q+Hxht&E;mMn7 z#;t@mc<-sq1}V1VI0WBN=oJaaWsOx>sRTGae8J{IZpE?Yr5}+k*W=7EGQc$Eu@W0s zz&HgS+vQl%CqvA!3le&FFf<*rcx3=}1s^N2@QGnZ;#d%aC>kI+jseqH#lljL`?z|m zN9ggPr(%UKtH*>%bUaa#9UB>w8DvDr3zK8YAp%lI^p2I7!I?r1s&sjB+@fx32N$tp z?`aefYKV^Y#st}U2_DOc^7%o;^O%AWHUPVcfNb_Sg_k^5NKVH*5MqLXTOMP$TWY9&Z_e*ydvE_)1|415#(lt$&`aW4w;t z6q0`U>f0y`nIIZh@2bGBN3%WeDmZ|LPz#Plg^I|r6LsurmtgSP*Oo?j zcxs}>`Nj)_;}y5+T?2s?k(@2>880MArS+T535F_j+`P#MWI0i7y~9w0+C(5bmb3t* zg37>gr-%!aeJ(}>!Uhl!Lcj~ z8h#EQ9IuWZVZ34Dm?*<66j7RExG_-+OUN8knIiENBs#XzCIyQX_cqM43nRmiHzVDQ z*$+|AQE#-19VVZ%XlIo?LA~>sT8CtrdUr)QGY0$R4OoVd3a)^+->qv7pDFJvpR+>9 z%z1-~83t0Fc{3te%|*<5V*&k^5mE0aKqV}z;COe&z?0;P`DWrm^A@zu+bb;5O-ARN zMTa$?z{5XR#M(Wr_0lZ~_-Bg>lyWh{#*q;J|PuzM(Jyz!twP8nkMJ_0L2^ugU*aCSkS6xy2#8&Wv7T5nXn zIRZvh->CqqVl6Pe%OGgVJb0~aD&L;4YEE@m-eUrwIdBAfTh`${h%-19zsV-;Zt=8d?9R_~37HzJLuG9dO;Htn5g2}0G&nzs)-Jt0HI zx2Iv1H&=MxoKmiXq*C5RoB;6+1-<`PAccu_eFGZN#VKj?&a~t7Op^L$gn~qA2~Nk` zd+~M6_K@*y38AqVon>aN_nbxuxTIun*gQp0Pqy#f+NelLtY@Ls6knM3-lRJktG>GY>L?aTs8DR&4U( zN6(4p#v~7KNEtk*ShDeTd*j(BNEN1Kes-X{heDR^bBD=H4t{CRBi-_$$aKP0J4bp#wKy@&Y7T#+nPZ@_q+Y?+5}%oNOBY%cQGB zivXc}?GR<6>Im>}2m)WJKpaa!(*9MNAms7_kbgfgaM7Sv@ZT0qZ5m3~ziC5Ds3Mg7 z`_mT3z&AfrIi_04op{%3-AEFP_S~S7?=ywy`$%gS!IdlGw%&KBXEbIPym!Fx^KpU9 zn@R^mD+*oSpi4~l0^qj-3}qN4pWaPaf`l^0yv@u=k@eYnuUL>M_j>h?qp^zS6?}7T zZ9*9{@~#VnQ+A>4-NMI@6-Nlic3rcokZ8wJwb)Y)XbzOX=es;@NDz=ddog3;$C~Q% zXI`AV2;lk4MIM4D;K(kWXD&gKGH2jD7mjiC0t3MF<(?Z!s$iZS-GBrcD)UUJWrvjl zKKD`%CO)z7<@wO{%?uZRCNyJrmHVE3U`We*eejF~4=w=}cS{rAwg3hs0nvD`0sHZ> z^m&$`pzZXLb|GW*RCoHjf*;VE-4eVJy-c)f{`NP*$qdB6=IBU*|7sv8lpTS z*^shhu;BRu6Q~T2RnHC(bSjG*i5J-3SWYbI(hPiOSp-}GhUz^^A`IHvS(V;%P$v3e zC>dw)ErR!W`kAs56TXzqBIwl29kaqwQv zk^$_{T7uK@Y&4spPN9Kkpw0+6SWDlte1fT2p6}BDM%v%l4-;ZDHd(TB0txxRxju1cy39;`yFHA7d8ou!oL=?$f3gT-Ff+iHCOEY#YZ(sK;#>hjE@3il-_1MeXx2o zd8d+yV}JW_c{d)CnP3PRS<%-$P{H)+laA@3|iG7+iLR)WYkjVTCp(Tu)%q>`S>jlHwP z;ZPJi^lm)?2ox$92K5$nq=lNG=FPZ3O@JM^@7PX#1hE!D%{$DGp`Q{V-eW*Kx!g*7 zi^?!VB?a933LF&Pgb@qmgf`m2U$ve}?4Kp+1yq{!okfaTVH)Pr_U7fPG zXyjrCNiOdzb|}7xm^xN6X~2eB;PDp3T+IcK$C{a2xD1&dlX`&TP26$J1;r99NCJ*$ zrJ7PKz%i_-&{HZ0A`Fgi?Qom~QGyk;93LUdi$X!@_!Cu^LzB7V%rbV`;?|BypzMB{()z7CcAZF*uPNHkEmgXbiQJ z^YAtyCyom;KHhDmSh00x-ep0Gi+N$*Zl-N?p5We!Sz&TmPI)sPaU-Mk^d6Lg_MLls z6WM~8I_1OrGt84Jc)Gm7MC`fy8GDZbStTiwUyfFbx4#`@0a{@kCg);M=ba0|p1B>^P zJXe5oxV$s_B9J(vaEzrvWt6D}$9EjR3ffkWWqBaou`=TAQwYUDfRr~?QI@Na?6GZ$ z1*lMr$8r=20hwfvZAYvCP{YJ=>r4e zB0>eu=jT`#L1xqy*Y_1y)@qd5caq~1oi?fO0W9i}NNVr~fMu{!gOIm`5@KFOw>MG( zH(M5%j&;A7(BPVUCk2XV6RmLU0d9f`CZ^*MY<5`T5jyVh*Z|PT>-hU;LGsOp$<@oP`Sp&Pk3b6*m%UB7h zfU_2RGZVAS*0$Fs0eih|fddXNpcwg@jtFaM5+V82B;VGl zU{=hAqqm7!(U>G8z1xq_*rx6HSm+tEEj$h=Ks4S=2o$c@0ZeYjVNM^YuFuc5h$xGL z;`B4n0zoH!z}##R%APqdMt`Q-igpA_tDcI!pY4u$b>!f3^!XUB)b5SsPIksHB7FBf%rV#%02jLgIkg~G~<1B$!v&0tU6jKj64rOP#&#O_m7aN!PDUE&^A@69Bqu= zQ6` zZTQ*XWQQMvKtAHN15{Ft(36<(xfeLY?I7mfU|5sJ#6<)Fl4e2c=Us&yjsycg+)Is~ zh|~^u|BACGrRjD14~`AoiX18W1z5QtAcn}lXryqa8M5{7&>^3boYB3GlR%Z;PnR zGqm?Fj+fzB(e^Bc@4(_w)^nSq2%iUDJjdO>0^s^S7fCFzBu##PGL<(oz-6V_dake; z;0uKGnJy0&HL85ECMgfkOENt-O?LC0gUQ-hf!V~FG`*n z2;o8H=;OJvK^G~7H_vhxkZf7~c=lqL10w?1bBstQqdi!j`MHEPy+ z5I#pivBkym#d9p!l@M-(&om0;H^CcYmgGEFd0RrV0M9cNC0trh`nidf6bqvao@1S8 zspK)fFGE|?u<>}0uCV=LdEkAzM+AyR>N^YsC$=&b&k3wB>iA*dttWBONN&ZmgIYN_ zATOSkj7;LS7)(9zj@@$NNDJ(JUI8JK5HZd3_l(5{+0N&u1V}gN@I@8G!__h!uW=oAxR`a%^N_Yf;3>Gg0^pt*jEBSxZUF7^9}FUQd14#``41wVZ^w#Cb+jU!j-N#0NB~`J zvK$<5G8(|qs^wS^#~f1tF2_7vrxbp1I!^qt=0uX|@gxK}YkLTep(Hv+D04d=oY91~ z+jK0*!!OMU+hZSmc-qjG9v>DtJpwU#%)~4}fml4pkzuyF_<%YN5j3SkmBQn*I6y*V z0XU|!fFn%LIrhG4eV~nToFZ*OZJ4xU9z|TlO!he511zFjX3cS4mihrH;P~&0s^OU0 z<2nGaQqayE*HM^@kmcj}Y=xCHI-w_yU399!y>W5;b#*oILhP6a5(I^l9*%V^VH{?3 ztj&;dtb#M_N44-6$Ke|`kRy&!W849uDjr`6-4cjJ$}y=243w4|j=P8owUHEZtmaFE z>9NH708v9V8O#8H>^)@}VRS-^W6{#c8!aS{OJ#_;5E(5G@4Kcm&pmeDLbTQp5xadKNyCPeHRnB&A- zMpxF|Wqdz@qQC&Go_7_X7LF)O4s+f?b1a%DOWy#2~*GSL*C8*H#gU#D+^fR%`+`GjpDbikV|5X~Z0n#W{|`Cne~bl=!Eq#K;u+O5uz$y;j!)pgcsLd< z!j^YZW5%R7-kboz5-rAYm@lnJ-dr5tau7;W6LXxQuLHEc9^XZkq2b2Hu~rrjL54?f z9|%sMfN499lOeBx)amok2LyO;hP?5_`5O^o_c^P}<{K9?-k>!?vp^2Mzs#B2+luf^ zATke)A^Bu1&sz-YN?B+=XQ0hTpe=0tk$HPfU?RY^#Ty6_0e^0y@5#miSe;JZf3h9L zjhG%Bi0{S7sHr%scc^ZLs~MK>D%%09U<}?-Ifjnf*m&C!*6|c0cZ_DLtCpU~%2IiM z8QP&?aQBwOGc`nV;eDp0<=l{FIYWD|Ap2`kHg6QVZNt!q^F|BOAguQ#sqLs7#djYl?aIC{aJSAOiT4WxdFD46~a5SHAvo&SWK(;l0nTT4G-R{ zO|N>iYP{W~HHMMF@(jTB2M0W0?^PmARjeZ4x^VC&PlMicz{o+N!}1=}QQ)DoZ@eZG zn&8TKSLvcsb~yCr6hbyZ%g?*hiPH*>qqo^y8BwhT@4G7!Uwmlah*)aYTmXAV!r_2q zkB)ceiZzyOj_*esj3p93-%ni47&1zEPcC&~YkV}!~Z3}3HD>d~U+t=1YaKc+plfBUuHJ$-vP-Dbl&a;CzSyJ3}J!3^J zvC~1yvlxPmsAA3CyglPE<3vJr^87u*`dEbKnTn6muDt@!QLvMTcp^MQX?|8VEqJD5 zf`Ys<<4wmhPv~q#WPpW7c&>8fEYHl$^NTYHmzR6bMVioN ztWkU}B1dG+spYeh24vbi0eEhV13-7cj^|4}WHf0kJ$pHG>tTVJ=g-bK1sF4*Jp-sU z#s+w<@_>ZsT-Ea{oyRYiqW6l(ozdjL?70<+sSOjg=M))MFOMv}b=#~#J43gj$Fosr z8IuSAp3x*UsZ(YwnC|;_>aYwd$J-VTg)W72&jeV&V8i(NK+=^zFO262Xy{OZrg2K_VbU8{LDy1{i1(Z@NYWm(0=`$VB!-~~@%};rO~DnS z_Z_DtGCpg12zduRjna5v=iT9Na?g&aw-#Q9MihJA77#m%gjyJlIB%;eK|Uzx9>1Ew zb<`|5-ksB9*3J+R$84T}u*hj6_*t|R9)XjuB;O<=iU{L;Br>UzOQl?&;dl=Ubahk zu8Q6r665adfqQoeaWz7D_l7&%6umWlub|K zG4IGTLlR~+yt&Nk)P)UrhdrH9S`p>VLWN%08LKy4>Y$*PGVeh&N;O6u-ZV5@2-UW} z9VM|sDW$xXppyC!oqE?$)8aczd)x5DY-DA62bn;F(5lG$3Zrc4AltijmXHbB>icp* zgig9P?69IBOl)gm^&%BL!dCz`n zI%jYRGf}P)Fll<8mH5yU@nHMhwPHqQ-rsWtDl|Sk*Ej2z-62(Iy!Ci8q2X$MdyaC^ z88P#wrD1|k>+M~osJ8Jd%KMH-+?gG9Zys!HQ~-3}fMuQ%IQSdX&g$ZvHE&cP5)Rbp zdxxP^Vuca+0Cqr$zlJOwlJlnYy{TlisKDRlj^o7_b#0A%$4TZiMJcFy3+>3Yu!iAS z*UrzLOuzTf;AI=Wtaktlh%vaNj^$|KJh^>x$%O1ukBeyKx$`FCm~rq3ijkD#C>7|c zD0RGj(n1M%*&NqWDv`6ccWlP1ErU>wV=%ILiy4(;J8p376{4v%%^#ib0AI8;;B$I2 z08vGz;b4cvU}<}+p&o6}0`+d;2^d9T?A^kPtaK=!?Jh9#X)g1mEB7-OUhdMA#WB5g&z7m2jiMecb2 z8EuA$arCC*oikZf_rClP^z-I#ArxA%?F{YV-&=}=ES^2q-aOp2-f5)r2JBKnW(dkV zNE2Bc9JJn=Rhd~(3XfkClp+Dk>oVqeRH#Ce8Q-y%RnVcMHpgpH&*)ew9n-!z(q;6H zcg0#tZ^#Qg%Hvldr?_%b^A3+;i2%S;0`rBQw*Ui0bSu+r6 z$9hy(fsSIwbNB`ZCl-VZj?IoVS#aaQafu*WXKOoKFqIw!S`9Qfj?BY)(71a% zMeSMKOdWTAQNc`rce&b3@KO{9xpM)OGKN#1sCgq5*IcXp9_B<%D=x?UMs1dNzDSS=Z->D#DAUmW`coEYxfSaxpk9tg^T? z9L?!W=1k%Duh$BuTqK-+gaI;Ju&AlNL#STa8LPQ>bs*~)?%6{~esO?f<@yjs4~lqL zvGTC27m5aY-HL>!63wvz!Xk9B1gLmQv<_j z#i$43X?Ggu%G9a-TCcdwYDznske{`?E)D{}fWDTbLe>(gDrYkUKxM(KgtMjD()J}n z8=Ey$AaAB#qQIl36zkG#CL96oUkX zIH4m9N!bn&Jc1wyLva|yHxV@I1Jf{P_^ZsfF~Btou-qif&vpxY-e3nlAj>u`Y}9i{ z`DK#u=S1>N%u~bDqR>OS5q9XIQ$G_N=N$um(4u|TAs%hNIowcKV^lmA%r;PMeAAJe%QM+kPg-4q{#xtZyN>d8B4`q{k6WwO@+i8g0xOM^gNzc((T0dRI zj}i_9&eTMr=h!*n}!*eD3m#s z=h+BE7AAztN8@(ym*Z$Hf(9#VHx?EY7C;or&YWhNkS@ZmV{BLk8)WxJwf38=!rE!} zq~vL4={&=_ZH8i9kZd=>RbS2T$_6R?DYoE8Xf&stmOvDKP>TE z-_SFOuhRyg!3<^=bC9|lo+w$OqTh-39YUuSZFGT7g=$7NkI9a&+Ig}2n1j9=MD;mD z77Zyqed96QmISz80aa|$AIEJ$VNbYllUdieESHo)=cprrFkoS6>nJni+Dqj!#M7z> zDWiw>Y{76dMF;6w3Fm|+FE>~dZ0twl34dKLz=rFDg z*GJFR9i%xZB#{pj9#Fm*(vaB zed7Dj?AB?2D*G98OE#47%Pj%UeiA~a#Z6mAJqPs2>I$zadu-Orf)4pucCl@ShxI>e zIwv?cmip&7O`ypV)}Id57QFuuD{zO4CuG%qAr=DmYFboTApd@lt_1`t5|j#KTF^5^4Sb~Nay zM8Ug6fjmK%f^WJOxh7V5yaluv^Ra>SKAI&JOFBF9G@WCR?>0GUfFNM<_A+f! zBA~;24?~PCuhts{ri{SLG;b4uqBsWIyx%_8Jf?8-zKf7&g$s;#9wtg*0O`#FQ%Q!~ z*SiY?iAfr0l$-Axtx4bzc)l&?%(UWac~gpo5hnTa)+_+_LcxzW=#aQQ7Z$wHPNTZ; zrFn;qvCUkJeakJWlI<{i|H0wQWTo-G(=+9WRKoiOWf9m7FW!$aq>gwId^hq?($l2$ zo%zCuirb2J4$&_rIRf4_QquR;}{KL6&w*R9LsWu zWgsQ$_|{FDFE4n!fy7v`6(jgIl5;mBiqf0I4IoIYk?#nNj9?4}kHM@-@d!n9%=$U! z5s%+-oKC#LJEb=Q5lO0FB;NtV0IbLydk<)=HP4eSb;1O9zSA_xu}3)ZizVFQfkqL1nn^iE@*5lVUN!U-Go{# z9mAmjs$9A~E`i1)!O!DyFUgodgv&9D7r4+daD;|D#}*!tikQ-PjCChDY1?*;_sSsb zNbK>Pj#^hbM8|AfXLN#+psJ3~y6ldJAIE)}R%V#FIL3q8BC`CB%{zJQjk(3yV(X@eL}nMmHSCswupY6r0z$Uzm^F8Tc^hziTUBPphU^>a!cgvD;v0zQGOJ9E zcLXt{3?}iOCMB?ak}&=3N{$V5PF1h=l=c*d1@dS_N2_-@>3r>lYzj7rlV{s91AWVf zUt80K)01`aY%$taA6Zm5*#HDwl}GS=OsmbFzCt`%=@f}OJ-U-E&1i9^7w2Sp$fPbf zTk??Un*|IIGX%%F~~7c%ACl$80FEHUz#8%qmpbhi-X<;C4v~;)Srg~h6k&YJCRze z;bMeLgH<>LT!iM95q4>2KH`As|Bk|Zi%3A8P8txt73M^*iq7Y`@G#_ZIr{OgGDUVi zRCgS#!6XP2ccg=V`5?692=P9_{MBa_BByhP*V+rUZP3~Ge=)-pSNZsF+?=7G`}`|+ z=9xx3Q3CHJ2H0h%{<8$I|bpmkkma4tYK#(t|BQ)Nor4Yu25vX@- zvbV$-^?5g2G`1H~se*U(HCzs39_v<|?Jz+O5oQjrhQLFdCXE!Hwuv>r{P1d9MnGu` z4Dd2KPx3qDaWUja+E&rz-^4JiqAQUlweceo>eO|YUmx64XwBA+Aimz7R;+>Jhjolz3;OH zHc3K=ym*h&t%7~<@}|-^`Q$U^IRMg>jR|4TT249*%;~+cxWG`jL+Ba7)!Cp{(sP3p zX=}t3c}76n=h>dmR8JJOvIHD|fa8LzVBGtdrNYUT=)Eq+V)2AX+?ys@dU+@E->DJb zxhs#htN8f{h|eV?UZ0&XrCp)z@LY$7D2wO!d^njYW3Bj12zfrj0Ms>)=yPkC5qPXl z_aZpbL<3agy#y2p#W_2DmJ)zL>axT0ceYLCP=)8xG#)(IBLDrm+VTRF%Kg0Fx}Y`$ z$9itCrFfG)<`Os51t9j`xG$Hi3A%d?KabXYSiHB7cth7hT)}m5Z{HV@PYC9{P0)Bp zU3fL|yhB6{es=skTZwv-$@%4(GfW_hT?@}}^ak5H<2?U4Wx~k}f?GzAXMBqy)^Q5@S4f$%zZV;KY`AHX`N89~+!!uLTdV zW}Kdzd~l)1hvc&r7_Vm!ygYL{R(WIBo*6|DGNB85uEgWAp<>4~mop7cm!8i|MJy6b zNPCCk&Y2Q<-<)2sg%_&cXoCF2F@gB3WrwoO2r2I}jD-|li{5DNm@(4@=zSYOK!`61 z&j$JoZ5Dt#rh}Q+=PfH7l_+*RV}1CWinH;Hf5zj?{u&hMb@SG1L z{3ww1d^p3(4Jd4$DXZ*M2xRjH?IL+1zRwGc#ByZmcpd_B2cceJzad=alf^p-45s7wbX>kPd$T(0F3fCG*XIt&DE!?wC*p6e?L%k8z+0B85@p7{?GBUq(S3`>4bnv$uH6 z!cB{S5~Ab9OEGes?i|lJLZzsW^7zJ?n7}$#$Al)B{5)B4oN0wcZ5`!tNjH$42B_KYieisq`IbAwze(i0Q(>rQ9 zNbuyK!*LZbgsE;o95 z$Kx!ZfDf3+!N<2rP9Q!y9-CQlDi>z-7!6^gY?) zEFFUadRg*7`!>LbWiw5|8vv7C&n!jW1MaTu3{Sj^zI~y@>YALfV?BJSdnP{LOJK5E zPn6ye*fK}cpuR!;xZx9O|*HknDw@dUb3%+4 zLcFWyTw+mi`tHC0ifE0o<2_#>58+M7co+kg{!k#*#-@Ej;RD`EFl~C_92E9 zLO1tWsWx-S#f?Rx<^B0NiUAAqy~i$r7(FH4yD9Lj=*0If8OkxLpZA*&uX|l+yw`Mk zA72-rmG-!4Yejn}Vv5~I?wgdZkt>Vq?LqTzlm?792o#Q>Ndw+aX|!P|OsXe!nWNiBTdDyj;Hq)fa^r1IV3A$gzK(R#72y!G6iSY;W# zyCg)(bopII!|8Ja)SE`^SDMkf_mdl4Nm?uSC3{0DbEE(Ty!Rj^nPL$gZxk$=P}@Lw zs{kN}LD1(dV~QCD0$Fdz3AkWSW8RymtS4N2y`vatrwcmXqBEi})!kqP^R6s13YjF$ zo6=6=*Glir`hi4a3b6NMtCK1}c)X3+m^9NtA_;)!0C`GdFALwLsJa#kq26*F9AV5O z@;rbN$^{;RH}+9@1xEDk7{!g647K+YGLA-w+TL_tKvq?%Hy(w%1!8o(Yj|+7oXvel zo-%rP5_=Q*JOzVl`gSDpVe5y7u_-Rl}b8gIo(DIiDy-kn`o zBr;jNEB71#3HW(8i4wGB`t+WXxy8>0jCUlh6BLDa-Z=1>i5cO(F~$5~+v|LrF5U44H9K%~pDhp)y4C6M93ccL(x`=J!3~ob zkiIAQ)h3tc8?-dEzflyFhteI-s+$AsH= zU6?Tj!d$!o?AXnOoqYopu%Y+|dCUd3YM@Q(ctDaBKO%V?ud#M;Vk6_&&XMsH67<e*9@?hb*HXE9@{gn7~R z94V-$My$fKVwosxZCIX<=)EB-QM;E09b4)rEJ~N>y(`BpRnTapLRO^Ok1R<)(DIw+g$AdFJsR?4Ybt!MZVFff#V>x za7>ibz8B1Z)X+TMKnYrC4Uqgl zKrT>;>$^$77&198?+uhDvJ!xJLsgN9(s1UDfQ!z96D{5f46t2=0=_9s0r4aQ77-WT zXjF}7a^t*L;8;XF^5Bi4tHIJ#SjCKelchkjK$FQk4(-ZK5`(v#90@MQj^2s0E!m}Q zz@~}-;p1&%PE#NiE$j}nK-tfH{_VUDKUp{GdjGY=mow%aW~}< z<~M7Zm=UUcK=!=V0Bxzmr}+#dq6UGxAf-WA8Rzr=JoU-?@!-T-0WH_G!WeuBgDXg|ezwqq^q{d$x+yggr0CvGRtB=9_j% z-|iS9@7XrlNy7@yA9A1ua0BN(CNjcm--CDR($V)<^b3>i9W}senPSsaUHW-0#Le;kN0rtQ?lj8 z+b2qtFYL~-9z3VEk66b>hRRTp%^g3s)hdcyZ*s_HltOqDty8ON)vU_%=e zk8j@)j=p9c!ydH`7T7%Qg6H%R3Gdhz%bPbr4v*_}hLH(I9h)J6>OumH_Y&NmGjq<~ zYk4Z@NMrbBL*2{ue0qybwa_ux_BPVPwd%R#jlc>{1v$0v2)Me9LR9amywezpao%K1 zhFL{4-Xpl~=wcY~#`Do5_JFYDd+}}|=0=DX-1i=l6p*Yr-gBZ%?7V35{u@9>$;#e4 zEEi60Q}3-Ji4s&KlsBLv3s9!ccdo_LXea006(Gyq-o69xtfUe9d zD#%6;!Z)Usjvu<%cNHX^9<(^V%f=+jXxV-5m}7@VZH)J0S(myySl*jAJit++cq@7O z6P(sN@_Xh(`sFRegwlb|dheKJZT%7SMl|%YC4GH!vO1mp)xDosNtVdNg7WlzD9Hy| zLdTmE3!N(ub;qQRp^XRdm{bvC$+Cr{RNy!aUXYVwlw({nI$3T&tcV@Q5t9|y-vQ(l(=35< zyvHbztAOV*9#uMXeqG)~Wv)n3w!WL5u>HLt^KKd>aRdhF8|ea?K@@`T1|6Eo3Y-F2 zRo)aXd!(M`d2e7*XDNe*V=z&t8--lQa;ACqA|xKOt>6-Y3eEA^R8k|Th~vMxClGUO zj`w)r8Fi#?bon|y!jZ)Uxpf@3h~WUO#^|9rPO(Bl8iS|f6k|LSN6~y_YuOF5Q6M@Zb&L+khF1D=ZN+r?KlSF z=Nz%`F(KC>7+S#NE)u)AU8Tof3oIx(0zBpugfV2Lbi4=wmkJ8Pu@9Wdgj7Vql;bF> zScJ45*gS-}0X_PnV(DaiRs&pz*ggir=Tg;@#>oJ~#A)oL`q&Z@n`0hs zd`wMG5*#T-CsR65!uIXyVjA`!M8T2aVtD36r9M1ftg@;TP6OA&_$;6RQ}Uin!3iBN zyeN4Y-wgl>p5}b(56WawVtZGbD*zTB68~l8d&bR8*}+)HX!r%icxi(Fz;`WK5AJWpm*7gM994a^str-6_< zD3v2TmDlGU?h=WMIb1f&AzY=T6nNU%_EyNhh|U`6n5 zeQdgDI?3*~!4rWE(!#qnMbX9pymL2LJ}S@$ZtiBAq_K+d^lrFr9^^W9INLR0Y&gk$ z+vON9YKlVN1qI5LwnOh+PPk!R+}OOWL)hHyku!HAOt9*JX+l06Bzbv0ry;-vgYe5+ z%4r##J8^F^Qk3$H0eWW!Sv>2*^KR7ru@Xb_ezbI)0#^9q=>3?-*fvJ+ojPdRsJrji zG(T1haGt$_rku2ap#1|d-st%Lss;EG<^}c=N=3L(_kEPK4FuX%@94e$`Z%dx{ z0Z1fhn4#|gbW-rRaJ~z)u=~kOdM{CV}q;=}PKn><3|a5%06@|Pv{dF+^=NoWfvu|LOAz>olfP;?xH z03HZ;njAYC>1(p$a;zh;L>eO#j;Xkab!uF3>;r5BP!*zM8-+y}P&7GC@~B|WP~x!& z6K^F9p^oSBblDytI5uoj*6F2k`~ngGRlbVAEO9Jh%TUMX<8fOZl07DIjs?jqm`s#% z><0&jwtIWbhowOqHfYCmk!~X}#5tx@ty5$3>R2#B;8$+)_zz1j3nQIl7foD3JYhY? zYRKZolpGh5(80k_==g9BlN_J4$8#E}oI=Prz8eE3&C=+x3Ib*qswfb+b8JXst8#&r z^iILrmACmW7kXq6y=h3fcF0FDuPD#aG=xCWpQ)GeQ5FM~?2VhoN+U$ZEQ zIzw=GjLHN@jw#9G)Q8wik$J2J1*XNa9R7Gzx*gMUdK25gy#`$+~5pT!8rWaJ|CX6PP^=D1MAQ}CFT(ZwVl)MGhWBjRrDj^(IH@kC>G zJWFN(kWndrJZXb_FkHhrAOEb0Pm_U zFKSd^dYjl{V9VH$_uPXuN>okWluLh7hNW*MLTE+;biEHBSEcmDy^*Zep{ujwJz1xL z09?>p105qOrB94c?*d^cmh?D$SI}|f5q0VP^Wuf!3&}SFG76FyMtM`s3OGZT_Vz%h zfdWifVs-Eaalu5N?3p(NOcH`sVcr+Kc)S+=y*ce)<(J9Aw~9C*iGKs(ok1A@-cFWItOc2RV`)B7GC{~Y3oybapPRRhuqJOt#CbEO*$@bJ;9UdjP|L^G zTSylJ?=bnkvbIVWh4lSot{d?D;cv=23esa<1~Z|NZ%WJ9AI1-F%m|k@Fj#oU zt_j2qL;Ds*BFow&^(|Sq^{HmVyAF_HX%Vb9nhUs@mTBH!L!5B9f#A&p%@ORx?_DJ9 zf$Ns*JMuHji5`e|69!2XGIQUVSV%$@1idBSv}01|5HjNK9v?^q^6M#Q(bY-bzN#USre z*0;r=)HfCt ze;@40Q@7^q-Z@k^c0uI*n?Z;P006}NtD$g9NQJ|H6*OWwkVEfZp)Zmai_%KKf5Sqh zhEz%al@g=F<95!!YoAyWrP}-pM#rizh{3-`Em~C=33x*>0BiLM`Me>{$*GOf=MP0l zx=&i3MJQOR0p##~2ua07k@k%Tfw2(q?%g#;%n4fOyG)bl0g)(gE0{wnC%?QeBRt|T zJo2uzgfe52<{c{bby_s=MiHe04JL>8l%?*AAOLR_i4Gu;ne$c=r-Mv-d5a)0<3^Yf zR*q-SEjoO!rq8cpww6+P&s-=%FisA5KJrHzA;*K~6&BvCNG$ODrR$RYLOky|^_c;H z`KvZ$ZzEKNi4rDDn(wV@ar-)(`g@iG3>@b#gBi5tKDl z8utpJ6+(dtg6AVR#RxW4&$HevT7Zrg84RA|Ze(7i8NF+FQPCU)c<+LN1I1O)0OvbS zs{*f~$>#tjj(iSCe6~8P%~Ao#yOnZ7((cw<7D%X%r;BF+T&F|2BE0q3dT3Hb<9pm&p4LY6TCexX(Wn=0H5c zc<)hz$M6c1(39xwz zxL@8%nrvFA{N5DI47pHe^=&oum9i<|t>M6&HzDrG=y9A|A%%|zJKjoecN4g5yq$m$ zcjqR&6P#Ia3a>x}UG?4xa+<1Pn>T_VpnN_A z-v!o$hFr;SAuU^(X>{HVGEgXbg5|v=;jLEA)BD1Z3|=bMys0kZ2rh!YLwLQBW5nl8 z^_Ar|560Wd=f`JLf%g#-FffwpysM<1_!1l69W=-a5UYA$ISF%NMcrF3ic71AuXo({ zDFNB%yKTyyFikS=I6Eec;26Cj2O|yPX5WuWUNAk00EmMPYjhFbm1`z6G3vJN8Y?eZ+~2+MmpN#rWocqtIz<` zu7~FYEuQL*jCnrOl{AvK;5mSbo)ap@Va@6pK`v767||O{)`z^&xc6t08Fe;gp95f} z9{KUT*L)?}xdnUIz|m;z2Cq0n->{8AQiBk_SED*qw}geo5$`TO6kds5-(bEj7ez#P ze{S|@W71#%8)w1$i<+HNy0~{4F`)|+`rfZR#%ev7IbJe^GErCdSO}UF7l0TZkLKaQ z`cmY03)n3y8ZXCdT#tt6kaKM2kc*jIu46r^KUDRw-U0650Jvf04b%ra3ueIadBpTb1L=c`POZ zjJrEgZ=(g6UKLQ@M>eW_oQmEF&?MqjKZ(?dH}gjIdmz(7f|< z0DjShcw?~JwBlWSbFs!aqeACh*LDoLrd(;hTYP=dGyNNl=*^Cn^JYse(!-VR{e@u- zBkP8DAnnx`Hc8%@DUJ1Qa1NAE)9)<<%7rdK3vVAyKh|`@dGmIgQmmv)nQ&|yq!sdL#qk~^gnwg@9OJP9XsZkLP5?ytIY;bW zL_rBri^=zpkt(}6`n}}B(ey>(@okE+6^XFNbVfrcVljPNu#3}13F3Qct`W?M&SO1w zqAG6lya%X=+koWrJz)~g)&seB1rB%4fGl`3Ex{0lXu~lc4^4Vm8s8osu~LC7c}s=C zTagLAY=Jz!gCv4PNOyb}=H_?SbiBq#`2`oiF`$P}Jxtyle>udFAu8ke?W!YQD2Y#~DiILkY(pvKCRA?z^;1__G3=s5-(kovu~<2B3{ zY9lJl*fE-f!AK6O$7Uf+K_LA&#=~m+(IN48F4IgASvALhfP9n;3LLxmiK{ZabL_4A zko)7~ScVc5P5eTSdEh497*lx6V+uwA*rj8~&a>c_>KI8amR6vyW5!J=1SBhuiRfs3 zbJB8*nA-so>BohHMP$|d9n)9?LT8Nav5z=FyaDotQjaGYO)V{)IL2WG0Exdc$Dg^t zoDc-ZsE1o5S7qNu4Pio(izWu%71qL904*JNF6pr%%~H1>?8-4TrGOWP=wbwhQ~7mFe50i$@3i7#f7v%+A|Sb8Cbf7 z&$3+LNO-jU*K?5cRx!lCZF!Gnab~<7xGAX-LdCsL5N8lUk-6838w^A`*Jn0FSqB?6 zP%iMEb-3lALs3E#!*k@1p+vyX<8yI>0*QNk*g9uy4DR?6fTWPtxc3MKJ%-wdyyNh! z-M~tFXIR41M4;z+uTRd^j5E)#qd6;y0aK+j&y6Tv)JE8Qt`fSS42!pCDrtKjyy8Av z@nAv?qTRC?Asmc|!1HY6$Alb~qtA~&jU!YXK7(Ee^CD&WEcxXN^hWM8CsH2$FoMLE zzW0_n!mk2&o~>4qj9}^T+<``73q!uQEK?tdTEb@sbxMMF!k$gM>1dF_?b$*dKeh?E z&tJ4A!0zNeLlNWJ+jM9`2d(h?HS)_a-aq9xyG04mae1c zLsK`}A4i^ZlsHwYGW%>;s6`Db;d3Wj2cMK?h_ZRRF5+RS1o1ouW6F!zgRo+3$co%*YTYpOt%i8$8|O&VOf-Y4?v^g4>axA3-U*=OUE%{6@*7FIrc&KKy-nM zV@@?SYi^JpH$hWk0u0ab5?C+*B&Qs&01EWhkUic3=ZbWO$#D=8OBR`=ICfO^tARx6 zm@H9DH0{42uM9X zV_NIOn>)5+(LxPN?lIn(F=I07vELp$EKPKdGvEafn@x^kC~XlbGvhddp1C*+e8SUYx$o8Y7K%CTJzJ#*L`9)I0b8Zmo34$Q+ficVKa;5eT1 zymHbCcuWRm378@Pj^o_m%5kM04`$)Q2yFu7+Bpta`VUhbjz}dlo1RL+EFxJ2?t79=yQGCKM zkGI&trJ!D%aylH35mBoF(}-Z=7>*JkTrz&%QB4*IVFG>wQ2^&tK!u8$@4;Au;)`YK+@+V&pBPXhcc_v$v891X5(C-dANlJW0TM zL)n?=AOP!4A;n!2))DU)k%3mk456sLrTiSw82oyBndYS#Jl<<{Lrr_$w+Ti7De#=V zzZ{ex7|D49<`N0=itt|1Wdf7Z)%#1U_t;eS-WsGJI#l^yVf1&TL#ML6bF(GU14OLD zJ58|5^i9227)T*RjqLc!2fU`1uQHOvu`C5ut=$C2dw#@1AgyprIf;oh!2_X}=U5C5 zJevn)7L@Z?6_89)#o@aEjw>VyS&qkA5P75J$#GUxlQ6ad$9+}Ms{@Z)xDX%ogmJ>yu0emjoJ-jbA$6f(<=d|$m#7?>8Lkm!&}25AdmxU z@2VAPG%6e4bS{o&nD}|i<$Ci3aPYSCQgJ;6eY-KBplPScTS+6{jRp$du~*)NbOpUv z9MID?K*3uu37!}MDeo6^OuQ1Qd{f2%;Q&L{o3gXdLY=R-tJaVM56rwNC*;wo0sG!0 zdgbxvW&y)9k&3n#PL!Sr6eV#0MCM&vi}yl|+; z#s=#9%9Vj4GoJ4pC2-6-$ih+iW|Bb*5hW4cQT__RRSEM}1kg@QJl+wq;%z01O$yGS zx9V4fh|&$uMkT5ks8sVD1ZIY-T$Fbk0izf4UY~*VB$U!AdFNTodX-}28NwC1T}bJo_XLFMsg)3Cn)M}v>&vsMm?xz+5%&fu zA;t>fXE$R>ihxjhww(>Y;Y@{liC_kCvLp3g&jYQAqT^mq65c&tP|XBk{xz_I^VEmX zzZML?N1PcR$iQ>&DhLp+Yl_^Pdvt5rN8w&w9$gboKmR4`^h&PbcFsEeYg8#^%Fpdz zB}qp}DF**0rSdRDUo+lehi;tTJx!#+k#DrDFjC(Dx@qvR)pPiubd47s`USfci=zx>w9xc)e zSHHYxAFa%R&Unk#wXT~c83&-}Ah&$PM~deq>v_c1o1xe7`D?x}_7r)p(j@z`VDBx8 zn&j&O_dVKrG&O3hWxKk6HQp5-rxF+yzNaD}#pxpU9%~Xw+t%T2h zz9bHUp1(Sa#$*ul%p}%yr!n!l!6t>y2|tlv&tp+2f#7g@<^bk%jAH)YM>;*XF%B zXnAQB=KYGNT#G^gx!z#7}gaDpR z$<+WJIqdwclS&W8L)gEm;_CHLP9BbQ58Mzp*daFb4rlt-0SazSM%3?_3FZmZ;cjlB zNM`fQxtko=7aW!b-0hSGi%`@Mce7H*L($8Lw`~w=>rT!#)zQ1T(XdAiCfU~v*YE)N zvFB@7Z+W;7Qao+WYlA33Os;l##%}@Wfva6nn`Kh~g+O}0IQq3Y$RaNOp4?1L^$dp} zx}z0YQgwN;{h61r**p$loUFi!HJ}h4PnJTC0yb2AS=};!0v|O>#c(*ABA+U(` zy=};1g$oD1FA+!zK?>dN;p8kUG?;_uY(XIN(5e0TnV0Son_JbNIk8a5;_E#c04aro zEK=MILYCX0?Ay=8;%4_uaz1RzT^TPI&K?%Kqs%ZCu|*uqhdH2AOD0UmNyzxRWaB2n z;oij*VZ_#9g6CTYw3_g3Qn?j~DOP4v@%%<75}j7p{y0!Ho`eP6%1j6bP@?!E^kA8p zBXat#DN-tMNh7``qN{WTpB0~PP>Jebcj_TezAU-_V$#d@>JE~7vBK-R##8F7L?%zbHp9c>% z+-s!C4q}6=f8CrIKCuJz%t=MJq>O-P%rrrA3>JA-t7FBb(84pI12=Ql064xxT%pRA z``ij6j?XBbXAL8cC?ckKUQuR-1t(WRu$b<^w^CXcT zEbZlU56!~ZHgBGF1kll>a?5iAp#!915T3QTu(Tiy@hoT9x>^zeJt?0{*o}H+r9Nv7 zkON2?`kWP+w?NUrdsH*U5kMIzsCZl)iBA5z5*!L!eQadq!>)G1zeF62}6NP|5 zY~Y*rE)g!uoOhbrGqWW(&lPe4vp@z~jL#(al%RQg@k}BQguNXIo*N(lLlMNtNtmIn zkx9KZ!g`A#Q^X$O2HeYvhl^3|<+Grb9-^|~c{2?Fu_ciAD$xQh@tS(Bea*Edq-eYm zdM5PQab}F}bJqYHxm;?Wec*mui@kp;{vWW*M1sgZl5#CbdST(jJPd0xVHr%4UmAePTxx@R2vuAYNz zc~ZN#`P?XZ-~g_OV;dB%9N98+{P9&!aq!F|2VX0T+h;9qU4n*e&sAV#B&-aQtf6}DVj~QJ zHxAFLMk^d~4?J%vG5{z>jOQL=1?IFseD+~x%*Ec)^A#|D8L)odqknZTJWafBPfb|p z!txBoX2<9njW=fqC~{JI-e24#;busEm&s!1GHS)!4H5uxLB720Smp#}l^$-pJkz~3 zK=R`Gj3qcH3uN507MWxcp2%l9JhXGTt~>`pp{I@z0ndtr2Fi*^KI0HIy!~ML%&5xL z=XCVE$;H6%@bK9PT;>{u@!a`cgj-T2`pg*Siq~fJ*$3{FuwAg{CPx|&xH5cpos{9U z#>;c16i}&|ndi&S33I4YpEHq2IP$mo-m)e~3JsnrcHTgWyn-p@@=g-u?gH7*J9V}z zY0!3IqV`OPS?9$m=iXec9S&;2yz`hqvdrV+c}Xei!JDh+s2exDG;zK&Ib;HqV6xx3 zw*#b&ZS$Ei9pYmYuY!={OVD7MFA)_{Qf0O8n* zf~z)KC5|_h)cDbKa9pPcsg~91d&-L?GzZ$d!HGRVba&nlh6qtWb#Z(+v{6cS$9Wx? ze3)81Ud(xpICvZzmho~h8hV@vM3sn3i{l#%bO=)B9cMNGk);8K<0hflPD>gKGET>g zT`PiI*>UD$D;-XsaNxGI6~?h?##)RH)q*yUTcPmiz79C9qq(EB z$&B|8U0eXmFvoe80B#N$@y4J=%Iq18H-e?t4q#>85wZ|2wu*UE&5nwFk-f3pxYcc9 zEppy?FQ_E)S$MZlF=wp_n751=8UTSDc!NQq#R^IDKGC#iCk*xtBLLyj3Z%CX$~Kim zT?hyQ6Au>*!m;h4D1jnUZ=)R-#N6=SLw<4~X79WsAW_)~u=u9>utXDoAv;TBE?{&3lAx-d2*d6QOSvx^=NjH*#sb;SkYY zd*r>vbfAdZ6FtVPY*C4!z%h|6ltm6Ek1@&IMxjh`9OVwTf{{qVdgWNxsTPiF$FUs_ zpo4OKys4?$H~_=3?5g8ih!@ATU{2bIemI7`{p$q#F$L2@Fh-ikf)9Wkwy`@tF-IFD zWyfbmy9s1g2BXdQZix(A{_@_oj6*g($DSc9xpHO8 z_}sxuRRhrLTgo>o$;{t+0W`ymVtMO85tt)N=^Z7@b;*V_ZyHD}oyeBnLwrtC+2nXL zX#gOPTYz_uS2sTc`IgI8?hL{21#Fm3@9f@1ULBzWQRxmM@1AbUO@%{M$Dwy;SrX^yd(Le-j>zJ>wz`9bj;H1|wQa8#@++;JMO_22=>eXDxUNFZ0I! zB`VDTrWMV-ZC1y&NaWr-$IV}C0XP406_p4x$Kqc=BPdnI4*V;?l}TbPg?sDhLAmQ8 z_%8(}c1A)}|9vu=LRdNVF9mNG5L}d~sry$!r%-cs@voPcW|vtT|6WOmfkiOuU!@&A z^gJf{m*@kQnYkkWmbHFOu+plzK;mB|LIj~PWbfT=%OFCk$-gl|p=h~+_;1+Xm@0#XgY`wW+Cp^g>^ON_j8?4dnlTRr}MS@mIOdE7>Xh}yN@JR~W-)=J+e=r-Um z0($P^12+d2m1ooX6%gA>yEFs^2M@~lt zczFj|AjgFvi8q>@05KC3yhrr7(d4)G=DX@dyizvL(l?ScO9ilSy>kSxqJvZKo%qv( zKKREG5J(i?j*+Jb$SirEBEXu(D)V0bQt1T*_6~EWqsX3}ow9hV3MK$kMDgx4&;s^H z>Wyb8QUh6+x0|#QW?ZOvP7o^hfbr{nC)5FvF@etm+I->Rz=rl&fs-(Ta6mkd-Qn>@ z2gEbhnWO;|1Uzd6t*L@w@l3@dD>blkd!iWIrVV>?&a%(Uel?-{a$ge&4P z5X!D7!p>vUEM%ZCj~tgys)4K#bxc}!1X0H9u^K-Il5AGTuRktfwX7VEQIi{`;NkcT zro+Y|Er;xJ9w!k8(h!efUw7Z+k~mglO5@DS?lG=v((X^+L|SG^-0f`uX$_D9xbF?M zX;?vj?-F6VLCR#l^@fiA#Dd;?PtJ&F)8M^AQvi#|p?49OCq1HM-$kihbXalo<`BZP zPZY-cOHT_gL8#tgg0nC9^1Qh+Wia9Oc%uMCQshMI+fB*cEf5IrK&=t1S$XdlN=>^) zV{bny1xA&My!EuA6l?%}qt#$-YNF!(RwDtW8=SWr6f?!PqBkA@IkHV-@4zYBDFR5| zFZx6@d9CvnM2w*;M*AkRAnWpj;QPlO1y*HH?;Qz-9C5??R@A~F3Y7fb6nvZ!miHb@ zVOl7Q-!S0VAhEFGeOE?8nJ0wz3P#GbH9qegXhCq#oVIOxv+TF31EL(iE zWFCw1p-$#8a_j|y-W?WA$6jnZjXYF1UbO-_gu}=&91pu~KyMtQX+;1;@x`$k5nfMZ zt&Zn>fqtO;U0}p(Yoge@!3sR4f(I~7sAJV6OdSwN9h*vKU`0f6>?P6)!0L|UStX`Q zxX`@;oZ9%Kq;S0F01L+$s>gXQqyZ7u^v1wM%#P9~$9nYmY@xb?V&cu@J<9MUD#hD^ zD6W~0g5xW|sWCsFmq(82@*E&R#{eaUmI*wIM~vF%EIu;$53HlgDgYV&pLqdn{&$Oeu=BW34ZQYmy(1 zc@%1DMW!AcHpB@ik98Xy@`={pf*vc_ep+=9f_^`SK@pdfcZ!1w&%kl1-y1brnY{fB<$ztiT zmj!rMH^Y&`JI8W#5Ox`U9?xMFvjod}2lz24`zCdqC)bn|0NVShaY*0<%%5#2n*uYk z6H~icoe>$mAEHM)qj$qr4wI|#Wj=LYU0!VzvdPM*oK30y=ww-Z4a=UpJ1NSKG3IHz z00#78Kn}Pn{jfZl_iOLz74>5ryhIR^Ld3^Pp)8xeawogPEqw4yd~7Wf>4V*hzs(<) zDh~yj4BC8bPE3ue62`;eCM-}BL+xLldv|q~H2v$!6cR(k1e{DmrxvEuyNlrpb@-sy zA0yoayyO6OG!QB7UQjr3G((}ZJi9+`hO0()##fb}WvTwG$R#=&+>yN<2-tr1Ozem>`tcFCrE{sGe*dbA6Hw>~dap2pMqUe0+$sSPFeI>6Z{;F3c0++P zzk^Po#2ENbJ!!#!rp(PgckD({TKLurC=G^#?!OHv=&FbRMKf!I!ZYz-)f!TGT$%8{ zz^SY>uZkNOLqiFbM8T~Pf&NMfaDHu#;guy%OlRwW!LJnQ#n-Y(3aLn8bT&B5ygQna zUn>mTvWh8mwoRV&-wObI!bS4-Y@_JPWoRjj``sz{S%A?|M|f=FQyk@B`5 zVnArw)q7i{E!-B2A4R%m4o9JHiiL!vzX|bTlT<_CC1})m6C&4gShs&`h2w(jkn?YM z?3UohmQDf&X$31~SiI{B;vF=12L5HXfvDE2%fGNnWDu{QZ<`|^P9X^^hXa6NfC?}J zcWX*>{1V%Go0Ac@j7s@#fq!sPWy9PJEyRi&C0PFkq4vX+AyK}z7eTVoPSe?-FsU6- z1^6`x9V*%C%y?QT?t`$g$*WOfdTA1%%+aE9bUK(ocQd8IvpP-Gc8oB)S&Fe0yJM$0 zq8KP%dD(8?4Iw}jyet%ESc zNeQxx;$B`F7Z8D)bFkP2Luh=U{4IB^v9Tg@Fi$2)(m=0&hiizk)+HY?X~p$m%@%E) z1zTL0V$1@)EUL(Z$T!ZPRVaZL1gcg8Yl^F}B8lAsLhWj9AI_{|on6hR0G!#^$BY*R-g981-ZqdpPPg>ji@Hh$ zmwV>k))^N}FHqi#M}ZS3H5~s{LgND~aC0vmDJls{o&QQ9VzB^p;$NpNZMMoZ__u?m zWh|)Ry}4H&r)<0Yn;{LX6!-SuQ+@Xs|42(*J$uqMS<(Re{N}AI@yh1;NdPelCSZ8Z z>;kHKrF}-A;Wk5)gy*UZh8IM~p0`|`#4*c#KHDLIPl@e0D~(wdBY@9$4DySqSI*0$ z9uS@hb7&=lJb6l=Zy-2f$r|7}N@1dfG-mHItawST2HvnlCzK%RdM*IPsz`k*JjK&J18$ z6n?&2y^I(b6Z<~>fx!dI+q?BNNro<}Z!Z)O+@V8!n-TDBFo*WsAW5De0D}xFqGu;S zy00A_p1I!QP2l9qk{I=PXKQ>dX#yxN*zU;~keOrRYVl^INU}89i10KKNMpjr^tj&~ z27^(YkUk^vW730lm=VCdg6Lu@ew8vmj(yjp9V@P;Ddx2vM=7;y5m%*xokK2n7aKYy%e8$bKVurA6dTVHO5>bi!ib!Ra)g4%oE0|5`LyYBd-;3 zLuCR5CFmS}($$7_AOev*b!(0}so;3ANP7&cid7eRJc@WbHWLNSmn^>TDN6%0k(W-Pkr=4rLy<0_v&!ygY72WMk4SJ$^lc$BbrhQXPC3fFfWjKn@&% zw}2>iZj^Gqo5q03II+E(5(RiIl)f({sI?57eS1hNL-VrQ=ItVjP^bh5Zv$#EE~E;* zfBJ@0N#ov1mkb6|Z@euO5Zhvr`F@)-umc3vyG!f~*wN9OM4FR_uhjcRj0;hAI=tBw z=~~>Wd$)ZxzSUX1Q9DSf`m%F0@6A3DMO?t%b$%M|#>l)|3~JagNB0ewR+z*l z%vE54wlx3P+??y9jW#m-6r6`hl$y(o* zRy;n7i>>dS>y*2lMu%nyyR*W+B@`?J^QDF?77=rI8p-4osdLvJ+9K(STWXqEDI8U1qg(4`&de)FB5ku_lB+J>= zf#|);E+gka-=r0h89gY23JUdK(i3ylXC9^_gb9FuUBux6C)_^OsEY$(lf2^CMk zHkcm2?H)G3WIIOFLY0Vtj@#ClC|UDy9|j4bGxUxDNe6F#P+1f^mcRfBMpWrB0v{JJ z!R(j;h$%PHtT<+B^Ccz&g<}#q_O|5l9*^j(ktqjsY~l+`;G&1)H$^c#F?<}Gumb?l z$?G^{ijjgScl-yYh{NsPG2dYm71XHXIWs&4&rCR0F-cfDTPG>cF=B`!Q!OILV`Eu$ z?AVS~9KsO;mUg_uM=g;a7mhEpWLc8s#PQ__NY+Fv$8(rUQV2vHKN%JK8pAz)a)Wa1 z$BbjkSbW*1WjMLx_!39eSe7NnmA6j5lW>kXYtYH^g*@&7#?Bfo)Zg)ZTzVLqzgw zws3gZk)q;iSn61$p~yX(VTu}%Q^1_;gD#(B0iu&(NI8xys1D{uXbWk}Hh=T9mzVGD#II=1kVzjFZS0 z29pOzi_yVKhb{_^cBMviDM*@^jUmcV1w)2+QTd~!AhzIZKPO0J&JBTMn&DruCybKt zz!%X%^=d>)Y_ap^Sf_It>aWlGmI7{tXeQS;#D?m^⋙dr)gLI%OV-$W0Ah^qgZ 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�w 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

v(|YnROw`Y1$L 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�LUjiL=*{%oklDu9Oy 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�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