openscvx 0.5.3.dev58__tar.gz → 0.5.3.dev59__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.
- {openscvx-0.5.3.dev58/openscvx.egg-info → openscvx-0.5.3.dev59}/PKG-INFO +1 -1
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/let_transfer.py +32 -27
- openscvx-0.5.3.dev59/examples/spacecraft/low_thrust_transfer.py +569 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/_version.py +3 -3
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/SOURCES.txt +1 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/scm_file_list.json +1 -0
- openscvx-0.5.3.dev59/openscvx.egg-info/scm_version.json +8 -0
- openscvx-0.5.3.dev58/openscvx.egg-info/scm_version.json +0 -8
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/_extra.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/docs.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/lint.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/release.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-cvxpygen.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-examples.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-lie.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-mjx.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-moreau.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-qpax.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.gitignore +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.gitmodules +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/CITATION.cff +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/CONTRIBUTING.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/LICENSE +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/README.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UnderTheHood/batching_jit_grad.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UnderTheHood/custom_algorithms_autotuners.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/08_mpcc.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/favicon.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/viser-client/index.html +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/changelog.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/citation.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/examples.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/index.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/installation.md +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/llms.txt +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/versions.json +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/_maze.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/_maze_viz.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/_viser_embed_export.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/brachistochrone_batched.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/chen_allgoewer.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/flappy_bird.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/hypersensitive.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/stl_or.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/aircraft/dynamic_soaring.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/aircraft/supersonic_time_to_climb.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/_camera.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/_render.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/_sensor_view.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/logo.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/senss_hop_lidar_camera.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/franka_fr3v2_viewplanning_nodal.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_waypoint_stl.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_plotting.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_time2spatial.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_tracks/LMS_Track.txt +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_tracks/LMS_Track_x4.txt +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_tracks/readDataFcn.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_viser.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_hybrid.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_ice.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_mpc.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_multi_agent.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_multi_agent_mpcc.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_multi_agent_mpcc_ice.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_openscvx.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/_plotting.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/double_integrator_static.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/maze_rrt_scp.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/moving_safe_zones.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/multiphase_velocity.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/obstacle_avoidance_vmap_2d.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/_plotting.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/_terrain.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/boresight_trace_mpcc.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/cinema_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/drone_racing_batched_gates.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/circle.svg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/openscvx_logo_single.svg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/quadrotor_mesh.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/svg_path_utils.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/lunar_terrain_agl.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/maze_scp.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/moving_safe_columns.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/openscvx_logo.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/quadrotor_hector.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/quadrotor_zigzag.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/panda_frax.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/panda_frax_pick_place.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/panda_frax_viewplanning.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/panda_frax_waypoint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/ur5e_assets/ur5e.urdf +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/ur5e_pen_trace.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/ur5e_pen_trace_mpcc.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/skydio_x2_mjx.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/triple_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/multi_agent/ilqgames_three_agent.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/multi_agent/ilqgames_three_agent_lqr.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/multi_agent/multi_agent_circle_swap.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/pendulum/pendulum_swingup_ocp.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/plotting.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/plotting_viser.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/6DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/6DoF_pdg_batched_ic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/6DoF_pdg_stc.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/6DoF_pdg_stc_ifthen.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/_cstc_plotting.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/ascent_launch_vehicle.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/reusable_launch_vehicle.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/rocket_ilqr.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_dem.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_dem_static.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss_gimbal.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss_gimbal_hop.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss_hop.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss_planar.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_dem.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_halo/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_halo/dem.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_halo/lidar.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_hop_lidar_overlay.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/senss_dem.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/scaling/scaling_study.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone.bin +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone.gltf +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_albedo.jpg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_ao.jpg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_normals.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_pbr_jpg.jpg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_plot_mesh.npz +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/foil_normal.jpg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/dual_deputy_inspection_cw.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/relative_loitering.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/video_preview.png +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/assets/stylesheets/home-hero.css +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/home.html +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/main.html +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-hero.html +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/sitemap.xml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/mkdocs.yml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/__main__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/acceptance_ratio.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/history.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/hyperparams.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/loop.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/penalty.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/scvx/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/scvx/iteration.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/state.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/weights.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/config.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/expert/byof.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/expert/validation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/init/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/_utils.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/frax.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/mjx.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrators/diffrax.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/loader.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/_deps.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/publication.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/coordinates.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/problem.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/base.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/cones.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/affine.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/canonicalize.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/autodiff.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/_citations.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/autodiff.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/autodiff.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/_lowerer.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/_registry.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/arithmetic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/array.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/autodiff.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/constraint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/control.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/expr.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/formulation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/lie.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/linalg.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/logic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/math.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/spatial.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/state.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/stl.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/vmap.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/stljax.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/cache.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/caching.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/printing.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/utils.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/pyproject.toml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/scripts/mkdocs_seo_hook.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/setup.cfg +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/_iteration_helpers.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/test_citation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/test_defaults_agreement.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/test_hyper_overrides.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/test_iteration_fn_jit.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/test_iteration_fn_parity.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/test_make_solve_loop.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/conftest.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_impulsive.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_multishot_propagation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_batched_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_batched_cvxpy_export_errors.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_batched_export_roundtrip.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_jax_bare_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_jax_jit_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_jax_vmap_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_jax_vmap_converged_no_drift.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/integrations/test_mjx.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/integrations/test_mjx_dynamics.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/_iteration_callback_helpers.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_iteration_callback_cvxpy.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_iteration_callback_moreau.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_iteration_callback_qpax.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_iteration_callback_vmap.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_subproblem_pytree.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_autodiff.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_guess_expr.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_stl.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_citations.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_gmsr.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_latex_formulation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_lower_latex.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_autotuning.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_citation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_discretization.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_examples.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_expert.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_init.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_initialize_syncs_guesses.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_integrators.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_loader.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_optimization_results.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_plotting.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_post_process_batched_tau_clamp.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_propagation.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_results_parameters.py +0 -0
- {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_solve_batched_inference.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.5.3.
|
|
3
|
+
Version: 0.5.3.dev59
|
|
4
4
|
Summary: A general Python-based successive convexification implementation which uses a JAX backend.
|
|
5
5
|
Author-email: Chris Hayner and Griffin Norris <haynec@uw.edu>
|
|
6
6
|
License: Apache Software License
|
|
@@ -830,8 +830,8 @@ def _build_let_problem_bundle(float_dtype: str = LET_FLOAT_DTYPE) -> dict:
|
|
|
830
830
|
}
|
|
831
831
|
algorithm = {
|
|
832
832
|
"lam_prox": 5e-2,
|
|
833
|
-
"lam_vc":
|
|
834
|
-
"lam_vb":
|
|
833
|
+
"lam_vc": 5e1,
|
|
834
|
+
"lam_vb": 1e1,
|
|
835
835
|
"lam_cost": 0.5,
|
|
836
836
|
"ep_tr": 1e-8,
|
|
837
837
|
"ep_vc": 1e-6,
|
|
@@ -839,35 +839,40 @@ def _build_let_problem_bundle(float_dtype: str = LET_FLOAT_DTYPE) -> dict:
|
|
|
839
839
|
}
|
|
840
840
|
|
|
841
841
|
constraints = []
|
|
842
|
-
# Enforce final distance from Earth in normalized Sun-Earth rotating frame.
|
|
842
|
+
# # Enforce final distance from Earth in normalized Sun-Earth rotating frame.
|
|
843
843
|
final_radius_target = d_earth_moon / r_ref
|
|
844
|
-
eps_radius = 1e-4
|
|
844
|
+
# eps_radius = 1e-4
|
|
845
|
+
# constraints += [
|
|
846
|
+
# (ox.linalg.Norm(position - pos_earth_rot) <= final_radius_target)
|
|
847
|
+
# .at([n_nodes - 1])
|
|
848
|
+
# .convex(),
|
|
849
|
+
# ]
|
|
850
|
+
# constraints += [
|
|
851
|
+
# (ox.linalg.Norm(position - pos_earth_rot) >= (1 + eps_radius) * final_radius_target).at(
|
|
852
|
+
# [n_nodes - 1]
|
|
853
|
+
# ),
|
|
854
|
+
# ]
|
|
845
855
|
constraints += [
|
|
846
|
-
(ox.linalg.Norm(position - pos_earth_rot)
|
|
847
|
-
.at([n_nodes - 1])
|
|
848
|
-
.convex(),
|
|
849
|
-
]
|
|
850
|
-
constraints += [
|
|
851
|
-
(ox.linalg.Norm(position - pos_earth_rot) >= (1 + eps_radius) * final_radius_target).at(
|
|
852
|
-
[n_nodes - 1]
|
|
853
|
-
),
|
|
854
|
-
]
|
|
855
|
-
|
|
856
|
-
# Final orbit tangency: radius and velocity orthogonal at terminal node.
|
|
857
|
-
constraints += [
|
|
858
|
-
(ox.Sum((position - pos_earth_rot) * velocity) >= 0.0).at([n_nodes - 1]),
|
|
859
|
-
]
|
|
860
|
-
constraints += [
|
|
861
|
-
(ox.Sum((position - pos_earth_rot) * velocity) <= 0.0).at([n_nodes - 1]),
|
|
856
|
+
(ox.linalg.Norm(position - pos_earth_rot) == final_radius_target).at([n_nodes - 1])
|
|
862
857
|
]
|
|
863
858
|
|
|
864
|
-
# Final
|
|
865
|
-
constraints += [
|
|
866
|
-
|
|
867
|
-
]
|
|
868
|
-
constraints += [
|
|
869
|
-
|
|
870
|
-
]
|
|
859
|
+
# # Final orbit tangency: radius and velocity orthogonal at terminal node.
|
|
860
|
+
# constraints += [
|
|
861
|
+
# (ox.Sum((position - pos_earth_rot) * velocity) >= 0.0).at([n_nodes - 1]),
|
|
862
|
+
# ]
|
|
863
|
+
# constraints += [
|
|
864
|
+
# (ox.Sum((position - pos_earth_rot) * velocity) <= 0.0).at([n_nodes - 1]),
|
|
865
|
+
# ]
|
|
866
|
+
constraints += [(ox.Sum((position - pos_earth_rot) * velocity) == 0.0).at([n_nodes - 1])]
|
|
867
|
+
|
|
868
|
+
# # Final speed magnitude: velocity should match the moon one
|
|
869
|
+
# constraints += [
|
|
870
|
+
# (ox.linalg.Norm(velocity) - v_moon >= 0.0).at([n_nodes - 1]),
|
|
871
|
+
# ]
|
|
872
|
+
# constraints += [
|
|
873
|
+
# (ox.linalg.Norm(velocity) - v_moon <= 0.0).at([n_nodes - 1]).convex(),
|
|
874
|
+
# ]
|
|
875
|
+
constraints += [(ox.linalg.Norm(velocity) - v_moon == 0.0).at([n_nodes - 1])]
|
|
871
876
|
|
|
872
877
|
problem = Problem(
|
|
873
878
|
dynamics=dynamics,
|
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
"""Low-Thrust Orbit Transfer using Modified Equinoctial Elements.
|
|
2
|
+
|
|
3
|
+
The spacecraft starts in a **circular low-Earth orbit** (i = 28.5 deg) and must
|
|
4
|
+
reach a **highly elliptic, inclined orbit** (e = 0.7355, i = 63.4 deg) while
|
|
5
|
+
maximizing final mass. State is in Modified Equinoctial Elements (MEE) and the
|
|
6
|
+
control is the thrust direction in radial-transverse-normal (RTN) coordinates
|
|
7
|
+
together with a throttle. The dynamics include the J2/J3/J4 Earth-oblateness
|
|
8
|
+
perturbations.
|
|
9
|
+
|
|
10
|
+
States x = (p, f, g, h, k, L, m):
|
|
11
|
+
p [km] — semi-latus rectum
|
|
12
|
+
f, g — MEE eccentricity vector components
|
|
13
|
+
h, k — MEE inclination vector components
|
|
14
|
+
L [rad] — true longitude (unwrapped, monotonically increasing)
|
|
15
|
+
m [kg] — spacecraft mass
|
|
16
|
+
|
|
17
|
+
Controls:
|
|
18
|
+
u = (u_r, u_t, u_h) — thrust unit-direction (RTN); path constraint ‖u‖ = 1
|
|
19
|
+
tau — throttle parameter, tau ∈ [-50, 0]; thrust ∝ (1 + 0.01 tau)
|
|
20
|
+
|
|
21
|
+
Dynamics:
|
|
22
|
+
ẋ = A(x) Δ + b, ṁ = -F (1 + 0.01 tau) / Ve
|
|
23
|
+
with Δ = Δ_g + Δ_T, where Δ_g is the J2-J4 oblateness acceleration projected
|
|
24
|
+
into the RTN frame and Δ_T = F (1 + 0.01 tau) / m · u is the thrust force.
|
|
25
|
+
|
|
26
|
+
Objective: minimize J = -m(t_f) (i.e. maximize final mass).
|
|
27
|
+
|
|
28
|
+
Terminal (event) constraints (Eq. 17):
|
|
29
|
+
p(t_f) = p_f
|
|
30
|
+
f² + g² = 0.73550320568829² (final eccentricity)
|
|
31
|
+
h² + k² = 0.61761258786099² (final tan(i/2))
|
|
32
|
+
f·h + g·k = 0
|
|
33
|
+
g·h - k·f ≤ 0
|
|
34
|
+
|
|
35
|
+
Initial guess: propagate the dynamics from the initial condition
|
|
36
|
+
with a fixed throttle tau = -25 and the control aligned with the inertial
|
|
37
|
+
velocity, u = Qᵣᵀ v / ‖v‖, then sample onto the discretization nodes.
|
|
38
|
+
|
|
39
|
+
References:
|
|
40
|
+
- "A set of modified equinoctial orbit elements," Walker, Ireland & Owens, 1985.
|
|
41
|
+
- "Optimal Low-Thrust Interplanetary Trajectories by Direct Method Techniques,"
|
|
42
|
+
Kluever, 1997.
|
|
43
|
+
- "Practical Methods for Optimal Control and Estimation Using Nonlinear
|
|
44
|
+
Programming," Betts, 2010.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
import os
|
|
48
|
+
import sys
|
|
49
|
+
|
|
50
|
+
import numpy as np
|
|
51
|
+
from scipy.integrate import solve_ivp
|
|
52
|
+
|
|
53
|
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
54
|
+
grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
55
|
+
sys.path.append(grandparent_dir)
|
|
56
|
+
|
|
57
|
+
import openscvx as ox
|
|
58
|
+
from openscvx import Problem
|
|
59
|
+
from openscvx.plotting import plot_controls, plot_scp_iterations, plot_states
|
|
60
|
+
|
|
61
|
+
# ── Unit conversion factors ──────────────────────
|
|
62
|
+
FT = 0.0003048 # km per ft
|
|
63
|
+
LBF = 4.4482216152605 # N per lbf
|
|
64
|
+
LBM = 0.45359237 # kg per lbm
|
|
65
|
+
G0 = 9.80665 # m/s², standard gravity
|
|
66
|
+
|
|
67
|
+
# ── Physical constants in km-kg-s ─────────────────────
|
|
68
|
+
mu_phys = 1.407645794e16 * FT**3 # km³/s², Earth gravitational parameter
|
|
69
|
+
Re_phys = 20925662.73 * FT # km, Earth equatorial radius
|
|
70
|
+
F_thrust = 4.446618e-3 * LBF # N, thrust magnitude
|
|
71
|
+
Isp = 450.0 # s, specific impulse
|
|
72
|
+
Ve_phys = Isp * G0 / 1000.0 # km/s, effective exhaust velocity
|
|
73
|
+
J2 = 1082.639e-6
|
|
74
|
+
J3 = -2.565e-6
|
|
75
|
+
J4 = -1.608e-6
|
|
76
|
+
|
|
77
|
+
# Physical boundary values (km-kg-s) before non-dimensionalization.
|
|
78
|
+
p0_phys = 21837080.052835 * FT # km
|
|
79
|
+
pf_phys = 40007346.015232 * FT # km
|
|
80
|
+
p_min_phys = 20000000.0 * FT # km, lower state bound on p
|
|
81
|
+
p_max_phys = 60000000.0 * FT # km, upper state bound on p (= LU below)
|
|
82
|
+
m0_phys = 1.0 * LBM # kg (w0 = 1 lbm)
|
|
83
|
+
|
|
84
|
+
# ── Canonical (non-dimensional) units ─────────────────────────────────────────
|
|
85
|
+
# The dynamics are integrated in canonical units so the integrator sees O(1)
|
|
86
|
+
# states. Length is scaled by p_max so normalized p ranges in [p_min/p_max, 1] =
|
|
87
|
+
# [1/3, 1]; time by TU = sqrt(LU³/μ) so the normalized gravitational parameter is
|
|
88
|
+
# exactly 1; mass by the initial mass so normalized mass ranges in [0.1, 1].
|
|
89
|
+
LU = p_max_phys # km, length unit (=> p_n = p/LU ∈ [1/3, 1])
|
|
90
|
+
TU = np.sqrt(LU**3 / mu_phys) # s, time unit (=> μ_n = 1)
|
|
91
|
+
VU = LU / TU # km/s, velocity unit
|
|
92
|
+
AU = LU / TU**2 # km/s², acceleration unit (= μ_phys / LU²)
|
|
93
|
+
MU = m0_phys # kg, mass unit (initial mass)
|
|
94
|
+
|
|
95
|
+
# ── Non-dimensional constants used by the (integrated) dynamics ───────────────
|
|
96
|
+
mu = 1.0 # μ_phys / (LU³/TU²) ≡ 1 by construction
|
|
97
|
+
Re = Re_phys / LU
|
|
98
|
+
# thrust accel [AU] = c_thrust · (1 + 0.01 tau) / mass_n
|
|
99
|
+
# (physical F/m in km/s², divided by the acceleration unit AU)
|
|
100
|
+
c_thrust = (F_thrust / 1000.0) / (MU * AU)
|
|
101
|
+
# mass flow [MU/TU] = -c_mdot · (1 + 0.01 tau)
|
|
102
|
+
# (physical F/Ve in kg/s, expressed per mass unit and per time unit)
|
|
103
|
+
c_mdot = (F_thrust / (Isp * G0)) * TU / MU
|
|
104
|
+
|
|
105
|
+
# ── Boundary conditions ─────────────────
|
|
106
|
+
# Initial: circular LEO, i = 28.5 deg.
|
|
107
|
+
p0_val = p0_phys / LU
|
|
108
|
+
f0_val = 0.0
|
|
109
|
+
g0_val = 0.0
|
|
110
|
+
h0_val = -0.25396764647494
|
|
111
|
+
k0_val = 0.0
|
|
112
|
+
L0_val = np.pi # rad (dimensionless)
|
|
113
|
+
m0_val = m0_phys / MU # = 1.0
|
|
114
|
+
|
|
115
|
+
# Final: highly elliptic, inclined orbit.
|
|
116
|
+
pf_val = pf_phys / LU
|
|
117
|
+
ecc_f = 0.73550320568829 # sqrt(f_f² + g_f²)
|
|
118
|
+
chi_f = 0.61761258786099 # sqrt(h_f² + k_f²)
|
|
119
|
+
|
|
120
|
+
# ── Problem size and free-time guess (time in TU) ─────────────────────────────
|
|
121
|
+
N = 75 # discretization nodes
|
|
122
|
+
tf_guess = 90000.0 / TU # Section 5.3
|
|
123
|
+
tf_min = 50000.0 / TU
|
|
124
|
+
tf_max = 100000.0 / TU
|
|
125
|
+
|
|
126
|
+
# Largest allowed true longitude.
|
|
127
|
+
L_max = 9.0 * 2.0 * np.pi
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# ── Reference dynamics in numpy ─────────
|
|
131
|
+
# This mirrors the symbolic dynamics below exactly; keeping the two in one file
|
|
132
|
+
# makes the propagated guess dynamically consistent with the optimized model.
|
|
133
|
+
def _grav_rtn_and_vel(p, f, g, h, k, L):
|
|
134
|
+
"""Oblateness acceleration in RTN and the inertial velocity (numpy)."""
|
|
135
|
+
q = 1.0 + f * np.cos(L) + g * np.sin(L)
|
|
136
|
+
r = p / q
|
|
137
|
+
alpha2 = h * h - k * k
|
|
138
|
+
s2 = 1.0 + h * h + k * k
|
|
139
|
+
cL, sL = np.cos(L), np.sin(L)
|
|
140
|
+
|
|
141
|
+
rX = (r / s2) * (cL + alpha2 * cL + 2 * h * k * sL)
|
|
142
|
+
rY = (r / s2) * (sL - alpha2 * sL + 2 * h * k * cL)
|
|
143
|
+
rZ = (2 * r / s2) * (h * sL - k * cL)
|
|
144
|
+
rVec = np.array([rX, rY, rZ])
|
|
145
|
+
rMag = np.sqrt(rX**2 + rY**2 + rZ**2)
|
|
146
|
+
rXZMag = np.sqrt(rX**2 + rZ**2)
|
|
147
|
+
|
|
148
|
+
smp = np.sqrt(mu / p)
|
|
149
|
+
vX = -(1.0 / s2) * smp * (sL + alpha2 * sL - 2 * h * k * cL + g - 2 * f * h * k + alpha2 * g)
|
|
150
|
+
vY = -(1.0 / s2) * smp * (-cL + alpha2 * cL + 2 * h * k * sL - f + 2 * g * h * k + alpha2 * f)
|
|
151
|
+
vZ = (2.0 / s2) * smp * (h * cL + k * sL + f * h + g * k)
|
|
152
|
+
vVec = np.array([vX, vY, vZ])
|
|
153
|
+
|
|
154
|
+
rCrossv = np.cross(rVec, vVec)
|
|
155
|
+
rCrossvMag = np.linalg.norm(rCrossv)
|
|
156
|
+
rCrossvCrossr = np.cross(rCrossv, rVec)
|
|
157
|
+
|
|
158
|
+
ir = rVec / rMag
|
|
159
|
+
it = rCrossvCrossr / (rCrossvMag * rMag)
|
|
160
|
+
ih = rCrossv / rCrossvMag
|
|
161
|
+
|
|
162
|
+
enir = ir[2]
|
|
163
|
+
enen = np.array([-enir * ir[0], -enir * ir[1], 1.0 - enir * ir[2]])
|
|
164
|
+
inn = enen / np.linalg.norm(enen)
|
|
165
|
+
|
|
166
|
+
sinphi = rZ / rXZMag
|
|
167
|
+
cosphi = np.sqrt(1.0 - sinphi**2)
|
|
168
|
+
|
|
169
|
+
P2 = (3 * sinphi**2 - 2) / 2
|
|
170
|
+
P3 = (5 * sinphi**3 - 3 * sinphi) / 2
|
|
171
|
+
P4 = (35 * sinphi**4 - 30 * sinphi**2 + 3) / 8
|
|
172
|
+
dP2 = 3 * sinphi
|
|
173
|
+
dP3 = (15 * sinphi - 3) / 2 # verbatim from GPOPS-II source
|
|
174
|
+
dP4 = (140 * sinphi**3 - 60 * sinphi) / 8
|
|
175
|
+
|
|
176
|
+
sumn = (Re / r) ** 2 * dP2 * J2 + (Re / r) ** 3 * dP3 * J3 + (Re / r) ** 4 * dP4 * J4
|
|
177
|
+
sumr = 3 * (Re / r) ** 2 * P2 * J2 + 4 * (Re / r) ** 3 * P3 * J3 + 5 * (Re / r) ** 4 * P4 * J4
|
|
178
|
+
deltagn = -(mu * cosphi / r**2) * sumn
|
|
179
|
+
deltagr = -(mu / r**2) * sumr
|
|
180
|
+
|
|
181
|
+
dgv = deltagn * inn - deltagr * ir
|
|
182
|
+
return np.array([ir @ dgv, it @ dgv, ih @ dgv]), ir, it, ih, vVec
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _eom_guess(t, x):
|
|
186
|
+
"""MEE EOM with throttle tau = -25 and velocity-aligned control (numpy)."""
|
|
187
|
+
p, f, g, h, k, L, m = x
|
|
188
|
+
Dg, ir, it, ih, vVec = _grav_rtn_and_vel(p, f, g, h, k, L)
|
|
189
|
+
vmag = np.linalg.norm(vVec)
|
|
190
|
+
ur, ut, uh = ir @ vVec / vmag, it @ vVec / vmag, ih @ vVec / vmag
|
|
191
|
+
thr = c_thrust * (1 + 0.01 * (-25.0)) / m
|
|
192
|
+
D1, D2, D3 = Dg + np.array([thr * ur, thr * ut, thr * uh])
|
|
193
|
+
|
|
194
|
+
q = 1.0 + f * np.cos(L) + g * np.sin(L)
|
|
195
|
+
s2 = 1.0 + h * h + k * k
|
|
196
|
+
cL, sL = np.cos(L), np.sin(L)
|
|
197
|
+
smp = np.sqrt(p / mu)
|
|
198
|
+
return [
|
|
199
|
+
(2 * p / q) * smp * D2,
|
|
200
|
+
smp * sL * D1 + smp * ((q + 1) * cL + f) / q * D2 - smp * g / q * (h * sL - k * cL) * D3,
|
|
201
|
+
-smp * cL * D1 + smp * ((q + 1) * sL + g) / q * D2 + smp * f / q * (h * sL - k * cL) * D3,
|
|
202
|
+
smp * s2 * cL / (2 * q) * D3,
|
|
203
|
+
smp * s2 * sL / (2 * q) * D3,
|
|
204
|
+
smp / q * (h * sL - k * cL) * D3 + np.sqrt(mu * p) * (q / p) ** 2,
|
|
205
|
+
-c_mdot * (1 + 0.01 * (-25.0)),
|
|
206
|
+
]
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def build_initial_guess():
|
|
210
|
+
"""Propagate the reference control law; retain the full path for plotting."""
|
|
211
|
+
x0 = [p0_val, f0_val, g0_val, h0_val, k0_val, L0_val, m0_val]
|
|
212
|
+
sol = solve_ivp(
|
|
213
|
+
_eom_guess,
|
|
214
|
+
[0.0, tf_guess],
|
|
215
|
+
x0,
|
|
216
|
+
rtol=1e-10,
|
|
217
|
+
atol=1e-12,
|
|
218
|
+
dense_output=True,
|
|
219
|
+
max_step=tf_guess / 2000,
|
|
220
|
+
)
|
|
221
|
+
t_nodes = np.linspace(0.0, tf_guess, N)
|
|
222
|
+
Xg = sol.sol(t_nodes) # (7, N)
|
|
223
|
+
|
|
224
|
+
# Recover the velocity-aligned control direction at each node.
|
|
225
|
+
u_g = np.zeros((N, 3))
|
|
226
|
+
for i in range(N):
|
|
227
|
+
_, ir, it, ih, vVec = _grav_rtn_and_vel(*Xg[:6, i])
|
|
228
|
+
vmag = np.linalg.norm(vVec)
|
|
229
|
+
u_g[i] = [ir @ vVec / vmag, it @ vVec / vmag, ih @ vVec / vmag]
|
|
230
|
+
tau_g = np.full((N, 1), -25.0)
|
|
231
|
+
return t_nodes, Xg.T, u_g, tau_g, sol.y.T
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
t_nodes, Xg, u_guess, tau_guess, Xg_integrated = build_initial_guess()
|
|
235
|
+
|
|
236
|
+
# State bounds (non-dimensional); also used to clip the open-loop guess.
|
|
237
|
+
state_bounds = {
|
|
238
|
+
"p": (p_min_phys / LU, p_max_phys / LU), # = (1/3, 1)
|
|
239
|
+
"f": (-1.0, 1.0),
|
|
240
|
+
"g": (-1.0, 1.0),
|
|
241
|
+
"h": (-1.0, 1.0),
|
|
242
|
+
"k": (-1.0, 1.0),
|
|
243
|
+
"L": (L0_val, L_max),
|
|
244
|
+
"m": (0.1, m0_val), # normalized mass ∈ [0.1, 1]
|
|
245
|
+
}
|
|
246
|
+
_names = ["p", "f", "g", "h", "k", "L", "m"]
|
|
247
|
+
Xg = np.column_stack([np.clip(Xg[:, i], *state_bounds[nm]) for i, nm in enumerate(_names)])
|
|
248
|
+
|
|
249
|
+
# ── States ───────────────────────────────────────────────────────────────────
|
|
250
|
+
p_el = ox.State("p", (1,))
|
|
251
|
+
p_el.initial, p_el.final = np.array([p0_val]), np.array([pf_val]) # p(t_f) fixed
|
|
252
|
+
p_el.min, p_el.max = np.array([state_bounds["p"][0]]), np.array([state_bounds["p"][1]])
|
|
253
|
+
p_el.guess = Xg[:, 0:1]
|
|
254
|
+
|
|
255
|
+
f_el = ox.State("f", (1,))
|
|
256
|
+
f_el.initial, f_el.final = np.array([f0_val]), [ox.Free(float(Xg[-1, 1]))]
|
|
257
|
+
f_el.min, f_el.max = np.array([-1.0]), np.array([1.0])
|
|
258
|
+
f_el.guess = Xg[:, 1:2]
|
|
259
|
+
|
|
260
|
+
g_el = ox.State("g", (1,))
|
|
261
|
+
g_el.initial, g_el.final = np.array([g0_val]), [ox.Free(float(Xg[-1, 2]))]
|
|
262
|
+
g_el.min, g_el.max = np.array([-1.0]), np.array([1.0])
|
|
263
|
+
g_el.guess = Xg[:, 2:3]
|
|
264
|
+
|
|
265
|
+
h_el = ox.State("h", (1,))
|
|
266
|
+
h_el.initial, h_el.final = np.array([h0_val]), [ox.Free(float(Xg[-1, 3]))]
|
|
267
|
+
h_el.min, h_el.max = np.array([-1.0]), np.array([1.0])
|
|
268
|
+
h_el.guess = Xg[:, 3:4]
|
|
269
|
+
|
|
270
|
+
k_el = ox.State("k", (1,))
|
|
271
|
+
k_el.initial, k_el.final = np.array([k0_val]), [ox.Free(float(Xg[-1, 4]))]
|
|
272
|
+
k_el.min, k_el.max = np.array([-1.0]), np.array([1.0])
|
|
273
|
+
k_el.guess = Xg[:, 4:5]
|
|
274
|
+
|
|
275
|
+
L_el = ox.State("L", (1,))
|
|
276
|
+
L_el.initial, L_el.final = np.array([L0_val]), [ox.Free(float(Xg[-1, 5]))]
|
|
277
|
+
L_el.min, L_el.max = np.array([L0_val]), np.array([L_max])
|
|
278
|
+
L_el.guess = Xg[:, 5:6]
|
|
279
|
+
|
|
280
|
+
m_el = ox.State("mass", (1,))
|
|
281
|
+
m_el.initial = np.array([m0_val])
|
|
282
|
+
m_el.final = [("maximize", 0.4 * LBM)] # objective: maximize final mass
|
|
283
|
+
m_el.min, m_el.max = np.array([state_bounds["m"][0]]), np.array([m0_val])
|
|
284
|
+
m_el.guess = Xg[:, 6:7]
|
|
285
|
+
|
|
286
|
+
states = [p_el, f_el, g_el, h_el, k_el, L_el, m_el]
|
|
287
|
+
|
|
288
|
+
# ── Controls ─────────────────────────────────────────────────────────────────
|
|
289
|
+
u = ox.Control("u", shape=(3,), parameterization="zoh")
|
|
290
|
+
u.min, u.max = np.full(3, -1.0), np.full(3, 1.0)
|
|
291
|
+
u.guess = u_guess
|
|
292
|
+
|
|
293
|
+
tau = ox.Control("tau", shape=(1,), parameterization="zoh")
|
|
294
|
+
tau.min, tau.max = np.array([-50.0]), np.array([0.0])
|
|
295
|
+
tau.guess = tau_guess
|
|
296
|
+
|
|
297
|
+
controls = [u, tau]
|
|
298
|
+
|
|
299
|
+
# ── Symbolic MEE dynamics with J2-J4 oblateness ──────────────────────────────
|
|
300
|
+
p, f, g, h, k, L = p_el[0], f_el[0], g_el[0], h_el[0], k_el[0], L_el[0]
|
|
301
|
+
m = m_el[0]
|
|
302
|
+
ur, ut, uh = u[0], u[1], u[2]
|
|
303
|
+
tau_s = tau[0]
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def _cross(a, b):
|
|
307
|
+
return (a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0])
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def _dot(a, b):
|
|
311
|
+
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
q = 1.0 + f * ox.Cos(L) + g * ox.Sin(L)
|
|
315
|
+
r = p / q
|
|
316
|
+
alpha2 = h * h - k * k
|
|
317
|
+
s2 = 1.0 + h * h + k * k
|
|
318
|
+
cL, sL = ox.Cos(L), ox.Sin(L)
|
|
319
|
+
|
|
320
|
+
# Inertial position (ECI)
|
|
321
|
+
rX = (r / s2) * (cL + alpha2 * cL + 2 * h * k * sL)
|
|
322
|
+
rY = (r / s2) * (sL - alpha2 * sL + 2 * h * k * cL)
|
|
323
|
+
rZ = (2 * r / s2) * (h * sL - k * cL)
|
|
324
|
+
rVec = (rX, rY, rZ)
|
|
325
|
+
rMag = ox.linalg.Norm(ox.Stack(rVec))
|
|
326
|
+
rXZMag = ox.Sqrt(rX * rX + rZ * rZ)
|
|
327
|
+
|
|
328
|
+
# Inertial velocity (ECI)
|
|
329
|
+
smp = ox.Sqrt(mu / p)
|
|
330
|
+
vX = -(1.0 / s2) * smp * (sL + alpha2 * sL - 2 * h * k * cL + g - 2 * f * h * k + alpha2 * g)
|
|
331
|
+
vY = -(1.0 / s2) * smp * (-cL + alpha2 * cL + 2 * h * k * sL - f + 2 * g * h * k + alpha2 * f)
|
|
332
|
+
vZ = (2.0 / s2) * smp * (h * cL + k * sL + f * h + g * k)
|
|
333
|
+
vVec = (vX, vY, vZ)
|
|
334
|
+
|
|
335
|
+
# RTN basis vectors i_r, i_θ, i_h
|
|
336
|
+
rCrossv = _cross(rVec, vVec)
|
|
337
|
+
rCrossvMag = ox.linalg.Norm(ox.Stack(rCrossv))
|
|
338
|
+
rCrossvCrossr = _cross(rCrossv, rVec)
|
|
339
|
+
ir = tuple(c / rMag for c in rVec)
|
|
340
|
+
it = tuple(c / (rCrossvMag * rMag) for c in rCrossvCrossr)
|
|
341
|
+
ih = tuple(c / rCrossvMag for c in rCrossv)
|
|
342
|
+
|
|
343
|
+
# Local North direction i_n
|
|
344
|
+
enir = ir[2]
|
|
345
|
+
enen = (-enir * ir[0], -enir * ir[1], 1.0 - enir * ir[2])
|
|
346
|
+
enenMag = ox.linalg.Norm(ox.Stack(enen))
|
|
347
|
+
inn = tuple(c / enenMag for c in enen)
|
|
348
|
+
|
|
349
|
+
# Geocentric latitude and Legendre polynomials
|
|
350
|
+
sinphi = rZ / rXZMag
|
|
351
|
+
cosphi = ox.Sqrt(1.0 - sinphi * sinphi)
|
|
352
|
+
P2 = (3 * sinphi * sinphi - 2) / 2
|
|
353
|
+
P3 = (5 * sinphi**3 - 3 * sinphi) / 2
|
|
354
|
+
P4 = (35 * sinphi**4 - 30 * sinphi * sinphi + 3) / 8
|
|
355
|
+
dP2 = 3 * sinphi
|
|
356
|
+
dP3 = (15 * sinphi - 3) / 2
|
|
357
|
+
dP4 = (140 * sinphi**3 - 60 * sinphi) / 8
|
|
358
|
+
|
|
359
|
+
sumn = (Re / r) ** 2 * dP2 * J2 + (Re / r) ** 3 * dP3 * J3 + (Re / r) ** 4 * dP4 * J4
|
|
360
|
+
sumr = 3 * (Re / r) ** 2 * P2 * J2 + 4 * (Re / r) ** 3 * P3 * J3 + 5 * (Re / r) ** 4 * P4 * J4
|
|
361
|
+
deltagn = -(mu * cosphi / (r * r)) * sumn
|
|
362
|
+
deltagr = -(mu / (r * r)) * sumr
|
|
363
|
+
|
|
364
|
+
# Oblateness acceleration in ECI then projected into RTN
|
|
365
|
+
dgv = (
|
|
366
|
+
deltagn * inn[0] - deltagr * ir[0],
|
|
367
|
+
deltagn * inn[1] - deltagr * ir[1],
|
|
368
|
+
deltagn * inn[2] - deltagr * ir[2],
|
|
369
|
+
)
|
|
370
|
+
Deltag1 = _dot(ir, dgv)
|
|
371
|
+
Deltag2 = _dot(it, dgv)
|
|
372
|
+
Deltag3 = _dot(ih, dgv)
|
|
373
|
+
|
|
374
|
+
# Thrust acceleration in RTN
|
|
375
|
+
thr = c_thrust * (1.0 + 0.01 * tau_s) / m
|
|
376
|
+
DeltaT1, DeltaT2, DeltaT3 = thr * ur, thr * ut, thr * uh
|
|
377
|
+
|
|
378
|
+
D1 = Deltag1 + DeltaT1
|
|
379
|
+
D2 = Deltag2 + DeltaT2
|
|
380
|
+
D3 = Deltag3 + DeltaT3
|
|
381
|
+
|
|
382
|
+
# Equations of motion
|
|
383
|
+
p_dot = (2 * p / q) * smp * D2
|
|
384
|
+
f_dot = smp * sL * D1 + smp * ((q + 1) * cL + f) / q * D2 - smp * g / q * (h * sL - k * cL) * D3
|
|
385
|
+
g_dot = -smp * cL * D1 + smp * ((q + 1) * sL + g) / q * D2 + smp * f / q * (h * sL - k * cL) * D3
|
|
386
|
+
h_dot = smp * s2 * cL / (2 * q) * D3
|
|
387
|
+
k_dot = smp * s2 * sL / (2 * q) * D3
|
|
388
|
+
L_dot = smp / q * (h * sL - k * cL) * D3 + ox.Sqrt(mu * p) * (q / p) ** 2
|
|
389
|
+
m_dot = -c_mdot * (1.0 + 0.01 * tau_s)
|
|
390
|
+
|
|
391
|
+
dynamics = {
|
|
392
|
+
"p": p_dot,
|
|
393
|
+
"f": f_dot,
|
|
394
|
+
"g": g_dot,
|
|
395
|
+
"h": h_dot,
|
|
396
|
+
"k": k_dot,
|
|
397
|
+
"L": L_dot,
|
|
398
|
+
"mass": m_dot,
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
# ── Constraints ───────────────────────────────────────────────────────────────
|
|
402
|
+
constraints = []
|
|
403
|
+
|
|
404
|
+
# Path constraint: thrust direction has unit norm, ‖u‖ = 1. ‖u‖ ≤ 1 is
|
|
405
|
+
# convex; ‖u‖ ≥ 1 is non-convex.
|
|
406
|
+
unorm = ox.linalg.Norm(u)
|
|
407
|
+
constraints.append(ox.ctcs(unorm <= 1.0))
|
|
408
|
+
|
|
409
|
+
# Terminal (event) constraints at the final node.
|
|
410
|
+
fN, gN, hN, kN = f_el[0], g_el[0], h_el[0], k_el[0]
|
|
411
|
+
nodal_eqs = [
|
|
412
|
+
(fN**2 + gN**2, ecc_f**2), # final eccentricity
|
|
413
|
+
(hN**2 + kN**2, chi_f**2), # final tan(i/2)
|
|
414
|
+
(fN * hN + gN * kN, 0.0),
|
|
415
|
+
]
|
|
416
|
+
for expr, val in nodal_eqs:
|
|
417
|
+
constraints.append(ox.NodalConstraint(expr == val, nodes=[N - 1]))
|
|
418
|
+
constraints.append(ox.NodalConstraint(gN * hN - kN * fN <= 0.0, nodes=[N - 1]))
|
|
419
|
+
|
|
420
|
+
# ── Time ────────────────────────────────────────────────────
|
|
421
|
+
time = ox.Time(
|
|
422
|
+
initial=0.0,
|
|
423
|
+
final=ox.Free(tf_guess),
|
|
424
|
+
min=0.0,
|
|
425
|
+
max=3 * tf_max,
|
|
426
|
+
guess=t_nodes.reshape(-1, 1),
|
|
427
|
+
time_dilation_min=tf_min,
|
|
428
|
+
time_dilation_max=tf_max,
|
|
429
|
+
uniform_time_grid=True,
|
|
430
|
+
)
|
|
431
|
+
time.time_dilation_guess = np.full((N, 1), tf_guess)
|
|
432
|
+
|
|
433
|
+
# ── Problem ───────────────────────────────────────────────────────────────────
|
|
434
|
+
problem = Problem(
|
|
435
|
+
dynamics=dynamics,
|
|
436
|
+
states=states,
|
|
437
|
+
controls=controls,
|
|
438
|
+
constraints=constraints,
|
|
439
|
+
time=time,
|
|
440
|
+
N=N,
|
|
441
|
+
float_dtype="float64",
|
|
442
|
+
discretizer={"ode_solver": "Dopri8"},
|
|
443
|
+
algorithm={
|
|
444
|
+
"autotuner": ox.AugmentedLagrangian(),
|
|
445
|
+
"k_max": 200,
|
|
446
|
+
"lam_prox": 1e0,
|
|
447
|
+
"lam_vc": 1e2,
|
|
448
|
+
"lam_vb": 1e1,
|
|
449
|
+
},
|
|
450
|
+
solver={"cvx_solver": "QOCO", "solver_args": {}},
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
def mee_to_cartesian(p_a, f_a, g_a, h_a, k_a, L_a):
|
|
455
|
+
"""MEE → ECI position [LU]
|
|
456
|
+
|
|
457
|
+
Inputs are non-dimensional (``p`` in LU); multiply the result by ``LU`` for km.
|
|
458
|
+
"""
|
|
459
|
+
q = 1.0 + f_a * np.cos(L_a) + g_a * np.sin(L_a)
|
|
460
|
+
r = p_a / q
|
|
461
|
+
alpha2 = h_a**2 - k_a**2
|
|
462
|
+
s2 = 1.0 + h_a**2 + k_a**2
|
|
463
|
+
cL, sL = np.cos(L_a), np.sin(L_a)
|
|
464
|
+
x = (r / s2) * (cL + alpha2 * cL + 2 * h_a * k_a * sL)
|
|
465
|
+
y = (r / s2) * (sL - alpha2 * sL + 2 * h_a * k_a * cL)
|
|
466
|
+
z = (2 * r / s2) * (h_a * sL - k_a * cL)
|
|
467
|
+
return x, y, z
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
def plot_final_orbit(results):
|
|
471
|
+
"""3-D ECI plot of the integrated guess and propagated solution (km)."""
|
|
472
|
+
import plotly.graph_objects as go
|
|
473
|
+
|
|
474
|
+
# post_process() supplies the nonlinear trajectory between optimization nodes.
|
|
475
|
+
tr = results.trajectory
|
|
476
|
+
p, f, g, h, k, L = (np.asarray(tr[s]).flatten() for s in ("p", "f", "g", "h", "k", "L"))
|
|
477
|
+
x, y, z = mee_to_cartesian(p, f, g, h, k, L)
|
|
478
|
+
x, y, z = x * LU, y * LU, z * LU # canonical (LU) -> km
|
|
479
|
+
|
|
480
|
+
# Plot the full solve_ivp propagation, not just its N sampled guess nodes.
|
|
481
|
+
xg, yg, zg = mee_to_cartesian(
|
|
482
|
+
Xg_integrated[:, 0],
|
|
483
|
+
Xg_integrated[:, 1],
|
|
484
|
+
Xg_integrated[:, 2],
|
|
485
|
+
Xg_integrated[:, 3],
|
|
486
|
+
Xg_integrated[:, 4],
|
|
487
|
+
Xg_integrated[:, 5],
|
|
488
|
+
)
|
|
489
|
+
xg, yg, zg = xg * LU, yg * LU, zg * LU
|
|
490
|
+
|
|
491
|
+
# Earth sphere
|
|
492
|
+
u_s = np.linspace(0.0, 2.0 * np.pi, 60)
|
|
493
|
+
v_s = np.linspace(0.0, np.pi, 30)
|
|
494
|
+
xe = Re_phys * np.outer(np.cos(u_s), np.sin(v_s))
|
|
495
|
+
ye = Re_phys * np.outer(np.sin(u_s), np.sin(v_s))
|
|
496
|
+
ze = Re_phys * np.outer(np.ones_like(u_s), np.cos(v_s))
|
|
497
|
+
|
|
498
|
+
fig = go.Figure()
|
|
499
|
+
fig.add_trace(
|
|
500
|
+
go.Surface(x=xe, y=ye, z=ze, colorscale="Blues", showscale=False, opacity=0.7, name="Earth")
|
|
501
|
+
)
|
|
502
|
+
fig.add_trace(
|
|
503
|
+
go.Scatter3d(
|
|
504
|
+
x=xg,
|
|
505
|
+
y=yg,
|
|
506
|
+
z=zg,
|
|
507
|
+
mode="lines",
|
|
508
|
+
line=dict(color="lightgray", width=2, dash="dash"),
|
|
509
|
+
name="Initial guess (integrated)",
|
|
510
|
+
)
|
|
511
|
+
)
|
|
512
|
+
fig.add_trace(
|
|
513
|
+
go.Scatter3d(
|
|
514
|
+
x=x,
|
|
515
|
+
y=y,
|
|
516
|
+
z=z,
|
|
517
|
+
mode="lines",
|
|
518
|
+
line=dict(color="orange", width=3),
|
|
519
|
+
name="Transfer (solved)",
|
|
520
|
+
)
|
|
521
|
+
)
|
|
522
|
+
fig.add_trace(
|
|
523
|
+
go.Scatter3d(
|
|
524
|
+
x=[x[0]],
|
|
525
|
+
y=[y[0]],
|
|
526
|
+
z=[z[0]],
|
|
527
|
+
mode="markers",
|
|
528
|
+
marker=dict(size=6, color="green"),
|
|
529
|
+
name="Start (LEO)",
|
|
530
|
+
)
|
|
531
|
+
)
|
|
532
|
+
fig.add_trace(
|
|
533
|
+
go.Scatter3d(
|
|
534
|
+
x=[x[-1]],
|
|
535
|
+
y=[y[-1]],
|
|
536
|
+
z=[z[-1]],
|
|
537
|
+
mode="markers",
|
|
538
|
+
marker=dict(size=6, color="red"),
|
|
539
|
+
name="Final orbit",
|
|
540
|
+
)
|
|
541
|
+
)
|
|
542
|
+
fig.update_layout(
|
|
543
|
+
scene=dict(
|
|
544
|
+
xaxis_title="x [km]",
|
|
545
|
+
yaxis_title="y [km]",
|
|
546
|
+
zaxis_title="z [km]",
|
|
547
|
+
aspectmode="data",
|
|
548
|
+
camera=dict(eye=dict(x=1.3, y=1.3, z=0.9)),
|
|
549
|
+
),
|
|
550
|
+
)
|
|
551
|
+
return fig
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
if __name__ == "__main__":
|
|
555
|
+
problem.initialize()
|
|
556
|
+
problem.solve()
|
|
557
|
+
results = problem.post_process()
|
|
558
|
+
|
|
559
|
+
# Results are in canonical units; convert back to physical for reporting.
|
|
560
|
+
tf_sol = float(np.asarray(results.t_final).reshape(-1)[0]) * TU # s
|
|
561
|
+
mf_n = float(results.trajectory["mass"][-1, 0]) # normalized mass
|
|
562
|
+
mf_sol = mf_n * MU # kg
|
|
563
|
+
print(f"Transfer time : {tf_sol:.0f} s ({tf_sol / 3600:.2f} hr)")
|
|
564
|
+
print(f"Final mass : {mf_sol:.6f} kg (propellant {(m0_val - mf_n) * MU:.6f} kg)")
|
|
565
|
+
|
|
566
|
+
plot_final_orbit(results).show()
|
|
567
|
+
plot_states(results).show()
|
|
568
|
+
plot_controls(results).show()
|
|
569
|
+
plot_scp_iterations(results).show()
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.5.3.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 5, 3, '
|
|
21
|
+
__version__ = version = '0.5.3.dev59'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 5, 3, 'dev59')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g939c7d7fa'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.5.3.
|
|
3
|
+
Version: 0.5.3.dev59
|
|
4
4
|
Summary: A general Python-based successive convexification implementation which uses a JAX backend.
|
|
5
5
|
Author-email: Chris Hayner and Griffin Norris <haynec@uw.edu>
|
|
6
6
|
License: Apache Software License
|
|
@@ -205,6 +205,7 @@ examples/spacecraft/dual_deputy_inspection_cw.py
|
|
|
205
205
|
examples/spacecraft/halo_orbit.py
|
|
206
206
|
examples/spacecraft/hohmann_transfer.py
|
|
207
207
|
examples/spacecraft/let_transfer.py
|
|
208
|
+
examples/spacecraft/low_thrust_transfer.py
|
|
208
209
|
examples/spacecraft/proxops_cw.py
|
|
209
210
|
examples/spacecraft/relative_loitering.py
|
|
210
211
|
examples/spacecraft/capstone/capstone.bin
|
|
@@ -213,6 +213,7 @@
|
|
|
213
213
|
"examples/spacecraft/halo_orbit.py",
|
|
214
214
|
"examples/spacecraft/hohmann_transfer.py",
|
|
215
215
|
"examples/spacecraft/let_transfer.py",
|
|
216
|
+
"examples/spacecraft/low_thrust_transfer.py",
|
|
216
217
|
"examples/spacecraft/proxops_cw.py",
|
|
217
218
|
"examples/spacecraft/relative_loitering.py",
|
|
218
219
|
"figures/ctlos_cine.gif",
|