openscvx 0.5.2.dev11__tar.gz → 0.5.2.dev12__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 (363) hide show
  1. {openscvx-0.5.2.dev11/openscvx.egg-info → openscvx-0.5.2.dev12}/PKG-INFO +1 -1
  2. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/_version.py +3 -3
  3. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/qpax_ptr_solver.py +16 -1
  4. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12/openscvx.egg-info}/PKG-INFO +1 -1
  5. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/solvers/test_qpax_ptr_solver.py +34 -0
  6. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_brachistochrone.py +138 -17
  7. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/assets/logo.svg +0 -0
  8. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/release-drafter.yml +0 -0
  9. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/_docs.yml +0 -0
  10. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/branch-name.yml +0 -0
  11. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/docs.yml +0 -0
  12. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/lint.yml +0 -0
  13. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/nightly.yml +0 -0
  14. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/release-drafter.yml +0 -0
  15. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/release.yml +0 -0
  16. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/tests-integration.yml +0 -0
  17. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.github/workflows/tests-unit.yml +0 -0
  18. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.gitignore +0 -0
  19. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/.gitmodules +0 -0
  20. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/CONTRIBUTING.md +0 -0
  21. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/LICENSE +0 -0
  22. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/README.md +0 -0
  23. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/constraint_reformulation.md +0 -0
  24. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/control_parameterization.md +0 -0
  25. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/discretization.md +0 -0
  26. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/ocp.md +0 -0
  27. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/scvx.md +0 -0
  28. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/Foundations/time_dilation.md +0 -0
  29. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UnderTheHood/lowering_architecture.md +0 -0
  30. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  31. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/00_introduction.md +0 -0
  32. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  33. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  34. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  35. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  36. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/05_visualization.md +0 -0
  37. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/06_logic.md +0 -0
  38. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/07_lie.md +0 -0
  39. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/UsersGuide/08_mpcc.md +0 -0
  40. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/favicon.png +0 -0
  41. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/ct-scvx_dark.png +0 -0
  42. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/ct-scvx_light.png +0 -0
  43. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/ctcs_dark.png +0 -0
  44. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/ctcs_light.png +0 -0
  45. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/problem_class_dark.png +0 -0
  46. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/images/problem_class_light.png +0 -0
  47. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/logo.svg +0 -0
  48. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/openscvx_logo_square.png +0 -0
  49. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/viser-client/index.html +0 -0
  50. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  51. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  52. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/citation.md +0 -0
  53. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/examples.md +0 -0
  54. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/index.md +0 -0
  55. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/javascripts/mathjax.js +0 -0
  56. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/docs/versions.json +0 -0
  57. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/_viser_embed_export.py +0 -0
  58. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/brachistochrone.py +0 -0
  59. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/hypersensitive.py +0 -0
  60. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/impulsive.py +0 -0
  61. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/stl_integer_variable.py +0 -0
  62. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/abstract/stl_or.py +0 -0
  63. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/7_dof_arm.py +0 -0
  64. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/_camera.py +0 -0
  65. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/_render.py +0 -0
  66. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/_sensor_view.py +0 -0
  67. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/dr_vp_polytope.py +0 -0
  68. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  69. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/logo.py +0 -0
  70. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  71. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/3_dof_arm.py +0 -0
  72. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/7_dof_arm.py +0 -0
  73. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/7_dof_arm_collision.py +0 -0
  74. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/7_dof_arm_vp.py +0 -0
  75. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  76. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  77. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car.py +0 -0
  78. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_disjoint.py +0 -0
  79. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  80. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_obstacle_stl.py +0 -0
  81. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_stl_or.py +0 -0
  82. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/car/dubins_car_waypoint_stl.py +0 -0
  83. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/cinema_vp.py +0 -0
  84. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/dr_double_integrator.py +0 -0
  85. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/dr_vp.py +0 -0
  86. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/dr_vp_nodal.py +0 -0
  87. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/dr_vp_polytope.py +0 -0
  88. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/drone_racing.py +0 -0
  89. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/logo.py +0 -0
  90. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/logo_utils/acl_logo.svg +0 -0
  91. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  92. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/obstacle_avoidance.py +0 -0
  93. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  94. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  95. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/cartpole_mjx.py +0 -0
  96. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/double_cartpole_mjx.py +0 -0
  97. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/skydio_x2_mjx.py +0 -0
  98. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  99. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/triple_cartpole_game.py +0 -0
  100. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mjx/triple_cartpole_mjx.py +0 -0
  101. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/double_integrator_discrete.py +0 -0
  102. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/double_integrator_drone_racing.py +0 -0
  103. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  104. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  105. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  106. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/plotting.py +0 -0
  107. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/plotting_viser.py +0 -0
  108. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  109. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  110. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  111. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  112. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  113. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  114. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  115. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  116. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/cinema_vp_realtime.py +0 -0
  117. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/drone_racing_realtime.py +0 -0
  118. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/dubins_car_realtime.py +0 -0
  119. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  120. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/rocket/3DoF_pdg.py +0 -0
  121. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/rocket/6DoF_pdg.py +0 -0
  122. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/spacecraft/halo_orbit.py +0 -0
  123. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/spacecraft/hohmann_transfer.py +0 -0
  124. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/spacecraft/let_transfer.py +0 -0
  125. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/examples/spacecraft/proxops_cw.py +0 -0
  126. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/ctlos_cine.gif +0 -0
  127. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/ctlos_dr.gif +0 -0
  128. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/dtlos_cine.gif +0 -0
  129. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/dtlos_dr.gif +0 -0
  130. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/openscvx_logo.svg +0 -0
  131. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/openscvx_logo_square.png +0 -0
  132. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/oscvx_structure_full_dark.svg +0 -0
  133. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/figures/video_preview.png +0 -0
  134. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/__init__.py +0 -0
  135. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/assets/stylesheets/custom.css +0 -0
  136. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  137. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  138. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  139. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/home.html +0 -0
  140. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/main.html +0 -0
  141. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-diagram.html +0 -0
  142. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-dropin-banner.html +0 -0
  143. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-hero.html +0 -0
  144. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-pipeline.html +0 -0
  145. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/material/overrides/partials/home-viser-strip.html +0 -0
  146. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/mkdocs.yml +0 -0
  147. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/__init__.py +0 -0
  148. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/__main__.py +0 -0
  149. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/__init__.py +0 -0
  150. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/__init__.py +0 -0
  151. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  152. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
  153. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  154. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  155. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/base.py +0 -0
  156. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/optimization_results.py +0 -0
  157. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/scvx/__init__.py +0 -0
  158. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
  159. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/algorithms/weights.py +0 -0
  160. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/config.py +0 -0
  161. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/__init__.py +0 -0
  162. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/base.py +0 -0
  163. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/discretize_linearize.py +0 -0
  164. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/linearize_discretize.py +0 -0
  165. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  166. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  167. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  168. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  169. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/expert/__init__.py +0 -0
  170. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/expert/byof.py +0 -0
  171. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/expert/lowering.py +0 -0
  172. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/expert/validation.py +0 -0
  173. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/init/__init__.py +0 -0
  174. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/init/interpolation.py +0 -0
  175. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/init/inverse_kinematics.py +0 -0
  176. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrations/__init__.py +0 -0
  177. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrations/base.py +0 -0
  178. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrations/menagerie.py +0 -0
  179. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrations/mjx.py +0 -0
  180. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrators/__init__.py +0 -0
  181. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrators/diffrax.py +0 -0
  182. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/integrators/runge_kutta.py +0 -0
  183. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/loader.py +0 -0
  184. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/__init__.py +0 -0
  185. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/cvxpy_constraints.py +0 -0
  186. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/cvxpy_variables.py +0 -0
  187. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/dynamics.py +0 -0
  188. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/jax_constraints.py +0 -0
  189. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/parameters.py +0 -0
  190. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/problem.py +0 -0
  191. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/lowered/unified.py +0 -0
  192. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/__init__.py +0 -0
  193. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/plotting.py +0 -0
  194. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/scp_iteration.py +0 -0
  195. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/__init__.py +0 -0
  196. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/animated.py +0 -0
  197. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/orbits.py +0 -0
  198. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/plotly_integration.py +0 -0
  199. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/primitives.py +0 -0
  200. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/scp.py +0 -0
  201. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/plotting/viser/server.py +0 -0
  202. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/problem.py +0 -0
  203. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/propagation/__init__.py +0 -0
  204. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/propagation/post_processing.py +0 -0
  205. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/propagation/propagation.py +0 -0
  206. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/__init__.py +0 -0
  207. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/base.py +0 -0
  208. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
  209. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/moreau_ptr_solver.py +0 -0
  210. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/solvers/ptr_solver.py +0 -0
  211. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/__init__.py +0 -0
  212. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/augmentation.py +0 -0
  213. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/builder.py +0 -0
  214. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/constraint_set.py +0 -0
  215. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/__init__.py +0 -0
  216. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/arithmetic.py +0 -0
  217. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/array.py +0 -0
  218. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/constraint.py +0 -0
  219. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/control.py +0 -0
  220. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/expr.py +0 -0
  221. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  222. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  223. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/lie/se3.py +0 -0
  224. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/lie/so3.py +0 -0
  225. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/linalg.py +0 -0
  226. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/logic.py +0 -0
  227. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/math.py +0 -0
  228. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/parameter.py +0 -0
  229. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/spatial.py +0 -0
  230. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/state.py +0 -0
  231. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/stl.py +0 -0
  232. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/stljax.py +0 -0
  233. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/time.py +0 -0
  234. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/variable.py +0 -0
  235. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/expr/vmap.py +0 -0
  236. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/hashing.py +0 -0
  237. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lower.py +0 -0
  238. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/__init__.py +0 -0
  239. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  240. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  241. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  242. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  243. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  244. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  245. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  246. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  247. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  248. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  249. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  250. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  251. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  252. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  253. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  254. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  255. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  256. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  257. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  258. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  259. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  260. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  261. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  262. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  263. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  264. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  265. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  266. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  267. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  268. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/__init__.py +0 -0
  269. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/_registry.py +0 -0
  270. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/array.py +0 -0
  271. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/constraint.py +0 -0
  272. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/lie.py +0 -0
  273. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/linalg.py +0 -0
  274. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/logic.py +0 -0
  275. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/math.py +0 -0
  276. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/parser.py +0 -0
  277. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/spatial.py +0 -0
  278. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/stl.py +0 -0
  279. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/stljax.py +0 -0
  280. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/parser/tokenizer.py +0 -0
  281. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/preprocessing.py +0 -0
  282. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/problem.py +0 -0
  283. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/sparsity.py +0 -0
  284. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/symbolic/unified.py +0 -0
  285. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/__init__.py +0 -0
  286. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/cache.py +0 -0
  287. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/caching.py +0 -0
  288. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/printing.py +0 -0
  289. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/profiling.py +0 -0
  290. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx/utils/utils.py +0 -0
  291. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/SOURCES.txt +0 -0
  292. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/dependency_links.txt +0 -0
  293. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/entry_points.txt +0 -0
  294. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/requires.txt +0 -0
  295. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/openscvx.egg-info/top_level.txt +0 -0
  296. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/pyproject.toml +0 -0
  297. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/scripts/gen_example_pages.py +0 -0
  298. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/scripts/gen_ref_pages.py +0 -0
  299. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  300. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/setup.cfg +0 -0
  301. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/__init__.py +0 -0
  302. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/_marks.py +0 -0
  303. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/brachistochrone_analytical.py +0 -0
  304. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/conftest.py +0 -0
  305. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/expr/__init__.py +0 -0
  306. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/expr/test_gmsr.py +0 -0
  307. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/fixtures/brachistochrone.json +0 -0
  308. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/fixtures/brachistochrone.yaml +0 -0
  309. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/hohmann_analytical.py +0 -0
  310. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/integrations/__init__.py +0 -0
  311. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/integrations/test_mjx.py +0 -0
  312. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/integrations/test_mjx_dynamics.py +0 -0
  313. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/solvers/__init__.py +0 -0
  314. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/solvers/test_moreau_ptr_solver.py +0 -0
  315. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/__init__.py +0 -0
  316. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/__init__.py +0 -0
  317. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_arithmetic.py +0 -0
  318. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_array.py +0 -0
  319. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_constraint.py +0 -0
  320. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_expr.py +0 -0
  321. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_lie.py +0 -0
  322. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_linalg.py +0 -0
  323. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_logic.py +0 -0
  324. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_math.py +0 -0
  325. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_node_reference.py +0 -0
  326. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_parameters.py +0 -0
  327. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_scaling.py +0 -0
  328. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_spatial.py +0 -0
  329. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_stl.py +0 -0
  330. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_variable.py +0 -0
  331. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/expr/test_vmap.py +0 -0
  332. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/__init__.py +0 -0
  333. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_array.py +0 -0
  334. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_constraint.py +0 -0
  335. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_lie.py +0 -0
  336. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_linalg.py +0 -0
  337. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_load.py +0 -0
  338. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_logic.py +0 -0
  339. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_math.py +0 -0
  340. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_parser.py +0 -0
  341. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_spatial.py +0 -0
  342. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_stl.py +0 -0
  343. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_tokenizer.py +0 -0
  344. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/parser/test_vmap.py +0 -0
  345. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_augmentation.py +0 -0
  346. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_hashing.py +0 -0
  347. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_lower_cvxpy.py +0 -0
  348. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_lower_jax.py +0 -0
  349. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_preprocessing.py +0 -0
  350. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_sparsity.py +0 -0
  351. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/symbolic/test_unified.py +0 -0
  352. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_autotuning.py +0 -0
  353. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_cvxpygen_optional.py +0 -0
  354. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_discretization.py +0 -0
  355. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_examples.py +0 -0
  356. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_expert.py +0 -0
  357. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_impulsive.py +0 -0
  358. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_init.py +0 -0
  359. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_integrators.py +0 -0
  360. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_loader.py +0 -0
  361. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_optimization_results.py +0 -0
  362. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_plotting.py +0 -0
  363. {openscvx-0.5.2.dev11 → openscvx-0.5.2.dev12}/tests/test_propagation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.2.dev11
3
+ Version: 0.5.2.dev12
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.2.dev11'
22
- __version_tuple__ = version_tuple = (0, 5, 2, 'dev11')
21
+ __version__ = version = '0.5.2.dev12'
22
+ __version_tuple__ = version_tuple = (0, 5, 2, 'dev12')
23
23
 
24
- __commit_id__ = commit_id = 'gcff8e4c61'
24
+ __commit_id__ = commit_id = 'ga71a6db14'
@@ -672,6 +672,20 @@ class QPAXPTRSolver(PTRSolver):
672
672
  self._last_iters = int(np.asarray(iters))
673
673
  self._last_converged = bool(np.asarray(converged))
674
674
 
675
+ # Silent NaN unpacking poisons the next SCP linearization and the
676
+ # outer loop has no status gate. Fail at the boundary instead.
677
+ primal_finite = bool(np.all(np.isfinite(z)))
678
+ if not self._last_converged or not primal_finite:
679
+ dtype = str(Q_j.dtype)
680
+ raise RuntimeError(
681
+ f"qpax.solve_qp failed to converge (iters={self._last_iters}, "
682
+ f"converged={self._last_converged}, primal finite={primal_finite}). "
683
+ f"JAX dtype was {dtype}; if this is float32, pass "
684
+ f"float_dtype='float64' to Problem(...). Otherwise tighten "
685
+ f"solver_args (e.g. solver_tol=1e-8, max_iter=200) or switch "
686
+ f"to CVXPyPTRSolver to triage."
687
+ )
688
+
675
689
  return self._unpack(z)
676
690
 
677
691
  def _unpack(self, z: np.ndarray) -> PTRSolveResult:
@@ -691,7 +705,8 @@ class QPAXPTRSolver(PTRSolver):
691
705
 
692
706
  cost = self._reconstruct_cost(z)
693
707
 
694
- status = "optimal" if self._last_converged else "infeasible"
708
+ # solve() raises on non-convergence before reaching _unpack.
709
+ status = "optimal"
695
710
 
696
711
  return PTRSolveResult(
697
712
  x=x,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.2.dev11
3
+ Version: 0.5.2.dev12
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
@@ -236,3 +236,37 @@ def test_qpax_solve_returns_PTRSolveResult():
236
236
  assert res.x.shape[0] == 5
237
237
  assert res.u.shape[0] == 5
238
238
  assert res.status in {"optimal", "infeasible"}
239
+
240
+
241
+ # ============================================================================
242
+ # Convergence-failure guard
243
+ # ============================================================================
244
+
245
+
246
+ def test_qpax_solve_raises_on_nonconvergence(monkeypatch):
247
+ """When ``qpax.solve_qp`` returns ``converged=False`` (typical under
248
+ float32 ill-conditioning) the backend must raise rather than unpack a
249
+ NaN-filled primal. Without the guard the next SCP linearization point
250
+ is NaN-poisoned and every subsequent iteration produces garbage. The
251
+ end-to-end coverage in ``tests/test_brachistochrone.py::test_backend_float32_raises``
252
+ exercises the same path through the SCvx loop; this unit test pins the
253
+ behavior at the solver boundary directly."""
254
+ import jax.numpy as jnp
255
+
256
+ import openscvx.solvers.qpax_ptr_solver as mod
257
+
258
+ prob = _make_double_integrator_problem(n=5, backend="qpax", k_max=1)
259
+ prob.settings.dev.printing = False
260
+ prob.initialize()
261
+
262
+ n_z = prob.solver.layout.n_z
263
+ nan_z = jnp.full((n_z,), jnp.nan)
264
+
265
+ def fake_solve_qp(Q, q, A, b, G, h, **kwargs):
266
+ del Q, q, A, b, G, h, kwargs
267
+ return nan_z, nan_z, nan_z, nan_z, jnp.bool_(False), jnp.int32(5)
268
+
269
+ monkeypatch.setattr(mod.qpax, "solve_qp", fake_solve_qp)
270
+
271
+ with pytest.raises(RuntimeError, match=r"qpax\.solve_qp failed"):
272
+ prob.solver.solve()
@@ -318,14 +318,21 @@ def test_monolithic():
318
318
  jax.clear_caches()
319
319
 
320
320
 
321
+ @pytest.mark.parametrize("with_parameters", [False, True], ids=["literal-g", "param-g"])
322
+ @pytest.mark.parametrize("constraint_type", ["ctcs", "nodal"])
321
323
  @pytest.mark.parametrize("backend", ["cvxpy", "qpax", "moreau"])
322
- def test_backend(backend):
323
- """End-to-end brachistochrone with each PTRSolver backend.
324
-
324
+ def test_backend(backend, constraint_type, with_parameters):
325
+ """End-to-end brachistochrone with each PTRSolver backend, across
326
+ constraint formulations (CTCS box vs nodal) and parameter usage
327
+ (gravity baked in vs ``ox.Parameter``).
328
+
329
+ The matrix exists so the JAX-side backends (QPAX, Moreau) are exercised
330
+ on the same shapes the drone examples use — nodal constraints and
331
+ ``ox.Parameter`` — not only the easy CTCS-with-literal-constants case.
325
332
  Compares against the analytical cycloid; the same accuracy thresholds
326
333
  apply regardless of backend (each backend assembles the same convex
327
- subproblem, so SCP convergence should land on the same minimizer to within
328
- the backends' inner solver tolerances)."""
334
+ subproblem, so SCP convergence should land on the same minimizer to
335
+ within the backends' inner solver tolerances)."""
329
336
  import jax.numpy as jnp
330
337
 
331
338
  import openscvx as ox
@@ -355,12 +362,27 @@ def test_backend(backend):
355
362
  u.min = np.array([0.0])
356
363
  u.guess = np.linspace(5 * jnp.pi / 180, 100.5 * jnp.pi / 180, n).reshape(-1, 1)
357
364
 
365
+ # Gravity enters the v-dynamics either as a literal or as an ``ox.Parameter``.
366
+ # The Parameter path mirrors ``test_parameters`` — we only test the Earth
367
+ # value here; the Moon-gravity reset path is orthogonal to this regression.
368
+ if with_parameters:
369
+ g_sym = ox.Parameter("g", value=g)
370
+ else:
371
+ g_sym = g
372
+
358
373
  x_dot = x[2] * ox.Sin(u[0])
359
374
  y_dot = -x[2] * ox.Cos(u[0])
360
- v_dot = g * ox.Cos(u[0])
375
+ v_dot = g_sym * ox.Cos(u[0])
361
376
  dyn_expr = ox.Concat(x_dot, y_dot, v_dot)
362
377
 
363
- constraint_exprs = [ox.ctcs(x <= x.max), ox.ctcs(x.min <= x)]
378
+ # CTCS wraps the box as LICQ-style absolute-value rows; nodal enforces
379
+ # the inequality at each node directly. Both produce the same minimizer
380
+ # on this problem, but they exercise different assembly paths on the
381
+ # JAX-side backends.
382
+ if constraint_type == "ctcs":
383
+ constraint_exprs = [ox.ctcs(x <= x.max), ox.ctcs(x.min <= x)]
384
+ else: # nodal
385
+ constraint_exprs = [x <= x.max, x.min <= x]
364
386
 
365
387
  time = ox.Time(
366
388
  initial=0.0,
@@ -380,10 +402,11 @@ def test_backend(backend):
380
402
  licq_max=1e-8,
381
403
  algorithm={"lam_prox": 1e0, "lam_cost": 1e-1, "lam_vc": 1e0},
382
404
  solver={"backend": backend},
383
- # QPAX consumes the global JAX dtype, so float32 caps the QP's
384
- # condition number aggressively. The CVXPy backend goes through
385
- # QOCO's own float64 path and isn't affected — but pinning float64
386
- # for both backends keeps the test apples-to-apples.
405
+ # QPAX / Moreau consume the global JAX dtype, so float32 caps the
406
+ # QP's condition number aggressively. The CVXPy backend goes
407
+ # through QOCO's own float64 path and isn't affected — but pinning
408
+ # float64 for all backends keeps the test apples-to-apples. The
409
+ # float32 failure mode is covered by ``test_backend_float32_raises``.
387
410
  float_dtype="float64",
388
411
  )
389
412
 
@@ -398,7 +421,9 @@ def test_backend(backend):
398
421
  result = problem.solve()
399
422
  result = problem.post_process()
400
423
 
401
- assert result["converged"], f"{backend} failed to converge"
424
+ assert result["converged"], (
425
+ f"{backend} / {constraint_type} / with_parameters={with_parameters} failed to converge"
426
+ )
402
427
 
403
428
  position = result.trajectory["x"][:, :2]
404
429
  velocity = result.trajectory["x"][:, 2:3]
@@ -407,16 +432,112 @@ def test_backend(backend):
407
432
  result.t_full, position, velocity, x0, y0, x1, y1, g
408
433
  )
409
434
 
410
- _print_comparison_metrics(comparison, f"Brachistochrone ({backend})")
411
- # JAX backends reassemble arrays every iteration; JIT compile cost
412
- # dominates under parallel test execution. Moreau's warm-start generally
413
- # compensates, but keep the budget consistent with QPAX for now.
414
- solve_budget = 3.5 if backend in ("qpax", "moreau") else 1.2
435
+ _print_comparison_metrics(
436
+ comparison,
437
+ f"Brachistochrone ({backend}, {constraint_type}, "
438
+ f"{'param-g' if with_parameters else 'literal-g'})",
439
+ )
440
+ # QPAX / Moreau reassemble matrices as JAX arrays each iteration; the
441
+ # per-process JIT compilation cache means the first iteration's compile
442
+ # cost dominates under parallel test execution. Nodal constraints add a
443
+ # few extra slots (nu_vb / s_pos per nodal group) on top of that.
444
+ if backend in ("qpax", "moreau"):
445
+ solve_budget = 4.5 if constraint_type == "nodal" else 3.5
446
+ else:
447
+ solve_budget = 1.2
415
448
  _assert_brachistochrone_accuracy(comparison, problem, result, solve_budget=solve_budget)
416
449
 
417
450
  jax.clear_caches()
418
451
 
419
452
 
453
+ def test_backend_float32_raises():
454
+ """QPAX should raise — not silently return NaN — when ``qpax.solve_qp``
455
+ fails to converge.
456
+
457
+ Regression for the drone-example NaN bug: with ``float_dtype='float32'``
458
+ the QP's condition number outruns the precision available to qpax's PDIP
459
+ inner loop, and ``solve_qp`` returns ``converged=False`` with a NaN-filled
460
+ primal. Without the guard in :meth:`QPAXPTRSolver.solve`, the SCP loop
461
+ would consume that NaN as the next linearization point and propagate it
462
+ through every subsequent iteration. The guard turns that into an
463
+ actionable :class:`RuntimeError`.
464
+
465
+ Brachistochrone happens to be well-conditioned enough that float32 alone
466
+ does not force a failure, so the test additionally tightens
467
+ ``solver_tol`` past what float32 can resolve and caps ``max_iter`` low
468
+ — both push qpax into a guaranteed ``converged=False`` exit on iter 1."""
469
+ import jax.numpy as jnp
470
+
471
+ import openscvx as ox
472
+ from openscvx import Problem
473
+
474
+ pytest.importorskip("qpax")
475
+
476
+ n = 2
477
+ total_time = 2.0
478
+ g = 9.81
479
+ x0, y0 = 0.0, 10.0
480
+ x1, y1 = 10.0, 5.0
481
+
482
+ x = ox.State("x", shape=(3,))
483
+ x.max = np.array([10.0, 10.0, 10.0])
484
+ x.min = np.array([0.0, 0.0, 0.0])
485
+ x.initial = np.array([x0, y0, 0.0])
486
+ x.final = [x1, y1, ("free", 10.0)]
487
+
488
+ u = ox.Control("u", shape=(1,))
489
+ u.max = np.array([100.5 * jnp.pi / 180])
490
+ u.min = np.array([0.0])
491
+ u.guess = np.linspace(5 * jnp.pi / 180, 100.5 * jnp.pi / 180, n).reshape(-1, 1)
492
+
493
+ x_dot = x[2] * ox.Sin(u[0])
494
+ y_dot = -x[2] * ox.Cos(u[0])
495
+ v_dot = g * ox.Cos(u[0])
496
+ dyn_expr = ox.Concat(x_dot, y_dot, v_dot)
497
+
498
+ constraint_exprs = [ox.ctcs(x <= x.max), ox.ctcs(x.min <= x)]
499
+
500
+ time = ox.Time(
501
+ initial=0.0,
502
+ final=("minimize", total_time),
503
+ min=0.0,
504
+ max=total_time,
505
+ uniform_time_grid=True,
506
+ )
507
+
508
+ problem = Problem(
509
+ dynamics={"x": dyn_expr},
510
+ states=[x],
511
+ controls=[u],
512
+ time=time,
513
+ constraints=constraint_exprs,
514
+ N=n,
515
+ licq_max=1e-8,
516
+ algorithm={"lam_prox": 1e0, "lam_cost": 1e-1, "lam_vc": 1e0},
517
+ solver={
518
+ "backend": "qpax",
519
+ "solver_args": {"solver_tol": 1e-12, "max_iter": 5},
520
+ },
521
+ float_dtype="float32",
522
+ )
523
+
524
+ problem.settings.prp.dt = 0.01
525
+ problem.settings.sim.save_compiled = False
526
+ if hasattr(problem.settings, "dev"):
527
+ problem.settings.dev.printing = False
528
+
529
+ # ``initialize()`` itself triggers a first subproblem solve via
530
+ # ``PenalizedTrustRegion.initialize`` (penalized_trust_region.py:343),
531
+ # so the guard fires there before ``solve()`` is even reached. Wrap
532
+ # both calls in the same context — whichever raises first is the one
533
+ # we care about.
534
+ with pytest.raises(RuntimeError, match=r"qpax\.solve_qp failed"):
535
+ problem.initialize()
536
+ problem.solve()
537
+
538
+ jax.clear_caches()
539
+
540
+
420
541
  @pytest.mark.parametrize("constraint_type", ["ctcs", "nodal", "convex", "over", "at"])
421
542
  def test_constraint_types(constraint_type):
422
543
  """
File without changes
File without changes