openscvx 0.5.3.dev11__tar.gz → 0.5.3.dev13__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 (375) hide show
  1. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/tests-unit.yml +0 -1
  2. {openscvx-0.5.3.dev11/openscvx.egg-info → openscvx-0.5.3.dev13}/PKG-INFO +2 -2
  3. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UnderTheHood/lowering_architecture.md +10 -0
  4. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/_version.py +3 -3
  5. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/cvxpy_ptr_solver.py +229 -3
  6. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/moreau_ptr_solver.py +474 -7
  7. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/ptr_solver.py +211 -9
  8. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/qpax_ptr_solver.py +500 -5
  9. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13/openscvx.egg-info}/PKG-INFO +2 -2
  10. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/SOURCES.txt +7 -0
  11. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/requires.txt +1 -1
  12. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/pyproject.toml +1 -1
  13. openscvx-0.5.3.dev13/tests/solvers/_iteration_callback_helpers.py +189 -0
  14. openscvx-0.5.3.dev13/tests/solvers/test_cvxpy_callback_jit_spike.py +149 -0
  15. openscvx-0.5.3.dev13/tests/solvers/test_iteration_callback_cvxpy.py +218 -0
  16. openscvx-0.5.3.dev13/tests/solvers/test_iteration_callback_moreau.py +140 -0
  17. openscvx-0.5.3.dev13/tests/solvers/test_iteration_callback_qpax.py +125 -0
  18. openscvx-0.5.3.dev13/tests/solvers/test_iteration_callback_vmap.py +153 -0
  19. openscvx-0.5.3.dev13/tests/solvers/test_subproblem_pytree.py +135 -0
  20. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/assets/logo.svg +0 -0
  21. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/release-drafter.yml +0 -0
  22. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/_docs.yml +0 -0
  23. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/branch-name.yml +0 -0
  24. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/docs.yml +0 -0
  25. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/lint.yml +0 -0
  26. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/nightly.yml +0 -0
  27. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/release-drafter.yml +0 -0
  28. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/release.yml +0 -0
  29. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.github/workflows/tests-integration.yml +0 -0
  30. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.gitignore +0 -0
  31. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/.gitmodules +0 -0
  32. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/CONTRIBUTING.md +0 -0
  33. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/LICENSE +0 -0
  34. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/README.md +0 -0
  35. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/constraint_reformulation.md +0 -0
  36. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/control_parameterization.md +0 -0
  37. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/discretization.md +0 -0
  38. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/ocp.md +0 -0
  39. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/scvx.md +0 -0
  40. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/Foundations/time_dilation.md +0 -0
  41. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  42. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/00_introduction.md +0 -0
  43. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  44. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  45. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  46. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  47. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/05_visualization.md +0 -0
  48. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/06_logic.md +0 -0
  49. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/07_lie.md +0 -0
  50. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/08_mpcc.md +0 -0
  51. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
  52. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/favicon.png +0 -0
  53. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/ct-scvx_dark.png +0 -0
  54. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/ct-scvx_light.png +0 -0
  55. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/ctcs_dark.png +0 -0
  56. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/ctcs_light.png +0 -0
  57. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/problem_class_dark.png +0 -0
  58. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/images/problem_class_light.png +0 -0
  59. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/logo.svg +0 -0
  60. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/openscvx_logo_square.png +0 -0
  61. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/viser-client/index.html +0 -0
  62. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  63. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  64. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/citation.md +0 -0
  65. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/examples.md +0 -0
  66. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/index.md +0 -0
  67. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/javascripts/mathjax.js +0 -0
  68. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/docs/versions.json +0 -0
  69. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/_viser_embed_export.py +0 -0
  70. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/brachistochrone.py +0 -0
  71. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/hypersensitive.py +0 -0
  72. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/impulsive.py +0 -0
  73. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/stl_integer_variable.py +0 -0
  74. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/abstract/stl_or.py +0 -0
  75. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/7_dof_arm.py +0 -0
  76. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/_camera.py +0 -0
  77. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/_render.py +0 -0
  78. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/_sensor_view.py +0 -0
  79. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/dr_vp_polytope.py +0 -0
  80. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  81. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/logo.py +0 -0
  82. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  83. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/3_dof_arm.py +0 -0
  84. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/7_dof_arm.py +0 -0
  85. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/7_dof_arm_collision.py +0 -0
  86. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/7_dof_arm_vp.py +0 -0
  87. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  88. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  89. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car.py +0 -0
  90. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_disjoint.py +0 -0
  91. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  92. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_obstacle_stl.py +0 -0
  93. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_stl_or.py +0 -0
  94. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/car/dubins_car_waypoint_stl.py +0 -0
  95. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/cinema_vp.py +0 -0
  96. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/dr_double_integrator.py +0 -0
  97. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/dr_vp.py +0 -0
  98. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/dr_vp_nodal.py +0 -0
  99. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/dr_vp_polytope.py +0 -0
  100. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/drone_racing.py +0 -0
  101. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/logo.py +0 -0
  102. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/logo_utils/acl_logo.svg +0 -0
  103. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  104. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/obstacle_avoidance.py +0 -0
  105. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  106. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  107. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/cartpole_mjx.py +0 -0
  108. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/double_cartpole_mjx.py +0 -0
  109. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/skydio_x2_mjx.py +0 -0
  110. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  111. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/triple_cartpole_game.py +0 -0
  112. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mjx/triple_cartpole_mjx.py +0 -0
  113. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/double_integrator_discrete.py +0 -0
  114. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/double_integrator_drone_racing.py +0 -0
  115. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  116. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  117. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  118. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/plotting.py +0 -0
  119. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/plotting_viser.py +0 -0
  120. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  121. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  122. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  123. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  124. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  125. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  126. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  127. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  128. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/cinema_vp_realtime.py +0 -0
  129. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/drone_racing_realtime.py +0 -0
  130. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/dubins_car_realtime.py +0 -0
  131. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  132. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/rocket/3DoF_pdg.py +0 -0
  133. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/rocket/6DoF_pdg.py +0 -0
  134. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/spacecraft/halo_orbit.py +0 -0
  135. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/spacecraft/hohmann_transfer.py +0 -0
  136. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/spacecraft/let_transfer.py +0 -0
  137. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/examples/spacecraft/proxops_cw.py +0 -0
  138. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/ctlos_cine.gif +0 -0
  139. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/ctlos_dr.gif +0 -0
  140. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/dtlos_cine.gif +0 -0
  141. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/dtlos_dr.gif +0 -0
  142. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/openscvx_logo.svg +0 -0
  143. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/openscvx_logo_square.png +0 -0
  144. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/oscvx_structure_full_dark.svg +0 -0
  145. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/figures/video_preview.png +0 -0
  146. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/__init__.py +0 -0
  147. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/assets/stylesheets/custom.css +0 -0
  148. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  149. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  150. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  151. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/home.html +0 -0
  152. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/main.html +0 -0
  153. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-diagram.html +0 -0
  154. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-dropin-banner.html +0 -0
  155. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-hero.html +0 -0
  156. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-pipeline.html +0 -0
  157. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/material/overrides/partials/home-viser-strip.html +0 -0
  158. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/mkdocs.yml +0 -0
  159. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/__init__.py +0 -0
  160. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/__main__.py +0 -0
  161. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/__init__.py +0 -0
  162. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/__init__.py +0 -0
  163. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  164. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
  165. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  166. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  167. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/base.py +0 -0
  168. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/optimization_results.py +0 -0
  169. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/scvx/__init__.py +0 -0
  170. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
  171. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/algorithms/weights.py +0 -0
  172. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/config.py +0 -0
  173. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/__init__.py +0 -0
  174. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/base.py +0 -0
  175. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/discretize_linearize.py +0 -0
  176. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/linearize_discretize.py +0 -0
  177. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  178. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  179. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  180. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  181. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/expert/__init__.py +0 -0
  182. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/expert/byof.py +0 -0
  183. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/expert/lowering.py +0 -0
  184. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/expert/validation.py +0 -0
  185. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/init/__init__.py +0 -0
  186. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/init/interpolation.py +0 -0
  187. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/init/inverse_kinematics.py +0 -0
  188. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrations/__init__.py +0 -0
  189. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrations/base.py +0 -0
  190. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrations/menagerie.py +0 -0
  191. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrations/mjx.py +0 -0
  192. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrators/__init__.py +0 -0
  193. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrators/diffrax.py +0 -0
  194. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/integrators/runge_kutta.py +0 -0
  195. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/loader.py +0 -0
  196. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/__init__.py +0 -0
  197. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/cvxpy_constraints.py +0 -0
  198. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/cvxpy_variables.py +0 -0
  199. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/dynamics.py +0 -0
  200. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/jax_constraints.py +0 -0
  201. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/parameters.py +0 -0
  202. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/problem.py +0 -0
  203. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/lowered/unified.py +0 -0
  204. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/__init__.py +0 -0
  205. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/plotting.py +0 -0
  206. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/scp_iteration.py +0 -0
  207. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/__init__.py +0 -0
  208. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/animated.py +0 -0
  209. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/orbits.py +0 -0
  210. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/plotly_integration.py +0 -0
  211. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/primitives.py +0 -0
  212. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/scp.py +0 -0
  213. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/plotting/viser/server.py +0 -0
  214. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/problem.py +0 -0
  215. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/propagation/__init__.py +0 -0
  216. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/propagation/post_processing.py +0 -0
  217. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/propagation/propagation.py +0 -0
  218. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/__init__.py +0 -0
  219. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/solvers/base.py +0 -0
  220. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/__init__.py +0 -0
  221. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/augmentation.py +0 -0
  222. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/builder.py +0 -0
  223. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/constraint_set.py +0 -0
  224. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/__init__.py +0 -0
  225. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/arithmetic.py +0 -0
  226. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/array.py +0 -0
  227. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/constraint.py +0 -0
  228. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/control.py +0 -0
  229. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/expr.py +0 -0
  230. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  231. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  232. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/lie/se3.py +0 -0
  233. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/lie/so3.py +0 -0
  234. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/linalg.py +0 -0
  235. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/logic.py +0 -0
  236. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/math.py +0 -0
  237. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/parameter.py +0 -0
  238. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/spatial.py +0 -0
  239. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/state.py +0 -0
  240. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/stl.py +0 -0
  241. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/stljax.py +0 -0
  242. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/time.py +0 -0
  243. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/variable.py +0 -0
  244. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/expr/vmap.py +0 -0
  245. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/hashing.py +0 -0
  246. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lower.py +0 -0
  247. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/__init__.py +0 -0
  248. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  249. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  250. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  251. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  252. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  253. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  254. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  255. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  256. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  257. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  258. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  259. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  260. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  261. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  262. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  263. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  264. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  265. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  266. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  267. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  268. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  269. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  270. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  271. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  272. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  273. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  274. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  275. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  276. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  277. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/__init__.py +0 -0
  278. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/_registry.py +0 -0
  279. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/array.py +0 -0
  280. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/constraint.py +0 -0
  281. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/lie.py +0 -0
  282. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/linalg.py +0 -0
  283. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/logic.py +0 -0
  284. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/math.py +0 -0
  285. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/parser.py +0 -0
  286. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/spatial.py +0 -0
  287. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/stl.py +0 -0
  288. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/stljax.py +0 -0
  289. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/parser/tokenizer.py +0 -0
  290. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/preprocessing.py +0 -0
  291. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/problem.py +0 -0
  292. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/sparsity.py +0 -0
  293. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/symbolic/unified.py +0 -0
  294. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/__init__.py +0 -0
  295. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/cache.py +0 -0
  296. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/caching.py +0 -0
  297. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/printing.py +0 -0
  298. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/profiling.py +0 -0
  299. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx/utils/utils.py +0 -0
  300. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/dependency_links.txt +0 -0
  301. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/entry_points.txt +0 -0
  302. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/openscvx.egg-info/top_level.txt +0 -0
  303. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/scripts/gen_example_pages.py +0 -0
  304. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/scripts/gen_ref_pages.py +0 -0
  305. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  306. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/setup.cfg +0 -0
  307. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/__init__.py +0 -0
  308. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/_marks.py +0 -0
  309. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/algorithms/__init__.py +0 -0
  310. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/algorithms/autotuner/__init__.py +0 -0
  311. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
  312. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
  313. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/brachistochrone_analytical.py +0 -0
  314. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/conftest.py +0 -0
  315. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/expr/__init__.py +0 -0
  316. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/expr/test_gmsr.py +0 -0
  317. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/fixtures/brachistochrone.json +0 -0
  318. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/fixtures/brachistochrone.yaml +0 -0
  319. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/hohmann_analytical.py +0 -0
  320. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/integrations/__init__.py +0 -0
  321. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/integrations/test_mjx.py +0 -0
  322. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/integrations/test_mjx_dynamics.py +0 -0
  323. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/solvers/__init__.py +0 -0
  324. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/solvers/test_moreau_ptr_solver.py +0 -0
  325. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/solvers/test_qpax_ptr_solver.py +0 -0
  326. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/__init__.py +0 -0
  327. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/__init__.py +0 -0
  328. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_arithmetic.py +0 -0
  329. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_array.py +0 -0
  330. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_constraint.py +0 -0
  331. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_expr.py +0 -0
  332. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_lie.py +0 -0
  333. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_linalg.py +0 -0
  334. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_logic.py +0 -0
  335. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_math.py +0 -0
  336. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_node_reference.py +0 -0
  337. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_parameters.py +0 -0
  338. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_scaling.py +0 -0
  339. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_spatial.py +0 -0
  340. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_stl.py +0 -0
  341. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_variable.py +0 -0
  342. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/expr/test_vmap.py +0 -0
  343. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/__init__.py +0 -0
  344. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_array.py +0 -0
  345. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_constraint.py +0 -0
  346. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_lie.py +0 -0
  347. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_linalg.py +0 -0
  348. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_load.py +0 -0
  349. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_logic.py +0 -0
  350. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_math.py +0 -0
  351. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_parser.py +0 -0
  352. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_spatial.py +0 -0
  353. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_stl.py +0 -0
  354. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_tokenizer.py +0 -0
  355. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/parser/test_vmap.py +0 -0
  356. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_augmentation.py +0 -0
  357. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_hashing.py +0 -0
  358. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_lower_cvxpy.py +0 -0
  359. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_lower_jax.py +0 -0
  360. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_preprocessing.py +0 -0
  361. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_sparsity.py +0 -0
  362. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/symbolic/test_unified.py +0 -0
  363. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_autotuning.py +0 -0
  364. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_brachistochrone.py +0 -0
  365. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_cvxpygen_optional.py +0 -0
  366. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_discretization.py +0 -0
  367. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_examples.py +0 -0
  368. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_expert.py +0 -0
  369. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_impulsive.py +0 -0
  370. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_init.py +0 -0
  371. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_integrators.py +0 -0
  372. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_loader.py +0 -0
  373. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_optimization_results.py +0 -0
  374. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_plotting.py +0 -0
  375. {openscvx-0.5.3.dev11 → openscvx-0.5.3.dev13}/tests/test_propagation.py +0 -0
@@ -38,7 +38,6 @@ jobs:
38
38
 
39
39
  - name: Install dependencies
40
40
  run: |
41
- # Install package with optional GUI and test packages
42
41
  uv pip install --system -e ".[gui,test]"
43
42
 
44
43
  - name: Run unit tests
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev11
3
+ Version: 0.5.3.dev13
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.11
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
- Requires-Dist: cvxpy>=1.8.1
13
+ Requires-Dist: cvxpy<1.9,>=1.8.1
14
14
  Requires-Dist: qoco
15
15
  Requires-Dist: numpy
16
16
  Requires-Dist: jax
@@ -171,6 +171,16 @@ of the abstract `PTRSolver` base. Three backends ship today:
171
171
  | QPAX | `QPAXPTRSolver` | `solver={"backend": "qpax"}` | JAX-native QP via `qpax.solve_qp`. Flat `(Q, q, A, b, G, h)` assembly. Supports box / dynamics (continuous and impulsive) / CTCS / boundary-Fix; **rejects** user `.convex()` and cross-node at `initialize()` with a clear "use `CVXPyPTRSolver`" message. Enables a path toward an end-to-end JAX-differentiable SCP loop in follow-up work. |
172
172
  | Moreau | `MoreauPTRSolver` | `solver={"backend": "moreau"}` | JAX-native conic solver (`moreau.jax.Solver`). Sparse CSR assembly; SOC epigraphs for the L1 / pos PTR penalties (fewer variables and rows than QPAX). Warm-starts between SCP iterations. Same supported subset as QPAX (continuous and impulsive dynamics). Paves the way for user `.convex()` SOC support in a follow-up. |
173
173
 
174
+ Each backend exposes two per-iteration entry points: the historical NumPy
175
+ `update_*` + `solve()` stages used by today's Python-side SCP loop, and a
176
+ JAX-pure `iteration_callback()` built once at `initialize()`. The callback
177
+ returns a `(state, SubproblemData) -> SubproblemSolution` callable; all
178
+ three backends emit the same input/output pytree shape so the callable
179
+ composes with `jax.jit` and `jax.vmap` (CVXPy via `jax.pure_callback` with
180
+ `vmap_method="sequential"` — its batched solves are serial). The downstream
181
+ batchable-`Problem.solve()` work wraps this callback in `lax.while_loop` to
182
+ keep the entire SCP iteration on the JAX boundary.
183
+
174
184
  Picking a backend at construction time:
175
185
 
176
186
  ```python
@@ -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.dev11'
22
- __version_tuple__ = version_tuple = (0, 5, 3, 'dev11')
21
+ __version__ = version = '0.5.3.dev13'
22
+ __version_tuple__ = version_tuple = (0, 5, 3, 'dev13')
23
23
 
24
- __commit_id__ = commit_id = 'g82b3ed7dc'
24
+ __commit_id__ = commit_id = 'gf4df0a724'
@@ -10,14 +10,22 @@ which targets pure-JAX execution.
10
10
  """
11
11
 
12
12
  import os
13
- from typing import TYPE_CHECKING, List, Optional, Union
13
+ from typing import TYPE_CHECKING, Callable, List, Optional, Union
14
14
 
15
15
  import cvxpy as cp
16
+ import jax
17
+ import jax.numpy as jnp
16
18
  import numpy as np
17
19
 
18
20
  from openscvx.config import Config
19
21
 
20
- from .ptr_solver import PTRSolver, PTRSolveResult
22
+ from .ptr_solver import (
23
+ PTRSolver,
24
+ PTRSolveResult,
25
+ SubproblemData,
26
+ SubproblemSolution,
27
+ status_str_to_code,
28
+ )
21
29
 
22
30
  if TYPE_CHECKING:
23
31
  from openscvx.lowered import LoweredProblem
@@ -38,6 +46,78 @@ except ImportError:
38
46
  ## TODO: (fabio) add support for impulsive controls
39
47
 
40
48
 
49
+ def _unstack_nodal(
50
+ data: SubproblemData,
51
+ jax_constraints: "LoweredJaxConstraints",
52
+ ) -> List[dict]:
53
+ """Unstack ``SubproblemData``'s ``nodal_*`` arrays into per-constraint dicts.
54
+
55
+ The JAX-pure side stacks every nodal constraint's linearization into
56
+ ``(N, n_nodal, ...)`` arrays with zero-fill at nodes outside each
57
+ constraint's static ``nodes`` tuple. :meth:`update_constraint_linearizations`
58
+ expects the list-of-dicts layout the SCP loop has historically built —
59
+ this helper inverts the stack. The full-N arrays are returned (the zero
60
+ rows are harmless: CVXPy's constraint set only references the
61
+ constraint's own ``nodes``).
62
+ """
63
+ if not jax_constraints.nodal:
64
+ return []
65
+ nodal_g = np.asarray(data.nodal_g)
66
+ nodal_grad_x = np.asarray(data.nodal_grad_x)
67
+ nodal_grad_u = np.asarray(data.nodal_grad_u)
68
+ out: List[dict] = []
69
+ for c_idx, _constraint in enumerate(jax_constraints.nodal):
70
+ out.append(
71
+ {
72
+ "g": nodal_g[:, c_idx],
73
+ "grad_g_x": nodal_grad_x[:, c_idx, :],
74
+ "grad_g_u": nodal_grad_u[:, c_idx, :],
75
+ }
76
+ )
77
+ return out
78
+
79
+
80
+ def _unstack_cross(
81
+ data: SubproblemData,
82
+ jax_constraints: "LoweredJaxConstraints",
83
+ ) -> List[dict]:
84
+ """Unstack ``SubproblemData``'s cross-node arrays into per-constraint dicts.
85
+
86
+ Cross-node constraints stack ``g`` to ``(n_cross,)`` and the gradients to
87
+ ``(n_cross, N, n_x | n_u)``. :meth:`update_constraint_linearizations`
88
+ expects per-constraint dicts with the natural orientation.
89
+ """
90
+ if not jax_constraints.cross_node:
91
+ return []
92
+ cross_g = np.asarray(data.cross_g)
93
+ cross_grad_X = np.asarray(data.cross_grad_X)
94
+ cross_grad_U = np.asarray(data.cross_grad_U)
95
+ out: List[dict] = []
96
+ for c_idx, _constraint in enumerate(jax_constraints.cross_node):
97
+ out.append(
98
+ {
99
+ "g": cross_g[c_idx],
100
+ "grad_g_X": cross_grad_X[c_idx],
101
+ "grad_g_U": cross_grad_U[c_idx],
102
+ }
103
+ )
104
+ return out
105
+
106
+
107
+ def _unmask_bc(bc: "jnp.ndarray") -> np.ndarray:
108
+ """Replace NaN-sentinel free entries with zeros for CVXPy parameter assignment.
109
+
110
+ ``SubproblemData.x_init`` / ``x_term`` carry ``jnp.nan`` at indices where
111
+ the boundary condition is free; CVXPy's ``Parameter.value`` setter rejects
112
+ non-real arrays via :meth:`CVXPyPTRSolver._set_param`. The CVXPy
113
+ constraint set only references the indices flagged ``"Fix"`` in
114
+ ``initial_type`` / ``final_type``, so zeroing the free entries is safe —
115
+ they're written but never read.
116
+ """
117
+ arr = np.asarray(bc, dtype=float)
118
+ return np.nan_to_num(arr, nan=0.0)
119
+
120
+
41
121
  class CVXPyPTRSolver(PTRSolver):
42
122
  """CVXPy-backed implementation of the PTR convex subproblem.
43
123
 
@@ -48,7 +128,11 @@ class CVXPyPTRSolver(PTRSolver):
48
128
 
49
129
  The solver builds the problem structure once during ``initialize()``, using
50
130
  CVXPy Parameters for values that change each iteration. The ``solve()``
51
- method then solves and returns a structured ``PTRSolveResult``.
131
+ method then solves and returns a structured ``PTRSolveResult``. The
132
+ JAX-pure entry point :meth:`iteration_callback` wraps that same solve in
133
+ :func:`jax.pure_callback` (``vmap_method="sequential"`` — CVXPy cannot
134
+ batch) so the backend composes with ``jax.jit`` / ``jax.vmap`` alongside
135
+ the JAX-native QPAX and Moreau backends.
52
136
 
53
137
  The cost and constraint formulations are defined in the ``cost()`` and
54
138
  ``constraints()`` methods, which can be overridden in subclasses to
@@ -116,6 +200,11 @@ class CVXPyPTRSolver(PTRSolver):
116
200
  self._ocp_vars: "CVXPyVariables" = None
117
201
  self._problem: cp.Problem = None
118
202
  self._solve_fn: callable = None
203
+ # Stashed at create_variables / initialize so iteration_callback can
204
+ # close over them without retracing them off the ``lowered`` /
205
+ # ``settings`` arguments each iteration.
206
+ self._jax_constraints: Optional["LoweredJaxConstraints"] = None
207
+ self._settings: Optional[Config] = None
119
208
 
120
209
  @property
121
210
  def ocp_vars(self) -> "CVXPyVariables":
@@ -203,6 +292,11 @@ class CVXPyPTRSolver(PTRSolver):
203
292
  constraint_sparsity=constraint_sparsity,
204
293
  )
205
294
 
295
+ # Stash the constraint catalog so iteration_callback can unstack the
296
+ # JAX-pure ``SubproblemData`` back into the per-constraint dict layout
297
+ # ``update_constraint_linearizations`` expects.
298
+ self._jax_constraints = jax_constraints
299
+
206
300
  def lower_convex_constraints(self, constraints, parameters=None):
207
301
  """Lower user ``.convex()`` constraints into CVXPy constraint objects.
208
302
 
@@ -291,6 +385,7 @@ class CVXPyPTRSolver(PTRSolver):
291
385
  )
292
386
 
293
387
  self._problem = prob
388
+ self._settings = settings
294
389
  self._setup_solve_function()
295
390
 
296
391
  def cost(
@@ -879,6 +974,137 @@ class CVXPyPTRSolver(PTRSolver):
879
974
  status=self._problem.status,
880
975
  )
881
976
 
977
+ def iteration_callback(self) -> Callable[..., SubproblemSolution]:
978
+ """JAX-pure ``(state, SubproblemData) -> SubproblemSolution``.
979
+
980
+ Wraps the existing NumPy ``solve()`` path in :func:`jax.pure_callback`
981
+ with ``vmap_method="sequential"``. CVXPy can't trace — it builds a DCP
982
+ graph and reaches into a backend solver through Python attribute
983
+ mutation — so the only JAX-friendly surface it can present is a host
984
+ callback. Under :func:`jax.jit` the callback fires once per call; under
985
+ :func:`jax.vmap` it fires ``B`` times serially (CVXPy can't ingest a
986
+ batched parameter set).
987
+
988
+ The closure unstacks :class:`SubproblemData` back to the per-constraint
989
+ dict layout :meth:`update_constraint_linearizations` expects, runs the
990
+ four ``update_*`` methods + :meth:`solve`, and packs the result into a
991
+ :class:`SubproblemSolution` whose ``nu_vb`` is collapsed to a stacked
992
+ ``(N, n_nodal)`` array (the list-of-arrays form on
993
+ :attr:`PTRSolveResult.nu_vb` is preserved for the NumPy path).
994
+
995
+ ``status_code`` is mapped via :func:`status_str_to_code`; CVXPy's
996
+ ``"optimal_inaccurate"`` / ``"solver_error"`` / ... labels collapse to
997
+ :attr:`StatusCode.UNKNOWN` — the SCP trust-region check is the
998
+ authoritative convergence gate.
999
+
1000
+ The returned callable takes ``(state, data)``: ``state`` is the
1001
+ :class:`AlgorithmState` pytree, accepted for cross-backend signature
1002
+ uniformity but unused (CVXPy exposes no warm-start through
1003
+ ``update_*``); ``data`` is the :class:`SubproblemData` pytree carrying
1004
+ the per-iteration linearization arrays, penalty weights, and boundary
1005
+ conditions.
1006
+ """
1007
+ if self._problem is None or self._settings is None or self._jax_constraints is None:
1008
+ raise RuntimeError(
1009
+ "CVXPyPTRSolver.iteration_callback() requires initialize() to "
1010
+ "have been called first."
1011
+ )
1012
+
1013
+ settings = self._settings
1014
+ jax_constraints = self._jax_constraints
1015
+ n_x = settings.sim.n_states
1016
+ n_u = settings.sim.n_controls
1017
+ N = settings.sim.n
1018
+ n_nodal = len(jax_constraints.nodal)
1019
+ n_cross = len(jax_constraints.cross_node)
1020
+ slice_imp = settings.sim.u.slice_impulsive
1021
+ has_impulsive = bool(slice_imp.stop > slice_imp.start)
1022
+ f = jnp.float64 if jax.config.read("jax_enable_x64") else jnp.float32
1023
+
1024
+ result_struct = SubproblemSolution(
1025
+ x=jax.ShapeDtypeStruct((N, n_x), f),
1026
+ u=jax.ShapeDtypeStruct((N, n_u), f),
1027
+ nu=jax.ShapeDtypeStruct((N - 1, n_x), f),
1028
+ nu_vb=jax.ShapeDtypeStruct((N, n_nodal), f),
1029
+ nu_vb_cross=jax.ShapeDtypeStruct((n_cross,), f),
1030
+ cost=jax.ShapeDtypeStruct((), f),
1031
+ status_code=jax.ShapeDtypeStruct((), jnp.int32),
1032
+ )
1033
+
1034
+ def host_solve(data: SubproblemData) -> SubproblemSolution:
1035
+ # SubproblemData always carries (N, n_x, n_x) D_d / (N, n_x, n_u) E_d
1036
+ # / (N, n_x) x_prop_plus arrays — zero-filled when the problem has
1037
+ # no impulsive component. ``update_dynamics_linearization`` treats
1038
+ # a non-None D_d as "absorb into A/B/C", which would zero them out
1039
+ # on the no-impulsive path; pass None in that case to keep A/B/C
1040
+ # intact. Same logic for x_prop_plus / E_d.
1041
+ x_prop_plus = np.asarray(data.x_prop_plus) if has_impulsive else None
1042
+ D_d = np.asarray(data.D_d) if has_impulsive else None
1043
+ E_d = np.asarray(data.E_d) if has_impulsive else None
1044
+ self.update_dynamics_linearization(
1045
+ x_bar=np.asarray(data.x_bar),
1046
+ u_bar=np.asarray(data.u_bar),
1047
+ A_d=np.asarray(data.A_d),
1048
+ B_d=np.asarray(data.B_d),
1049
+ C_d=np.asarray(data.C_d),
1050
+ x_prop=np.asarray(data.x_prop),
1051
+ x_prop_plus=x_prop_plus,
1052
+ D_d=D_d,
1053
+ E_d=E_d,
1054
+ )
1055
+ nodal = _unstack_nodal(data, jax_constraints)
1056
+ cross_node = _unstack_cross(data, jax_constraints)
1057
+ self.update_constraint_linearizations(
1058
+ nodal=nodal or None,
1059
+ cross_node=cross_node or None,
1060
+ )
1061
+ self.update_penalties(
1062
+ lam_prox=np.asarray(data.lam_prox),
1063
+ lam_cost=np.asarray(data.lam_cost),
1064
+ lam_vc=np.asarray(data.lam_vc),
1065
+ lam_vb_nodal=np.asarray(data.lam_vb_nodal),
1066
+ lam_vb_cross=np.asarray(data.lam_vb_cross),
1067
+ )
1068
+ self.update_boundary_conditions(
1069
+ x_init=_unmask_bc(data.x_init),
1070
+ x_term=_unmask_bc(data.x_term),
1071
+ )
1072
+
1073
+ result = self.solve()
1074
+ return SubproblemSolution(
1075
+ x=jnp.asarray(result.x, dtype=f),
1076
+ u=jnp.asarray(result.u, dtype=f),
1077
+ nu=jnp.asarray(result.nu, dtype=f),
1078
+ # nu_vb collapses from PTRSolveResult's list-of-(N,) layout to
1079
+ # the (N, n_nodal) stacked array SubproblemSolution declares
1080
+ # for pure_callback's ShapeDtypeStruct contract.
1081
+ nu_vb=(
1082
+ jnp.zeros((N, 0), dtype=f)
1083
+ if n_nodal == 0
1084
+ else jnp.asarray(
1085
+ np.stack([np.asarray(a) for a in result.nu_vb], axis=-1),
1086
+ dtype=f,
1087
+ )
1088
+ ),
1089
+ nu_vb_cross=jnp.asarray(
1090
+ np.asarray(result.nu_vb_cross, dtype=float).reshape(n_cross),
1091
+ dtype=f,
1092
+ ),
1093
+ cost=jnp.asarray(result.cost, dtype=f),
1094
+ status_code=jnp.asarray(int(status_str_to_code(result.status)), dtype=jnp.int32),
1095
+ )
1096
+
1097
+ def step(state, data: SubproblemData) -> SubproblemSolution:
1098
+ del state # CVXPy exposes no warm-start through ``update_*``.
1099
+ return jax.pure_callback(
1100
+ host_solve,
1101
+ result_struct,
1102
+ data,
1103
+ vmap_method="sequential",
1104
+ )
1105
+
1106
+ return step
1107
+
882
1108
  def citation(self) -> List[str]:
883
1109
  """Return BibTeX citations for CVXPy.
884
1110