openscvx 0.5.2.dev11__tar.gz → 0.5.2.dev12__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.2.dev11/openscvx.egg-info → openscvx-0.5.2.dev12}/PKG-INFO +1 -1
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/_version.py +3 -3
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/qpax_ptr_solver.py +16 -1
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/solvers/test_qpax_ptr_solver.py +34 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_brachistochrone.py +138 -17
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/assets/logo.svg +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/release-drafter.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/docs.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/lint.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/release.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.gitignore +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.gitmodules +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/CONTRIBUTING.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/LICENSE +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/README.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/08_mpcc.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/favicon.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/logo.svg +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/viser-client/index.html +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/citation.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/examples.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/index.md +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/versions.json +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/_viser_embed_export.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/hypersensitive.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/stl_or.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/_camera.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/_render.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/_sensor_view.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/logo.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_waypoint_stl.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/logo.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/logo_utils/svg_path_utils.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/skydio_x2_mjx.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/triple_cartpole_mjx.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/plotting.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/plotting_viser.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/rocket/6DoF_pdg.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/spacecraft/let_transfer.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/video_preview.png +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/assets/stylesheets/home-hero.css +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/home.html +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/main.html +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-hero.html +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/mkdocs.yml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/__main__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/scvx/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/weights.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/config.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/expert/byof.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/expert/validation.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/init/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrations/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrations/base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrations/mjx.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrators/diffrax.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/loader.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/problem.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/base.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/moreau_ptr_solver.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/stljax.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/cache.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/caching.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/printing.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/utils.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/SOURCES.txt +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/pyproject.toml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/setup.cfg +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/_marks.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/conftest.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/expr/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/expr/test_gmsr.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/integrations/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/integrations/test_mjx.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/integrations/test_mjx_dynamics.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/solvers/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/solvers/test_moreau_ptr_solver.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_stl.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_autotuning.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_discretization.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_examples.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_expert.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_impulsive.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_init.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_integrators.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_loader.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_optimization_results.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_plotting.py +0 -0
- {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_propagation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.5.2.
|
|
3
|
+
Version: 0.5.2.dev12
|
|
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.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 5, 2, '
|
|
21
|
+
__version__ = version = '0.5.2.dev12'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 5, 2, 'dev12')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'ga71a6db14'
|
|
@@ -672,6 +672,20 @@ class QPAXPTRSolver(PTRSolver):
|
|
|
672
672
|
self._last_iters = int(np.asarray(iters))
|
|
673
673
|
self._last_converged = bool(np.asarray(converged))
|
|
674
674
|
|
|
675
|
+
# Silent NaN unpacking poisons the next SCP linearization and the
|
|
676
|
+
# outer loop has no status gate. Fail at the boundary instead.
|
|
677
|
+
primal_finite = bool(np.all(np.isfinite(z)))
|
|
678
|
+
if not self._last_converged or not primal_finite:
|
|
679
|
+
dtype = str(Q_j.dtype)
|
|
680
|
+
raise RuntimeError(
|
|
681
|
+
f"qpax.solve_qp failed to converge (iters={self._last_iters}, "
|
|
682
|
+
f"converged={self._last_converged}, primal finite={primal_finite}). "
|
|
683
|
+
f"JAX dtype was {dtype}; if this is float32, pass "
|
|
684
|
+
f"float_dtype='float64' to Problem(...). Otherwise tighten "
|
|
685
|
+
f"solver_args (e.g. solver_tol=1e-8, max_iter=200) or switch "
|
|
686
|
+
f"to CVXPyPTRSolver to triage."
|
|
687
|
+
)
|
|
688
|
+
|
|
675
689
|
return self._unpack(z)
|
|
676
690
|
|
|
677
691
|
def _unpack(self, z: np.ndarray) -> PTRSolveResult:
|
|
@@ -691,7 +705,8 @@ class QPAXPTRSolver(PTRSolver):
|
|
|
691
705
|
|
|
692
706
|
cost = self._reconstruct_cost(z)
|
|
693
707
|
|
|
694
|
-
|
|
708
|
+
# solve() raises on non-convergence before reaching _unpack.
|
|
709
|
+
status = "optimal"
|
|
695
710
|
|
|
696
711
|
return PTRSolveResult(
|
|
697
712
|
x=x,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.5.2.
|
|
3
|
+
Version: 0.5.2.dev12
|
|
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
|
|
@@ -236,3 +236,37 @@ def test_qpax_solve_returns_PTRSolveResult():
|
|
|
236
236
|
assert res.x.shape[0] == 5
|
|
237
237
|
assert res.u.shape[0] == 5
|
|
238
238
|
assert res.status in {"optimal", "infeasible"}
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
# ============================================================================
|
|
242
|
+
# Convergence-failure guard
|
|
243
|
+
# ============================================================================
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def test_qpax_solve_raises_on_nonconvergence(monkeypatch):
|
|
247
|
+
"""When ``qpax.solve_qp`` returns ``converged=False`` (typical under
|
|
248
|
+
float32 ill-conditioning) the backend must raise rather than unpack a
|
|
249
|
+
NaN-filled primal. Without the guard the next SCP linearization point
|
|
250
|
+
is NaN-poisoned and every subsequent iteration produces garbage. The
|
|
251
|
+
end-to-end coverage in ``tests/test_brachistochrone.py::test_backend_float32_raises``
|
|
252
|
+
exercises the same path through the SCvx loop; this unit test pins the
|
|
253
|
+
behavior at the solver boundary directly."""
|
|
254
|
+
import jax.numpy as jnp
|
|
255
|
+
|
|
256
|
+
import openscvx.solvers.qpax_ptr_solver as mod
|
|
257
|
+
|
|
258
|
+
prob = _make_double_integrator_problem(n=5, backend="qpax", k_max=1)
|
|
259
|
+
prob.settings.dev.printing = False
|
|
260
|
+
prob.initialize()
|
|
261
|
+
|
|
262
|
+
n_z = prob.solver.layout.n_z
|
|
263
|
+
nan_z = jnp.full((n_z,), jnp.nan)
|
|
264
|
+
|
|
265
|
+
def fake_solve_qp(Q, q, A, b, G, h, **kwargs):
|
|
266
|
+
del Q, q, A, b, G, h, kwargs
|
|
267
|
+
return nan_z, nan_z, nan_z, nan_z, jnp.bool_(False), jnp.int32(5)
|
|
268
|
+
|
|
269
|
+
monkeypatch.setattr(mod.qpax, "solve_qp", fake_solve_qp)
|
|
270
|
+
|
|
271
|
+
with pytest.raises(RuntimeError, match=r"qpax\.solve_qp failed"):
|
|
272
|
+
prob.solver.solve()
|
|
@@ -318,14 +318,21 @@ def test_monolithic():
|
|
|
318
318
|
jax.clear_caches()
|
|
319
319
|
|
|
320
320
|
|
|
321
|
+
@pytest.mark.parametrize("with_parameters", [False, True], ids=["literal-g", "param-g"])
|
|
322
|
+
@pytest.mark.parametrize("constraint_type", ["ctcs", "nodal"])
|
|
321
323
|
@pytest.mark.parametrize("backend", ["cvxpy", "qpax", "moreau"])
|
|
322
|
-
def test_backend(backend):
|
|
323
|
-
"""End-to-end brachistochrone with each PTRSolver backend
|
|
324
|
-
|
|
324
|
+
def test_backend(backend, constraint_type, with_parameters):
|
|
325
|
+
"""End-to-end brachistochrone with each PTRSolver backend, across
|
|
326
|
+
constraint formulations (CTCS box vs nodal) and parameter usage
|
|
327
|
+
(gravity baked in vs ``ox.Parameter``).
|
|
328
|
+
|
|
329
|
+
The matrix exists so the JAX-side backends (QPAX, Moreau) are exercised
|
|
330
|
+
on the same shapes the drone examples use — nodal constraints and
|
|
331
|
+
``ox.Parameter`` — not only the easy CTCS-with-literal-constants case.
|
|
325
332
|
Compares against the analytical cycloid; the same accuracy thresholds
|
|
326
333
|
apply regardless of backend (each backend assembles the same convex
|
|
327
|
-
subproblem, so SCP convergence should land on the same minimizer to
|
|
328
|
-
the backends' inner solver tolerances)."""
|
|
334
|
+
subproblem, so SCP convergence should land on the same minimizer to
|
|
335
|
+
within the backends' inner solver tolerances)."""
|
|
329
336
|
import jax.numpy as jnp
|
|
330
337
|
|
|
331
338
|
import openscvx as ox
|
|
@@ -355,12 +362,27 @@ def test_backend(backend):
|
|
|
355
362
|
u.min = np.array([0.0])
|
|
356
363
|
u.guess = np.linspace(5 * jnp.pi / 180, 100.5 * jnp.pi / 180, n).reshape(-1, 1)
|
|
357
364
|
|
|
365
|
+
# Gravity enters the v-dynamics either as a literal or as an ``ox.Parameter``.
|
|
366
|
+
# The Parameter path mirrors ``test_parameters`` — we only test the Earth
|
|
367
|
+
# value here; the Moon-gravity reset path is orthogonal to this regression.
|
|
368
|
+
if with_parameters:
|
|
369
|
+
g_sym = ox.Parameter("g", value=g)
|
|
370
|
+
else:
|
|
371
|
+
g_sym = g
|
|
372
|
+
|
|
358
373
|
x_dot = x[2] * ox.Sin(u[0])
|
|
359
374
|
y_dot = -x[2] * ox.Cos(u[0])
|
|
360
|
-
v_dot =
|
|
375
|
+
v_dot = g_sym * ox.Cos(u[0])
|
|
361
376
|
dyn_expr = ox.Concat(x_dot, y_dot, v_dot)
|
|
362
377
|
|
|
363
|
-
|
|
378
|
+
# CTCS wraps the box as LICQ-style absolute-value rows; nodal enforces
|
|
379
|
+
# the inequality at each node directly. Both produce the same minimizer
|
|
380
|
+
# on this problem, but they exercise different assembly paths on the
|
|
381
|
+
# JAX-side backends.
|
|
382
|
+
if constraint_type == "ctcs":
|
|
383
|
+
constraint_exprs = [ox.ctcs(x <= x.max), ox.ctcs(x.min <= x)]
|
|
384
|
+
else: # nodal
|
|
385
|
+
constraint_exprs = [x <= x.max, x.min <= x]
|
|
364
386
|
|
|
365
387
|
time = ox.Time(
|
|
366
388
|
initial=0.0,
|
|
@@ -380,10 +402,11 @@ def test_backend(backend):
|
|
|
380
402
|
licq_max=1e-8,
|
|
381
403
|
algorithm={"lam_prox": 1e0, "lam_cost": 1e-1, "lam_vc": 1e0},
|
|
382
404
|
solver={"backend": backend},
|
|
383
|
-
# QPAX
|
|
384
|
-
# condition number aggressively. The CVXPy backend goes
|
|
385
|
-
# QOCO's own float64 path and isn't affected — but pinning
|
|
386
|
-
# for
|
|
405
|
+
# QPAX / Moreau consume the global JAX dtype, so float32 caps the
|
|
406
|
+
# QP's condition number aggressively. The CVXPy backend goes
|
|
407
|
+
# through QOCO's own float64 path and isn't affected — but pinning
|
|
408
|
+
# float64 for all backends keeps the test apples-to-apples. The
|
|
409
|
+
# float32 failure mode is covered by ``test_backend_float32_raises``.
|
|
387
410
|
float_dtype="float64",
|
|
388
411
|
)
|
|
389
412
|
|
|
@@ -398,7 +421,9 @@ def test_backend(backend):
|
|
|
398
421
|
result = problem.solve()
|
|
399
422
|
result = problem.post_process()
|
|
400
423
|
|
|
401
|
-
assert result["converged"],
|
|
424
|
+
assert result["converged"], (
|
|
425
|
+
f"{backend} / {constraint_type} / with_parameters={with_parameters} failed to converge"
|
|
426
|
+
)
|
|
402
427
|
|
|
403
428
|
position = result.trajectory["x"][:, :2]
|
|
404
429
|
velocity = result.trajectory["x"][:, 2:3]
|
|
@@ -407,16 +432,112 @@ def test_backend(backend):
|
|
|
407
432
|
result.t_full, position, velocity, x0, y0, x1, y1, g
|
|
408
433
|
)
|
|
409
434
|
|
|
410
|
-
_print_comparison_metrics(
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
435
|
+
_print_comparison_metrics(
|
|
436
|
+
comparison,
|
|
437
|
+
f"Brachistochrone ({backend}, {constraint_type}, "
|
|
438
|
+
f"{'param-g' if with_parameters else 'literal-g'})",
|
|
439
|
+
)
|
|
440
|
+
# QPAX / Moreau reassemble matrices as JAX arrays each iteration; the
|
|
441
|
+
# per-process JIT compilation cache means the first iteration's compile
|
|
442
|
+
# cost dominates under parallel test execution. Nodal constraints add a
|
|
443
|
+
# few extra slots (nu_vb / s_pos per nodal group) on top of that.
|
|
444
|
+
if backend in ("qpax", "moreau"):
|
|
445
|
+
solve_budget = 4.5 if constraint_type == "nodal" else 3.5
|
|
446
|
+
else:
|
|
447
|
+
solve_budget = 1.2
|
|
415
448
|
_assert_brachistochrone_accuracy(comparison, problem, result, solve_budget=solve_budget)
|
|
416
449
|
|
|
417
450
|
jax.clear_caches()
|
|
418
451
|
|
|
419
452
|
|
|
453
|
+
def test_backend_float32_raises():
|
|
454
|
+
"""QPAX should raise — not silently return NaN — when ``qpax.solve_qp``
|
|
455
|
+
fails to converge.
|
|
456
|
+
|
|
457
|
+
Regression for the drone-example NaN bug: with ``float_dtype='float32'``
|
|
458
|
+
the QP's condition number outruns the precision available to qpax's PDIP
|
|
459
|
+
inner loop, and ``solve_qp`` returns ``converged=False`` with a NaN-filled
|
|
460
|
+
primal. Without the guard in :meth:`QPAXPTRSolver.solve`, the SCP loop
|
|
461
|
+
would consume that NaN as the next linearization point and propagate it
|
|
462
|
+
through every subsequent iteration. The guard turns that into an
|
|
463
|
+
actionable :class:`RuntimeError`.
|
|
464
|
+
|
|
465
|
+
Brachistochrone happens to be well-conditioned enough that float32 alone
|
|
466
|
+
does not force a failure, so the test additionally tightens
|
|
467
|
+
``solver_tol`` past what float32 can resolve and caps ``max_iter`` low
|
|
468
|
+
— both push qpax into a guaranteed ``converged=False`` exit on iter 1."""
|
|
469
|
+
import jax.numpy as jnp
|
|
470
|
+
|
|
471
|
+
import openscvx as ox
|
|
472
|
+
from openscvx import Problem
|
|
473
|
+
|
|
474
|
+
pytest.importorskip("qpax")
|
|
475
|
+
|
|
476
|
+
n = 2
|
|
477
|
+
total_time = 2.0
|
|
478
|
+
g = 9.81
|
|
479
|
+
x0, y0 = 0.0, 10.0
|
|
480
|
+
x1, y1 = 10.0, 5.0
|
|
481
|
+
|
|
482
|
+
x = ox.State("x", shape=(3,))
|
|
483
|
+
x.max = np.array([10.0, 10.0, 10.0])
|
|
484
|
+
x.min = np.array([0.0, 0.0, 0.0])
|
|
485
|
+
x.initial = np.array([x0, y0, 0.0])
|
|
486
|
+
x.final = [x1, y1, ("free", 10.0)]
|
|
487
|
+
|
|
488
|
+
u = ox.Control("u", shape=(1,))
|
|
489
|
+
u.max = np.array([100.5 * jnp.pi / 180])
|
|
490
|
+
u.min = np.array([0.0])
|
|
491
|
+
u.guess = np.linspace(5 * jnp.pi / 180, 100.5 * jnp.pi / 180, n).reshape(-1, 1)
|
|
492
|
+
|
|
493
|
+
x_dot = x[2] * ox.Sin(u[0])
|
|
494
|
+
y_dot = -x[2] * ox.Cos(u[0])
|
|
495
|
+
v_dot = g * ox.Cos(u[0])
|
|
496
|
+
dyn_expr = ox.Concat(x_dot, y_dot, v_dot)
|
|
497
|
+
|
|
498
|
+
constraint_exprs = [ox.ctcs(x <= x.max), ox.ctcs(x.min <= x)]
|
|
499
|
+
|
|
500
|
+
time = ox.Time(
|
|
501
|
+
initial=0.0,
|
|
502
|
+
final=("minimize", total_time),
|
|
503
|
+
min=0.0,
|
|
504
|
+
max=total_time,
|
|
505
|
+
uniform_time_grid=True,
|
|
506
|
+
)
|
|
507
|
+
|
|
508
|
+
problem = Problem(
|
|
509
|
+
dynamics={"x": dyn_expr},
|
|
510
|
+
states=[x],
|
|
511
|
+
controls=[u],
|
|
512
|
+
time=time,
|
|
513
|
+
constraints=constraint_exprs,
|
|
514
|
+
N=n,
|
|
515
|
+
licq_max=1e-8,
|
|
516
|
+
algorithm={"lam_prox": 1e0, "lam_cost": 1e-1, "lam_vc": 1e0},
|
|
517
|
+
solver={
|
|
518
|
+
"backend": "qpax",
|
|
519
|
+
"solver_args": {"solver_tol": 1e-12, "max_iter": 5},
|
|
520
|
+
},
|
|
521
|
+
float_dtype="float32",
|
|
522
|
+
)
|
|
523
|
+
|
|
524
|
+
problem.settings.prp.dt = 0.01
|
|
525
|
+
problem.settings.sim.save_compiled = False
|
|
526
|
+
if hasattr(problem.settings, "dev"):
|
|
527
|
+
problem.settings.dev.printing = False
|
|
528
|
+
|
|
529
|
+
# ``initialize()`` itself triggers a first subproblem solve via
|
|
530
|
+
# ``PenalizedTrustRegion.initialize`` (penalized_trust_region.py:343),
|
|
531
|
+
# so the guard fires there before ``solve()`` is even reached. Wrap
|
|
532
|
+
# both calls in the same context — whichever raises first is the one
|
|
533
|
+
# we care about.
|
|
534
|
+
with pytest.raises(RuntimeError, match=r"qpax\.solve_qp failed"):
|
|
535
|
+
problem.initialize()
|
|
536
|
+
problem.solve()
|
|
537
|
+
|
|
538
|
+
jax.clear_caches()
|
|
539
|
+
|
|
540
|
+
|
|
420
541
|
@pytest.mark.parametrize("constraint_type", ["ctcs", "nodal", "convex", "over", "at"])
|
|
421
542
|
def test_constraint_types(constraint_type):
|
|
422
543
|
"""
|
|
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.2.dev11 → openscvx-0.5.2.dev12}/docs/UnderTheHood/vectorization_and_vmapping.md
RENAMED
|
File without changes
|
|
File without changes
|
{openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/01_hello_world_brachistochrone.md
RENAMED
|
File without changes
|
{openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/02_drone_racing_constraints.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/viser-recordings/drone_racing.viser
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/franka_fr3v2_pick_place.py
RENAMED
|
File without changes
|
|
File without changes
|
{openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/obstacle_avoidance_vmap.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_obstacle_conditional.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/double_integrator_drone_racing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/obstacle_avoidance_realtime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|