openscvx 0.5.3.dev14__tar.gz → 0.5.3.dev15__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.dev14/openscvx.egg-info → openscvx-0.5.3.dev15}/PKG-INFO +1 -1
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/_version.py +3 -3
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/scvx/penalized_trust_region.py +1 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrators/diffrax.py +4 -1
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/cvxpy_variables.py +9 -15
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/base.py +11 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/cvxpy_ptr_solver.py +145 -56
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lower.py +8 -16
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_iteration_callback_cvxpy.py +15 -3
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/docs.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/lint.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/release.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.gitignore +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.gitmodules +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/CONTRIBUTING.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/LICENSE +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/README.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/08_mpcc.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/favicon.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/viser-client/index.html +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/citation.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/examples.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/index.md +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/versions.json +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/_viser_embed_export.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/hypersensitive.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/stl_or.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/_camera.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/_render.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/_sensor_view.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/logo.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_waypoint_stl.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/logo.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/logo_utils/svg_path_utils.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/skydio_x2_mjx.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/triple_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/plotting.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/plotting_viser.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/rocket/6DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/let_transfer.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/relative_loitering.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/video_preview.png +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/assets/stylesheets/home-hero.css +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/home.html +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/main.html +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-hero.html +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/mkdocs.yml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/__main__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/scvx/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/weights.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/config.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/base.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/expert/byof.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/expert/validation.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/init/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrations/base.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrations/mjx.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/loader.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/problem.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/stljax.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/cache.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/caching.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/printing.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/utils.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/SOURCES.txt +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/pyproject.toml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/setup.cfg +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/_marks.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/conftest.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/expr/test_gmsr.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/integrations/test_mjx.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/integrations/test_mjx_dynamics.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/_iteration_callback_helpers.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_iteration_callback_moreau.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_iteration_callback_qpax.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_iteration_callback_vmap.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_subproblem_pytree.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_stl.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_autotuning.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_discretization.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_examples.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_expert.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_impulsive.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_init.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_integrators.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_loader.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_optimization_results.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_plotting.py +0 -0
- {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_propagation.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.dev15
|
|
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
|
|
@@ -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.dev15'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 5, 3, 'dev15')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'ge47b6d19c'
|
|
@@ -129,7 +129,7 @@ def solve_ivp_diffrax_prop(
|
|
|
129
129
|
dt0 = user_kwargs.pop("dt0", (tau_final - tau_0) / 1)
|
|
130
130
|
solve_kwargs = {
|
|
131
131
|
"stepsize_controller": dfx.PIDController(rtol=rtol, atol=atol),
|
|
132
|
-
"saveat": dfx.SaveAt(dense=True),
|
|
132
|
+
"saveat": dfx.SaveAt(dense=True, t1=True),
|
|
133
133
|
}
|
|
134
134
|
solve_kwargs.update(user_kwargs)
|
|
135
135
|
if isinstance(solve_kwargs["stepsize_controller"], dfx.StepTo):
|
|
@@ -147,5 +147,8 @@ def solve_ivp_diffrax_prop(
|
|
|
147
147
|
)
|
|
148
148
|
|
|
149
149
|
all_evals = jax.vmap(solution.evaluate)(save_time)
|
|
150
|
+
terminal_state = jnp.asarray(solution.ys)[-1]
|
|
151
|
+
at_terminal = jnp.isclose(save_time, tau_final)
|
|
152
|
+
all_evals = jnp.where(at_terminal[:, None], terminal_state, all_evals)
|
|
150
153
|
masked_array = jnp.where(mask[:, None], all_evals, jnp.zeros_like(all_evals))
|
|
151
154
|
return masked_array
|
|
@@ -34,23 +34,23 @@ class CVXPyVariables:
|
|
|
34
34
|
lam_vb_nodal: Virtual buffer penalty weights for nodal constraints (N x n_nodal, nonneg)
|
|
35
35
|
lam_vb_cross: Virtual buffer penalty weights for cross-node constraints (n_cross, nonneg)
|
|
36
36
|
|
|
37
|
+
prox_c: Linear proximal coefficient parameter (N x (n_states+n_controls))
|
|
38
|
+
prox_cc: Constant proximal offset parameter (N,)
|
|
39
|
+
dyn_bias: Dynamics affine bias parameter (N-1 x n_states)
|
|
40
|
+
x0_imp_bias: Initial impulsive affine bias parameter (n_states,)
|
|
41
|
+
|
|
37
42
|
x: State variable (N x n_states)
|
|
38
|
-
dx: State error variable (N x n_states)
|
|
39
43
|
x_bar: Previous SCP state parameter (N x n_states)
|
|
40
44
|
x_init: Initial state parameter (n_states,)
|
|
41
45
|
x_term: Terminal state parameter (n_states,)
|
|
42
46
|
|
|
43
47
|
u: Control variable (N x n_controls)
|
|
44
|
-
du: Control error variable (N x n_controls)
|
|
45
48
|
u_bar: Previous SCP control parameter (N x n_controls)
|
|
46
49
|
|
|
47
50
|
A_d: Discretized state Jacobian parameter (N-1 x n_states*n_states)
|
|
48
51
|
B_d: Discretized control Jacobian parameter (N-1 x n_states*n_controls)
|
|
49
52
|
C_d: Discretized control Jacobian (next node) parameter
|
|
50
|
-
x_prop_plus: Discrete dynamics propagated state parameter
|
|
51
|
-
D_d: Jacobian of impulsive/discrete dynamics w.r.t. state
|
|
52
53
|
E_d: Jacobian of impulsive/discrete dynamics w.r.t. control
|
|
53
|
-
x_prop: Propagated state parameter (N-1 x n_states)
|
|
54
54
|
nu: Virtual control variable (N-1 x n_states)
|
|
55
55
|
|
|
56
56
|
g: List of constraint value parameters (one per nodal constraint)
|
|
@@ -72,8 +72,6 @@ class CVXPyVariables:
|
|
|
72
72
|
|
|
73
73
|
x_nonscaled: List of scaled state expressions at each node
|
|
74
74
|
u_nonscaled: List of scaled control expressions at each node
|
|
75
|
-
dx_nonscaled: List of scaled state error expressions at each node
|
|
76
|
-
du_nonscaled: List of scaled control error expressions at each node
|
|
77
75
|
"""
|
|
78
76
|
|
|
79
77
|
# SCP weight parameters
|
|
@@ -82,28 +80,26 @@ class CVXPyVariables:
|
|
|
82
80
|
lam_vc: "cp.Parameter"
|
|
83
81
|
lam_vb_nodal: "cp.Parameter"
|
|
84
82
|
lam_vb_cross: "cp.Parameter"
|
|
85
|
-
|
|
83
|
+
prox_c: "cp.Parameter"
|
|
84
|
+
prox_cc: "cp.Parameter"
|
|
86
85
|
# State variables and parameters
|
|
87
86
|
x: "cp.Variable"
|
|
88
|
-
dx: "cp.Variable"
|
|
89
87
|
x_bar: "cp.Parameter"
|
|
90
88
|
x_init: "cp.Parameter"
|
|
91
89
|
x_term: "cp.Parameter"
|
|
92
90
|
|
|
93
91
|
# Control variables and parameters
|
|
94
92
|
u: "cp.Variable"
|
|
95
|
-
du: "cp.Variable"
|
|
96
93
|
u_bar: "cp.Parameter"
|
|
97
94
|
|
|
98
95
|
# Dynamics discretization parameters
|
|
99
96
|
A_d: "cp.Parameter"
|
|
100
97
|
B_d: "cp.Parameter"
|
|
101
98
|
C_d: "cp.Parameter"
|
|
102
|
-
x_prop_plus: "cp.Parameter | None"
|
|
103
|
-
D_d: "cp.Parameter | None"
|
|
104
99
|
E_d: "cp.Parameter | None"
|
|
105
|
-
x_prop: "cp.Parameter"
|
|
106
100
|
nu: "cp.Variable"
|
|
101
|
+
dyn_bias: "cp.Parameter"
|
|
102
|
+
x0_imp_bias: "cp.Parameter"
|
|
107
103
|
|
|
108
104
|
# Nodal constraint linearization (lists, one per constraint)
|
|
109
105
|
g: List["cp.Parameter"] = field(default_factory=list)
|
|
@@ -128,5 +124,3 @@ class CVXPyVariables:
|
|
|
128
124
|
# Scaled CVXPy expressions at each node (lists of length N)
|
|
129
125
|
x_nonscaled: List = field(default_factory=list)
|
|
130
126
|
u_nonscaled: List = field(default_factory=list)
|
|
131
|
-
dx_nonscaled: List = field(default_factory=list)
|
|
132
|
-
du_nonscaled: List = field(default_factory=list)
|
|
@@ -217,6 +217,17 @@ class ConvexSolver(ABC):
|
|
|
217
217
|
"""
|
|
218
218
|
raise NotImplementedError
|
|
219
219
|
|
|
220
|
+
def update_proximal_terms(self) -> None:
|
|
221
|
+
"""Update optional proximal-expansion parameters.
|
|
222
|
+
|
|
223
|
+
Called after ``update_penalties()`` and before ``solve()``. Solvers
|
|
224
|
+
that formulate trust-region penalties via expanded quadratic forms can
|
|
225
|
+
override this hook to refresh any derived coefficients.
|
|
226
|
+
|
|
227
|
+
Default implementation is a no-op.
|
|
228
|
+
"""
|
|
229
|
+
return None
|
|
230
|
+
|
|
220
231
|
@abstractmethod
|
|
221
232
|
def update_boundary_conditions(self, **kwargs) -> None:
|
|
222
233
|
"""Update boundary condition parameters.
|
|
@@ -205,6 +205,8 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
205
205
|
# ``settings`` arguments each iteration.
|
|
206
206
|
self._jax_constraints: Optional["LoweredJaxConstraints"] = None
|
|
207
207
|
self._settings: Optional[Config] = None
|
|
208
|
+
self._slice_cont = slice(0, 0)
|
|
209
|
+
self._slice_imp = slice(0, 0)
|
|
208
210
|
|
|
209
211
|
@property
|
|
210
212
|
def ocp_vars(self) -> "CVXPyVariables":
|
|
@@ -255,6 +257,8 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
255
257
|
"Unified control slices are inconsistent with control dimension. "
|
|
256
258
|
f"continuous={n_controls_cont}, impulsive={n_controls_imp}, total={n_controls}."
|
|
257
259
|
)
|
|
260
|
+
self._slice_cont = slice_cont
|
|
261
|
+
self._slice_imp = slice_imp
|
|
258
262
|
|
|
259
263
|
S_x, c_x = self._scaling(x_unified)
|
|
260
264
|
S_u, c_u = self._scaling(u_unified)
|
|
@@ -417,13 +421,14 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
417
421
|
jax_constraints = lowered.jax_constraints
|
|
418
422
|
|
|
419
423
|
lam_prox = ocp_vars.lam_prox
|
|
424
|
+
prox_c = ocp_vars.prox_c
|
|
425
|
+
prox_cc = ocp_vars.prox_cc
|
|
420
426
|
lam_cost = ocp_vars.lam_cost
|
|
421
427
|
lam_vc = ocp_vars.lam_vc
|
|
422
428
|
lam_vb_nodal = ocp_vars.lam_vb_nodal
|
|
423
429
|
lam_vb_cross = ocp_vars.lam_vb_cross
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
du = ocp_vars.du
|
|
430
|
+
x = ocp_vars.x
|
|
431
|
+
u = ocp_vars.u
|
|
427
432
|
nu = ocp_vars.nu
|
|
428
433
|
nu_vb = ocp_vars.nu_vb
|
|
429
434
|
nu_vb_cross = ocp_vars.nu_vb_cross
|
|
@@ -433,7 +438,6 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
433
438
|
cost += cp.sum(lam_vb_cross) * 0
|
|
434
439
|
|
|
435
440
|
# Boundary condition cost terms (use scaled x for numerical conditioning)
|
|
436
|
-
x = ocp_vars.x
|
|
437
441
|
for i in range(settings.sim.true_state_slice.start, settings.sim.true_state_slice.stop):
|
|
438
442
|
if settings.sim.x.initial_type[i] == "Minimize":
|
|
439
443
|
cost += lam_cost[i] * x[0][i]
|
|
@@ -444,9 +448,12 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
444
448
|
if settings.sim.x.final_type[i] == "Maximize":
|
|
445
449
|
cost -= lam_cost[i] * x[-1][i]
|
|
446
450
|
|
|
447
|
-
# Trust
|
|
451
|
+
# Trust-region cost in expanded form:
|
|
452
|
+
# sum_i [lam_i * z_i^2 + prox_c_i * z_i + prox_cc_i], z_i = [x_i, u_i].
|
|
448
453
|
cost += sum(
|
|
449
|
-
cp.sum(cp.multiply(lam_prox[i], cp.square(cp.hstack((
|
|
454
|
+
cp.sum(cp.multiply(lam_prox[i], cp.square(cp.hstack((x[i], u[i])))))
|
|
455
|
+
+ cp.sum(cp.multiply(prox_c[i], cp.hstack((x[i], u[i]))))
|
|
456
|
+
+ prox_cc[i]
|
|
450
457
|
for i in range(settings.sim.n)
|
|
451
458
|
)
|
|
452
459
|
|
|
@@ -503,20 +510,14 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
503
510
|
jax_constraints = lowered.jax_constraints
|
|
504
511
|
cvxpy_constraints = lowered.cvxpy_constraints
|
|
505
512
|
|
|
506
|
-
x = ocp_vars.x
|
|
507
|
-
dx = ocp_vars.dx
|
|
508
|
-
x_bar = ocp_vars.x_bar
|
|
509
513
|
x_init = ocp_vars.x_init
|
|
510
514
|
x_term = ocp_vars.x_term
|
|
511
|
-
u = ocp_vars.u
|
|
512
|
-
du = ocp_vars.du
|
|
513
|
-
u_bar = ocp_vars.u_bar
|
|
514
515
|
A_d = ocp_vars.A_d
|
|
515
516
|
B_d = ocp_vars.B_d
|
|
516
517
|
C_d = ocp_vars.C_d
|
|
517
|
-
x_prop = ocp_vars.x_prop
|
|
518
|
-
x_prop_plus = ocp_vars.x_prop_plus
|
|
519
518
|
E_d = ocp_vars.E_d
|
|
519
|
+
dyn_bias = ocp_vars.dyn_bias
|
|
520
|
+
x0_imp_bias = ocp_vars.x0_imp_bias
|
|
520
521
|
nu = ocp_vars.nu
|
|
521
522
|
g = ocp_vars.g
|
|
522
523
|
grad_g_x = ocp_vars.grad_g_x
|
|
@@ -532,11 +533,8 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
532
533
|
c_u = ocp_vars.c_u
|
|
533
534
|
x_nonscaled = ocp_vars.x_nonscaled
|
|
534
535
|
u_nonscaled = ocp_vars.u_nonscaled
|
|
535
|
-
dx_nonscaled = ocp_vars.dx_nonscaled
|
|
536
|
-
du_nonscaled = ocp_vars.du_nonscaled
|
|
537
536
|
slice_cont = settings.sim.u.slice_continuous
|
|
538
537
|
slice_imp = settings.sim.u.slice_impulsive
|
|
539
|
-
has_continuous = bool(slice_cont.stop > slice_cont.start)
|
|
540
538
|
has_impulsive = bool(slice_imp.stop > slice_imp.start)
|
|
541
539
|
|
|
542
540
|
constr = []
|
|
@@ -550,8 +548,8 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
550
548
|
for node in nodes:
|
|
551
549
|
residual = (
|
|
552
550
|
g[idx_ncvx][node]
|
|
553
|
-
+ grad_g_x[idx_ncvx][node] @
|
|
554
|
-
+ grad_g_u[idx_ncvx][node] @
|
|
551
|
+
+ grad_g_x[idx_ncvx][node] @ x_nonscaled[node]
|
|
552
|
+
+ grad_g_u[idx_ncvx][node] @ u_nonscaled[node]
|
|
555
553
|
)
|
|
556
554
|
constr += [residual == nu_vb[idx_ncvx][node]]
|
|
557
555
|
idx_ncvx += 1
|
|
@@ -560,14 +558,15 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
560
558
|
idx_cross = 0
|
|
561
559
|
if jax_constraints.cross_node:
|
|
562
560
|
for constraint in jax_constraints.cross_node:
|
|
563
|
-
# Linearization
|
|
561
|
+
# Linearization in affine form:
|
|
562
|
+
# g_tilde + Σ_k(∇g_X[k]·X[k] + ∇g_U[k]·U[k]) == nu_vb
|
|
564
563
|
# Sum over all trajectory nodes to couple multiple nodes
|
|
565
564
|
residual = g_cross[idx_cross]
|
|
566
565
|
for k in range(settings.sim.n):
|
|
567
566
|
# Contribution from state at node k
|
|
568
|
-
residual += grad_g_X_cross[idx_cross][k, :] @
|
|
567
|
+
residual += grad_g_X_cross[idx_cross][k, :] @ x_nonscaled[k]
|
|
569
568
|
# Contribution from control at node k
|
|
570
|
-
residual += grad_g_U_cross[idx_cross][k, :] @
|
|
569
|
+
residual += grad_g_U_cross[idx_cross][k, :] @ u_nonscaled[k]
|
|
571
570
|
# Add constraint: residual == slack variable
|
|
572
571
|
constr += [residual == nu_vb_cross[idx_cross]]
|
|
573
572
|
idx_cross += 1
|
|
@@ -582,7 +581,7 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
582
581
|
if has_impulsive:
|
|
583
582
|
constr += [
|
|
584
583
|
x_nonscaled[0][i]
|
|
585
|
-
==
|
|
584
|
+
== x0_imp_bias[i] + E_d[0][i, slice_imp] @ u_nonscaled[0][slice_imp]
|
|
586
585
|
]
|
|
587
586
|
else:
|
|
588
587
|
constr += [x_nonscaled[0][i] == x_init[i]] # Initial Boundary Conditions
|
|
@@ -598,26 +597,15 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
598
597
|
for i in range(1, settings.sim.n)
|
|
599
598
|
]
|
|
600
599
|
|
|
601
|
-
constr += [
|
|
602
|
-
(x[i] - inv_S_x @ (x_bar[i] - c_x) - dx[i]) == 0 for i in range(settings.sim.n)
|
|
603
|
-
] # State Error
|
|
604
|
-
constr += [
|
|
605
|
-
(u[i] - inv_S_u @ (u_bar[i] - c_u) - du[i]) == 0 for i in range(settings.sim.n)
|
|
606
|
-
] # Control Error
|
|
607
|
-
|
|
608
600
|
constr += [
|
|
609
601
|
inv_S_x @ (x_nonscaled[i] - c_x)
|
|
610
602
|
== inv_S_x
|
|
611
603
|
@ (
|
|
612
|
-
A_d[i - 1] @
|
|
613
|
-
+
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
)
|
|
618
|
-
+ (C_d[i - 1][:, slice_cont] @ du_nonscaled[i][slice_cont] if has_continuous else 0)
|
|
619
|
-
+ (E_d[i][:, slice_imp] @ du_nonscaled[i][slice_imp] if has_impulsive else 0)
|
|
620
|
-
+ (x_prop_plus[i] if has_impulsive else x_prop[i - 1])
|
|
604
|
+
A_d[i - 1] @ x_nonscaled[i - 1]
|
|
605
|
+
+ B_d[i - 1][:, slice_cont] @ u_nonscaled[i - 1][slice_cont]
|
|
606
|
+
+ C_d[i - 1][:, slice_cont] @ u_nonscaled[i][slice_cont]
|
|
607
|
+
+ (E_d[i][:, slice_imp] @ u_nonscaled[i][slice_imp] if has_impulsive else 0)
|
|
608
|
+
+ dyn_bias[i - 1]
|
|
621
609
|
- c_x
|
|
622
610
|
)
|
|
623
611
|
+ nu[i - 1]
|
|
@@ -721,8 +709,10 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
721
709
|
D_d: Optional impulsive/discrete Jacobian wrt state, shape (N, n_states, n_states)
|
|
722
710
|
E_d: Optional impulsive/discrete Jacobian wrt control, shape (N, n_states, n_controls)
|
|
723
711
|
"""
|
|
724
|
-
|
|
725
|
-
|
|
712
|
+
x_bar_arr = np.asarray(x_bar)
|
|
713
|
+
u_bar_arr = np.asarray(u_bar)
|
|
714
|
+
self._ocp_vars.x_bar.value = x_bar_arr
|
|
715
|
+
self._ocp_vars.u_bar.value = u_bar_arr
|
|
726
716
|
|
|
727
717
|
A_eff = np.asarray(A_d)
|
|
728
718
|
B_eff = np.asarray(B_d)
|
|
@@ -751,14 +741,62 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
751
741
|
self._set_param("A_d", A_eff)
|
|
752
742
|
self._set_param("B_d", B_eff)
|
|
753
743
|
self._set_param("C_d", C_eff)
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
self._ocp_vars.
|
|
760
|
-
|
|
761
|
-
|
|
744
|
+
x_prop_arr = np.asarray(x_prop)
|
|
745
|
+
x_prop_plus_arr = np.asarray(x_prop_plus) if x_prop_plus is not None else None
|
|
746
|
+
E_arr = None
|
|
747
|
+
if E_d is not None:
|
|
748
|
+
E_arr = np.asarray(E_d)
|
|
749
|
+
self._ocp_vars.E_d.value = E_arr
|
|
750
|
+
|
|
751
|
+
self.dynamics_biases(
|
|
752
|
+
A_d=A_eff,
|
|
753
|
+
B_d=B_eff,
|
|
754
|
+
C_d=C_eff,
|
|
755
|
+
x_bar=x_bar_arr,
|
|
756
|
+
u_bar=u_bar_arr,
|
|
757
|
+
x_prop=x_prop_arr,
|
|
758
|
+
x_prop_plus=x_prop_plus_arr,
|
|
759
|
+
E_d=E_arr,
|
|
760
|
+
)
|
|
761
|
+
|
|
762
|
+
def dynamics_biases(
|
|
763
|
+
self,
|
|
764
|
+
A_d: np.ndarray,
|
|
765
|
+
B_d: np.ndarray,
|
|
766
|
+
C_d: np.ndarray,
|
|
767
|
+
x_bar: np.ndarray,
|
|
768
|
+
u_bar: np.ndarray,
|
|
769
|
+
x_prop: np.ndarray,
|
|
770
|
+
x_prop_plus: np.ndarray | None = None,
|
|
771
|
+
E_d: np.ndarray | None = None,
|
|
772
|
+
) -> None:
|
|
773
|
+
"""Update affine dynamics bias parameters for the current linearization.
|
|
774
|
+
|
|
775
|
+
Computes and stores:
|
|
776
|
+
- ``dyn_bias``: per-step affine bias in linearized dynamics
|
|
777
|
+
- ``x0_imp_bias``: initial-node impulsive affine bias
|
|
778
|
+
"""
|
|
779
|
+
has_impulsive = bool(self._slice_imp.stop > self._slice_imp.start)
|
|
780
|
+
|
|
781
|
+
dyn_bias = np.zeros((A_d.shape[0], A_d.shape[1]), dtype=float)
|
|
782
|
+
for k in range(A_d.shape[0]):
|
|
783
|
+
i = k + 1
|
|
784
|
+
base = x_prop_plus[i] if has_impulsive else x_prop[k]
|
|
785
|
+
bias_k = (
|
|
786
|
+
base
|
|
787
|
+
- A_d[k] @ x_bar[k]
|
|
788
|
+
- B_d[k][:, self._slice_cont] @ u_bar[k][self._slice_cont]
|
|
789
|
+
- C_d[k][:, self._slice_cont] @ u_bar[i][self._slice_cont]
|
|
790
|
+
- (E_d[i][:, self._slice_imp] @ u_bar[i][self._slice_imp] if has_impulsive else 0)
|
|
791
|
+
)
|
|
792
|
+
dyn_bias[k] = bias_k
|
|
793
|
+
self._ocp_vars.dyn_bias.value = dyn_bias
|
|
794
|
+
|
|
795
|
+
if has_impulsive:
|
|
796
|
+
x0_imp_bias = x_prop_plus[0] - E_d[0][:, self._slice_imp] @ u_bar[0][self._slice_imp]
|
|
797
|
+
else:
|
|
798
|
+
x0_imp_bias = np.zeros(A_d.shape[1], dtype=float)
|
|
799
|
+
self._ocp_vars.x0_imp_bias.value = x0_imp_bias
|
|
762
800
|
|
|
763
801
|
def update_constraint_linearizations(
|
|
764
802
|
self,
|
|
@@ -781,16 +819,43 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
781
819
|
- ``grad_g_U``: Gradient w.r.t. full control trajectory
|
|
782
820
|
"""
|
|
783
821
|
if nodal:
|
|
822
|
+
x_bar = self._ocp_vars.x_bar.value
|
|
823
|
+
u_bar = self._ocp_vars.u_bar.value
|
|
824
|
+
x_bar_arr = np.asarray(x_bar)
|
|
825
|
+
u_bar_arr = np.asarray(u_bar)
|
|
784
826
|
for g_id, constraint_data in enumerate(nodal):
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
827
|
+
g_arr = np.asarray(constraint_data["g"])
|
|
828
|
+
grad_x_arr = np.asarray(constraint_data["grad_g_x"])
|
|
829
|
+
grad_u_arr = np.asarray(constraint_data["grad_g_u"])
|
|
830
|
+
|
|
831
|
+
# Convert to affine form in (X, U):
|
|
832
|
+
# g_tilde + grad_x·X + grad_u·U, where
|
|
833
|
+
# g_tilde = g(X_bar, U_bar) - grad_x·X_bar - grad_u·U_bar.
|
|
834
|
+
g_tilde = (
|
|
835
|
+
g_arr
|
|
836
|
+
- np.sum(grad_x_arr * x_bar_arr, axis=1)
|
|
837
|
+
- np.sum(grad_u_arr * u_bar_arr, axis=1)
|
|
838
|
+
)
|
|
839
|
+
|
|
840
|
+
self._set_param(f"g_{g_id}", g_tilde)
|
|
841
|
+
self._set_param(f"grad_g_x_{g_id}", grad_x_arr)
|
|
842
|
+
self._set_param(f"grad_g_u_{g_id}", grad_u_arr)
|
|
788
843
|
|
|
789
844
|
if cross_node:
|
|
845
|
+
x_bar = self._ocp_vars.x_bar.value
|
|
846
|
+
u_bar = self._ocp_vars.u_bar.value
|
|
847
|
+
x_bar_arr = np.asarray(x_bar)
|
|
848
|
+
u_bar_arr = np.asarray(u_bar)
|
|
790
849
|
for g_id, constraint_data in enumerate(cross_node):
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
850
|
+
g_val = np.asarray(constraint_data["g"])
|
|
851
|
+
grad_X_arr = np.asarray(constraint_data["grad_g_X"])
|
|
852
|
+
grad_U_arr = np.asarray(constraint_data["grad_g_U"])
|
|
853
|
+
|
|
854
|
+
g_tilde = g_val - np.sum(grad_X_arr * x_bar_arr) - np.sum(grad_U_arr * u_bar_arr)
|
|
855
|
+
|
|
856
|
+
self._set_param(f"g_cross_{g_id}", g_tilde)
|
|
857
|
+
self._set_param(f"grad_g_X_cross_{g_id}", grad_X_arr)
|
|
858
|
+
self._set_param(f"grad_g_U_cross_{g_id}", grad_U_arr)
|
|
794
859
|
|
|
795
860
|
def update_penalties(
|
|
796
861
|
self,
|
|
@@ -815,12 +880,36 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
815
880
|
lam_vb_cross: Virtual buffer penalty weights for cross-node
|
|
816
881
|
constraints, shape ``(n_cross_node_constraints,)``.
|
|
817
882
|
"""
|
|
818
|
-
|
|
883
|
+
lam_prox_arr = np.asarray(lam_prox)
|
|
884
|
+
self._set_param("lam_prox", lam_prox_arr)
|
|
819
885
|
self._set_param("lam_cost", lam_cost)
|
|
820
886
|
self._set_param("lam_vc", lam_vc)
|
|
821
887
|
self._set_param("lam_vb_nodal", lam_vb_nodal)
|
|
822
888
|
self._set_param("lam_vb_cross", lam_vb_cross)
|
|
823
889
|
|
|
890
|
+
def proximal_cost_terms(
|
|
891
|
+
self,
|
|
892
|
+
lam_prox: np.ndarray,
|
|
893
|
+
x_bar: np.ndarray,
|
|
894
|
+
u_bar: np.ndarray,
|
|
895
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
896
|
+
"""Compute linear and constant proximal cost terms."""
|
|
897
|
+
x_ref = (self._ocp_vars.inv_S_x @ (x_bar.T - self._ocp_vars.c_x[:, None])).T
|
|
898
|
+
u_ref = (self._ocp_vars.inv_S_u @ (u_bar.T - self._ocp_vars.c_u[:, None])).T
|
|
899
|
+
z_ref = np.hstack((x_ref, u_ref))
|
|
900
|
+
prox_c = -2.0 * lam_prox * z_ref
|
|
901
|
+
prox_cc = np.sum(lam_prox * np.square(z_ref), axis=1)
|
|
902
|
+
return prox_c, prox_cc
|
|
903
|
+
|
|
904
|
+
def update_proximal_terms(self) -> None:
|
|
905
|
+
"""Update proximal expansion parameters from current references and weights."""
|
|
906
|
+
lam_prox_arr = np.asarray(self._ocp_vars.lam_prox.value)
|
|
907
|
+
x_bar = np.asarray(self._ocp_vars.x_bar.value)
|
|
908
|
+
u_bar = np.asarray(self._ocp_vars.u_bar.value)
|
|
909
|
+
prox_c, prox_cc = self.proximal_cost_terms(lam_prox_arr, x_bar, u_bar)
|
|
910
|
+
self._set_param("prox_c", prox_c)
|
|
911
|
+
self._set_param("prox_cc", prox_cc)
|
|
912
|
+
|
|
824
913
|
def update_boundary_conditions(
|
|
825
914
|
self,
|
|
826
915
|
x_init: np.ndarray = None,
|
|
@@ -279,6 +279,8 @@ def create_cvxpy_variables(
|
|
|
279
279
|
|
|
280
280
|
# Parameters
|
|
281
281
|
lam_prox = cp.Parameter((N, n_states + n_controls), nonneg=True, name="lam_prox")
|
|
282
|
+
prox_c = cp.Parameter((N, n_states + n_controls), name="prox_c")
|
|
283
|
+
prox_cc = cp.Parameter(N, name="prox_cc")
|
|
282
284
|
lam_cost = cp.Parameter(n_states, nonneg=True, name="lam_cost")
|
|
283
285
|
lam_vc = cp.Parameter((N - 1, n_states), nonneg=True, name="lam_vc")
|
|
284
286
|
lam_vb_nodal = cp.Parameter((N, max(n_nodal_constraints, 1)), nonneg=True, name="lam_vb_nodal")
|
|
@@ -286,24 +288,21 @@ def create_cvxpy_variables(
|
|
|
286
288
|
|
|
287
289
|
# State
|
|
288
290
|
x = cp.Variable((N, n_states), name="x") # Current State
|
|
289
|
-
dx = cp.Variable((N, n_states), name="dx") # State Error
|
|
290
291
|
x_bar = cp.Parameter((N, n_states), name="x_bar") # Previous SCP State
|
|
291
292
|
x_init = cp.Parameter(n_states, name="x_init") # Initial State
|
|
292
293
|
x_term = cp.Parameter(n_states, name="x_term") # Final State
|
|
293
294
|
|
|
294
295
|
# Control
|
|
295
296
|
u = cp.Variable((N, n_controls), name="u") # Current Control
|
|
296
|
-
du = cp.Variable((N, n_controls), name="du") # Control Error
|
|
297
297
|
u_bar = cp.Parameter((N, n_controls), name="u_bar") # Previous SCP Control
|
|
298
298
|
|
|
299
299
|
# Discretized Augmented Dynamics Constraints
|
|
300
300
|
A_d = cp.Parameter((N - 1, n_states, n_states), name="A_d", sparsity=A_d_sparsity)
|
|
301
301
|
B_d = cp.Parameter((N - 1, n_states, n_controls), name="B_d", sparsity=B_d_sparsity)
|
|
302
302
|
C_d = cp.Parameter((N - 1, n_states, n_controls), name="C_d", sparsity=C_d_sparsity)
|
|
303
|
-
x_prop_plus = cp.Parameter((N, n_states), name="x_prop_plus")
|
|
304
|
-
D_d = cp.Parameter((N, n_states, n_states), name="D_d")
|
|
305
303
|
E_d = cp.Parameter((N, n_states, n_controls), name="E_d")
|
|
306
|
-
|
|
304
|
+
dyn_bias = cp.Parameter((N - 1, n_states), name="dyn_bias")
|
|
305
|
+
x0_imp_bias = cp.Parameter(n_states, name="x0_imp_bias")
|
|
307
306
|
nu = cp.Variable((N - 1, n_states), name="nu") # Virtual Control
|
|
308
307
|
|
|
309
308
|
# Linearized Nonconvex Nodal Constraints
|
|
@@ -346,13 +345,9 @@ def create_cvxpy_variables(
|
|
|
346
345
|
# Applying the affine scaling to state and control
|
|
347
346
|
x_nonscaled = []
|
|
348
347
|
u_nonscaled = []
|
|
349
|
-
dx_nonscaled = []
|
|
350
|
-
du_nonscaled = []
|
|
351
348
|
for k in range(N):
|
|
352
349
|
x_nonscaled.append(S_x @ x[k] + c_x)
|
|
353
350
|
u_nonscaled.append(S_u @ u[k] + c_u)
|
|
354
|
-
dx_nonscaled.append(S_x @ dx[k])
|
|
355
|
-
du_nonscaled.append(S_u @ du[k])
|
|
356
351
|
|
|
357
352
|
return CVXPyVariables(
|
|
358
353
|
lam_prox=lam_prox,
|
|
@@ -360,21 +355,20 @@ def create_cvxpy_variables(
|
|
|
360
355
|
lam_vc=lam_vc,
|
|
361
356
|
lam_vb_nodal=lam_vb_nodal,
|
|
362
357
|
lam_vb_cross=lam_vb_cross,
|
|
358
|
+
prox_c=prox_c,
|
|
359
|
+
prox_cc=prox_cc,
|
|
363
360
|
x=x,
|
|
364
|
-
dx=dx,
|
|
365
361
|
x_bar=x_bar,
|
|
366
362
|
x_init=x_init,
|
|
367
363
|
x_term=x_term,
|
|
368
364
|
u=u,
|
|
369
|
-
du=du,
|
|
370
365
|
u_bar=u_bar,
|
|
371
366
|
A_d=A_d,
|
|
372
367
|
B_d=B_d,
|
|
373
368
|
C_d=C_d,
|
|
374
|
-
x_prop_plus=x_prop_plus,
|
|
375
|
-
D_d=D_d,
|
|
376
369
|
E_d=E_d,
|
|
377
|
-
|
|
370
|
+
dyn_bias=dyn_bias,
|
|
371
|
+
x0_imp_bias=x0_imp_bias,
|
|
378
372
|
nu=nu,
|
|
379
373
|
g=g,
|
|
380
374
|
grad_g_x=grad_g_x,
|
|
@@ -392,8 +386,6 @@ def create_cvxpy_variables(
|
|
|
392
386
|
c_u=c_u,
|
|
393
387
|
x_nonscaled=x_nonscaled,
|
|
394
388
|
u_nonscaled=u_nonscaled,
|
|
395
|
-
dx_nonscaled=dx_nonscaled,
|
|
396
|
-
du_nonscaled=du_nonscaled,
|
|
397
389
|
)
|
|
398
390
|
|
|
399
391
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.5.3.
|
|
3
|
+
Version: 0.5.3.dev15
|
|
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
|
{openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_iteration_callback_cvxpy.py
RENAMED
|
@@ -49,10 +49,22 @@ def _subproblem_data_from_solver(prob) -> SubproblemData:
|
|
|
49
49
|
A_d = np.asarray(ocp.A_d.value)
|
|
50
50
|
B_d = np.asarray(ocp.B_d.value)
|
|
51
51
|
C_d = np.asarray(ocp.C_d.value)
|
|
52
|
-
|
|
52
|
+
# New nomenclature: x_prop/x_prop_plus are not stored directly on CVXPyVariables.
|
|
53
|
+
# Reconstruct continuous x_prop from affine dynamics bias:
|
|
54
|
+
# dyn_bias[k] = x_prop[k] - A[k]x_bar[k] - B[k]u_bar[k] - C[k]u_bar[k+1]
|
|
55
|
+
if hasattr(ocp, "x_prop") and ocp.x_prop is not None and ocp.x_prop.value is not None:
|
|
56
|
+
x_prop = np.asarray(ocp.x_prop.value)
|
|
57
|
+
else:
|
|
58
|
+
dyn_bias = np.asarray(ocp.dyn_bias.value)
|
|
59
|
+
x_prop = np.zeros((N - 1, n_x))
|
|
60
|
+
for k in range(N - 1):
|
|
61
|
+
x_prop[k] = dyn_bias[k] + A_d[k] @ x_bar[k] + B_d[k] @ u_bar[k] + C_d[k] @ u_bar[k + 1]
|
|
62
|
+
|
|
53
63
|
x_prop_plus = (
|
|
54
|
-
np.asarray(ocp
|
|
55
|
-
if ocp
|
|
64
|
+
np.asarray(getattr(ocp, "x_prop_plus").value)
|
|
65
|
+
if hasattr(ocp, "x_prop_plus")
|
|
66
|
+
and getattr(ocp, "x_prop_plus") is not None
|
|
67
|
+
and getattr(ocp, "x_prop_plus").value is not None
|
|
56
68
|
else np.zeros((N, n_x))
|
|
57
69
|
)
|
|
58
70
|
E_d = (
|
|
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.dev14 → openscvx-0.5.3.dev15}/docs/UnderTheHood/vectorization_and_vmapping.md
RENAMED
|
File without changes
|
|
File without changes
|