openscvx 0.3.2.dev339__tar.gz → 0.3.2.dev343__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 (268) hide show
  1. {openscvx-0.3.2.dev339/openscvx.egg-info → openscvx-0.3.2.dev343}/PKG-INFO +2 -2
  2. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/ocp.md +3 -3
  3. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +7 -4
  4. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/04_viewpoint_constraints.md +6 -3
  5. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/abstract/brachistochrone.py +2 -7
  6. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/arm/three_link_arm.py +2 -5
  7. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/car/dubins_car.py +1 -14
  8. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/car/dubins_car_conditional.py +1 -5
  9. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/car/dubins_car_disjoint.py +0 -4
  10. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/car/dubins_car_stljax.py +0 -4
  11. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/cinema_vp.py +1 -8
  12. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/dr_double_integrator.py +0 -14
  13. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/dr_vp.py +0 -14
  14. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/dr_vp_nodal.py +6 -14
  15. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/dr_vp_polytope.py +3 -10
  16. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/drone_racing.py +1 -87
  17. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/obstacle_avoidance.py +0 -9
  18. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/obstacle_avoidance_nodal.py +0 -3
  19. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/obstacle_avoidance_vmap.py +0 -27
  20. {openscvx-0.3.2.dev339/examples/drone → openscvx-0.3.2.dev343/examples/realtime/base_problems}/cinema_vp_realtime_base.py +3 -3
  21. openscvx-0.3.2.dev343/examples/realtime/base_problems/drone_racing_realtime_base.py +216 -0
  22. {openscvx-0.3.2.dev339/examples/drone → openscvx-0.3.2.dev343/examples/realtime/base_problems}/obstacle_avoidance_realtime_base.py +2 -5
  23. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/realtime/cinema_vp_realtime.py +8 -8
  24. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/realtime/drone_racing_realtime.py +8 -8
  25. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/realtime/dubins_car_realtime.py +2 -2
  26. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/realtime/obstacle_avoidance_realtime.py +8 -8
  27. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/rocket/3DoF_pdg.py +8 -11
  28. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/spacecraft/proxops_cw.py +0 -5
  29. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/__init__.py +9 -0
  30. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/_version.py +3 -3
  31. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/algorithms/__init__.py +13 -2
  32. openscvx-0.3.2.dev343/openscvx/algorithms/autotuning.py +467 -0
  33. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/algorithms/base.py +200 -82
  34. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/algorithms/optimization_results.py +6 -0
  35. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/algorithms/penalized_trust_region.py +213 -51
  36. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/config.py +108 -34
  37. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/cvxpy_variables.py +2 -2
  38. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/__init__.py +2 -1
  39. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/scp_iteration.py +189 -0
  40. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/problem.py +38 -13
  41. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/solvers/base.py +1 -1
  42. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/solvers/ptr_solver.py +36 -7
  43. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lower.py +2 -2
  44. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/constraint.py +14 -35
  45. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/logic.py +4 -2
  46. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/printing.py +167 -94
  47. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343/openscvx.egg-info}/PKG-INFO +2 -2
  48. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx.egg-info/SOURCES.txt +4 -2
  49. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx.egg-info/requires.txt +1 -1
  50. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/pyproject.toml +1 -1
  51. openscvx-0.3.2.dev343/tests/test_autotuning.py +1128 -0
  52. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_brachistochrone.py +132 -8
  53. openscvx-0.3.2.dev339/openscvx/algorithms/autotuning.py +0 -24
  54. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/assets/logo.svg +0 -0
  55. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/release-drafter.yml +0 -0
  56. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/_docs.yml +0 -0
  57. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/branch-name.yml +0 -0
  58. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/docs.yml +0 -0
  59. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/lint.yml +0 -0
  60. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/nightly.yml +0 -0
  61. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/release-drafter.yml +0 -0
  62. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/release.yml +0 -0
  63. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/tests-integration.yml +0 -0
  64. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/tests-unit.yml +0 -0
  65. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.gitignore +0 -0
  66. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/CONTRIBUTING.md +0 -0
  67. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/LICENSE +0 -0
  68. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/README.md +0 -0
  69. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/constraint_reformulation.md +0 -0
  70. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/control_parameterization.md +0 -0
  71. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/discretization.md +0 -0
  72. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/scvx.md +0 -0
  73. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/time_dilation.md +0 -0
  74. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UnderTheHood/lowering_architecture.md +0 -0
  75. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  76. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/00_introduction.md +0 -0
  77. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  78. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  79. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/05_visualization.md +0 -0
  80. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/06_logic.md +0 -0
  81. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/07_lie.md +0 -0
  82. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/favicon.png +0 -0
  83. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/ct-scvx_dark.png +0 -0
  84. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/ct-scvx_light.png +0 -0
  85. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/ctcs_dark.png +0 -0
  86. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/ctcs_light.png +0 -0
  87. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/problem_class_dark.png +0 -0
  88. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/problem_class_light.png +0 -0
  89. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/logo.svg +0 -0
  90. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/citation.md +0 -0
  91. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/examples.md +0 -0
  92. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/getting-started.md +0 -0
  93. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/index.md +0 -0
  94. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/javascripts/mathjax.js +0 -0
  95. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/plotting.py +0 -0
  96. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/plotting_viser.py +0 -0
  97. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/ctlos_cine.gif +0 -0
  98. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/ctlos_dr.gif +0 -0
  99. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/dtlos_cine.gif +0 -0
  100. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/dtlos_dr.gif +0 -0
  101. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/openscvx_logo.svg +0 -0
  102. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/openscvx_logo_square.png +0 -0
  103. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/oscvx_structure_full_dark.svg +0 -0
  104. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/video_preview.png +0 -0
  105. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/__init__.py +0 -0
  106. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background.avif +0 -0
  107. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
  108. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
  109. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
  110. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
  111. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars.avif +0 -0
  112. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
  113. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
  114. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
  115. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
  116. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon.avif +0 -0
  117. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
  118. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
  119. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
  120. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
  121. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
  122. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
  123. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
  124. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
  125. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
  126. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space.avif +0 -0
  127. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
  128. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
  129. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
  130. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
  131. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth.avif +0 -0
  132. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
  133. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
  134. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
  135. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
  136. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/javascripts/parallax.js +0 -0
  137. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/logo.svg +0 -0
  138. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/stylesheets/custom.css +0 -0
  139. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/stylesheets/parallax.css +0 -0
  140. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/home.html +0 -0
  141. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/main.html +0 -0
  142. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/partials/parallax/hero.html +0 -0
  143. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/partials/parallax.html +0 -0
  144. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/mkdocs.yml +0 -0
  145. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/discretization/__init__.py +0 -0
  146. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/discretization/discretization.py +0 -0
  147. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/expert/__init__.py +0 -0
  148. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/expert/byof.py +0 -0
  149. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/expert/lowering.py +0 -0
  150. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/expert/validation.py +0 -0
  151. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/init/__init__.py +0 -0
  152. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/init/interpolation.py +0 -0
  153. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/integrators/__init__.py +0 -0
  154. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/integrators/runge_kutta.py +0 -0
  155. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/__init__.py +0 -0
  156. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/cvxpy_constraints.py +0 -0
  157. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/dynamics.py +0 -0
  158. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/jax_constraints.py +0 -0
  159. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/parameters.py +0 -0
  160. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/problem.py +0 -0
  161. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/unified.py +0 -0
  162. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/plotting.py +0 -0
  163. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/__init__.py +0 -0
  164. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/animated.py +0 -0
  165. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/plotly_integration.py +0 -0
  166. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/primitives.py +0 -0
  167. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/scp.py +0 -0
  168. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/server.py +0 -0
  169. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/propagation/__init__.py +0 -0
  170. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/propagation/post_processing.py +0 -0
  171. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/propagation/propagation.py +0 -0
  172. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/solvers/__init__.py +0 -0
  173. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/__init__.py +0 -0
  174. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/augmentation.py +0 -0
  175. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/builder.py +0 -0
  176. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/constraint_set.py +0 -0
  177. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/__init__.py +0 -0
  178. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/arithmetic.py +0 -0
  179. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/array.py +0 -0
  180. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/constraint.py +0 -0
  181. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/control.py +0 -0
  182. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/expr.py +0 -0
  183. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  184. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  185. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/lie/se3.py +0 -0
  186. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/lie/so3.py +0 -0
  187. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/linalg.py +0 -0
  188. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/logic.py +0 -0
  189. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/math.py +0 -0
  190. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/spatial.py +0 -0
  191. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/state.py +0 -0
  192. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/stl.py +0 -0
  193. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/variable.py +0 -0
  194. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/vmap.py +0 -0
  195. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/hashing.py +0 -0
  196. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/__init__.py +0 -0
  197. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  198. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  199. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  200. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  201. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  202. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  203. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  204. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  205. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  206. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  207. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  208. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  209. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  210. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  211. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  212. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  213. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  214. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  215. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  216. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  217. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  218. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  219. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  220. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  221. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  222. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  223. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/preprocessing.py +0 -0
  224. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/problem.py +0 -0
  225. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/time.py +0 -0
  226. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/unified.py +0 -0
  227. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/__init__.py +0 -0
  228. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/cache.py +0 -0
  229. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/caching.py +0 -0
  230. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/profiling.py +0 -0
  231. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/utils.py +0 -0
  232. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx.egg-info/dependency_links.txt +0 -0
  233. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx.egg-info/top_level.txt +0 -0
  234. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/scripts/gen_example_pages.py +0 -0
  235. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/scripts/gen_ref_pages.py +0 -0
  236. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/setup.cfg +0 -0
  237. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/__init__.py +0 -0
  238. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/brachistochrone_analytical.py +0 -0
  239. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/__init__.py +0 -0
  240. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/__init__.py +0 -0
  241. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_arithmetic.py +0 -0
  242. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_array.py +0 -0
  243. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_constraint.py +0 -0
  244. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_expr.py +0 -0
  245. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_lie.py +0 -0
  246. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_linalg.py +0 -0
  247. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_logic.py +0 -0
  248. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_math.py +0 -0
  249. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_node_reference.py +0 -0
  250. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_parameters.py +0 -0
  251. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_scaling.py +0 -0
  252. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_spatial.py +0 -0
  253. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_variable.py +0 -0
  254. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_vmap.py +0 -0
  255. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_augmentation.py +0 -0
  256. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_hashing.py +0 -0
  257. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_lower_cvxpy.py +0 -0
  258. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_lower_jax.py +0 -0
  259. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_preprocessing.py +0 -0
  260. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_unified.py +0 -0
  261. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_cvxpygen_optional.py +0 -0
  262. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_discretization.py +0 -0
  263. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_examples.py +0 -0
  264. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_expert.py +0 -0
  265. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_init.py +0 -0
  266. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_integrators.py +0 -0
  267. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_plotting.py +0 -0
  268. {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_propagation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.3.2.dev339
3
+ Version: 0.3.2.dev343
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
@@ -10,7 +10,7 @@ Classifier: License :: OSI Approved :: Apache Software License
10
10
  Requires-Python: >=3.9
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
- Requires-Dist: cvxpy>=1.6
13
+ Requires-Dist: cvxpy==1.7.5
14
14
  Requires-Dist: qoco
15
15
  Requires-Dist: numpy
16
16
  Requires-Dist: jax
@@ -14,7 +14,7 @@ The state, constrol and additional parameters are defined as follows:
14
14
 
15
15
  ```python
16
16
 
17
- w_tr = cp.Parameter(nonneg = True, name='w_tr') # Weight on the Trust Region
17
+ lam_prox = cp.Parameter(nonneg = True, name='lam_prox') # Weight on the Trust Region
18
18
  lam_cost = cp.Parameter(nonneg=True, name='lam_cost') # Weight on the Nonlinear Cost
19
19
 
20
20
  x = cp.Variable((params.scp.n, params.sim.n_states), name='x') # State
@@ -97,7 +97,7 @@ def OptimalControlProblem(params: Config):
97
97
  ########################
98
98
 
99
99
  # Parameters
100
- w_tr = cp.Parameter(nonneg = True, name='w_tr')
100
+ lam_prox = cp.Parameter(nonneg = True, name='lam_prox')
101
101
  lam_cost = cp.Parameter(nonneg=True, name='lam_cost')
102
102
 
103
103
  # State
@@ -206,7 +206,7 @@ def OptimalControlProblem(params: Config):
206
206
  ########
207
207
 
208
208
  inv = block([[inv_S_x, np.zeros((S_x.shape[0], S_u.shape[1]))], [np.zeros((S_u.shape[0], S_x.shape[1])), inv_S_u]])
209
- cost += sum(w_tr * cp.sum_squares(inv @ cp.hstack((dx[i], du[i]))) for i in range(params.scp.n)) # Trust Region Cost
209
+ cost += sum(lam_prox * cp.sum_squares(inv @ cp.hstack((dx[i], du[i]))) for i in range(params.scp.n)) # Trust Region Cost
210
210
  cost += sum(params.scp.lam_vc * cp.sum(cp.abs(nu[i-1])) for i in range(1, params.scp.n)) # Virtual Control Slack
211
211
 
212
212
  idx_ncvx = 0
@@ -258,11 +258,14 @@ problem = ox.Problem(
258
258
  The SCP algorithm has several tuning parameters that affect convergence. For this obstacle avoidance problem:
259
259
 
260
260
  ```python
261
- problem.settings.scp.w_tr = 1e1 # Trust region weight
261
+ problem.settings.scp.lam_prox = 1e1 # Trust region weight
262
262
  problem.settings.scp.lam_cost = 1e1 # Cost objective weight
263
263
  problem.settings.scp.lam_vc = 1e2 # Virtual control weight
264
- problem.settings.scp.cost_drop = 4 # Iteration to start relaxing cost
265
- problem.settings.scp.cost_relax = 0.5 # Cost relaxation factor
264
+ # Configure cost relaxation via autotuner
265
+ problem.settings.scp.autotuner = ox.AugmentedLagrangian(
266
+ lam_cost_drop=4, # Iteration to start relaxing cost
267
+ lam_cost_relax=0.5 # Cost relaxation factor
268
+ )
266
269
  ```
267
270
 
268
271
  ### Solution
@@ -389,7 +392,7 @@ if step_result.J_vc < 1e-4:
389
392
  problem.settings.scp.lam_cost *= 1.1
390
393
 
391
394
  # Tighten trust region if solution is oscillating
392
- problem.settings.scp.w_tr = 2.0
395
+ problem.settings.scp.lam_prox = 2.0
393
396
  ```
394
397
 
395
398
  ### Resetting the Problem
@@ -328,11 +328,14 @@ problem = ox.Problem(
328
328
  )
329
329
 
330
330
  # Tuning for this problem
331
- problem.settings.scp.w_tr = 2e0
331
+ problem.settings.scp.lam_prox = 2e0
332
332
  problem.settings.scp.lam_cost = 1e-1
333
333
  problem.settings.scp.lam_vc = 1e2
334
- problem.settings.scp.cost_drop = 10
335
- problem.settings.scp.cost_relax = 0.8
334
+ # Configure cost relaxation via autotuner
335
+ problem.settings.scp.autotuner = ox.AugmentedLagrangian(
336
+ lam_cost_drop=10,
337
+ lam_cost_relax=0.8
338
+ )
336
339
 
337
340
  problem.initialize()
338
341
  results = problem.solve()
@@ -84,20 +84,15 @@ problem = Problem(
84
84
  constraints=constraint_exprs,
85
85
  N=n,
86
86
  licq_max=1e-8,
87
+ autotuner=ox.ConstantProximalWeight(),
87
88
  )
88
89
 
89
90
  problem.settings.prp.dt = 0.01
90
91
 
91
- # problem.settings.cvx.solver = "qocogen"
92
- # problem.settings.cvx.cvxpygen = True
93
- problem.settings.cvx.solver_args = {"abstol": 1e-6, "reltol": 1e-9}
94
-
95
- problem.settings.scp.w_tr = 1e1 # Weight on the Trust Reigon
92
+ problem.settings.scp.lam_prox = 1e1 # Weight on the Trust Reigon
96
93
  problem.settings.scp.lam_cost = 1e0 # Weight on the Minimal Time Objective
97
- problem.settings.scp.lam_vc = 1e1 # Weight on the Virtual Control Objective
98
94
  problem.settings.scp.uniform_time_grid = True
99
95
 
100
- problem.settings.sim.save_compiled = False
101
96
 
102
97
  plotting_dict = {}
103
98
 
@@ -28,7 +28,7 @@ sys.path.append(grandparent_dir)
28
28
 
29
29
  import openscvx as ox
30
30
  from openscvx import Problem
31
- from openscvx.plotting import plot_scp_iterations
31
+ from openscvx.plotting import plot_scp_convergence_histories, plot_scp_iterations
32
32
 
33
33
  # =============================================================================
34
34
  # Robot Parameters
@@ -205,9 +205,6 @@ problem = Problem(
205
205
 
206
206
  # Solver settings
207
207
  problem.settings.prp.dt = 0.01
208
- problem.settings.scp.w_tr = 1e0
209
- problem.settings.scp.lam_cost = 1e0
210
- problem.settings.scp.lam_vc = 1e1
211
208
  problem.settings.scp.lam_vb = 1e1
212
209
 
213
210
  if __name__ == "__main__":
@@ -243,7 +240,7 @@ if __name__ == "__main__":
243
240
  return T_final[:3, 3]
244
241
 
245
242
  plot_scp_iterations(results).show()
246
-
243
+ plot_scp_convergence_histories(results).show()
247
244
  tgt = target.value
248
245
  final_ee = compute_ee_position(final_q)
249
246
  error = np.linalg.norm(final_ee - tgt)
@@ -100,22 +100,10 @@ problem = Problem(
100
100
  )
101
101
 
102
102
  # Set solver parameters
103
- problem.settings.prp.dt = 0.01
104
- # problem.settings.scp.w_tr_adapt = 1.3
105
- problem.settings.scp.w_tr = 1e0
106
103
  problem.settings.scp.lam_cost = 4e1
107
104
  problem.settings.scp.lam_vc = 1e3
108
105
  problem.settings.scp.uniform_time_grid = True
109
106
 
110
- # Enable CLI printing for optimization iterations
111
- problem.settings.dev.printing = True
112
-
113
- # problem.settings.cvx.cvxpygen = True
114
- # problem.settings.cvx.solver = "qocogen"
115
- problem.settings.cvx.solver_args = {}
116
- # problem.settings.cvx.cvxpygen_override = True
117
-
118
-
119
107
  plotting_dict = {
120
108
  "obs_radius": problem.parameters["obs_radius"],
121
109
  "obs_center": problem.parameters["obs_center"],
@@ -130,10 +118,9 @@ if __name__ == "__main__":
130
118
  plot_dubins_car(results, problem.settings).show()
131
119
 
132
120
  # Second run with different parameters
121
+ problem.reset()
133
122
  problem.parameters["obs_center"] = np.array([0.5, 0.0])
134
123
  total_time = 0.7 # Adjust total time for second run
135
- problem.settings.scp.lam_cost = 1e-1 # Disable minimal time objective for second run
136
- problem.settings.scp.w_tr = 1e0
137
124
  problem.settings.scp.lam_vc = 1e2 # Adjust virtual control weight
138
125
  position.guess = np.linspace([0, -2], [0, 2], n)
139
126
  theta.guess = np.zeros((n, 1))
@@ -27,7 +27,7 @@ from examples.plotting import plot_dubins_car, plot_velocity_vs_distance
27
27
  from openscvx import Problem
28
28
 
29
29
  n = 8
30
- total_time = 2.0 # Total simulation time
30
+ total_time = 3.0 # Total simulation time
31
31
 
32
32
  # Define state components
33
33
  position = ox.State("position", shape=(2,)) # 2D position [x, y]
@@ -112,10 +112,6 @@ problem = Problem(
112
112
  )
113
113
 
114
114
  # Set solver parameters
115
- problem.settings.scp.w_tr = 1e0
116
- problem.settings.scp.w_tr_adapt = 1.1
117
- problem.settings.scp.w_tr_max_scaling_factor = 1e2
118
- problem.settings.scp.lam_cost = 1e0
119
115
  problem.settings.scp.lam_vc = 1e3
120
116
  problem.settings.scp.uniform_time_grid = True
121
117
 
@@ -113,10 +113,6 @@ problem = Problem(
113
113
  N=n,
114
114
  )
115
115
  # Set solver parameters
116
- problem.settings.prp.dt = 0.01
117
- problem.settings.scp.w_tr_adapt = 1.1
118
- problem.settings.scp.w_tr = 1e0
119
- problem.settings.scp.lam_cost = 1e-1
120
116
  problem.settings.scp.lam_vc = 6e2
121
117
  problem.settings.scp.uniform_time_grid = True
122
118
  plotting_dict = {
@@ -105,10 +105,6 @@ problem = Problem(
105
105
  N=n,
106
106
  )
107
107
  # Set solver parameters
108
- problem.settings.prp.dt = 0.01
109
- problem.settings.scp.w_tr_adapt = 1.1
110
- problem.settings.scp.w_tr = 1e0
111
- problem.settings.scp.lam_cost = 1e-1
112
108
  problem.settings.scp.lam_vc = 6e2
113
109
  problem.settings.scp.uniform_time_grid = True
114
110
  # Extract parameter values from problem.parameters (not Parameter objects)
@@ -238,15 +238,8 @@ problem = Problem(
238
238
  )
239
239
 
240
240
 
241
- problem.settings.scp.w_tr = 4e0 # Weight on the Trust Reigon
242
- problem.settings.scp.lam_cost = 1e-2 # Weight on the Minimal Fuel Objective
243
- problem.settings.scp.lam_vc = 1e1 # Weight on the Virtual Control Objective
244
-
241
+ problem.settings.scp.lam_prox = 4e0 # Weight on the Trust Reigon
245
242
  problem.settings.scp.ep_tr = 1e-6 # Trust Region Tolerance
246
- problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
247
- problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
248
- problem.settings.scp.w_tr_adapt = 1.3 # Trust Region Adaptation Factor
249
- problem.settings.scp.w_tr_max_scaling_factor = 1e3 # Maximum Trust Region Weight
250
243
 
251
244
  plotting_dict = {
252
245
  "n_subs": n_subs,
@@ -137,21 +137,7 @@ problem = Problem(
137
137
  N=n,
138
138
  )
139
139
 
140
- problem.settings.prp.dt = 0.01
141
- problem.settings.dis.custom_integrator = True
142
-
143
- problem.settings.scp.w_tr = 2e0 # Weight on the Trust Reigon
144
- problem.settings.scp.lam_cost = 1e-1 # 0e-1, # Weight on the Minimal Time Objective
145
- problem.settings.scp.lam_vc = (
146
- 1e1 # 1e1, # Weight on the Virtual Control Objective (not including CTCS Augmentation)
147
- )
148
140
  problem.settings.scp.ep_tr = 1e-3 # Trust Region Tolerance
149
- problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
150
- problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
151
- problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
152
- problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
153
- problem.settings.scp.w_tr_adapt = 1.4 # Trust Region Adaptation Factor
154
- problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
155
141
 
156
142
  plotting_dict = {"vertices": vertices}
157
143
 
@@ -226,21 +226,7 @@ problem = Problem(
226
226
  N=n,
227
227
  )
228
228
 
229
- problem.settings.prp.dt = 0.01
230
-
231
-
232
- problem.settings.scp.w_tr = 2e0 # Weight on the Trust Reigon
233
- problem.settings.scp.lam_cost = 1e-1 # 0e-1, # Weight on the Minimal Time Objective
234
- problem.settings.scp.lam_vc = (
235
- 1e2 # 1e1, # Weight on the Virtual Control Objective (not including CTCS Augmentation)
236
- )
237
229
  problem.settings.scp.ep_tr = 1e-3 # Trust Region Tolerance
238
- problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
239
- problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance
240
- problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
241
- problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
242
- problem.settings.scp.w_tr_adapt = 1.4 # Trust Region Adaptation Factor
243
- problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
244
230
 
245
231
  plotting_dict = {
246
232
  "vertices": vertices,
@@ -28,6 +28,7 @@ from examples.plotting_viser import (
28
28
  create_scp_animated_plotting_server,
29
29
  )
30
30
  from openscvx import Problem
31
+ from openscvx.plotting import plot_scp_convergence_histories
31
32
  from openscvx.utils import gen_vertices, rot
32
33
 
33
34
  n = 33 # Number of Nodes
@@ -226,23 +227,12 @@ problem = Problem(
226
227
  N=n,
227
228
  )
228
229
 
229
- problem.settings.prp.dt = 0.1
230
230
 
231
- problem.settings.scp.w_tr = 8e1 # Weight on the Trust Reigon
231
+ problem.settings.scp.lam_prox = 8e1 # Weight on the Trust Reigon
232
232
  problem.settings.scp.lam_cost = 2e1 # Weight on the Minimal Time Objective
233
- problem.settings.scp.lam_vc = (
234
- 1e2 # Weight on the Virtual Control Objective (not including CTCS Augmentation)
235
- )
236
- problem.settings.scp.lam_vb = (
237
- 4e0 # Weight on the Virtual Control Objective (not including CTCS Augmentation)
238
- )
233
+ problem.settings.scp.lam_vc = 1e2 # Weight on the Virtual Control Objective
234
+ problem.settings.scp.lam_vb = 4e0 # Weight on the Virtual Buffer Objective
239
235
  problem.settings.scp.ep_tr = 1e-3 # Trust Region Tolerance
240
- problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
241
- problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance
242
- problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
243
- problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
244
- problem.settings.scp.w_tr_adapt = 1.05 # Trust Region Adaptation Factor
245
- problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
246
236
 
247
237
  plotting_dict = {
248
238
  "vertices": vertices,
@@ -261,6 +251,8 @@ if __name__ == "__main__":
261
251
 
262
252
  results.update_plotting_data(**plotting_dict)
263
253
 
254
+ plot_scp_convergence_histories(results).show()
255
+
264
256
  # Create both visualization servers (viser auto-assigns ports)
265
257
  traj_server = create_animated_plotting_server(
266
258
  results,
@@ -243,19 +243,11 @@ problem = Problem(
243
243
  N=n,
244
244
  )
245
245
 
246
- problem.settings.prp.dt = 0.01
247
-
248
- problem.settings.scp.w_tr = 2e0 # 2e0, # Weight on the Trust Reigon
249
- problem.settings.scp.lam_cost = 2e-1 # 0e-1, # Weight on the Minimal Time Objective
246
+ problem.settings.scp.lam_prox = 2e0 # Weight on the Trust Reigon
250
247
  problem.settings.scp.lam_vc = 4e1 # Weight on the Virtual Control Objective
251
248
 
252
249
  problem.settings.scp.ep_tr = 1e-5 # Trust Region Tolerance
253
- problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
254
- problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
255
- problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
256
- problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
257
- problem.settings.scp.w_tr_adapt = 1.2 # Trust Region Adaptation Factor
258
- problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
250
+
259
251
  plotting_dict = {
260
252
  "vertices": vertices,
261
253
  "n_subs": n_subs,
@@ -265,6 +257,7 @@ plotting_dict = {
265
257
  "init_poses": init_poses,
266
258
  "norm_type": norm_type,
267
259
  }
260
+
268
261
  if __name__ == "__main__":
269
262
  problem.initialize()
270
263
  results = problem.solve()
@@ -140,85 +140,11 @@ for node, gate_center_param in zip(gate_nodes, gate_center_params):
140
140
  )
141
141
  constraints.append(gate_constraint)
142
142
 
143
-
144
- # Define symbolic utility functions
145
- def symbolic_qdcm(q):
146
- """Quaternion to Direction Cosine Matrix conversion using symbolic expressions"""
147
- # Normalize quaternion
148
- q_norm = ox.Sqrt(ox.Sum(q * q))
149
- q_normalized = q / q_norm
150
-
151
- w, x, y, z = q_normalized[0], q_normalized[1], q_normalized[2], q_normalized[3]
152
-
153
- # Create DCM elements and assemble into 3x3 matrix
154
- return ox.Block(
155
- [
156
- [1.0 - 2.0 * (y * y + z * z), 2.0 * (x * y - z * w), 2.0 * (x * z + y * w)],
157
- [2.0 * (x * y + z * w), 1.0 - 2.0 * (x * x + z * z), 2.0 * (y * z - x * w)],
158
- [2.0 * (x * z - y * w), 2.0 * (y * z + x * w), 1.0 - 2.0 * (x * x + y * y)],
159
- ]
160
- )
161
-
162
-
163
- def symbolic_ssmp(w):
164
- """Angular rate to 4x4 skew symmetric matrix for quaternion dynamics"""
165
- x, y, z = w[0], w[1], w[2]
166
-
167
- return ox.Block(
168
- [
169
- [0.0, -x, -y, -z],
170
- [x, 0.0, z, -y],
171
- [y, -z, 0.0, x],
172
- [z, y, -x, 0.0],
173
- ]
174
- )
175
-
176
-
177
- def symbolic_ssm(w):
178
- """Angular rate to 3x3 skew symmetric matrix"""
179
- x, y, z = w[0], w[1], w[2]
180
-
181
- return ox.Block(
182
- [
183
- [0.0, -z, y],
184
- [z, 0.0, -x],
185
- [-y, x, 0.0],
186
- ]
187
- )
188
-
189
-
190
- def symbolic_diag(v):
191
- """Create diagonal matrix from vector"""
192
- if len(v) == 3:
193
- return ox.Block(
194
- [
195
- [v[0], 0.0, 0.0],
196
- [0.0, v[1], 0.0],
197
- [0.0, 0.0, v[2]],
198
- ]
199
- )
200
- else:
201
- raise NotImplementedError("Only 3x3 diagonal matrices supported")
202
-
203
-
204
143
  # Create symbolic dynamics
205
144
  # Normalize quaternion for dynamics
206
145
  q_norm = ox.linalg.Norm(attitude)
207
146
  attitude_normalized = attitude / q_norm
208
147
 
209
- # Option 1: Full symbolic dynamics (more flexible but potentially slower)
210
- # r_dot = velocity
211
- # v_dot = (Constant(1.0 / m)) * symbolic_qdcm(attitude) @ thrust_force + Constant(
212
- # np.array([0, 0, g_const], dtype=np.float64)
213
- # )
214
- # q_dot = Constant(0.5) * symbolic_ssmp(angular_velocity) @ attitude
215
- # J_b_inv = Constant(1.0 / J_b)
216
- # J_b_diag = symbolic_diag([Constant(J_b[0]), Constant(J_b[1]), Constant(J_b[2])])
217
- # w_dot = symbolic_diag([J_b_inv[0], J_b_inv[1], J_b_inv[2]]) @ (
218
- # torque - symbolic_ssm(angular_velocity) @ J_b_diag @ angular_velocity
219
- # )
220
-
221
- # Option 2: Efficient dynamics using direct JAX lowering (better performance)
222
148
  J_b_inv = 1.0 / J_b
223
149
  J_b_diag = ox.linalg.Diag(J_b)
224
150
 
@@ -255,21 +181,9 @@ problem = Problem(
255
181
  # licq_max=1E-8
256
182
  )
257
183
 
258
- problem.settings.prp.dt = 0.01
259
-
260
- problem.settings.scp.w_tr = 2e0 # Weight on the Trust Reigon
261
- problem.settings.scp.lam_cost = 1e-1 # 0e-1, # Weight on the Minimal Time Objective
262
- problem.settings.scp.lam_vc = (
263
- 1e1 # 1e1, # Weight on the Virtual Control Objective (not including CTCS Augmentation)
264
- )
265
184
  problem.settings.scp.ep_tr = 1e-3 # Trust Region Tolerance
266
- problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
267
- problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
268
- # problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
269
- # problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
270
- problem.settings.scp.w_tr_adapt = 1.4 # Trust Region Adaptation Factor
271
- problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
272
185
 
186
+ problem.settings.cvx.solver_args = {"abstol": 1e-6, "reltol": 1e-9}
273
187
  plotting_dict = {
274
188
  "vertices": vertices,
275
189
  "gate_centers": modified_centers,
@@ -154,15 +154,6 @@ problem = Problem(
154
154
  N=n,
155
155
  )
156
156
 
157
- problem.settings.prp.dt = 0.001
158
- problem.settings.scp.lam_vb = 1e0
159
- problem.settings.scp.w_tr_adapt = 1.8
160
- problem.settings.scp.w_tr = 1e1
161
- problem.settings.scp.lam_cost = 1e1 # Weight on the Nonlinear Cost
162
- problem.settings.scp.lam_vc = 1e2 # Weight on the Virtual Control Objective
163
- problem.settings.scp.cost_drop = 4 # SCP iteration to relax minimal final time objective
164
- problem.settings.scp.cost_relax = 0.5 # Minimal Time Relaxation Factor
165
-
166
157
  plotting_dict = {
167
158
  "obstacles_centers": obstacle_center_positions,
168
159
  "obstacles_axes": axes,
@@ -152,10 +152,7 @@ problem = Problem(
152
152
  N=n,
153
153
  )
154
154
 
155
- problem.settings.prp.dt = 0.01
156
155
  problem.settings.scp.lam_vb = 1e0
157
- problem.settings.scp.cost_drop = 4 # SCP iteration to relax minimal final time objective
158
- problem.settings.scp.cost_relax = 0.5 # Minimal Time Relaxation Factor
159
156
 
160
157
  plotting_dict = {
161
158
  "obstacles_centers": obstacle_center_positions,
@@ -136,11 +136,6 @@ constraints.extend(
136
136
  # =============================================================================
137
137
  # Obstacle Avoidance
138
138
  # =============================================================================
139
- # Two approaches are shown below for benchmarking. Comment/uncomment to toggle.
140
-
141
- # --- APPROACH 1: Vmap (single constraint, vectorized) ---
142
- # - Single CTCS constraint with vectorized evaluation
143
- # - Vmap computes distance to all obstacles in parallel
144
139
 
145
140
  obstacle_avoidance = ox.ctcs(
146
141
  obstacle_radii
@@ -151,18 +146,6 @@ obstacle_avoidance = ox.ctcs(
151
146
  )
152
147
  constraints.append(obstacle_avoidance)
153
148
 
154
- # --- APPROACH 2: Individual constraints (loop, no vmap) ---
155
- # - Creates n_obstacles separate CTCS constraints
156
- # - Each constraint is lowered and traced independently
157
-
158
- # for i in range(n_obstacles):
159
- # obs_center = obstacle_centers[i]
160
- # radius = obstacle_radii[i]
161
- # obstacle_constraint = ox.ctcs(
162
- # radius <= ox.linalg.Norm(position - obs_center)
163
- # )
164
- # constraints.append(obstacle_constraint)
165
-
166
149
  # =============================================================================
167
150
  # Initial Guesses
168
151
  # =============================================================================
@@ -192,17 +175,7 @@ problem = Problem(
192
175
  N=n,
193
176
  )
194
177
 
195
- # SCP settings
196
- problem.settings.prp.dt = 0.01
197
- problem.settings.scp.w_tr = 5e0
198
- problem.settings.scp.lam_cost = 1e0
199
- problem.settings.scp.lam_vc = 1e2
200
178
  problem.settings.scp.ep_tr = 1e-3
201
- problem.settings.scp.ep_vb = 1e-4
202
- problem.settings.scp.ep_vc = 1e-8
203
- problem.settings.scp.cost_drop = 5
204
- problem.settings.scp.cost_relax = 0.7
205
- problem.settings.scp.w_tr_adapt = 1.5
206
179
 
207
180
  # =============================================================================
208
181
  # Solve and Visualize
@@ -199,15 +199,15 @@ problem = Problem(
199
199
  licq_max=1e-8,
200
200
  )
201
201
 
202
- problem.settings.scp.w_tr = 4e0 # Weight on the Trust Region
202
+ problem.settings.scp.lam_prox = 4e0 # Weight on the Trust Region
203
203
  problem.settings.scp.lam_cost = 1e-2 # Weight on the Minimal Fuel Objective
204
204
  problem.settings.scp.lam_vc = 1e1 # Weight on the Virtual Control Objective
205
205
 
206
206
  problem.settings.scp.ep_tr = 1e-6 # Trust Region Tolerance
207
207
  problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
208
208
  problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
209
- problem.settings.scp.w_tr_adapt = 1.3 # Trust Region Adaptation Factor
210
- problem.settings.scp.w_tr_max_scaling_factor = 1e3 # Maximum Trust Region Weight
209
+ problem.settings.scp.lam_prox_adapt = 1.3 # Trust Region Adaptation Factor
210
+ problem.settings.scp.lam_prox_max_scaling_factor = 1e3 # Maximum Trust Region Weight
211
211
 
212
212
  plotting_dict = {
213
213
  "n_subs": n_subs,