openscvx 0.5.3.dev18__tar.gz → 0.5.3.dev20__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 (406) hide show
  1. {openscvx-0.5.3.dev18/openscvx.egg-info → openscvx-0.5.3.dev20}/PKG-INFO +1 -1
  2. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UnderTheHood/batching_jit_grad.md +75 -0
  3. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/brachistochrone_batched.py +40 -11
  4. openscvx-0.5.3.dev20/examples/abstract/flappy_bird.py +929 -0
  5. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/franka_fr3v2_pick_place.py +30 -2
  6. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/franka_fr3v2_viewplanning.py +75 -27
  7. openscvx-0.5.3.dev20/examples/arm/franka_fr3v2_viewplanning_nodal.py +584 -0
  8. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_waypoint_stl.py +12 -9
  9. openscvx-0.5.3.dev20/examples/drone/2d_obstacle_avoidance_batched_ic.py +326 -0
  10. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/cinema_vp.py +10 -1
  11. openscvx-0.5.3.dev20/examples/drone/cinema_vp_nodal.py +285 -0
  12. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/dr_vp.py +7 -2
  13. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/dr_vp_nodal.py +8 -5
  14. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/drone_racing.py +5 -0
  15. openscvx-0.5.3.dev20/examples/drone/drone_racing_batched_gates.py +414 -0
  16. openscvx-0.5.3.dev20/examples/drone/logo_utils/openscvx_logo_single.svg +1 -0
  17. openscvx-0.5.3.dev20/examples/drone/logo_utils/quadrotor_mesh.py +188 -0
  18. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/logo_utils/svg_path_utils.py +30 -5
  19. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/obstacle_avoidance.py +5 -0
  20. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/obstacle_avoidance_vmap.py +15 -6
  21. openscvx-0.5.3.dev20/examples/drone/obstacle_avoidance_vmap_2d.py +426 -0
  22. openscvx-0.5.3.dev20/examples/drone/openscvx_logo.py +527 -0
  23. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/skydio_x2_mjx.py +5 -1
  24. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/triple_cartpole_3d_mjx.py +297 -92
  25. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/triple_cartpole_mjx.py +299 -115
  26. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/plotting.py +606 -256
  27. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/plotting_viser.py +770 -156
  28. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +4 -17
  29. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/rocket/6DoF_pdg.py +94 -1
  30. openscvx-0.5.3.dev20/examples/rocket/6DoF_pdg_batched_ic.py +434 -0
  31. openscvx-0.5.3.dev20/examples/spacecraft/relative_loitering.py +964 -0
  32. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/_version.py +3 -3
  33. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/base.py +42 -0
  34. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/scvx/iteration.py +1 -0
  35. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/scvx/penalized_trust_region.py +35 -0
  36. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/base.py +16 -0
  37. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/__init__.py +16 -0
  38. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/plotting.py +165 -75
  39. openscvx-0.5.3.dev20/openscvx/plotting/publication.py +658 -0
  40. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/scp_iteration.py +182 -67
  41. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/__init__.py +2 -0
  42. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/animated.py +223 -42
  43. openscvx-0.5.3.dev20/openscvx/plotting/viser/coordinates.py +20 -0
  44. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/problem.py +536 -9
  45. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/propagation/post_processing.py +26 -20
  46. openscvx-0.5.3.dev20/openscvx/solvers/cones.py +100 -0
  47. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/cvxpy_ptr_solver.py +12 -0
  48. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/moreau_ptr_solver.py +254 -32
  49. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/ptr_solver.py +189 -1
  50. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/qpax_ptr_solver.py +104 -35
  51. openscvx-0.5.3.dev20/openscvx/symbolic/affine.py +162 -0
  52. openscvx-0.5.3.dev20/openscvx/symbolic/canonicalize.py +247 -0
  53. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/caching.py +142 -0
  54. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/printing.py +81 -0
  55. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20/openscvx.egg-info}/PKG-INFO +1 -1
  56. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/SOURCES.txt +18 -0
  57. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/_iteration_callback_helpers.py +1 -0
  58. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_iteration_callback_cvxpy.py +1 -0
  59. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_iteration_callback_vmap.py +1 -1
  60. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_moreau_ptr_solver.py +58 -6
  61. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_qpax_ptr_solver.py +5 -5
  62. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_subproblem_pytree.py +1 -0
  63. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_examples.py +1 -0
  64. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_plotting.py +68 -0
  65. openscvx-0.5.3.dev20/tests/test_solve_batched_brachistochrone.py +71 -0
  66. openscvx-0.5.3.dev20/tests/test_solve_batched_cvxpy_export_errors.py +38 -0
  67. openscvx-0.5.3.dev20/tests/test_solve_batched_export_roundtrip.py +123 -0
  68. openscvx-0.5.3.dev18/examples/spacecraft/relative_loitering.py +0 -458
  69. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/assets/logo.svg +0 -0
  70. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/release-drafter.yml +0 -0
  71. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/_docs.yml +0 -0
  72. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/branch-name.yml +0 -0
  73. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/docs.yml +0 -0
  74. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/lint.yml +0 -0
  75. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/nightly.yml +0 -0
  76. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/release-drafter.yml +0 -0
  77. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/release.yml +0 -0
  78. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/tests-integration.yml +0 -0
  79. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.github/workflows/tests-unit.yml +0 -0
  80. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.gitignore +0 -0
  81. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/.gitmodules +0 -0
  82. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/CONTRIBUTING.md +0 -0
  83. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/LICENSE +0 -0
  84. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/README.md +0 -0
  85. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/constraint_reformulation.md +0 -0
  86. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/control_parameterization.md +0 -0
  87. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/discretization.md +0 -0
  88. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/ocp.md +0 -0
  89. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/scvx.md +0 -0
  90. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/Foundations/time_dilation.md +0 -0
  91. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UnderTheHood/lowering_architecture.md +0 -0
  92. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  93. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/00_introduction.md +0 -0
  94. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  95. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  96. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  97. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  98. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/05_visualization.md +0 -0
  99. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/06_logic.md +0 -0
  100. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/07_lie.md +0 -0
  101. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/08_mpcc.md +0 -0
  102. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
  103. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/favicon.png +0 -0
  104. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/ct-scvx_dark.png +0 -0
  105. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/ct-scvx_light.png +0 -0
  106. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/ctcs_dark.png +0 -0
  107. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/ctcs_light.png +0 -0
  108. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/problem_class_dark.png +0 -0
  109. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/images/problem_class_light.png +0 -0
  110. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/logo.svg +0 -0
  111. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/openscvx_logo_square.png +0 -0
  112. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/viser-client/index.html +0 -0
  113. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  114. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  115. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/citation.md +0 -0
  116. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/examples.md +0 -0
  117. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/index.md +0 -0
  118. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/javascripts/mathjax.js +0 -0
  119. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/docs/versions.json +0 -0
  120. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/_viser_embed_export.py +0 -0
  121. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/brachistochrone.py +0 -0
  122. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/hypersensitive.py +0 -0
  123. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/impulsive.py +0 -0
  124. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/stl_integer_variable.py +0 -0
  125. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/abstract/stl_or.py +0 -0
  126. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/7_dof_arm.py +0 -0
  127. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/_camera.py +0 -0
  128. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/_render.py +0 -0
  129. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/_sensor_view.py +0 -0
  130. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/dr_vp_polytope.py +0 -0
  131. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  132. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/logo.py +0 -0
  133. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  134. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/3_dof_arm.py +0 -0
  135. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/7_dof_arm.py +0 -0
  136. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/7_dof_arm_collision.py +0 -0
  137. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/arm/7_dof_arm_vp.py +0 -0
  138. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car.py +0 -0
  139. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_disjoint.py +0 -0
  140. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  141. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_obstacle_stl.py +0 -0
  142. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/car/dubins_car_stl_or.py +0 -0
  143. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/dr_double_integrator.py +0 -0
  144. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/dr_vp_polytope.py +0 -0
  145. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/logo.py +0 -0
  146. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/logo_utils/acl_logo.svg +0 -0
  147. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  148. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/cartpole_mjx.py +0 -0
  149. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/double_cartpole_mjx.py +0 -0
  150. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mjx/triple_cartpole_game.py +0 -0
  151. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/double_integrator_discrete.py +0 -0
  152. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/double_integrator_drone_racing.py +0 -0
  153. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  154. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  155. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  156. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  157. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  158. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  159. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  160. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  161. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  162. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  163. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/cinema_vp_realtime.py +0 -0
  164. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/drone_racing_realtime.py +0 -0
  165. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/dubins_car_realtime.py +0 -0
  166. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  167. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/rocket/3DoF_pdg.py +0 -0
  168. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/spacecraft/halo_orbit.py +0 -0
  169. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/spacecraft/hohmann_transfer.py +0 -0
  170. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/spacecraft/let_transfer.py +0 -0
  171. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/examples/spacecraft/proxops_cw.py +0 -0
  172. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/ctlos_cine.gif +0 -0
  173. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/ctlos_dr.gif +0 -0
  174. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/dtlos_cine.gif +0 -0
  175. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/dtlos_dr.gif +0 -0
  176. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/openscvx_logo.svg +0 -0
  177. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/openscvx_logo_square.png +0 -0
  178. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/oscvx_structure_full_dark.svg +0 -0
  179. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/figures/video_preview.png +0 -0
  180. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/__init__.py +0 -0
  181. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/assets/stylesheets/custom.css +0 -0
  182. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  183. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  184. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  185. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/home.html +0 -0
  186. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/main.html +0 -0
  187. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-diagram.html +0 -0
  188. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-dropin-banner.html +0 -0
  189. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-hero.html +0 -0
  190. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-pipeline.html +0 -0
  191. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/material/overrides/partials/home-viser-strip.html +0 -0
  192. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/mkdocs.yml +0 -0
  193. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/__init__.py +0 -0
  194. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/__main__.py +0 -0
  195. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/__init__.py +0 -0
  196. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/__init__.py +0 -0
  197. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  198. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
  199. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  200. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  201. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/optimization_results.py +0 -0
  202. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/scvx/__init__.py +0 -0
  203. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/algorithms/weights.py +0 -0
  204. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/config.py +0 -0
  205. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/__init__.py +0 -0
  206. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/discretize_linearize.py +0 -0
  207. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/linearize_discretize.py +0 -0
  208. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  209. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  210. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  211. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  212. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/expert/__init__.py +0 -0
  213. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/expert/byof.py +0 -0
  214. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/expert/lowering.py +0 -0
  215. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/expert/validation.py +0 -0
  216. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/init/__init__.py +0 -0
  217. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/init/interpolation.py +0 -0
  218. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/init/inverse_kinematics.py +0 -0
  219. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrations/__init__.py +0 -0
  220. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrations/base.py +0 -0
  221. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrations/menagerie.py +0 -0
  222. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrations/mjx.py +0 -0
  223. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrators/__init__.py +0 -0
  224. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrators/diffrax.py +0 -0
  225. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/integrators/runge_kutta.py +0 -0
  226. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/loader.py +0 -0
  227. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/__init__.py +0 -0
  228. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/cvxpy_constraints.py +0 -0
  229. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/cvxpy_variables.py +0 -0
  230. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/dynamics.py +0 -0
  231. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/jax_constraints.py +0 -0
  232. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/parameters.py +0 -0
  233. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/problem.py +0 -0
  234. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/lowered/unified.py +0 -0
  235. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/orbits.py +0 -0
  236. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/plotly_integration.py +0 -0
  237. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/primitives.py +0 -0
  238. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/scp.py +0 -0
  239. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/plotting/viser/server.py +0 -0
  240. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/propagation/__init__.py +0 -0
  241. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/propagation/propagation.py +0 -0
  242. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/__init__.py +0 -0
  243. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/solvers/base.py +0 -0
  244. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/__init__.py +0 -0
  245. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/augmentation.py +0 -0
  246. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/builder.py +0 -0
  247. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/constraint_set.py +0 -0
  248. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/__init__.py +0 -0
  249. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/arithmetic.py +0 -0
  250. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/array.py +0 -0
  251. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/constraint.py +0 -0
  252. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/control.py +0 -0
  253. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/expr.py +0 -0
  254. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  255. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  256. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/lie/se3.py +0 -0
  257. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/lie/so3.py +0 -0
  258. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/linalg.py +0 -0
  259. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/logic.py +0 -0
  260. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/math.py +0 -0
  261. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/parameter.py +0 -0
  262. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/spatial.py +0 -0
  263. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/state.py +0 -0
  264. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/stl.py +0 -0
  265. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/stljax.py +0 -0
  266. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/time.py +0 -0
  267. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/variable.py +0 -0
  268. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/expr/vmap.py +0 -0
  269. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/hashing.py +0 -0
  270. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lower.py +0 -0
  271. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/__init__.py +0 -0
  272. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  273. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  274. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  275. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  276. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  277. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  278. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  279. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  280. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  281. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  282. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  283. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  284. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  285. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  286. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  287. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  288. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  289. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  290. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  291. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  292. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  293. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  294. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  295. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  296. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  297. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  298. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  299. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  300. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  301. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/__init__.py +0 -0
  302. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/_registry.py +0 -0
  303. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/array.py +0 -0
  304. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/constraint.py +0 -0
  305. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/lie.py +0 -0
  306. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/linalg.py +0 -0
  307. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/logic.py +0 -0
  308. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/math.py +0 -0
  309. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/parser.py +0 -0
  310. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/spatial.py +0 -0
  311. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/stl.py +0 -0
  312. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/stljax.py +0 -0
  313. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/parser/tokenizer.py +0 -0
  314. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/preprocessing.py +0 -0
  315. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/problem.py +0 -0
  316. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/sparsity.py +0 -0
  317. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/symbolic/unified.py +0 -0
  318. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/__init__.py +0 -0
  319. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/cache.py +0 -0
  320. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/profiling.py +0 -0
  321. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx/utils/utils.py +0 -0
  322. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/dependency_links.txt +0 -0
  323. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/entry_points.txt +0 -0
  324. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/requires.txt +0 -0
  325. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/openscvx.egg-info/top_level.txt +0 -0
  326. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/pyproject.toml +0 -0
  327. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/scripts/gen_example_pages.py +0 -0
  328. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/scripts/gen_ref_pages.py +0 -0
  329. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  330. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/setup.cfg +0 -0
  331. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/__init__.py +0 -0
  332. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/_marks.py +0 -0
  333. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/__init__.py +0 -0
  334. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/_iteration_helpers.py +0 -0
  335. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/autotuner/__init__.py +0 -0
  336. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
  337. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
  338. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/test_iteration_fn_jit.py +0 -0
  339. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/test_iteration_fn_parity.py +0 -0
  340. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/algorithms/test_make_solve_loop.py +0 -0
  341. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/brachistochrone_analytical.py +0 -0
  342. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/conftest.py +0 -0
  343. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/expr/__init__.py +0 -0
  344. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/expr/test_gmsr.py +0 -0
  345. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/fixtures/brachistochrone.json +0 -0
  346. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/fixtures/brachistochrone.yaml +0 -0
  347. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/hohmann_analytical.py +0 -0
  348. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/integrations/__init__.py +0 -0
  349. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/integrations/test_mjx.py +0 -0
  350. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/integrations/test_mjx_dynamics.py +0 -0
  351. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/__init__.py +0 -0
  352. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
  353. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_iteration_callback_moreau.py +0 -0
  354. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/solvers/test_iteration_callback_qpax.py +0 -0
  355. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/__init__.py +0 -0
  356. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/__init__.py +0 -0
  357. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_arithmetic.py +0 -0
  358. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_array.py +0 -0
  359. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_constraint.py +0 -0
  360. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_expr.py +0 -0
  361. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_lie.py +0 -0
  362. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_linalg.py +0 -0
  363. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_logic.py +0 -0
  364. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_math.py +0 -0
  365. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_node_reference.py +0 -0
  366. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_parameters.py +0 -0
  367. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_scaling.py +0 -0
  368. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_spatial.py +0 -0
  369. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_stl.py +0 -0
  370. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_variable.py +0 -0
  371. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/expr/test_vmap.py +0 -0
  372. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/__init__.py +0 -0
  373. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_array.py +0 -0
  374. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_constraint.py +0 -0
  375. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_lie.py +0 -0
  376. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_linalg.py +0 -0
  377. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_load.py +0 -0
  378. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_logic.py +0 -0
  379. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_math.py +0 -0
  380. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_parser.py +0 -0
  381. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_spatial.py +0 -0
  382. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_stl.py +0 -0
  383. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_tokenizer.py +0 -0
  384. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/parser/test_vmap.py +0 -0
  385. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_augmentation.py +0 -0
  386. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_hashing.py +0 -0
  387. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_lower_cvxpy.py +0 -0
  388. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_lower_jax.py +0 -0
  389. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_preprocessing.py +0 -0
  390. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_sparsity.py +0 -0
  391. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/symbolic/test_unified.py +0 -0
  392. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_autotuning.py +0 -0
  393. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_brachistochrone.py +0 -0
  394. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_cvxpygen_optional.py +0 -0
  395. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_discretization.py +0 -0
  396. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_expert.py +0 -0
  397. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_impulsive.py +0 -0
  398. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_init.py +0 -0
  399. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_integrators.py +0 -0
  400. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_loader.py +0 -0
  401. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_optimization_results.py +0 -0
  402. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_propagation.py +0 -0
  403. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_solve_jax_bare_brachistochrone.py +0 -0
  404. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_solve_jax_jit_brachistochrone.py +0 -0
  405. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_solve_jax_vmap_brachistochrone.py +0 -0
  406. {openscvx-0.5.3.dev18 → openscvx-0.5.3.dev20}/tests/test_solve_jax_vmap_converged_no_drift.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev18
3
+ Version: 0.5.3.dev20
4
4
  Summary: A general Python-based successive convexification implementation which uses a JAX backend.
5
5
  Author-email: Chris Hayner and Griffin Norris <haynec@uw.edu>
6
6
  License: Apache Software License
@@ -49,6 +49,81 @@ Python loop) are exactly the failure class the two-method design exists to
49
49
  prevent. See `plans/jax-pure-solve.md`'s Decision Log for the longer
50
50
  discussion.
51
51
 
52
+ ## Batched, disk-cached solves with `solve_batched()`
53
+
54
+ `jax.vmap(solve_jax)` and `solve_batched()` both run `B` SCP solves over
55
+ stacked boundary conditions; they differ in **who owns the batch axis**, and
56
+ that one difference is the whole point.
57
+
58
+ * `jax.vmap(solve_jax)` — *the caller* owns the axis. Maximally idiomatic,
59
+ composes with `grad` / `scan`, but **in-process JIT only**: `jax.export` has
60
+ no outer `vmap` rule (`call_exported` cannot be batched), so an exported
61
+ artifact can never be re-vmapped, and every fresh process re-traces and
62
+ re-compiles the entire loop.
63
+ * `solve_batched(x0_stack, xf_stack)` — *the library* owns the axis. The vmap
64
+ is applied **inside** the method, before any export, so the whole loop lowers
65
+ to ordinary batched XLA ops and serializes cleanly. Under
66
+ `save_compiled=True` it is written to the solver cache on the first run and
67
+ deserialized on later processes — skipping the XLA compile that
68
+ `jax.vmap(solve_jax)` pays on every launch.
69
+
70
+ ```python
71
+ problem = ox.Problem(..., solver={"backend": "qpax"})
72
+ problem.settings.sim.save_compiled = True
73
+ problem.initialize()
74
+
75
+ # First process: traces, exports, writes <cache>/compiled_solve_batched_<hash>.jax
76
+ # Later processes: deserialize-and-.call, no compile.
77
+ batched = problem.solve_batched(x0_stack, xf_stack, params)
78
+ # batched.x.shape == (B, N, n_states) — same pytree jax.vmap(solve_jax) returns.
79
+ ```
80
+
81
+ Pick `solve_batched` when **cross-process cold-start dominates** — short-lived
82
+ processes (CI sweeps, notebook restarts, deployed workers) that otherwise pay
83
+ the compile every launch. Pick `jax.vmap(solve_jax)` for everything in-program,
84
+ where you own the transforms and want `grad` / `scan` composition. With
85
+ `save_compiled=False`, `solve_batched` is just an in-process batched wrapper and
86
+ the two produce identical results.
87
+
88
+ The exported artifact is closed and deployable, not composable: it is the
89
+ `call_exported`-has-no-outer-`vmap`-rule wall again. Use `solve_jax` for
90
+ user-driven `jax.vmap` / `jax.grad`; `solve_batched` for a cached batched solve.
91
+
92
+ ### CVXPy cannot be exported
93
+
94
+ Export requires every op in the loop — the backend solve included — to lower to
95
+ serializable XLA. CVXPy's `iteration_callback` is a `jax.pure_callback`, and
96
+ `jax.export` cannot serialize host callbacks. So `PTRSolver.exportable` is
97
+ `False` for CVXPy (and `True` for QPAX / Moreau), and
98
+ `solve_batched(save_compiled=True)` on the CVXPy backend **raises a teaching
99
+ error** pointing at QPAX / Moreau rather than silently degrading to an uncached
100
+ in-process solve. With `save_compiled=False`, CVXPy still runs `B` sequential
101
+ in-process solves.
102
+
103
+ ### Cache invalidation is correctness, not just freshness
104
+
105
+ The exported loop closes over far more than the symbolic problem does. Caching
106
+ on the symbolic hash alone would silently deserialize a **stale artifact** when
107
+ any of that extra state changes — a wrong-answer bug, not a cache miss. So
108
+ `get_solve_batched_cache_path` (`openscvx/utils/caching.py`) extends the
109
+ symbolic hash with everything additionally baked into the loop, each runtime
110
+ object contributing through its own `_hash_into` (the same protocol the symbolic
111
+ layer uses):
112
+
113
+ * the convex backend class + its `solver_args`,
114
+ * the algorithm + autotuner + convergence thresholds + initial weights,
115
+ * the discretizer scheme (class + hold type + ODE solver),
116
+ * the state/control scaling matrices `inv_S_x` / `inv_S_u`,
117
+ * the fixed batch size `B` (the artifact is exported at one `B`), and
118
+ * the JAX version (exported artifacts are not guaranteed to survive an
119
+ incompatible jax bump).
120
+
121
+ Change any of these — backend, a tolerance, `k_max`, a state bound — and you get
122
+ a different cache path, so a stale artifact is never reused.
123
+
124
+ `examples/abstract/brachistochrone_batched.py` shows both paths side by side;
125
+ re-running it is itself the cross-process demo.
126
+
52
127
  ## What `solve_jax()` returns
53
128
 
54
129
  `solve_jax()` returns the same `OptimizationResults` type as `solve()`,
@@ -1,20 +1,30 @@
1
- """Batched brachistochrone via ``jax.vmap(problem.solve_jax)``.
1
+ """Batched brachistochrone two ways to solve four problems at once.
2
2
 
3
3
  Solves four brachistochrone problems in parallel — each with a different
4
- starting x-coordinate — using the JAX-pure
5
- :meth:`~openscvx.problem.Problem.solve_jax` entry point. ``solve_jax``
6
- returns an :class:`~openscvx.algorithms.optimization_results.OptimizationResults`
7
- pytree, so ``jax.vmap`` over the boundary-condition pins is the standard JAX
8
- composition pattern; no library-specific batching API is needed.
9
-
10
- Run with ``python examples/abstract/brachistochrone_batched.py``.
4
+ starting x-coordinate — and contrasts the two batching entry points:
5
+
6
+ * ``jax.vmap(problem.solve_jax)`` — the caller owns the batch axis. Maximally
7
+ idiomatic, composes with ``grad`` / ``scan``, but in-process JIT only: every
8
+ fresh process re-traces and re-compiles the whole SCP loop.
9
+ * ``problem.solve_batched(x0_stack, xf_stack)`` — the library owns the batch
10
+ axis, so the whole vmapped loop is a single function that ``jax.export`` can
11
+ serialize. Under ``save_compiled=True`` it is written to the solver cache on
12
+ the first run and deserialized on later runs, skipping that compile. Reach
13
+ for it when cross-process cold-start dominates (CI sweeps, short-lived
14
+ workers); reach for ``jax.vmap(solve_jax)`` when you stay inside one program.
15
+
16
+ Run with ``python examples/abstract/brachistochrone_batched.py``. Re-running is
17
+ itself the cross-process demo: the second invocation deserializes the cached
18
+ ``solve_batched`` artifact instead of compiling it.
11
19
 
12
20
  Notes:
13
21
 
14
22
  * Under the QPAX backend used here, vmap'd subproblem solves run in
15
23
  parallel (no host callback). The CVXPy backend is single-threaded under
16
24
  vmap because :func:`jax.pure_callback` uses ``vmap_method="sequential"``
17
- for thread safety — see :meth:`solve_jax`'s docstring.
25
+ for thread safety — see :meth:`solve_jax`'s docstring. That same host
26
+ callback is why ``solve_batched(save_compiled=True)`` refuses CVXPy: it
27
+ cannot be exported.
18
28
  * The Moreau warm-start is bypassed on the JAX-pure path (its carry is
19
29
  host-side state that ``lax.while_loop`` doesn't thread). Use QPAX or
20
30
  CVXPy when you want batched solves.
@@ -113,14 +123,33 @@ if __name__ == "__main__":
113
123
  shifts = jnp.array([0.0, 0.3, 0.6, 0.9])
114
124
  x_initial_stack = jnp.stack([default_pin.at[0].set(default_pin[0] + s) for s in shifts])
115
125
 
116
- # Bare ``jax.vmap`` the library exposes no batching wrapper of its own.
126
+ # --- caller owns the batch axis: jax.vmap(solve_jax) ---------------------
127
+ # Bare ``jax.vmap`` — composes like any JAX transform, in-process only.
117
128
  batched_solve = jax.vmap(problem.solve_jax, in_axes=(0, None, None))
118
129
  results = batched_solve(x_initial_stack, None, None)
119
130
 
120
131
  # ``results`` is a batched ``OptimizationResults`` pytree — every child
121
132
  # (``X``, ``U``, ``t_final``, ``converged``, ...) has a leading batch axis.
122
- print(f"Batched solve over {x_initial_stack.shape[0]} initial conditions:")
133
+ print(f"jax.vmap(solve_jax) over {x_initial_stack.shape[0]} initial conditions:")
123
134
  print(f" result.x.shape: {results.x.shape}")
124
135
  print(f" result.u.shape: {results.u.shape}")
125
136
  print(f" result.t_final: {np.asarray(results.t_final).reshape(-1)}")
126
137
  print(f" result.converged: {np.asarray(results.converged)}")
138
+
139
+ # --- library owns the batch axis: solve_batched, disk-cached -------------
140
+ # The same batched solve, but ``solve_batched`` owns the vmap so the whole
141
+ # loop is one exportable artifact. Under ``save_compiled=True`` it lands in
142
+ # the solver cache on the first run; re-run this script (a fresh process) to
143
+ # see it deserialized instead of recompiled. ``xf`` is shared across the
144
+ # batch, so broadcast the default terminal pin to the same leading axis.
145
+ export_problem = build_problem()
146
+ export_problem.settings.sim.save_compiled = True
147
+ export_problem.initialize()
148
+
149
+ x_term_stack = jnp.broadcast_to(export_problem.state.x_term_pin, x_initial_stack.shape)
150
+ batched = export_problem.solve_batched(x_initial_stack, x_term_stack)
151
+
152
+ print(f"\nsolve_batched (save_compiled=True) over {x_initial_stack.shape[0]} ICs:")
153
+ print(f" result.x.shape: {batched.x.shape}")
154
+ print(f" result.t_final: {np.asarray(batched.t_final).reshape(-1)}")
155
+ print(f" result.converged: {np.asarray(batched.converged)}")