openscvx 0.5.3.dev22__tar.gz → 0.5.3.dev24__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.dev22/openscvx.egg-info → openscvx-0.5.3.dev24}/PKG-INFO +1 -1
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UnderTheHood/batching_jit_grad.md +130 -10
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/abstract/brachistochrone_batched.py +17 -5
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/rocket/6DoF_pdg_batched_ic.py +8 -9
- openscvx-0.5.3.dev24/examples/rocket/ascent_launch_vehicle.py +616 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/_version.py +3 -3
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/__init__.py +2 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +9 -3
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/autotuner/augmented_lagrangian.py +26 -9
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/autotuner/constant_proximal_weight.py +9 -3
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +9 -3
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/base.py +179 -12
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/optimization_results.py +6 -6
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/scvx/iteration.py +15 -20
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/scvx/penalized_trust_region.py +17 -20
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/problem.py +597 -262
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/utils/caching.py +13 -9
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx.egg-info/SOURCES.txt +2 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/algorithms/autotuner/test_update_weights_jit.py +28 -9
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/algorithms/test_algorithm_state_pytree.py +16 -2
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/algorithms/test_iteration_fn_jit.py +11 -5
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/algorithms/test_make_solve_loop.py +4 -2
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/_iteration_callback_helpers.py +4 -1
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_autotuning.py +35 -14
- openscvx-0.5.3.dev24/tests/test_solve_batched_brachistochrone.py +439 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_solve_batched_export_roundtrip.py +27 -9
- openscvx-0.5.3.dev24/tests/test_solve_batched_inference.py +340 -0
- openscvx-0.5.3.dev22/tests/test_solve_batched_brachistochrone.py +0 -71
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/workflows/docs.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/workflows/lint.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/workflows/release.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.gitignore +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/.gitmodules +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/CONTRIBUTING.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/LICENSE +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/README.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/08_mpcc.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/favicon.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/viser-client/index.html +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/citation.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/examples.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/index.md +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/docs/versions.json +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/_viser_embed_export.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/abstract/flappy_bird.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/abstract/hypersensitive.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/abstract/stl_or.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/animations/_camera.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/animations/_render.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/animations/_sensor_view.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/animations/logo.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/arm/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/arm/franka_fr3v2_viewplanning_nodal.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/car/dubins_car.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/car/dubins_car_waypoint_stl.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/2d_obstacle_avoidance_batched_ic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/cinema_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/drone_racing_batched_gates.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/logo.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/logo_utils/openscvx_logo_single.svg +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/logo_utils/quadrotor_mesh.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/logo_utils/svg_path_utils.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/obstacle_avoidance_vmap_2d.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/drone/openscvx_logo.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mjx/skydio_x2_mjx.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mjx/triple_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/plotting.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/plotting_viser.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/rocket/6DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/spacecraft/let_transfer.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/examples/spacecraft/relative_loitering.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/figures/video_preview.png +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/assets/stylesheets/home-hero.css +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/home.html +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/main.html +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/partials/home-hero.html +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/mkdocs.yml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/__main__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/scvx/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/algorithms/weights.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/config.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/discretization/base.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/expert/byof.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/expert/validation.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/init/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/integrations/base.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/integrations/mjx.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/integrators/diffrax.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/loader.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/publication.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/viser/coordinates.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/solvers/base.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/solvers/cones.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/solvers/moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/solvers/qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/affine.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/canonicalize.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/stljax.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/utils/cache.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/utils/printing.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx/utils/utils.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/pyproject.toml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/setup.cfg +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/_marks.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/algorithms/_iteration_helpers.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/algorithms/test_iteration_fn_parity.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/conftest.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/expr/test_gmsr.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/integrations/test_mjx.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/integrations/test_mjx_dynamics.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/test_iteration_callback_cvxpy.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/test_iteration_callback_moreau.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/test_iteration_callback_qpax.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/test_iteration_callback_vmap.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/test_moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/test_qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/solvers/test_subproblem_pytree.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_stl.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_discretization.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_examples.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_expert.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_impulsive.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_init.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_integrators.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_loader.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_optimization_results.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_plotting.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_propagation.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_solve_batched_cvxpy_export_errors.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_solve_jax_bare_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_solve_jax_jit_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/tests/test_solve_jax_vmap_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev22 → openscvx-0.5.3.dev24}/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.dev24
|
|
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
|
|
@@ -60,7 +60,7 @@ that one difference is the whole point.
|
|
|
60
60
|
no outer `vmap` rule (`call_exported` cannot be batched), so an exported
|
|
61
61
|
artifact can never be re-vmapped, and every fresh process re-traces and
|
|
62
62
|
re-compiles the entire loop.
|
|
63
|
-
* `solve_batched(
|
|
63
|
+
* `solve_batched(x_initial=x0_batch)` — *the library* owns the axis. The vmap
|
|
64
64
|
is applied **inside** the method, before any export, so the whole loop lowers
|
|
65
65
|
to ordinary batched XLA ops and serializes cleanly. Under
|
|
66
66
|
`save_compiled=True` it is written to the solver cache on the first run and
|
|
@@ -74,10 +74,119 @@ problem.initialize()
|
|
|
74
74
|
|
|
75
75
|
# First process: traces, exports, writes <cache>/compiled_solve_batched_<hash>.jax
|
|
76
76
|
# Later processes: deserialize-and-.call, no compile.
|
|
77
|
-
batched = problem.solve_batched(
|
|
77
|
+
batched = problem.solve_batched(x_initial=x0_batch, parameters=params)
|
|
78
78
|
# batched.x.shape == (B, N, n_states) — same pytree jax.vmap(solve_jax) returns.
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
+
### One rule: add a leading batch axis to whatever varies
|
|
82
|
+
|
|
83
|
+
`solve_batched` takes exactly `solve_jax`'s arguments. Every batchable input
|
|
84
|
+
has a *declared* (unbatched) shape the library knows — `(n_x,)` for the
|
|
85
|
+
boundary pins, `(N, n_x)` / `(N, n_u)` for the trajectory guesses, the
|
|
86
|
+
parameter's stored shape for each parameter, and `()` for the SCP
|
|
87
|
+
hyperparameters. An argument that matches its declared shape is **shared** by
|
|
88
|
+
every batch element; one with exactly one extra leading axis is **batched**
|
|
89
|
+
along it. Rank against the declared shape decides — never the leading-axis
|
|
90
|
+
value — so a shared `(B, n)` matrix parameter is never misread as batched.
|
|
91
|
+
(`B` in these shape patterns is plain notation for the batch size, not
|
|
92
|
+
syntax: it is never passed anywhere — like `jax.vmap`, the library reads it
|
|
93
|
+
off the leading axis of whatever you batched and cross-checks that all
|
|
94
|
+
batched inputs agree.)
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
results = problem.solve_batched(
|
|
98
|
+
x_initial=x0_batch, # (B, n_x): rank = declared+1 -> batched
|
|
99
|
+
parameters={
|
|
100
|
+
"gate_center": centers, # (B, 3) vs declared (3,) -> batched
|
|
101
|
+
"gate_radius": 0.5, # declared shape -> shared
|
|
102
|
+
},
|
|
103
|
+
)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
For the rare entry the rank rule cannot express — e.g. batching a declared
|
|
107
|
+
rank-1 parameter element-wise — pass an explicit `in_axes` in `jax.vmap`'s
|
|
108
|
+
vocabulary, including its prefix semantics (`0` = batched along the leading
|
|
109
|
+
axis, `None` = shared; a prefix applies to everything below it; partial specs
|
|
110
|
+
fall back to the rank rule):
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
results = problem.solve_batched(
|
|
114
|
+
parameters={"weights": w}, # (B,) is also w's declared shape...
|
|
115
|
+
in_axes={"parameters": {"weights": 0}}, # ...so say "batched" explicitly
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
results = problem.solve_batched(parameters=params, in_axes={"parameters": 0})
|
|
119
|
+
# prefix: every passed parameter is batched, exactly like jax.vmap's
|
|
120
|
+
# pytree-prefix in_axes; a bare in_axes=0 batches every passed input.
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
One deliberate divergence from `jax.vmap`: the *default* is "infer by rank",
|
|
124
|
+
not `0`-everything — an all-shared batched solve has no batch axis to find,
|
|
125
|
+
and inference is what makes mixed shared/batched dicts ergonomic.
|
|
126
|
+
|
|
127
|
+
### Hyperparameter sweeps: the `algorithm` dict
|
|
128
|
+
|
|
129
|
+
Solve-time mirrors construction-time: the `Problem` constructor configures
|
|
130
|
+
the SCP algorithm with a dict (`algorithm={"ep_tr": 1e-5, "lam_prox": 1.0}`),
|
|
131
|
+
and the solve methods take the same box with the same names as per-solve,
|
|
132
|
+
batchable inputs. Every `AlgorithmState` field is a runtime input riding the
|
|
133
|
+
state pytree, and the `algorithm` dict reaches any of them by name —
|
|
134
|
+
convergence thresholds (`ep_tr` / `ep_vb` / `ep_vc`), penalty weights
|
|
135
|
+
(`lam_prox` / `lam_vc` / `lam_cost`), the seed iterate, autotuner
|
|
136
|
+
hyperparameters. There is no whitelist: the field declaration is the
|
|
137
|
+
registration, and the `AlgorithmState` attribute docs are the reference.
|
|
138
|
+
(`max_iters` survives as a named kwarg — sugar for `algorithm={"k_max":
|
|
139
|
+
...}`; passing both raises, as does an entry that shadows any other named
|
|
140
|
+
kwarg's field. Construction-only keys of the constructor dict — `autotuner`,
|
|
141
|
+
`t_max` — raise pointing back at the constructor.)
|
|
142
|
+
|
|
143
|
+
* On `solve_jax`, each value matches the field's shape, or is a scalar
|
|
144
|
+
broadcast to it: `solve_jax(algorithm={"ep_tr": 1e-6, "lam_prox": 2.0})`
|
|
145
|
+
retraces nothing.
|
|
146
|
+
* On `solve_batched`, each value follows the rank rule against the field's
|
|
147
|
+
shape, plus two **fill** forms for array-shaped fields: a scalar (shared)
|
|
148
|
+
or a `(B,)` vector (one scalar per element, broadcast to the field shape).
|
|
149
|
+
Exact shapes win when both parse; `in_axes={"algorithm": {name: 0}}`
|
|
150
|
+
forces the per-element reading. All against one cached artifact:
|
|
151
|
+
|
|
152
|
+
```python
|
|
153
|
+
B = 8 # batch size. Just an int for building the arrays below — there is no
|
|
154
|
+
# B argument; solve_batched infers it from the leading-axis lengths.
|
|
155
|
+
sweep = problem.solve_batched(algorithm={"ep_tr": jnp.logspace(-6, -3, B)})
|
|
156
|
+
weights = problem.solve_batched(algorithm={"lam_prox": jnp.array([0.5, 1.0, 4.0])})
|
|
157
|
+
budgets = problem.solve_batched(max_iters=jnp.array([5, 10, 20])) # per-element caps
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The batch runs until its slowest element converges or exhausts its own cap;
|
|
161
|
+
finished elements are frozen, not re-iterated, so each element matches the
|
|
162
|
+
corresponding single `solve_jax` run.
|
|
163
|
+
|
|
164
|
+
**New autotuners batch for free.** An autotuner's tunable knobs follow the
|
|
165
|
+
same derivation: declare them as fields on a `HyperParams` subclass — bare
|
|
166
|
+
annotations, no decorator; subclassing applies the frozen-dataclass transform
|
|
167
|
+
and the JAX pytree registration, and the annotation picks the dtype (`int`
|
|
168
|
+
gets the iteration counter's, `float` the problem's) — assign an instance to
|
|
169
|
+
`self.hyper`, and read `state.hyper.<field>` inside `update_weights` (see the
|
|
170
|
+
`AutotuningBase` docstring). The declaration is the registration — each field
|
|
171
|
+
immediately works as a `solve_jax` override, a `solve_batched` sweep target,
|
|
172
|
+
and a runtime input of the exported artifact, with zero edits anywhere else:
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
from openscvx.algorithms import AutotuningBase, HyperParams
|
|
176
|
+
|
|
177
|
+
class MyHyper(HyperParams):
|
|
178
|
+
ramp: float = 2.0
|
|
179
|
+
|
|
180
|
+
class MyAutotuner(AutotuningBase):
|
|
181
|
+
def __init__(self, ramp: float = 2.0):
|
|
182
|
+
self.hyper = MyHyper(ramp=ramp)
|
|
183
|
+
|
|
184
|
+
def update_weights(self, state, ...):
|
|
185
|
+
...state.hyper.ramp...
|
|
186
|
+
|
|
187
|
+
results = problem.solve_batched(algorithm={"ramp": jnp.linspace(1.5, 3.0, B)})
|
|
188
|
+
```
|
|
189
|
+
|
|
81
190
|
Pick `solve_batched` when **cross-process cold-start dominates** — short-lived
|
|
82
191
|
processes (CI sweeps, notebook restarts, deployed workers) that otherwise pay
|
|
83
192
|
the compile every launch. Pick `jax.vmap(solve_jax)` for everything in-program,
|
|
@@ -111,15 +220,21 @@ object contributing through its own `_hash_into` (the same protocol the symbolic
|
|
|
111
220
|
layer uses):
|
|
112
221
|
|
|
113
222
|
* the convex backend class + its `solver_args`,
|
|
114
|
-
* the algorithm + autotuner +
|
|
223
|
+
* the algorithm + autotuner + initial weights,
|
|
115
224
|
* the discretizer scheme (class + hold type + ODE solver),
|
|
116
225
|
* the state/control scaling matrices `inv_S_x` / `inv_S_u`,
|
|
117
|
-
* the fixed batch size `B` (the artifact is exported at one `B`),
|
|
226
|
+
* the fixed batch size `B` (the artifact is exported at one `B`),
|
|
227
|
+
* the per-parameter shared/batched split (baked into the `jax.vmap` program),
|
|
228
|
+
and
|
|
118
229
|
* the JAX version (exported artifacts are not guaranteed to survive an
|
|
119
230
|
incompatible jax bump).
|
|
120
231
|
|
|
121
|
-
Change any of these — backend, a
|
|
122
|
-
a different cache path, so a stale
|
|
232
|
+
Change any of these — backend, a penalty weight, a state bound, which
|
|
233
|
+
parameters are batched — and you get a different cache path, so a stale
|
|
234
|
+
artifact is never reused. Everything the `algorithm` dict can reach — convergence
|
|
235
|
+
thresholds, `max_iters`, weights, autotuner hyperparameters — is deliberately
|
|
236
|
+
*not* in the key: those are runtime inputs on the state pytree, so one
|
|
237
|
+
artifact serves every setting of them.
|
|
123
238
|
|
|
124
239
|
`examples/abstract/brachistochrone_batched.py` shows both paths side by side;
|
|
125
240
|
re-running it is itself the cross-process demo.
|
|
@@ -158,10 +273,15 @@ problem.solve_jax(
|
|
|
158
273
|
parameters=None, # parameters dict for this solve; falls back to
|
|
159
274
|
# ``self._parameters``
|
|
160
275
|
*,
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
# the
|
|
276
|
+
x_guess=None, # (N, n_x) state trajectory warm-start
|
|
277
|
+
u_guess=None, # (N, n_u) control trajectory warm-start
|
|
278
|
+
max_iters=None, # SCP iteration cap; sugar for algorithm={"k_max": ...};
|
|
279
|
+
# falls back to the configured k_max
|
|
280
|
+
algorithm=None, # any AlgorithmState field by name (ep_tr, lam_prox,
|
|
281
|
+
# ...) — the constructor's algorithm-dict names;
|
|
282
|
+
# values match the field shape or fill it from a
|
|
283
|
+
# scalar. Runtime inputs on the state pytree — no
|
|
284
|
+
# value forces a retrace
|
|
165
285
|
)
|
|
166
286
|
```
|
|
167
287
|
|
|
@@ -6,7 +6,7 @@ starting x-coordinate — and contrasts the two batching entry points:
|
|
|
6
6
|
* ``jax.vmap(problem.solve_jax)`` — the caller owns the batch axis. Maximally
|
|
7
7
|
idiomatic, composes with ``grad`` / ``scan``, but in-process JIT only: every
|
|
8
8
|
fresh process re-traces and re-compiles the whole SCP loop.
|
|
9
|
-
* ``problem.solve_batched(
|
|
9
|
+
* ``problem.solve_batched(x_initial=...)`` — the library owns the batch
|
|
10
10
|
axis, so the whole vmapped loop is a single function that ``jax.export`` can
|
|
11
11
|
serialize. Under ``save_compiled=True`` it is written to the solver cache on
|
|
12
12
|
the first run and deserialized on later runs, skipping that compile. Reach
|
|
@@ -140,16 +140,28 @@ if __name__ == "__main__":
|
|
|
140
140
|
# The same batched solve, but ``solve_batched`` owns the vmap so the whole
|
|
141
141
|
# loop is one exportable artifact. Under ``save_compiled=True`` it lands in
|
|
142
142
|
# the solver cache on the first run; re-run this script (a fresh process) to
|
|
143
|
-
# see it deserialized instead of recompiled. ``
|
|
144
|
-
#
|
|
143
|
+
# see it deserialized instead of recompiled. One rule: ``x_initial`` is
|
|
144
|
+
# ``(B, n_x)`` — one extra leading axis — so it is batched; the terminal
|
|
145
|
+
# pin is omitted, so every element shares the default.
|
|
145
146
|
export_problem = build_problem()
|
|
146
147
|
export_problem.settings.sim.save_compiled = True
|
|
147
148
|
export_problem.initialize()
|
|
148
149
|
|
|
149
|
-
|
|
150
|
-
batched = export_problem.solve_batched(x_initial_stack, x_term_stack)
|
|
150
|
+
batched = export_problem.solve_batched(x_initial=x_initial_stack)
|
|
151
151
|
|
|
152
152
|
print(f"\nsolve_batched (save_compiled=True) over {x_initial_stack.shape[0]} ICs:")
|
|
153
153
|
print(f" result.x.shape: {batched.x.shape}")
|
|
154
154
|
print(f" result.t_final: {np.asarray(batched.t_final).reshape(-1)}")
|
|
155
155
|
print(f" result.converged: {np.asarray(batched.converged)}")
|
|
156
|
+
|
|
157
|
+
# Algorithm knobs batch by the same rule, through the `algorithm` dict —
|
|
158
|
+
# the same names as the Problem constructor's algorithm config. ep_tr is
|
|
159
|
+
# a scalar field, so a (B,) vector sweeps the convergence tolerance per
|
|
160
|
+
# element — same artifact, no recompile, since the knobs are runtime
|
|
161
|
+
# inputs on the state pytree. The batch size is never passed: it is read
|
|
162
|
+
# off the array's leading axis (4 tolerances -> B = 4).
|
|
163
|
+
sweep = export_problem.solve_batched(
|
|
164
|
+
algorithm={"ep_tr": jnp.logspace(-4, -1, 4), "ep_vc": 1e-7}
|
|
165
|
+
)
|
|
166
|
+
print(f" ep_tr sweep t_final: {np.asarray(sweep.t_final).reshape(-1)}")
|
|
167
|
+
print(f" ep_tr sweep converged: {np.asarray(sweep.converged)}")
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Runs ``N_BATCH`` SCP solves in parallel, each starting from a different random
|
|
4
4
|
initial position drawn uniformly within the position bounds. Per-batch ICs are
|
|
5
|
-
passed through ``
|
|
5
|
+
passed through ``x_initial``: position is declared ``Fix`` at the symbolic level
|
|
6
6
|
(so the solver consumes ``x_init_pin``), then each batch row overwrites the
|
|
7
7
|
position slice with the sampled values. This avoids the per-iteration
|
|
8
8
|
``(position == parameter).convex()`` constraint while still enforcing the full
|
|
@@ -110,7 +110,7 @@ mass.final = [ox.Maximize(1.5)]
|
|
|
110
110
|
position = ox.State("position", shape=(3,))
|
|
111
111
|
position.max = [10.0, 10.0, 10.0]
|
|
112
112
|
position.min = [-10.0, -10.0, -10.0]
|
|
113
|
-
# Fix so
|
|
113
|
+
# Fix so x_initial pins are consumed; per-batch values overwrite these defaults.
|
|
114
114
|
position.initial = [7.5, 4.5, 2.5]
|
|
115
115
|
position.final = [0.0, ox.Free(0.0), ox.Free(0.0)]
|
|
116
116
|
|
|
@@ -193,7 +193,7 @@ constraint_exprs = []
|
|
|
193
193
|
for st in states:
|
|
194
194
|
constraint_exprs.extend([ox.ctcs(st <= st.max), ox.ctcs(st.min <= st)])
|
|
195
195
|
|
|
196
|
-
# Initial position via
|
|
196
|
+
# Initial position via x_initial pins (Fix BC); terminal lateral via convex constraint.
|
|
197
197
|
constraint_exprs.append((position[1:3] == final_position).convex().at([N - 1]))
|
|
198
198
|
|
|
199
199
|
constraint_exprs.append(ox.ctcs(1.0 * (mass - m_dry) >= 0))
|
|
@@ -414,15 +414,14 @@ if __name__ == "__main__":
|
|
|
414
414
|
print(f"Sampled {N_BATCH} initial positions (alt ∈ [3, 9] m, lat ∈ [-7, 7] m)")
|
|
415
415
|
|
|
416
416
|
# ── Compile + solve ───────────────────────────────────────────────────────
|
|
417
|
+
# x_initial is (B, n_x) — one extra leading axis — so it is batched; the
|
|
418
|
+
# terminal pin is omitted, so every element shares the default.
|
|
417
419
|
default_init = np.asarray(problem.state.x_init_pin)
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
x0_stack = jnp.asarray(x0_stack)
|
|
421
|
-
xf_pin = np.asarray(problem.state.x_term_pin)
|
|
422
|
-
xf_stack = jnp.broadcast_to(xf_pin, (N_BATCH, xf_pin.shape[0]))
|
|
420
|
+
x_initial = np.broadcast_to(default_init, (N_BATCH, default_init.shape[0])).copy()
|
|
421
|
+
x_initial[:, POSITION_SLICE] = ic_batch
|
|
423
422
|
|
|
424
423
|
print("Compiling and running solve_batched …")
|
|
425
|
-
results = problem.solve_batched(
|
|
424
|
+
results = problem.solve_batched(x_initial=jnp.asarray(x_initial))
|
|
426
425
|
|
|
427
426
|
# ── Post-process: propagate all B solutions through nonlinear dynamics ────
|
|
428
427
|
print("Post-processing (nonlinear propagation) …")
|