openscvx 0.5.2.dev13__tar.gz → 0.5.2.dev14__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.dev13/openscvx.egg-info → openscvx-0.5.2.dev14}/PKG-INFO +1 -1
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/_version.py +3 -3
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/base.py +97 -6
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/moreau_ptr_solver.py +58 -7
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/qpax_ptr_solver.py +26 -7
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/solvers/test_moreau_ptr_solver.py +75 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/solvers/test_qpax_ptr_solver.py +71 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/assets/logo.svg +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/release-drafter.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/docs.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/lint.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/release.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.gitignore +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.gitmodules +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/CONTRIBUTING.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/LICENSE +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/README.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/08_mpcc.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/favicon.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/logo.svg +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/viser-client/index.html +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/citation.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/examples.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/index.md +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/versions.json +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/_viser_embed_export.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/hypersensitive.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/stl_or.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/_camera.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/_render.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/_sensor_view.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/logo.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_waypoint_stl.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/logo.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/logo_utils/svg_path_utils.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/skydio_x2_mjx.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/triple_cartpole_mjx.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/plotting.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/plotting_viser.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/rocket/6DoF_pdg.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/spacecraft/let_transfer.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/video_preview.png +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/assets/stylesheets/home-hero.css +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/home.html +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/main.html +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-hero.html +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/mkdocs.yml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/__main__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/scvx/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/weights.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/config.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/base.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/expert/byof.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/expert/validation.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/init/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrations/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrations/base.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrations/mjx.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrators/diffrax.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/loader.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/problem.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/stljax.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/cache.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/caching.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/printing.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/utils.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/SOURCES.txt +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/pyproject.toml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/setup.cfg +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/_marks.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/conftest.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/expr/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/expr/test_gmsr.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/integrations/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/integrations/test_mjx.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/integrations/test_mjx_dynamics.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/solvers/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_stl.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_autotuning.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_discretization.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_examples.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_expert.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_impulsive.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_init.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_integrators.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_loader.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_optimization_results.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_plotting.py +0 -0
- {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/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.dev14
|
|
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.dev14'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 5, 2, 'dev14')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g78ea9d746'
|
|
@@ -281,9 +281,24 @@ class PTRSolverSpec(BaseModel):
|
|
|
281
281
|
or ``"moreau"``
|
|
282
282
|
(:class:`openscvx.solvers.moreau_ptr_solver.MoreauPTRSolver`).
|
|
283
283
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
284
|
+
Backend-specific fields mirror the constructor parameters of each class.
|
|
285
|
+
Fields that don't belong to the active backend are a configuration error
|
|
286
|
+
and raise ``ValidationError``.
|
|
287
|
+
|
|
288
|
+
CVXPy-only:
|
|
289
|
+
``cvx_solver``, ``cvxpygen``, ``cvxpygen_override``.
|
|
290
|
+
|
|
291
|
+
QPAX-only:
|
|
292
|
+
``solver_tol``.
|
|
293
|
+
|
|
294
|
+
Moreau-only:
|
|
295
|
+
``verbose``, ``device``, ``tol_gap_abs``, ``tol_feas``.
|
|
296
|
+
|
|
297
|
+
Shared between QPAX and Moreau:
|
|
298
|
+
``max_iter``.
|
|
299
|
+
|
|
300
|
+
All backends:
|
|
301
|
+
``solver_args`` (escape hatch for settings not covered by named fields).
|
|
287
302
|
|
|
288
303
|
!!! warning
|
|
289
304
|
Enabling ``cvxpygen`` currently disables sparse parameter declarations.
|
|
@@ -294,11 +309,27 @@ class PTRSolverSpec(BaseModel):
|
|
|
294
309
|
|
|
295
310
|
type: Literal["PTRSolver"] = "PTRSolver"
|
|
296
311
|
backend: Literal["cvxpy", "qpax", "moreau"] = "cvxpy"
|
|
312
|
+
|
|
313
|
+
# CVXPy-only
|
|
297
314
|
cvx_solver: Optional[str] = None
|
|
298
|
-
solver_args: Optional[Dict[str, Any]] = None
|
|
299
315
|
cvxpygen: bool = False
|
|
300
316
|
cvxpygen_override: bool = False
|
|
301
317
|
|
|
318
|
+
# QPAX-specific
|
|
319
|
+
solver_tol: Optional[float] = None
|
|
320
|
+
|
|
321
|
+
# Shared between QPAX and Moreau
|
|
322
|
+
max_iter: Optional[int] = None
|
|
323
|
+
|
|
324
|
+
# Moreau-specific
|
|
325
|
+
verbose: Optional[bool] = None
|
|
326
|
+
device: Optional[str] = None
|
|
327
|
+
tol_gap_abs: Optional[float] = None
|
|
328
|
+
tol_feas: Optional[float] = None
|
|
329
|
+
|
|
330
|
+
# Escape hatch for all backends
|
|
331
|
+
solver_args: Optional[Dict[str, Any]] = None
|
|
332
|
+
|
|
302
333
|
model_config = ConfigDict(extra="forbid")
|
|
303
334
|
|
|
304
335
|
@model_validator(mode="after")
|
|
@@ -318,6 +349,45 @@ class PTRSolverSpec(BaseModel):
|
|
|
318
349
|
f"{offenders} only valid for backend='cvxpy'; "
|
|
319
350
|
"remove these fields or set backend='cvxpy'."
|
|
320
351
|
)
|
|
352
|
+
if self.backend == "cvxpy":
|
|
353
|
+
offenders = [
|
|
354
|
+
name
|
|
355
|
+
for name, value in (
|
|
356
|
+
("solver_tol", self.solver_tol),
|
|
357
|
+
("max_iter", self.max_iter),
|
|
358
|
+
("verbose", self.verbose),
|
|
359
|
+
("device", self.device),
|
|
360
|
+
("tol_gap_abs", self.tol_gap_abs),
|
|
361
|
+
("tol_feas", self.tol_feas),
|
|
362
|
+
)
|
|
363
|
+
if value is not None
|
|
364
|
+
]
|
|
365
|
+
if offenders:
|
|
366
|
+
raise ValueError(
|
|
367
|
+
f"{offenders} not valid for backend='cvxpy'; pass these "
|
|
368
|
+
"via solver_args or switch to the qpax / moreau backend."
|
|
369
|
+
)
|
|
370
|
+
if self.backend == "qpax":
|
|
371
|
+
offenders = [
|
|
372
|
+
name
|
|
373
|
+
for name, value in (
|
|
374
|
+
("verbose", self.verbose),
|
|
375
|
+
("device", self.device),
|
|
376
|
+
("tol_gap_abs", self.tol_gap_abs),
|
|
377
|
+
("tol_feas", self.tol_feas),
|
|
378
|
+
)
|
|
379
|
+
if value is not None
|
|
380
|
+
]
|
|
381
|
+
if offenders:
|
|
382
|
+
raise ValueError(
|
|
383
|
+
f"{offenders} only valid for backend='moreau'; "
|
|
384
|
+
"remove these fields or set backend='moreau'."
|
|
385
|
+
)
|
|
386
|
+
if self.backend == "moreau" and self.solver_tol is not None:
|
|
387
|
+
raise ValueError(
|
|
388
|
+
"solver_tol is only valid for backend='qpax'; "
|
|
389
|
+
"remove this field or set backend='qpax'."
|
|
390
|
+
)
|
|
321
391
|
return self
|
|
322
392
|
|
|
323
393
|
def build(self) -> ConvexSolver:
|
|
@@ -335,10 +405,31 @@ class PTRSolverSpec(BaseModel):
|
|
|
335
405
|
if self.backend == "moreau":
|
|
336
406
|
from .moreau_ptr_solver import MoreauPTRSolver
|
|
337
407
|
|
|
338
|
-
|
|
408
|
+
kwargs: Dict[str, Any] = {}
|
|
409
|
+
if self.max_iter is not None:
|
|
410
|
+
kwargs["max_iter"] = self.max_iter
|
|
411
|
+
if self.verbose is not None:
|
|
412
|
+
kwargs["verbose"] = self.verbose
|
|
413
|
+
if self.device is not None:
|
|
414
|
+
kwargs["device"] = self.device
|
|
415
|
+
if self.tol_gap_abs is not None:
|
|
416
|
+
kwargs["tol_gap_abs"] = self.tol_gap_abs
|
|
417
|
+
if self.tol_feas is not None:
|
|
418
|
+
kwargs["tol_feas"] = self.tol_feas
|
|
419
|
+
if self.solver_args is not None:
|
|
420
|
+
kwargs["solver_args"] = self.solver_args
|
|
421
|
+
return MoreauPTRSolver(**kwargs)
|
|
422
|
+
|
|
339
423
|
from .qpax_ptr_solver import QPAXPTRSolver
|
|
340
424
|
|
|
341
|
-
|
|
425
|
+
kwargs = {}
|
|
426
|
+
if self.solver_tol is not None:
|
|
427
|
+
kwargs["solver_tol"] = self.solver_tol
|
|
428
|
+
if self.max_iter is not None:
|
|
429
|
+
kwargs["max_iter"] = self.max_iter
|
|
430
|
+
if self.solver_args is not None:
|
|
431
|
+
kwargs["solver_args"] = self.solver_args
|
|
432
|
+
return QPAXPTRSolver(**kwargs)
|
|
342
433
|
|
|
343
434
|
|
|
344
435
|
def __getattr__(name: str):
|
|
@@ -241,24 +241,75 @@ class MoreauPTRSolver(PTRSolver):
|
|
|
241
241
|
through a full SCvx solve.
|
|
242
242
|
|
|
243
243
|
Args:
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
244
|
+
max_iter: Maximum number of IPM iterations forwarded to
|
|
245
|
+
:class:`moreau.Settings`. Defaults to ``200``.
|
|
246
|
+
verbose: Whether Moreau prints per-iteration diagnostics.
|
|
247
|
+
Forwarded to :class:`moreau.Settings`. Defaults to ``False``.
|
|
248
|
+
device: Compute device for Moreau's JAX kernels. One of
|
|
249
|
+
``"auto"``, ``"cpu"``, or ``"cuda"``. Forwarded to
|
|
250
|
+
:class:`moreau.Settings`. Defaults to ``"auto"``.
|
|
251
|
+
tol_gap_abs: Absolute duality-gap tolerance forwarded to
|
|
252
|
+
:class:`moreau.IPMSettings`. ``None`` uses Moreau's default.
|
|
253
|
+
tol_feas: Primal/dual feasibility tolerance forwarded to
|
|
254
|
+
:class:`moreau.IPMSettings`. ``None`` uses Moreau's default.
|
|
255
|
+
solver_args: Additional keyword arguments forwarded verbatim to
|
|
256
|
+
:class:`moreau.Settings`. Use for settings not covered by the
|
|
257
|
+
named params above. ``solver_args["ipm_settings"]`` may be a
|
|
258
|
+
dict or a :class:`moreau.IPMSettings` object; if it is a dict,
|
|
259
|
+
``tol_gap_abs`` / ``tol_feas`` are merged into it. Raises
|
|
260
|
+
``ValueError`` at construction time if any top-level key or
|
|
261
|
+
IPM tolerance overlaps with a named param.
|
|
249
262
|
|
|
250
263
|
Attributes:
|
|
251
264
|
layout: :class:`_ConicLayout` describing flat decision-vector slot
|
|
252
265
|
ranges. Populated by :meth:`create_variables`.
|
|
253
266
|
"""
|
|
254
267
|
|
|
255
|
-
def __init__(
|
|
268
|
+
def __init__(
|
|
269
|
+
self,
|
|
270
|
+
*,
|
|
271
|
+
max_iter: int = 200,
|
|
272
|
+
verbose: bool = False,
|
|
273
|
+
device: str = "auto",
|
|
274
|
+
tol_gap_abs: Optional[float] = None,
|
|
275
|
+
tol_feas: Optional[float] = None,
|
|
276
|
+
solver_args: Optional[Dict] = None,
|
|
277
|
+
):
|
|
256
278
|
if not _MOREAU_AVAILABLE:
|
|
257
279
|
raise ImportError(
|
|
258
280
|
"MoreauPTRSolver requires the `moreau` package. "
|
|
259
281
|
"Install it with: pip install openscvx[moreau]"
|
|
260
282
|
)
|
|
261
|
-
|
|
283
|
+
|
|
284
|
+
_named = {"max_iter": max_iter, "verbose": verbose, "device": device}
|
|
285
|
+
_extra = dict(solver_args) if solver_args else {}
|
|
286
|
+
_overlap = _named.keys() & _extra.keys()
|
|
287
|
+
if _overlap:
|
|
288
|
+
raise ValueError(
|
|
289
|
+
f"Moreau settings {sorted(_overlap)} appear as both named arguments "
|
|
290
|
+
"and inside solver_args; use one or the other."
|
|
291
|
+
)
|
|
292
|
+
merged = {**_named, **_extra}
|
|
293
|
+
|
|
294
|
+
_ipm = {
|
|
295
|
+
k: v for k, v in [("tol_gap_abs", tol_gap_abs), ("tol_feas", tol_feas)] if v is not None
|
|
296
|
+
}
|
|
297
|
+
if _ipm:
|
|
298
|
+
existing_ipm = merged.get("ipm_settings", {})
|
|
299
|
+
if not isinstance(existing_ipm, dict):
|
|
300
|
+
raise ValueError(
|
|
301
|
+
"Cannot combine tol_gap_abs / tol_feas named arguments with an "
|
|
302
|
+
"ipm_settings object in solver_args; use one form or the other."
|
|
303
|
+
)
|
|
304
|
+
ipm_overlap = _ipm.keys() & existing_ipm.keys()
|
|
305
|
+
if ipm_overlap:
|
|
306
|
+
raise ValueError(
|
|
307
|
+
f"Moreau IPM settings {sorted(ipm_overlap)} appear as both named "
|
|
308
|
+
"arguments and inside solver_args['ipm_settings']; use one or the other."
|
|
309
|
+
)
|
|
310
|
+
merged["ipm_settings"] = {**_ipm, **existing_ipm}
|
|
311
|
+
|
|
312
|
+
self.solver_args = merged
|
|
262
313
|
|
|
263
314
|
self.layout: Optional[_ConicLayout] = None
|
|
264
315
|
self._S_x: Optional[np.ndarray] = None
|
|
@@ -177,25 +177,44 @@ class QPAXPTRSolver(PTRSolver):
|
|
|
177
177
|
what lets ``jax.grad`` / ``jax.vmap`` reach through a full SCvx solve.
|
|
178
178
|
|
|
179
179
|
Args:
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
180
|
+
solver_tol: Convergence tolerance forwarded to ``qpax.solve_qp``
|
|
181
|
+
as ``solver_tol``. Defaults to ``1e-5``.
|
|
182
|
+
max_iter: Maximum number of PDIP iterations forwarded to
|
|
183
|
+
``qpax.solve_qp`` as ``max_iter``. Defaults to ``30``.
|
|
184
|
+
solver_args: Additional keyword arguments forwarded verbatim to
|
|
185
|
+
``qpax.solve_qp``. Use for settings not covered by the named
|
|
186
|
+
params above — e.g. ``backend="e"`` for the explicit
|
|
187
|
+
predictor-corrector path, or ``linear_solver``. Raises
|
|
188
|
+
``ValueError`` at construction time if any key overlaps with a
|
|
189
|
+
named param.
|
|
185
190
|
|
|
186
191
|
Attributes:
|
|
187
192
|
layout: ``_QPLayout`` describing the flat decision-vector slot ranges.
|
|
188
193
|
Populated by :meth:`create_variables`.
|
|
189
194
|
"""
|
|
190
195
|
|
|
191
|
-
def __init__(
|
|
196
|
+
def __init__(
|
|
197
|
+
self,
|
|
198
|
+
*,
|
|
199
|
+
solver_tol: float = 1e-5,
|
|
200
|
+
max_iter: int = 30,
|
|
201
|
+
solver_args: Optional[dict] = None,
|
|
202
|
+
):
|
|
192
203
|
if not _QPAX_AVAILABLE:
|
|
193
204
|
raise ImportError(
|
|
194
205
|
"QPAXPTRSolver requires the `qpax` package. "
|
|
195
206
|
"Install it with: pip install openscvx[qpax]"
|
|
196
207
|
)
|
|
197
208
|
|
|
198
|
-
|
|
209
|
+
_named = {"solver_tol": solver_tol, "max_iter": max_iter}
|
|
210
|
+
_extra = dict(solver_args) if solver_args else {}
|
|
211
|
+
_overlap = _named.keys() & _extra.keys()
|
|
212
|
+
if _overlap:
|
|
213
|
+
raise ValueError(
|
|
214
|
+
f"QPAX settings {sorted(_overlap)} appear as both named arguments "
|
|
215
|
+
"and inside solver_args; use one or the other."
|
|
216
|
+
)
|
|
217
|
+
self.solver_args = {**_named, **_extra}
|
|
199
218
|
|
|
200
219
|
# Populated by create_variables / initialize.
|
|
201
220
|
self.layout: Optional[_QPLayout] = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.5.2.
|
|
3
|
+
Version: 0.5.2.dev14
|
|
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
|
|
@@ -122,6 +122,81 @@ def test_moreau_spec_build_returns_moreau_solver():
|
|
|
122
122
|
assert isinstance(solver, MoreauPTRSolver)
|
|
123
123
|
|
|
124
124
|
|
|
125
|
+
def test_moreau_named_params_populate_solver_args():
|
|
126
|
+
"""Named constructor params should be merged into solver_args so
|
|
127
|
+
_build_moreau_settings picks them up unchanged."""
|
|
128
|
+
solver = MoreauPTRSolver(max_iter=500, verbose=True, device="cpu")
|
|
129
|
+
assert solver.solver_args["max_iter"] == 500
|
|
130
|
+
assert solver.solver_args["verbose"] is True
|
|
131
|
+
assert solver.solver_args["device"] == "cpu"
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def test_moreau_ipm_tolerances_nest_into_ipm_settings():
|
|
135
|
+
"""tol_gap_abs and tol_feas should be folded into solver_args['ipm_settings']
|
|
136
|
+
so _build_moreau_settings receives them in the expected nested location."""
|
|
137
|
+
solver = MoreauPTRSolver(tol_gap_abs=1e-10, tol_feas=1e-10)
|
|
138
|
+
assert solver.solver_args["ipm_settings"] == {"tol_gap_abs": 1e-10, "tol_feas": 1e-10}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def test_moreau_ipm_tolerances_merge_with_solver_args_ipm_settings():
|
|
142
|
+
"""Named IPM tolerance params should merge with a dict inside solver_args
|
|
143
|
+
rather than silently overwriting it."""
|
|
144
|
+
solver = MoreauPTRSolver(
|
|
145
|
+
tol_gap_abs=1e-10,
|
|
146
|
+
solver_args={"ipm_settings": {"tol_feas": 1e-9}},
|
|
147
|
+
)
|
|
148
|
+
assert solver.solver_args["ipm_settings"]["tol_gap_abs"] == 1e-10
|
|
149
|
+
assert solver.solver_args["ipm_settings"]["tol_feas"] == 1e-9
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def test_moreau_named_param_overlap_with_solver_args_raises():
|
|
153
|
+
"""Passing the same top-level key as a named arg and inside solver_args
|
|
154
|
+
should raise immediately."""
|
|
155
|
+
with pytest.raises(ValueError, match="max_iter"):
|
|
156
|
+
MoreauPTRSolver(max_iter=200, solver_args={"max_iter": 100})
|
|
157
|
+
|
|
158
|
+
with pytest.raises(ValueError, match="device"):
|
|
159
|
+
MoreauPTRSolver(device="cpu", solver_args={"device": "cuda"})
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def test_moreau_ipm_overlap_with_solver_args_ipm_settings_raises():
|
|
163
|
+
"""A named IPM tolerance and the same key inside solver_args['ipm_settings']
|
|
164
|
+
is a user error and should raise."""
|
|
165
|
+
with pytest.raises(ValueError, match="tol_gap_abs"):
|
|
166
|
+
MoreauPTRSolver(
|
|
167
|
+
tol_gap_abs=1e-10,
|
|
168
|
+
solver_args={"ipm_settings": {"tol_gap_abs": 1e-8}},
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def test_moreau_spec_named_fields_build_correctly():
|
|
173
|
+
"""PTRSolverSpec with Moreau named fields should build a MoreauPTRSolver
|
|
174
|
+
with the right solver_args."""
|
|
175
|
+
from openscvx.solvers import resolve_solver_config
|
|
176
|
+
|
|
177
|
+
spec = resolve_solver_config(
|
|
178
|
+
{
|
|
179
|
+
"backend": "moreau",
|
|
180
|
+
"max_iter": 300,
|
|
181
|
+
"device": "cpu",
|
|
182
|
+
"tol_gap_abs": 1e-10,
|
|
183
|
+
}
|
|
184
|
+
)
|
|
185
|
+
solver = spec.build()
|
|
186
|
+
assert isinstance(solver, MoreauPTRSolver)
|
|
187
|
+
assert solver.solver_args["max_iter"] == 300
|
|
188
|
+
assert solver.solver_args["device"] == "cpu"
|
|
189
|
+
assert solver.solver_args["ipm_settings"]["tol_gap_abs"] == 1e-10
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def test_moreau_spec_rejects_qpax_only_fields():
|
|
193
|
+
"""solver_tol (QPAX-only) must not be accepted under backend='moreau'."""
|
|
194
|
+
from openscvx.solvers import resolve_solver_config
|
|
195
|
+
|
|
196
|
+
with pytest.raises(ValueError, match="solver_tol"):
|
|
197
|
+
resolve_solver_config({"backend": "moreau", "solver_tol": 1e-8})
|
|
198
|
+
|
|
199
|
+
|
|
125
200
|
# ============================================================================
|
|
126
201
|
# Unsupported-feature rejection tests
|
|
127
202
|
# ============================================================================
|
|
@@ -109,6 +109,77 @@ def test_qpax_spec_rejects_cvxpy_only_fields():
|
|
|
109
109
|
resolve_solver_config({"backend": "qpax", "cvx_solver": "CLARABEL"})
|
|
110
110
|
|
|
111
111
|
|
|
112
|
+
def test_qpax_named_params_populate_solver_args():
|
|
113
|
+
"""Named constructor params should be merged into solver_args so the
|
|
114
|
+
existing qpax.solve_qp(**self.solver_args) dispatch picks them up."""
|
|
115
|
+
solver = QPAXPTRSolver(solver_tol=1e-8, max_iter=50)
|
|
116
|
+
assert solver.solver_args["solver_tol"] == 1e-8
|
|
117
|
+
assert solver.solver_args["max_iter"] == 50
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def test_qpax_named_param_overlap_with_solver_args_raises():
|
|
121
|
+
"""Passing the same key as a named arg and inside solver_args is a user
|
|
122
|
+
error — the constructor should raise immediately rather than silently
|
|
123
|
+
discarding one value."""
|
|
124
|
+
with pytest.raises(ValueError, match="solver_tol"):
|
|
125
|
+
QPAXPTRSolver(solver_tol=1e-8, solver_args={"solver_tol": 1e-7})
|
|
126
|
+
|
|
127
|
+
with pytest.raises(ValueError, match="max_iter"):
|
|
128
|
+
QPAXPTRSolver(max_iter=50, solver_args={"max_iter": 100})
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def test_qpax_solver_args_escape_hatch():
|
|
132
|
+
"""Keys not covered by named params (e.g. backend='e') should pass
|
|
133
|
+
through the solver_args escape hatch unchanged."""
|
|
134
|
+
solver = QPAXPTRSolver(solver_tol=1e-6, solver_args={"backend": "e"})
|
|
135
|
+
assert solver.solver_args["backend"] == "e"
|
|
136
|
+
assert solver.solver_args["solver_tol"] == 1e-6
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_qpax_spec_named_fields_build_correctly():
|
|
140
|
+
"""PTRSolverSpec with QPAX named fields should build a QPAXPTRSolver
|
|
141
|
+
with the right solver_args."""
|
|
142
|
+
from openscvx.solvers import QPAXPTRSolver, resolve_solver_config
|
|
143
|
+
|
|
144
|
+
spec = resolve_solver_config({"backend": "qpax", "solver_tol": 1e-8, "max_iter": 75})
|
|
145
|
+
solver = spec.build()
|
|
146
|
+
assert isinstance(solver, QPAXPTRSolver)
|
|
147
|
+
assert solver.solver_args["solver_tol"] == 1e-8
|
|
148
|
+
assert solver.solver_args["max_iter"] == 75
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def test_qpax_spec_rejects_moreau_only_fields():
|
|
152
|
+
"""Moreau-specific fields (verbose, device, tol_gap_abs, tol_feas) must
|
|
153
|
+
not be accepted under backend='qpax'."""
|
|
154
|
+
from openscvx.solvers import resolve_solver_config
|
|
155
|
+
|
|
156
|
+
with pytest.raises(ValueError, match="only valid for backend='moreau'"):
|
|
157
|
+
resolve_solver_config({"backend": "qpax", "verbose": True})
|
|
158
|
+
|
|
159
|
+
with pytest.raises(ValueError, match="only valid for backend='moreau'"):
|
|
160
|
+
resolve_solver_config({"backend": "qpax", "tol_gap_abs": 1e-10})
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def test_qpax_spec_rejects_solver_tol_under_moreau():
|
|
164
|
+
"""solver_tol must not be accepted under backend='moreau'."""
|
|
165
|
+
from openscvx.solvers import resolve_solver_config
|
|
166
|
+
|
|
167
|
+
with pytest.raises(ValueError, match="solver_tol"):
|
|
168
|
+
resolve_solver_config({"backend": "moreau", "solver_tol": 1e-8})
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def test_cvxpy_spec_rejects_jax_backend_fields():
|
|
172
|
+
"""QPAX/Moreau named fields (solver_tol, max_iter, verbose, device, …)
|
|
173
|
+
must not be accepted under backend='cvxpy'."""
|
|
174
|
+
from openscvx.solvers import resolve_solver_config
|
|
175
|
+
|
|
176
|
+
with pytest.raises(ValueError, match="not valid for backend='cvxpy'"):
|
|
177
|
+
resolve_solver_config({"backend": "cvxpy", "solver_tol": 1e-8})
|
|
178
|
+
|
|
179
|
+
with pytest.raises(ValueError, match="not valid for backend='cvxpy'"):
|
|
180
|
+
resolve_solver_config({"backend": "cvxpy", "max_iter": 100})
|
|
181
|
+
|
|
182
|
+
|
|
112
183
|
# ============================================================================
|
|
113
184
|
# Unsupported-feature rejection tests
|
|
114
185
|
# ============================================================================
|
|
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.dev13 → openscvx-0.5.2.dev14}/docs/UnderTheHood/vectorization_and_vmapping.md
RENAMED
|
File without changes
|
|
File without changes
|
{openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/01_hello_world_brachistochrone.md
RENAMED
|
File without changes
|
{openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/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.dev13 → openscvx-0.5.2.dev14}/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.dev13 → openscvx-0.5.2.dev14}/examples/animations/franka_fr3v2_pick_place.py
RENAMED
|
File without changes
|
|
File without changes
|
{openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/obstacle_avoidance_vmap.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|