openscvx 0.5.3.dev11__tar.gz → 0.5.3.dev13__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.dev11 → openscvx-0.5.3.dev13}/.github/workflows/tests-unit.yml +0 -1
- {openscvx-0.5.3.dev11/openscvx.egg-info → openscvx-0.5.3.dev13}/PKG-INFO +2 -2
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UnderTheHood/lowering_architecture.md +10 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/_version.py +3 -3
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/cvxpy_ptr_solver.py +229 -3
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/moreau_ptr_solver.py +474 -7
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/ptr_solver.py +211 -9
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/qpax_ptr_solver.py +500 -5
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13/openscvx.egg-info}/PKG-INFO +2 -2
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/SOURCES.txt +7 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/requires.txt +1 -1
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/pyproject.toml +1 -1
- openscvx-0.5.3.dev13/tests/solvers/_iteration_callback_helpers.py +189 -0
- openscvx-0.5.3.dev13/tests/solvers/test_cvxpy_callback_jit_spike.py +149 -0
- openscvx-0.5.3.dev13/tests/solvers/test_iteration_callback_cvxpy.py +218 -0
- openscvx-0.5.3.dev13/tests/solvers/test_iteration_callback_moreau.py +140 -0
- openscvx-0.5.3.dev13/tests/solvers/test_iteration_callback_qpax.py +125 -0
- openscvx-0.5.3.dev13/tests/solvers/test_iteration_callback_vmap.py +153 -0
- openscvx-0.5.3.dev13/tests/solvers/test_subproblem_pytree.py +135 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/docs.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/lint.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/release.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.gitignore +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.gitmodules +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/CONTRIBUTING.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/LICENSE +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/README.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/08_mpcc.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/favicon.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/viser-client/index.html +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/citation.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/examples.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/index.md +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/versions.json +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/_viser_embed_export.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/hypersensitive.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/stl_or.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/_camera.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/_render.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/_sensor_view.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/logo.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_waypoint_stl.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/logo.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/logo_utils/svg_path_utils.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/skydio_x2_mjx.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/triple_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/plotting.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/plotting_viser.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/rocket/6DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/spacecraft/let_transfer.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/video_preview.png +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/assets/stylesheets/home-hero.css +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/home.html +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/main.html +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-hero.html +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/mkdocs.yml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/__main__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/scvx/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/weights.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/config.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/expert/byof.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/expert/validation.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/init/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrations/base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrations/mjx.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrators/diffrax.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/loader.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/problem.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/base.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/stljax.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/cache.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/caching.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/printing.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/utils.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/setup.cfg +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/_marks.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/conftest.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/expr/test_gmsr.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/integrations/test_mjx.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/integrations/test_mjx_dynamics.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/solvers/test_moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/solvers/test_qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_stl.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_autotuning.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_discretization.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_examples.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_expert.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_impulsive.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_init.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_integrators.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_loader.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_optimization_results.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_plotting.py +0 -0
- {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/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.dev13
|
|
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
|
|
@@ -10,7 +10,7 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
10
10
|
Requires-Python: >=3.11
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
12
|
License-File: LICENSE
|
|
13
|
-
Requires-Dist: cvxpy
|
|
13
|
+
Requires-Dist: cvxpy<1.9,>=1.8.1
|
|
14
14
|
Requires-Dist: qoco
|
|
15
15
|
Requires-Dist: numpy
|
|
16
16
|
Requires-Dist: jax
|
|
@@ -171,6 +171,16 @@ of the abstract `PTRSolver` base. Three backends ship today:
|
|
|
171
171
|
| QPAX | `QPAXPTRSolver` | `solver={"backend": "qpax"}` | JAX-native QP via `qpax.solve_qp`. Flat `(Q, q, A, b, G, h)` assembly. Supports box / dynamics (continuous and impulsive) / CTCS / boundary-Fix; **rejects** user `.convex()` and cross-node at `initialize()` with a clear "use `CVXPyPTRSolver`" message. Enables a path toward an end-to-end JAX-differentiable SCP loop in follow-up work. |
|
|
172
172
|
| Moreau | `MoreauPTRSolver` | `solver={"backend": "moreau"}` | JAX-native conic solver (`moreau.jax.Solver`). Sparse CSR assembly; SOC epigraphs for the L1 / pos PTR penalties (fewer variables and rows than QPAX). Warm-starts between SCP iterations. Same supported subset as QPAX (continuous and impulsive dynamics). Paves the way for user `.convex()` SOC support in a follow-up. |
|
|
173
173
|
|
|
174
|
+
Each backend exposes two per-iteration entry points: the historical NumPy
|
|
175
|
+
`update_*` + `solve()` stages used by today's Python-side SCP loop, and a
|
|
176
|
+
JAX-pure `iteration_callback()` built once at `initialize()`. The callback
|
|
177
|
+
returns a `(state, SubproblemData) -> SubproblemSolution` callable; all
|
|
178
|
+
three backends emit the same input/output pytree shape so the callable
|
|
179
|
+
composes with `jax.jit` and `jax.vmap` (CVXPy via `jax.pure_callback` with
|
|
180
|
+
`vmap_method="sequential"` — its batched solves are serial). The downstream
|
|
181
|
+
batchable-`Problem.solve()` work wraps this callback in `lax.while_loop` to
|
|
182
|
+
keep the entire SCP iteration on the JAX boundary.
|
|
183
|
+
|
|
174
184
|
Picking a backend at construction time:
|
|
175
185
|
|
|
176
186
|
```python
|
|
@@ -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.dev13'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 5, 3, 'dev13')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'gf4df0a724'
|
|
@@ -10,14 +10,22 @@ which targets pure-JAX execution.
|
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
12
|
import os
|
|
13
|
-
from typing import TYPE_CHECKING, List, Optional, Union
|
|
13
|
+
from typing import TYPE_CHECKING, Callable, List, Optional, Union
|
|
14
14
|
|
|
15
15
|
import cvxpy as cp
|
|
16
|
+
import jax
|
|
17
|
+
import jax.numpy as jnp
|
|
16
18
|
import numpy as np
|
|
17
19
|
|
|
18
20
|
from openscvx.config import Config
|
|
19
21
|
|
|
20
|
-
from .ptr_solver import
|
|
22
|
+
from .ptr_solver import (
|
|
23
|
+
PTRSolver,
|
|
24
|
+
PTRSolveResult,
|
|
25
|
+
SubproblemData,
|
|
26
|
+
SubproblemSolution,
|
|
27
|
+
status_str_to_code,
|
|
28
|
+
)
|
|
21
29
|
|
|
22
30
|
if TYPE_CHECKING:
|
|
23
31
|
from openscvx.lowered import LoweredProblem
|
|
@@ -38,6 +46,78 @@ except ImportError:
|
|
|
38
46
|
## TODO: (fabio) add support for impulsive controls
|
|
39
47
|
|
|
40
48
|
|
|
49
|
+
def _unstack_nodal(
|
|
50
|
+
data: SubproblemData,
|
|
51
|
+
jax_constraints: "LoweredJaxConstraints",
|
|
52
|
+
) -> List[dict]:
|
|
53
|
+
"""Unstack ``SubproblemData``'s ``nodal_*`` arrays into per-constraint dicts.
|
|
54
|
+
|
|
55
|
+
The JAX-pure side stacks every nodal constraint's linearization into
|
|
56
|
+
``(N, n_nodal, ...)`` arrays with zero-fill at nodes outside each
|
|
57
|
+
constraint's static ``nodes`` tuple. :meth:`update_constraint_linearizations`
|
|
58
|
+
expects the list-of-dicts layout the SCP loop has historically built —
|
|
59
|
+
this helper inverts the stack. The full-N arrays are returned (the zero
|
|
60
|
+
rows are harmless: CVXPy's constraint set only references the
|
|
61
|
+
constraint's own ``nodes``).
|
|
62
|
+
"""
|
|
63
|
+
if not jax_constraints.nodal:
|
|
64
|
+
return []
|
|
65
|
+
nodal_g = np.asarray(data.nodal_g)
|
|
66
|
+
nodal_grad_x = np.asarray(data.nodal_grad_x)
|
|
67
|
+
nodal_grad_u = np.asarray(data.nodal_grad_u)
|
|
68
|
+
out: List[dict] = []
|
|
69
|
+
for c_idx, _constraint in enumerate(jax_constraints.nodal):
|
|
70
|
+
out.append(
|
|
71
|
+
{
|
|
72
|
+
"g": nodal_g[:, c_idx],
|
|
73
|
+
"grad_g_x": nodal_grad_x[:, c_idx, :],
|
|
74
|
+
"grad_g_u": nodal_grad_u[:, c_idx, :],
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
return out
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _unstack_cross(
|
|
81
|
+
data: SubproblemData,
|
|
82
|
+
jax_constraints: "LoweredJaxConstraints",
|
|
83
|
+
) -> List[dict]:
|
|
84
|
+
"""Unstack ``SubproblemData``'s cross-node arrays into per-constraint dicts.
|
|
85
|
+
|
|
86
|
+
Cross-node constraints stack ``g`` to ``(n_cross,)`` and the gradients to
|
|
87
|
+
``(n_cross, N, n_x | n_u)``. :meth:`update_constraint_linearizations`
|
|
88
|
+
expects per-constraint dicts with the natural orientation.
|
|
89
|
+
"""
|
|
90
|
+
if not jax_constraints.cross_node:
|
|
91
|
+
return []
|
|
92
|
+
cross_g = np.asarray(data.cross_g)
|
|
93
|
+
cross_grad_X = np.asarray(data.cross_grad_X)
|
|
94
|
+
cross_grad_U = np.asarray(data.cross_grad_U)
|
|
95
|
+
out: List[dict] = []
|
|
96
|
+
for c_idx, _constraint in enumerate(jax_constraints.cross_node):
|
|
97
|
+
out.append(
|
|
98
|
+
{
|
|
99
|
+
"g": cross_g[c_idx],
|
|
100
|
+
"grad_g_X": cross_grad_X[c_idx],
|
|
101
|
+
"grad_g_U": cross_grad_U[c_idx],
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
return out
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _unmask_bc(bc: "jnp.ndarray") -> np.ndarray:
|
|
108
|
+
"""Replace NaN-sentinel free entries with zeros for CVXPy parameter assignment.
|
|
109
|
+
|
|
110
|
+
``SubproblemData.x_init`` / ``x_term`` carry ``jnp.nan`` at indices where
|
|
111
|
+
the boundary condition is free; CVXPy's ``Parameter.value`` setter rejects
|
|
112
|
+
non-real arrays via :meth:`CVXPyPTRSolver._set_param`. The CVXPy
|
|
113
|
+
constraint set only references the indices flagged ``"Fix"`` in
|
|
114
|
+
``initial_type`` / ``final_type``, so zeroing the free entries is safe —
|
|
115
|
+
they're written but never read.
|
|
116
|
+
"""
|
|
117
|
+
arr = np.asarray(bc, dtype=float)
|
|
118
|
+
return np.nan_to_num(arr, nan=0.0)
|
|
119
|
+
|
|
120
|
+
|
|
41
121
|
class CVXPyPTRSolver(PTRSolver):
|
|
42
122
|
"""CVXPy-backed implementation of the PTR convex subproblem.
|
|
43
123
|
|
|
@@ -48,7 +128,11 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
48
128
|
|
|
49
129
|
The solver builds the problem structure once during ``initialize()``, using
|
|
50
130
|
CVXPy Parameters for values that change each iteration. The ``solve()``
|
|
51
|
-
method then solves and returns a structured ``PTRSolveResult``.
|
|
131
|
+
method then solves and returns a structured ``PTRSolveResult``. The
|
|
132
|
+
JAX-pure entry point :meth:`iteration_callback` wraps that same solve in
|
|
133
|
+
:func:`jax.pure_callback` (``vmap_method="sequential"`` — CVXPy cannot
|
|
134
|
+
batch) so the backend composes with ``jax.jit`` / ``jax.vmap`` alongside
|
|
135
|
+
the JAX-native QPAX and Moreau backends.
|
|
52
136
|
|
|
53
137
|
The cost and constraint formulations are defined in the ``cost()`` and
|
|
54
138
|
``constraints()`` methods, which can be overridden in subclasses to
|
|
@@ -116,6 +200,11 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
116
200
|
self._ocp_vars: "CVXPyVariables" = None
|
|
117
201
|
self._problem: cp.Problem = None
|
|
118
202
|
self._solve_fn: callable = None
|
|
203
|
+
# Stashed at create_variables / initialize so iteration_callback can
|
|
204
|
+
# close over them without retracing them off the ``lowered`` /
|
|
205
|
+
# ``settings`` arguments each iteration.
|
|
206
|
+
self._jax_constraints: Optional["LoweredJaxConstraints"] = None
|
|
207
|
+
self._settings: Optional[Config] = None
|
|
119
208
|
|
|
120
209
|
@property
|
|
121
210
|
def ocp_vars(self) -> "CVXPyVariables":
|
|
@@ -203,6 +292,11 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
203
292
|
constraint_sparsity=constraint_sparsity,
|
|
204
293
|
)
|
|
205
294
|
|
|
295
|
+
# Stash the constraint catalog so iteration_callback can unstack the
|
|
296
|
+
# JAX-pure ``SubproblemData`` back into the per-constraint dict layout
|
|
297
|
+
# ``update_constraint_linearizations`` expects.
|
|
298
|
+
self._jax_constraints = jax_constraints
|
|
299
|
+
|
|
206
300
|
def lower_convex_constraints(self, constraints, parameters=None):
|
|
207
301
|
"""Lower user ``.convex()`` constraints into CVXPy constraint objects.
|
|
208
302
|
|
|
@@ -291,6 +385,7 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
291
385
|
)
|
|
292
386
|
|
|
293
387
|
self._problem = prob
|
|
388
|
+
self._settings = settings
|
|
294
389
|
self._setup_solve_function()
|
|
295
390
|
|
|
296
391
|
def cost(
|
|
@@ -879,6 +974,137 @@ class CVXPyPTRSolver(PTRSolver):
|
|
|
879
974
|
status=self._problem.status,
|
|
880
975
|
)
|
|
881
976
|
|
|
977
|
+
def iteration_callback(self) -> Callable[..., SubproblemSolution]:
|
|
978
|
+
"""JAX-pure ``(state, SubproblemData) -> SubproblemSolution``.
|
|
979
|
+
|
|
980
|
+
Wraps the existing NumPy ``solve()`` path in :func:`jax.pure_callback`
|
|
981
|
+
with ``vmap_method="sequential"``. CVXPy can't trace — it builds a DCP
|
|
982
|
+
graph and reaches into a backend solver through Python attribute
|
|
983
|
+
mutation — so the only JAX-friendly surface it can present is a host
|
|
984
|
+
callback. Under :func:`jax.jit` the callback fires once per call; under
|
|
985
|
+
:func:`jax.vmap` it fires ``B`` times serially (CVXPy can't ingest a
|
|
986
|
+
batched parameter set).
|
|
987
|
+
|
|
988
|
+
The closure unstacks :class:`SubproblemData` back to the per-constraint
|
|
989
|
+
dict layout :meth:`update_constraint_linearizations` expects, runs the
|
|
990
|
+
four ``update_*`` methods + :meth:`solve`, and packs the result into a
|
|
991
|
+
:class:`SubproblemSolution` whose ``nu_vb`` is collapsed to a stacked
|
|
992
|
+
``(N, n_nodal)`` array (the list-of-arrays form on
|
|
993
|
+
:attr:`PTRSolveResult.nu_vb` is preserved for the NumPy path).
|
|
994
|
+
|
|
995
|
+
``status_code`` is mapped via :func:`status_str_to_code`; CVXPy's
|
|
996
|
+
``"optimal_inaccurate"`` / ``"solver_error"`` / ... labels collapse to
|
|
997
|
+
:attr:`StatusCode.UNKNOWN` — the SCP trust-region check is the
|
|
998
|
+
authoritative convergence gate.
|
|
999
|
+
|
|
1000
|
+
The returned callable takes ``(state, data)``: ``state`` is the
|
|
1001
|
+
:class:`AlgorithmState` pytree, accepted for cross-backend signature
|
|
1002
|
+
uniformity but unused (CVXPy exposes no warm-start through
|
|
1003
|
+
``update_*``); ``data`` is the :class:`SubproblemData` pytree carrying
|
|
1004
|
+
the per-iteration linearization arrays, penalty weights, and boundary
|
|
1005
|
+
conditions.
|
|
1006
|
+
"""
|
|
1007
|
+
if self._problem is None or self._settings is None or self._jax_constraints is None:
|
|
1008
|
+
raise RuntimeError(
|
|
1009
|
+
"CVXPyPTRSolver.iteration_callback() requires initialize() to "
|
|
1010
|
+
"have been called first."
|
|
1011
|
+
)
|
|
1012
|
+
|
|
1013
|
+
settings = self._settings
|
|
1014
|
+
jax_constraints = self._jax_constraints
|
|
1015
|
+
n_x = settings.sim.n_states
|
|
1016
|
+
n_u = settings.sim.n_controls
|
|
1017
|
+
N = settings.sim.n
|
|
1018
|
+
n_nodal = len(jax_constraints.nodal)
|
|
1019
|
+
n_cross = len(jax_constraints.cross_node)
|
|
1020
|
+
slice_imp = settings.sim.u.slice_impulsive
|
|
1021
|
+
has_impulsive = bool(slice_imp.stop > slice_imp.start)
|
|
1022
|
+
f = jnp.float64 if jax.config.read("jax_enable_x64") else jnp.float32
|
|
1023
|
+
|
|
1024
|
+
result_struct = SubproblemSolution(
|
|
1025
|
+
x=jax.ShapeDtypeStruct((N, n_x), f),
|
|
1026
|
+
u=jax.ShapeDtypeStruct((N, n_u), f),
|
|
1027
|
+
nu=jax.ShapeDtypeStruct((N - 1, n_x), f),
|
|
1028
|
+
nu_vb=jax.ShapeDtypeStruct((N, n_nodal), f),
|
|
1029
|
+
nu_vb_cross=jax.ShapeDtypeStruct((n_cross,), f),
|
|
1030
|
+
cost=jax.ShapeDtypeStruct((), f),
|
|
1031
|
+
status_code=jax.ShapeDtypeStruct((), jnp.int32),
|
|
1032
|
+
)
|
|
1033
|
+
|
|
1034
|
+
def host_solve(data: SubproblemData) -> SubproblemSolution:
|
|
1035
|
+
# SubproblemData always carries (N, n_x, n_x) D_d / (N, n_x, n_u) E_d
|
|
1036
|
+
# / (N, n_x) x_prop_plus arrays — zero-filled when the problem has
|
|
1037
|
+
# no impulsive component. ``update_dynamics_linearization`` treats
|
|
1038
|
+
# a non-None D_d as "absorb into A/B/C", which would zero them out
|
|
1039
|
+
# on the no-impulsive path; pass None in that case to keep A/B/C
|
|
1040
|
+
# intact. Same logic for x_prop_plus / E_d.
|
|
1041
|
+
x_prop_plus = np.asarray(data.x_prop_plus) if has_impulsive else None
|
|
1042
|
+
D_d = np.asarray(data.D_d) if has_impulsive else None
|
|
1043
|
+
E_d = np.asarray(data.E_d) if has_impulsive else None
|
|
1044
|
+
self.update_dynamics_linearization(
|
|
1045
|
+
x_bar=np.asarray(data.x_bar),
|
|
1046
|
+
u_bar=np.asarray(data.u_bar),
|
|
1047
|
+
A_d=np.asarray(data.A_d),
|
|
1048
|
+
B_d=np.asarray(data.B_d),
|
|
1049
|
+
C_d=np.asarray(data.C_d),
|
|
1050
|
+
x_prop=np.asarray(data.x_prop),
|
|
1051
|
+
x_prop_plus=x_prop_plus,
|
|
1052
|
+
D_d=D_d,
|
|
1053
|
+
E_d=E_d,
|
|
1054
|
+
)
|
|
1055
|
+
nodal = _unstack_nodal(data, jax_constraints)
|
|
1056
|
+
cross_node = _unstack_cross(data, jax_constraints)
|
|
1057
|
+
self.update_constraint_linearizations(
|
|
1058
|
+
nodal=nodal or None,
|
|
1059
|
+
cross_node=cross_node or None,
|
|
1060
|
+
)
|
|
1061
|
+
self.update_penalties(
|
|
1062
|
+
lam_prox=np.asarray(data.lam_prox),
|
|
1063
|
+
lam_cost=np.asarray(data.lam_cost),
|
|
1064
|
+
lam_vc=np.asarray(data.lam_vc),
|
|
1065
|
+
lam_vb_nodal=np.asarray(data.lam_vb_nodal),
|
|
1066
|
+
lam_vb_cross=np.asarray(data.lam_vb_cross),
|
|
1067
|
+
)
|
|
1068
|
+
self.update_boundary_conditions(
|
|
1069
|
+
x_init=_unmask_bc(data.x_init),
|
|
1070
|
+
x_term=_unmask_bc(data.x_term),
|
|
1071
|
+
)
|
|
1072
|
+
|
|
1073
|
+
result = self.solve()
|
|
1074
|
+
return SubproblemSolution(
|
|
1075
|
+
x=jnp.asarray(result.x, dtype=f),
|
|
1076
|
+
u=jnp.asarray(result.u, dtype=f),
|
|
1077
|
+
nu=jnp.asarray(result.nu, dtype=f),
|
|
1078
|
+
# nu_vb collapses from PTRSolveResult's list-of-(N,) layout to
|
|
1079
|
+
# the (N, n_nodal) stacked array SubproblemSolution declares
|
|
1080
|
+
# for pure_callback's ShapeDtypeStruct contract.
|
|
1081
|
+
nu_vb=(
|
|
1082
|
+
jnp.zeros((N, 0), dtype=f)
|
|
1083
|
+
if n_nodal == 0
|
|
1084
|
+
else jnp.asarray(
|
|
1085
|
+
np.stack([np.asarray(a) for a in result.nu_vb], axis=-1),
|
|
1086
|
+
dtype=f,
|
|
1087
|
+
)
|
|
1088
|
+
),
|
|
1089
|
+
nu_vb_cross=jnp.asarray(
|
|
1090
|
+
np.asarray(result.nu_vb_cross, dtype=float).reshape(n_cross),
|
|
1091
|
+
dtype=f,
|
|
1092
|
+
),
|
|
1093
|
+
cost=jnp.asarray(result.cost, dtype=f),
|
|
1094
|
+
status_code=jnp.asarray(int(status_str_to_code(result.status)), dtype=jnp.int32),
|
|
1095
|
+
)
|
|
1096
|
+
|
|
1097
|
+
def step(state, data: SubproblemData) -> SubproblemSolution:
|
|
1098
|
+
del state # CVXPy exposes no warm-start through ``update_*``.
|
|
1099
|
+
return jax.pure_callback(
|
|
1100
|
+
host_solve,
|
|
1101
|
+
result_struct,
|
|
1102
|
+
data,
|
|
1103
|
+
vmap_method="sequential",
|
|
1104
|
+
)
|
|
1105
|
+
|
|
1106
|
+
return step
|
|
1107
|
+
|
|
882
1108
|
def citation(self) -> List[str]:
|
|
883
1109
|
"""Return BibTeX citations for CVXPy.
|
|
884
1110
|
|