openscvx 0.5.3.dev35__tar.gz → 0.5.3.dev36__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 (441) hide show
  1. openscvx-0.5.3.dev36/.github/workflows/_extra.yml +41 -0
  2. openscvx-0.5.3.dev36/.github/workflows/tests-cvxpygen.yml +18 -0
  3. openscvx-0.5.3.dev35/.github/workflows/tests-integration.yml → openscvx-0.5.3.dev36/.github/workflows/tests-examples.yml +12 -9
  4. openscvx-0.5.3.dev36/.github/workflows/tests-lie.yml +18 -0
  5. openscvx-0.5.3.dev36/.github/workflows/tests-mjx.yml +18 -0
  6. openscvx-0.5.3.dev36/.github/workflows/tests-qpax.yml +16 -0
  7. openscvx-0.5.3.dev36/.github/workflows/tests.yml +140 -0
  8. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/CONTRIBUTING.md +7 -6
  9. {openscvx-0.5.3.dev35/openscvx.egg-info → openscvx-0.5.3.dev36}/PKG-INFO +20 -7
  10. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/README.md +18 -2
  11. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/01_hello_world_brachistochrone.md +1 -1
  12. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/_version.py +3 -3
  13. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36/openscvx.egg-info}/PKG-INFO +20 -7
  14. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx.egg-info/SOURCES.txt +19 -15
  15. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx.egg-info/requires.txt +1 -4
  16. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx.egg-info/scm_file_list.json +19 -15
  17. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx.egg-info/scm_version.json +2 -2
  18. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/pyproject.toml +9 -5
  19. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/test_iteration_fn_jit.py +2 -2
  20. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/test_iteration_fn_parity.py +10 -6
  21. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/test_make_solve_loop.py +2 -2
  22. openscvx-0.5.3.dev36/tests/conftest.py +80 -0
  23. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_brachistochrone.py +14 -29
  24. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_impulsive.py +8 -7
  25. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_multishot_propagation.py +6 -6
  26. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_solve_batched_brachistochrone.py +11 -22
  27. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_solve_batched_export_roundtrip.py +2 -3
  28. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_solve_jax_bare_brachistochrone.py +2 -5
  29. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_solve_jax_jit_brachistochrone.py +1 -4
  30. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_solve_jax_vmap_brachistochrone.py +1 -4
  31. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_solve_jax_vmap_converged_no_drift.py +1 -4
  32. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/integrations/test_mjx.py +1 -16
  33. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/integrations/test_mjx_dynamics.py +18 -34
  34. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/test_cvxpy_callback_jit_spike.py +3 -0
  35. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/test_iteration_callback_cvxpy.py +3 -0
  36. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/test_iteration_callback_moreau.py +11 -14
  37. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/test_iteration_callback_qpax.py +2 -2
  38. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/test_iteration_callback_vmap.py +4 -5
  39. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/test_moreau_ptr_solver.py +2 -4
  40. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/test_qpax_ptr_solver.py +4 -5
  41. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_lie.py +23 -28
  42. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_lie.py +12 -20
  43. openscvx-0.5.3.dev36/tests/test_examples.py +189 -0
  44. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_loader.py +5 -1
  45. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_results_parameters.py +3 -5
  46. openscvx-0.5.3.dev35/.github/workflows/tests-unit.yml +0 -55
  47. openscvx-0.5.3.dev35/tests/_marks.py +0 -59
  48. openscvx-0.5.3.dev35/tests/conftest.py +0 -12
  49. openscvx-0.5.3.dev35/tests/test_examples.py +0 -223
  50. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.github/assets/logo.svg +0 -0
  51. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.github/release-drafter.yml +0 -0
  52. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.github/workflows/_docs.yml +0 -0
  53. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.github/workflows/branch-name.yml +0 -0
  54. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.github/workflows/docs.yml +0 -0
  55. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.github/workflows/lint.yml +0 -0
  56. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.github/workflows/nightly.yml +0 -0
  57. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.github/workflows/release-drafter.yml +0 -0
  58. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.github/workflows/release.yml +0 -0
  59. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.gitignore +0 -0
  60. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/.gitmodules +0 -0
  61. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/LICENSE +0 -0
  62. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/Foundations/constraint_reformulation.md +0 -0
  63. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/Foundations/control_parameterization.md +0 -0
  64. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/Foundations/discretization.md +0 -0
  65. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/Foundations/ocp.md +0 -0
  66. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/Foundations/scvx.md +0 -0
  67. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/Foundations/time_dilation.md +0 -0
  68. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UnderTheHood/batching_jit_grad.md +0 -0
  69. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UnderTheHood/custom_algorithms_autotuners.md +0 -0
  70. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UnderTheHood/lowering_architecture.md +0 -0
  71. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  72. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/00_introduction.md +0 -0
  73. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  74. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  75. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  76. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/05_visualization.md +0 -0
  77. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/06_logic.md +0 -0
  78. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/07_lie.md +0 -0
  79. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/08_mpcc.md +0 -0
  80. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
  81. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/favicon.png +0 -0
  82. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/images/ct-scvx_dark.png +0 -0
  83. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/images/ct-scvx_light.png +0 -0
  84. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/images/ctcs_dark.png +0 -0
  85. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/images/ctcs_light.png +0 -0
  86. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/images/problem_class_dark.png +0 -0
  87. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/images/problem_class_light.png +0 -0
  88. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/logo.svg +0 -0
  89. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/openscvx_logo_square.png +0 -0
  90. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/viser-client/index.html +0 -0
  91. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  92. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  93. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/citation.md +0 -0
  94. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/examples.md +0 -0
  95. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/index.md +0 -0
  96. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/javascripts/mathjax.js +0 -0
  97. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/docs/versions.json +0 -0
  98. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/_viser_embed_export.py +0 -0
  99. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/abstract/brachistochrone.py +0 -0
  100. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/abstract/brachistochrone_batched.py +0 -0
  101. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/abstract/flappy_bird.py +0 -0
  102. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/abstract/hypersensitive.py +0 -0
  103. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/abstract/impulsive.py +0 -0
  104. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/abstract/stl_integer_variable.py +0 -0
  105. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/abstract/stl_or.py +0 -0
  106. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/aircraft/dynamic_soaring.py +0 -0
  107. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/aircraft/supersonic_time_to_climb.py +0 -0
  108. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/animations/7_dof_arm.py +0 -0
  109. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/animations/_camera.py +0 -0
  110. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/animations/_render.py +0 -0
  111. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/animations/_sensor_view.py +0 -0
  112. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/animations/dr_vp_polytope.py +0 -0
  113. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  114. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/animations/logo.py +0 -0
  115. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  116. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/arm/3_dof_arm.py +0 -0
  117. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/arm/7_dof_arm.py +0 -0
  118. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/arm/7_dof_arm_collision.py +0 -0
  119. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/arm/7_dof_arm_vp.py +0 -0
  120. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  121. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  122. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/arm/franka_fr3v2_viewplanning_nodal.py +0 -0
  123. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/car/dubins_car.py +0 -0
  124. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/car/dubins_car_disjoint.py +0 -0
  125. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  126. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/car/dubins_car_obstacle_stl.py +0 -0
  127. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/car/dubins_car_stl_or.py +0 -0
  128. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/car/dubins_car_waypoint_stl.py +0 -0
  129. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/double_integrator/_plotting.py +0 -0
  130. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/double_integrator/moving_safe_zones.py +0 -0
  131. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/2d_obstacle_avoidance_batched_ic.py +0 -0
  132. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/cinema_vp.py +0 -0
  133. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/cinema_vp_nodal.py +0 -0
  134. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/dr_double_integrator.py +0 -0
  135. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/dr_vp.py +0 -0
  136. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/dr_vp_nodal.py +0 -0
  137. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/dr_vp_polytope.py +0 -0
  138. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/drone_racing.py +0 -0
  139. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/drone_racing_batched_gates.py +0 -0
  140. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/logo.py +0 -0
  141. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/logo_utils/acl_logo.svg +0 -0
  142. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/logo_utils/openscvx_logo_single.svg +0 -0
  143. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/logo_utils/quadrotor_mesh.py +0 -0
  144. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  145. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/multi_agent_circle_swap.py +0 -0
  146. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/obstacle_avoidance.py +0 -0
  147. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  148. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  149. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/obstacle_avoidance_vmap_2d.py +0 -0
  150. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/drone/openscvx_logo.py +0 -0
  151. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/frax/panda_frax.py +0 -0
  152. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/frax/panda_frax_pick_place.py +0 -0
  153. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/frax/panda_frax_viewplanning.py +0 -0
  154. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/frax/panda_frax_waypoint.py +0 -0
  155. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mjx/cartpole_mjx.py +0 -0
  156. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mjx/double_cartpole_mjx.py +0 -0
  157. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mjx/skydio_x2_mjx.py +0 -0
  158. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  159. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mjx/triple_cartpole_game.py +0 -0
  160. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mjx/triple_cartpole_mjx.py +0 -0
  161. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mpc/double_integrator_discrete.py +0 -0
  162. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mpc/double_integrator_drone_racing.py +0 -0
  163. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  164. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  165. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  166. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/plotting.py +0 -0
  167. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/plotting_viser.py +0 -0
  168. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  169. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  170. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  171. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  172. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  173. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  174. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  175. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  176. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/cinema_vp_realtime.py +0 -0
  177. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/drone_racing_realtime.py +0 -0
  178. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/dubins_car_realtime.py +0 -0
  179. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  180. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/rocket/3DoF_pdg.py +0 -0
  181. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/rocket/6DoF_pdg.py +0 -0
  182. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/rocket/6DoF_pdg_batched_ic.py +0 -0
  183. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/rocket/ascent_launch_vehicle.py +0 -0
  184. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/spacecraft/halo_orbit.py +0 -0
  185. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/spacecraft/hohmann_transfer.py +0 -0
  186. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/spacecraft/let_transfer.py +0 -0
  187. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/spacecraft/proxops_cw.py +0 -0
  188. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/examples/spacecraft/relative_loitering.py +0 -0
  189. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/figures/ctlos_cine.gif +0 -0
  190. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/figures/ctlos_dr.gif +0 -0
  191. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/figures/dtlos_cine.gif +0 -0
  192. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/figures/dtlos_dr.gif +0 -0
  193. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/figures/openscvx_logo.svg +0 -0
  194. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/figures/openscvx_logo_square.png +0 -0
  195. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/figures/oscvx_structure_full_dark.svg +0 -0
  196. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/figures/video_preview.png +0 -0
  197. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/__init__.py +0 -0
  198. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/assets/stylesheets/custom.css +0 -0
  199. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  200. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  201. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  202. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/home.html +0 -0
  203. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/main.html +0 -0
  204. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/partials/home-diagram.html +0 -0
  205. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/partials/home-dropin-banner.html +0 -0
  206. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/partials/home-hero.html +0 -0
  207. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/partials/home-pipeline.html +0 -0
  208. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/material/overrides/partials/home-viser-strip.html +0 -0
  209. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/mkdocs.yml +0 -0
  210. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/__init__.py +0 -0
  211. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/__main__.py +0 -0
  212. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/__init__.py +0 -0
  213. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/autotuner/__init__.py +0 -0
  214. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/autotuner/acceptance_ratio.py +0 -0
  215. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  216. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
  217. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/autotuner/base.py +0 -0
  218. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  219. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  220. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/base.py +0 -0
  221. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/history.py +0 -0
  222. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/hyperparams.py +0 -0
  223. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/loop.py +0 -0
  224. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/optimization_results.py +0 -0
  225. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/penalty.py +0 -0
  226. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/scvx/__init__.py +0 -0
  227. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/scvx/iteration.py +0 -0
  228. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
  229. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/state.py +0 -0
  230. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/algorithms/weights.py +0 -0
  231. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/config.py +0 -0
  232. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/discretization/__init__.py +0 -0
  233. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/discretization/base.py +0 -0
  234. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/discretization/discretize_linearize.py +0 -0
  235. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/discretization/linearize_discretize.py +0 -0
  236. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  237. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  238. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  239. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  240. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/expert/__init__.py +0 -0
  241. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/expert/byof.py +0 -0
  242. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/expert/lowering.py +0 -0
  243. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/expert/validation.py +0 -0
  244. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/init/__init__.py +0 -0
  245. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/init/interpolation.py +0 -0
  246. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/init/inverse_kinematics.py +0 -0
  247. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/integrations/__init__.py +0 -0
  248. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/integrations/_utils.py +0 -0
  249. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/integrations/base.py +0 -0
  250. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/integrations/frax.py +0 -0
  251. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/integrations/menagerie.py +0 -0
  252. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/integrations/mjx.py +0 -0
  253. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/integrators/__init__.py +0 -0
  254. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/integrators/diffrax.py +0 -0
  255. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/integrators/runge_kutta.py +0 -0
  256. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/loader.py +0 -0
  257. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/lowered/__init__.py +0 -0
  258. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/lowered/cvxpy_constraints.py +0 -0
  259. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/lowered/cvxpy_variables.py +0 -0
  260. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/lowered/dynamics.py +0 -0
  261. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/lowered/jax_constraints.py +0 -0
  262. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/lowered/parameters.py +0 -0
  263. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/lowered/problem.py +0 -0
  264. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/lowered/unified.py +0 -0
  265. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/__init__.py +0 -0
  266. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/plotting.py +0 -0
  267. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/publication.py +0 -0
  268. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/scp_iteration.py +0 -0
  269. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/viser/__init__.py +0 -0
  270. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/viser/animated.py +0 -0
  271. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/viser/coordinates.py +0 -0
  272. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/viser/orbits.py +0 -0
  273. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/viser/plotly_integration.py +0 -0
  274. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/viser/primitives.py +0 -0
  275. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/viser/scp.py +0 -0
  276. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/plotting/viser/server.py +0 -0
  277. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/problem.py +0 -0
  278. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/propagation/__init__.py +0 -0
  279. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/propagation/post_processing.py +0 -0
  280. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/propagation/propagation.py +0 -0
  281. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/solvers/__init__.py +0 -0
  282. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/solvers/base.py +0 -0
  283. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/solvers/cones.py +0 -0
  284. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
  285. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/solvers/moreau_ptr_solver.py +0 -0
  286. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/solvers/ptr_solver.py +0 -0
  287. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/solvers/qpax_ptr_solver.py +0 -0
  288. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/__init__.py +0 -0
  289. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/affine.py +0 -0
  290. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/augmentation.py +0 -0
  291. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/builder.py +0 -0
  292. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/canonicalize.py +0 -0
  293. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/constraint_set.py +0 -0
  294. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/__init__.py +0 -0
  295. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/arithmetic.py +0 -0
  296. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/array.py +0 -0
  297. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/constraint.py +0 -0
  298. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/control.py +0 -0
  299. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/expr.py +0 -0
  300. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  301. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  302. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/lie/se3.py +0 -0
  303. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/lie/so3.py +0 -0
  304. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/linalg.py +0 -0
  305. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/logic.py +0 -0
  306. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/math.py +0 -0
  307. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/parameter.py +0 -0
  308. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/spatial.py +0 -0
  309. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/state.py +0 -0
  310. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/stl.py +0 -0
  311. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/stljax.py +0 -0
  312. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/time.py +0 -0
  313. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/variable.py +0 -0
  314. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/expr/vmap.py +0 -0
  315. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/hashing.py +0 -0
  316. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lower.py +0 -0
  317. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/__init__.py +0 -0
  318. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  319. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  320. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  321. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  322. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  323. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  324. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  325. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  326. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  327. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  328. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  329. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  330. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  331. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  332. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  333. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  334. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  335. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  336. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  337. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  338. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  339. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  340. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  341. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  342. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  343. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  344. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  345. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  346. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  347. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/__init__.py +0 -0
  348. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/_registry.py +0 -0
  349. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/array.py +0 -0
  350. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/constraint.py +0 -0
  351. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/lie.py +0 -0
  352. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/linalg.py +0 -0
  353. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/logic.py +0 -0
  354. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/math.py +0 -0
  355. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/parser.py +0 -0
  356. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/spatial.py +0 -0
  357. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/stl.py +0 -0
  358. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/stljax.py +0 -0
  359. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/parser/tokenizer.py +0 -0
  360. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/preprocessing.py +0 -0
  361. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/problem.py +0 -0
  362. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/sparsity.py +0 -0
  363. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/symbolic/unified.py +0 -0
  364. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/utils/__init__.py +0 -0
  365. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/utils/cache.py +0 -0
  366. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/utils/caching.py +0 -0
  367. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/utils/printing.py +0 -0
  368. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/utils/profiling.py +0 -0
  369. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx/utils/utils.py +0 -0
  370. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx.egg-info/dependency_links.txt +0 -0
  371. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx.egg-info/entry_points.txt +0 -0
  372. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/openscvx.egg-info/top_level.txt +0 -0
  373. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/scripts/gen_example_pages.py +0 -0
  374. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/scripts/gen_ref_pages.py +0 -0
  375. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  376. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/setup.cfg +0 -0
  377. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/__init__.py +0 -0
  378. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/__init__.py +0 -0
  379. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/_iteration_helpers.py +0 -0
  380. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/autotuner/__init__.py +0 -0
  381. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/autotuner/test_defaults_agreement.py +0 -0
  382. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/autotuner/test_hyper_overrides.py +0 -0
  383. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
  384. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
  385. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/brachistochrone_analytical.py +0 -0
  386. {openscvx-0.5.3.dev35/tests/expr → openscvx-0.5.3.dev36/tests/e2e}/__init__.py +0 -0
  387. {openscvx-0.5.3.dev35/tests → openscvx-0.5.3.dev36/tests/e2e}/test_solve_batched_cvxpy_export_errors.py +0 -0
  388. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/fixtures/brachistochrone.json +0 -0
  389. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/fixtures/brachistochrone.yaml +0 -0
  390. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/hohmann_analytical.py +0 -0
  391. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/integrations/__init__.py +0 -0
  392. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/__init__.py +0 -0
  393. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/_iteration_callback_helpers.py +0 -0
  394. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/solvers/test_subproblem_pytree.py +0 -0
  395. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/__init__.py +0 -0
  396. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/__init__.py +0 -0
  397. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_arithmetic.py +0 -0
  398. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_array.py +0 -0
  399. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_constraint.py +0 -0
  400. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_expr.py +0 -0
  401. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_linalg.py +0 -0
  402. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_logic.py +0 -0
  403. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_math.py +0 -0
  404. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_node_reference.py +0 -0
  405. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_parameters.py +0 -0
  406. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_scaling.py +0 -0
  407. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_spatial.py +0 -0
  408. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_stl.py +0 -0
  409. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_variable.py +0 -0
  410. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/expr/test_vmap.py +0 -0
  411. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/__init__.py +0 -0
  412. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_array.py +0 -0
  413. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_constraint.py +0 -0
  414. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_linalg.py +0 -0
  415. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_load.py +0 -0
  416. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_logic.py +0 -0
  417. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_math.py +0 -0
  418. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_parser.py +0 -0
  419. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_spatial.py +0 -0
  420. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_stl.py +0 -0
  421. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_tokenizer.py +0 -0
  422. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/parser/test_vmap.py +0 -0
  423. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/test_augmentation.py +0 -0
  424. {openscvx-0.5.3.dev35/tests/expr → openscvx-0.5.3.dev36/tests/symbolic}/test_gmsr.py +0 -0
  425. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/test_hashing.py +0 -0
  426. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/test_lower_cvxpy.py +0 -0
  427. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/test_lower_jax.py +0 -0
  428. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/test_preprocessing.py +0 -0
  429. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/test_sparsity.py +0 -0
  430. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/symbolic/test_unified.py +0 -0
  431. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_autotuning.py +0 -0
  432. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_cvxpygen_optional.py +0 -0
  433. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_discretization.py +0 -0
  434. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_expert.py +0 -0
  435. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_init.py +0 -0
  436. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_integrators.py +0 -0
  437. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_optimization_results.py +0 -0
  438. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_plotting.py +0 -0
  439. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_post_process_batched_tau_clamp.py +0 -0
  440. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_propagation.py +0 -0
  441. {openscvx-0.5.3.dev35 → openscvx-0.5.3.dev36}/tests/test_solve_batched_inference.py +0 -0
@@ -0,0 +1,41 @@
1
+ name: 🔌 Third-Party Extra
2
+
3
+ # Reusable workflow behind the per-integration badge workflows (tests-mjx.yml,
4
+ # tests-lie.yml, ...). Installs one optional extra and runs exactly the tests
5
+ # carrying its marker — marker name == extra name, so one input drives both.
6
+
7
+ on:
8
+ workflow_call:
9
+ inputs:
10
+ extra:
11
+ description: 'pyproject optional extra to install; also the pytest marker to select'
12
+ required: true
13
+ type: string
14
+
15
+ jobs:
16
+ test:
17
+ name: ${{ inputs.extra }} (Python 3.13, ubuntu-latest)
18
+ runs-on: ubuntu-latest
19
+ timeout-minutes: 15
20
+
21
+ steps:
22
+ - name: Checkout repository
23
+ uses: actions/checkout@v4
24
+
25
+ - name: Set up Python
26
+ uses: actions/setup-python@v5
27
+ with:
28
+ python-version: '3.13'
29
+
30
+ - name: Install uv
31
+ uses: astral-sh/setup-uv@v7
32
+ with:
33
+ enable-cache: true
34
+
35
+ - name: Install dependencies
36
+ run: |
37
+ uv pip install --system -e ".[test,${{ inputs.extra }}]"
38
+
39
+ - name: Run ${{ inputs.extra }} tests
40
+ run: |
41
+ pytest -v -m "${{ inputs.extra }} and not examples" --durations=10 --tb=short -n auto
@@ -0,0 +1,18 @@
1
+ name: cvxpygen
2
+
3
+ # Badge workflow: health of the cvxpygen integration. Currently failing at
4
+ # install (#551: cvxpygen>=1.0.0 needs cvxpy>=1.9, conflicting with the <1.9
5
+ # pin) — cron + dispatch only while broken, so merges to main don't carry a
6
+ # guaranteed red check; add a push trigger alongside the extras-job install
7
+ # once the pins reconcile.
8
+
9
+ on:
10
+ schedule:
11
+ - cron: '0 6 * * 1' # Weekly on Monday, offset from the Sunday examples sweep
12
+ workflow_dispatch:
13
+
14
+ jobs:
15
+ cvxpygen:
16
+ uses: ./.github/workflows/_extra.yml
17
+ with:
18
+ extra: cvxpygen
@@ -1,4 +1,4 @@
1
- name: 🧪 Integration Tests
1
+ name: 🧪 Examples Sweep
2
2
 
3
3
  on:
4
4
  release:
@@ -8,10 +8,10 @@ on:
8
8
  - cron: '0 0 * * 0' # Weekly on Sunday at midnight UTC
9
9
 
10
10
  jobs:
11
- integration-tests:
12
- name: Integration Tests
11
+ examples:
12
+ name: Examples Sweep
13
13
  runs-on: ${{ matrix.os }}
14
- timeout-minutes: 30 # Integration tests can be slow
14
+ timeout-minutes: 30 # Solving every example is slow
15
15
 
16
16
  strategy:
17
17
  fail-fast: false # Continue testing other examples even if one fails
@@ -35,18 +35,21 @@ jobs:
35
35
 
36
36
  - name: Install dependencies
37
37
  run: |
38
- # Install package with optional cvxpygen and test packages
39
- uv pip install --system -e ".[cvxpygen, test]"
38
+ # Install the package with every extra the examples exercise.
39
+ # cvxpygen omitted: its extra is unsatisfiable while cvxpy is pinned <1.9
40
+ # (cvxpygen>=1.0.0 needs cvxpy>=1.9, #551); its tests skip until that resolves.
41
+ # qpax omitted until its solves are stable on Linux runners (#550).
42
+ uv pip install --system -e ".[test,mjx,lie,frax,stl]"
40
43
 
41
- - name: Run integration tests
44
+ - name: Run examples sweep
42
45
  run: |
43
- pytest -v -m integration --durations=10 -n auto
46
+ pytest -v -m examples --durations=10 -n auto
44
47
 
45
48
  - name: Upload test results on failure
46
49
  if: failure()
47
50
  uses: actions/upload-artifact@v4
48
51
  with:
49
- name: integration-test-results-py${{ matrix.python-version }}-${{ matrix.os }}
52
+ name: examples-test-results-py${{ matrix.python-version }}-${{ matrix.os }}
50
53
  path: |
51
54
  .pytest_cache/
52
55
  test-results/
@@ -0,0 +1,18 @@
1
+ name: jaxlie
2
+
3
+ # Badge workflow: health of the jaxlie (Lie group) integration on main.
4
+ # The weekly cron catches breakage from upstream releases between commits.
5
+
6
+ on:
7
+ push:
8
+ branches:
9
+ - main
10
+ schedule:
11
+ - cron: '0 6 * * 1' # Weekly on Monday, offset from the Sunday examples sweep
12
+ workflow_dispatch:
13
+
14
+ jobs:
15
+ lie:
16
+ uses: ./.github/workflows/_extra.yml
17
+ with:
18
+ extra: lie
@@ -0,0 +1,18 @@
1
+ name: mjx
2
+
3
+ # Badge workflow: health of the MuJoCo MJX integration on main.
4
+ # The weekly cron catches breakage from upstream releases between commits.
5
+
6
+ on:
7
+ push:
8
+ branches:
9
+ - main
10
+ schedule:
11
+ - cron: '0 6 * * 1' # Weekly on Monday, offset from the Sunday examples sweep
12
+ workflow_dispatch:
13
+
14
+ jobs:
15
+ mjx:
16
+ uses: ./.github/workflows/_extra.yml
17
+ with:
18
+ extra: mjx
@@ -0,0 +1,16 @@
1
+ name: qpax
2
+
3
+ # Badge workflow: health of the qpax integration. Currently failing (#550) —
4
+ # cron + dispatch only while broken, so merges to main don't carry a guaranteed
5
+ # red check; add a push trigger alongside the extras-job install once fixed.
6
+
7
+ on:
8
+ schedule:
9
+ - cron: '0 6 * * 1' # Weekly on Monday, offset from the Sunday examples sweep
10
+ workflow_dispatch:
11
+
12
+ jobs:
13
+ qpax:
14
+ uses: ./.github/workflows/_extra.yml
15
+ with:
16
+ extra: qpax
@@ -0,0 +1,140 @@
1
+ name: 🧪 Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ branches:
9
+ - main
10
+ types: [opened, synchronize, reopened, ready_for_review]
11
+
12
+ jobs:
13
+ unit:
14
+ if: ${{ !github.event.pull_request.draft }}
15
+ name: Unit Tests (Python ${{ matrix.python-version }}, ${{ matrix.os }})
16
+ runs-on: ${{ matrix.os }}
17
+ timeout-minutes: 15 # Unit tests should be fast
18
+
19
+ strategy:
20
+ fail-fast: false # Continue testing other versions even if one fails
21
+ matrix:
22
+ os: [ubuntu-latest, macos-latest]
23
+ python-version: ['3.11', '3.12', '3.13', '3.14']
24
+
25
+ steps:
26
+ - name: Checkout repository
27
+ uses: actions/checkout@v4
28
+
29
+ - name: Set up Python
30
+ uses: actions/setup-python@v5
31
+ with:
32
+ python-version: ${{ matrix.python-version }}
33
+
34
+ - name: Install uv
35
+ uses: astral-sh/setup-uv@v7
36
+ with:
37
+ enable-cache: true
38
+
39
+ - name: Install dependencies
40
+ run: |
41
+ uv pip install --system -e ".[test]"
42
+
43
+ - name: Run unit tests
44
+ run: |
45
+ pytest -v -m "not e2e and not examples and not extras" --durations=10 --tb=short -n auto
46
+
47
+ - name: Upload test results on failure
48
+ if: failure()
49
+ uses: actions/upload-artifact@v4
50
+ with:
51
+ name: unit-test-results-py${{ matrix.python-version }}-${{ matrix.os }}
52
+ path: |
53
+ .pytest_cache/
54
+ test-results/
55
+ retention-days: 7
56
+
57
+ e2e:
58
+ needs: unit
59
+ name: E2E Tests (Python ${{ matrix.python-version }}, ${{ matrix.os }})
60
+ runs-on: ${{ matrix.os }}
61
+ timeout-minutes: 15
62
+
63
+ strategy:
64
+ fail-fast: false # Continue testing other versions even if one fails
65
+ matrix:
66
+ os: [ubuntu-latest, macos-latest]
67
+ python-version: ['3.11', '3.12', '3.13', '3.14']
68
+
69
+ steps:
70
+ - name: Checkout repository
71
+ uses: actions/checkout@v4
72
+
73
+ - name: Set up Python
74
+ uses: actions/setup-python@v5
75
+ with:
76
+ python-version: ${{ matrix.python-version }}
77
+
78
+ - name: Install uv
79
+ uses: astral-sh/setup-uv@v7
80
+ with:
81
+ enable-cache: true
82
+
83
+ - name: Install dependencies
84
+ run: |
85
+ uv pip install --system -e ".[test]"
86
+
87
+ - name: Run e2e tests
88
+ run: |
89
+ pytest -v -m "e2e and not extras" --durations=10 --tb=short -n auto
90
+
91
+ - name: Upload test results on failure
92
+ if: failure()
93
+ uses: actions/upload-artifact@v4
94
+ with:
95
+ name: e2e-test-results-py${{ matrix.python-version }}-${{ matrix.os }}
96
+ path: |
97
+ .pytest_cache/
98
+ test-results/
99
+ retention-days: 7
100
+
101
+ extras:
102
+ needs: unit
103
+ name: Extras Tests (Python 3.13, ubuntu-latest)
104
+ runs-on: ubuntu-latest
105
+ timeout-minutes: 15
106
+
107
+ steps:
108
+ - name: Checkout repository
109
+ uses: actions/checkout@v4
110
+
111
+ - name: Set up Python
112
+ uses: actions/setup-python@v5
113
+ with:
114
+ python-version: '3.13'
115
+
116
+ - name: Install uv
117
+ uses: astral-sh/setup-uv@v7
118
+ with:
119
+ enable-cache: true
120
+
121
+ - name: Install dependencies
122
+ run: |
123
+ # cvxpygen omitted: its extra is unsatisfiable while cvxpy is pinned <1.9
124
+ # (cvxpygen>=1.0.0 needs cvxpy>=1.9, #551); its tests skip until that resolves.
125
+ # qpax omitted until its solves are stable on Linux runners (#550).
126
+ uv pip install --system -e ".[test,mjx,lie]"
127
+
128
+ - name: Run extras tests
129
+ run: |
130
+ pytest -v -m "extras and not examples" --durations=10 --tb=short -n auto
131
+
132
+ - name: Upload test results on failure
133
+ if: failure()
134
+ uses: actions/upload-artifact@v4
135
+ with:
136
+ name: extras-test-results
137
+ path: |
138
+ .pytest_cache/
139
+ test-results/
140
+ retention-days: 7
@@ -149,18 +149,19 @@ See the `[tool.ruff]` section in `pyproject.toml` for our configuration.
149
149
 
150
150
  OpenSCvx uses `pytest` for automated testing. Tests run automatically via GitHub Actions:
151
151
 
152
- - **[tests-unit.yml](.github/workflows/tests-unit.yml)**: Runs on every PR - fast unit tests including the brachistochrone benchmark
153
- - **[tests-integration.yml](.github/workflows/tests-integration.yml)**: Runs weekly - full example problems as a smoke test
152
+ - **[tests.yml](.github/workflows/tests.yml)**: Runs on every PR - a fast `unit` job, then gated `e2e` (full SCP solves) and `extras` (optional-dependency tests) jobs
153
+ - **[tests-examples.yml](.github/workflows/tests-examples.yml)**: Runs weekly - solves every example problem as a smoke test
154
154
 
155
155
  ##### Running Tests Locally
156
156
 
157
157
  For faster feedback during development, run tests locally:
158
158
 
159
159
  ```bash
160
- pytest tests/ # All unit tests
161
- pytest tests/test_brachistochrone.py -v # Just the brachistochrone benchmark
162
- pytest -v -m "not integration" # Skip expensive integration tests
163
- pytest -v -m integration # Only integration tests (runs test_examples.py)
160
+ pytest -m "not e2e and not examples and not extras" # Fast unit tests
161
+ pytest -m "e2e and not extras" # Full SCP-solve tests
162
+ pytest -m extras # Optional-dependency tests
163
+ pytest -m examples # Solve every example (slow)
164
+ pytest tests/e2e/test_brachistochrone.py -v # Just the brachistochrone benchmark
164
165
  ```
165
166
 
166
167
  ##### Brachistochrone Problem
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev35
3
+ Version: 0.5.3.dev36
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
@@ -41,11 +41,8 @@ Provides-Extra: frax
41
41
  Requires-Dist: frax>=0.0.4; extra == "frax"
42
42
  Provides-Extra: test
43
43
  Requires-Dist: pytest; extra == "test"
44
- Requires-Dist: scipy; extra == "test"
45
- Requires-Dist: jaxlie; extra == "test"
46
- Requires-Dist: svgpathtools; extra == "test"
47
44
  Requires-Dist: pytest-xdist; extra == "test"
48
- Requires-Dist: frax>=0.0.4; extra == "test"
45
+ Requires-Dist: scipy; extra == "test"
49
46
  Dynamic: license-file
50
47
 
51
48
  <a id="readme-top"></a>
@@ -53,8 +50,8 @@ Dynamic: license-file
53
50
  <img src="figures/openscvx_logo.svg" width="1200"/>
54
51
  <p align="center">
55
52
  <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml/badge.svg"/></a>
56
- <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml/badge.svg"/></a>
57
- <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml/badge.svg"/></a>
53
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests.yml/badge.svg"/></a>
54
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-examples.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-examples.yml/badge.svg"/></a>
58
55
  <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml/badge.svg"/></a>
59
56
  <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml/badge.svg?event=release"/></a>
60
57
  </p>
@@ -253,6 +250,22 @@ This repo has the following features:
253
250
 
254
251
  <p align="right">(<a href="#readme-top">back to top</a>)</p>
255
252
 
253
+ ## Third-Party Integrations
254
+
255
+ OpenSCvx integrates with several optional third-party packages. Each installs as a pip extra (`pip install openscvx[<extra>]`); without it, the library and its tests degrade gracefully — the corresponding tests simply skip. Integrations with a badge are tested against `main` on every push and re-checked weekly against the latest upstream releases.
256
+
257
+ | Integration | Extra | Provides | Status |
258
+ | --- | --- | --- | --- |
259
+ | [MuJoCo MJX](https://mujoco.readthedocs.io/en/stable/mjx.html) | `mjx` | MJX dynamics adapter (`openscvx.integrations`) | [![mjx](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-mjx.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-mjx.yml) |
260
+ | [jaxlie](https://github.com/brentyi/jaxlie) | `lie` | SO(3)/SE(3) Lie-group operations and IK initialization | [![jaxlie](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-lie.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-lie.yml) |
261
+ | [qpax](https://github.com/qpax-solver/qpax) | `qpax` | JAX-native QP solver backend | [![qpax](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-qpax.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/issues/550) |
262
+ | [CVXPYGen](https://github.com/cvxgrp/cvxpygen) | `cvxpygen` | Generated C solver code for the convex subproblem | [![cvxpygen](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-cvxpygen.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/issues/551) |
263
+ | [moreau](https://pypi.org/project/moreau/) | `moreau` | Licensed QP solver backend | ![moreau](https://img.shields.io/badge/moreau-license%20required-lightgrey) |
264
+ | [stljax](https://github.com/UW-CTRL/stljax) | `stl` | Signal Temporal Logic robustness bridge | ![stljax](https://img.shields.io/badge/stljax-no%20tests%20yet-lightgrey) |
265
+ | [frax](https://github.com/danielpmorton/frax) | `frax` | Robot dynamics for the manipulator examples | [![frax](https://img.shields.io/badge/frax-weekly%20examples%20sweep-blue)](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-examples.yml) |
266
+
267
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
268
+
256
269
  ## Acknowledgements
257
270
 
258
271
  This work was supported by a NASA Space Technology Graduate Research Opportunity and the Office of Naval Research under grant N00014-17-1-2433. The authors would like to acknowledge Natalia Pavlasek, Fabio Spada, Samuel Buckner, Abhi Kamath, Govind Chari, and Purnanand Elango as well as the other Autonomous Controls Laboratory members, for their many helpful discussions and support throughout this work.
@@ -3,8 +3,8 @@
3
3
  <img src="figures/openscvx_logo.svg" width="1200"/>
4
4
  <p align="center">
5
5
  <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml/badge.svg"/></a>
6
- <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml/badge.svg"/></a>
7
- <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml/badge.svg"/></a>
6
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests.yml/badge.svg"/></a>
7
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-examples.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-examples.yml/badge.svg"/></a>
8
8
  <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml/badge.svg"/></a>
9
9
  <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml/badge.svg?event=release"/></a>
10
10
  </p>
@@ -203,6 +203,22 @@ This repo has the following features:
203
203
 
204
204
  <p align="right">(<a href="#readme-top">back to top</a>)</p>
205
205
 
206
+ ## Third-Party Integrations
207
+
208
+ OpenSCvx integrates with several optional third-party packages. Each installs as a pip extra (`pip install openscvx[<extra>]`); without it, the library and its tests degrade gracefully — the corresponding tests simply skip. Integrations with a badge are tested against `main` on every push and re-checked weekly against the latest upstream releases.
209
+
210
+ | Integration | Extra | Provides | Status |
211
+ | --- | --- | --- | --- |
212
+ | [MuJoCo MJX](https://mujoco.readthedocs.io/en/stable/mjx.html) | `mjx` | MJX dynamics adapter (`openscvx.integrations`) | [![mjx](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-mjx.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-mjx.yml) |
213
+ | [jaxlie](https://github.com/brentyi/jaxlie) | `lie` | SO(3)/SE(3) Lie-group operations and IK initialization | [![jaxlie](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-lie.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-lie.yml) |
214
+ | [qpax](https://github.com/qpax-solver/qpax) | `qpax` | JAX-native QP solver backend | [![qpax](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-qpax.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/issues/550) |
215
+ | [CVXPYGen](https://github.com/cvxgrp/cvxpygen) | `cvxpygen` | Generated C solver code for the convex subproblem | [![cvxpygen](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-cvxpygen.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/issues/551) |
216
+ | [moreau](https://pypi.org/project/moreau/) | `moreau` | Licensed QP solver backend | ![moreau](https://img.shields.io/badge/moreau-license%20required-lightgrey) |
217
+ | [stljax](https://github.com/UW-CTRL/stljax) | `stl` | Signal Temporal Logic robustness bridge | ![stljax](https://img.shields.io/badge/stljax-no%20tests%20yet-lightgrey) |
218
+ | [frax](https://github.com/danielpmorton/frax) | `frax` | Robot dynamics for the manipulator examples | [![frax](https://img.shields.io/badge/frax-weekly%20examples%20sweep-blue)](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-examples.yml) |
219
+
220
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
221
+
206
222
  ## Acknowledgements
207
223
 
208
224
  This work was supported by a NASA Space Technology Graduate Research Opportunity and the Office of Naval Research under grant N00014-17-1-2433. The authors would like to acknowledge Natalia Pavlasek, Fabio Spada, Samuel Buckner, Abhi Kamath, Govind Chari, and Purnanand Elango as well as the other Autonomous Controls Laboratory members, for their many helpful discussions and support throughout this work.
@@ -58,7 +58,7 @@ $$
58
58
  t_f^* = \sqrt{\frac{r}{g}} \phi_f
59
59
  $$
60
60
 
61
- Because of these advantageous properties the Brachistochrone problem is extensively leveraged as a [unit test](https://github.com/OpenSCvx/OpenSCvx/blob/main/tests/test_brachistochrone.py).
61
+ Because of these advantageous properties the Brachistochrone problem is extensively leveraged as a [unit test](https://github.com/OpenSCvx/OpenSCvx/blob/main/tests/e2e/test_brachistochrone.py).
62
62
  We would highly recommend that anyone setting out to develop some kind of optimization software do the same.
63
63
  It may not be necessary _nor_ sufficient, but a lot of things have to be working properly to solve Brachistochrone problem.
64
64
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.5.3.dev35'
22
- __version_tuple__ = version_tuple = (0, 5, 3, 'dev35')
21
+ __version__ = version = '0.5.3.dev36'
22
+ __version_tuple__ = version_tuple = (0, 5, 3, 'dev36')
23
23
 
24
- __commit_id__ = commit_id = 'g43f7b7f31'
24
+ __commit_id__ = commit_id = 'g1eddc1a14'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev35
3
+ Version: 0.5.3.dev36
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
@@ -41,11 +41,8 @@ Provides-Extra: frax
41
41
  Requires-Dist: frax>=0.0.4; extra == "frax"
42
42
  Provides-Extra: test
43
43
  Requires-Dist: pytest; extra == "test"
44
- Requires-Dist: scipy; extra == "test"
45
- Requires-Dist: jaxlie; extra == "test"
46
- Requires-Dist: svgpathtools; extra == "test"
47
44
  Requires-Dist: pytest-xdist; extra == "test"
48
- Requires-Dist: frax>=0.0.4; extra == "test"
45
+ Requires-Dist: scipy; extra == "test"
49
46
  Dynamic: license-file
50
47
 
51
48
  <a id="readme-top"></a>
@@ -53,8 +50,8 @@ Dynamic: license-file
53
50
  <img src="figures/openscvx_logo.svg" width="1200"/>
54
51
  <p align="center">
55
52
  <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml/badge.svg"/></a>
56
- <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml/badge.svg"/></a>
57
- <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml/badge.svg"/></a>
53
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests.yml/badge.svg"/></a>
54
+ <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-examples.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-examples.yml/badge.svg"/></a>
58
55
  <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml/badge.svg"/></a>
59
56
  <a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml/badge.svg?event=release"/></a>
60
57
  </p>
@@ -253,6 +250,22 @@ This repo has the following features:
253
250
 
254
251
  <p align="right">(<a href="#readme-top">back to top</a>)</p>
255
252
 
253
+ ## Third-Party Integrations
254
+
255
+ OpenSCvx integrates with several optional third-party packages. Each installs as a pip extra (`pip install openscvx[<extra>]`); without it, the library and its tests degrade gracefully — the corresponding tests simply skip. Integrations with a badge are tested against `main` on every push and re-checked weekly against the latest upstream releases.
256
+
257
+ | Integration | Extra | Provides | Status |
258
+ | --- | --- | --- | --- |
259
+ | [MuJoCo MJX](https://mujoco.readthedocs.io/en/stable/mjx.html) | `mjx` | MJX dynamics adapter (`openscvx.integrations`) | [![mjx](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-mjx.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-mjx.yml) |
260
+ | [jaxlie](https://github.com/brentyi/jaxlie) | `lie` | SO(3)/SE(3) Lie-group operations and IK initialization | [![jaxlie](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-lie.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-lie.yml) |
261
+ | [qpax](https://github.com/qpax-solver/qpax) | `qpax` | JAX-native QP solver backend | [![qpax](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-qpax.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/issues/550) |
262
+ | [CVXPYGen](https://github.com/cvxgrp/cvxpygen) | `cvxpygen` | Generated C solver code for the convex subproblem | [![cvxpygen](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-cvxpygen.yml/badge.svg?branch=main)](https://github.com/OpenSCvx/OpenSCvx/issues/551) |
263
+ | [moreau](https://pypi.org/project/moreau/) | `moreau` | Licensed QP solver backend | ![moreau](https://img.shields.io/badge/moreau-license%20required-lightgrey) |
264
+ | [stljax](https://github.com/UW-CTRL/stljax) | `stl` | Signal Temporal Logic robustness bridge | ![stljax](https://img.shields.io/badge/stljax-no%20tests%20yet-lightgrey) |
265
+ | [frax](https://github.com/danielpmorton/frax) | `frax` | Robot dynamics for the manipulator examples | [![frax](https://img.shields.io/badge/frax-weekly%20examples%20sweep-blue)](https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-examples.yml) |
266
+
267
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
268
+
256
269
  ## Acknowledgements
257
270
 
258
271
  This work was supported by a NASA Space Technology Graduate Research Opportunity and the Office of Naval Research under grant N00014-17-1-2433. The authors would like to acknowledge Natalia Pavlasek, Fabio Spada, Samuel Buckner, Abhi Kamath, Govind Chari, and Purnanand Elango as well as the other Autonomous Controls Laboratory members, for their many helpful discussions and support throughout this work.
@@ -8,14 +8,19 @@ pyproject.toml
8
8
  .github/release-drafter.yml
9
9
  .github/assets/logo.svg
10
10
  .github/workflows/_docs.yml
11
+ .github/workflows/_extra.yml
11
12
  .github/workflows/branch-name.yml
12
13
  .github/workflows/docs.yml
13
14
  .github/workflows/lint.yml
14
15
  .github/workflows/nightly.yml
15
16
  .github/workflows/release-drafter.yml
16
17
  .github/workflows/release.yml
17
- .github/workflows/tests-integration.yml
18
- .github/workflows/tests-unit.yml
18
+ .github/workflows/tests-cvxpygen.yml
19
+ .github/workflows/tests-examples.yml
20
+ .github/workflows/tests-lie.yml
21
+ .github/workflows/tests-mjx.yml
22
+ .github/workflows/tests-qpax.yml
23
+ .github/workflows/tests.yml
19
24
  docs/citation.md
20
25
  docs/examples.md
21
26
  docs/index.md
@@ -337,34 +342,23 @@ scripts/gen_example_pages.py
337
342
  scripts/gen_ref_pages.py
338
343
  scripts/mkdocs_copy_viser_client_hook.py
339
344
  tests/__init__.py
340
- tests/_marks.py
341
345
  tests/brachistochrone_analytical.py
342
346
  tests/conftest.py
343
347
  tests/hohmann_analytical.py
344
348
  tests/test_autotuning.py
345
- tests/test_brachistochrone.py
346
349
  tests/test_cvxpygen_optional.py
347
350
  tests/test_discretization.py
348
351
  tests/test_examples.py
349
352
  tests/test_expert.py
350
- tests/test_impulsive.py
351
353
  tests/test_init.py
352
354
  tests/test_integrators.py
353
355
  tests/test_loader.py
354
- tests/test_multishot_propagation.py
355
356
  tests/test_optimization_results.py
356
357
  tests/test_plotting.py
357
358
  tests/test_post_process_batched_tau_clamp.py
358
359
  tests/test_propagation.py
359
360
  tests/test_results_parameters.py
360
- tests/test_solve_batched_brachistochrone.py
361
- tests/test_solve_batched_cvxpy_export_errors.py
362
- tests/test_solve_batched_export_roundtrip.py
363
361
  tests/test_solve_batched_inference.py
364
- tests/test_solve_jax_bare_brachistochrone.py
365
- tests/test_solve_jax_jit_brachistochrone.py
366
- tests/test_solve_jax_vmap_brachistochrone.py
367
- tests/test_solve_jax_vmap_converged_no_drift.py
368
362
  tests/algorithms/__init__.py
369
363
  tests/algorithms/_iteration_helpers.py
370
364
  tests/algorithms/test_algorithm_state_pytree.py
@@ -375,8 +369,17 @@ tests/algorithms/autotuner/__init__.py
375
369
  tests/algorithms/autotuner/test_defaults_agreement.py
376
370
  tests/algorithms/autotuner/test_hyper_overrides.py
377
371
  tests/algorithms/autotuner/test_update_weights_jit.py
378
- tests/expr/__init__.py
379
- tests/expr/test_gmsr.py
372
+ tests/e2e/__init__.py
373
+ tests/e2e/test_brachistochrone.py
374
+ tests/e2e/test_impulsive.py
375
+ tests/e2e/test_multishot_propagation.py
376
+ tests/e2e/test_solve_batched_brachistochrone.py
377
+ tests/e2e/test_solve_batched_cvxpy_export_errors.py
378
+ tests/e2e/test_solve_batched_export_roundtrip.py
379
+ tests/e2e/test_solve_jax_bare_brachistochrone.py
380
+ tests/e2e/test_solve_jax_jit_brachistochrone.py
381
+ tests/e2e/test_solve_jax_vmap_brachistochrone.py
382
+ tests/e2e/test_solve_jax_vmap_converged_no_drift.py
380
383
  tests/fixtures/brachistochrone.json
381
384
  tests/fixtures/brachistochrone.yaml
382
385
  tests/integrations/__init__.py
@@ -394,6 +397,7 @@ tests/solvers/test_qpax_ptr_solver.py
394
397
  tests/solvers/test_subproblem_pytree.py
395
398
  tests/symbolic/__init__.py
396
399
  tests/symbolic/test_augmentation.py
400
+ tests/symbolic/test_gmsr.py
397
401
  tests/symbolic/test_hashing.py
398
402
  tests/symbolic/test_lower_cvxpy.py
399
403
  tests/symbolic/test_lower_jax.py
@@ -37,8 +37,5 @@ stljax
37
37
 
38
38
  [test]
39
39
  pytest
40
- scipy
41
- jaxlie
42
- svgpathtools
43
40
  pytest-xdist
44
- frax>=0.0.4
41
+ scipy