openscvx 0.5.3.dev38__tar.gz → 0.5.3.dev40__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.dev38 → openscvx-0.5.3.dev40}/.github/workflows/_docs.yml +1 -0
- openscvx-0.5.3.dev40/CITATION.cff +42 -0
- {openscvx-0.5.3.dev38/openscvx.egg-info → openscvx-0.5.3.dev40}/PKG-INFO +2 -2
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/README.md +1 -1
- openscvx-0.5.3.dev40/docs/Foundations/constraint_reformulation.md +77 -0
- openscvx-0.5.3.dev40/docs/Foundations/control_parameterization.md +70 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/Foundations/discretization.md +7 -3
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/Foundations/ocp.md +7 -2
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/Foundations/scvx.md +10 -4
- openscvx-0.5.3.dev40/docs/Foundations/time_dilation.md +82 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UnderTheHood/batching_jit_grad.md +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UnderTheHood/custom_algorithms_autotuners.md +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UnderTheHood/lowering_architecture.md +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UnderTheHood/vectorization_and_vmapping.md +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/00_introduction.md +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/01_hello_world_brachistochrone.md +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/02_drone_racing_constraints.md +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/04_viewpoint_constraints.md +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/05_visualization.md +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/06_logic.md +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/07_lie.md +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/08_mpcc.md +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/09_mjx_dynamics.md +5 -0
- openscvx-0.5.3.dev40/docs/changelog.md +20 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/citation.md +31 -1
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/examples.md +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/index.md +14 -3
- openscvx-0.5.3.dev40/docs/installation.md +67 -0
- openscvx-0.5.3.dev40/docs/llms.txt +28 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/abstract/hypersensitive.py +2 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/logo_utils/svg_path_utils.py +2 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/assets/stylesheets/home-hero.css +3 -3
- openscvx-0.5.3.dev40/material/overrides/main.html +58 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/partials/home-hero.html +3 -1
- openscvx-0.5.3.dev40/material/overrides/sitemap.xml +16 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/mkdocs.yml +27 -3
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/__init__.py +3 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/_version.py +3 -3
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/integrators/diffrax.py +20 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/integrators/runge_kutta.py +13 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/problem.py +106 -1
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/expr.py +19 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lower.py +42 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/array.py +7 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/constraint.py +8 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/control.py +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/expr.py +8 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/linalg.py +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/logic.py +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/math.py +8 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/state.py +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/arithmetic.py +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/array.py +8 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/constraint.py +11 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/control.py +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/expr.py +8 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/lie.py +9 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/linalg.py +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/logic.py +11 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/math.py +8 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/spatial.py +7 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/state.py +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/stljax.py +8 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/vmap.py +9 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/__init__.py +49 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/_lowerer.py +263 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/_registry.py +82 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/arithmetic.py +65 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/array.py +69 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/constraint.py +81 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/control.py +19 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/expr.py +32 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/formulation.py +465 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/lie.py +97 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/linalg.py +61 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/logic.py +85 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/math.py +188 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/spatial.py +41 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/state.py +31 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/stl.py +120 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/lowerers/latex/vmap.py +44 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/array.py +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/lie.py +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/linalg.py +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/logic.py +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/math.py +6 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/spatial.py +5 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/stl.py +7 -0
- openscvx-0.5.3.dev40/openscvx/symbolic/parser/stljax.py +21 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40/openscvx.egg-info}/PKG-INFO +2 -2
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx.egg-info/SOURCES.txt +25 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx.egg-info/scm_file_list.json +25 -0
- openscvx-0.5.3.dev40/openscvx.egg-info/scm_version.json +8 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/scripts/gen_example_pages.py +53 -9
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/scripts/gen_ref_pages.py +32 -1
- openscvx-0.5.3.dev40/scripts/mkdocs_seo_hook.py +37 -0
- openscvx-0.5.3.dev40/tests/symbolic/test_latex_formulation.py +314 -0
- openscvx-0.5.3.dev40/tests/symbolic/test_lower_latex.py +786 -0
- openscvx-0.5.3.dev38/docs/Foundations/constraint_reformulation.md +0 -10
- openscvx-0.5.3.dev38/docs/Foundations/control_parameterization.md +0 -4
- openscvx-0.5.3.dev38/docs/Foundations/time_dilation.md +0 -4
- openscvx-0.5.3.dev38/material/overrides/main.html +0 -11
- openscvx-0.5.3.dev38/openscvx/symbolic/parser/stljax.py +0 -14
- openscvx-0.5.3.dev38/openscvx.egg-info/scm_version.json +0 -8
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/_extra.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/docs.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/lint.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/release.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/tests-cvxpygen.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/tests-examples.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/tests-lie.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/tests-mjx.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/tests-qpax.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.github/workflows/tests.yml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.gitignore +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/.gitmodules +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/CONTRIBUTING.md +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/LICENSE +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/favicon.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/logo.svg +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/viser-client/index.html +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/versions.json +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/_viser_embed_export.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/abstract/brachistochrone_batched.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/abstract/flappy_bird.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/abstract/stl_or.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/aircraft/dynamic_soaring.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/aircraft/supersonic_time_to_climb.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/animations/_camera.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/animations/_render.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/animations/_sensor_view.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/animations/logo.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/arm/franka_fr3v2_pick_place.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/arm/franka_fr3v2_viewplanning_nodal.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/car/dubins_car.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/car/dubins_car_waypoint_stl.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/double_integrator/_plotting.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/double_integrator/moving_safe_zones.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/2d_obstacle_avoidance_batched_ic.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/cinema_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/drone_racing_batched_gates.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/logo.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/logo_utils/openscvx_logo_single.svg +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/logo_utils/quadrotor_mesh.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/multi_agent_circle_swap.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/obstacle_avoidance_vmap_2d.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/drone/openscvx_logo.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/frax/panda_frax.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/frax/panda_frax_pick_place.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/frax/panda_frax_viewplanning.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/frax/panda_frax_waypoint.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mjx/skydio_x2_mjx.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mjx/triple_cartpole_mjx.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/plotting.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/plotting_viser.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/rocket/6DoF_pdg.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/rocket/6DoF_pdg_batched_ic.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/rocket/ascent_launch_vehicle.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/spacecraft/let_transfer.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/examples/spacecraft/relative_loitering.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/figures/video_preview.png +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/home.html +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/__main__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/acceptance_ratio.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/history.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/hyperparams.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/loop.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/penalty.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/scvx/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/scvx/iteration.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/state.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/algorithms/weights.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/config.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/discretization/base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/expert/byof.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/expert/validation.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/init/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/integrations/_utils.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/integrations/base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/integrations/frax.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/integrations/mjx.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/loader.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/publication.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/coordinates.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/solvers/base.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/solvers/cones.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/solvers/moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/solvers/qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/affine.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/canonicalize.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/utils/cache.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/utils/caching.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/utils/printing.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx/utils/utils.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/pyproject.toml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/setup.cfg +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/_iteration_helpers.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/autotuner/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/autotuner/test_defaults_agreement.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/autotuner/test_hyper_overrides.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/test_iteration_fn_jit.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/test_iteration_fn_parity.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/algorithms/test_make_solve_loop.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/conftest.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_impulsive.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_multishot_propagation.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_batched_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_batched_cvxpy_export_errors.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_batched_export_roundtrip.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_jax_bare_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_jax_jit_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_jax_vmap_brachistochrone.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_jax_vmap_converged_no_drift.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/integrations/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/integrations/test_mjx.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/integrations/test_mjx_dynamics.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/_iteration_callback_helpers.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/test_iteration_callback_cvxpy.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/test_iteration_callback_moreau.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/test_iteration_callback_qpax.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/test_iteration_callback_vmap.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/test_moreau_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/test_qpax_ptr_solver.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/solvers/test_subproblem_pytree.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_stl.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/test_gmsr.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_autotuning.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_discretization.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_examples.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_expert.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_init.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_integrators.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_loader.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_optimization_results.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_plotting.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_post_process_batched_tau_clamp.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_propagation.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_results_parameters.py +0 -0
- {openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/tests/test_solve_batched_inference.py +0 -0
|
@@ -61,6 +61,7 @@ jobs:
|
|
|
61
61
|
run: |
|
|
62
62
|
uv pip install --system "mkdocs-material[imaging]" mkdocstrings-python
|
|
63
63
|
uv pip install --system mkdocs-gen-files mkdocs-literate-nav mkdocs-section-index
|
|
64
|
+
uv pip install --system mkdocs-git-revision-date-localized-plugin
|
|
64
65
|
uv pip install --system mike
|
|
65
66
|
|
|
66
67
|
- name: Install package
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: >-
|
|
3
|
+
If you use OpenSCvx in your research, please cite the software and the
|
|
4
|
+
preferred citation (Hayner et al., IEEE RA-L 2025) below.
|
|
5
|
+
title: "OpenSCvx: Nonlinear Trajectory Optimization via Successive Convexification"
|
|
6
|
+
abstract: >-
|
|
7
|
+
OpenSCvx is an open-source Python library for nonlinear trajectory optimization
|
|
8
|
+
built on successive convexification (SCvx). It compiles a composable symbolic
|
|
9
|
+
problem definition into JAX/CVXPY code and solves nonconvex trajectory problems
|
|
10
|
+
through sequential convex programming.
|
|
11
|
+
type: software
|
|
12
|
+
authors:
|
|
13
|
+
- family-names: Hayner
|
|
14
|
+
given-names: Christopher R.
|
|
15
|
+
- family-names: Norris
|
|
16
|
+
given-names: Griffin
|
|
17
|
+
repository-code: "https://github.com/OpenSCvx/OpenSCvx"
|
|
18
|
+
url: "https://openscvx.github.io/OpenSCvx/"
|
|
19
|
+
license: Apache-2.0
|
|
20
|
+
keywords:
|
|
21
|
+
- trajectory optimization
|
|
22
|
+
- successive convexification
|
|
23
|
+
- optimal control
|
|
24
|
+
- JAX
|
|
25
|
+
- Python
|
|
26
|
+
preferred-citation:
|
|
27
|
+
type: article
|
|
28
|
+
title: >-
|
|
29
|
+
Continuous-Time Line-of-Sight Constrained Trajectory Planning for
|
|
30
|
+
6-Degree of Freedom Systems
|
|
31
|
+
authors:
|
|
32
|
+
- family-names: Hayner
|
|
33
|
+
given-names: Christopher R.
|
|
34
|
+
- family-names: Carson III
|
|
35
|
+
given-names: John M.
|
|
36
|
+
- family-names: Açıkmeşe
|
|
37
|
+
given-names: Behçet
|
|
38
|
+
- family-names: Leung
|
|
39
|
+
given-names: Karen
|
|
40
|
+
journal: IEEE Robotics and Automation Letters
|
|
41
|
+
year: 2025
|
|
42
|
+
doi: 10.1109/LRA.2025.3545299
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.5.3.
|
|
3
|
+
Version: 0.5.3.dev40
|
|
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
|
|
@@ -214,7 +214,7 @@ Check out the OpenSCvx documentation:
|
|
|
214
214
|
|
|
215
215
|
- [Users Guide](https://openscvx.github.io/OpenSCvx/latest/UsersGuide/00_introduction/)
|
|
216
216
|
- [API Reference](https://openscvx.github.io/OpenSCvx/latest/Reference/)
|
|
217
|
-
- [Examples overview](https://openscvx.github.io/OpenSCvx/latest/
|
|
217
|
+
- [Examples overview](https://openscvx.github.io/OpenSCvx/latest/Examples/)
|
|
218
218
|
|
|
219
219
|
### Running the Examples
|
|
220
220
|
|
|
@@ -167,7 +167,7 @@ Check out the OpenSCvx documentation:
|
|
|
167
167
|
|
|
168
168
|
- [Users Guide](https://openscvx.github.io/OpenSCvx/latest/UsersGuide/00_introduction/)
|
|
169
169
|
- [API Reference](https://openscvx.github.io/OpenSCvx/latest/Reference/)
|
|
170
|
-
- [Examples overview](https://openscvx.github.io/OpenSCvx/latest/
|
|
170
|
+
- [Examples overview](https://openscvx.github.io/OpenSCvx/latest/Examples/)
|
|
171
171
|
|
|
172
172
|
### Running the Examples
|
|
173
173
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Constraint Reformulation (CTCS)
|
|
3
|
+
description: >-
|
|
4
|
+
How OpenSCvx enforces path constraints continuously in time by integrating an
|
|
5
|
+
augmented penalty state, rather than only at the discretization nodes.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Isoperimetric Constraint Reformulation
|
|
9
|
+
|
|
10
|
+
![CTCS_dark]{ align=right width="60%" }
|
|
11
|
+
![CTCS_light]{ align=right width="60%" }
|
|
12
|
+
|
|
13
|
+
Path constraints are meant to hold for *all* time, but a node-based
|
|
14
|
+
transcription only checks them at the discretization nodes — leaving the solution
|
|
15
|
+
free to violate them *between* nodes. OpenSCvx closes this gap with
|
|
16
|
+
**continuous-time constraint satisfaction (CTCS)**: it reformulates a path
|
|
17
|
+
constraint as an integral condition on an augmented state, so satisfying it at
|
|
18
|
+
the nodes guarantees satisfaction throughout the interval.
|
|
19
|
+
|
|
20
|
+
## The augmented penalty state
|
|
21
|
+
|
|
22
|
+
Write each path constraint in canonical form $g(x, u) \le 0$. For a group of
|
|
23
|
+
CTCS constraints, OpenSCvx adds one augmented state $y$ whose derivative
|
|
24
|
+
accumulates a non-negative penalty of the constraint violations:
|
|
25
|
+
|
|
26
|
+
$$
|
|
27
|
+
\frac{\mathrm{d}y}{\mathrm{d}\tau}
|
|
28
|
+
= s(\tau)\, \sum_j \mathrm{penalty}\big(g_j(x, u)\big),
|
|
29
|
+
$$
|
|
30
|
+
|
|
31
|
+
where the default penalty is the squared ReLU $\max(0, g_j)^2$ (Huber and smooth
|
|
32
|
+
ReLU are also available), and $s$ is the [time-dilation](time_dilation.md)
|
|
33
|
+
factor. Because the integrand is non-negative, $y$ is monotonically
|
|
34
|
+
non-decreasing and accumulates *any* violation occurring between nodes.
|
|
35
|
+
|
|
36
|
+
Enforcing $y \equiv 0$ then drives every penalty — and hence every constraint —
|
|
37
|
+
to zero continuously. In practice the convex subproblem (i) resets $y$ to $0$ at
|
|
38
|
+
the start of each enforcement interval and (ii) bounds the per-segment increment,
|
|
39
|
+
|
|
40
|
+
$$
|
|
41
|
+
y_0 = 0, \qquad |y_k - y_{k-1}| \le y_{\max},
|
|
42
|
+
$$
|
|
43
|
+
|
|
44
|
+
so a small $y_{\max}$ makes the between-node violation provably small. This is
|
|
45
|
+
the isoperimetric-style reformulation: a bounded integral of the violation stands
|
|
46
|
+
in for an infinite family of pointwise constraints.
|
|
47
|
+
|
|
48
|
+
## Declaring CTCS constraints
|
|
49
|
+
|
|
50
|
+
Wrap any path constraint with `ox.ctcs`, or call `.over(...)` on a constraint to
|
|
51
|
+
restrict it to a node interval:
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
import openscvx as ox
|
|
55
|
+
|
|
56
|
+
constraints = [
|
|
57
|
+
ox.ctcs(state <= state.max),
|
|
58
|
+
ox.ctcs(state.min <= state, penalty="huber"),
|
|
59
|
+
(distance >= obstacle_radius).over((0, N)),
|
|
60
|
+
]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Constraints sharing an enforcement interval are grouped onto one augmented state;
|
|
64
|
+
different intervals get separate states. The bound $y_{\max}$ is the constraint's
|
|
65
|
+
`licq_max` (default $10^{-4}$); tighten it for stricter between-node enforcement.
|
|
66
|
+
After solving, the achieved continuous-time violation is reported as
|
|
67
|
+
`results.ctcs_violation`.
|
|
68
|
+
|
|
69
|
+
## Related reading
|
|
70
|
+
|
|
71
|
+
- [Optimal Control Problem](ocp.md) — where the CTCS reset-and-bound constraints
|
|
72
|
+
enter the convex subproblem.
|
|
73
|
+
- [Time Dilation](time_dilation.md) — the $s$ factor that also scales the CTCS
|
|
74
|
+
dynamics.
|
|
75
|
+
|
|
76
|
+
[CTCS_dark]: ../assets/images/ctcs_dark.png#only-dark
|
|
77
|
+
[CTCS_light]: ../assets/images/ctcs_light.png#only-light
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Control Parameterization
|
|
3
|
+
description: >-
|
|
4
|
+
Zero-order-hold (ZOH) versus first-order-hold (FOH) control parameterization
|
|
5
|
+
between nodes in OpenSCvx, and how to set it per problem or per control.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Control Parameterization
|
|
9
|
+
|
|
10
|
+
The optimization variables live at discrete **nodes**, but the dynamics are
|
|
11
|
+
continuous, so OpenSCvx must decide how the control behaves *between* nodes. This
|
|
12
|
+
choice is the **control parameterization**, and it determines how the control
|
|
13
|
+
value on a segment is reconstructed from the node values during discretization.
|
|
14
|
+
|
|
15
|
+
## Zero-order versus first-order hold
|
|
16
|
+
|
|
17
|
+
Across a segment from node $k$ to node $k+1$, the control is interpolated as
|
|
18
|
+
|
|
19
|
+
$$
|
|
20
|
+
u(\tau) = u_k + \beta(\tau)\,\big(u_{k+1} - u_k\big),
|
|
21
|
+
$$
|
|
22
|
+
|
|
23
|
+
where $\beta$ ramps from $0$ to $1$ over the segment. The two standard choices
|
|
24
|
+
differ only in $\beta$:
|
|
25
|
+
|
|
26
|
+
- **Zero-order hold (ZOH):** $\beta = 0$, so $u(\tau) = u_k$ is held constant
|
|
27
|
+
across the segment. Only the current node couples into the segment dynamics, so
|
|
28
|
+
discretization produces a single control transition matrix $B_d$.
|
|
29
|
+
- **First-order hold (FOH):** $\beta$ blends linearly from $0$ to $1$, so the
|
|
30
|
+
control is piecewise-linear and continuous across nodes. Both endpoints couple
|
|
31
|
+
in, producing two transition matrices, $B_d$ (current node) and $C_d$ (next
|
|
32
|
+
node).
|
|
33
|
+
|
|
34
|
+
FOH gives a smoother, continuous control profile at the cost of an extra
|
|
35
|
+
transition matrix per segment; ZOH is cheaper and matches hardware that applies a
|
|
36
|
+
piecewise-constant command.
|
|
37
|
+
|
|
38
|
+
## Choosing a parameterization
|
|
39
|
+
|
|
40
|
+
The default parameterization is **FOH**. Set it globally through the
|
|
41
|
+
discretizer:
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
import openscvx as ox
|
|
45
|
+
|
|
46
|
+
problem = ox.Problem(
|
|
47
|
+
dynamics, ...,
|
|
48
|
+
discretizer={"dis_type": "ZOH"}, # or "FOH" (default)
|
|
49
|
+
)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`dis_type` also accepts a per-control sequence (e.g. `["FOH", "ZOH", "FOH"]`) to
|
|
53
|
+
mix parameterizations across control channels.
|
|
54
|
+
|
|
55
|
+
A per-control setting overrides the discretizer default, so you can request a
|
|
56
|
+
specific hold on the control that needs it:
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
thrust = ox.Control("thrust", shape=(3,), parameterization="ZOH")
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The time-dilation control added for [free-final-time problems](time_dilation.md)
|
|
63
|
+
is parameterized as ZOH.
|
|
64
|
+
|
|
65
|
+
## Related reading
|
|
66
|
+
|
|
67
|
+
- [Exact Discretization](discretization.md) — how the chosen hold enters the
|
|
68
|
+
discretized transition matrices.
|
|
69
|
+
- [Time Dilation](time_dilation.md) — the dilation control and its
|
|
70
|
+
parameterization.
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: Exact Discretization
|
|
3
|
+
description: >-
|
|
4
|
+
How OpenSCvx discretizes and linearizes continuous-time dynamics by
|
|
5
|
+
integrating an augmented state vector to build the ZOH/FOH transition matrices.
|
|
6
|
+
---
|
|
2
7
|
|
|
3
|
-
|
|
4
|
-
This page is still under development :construction:.
|
|
8
|
+
# Exact Discretization
|
|
5
9
|
|
|
6
10
|
``` py title="dVdt.py"
|
|
7
11
|
def dVdt(self,
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Optimal Control Problem
|
|
3
|
+
description: >-
|
|
4
|
+
The convex subproblem OpenSCvx solves each SCP iteration: variables, affine
|
|
5
|
+
scaling, discretized dynamics, virtual control, and trust-region costs.
|
|
6
|
+
---
|
|
7
|
+
|
|
1
8
|
# Optimal Control Problem
|
|
2
|
-
!!! Warning
|
|
3
|
-
This page is still under development :construction:.
|
|
4
9
|
|
|
5
10
|
The underlying convex subproblem is posed in the following general form.
|
|
6
11
|
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
---
|
|
2
|
+
title: What is Successive Convexification?
|
|
3
|
+
description: >-
|
|
4
|
+
Successive convexification (SCvx) solves nonconvex trajectory optimization by
|
|
5
|
+
repeatedly linearizing the problem and solving the convex subproblem until
|
|
6
|
+
convergence.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# What is Successive Convexification?
|
|
4
10
|
|
|
5
11
|
*Successive Convexification* is an approach to solve infinite dimensional nonconvex trajectory optimization problems. It works by *successively* convexifying or linearizing a problem and solving the convex subproblem. The solution to the convex subproblem is then used to update the original problem, and the process is repeated until convergence.
|
|
6
12
|
|
|
@@ -9,7 +15,7 @@
|
|
|
9
15
|
|
|
10
16
|
|
|
11
17
|
## Problem Formulation
|
|
12
|
-
In this repository, the user will likely find it most useful specify
|
|
18
|
+
In this repository, the user will likely find it most useful to specify their problem in the Mayer Form in order to take full advantage of the features of this repo, but do not worry, this is quite easy.
|
|
13
19
|
|
|
14
20
|
$$
|
|
15
21
|
\begin{align}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Time Dilation
|
|
3
|
+
description: >-
|
|
4
|
+
How OpenSCvx handles free-final-time and minimum-time problems by optimizing a
|
|
5
|
+
time-dilation control on a fixed normalized-time grid.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Time Dilation
|
|
9
|
+
|
|
10
|
+
*Time dilation* is how OpenSCvx supports **free-final-time** problems — including
|
|
11
|
+
minimum-time problems — on a fixed transcription grid. Rather than optimize over
|
|
12
|
+
physical time directly, OpenSCvx discretizes the trajectory on a **normalized
|
|
13
|
+
time** $\tau \in [0, 1]$ with fixed node spacing, and lets the solver stretch or
|
|
14
|
+
compress physical time through an extra control.
|
|
15
|
+
|
|
16
|
+
## Normalized time and the dilation factor
|
|
17
|
+
|
|
18
|
+
Let $\tau$ be normalized time and $t$ physical time. Their relationship is
|
|
19
|
+
governed by a scalar **time-dilation factor** $s(\tau)$:
|
|
20
|
+
|
|
21
|
+
$$
|
|
22
|
+
\frac{\mathrm{d}t}{\mathrm{d}\tau} = s(\tau).
|
|
23
|
+
$$
|
|
24
|
+
|
|
25
|
+
Because every physical derivative is taken with respect to $t$, expressing the
|
|
26
|
+
dynamics on the $\tau$ grid scales them by $s$:
|
|
27
|
+
|
|
28
|
+
$$
|
|
29
|
+
\frac{\mathrm{d}x}{\mathrm{d}\tau}
|
|
30
|
+
= \frac{\mathrm{d}x}{\mathrm{d}t}\,\frac{\mathrm{d}t}{\mathrm{d}\tau}
|
|
31
|
+
= s(\tau)\, f\big(x(\tau), u(\tau)\big).
|
|
32
|
+
$$
|
|
33
|
+
|
|
34
|
+
OpenSCvx treats time as a state (with $\mathrm{d}t/\mathrm{d}\tau = s \cdot 1$)
|
|
35
|
+
and $s$ as an ordinary per-node control. Making $s(\tau)$ a decision variable is
|
|
36
|
+
what turns a fixed-grid transcription into a free-final-time problem: a larger
|
|
37
|
+
$s$ spends more physical time per grid interval, so the solver can slow down near
|
|
38
|
+
constraint boundaries and speed up elsewhere. The dilation multiplication is
|
|
39
|
+
applied symbolically when the problem is built, so JAX autodiff produces the
|
|
40
|
+
correct Jacobians — including $\partial f/\partial s = f$ — automatically.
|
|
41
|
+
|
|
42
|
+
## Declaring a free final time
|
|
43
|
+
|
|
44
|
+
Free and minimum-time problems are declared through the `ox.Time` object passed
|
|
45
|
+
to `ox.Problem`. The `final` field accepts the same boundary markers as any
|
|
46
|
+
state — `"free"`, `"minimize"`, or `"maximize"` — so a minimum-time problem is
|
|
47
|
+
simply a free final time that is minimized:
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
import openscvx as ox
|
|
51
|
+
|
|
52
|
+
# Minimum-time: final time is free and minimized.
|
|
53
|
+
time = ox.Time(initial=0.0, final=("minimize", tf_guess), min=0.0, max=800.0)
|
|
54
|
+
|
|
55
|
+
problem = ox.Problem(dynamics, ..., time=time)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
OpenSCvx augments the problem with a dedicated dilation control automatically. By
|
|
59
|
+
default its per-node bounds are $0.3\,t_f \le s \le 3\,t_f$; you can override
|
|
60
|
+
them, seed a dilation guess, or force a uniform physical time step:
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
time = ox.Time(
|
|
64
|
+
initial=0.0,
|
|
65
|
+
final=time_final,
|
|
66
|
+
guess=time_guess,
|
|
67
|
+
time_dilation_min=time_dilation_min,
|
|
68
|
+
time_dilation_max=time_dilation_max,
|
|
69
|
+
uniform_time_grid=False, # allow s to vary node to node
|
|
70
|
+
)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Setting `uniform_time_grid=True` adds equality constraints forcing $s$ equal
|
|
74
|
+
across all nodes, recovering a single free scalar duration with evenly spaced
|
|
75
|
+
physical time steps.
|
|
76
|
+
|
|
77
|
+
## Related reading
|
|
78
|
+
|
|
79
|
+
- [Exact Discretization](discretization.md) — how the dilated dynamics are
|
|
80
|
+
integrated on the $\tau$ grid.
|
|
81
|
+
- [Control Parameterization](control_parameterization.md) — how controls,
|
|
82
|
+
including the dilation control, are interpolated between nodes.
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
How OpenSCvx's `solve_jax()` entry point runs the SCP loop as a pure JAX
|
|
4
|
+
`lax.while_loop` so solves compose with `jax.vmap`, `jax.jit`, and `jax.grad`.
|
|
5
|
+
---
|
|
6
|
+
|
|
1
7
|
# Batching, JIT, and Grad with `Problem.solve_jax()`
|
|
2
8
|
|
|
3
9
|
`Problem` exposes two solve entry points. `solve()` is the familiar
|
{openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UnderTheHood/custom_algorithms_autotuners.md
RENAMED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
How to swap OpenSCvx's SCP iteration and penalty-weight schedule by subclassing
|
|
4
|
+
the `Algorithm` and `AutotuningBase` bases without forking the solver.
|
|
5
|
+
---
|
|
6
|
+
|
|
1
7
|
# Custom Algorithms and Autotuners
|
|
2
8
|
|
|
3
9
|
OpenSCvx solves through a pluggable SCP loop: an **algorithm** owns the
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
How OpenSCvx lowers symbolic problem definitions into executable JAX and CVXPy
|
|
4
|
+
code — the second of its preprocessing, lowering, solving, and post-processing phases.
|
|
5
|
+
---
|
|
6
|
+
|
|
1
7
|
# Lowering Architecture
|
|
2
8
|
|
|
3
9
|
This document explains how OpenSCvx converts symbolic problem definitions into executable code for optimization.
|
{openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UnderTheHood/vectorization_and_vmapping.md
RENAMED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
How OpenSCvx unifies per-node State and Control objects into monolithic vectors and
|
|
4
|
+
applies `jax.vmap` to evaluate dynamics and nonconvex constraints across decision nodes in parallel.
|
|
5
|
+
---
|
|
6
|
+
|
|
1
7
|
# Vectorization and Vmapping Across Decision Nodes
|
|
2
8
|
|
|
3
9
|
This page explains how OpenSCvx internally processes symbolic problem definitions into vectorized JAX computations. After symbolic preprocessing and augmentation (which you've likely seen in basic usage), the library creates unified state/control vectors and applies JAX's `vmap` to evaluate dynamics and non-convex constraints across decision nodes in parallel.
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
A progressive introduction to trajectory optimization with OpenSCvx, building from a first model to representative real-world problems.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# Users Guide
|
|
2
7
|
|
|
3
8
|
Welcome to the OpenSCvx Users Guide. This section aims to provides a progressive and useful introduction to trajectory optimization with OpenSCvx, starting from first principles and building toward complex, representative problems.
|
{openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/01_hello_world_brachistochrone.md
RENAMED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
A hello-world OpenSCvx tutorial that solves the brachistochrone minimum-time problem: states, controls, dynamics, time, and CTCS constraints.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# 01 Hello Brachistochrone
|
|
2
7
|
|
|
3
8
|
In this _hello world_ tutorial we will introduce the reader to the fundamental concepts and API needed to define and solve a problem using OpenSCvx as well as how the results can be accessed.
|
{openscvx-0.5.3.dev38 → openscvx-0.5.3.dev40}/docs/UsersGuide/02_drone_racing_constraints.md
RENAMED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Model a 3-DOF drone racing through gates in OpenSCvx using nodal constraints, .at()/.over()/.convex(), and keyframe initialization.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# 02 Drone Racing: Constraints and 3-DOF Dynamics
|
|
2
7
|
|
|
3
8
|
In this tutorial we build on the concepts from [Hello Brachistochrone](01_hello_world_brachistochrone.md) to tackle a more interesting problem: time-optimal drone racing through gates.
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Solve 6-DOF obstacle avoidance in OpenSCvx using parameters and ox.Vmap to batch many obstacles without hand-written Python loops.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# 03 Obstacle Avoidance: 6-DOF Dynamics, Parameters, and Vmap
|
|
2
7
|
|
|
3
8
|
In this tutorial we tackle a more realistic drone control problem: navigating through obstacles with full 6-DOF rigid body dynamics.
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Add continuous line-of-sight viewpoint constraints to a 6-DOF OpenSCvx trajectory optimization problem.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# 04 Looking Back: Viewpoint Constraints
|
|
2
7
|
|
|
3
8
|
In this tutorial we will combine what we have learned in the past several exercises while introducing a new viewplanning constraint formulation.
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Plot and inspect OpenSCvx results with Matplotlib and interactive Viser visualization.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# 05 Visualizing Results
|
|
2
7
|
|
|
3
8
|
Once you've solved a trajectory optimization problem, you'll want to see the results. OpenSCvx provides two complementary visualization systems:
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Optimize a 7-DOF redundant arm pick-and-place in OpenSCvx using Lie-group forward kinematics on SE(3) and algebraic propagated states.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# 07 Multi-Link Arms: Lie Algebra and Propagated States
|
|
2
7
|
|
|
3
8
|
In this tutorial we leave the world of free-flying rigid bodies and step into manipulation.
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Build receding-horizon model predictive contouring control (MPCC) in OpenSCvx to track a reference path through gates at speed.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# 08 Receding Horizon Drone Racing: Model Predictive Contouring Control
|
|
2
7
|
|
|
3
8
|
In this tutorial we step away from single-shot trajectory optimization and into the world of receding-horizon control.
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Drive OpenSCvx trajectory optimization with MuJoCo MJX dynamics for contact-rich robotic systems.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# 09 MuJoCo MJX Dynamics
|
|
2
7
|
|
|
3
8
|
In earlier tutorials we wrote dynamics by hand as symbolic expressions. Many real systems already have a MuJoCo model — articulated robots, cartpoles, quadrotors — and re-deriving those equations is tedious and error-prone.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Changelog
|
|
3
|
+
description: >-
|
|
4
|
+
Release history for OpenSCvx. Each tagged release publishes versioned documentation and a
|
|
5
|
+
detailed set of notes on GitHub.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Changelog
|
|
9
|
+
|
|
10
|
+
OpenSCvx follows [semantic versioning](https://semver.org/). Every tagged release ships its own
|
|
11
|
+
snapshot of these docs (selectable from the version picker in the header) and a full set of
|
|
12
|
+
release notes on GitHub.
|
|
13
|
+
|
|
14
|
+
- :material-tag-outline: __[Release notes on GitHub](https://github.com/OpenSCvx/OpenSCvx/releases)__
|
|
15
|
+
— the authoritative, per-version changelog with highlights, fixes, and upgrade notes.
|
|
16
|
+
- :material-package-variant: __[Releases on PyPI](https://pypi.org/project/openscvx/#history)__
|
|
17
|
+
— published wheels and source distributions.
|
|
18
|
+
|
|
19
|
+
The documentation you are reading tracks the `latest` release. Use the version selector to browse
|
|
20
|
+
the docs for an earlier tag, or switch to `nightly` for the in-development build from `main`.
|
|
@@ -1,9 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Citation
|
|
3
|
+
description: >-
|
|
4
|
+
How to cite OpenSCvx and the successive-convexification methods it implements,
|
|
5
|
+
including Hayner et al., IEEE RA-L 2025, in BibTeX.
|
|
6
|
+
---
|
|
7
|
+
|
|
1
8
|
# Citation
|
|
2
9
|
|
|
3
|
-
If you use OpenSCvx in your research, please cite
|
|
10
|
+
If you use OpenSCvx in your research, please cite Hayner et al., *Continuous-Time
|
|
11
|
+
Line-of-Sight Constrained Trajectory Planning for 6-Degree of Freedom Systems*,
|
|
12
|
+
IEEE Robotics and Automation Letters (RA-L), 2025
|
|
13
|
+
([DOI: 10.1109/LRA.2025.3545299](https://doi.org/10.1109/LRA.2025.3545299)),
|
|
14
|
+
along with the methodological and solver references below.
|
|
4
15
|
|
|
5
16
|
## Primary Citation
|
|
6
17
|
|
|
18
|
+
Hayner et al., IEEE RA-L 2025 — DOI:
|
|
19
|
+
[10.1109/LRA.2025.3545299](https://doi.org/10.1109/LRA.2025.3545299).
|
|
20
|
+
|
|
7
21
|
```bibtex
|
|
8
22
|
@ARTICLE{hayner2025los,
|
|
9
23
|
author={Hayner, Christopher R. and Carson III, John M. and Açıkmeşe, Behçet and Leung, Karen},
|
|
@@ -19,6 +33,10 @@ If you use OpenSCvx in your research, please cite the following works:
|
|
|
19
33
|
|
|
20
34
|
## Methodological Foundation
|
|
21
35
|
|
|
36
|
+
Elango et al., *Successive Convexification for Trajectory Optimization with
|
|
37
|
+
Continuous-Time Constraint Satisfaction*, 2024 — preprint:
|
|
38
|
+
[arXiv:2404.16826](https://arxiv.org/abs/2404.16826).
|
|
39
|
+
|
|
22
40
|
```bibtex
|
|
23
41
|
@misc{elango2024ctscvx,
|
|
24
42
|
title={Successive Convexification for Trajectory Optimization with Continuous-Time Constraint Satisfaction},
|
|
@@ -33,6 +51,10 @@ If you use OpenSCvx in your research, please cite the following works:
|
|
|
33
51
|
|
|
34
52
|
## Solver Technology
|
|
35
53
|
|
|
54
|
+
Chari and Açıkmeşe, *QOCO: A Quadratic Objective Conic Optimizer with Custom
|
|
55
|
+
Solver Generation*, 2025 — preprint:
|
|
56
|
+
[arXiv:2503.12658](https://arxiv.org/abs/2503.12658).
|
|
57
|
+
|
|
36
58
|
```bibtex
|
|
37
59
|
@misc{chari2025qoco,
|
|
38
60
|
title = {QOCO: A Quadratic Objective Conic Optimizer with Custom Solver Generation},
|
|
@@ -44,6 +66,14 @@ If you use OpenSCvx in your research, please cite the following works:
|
|
|
44
66
|
}
|
|
45
67
|
```
|
|
46
68
|
|
|
69
|
+
## Citing the software
|
|
70
|
+
|
|
71
|
+
To cite the OpenSCvx software itself, use the
|
|
72
|
+
[`CITATION.cff`](https://github.com/OpenSCvx/OpenSCvx/blob/main/CITATION.cff) file
|
|
73
|
+
at the repository root — GitHub's "Cite this repository" widget reads it directly.
|
|
74
|
+
It points to the RA-L paper above as the preferred citation. A dedicated software
|
|
75
|
+
DOI (Zenodo) is planned for the 1.0 release.
|
|
76
|
+
|
|
47
77
|
## Acknowledgments
|
|
48
78
|
|
|
49
79
|
This work was supported by a NASA Space Technology Graduate Research Opportunity and the Office of Naval Research under grant N00014-17-1-2433. The authors would like to acknowledge Natalia Pavlasek, Samuel Buckner, Abhi Kamath, Govind Chari, and Purnanand Elango as well as the other Autonomous Controls Laboratory members, for their many helpful discussions and support throughout this work.
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Runnable OpenSCvx trajectory optimization examples spanning aerospace, robotics, and abstract optimal-control problems.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# Examples
|
|
2
7
|
|
|
3
8
|
OpenSCvx comes with a comprehensive set of examples demonstrating various trajectory optimization problems. These examples are located in the `examples/` folder and cover different applications and complexity levels.
|
|
@@ -5,12 +5,24 @@ hide:
|
|
|
5
5
|
- navigation
|
|
6
6
|
- toc
|
|
7
7
|
description: >-
|
|
8
|
-
|
|
8
|
+
OpenSCvx is an open-source Python library for nonlinear trajectory
|
|
9
|
+
optimization built on successive convexification (SCvx), with a composable
|
|
10
|
+
problem API and a JAX backend.
|
|
9
11
|
social:
|
|
10
12
|
cards_layout_options:
|
|
11
13
|
title: Fast and Easy Nonconvex Trajectory Optimization
|
|
12
14
|
---
|
|
13
15
|
|
|
16
|
+
# OpenSCvx — Trajectory Optimization via Successive Convexification in Python/JAX
|
|
17
|
+
|
|
18
|
+
OpenSCvx is an open-source Python library for nonlinear trajectory optimization
|
|
19
|
+
built on successive convexification (SCvx). You write dynamics, costs, and
|
|
20
|
+
constraints as a single composable problem object; the library lowers that
|
|
21
|
+
symbolic definition to JAX, discretizes it on a time grid, and solves the
|
|
22
|
+
resulting nonconvex problem through a sequence of convex subproblems. The same
|
|
23
|
+
problem definition runs on CPU and GPU, and vectorizes across decision nodes and
|
|
24
|
+
scenario batches.
|
|
25
|
+
|
|
14
26
|
## Why OpenSCvx
|
|
15
27
|
|
|
16
28
|
**Modeling.** Dynamics, costs, and constraints are defined together in a structured problem object.
|
|
@@ -30,9 +42,8 @@ for every outer loop (see [Obstacle avoidance with Vmap](UsersGuide/03_obstacle_
|
|
|
30
42
|
|
|
31
43
|
<div class="grid cards" markdown>
|
|
32
44
|
|
|
33
|
-
- :material-rocket-launch: __[Run examples](examples.md)__ — locate scripts in the repo, run them locally, and browse problem categories.
|
|
34
45
|
- :material-book-open-variant: __[Users guide](UsersGuide/00_introduction.md)__ — modeling, constraints, and visualization.
|
|
35
46
|
- :material-code-braces: __[API reference](Reference/index.md)__ — modules and functions generated from source with docstrings.
|
|
36
|
-
- :material-view-dashboard: __[Examples](Examples/index.md)__ — runnable scripts organized by topic.
|
|
47
|
+
- :material-view-dashboard: __[Examples](Examples/index.md)__ — runnable scripts organized by topic, run them locally and browse problem categories.
|
|
37
48
|
|
|
38
49
|
</div>
|