openscvx 0.5.1.dev1__tar.gz → 0.5.2.dev1__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 (369) hide show
  1. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.gitignore +3 -0
  2. openscvx-0.5.2.dev1/.gitmodules +3 -0
  3. {openscvx-0.5.1.dev1/openscvx.egg-info → openscvx-0.5.2.dev1}/PKG-INFO +19 -1
  4. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/README.md +15 -0
  5. openscvx-0.5.2.dev1/examples/animations/franka_fr3v2_pick_place.py +289 -0
  6. openscvx-0.5.2.dev1/examples/arm/franka_fr3v2_pick_place.py +887 -0
  7. openscvx-0.5.2.dev1/examples/arm/franka_fr3v2_viewplanning.py +541 -0
  8. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/car/dubins_car_waypoint_stl.py +11 -2
  9. openscvx-0.5.2.dev1/examples/mjx/cartpole_mjx.py +281 -0
  10. openscvx-0.5.2.dev1/examples/mjx/double_cartpole_mjx.py +682 -0
  11. openscvx-0.5.2.dev1/examples/mjx/skydio_x2_mjx.py +280 -0
  12. openscvx-0.5.2.dev1/examples/mjx/triple_cartpole_3d_mjx.py +620 -0
  13. openscvx-0.5.2.dev1/examples/mjx/triple_cartpole_game.py +1046 -0
  14. openscvx-0.5.2.dev1/examples/mjx/triple_cartpole_mjx.py +488 -0
  15. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/plotting_viser.py +32 -6
  16. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/_version.py +3 -3
  17. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/discretization/base.py +11 -1
  18. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/discretization/discretize_linearize.py +0 -4
  19. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/expert/validation.py +34 -9
  20. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/init/inverse_kinematics.py +8 -1
  21. openscvx-0.5.2.dev1/openscvx/integrations/__init__.py +62 -0
  22. openscvx-0.5.2.dev1/openscvx/integrations/menagerie.py +198 -0
  23. openscvx-0.5.2.dev1/openscvx/integrations/mjx.py +323 -0
  24. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/viser/__init__.py +1 -1
  25. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/lie/__init__.py +6 -4
  26. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1/openscvx.egg-info}/PKG-INFO +19 -1
  27. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx.egg-info/SOURCES.txt +15 -0
  28. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx.egg-info/requires.txt +4 -0
  29. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/pyproject.toml +5 -0
  30. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/expr/test_gmsr.py +18 -13
  31. openscvx-0.5.2.dev1/tests/integrations/test_mjx.py +366 -0
  32. openscvx-0.5.2.dev1/tests/symbolic/parser/__init__.py +0 -0
  33. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_discretization.py +10 -0
  34. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_examples.py +21 -0
  35. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/assets/logo.svg +0 -0
  36. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/release-drafter.yml +0 -0
  37. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/workflows/_docs.yml +0 -0
  38. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/workflows/branch-name.yml +0 -0
  39. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/workflows/docs.yml +0 -0
  40. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/workflows/lint.yml +0 -0
  41. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/workflows/nightly.yml +0 -0
  42. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/workflows/release-drafter.yml +0 -0
  43. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/workflows/release.yml +0 -0
  44. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/workflows/tests-integration.yml +0 -0
  45. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/.github/workflows/tests-unit.yml +0 -0
  46. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/CONTRIBUTING.md +0 -0
  47. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/LICENSE +0 -0
  48. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/Foundations/constraint_reformulation.md +0 -0
  49. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/Foundations/control_parameterization.md +0 -0
  50. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/Foundations/discretization.md +0 -0
  51. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/Foundations/ocp.md +0 -0
  52. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/Foundations/scvx.md +0 -0
  53. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/Foundations/time_dilation.md +0 -0
  54. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UnderTheHood/lowering_architecture.md +0 -0
  55. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  56. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UsersGuide/00_introduction.md +0 -0
  57. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  58. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  59. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  60. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  61. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UsersGuide/05_visualization.md +0 -0
  62. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UsersGuide/06_logic.md +0 -0
  63. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UsersGuide/07_lie.md +0 -0
  64. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/UsersGuide/08_mpcc.md +0 -0
  65. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/assets/favicon.png +0 -0
  66. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/assets/images/ct-scvx_dark.png +0 -0
  67. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/assets/images/ct-scvx_light.png +0 -0
  68. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/assets/images/ctcs_dark.png +0 -0
  69. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/assets/images/ctcs_light.png +0 -0
  70. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/assets/images/problem_class_dark.png +0 -0
  71. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/assets/images/problem_class_light.png +0 -0
  72. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/assets/logo.svg +0 -0
  73. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/citation.md +0 -0
  74. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/examples.md +0 -0
  75. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/getting-started.md +0 -0
  76. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/index.md +0 -0
  77. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/docs/javascripts/mathjax.js +0 -0
  78. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/abstract/brachistochrone.py +0 -0
  79. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/abstract/impulsive.py +0 -0
  80. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/abstract/stl_integer_variable.py +0 -0
  81. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/abstract/stl_or.py +0 -0
  82. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/animations/7_dof_arm.py +0 -0
  83. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/animations/_camera.py +0 -0
  84. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/animations/_render.py +0 -0
  85. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/animations/_sensor_view.py +0 -0
  86. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/animations/dr_vp_polytope.py +0 -0
  87. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/animations/logo.py +0 -0
  88. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  89. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/arm/3_dof_arm.py +0 -0
  90. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/arm/7_dof_arm.py +0 -0
  91. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/arm/7_dof_arm_collision.py +0 -0
  92. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/arm/7_dof_arm_vp.py +0 -0
  93. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/car/dubins_car.py +0 -0
  94. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/car/dubins_car_disjoint.py +0 -0
  95. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  96. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/car/dubins_car_obstacle_stl.py +0 -0
  97. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/car/dubins_car_stl_or.py +0 -0
  98. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/cinema_vp.py +0 -0
  99. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/dr_double_integrator.py +0 -0
  100. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/dr_vp.py +0 -0
  101. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/dr_vp_nodal.py +0 -0
  102. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/dr_vp_polytope.py +0 -0
  103. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/drone_racing.py +0 -0
  104. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/logo.py +0 -0
  105. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/logo_utils/acl_logo.svg +0 -0
  106. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  107. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/obstacle_avoidance.py +0 -0
  108. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  109. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  110. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/mpc/double_integrator_discrete.py +0 -0
  111. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/mpc/double_integrator_drone_racing.py +0 -0
  112. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  113. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  114. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  115. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/plotting.py +0 -0
  116. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  117. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  118. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  119. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  120. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  121. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  122. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  123. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  124. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/cinema_vp_realtime.py +0 -0
  125. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/drone_racing_realtime.py +0 -0
  126. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/dubins_car_realtime.py +0 -0
  127. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  128. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/rocket/3DoF_pdg.py +0 -0
  129. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/rocket/6DoF_pdg.py +0 -0
  130. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/spacecraft/halo_orbit.py +0 -0
  131. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/spacecraft/hohmann_transfer.py +0 -0
  132. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/examples/spacecraft/proxops_cw.py +0 -0
  133. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/figures/ctlos_cine.gif +0 -0
  134. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/figures/ctlos_dr.gif +0 -0
  135. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/figures/dtlos_cine.gif +0 -0
  136. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/figures/dtlos_dr.gif +0 -0
  137. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/figures/openscvx_logo.svg +0 -0
  138. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/figures/openscvx_logo_square.png +0 -0
  139. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/figures/oscvx_structure_full_dark.svg +0 -0
  140. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/figures/video_preview.png +0 -0
  141. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/__init__.py +0 -0
  142. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/1-background.avif +0 -0
  143. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
  144. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
  145. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
  146. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
  147. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/2-mars.avif +0 -0
  148. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
  149. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
  150. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
  151. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
  152. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/3-moon.avif +0 -0
  153. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
  154. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
  155. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
  156. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
  157. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
  158. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
  159. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
  160. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
  161. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
  162. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/5-space.avif +0 -0
  163. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
  164. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
  165. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
  166. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
  167. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/6-earth.avif +0 -0
  168. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
  169. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
  170. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
  171. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
  172. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/javascripts/parallax.js +0 -0
  173. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/logo.svg +0 -0
  174. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/stylesheets/custom.css +0 -0
  175. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/assets/stylesheets/parallax.css +0 -0
  176. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/home.html +0 -0
  177. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/main.html +0 -0
  178. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/partials/parallax/hero.html +0 -0
  179. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/material/overrides/partials/parallax.html +0 -0
  180. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/mkdocs.yml +0 -0
  181. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/__init__.py +0 -0
  182. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/__main__.py +0 -0
  183. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/algorithms/__init__.py +0 -0
  184. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/algorithms/augmented_lagrangian.py +0 -0
  185. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/algorithms/base.py +0 -0
  186. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/algorithms/constant_proximal_weight.py +0 -0
  187. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/algorithms/optimization_results.py +0 -0
  188. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/algorithms/penalized_trust_region.py +0 -0
  189. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/algorithms/ramp_proximal_weight.py +0 -0
  190. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/algorithms/weights.py +0 -0
  191. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/config.py +0 -0
  192. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/discretization/__init__.py +0 -0
  193. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/discretization/linearize_discretize.py +0 -0
  194. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  195. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  196. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  197. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  198. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/expert/__init__.py +0 -0
  199. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/expert/byof.py +0 -0
  200. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/expert/lowering.py +0 -0
  201. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/init/__init__.py +0 -0
  202. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/init/interpolation.py +0 -0
  203. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/integrators/__init__.py +0 -0
  204. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/integrators/diffrax.py +0 -0
  205. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/integrators/runge_kutta.py +0 -0
  206. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/loader.py +0 -0
  207. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/lowered/__init__.py +0 -0
  208. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/lowered/cvxpy_constraints.py +0 -0
  209. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/lowered/cvxpy_variables.py +0 -0
  210. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/lowered/dynamics.py +0 -0
  211. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/lowered/jax_constraints.py +0 -0
  212. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/lowered/parameters.py +0 -0
  213. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/lowered/problem.py +0 -0
  214. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/lowered/unified.py +0 -0
  215. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/__init__.py +0 -0
  216. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/plotting.py +0 -0
  217. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/scp_iteration.py +0 -0
  218. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/viser/animated.py +0 -0
  219. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/viser/orbits.py +0 -0
  220. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/viser/plotly_integration.py +0 -0
  221. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/viser/primitives.py +0 -0
  222. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/viser/scp.py +0 -0
  223. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/plotting/viser/server.py +0 -0
  224. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/problem.py +0 -0
  225. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/propagation/__init__.py +0 -0
  226. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/propagation/post_processing.py +0 -0
  227. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/propagation/propagation.py +0 -0
  228. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/solvers/__init__.py +0 -0
  229. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/solvers/base.py +0 -0
  230. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/solvers/ptr_solver.py +0 -0
  231. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/__init__.py +0 -0
  232. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/augmentation.py +0 -0
  233. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/builder.py +0 -0
  234. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/constraint_set.py +0 -0
  235. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/__init__.py +0 -0
  236. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/arithmetic.py +0 -0
  237. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/array.py +0 -0
  238. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/constraint.py +0 -0
  239. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/control.py +0 -0
  240. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/expr.py +0 -0
  241. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  242. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/lie/se3.py +0 -0
  243. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/lie/so3.py +0 -0
  244. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/linalg.py +0 -0
  245. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/logic.py +0 -0
  246. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/math.py +0 -0
  247. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/parameter.py +0 -0
  248. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/spatial.py +0 -0
  249. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/state.py +0 -0
  250. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/stl.py +0 -0
  251. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/stljax.py +0 -0
  252. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/time.py +0 -0
  253. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/variable.py +0 -0
  254. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/expr/vmap.py +0 -0
  255. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/hashing.py +0 -0
  256. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lower.py +0 -0
  257. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/__init__.py +0 -0
  258. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  259. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  260. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  261. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  262. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  263. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  264. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  265. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  266. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  267. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  268. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  269. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  270. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  271. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  272. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  273. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  274. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  275. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  276. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  277. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  278. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  279. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  280. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  281. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  282. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  283. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  284. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  285. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  286. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  287. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/__init__.py +0 -0
  288. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/_registry.py +0 -0
  289. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/array.py +0 -0
  290. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/constraint.py +0 -0
  291. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/lie.py +0 -0
  292. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/linalg.py +0 -0
  293. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/logic.py +0 -0
  294. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/math.py +0 -0
  295. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/parser.py +0 -0
  296. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/spatial.py +0 -0
  297. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/stl.py +0 -0
  298. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/stljax.py +0 -0
  299. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/parser/tokenizer.py +0 -0
  300. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/preprocessing.py +0 -0
  301. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/problem.py +0 -0
  302. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/sparsity.py +0 -0
  303. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/symbolic/unified.py +0 -0
  304. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/utils/__init__.py +0 -0
  305. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/utils/cache.py +0 -0
  306. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/utils/caching.py +0 -0
  307. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/utils/printing.py +0 -0
  308. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/utils/profiling.py +0 -0
  309. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx/utils/utils.py +0 -0
  310. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx.egg-info/dependency_links.txt +0 -0
  311. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx.egg-info/entry_points.txt +0 -0
  312. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/openscvx.egg-info/top_level.txt +0 -0
  313. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/scripts/gen_example_pages.py +0 -0
  314. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/scripts/gen_ref_pages.py +0 -0
  315. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/setup.cfg +0 -0
  316. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/__init__.py +0 -0
  317. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/brachistochrone_analytical.py +0 -0
  318. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/expr/__init__.py +0 -0
  319. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/fixtures/brachistochrone.json +0 -0
  320. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/fixtures/brachistochrone.yaml +0 -0
  321. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/hohmann_analytical.py +0 -0
  322. {openscvx-0.5.1.dev1/tests/symbolic → openscvx-0.5.2.dev1/tests/integrations}/__init__.py +0 -0
  323. {openscvx-0.5.1.dev1/tests/symbolic/expr → openscvx-0.5.2.dev1/tests/symbolic}/__init__.py +0 -0
  324. {openscvx-0.5.1.dev1/tests/symbolic/parser → openscvx-0.5.2.dev1/tests/symbolic/expr}/__init__.py +0 -0
  325. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_arithmetic.py +0 -0
  326. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_array.py +0 -0
  327. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_constraint.py +0 -0
  328. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_expr.py +0 -0
  329. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_lie.py +0 -0
  330. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_linalg.py +0 -0
  331. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_logic.py +0 -0
  332. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_math.py +0 -0
  333. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_node_reference.py +0 -0
  334. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_parameters.py +0 -0
  335. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_scaling.py +0 -0
  336. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_spatial.py +0 -0
  337. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_stl.py +0 -0
  338. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_variable.py +0 -0
  339. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/expr/test_vmap.py +0 -0
  340. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_array.py +0 -0
  341. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_constraint.py +0 -0
  342. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_lie.py +0 -0
  343. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_linalg.py +0 -0
  344. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_load.py +0 -0
  345. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_logic.py +0 -0
  346. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_math.py +0 -0
  347. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_parser.py +0 -0
  348. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_spatial.py +0 -0
  349. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_stl.py +0 -0
  350. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_tokenizer.py +0 -0
  351. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/parser/test_vmap.py +0 -0
  352. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/test_augmentation.py +0 -0
  353. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/test_hashing.py +0 -0
  354. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/test_lower_cvxpy.py +0 -0
  355. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/test_lower_jax.py +0 -0
  356. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/test_preprocessing.py +0 -0
  357. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/test_sparsity.py +0 -0
  358. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/symbolic/test_unified.py +0 -0
  359. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_autotuning.py +0 -0
  360. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_brachistochrone.py +0 -0
  361. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_cvxpygen_optional.py +0 -0
  362. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_expert.py +0 -0
  363. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_impulsive.py +0 -0
  364. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_init.py +0 -0
  365. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_integrators.py +0 -0
  366. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_loader.py +0 -0
  367. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_optimization_results.py +0 -0
  368. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_plotting.py +0 -0
  369. {openscvx-0.5.1.dev1 → openscvx-0.5.2.dev1}/tests/test_propagation.py +0 -0
@@ -205,6 +205,9 @@ check_lint.py
205
205
  # option (not recommended) you can uncomment the following to ignore the entire idea folder.
206
206
  #.idea/
207
207
 
208
+ # MuJoCo runtime log
209
+ MUJOCO_LOG.TXT
210
+
208
211
  # MkDocs Material Insiders (installed from GitHub in CI, not committed)
209
212
  material/
210
213
  # But allow custom overrides to be committed
@@ -0,0 +1,3 @@
1
+ [submodule "third_party/mujoco_menagerie"]
2
+ path = third_party/mujoco_menagerie
3
+ url = https://github.com/google-deepmind/mujoco_menagerie
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.1.dev1
3
+ Version: 0.5.2.dev1
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
@@ -36,6 +36,9 @@ Provides-Extra: stl
36
36
  Requires-Dist: stljax; extra == "stl"
37
37
  Provides-Extra: lie
38
38
  Requires-Dist: jaxlie; extra == "lie"
39
+ Provides-Extra: mjx
40
+ Requires-Dist: mujoco>=3.0; extra == "mjx"
41
+ Requires-Dist: mujoco-mjx>=3.0; extra == "mjx"
39
42
  Provides-Extra: test
40
43
  Requires-Dist: pytest; extra == "test"
41
44
  Requires-Dist: scipy; extra == "test"
@@ -192,6 +195,21 @@ source .venv/bin/activate
192
195
  uv pip install -e .
193
196
  ```
194
197
 
198
+ > [!NOTE]
199
+ > **MuJoCo Menagerie (optional submodule)**
200
+ >
201
+ > Core OpenSCvx installs fine from a plain clone—you do **not** need the submodule unless you want bundled [MuJoCo Menagerie](https://github.com/google-deepmind/mujoco_menagerie) assets. To fetch it in one step, clone with `--recurse-submodules`, or add it later to `third_party/mujoco_menagerie` so `openscvx.integrations.menagerie` can load those MuJoCo XML/models/meshes without a separate checkout:
202
+ >
203
+ > ```bash
204
+ > git clone --recurse-submodules https://github.com/OpenSCvx/OpenSCvx.git
205
+ > ```
206
+ >
207
+ > After a clone without submodules, initialise Menagerie whenever you need it:
208
+ >
209
+ > ```bash
210
+ > git submodule update --init third_party/mujoco_menagerie
211
+ > ```
212
+
195
213
  ## Getting Started
196
214
 
197
215
  Check out the OpenSCvx documentation to help you get started
@@ -146,6 +146,21 @@ source .venv/bin/activate
146
146
  uv pip install -e .
147
147
  ```
148
148
 
149
+ > [!NOTE]
150
+ > **MuJoCo Menagerie (optional submodule)**
151
+ >
152
+ > Core OpenSCvx installs fine from a plain clone—you do **not** need the submodule unless you want bundled [MuJoCo Menagerie](https://github.com/google-deepmind/mujoco_menagerie) assets. To fetch it in one step, clone with `--recurse-submodules`, or add it later to `third_party/mujoco_menagerie` so `openscvx.integrations.menagerie` can load those MuJoCo XML/models/meshes without a separate checkout:
153
+ >
154
+ > ```bash
155
+ > git clone --recurse-submodules https://github.com/OpenSCvx/OpenSCvx.git
156
+ > ```
157
+ >
158
+ > After a clone without submodules, initialise Menagerie whenever you need it:
159
+ >
160
+ > ```bash
161
+ > git submodule update --init third_party/mujoco_menagerie
162
+ > ```
163
+
149
164
  ## Getting Started
150
165
 
151
166
  Check out the OpenSCvx documentation to help you get started
@@ -0,0 +1,289 @@
1
+ """Cinematic offline render of the Franka FR3 v2 pick-and-place example.
2
+
3
+ The optimization problem itself lives in
4
+ ``examples/arm/franka_fr3v2_pick_place.py``; this script imports the problem,
5
+ solves it, builds a viser scene, and renders an mp4 with a static overview
6
+ camera that frames the full arm/workspace.
7
+
8
+ Run with:
9
+
10
+ python examples/animations/franka_fr3v2_pick_place.py
11
+ """
12
+
13
+ import os
14
+ import sys
15
+ from pathlib import Path
16
+
17
+ import numpy as np
18
+
19
+ current_dir = os.path.dirname(os.path.abspath(__file__))
20
+ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
21
+ sys.path.append(grandparent_dir)
22
+
23
+ from examples.animations._camera import overview_pose
24
+ from examples.animations._render import render_animation_to_video
25
+ from examples.arm.franka_fr3v2_pick_place import (
26
+ N_JOINTS,
27
+ _joint_zero_pos,
28
+ obstacle_center,
29
+ obstacle_radius,
30
+ problem,
31
+ waypoint_positions,
32
+ )
33
+ from examples.plotting_viser import AnimatedServerHandle
34
+ from openscvx.plotting.viser import (
35
+ add_animated_trail,
36
+ add_ellipsoid_obstacles,
37
+ add_ghost_trajectory,
38
+ add_position_marker,
39
+ add_target_markers,
40
+ compute_velocity_colors,
41
+ create_server,
42
+ )
43
+
44
+ # --- Render settings ---------------------------------------------------------
45
+ OUTPUT_PATH = os.path.join(current_dir, "mp4", "franka_fr3v2_pick_place_overview.mp4")
46
+ WIDTH = 1080
47
+ HEIGHT = 1080
48
+ FPS = 60
49
+ CRF = 16
50
+
51
+ # Oversampling for smooth trails.
52
+ STRIDE = 4
53
+ PROPAGATION_HZ = FPS * STRIDE
54
+
55
+ # --- Camera settings ---------------------------------------------------------
56
+ OVERVIEW_AZIMUTH = np.radians(55.0)
57
+ OVERVIEW_ELEVATION = np.radians(17.0)
58
+ # Slightly tighter framing while keeping the full FR3 visible.
59
+ OVERVIEW_RADIUS_MARGIN = 0.5
60
+ OVERVIEW_FOV_DEG = 60.0
61
+
62
+
63
+ if __name__ == "__main__":
64
+ problem.settings.prp.dt = 1.0 / PROPAGATION_HZ
65
+ problem.initialize()
66
+ problem.solve()
67
+ results = problem.post_process()
68
+
69
+ ee_pos = np.asarray(results.trajectory["ee_position"], dtype=np.float64)
70
+ n_frames = len(ee_pos)
71
+
72
+ # Joint keypoints from propagated transforms.
73
+ keypoints = np.zeros((n_frames, N_JOINTS + 1, 3))
74
+ for t_idx in range(n_frames):
75
+ for k in range(N_JOINTS):
76
+ T_k = np.asarray(results.trajectory[f"T_j{k + 1}"])[t_idx]
77
+ q0 = np.append(_joint_zero_pos[k], 1.0)
78
+ keypoints[t_idx, k] = (T_k @ q0)[:3]
79
+ T_7 = np.asarray(results.trajectory["T_j7"])[t_idx]
80
+ keypoints[t_idx, N_JOINTS] = T_7[:3, 3]
81
+
82
+ # -- Build viser scene ----------------------------------------------------
83
+ server = create_server(ee_pos, show_grid=False)
84
+ server.scene.add_grid("/grid", width=1.8, height=1.8, cell_size=0.25)
85
+ server.scene.add_frame("/origin", axes_length=0.1, axes_radius=0.003)
86
+
87
+ add_target_markers(
88
+ server,
89
+ waypoint_positions,
90
+ radius=0.012,
91
+ colors=[
92
+ (100, 150, 255),
93
+ (255, 180, 50),
94
+ (255, 50, 50),
95
+ (255, 180, 50),
96
+ (255, 180, 50),
97
+ (255, 50, 50),
98
+ ],
99
+ )
100
+
101
+ add_ellipsoid_obstacles(
102
+ server,
103
+ centers=[obstacle_center],
104
+ radii=[np.full(3, 1.0 / obstacle_radius)],
105
+ )
106
+
107
+ ee_colors = compute_velocity_colors(np.asarray(results.trajectory.get("velocity")))
108
+ add_ghost_trajectory(server, ee_pos, ee_colors, point_size=0.005)
109
+ _, update_trail = add_animated_trail(server, ee_pos, ee_colors, point_size=0.008)
110
+ _, update_marker = add_position_marker(server, ee_pos, radius=0.012)
111
+
112
+ # Prefer full FR3 CAD meshes from menagerie assets.
113
+ update_arm = None
114
+ try:
115
+ import mujoco
116
+ import trimesh # type: ignore
117
+
118
+ from openscvx.integrations.menagerie import get_xml_path
119
+
120
+ xml_path = Path(str(get_xml_path("franka_fr3_v2", prefer_mjx=False)))
121
+ mj_model_vis = mujoco.MjModel.from_xml_path(str(xml_path))
122
+ mj_data_vis = mujoco.MjData(mj_model_vis)
123
+ asset_dir = xml_path.parent / "assets"
124
+
125
+ link_visual_files = {
126
+ "fr3v2_link0": [
127
+ "link0_0.obj",
128
+ "link0_1.obj",
129
+ "link0_2.obj",
130
+ "link0_3.obj",
131
+ "link0_4.obj",
132
+ "link0_5.obj",
133
+ ],
134
+ "fr3v2_link1": ["link1_3.obj"],
135
+ "fr3v2_link2": ["link2_3.obj"],
136
+ "fr3v2_link3": ["link3_3.obj"],
137
+ "fr3v2_link4": ["link4_3.obj"],
138
+ "fr3v2_link5": ["link5_3.obj", "link5_4.obj"],
139
+ "fr3v2_link6": [
140
+ "link6_0.obj",
141
+ "link6_1.obj",
142
+ "link6_2.obj",
143
+ "link6_3.obj",
144
+ "link6_4.obj",
145
+ "link6_5.obj",
146
+ "link6_6.obj",
147
+ "link6_7.obj",
148
+ "link6_8.obj",
149
+ "link6_9.obj",
150
+ ],
151
+ "fr3v2_link7": [
152
+ "link7_0.obj",
153
+ "link7_1.obj",
154
+ "link7_2.obj",
155
+ "link7_3.obj",
156
+ "link7_4.obj",
157
+ "link7_5.obj",
158
+ "link7_6.obj",
159
+ ],
160
+ }
161
+
162
+ link_meshes_local = {}
163
+ link_body_ids = {}
164
+ for link_name, files in link_visual_files.items():
165
+ all_verts, all_faces, offset = [], [], 0
166
+ for fname in files:
167
+ obj_path = asset_dir / fname
168
+ if not obj_path.exists():
169
+ continue
170
+ tm = trimesh.load(str(obj_path), force="mesh", process=False)
171
+ all_verts.append(np.asarray(tm.vertices, dtype=np.float32))
172
+ all_faces.append(np.asarray(tm.faces, dtype=np.uint32) + offset)
173
+ offset += len(tm.vertices)
174
+ if not all_verts:
175
+ continue
176
+ link_meshes_local[link_name] = (np.vstack(all_verts), np.vstack(all_faces))
177
+ link_body_ids[link_name] = mujoco.mj_name2id(
178
+ mj_model_vis, mujoco.mjtObj.mjOBJ_BODY, link_name
179
+ )
180
+
181
+ if not link_meshes_local:
182
+ raise RuntimeError("No FR3 mesh assets were loaded.")
183
+
184
+ angle_traj = np.asarray(results.trajectory["angle"], dtype=np.float64)
185
+ link_world_T = {name: np.zeros((n_frames, 4, 4)) for name in link_meshes_local}
186
+ for t_idx in range(n_frames):
187
+ mj_data_vis.qpos[:N_JOINTS] = angle_traj[t_idx]
188
+ mujoco.mj_kinematics(mj_model_vis, mj_data_vis)
189
+ for name, body_id in link_body_ids.items():
190
+ T = np.eye(4)
191
+ T[:3, :3] = mj_data_vis.xmat[body_id].copy().reshape(3, 3)
192
+ T[:3, 3] = mj_data_vis.xpos[body_id].copy()
193
+ link_world_T[name][t_idx] = T
194
+
195
+ link_colors = {
196
+ "fr3v2_link0": (120, 120, 120),
197
+ "fr3v2_link1": (215, 215, 218),
198
+ "fr3v2_link2": (215, 215, 218),
199
+ "fr3v2_link3": (215, 215, 218),
200
+ "fr3v2_link4": (215, 215, 218),
201
+ "fr3v2_link5": (210, 210, 215),
202
+ "fr3v2_link6": (200, 205, 215),
203
+ "fr3v2_link7": (190, 195, 210),
204
+ }
205
+
206
+ link_handles = {}
207
+ for link_name, (verts_local, faces) in link_meshes_local.items():
208
+ T0 = link_world_T[link_name][0]
209
+ verts_world = (T0[:3, :3] @ verts_local.T).T + T0[:3, 3]
210
+ link_handles[link_name] = ( # (mesh_handle, verts_local)
211
+ server.scene.add_mesh_simple(
212
+ f"/robot/{link_name}",
213
+ vertices=verts_world.astype(np.float32),
214
+ faces=faces,
215
+ color=link_colors.get(link_name, (210, 210, 215)),
216
+ opacity=1.0,
217
+ ),
218
+ verts_local,
219
+ )
220
+
221
+ def update_arm(frame_idx: int) -> None:
222
+ for link_name, (handle, verts_local) in link_handles.items():
223
+ T = link_world_T[link_name][frame_idx]
224
+ handle.vertices = ((T[:3, :3] @ verts_local.T).T + T[:3, 3]).astype(np.float32)
225
+
226
+ print(f"[animation] Using FR3 menagerie meshes from {asset_dir}")
227
+ except Exception as exc:
228
+ print(f"[animation] Mesh visualisation unavailable ({type(exc).__name__}: {exc})")
229
+ print("[animation] Falling back to line-segment arm rendering.")
230
+
231
+ n_segs = N_JOINTS + 1
232
+ seg_col = np.full((n_segs, 2, 3), [210, 210, 210], dtype=np.uint8)
233
+
234
+ def _build_segments(frame_idx: int) -> np.ndarray:
235
+ pts = np.zeros((n_segs, 2, 3), dtype=np.float32)
236
+ pts[0] = [np.zeros(3), keypoints[frame_idx, 0]]
237
+ for k in range(N_JOINTS - 1):
238
+ pts[k + 1] = [keypoints[frame_idx, k], keypoints[frame_idx, k + 1]]
239
+ pts[N_JOINTS] = [keypoints[frame_idx, N_JOINTS - 1], keypoints[frame_idx, N_JOINTS]]
240
+ return pts
241
+
242
+ arm_handle = server.scene.add_line_segments(
243
+ "/arm_links",
244
+ points=_build_segments(0),
245
+ colors=seg_col,
246
+ line_width=5.0,
247
+ )
248
+
249
+ def update_arm(frame_idx: int) -> None:
250
+ arm_handle.points = _build_segments(frame_idx)
251
+
252
+ traj_time = np.asarray(results.trajectory["time"], dtype=np.float64).flatten()
253
+ handle = AnimatedServerHandle(
254
+ server=server,
255
+ traj_time=traj_time,
256
+ update_callbacks=[update_trail, update_marker, update_arm],
257
+ )
258
+
259
+ # Camera framing: include EE trajectory, waypoints, and all joints to ensure
260
+ # the full arm remains visible.
261
+ all_points = np.vstack(
262
+ [
263
+ ee_pos,
264
+ np.asarray(waypoint_positions, dtype=np.float64),
265
+ keypoints.reshape(-1, 3),
266
+ np.zeros((1, 3)),
267
+ ]
268
+ )
269
+ static_pose = overview_pose(
270
+ all_points,
271
+ azimuth=OVERVIEW_AZIMUTH,
272
+ elevation=OVERVIEW_ELEVATION,
273
+ radius_margin=OVERVIEW_RADIUS_MARGIN,
274
+ fov_deg=OVERVIEW_FOV_DEG,
275
+ )
276
+
277
+ def camera_pose_fn(frame_idx: int):
278
+ return static_pose
279
+
280
+ render_animation_to_video(
281
+ handle,
282
+ OUTPUT_PATH,
283
+ camera_pose_fn,
284
+ width=WIDTH,
285
+ height=HEIGHT,
286
+ fps=FPS,
287
+ crf=CRF,
288
+ stride=STRIDE,
289
+ )