openscvx 2.dev1__tar.gz → 2.dev2__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 (348) hide show
  1. {openscvx-2.dev1/openscvx.egg-info → openscvx-2.dev2}/PKG-INFO +1 -1
  2. {openscvx-2.dev1 → openscvx-2.dev2}/examples/abstract/brachistochrone.py +13 -4
  3. {openscvx-2.dev1 → openscvx-2.dev2}/examples/rocket/6DoF_pdg.py +58 -46
  4. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/_version.py +3 -3
  5. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/penalized_trust_region.py +32 -3
  6. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/hashing.py +16 -3
  7. {openscvx-2.dev1 → openscvx-2.dev2/openscvx.egg-info}/PKG-INFO +1 -1
  8. {openscvx-2.dev1 → openscvx-2.dev2}/tests/expr/test_gmsr.py +12 -7
  9. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_stl.py +1 -1
  10. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_brachistochrone.py +5 -0
  11. {openscvx-2.dev1 → openscvx-2.dev2}/.github/assets/logo.svg +0 -0
  12. {openscvx-2.dev1 → openscvx-2.dev2}/.github/release-drafter.yml +0 -0
  13. {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/_docs.yml +0 -0
  14. {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/branch-name.yml +0 -0
  15. {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/docs.yml +0 -0
  16. {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/lint.yml +0 -0
  17. {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/nightly.yml +0 -0
  18. {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/release-drafter.yml +0 -0
  19. {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/release.yml +0 -0
  20. {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/tests-integration.yml +0 -0
  21. {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/tests-unit.yml +0 -0
  22. {openscvx-2.dev1 → openscvx-2.dev2}/.gitignore +0 -0
  23. {openscvx-2.dev1 → openscvx-2.dev2}/.gitmodules +0 -0
  24. {openscvx-2.dev1 → openscvx-2.dev2}/CONTRIBUTING.md +0 -0
  25. {openscvx-2.dev1 → openscvx-2.dev2}/LICENSE +0 -0
  26. {openscvx-2.dev1 → openscvx-2.dev2}/README.md +0 -0
  27. {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/constraint_reformulation.md +0 -0
  28. {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/control_parameterization.md +0 -0
  29. {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/discretization.md +0 -0
  30. {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/ocp.md +0 -0
  31. {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/scvx.md +0 -0
  32. {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/time_dilation.md +0 -0
  33. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UnderTheHood/lowering_architecture.md +0 -0
  34. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  35. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/00_introduction.md +0 -0
  36. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  37. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  38. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  39. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  40. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/05_visualization.md +0 -0
  41. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/06_logic.md +0 -0
  42. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/07_lie.md +0 -0
  43. {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/08_mpcc.md +0 -0
  44. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/favicon.png +0 -0
  45. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/ct-scvx_dark.png +0 -0
  46. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/ct-scvx_light.png +0 -0
  47. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/ctcs_dark.png +0 -0
  48. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/ctcs_light.png +0 -0
  49. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/problem_class_dark.png +0 -0
  50. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/problem_class_light.png +0 -0
  51. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/logo.svg +0 -0
  52. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/openscvx_logo_square.png +0 -0
  53. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/viser-client/index.html +0 -0
  54. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  55. {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  56. {openscvx-2.dev1 → openscvx-2.dev2}/docs/citation.md +0 -0
  57. {openscvx-2.dev1 → openscvx-2.dev2}/docs/examples.md +0 -0
  58. {openscvx-2.dev1 → openscvx-2.dev2}/docs/index.md +0 -0
  59. {openscvx-2.dev1 → openscvx-2.dev2}/docs/javascripts/mathjax.js +0 -0
  60. {openscvx-2.dev1 → openscvx-2.dev2}/docs/versions.json +0 -0
  61. {openscvx-2.dev1 → openscvx-2.dev2}/examples/_viser_embed_export.py +0 -0
  62. {openscvx-2.dev1 → openscvx-2.dev2}/examples/abstract/impulsive.py +0 -0
  63. {openscvx-2.dev1 → openscvx-2.dev2}/examples/abstract/stl_integer_variable.py +0 -0
  64. {openscvx-2.dev1 → openscvx-2.dev2}/examples/abstract/stl_or.py +0 -0
  65. {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/7_dof_arm.py +0 -0
  66. {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/_camera.py +0 -0
  67. {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/_render.py +0 -0
  68. {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/_sensor_view.py +0 -0
  69. {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/dr_vp_polytope.py +0 -0
  70. {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  71. {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/logo.py +0 -0
  72. {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  73. {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/3_dof_arm.py +0 -0
  74. {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/7_dof_arm.py +0 -0
  75. {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/7_dof_arm_collision.py +0 -0
  76. {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/7_dof_arm_vp.py +0 -0
  77. {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  78. {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  79. {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car.py +0 -0
  80. {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_disjoint.py +0 -0
  81. {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  82. {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_obstacle_stl.py +0 -0
  83. {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_stl_or.py +0 -0
  84. {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_waypoint_stl.py +0 -0
  85. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/cinema_vp.py +0 -0
  86. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/dr_double_integrator.py +0 -0
  87. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/dr_vp.py +0 -0
  88. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/dr_vp_nodal.py +0 -0
  89. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/dr_vp_polytope.py +0 -0
  90. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/drone_racing.py +0 -0
  91. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/logo.py +0 -0
  92. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/logo_utils/acl_logo.svg +0 -0
  93. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  94. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/obstacle_avoidance.py +0 -0
  95. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  96. {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  97. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/cartpole_mjx.py +0 -0
  98. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/double_cartpole_mjx.py +0 -0
  99. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/skydio_x2_mjx.py +0 -0
  100. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  101. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/triple_cartpole_game.py +0 -0
  102. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/triple_cartpole_mjx.py +0 -0
  103. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/double_integrator_discrete.py +0 -0
  104. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/double_integrator_drone_racing.py +0 -0
  105. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  106. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  107. {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  108. {openscvx-2.dev1 → openscvx-2.dev2}/examples/plotting.py +0 -0
  109. {openscvx-2.dev1 → openscvx-2.dev2}/examples/plotting_viser.py +0 -0
  110. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  111. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  112. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  113. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  114. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  115. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  116. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  117. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  118. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/cinema_vp_realtime.py +0 -0
  119. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/drone_racing_realtime.py +0 -0
  120. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/dubins_car_realtime.py +0 -0
  121. {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  122. {openscvx-2.dev1 → openscvx-2.dev2}/examples/rocket/3DoF_pdg.py +0 -0
  123. {openscvx-2.dev1 → openscvx-2.dev2}/examples/spacecraft/halo_orbit.py +0 -0
  124. {openscvx-2.dev1 → openscvx-2.dev2}/examples/spacecraft/hohmann_transfer.py +0 -0
  125. {openscvx-2.dev1 → openscvx-2.dev2}/examples/spacecraft/proxops_cw.py +0 -0
  126. {openscvx-2.dev1 → openscvx-2.dev2}/figures/ctlos_cine.gif +0 -0
  127. {openscvx-2.dev1 → openscvx-2.dev2}/figures/ctlos_dr.gif +0 -0
  128. {openscvx-2.dev1 → openscvx-2.dev2}/figures/dtlos_cine.gif +0 -0
  129. {openscvx-2.dev1 → openscvx-2.dev2}/figures/dtlos_dr.gif +0 -0
  130. {openscvx-2.dev1 → openscvx-2.dev2}/figures/openscvx_logo.svg +0 -0
  131. {openscvx-2.dev1 → openscvx-2.dev2}/figures/openscvx_logo_square.png +0 -0
  132. {openscvx-2.dev1 → openscvx-2.dev2}/figures/oscvx_structure_full_dark.svg +0 -0
  133. {openscvx-2.dev1 → openscvx-2.dev2}/figures/video_preview.png +0 -0
  134. {openscvx-2.dev1 → openscvx-2.dev2}/material/__init__.py +0 -0
  135. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/assets/stylesheets/custom.css +0 -0
  136. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  137. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  138. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  139. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/home.html +0 -0
  140. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/main.html +0 -0
  141. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-diagram.html +0 -0
  142. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-dropin-banner.html +0 -0
  143. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-hero.html +0 -0
  144. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-pipeline.html +0 -0
  145. {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-viser-strip.html +0 -0
  146. {openscvx-2.dev1 → openscvx-2.dev2}/mkdocs.yml +0 -0
  147. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/__init__.py +0 -0
  148. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/__main__.py +0 -0
  149. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/__init__.py +0 -0
  150. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/augmented_lagrangian.py +0 -0
  151. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/base.py +0 -0
  152. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/constant_proximal_weight.py +0 -0
  153. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/optimization_results.py +0 -0
  154. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/ramp_proximal_weight.py +0 -0
  155. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/weights.py +0 -0
  156. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/config.py +0 -0
  157. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/__init__.py +0 -0
  158. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/base.py +0 -0
  159. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/discretize_linearize.py +0 -0
  160. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/linearize_discretize.py +0 -0
  161. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  162. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  163. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  164. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  165. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/expert/__init__.py +0 -0
  166. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/expert/byof.py +0 -0
  167. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/expert/lowering.py +0 -0
  168. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/expert/validation.py +0 -0
  169. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/init/__init__.py +0 -0
  170. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/init/interpolation.py +0 -0
  171. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/init/inverse_kinematics.py +0 -0
  172. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrations/__init__.py +0 -0
  173. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrations/menagerie.py +0 -0
  174. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrations/mjx.py +0 -0
  175. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrators/__init__.py +0 -0
  176. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrators/diffrax.py +0 -0
  177. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrators/runge_kutta.py +0 -0
  178. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/loader.py +0 -0
  179. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/__init__.py +0 -0
  180. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/cvxpy_constraints.py +0 -0
  181. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/cvxpy_variables.py +0 -0
  182. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/dynamics.py +0 -0
  183. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/jax_constraints.py +0 -0
  184. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/parameters.py +0 -0
  185. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/problem.py +0 -0
  186. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/unified.py +0 -0
  187. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/__init__.py +0 -0
  188. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/plotting.py +0 -0
  189. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/scp_iteration.py +0 -0
  190. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/__init__.py +0 -0
  191. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/animated.py +0 -0
  192. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/orbits.py +0 -0
  193. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/plotly_integration.py +0 -0
  194. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/primitives.py +0 -0
  195. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/scp.py +0 -0
  196. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/server.py +0 -0
  197. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/problem.py +0 -0
  198. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/propagation/__init__.py +0 -0
  199. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/propagation/post_processing.py +0 -0
  200. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/propagation/propagation.py +0 -0
  201. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/solvers/__init__.py +0 -0
  202. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/solvers/base.py +0 -0
  203. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/solvers/ptr_solver.py +0 -0
  204. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/__init__.py +0 -0
  205. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/augmentation.py +0 -0
  206. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/builder.py +0 -0
  207. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/constraint_set.py +0 -0
  208. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/__init__.py +0 -0
  209. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/arithmetic.py +0 -0
  210. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/array.py +0 -0
  211. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/constraint.py +0 -0
  212. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/control.py +0 -0
  213. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/expr.py +0 -0
  214. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  215. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  216. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/lie/se3.py +0 -0
  217. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/lie/so3.py +0 -0
  218. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/linalg.py +0 -0
  219. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/logic.py +0 -0
  220. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/math.py +0 -0
  221. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/parameter.py +0 -0
  222. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/spatial.py +0 -0
  223. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/state.py +0 -0
  224. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/stl.py +0 -0
  225. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/stljax.py +0 -0
  226. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/time.py +0 -0
  227. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/variable.py +0 -0
  228. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/vmap.py +0 -0
  229. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lower.py +0 -0
  230. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/__init__.py +0 -0
  231. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  232. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  233. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  234. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  235. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  236. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  237. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  238. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  239. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  240. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  241. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  242. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  243. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  244. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  245. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  246. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  247. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  248. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  249. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  250. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  251. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  252. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  253. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  254. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  255. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  256. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  257. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  258. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  259. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  260. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/__init__.py +0 -0
  261. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/_registry.py +0 -0
  262. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/array.py +0 -0
  263. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/constraint.py +0 -0
  264. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/lie.py +0 -0
  265. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/linalg.py +0 -0
  266. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/logic.py +0 -0
  267. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/math.py +0 -0
  268. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/parser.py +0 -0
  269. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/spatial.py +0 -0
  270. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/stl.py +0 -0
  271. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/stljax.py +0 -0
  272. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/tokenizer.py +0 -0
  273. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/preprocessing.py +0 -0
  274. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/problem.py +0 -0
  275. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/sparsity.py +0 -0
  276. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/unified.py +0 -0
  277. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/__init__.py +0 -0
  278. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/cache.py +0 -0
  279. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/caching.py +0 -0
  280. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/printing.py +0 -0
  281. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/profiling.py +0 -0
  282. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/utils.py +0 -0
  283. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/SOURCES.txt +0 -0
  284. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/dependency_links.txt +0 -0
  285. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/entry_points.txt +0 -0
  286. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/requires.txt +0 -0
  287. {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/top_level.txt +0 -0
  288. {openscvx-2.dev1 → openscvx-2.dev2}/pyproject.toml +0 -0
  289. {openscvx-2.dev1 → openscvx-2.dev2}/scripts/gen_example_pages.py +0 -0
  290. {openscvx-2.dev1 → openscvx-2.dev2}/scripts/gen_ref_pages.py +0 -0
  291. {openscvx-2.dev1 → openscvx-2.dev2}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  292. {openscvx-2.dev1 → openscvx-2.dev2}/setup.cfg +0 -0
  293. {openscvx-2.dev1 → openscvx-2.dev2}/tests/__init__.py +0 -0
  294. {openscvx-2.dev1 → openscvx-2.dev2}/tests/brachistochrone_analytical.py +0 -0
  295. {openscvx-2.dev1 → openscvx-2.dev2}/tests/expr/__init__.py +0 -0
  296. {openscvx-2.dev1 → openscvx-2.dev2}/tests/fixtures/brachistochrone.json +0 -0
  297. {openscvx-2.dev1 → openscvx-2.dev2}/tests/fixtures/brachistochrone.yaml +0 -0
  298. {openscvx-2.dev1 → openscvx-2.dev2}/tests/hohmann_analytical.py +0 -0
  299. {openscvx-2.dev1 → openscvx-2.dev2}/tests/integrations/__init__.py +0 -0
  300. {openscvx-2.dev1 → openscvx-2.dev2}/tests/integrations/test_mjx.py +0 -0
  301. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/__init__.py +0 -0
  302. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/__init__.py +0 -0
  303. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_arithmetic.py +0 -0
  304. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_array.py +0 -0
  305. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_constraint.py +0 -0
  306. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_expr.py +0 -0
  307. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_lie.py +0 -0
  308. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_linalg.py +0 -0
  309. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_logic.py +0 -0
  310. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_math.py +0 -0
  311. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_node_reference.py +0 -0
  312. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_parameters.py +0 -0
  313. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_scaling.py +0 -0
  314. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_spatial.py +0 -0
  315. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_variable.py +0 -0
  316. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_vmap.py +0 -0
  317. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/__init__.py +0 -0
  318. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_array.py +0 -0
  319. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_constraint.py +0 -0
  320. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_lie.py +0 -0
  321. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_linalg.py +0 -0
  322. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_load.py +0 -0
  323. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_logic.py +0 -0
  324. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_math.py +0 -0
  325. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_parser.py +0 -0
  326. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_spatial.py +0 -0
  327. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_stl.py +0 -0
  328. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_tokenizer.py +0 -0
  329. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_vmap.py +0 -0
  330. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_augmentation.py +0 -0
  331. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_hashing.py +0 -0
  332. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_lower_cvxpy.py +0 -0
  333. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_lower_jax.py +0 -0
  334. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_preprocessing.py +0 -0
  335. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_sparsity.py +0 -0
  336. {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_unified.py +0 -0
  337. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_autotuning.py +0 -0
  338. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_cvxpygen_optional.py +0 -0
  339. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_discretization.py +0 -0
  340. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_examples.py +0 -0
  341. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_expert.py +0 -0
  342. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_impulsive.py +0 -0
  343. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_init.py +0 -0
  344. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_integrators.py +0 -0
  345. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_loader.py +0 -0
  346. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_optimization_results.py +0 -0
  347. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_plotting.py +0 -0
  348. {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_propagation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 2.dev1
3
+ Version: 2.dev2
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
@@ -84,16 +84,25 @@ problem = Problem(
84
84
  time=time,
85
85
  constraints=constraint_exprs,
86
86
  N=n,
87
- licq_max=1e-8,
87
+ float_dtype="float64",
88
88
  algorithm={
89
89
  "autotuner": "ConstantProximalWeight",
90
90
  "lam_prox": 1e0,
91
- "lam_cost": 1e-1,
91
+ "lam_cost": 6e-1,
92
+ # Tighter SCP stopping: reduces platform-dependent early exit vs analytical cycloid
93
+ "ep_tr": 1e-5,
94
+ "ep_vb": 1e-5,
95
+ "ep_vc": 1e-9,
96
+ },
97
+ solver={
98
+ "solver_args": {
99
+ "enforce_dpp": True,
100
+ "abstol": 1e-8,
101
+ "reltol": 1e-10,
102
+ },
92
103
  },
93
104
  )
94
105
 
95
- problem.settings.prp.dt = 0.01
96
-
97
106
  plotting_dict = {}
98
107
 
99
108
  if __name__ == "__main__":
@@ -5,10 +5,6 @@
5
5
  This example was adapted from the SCvxGEN repository by Abhi Kamath, https://scvxgen.mintlify.app/introduction.
6
6
  """
7
7
 
8
- import jax
9
-
10
- jax.config.update("jax_enable_x64", True)
11
-
12
8
  import os
13
9
  import sys
14
10
 
@@ -28,34 +24,30 @@ from openscvx import Problem
28
24
 
29
25
  n = 5
30
26
 
31
- # Runtime-updatable constants (see problem.parameters["name"] after building the problem)
32
- gI = ox.Parameter("gI", value=1.0)
33
- l_arm = ox.Parameter("l", value=0.25)
34
- J_diag = ox.Parameter(
35
- "J_diag",
36
- shape=(3,),
37
- value=np.array([0.168 * 2e-2, 0.168, 0.168]),
38
- )
27
+ # Fixed physical and scenario constants
28
+ gI = 1.0
29
+ l_arm = 0.25
30
+ J_diag = np.array([0.168 * 2e-2, 0.168, 0.168])
39
31
  J_mat = ox.Diag(J_diag)
40
32
  J_inv_mat = ox.Inv(ox.Diag(J_diag))
41
- g0 = ox.Parameter("g0", value=1.0)
42
- Isp = ox.Parameter("Isp", value=30.0)
43
- m_dry = ox.Parameter("m_dry", value=1.0)
44
- v_max = ox.Parameter("v_max", value=3.0)
45
- w_max = ox.Parameter("w_max", value=0.3752)
46
- del_max = ox.Parameter("del_max", value=20.0)
47
- theta_max = ox.Parameter("theta_max", value=75.0)
48
- T_min = ox.Parameter("T_min", value=1.5)
49
- T_max = ox.Parameter("T_max", value=6.5)
50
- gamma = ox.Parameter("gamma", value=75.0)
51
- beta = ox.Parameter("beta", value=0.01)
52
- c_ax = ox.Parameter("c_ax", value=0.5)
53
- c_ayz = ox.Parameter("c_ayz", value=1.0)
54
- S_a = ox.Parameter("S_a", value=0.5)
55
- rho = ox.Parameter("rho", value=1.0)
56
- l_p = ox.Parameter("l_p", value=0.05)
57
- initial_position = ox.Parameter("initial_position", shape=(3,), value=np.array([7.5, 4.5, 2.5]))
58
- final_position = ox.Parameter("final_position", shape=(2,), value=np.array([0.0, 0.0]))
33
+ g0 = 1.0
34
+ Isp = 30.0
35
+ m_dry = 1.0
36
+ v_max = 3.0
37
+ w_max = 0.3752
38
+ del_max = 20.0
39
+ theta_max = 75.0
40
+ T_min = 1.5
41
+ T_max = 6.5
42
+ gamma = 75.0
43
+ beta = 0.01
44
+ c_ax = 0.5
45
+ c_ayz = 1.0
46
+ S_a = 0.5
47
+ rho = 1.0
48
+ l_p = 0.05
49
+ initial_position = np.array([7.5, 4.5, 2.5])
50
+ final_position = np.array([0.0, 0.0])
59
51
 
60
52
  # Concat (not Stack): JAX lowering stacks scalars as (3,1); Diag needs a length-3 vector (3,).
61
53
  CA = ox.Diag(ox.Concat(c_ax, c_ayz, c_ayz))
@@ -72,15 +64,15 @@ position = ox.State("position", shape=(3,))
72
64
  position.max = [10.0, 10.0, 10.0]
73
65
  position.min = [-10.0, -10.0, -10.0]
74
66
  position.initial = [
75
- ox.Free(float(initial_position.value[0])),
76
- ox.Free(float(initial_position.value[1])),
77
- ox.Free(float(initial_position.value[2])),
67
+ ox.Free(float(initial_position[0])),
68
+ ox.Free(float(initial_position[1])),
69
+ ox.Free(float(initial_position[2])),
78
70
  ]
79
71
  position.final = [ox.Free(0.0), ox.Free(0.0), 0.0]
80
72
 
81
73
  velocity = ox.State("velocity", shape=(3,))
82
- velocity.max = [v_max.value, v_max.value, v_max.value]
83
- velocity.min = [-v_max.value, -v_max.value, -v_max.value]
74
+ velocity.max = [v_max, v_max, v_max]
75
+ velocity.min = [-v_max, -v_max, -v_max]
84
76
  velocity.initial = [-0.5, -2.8, 0.0]
85
77
  velocity.final = [-0.1, 0.0, 0.0]
86
78
 
@@ -91,17 +83,17 @@ attitude.initial = [ox.Free(0.0), ox.Free(0.0), ox.Free(0.0), ox.Free(1.0)]
91
83
  attitude.final = [0.0, 0.0, 0.0, 1.0]
92
84
 
93
85
  angular_velocity = ox.State("angular_velocity", shape=(3,))
94
- angular_velocity.max = [w_max.value, w_max.value, w_max.value]
95
- angular_velocity.min = [-w_max.value, -w_max.value, -w_max.value]
86
+ angular_velocity.max = [w_max, w_max, w_max]
87
+ angular_velocity.min = [-w_max, -w_max, -w_max]
96
88
  angular_velocity.initial = [1e-8, 0.0, 0.0]
97
89
  angular_velocity.final = [1e-8, 0.0, 0.0]
98
90
 
99
91
  thrust = ox.Control("thrust", shape=(3,))
100
- thrust.max = [T_max.value, T_max.value, T_max.value]
101
- thrust.min = [-T_max.value, -T_max.value, -T_max.value]
92
+ thrust.max = [T_max, T_max, T_max]
93
+ thrust.min = [-T_max, -T_max, -T_max]
102
94
  thrust.guess = np.linspace(
103
- np.array([gI.value * mass.initial[0], 0, 0]),
104
- np.array([gI.value * m_dry.value, 0, 0]),
95
+ np.array([gI * mass.initial[0], 0, 0]),
96
+ np.array([gI * m_dry, 0, 0]),
105
97
  n,
106
98
  ).reshape(-1, 3)
107
99
 
@@ -169,15 +161,26 @@ constraint_exprs.append((position[0:2] == final_position).convex().at([n - 1]))
169
161
 
170
162
  constraint_exprs.append(ox.ctcs(1.0 * (mass - m_dry) >= 0))
171
163
  constraint_exprs.append(
172
- ox.ctcs(0.1 * ox.linalg.Norm(position[1:]) - ox.Tan(gamma * np.pi / 180.0) * position[0] <= 0)
164
+ ox.ctcs(
165
+ 0.1 * ox.linalg.Norm(position[1:])
166
+ - ox.Tan(ox.Constant(np.array(gamma * np.pi / 180.0))) * position[0]
167
+ <= 0
168
+ )
173
169
  )
174
170
  constraint_exprs.append(ox.ctcs(0.1 * ox.linalg.Norm(velocity) ** 2 - v_max**2 <= 0))
175
171
  constraint_exprs.append(
176
- ox.ctcs(1.0 * ox.Cos(theta_max * np.pi / 180.0) - 1.0 + 2.0 * (q2**2 + q3**2) <= 0)
172
+ ox.ctcs(
173
+ 1.0 * ox.Cos(ox.Constant(np.array(theta_max * np.pi / 180.0))) - 1.0 + 2.0 * (q2**2 + q3**2)
174
+ <= 0
175
+ )
177
176
  )
178
177
  constraint_exprs.append(ox.ctcs(1.0 * ox.linalg.Norm(angular_velocity) ** 2 - w_max**2 <= 0))
179
178
  constraint_exprs.append(
180
- ox.ctcs(0.1 * ox.linalg.Norm(thrust) - thrust[0] / ox.Cos(del_max * np.pi / 180.0) <= 0)
179
+ ox.ctcs(
180
+ 0.1 * ox.linalg.Norm(thrust)
181
+ - thrust[0] / ox.Cos(ox.Constant(np.array(del_max * np.pi / 180.0)))
182
+ <= 0
183
+ )
181
184
  )
182
185
  constraint_exprs.append(ox.ctcs(0.1 * ox.linalg.Norm(thrust) ** 2 - T_max**2 <= 0))
183
186
  constraint_exprs.append(ox.ctcs(0.1 * T_min**2 - ox.linalg.Norm(thrust) ** 2 <= 0))
@@ -194,6 +197,8 @@ time = ox.Time(
194
197
  time_dilation_max=2.0 * t_final_guess,
195
198
  )
196
199
 
200
+ import diffrax as dfx # noqa: F401
201
+
197
202
  problem = Problem(
198
203
  N=n,
199
204
  states=states,
@@ -210,10 +215,17 @@ problem = Problem(
210
215
  "ep_tr": 5e-3,
211
216
  "ep_vc": 1e-6,
212
217
  },
218
+ discretizer={
219
+ "diffrax_kwargs": {"stepsize_controller": dfx.StepTo(np.linspace(0.0, 1 / (n - 1), 3))}
220
+ },
221
+ solver={
222
+ "cvxpygen": True,
223
+ "cvx_solver": "qocogen",
224
+ "solver_args": {},
225
+ },
213
226
  )
214
227
 
215
- problem.solver.solver_args = {"abstol": 1e-7, "reltol": 1e-7}
216
-
228
+ problem.settings.dev.printing = False
217
229
 
218
230
  if __name__ == "__main__":
219
231
  problem.initialize()
@@ -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 = '2.dev1'
22
- __version_tuple__ = version_tuple = (2, 'dev1')
21
+ __version__ = version = '2.dev2'
22
+ __version_tuple__ = version_tuple = (2, 'dev2')
23
23
 
24
- __commit_id__ = commit_id = 'gff775344e'
24
+ __commit_id__ = commit_id = 'gbe5a1b946'
@@ -6,8 +6,9 @@ optimization problems through iterative convex approximation.
6
6
 
7
7
  import time
8
8
  import warnings
9
- from typing import TYPE_CHECKING, Callable, Dict, List, Union
9
+ from typing import TYPE_CHECKING, Callable, Dict, List, Tuple, Union
10
10
 
11
+ import jax
11
12
  import numpy as np
12
13
  import numpy.linalg as la
13
14
 
@@ -188,6 +189,11 @@ class PenalizedTrustRegion(Algorithm):
188
189
  return solver.call(*args)
189
190
  return solver(*args)
190
191
 
192
+ @staticmethod
193
+ def _block_until_ready_outputs(outputs: Tuple[object, ...]) -> None:
194
+ """Finish any pending XLA work from discretization exports (warm-up helper)."""
195
+ jax.block_until_ready(outputs)
196
+
191
197
  def _recover_prior_node_from_initial(
192
198
  self,
193
199
  settings: Config,
@@ -286,7 +292,8 @@ class PenalizedTrustRegion(Algorithm):
286
292
  """Initialize PTR algorithm.
287
293
 
288
294
  Stores compiled infrastructure and performs a warm-start solve to
289
- initialize DPP and JAX jacobians.
295
+ initialize DPP and JAX jacobians. Also runs post-subproblem discretization
296
+ on the throwaway CVX solution so XLA/export caches match the first ``step()``.
290
297
 
291
298
  Args:
292
299
  solver: Convex subproblem solver (e.g., CVXPySolver)
@@ -333,7 +340,29 @@ class PenalizedTrustRegion(Algorithm):
333
340
  params,
334
341
  )
335
342
  init_state.add_impulsive_discretization(W_multi_shoot.__array__())
336
- _ = self._subproblem(params, init_state, settings)
343
+ (x_sol, u_sol, *_) = self._subproblem(params, init_state, settings)
344
+
345
+ # Prime the same exported discretization calls used after every subproblem in
346
+ # step() (candidate trajectory). initialize() previously only discretized the
347
+ # initial guess, so the first step() in solve() could still hit an XLA cache_miss
348
+ # on post-CVX (x_sol, u_sol). Running that path here moves compilation into init.
349
+ cont_out = self._invoke_solver(
350
+ self._discretization_solver, x_sol, u_sol.astype(float), params
351
+ )
352
+ x_prop_c = cont_out[3]
353
+ u_candidate = u_sol.astype(float)
354
+ x0_prior_c = self._recover_prior_node_from_initial(settings, x_sol[0])
355
+ x_nodes_prior_c = np.vstack((x0_prior_c, np.asarray(x_prop_c)))
356
+ if self._discretization_solver_impulsive is not None:
357
+ imp_out = self._invoke_solver(
358
+ self._discretization_solver_impulsive,
359
+ x_nodes_prior_c,
360
+ u_candidate,
361
+ params,
362
+ )
363
+ self._block_until_ready_outputs(cont_out + imp_out)
364
+ else:
365
+ self._block_until_ready_outputs(cont_out)
337
366
 
338
367
  def step(
339
368
  self,
@@ -9,16 +9,29 @@ the same structure, the cached compiled artifacts can be reused.
9
9
  """
10
10
 
11
11
  import hashlib
12
+ from importlib.metadata import PackageNotFoundError, version
12
13
  from typing import TYPE_CHECKING
13
14
 
14
15
  import numpy as np
15
16
 
16
- from openscvx._version import __version__
17
-
18
17
  if TYPE_CHECKING:
19
18
  from openscvx.symbolic.problem import SymbolicProblem
20
19
 
21
20
 
21
+ def _openscvx_version() -> str:
22
+ """Package version for cache invalidation; works without generated _version.py."""
23
+ try:
24
+ return version("openscvx")
25
+ except PackageNotFoundError:
26
+ pass
27
+ try:
28
+ from openscvx._version import __version__ as v
29
+
30
+ return v
31
+ except ImportError:
32
+ return "0.0.0"
33
+
34
+
22
35
  def hash_symbolic_problem(problem: "SymbolicProblem") -> str:
23
36
  """Compute a structural hash of a symbolic optimization problem.
24
37
 
@@ -47,7 +60,7 @@ def hash_symbolic_problem(problem: "SymbolicProblem") -> str:
47
60
  hasher = hashlib.sha256()
48
61
 
49
62
  # Include library version to invalidate cache on version changes
50
- hasher.update(f"openscvx:{__version__}:".encode())
63
+ hasher.update(f"openscvx:{_openscvx_version()}:".encode())
51
64
 
52
65
  # Hash the dynamics
53
66
  hasher.update(b"dynamics:")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 2.dev1
3
+ Version: 2.dev2
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
@@ -11,19 +11,24 @@ Each function is tested for:
11
11
  """
12
12
 
13
13
  import jax
14
- import jax.numpy as jnp
15
- import pytest
16
14
 
17
- from openscvx.symbolic.lowerers.jax.stl import (
15
+ # Use float64 for more accurate tests; JAX must be configured before jnp.
16
+ jax.config.update("jax_enable_x64", True)
17
+ # isort: off
18
+ import jax.numpy as jnp # noqa: E402
19
+ import pytest # noqa: E402
20
+
21
+ from openscvx.symbolic.lowerers.jax.stl import ( # noqa: E402
18
22
  AND,
19
23
  OR,
20
24
  AND_lite,
21
25
  OR_lite,
22
26
  _smooth_equality,
23
27
  integer_variable,
28
+ gmsr_IfThen as IfThen,
29
+ gmsr_IfThen_lite as IfThen_lite,
24
30
  )
25
- from openscvx.symbolic.lowerers.jax.stl import gmsr_IfThen as IfThen
26
- from openscvx.symbolic.lowerers.jax.stl import gmsr_IfThen_lite as IfThen_lite
31
+ # isort: on
27
32
 
28
33
  # =============================================================================
29
34
  # Helpers
@@ -294,11 +299,11 @@ class TestORLite:
294
299
  # OR_lite = 0 iff all y_i ≤ 0
295
300
  y = jnp.array([-1.0, -0.5])
296
301
  val = float(OR_lite(y, c=C))
297
- assert val == pytest.approx(0.0, abs=1e-3)
302
+ assert val == pytest.approx(0.0, abs=1e-17)
298
303
 
299
304
  def test_positive_when_any_positive(self):
300
305
  y = jnp.array([0.5, -1.0])
301
- assert float(OR_lite(y, c=C)) == pytest.approx(0.0, abs=1e-3)
306
+ assert float(OR_lite(y, c=C)) == pytest.approx(0.0, abs=1e-17)
302
307
 
303
308
  def test_larger_positive_means_more_violated(self):
304
309
  y_small = jnp.array([0.1, 10.0])
@@ -470,7 +470,7 @@ def test_or_jax_lite_variant():
470
470
  fn = _lower_stl(Or(p1, p2, lite=True))
471
471
  # lite variant: satisfied when at least one predicate satisfied
472
472
  x_ok = jnp.array([0.5, 3.0])
473
- assert float(fn(x_ok, None, None, None)) >= 0.0
473
+ assert float(fn(x_ok, None, None, None)) >= -1e-17
474
474
 
475
475
 
476
476
  # =============================================================================
@@ -93,6 +93,11 @@ def test_example():
93
93
  """
94
94
  from examples.abstract.brachistochrone import problem
95
95
 
96
+ # Dense output grid + tight IVP tolerances for trajectory vs analytical validation
97
+ problem.settings.prp.dt = 0.005
98
+ problem.settings.prp.atol = 1e-8
99
+ problem.settings.prp.rtol = 1e-10
100
+
96
101
  # Disable printing for cleaner test output
97
102
  if hasattr(problem.settings, "dev"):
98
103
  problem.settings.dev.printing = False
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes