openscvx 0.5.3.dev14__tar.gz → 0.5.3.dev15__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 (376) hide show
  1. {openscvx-0.5.3.dev14/openscvx.egg-info → openscvx-0.5.3.dev15}/PKG-INFO +1 -1
  2. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/_version.py +3 -3
  3. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/scvx/penalized_trust_region.py +1 -0
  4. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrators/diffrax.py +4 -1
  5. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/cvxpy_variables.py +9 -15
  6. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/base.py +11 -0
  7. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/cvxpy_ptr_solver.py +145 -56
  8. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lower.py +8 -16
  9. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15/openscvx.egg-info}/PKG-INFO +1 -1
  10. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_iteration_callback_cvxpy.py +15 -3
  11. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/assets/logo.svg +0 -0
  12. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/release-drafter.yml +0 -0
  13. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/_docs.yml +0 -0
  14. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/branch-name.yml +0 -0
  15. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/docs.yml +0 -0
  16. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/lint.yml +0 -0
  17. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/nightly.yml +0 -0
  18. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/release-drafter.yml +0 -0
  19. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/release.yml +0 -0
  20. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/tests-integration.yml +0 -0
  21. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.github/workflows/tests-unit.yml +0 -0
  22. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.gitignore +0 -0
  23. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/.gitmodules +0 -0
  24. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/CONTRIBUTING.md +0 -0
  25. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/LICENSE +0 -0
  26. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/README.md +0 -0
  27. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/constraint_reformulation.md +0 -0
  28. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/control_parameterization.md +0 -0
  29. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/discretization.md +0 -0
  30. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/ocp.md +0 -0
  31. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/scvx.md +0 -0
  32. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/Foundations/time_dilation.md +0 -0
  33. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UnderTheHood/lowering_architecture.md +0 -0
  34. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  35. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/00_introduction.md +0 -0
  36. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  37. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  38. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  39. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  40. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/05_visualization.md +0 -0
  41. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/06_logic.md +0 -0
  42. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/07_lie.md +0 -0
  43. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/08_mpcc.md +0 -0
  44. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
  45. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/favicon.png +0 -0
  46. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/ct-scvx_dark.png +0 -0
  47. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/ct-scvx_light.png +0 -0
  48. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/ctcs_dark.png +0 -0
  49. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/ctcs_light.png +0 -0
  50. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/problem_class_dark.png +0 -0
  51. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/images/problem_class_light.png +0 -0
  52. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/logo.svg +0 -0
  53. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/openscvx_logo_square.png +0 -0
  54. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/viser-client/index.html +0 -0
  55. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  56. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  57. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/citation.md +0 -0
  58. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/examples.md +0 -0
  59. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/index.md +0 -0
  60. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/javascripts/mathjax.js +0 -0
  61. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/docs/versions.json +0 -0
  62. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/_viser_embed_export.py +0 -0
  63. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/brachistochrone.py +0 -0
  64. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/hypersensitive.py +0 -0
  65. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/impulsive.py +0 -0
  66. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/stl_integer_variable.py +0 -0
  67. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/abstract/stl_or.py +0 -0
  68. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/7_dof_arm.py +0 -0
  69. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/_camera.py +0 -0
  70. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/_render.py +0 -0
  71. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/_sensor_view.py +0 -0
  72. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/dr_vp_polytope.py +0 -0
  73. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  74. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/logo.py +0 -0
  75. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  76. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/3_dof_arm.py +0 -0
  77. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/7_dof_arm.py +0 -0
  78. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/7_dof_arm_collision.py +0 -0
  79. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/7_dof_arm_vp.py +0 -0
  80. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  81. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  82. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car.py +0 -0
  83. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_disjoint.py +0 -0
  84. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  85. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_obstacle_stl.py +0 -0
  86. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_stl_or.py +0 -0
  87. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/car/dubins_car_waypoint_stl.py +0 -0
  88. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/cinema_vp.py +0 -0
  89. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/dr_double_integrator.py +0 -0
  90. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/dr_vp.py +0 -0
  91. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/dr_vp_nodal.py +0 -0
  92. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/dr_vp_polytope.py +0 -0
  93. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/drone_racing.py +0 -0
  94. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/logo.py +0 -0
  95. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/logo_utils/acl_logo.svg +0 -0
  96. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  97. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/obstacle_avoidance.py +0 -0
  98. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  99. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  100. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/cartpole_mjx.py +0 -0
  101. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/double_cartpole_mjx.py +0 -0
  102. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/skydio_x2_mjx.py +0 -0
  103. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  104. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/triple_cartpole_game.py +0 -0
  105. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mjx/triple_cartpole_mjx.py +0 -0
  106. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/double_integrator_discrete.py +0 -0
  107. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/double_integrator_drone_racing.py +0 -0
  108. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  109. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  110. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  111. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/plotting.py +0 -0
  112. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/plotting_viser.py +0 -0
  113. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  114. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  115. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  116. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  117. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  118. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  119. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  120. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  121. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/cinema_vp_realtime.py +0 -0
  122. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/drone_racing_realtime.py +0 -0
  123. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/dubins_car_realtime.py +0 -0
  124. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  125. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/rocket/3DoF_pdg.py +0 -0
  126. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/rocket/6DoF_pdg.py +0 -0
  127. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/halo_orbit.py +0 -0
  128. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/hohmann_transfer.py +0 -0
  129. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/let_transfer.py +0 -0
  130. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/proxops_cw.py +0 -0
  131. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/examples/spacecraft/relative_loitering.py +0 -0
  132. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/ctlos_cine.gif +0 -0
  133. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/ctlos_dr.gif +0 -0
  134. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/dtlos_cine.gif +0 -0
  135. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/dtlos_dr.gif +0 -0
  136. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/openscvx_logo.svg +0 -0
  137. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/openscvx_logo_square.png +0 -0
  138. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/oscvx_structure_full_dark.svg +0 -0
  139. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/figures/video_preview.png +0 -0
  140. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/__init__.py +0 -0
  141. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/assets/stylesheets/custom.css +0 -0
  142. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  143. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  144. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  145. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/home.html +0 -0
  146. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/main.html +0 -0
  147. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-diagram.html +0 -0
  148. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-dropin-banner.html +0 -0
  149. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-hero.html +0 -0
  150. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-pipeline.html +0 -0
  151. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/material/overrides/partials/home-viser-strip.html +0 -0
  152. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/mkdocs.yml +0 -0
  153. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/__init__.py +0 -0
  154. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/__main__.py +0 -0
  155. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/__init__.py +0 -0
  156. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/__init__.py +0 -0
  157. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  158. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
  159. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  160. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  161. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/base.py +0 -0
  162. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/optimization_results.py +0 -0
  163. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/scvx/__init__.py +0 -0
  164. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/algorithms/weights.py +0 -0
  165. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/config.py +0 -0
  166. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/__init__.py +0 -0
  167. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/base.py +0 -0
  168. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/discretize_linearize.py +0 -0
  169. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/linearize_discretize.py +0 -0
  170. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  171. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  172. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  173. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  174. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/expert/__init__.py +0 -0
  175. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/expert/byof.py +0 -0
  176. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/expert/lowering.py +0 -0
  177. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/expert/validation.py +0 -0
  178. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/init/__init__.py +0 -0
  179. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/init/interpolation.py +0 -0
  180. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/init/inverse_kinematics.py +0 -0
  181. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrations/__init__.py +0 -0
  182. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrations/base.py +0 -0
  183. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrations/menagerie.py +0 -0
  184. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrations/mjx.py +0 -0
  185. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrators/__init__.py +0 -0
  186. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/integrators/runge_kutta.py +0 -0
  187. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/loader.py +0 -0
  188. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/__init__.py +0 -0
  189. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/cvxpy_constraints.py +0 -0
  190. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/dynamics.py +0 -0
  191. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/jax_constraints.py +0 -0
  192. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/parameters.py +0 -0
  193. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/problem.py +0 -0
  194. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/lowered/unified.py +0 -0
  195. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/__init__.py +0 -0
  196. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/plotting.py +0 -0
  197. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/scp_iteration.py +0 -0
  198. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/__init__.py +0 -0
  199. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/animated.py +0 -0
  200. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/orbits.py +0 -0
  201. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/plotly_integration.py +0 -0
  202. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/primitives.py +0 -0
  203. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/scp.py +0 -0
  204. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/plotting/viser/server.py +0 -0
  205. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/problem.py +0 -0
  206. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/propagation/__init__.py +0 -0
  207. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/propagation/post_processing.py +0 -0
  208. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/propagation/propagation.py +0 -0
  209. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/__init__.py +0 -0
  210. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/moreau_ptr_solver.py +0 -0
  211. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/ptr_solver.py +0 -0
  212. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/solvers/qpax_ptr_solver.py +0 -0
  213. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/__init__.py +0 -0
  214. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/augmentation.py +0 -0
  215. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/builder.py +0 -0
  216. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/constraint_set.py +0 -0
  217. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/__init__.py +0 -0
  218. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/arithmetic.py +0 -0
  219. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/array.py +0 -0
  220. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/constraint.py +0 -0
  221. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/control.py +0 -0
  222. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/expr.py +0 -0
  223. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  224. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  225. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/lie/se3.py +0 -0
  226. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/lie/so3.py +0 -0
  227. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/linalg.py +0 -0
  228. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/logic.py +0 -0
  229. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/math.py +0 -0
  230. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/parameter.py +0 -0
  231. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/spatial.py +0 -0
  232. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/state.py +0 -0
  233. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/stl.py +0 -0
  234. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/stljax.py +0 -0
  235. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/time.py +0 -0
  236. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/variable.py +0 -0
  237. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/expr/vmap.py +0 -0
  238. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/hashing.py +0 -0
  239. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/__init__.py +0 -0
  240. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  241. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  242. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  243. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  244. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  245. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  246. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  247. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  248. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  249. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  250. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  251. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  252. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  253. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  254. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  255. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  256. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  257. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  258. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  259. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  260. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  261. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  262. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  263. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  264. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  265. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  266. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  267. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  268. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  269. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/__init__.py +0 -0
  270. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/_registry.py +0 -0
  271. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/array.py +0 -0
  272. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/constraint.py +0 -0
  273. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/lie.py +0 -0
  274. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/linalg.py +0 -0
  275. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/logic.py +0 -0
  276. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/math.py +0 -0
  277. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/parser.py +0 -0
  278. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/spatial.py +0 -0
  279. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/stl.py +0 -0
  280. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/stljax.py +0 -0
  281. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/parser/tokenizer.py +0 -0
  282. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/preprocessing.py +0 -0
  283. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/problem.py +0 -0
  284. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/sparsity.py +0 -0
  285. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/symbolic/unified.py +0 -0
  286. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/__init__.py +0 -0
  287. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/cache.py +0 -0
  288. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/caching.py +0 -0
  289. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/printing.py +0 -0
  290. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/profiling.py +0 -0
  291. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx/utils/utils.py +0 -0
  292. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/SOURCES.txt +0 -0
  293. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/dependency_links.txt +0 -0
  294. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/entry_points.txt +0 -0
  295. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/requires.txt +0 -0
  296. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/openscvx.egg-info/top_level.txt +0 -0
  297. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/pyproject.toml +0 -0
  298. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/scripts/gen_example_pages.py +0 -0
  299. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/scripts/gen_ref_pages.py +0 -0
  300. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  301. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/setup.cfg +0 -0
  302. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/__init__.py +0 -0
  303. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/_marks.py +0 -0
  304. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/algorithms/__init__.py +0 -0
  305. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/algorithms/autotuner/__init__.py +0 -0
  306. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
  307. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
  308. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/brachistochrone_analytical.py +0 -0
  309. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/conftest.py +0 -0
  310. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/expr/__init__.py +0 -0
  311. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/expr/test_gmsr.py +0 -0
  312. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/fixtures/brachistochrone.json +0 -0
  313. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/fixtures/brachistochrone.yaml +0 -0
  314. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/hohmann_analytical.py +0 -0
  315. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/integrations/__init__.py +0 -0
  316. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/integrations/test_mjx.py +0 -0
  317. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/integrations/test_mjx_dynamics.py +0 -0
  318. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/__init__.py +0 -0
  319. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/_iteration_callback_helpers.py +0 -0
  320. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
  321. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_iteration_callback_moreau.py +0 -0
  322. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_iteration_callback_qpax.py +0 -0
  323. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_iteration_callback_vmap.py +0 -0
  324. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_moreau_ptr_solver.py +0 -0
  325. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_qpax_ptr_solver.py +0 -0
  326. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/solvers/test_subproblem_pytree.py +0 -0
  327. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/__init__.py +0 -0
  328. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/__init__.py +0 -0
  329. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_arithmetic.py +0 -0
  330. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_array.py +0 -0
  331. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_constraint.py +0 -0
  332. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_expr.py +0 -0
  333. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_lie.py +0 -0
  334. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_linalg.py +0 -0
  335. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_logic.py +0 -0
  336. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_math.py +0 -0
  337. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_node_reference.py +0 -0
  338. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_parameters.py +0 -0
  339. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_scaling.py +0 -0
  340. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_spatial.py +0 -0
  341. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_stl.py +0 -0
  342. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_variable.py +0 -0
  343. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/expr/test_vmap.py +0 -0
  344. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/__init__.py +0 -0
  345. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_array.py +0 -0
  346. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_constraint.py +0 -0
  347. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_lie.py +0 -0
  348. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_linalg.py +0 -0
  349. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_load.py +0 -0
  350. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_logic.py +0 -0
  351. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_math.py +0 -0
  352. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_parser.py +0 -0
  353. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_spatial.py +0 -0
  354. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_stl.py +0 -0
  355. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_tokenizer.py +0 -0
  356. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/parser/test_vmap.py +0 -0
  357. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_augmentation.py +0 -0
  358. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_hashing.py +0 -0
  359. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_lower_cvxpy.py +0 -0
  360. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_lower_jax.py +0 -0
  361. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_preprocessing.py +0 -0
  362. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_sparsity.py +0 -0
  363. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/symbolic/test_unified.py +0 -0
  364. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_autotuning.py +0 -0
  365. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_brachistochrone.py +0 -0
  366. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_cvxpygen_optional.py +0 -0
  367. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_discretization.py +0 -0
  368. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_examples.py +0 -0
  369. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_expert.py +0 -0
  370. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_impulsive.py +0 -0
  371. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_init.py +0 -0
  372. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_integrators.py +0 -0
  373. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_loader.py +0 -0
  374. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_optimization_results.py +0 -0
  375. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_plotting.py +0 -0
  376. {openscvx-0.5.3.dev14 → openscvx-0.5.3.dev15}/tests/test_propagation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev14
3
+ Version: 0.5.3.dev15
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
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.5.3.dev14'
22
- __version_tuple__ = version_tuple = (0, 5, 3, 'dev14')
21
+ __version__ = version = '0.5.3.dev15'
22
+ __version_tuple__ = version_tuple = (0, 5, 3, 'dev15')
23
23
 
24
- __commit_id__ = commit_id = 'g3d695e763'
24
+ __commit_id__ = commit_id = 'ge47b6d19c'
@@ -701,6 +701,7 @@ class PenalizedTrustRegion(Algorithm):
701
701
  lam_vb_nodal=np.asarray(state.lam_vb_nodal),
702
702
  lam_vb_cross=np.asarray(state.lam_vb_cross),
703
703
  )
704
+ self._solver.update_proximal_terms()
704
705
 
705
706
  t0 = time.time()
706
707
  result = self._solver.solve()
@@ -129,7 +129,7 @@ def solve_ivp_diffrax_prop(
129
129
  dt0 = user_kwargs.pop("dt0", (tau_final - tau_0) / 1)
130
130
  solve_kwargs = {
131
131
  "stepsize_controller": dfx.PIDController(rtol=rtol, atol=atol),
132
- "saveat": dfx.SaveAt(dense=True),
132
+ "saveat": dfx.SaveAt(dense=True, t1=True),
133
133
  }
134
134
  solve_kwargs.update(user_kwargs)
135
135
  if isinstance(solve_kwargs["stepsize_controller"], dfx.StepTo):
@@ -147,5 +147,8 @@ def solve_ivp_diffrax_prop(
147
147
  )
148
148
 
149
149
  all_evals = jax.vmap(solution.evaluate)(save_time)
150
+ terminal_state = jnp.asarray(solution.ys)[-1]
151
+ at_terminal = jnp.isclose(save_time, tau_final)
152
+ all_evals = jnp.where(at_terminal[:, None], terminal_state, all_evals)
150
153
  masked_array = jnp.where(mask[:, None], all_evals, jnp.zeros_like(all_evals))
151
154
  return masked_array
@@ -34,23 +34,23 @@ class CVXPyVariables:
34
34
  lam_vb_nodal: Virtual buffer penalty weights for nodal constraints (N x n_nodal, nonneg)
35
35
  lam_vb_cross: Virtual buffer penalty weights for cross-node constraints (n_cross, nonneg)
36
36
 
37
+ prox_c: Linear proximal coefficient parameter (N x (n_states+n_controls))
38
+ prox_cc: Constant proximal offset parameter (N,)
39
+ dyn_bias: Dynamics affine bias parameter (N-1 x n_states)
40
+ x0_imp_bias: Initial impulsive affine bias parameter (n_states,)
41
+
37
42
  x: State variable (N x n_states)
38
- dx: State error variable (N x n_states)
39
43
  x_bar: Previous SCP state parameter (N x n_states)
40
44
  x_init: Initial state parameter (n_states,)
41
45
  x_term: Terminal state parameter (n_states,)
42
46
 
43
47
  u: Control variable (N x n_controls)
44
- du: Control error variable (N x n_controls)
45
48
  u_bar: Previous SCP control parameter (N x n_controls)
46
49
 
47
50
  A_d: Discretized state Jacobian parameter (N-1 x n_states*n_states)
48
51
  B_d: Discretized control Jacobian parameter (N-1 x n_states*n_controls)
49
52
  C_d: Discretized control Jacobian (next node) parameter
50
- x_prop_plus: Discrete dynamics propagated state parameter
51
- D_d: Jacobian of impulsive/discrete dynamics w.r.t. state
52
53
  E_d: Jacobian of impulsive/discrete dynamics w.r.t. control
53
- x_prop: Propagated state parameter (N-1 x n_states)
54
54
  nu: Virtual control variable (N-1 x n_states)
55
55
 
56
56
  g: List of constraint value parameters (one per nodal constraint)
@@ -72,8 +72,6 @@ class CVXPyVariables:
72
72
 
73
73
  x_nonscaled: List of scaled state expressions at each node
74
74
  u_nonscaled: List of scaled control expressions at each node
75
- dx_nonscaled: List of scaled state error expressions at each node
76
- du_nonscaled: List of scaled control error expressions at each node
77
75
  """
78
76
 
79
77
  # SCP weight parameters
@@ -82,28 +80,26 @@ class CVXPyVariables:
82
80
  lam_vc: "cp.Parameter"
83
81
  lam_vb_nodal: "cp.Parameter"
84
82
  lam_vb_cross: "cp.Parameter"
85
-
83
+ prox_c: "cp.Parameter"
84
+ prox_cc: "cp.Parameter"
86
85
  # State variables and parameters
87
86
  x: "cp.Variable"
88
- dx: "cp.Variable"
89
87
  x_bar: "cp.Parameter"
90
88
  x_init: "cp.Parameter"
91
89
  x_term: "cp.Parameter"
92
90
 
93
91
  # Control variables and parameters
94
92
  u: "cp.Variable"
95
- du: "cp.Variable"
96
93
  u_bar: "cp.Parameter"
97
94
 
98
95
  # Dynamics discretization parameters
99
96
  A_d: "cp.Parameter"
100
97
  B_d: "cp.Parameter"
101
98
  C_d: "cp.Parameter"
102
- x_prop_plus: "cp.Parameter | None"
103
- D_d: "cp.Parameter | None"
104
99
  E_d: "cp.Parameter | None"
105
- x_prop: "cp.Parameter"
106
100
  nu: "cp.Variable"
101
+ dyn_bias: "cp.Parameter"
102
+ x0_imp_bias: "cp.Parameter"
107
103
 
108
104
  # Nodal constraint linearization (lists, one per constraint)
109
105
  g: List["cp.Parameter"] = field(default_factory=list)
@@ -128,5 +124,3 @@ class CVXPyVariables:
128
124
  # Scaled CVXPy expressions at each node (lists of length N)
129
125
  x_nonscaled: List = field(default_factory=list)
130
126
  u_nonscaled: List = field(default_factory=list)
131
- dx_nonscaled: List = field(default_factory=list)
132
- du_nonscaled: List = field(default_factory=list)
@@ -217,6 +217,17 @@ class ConvexSolver(ABC):
217
217
  """
218
218
  raise NotImplementedError
219
219
 
220
+ def update_proximal_terms(self) -> None:
221
+ """Update optional proximal-expansion parameters.
222
+
223
+ Called after ``update_penalties()`` and before ``solve()``. Solvers
224
+ that formulate trust-region penalties via expanded quadratic forms can
225
+ override this hook to refresh any derived coefficients.
226
+
227
+ Default implementation is a no-op.
228
+ """
229
+ return None
230
+
220
231
  @abstractmethod
221
232
  def update_boundary_conditions(self, **kwargs) -> None:
222
233
  """Update boundary condition parameters.
@@ -205,6 +205,8 @@ class CVXPyPTRSolver(PTRSolver):
205
205
  # ``settings`` arguments each iteration.
206
206
  self._jax_constraints: Optional["LoweredJaxConstraints"] = None
207
207
  self._settings: Optional[Config] = None
208
+ self._slice_cont = slice(0, 0)
209
+ self._slice_imp = slice(0, 0)
208
210
 
209
211
  @property
210
212
  def ocp_vars(self) -> "CVXPyVariables":
@@ -255,6 +257,8 @@ class CVXPyPTRSolver(PTRSolver):
255
257
  "Unified control slices are inconsistent with control dimension. "
256
258
  f"continuous={n_controls_cont}, impulsive={n_controls_imp}, total={n_controls}."
257
259
  )
260
+ self._slice_cont = slice_cont
261
+ self._slice_imp = slice_imp
258
262
 
259
263
  S_x, c_x = self._scaling(x_unified)
260
264
  S_u, c_u = self._scaling(u_unified)
@@ -417,13 +421,14 @@ class CVXPyPTRSolver(PTRSolver):
417
421
  jax_constraints = lowered.jax_constraints
418
422
 
419
423
  lam_prox = ocp_vars.lam_prox
424
+ prox_c = ocp_vars.prox_c
425
+ prox_cc = ocp_vars.prox_cc
420
426
  lam_cost = ocp_vars.lam_cost
421
427
  lam_vc = ocp_vars.lam_vc
422
428
  lam_vb_nodal = ocp_vars.lam_vb_nodal
423
429
  lam_vb_cross = ocp_vars.lam_vb_cross
424
- _ = ocp_vars.x_nonscaled
425
- dx = ocp_vars.dx
426
- du = ocp_vars.du
430
+ x = ocp_vars.x
431
+ u = ocp_vars.u
427
432
  nu = ocp_vars.nu
428
433
  nu_vb = ocp_vars.nu_vb
429
434
  nu_vb_cross = ocp_vars.nu_vb_cross
@@ -433,7 +438,6 @@ class CVXPyPTRSolver(PTRSolver):
433
438
  cost += cp.sum(lam_vb_cross) * 0
434
439
 
435
440
  # Boundary condition cost terms (use scaled x for numerical conditioning)
436
- x = ocp_vars.x
437
441
  for i in range(settings.sim.true_state_slice.start, settings.sim.true_state_slice.stop):
438
442
  if settings.sim.x.initial_type[i] == "Minimize":
439
443
  cost += lam_cost[i] * x[0][i]
@@ -444,9 +448,12 @@ class CVXPyPTRSolver(PTRSolver):
444
448
  if settings.sim.x.final_type[i] == "Maximize":
445
449
  cost -= lam_cost[i] * x[-1][i]
446
450
 
447
- # Trust Region Cost (per-variable weighting)
451
+ # Trust-region cost in expanded form:
452
+ # sum_i [lam_i * z_i^2 + prox_c_i * z_i + prox_cc_i], z_i = [x_i, u_i].
448
453
  cost += sum(
449
- cp.sum(cp.multiply(lam_prox[i], cp.square(cp.hstack((dx[i], du[i])))))
454
+ cp.sum(cp.multiply(lam_prox[i], cp.square(cp.hstack((x[i], u[i])))))
455
+ + cp.sum(cp.multiply(prox_c[i], cp.hstack((x[i], u[i]))))
456
+ + prox_cc[i]
450
457
  for i in range(settings.sim.n)
451
458
  )
452
459
 
@@ -503,20 +510,14 @@ class CVXPyPTRSolver(PTRSolver):
503
510
  jax_constraints = lowered.jax_constraints
504
511
  cvxpy_constraints = lowered.cvxpy_constraints
505
512
 
506
- x = ocp_vars.x
507
- dx = ocp_vars.dx
508
- x_bar = ocp_vars.x_bar
509
513
  x_init = ocp_vars.x_init
510
514
  x_term = ocp_vars.x_term
511
- u = ocp_vars.u
512
- du = ocp_vars.du
513
- u_bar = ocp_vars.u_bar
514
515
  A_d = ocp_vars.A_d
515
516
  B_d = ocp_vars.B_d
516
517
  C_d = ocp_vars.C_d
517
- x_prop = ocp_vars.x_prop
518
- x_prop_plus = ocp_vars.x_prop_plus
519
518
  E_d = ocp_vars.E_d
519
+ dyn_bias = ocp_vars.dyn_bias
520
+ x0_imp_bias = ocp_vars.x0_imp_bias
520
521
  nu = ocp_vars.nu
521
522
  g = ocp_vars.g
522
523
  grad_g_x = ocp_vars.grad_g_x
@@ -532,11 +533,8 @@ class CVXPyPTRSolver(PTRSolver):
532
533
  c_u = ocp_vars.c_u
533
534
  x_nonscaled = ocp_vars.x_nonscaled
534
535
  u_nonscaled = ocp_vars.u_nonscaled
535
- dx_nonscaled = ocp_vars.dx_nonscaled
536
- du_nonscaled = ocp_vars.du_nonscaled
537
536
  slice_cont = settings.sim.u.slice_continuous
538
537
  slice_imp = settings.sim.u.slice_impulsive
539
- has_continuous = bool(slice_cont.stop > slice_cont.start)
540
538
  has_impulsive = bool(slice_imp.stop > slice_imp.start)
541
539
 
542
540
  constr = []
@@ -550,8 +548,8 @@ class CVXPyPTRSolver(PTRSolver):
550
548
  for node in nodes:
551
549
  residual = (
552
550
  g[idx_ncvx][node]
553
- + grad_g_x[idx_ncvx][node] @ dx[node]
554
- + grad_g_u[idx_ncvx][node] @ du[node]
551
+ + grad_g_x[idx_ncvx][node] @ x_nonscaled[node]
552
+ + grad_g_u[idx_ncvx][node] @ u_nonscaled[node]
555
553
  )
556
554
  constr += [residual == nu_vb[idx_ncvx][node]]
557
555
  idx_ncvx += 1
@@ -560,14 +558,15 @@ class CVXPyPTRSolver(PTRSolver):
560
558
  idx_cross = 0
561
559
  if jax_constraints.cross_node:
562
560
  for constraint in jax_constraints.cross_node:
563
- # Linearization: g(X_bar, U_bar) + ∇g_X @ dX + ∇g_U @ dU == nu_vb
561
+ # Linearization in affine form:
562
+ # g_tilde + Σ_k(∇g_X[k]·X[k] + ∇g_U[k]·U[k]) == nu_vb
564
563
  # Sum over all trajectory nodes to couple multiple nodes
565
564
  residual = g_cross[idx_cross]
566
565
  for k in range(settings.sim.n):
567
566
  # Contribution from state at node k
568
- residual += grad_g_X_cross[idx_cross][k, :] @ dx[k]
567
+ residual += grad_g_X_cross[idx_cross][k, :] @ x_nonscaled[k]
569
568
  # Contribution from control at node k
570
- residual += grad_g_U_cross[idx_cross][k, :] @ du[k]
569
+ residual += grad_g_U_cross[idx_cross][k, :] @ u_nonscaled[k]
571
570
  # Add constraint: residual == slack variable
572
571
  constr += [residual == nu_vb_cross[idx_cross]]
573
572
  idx_cross += 1
@@ -582,7 +581,7 @@ class CVXPyPTRSolver(PTRSolver):
582
581
  if has_impulsive:
583
582
  constr += [
584
583
  x_nonscaled[0][i]
585
- == x_prop_plus[0][i] + E_d[0][i, slice_imp] @ du_nonscaled[0][slice_imp]
584
+ == x0_imp_bias[i] + E_d[0][i, slice_imp] @ u_nonscaled[0][slice_imp]
586
585
  ]
587
586
  else:
588
587
  constr += [x_nonscaled[0][i] == x_init[i]] # Initial Boundary Conditions
@@ -598,26 +597,15 @@ class CVXPyPTRSolver(PTRSolver):
598
597
  for i in range(1, settings.sim.n)
599
598
  ]
600
599
 
601
- constr += [
602
- (x[i] - inv_S_x @ (x_bar[i] - c_x) - dx[i]) == 0 for i in range(settings.sim.n)
603
- ] # State Error
604
- constr += [
605
- (u[i] - inv_S_u @ (u_bar[i] - c_u) - du[i]) == 0 for i in range(settings.sim.n)
606
- ] # Control Error
607
-
608
600
  constr += [
609
601
  inv_S_x @ (x_nonscaled[i] - c_x)
610
602
  == inv_S_x
611
603
  @ (
612
- A_d[i - 1] @ dx_nonscaled[i - 1]
613
- + (
614
- B_d[i - 1][:, slice_cont] @ du_nonscaled[i - 1][slice_cont]
615
- if has_continuous
616
- else 0
617
- )
618
- + (C_d[i - 1][:, slice_cont] @ du_nonscaled[i][slice_cont] if has_continuous else 0)
619
- + (E_d[i][:, slice_imp] @ du_nonscaled[i][slice_imp] if has_impulsive else 0)
620
- + (x_prop_plus[i] if has_impulsive else x_prop[i - 1])
604
+ A_d[i - 1] @ x_nonscaled[i - 1]
605
+ + B_d[i - 1][:, slice_cont] @ u_nonscaled[i - 1][slice_cont]
606
+ + C_d[i - 1][:, slice_cont] @ u_nonscaled[i][slice_cont]
607
+ + (E_d[i][:, slice_imp] @ u_nonscaled[i][slice_imp] if has_impulsive else 0)
608
+ + dyn_bias[i - 1]
621
609
  - c_x
622
610
  )
623
611
  + nu[i - 1]
@@ -721,8 +709,10 @@ class CVXPyPTRSolver(PTRSolver):
721
709
  D_d: Optional impulsive/discrete Jacobian wrt state, shape (N, n_states, n_states)
722
710
  E_d: Optional impulsive/discrete Jacobian wrt control, shape (N, n_states, n_controls)
723
711
  """
724
- self._set_param("x_bar", x_bar)
725
- self._set_param("u_bar", u_bar)
712
+ x_bar_arr = np.asarray(x_bar)
713
+ u_bar_arr = np.asarray(u_bar)
714
+ self._ocp_vars.x_bar.value = x_bar_arr
715
+ self._ocp_vars.u_bar.value = u_bar_arr
726
716
 
727
717
  A_eff = np.asarray(A_d)
728
718
  B_eff = np.asarray(B_d)
@@ -751,14 +741,62 @@ class CVXPyPTRSolver(PTRSolver):
751
741
  self._set_param("A_d", A_eff)
752
742
  self._set_param("B_d", B_eff)
753
743
  self._set_param("C_d", C_eff)
754
- if "x_prop" in self._problem.param_dict:
755
- self._set_param("x_prop", x_prop)
756
- elif self._ocp_vars.x_prop is not None:
757
- self._ocp_vars.x_prop.value = np.asarray(x_prop)
758
- if x_prop_plus is not None and self._ocp_vars.x_prop_plus is not None:
759
- self._ocp_vars.x_prop_plus.value = np.asarray(x_prop_plus)
760
- if E_d is not None and self._ocp_vars.E_d is not None:
761
- self._ocp_vars.E_d.value = np.asarray(E_d)
744
+ x_prop_arr = np.asarray(x_prop)
745
+ x_prop_plus_arr = np.asarray(x_prop_plus) if x_prop_plus is not None else None
746
+ E_arr = None
747
+ if E_d is not None:
748
+ E_arr = np.asarray(E_d)
749
+ self._ocp_vars.E_d.value = E_arr
750
+
751
+ self.dynamics_biases(
752
+ A_d=A_eff,
753
+ B_d=B_eff,
754
+ C_d=C_eff,
755
+ x_bar=x_bar_arr,
756
+ u_bar=u_bar_arr,
757
+ x_prop=x_prop_arr,
758
+ x_prop_plus=x_prop_plus_arr,
759
+ E_d=E_arr,
760
+ )
761
+
762
+ def dynamics_biases(
763
+ self,
764
+ A_d: np.ndarray,
765
+ B_d: np.ndarray,
766
+ C_d: np.ndarray,
767
+ x_bar: np.ndarray,
768
+ u_bar: np.ndarray,
769
+ x_prop: np.ndarray,
770
+ x_prop_plus: np.ndarray | None = None,
771
+ E_d: np.ndarray | None = None,
772
+ ) -> None:
773
+ """Update affine dynamics bias parameters for the current linearization.
774
+
775
+ Computes and stores:
776
+ - ``dyn_bias``: per-step affine bias in linearized dynamics
777
+ - ``x0_imp_bias``: initial-node impulsive affine bias
778
+ """
779
+ has_impulsive = bool(self._slice_imp.stop > self._slice_imp.start)
780
+
781
+ dyn_bias = np.zeros((A_d.shape[0], A_d.shape[1]), dtype=float)
782
+ for k in range(A_d.shape[0]):
783
+ i = k + 1
784
+ base = x_prop_plus[i] if has_impulsive else x_prop[k]
785
+ bias_k = (
786
+ base
787
+ - A_d[k] @ x_bar[k]
788
+ - B_d[k][:, self._slice_cont] @ u_bar[k][self._slice_cont]
789
+ - C_d[k][:, self._slice_cont] @ u_bar[i][self._slice_cont]
790
+ - (E_d[i][:, self._slice_imp] @ u_bar[i][self._slice_imp] if has_impulsive else 0)
791
+ )
792
+ dyn_bias[k] = bias_k
793
+ self._ocp_vars.dyn_bias.value = dyn_bias
794
+
795
+ if has_impulsive:
796
+ x0_imp_bias = x_prop_plus[0] - E_d[0][:, self._slice_imp] @ u_bar[0][self._slice_imp]
797
+ else:
798
+ x0_imp_bias = np.zeros(A_d.shape[1], dtype=float)
799
+ self._ocp_vars.x0_imp_bias.value = x0_imp_bias
762
800
 
763
801
  def update_constraint_linearizations(
764
802
  self,
@@ -781,16 +819,43 @@ class CVXPyPTRSolver(PTRSolver):
781
819
  - ``grad_g_U``: Gradient w.r.t. full control trajectory
782
820
  """
783
821
  if nodal:
822
+ x_bar = self._ocp_vars.x_bar.value
823
+ u_bar = self._ocp_vars.u_bar.value
824
+ x_bar_arr = np.asarray(x_bar)
825
+ u_bar_arr = np.asarray(u_bar)
784
826
  for g_id, constraint_data in enumerate(nodal):
785
- self._set_param(f"g_{g_id}", constraint_data["g"])
786
- self._set_param(f"grad_g_x_{g_id}", constraint_data["grad_g_x"])
787
- self._set_param(f"grad_g_u_{g_id}", constraint_data["grad_g_u"])
827
+ g_arr = np.asarray(constraint_data["g"])
828
+ grad_x_arr = np.asarray(constraint_data["grad_g_x"])
829
+ grad_u_arr = np.asarray(constraint_data["grad_g_u"])
830
+
831
+ # Convert to affine form in (X, U):
832
+ # g_tilde + grad_x·X + grad_u·U, where
833
+ # g_tilde = g(X_bar, U_bar) - grad_x·X_bar - grad_u·U_bar.
834
+ g_tilde = (
835
+ g_arr
836
+ - np.sum(grad_x_arr * x_bar_arr, axis=1)
837
+ - np.sum(grad_u_arr * u_bar_arr, axis=1)
838
+ )
839
+
840
+ self._set_param(f"g_{g_id}", g_tilde)
841
+ self._set_param(f"grad_g_x_{g_id}", grad_x_arr)
842
+ self._set_param(f"grad_g_u_{g_id}", grad_u_arr)
788
843
 
789
844
  if cross_node:
845
+ x_bar = self._ocp_vars.x_bar.value
846
+ u_bar = self._ocp_vars.u_bar.value
847
+ x_bar_arr = np.asarray(x_bar)
848
+ u_bar_arr = np.asarray(u_bar)
790
849
  for g_id, constraint_data in enumerate(cross_node):
791
- self._set_param(f"g_cross_{g_id}", constraint_data["g"])
792
- self._set_param(f"grad_g_X_cross_{g_id}", constraint_data["grad_g_X"])
793
- self._set_param(f"grad_g_U_cross_{g_id}", constraint_data["grad_g_U"])
850
+ g_val = np.asarray(constraint_data["g"])
851
+ grad_X_arr = np.asarray(constraint_data["grad_g_X"])
852
+ grad_U_arr = np.asarray(constraint_data["grad_g_U"])
853
+
854
+ g_tilde = g_val - np.sum(grad_X_arr * x_bar_arr) - np.sum(grad_U_arr * u_bar_arr)
855
+
856
+ self._set_param(f"g_cross_{g_id}", g_tilde)
857
+ self._set_param(f"grad_g_X_cross_{g_id}", grad_X_arr)
858
+ self._set_param(f"grad_g_U_cross_{g_id}", grad_U_arr)
794
859
 
795
860
  def update_penalties(
796
861
  self,
@@ -815,12 +880,36 @@ class CVXPyPTRSolver(PTRSolver):
815
880
  lam_vb_cross: Virtual buffer penalty weights for cross-node
816
881
  constraints, shape ``(n_cross_node_constraints,)``.
817
882
  """
818
- self._set_param("lam_prox", lam_prox)
883
+ lam_prox_arr = np.asarray(lam_prox)
884
+ self._set_param("lam_prox", lam_prox_arr)
819
885
  self._set_param("lam_cost", lam_cost)
820
886
  self._set_param("lam_vc", lam_vc)
821
887
  self._set_param("lam_vb_nodal", lam_vb_nodal)
822
888
  self._set_param("lam_vb_cross", lam_vb_cross)
823
889
 
890
+ def proximal_cost_terms(
891
+ self,
892
+ lam_prox: np.ndarray,
893
+ x_bar: np.ndarray,
894
+ u_bar: np.ndarray,
895
+ ) -> tuple[np.ndarray, np.ndarray]:
896
+ """Compute linear and constant proximal cost terms."""
897
+ x_ref = (self._ocp_vars.inv_S_x @ (x_bar.T - self._ocp_vars.c_x[:, None])).T
898
+ u_ref = (self._ocp_vars.inv_S_u @ (u_bar.T - self._ocp_vars.c_u[:, None])).T
899
+ z_ref = np.hstack((x_ref, u_ref))
900
+ prox_c = -2.0 * lam_prox * z_ref
901
+ prox_cc = np.sum(lam_prox * np.square(z_ref), axis=1)
902
+ return prox_c, prox_cc
903
+
904
+ def update_proximal_terms(self) -> None:
905
+ """Update proximal expansion parameters from current references and weights."""
906
+ lam_prox_arr = np.asarray(self._ocp_vars.lam_prox.value)
907
+ x_bar = np.asarray(self._ocp_vars.x_bar.value)
908
+ u_bar = np.asarray(self._ocp_vars.u_bar.value)
909
+ prox_c, prox_cc = self.proximal_cost_terms(lam_prox_arr, x_bar, u_bar)
910
+ self._set_param("prox_c", prox_c)
911
+ self._set_param("prox_cc", prox_cc)
912
+
824
913
  def update_boundary_conditions(
825
914
  self,
826
915
  x_init: np.ndarray = None,
@@ -279,6 +279,8 @@ def create_cvxpy_variables(
279
279
 
280
280
  # Parameters
281
281
  lam_prox = cp.Parameter((N, n_states + n_controls), nonneg=True, name="lam_prox")
282
+ prox_c = cp.Parameter((N, n_states + n_controls), name="prox_c")
283
+ prox_cc = cp.Parameter(N, name="prox_cc")
282
284
  lam_cost = cp.Parameter(n_states, nonneg=True, name="lam_cost")
283
285
  lam_vc = cp.Parameter((N - 1, n_states), nonneg=True, name="lam_vc")
284
286
  lam_vb_nodal = cp.Parameter((N, max(n_nodal_constraints, 1)), nonneg=True, name="lam_vb_nodal")
@@ -286,24 +288,21 @@ def create_cvxpy_variables(
286
288
 
287
289
  # State
288
290
  x = cp.Variable((N, n_states), name="x") # Current State
289
- dx = cp.Variable((N, n_states), name="dx") # State Error
290
291
  x_bar = cp.Parameter((N, n_states), name="x_bar") # Previous SCP State
291
292
  x_init = cp.Parameter(n_states, name="x_init") # Initial State
292
293
  x_term = cp.Parameter(n_states, name="x_term") # Final State
293
294
 
294
295
  # Control
295
296
  u = cp.Variable((N, n_controls), name="u") # Current Control
296
- du = cp.Variable((N, n_controls), name="du") # Control Error
297
297
  u_bar = cp.Parameter((N, n_controls), name="u_bar") # Previous SCP Control
298
298
 
299
299
  # Discretized Augmented Dynamics Constraints
300
300
  A_d = cp.Parameter((N - 1, n_states, n_states), name="A_d", sparsity=A_d_sparsity)
301
301
  B_d = cp.Parameter((N - 1, n_states, n_controls), name="B_d", sparsity=B_d_sparsity)
302
302
  C_d = cp.Parameter((N - 1, n_states, n_controls), name="C_d", sparsity=C_d_sparsity)
303
- x_prop_plus = cp.Parameter((N, n_states), name="x_prop_plus")
304
- D_d = cp.Parameter((N, n_states, n_states), name="D_d")
305
303
  E_d = cp.Parameter((N, n_states, n_controls), name="E_d")
306
- x_prop = cp.Parameter((N - 1, n_states), name="x_prop")
304
+ dyn_bias = cp.Parameter((N - 1, n_states), name="dyn_bias")
305
+ x0_imp_bias = cp.Parameter(n_states, name="x0_imp_bias")
307
306
  nu = cp.Variable((N - 1, n_states), name="nu") # Virtual Control
308
307
 
309
308
  # Linearized Nonconvex Nodal Constraints
@@ -346,13 +345,9 @@ def create_cvxpy_variables(
346
345
  # Applying the affine scaling to state and control
347
346
  x_nonscaled = []
348
347
  u_nonscaled = []
349
- dx_nonscaled = []
350
- du_nonscaled = []
351
348
  for k in range(N):
352
349
  x_nonscaled.append(S_x @ x[k] + c_x)
353
350
  u_nonscaled.append(S_u @ u[k] + c_u)
354
- dx_nonscaled.append(S_x @ dx[k])
355
- du_nonscaled.append(S_u @ du[k])
356
351
 
357
352
  return CVXPyVariables(
358
353
  lam_prox=lam_prox,
@@ -360,21 +355,20 @@ def create_cvxpy_variables(
360
355
  lam_vc=lam_vc,
361
356
  lam_vb_nodal=lam_vb_nodal,
362
357
  lam_vb_cross=lam_vb_cross,
358
+ prox_c=prox_c,
359
+ prox_cc=prox_cc,
363
360
  x=x,
364
- dx=dx,
365
361
  x_bar=x_bar,
366
362
  x_init=x_init,
367
363
  x_term=x_term,
368
364
  u=u,
369
- du=du,
370
365
  u_bar=u_bar,
371
366
  A_d=A_d,
372
367
  B_d=B_d,
373
368
  C_d=C_d,
374
- x_prop_plus=x_prop_plus,
375
- D_d=D_d,
376
369
  E_d=E_d,
377
- x_prop=x_prop,
370
+ dyn_bias=dyn_bias,
371
+ x0_imp_bias=x0_imp_bias,
378
372
  nu=nu,
379
373
  g=g,
380
374
  grad_g_x=grad_g_x,
@@ -392,8 +386,6 @@ def create_cvxpy_variables(
392
386
  c_u=c_u,
393
387
  x_nonscaled=x_nonscaled,
394
388
  u_nonscaled=u_nonscaled,
395
- dx_nonscaled=dx_nonscaled,
396
- du_nonscaled=du_nonscaled,
397
389
  )
398
390
 
399
391
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev14
3
+ Version: 0.5.3.dev15
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
@@ -49,10 +49,22 @@ def _subproblem_data_from_solver(prob) -> SubproblemData:
49
49
  A_d = np.asarray(ocp.A_d.value)
50
50
  B_d = np.asarray(ocp.B_d.value)
51
51
  C_d = np.asarray(ocp.C_d.value)
52
- x_prop = np.asarray(ocp.x_prop.value) if ocp.x_prop is not None else np.zeros((N - 1, n_x))
52
+ # New nomenclature: x_prop/x_prop_plus are not stored directly on CVXPyVariables.
53
+ # Reconstruct continuous x_prop from affine dynamics bias:
54
+ # dyn_bias[k] = x_prop[k] - A[k]x_bar[k] - B[k]u_bar[k] - C[k]u_bar[k+1]
55
+ if hasattr(ocp, "x_prop") and ocp.x_prop is not None and ocp.x_prop.value is not None:
56
+ x_prop = np.asarray(ocp.x_prop.value)
57
+ else:
58
+ dyn_bias = np.asarray(ocp.dyn_bias.value)
59
+ x_prop = np.zeros((N - 1, n_x))
60
+ for k in range(N - 1):
61
+ x_prop[k] = dyn_bias[k] + A_d[k] @ x_bar[k] + B_d[k] @ u_bar[k] + C_d[k] @ u_bar[k + 1]
62
+
53
63
  x_prop_plus = (
54
- np.asarray(ocp.x_prop_plus.value)
55
- if ocp.x_prop_plus is not None and ocp.x_prop_plus.value is not None
64
+ np.asarray(getattr(ocp, "x_prop_plus").value)
65
+ if hasattr(ocp, "x_prop_plus")
66
+ and getattr(ocp, "x_prop_plus") is not None
67
+ and getattr(ocp, "x_prop_plus").value is not None
56
68
  else np.zeros((N, n_x))
57
69
  )
58
70
  E_d = (
File without changes
File without changes