openscvx 0.5.3.dev39__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.
Files changed (468) hide show
  1. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/_docs.yml +1 -0
  2. openscvx-0.5.3.dev40/CITATION.cff +42 -0
  3. {openscvx-0.5.3.dev39/openscvx.egg-info → openscvx-0.5.3.dev40}/PKG-INFO +2 -2
  4. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/README.md +1 -1
  5. openscvx-0.5.3.dev40/docs/Foundations/constraint_reformulation.md +77 -0
  6. openscvx-0.5.3.dev40/docs/Foundations/control_parameterization.md +70 -0
  7. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/Foundations/discretization.md +7 -3
  8. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/Foundations/ocp.md +7 -2
  9. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/Foundations/scvx.md +10 -4
  10. openscvx-0.5.3.dev40/docs/Foundations/time_dilation.md +82 -0
  11. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UnderTheHood/batching_jit_grad.md +6 -0
  12. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UnderTheHood/custom_algorithms_autotuners.md +6 -0
  13. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UnderTheHood/lowering_architecture.md +6 -0
  14. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UnderTheHood/vectorization_and_vmapping.md +6 -0
  15. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/00_introduction.md +5 -0
  16. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/01_hello_world_brachistochrone.md +5 -0
  17. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/02_drone_racing_constraints.md +5 -0
  18. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +5 -0
  19. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/04_viewpoint_constraints.md +5 -0
  20. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/05_visualization.md +5 -0
  21. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/06_logic.md +6 -0
  22. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/07_lie.md +5 -0
  23. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/08_mpcc.md +5 -0
  24. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/UsersGuide/09_mjx_dynamics.md +5 -0
  25. openscvx-0.5.3.dev40/docs/changelog.md +20 -0
  26. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/citation.md +31 -1
  27. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/examples.md +5 -0
  28. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/index.md +14 -3
  29. openscvx-0.5.3.dev40/docs/installation.md +67 -0
  30. openscvx-0.5.3.dev40/docs/llms.txt +28 -0
  31. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/abstract/hypersensitive.py +2 -0
  32. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/logo_utils/svg_path_utils.py +2 -0
  33. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/assets/stylesheets/home-hero.css +3 -3
  34. openscvx-0.5.3.dev40/material/overrides/main.html +58 -0
  35. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/partials/home-hero.html +3 -1
  36. openscvx-0.5.3.dev40/material/overrides/sitemap.xml +16 -0
  37. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/mkdocs.yml +27 -3
  38. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/_version.py +3 -3
  39. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/integrators/diffrax.py +20 -0
  40. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/integrators/runge_kutta.py +13 -0
  41. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +6 -0
  42. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/array.py +7 -0
  43. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/constraint.py +8 -0
  44. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/control.py +5 -0
  45. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/expr.py +8 -0
  46. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/linalg.py +6 -0
  47. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/logic.py +6 -0
  48. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/math.py +8 -0
  49. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/state.py +6 -0
  50. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/arithmetic.py +6 -0
  51. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/array.py +8 -0
  52. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/constraint.py +11 -0
  53. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/control.py +5 -0
  54. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/expr.py +8 -0
  55. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/lie.py +9 -0
  56. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/linalg.py +6 -0
  57. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/logic.py +11 -0
  58. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/math.py +8 -0
  59. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/spatial.py +7 -0
  60. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/state.py +5 -0
  61. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/stljax.py +8 -0
  62. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/vmap.py +9 -0
  63. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/arithmetic.py +7 -0
  64. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/array.py +7 -0
  65. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/constraint.py +8 -0
  66. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/control.py +5 -0
  67. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/expr.py +5 -0
  68. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/linalg.py +6 -0
  69. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/logic.py +7 -0
  70. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/math.py +6 -0
  71. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/vmap.py +7 -0
  72. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/array.py +5 -0
  73. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/lie.py +5 -0
  74. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/linalg.py +5 -0
  75. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/logic.py +5 -0
  76. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/math.py +6 -0
  77. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/spatial.py +5 -0
  78. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/stl.py +7 -0
  79. openscvx-0.5.3.dev40/openscvx/symbolic/parser/stljax.py +21 -0
  80. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40/openscvx.egg-info}/PKG-INFO +2 -2
  81. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx.egg-info/SOURCES.txt +6 -0
  82. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx.egg-info/scm_file_list.json +6 -0
  83. openscvx-0.5.3.dev40/openscvx.egg-info/scm_version.json +8 -0
  84. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/scripts/gen_example_pages.py +53 -9
  85. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/scripts/gen_ref_pages.py +32 -1
  86. openscvx-0.5.3.dev40/scripts/mkdocs_seo_hook.py +37 -0
  87. openscvx-0.5.3.dev39/docs/Foundations/constraint_reformulation.md +0 -10
  88. openscvx-0.5.3.dev39/docs/Foundations/control_parameterization.md +0 -4
  89. openscvx-0.5.3.dev39/docs/Foundations/time_dilation.md +0 -4
  90. openscvx-0.5.3.dev39/material/overrides/main.html +0 -11
  91. openscvx-0.5.3.dev39/openscvx/symbolic/parser/stljax.py +0 -14
  92. openscvx-0.5.3.dev39/openscvx.egg-info/scm_version.json +0 -8
  93. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/assets/logo.svg +0 -0
  94. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/release-drafter.yml +0 -0
  95. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/_extra.yml +0 -0
  96. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/branch-name.yml +0 -0
  97. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/docs.yml +0 -0
  98. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/lint.yml +0 -0
  99. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/nightly.yml +0 -0
  100. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/release-drafter.yml +0 -0
  101. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/release.yml +0 -0
  102. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/tests-cvxpygen.yml +0 -0
  103. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/tests-examples.yml +0 -0
  104. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/tests-lie.yml +0 -0
  105. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/tests-mjx.yml +0 -0
  106. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/tests-qpax.yml +0 -0
  107. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.github/workflows/tests.yml +0 -0
  108. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.gitignore +0 -0
  109. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/.gitmodules +0 -0
  110. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/CONTRIBUTING.md +0 -0
  111. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/LICENSE +0 -0
  112. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/favicon.png +0 -0
  113. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/images/ct-scvx_dark.png +0 -0
  114. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/images/ct-scvx_light.png +0 -0
  115. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/images/ctcs_dark.png +0 -0
  116. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/images/ctcs_light.png +0 -0
  117. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/images/problem_class_dark.png +0 -0
  118. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/images/problem_class_light.png +0 -0
  119. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/logo.svg +0 -0
  120. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/openscvx_logo_square.png +0 -0
  121. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/viser-client/index.html +0 -0
  122. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  123. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  124. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/javascripts/mathjax.js +0 -0
  125. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/docs/versions.json +0 -0
  126. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/_viser_embed_export.py +0 -0
  127. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/abstract/brachistochrone.py +0 -0
  128. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/abstract/brachistochrone_batched.py +0 -0
  129. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/abstract/flappy_bird.py +0 -0
  130. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/abstract/impulsive.py +0 -0
  131. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/abstract/stl_integer_variable.py +0 -0
  132. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/abstract/stl_or.py +0 -0
  133. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/aircraft/dynamic_soaring.py +0 -0
  134. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/aircraft/supersonic_time_to_climb.py +0 -0
  135. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/animations/7_dof_arm.py +0 -0
  136. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/animations/_camera.py +0 -0
  137. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/animations/_render.py +0 -0
  138. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/animations/_sensor_view.py +0 -0
  139. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/animations/dr_vp_polytope.py +0 -0
  140. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  141. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/animations/logo.py +0 -0
  142. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  143. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/arm/3_dof_arm.py +0 -0
  144. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/arm/7_dof_arm.py +0 -0
  145. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/arm/7_dof_arm_collision.py +0 -0
  146. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/arm/7_dof_arm_vp.py +0 -0
  147. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  148. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  149. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/arm/franka_fr3v2_viewplanning_nodal.py +0 -0
  150. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/car/dubins_car.py +0 -0
  151. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/car/dubins_car_disjoint.py +0 -0
  152. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  153. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/car/dubins_car_obstacle_stl.py +0 -0
  154. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/car/dubins_car_stl_or.py +0 -0
  155. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/car/dubins_car_waypoint_stl.py +0 -0
  156. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/double_integrator/_plotting.py +0 -0
  157. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/double_integrator/moving_safe_zones.py +0 -0
  158. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/2d_obstacle_avoidance_batched_ic.py +0 -0
  159. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/cinema_vp.py +0 -0
  160. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/cinema_vp_nodal.py +0 -0
  161. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/dr_double_integrator.py +0 -0
  162. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/dr_vp.py +0 -0
  163. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/dr_vp_nodal.py +0 -0
  164. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/dr_vp_polytope.py +0 -0
  165. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/drone_racing.py +0 -0
  166. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/drone_racing_batched_gates.py +0 -0
  167. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/logo.py +0 -0
  168. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/logo_utils/acl_logo.svg +0 -0
  169. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/logo_utils/openscvx_logo_single.svg +0 -0
  170. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/logo_utils/quadrotor_mesh.py +0 -0
  171. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/multi_agent_circle_swap.py +0 -0
  172. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/obstacle_avoidance.py +0 -0
  173. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  174. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  175. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/obstacle_avoidance_vmap_2d.py +0 -0
  176. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/drone/openscvx_logo.py +0 -0
  177. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/frax/panda_frax.py +0 -0
  178. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/frax/panda_frax_pick_place.py +0 -0
  179. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/frax/panda_frax_viewplanning.py +0 -0
  180. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/frax/panda_frax_waypoint.py +0 -0
  181. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mjx/cartpole_mjx.py +0 -0
  182. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mjx/double_cartpole_mjx.py +0 -0
  183. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mjx/skydio_x2_mjx.py +0 -0
  184. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  185. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mjx/triple_cartpole_game.py +0 -0
  186. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mjx/triple_cartpole_mjx.py +0 -0
  187. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mpc/double_integrator_discrete.py +0 -0
  188. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mpc/double_integrator_drone_racing.py +0 -0
  189. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  190. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  191. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  192. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/plotting.py +0 -0
  193. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/plotting_viser.py +0 -0
  194. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  195. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  196. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  197. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  198. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  199. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  200. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  201. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  202. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/cinema_vp_realtime.py +0 -0
  203. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/drone_racing_realtime.py +0 -0
  204. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/dubins_car_realtime.py +0 -0
  205. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  206. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/rocket/3DoF_pdg.py +0 -0
  207. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/rocket/6DoF_pdg.py +0 -0
  208. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/rocket/6DoF_pdg_batched_ic.py +0 -0
  209. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/rocket/ascent_launch_vehicle.py +0 -0
  210. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/spacecraft/halo_orbit.py +0 -0
  211. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/spacecraft/hohmann_transfer.py +0 -0
  212. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/spacecraft/let_transfer.py +0 -0
  213. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/spacecraft/proxops_cw.py +0 -0
  214. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/examples/spacecraft/relative_loitering.py +0 -0
  215. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/figures/ctlos_cine.gif +0 -0
  216. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/figures/ctlos_dr.gif +0 -0
  217. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/figures/dtlos_cine.gif +0 -0
  218. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/figures/dtlos_dr.gif +0 -0
  219. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/figures/openscvx_logo.svg +0 -0
  220. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/figures/openscvx_logo_square.png +0 -0
  221. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/figures/oscvx_structure_full_dark.svg +0 -0
  222. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/figures/video_preview.png +0 -0
  223. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/__init__.py +0 -0
  224. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/assets/stylesheets/custom.css +0 -0
  225. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  226. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  227. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/home.html +0 -0
  228. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/partials/home-diagram.html +0 -0
  229. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/partials/home-dropin-banner.html +0 -0
  230. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/partials/home-pipeline.html +0 -0
  231. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/material/overrides/partials/home-viser-strip.html +0 -0
  232. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/__init__.py +0 -0
  233. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/__main__.py +0 -0
  234. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/__init__.py +0 -0
  235. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/__init__.py +0 -0
  236. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/acceptance_ratio.py +0 -0
  237. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  238. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
  239. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/base.py +0 -0
  240. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  241. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  242. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/base.py +0 -0
  243. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/history.py +0 -0
  244. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/hyperparams.py +0 -0
  245. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/loop.py +0 -0
  246. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/optimization_results.py +0 -0
  247. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/penalty.py +0 -0
  248. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/scvx/__init__.py +0 -0
  249. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/scvx/iteration.py +0 -0
  250. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
  251. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/state.py +0 -0
  252. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/algorithms/weights.py +0 -0
  253. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/config.py +0 -0
  254. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/discretization/__init__.py +0 -0
  255. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/discretization/base.py +0 -0
  256. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/discretization/discretize_linearize.py +0 -0
  257. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/discretization/linearize_discretize.py +0 -0
  258. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  259. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  260. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  261. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  262. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/expert/__init__.py +0 -0
  263. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/expert/byof.py +0 -0
  264. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/expert/lowering.py +0 -0
  265. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/expert/validation.py +0 -0
  266. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/init/__init__.py +0 -0
  267. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/init/interpolation.py +0 -0
  268. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/init/inverse_kinematics.py +0 -0
  269. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/integrations/__init__.py +0 -0
  270. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/integrations/_utils.py +0 -0
  271. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/integrations/base.py +0 -0
  272. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/integrations/frax.py +0 -0
  273. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/integrations/menagerie.py +0 -0
  274. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/integrations/mjx.py +0 -0
  275. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/integrators/__init__.py +0 -0
  276. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/loader.py +0 -0
  277. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/lowered/__init__.py +0 -0
  278. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/lowered/cvxpy_constraints.py +0 -0
  279. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/lowered/cvxpy_variables.py +0 -0
  280. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/lowered/dynamics.py +0 -0
  281. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/lowered/jax_constraints.py +0 -0
  282. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/lowered/parameters.py +0 -0
  283. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/lowered/problem.py +0 -0
  284. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/lowered/unified.py +0 -0
  285. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/__init__.py +0 -0
  286. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/plotting.py +0 -0
  287. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/publication.py +0 -0
  288. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/scp_iteration.py +0 -0
  289. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/__init__.py +0 -0
  290. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/animated.py +0 -0
  291. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/coordinates.py +0 -0
  292. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/orbits.py +0 -0
  293. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/plotly_integration.py +0 -0
  294. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/primitives.py +0 -0
  295. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/scp.py +0 -0
  296. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/plotting/viser/server.py +0 -0
  297. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/problem.py +0 -0
  298. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/propagation/__init__.py +0 -0
  299. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/propagation/post_processing.py +0 -0
  300. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/propagation/propagation.py +0 -0
  301. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/solvers/__init__.py +0 -0
  302. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/solvers/base.py +0 -0
  303. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/solvers/cones.py +0 -0
  304. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
  305. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/solvers/moreau_ptr_solver.py +0 -0
  306. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/solvers/ptr_solver.py +0 -0
  307. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/solvers/qpax_ptr_solver.py +0 -0
  308. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/__init__.py +0 -0
  309. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/affine.py +0 -0
  310. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/augmentation.py +0 -0
  311. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/builder.py +0 -0
  312. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/canonicalize.py +0 -0
  313. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/constraint_set.py +0 -0
  314. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/__init__.py +0 -0
  315. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/arithmetic.py +0 -0
  316. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/array.py +0 -0
  317. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/constraint.py +0 -0
  318. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/control.py +0 -0
  319. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/expr.py +0 -0
  320. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  321. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  322. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/lie/se3.py +0 -0
  323. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/lie/so3.py +0 -0
  324. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/linalg.py +0 -0
  325. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/logic.py +0 -0
  326. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/math.py +0 -0
  327. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/parameter.py +0 -0
  328. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/spatial.py +0 -0
  329. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/state.py +0 -0
  330. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/stl.py +0 -0
  331. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/stljax.py +0 -0
  332. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/time.py +0 -0
  333. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/variable.py +0 -0
  334. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/expr/vmap.py +0 -0
  335. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/hashing.py +0 -0
  336. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lower.py +0 -0
  337. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/__init__.py +0 -0
  338. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  339. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  340. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  341. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  342. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  343. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  344. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  345. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/__init__.py +0 -0
  346. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/_lowerer.py +0 -0
  347. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/_registry.py +0 -0
  348. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/formulation.py +0 -0
  349. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/lie.py +0 -0
  350. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/spatial.py +0 -0
  351. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/state.py +0 -0
  352. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/lowerers/latex/stl.py +0 -0
  353. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/__init__.py +0 -0
  354. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/_registry.py +0 -0
  355. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/constraint.py +0 -0
  356. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/parser.py +0 -0
  357. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/parser/tokenizer.py +0 -0
  358. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/preprocessing.py +0 -0
  359. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/problem.py +0 -0
  360. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/sparsity.py +0 -0
  361. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/symbolic/unified.py +0 -0
  362. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/utils/__init__.py +0 -0
  363. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/utils/cache.py +0 -0
  364. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/utils/caching.py +0 -0
  365. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/utils/printing.py +0 -0
  366. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/utils/profiling.py +0 -0
  367. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx/utils/utils.py +0 -0
  368. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx.egg-info/dependency_links.txt +0 -0
  369. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx.egg-info/entry_points.txt +0 -0
  370. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx.egg-info/requires.txt +0 -0
  371. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/openscvx.egg-info/top_level.txt +0 -0
  372. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/pyproject.toml +0 -0
  373. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  374. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/setup.cfg +0 -0
  375. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/__init__.py +0 -0
  376. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/__init__.py +0 -0
  377. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/_iteration_helpers.py +0 -0
  378. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/autotuner/__init__.py +0 -0
  379. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/autotuner/test_defaults_agreement.py +0 -0
  380. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/autotuner/test_hyper_overrides.py +0 -0
  381. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
  382. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
  383. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/test_iteration_fn_jit.py +0 -0
  384. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/test_iteration_fn_parity.py +0 -0
  385. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/algorithms/test_make_solve_loop.py +0 -0
  386. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/brachistochrone_analytical.py +0 -0
  387. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/conftest.py +0 -0
  388. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/__init__.py +0 -0
  389. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_brachistochrone.py +0 -0
  390. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_impulsive.py +0 -0
  391. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_multishot_propagation.py +0 -0
  392. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_batched_brachistochrone.py +0 -0
  393. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_batched_cvxpy_export_errors.py +0 -0
  394. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_batched_export_roundtrip.py +0 -0
  395. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_jax_bare_brachistochrone.py +0 -0
  396. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_jax_jit_brachistochrone.py +0 -0
  397. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_jax_vmap_brachistochrone.py +0 -0
  398. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/e2e/test_solve_jax_vmap_converged_no_drift.py +0 -0
  399. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/fixtures/brachistochrone.json +0 -0
  400. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/fixtures/brachistochrone.yaml +0 -0
  401. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/hohmann_analytical.py +0 -0
  402. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/integrations/__init__.py +0 -0
  403. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/integrations/test_mjx.py +0 -0
  404. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/integrations/test_mjx_dynamics.py +0 -0
  405. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/__init__.py +0 -0
  406. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/_iteration_callback_helpers.py +0 -0
  407. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
  408. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/test_iteration_callback_cvxpy.py +0 -0
  409. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/test_iteration_callback_moreau.py +0 -0
  410. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/test_iteration_callback_qpax.py +0 -0
  411. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/test_iteration_callback_vmap.py +0 -0
  412. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/test_moreau_ptr_solver.py +0 -0
  413. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/test_qpax_ptr_solver.py +0 -0
  414. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/solvers/test_subproblem_pytree.py +0 -0
  415. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/__init__.py +0 -0
  416. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/__init__.py +0 -0
  417. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_arithmetic.py +0 -0
  418. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_array.py +0 -0
  419. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_constraint.py +0 -0
  420. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_expr.py +0 -0
  421. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_lie.py +0 -0
  422. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_linalg.py +0 -0
  423. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_logic.py +0 -0
  424. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_math.py +0 -0
  425. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_node_reference.py +0 -0
  426. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_parameters.py +0 -0
  427. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_scaling.py +0 -0
  428. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_spatial.py +0 -0
  429. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_stl.py +0 -0
  430. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_variable.py +0 -0
  431. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/expr/test_vmap.py +0 -0
  432. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/__init__.py +0 -0
  433. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_array.py +0 -0
  434. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_constraint.py +0 -0
  435. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_lie.py +0 -0
  436. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_linalg.py +0 -0
  437. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_load.py +0 -0
  438. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_logic.py +0 -0
  439. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_math.py +0 -0
  440. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_parser.py +0 -0
  441. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_spatial.py +0 -0
  442. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_stl.py +0 -0
  443. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_tokenizer.py +0 -0
  444. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/parser/test_vmap.py +0 -0
  445. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_augmentation.py +0 -0
  446. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_gmsr.py +0 -0
  447. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_hashing.py +0 -0
  448. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_latex_formulation.py +0 -0
  449. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_lower_cvxpy.py +0 -0
  450. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_lower_jax.py +0 -0
  451. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_lower_latex.py +0 -0
  452. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_preprocessing.py +0 -0
  453. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_sparsity.py +0 -0
  454. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/symbolic/test_unified.py +0 -0
  455. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_autotuning.py +0 -0
  456. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_cvxpygen_optional.py +0 -0
  457. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_discretization.py +0 -0
  458. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_examples.py +0 -0
  459. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_expert.py +0 -0
  460. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_init.py +0 -0
  461. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_integrators.py +0 -0
  462. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_loader.py +0 -0
  463. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_optimization_results.py +0 -0
  464. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_plotting.py +0 -0
  465. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_post_process_batched_tau_clamp.py +0 -0
  466. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_propagation.py +0 -0
  467. {openscvx-0.5.3.dev39 → openscvx-0.5.3.dev40}/tests/test_results_parameters.py +0 -0
  468. {openscvx-0.5.3.dev39 → 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.dev39
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/examples/)
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/examples/)
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
- # Exact Discretization
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
- !!! Warning
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
- # What is Succesive Convexification?
2
- !!! Warning
3
- This page is still under development :construction:.
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 there problem in the Mayer Form order to take full advantage of the features of this repo, but not worry this is quite easy.
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
@@ -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.
@@ -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.
@@ -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.
@@ -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,9 @@
1
+ ---
2
+ noindex: true
3
+ search:
4
+ exclude: true
5
+ ---
6
+
1
7
  # 06 Dubin's Car: Conditional Statements and Signal Temporal Logic
2
8
 
3
9
  !!! Warning "Work In Progress"
@@ -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 the following works:
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
- An Open-Source Modular and Extensible Nonlinear Trajectory Optimization Package
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>