openscvx 0.5.3.dev27__tar.gz → 0.5.3.dev28__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.dev27/openscvx.egg-info → openscvx-0.5.3.dev28}/PKG-INFO +1 -1
- openscvx-0.5.3.dev28/examples/aircraft/supersonic_time_to_climb.py +343 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/_version.py +3 -3
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx.egg-info/SOURCES.txt +1 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/workflows/docs.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/workflows/lint.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/workflows/release.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.gitignore +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/.gitmodules +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/CONTRIBUTING.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/LICENSE +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/README.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UnderTheHood/batching_jit_grad.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UnderTheHood/custom_algorithms_autotuners.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/08_mpcc.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/favicon.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/viser-client/index.html +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/citation.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/examples.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/index.md +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/versions.json +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/_viser_embed_export.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/abstract/brachistochrone_batched.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/abstract/flappy_bird.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/abstract/hypersensitive.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/abstract/stl_or.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/_camera.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/_render.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/_sensor_view.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/logo.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/arm/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/arm/franka_fr3v2_viewplanning_nodal.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/car/dubins_car.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/car/dubins_car_waypoint_stl.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/2d_obstacle_avoidance_batched_ic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/cinema_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/drone_racing_batched_gates.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/logo.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/logo_utils/openscvx_logo_single.svg +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/logo_utils/quadrotor_mesh.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/logo_utils/svg_path_utils.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/obstacle_avoidance_vmap_2d.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/openscvx_logo.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/frax/panda_frax.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/frax/panda_frax_pick_place.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/frax/panda_frax_viewplanning.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/frax/panda_frax_waypoint.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mjx/skydio_x2_mjx.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mjx/triple_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/plotting.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/plotting_viser.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/rocket/6DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/rocket/6DoF_pdg_batched_ic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/rocket/ascent_launch_vehicle.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/spacecraft/let_transfer.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/spacecraft/relative_loitering.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/figures/video_preview.png +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/assets/stylesheets/home-hero.css +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/home.html +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/main.html +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/partials/home-hero.html +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/mkdocs.yml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/__main__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/acceptance_ratio.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/history.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/hyperparams.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/loop.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/penalty.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/scvx/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/scvx/iteration.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/state.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/algorithms/weights.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/config.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/discretization/base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/expert/byof.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/expert/validation.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/init/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/integrations/_utils.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/integrations/base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/integrations/frax.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/integrations/mjx.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/integrators/diffrax.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/loader.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/publication.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/coordinates.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/problem.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/solvers/base.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/solvers/cones.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/solvers/moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/solvers/qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/affine.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/canonicalize.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/stljax.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/utils/cache.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/utils/caching.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/utils/printing.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx/utils/utils.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/pyproject.toml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/setup.cfg +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/_marks.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/_iteration_helpers.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/autotuner/test_defaults_agreement.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/autotuner/test_hyper_overrides.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/test_iteration_fn_jit.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/test_iteration_fn_parity.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/algorithms/test_make_solve_loop.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/conftest.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/expr/test_gmsr.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/integrations/test_mjx.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/integrations/test_mjx_dynamics.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/_iteration_callback_helpers.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/test_iteration_callback_cvxpy.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/test_iteration_callback_moreau.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/test_iteration_callback_qpax.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/test_iteration_callback_vmap.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/test_moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/test_qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/solvers/test_subproblem_pytree.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_stl.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_autotuning.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_discretization.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_examples.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_expert.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_impulsive.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_init.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_integrators.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_loader.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_optimization_results.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_plotting.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_propagation.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_solve_batched_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_solve_batched_cvxpy_export_errors.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_solve_batched_export_roundtrip.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_solve_batched_inference.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_solve_jax_bare_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_solve_jax_jit_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_solve_jax_vmap_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/tests/test_solve_jax_vmap_converged_no_drift.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.dev28
|
|
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
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
"""Minimum time-to-climb of a supersonic aircraft (Bryson's interceptor).
|
|
2
|
+
|
|
3
|
+
The classic minimum time-to-climb benchmark from Bryson, Desai and Hoffman,
|
|
4
|
+
*"Energy-State Approximation in Performance Optimization of Supersonic Aircraft,"*
|
|
5
|
+
Journal of Aircraft, Vol. 6, No. 6, 1969, pp. 481-488, reproduced in the GPOPS-II
|
|
6
|
+
user's guide. The aircraft starts at sea level in level flight and must reach
|
|
7
|
+
20 km altitude at a prescribed speed and flight-path angle in minimum time. The
|
|
8
|
+
optimal trajectory dashes near the ground to build kinetic energy, then
|
|
9
|
+
zoom-climbs through the transonic region — energy management, not a monotonic
|
|
10
|
+
climb.
|
|
11
|
+
|
|
12
|
+
Point-mass dynamics over a spherical, non-rotating Earth (state ``[h, v, gamma,
|
|
13
|
+
m]`` = altitude, speed, flight-path angle, mass; control ``alpha`` = angle of
|
|
14
|
+
attack):
|
|
15
|
+
|
|
16
|
+
h_dot = v sin(gamma)
|
|
17
|
+
v_dot = (T cos(alpha) - D) / m - mu sin(gamma) / r^2
|
|
18
|
+
gamma_dot = (T sin(alpha) + L) / (m v) + cos(gamma) (v / r - mu / (v r^2))
|
|
19
|
+
m_dot = -T / (g0 Isp)
|
|
20
|
+
|
|
21
|
+
with ``r = Re + h``, dynamic pressure ``q = 0.5 rho v^2``, lift ``L = q S CL``
|
|
22
|
+
and drag ``D = q S CD``, ``CL = Clalpha alpha`` and ``CD = CD0 + eta Clalpha
|
|
23
|
+
alpha^2``. The objective is the free final time.
|
|
24
|
+
|
|
25
|
+
The model is defined by lookup tables, and the interpolant matters for SCP — the
|
|
26
|
+
dynamics are re-linearized every iteration, so a C0 ``Linterp`` chatters:
|
|
27
|
+
|
|
28
|
+
- Atmosphere ``rho(h)``, ``a(h)`` (U.S. 1976 Standard Atmosphere): cubic
|
|
29
|
+
``Cinterp``, since the tables are smooth and monotone.
|
|
30
|
+
- Aerodynamics ``CD0(M)``, ``Clalpha(M)``, ``eta(M)``: PCHIP ``Cinterp``. These
|
|
31
|
+
have a sharp transonic peak that a cubic overshoots non-physically (e.g.
|
|
32
|
+
``eta`` dipping ~30% below its tabulated floor), so the shape-preserving PCHIP
|
|
33
|
+
is used instead.
|
|
34
|
+
- Engine thrust ``T(h, M)``: bilinear ``Bilerp`` (the only 2-D primitive) — a
|
|
35
|
+
faithful stand-in for the GPOPS 2-D spline.
|
|
36
|
+
|
|
37
|
+
States are kept in SI units; OpenSCvx auto-scales them from their min/max bounds.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
import os
|
|
41
|
+
import sys
|
|
42
|
+
|
|
43
|
+
import numpy as np
|
|
44
|
+
import plotly.graph_objects as go
|
|
45
|
+
from plotly.subplots import make_subplots
|
|
46
|
+
|
|
47
|
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
48
|
+
grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
|
|
49
|
+
if grandparent_dir not in sys.path:
|
|
50
|
+
sys.path.append(grandparent_dir)
|
|
51
|
+
|
|
52
|
+
import openscvx as ox
|
|
53
|
+
from openscvx.plotting import plot_controls, plot_scp_iterations, plot_states
|
|
54
|
+
|
|
55
|
+
# ---------------------------------------------------------------------------
|
|
56
|
+
# Physical constants (SI)
|
|
57
|
+
# ---------------------------------------------------------------------------
|
|
58
|
+
Re = 6378145.0 # Earth radius (m)
|
|
59
|
+
mu = 3.986e14 # Earth gravitational parameter (m^3 / s^2)
|
|
60
|
+
S = 49.2386 # aerodynamic reference area (m^2)
|
|
61
|
+
g0 = 9.80665 # standard gravity (m / s^2)
|
|
62
|
+
Isp = 1600.0 # specific impulse (s)
|
|
63
|
+
|
|
64
|
+
# ---------------------------------------------------------------------------
|
|
65
|
+
# Tabulated aircraft data
|
|
66
|
+
# ---------------------------------------------------------------------------
|
|
67
|
+
# U.S. 1976 Standard Atmosphere, truncated to the climb envelope
|
|
68
|
+
# (altitude m, density kg/m^3, speed of sound m/s).
|
|
69
|
+
atmosphere = np.array(
|
|
70
|
+
[
|
|
71
|
+
[-2000.0, 1.478e00, 3.479e02],
|
|
72
|
+
[0.0, 1.225e00, 3.403e02],
|
|
73
|
+
[2000.0, 1.007e00, 3.325e02],
|
|
74
|
+
[4000.0, 8.193e-01, 3.246e02],
|
|
75
|
+
[6000.0, 6.601e-01, 3.165e02],
|
|
76
|
+
[8000.0, 5.258e-01, 3.081e02],
|
|
77
|
+
[10000.0, 4.135e-01, 2.995e02],
|
|
78
|
+
[12000.0, 3.119e-01, 2.951e02],
|
|
79
|
+
[14000.0, 2.279e-01, 2.951e02],
|
|
80
|
+
[16000.0, 1.665e-01, 2.951e02],
|
|
81
|
+
[18000.0, 1.216e-01, 2.951e02],
|
|
82
|
+
[20000.0, 8.891e-02, 2.951e02],
|
|
83
|
+
[22000.0, 6.451e-02, 2.964e02],
|
|
84
|
+
[24000.0, 4.694e-02, 2.977e02],
|
|
85
|
+
[26000.0, 3.426e-02, 2.991e02],
|
|
86
|
+
[28000.0, 2.508e-02, 3.004e02],
|
|
87
|
+
[30000.0, 1.841e-02, 3.017e02],
|
|
88
|
+
[32000.0, 1.355e-02, 3.030e02],
|
|
89
|
+
]
|
|
90
|
+
)
|
|
91
|
+
alt_table = atmosphere[:, 0]
|
|
92
|
+
rho_table = atmosphere[:, 1]
|
|
93
|
+
sos_table = atmosphere[:, 2]
|
|
94
|
+
|
|
95
|
+
# Aerodynamic coefficients vs. Mach number (Bryson 1969).
|
|
96
|
+
mach_table = np.array([0.0, 0.4, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8])
|
|
97
|
+
Clalpha_table = np.array([3.44, 3.44, 3.44, 3.58, 4.44, 3.44, 3.01, 2.86, 2.44])
|
|
98
|
+
CD0_table = np.array([0.013, 0.013, 0.013, 0.014, 0.031, 0.041, 0.039, 0.036, 0.035])
|
|
99
|
+
eta_table = np.array([0.54, 0.54, 0.54, 0.75, 0.79, 0.78, 0.89, 0.93, 0.93])
|
|
100
|
+
|
|
101
|
+
# Engine thrust (N) on an (altitude, Mach) grid. The raw table is indexed
|
|
102
|
+
# [Mach, altitude] and given in 1000-lbf; convert to Newtons and transpose so
|
|
103
|
+
# that thrust_grid[i, j] is the thrust at (thrust_alt[i], thrust_mach[j]).
|
|
104
|
+
thrust_mach = np.array([0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8])
|
|
105
|
+
thrust_alt = 304.8 * np.array([0.0, 5, 10, 15, 20, 25, 30, 40, 50, 70])
|
|
106
|
+
thrust_lbf = np.array(
|
|
107
|
+
[
|
|
108
|
+
[24.2, 24.0, 20.3, 17.3, 14.5, 12.2, 10.2, 5.7, 3.4, 0.1],
|
|
109
|
+
[28.0, 24.6, 21.1, 18.1, 15.2, 12.8, 10.7, 6.5, 3.9, 0.2],
|
|
110
|
+
[28.3, 25.2, 21.9, 18.7, 15.9, 13.4, 11.2, 7.3, 4.4, 0.4],
|
|
111
|
+
[30.8, 27.2, 23.8, 20.5, 17.3, 14.7, 12.3, 8.1, 4.9, 0.8],
|
|
112
|
+
[34.5, 30.3, 26.6, 23.2, 19.8, 16.8, 14.1, 9.4, 5.6, 1.1],
|
|
113
|
+
[37.9, 34.3, 30.4, 26.8, 23.3, 19.8, 16.8, 11.2, 6.8, 1.4],
|
|
114
|
+
[36.1, 38.0, 34.9, 31.3, 27.3, 23.6, 20.1, 13.4, 8.3, 1.7],
|
|
115
|
+
[36.1, 36.6, 38.5, 36.1, 31.6, 28.1, 24.2, 16.2, 10.0, 2.2],
|
|
116
|
+
[36.1, 35.2, 42.1, 38.7, 35.7, 32.0, 28.1, 19.3, 11.9, 2.9],
|
|
117
|
+
[36.1, 33.8, 45.7, 41.3, 39.8, 34.6, 31.1, 21.7, 13.3, 3.1],
|
|
118
|
+
]
|
|
119
|
+
)
|
|
120
|
+
thrust_grid = (4448.222 * thrust_lbf).T # -> N, shape (alt, Mach)
|
|
121
|
+
|
|
122
|
+
# ---------------------------------------------------------------------------
|
|
123
|
+
# Boundary conditions and limits
|
|
124
|
+
# ---------------------------------------------------------------------------
|
|
125
|
+
alt0, altf = 0.0, 19994.88 # altitude (m)
|
|
126
|
+
speed0, speedf = 129.314, 295.092 # speed (m/s)
|
|
127
|
+
fpa0, fpaf = 0.0, 0.0 # flight-path angle (rad)
|
|
128
|
+
mass0 = 19050.864 # initial mass (kg)
|
|
129
|
+
|
|
130
|
+
n = 80 # discretization nodes
|
|
131
|
+
tf_guess = 300.0 # initial guess for the (free) final time
|
|
132
|
+
|
|
133
|
+
# Hold near the altitude floor for the first dash_fraction of the horizon, then
|
|
134
|
+
# climb: this steers the local solver into the energy-optimal "sea-level dash,
|
|
135
|
+
# then zoom-climb" basin rather than the suboptimal "climb immediately" one.
|
|
136
|
+
dash_fraction = 0.15
|
|
137
|
+
_climb = np.clip((np.linspace(0.0, 1.0, n) - dash_fraction) / (1.0 - dash_fraction), 0.0, 1.0)
|
|
138
|
+
|
|
139
|
+
# ---------------------------------------------------------------------------
|
|
140
|
+
# States — guesses default to a linear initial->final interpolation when unset,
|
|
141
|
+
# so only altitude (the dash hold) needs an explicit guess.
|
|
142
|
+
# ---------------------------------------------------------------------------
|
|
143
|
+
h = ox.State("altitude", shape=(1,))
|
|
144
|
+
h.min, h.max = [0.0], [21031.2]
|
|
145
|
+
h.initial, h.final = [alt0], [altf]
|
|
146
|
+
h.guess = (altf * _climb).reshape(-1, 1)
|
|
147
|
+
|
|
148
|
+
v = ox.State("speed", shape=(1,))
|
|
149
|
+
v.min, v.max = [5.0], [1000.0]
|
|
150
|
+
v.initial, v.final = [speed0], [speedf]
|
|
151
|
+
|
|
152
|
+
gamma = ox.State("flight_path_angle", shape=(1,))
|
|
153
|
+
gamma.min, gamma.max = [np.deg2rad(-40.0)], [np.deg2rad(40.0)]
|
|
154
|
+
gamma.initial, gamma.final = [fpa0], [fpaf]
|
|
155
|
+
|
|
156
|
+
mass = ox.State("mass", shape=(1,))
|
|
157
|
+
mass.min, mass.max = [22.0], [20410.0]
|
|
158
|
+
mass.initial, mass.final = [mass0], [ox.Free(mass0)] # final mass free (fuel burned)
|
|
159
|
+
|
|
160
|
+
# ---------------------------------------------------------------------------
|
|
161
|
+
# Control (controls always need an explicit guess)
|
|
162
|
+
# ---------------------------------------------------------------------------
|
|
163
|
+
alpha = ox.Control("angle_of_attack", shape=(1,))
|
|
164
|
+
alpha.min, alpha.max = [np.deg2rad(-45.0)], [np.deg2rad(45.0)]
|
|
165
|
+
alpha.guess = np.zeros((n, 1))
|
|
166
|
+
|
|
167
|
+
states = [h, v, gamma, mass]
|
|
168
|
+
controls = [alpha]
|
|
169
|
+
|
|
170
|
+
# ---------------------------------------------------------------------------
|
|
171
|
+
# Dynamics
|
|
172
|
+
# ---------------------------------------------------------------------------
|
|
173
|
+
hs, vs, fpas, ms = h[0], v[0], gamma[0], mass[0]
|
|
174
|
+
a = alpha[0]
|
|
175
|
+
|
|
176
|
+
r = hs + Re
|
|
177
|
+
rho = ox.Cinterp(hs, alt_table, rho_table)
|
|
178
|
+
sos = ox.Cinterp(hs, alt_table, sos_table)
|
|
179
|
+
mach = vs / sos
|
|
180
|
+
|
|
181
|
+
# PCHIP for the aero coefficients: a cubic overshoots their sharp transonic peak
|
|
182
|
+
# (see the module docstring).
|
|
183
|
+
CD0 = ox.Cinterp(mach, mach_table, CD0_table, method="pchip")
|
|
184
|
+
Clalpha = ox.Cinterp(mach, mach_table, Clalpha_table, method="pchip")
|
|
185
|
+
eta = ox.Cinterp(mach, mach_table, eta_table, method="pchip")
|
|
186
|
+
thrust = ox.Bilerp(hs, mach, thrust_alt, thrust_mach, thrust_grid)
|
|
187
|
+
|
|
188
|
+
CL = Clalpha * a
|
|
189
|
+
CD = CD0 + eta * Clalpha * a**2
|
|
190
|
+
q = 0.5 * rho * vs**2
|
|
191
|
+
lift = q * S * CL
|
|
192
|
+
drag = q * S * CD
|
|
193
|
+
|
|
194
|
+
dynamics = {
|
|
195
|
+
"altitude": vs * ox.Sin(fpas),
|
|
196
|
+
"speed": (thrust * ox.Cos(a) - drag) / ms - mu * ox.Sin(fpas) / r**2,
|
|
197
|
+
"flight_path_angle": (thrust * ox.Sin(a) + lift) / (ms * vs)
|
|
198
|
+
+ ox.Cos(fpas) * (vs / r - mu / (vs * r**2)),
|
|
199
|
+
"mass": -thrust / (g0 * Isp),
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
# ---------------------------------------------------------------------------
|
|
203
|
+
# Constraints: keep every state inside its box along the trajectory.
|
|
204
|
+
# ---------------------------------------------------------------------------
|
|
205
|
+
constraints = []
|
|
206
|
+
for state in states:
|
|
207
|
+
constraints.extend([ox.ctcs(state <= state.max), ox.ctcs(state.min <= state)])
|
|
208
|
+
|
|
209
|
+
# ---------------------------------------------------------------------------
|
|
210
|
+
# Free final time, minimized.
|
|
211
|
+
# ---------------------------------------------------------------------------
|
|
212
|
+
time = ox.Time(
|
|
213
|
+
initial=0.0,
|
|
214
|
+
final=("minimize", tf_guess),
|
|
215
|
+
min=0.0,
|
|
216
|
+
max=800.0,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
# A fixed proximal weight converges cleaner and faster than the adaptive default
|
|
220
|
+
# here; lam_prox = 2e-2 is the sweet spot for this problem.
|
|
221
|
+
problem = ox.Problem(
|
|
222
|
+
dynamics=dynamics,
|
|
223
|
+
states=states,
|
|
224
|
+
controls=controls,
|
|
225
|
+
time=time,
|
|
226
|
+
constraints=constraints,
|
|
227
|
+
N=n,
|
|
228
|
+
licq_max=1e-8,
|
|
229
|
+
algorithm={"lam_prox": 2e-2, "autotuner": ox.ConstantProximalWeight()},
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def plot_gpops_comparison(results):
|
|
234
|
+
"""Reproduce the four GPOPS-II diagnostic plots for this benchmark.
|
|
235
|
+
|
|
236
|
+
Lays out altitude vs. time, the altitude-vs-speed energy path, flight-path
|
|
237
|
+
angle vs. time, and angle of attack vs. time. The high-resolution propagated
|
|
238
|
+
trajectory is drawn as a line with the discretization nodes overlaid.
|
|
239
|
+
"""
|
|
240
|
+
nodes, traj = results.nodes, results.trajectory
|
|
241
|
+
|
|
242
|
+
def col(source, key):
|
|
243
|
+
return np.asarray(source[key]).flatten()
|
|
244
|
+
|
|
245
|
+
fig = make_subplots(
|
|
246
|
+
rows=2,
|
|
247
|
+
cols=2,
|
|
248
|
+
subplot_titles=(
|
|
249
|
+
"Altitude vs. Time",
|
|
250
|
+
"Altitude vs. Speed (energy path)",
|
|
251
|
+
"Flight-Path Angle vs. Time",
|
|
252
|
+
"Angle of Attack vs. Time",
|
|
253
|
+
),
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
# (row, col, x, y) for each panel, in (trajectory, node) units.
|
|
257
|
+
panels = [
|
|
258
|
+
(
|
|
259
|
+
1,
|
|
260
|
+
1,
|
|
261
|
+
col(traj, "time"),
|
|
262
|
+
col(traj, "altitude") / 1e3,
|
|
263
|
+
col(nodes, "time"),
|
|
264
|
+
col(nodes, "altitude") / 1e3,
|
|
265
|
+
),
|
|
266
|
+
(
|
|
267
|
+
1,
|
|
268
|
+
2,
|
|
269
|
+
col(traj, "speed"),
|
|
270
|
+
col(traj, "altitude") / 1e3,
|
|
271
|
+
col(nodes, "speed"),
|
|
272
|
+
col(nodes, "altitude") / 1e3,
|
|
273
|
+
),
|
|
274
|
+
(
|
|
275
|
+
2,
|
|
276
|
+
1,
|
|
277
|
+
col(traj, "time"),
|
|
278
|
+
np.rad2deg(col(traj, "flight_path_angle")),
|
|
279
|
+
col(nodes, "time"),
|
|
280
|
+
np.rad2deg(col(nodes, "flight_path_angle")),
|
|
281
|
+
),
|
|
282
|
+
(
|
|
283
|
+
2,
|
|
284
|
+
2,
|
|
285
|
+
col(traj, "time"),
|
|
286
|
+
np.rad2deg(col(traj, "angle_of_attack")),
|
|
287
|
+
col(nodes, "time"),
|
|
288
|
+
np.rad2deg(col(nodes, "angle_of_attack")),
|
|
289
|
+
),
|
|
290
|
+
]
|
|
291
|
+
for i, (r, c, xt, yt, xn, yn) in enumerate(panels):
|
|
292
|
+
first = i == 0
|
|
293
|
+
fig.add_trace(
|
|
294
|
+
go.Scatter(
|
|
295
|
+
x=xt,
|
|
296
|
+
y=yt,
|
|
297
|
+
mode="lines",
|
|
298
|
+
name="Propagated",
|
|
299
|
+
line={"color": "#19d3f3", "width": 2},
|
|
300
|
+
legendgroup="traj",
|
|
301
|
+
showlegend=first,
|
|
302
|
+
),
|
|
303
|
+
row=r,
|
|
304
|
+
col=c,
|
|
305
|
+
)
|
|
306
|
+
fig.add_trace(
|
|
307
|
+
go.Scatter(
|
|
308
|
+
x=xn,
|
|
309
|
+
y=yn,
|
|
310
|
+
mode="markers",
|
|
311
|
+
name="Nodes",
|
|
312
|
+
marker={"color": "#ffa600", "size": 5},
|
|
313
|
+
legendgroup="nodes",
|
|
314
|
+
showlegend=first,
|
|
315
|
+
),
|
|
316
|
+
row=r,
|
|
317
|
+
col=c,
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
fig.update_xaxes(title_text="Time [s]", row=1, col=1)
|
|
321
|
+
fig.update_yaxes(title_text="Altitude [km]", row=1, col=1)
|
|
322
|
+
fig.update_xaxes(title_text="Speed [m/s]", row=1, col=2)
|
|
323
|
+
fig.update_yaxes(title_text="Altitude [km]", row=1, col=2)
|
|
324
|
+
fig.update_xaxes(title_text="Time [s]", row=2, col=1)
|
|
325
|
+
fig.update_yaxes(title_text="Flight-path angle [deg]", row=2, col=1)
|
|
326
|
+
fig.update_xaxes(title_text="Time [s]", row=2, col=2)
|
|
327
|
+
fig.update_yaxes(title_text="Angle of attack [deg]", row=2, col=2)
|
|
328
|
+
fig.update_layout(title="Supersonic Minimum Time-to-Climb", template="plotly_dark")
|
|
329
|
+
return fig
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
if __name__ == "__main__":
|
|
333
|
+
problem.initialize()
|
|
334
|
+
results = problem.solve()
|
|
335
|
+
results = problem.post_process()
|
|
336
|
+
|
|
337
|
+
final_time = float(np.asarray(results.nodes["time"]).flatten()[-1])
|
|
338
|
+
print(f"Minimum time-to-climb: {final_time:.2f} s")
|
|
339
|
+
|
|
340
|
+
plot_gpops_comparison(results).show()
|
|
341
|
+
plot_states(results).show()
|
|
342
|
+
plot_controls(results).show()
|
|
343
|
+
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.dev28'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 5, 3, 'dev28')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'ga8ce79961'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.5.3.
|
|
3
|
+
Version: 0.5.3.dev28
|
|
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
|
|
@@ -63,6 +63,7 @@ examples/abstract/hypersensitive.py
|
|
|
63
63
|
examples/abstract/impulsive.py
|
|
64
64
|
examples/abstract/stl_integer_variable.py
|
|
65
65
|
examples/abstract/stl_or.py
|
|
66
|
+
examples/aircraft/supersonic_time_to_climb.py
|
|
66
67
|
examples/animations/7_dof_arm.py
|
|
67
68
|
examples/animations/_camera.py
|
|
68
69
|
examples/animations/_render.py
|
|
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
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UnderTheHood/custom_algorithms_autotuners.md
RENAMED
|
File without changes
|
|
File without changes
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UnderTheHood/vectorization_and_vmapping.md
RENAMED
|
File without changes
|
|
File without changes
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/01_hello_world_brachistochrone.md
RENAMED
|
File without changes
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/UsersGuide/02_drone_racing_constraints.md
RENAMED
|
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
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/docs/assets/viser-recordings/drone_racing.viser
RENAMED
|
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
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/franka_fr3v2_pick_place.py
RENAMED
|
File without changes
|
|
File without changes
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/animations/obstacle_avoidance_vmap.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/arm/franka_fr3v2_viewplanning_nodal.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/car/dubins_car_obstacle_conditional.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/2d_obstacle_avoidance_batched_ic.py
RENAMED
|
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
|
{openscvx-0.5.3.dev27 → openscvx-0.5.3.dev28}/examples/drone/logo_utils/openscvx_logo_single.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|