openscvx 0.4.1.dev42__tar.gz → 0.4.1.dev45__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 (303) hide show
  1. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/_docs.yml +1 -1
  2. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/lint.yml +1 -1
  3. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/tests-integration.yml +1 -1
  4. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/tests-unit.yml +1 -1
  5. {openscvx-0.4.1.dev42/openscvx.egg-info → openscvx-0.4.1.dev45}/PKG-INFO +108 -183
  6. openscvx-0.4.1.dev45/README.md +233 -0
  7. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/logo.py +30 -20
  8. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/logo_utils/svg_path_utils.py +8 -3
  9. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/plotting_viser.py +234 -162
  10. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/_version.py +3 -3
  11. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45/openscvx.egg-info}/PKG-INFO +108 -183
  12. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_examples.py +10 -0
  13. openscvx-0.4.1.dev42/README.md +0 -308
  14. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/assets/logo.svg +0 -0
  15. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/release-drafter.yml +0 -0
  16. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/branch-name.yml +0 -0
  17. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/docs.yml +0 -0
  18. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/nightly.yml +0 -0
  19. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/release-drafter.yml +0 -0
  20. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/release.yml +0 -0
  21. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.gitignore +0 -0
  22. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/CONTRIBUTING.md +0 -0
  23. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/LICENSE +0 -0
  24. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/constraint_reformulation.md +0 -0
  25. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/control_parameterization.md +0 -0
  26. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/discretization.md +0 -0
  27. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/ocp.md +0 -0
  28. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/scvx.md +0 -0
  29. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/time_dilation.md +0 -0
  30. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UnderTheHood/lowering_architecture.md +0 -0
  31. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  32. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/00_introduction.md +0 -0
  33. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  34. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  35. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  36. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  37. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/05_visualization.md +0 -0
  38. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/06_logic.md +0 -0
  39. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/07_lie.md +0 -0
  40. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/favicon.png +0 -0
  41. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/ct-scvx_dark.png +0 -0
  42. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/ct-scvx_light.png +0 -0
  43. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/ctcs_dark.png +0 -0
  44. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/ctcs_light.png +0 -0
  45. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/problem_class_dark.png +0 -0
  46. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/problem_class_light.png +0 -0
  47. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/logo.svg +0 -0
  48. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/citation.md +0 -0
  49. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/examples.md +0 -0
  50. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/getting-started.md +0 -0
  51. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/index.md +0 -0
  52. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/javascripts/mathjax.js +0 -0
  53. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/abstract/brachistochrone.py +0 -0
  54. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/arm/three_link_arm.py +0 -0
  55. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/car/dubins_car.py +0 -0
  56. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/car/dubins_car_conditional.py +0 -0
  57. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/car/dubins_car_disjoint.py +0 -0
  58. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/car/dubins_car_stljax.py +0 -0
  59. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/cinema_vp.py +0 -0
  60. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/dr_double_integrator.py +0 -0
  61. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/dr_vp.py +0 -0
  62. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/dr_vp_nodal.py +0 -0
  63. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/dr_vp_polytope.py +0 -0
  64. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/drone_racing.py +0 -0
  65. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/logo_utils/acl_logo.svg +0 -0
  66. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/obstacle_avoidance.py +0 -0
  67. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  68. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  69. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/plotting.py +0 -0
  70. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  71. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  72. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  73. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/cinema_vp_realtime.py +0 -0
  74. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/drone_racing_realtime.py +0 -0
  75. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/dubins_car_realtime.py +0 -0
  76. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  77. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/rocket/3DoF_pdg.py +0 -0
  78. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/spacecraft/proxops_cw.py +0 -0
  79. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/ctlos_cine.gif +0 -0
  80. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/ctlos_dr.gif +0 -0
  81. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/dtlos_cine.gif +0 -0
  82. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/dtlos_dr.gif +0 -0
  83. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/openscvx_logo.svg +0 -0
  84. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/openscvx_logo_square.png +0 -0
  85. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/oscvx_structure_full_dark.svg +0 -0
  86. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/video_preview.png +0 -0
  87. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/__init__.py +0 -0
  88. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background.avif +0 -0
  89. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
  90. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
  91. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
  92. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
  93. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars.avif +0 -0
  94. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
  95. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
  96. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
  97. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
  98. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon.avif +0 -0
  99. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
  100. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
  101. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
  102. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
  103. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
  104. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
  105. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
  106. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
  107. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
  108. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space.avif +0 -0
  109. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
  110. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
  111. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
  112. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
  113. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth.avif +0 -0
  114. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
  115. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
  116. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
  117. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
  118. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/javascripts/parallax.js +0 -0
  119. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/logo.svg +0 -0
  120. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/stylesheets/custom.css +0 -0
  121. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/stylesheets/parallax.css +0 -0
  122. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/home.html +0 -0
  123. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/main.html +0 -0
  124. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/partials/parallax/hero.html +0 -0
  125. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/partials/parallax.html +0 -0
  126. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/mkdocs.yml +0 -0
  127. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/__init__.py +0 -0
  128. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/__main__.py +0 -0
  129. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/__init__.py +0 -0
  130. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/autotuning.py +0 -0
  131. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/base.py +0 -0
  132. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/optimization_results.py +0 -0
  133. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/penalized_trust_region.py +0 -0
  134. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/config.py +0 -0
  135. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/discretization/__init__.py +0 -0
  136. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/discretization/discretization.py +0 -0
  137. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/expert/__init__.py +0 -0
  138. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/expert/byof.py +0 -0
  139. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/expert/lowering.py +0 -0
  140. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/expert/validation.py +0 -0
  141. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/init/__init__.py +0 -0
  142. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/init/interpolation.py +0 -0
  143. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/integrators/__init__.py +0 -0
  144. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/integrators/runge_kutta.py +0 -0
  145. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/loader.py +0 -0
  146. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/__init__.py +0 -0
  147. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/cvxpy_constraints.py +0 -0
  148. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/cvxpy_variables.py +0 -0
  149. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/dynamics.py +0 -0
  150. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/jax_constraints.py +0 -0
  151. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/parameters.py +0 -0
  152. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/problem.py +0 -0
  153. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/unified.py +0 -0
  154. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/__init__.py +0 -0
  155. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/plotting.py +0 -0
  156. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/scp_iteration.py +0 -0
  157. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/__init__.py +0 -0
  158. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/animated.py +0 -0
  159. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/plotly_integration.py +0 -0
  160. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/primitives.py +0 -0
  161. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/scp.py +0 -0
  162. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/server.py +0 -0
  163. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/problem.py +0 -0
  164. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/propagation/__init__.py +0 -0
  165. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/propagation/post_processing.py +0 -0
  166. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/propagation/propagation.py +0 -0
  167. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/solvers/__init__.py +0 -0
  168. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/solvers/base.py +0 -0
  169. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/solvers/ptr_solver.py +0 -0
  170. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/__init__.py +0 -0
  171. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/augmentation.py +0 -0
  172. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/builder.py +0 -0
  173. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/constraint_set.py +0 -0
  174. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/__init__.py +0 -0
  175. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/arithmetic.py +0 -0
  176. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/array.py +0 -0
  177. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/constraint.py +0 -0
  178. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/control.py +0 -0
  179. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/expr.py +0 -0
  180. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  181. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  182. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/lie/se3.py +0 -0
  183. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/lie/so3.py +0 -0
  184. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/linalg.py +0 -0
  185. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/logic.py +0 -0
  186. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/math.py +0 -0
  187. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/spatial.py +0 -0
  188. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/state.py +0 -0
  189. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/stl.py +0 -0
  190. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/variable.py +0 -0
  191. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/vmap.py +0 -0
  192. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/hashing.py +0 -0
  193. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lower.py +0 -0
  194. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/__init__.py +0 -0
  195. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  196. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  197. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  198. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  199. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  200. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  201. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  202. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  203. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  204. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  205. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  206. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  207. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  208. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  209. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  210. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  211. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  212. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  213. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  214. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  215. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  216. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  217. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  218. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  219. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  220. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  221. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  222. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  223. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/__init__.py +0 -0
  224. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/_registry.py +0 -0
  225. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/array.py +0 -0
  226. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/constraint.py +0 -0
  227. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/lie.py +0 -0
  228. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/linalg.py +0 -0
  229. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/logic.py +0 -0
  230. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/math.py +0 -0
  231. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/parser.py +0 -0
  232. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/spatial.py +0 -0
  233. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/stl.py +0 -0
  234. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/tokenizer.py +0 -0
  235. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/preprocessing.py +0 -0
  236. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/problem.py +0 -0
  237. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/time.py +0 -0
  238. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/unified.py +0 -0
  239. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/__init__.py +0 -0
  240. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/cache.py +0 -0
  241. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/caching.py +0 -0
  242. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/printing.py +0 -0
  243. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/profiling.py +0 -0
  244. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/utils.py +0 -0
  245. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/SOURCES.txt +0 -0
  246. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/dependency_links.txt +0 -0
  247. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/entry_points.txt +0 -0
  248. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/requires.txt +0 -0
  249. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/top_level.txt +0 -0
  250. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/pyproject.toml +0 -0
  251. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/scripts/gen_example_pages.py +0 -0
  252. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/scripts/gen_ref_pages.py +0 -0
  253. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/setup.cfg +0 -0
  254. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/__init__.py +0 -0
  255. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/brachistochrone_analytical.py +0 -0
  256. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/fixtures/brachistochrone.json +0 -0
  257. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/fixtures/brachistochrone.yaml +0 -0
  258. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/__init__.py +0 -0
  259. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/__init__.py +0 -0
  260. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_arithmetic.py +0 -0
  261. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_array.py +0 -0
  262. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_constraint.py +0 -0
  263. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_expr.py +0 -0
  264. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_lie.py +0 -0
  265. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_linalg.py +0 -0
  266. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_logic.py +0 -0
  267. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_math.py +0 -0
  268. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_node_reference.py +0 -0
  269. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_parameters.py +0 -0
  270. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_scaling.py +0 -0
  271. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_spatial.py +0 -0
  272. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_variable.py +0 -0
  273. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_vmap.py +0 -0
  274. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/__init__.py +0 -0
  275. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_array.py +0 -0
  276. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_constraint.py +0 -0
  277. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_lie.py +0 -0
  278. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_linalg.py +0 -0
  279. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_load.py +0 -0
  280. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_logic.py +0 -0
  281. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_math.py +0 -0
  282. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_parser.py +0 -0
  283. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_spatial.py +0 -0
  284. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_stl.py +0 -0
  285. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_tokenizer.py +0 -0
  286. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_vmap.py +0 -0
  287. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_augmentation.py +0 -0
  288. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_hashing.py +0 -0
  289. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_lower_cvxpy.py +0 -0
  290. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_lower_jax.py +0 -0
  291. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_preprocessing.py +0 -0
  292. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_unified.py +0 -0
  293. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_autotuning.py +0 -0
  294. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_brachistochrone.py +0 -0
  295. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_cvxpygen_optional.py +0 -0
  296. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_discretization.py +0 -0
  297. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_expert.py +0 -0
  298. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_init.py +0 -0
  299. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_integrators.py +0 -0
  300. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_loader.py +0 -0
  301. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_optimization_results.py +0 -0
  302. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_plotting.py +0 -0
  303. {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_propagation.py +0 -0
@@ -28,7 +28,7 @@ jobs:
28
28
  - name: Set up Python
29
29
  uses: actions/setup-python@v5
30
30
  with:
31
- python-version: '3.13'
31
+ python-version: '3.14'
32
32
 
33
33
  - name: Install uv
34
34
  uses: astral-sh/setup-uv@v7
@@ -19,7 +19,7 @@ jobs:
19
19
  - name: Set up Python
20
20
  uses: actions/setup-python@v5
21
21
  with:
22
- python-version: '3.13'
22
+ python-version: '3.14'
23
23
 
24
24
  - name: Install uv
25
25
  uses: astral-sh/setup-uv@v7
@@ -17,7 +17,7 @@ jobs:
17
17
  fail-fast: false # Continue testing other examples even if one fails
18
18
  matrix:
19
19
  os: [ubuntu-latest, macos-latest]
20
- python-version: ['3.11', '3.12', '3.13']
20
+ python-version: ['3.11', '3.12', '3.13', '3.14']
21
21
 
22
22
  steps:
23
23
  - name: Checkout repository
@@ -18,7 +18,7 @@ jobs:
18
18
  fail-fast: false # Continue testing other versions even if one fails
19
19
  matrix:
20
20
  os: [ubuntu-latest, macos-latest]
21
- python-version: ['3.11', '3.12', '3.13']
21
+ python-version: ['3.11', '3.12', '3.13', '3.14']
22
22
 
23
23
  steps:
24
24
  - name: Checkout repository
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.4.1.dev42
3
+ Version: 0.4.1.dev45
4
4
  Summary: A general Python-based successive convexification implementation which uses a JAX backend.
5
5
  Author-email: Chris Hayner and Griffin Norris <haynec@uw.edu>
6
6
  License: Apache Software License
@@ -60,248 +60,173 @@ Dynamic: license-file
60
60
  <!-- PROJECT LOGO -->
61
61
  <br />
62
62
 
63
- <!-- GETTING STARTED -->
64
- ## Getting Started
63
+ ## What is OpenSCvx
65
64
 
66
- ### Installation
65
+ OpenSCvx is a general python-based successive convexification implementation which uses a JAX backend.
66
+ It is designed to be easy to use for anyone and fast enough for everyone, all while being open and modular for contributors.
67
67
 
68
- <details>
69
- <summary>Stable</summary>
68
+ OpenSCvx provides a clean symbolic interface for problem definition which should be intuitive to users of NumPy, JAX, and CVXPY. This allows us to hide a lot of the under-the-hood magic away from the user while also providing a modular architecture, enabling contributors to focus on the algorithms without worrying about interface design.
70
69
 
71
- To grab the latest stable release simply run
70
+ OpenSCvx makes heavy use of [JAX](https://github.com/jax-ml/jax) to efficiently perform calculations in the successive convex programming loop through automatic differentiation, ahead-of-time (AOT) compilation, vectorization, and GPU acceleration. Behind this is a [CVXPY](https://github.com/cvxpy/cvxpy/)-based backend to solve the convex subproblems.
72
71
 
73
- ```sh
74
- pip install openscvx
75
- ```
72
+ This is an open project and is under active development. Try it out, give us feedback, and help contribute.
76
73
 
77
- to install OpenSCVx in your python environment.
74
+ ```python
75
+ import openscvx as ox
78
76
 
79
- Or using uv:
77
+ g = 9.81
80
78
 
81
- ```sh
82
- uv pip install openscvx
83
- ```
79
+ # Define states
80
+ position = ox.State("position", shape=(2,))
81
+ position.min = [0.0, 0.0]
82
+ position.max = [10.0, 10.0]
83
+ position.initial = [0.0, 10.0]
84
+ position.final = [10.0, 5.0]
84
85
 
85
- For optional dependencies:
86
+ velocity = ox.State("velocity", shape=(1,))
87
+ velocity.min = [0.0]
88
+ velocity.max = [10.0]
89
+ velocity.initial = [0.0]
90
+ velocity.final = [ox.Free(10.0)]
86
91
 
87
- ```sh
88
- pip install openscvx[gui,cvxpygen]
89
- # or with uv
90
- uv pip install openscvx[gui,cvxpygen]
91
- ```
92
- </details>
93
-
94
- <details>
95
- <summary>Nightly</summary>
92
+ # Define control (angle from vertical)
93
+ theta = ox.Control("theta", shape=(1,))
94
+ theta.min = [0.0]
95
+ theta.max = [1.755]
96
+ theta.guess = [[0.09], [1.755]]
96
97
 
97
- To install the latest development version (nightly):
98
+ # Define dynamics
99
+ dynamics = {
100
+ "position": ox.Concat(
101
+ velocity * ox.Sin(theta),
102
+ -velocity * ox.Cos(theta),
103
+ ),
104
+ "velocity": g * ox.Cos(theta),
105
+ }
98
106
 
99
- ```sh
100
- pip install --pre openscvx
107
+ constraints = []
108
+ for state in [position, velocity]:
109
+ constraints.append(ox.ctcs(state <= state.max))
110
+ constraints.append(ox.ctcs(state.min <= state))
111
+
112
+ # Build and solve
113
+ problem = ox.Problem(
114
+ dynamics=dynamics,
115
+ constraints=constraints,
116
+ states=[position, velocity],
117
+ controls=[theta],
118
+ time=ox.Time(initial=0.0, final=ox.Minimize(2.0), min=0.0, max=2.0),
119
+ N=2,
120
+ )
121
+
122
+
123
+ problem.initialize()
124
+ results = problem.solve()
125
+ results = problem.post_process()
101
126
  ```
102
127
 
103
- With optional dependencies:
128
+ ## Installation
104
129
 
105
- ```sh
106
- pip install --pre openscvx[gui,cvxpygen]
107
- ```
130
+ OpenSCvx is available on [PyPI](https://pypi.org/project/openscvx/) and can be trivially installed with pip.
108
131
 
109
- Or using uv:
132
+ It is recommended to install OpenSCvx inside a virtual environment (venv, conda, uv, *etc.*). If you don't already have one set up:
110
133
 
111
- ```sh
112
- uv pip install --pre openscvx
113
- # With optional dependencies
114
- uv pip install --pre openscvx[gui,cvxpygen]
134
+ ```bash
135
+ python3 -m venv .venv
136
+ source .venv/bin/activate
115
137
  ```
116
138
 
117
- **Note:** The `--pre` flag tells pip/uv to install pre-release versions (e.g., `1.2.4.dev3`) from PyPI.
118
-
119
- Alternatively, for local development with the latest source:
120
-
121
- ```sh
122
- # Clone the repo
123
- git clone https://github.com/OpenSCvx/OpenSCvx.git
124
- cd OpenSCvx
139
+ ### Using pip
125
140
 
126
- # Install in editable/development mode
127
- pip install -e .
128
- # or with uv
129
- uv pip install -e .
141
+ ```bash
142
+ pip install openscvx
130
143
  ```
131
144
 
132
- </details>
145
+ ### Using uv
133
146
 
134
- ### Dependencies
147
+ If you have [uv installed](https://docs.astral.sh/uv/getting-started/installation/) you can prefix the commands with `uv` for faster installation:
135
148
 
136
- The main packages are:
137
-
138
- - `cvxpy` - is used to formulate and solve the convex subproblems
139
- - `jax` - is used for determining the Jacobians using automatic differentiation, vectorization, and ahead-of-time (AOT) compilation of the dynamics and their Jacobians
140
- - `numpy` - is used for numerical operations
141
- - `diffrax` - is used for the numerical integration of the dynamics
142
- - `termcolor` - is used for pretty command line output
143
- - `plotly` - is used for all visualizations
144
-
145
- These will be installed automatically, but can be installed via conda or pip if you are building from source.
149
+ ```bash
150
+ uv pip install openscvx
151
+ ```
146
152
 
147
- #### GUI Dependencies (Optional)
153
+ > [!TIP]
154
+ > **Optional Dependencies**
155
+ >
156
+ > For GUI support or CVXPYGen code generation:
157
+ > ```bash
158
+ > pip install openscvx[gui,cvxpygen]
159
+ > ```
148
160
 
149
- For interactive 3D plotting and real-time visualization, additional packages are required:
161
+ > [!TIP]
162
+ > **Nightly Builds**
163
+ >
164
+ > To install the latest development version (nightly), use the `--pre` flag:
165
+ > ```bash
166
+ > pip install --pre openscvx
167
+ > ```
150
168
 
151
- - `pyqtgraph` - is used for interactive 3D plotting and real-time visualization
152
- - `PyQt5` - provides the Qt5 GUI framework for pyqtgraph
153
- - `scipy` - is used for spatial transformations in plotting functions
154
- - `PyOpenGL` - provides OpenGL bindings for Python, required for 3D plotting
155
- - `PyOpenGL_accelerate` - (optional) speeds up PyOpenGL
169
+ ## Installing From Source
156
170
 
171
+ ### Using pip
157
172
 
158
- For local development:
173
+ ```bash
174
+ git clone https://github.com/OpenSCvx/OpenSCvx.git
175
+ cd OpenSCvx
159
176
 
160
- ```sh
161
- pip install -e ".[gui]"
177
+ python3 -m venv .venv
178
+ source .venv/bin/activate
179
+ pip install -e .
162
180
  ```
163
181
 
164
- #### CVXPYGen Dependencies (Optional)
165
-
166
- For code generation and faster solver performance, CVXPYGen can be installed:
167
-
168
- - `cvxpygen` - enables code generation for faster solver performance
169
- - `qocogen` - custom solver backend for CVXPYGen (included with cvxpygen extras)
182
+ ### Using uv
170
183
 
171
- To install with CVXPYGen support:
172
-
173
- ```sh
174
- pip install openscvx[cvxpygen]
175
- ```
176
-
177
- Or for both GUI and CVXPYGen:
184
+ ```bash
185
+ git clone https://github.com/OpenSCvx/OpenSCvx.git
186
+ cd OpenSCvx
178
187
 
179
- ```sh
180
- pip install openscvx[gui,cvxpygen]
188
+ uv venv
189
+ source .venv/bin/activate
190
+ uv pip install -e .
181
191
  ```
182
192
 
183
- CVXPYGen features include:
184
- - Automatic C++ code generation for optimization problems
185
- - Faster solver performance through compiled code
186
- - Support for custom solver backends like QOCOGen
193
+ ## Getting Started
187
194
 
188
- ### Local Development
195
+ Check out the OpenSCvx documentation to help you get started
189
196
 
190
- This git repository can be installed using https
197
+ - [Getting Started Docs](https://openscvx.github.io/OpenSCvx/latest/getting-started/)
198
+ - [Users Guide](https://openscvx.github.io/OpenSCvx/latest/UsersGuide/00_introduction/)
199
+ - [API Reference](https://openscvx.github.io/OpenSCvx/latest/Reference/problem/)
191
200
 
192
- ```sh
193
- git clone https://github.com/OpenSCvx/OpenSCvx.git
194
- ```
201
+ ### Running the Examples
195
202
 
196
- or ssh
203
+ We also have a selection of problems in the `examples/` folder as well as on the [Examples page](https://openscvx.github.io/OpenSCvx/latest/Examples/abstract/brachistochrone/) of the documentation. The example trajectory optimization problems are grouped by application and represent some of the problem types that can be solved by OpenSCvx.
197
204
 
198
- ```sh
199
- git clone git@github.com:OpenSCvx/OpenSCvx.git
200
- ```
205
+ > [!Note]
206
+ > To run the examples, you'll need to clone this repository and install OpenSCvx in editable mode (`pip install -e .`). See the [Installing From Source](#installing-from-source) section above for detailed installation instructions.
201
207
 
202
- Dependencies can then be installed using Conda or Pip
203
-
204
- <details>
205
- <summary>Via Conda</summary>
206
-
207
- 1. Clone the repo using https or ssh
208
- 2. Create a conda environment with Python:
209
- ```sh
210
- conda create -n openscvx python>=3.9
211
- ```
212
- 3. Activate the environment:
213
- ```sh
214
- conda activate openscvx
215
- ```
216
- 4. Install the package with dependencies:
217
- ```sh
218
- pip install -e .
219
- ```
220
-
221
- Or install with optional dependencies:
222
- ```sh
223
- pip install -e ".[gui,cvxpygen]"
224
- ```
225
- </details>
226
-
227
- <details>
228
- <summary>Via uv</summary>
229
-
230
- 1. Prerequisites
231
- - Install [uv](https://docs.astral.sh/uv/getting-started/installation/)
232
- 2. Clone the repo using https or ssh
233
- 3. Create virtual environment and install the package:
234
- ```sh
235
- uv venv
236
- source .venv/bin/activate # On Windows: .venv\Scripts\activate
237
- uv pip install -e .
238
- ```
239
-
240
- Or install with optional dependencies:
241
- ```sh
242
- uv pip install -e ".[gui,cvxpygen]"
243
- ```
244
- </details>
245
-
246
- <details>
247
- <summary>Via pip</summary>
248
-
249
- 1. Prerequisites
250
- Python >= 3.9
251
- 2. Clone the repo using https or ssh
252
- 3. Create virtual environment (called `venv` here) and source it
253
- ```sh
254
- python3 -m venv venv
255
- source venv/bin/activate
256
- ```
257
- 4. Install the package with dependencies:
258
- ```sh
259
- pip install -e .
260
- ```
261
-
262
- Or install with optional dependencies:
263
- ```sh
264
- pip install -e ".[gui,cvxpygen]"
265
- ```
266
- </details>
267
-
268
- ### Running Trajectory Optimization
269
-
270
- See `examples/` folder for several example trajectory optimization problems grouped by application.
271
208
  To run a problem simply run any of the examples directly, for example:
272
209
 
273
210
  ```sh
274
211
  python3 examples/abstract/brachistochrone.py
275
212
  ```
276
213
 
277
- > **Note:** To run the examples, you'll need to clone this repository and install OpenSCvx in editable mode (`pip install -e .`). See the [Local Development](#local-development) section above for detailed installation instructions.
278
-
279
214
  and adjust the plotting as needed.
280
215
 
281
216
  Check out the problem definitions inside `examples/` to see how to define your own problems.
282
217
 
283
218
  ## Code Structure
284
- <img src="figures/oscvx_structure_full_dark.svg" width="1200"/>
285
-
286
- ## ToDos
287
219
 
288
- - [X] Standardized Vehicle and Constraint classes
289
- - [X] Implement QOCOGen with CVPYGEN
290
- - [X] Non-Dilated Time Propagation
291
- - [X] Save and reload the compiled JAX code
292
- - [x] Unified Mathematical Interface
293
- - [ ] Auto-SCvx Weight Tuning
294
- - [ ] Compiled at the subproblem level with JAX
295
- - [ ] Single Shot propagation
220
+ <img src="figures/oscvx_structure_full_dark.svg" width="1200"/>
296
221
 
297
222
  ## What is implemented
298
223
 
299
224
  This repo has the following features:
300
225
 
301
226
  1. Free Final Time
302
- 2. Fully adaptive time dilation (```s``` is appended to the control vector)
227
+ 2. Fully adaptive time dilation (`s` is appended to the control vector)
303
228
  3. Continuous-Time Constraint Satisfaction
304
- 4. FOH and ZOH exact discretization (```t``` is a state so you can bring your own scheme)
229
+ 4. FOH and ZOH exact discretization (`t` is a state so you can bring your own scheme)
305
230
  6. Vectorized and Ahead-of-Time (AOT) Compiled Multishooting Discretization
306
231
  7. JAX Autodiff for Jacobians
307
232
 
@@ -0,0 +1,233 @@
1
+ <a id="readme-top"></a>
2
+
3
+ <img src="figures/openscvx_logo.svg" width="1200"/>
4
+ <p align="center">
5
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml/badge.svg"/></a>
6
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml/badge.svg"/></a>
7
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml/badge.svg"/></a>
8
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml/badge.svg"/></a>
9
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml/badge.svg?event=release"/></a>
10
+ </p>
11
+ <p align="center">
12
+ <a href="https://arxiv.org/abs/2410.22596"><img src="http://img.shields.io/badge/arXiv-2410.22596-B31B1B.svg"/></a>
13
+ <a href="https://www.apache.org/licenses/LICENSE-2.0"><img src="https://img.shields.io/badge/License-Apache_2.0-blue.svg" alt="License: Apache 2.0"/></a>
14
+ </p>
15
+
16
+ <!-- PROJECT LOGO -->
17
+ <br />
18
+
19
+ ## What is OpenSCvx
20
+
21
+ OpenSCvx is a general python-based successive convexification implementation which uses a JAX backend.
22
+ It is designed to be easy to use for anyone and fast enough for everyone, all while being open and modular for contributors.
23
+
24
+ OpenSCvx provides a clean symbolic interface for problem definition which should be intuitive to users of NumPy, JAX, and CVXPY. This allows us to hide a lot of the under-the-hood magic away from the user while also providing a modular architecture, enabling contributors to focus on the algorithms without worrying about interface design.
25
+
26
+ OpenSCvx makes heavy use of [JAX](https://github.com/jax-ml/jax) to efficiently perform calculations in the successive convex programming loop through automatic differentiation, ahead-of-time (AOT) compilation, vectorization, and GPU acceleration. Behind this is a [CVXPY](https://github.com/cvxpy/cvxpy/)-based backend to solve the convex subproblems.
27
+
28
+ This is an open project and is under active development. Try it out, give us feedback, and help contribute.
29
+
30
+ ```python
31
+ import openscvx as ox
32
+
33
+ g = 9.81
34
+
35
+ # Define states
36
+ position = ox.State("position", shape=(2,))
37
+ position.min = [0.0, 0.0]
38
+ position.max = [10.0, 10.0]
39
+ position.initial = [0.0, 10.0]
40
+ position.final = [10.0, 5.0]
41
+
42
+ velocity = ox.State("velocity", shape=(1,))
43
+ velocity.min = [0.0]
44
+ velocity.max = [10.0]
45
+ velocity.initial = [0.0]
46
+ velocity.final = [ox.Free(10.0)]
47
+
48
+ # Define control (angle from vertical)
49
+ theta = ox.Control("theta", shape=(1,))
50
+ theta.min = [0.0]
51
+ theta.max = [1.755]
52
+ theta.guess = [[0.09], [1.755]]
53
+
54
+ # Define dynamics
55
+ dynamics = {
56
+ "position": ox.Concat(
57
+ velocity * ox.Sin(theta),
58
+ -velocity * ox.Cos(theta),
59
+ ),
60
+ "velocity": g * ox.Cos(theta),
61
+ }
62
+
63
+ constraints = []
64
+ for state in [position, velocity]:
65
+ constraints.append(ox.ctcs(state <= state.max))
66
+ constraints.append(ox.ctcs(state.min <= state))
67
+
68
+ # Build and solve
69
+ problem = ox.Problem(
70
+ dynamics=dynamics,
71
+ constraints=constraints,
72
+ states=[position, velocity],
73
+ controls=[theta],
74
+ time=ox.Time(initial=0.0, final=ox.Minimize(2.0), min=0.0, max=2.0),
75
+ N=2,
76
+ )
77
+
78
+
79
+ problem.initialize()
80
+ results = problem.solve()
81
+ results = problem.post_process()
82
+ ```
83
+
84
+ ## Installation
85
+
86
+ OpenSCvx is available on [PyPI](https://pypi.org/project/openscvx/) and can be trivially installed with pip.
87
+
88
+ It is recommended to install OpenSCvx inside a virtual environment (venv, conda, uv, *etc.*). If you don't already have one set up:
89
+
90
+ ```bash
91
+ python3 -m venv .venv
92
+ source .venv/bin/activate
93
+ ```
94
+
95
+ ### Using pip
96
+
97
+ ```bash
98
+ pip install openscvx
99
+ ```
100
+
101
+ ### Using uv
102
+
103
+ If you have [uv installed](https://docs.astral.sh/uv/getting-started/installation/) you can prefix the commands with `uv` for faster installation:
104
+
105
+ ```bash
106
+ uv pip install openscvx
107
+ ```
108
+
109
+ > [!TIP]
110
+ > **Optional Dependencies**
111
+ >
112
+ > For GUI support or CVXPYGen code generation:
113
+ > ```bash
114
+ > pip install openscvx[gui,cvxpygen]
115
+ > ```
116
+
117
+ > [!TIP]
118
+ > **Nightly Builds**
119
+ >
120
+ > To install the latest development version (nightly), use the `--pre` flag:
121
+ > ```bash
122
+ > pip install --pre openscvx
123
+ > ```
124
+
125
+ ## Installing From Source
126
+
127
+ ### Using pip
128
+
129
+ ```bash
130
+ git clone https://github.com/OpenSCvx/OpenSCvx.git
131
+ cd OpenSCvx
132
+
133
+ python3 -m venv .venv
134
+ source .venv/bin/activate
135
+ pip install -e .
136
+ ```
137
+
138
+ ### Using uv
139
+
140
+ ```bash
141
+ git clone https://github.com/OpenSCvx/OpenSCvx.git
142
+ cd OpenSCvx
143
+
144
+ uv venv
145
+ source .venv/bin/activate
146
+ uv pip install -e .
147
+ ```
148
+
149
+ ## Getting Started
150
+
151
+ Check out the OpenSCvx documentation to help you get started
152
+
153
+ - [Getting Started Docs](https://openscvx.github.io/OpenSCvx/latest/getting-started/)
154
+ - [Users Guide](https://openscvx.github.io/OpenSCvx/latest/UsersGuide/00_introduction/)
155
+ - [API Reference](https://openscvx.github.io/OpenSCvx/latest/Reference/problem/)
156
+
157
+ ### Running the Examples
158
+
159
+ We also have a selection of problems in the `examples/` folder as well as on the [Examples page](https://openscvx.github.io/OpenSCvx/latest/Examples/abstract/brachistochrone/) of the documentation. The example trajectory optimization problems are grouped by application and represent some of the problem types that can be solved by OpenSCvx.
160
+
161
+ > [!Note]
162
+ > To run the examples, you'll need to clone this repository and install OpenSCvx in editable mode (`pip install -e .`). See the [Installing From Source](#installing-from-source) section above for detailed installation instructions.
163
+
164
+ To run a problem simply run any of the examples directly, for example:
165
+
166
+ ```sh
167
+ python3 examples/abstract/brachistochrone.py
168
+ ```
169
+
170
+ and adjust the plotting as needed.
171
+
172
+ Check out the problem definitions inside `examples/` to see how to define your own problems.
173
+
174
+ ## Code Structure
175
+
176
+ <img src="figures/oscvx_structure_full_dark.svg" width="1200"/>
177
+
178
+ ## What is implemented
179
+
180
+ This repo has the following features:
181
+
182
+ 1. Free Final Time
183
+ 2. Fully adaptive time dilation (`s` is appended to the control vector)
184
+ 3. Continuous-Time Constraint Satisfaction
185
+ 4. FOH and ZOH exact discretization (`t` is a state so you can bring your own scheme)
186
+ 6. Vectorized and Ahead-of-Time (AOT) Compiled Multishooting Discretization
187
+ 7. JAX Autodiff for Jacobians
188
+
189
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
190
+
191
+ ## Acknowledgements
192
+
193
+ 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, Fabio Spada, 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.
194
+
195
+ ## Citation
196
+
197
+ Please cite the following works if you use the repository,
198
+
199
+ ```tex
200
+ @ARTICLE{hayner2025los,
201
+ author={Hayner, Christopher R. and Carson III, John M. and Açıkmeşe, Behçet and Leung, Karen},
202
+ journal={IEEE Robotics and Automation Letters},
203
+ title={Continuous-Time Line-of-Sight Constrained Trajectory Planning for 6-Degree of Freedom Systems},
204
+ year={2025},
205
+ volume={},
206
+ number={},
207
+ pages={1-8},
208
+ keywords={Robot sensing systems;Vectors;Vehicle dynamics;Line-of-sight propagation;Trajectory planning;Trajectory optimization;Quadrotors;Nonlinear dynamical systems;Heuristic algorithms;Convergence;Constrained Motion Planning;Optimization and Optimal Control;Aerial Systems: Perception and Autonomy},
209
+ doi={10.1109/LRA.2025.3545299}}
210
+ ```
211
+
212
+ ```tex
213
+ @misc{elango2024ctscvx,
214
+ title={Successive Convexification for Trajectory Optimization with Continuous-Time Constraint Satisfaction},
215
+ author={Purnanand Elango and Dayou Luo and Abhinav G. Kamath and Samet Uzun and Taewan Kim and Behçet Açıkmeşe},
216
+ year={2024},
217
+ eprint={2404.16826},
218
+ archivePrefix={arXiv},
219
+ primaryClass={math.OC},
220
+ url={https://arxiv.org/abs/2404.16826},
221
+ }
222
+ ```
223
+
224
+ ```tex
225
+ @misc{chari2025qoco,
226
+ title = {QOCO: A Quadratic Objective Conic Optimizer with Custom Solver Generation},
227
+ author = {Chari, Govind M and A{\c{c}}{\i}kme{\c{s}}e, Beh{\c{c}}et},
228
+ year = {2025},
229
+ eprint = {2503.12658},
230
+ archiveprefix = {arXiv},
231
+ primaryclass = {math.OC},
232
+ }
233
+ ```