astrox-python 1.2.1__tar.gz → 1.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {astrox_python-1.2.1 → astrox_python-1.2.2}/PKG-INFO +1 -1
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/compute_lambert_transfer.md +1 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/compute_lambert_transfer.md +1 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/celestial/README.md +1 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/celestial/README.md +1 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/celestial.md +3 -2
- {astrox_python-1.2.1 → astrox_python-1.2.2}/pyproject.toml +2 -2
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/celestial/test_celestial.py +14 -2
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py +103 -1
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/celestial/celestial.snap.json +67 -3
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/celestial/test_celestial.py +26 -5
- {astrox_python-1.2.1 → astrox_python-1.2.2}/uv.lock +7 -7
- {astrox_python-1.2.1 → astrox_python-1.2.2}/.gitignore +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/LICENSE +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/_http.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/access.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/astrogator/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/astrogator/_api.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/astrogator/_models.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/astrogator/_results.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/cat.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/catalog.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/celestial.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_axes.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_common.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_constraints.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_objects.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_positions.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_rotations.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_sensors.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_vgt.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/conjunction.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/_core.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/_fom.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/coverage_time.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/number_of_assets.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/response_time.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/revisit_time.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/simple_coverage.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/exceptions.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/libration.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/lighting.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/orbits.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/propagator.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/rocket.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/terrain.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/CONTRIBUTING.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/automated-workflows.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/docs-principles.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/getting_started.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/build_an_hpop_configuration.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/compute_access_intervals.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/compute_lighting_conditions.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/convert_between_orbit_representations.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/generate_a_crtbp_periodic_orbit.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/propagate_an_orbit.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/run_an_astrogator_mcs.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/screen_close_approaches.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/getting_started.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/build_an_hpop_configuration.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/compute_access_intervals.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/compute_lighting_conditions.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/convert_between_orbit_representations.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/generate_a_crtbp_periodic_orbit.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/propagate_an_orbit.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/run_an_astrogator_mcs.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/screen_close_approaches.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/access/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/astrogator/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/cat/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/catalog/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/components/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/conjunction/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/coverage/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/libration/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/lighting/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/orbits/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/propagator/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/rocket/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/terrain/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/access/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/astrogator/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/cat/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/catalog/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/components/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/conjunction/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/coverage/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/libration/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/lighting/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/orbits/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/propagator/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/rocket/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/terrain/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/sdk-principles.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/test-principles.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/access.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/astrogator.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/cat.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/catalog.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/conjunction.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/coverage.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/libration.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/lighting.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/orbits.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/propagator.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/rocket.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/terrain.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/ballistic_apogee_alt.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/ballistic_delta_v.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/ballistic_min_ecc.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/ballistic_time_of_flight.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/batch_propagators.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/hpop.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/j2_classical.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/propagator_reference.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/sgp4_tle.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/simple_ascent.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/two_body_classical.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/two_body_rv.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/conversions.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/lambert_delta_v.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/orbit_system.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/wizards.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/03_lighting/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/03_lighting/lighting.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/chain.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/compute.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/constraints.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/custom_axes.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/sensor_pointing.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/05_rocket/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/05_rocket/landing_zone.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/compute.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/fom.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/grid_points.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/reports.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/07_astrogator/run_mcs.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/08_conjunction/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/08_conjunction/close_approaches.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/09_cat/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/09_cat/cat_workflows.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/10_catalog/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/10_catalog/catalog_queries.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/11_celestial/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/11_celestial/celestial_queries.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/12_terrain/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/12_terrain/terrain_masks.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/13_libration/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/13_libration/libration_dynamics.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/manifest.toml +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/conftest.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/access/helpers.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/access/test_chain.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/access/test_compute.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/access/test_values.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/astrogator/test_api.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/astrogator/test_models.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/astrogator/test_results.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/cat/test_cat.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/catalog/test_catalog.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/client/test_client.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/components/test_components.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/conjunction/test_conjunction.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/coverage/test_coverage.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/coverage/test_coverage_fom.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/helpers.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/libration/test_libration.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/lighting/test_lighting.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/helpers.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_conversions.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_keplerian.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_orbit_system.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_tle.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_wizards.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/helpers.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_ballistic.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_hpop.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_j2_two_body.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_multi.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_public_contract.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_sgp4_simple_ascent.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_two_body_rv.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/rocket/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/rocket/test_rocket.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/terrain/test_terrain.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_external/gmat/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_external/gmat/hpop_driver.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_external/gmat/test_hpop_driver.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/contracts.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/external_tools.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/gmat.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/orekit.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_contracts.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_external_tools.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_gmat.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_orekit.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/README.md +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_aer.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_cases.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_constraints.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_exclusion.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_geometry.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_mixed_model.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_orientation.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_axes_orientation_geometry.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_chain_sgp4_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_composite_czml_axes_geometry.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_constraints_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_exclusion_constraints_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_ground_sgp4_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_j2_two_body_geometry.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_sgp4_j2_geometry.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_site_hpop_geometry.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_site_j2_geometry.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_site_two_body_geometry.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_sensor_pointing_geometry.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_vgt_orientation_resolution.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_branch_semantics.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_initial_state_conversions.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_maneuver_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_run_mcs_two_body_brahe.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_scalar_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_sequence_czml_brahe.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_target_sequence_local.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/cat/test_cat_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_cb_axes_rotation_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_mpc_target_elements.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/conjunction/test_close_approaches_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/_fom_helpers.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_exclusion_grid_constraints_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_at_time_boundaries_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_edge_cases_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_grid_options_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_interval_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_resource_options_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_response_shapes_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_response_time_dynamic_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_grid_generation_local.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_grid_point_modifiers_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_resource_reports_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_sgp4_grid_membership_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/_support.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_cross_endpoint_consistency.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_crtbp_trajectory.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_e2m2e_qualification.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_fixed_x_correction.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_orekit_qualification.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_periodic_families.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_positions_and_units.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/test_site_sun_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/test_spacecraft_solar_intensity_orekit.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/test_spacecraft_sun_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/_support.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/test_convert_czml_position.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/test_earth_moon_libration.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_kozai_izsak_mean_elements_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_lambert_lamberthub.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_lambert_path_points.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_walker_constellation_equations.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_wizards_local_derivation.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_ballistic_geodetic.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_hpop_gmat.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_j2_analytical.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_multi_sgp4_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_sgp4_skyfield.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_simple_ascent_geodetic.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_two_body_brahe.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_two_body_rv_brahe.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/rocket/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/rocket/test_landing_zone_geographiclib.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/terrain/test_terrain_mask_invariants.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/access.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_access.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_chain_topology.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_compute_model_pairs.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_compute_options.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/astrogator/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/astrogator/run_mcs.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/astrogator/test_run_mcs.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/cat/cat.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/cat/test_cat.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/catalog/catalog.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/catalog/test_catalog.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/conjunction/close_approaches.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/conjunction/test_close_approaches.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/coverage/coverage.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/coverage/test_coverage.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/libration/libration.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/libration/test_libration.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/lighting/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/lighting/lighting.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/lighting/test_lighting.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/conversions.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/orbit_system.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_conversion_roundtrip.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_conversions.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_orbit_system.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_wizards.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/wizards.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/ballistic.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/hpop.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/j2.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/multi_j2.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/multi_sgp4.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/multi_two_body.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/sgp4.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/simple_ascent.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_ballistic.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_hpop.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_j2.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_multi_j2.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_multi_sgp4.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_multi_two_body.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_sgp4.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_simple_ascent.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_two_body.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/two_body.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/rocket/__init__.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/rocket/landing_zone.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/rocket/test_landing_zone.py +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/terrain/terrain.snap.json +0 -0
- {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/terrain/test_terrain.py +0 -0
|
@@ -62,6 +62,7 @@ python compute_lambert_transfer.py
|
|
|
62
62
|
- `RV1`/`RV2`:出发/到达时的日心位置速度 `[x, y, z, vx, vy, vz]`(位置 m、速度 m/s);ICRF 分支下转移速度与独立 Lambert 解一致,端点位置方向与 ICRF 轴方向一致。
|
|
63
63
|
- `TimeOfFlightDays`:飞行时间(d),已验证为到达与出发时刻的精确天数差。
|
|
64
64
|
- `ArrivalLightAngle`:到达时刻太阳光照角(deg),已验证为 `DeltaV2` 与 `RV2` 位置矢量的夹角。
|
|
65
|
+
- `MinRangeAu`/`MaxRangeAu`:从出发到到达的转移弧上,距太阳的最小/最大距离(AU,包含端点)。
|
|
65
66
|
|
|
66
67
|
## 小行星与显式 MPC 根数
|
|
67
68
|
|
|
@@ -63,6 +63,7 @@ Each result object contains:
|
|
|
63
63
|
- `RV1`/`RV2`: heliocentric position and velocity at departure/arrival `[x, y, z, vx, vy, vz]` (positions m, velocities m/s); under the ICRF branch the transfer velocities agree with the independent Lambert solution, and the endpoint position directions match the ICRF axes.
|
|
64
64
|
- `TimeOfFlightDays`: time of flight (d), verified to be the exact day difference between the arrival and departure times.
|
|
65
65
|
- `ArrivalLightAngle`: Sun lighting angle at arrival (deg), verified to be the angle between `DeltaV2` and the `RV2` position vector.
|
|
66
|
+
- `MinRangeAu`/`MaxRangeAu`: minimum/maximum distance from the Sun along the departure-to-arrival transfer arc (AU, including endpoints).
|
|
66
67
|
|
|
67
68
|
## Asteroids and explicit MPC elements
|
|
68
69
|
|
|
@@ -280,6 +280,7 @@ The response contains `TransferResults` (an array of transfer results; each elem
|
|
|
280
280
|
| `RV1` / `RV2` | number[6] | Position and velocity at departure/arrival (heliocentric) `[x, y, z, vx, vy, vz]`, positions m, velocities m/s |
|
|
281
281
|
| `TimeOfFlightDays` | number | Time of flight, in d; verified to be the exact day difference between `ArrivalTime` and `DepartureTime` |
|
|
282
282
|
| `ArrivalLightAngle` | number | Sun lighting angle at arrival, in deg; verified to be the angle between `DeltaV2` and the `RV2` position vector |
|
|
283
|
+
| `MinRangeAu` / `MaxRangeAu` | number | Minimum/maximum distance from the Sun along the departure-to-arrival transfer arc, in AU; includes endpoints, rather than describing the full orbit's perihelion/aphelion distances |
|
|
283
284
|
|
|
284
285
|
Verified (supported by independent cross-validation): omitting `sun_frame` produces exactly the same `TransferResults` as explicit `EclpJ2000ICRF`; `EclpJ2000ICRF` output is the `ICRF` output rotated by the fixed 23.43929111111111° J2000 mean obliquity; with `sun_frame="ICRF"`, the transfer velocities in `RV1`/`RV2` follow the zero-revolution prograde Lambert relationship, and the endpoint position directions use the ICRF axes; `max_departure_delta_v_m_s`/`max_arrival_delta_v_m_s`/`max_time_of_flight_days` filter the sampled grid by the `DV1_Mag`/`DV2_Mag`/time-of-flight upper bounds respectively. Note that since 2026-08-20 the server defaults (10000 m/s each for departure/arrival, 500 d) filter out cases beyond the defaults, so scans over large-ΔV windows need explicitly widened bounds. Unresolved: the exact coordinate relationship between explicit `MeanEclpJ2000` and ICRF, the physical meaning of `DeltaV` relative to the endpoint-body velocities, and independent Kepler propagation of explicit MPC elements (the `reference_frame` option does not change the arrival states of that route; the element convention is still unconfirmed). The numeric semantics of those branches remain unverified, so check them before use.
|
|
285
286
|
|
|
@@ -280,6 +280,7 @@ print(
|
|
|
280
280
|
| `RV1` / `RV2` | number[6] | 出发/到达时的位置速度(日心系)`[x, y, z, vx, vy, vz]`,位置 m、速度 m/s |
|
|
281
281
|
| `TimeOfFlightDays` | number | 飞行时间,单位 d;已验证为 `ArrivalTime` 与 `DepartureTime` 的精确天数差 |
|
|
282
282
|
| `ArrivalLightAngle` | number | 到达时刻太阳光照角,单位 deg;已验证为 `DeltaV2` 与 `RV2` 位置矢量的夹角 |
|
|
283
|
+
| `MinRangeAu` / `MaxRangeAu` | number | 从出发到到达的转移弧上,距太阳的最小/最大距离,单位 AU;包含端点,不是整条轨道的近日点/远日点距离 |
|
|
283
284
|
|
|
284
285
|
已验证(独立交叉验证支持):省略 `sun_frame` 与显式传入 `EclpJ2000ICRF` 的 `TransferResults` 完全一致;`EclpJ2000ICRF` 输出是 `ICRF` 输出按 23.43929111111111° J2000 平黄赤交角进行的固定旋转;`sun_frame="ICRF"` 时,`RV1`/`RV2` 中的转移速度遵循零圈顺行 Lambert 关系,端点位置方向使用 ICRF 轴;`max_departure_delta_v_m_s`/`max_arrival_delta_v_m_s`/`max_time_of_flight_days` 分别按 `DV1_Mag`/`DV2_Mag`/飞行时间上限过滤采样网格。注意 2026-08-20 起服务端缺省值(出发/到达各 10000 m/s、500 d)会过滤掉超出缺省的算例,扫描大 ΔV 窗口时需显式放宽。未解决:显式 `MeanEclpJ2000` 与 ICRF 之间的精确坐标关系、`DeltaV` 相对端点天体速度的物理含义、显式 MPC 根数的独立开普勒递推(`reference_frame` 选项不改变该路由的到达状态,元素约定仍未确认)。这些分支的数值语义尚未验证,使用前请自行核对。
|
|
285
286
|
|
|
@@ -43,9 +43,10 @@ Status of `celestial.mpc_ephemeris`: structure, `target_elements`, `reference_fr
|
|
|
43
43
|
|
|
44
44
|
## Lambert transfer windows
|
|
45
45
|
|
|
46
|
-
Status of `celestial.lambert_transfer_window`: `partial` — the server-default frame, the `EclpJ2000ICRF`↔`ICRF` coordinate relation, the ICRF transfer-state relation for the maintained Earth→Mars grid, the ICRF axis identification of the `RV1`/`RV2` endpoint position directions, the `MinTofDays`/`MaxTofDays`/`MaxDepartureDV`/`MaxArrivalDV` filtering behavior, the DV-magnitude norm invariant, and the `TimeOfFlightDays`/`ArrivalLightAngle` field invariants are `verified`; the explicit `MeanEclpJ2000`↔`ICRF` coordinate relation, the physical endpoint-body-velocity interpretation of `DeltaV`, and the independent Kepler semantics of explicit MPC elements are `unresolved`.
|
|
46
|
+
Status of `celestial.lambert_transfer_window`: `partial` — the server-default frame, the `EclpJ2000ICRF`↔`ICRF` coordinate relation, the ICRF transfer-state relation for the maintained Earth→Mars grid, the ICRF axis identification of the `RV1`/`RV2` endpoint position directions, the `MinTofDays`/`MaxTofDays`/`MaxDepartureDV`/`MaxArrivalDV` filtering behavior, the DV-magnitude norm invariant, the `MinRangeAu`/`MaxRangeAu` finite-arc extrema, and the `TimeOfFlightDays`/`ArrivalLightAngle` field invariants are `verified`; the explicit `MeanEclpJ2000`↔`ICRF` coordinate relation, the physical endpoint-body-velocity interpretation of `DeltaV`, and the independent Kepler semantics of explicit MPC elements are `unresolved`.
|
|
47
47
|
|
|
48
48
|
- ICRF Earth→Mars zero-revolution prograde transfer states: `verified` through [`tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py`](../../tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py). The maintained case compares the complete six UTC departure/arrival timestamp pairs in a 2 departure days × 3 arrival days grid; the independent solver is `lamberthub.izzo2015` with the Sun gravitational parameter (`1.3271244004193938e20 m^3/s^2`), `M=0`, `prograde=True`, and `low_path=True` (a zero-revolution prograde Lambert solution), using the ASTROX `RV1`/`RV2` endpoint positions as its inputs. The ASTROX transfer velocities match the solver within `SOLVER_ABS_TOL_M_S = 1e-6` m/s. The endpoint positions themselves are the solver inputs; their full celestial-state meaning beyond the independently checked directions is not promoted here.
|
|
49
|
+
- Transfer-arc `MinRangeAu`/`MaxRangeAu`: `verified` using independent `lamberthub.izzo2015` velocities and SciPy DOP853 two-body integration with radial-stationary events and both endpoints. The 22 maintained transfers cover Earth→Mars in ICRF and EclpJ2000ICRF, explicit-element asteroid transfers in ICRF, and 2/4/12/14-day ICRF transfers. They exercise 40 interior and 4 endpoint extrema, distinguishing finite-arc bounds from full-orbit apsides. Maximum observed residual is 1.46e-11 AU, below the pre-set 1e-9 AU bound (the 1e-6 m/s Lambert velocity precision budget accumulated over roughly 300 days is about 2e-10 AU; the remaining margin allows propagation amplification and integration error). Integration uses AU/day units, rtol=2e-12 and atol=2e-14, and independently checks arrival-position closure within 1e-9 AU. This comparison conditions on returned endpoint positions; it does not validate the endpoint ephemerides or resolve the explicit MPC-element convention. SciPy is an existing development dependency.
|
|
49
50
|
- ICRF endpoint position-direction axis identification: `verified` through [`tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py`](../../tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py). For each of the six maintained Earth→Mars results, the `RV1`/`RV2` position directions at the returned UTC departure/arrival epochs are compared with independent Skyfield DE421 heliocentric Earth/Mars position directions (body-minus-Sun positions at the same epochs). The direct angular-separation maximum is approximately 8.54e-7 deg, within the pre-set `ICRF_AXIS_IDENTIFICATION_MAX_ANGLE_DEG = 0.01`; the best of the fixed ±23.43929111111111 deg obliquity rotations applied to the independent directions stays at approximately 22.35 deg maximum separation, above `WRONG_FRAME_MIN_SEPARATION_DEG = 1.0`. This verifies only the identification of the ICRF axes for the endpoint position directions — not full numerical-kernel precision, and not the celestial-state meaning of the endpoint positions beyond their direction. The explicit `MeanEclpJ2000`↔`ICRF` coordinate relation, the `DeltaV` physical interpretation, and the explicit MPC-element semantics remain separate `unresolved` items.
|
|
50
51
|
- Server-default frame: `verified` on the maintained Earth→Mars grid by exact `TransferResults` equality between omitted `sun_frame` and explicit `sun_frame="EclpJ2000ICRF"`. The default result is distinguishable from explicit `MeanEclpJ2000`, with a current maximum state-vector separation of about 54 km.
|
|
51
52
|
- `EclpJ2000ICRF`↔`ICRF` coordinate relation: `verified` on every `RV1`, `RV2`, `DeltaV1`, and `DeltaV2` vector in the maintained grid. A fixed 23.43929111111111° J2000 mean-obliquity rotation reproduces the ecliptic output from the independently anchored ICRF output within `ECLIPTIC_RELATION_POSITION_ABS_TOL_M = 1e-3 m` and `ECLIPTIC_RELATION_VELOCITY_ABS_TOL_M_S = 1e-9 m/s`; current maximum residuals are approximately 3.1e-5 m and 1.1e-11 m/s.
|
|
@@ -61,7 +62,7 @@ Status of `celestial.lambert_transfer_window`: `partial` — the server-default
|
|
|
61
62
|
|
|
62
63
|
## Live snapshot coverage
|
|
63
64
|
|
|
64
|
-
The celestial functions are exercised in [`tests/validation/live_snapshot/celestial/test_celestial.py`](../../tests/validation/live_snapshot/celestial/test_celestial.py), with sidecar [`tests/validation/live_snapshot/celestial/celestial.snap.json`](../../tests/validation/live_snapshot/celestial/celestial.snap.json) covering `ephemeris` (Moon, explicit window), `cb_axes_rotation` (order 0 and 1), `mpc_ephemeris` (Apophis, server-owned default window), and `lambert_transfer_window` (Earth→Mars with the server-default `EclpJ2000ICRF` frame, and Earth→2015 XF261 with explicit MPC elements and `sun_frame="ICRF"`). The snapshots freeze recursive nested type/layout descriptors: per-field value kinds, the CZML `cartesianVelocity` 7-value grouping, the order-dependent `Rotation` lengths (4 for `order=0`, 7 for `order=1`), the MPC `OrbitElements` key set (including `ReferenceFrame` since 2026-08-20), and the transfer-result grid with its `DeltaV` 3-vector and `RV` 6-vector layouts plus the `TimeOfFlightDays`/`ArrivalLightAngle` numbers (since 2026-08-20); volatile numeric values are not frozen, and the MPC numeric values remain catalog-data-owned. Curated returns remove the transport status wrapper fields `IsSuccess`/`Message`, so the frozen shapes contain only server data fields. These live snapshots
|
|
65
|
+
The celestial functions are exercised in [`tests/validation/live_snapshot/celestial/test_celestial.py`](../../tests/validation/live_snapshot/celestial/test_celestial.py), with sidecar [`tests/validation/live_snapshot/celestial/celestial.snap.json`](../../tests/validation/live_snapshot/celestial/celestial.snap.json) covering `ephemeris` (Moon, explicit window), `cb_axes_rotation` (order 0 and 1), `mpc_ephemeris` (Apophis, server-owned default window), and `lambert_transfer_window` (Earth→Mars with the server-default `EclpJ2000ICRF` frame, and Earth→2015 XF261 with explicit MPC elements and `sun_frame="ICRF"`). The snapshots freeze recursive nested type/layout descriptors: per-field value kinds, the CZML `cartesianVelocity` 7-value grouping, the order-dependent `Rotation` lengths (4 for `order=0`, 7 for `order=1`), the MPC `OrbitElements` key set (including `ReferenceFrame` since 2026-08-20), and the transfer-result grid with its `DeltaV` 3-vector and `RV` 6-vector layouts plus the `TimeOfFlightDays`/`ArrivalLightAngle` numbers (since 2026-08-20); the two range fields added in the 2026-09-19 upstream contract are also retained as numeric AU values with a 1e-9 AU absolute comparison tolerance; other volatile numeric values are not frozen, and the MPC numeric values remain catalog-data-owned. Curated returns remove the transport status wrapper fields `IsSuccess`/`Message`, so the frozen shapes contain only server data fields. These live snapshots detect drift in response shape and the retained range values for maintained public inputs.
|
|
65
66
|
|
|
66
67
|
Cross-validation scripts:
|
|
67
68
|
- [`tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py`](../../tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "astrox-python"
|
|
7
|
-
version = "1.2.
|
|
7
|
+
version = "1.2.2"
|
|
8
8
|
description = "Python SDK for the ASTROX Web API."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -59,7 +59,7 @@ dev = [
|
|
|
59
59
|
"astropy>=6.1.7",
|
|
60
60
|
"spiceypy>=8.1.2",
|
|
61
61
|
"scipy>=1.14",
|
|
62
|
-
"e2m2e==5.9.
|
|
62
|
+
"e2m2e==5.9.5",
|
|
63
63
|
]
|
|
64
64
|
|
|
65
65
|
[tool.hatch.build.targets.wheel]
|
|
@@ -451,7 +451,13 @@ def test_lambert_transfer_window_lowers_complete_payload_and_strips_status(
|
|
|
451
451
|
transfer_response = {
|
|
452
452
|
"IsSuccess": True,
|
|
453
453
|
"Message": "Success",
|
|
454
|
-
"TransferResults": [
|
|
454
|
+
"TransferResults": [
|
|
455
|
+
{
|
|
456
|
+
"RV1": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
|
|
457
|
+
"MinRangeAu": 0.8,
|
|
458
|
+
"MaxRangeAu": 1.6,
|
|
459
|
+
}
|
|
460
|
+
],
|
|
455
461
|
"FutureField": {"preserve": True},
|
|
456
462
|
}
|
|
457
463
|
calls = record_raw_post(monkeypatch, transfer_response)
|
|
@@ -472,7 +478,13 @@ def test_lambert_transfer_window_lowers_complete_payload_and_strips_status(
|
|
|
472
478
|
)
|
|
473
479
|
|
|
474
480
|
assert response == {
|
|
475
|
-
"TransferResults": [
|
|
481
|
+
"TransferResults": [
|
|
482
|
+
{
|
|
483
|
+
"RV1": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
|
|
484
|
+
"MinRangeAu": 0.8,
|
|
485
|
+
"MaxRangeAu": 1.6,
|
|
486
|
+
}
|
|
487
|
+
],
|
|
476
488
|
"FutureField": {"preserve": True},
|
|
477
489
|
}
|
|
478
490
|
assert response is not transfer_response
|
|
@@ -29,6 +29,10 @@ server's element convention is identified.
|
|
|
29
29
|
# and DepartureTime
|
|
30
30
|
# - ArrivalLightAngle: verified as the angle in degrees between DeltaV2 and
|
|
31
31
|
# the RV2 position vector
|
|
32
|
+
# - MinRangeAu/MaxRangeAu: verified against independent Lambert velocities
|
|
33
|
+
# and DOP853 radial-stationary events plus endpoints for ICRF/EclpJ2000ICRF
|
|
34
|
+
# Earth -> Mars, explicit-element asteroid ICRF, and short ICRF transfers;
|
|
35
|
+
# conditional on returned endpoint positions, not their ephemeris model
|
|
32
36
|
# - DeltaV1/DeltaV2 physical body-velocity interpretation: unresolved
|
|
33
37
|
# Parameters:
|
|
34
38
|
# - departure and arrival sampling: verified for two departure dates and
|
|
@@ -71,6 +75,7 @@ import numpy as np
|
|
|
71
75
|
import pytest
|
|
72
76
|
from astropy.time import Time
|
|
73
77
|
from lamberthub import izzo2015
|
|
78
|
+
from scipy.integrate import solve_ivp
|
|
74
79
|
|
|
75
80
|
REPO_ROOT = Path(__file__).resolve().parents[4]
|
|
76
81
|
if str(REPO_ROOT) not in sys.path:
|
|
@@ -88,6 +93,7 @@ SUN_MU_M3_S2 = 1.3271244004193938e20
|
|
|
88
93
|
AU_M = 149597870700.0
|
|
89
94
|
MEAN_OBLIQUITY_DEG = 23.43929111111111
|
|
90
95
|
SOLVER_ABS_TOL_M_S = 1.0e-6
|
|
96
|
+
RANGE_ABS_TOL_AU = 1e-9
|
|
91
97
|
NORM_REL_TOL = 1.0e-12
|
|
92
98
|
NORM_ABS_TOL_M_S = 1.0e-9
|
|
93
99
|
ECLIPTIC_RELATION_POSITION_ABS_TOL_M = 1.0e-3
|
|
@@ -306,6 +312,101 @@ def test_transfer_states_match_lamberthub_zero_revolution_prograde() -> None:
|
|
|
306
312
|
)
|
|
307
313
|
|
|
308
314
|
|
|
315
|
+
def test_transfer_ranges_match_independent_arc_extrema() -> None:
|
|
316
|
+
"""Check finite transfer arcs, conditioning on the returned endpoint positions."""
|
|
317
|
+
configure_astrox_from_env()
|
|
318
|
+
# Independent Lambert velocities seed DOP853 two-body integration in AU/day.
|
|
319
|
+
# A 1e-6 m/s solver precision budget over ~300 days gives ~2e-10 AU;
|
|
320
|
+
# 1e-9 AU allows propagation amplification and integration error (rtol 2e-12).
|
|
321
|
+
# Endpoint ephemerides and explicit MPC element conventions are not tested here.
|
|
322
|
+
mu = SUN_MU_M3_S2 * 86400.0**2 / AU_M**3
|
|
323
|
+
max_residual = 0.0
|
|
324
|
+
interior_extrema = 0
|
|
325
|
+
endpoint_extrema = 0
|
|
326
|
+
grids = [
|
|
327
|
+
(
|
|
328
|
+
f"{frame}, explicit_elements={explicit_elements}",
|
|
329
|
+
_astrox_transfer_results(frame=frame, explicit_elements=explicit_elements),
|
|
330
|
+
)
|
|
331
|
+
for frame, explicit_elements in (
|
|
332
|
+
("ICRF", False),
|
|
333
|
+
("EclpJ2000ICRF", False),
|
|
334
|
+
("ICRF", True),
|
|
335
|
+
)
|
|
336
|
+
]
|
|
337
|
+
grids.append(
|
|
338
|
+
(
|
|
339
|
+
"ICRF short window",
|
|
340
|
+
_require_results(_short_window_results(min_tof_days=1), expected_count=4),
|
|
341
|
+
)
|
|
342
|
+
)
|
|
343
|
+
for label, results in grids:
|
|
344
|
+
for result in results:
|
|
345
|
+
r1, _ = _state(result, "RV1")
|
|
346
|
+
r2, _ = _state(result, "RV2")
|
|
347
|
+
tof_s = (
|
|
348
|
+
_time(result["ArrivalTime"]) - _time(result["DepartureTime"])
|
|
349
|
+
).total_seconds()
|
|
350
|
+
v1, _ = izzo2015(
|
|
351
|
+
SUN_MU_M3_S2, r1, r2, tof_s, M=0, prograde=True, low_path=True
|
|
352
|
+
)
|
|
353
|
+
initial = np.concatenate((r1 / AU_M, v1 * 86400.0 / AU_M))
|
|
354
|
+
duration = tof_s / 86400.0
|
|
355
|
+
|
|
356
|
+
def derivative(t: float, state: np.ndarray) -> np.ndarray:
|
|
357
|
+
r = state[:3]
|
|
358
|
+
return np.concatenate((state[3:], -mu * r / np.linalg.norm(r) ** 3))
|
|
359
|
+
|
|
360
|
+
def radial_stationary(t: float, state: np.ndarray) -> float:
|
|
361
|
+
return float(np.dot(state[:3], state[3:]))
|
|
362
|
+
|
|
363
|
+
solution = solve_ivp(
|
|
364
|
+
derivative,
|
|
365
|
+
(0.0, duration),
|
|
366
|
+
initial,
|
|
367
|
+
method="DOP853",
|
|
368
|
+
rtol=2e-12,
|
|
369
|
+
atol=2e-14,
|
|
370
|
+
max_step=duration / 64,
|
|
371
|
+
events=radial_stationary,
|
|
372
|
+
)
|
|
373
|
+
if not solution.success:
|
|
374
|
+
raise CrossValidationError(solution.message)
|
|
375
|
+
endpoint_error = float(np.linalg.norm(solution.y[:3, -1] - r2 / AU_M))
|
|
376
|
+
if endpoint_error > RANGE_ABS_TOL_AU:
|
|
377
|
+
raise CrossValidationError(
|
|
378
|
+
f"Independent transfer endpoint residual={endpoint_error} AU"
|
|
379
|
+
)
|
|
380
|
+
radii = [
|
|
381
|
+
float(np.linalg.norm(initial[:3])),
|
|
382
|
+
float(np.linalg.norm(solution.y[:3, -1])),
|
|
383
|
+
]
|
|
384
|
+
radii.extend(
|
|
385
|
+
float(np.linalg.norm(state[:3])) for state in solution.y_events[0]
|
|
386
|
+
)
|
|
387
|
+
for key, index in (
|
|
388
|
+
("MinRangeAu", int(np.argmin(radii))),
|
|
389
|
+
("MaxRangeAu", int(np.argmax(radii))),
|
|
390
|
+
):
|
|
391
|
+
actual = _require_number(result[key], field=key)
|
|
392
|
+
residual = abs(actual - radii[index])
|
|
393
|
+
max_residual = max(max_residual, residual)
|
|
394
|
+
if index < 2:
|
|
395
|
+
endpoint_extrema += 1
|
|
396
|
+
else:
|
|
397
|
+
interior_extrema += 1
|
|
398
|
+
if not math.isfinite(actual) or residual > RANGE_ABS_TOL_AU:
|
|
399
|
+
raise CrossValidationError(
|
|
400
|
+
f"{label}: {key}={actual}, independent={radii[index]}, residual={residual} AU"
|
|
401
|
+
)
|
|
402
|
+
# These fixtures must distinguish finite-arc bounds from full-orbit apsides.
|
|
403
|
+
assert interior_extrema > 0
|
|
404
|
+
assert endpoint_extrema > 0
|
|
405
|
+
print(f"LAMBERT_RANGE_MAX_RESIDUAL_AU={max_residual:.12g}")
|
|
406
|
+
print(f"LAMBERT_RANGE_INTERIOR_EXTREMA={interior_extrema}")
|
|
407
|
+
print(f"LAMBERT_RANGE_ENDPOINT_EXTREMA={endpoint_extrema}")
|
|
408
|
+
|
|
409
|
+
|
|
309
410
|
def test_transfer_delta_v_magnitudes_match_vector_norms() -> None:
|
|
310
411
|
configure_astrox_from_env()
|
|
311
412
|
results = _astrox_transfer_results(frame="ICRF", explicit_elements=False)
|
|
@@ -940,6 +1041,7 @@ def test_explicit_mpc_elements_match_independent_kepler_propagation() -> None:
|
|
|
940
1041
|
def main() -> int:
|
|
941
1042
|
try:
|
|
942
1043
|
test_transfer_states_match_lamberthub_zero_revolution_prograde()
|
|
1044
|
+
test_transfer_ranges_match_independent_arc_extrema()
|
|
943
1045
|
test_transfer_delta_v_magnitudes_match_vector_norms()
|
|
944
1046
|
test_min_time_of_flight_filters_short_sampling_pairs()
|
|
945
1047
|
test_time_of_flight_days_matches_timestamp_delta()
|
|
@@ -951,7 +1053,7 @@ def main() -> int:
|
|
|
951
1053
|
except Exception as exc:
|
|
952
1054
|
print(f"CROSS_VALIDATION_FAILED={type(exc).__name__}: {exc}", file=sys.stderr)
|
|
953
1055
|
return 1
|
|
954
|
-
print("CROSS_VALIDATION_CHECKED=
|
|
1056
|
+
print("CROSS_VALIDATION_CHECKED=10")
|
|
955
1057
|
print("CROSS_VALIDATION_FAILED=0")
|
|
956
1058
|
return 0
|
|
957
1059
|
|
|
@@ -195,6 +195,12 @@
|
|
|
195
195
|
"DepartureTime": {
|
|
196
196
|
"kind": "string"
|
|
197
197
|
},
|
|
198
|
+
"MaxRangeAu": {
|
|
199
|
+
"kind": "number"
|
|
200
|
+
},
|
|
201
|
+
"MinRangeAu": {
|
|
202
|
+
"kind": "number"
|
|
203
|
+
},
|
|
198
204
|
"RV1": {
|
|
199
205
|
"item": {
|
|
200
206
|
"kind": "number"
|
|
@@ -220,7 +226,33 @@
|
|
|
220
226
|
}
|
|
221
227
|
},
|
|
222
228
|
"kind": "object"
|
|
223
|
-
}
|
|
229
|
+
},
|
|
230
|
+
"transfer_ranges_au": [
|
|
231
|
+
{
|
|
232
|
+
"MaxRangeAu": 1.6583036266502333,
|
|
233
|
+
"MinRangeAu": 0.5810318537519513
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"MaxRangeAu": 1.6590932311459603,
|
|
237
|
+
"MinRangeAu": 0.5799496237129426
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"MaxRangeAu": 1.6599357782012405,
|
|
241
|
+
"MinRangeAu": 0.5788355442344318
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"MaxRangeAu": 1.654301440655211,
|
|
245
|
+
"MinRangeAu": 0.5908207427768893
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"MaxRangeAu": 1.6549025168843594,
|
|
249
|
+
"MinRangeAu": 0.5898559754259631
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"MaxRangeAu": 1.6555556342710411,
|
|
253
|
+
"MinRangeAu": 0.5888611049770791
|
|
254
|
+
}
|
|
255
|
+
]
|
|
224
256
|
}
|
|
225
257
|
},
|
|
226
258
|
{
|
|
@@ -261,6 +293,12 @@
|
|
|
261
293
|
"DepartureTime": {
|
|
262
294
|
"kind": "string"
|
|
263
295
|
},
|
|
296
|
+
"MaxRangeAu": {
|
|
297
|
+
"kind": "number"
|
|
298
|
+
},
|
|
299
|
+
"MinRangeAu": {
|
|
300
|
+
"kind": "number"
|
|
301
|
+
},
|
|
264
302
|
"RV1": {
|
|
265
303
|
"item": {
|
|
266
304
|
"kind": "number"
|
|
@@ -286,12 +324,38 @@
|
|
|
286
324
|
}
|
|
287
325
|
},
|
|
288
326
|
"kind": "object"
|
|
289
|
-
}
|
|
327
|
+
},
|
|
328
|
+
"transfer_ranges_au": [
|
|
329
|
+
{
|
|
330
|
+
"MaxRangeAu": 1.1046815597850406,
|
|
331
|
+
"MinRangeAu": 0.9433212640311289
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"MaxRangeAu": 1.1000967105904083,
|
|
335
|
+
"MinRangeAu": 0.9469611101758767
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
"MaxRangeAu": 1.0954139108010212,
|
|
339
|
+
"MinRangeAu": 0.950705771186044
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"MaxRangeAu": 1.1033355644754934,
|
|
343
|
+
"MinRangeAu": 0.9453675951733505
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"MaxRangeAu": 1.0987601689577309,
|
|
347
|
+
"MinRangeAu": 0.9489508608039481
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"MaxRangeAu": 1.0940920723610155,
|
|
351
|
+
"MinRangeAu": 0.9526341172739136
|
|
352
|
+
}
|
|
353
|
+
]
|
|
290
354
|
}
|
|
291
355
|
}
|
|
292
356
|
],
|
|
293
357
|
"metadata": {
|
|
294
358
|
"astrox_base_url": "http://astrox.cn:8765",
|
|
295
|
-
"refreshed_at": "2026-
|
|
359
|
+
"refreshed_at": "2026-09-21T05:23:56Z"
|
|
296
360
|
}
|
|
297
361
|
}
|
|
@@ -23,6 +23,8 @@ from tests.validation._support import ( # noqa: E402
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
SNAPSHOT_PATH = Path(__file__).with_name("celestial.snap.json")
|
|
26
|
+
# Range values use the independently validated transfer-arc precision bound.
|
|
27
|
+
RANGE_ABS_TOL_AU = 1e-9
|
|
26
28
|
START = "2026-01-01T00:00:00.000Z"
|
|
27
29
|
STOP = "2026-01-02T00:00:00.000Z"
|
|
28
30
|
|
|
@@ -149,6 +151,8 @@ def _transfer_result_shape(value: Any, *, field: str) -> dict[str, Any]:
|
|
|
149
151
|
"RV2",
|
|
150
152
|
"TimeOfFlightDays",
|
|
151
153
|
"ArrivalLightAngle",
|
|
154
|
+
"MinRangeAu",
|
|
155
|
+
"MaxRangeAu",
|
|
152
156
|
)
|
|
153
157
|
for key in required:
|
|
154
158
|
if key not in value:
|
|
@@ -156,10 +160,22 @@ def _transfer_result_shape(value: Any, *, field: str) -> dict[str, Any]:
|
|
|
156
160
|
for key in ("DepartureTime", "ArrivalTime"):
|
|
157
161
|
if not isinstance(value[key], str):
|
|
158
162
|
raise SnapshotError(f"{field}.{key} must be a string")
|
|
159
|
-
for key in (
|
|
163
|
+
for key in (
|
|
164
|
+
"DV1_Mag",
|
|
165
|
+
"DV2_Mag",
|
|
166
|
+
"TimeOfFlightDays",
|
|
167
|
+
"ArrivalLightAngle",
|
|
168
|
+
"MinRangeAu",
|
|
169
|
+
"MaxRangeAu",
|
|
170
|
+
):
|
|
160
171
|
if not isinstance(value[key], int | float) or isinstance(value[key], bool):
|
|
161
172
|
raise SnapshotError(f"{field}.{key} must be numeric")
|
|
162
|
-
for key, expected_length in (
|
|
173
|
+
for key, expected_length in (
|
|
174
|
+
("DeltaV1", 3),
|
|
175
|
+
("DeltaV2", 3),
|
|
176
|
+
("RV1", 6),
|
|
177
|
+
("RV2", 6),
|
|
178
|
+
):
|
|
163
179
|
series = value[key]
|
|
164
180
|
if (
|
|
165
181
|
not isinstance(series, list)
|
|
@@ -234,7 +250,12 @@ def transfer_shape(*, frame: str | None, explicit_elements: bool) -> dict[str, A
|
|
|
234
250
|
item_fields[key]["length"] = expected_length
|
|
235
251
|
for index, result in enumerate(results):
|
|
236
252
|
_transfer_result_shape(result, field=f"TransferResults[{index}]")
|
|
237
|
-
|
|
253
|
+
snapshot = _response_snapshot(shape)
|
|
254
|
+
snapshot["transfer_ranges_au"] = [
|
|
255
|
+
{key: result[key] for key in ("MinRangeAu", "MaxRangeAu")}
|
|
256
|
+
for result in results
|
|
257
|
+
]
|
|
258
|
+
return snapshot
|
|
238
259
|
|
|
239
260
|
|
|
240
261
|
CASES = [
|
|
@@ -273,12 +294,12 @@ CASES = [
|
|
|
273
294
|
|
|
274
295
|
def test_celestial_live_snapshot() -> None:
|
|
275
296
|
configure_astrox_from_env()
|
|
276
|
-
check_snapshot(cases=CASES, snapshot_path=SNAPSHOT_PATH)
|
|
297
|
+
check_snapshot(cases=CASES, snapshot_path=SNAPSHOT_PATH, abs_tol=RANGE_ABS_TOL_AU)
|
|
277
298
|
|
|
278
299
|
|
|
279
300
|
def _main() -> int:
|
|
280
301
|
try:
|
|
281
|
-
return snapshot_main(cases=CASES, snapshot_path=SNAPSHOT_PATH)
|
|
302
|
+
return snapshot_main(cases=CASES, snapshot_path=SNAPSHOT_PATH, abs_tol=RANGE_ABS_TOL_AU)
|
|
282
303
|
except Exception as exc:
|
|
283
304
|
print(f"LIVE_SNAPSHOT_FAILED={type(exc).__name__}: {exc}", file=sys.stderr)
|
|
284
305
|
return 1
|
|
@@ -109,7 +109,7 @@ wheels = [
|
|
|
109
109
|
|
|
110
110
|
[[package]]
|
|
111
111
|
name = "astrox-python"
|
|
112
|
-
version = "1.2.
|
|
112
|
+
version = "1.2.2"
|
|
113
113
|
source = { editable = "." }
|
|
114
114
|
dependencies = [
|
|
115
115
|
{ name = "requests" },
|
|
@@ -142,7 +142,7 @@ requires-dist = [{ name = "requests", specifier = ">=2.34.2" }]
|
|
|
142
142
|
dev = [
|
|
143
143
|
{ name = "astropy", specifier = ">=6.1.7" },
|
|
144
144
|
{ name = "brahe", specifier = ">=1.6.0" },
|
|
145
|
-
{ name = "e2m2e", specifier = "==5.9.
|
|
145
|
+
{ name = "e2m2e", specifier = "==5.9.5" },
|
|
146
146
|
{ name = "geographiclib", specifier = ">=2.1" },
|
|
147
147
|
{ name = "hatchling", specifier = ">=1.30.1" },
|
|
148
148
|
{ name = "lamberthub", specifier = ">=1.0.0" },
|
|
@@ -527,7 +527,7 @@ wheels = [
|
|
|
527
527
|
|
|
528
528
|
[[package]]
|
|
529
529
|
name = "e2m2e"
|
|
530
|
-
version = "5.9.
|
|
530
|
+
version = "5.9.5"
|
|
531
531
|
source = { registry = "https://pypi.org/simple" }
|
|
532
532
|
dependencies = [
|
|
533
533
|
{ name = "calcephpy" },
|
|
@@ -540,11 +540,11 @@ dependencies = [
|
|
|
540
540
|
{ name = "spiceypy" },
|
|
541
541
|
{ name = "tqdm" },
|
|
542
542
|
]
|
|
543
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
543
|
+
sdist = { url = "https://files.pythonhosted.org/packages/85/12/470edadcaf7cfe7c5dab177b28205070089819b09414c53f823a98b56002/e2m2e-5.9.5.tar.gz", hash = "sha256:1d6ff9508d79aa9417e60dcd75086388a5788a367b8f89bfa193c0f972f385a9", size = 5888222, upload-time = "2026-09-07T06:12:55.248Z" }
|
|
544
544
|
wheels = [
|
|
545
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
546
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
547
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
545
|
+
{ url = "https://files.pythonhosted.org/packages/3c/fa/f006140a838ca92fca7c370e3f9e821e675eb637fbd358ea5842d44b77df/e2m2e-5.9.5-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e1254122d927eca64fa9e2323622009472c8f27dbbbfc2fbeda59ed0c458f560", size = 8047398, upload-time = "2026-09-07T06:12:47.606Z" },
|
|
546
|
+
{ url = "https://files.pythonhosted.org/packages/85/4b/4fad55148ecefbb04f32dbb4b1666804ee4da4c12854e1540ccfa8d5c694/e2m2e-5.9.5-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:52bfa9a8a90c03484170db8a22f2533abdc7e56fe7249a51d83d060720051964", size = 8189609, upload-time = "2026-09-07T06:12:50.82Z" },
|
|
547
|
+
{ url = "https://files.pythonhosted.org/packages/df/f6/598c443d393b2b12ec34e0d592f9459fd2ea57f81fe6416dc93e3380131f/e2m2e-5.9.5-cp310-abi3-win_amd64.whl", hash = "sha256:68fd24c5142d816724fc3e99dd1bef4334dc7d038c1758fb0eef0dc78f327197", size = 7884931, upload-time = "2026-09-07T06:12:53.105Z" },
|
|
548
548
|
]
|
|
549
549
|
|
|
550
550
|
[[package]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/convert_between_orbit_representations.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|