openscvx 0.5.3.dev18__tar.gz → 0.5.3.dev20__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openscvx-0.5.3.dev18/openscvx.egg-info → openscvx-0.5.3.dev20}/PKG-INFO +1 -1
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UnderTheHood/batching_jit_grad.md +75 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/brachistochrone_batched.py +40 -11
- openscvx-0.5.3.dev20/examples/abstract/flappy_bird.py +929 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/franka_fr3v2_pick_place.py +30 -2
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/franka_fr3v2_viewplanning.py +75 -27
- openscvx-0.5.3.dev20/examples/arm/franka_fr3v2_viewplanning_nodal.py +584 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_waypoint_stl.py +12 -9
- openscvx-0.5.3.dev20/examples/drone/2d_obstacle_avoidance_batched_ic.py +326 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/cinema_vp.py +10 -1
- openscvx-0.5.3.dev20/examples/drone/cinema_vp_nodal.py +285 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/dr_vp.py +7 -2
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/dr_vp_nodal.py +8 -5
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/drone_racing.py +5 -0
- openscvx-0.5.3.dev20/examples/drone/drone_racing_batched_gates.py +414 -0
- openscvx-0.5.3.dev20/examples/drone/logo_utils/openscvx_logo_single.svg +1 -0
- openscvx-0.5.3.dev20/examples/drone/logo_utils/quadrotor_mesh.py +188 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/logo_utils/svg_path_utils.py +30 -5
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/obstacle_avoidance.py +5 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/obstacle_avoidance_vmap.py +15 -6
- openscvx-0.5.3.dev20/examples/drone/obstacle_avoidance_vmap_2d.py +426 -0
- openscvx-0.5.3.dev20/examples/drone/openscvx_logo.py +527 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/skydio_x2_mjx.py +5 -1
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/triple_cartpole_3d_mjx.py +297 -92
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/triple_cartpole_mjx.py +299 -115
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/plotting.py +606 -256
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/plotting_viser.py +770 -156
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +4 -17
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/rocket/6DoF_pdg.py +94 -1
- openscvx-0.5.3.dev20/examples/rocket/6DoF_pdg_batched_ic.py +434 -0
- openscvx-0.5.3.dev20/examples/spacecraft/relative_loitering.py +964 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/_version.py +3 -3
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/base.py +42 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/scvx/iteration.py +1 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/scvx/penalized_trust_region.py +35 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/base.py +16 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/__init__.py +16 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/plotting.py +165 -75
- openscvx-0.5.3.dev20/openscvx/plotting/publication.py +658 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/scp_iteration.py +182 -67
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/__init__.py +2 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/animated.py +223 -42
- openscvx-0.5.3.dev20/openscvx/plotting/viser/coordinates.py +20 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/problem.py +536 -9
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/propagation/post_processing.py +26 -20
- openscvx-0.5.3.dev20/openscvx/solvers/cones.py +100 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/cvxpy_ptr_solver.py +12 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/moreau_ptr_solver.py +254 -32
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/ptr_solver.py +189 -1
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/qpax_ptr_solver.py +104 -35
- openscvx-0.5.3.dev20/openscvx/symbolic/affine.py +162 -0
- openscvx-0.5.3.dev20/openscvx/symbolic/canonicalize.py +247 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/caching.py +142 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/printing.py +81 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/SOURCES.txt +18 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/_iteration_callback_helpers.py +1 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_iteration_callback_cvxpy.py +1 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_iteration_callback_vmap.py +1 -1
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_moreau_ptr_solver.py +58 -6
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_qpax_ptr_solver.py +5 -5
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_subproblem_pytree.py +1 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_examples.py +1 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_plotting.py +68 -0
- openscvx-0.5.3.dev20/tests/test_solve_batched_brachistochrone.py +71 -0
- openscvx-0.5.3.dev20/tests/test_solve_batched_cvxpy_export_errors.py +38 -0
- openscvx-0.5.3.dev20/tests/test_solve_batched_export_roundtrip.py +123 -0
- openscvx-0.5.3.dev18/examples/spacecraft/relative_loitering.py +0 -458
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/docs.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/lint.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/release.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.gitignore +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.gitmodules +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/CONTRIBUTING.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/LICENSE +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/README.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/08_mpcc.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/favicon.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/viser-client/index.html +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/citation.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/examples.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/index.md +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/versions.json +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/_viser_embed_export.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/hypersensitive.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/stl_or.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/_camera.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/_render.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/_sensor_view.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/logo.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/logo.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/spacecraft/let_transfer.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/video_preview.png +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/assets/stylesheets/home-hero.css +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/home.html +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/main.html +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-hero.html +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/mkdocs.yml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/__main__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/scvx/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/weights.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/config.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/expert/byof.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/expert/validation.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/init/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrations/base.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrations/mjx.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrators/diffrax.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/loader.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/base.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/stljax.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/cache.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/utils.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/pyproject.toml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/setup.cfg +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/_marks.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/_iteration_helpers.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/test_iteration_fn_jit.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/test_iteration_fn_parity.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/test_make_solve_loop.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/conftest.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/expr/test_gmsr.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/integrations/test_mjx.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/integrations/test_mjx_dynamics.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_iteration_callback_moreau.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_iteration_callback_qpax.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_stl.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_autotuning.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_discretization.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_expert.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_impulsive.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_init.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_integrators.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_loader.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_optimization_results.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_propagation.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_solve_jax_bare_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_solve_jax_jit_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_solve_jax_vmap_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_solve_jax_vmap_converged_no_drift.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.5.3.
|
|
3
|
+
Version: 0.5.3.dev20
|
|
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
|
|
@@ -49,6 +49,81 @@ Python loop) are exactly the failure class the two-method design exists to
|
|
|
49
49
|
prevent. See `plans/jax-pure-solve.md`'s Decision Log for the longer
|
|
50
50
|
discussion.
|
|
51
51
|
|
|
52
|
+
## Batched, disk-cached solves with `solve_batched()`
|
|
53
|
+
|
|
54
|
+
`jax.vmap(solve_jax)` and `solve_batched()` both run `B` SCP solves over
|
|
55
|
+
stacked boundary conditions; they differ in **who owns the batch axis**, and
|
|
56
|
+
that one difference is the whole point.
|
|
57
|
+
|
|
58
|
+
* `jax.vmap(solve_jax)` — *the caller* owns the axis. Maximally idiomatic,
|
|
59
|
+
composes with `grad` / `scan`, but **in-process JIT only**: `jax.export` has
|
|
60
|
+
no outer `vmap` rule (`call_exported` cannot be batched), so an exported
|
|
61
|
+
artifact can never be re-vmapped, and every fresh process re-traces and
|
|
62
|
+
re-compiles the entire loop.
|
|
63
|
+
* `solve_batched(x0_stack, xf_stack)` — *the library* owns the axis. The vmap
|
|
64
|
+
is applied **inside** the method, before any export, so the whole loop lowers
|
|
65
|
+
to ordinary batched XLA ops and serializes cleanly. Under
|
|
66
|
+
`save_compiled=True` it is written to the solver cache on the first run and
|
|
67
|
+
deserialized on later processes — skipping the XLA compile that
|
|
68
|
+
`jax.vmap(solve_jax)` pays on every launch.
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
problem = ox.Problem(..., solver={"backend": "qpax"})
|
|
72
|
+
problem.settings.sim.save_compiled = True
|
|
73
|
+
problem.initialize()
|
|
74
|
+
|
|
75
|
+
# First process: traces, exports, writes <cache>/compiled_solve_batched_<hash>.jax
|
|
76
|
+
# Later processes: deserialize-and-.call, no compile.
|
|
77
|
+
batched = problem.solve_batched(x0_stack, xf_stack, params)
|
|
78
|
+
# batched.x.shape == (B, N, n_states) — same pytree jax.vmap(solve_jax) returns.
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Pick `solve_batched` when **cross-process cold-start dominates** — short-lived
|
|
82
|
+
processes (CI sweeps, notebook restarts, deployed workers) that otherwise pay
|
|
83
|
+
the compile every launch. Pick `jax.vmap(solve_jax)` for everything in-program,
|
|
84
|
+
where you own the transforms and want `grad` / `scan` composition. With
|
|
85
|
+
`save_compiled=False`, `solve_batched` is just an in-process batched wrapper and
|
|
86
|
+
the two produce identical results.
|
|
87
|
+
|
|
88
|
+
The exported artifact is closed and deployable, not composable: it is the
|
|
89
|
+
`call_exported`-has-no-outer-`vmap`-rule wall again. Use `solve_jax` for
|
|
90
|
+
user-driven `jax.vmap` / `jax.grad`; `solve_batched` for a cached batched solve.
|
|
91
|
+
|
|
92
|
+
### CVXPy cannot be exported
|
|
93
|
+
|
|
94
|
+
Export requires every op in the loop — the backend solve included — to lower to
|
|
95
|
+
serializable XLA. CVXPy's `iteration_callback` is a `jax.pure_callback`, and
|
|
96
|
+
`jax.export` cannot serialize host callbacks. So `PTRSolver.exportable` is
|
|
97
|
+
`False` for CVXPy (and `True` for QPAX / Moreau), and
|
|
98
|
+
`solve_batched(save_compiled=True)` on the CVXPy backend **raises a teaching
|
|
99
|
+
error** pointing at QPAX / Moreau rather than silently degrading to an uncached
|
|
100
|
+
in-process solve. With `save_compiled=False`, CVXPy still runs `B` sequential
|
|
101
|
+
in-process solves.
|
|
102
|
+
|
|
103
|
+
### Cache invalidation is correctness, not just freshness
|
|
104
|
+
|
|
105
|
+
The exported loop closes over far more than the symbolic problem does. Caching
|
|
106
|
+
on the symbolic hash alone would silently deserialize a **stale artifact** when
|
|
107
|
+
any of that extra state changes — a wrong-answer bug, not a cache miss. So
|
|
108
|
+
`get_solve_batched_cache_path` (`openscvx/utils/caching.py`) extends the
|
|
109
|
+
symbolic hash with everything additionally baked into the loop, each runtime
|
|
110
|
+
object contributing through its own `_hash_into` (the same protocol the symbolic
|
|
111
|
+
layer uses):
|
|
112
|
+
|
|
113
|
+
* the convex backend class + its `solver_args`,
|
|
114
|
+
* the algorithm + autotuner + convergence thresholds + initial weights,
|
|
115
|
+
* the discretizer scheme (class + hold type + ODE solver),
|
|
116
|
+
* the state/control scaling matrices `inv_S_x` / `inv_S_u`,
|
|
117
|
+
* the fixed batch size `B` (the artifact is exported at one `B`), and
|
|
118
|
+
* the JAX version (exported artifacts are not guaranteed to survive an
|
|
119
|
+
incompatible jax bump).
|
|
120
|
+
|
|
121
|
+
Change any of these — backend, a tolerance, `k_max`, a state bound — and you get
|
|
122
|
+
a different cache path, so a stale artifact is never reused.
|
|
123
|
+
|
|
124
|
+
`examples/abstract/brachistochrone_batched.py` shows both paths side by side;
|
|
125
|
+
re-running it is itself the cross-process demo.
|
|
126
|
+
|
|
52
127
|
## What `solve_jax()` returns
|
|
53
128
|
|
|
54
129
|
`solve_jax()` returns the same `OptimizationResults` type as `solve()`,
|
|
@@ -1,20 +1,30 @@
|
|
|
1
|
-
"""Batched brachistochrone
|
|
1
|
+
"""Batched brachistochrone — two ways to solve four problems at once.
|
|
2
2
|
|
|
3
3
|
Solves four brachistochrone problems in parallel — each with a different
|
|
4
|
-
starting x-coordinate —
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
starting x-coordinate — and contrasts the two batching entry points:
|
|
5
|
+
|
|
6
|
+
* ``jax.vmap(problem.solve_jax)`` — the caller owns the batch axis. Maximally
|
|
7
|
+
idiomatic, composes with ``grad`` / ``scan``, but in-process JIT only: every
|
|
8
|
+
fresh process re-traces and re-compiles the whole SCP loop.
|
|
9
|
+
* ``problem.solve_batched(x0_stack, xf_stack)`` — the library owns the batch
|
|
10
|
+
axis, so the whole vmapped loop is a single function that ``jax.export`` can
|
|
11
|
+
serialize. Under ``save_compiled=True`` it is written to the solver cache on
|
|
12
|
+
the first run and deserialized on later runs, skipping that compile. Reach
|
|
13
|
+
for it when cross-process cold-start dominates (CI sweeps, short-lived
|
|
14
|
+
workers); reach for ``jax.vmap(solve_jax)`` when you stay inside one program.
|
|
15
|
+
|
|
16
|
+
Run with ``python examples/abstract/brachistochrone_batched.py``. Re-running is
|
|
17
|
+
itself the cross-process demo: the second invocation deserializes the cached
|
|
18
|
+
``solve_batched`` artifact instead of compiling it.
|
|
11
19
|
|
|
12
20
|
Notes:
|
|
13
21
|
|
|
14
22
|
* Under the QPAX backend used here, vmap'd subproblem solves run in
|
|
15
23
|
parallel (no host callback). The CVXPy backend is single-threaded under
|
|
16
24
|
vmap because :func:`jax.pure_callback` uses ``vmap_method="sequential"``
|
|
17
|
-
for thread safety — see :meth:`solve_jax`'s docstring.
|
|
25
|
+
for thread safety — see :meth:`solve_jax`'s docstring. That same host
|
|
26
|
+
callback is why ``solve_batched(save_compiled=True)`` refuses CVXPy: it
|
|
27
|
+
cannot be exported.
|
|
18
28
|
* The Moreau warm-start is bypassed on the JAX-pure path (its carry is
|
|
19
29
|
host-side state that ``lax.while_loop`` doesn't thread). Use QPAX or
|
|
20
30
|
CVXPy when you want batched solves.
|
|
@@ -113,14 +123,33 @@ if __name__ == "__main__":
|
|
|
113
123
|
shifts = jnp.array([0.0, 0.3, 0.6, 0.9])
|
|
114
124
|
x_initial_stack = jnp.stack([default_pin.at[0].set(default_pin[0] + s) for s in shifts])
|
|
115
125
|
|
|
116
|
-
#
|
|
126
|
+
# --- caller owns the batch axis: jax.vmap(solve_jax) ---------------------
|
|
127
|
+
# Bare ``jax.vmap`` — composes like any JAX transform, in-process only.
|
|
117
128
|
batched_solve = jax.vmap(problem.solve_jax, in_axes=(0, None, None))
|
|
118
129
|
results = batched_solve(x_initial_stack, None, None)
|
|
119
130
|
|
|
120
131
|
# ``results`` is a batched ``OptimizationResults`` pytree — every child
|
|
121
132
|
# (``X``, ``U``, ``t_final``, ``converged``, ...) has a leading batch axis.
|
|
122
|
-
print(f"
|
|
133
|
+
print(f"jax.vmap(solve_jax) over {x_initial_stack.shape[0]} initial conditions:")
|
|
123
134
|
print(f" result.x.shape: {results.x.shape}")
|
|
124
135
|
print(f" result.u.shape: {results.u.shape}")
|
|
125
136
|
print(f" result.t_final: {np.asarray(results.t_final).reshape(-1)}")
|
|
126
137
|
print(f" result.converged: {np.asarray(results.converged)}")
|
|
138
|
+
|
|
139
|
+
# --- library owns the batch axis: solve_batched, disk-cached -------------
|
|
140
|
+
# The same batched solve, but ``solve_batched`` owns the vmap so the whole
|
|
141
|
+
# loop is one exportable artifact. Under ``save_compiled=True`` it lands in
|
|
142
|
+
# the solver cache on the first run; re-run this script (a fresh process) to
|
|
143
|
+
# see it deserialized instead of recompiled. ``xf`` is shared across the
|
|
144
|
+
# batch, so broadcast the default terminal pin to the same leading axis.
|
|
145
|
+
export_problem = build_problem()
|
|
146
|
+
export_problem.settings.sim.save_compiled = True
|
|
147
|
+
export_problem.initialize()
|
|
148
|
+
|
|
149
|
+
x_term_stack = jnp.broadcast_to(export_problem.state.x_term_pin, x_initial_stack.shape)
|
|
150
|
+
batched = export_problem.solve_batched(x_initial_stack, x_term_stack)
|
|
151
|
+
|
|
152
|
+
print(f"\nsolve_batched (save_compiled=True) over {x_initial_stack.shape[0]} ICs:")
|
|
153
|
+
print(f" result.x.shape: {batched.x.shape}")
|
|
154
|
+
print(f" result.t_final: {np.asarray(batched.t_final).reshape(-1)}")
|
|
155
|
+
print(f" result.converged: {np.asarray(batched.converged)}")
|