openscvx 0.5.3.dev58__tar.gz → 0.5.3.dev59__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 (538) hide show
  1. {openscvx-0.5.3.dev58/openscvx.egg-info → openscvx-0.5.3.dev59}/PKG-INFO +1 -1
  2. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/let_transfer.py +32 -27
  3. openscvx-0.5.3.dev59/examples/spacecraft/low_thrust_transfer.py +569 -0
  4. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/_version.py +3 -3
  5. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59/openscvx.egg-info}/PKG-INFO +1 -1
  6. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/SOURCES.txt +1 -0
  7. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/scm_file_list.json +1 -0
  8. openscvx-0.5.3.dev59/openscvx.egg-info/scm_version.json +8 -0
  9. openscvx-0.5.3.dev58/openscvx.egg-info/scm_version.json +0 -8
  10. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/assets/logo.svg +0 -0
  11. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/release-drafter.yml +0 -0
  12. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/_docs.yml +0 -0
  13. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/_extra.yml +0 -0
  14. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/branch-name.yml +0 -0
  15. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/docs.yml +0 -0
  16. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/lint.yml +0 -0
  17. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/nightly.yml +0 -0
  18. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/release-drafter.yml +0 -0
  19. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/release.yml +0 -0
  20. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-cvxpygen.yml +0 -0
  21. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-examples.yml +0 -0
  22. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-lie.yml +0 -0
  23. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-mjx.yml +0 -0
  24. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-moreau.yml +0 -0
  25. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests-qpax.yml +0 -0
  26. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.github/workflows/tests.yml +0 -0
  27. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.gitignore +0 -0
  28. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/.gitmodules +0 -0
  29. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/CITATION.cff +0 -0
  30. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/CONTRIBUTING.md +0 -0
  31. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/LICENSE +0 -0
  32. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/README.md +0 -0
  33. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/constraint_reformulation.md +0 -0
  34. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/control_parameterization.md +0 -0
  35. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/discretization.md +0 -0
  36. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/ocp.md +0 -0
  37. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/scvx.md +0 -0
  38. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/Foundations/time_dilation.md +0 -0
  39. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UnderTheHood/batching_jit_grad.md +0 -0
  40. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UnderTheHood/custom_algorithms_autotuners.md +0 -0
  41. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UnderTheHood/lowering_architecture.md +0 -0
  42. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  43. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/00_introduction.md +0 -0
  44. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  45. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  46. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  47. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  48. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/05_visualization.md +0 -0
  49. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/06_logic.md +0 -0
  50. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/07_lie.md +0 -0
  51. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/08_mpcc.md +0 -0
  52. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
  53. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/favicon.png +0 -0
  54. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/ct-scvx_dark.png +0 -0
  55. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/ct-scvx_light.png +0 -0
  56. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/ctcs_dark.png +0 -0
  57. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/ctcs_light.png +0 -0
  58. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/problem_class_dark.png +0 -0
  59. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/images/problem_class_light.png +0 -0
  60. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/logo.svg +0 -0
  61. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/openscvx_logo_square.png +0 -0
  62. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/viser-client/index.html +0 -0
  63. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  64. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  65. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/changelog.md +0 -0
  66. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/citation.md +0 -0
  67. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/examples.md +0 -0
  68. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/index.md +0 -0
  69. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/installation.md +0 -0
  70. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/javascripts/mathjax.js +0 -0
  71. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/llms.txt +0 -0
  72. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/docs/versions.json +0 -0
  73. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/_maze.py +0 -0
  74. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/_maze_viz.py +0 -0
  75. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/_viser_embed_export.py +0 -0
  76. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/brachistochrone.py +0 -0
  77. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/brachistochrone_batched.py +0 -0
  78. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/chen_allgoewer.py +0 -0
  79. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/flappy_bird.py +0 -0
  80. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/hypersensitive.py +0 -0
  81. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/impulsive.py +0 -0
  82. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/stl_integer_variable.py +0 -0
  83. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/abstract/stl_or.py +0 -0
  84. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/aircraft/dynamic_soaring.py +0 -0
  85. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/aircraft/supersonic_time_to_climb.py +0 -0
  86. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/7_dof_arm.py +0 -0
  87. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/_camera.py +0 -0
  88. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/_render.py +0 -0
  89. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/_sensor_view.py +0 -0
  90. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/dr_vp_polytope.py +0 -0
  91. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  92. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/logo.py +0 -0
  93. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  94. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/animations/senss_hop_lidar_camera.py +0 -0
  95. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/3_dof_arm.py +0 -0
  96. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/7_dof_arm.py +0 -0
  97. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/7_dof_arm_collision.py +0 -0
  98. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/7_dof_arm_vp.py +0 -0
  99. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  100. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  101. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/arm/franka_fr3v2_viewplanning_nodal.py +0 -0
  102. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car.py +0 -0
  103. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_disjoint.py +0 -0
  104. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  105. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_obstacle_stl.py +0 -0
  106. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_stl_or.py +0 -0
  107. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/dubins_car_waypoint_stl.py +0 -0
  108. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_plotting.py +0 -0
  109. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_time2spatial.py +0 -0
  110. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_tracks/LMS_Track.txt +0 -0
  111. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_tracks/LMS_Track_x4.txt +0 -0
  112. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_tracks/readDataFcn.py +0 -0
  113. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/_viser.py +0 -0
  114. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_hybrid.py +0 -0
  115. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_ice.py +0 -0
  116. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_mpc.py +0 -0
  117. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_multi_agent.py +0 -0
  118. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_multi_agent_mpcc.py +0 -0
  119. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_multi_agent_mpcc_ice.py +0 -0
  120. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/car/racing/race_car_openscvx.py +0 -0
  121. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/_plotting.py +0 -0
  122. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/double_integrator_static.py +0 -0
  123. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/maze_rrt_scp.py +0 -0
  124. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/moving_safe_zones.py +0 -0
  125. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/multiphase_velocity.py +0 -0
  126. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/obstacle_avoidance_vmap.py +0 -0
  127. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/double_integrator/obstacle_avoidance_vmap_2d.py +0 -0
  128. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/_plotting.py +0 -0
  129. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/_terrain.py +0 -0
  130. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/boresight_trace_mpcc.py +0 -0
  131. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/cinema_vp.py +0 -0
  132. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/cinema_vp_nodal.py +0 -0
  133. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/dr_vp.py +0 -0
  134. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/dr_vp_nodal.py +0 -0
  135. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/dr_vp_polytope.py +0 -0
  136. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/drone_racing.py +0 -0
  137. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/drone_racing_batched_gates.py +0 -0
  138. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo.py +0 -0
  139. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/acl_logo.svg +0 -0
  140. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/circle.svg +0 -0
  141. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/openscvx_logo_single.svg +0 -0
  142. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/quadrotor_mesh.py +0 -0
  143. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  144. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/lunar_terrain_agl.py +0 -0
  145. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/maze_scp.py +0 -0
  146. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/moving_safe_columns.py +0 -0
  147. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/obstacle_avoidance.py +0 -0
  148. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  149. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/openscvx_logo.py +0 -0
  150. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/quadrotor_hector.py +0 -0
  151. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/drone/quadrotor_zigzag.py +0 -0
  152. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/panda_frax.py +0 -0
  153. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/panda_frax_pick_place.py +0 -0
  154. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/panda_frax_viewplanning.py +0 -0
  155. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/panda_frax_waypoint.py +0 -0
  156. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/ur5e_assets/ur5e.urdf +0 -0
  157. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/ur5e_pen_trace.py +0 -0
  158. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/frax/ur5e_pen_trace_mpcc.py +0 -0
  159. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/cartpole_mjx.py +0 -0
  160. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/double_cartpole_mjx.py +0 -0
  161. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/skydio_x2_mjx.py +0 -0
  162. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  163. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/triple_cartpole_game.py +0 -0
  164. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mjx/triple_cartpole_mjx.py +0 -0
  165. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/double_integrator_discrete.py +0 -0
  166. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/double_integrator_drone_racing.py +0 -0
  167. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  168. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  169. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  170. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/multi_agent/ilqgames_three_agent.py +0 -0
  171. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/multi_agent/ilqgames_three_agent_lqr.py +0 -0
  172. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/multi_agent/multi_agent_circle_swap.py +0 -0
  173. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/pendulum/pendulum_swingup_ocp.py +0 -0
  174. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/plotting.py +0 -0
  175. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/plotting_viser.py +0 -0
  176. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  177. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  178. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  179. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  180. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  181. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  182. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  183. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  184. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/cinema_vp_realtime.py +0 -0
  185. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/drone_racing_realtime.py +0 -0
  186. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/dubins_car_realtime.py +0 -0
  187. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  188. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/3DoF_pdg.py +0 -0
  189. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/6DoF_pdg.py +0 -0
  190. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/6DoF_pdg_batched_ic.py +0 -0
  191. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/6DoF_pdg_stc.py +0 -0
  192. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/6DoF_pdg_stc_ifthen.py +0 -0
  193. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/_cstc_plotting.py +0 -0
  194. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/ascent_launch_vehicle.py +0 -0
  195. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/reusable_launch_vehicle.py +0 -0
  196. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/rocket_ilqr.py +0 -0
  197. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_dem.py +0 -0
  198. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_dem_static.py +0 -0
  199. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss.py +0 -0
  200. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss_gimbal.py +0 -0
  201. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss_gimbal_hop.py +0 -0
  202. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss_hop.py +0 -0
  203. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/6DoF_pdg_stc_senss_planar.py +0 -0
  204. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_dem.py +0 -0
  205. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_halo/__init__.py +0 -0
  206. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_halo/dem.py +0 -0
  207. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_halo/lidar.py +0 -0
  208. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/_hop_lidar_overlay.py +0 -0
  209. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/rocket/senss/senss_dem.png +0 -0
  210. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/scaling/scaling_study.py +0 -0
  211. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone.bin +0 -0
  212. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone.gltf +0 -0
  213. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_albedo.jpg +0 -0
  214. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_ao.jpg +0 -0
  215. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_normals.png +0 -0
  216. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_pbr_jpg.jpg +0 -0
  217. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/capstone_plot_mesh.npz +0 -0
  218. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/capstone/foil_normal.jpg +0 -0
  219. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/dual_deputy_inspection_cw.py +0 -0
  220. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/halo_orbit.py +0 -0
  221. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/hohmann_transfer.py +0 -0
  222. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/proxops_cw.py +0 -0
  223. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/examples/spacecraft/relative_loitering.py +0 -0
  224. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/ctlos_cine.gif +0 -0
  225. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/ctlos_dr.gif +0 -0
  226. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/dtlos_cine.gif +0 -0
  227. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/dtlos_dr.gif +0 -0
  228. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/openscvx_logo.svg +0 -0
  229. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/openscvx_logo_square.png +0 -0
  230. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/oscvx_structure_full_dark.svg +0 -0
  231. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/figures/video_preview.png +0 -0
  232. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/__init__.py +0 -0
  233. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/assets/stylesheets/custom.css +0 -0
  234. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  235. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  236. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  237. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/home.html +0 -0
  238. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/main.html +0 -0
  239. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-diagram.html +0 -0
  240. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-dropin-banner.html +0 -0
  241. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-hero.html +0 -0
  242. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-pipeline.html +0 -0
  243. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/partials/home-viser-strip.html +0 -0
  244. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/material/overrides/sitemap.xml +0 -0
  245. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/mkdocs.yml +0 -0
  246. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/__init__.py +0 -0
  247. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/__main__.py +0 -0
  248. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/__init__.py +0 -0
  249. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/__init__.py +0 -0
  250. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/acceptance_ratio.py +0 -0
  251. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  252. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
  253. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/base.py +0 -0
  254. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  255. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  256. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/base.py +0 -0
  257. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/history.py +0 -0
  258. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/hyperparams.py +0 -0
  259. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/loop.py +0 -0
  260. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/optimization_results.py +0 -0
  261. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/penalty.py +0 -0
  262. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/scvx/__init__.py +0 -0
  263. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/scvx/iteration.py +0 -0
  264. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
  265. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/state.py +0 -0
  266. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/algorithms/weights.py +0 -0
  267. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/config.py +0 -0
  268. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/__init__.py +0 -0
  269. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/base.py +0 -0
  270. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/discretize_linearize.py +0 -0
  271. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/linearize_discretize.py +0 -0
  272. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  273. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  274. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  275. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  276. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/expert/__init__.py +0 -0
  277. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/expert/byof.py +0 -0
  278. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/expert/lowering.py +0 -0
  279. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/expert/validation.py +0 -0
  280. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/init/__init__.py +0 -0
  281. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/init/interpolation.py +0 -0
  282. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/init/inverse_kinematics.py +0 -0
  283. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/__init__.py +0 -0
  284. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/_utils.py +0 -0
  285. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/base.py +0 -0
  286. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/frax.py +0 -0
  287. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/menagerie.py +0 -0
  288. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrations/mjx.py +0 -0
  289. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrators/__init__.py +0 -0
  290. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrators/diffrax.py +0 -0
  291. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/integrators/runge_kutta.py +0 -0
  292. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/loader.py +0 -0
  293. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/__init__.py +0 -0
  294. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/cvxpy_constraints.py +0 -0
  295. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/cvxpy_variables.py +0 -0
  296. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/dynamics.py +0 -0
  297. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/jax_constraints.py +0 -0
  298. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/parameters.py +0 -0
  299. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/problem.py +0 -0
  300. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/lowered/unified.py +0 -0
  301. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/__init__.py +0 -0
  302. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/_deps.py +0 -0
  303. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/plotting.py +0 -0
  304. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/publication.py +0 -0
  305. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/scp_iteration.py +0 -0
  306. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/__init__.py +0 -0
  307. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/animated.py +0 -0
  308. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/coordinates.py +0 -0
  309. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/orbits.py +0 -0
  310. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/plotly_integration.py +0 -0
  311. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/primitives.py +0 -0
  312. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/scp.py +0 -0
  313. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/plotting/viser/server.py +0 -0
  314. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/problem.py +0 -0
  315. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/propagation/__init__.py +0 -0
  316. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/propagation/post_processing.py +0 -0
  317. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/propagation/propagation.py +0 -0
  318. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/__init__.py +0 -0
  319. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/base.py +0 -0
  320. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/cones.py +0 -0
  321. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
  322. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/moreau_ptr_solver.py +0 -0
  323. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/ptr_solver.py +0 -0
  324. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/solvers/qpax_ptr_solver.py +0 -0
  325. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/__init__.py +0 -0
  326. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/affine.py +0 -0
  327. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/augmentation.py +0 -0
  328. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/builder.py +0 -0
  329. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/canonicalize.py +0 -0
  330. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/constraint_set.py +0 -0
  331. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/__init__.py +0 -0
  332. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/arithmetic.py +0 -0
  333. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/array.py +0 -0
  334. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/autodiff.py +0 -0
  335. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/constraint.py +0 -0
  336. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/control.py +0 -0
  337. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/expr.py +0 -0
  338. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  339. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/_citations.py +0 -0
  340. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  341. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/se3.py +0 -0
  342. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/lie/so3.py +0 -0
  343. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/linalg.py +0 -0
  344. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/logic.py +0 -0
  345. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/math.py +0 -0
  346. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/parameter.py +0 -0
  347. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/spatial.py +0 -0
  348. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/state.py +0 -0
  349. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/stl.py +0 -0
  350. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/stljax.py +0 -0
  351. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/time.py +0 -0
  352. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/variable.py +0 -0
  353. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/expr/vmap.py +0 -0
  354. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/hashing.py +0 -0
  355. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lower.py +0 -0
  356. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/__init__.py +0 -0
  357. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  358. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  359. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  360. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  361. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  362. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/autodiff.py +0 -0
  363. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  364. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  365. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  366. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  367. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  368. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  369. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  370. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  371. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  372. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  373. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  374. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  375. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/autodiff.py +0 -0
  376. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  377. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  378. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  379. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  380. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  381. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  382. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  383. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  384. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  385. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  386. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  387. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  388. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/__init__.py +0 -0
  389. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/_lowerer.py +0 -0
  390. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/_registry.py +0 -0
  391. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/arithmetic.py +0 -0
  392. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/array.py +0 -0
  393. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/autodiff.py +0 -0
  394. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/constraint.py +0 -0
  395. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/control.py +0 -0
  396. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/expr.py +0 -0
  397. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/formulation.py +0 -0
  398. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/lie.py +0 -0
  399. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/linalg.py +0 -0
  400. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/logic.py +0 -0
  401. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/math.py +0 -0
  402. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/spatial.py +0 -0
  403. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/state.py +0 -0
  404. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/stl.py +0 -0
  405. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/lowerers/latex/vmap.py +0 -0
  406. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/__init__.py +0 -0
  407. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/_registry.py +0 -0
  408. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/array.py +0 -0
  409. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/constraint.py +0 -0
  410. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/lie.py +0 -0
  411. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/linalg.py +0 -0
  412. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/logic.py +0 -0
  413. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/math.py +0 -0
  414. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/parser.py +0 -0
  415. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/spatial.py +0 -0
  416. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/stl.py +0 -0
  417. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/stljax.py +0 -0
  418. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/parser/tokenizer.py +0 -0
  419. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/preprocessing.py +0 -0
  420. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/problem.py +0 -0
  421. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/sparsity.py +0 -0
  422. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/symbolic/unified.py +0 -0
  423. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/__init__.py +0 -0
  424. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/cache.py +0 -0
  425. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/caching.py +0 -0
  426. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/printing.py +0 -0
  427. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/profiling.py +0 -0
  428. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx/utils/utils.py +0 -0
  429. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/dependency_links.txt +0 -0
  430. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/entry_points.txt +0 -0
  431. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/requires.txt +0 -0
  432. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/openscvx.egg-info/top_level.txt +0 -0
  433. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/pyproject.toml +0 -0
  434. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/scripts/gen_example_pages.py +0 -0
  435. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/scripts/gen_ref_pages.py +0 -0
  436. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  437. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/scripts/mkdocs_seo_hook.py +0 -0
  438. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/setup.cfg +0 -0
  439. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/__init__.py +0 -0
  440. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/__init__.py +0 -0
  441. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/_iteration_helpers.py +0 -0
  442. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/__init__.py +0 -0
  443. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/test_citation.py +0 -0
  444. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/test_defaults_agreement.py +0 -0
  445. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/test_hyper_overrides.py +0 -0
  446. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
  447. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
  448. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/test_iteration_fn_jit.py +0 -0
  449. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/test_iteration_fn_parity.py +0 -0
  450. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/algorithms/test_make_solve_loop.py +0 -0
  451. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/brachistochrone_analytical.py +0 -0
  452. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/conftest.py +0 -0
  453. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/__init__.py +0 -0
  454. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_brachistochrone.py +0 -0
  455. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_impulsive.py +0 -0
  456. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_multishot_propagation.py +0 -0
  457. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_batched_brachistochrone.py +0 -0
  458. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_batched_cvxpy_export_errors.py +0 -0
  459. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_batched_export_roundtrip.py +0 -0
  460. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_jax_bare_brachistochrone.py +0 -0
  461. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_jax_jit_brachistochrone.py +0 -0
  462. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_jax_vmap_brachistochrone.py +0 -0
  463. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/e2e/test_solve_jax_vmap_converged_no_drift.py +0 -0
  464. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/fixtures/brachistochrone.json +0 -0
  465. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/fixtures/brachistochrone.yaml +0 -0
  466. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/hohmann_analytical.py +0 -0
  467. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/integrations/__init__.py +0 -0
  468. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/integrations/test_mjx.py +0 -0
  469. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/integrations/test_mjx_dynamics.py +0 -0
  470. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/__init__.py +0 -0
  471. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/_iteration_callback_helpers.py +0 -0
  472. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
  473. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_iteration_callback_cvxpy.py +0 -0
  474. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_iteration_callback_moreau.py +0 -0
  475. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_iteration_callback_qpax.py +0 -0
  476. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_iteration_callback_vmap.py +0 -0
  477. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_moreau_ptr_solver.py +0 -0
  478. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_qpax_ptr_solver.py +0 -0
  479. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/solvers/test_subproblem_pytree.py +0 -0
  480. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/__init__.py +0 -0
  481. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/__init__.py +0 -0
  482. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_arithmetic.py +0 -0
  483. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_array.py +0 -0
  484. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_autodiff.py +0 -0
  485. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_constraint.py +0 -0
  486. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_expr.py +0 -0
  487. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_guess_expr.py +0 -0
  488. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_lie.py +0 -0
  489. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_linalg.py +0 -0
  490. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_logic.py +0 -0
  491. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_math.py +0 -0
  492. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_node_reference.py +0 -0
  493. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_parameters.py +0 -0
  494. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_scaling.py +0 -0
  495. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_spatial.py +0 -0
  496. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_stl.py +0 -0
  497. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_variable.py +0 -0
  498. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/expr/test_vmap.py +0 -0
  499. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/__init__.py +0 -0
  500. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_array.py +0 -0
  501. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_constraint.py +0 -0
  502. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_lie.py +0 -0
  503. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_linalg.py +0 -0
  504. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_load.py +0 -0
  505. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_logic.py +0 -0
  506. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_math.py +0 -0
  507. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_parser.py +0 -0
  508. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_spatial.py +0 -0
  509. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_stl.py +0 -0
  510. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_tokenizer.py +0 -0
  511. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/parser/test_vmap.py +0 -0
  512. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_augmentation.py +0 -0
  513. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_citations.py +0 -0
  514. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_gmsr.py +0 -0
  515. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_hashing.py +0 -0
  516. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_latex_formulation.py +0 -0
  517. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_lower_cvxpy.py +0 -0
  518. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_lower_jax.py +0 -0
  519. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_lower_latex.py +0 -0
  520. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_preprocessing.py +0 -0
  521. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_sparsity.py +0 -0
  522. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/symbolic/test_unified.py +0 -0
  523. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_autotuning.py +0 -0
  524. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_citation.py +0 -0
  525. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_cvxpygen_optional.py +0 -0
  526. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_discretization.py +0 -0
  527. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_examples.py +0 -0
  528. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_expert.py +0 -0
  529. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_init.py +0 -0
  530. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_initialize_syncs_guesses.py +0 -0
  531. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_integrators.py +0 -0
  532. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_loader.py +0 -0
  533. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_optimization_results.py +0 -0
  534. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_plotting.py +0 -0
  535. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_post_process_batched_tau_clamp.py +0 -0
  536. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_propagation.py +0 -0
  537. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_results_parameters.py +0 -0
  538. {openscvx-0.5.3.dev58 → openscvx-0.5.3.dev59}/tests/test_solve_batched_inference.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev58
3
+ Version: 0.5.3.dev59
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
@@ -830,8 +830,8 @@ def _build_let_problem_bundle(float_dtype: str = LET_FLOAT_DTYPE) -> dict:
830
830
  }
831
831
  algorithm = {
832
832
  "lam_prox": 5e-2,
833
- "lam_vc": 3e1,
834
- "lam_vb": 2e-1,
833
+ "lam_vc": 5e1,
834
+ "lam_vb": 1e1,
835
835
  "lam_cost": 0.5,
836
836
  "ep_tr": 1e-8,
837
837
  "ep_vc": 1e-6,
@@ -839,35 +839,40 @@ def _build_let_problem_bundle(float_dtype: str = LET_FLOAT_DTYPE) -> dict:
839
839
  }
840
840
 
841
841
  constraints = []
842
- # Enforce final distance from Earth in normalized Sun-Earth rotating frame.
842
+ # # Enforce final distance from Earth in normalized Sun-Earth rotating frame.
843
843
  final_radius_target = d_earth_moon / r_ref
844
- eps_radius = 1e-4
844
+ # eps_radius = 1e-4
845
+ # constraints += [
846
+ # (ox.linalg.Norm(position - pos_earth_rot) <= final_radius_target)
847
+ # .at([n_nodes - 1])
848
+ # .convex(),
849
+ # ]
850
+ # constraints += [
851
+ # (ox.linalg.Norm(position - pos_earth_rot) >= (1 + eps_radius) * final_radius_target).at(
852
+ # [n_nodes - 1]
853
+ # ),
854
+ # ]
845
855
  constraints += [
846
- (ox.linalg.Norm(position - pos_earth_rot) <= final_radius_target)
847
- .at([n_nodes - 1])
848
- .convex(),
849
- ]
850
- constraints += [
851
- (ox.linalg.Norm(position - pos_earth_rot) >= (1 + eps_radius) * final_radius_target).at(
852
- [n_nodes - 1]
853
- ),
854
- ]
855
-
856
- # Final orbit tangency: radius and velocity orthogonal at terminal node.
857
- constraints += [
858
- (ox.Sum((position - pos_earth_rot) * velocity) >= 0.0).at([n_nodes - 1]),
859
- ]
860
- constraints += [
861
- (ox.Sum((position - pos_earth_rot) * velocity) <= 0.0).at([n_nodes - 1]),
856
+ (ox.linalg.Norm(position - pos_earth_rot) == final_radius_target).at([n_nodes - 1])
862
857
  ]
863
858
 
864
- # Final speed magnitude: velocity should match the moon one
865
- constraints += [
866
- (ox.linalg.Norm(velocity) - v_moon >= 0.0).at([n_nodes - 1]),
867
- ]
868
- constraints += [
869
- (ox.linalg.Norm(velocity) - v_moon <= 0.0).at([n_nodes - 1]).convex(),
870
- ]
859
+ # # Final orbit tangency: radius and velocity orthogonal at terminal node.
860
+ # constraints += [
861
+ # (ox.Sum((position - pos_earth_rot) * velocity) >= 0.0).at([n_nodes - 1]),
862
+ # ]
863
+ # constraints += [
864
+ # (ox.Sum((position - pos_earth_rot) * velocity) <= 0.0).at([n_nodes - 1]),
865
+ # ]
866
+ constraints += [(ox.Sum((position - pos_earth_rot) * velocity) == 0.0).at([n_nodes - 1])]
867
+
868
+ # # Final speed magnitude: velocity should match the moon one
869
+ # constraints += [
870
+ # (ox.linalg.Norm(velocity) - v_moon >= 0.0).at([n_nodes - 1]),
871
+ # ]
872
+ # constraints += [
873
+ # (ox.linalg.Norm(velocity) - v_moon <= 0.0).at([n_nodes - 1]).convex(),
874
+ # ]
875
+ constraints += [(ox.linalg.Norm(velocity) - v_moon == 0.0).at([n_nodes - 1])]
871
876
 
872
877
  problem = Problem(
873
878
  dynamics=dynamics,
@@ -0,0 +1,569 @@
1
+ """Low-Thrust Orbit Transfer using Modified Equinoctial Elements.
2
+
3
+ The spacecraft starts in a **circular low-Earth orbit** (i = 28.5 deg) and must
4
+ reach a **highly elliptic, inclined orbit** (e = 0.7355, i = 63.4 deg) while
5
+ maximizing final mass. State is in Modified Equinoctial Elements (MEE) and the
6
+ control is the thrust direction in radial-transverse-normal (RTN) coordinates
7
+ together with a throttle. The dynamics include the J2/J3/J4 Earth-oblateness
8
+ perturbations.
9
+
10
+ States x = (p, f, g, h, k, L, m):
11
+ p [km] — semi-latus rectum
12
+ f, g — MEE eccentricity vector components
13
+ h, k — MEE inclination vector components
14
+ L [rad] — true longitude (unwrapped, monotonically increasing)
15
+ m [kg] — spacecraft mass
16
+
17
+ Controls:
18
+ u = (u_r, u_t, u_h) — thrust unit-direction (RTN); path constraint ‖u‖ = 1
19
+ tau — throttle parameter, tau ∈ [-50, 0]; thrust ∝ (1 + 0.01 tau)
20
+
21
+ Dynamics:
22
+ ẋ = A(x) Δ + b, ṁ = -F (1 + 0.01 tau) / Ve
23
+ with Δ = Δ_g + Δ_T, where Δ_g is the J2-J4 oblateness acceleration projected
24
+ into the RTN frame and Δ_T = F (1 + 0.01 tau) / m · u is the thrust force.
25
+
26
+ Objective: minimize J = -m(t_f) (i.e. maximize final mass).
27
+
28
+ Terminal (event) constraints (Eq. 17):
29
+ p(t_f) = p_f
30
+ f² + g² = 0.73550320568829² (final eccentricity)
31
+ h² + k² = 0.61761258786099² (final tan(i/2))
32
+ f·h + g·k = 0
33
+ g·h - k·f ≤ 0
34
+
35
+ Initial guess: propagate the dynamics from the initial condition
36
+ with a fixed throttle tau = -25 and the control aligned with the inertial
37
+ velocity, u = Qᵣᵀ v / ‖v‖, then sample onto the discretization nodes.
38
+
39
+ References:
40
+ - "A set of modified equinoctial orbit elements," Walker, Ireland & Owens, 1985.
41
+ - "Optimal Low-Thrust Interplanetary Trajectories by Direct Method Techniques,"
42
+ Kluever, 1997.
43
+ - "Practical Methods for Optimal Control and Estimation Using Nonlinear
44
+ Programming," Betts, 2010.
45
+ """
46
+
47
+ import os
48
+ import sys
49
+
50
+ import numpy as np
51
+ from scipy.integrate import solve_ivp
52
+
53
+ current_dir = os.path.dirname(os.path.abspath(__file__))
54
+ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
55
+ sys.path.append(grandparent_dir)
56
+
57
+ import openscvx as ox
58
+ from openscvx import Problem
59
+ from openscvx.plotting import plot_controls, plot_scp_iterations, plot_states
60
+
61
+ # ── Unit conversion factors ──────────────────────
62
+ FT = 0.0003048 # km per ft
63
+ LBF = 4.4482216152605 # N per lbf
64
+ LBM = 0.45359237 # kg per lbm
65
+ G0 = 9.80665 # m/s², standard gravity
66
+
67
+ # ── Physical constants in km-kg-s ─────────────────────
68
+ mu_phys = 1.407645794e16 * FT**3 # km³/s², Earth gravitational parameter
69
+ Re_phys = 20925662.73 * FT # km, Earth equatorial radius
70
+ F_thrust = 4.446618e-3 * LBF # N, thrust magnitude
71
+ Isp = 450.0 # s, specific impulse
72
+ Ve_phys = Isp * G0 / 1000.0 # km/s, effective exhaust velocity
73
+ J2 = 1082.639e-6
74
+ J3 = -2.565e-6
75
+ J4 = -1.608e-6
76
+
77
+ # Physical boundary values (km-kg-s) before non-dimensionalization.
78
+ p0_phys = 21837080.052835 * FT # km
79
+ pf_phys = 40007346.015232 * FT # km
80
+ p_min_phys = 20000000.0 * FT # km, lower state bound on p
81
+ p_max_phys = 60000000.0 * FT # km, upper state bound on p (= LU below)
82
+ m0_phys = 1.0 * LBM # kg (w0 = 1 lbm)
83
+
84
+ # ── Canonical (non-dimensional) units ─────────────────────────────────────────
85
+ # The dynamics are integrated in canonical units so the integrator sees O(1)
86
+ # states. Length is scaled by p_max so normalized p ranges in [p_min/p_max, 1] =
87
+ # [1/3, 1]; time by TU = sqrt(LU³/μ) so the normalized gravitational parameter is
88
+ # exactly 1; mass by the initial mass so normalized mass ranges in [0.1, 1].
89
+ LU = p_max_phys # km, length unit (=> p_n = p/LU ∈ [1/3, 1])
90
+ TU = np.sqrt(LU**3 / mu_phys) # s, time unit (=> μ_n = 1)
91
+ VU = LU / TU # km/s, velocity unit
92
+ AU = LU / TU**2 # km/s², acceleration unit (= μ_phys / LU²)
93
+ MU = m0_phys # kg, mass unit (initial mass)
94
+
95
+ # ── Non-dimensional constants used by the (integrated) dynamics ───────────────
96
+ mu = 1.0 # μ_phys / (LU³/TU²) ≡ 1 by construction
97
+ Re = Re_phys / LU
98
+ # thrust accel [AU] = c_thrust · (1 + 0.01 tau) / mass_n
99
+ # (physical F/m in km/s², divided by the acceleration unit AU)
100
+ c_thrust = (F_thrust / 1000.0) / (MU * AU)
101
+ # mass flow [MU/TU] = -c_mdot · (1 + 0.01 tau)
102
+ # (physical F/Ve in kg/s, expressed per mass unit and per time unit)
103
+ c_mdot = (F_thrust / (Isp * G0)) * TU / MU
104
+
105
+ # ── Boundary conditions ─────────────────
106
+ # Initial: circular LEO, i = 28.5 deg.
107
+ p0_val = p0_phys / LU
108
+ f0_val = 0.0
109
+ g0_val = 0.0
110
+ h0_val = -0.25396764647494
111
+ k0_val = 0.0
112
+ L0_val = np.pi # rad (dimensionless)
113
+ m0_val = m0_phys / MU # = 1.0
114
+
115
+ # Final: highly elliptic, inclined orbit.
116
+ pf_val = pf_phys / LU
117
+ ecc_f = 0.73550320568829 # sqrt(f_f² + g_f²)
118
+ chi_f = 0.61761258786099 # sqrt(h_f² + k_f²)
119
+
120
+ # ── Problem size and free-time guess (time in TU) ─────────────────────────────
121
+ N = 75 # discretization nodes
122
+ tf_guess = 90000.0 / TU # Section 5.3
123
+ tf_min = 50000.0 / TU
124
+ tf_max = 100000.0 / TU
125
+
126
+ # Largest allowed true longitude.
127
+ L_max = 9.0 * 2.0 * np.pi
128
+
129
+
130
+ # ── Reference dynamics in numpy ─────────
131
+ # This mirrors the symbolic dynamics below exactly; keeping the two in one file
132
+ # makes the propagated guess dynamically consistent with the optimized model.
133
+ def _grav_rtn_and_vel(p, f, g, h, k, L):
134
+ """Oblateness acceleration in RTN and the inertial velocity (numpy)."""
135
+ q = 1.0 + f * np.cos(L) + g * np.sin(L)
136
+ r = p / q
137
+ alpha2 = h * h - k * k
138
+ s2 = 1.0 + h * h + k * k
139
+ cL, sL = np.cos(L), np.sin(L)
140
+
141
+ rX = (r / s2) * (cL + alpha2 * cL + 2 * h * k * sL)
142
+ rY = (r / s2) * (sL - alpha2 * sL + 2 * h * k * cL)
143
+ rZ = (2 * r / s2) * (h * sL - k * cL)
144
+ rVec = np.array([rX, rY, rZ])
145
+ rMag = np.sqrt(rX**2 + rY**2 + rZ**2)
146
+ rXZMag = np.sqrt(rX**2 + rZ**2)
147
+
148
+ smp = np.sqrt(mu / p)
149
+ vX = -(1.0 / s2) * smp * (sL + alpha2 * sL - 2 * h * k * cL + g - 2 * f * h * k + alpha2 * g)
150
+ vY = -(1.0 / s2) * smp * (-cL + alpha2 * cL + 2 * h * k * sL - f + 2 * g * h * k + alpha2 * f)
151
+ vZ = (2.0 / s2) * smp * (h * cL + k * sL + f * h + g * k)
152
+ vVec = np.array([vX, vY, vZ])
153
+
154
+ rCrossv = np.cross(rVec, vVec)
155
+ rCrossvMag = np.linalg.norm(rCrossv)
156
+ rCrossvCrossr = np.cross(rCrossv, rVec)
157
+
158
+ ir = rVec / rMag
159
+ it = rCrossvCrossr / (rCrossvMag * rMag)
160
+ ih = rCrossv / rCrossvMag
161
+
162
+ enir = ir[2]
163
+ enen = np.array([-enir * ir[0], -enir * ir[1], 1.0 - enir * ir[2]])
164
+ inn = enen / np.linalg.norm(enen)
165
+
166
+ sinphi = rZ / rXZMag
167
+ cosphi = np.sqrt(1.0 - sinphi**2)
168
+
169
+ P2 = (3 * sinphi**2 - 2) / 2
170
+ P3 = (5 * sinphi**3 - 3 * sinphi) / 2
171
+ P4 = (35 * sinphi**4 - 30 * sinphi**2 + 3) / 8
172
+ dP2 = 3 * sinphi
173
+ dP3 = (15 * sinphi - 3) / 2 # verbatim from GPOPS-II source
174
+ dP4 = (140 * sinphi**3 - 60 * sinphi) / 8
175
+
176
+ sumn = (Re / r) ** 2 * dP2 * J2 + (Re / r) ** 3 * dP3 * J3 + (Re / r) ** 4 * dP4 * J4
177
+ sumr = 3 * (Re / r) ** 2 * P2 * J2 + 4 * (Re / r) ** 3 * P3 * J3 + 5 * (Re / r) ** 4 * P4 * J4
178
+ deltagn = -(mu * cosphi / r**2) * sumn
179
+ deltagr = -(mu / r**2) * sumr
180
+
181
+ dgv = deltagn * inn - deltagr * ir
182
+ return np.array([ir @ dgv, it @ dgv, ih @ dgv]), ir, it, ih, vVec
183
+
184
+
185
+ def _eom_guess(t, x):
186
+ """MEE EOM with throttle tau = -25 and velocity-aligned control (numpy)."""
187
+ p, f, g, h, k, L, m = x
188
+ Dg, ir, it, ih, vVec = _grav_rtn_and_vel(p, f, g, h, k, L)
189
+ vmag = np.linalg.norm(vVec)
190
+ ur, ut, uh = ir @ vVec / vmag, it @ vVec / vmag, ih @ vVec / vmag
191
+ thr = c_thrust * (1 + 0.01 * (-25.0)) / m
192
+ D1, D2, D3 = Dg + np.array([thr * ur, thr * ut, thr * uh])
193
+
194
+ q = 1.0 + f * np.cos(L) + g * np.sin(L)
195
+ s2 = 1.0 + h * h + k * k
196
+ cL, sL = np.cos(L), np.sin(L)
197
+ smp = np.sqrt(p / mu)
198
+ return [
199
+ (2 * p / q) * smp * D2,
200
+ smp * sL * D1 + smp * ((q + 1) * cL + f) / q * D2 - smp * g / q * (h * sL - k * cL) * D3,
201
+ -smp * cL * D1 + smp * ((q + 1) * sL + g) / q * D2 + smp * f / q * (h * sL - k * cL) * D3,
202
+ smp * s2 * cL / (2 * q) * D3,
203
+ smp * s2 * sL / (2 * q) * D3,
204
+ smp / q * (h * sL - k * cL) * D3 + np.sqrt(mu * p) * (q / p) ** 2,
205
+ -c_mdot * (1 + 0.01 * (-25.0)),
206
+ ]
207
+
208
+
209
+ def build_initial_guess():
210
+ """Propagate the reference control law; retain the full path for plotting."""
211
+ x0 = [p0_val, f0_val, g0_val, h0_val, k0_val, L0_val, m0_val]
212
+ sol = solve_ivp(
213
+ _eom_guess,
214
+ [0.0, tf_guess],
215
+ x0,
216
+ rtol=1e-10,
217
+ atol=1e-12,
218
+ dense_output=True,
219
+ max_step=tf_guess / 2000,
220
+ )
221
+ t_nodes = np.linspace(0.0, tf_guess, N)
222
+ Xg = sol.sol(t_nodes) # (7, N)
223
+
224
+ # Recover the velocity-aligned control direction at each node.
225
+ u_g = np.zeros((N, 3))
226
+ for i in range(N):
227
+ _, ir, it, ih, vVec = _grav_rtn_and_vel(*Xg[:6, i])
228
+ vmag = np.linalg.norm(vVec)
229
+ u_g[i] = [ir @ vVec / vmag, it @ vVec / vmag, ih @ vVec / vmag]
230
+ tau_g = np.full((N, 1), -25.0)
231
+ return t_nodes, Xg.T, u_g, tau_g, sol.y.T
232
+
233
+
234
+ t_nodes, Xg, u_guess, tau_guess, Xg_integrated = build_initial_guess()
235
+
236
+ # State bounds (non-dimensional); also used to clip the open-loop guess.
237
+ state_bounds = {
238
+ "p": (p_min_phys / LU, p_max_phys / LU), # = (1/3, 1)
239
+ "f": (-1.0, 1.0),
240
+ "g": (-1.0, 1.0),
241
+ "h": (-1.0, 1.0),
242
+ "k": (-1.0, 1.0),
243
+ "L": (L0_val, L_max),
244
+ "m": (0.1, m0_val), # normalized mass ∈ [0.1, 1]
245
+ }
246
+ _names = ["p", "f", "g", "h", "k", "L", "m"]
247
+ Xg = np.column_stack([np.clip(Xg[:, i], *state_bounds[nm]) for i, nm in enumerate(_names)])
248
+
249
+ # ── States ───────────────────────────────────────────────────────────────────
250
+ p_el = ox.State("p", (1,))
251
+ p_el.initial, p_el.final = np.array([p0_val]), np.array([pf_val]) # p(t_f) fixed
252
+ p_el.min, p_el.max = np.array([state_bounds["p"][0]]), np.array([state_bounds["p"][1]])
253
+ p_el.guess = Xg[:, 0:1]
254
+
255
+ f_el = ox.State("f", (1,))
256
+ f_el.initial, f_el.final = np.array([f0_val]), [ox.Free(float(Xg[-1, 1]))]
257
+ f_el.min, f_el.max = np.array([-1.0]), np.array([1.0])
258
+ f_el.guess = Xg[:, 1:2]
259
+
260
+ g_el = ox.State("g", (1,))
261
+ g_el.initial, g_el.final = np.array([g0_val]), [ox.Free(float(Xg[-1, 2]))]
262
+ g_el.min, g_el.max = np.array([-1.0]), np.array([1.0])
263
+ g_el.guess = Xg[:, 2:3]
264
+
265
+ h_el = ox.State("h", (1,))
266
+ h_el.initial, h_el.final = np.array([h0_val]), [ox.Free(float(Xg[-1, 3]))]
267
+ h_el.min, h_el.max = np.array([-1.0]), np.array([1.0])
268
+ h_el.guess = Xg[:, 3:4]
269
+
270
+ k_el = ox.State("k", (1,))
271
+ k_el.initial, k_el.final = np.array([k0_val]), [ox.Free(float(Xg[-1, 4]))]
272
+ k_el.min, k_el.max = np.array([-1.0]), np.array([1.0])
273
+ k_el.guess = Xg[:, 4:5]
274
+
275
+ L_el = ox.State("L", (1,))
276
+ L_el.initial, L_el.final = np.array([L0_val]), [ox.Free(float(Xg[-1, 5]))]
277
+ L_el.min, L_el.max = np.array([L0_val]), np.array([L_max])
278
+ L_el.guess = Xg[:, 5:6]
279
+
280
+ m_el = ox.State("mass", (1,))
281
+ m_el.initial = np.array([m0_val])
282
+ m_el.final = [("maximize", 0.4 * LBM)] # objective: maximize final mass
283
+ m_el.min, m_el.max = np.array([state_bounds["m"][0]]), np.array([m0_val])
284
+ m_el.guess = Xg[:, 6:7]
285
+
286
+ states = [p_el, f_el, g_el, h_el, k_el, L_el, m_el]
287
+
288
+ # ── Controls ─────────────────────────────────────────────────────────────────
289
+ u = ox.Control("u", shape=(3,), parameterization="zoh")
290
+ u.min, u.max = np.full(3, -1.0), np.full(3, 1.0)
291
+ u.guess = u_guess
292
+
293
+ tau = ox.Control("tau", shape=(1,), parameterization="zoh")
294
+ tau.min, tau.max = np.array([-50.0]), np.array([0.0])
295
+ tau.guess = tau_guess
296
+
297
+ controls = [u, tau]
298
+
299
+ # ── Symbolic MEE dynamics with J2-J4 oblateness ──────────────────────────────
300
+ p, f, g, h, k, L = p_el[0], f_el[0], g_el[0], h_el[0], k_el[0], L_el[0]
301
+ m = m_el[0]
302
+ ur, ut, uh = u[0], u[1], u[2]
303
+ tau_s = tau[0]
304
+
305
+
306
+ def _cross(a, b):
307
+ return (a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0])
308
+
309
+
310
+ def _dot(a, b):
311
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
312
+
313
+
314
+ q = 1.0 + f * ox.Cos(L) + g * ox.Sin(L)
315
+ r = p / q
316
+ alpha2 = h * h - k * k
317
+ s2 = 1.0 + h * h + k * k
318
+ cL, sL = ox.Cos(L), ox.Sin(L)
319
+
320
+ # Inertial position (ECI)
321
+ rX = (r / s2) * (cL + alpha2 * cL + 2 * h * k * sL)
322
+ rY = (r / s2) * (sL - alpha2 * sL + 2 * h * k * cL)
323
+ rZ = (2 * r / s2) * (h * sL - k * cL)
324
+ rVec = (rX, rY, rZ)
325
+ rMag = ox.linalg.Norm(ox.Stack(rVec))
326
+ rXZMag = ox.Sqrt(rX * rX + rZ * rZ)
327
+
328
+ # Inertial velocity (ECI)
329
+ smp = ox.Sqrt(mu / p)
330
+ vX = -(1.0 / s2) * smp * (sL + alpha2 * sL - 2 * h * k * cL + g - 2 * f * h * k + alpha2 * g)
331
+ vY = -(1.0 / s2) * smp * (-cL + alpha2 * cL + 2 * h * k * sL - f + 2 * g * h * k + alpha2 * f)
332
+ vZ = (2.0 / s2) * smp * (h * cL + k * sL + f * h + g * k)
333
+ vVec = (vX, vY, vZ)
334
+
335
+ # RTN basis vectors i_r, i_θ, i_h
336
+ rCrossv = _cross(rVec, vVec)
337
+ rCrossvMag = ox.linalg.Norm(ox.Stack(rCrossv))
338
+ rCrossvCrossr = _cross(rCrossv, rVec)
339
+ ir = tuple(c / rMag for c in rVec)
340
+ it = tuple(c / (rCrossvMag * rMag) for c in rCrossvCrossr)
341
+ ih = tuple(c / rCrossvMag for c in rCrossv)
342
+
343
+ # Local North direction i_n
344
+ enir = ir[2]
345
+ enen = (-enir * ir[0], -enir * ir[1], 1.0 - enir * ir[2])
346
+ enenMag = ox.linalg.Norm(ox.Stack(enen))
347
+ inn = tuple(c / enenMag for c in enen)
348
+
349
+ # Geocentric latitude and Legendre polynomials
350
+ sinphi = rZ / rXZMag
351
+ cosphi = ox.Sqrt(1.0 - sinphi * sinphi)
352
+ P2 = (3 * sinphi * sinphi - 2) / 2
353
+ P3 = (5 * sinphi**3 - 3 * sinphi) / 2
354
+ P4 = (35 * sinphi**4 - 30 * sinphi * sinphi + 3) / 8
355
+ dP2 = 3 * sinphi
356
+ dP3 = (15 * sinphi - 3) / 2
357
+ dP4 = (140 * sinphi**3 - 60 * sinphi) / 8
358
+
359
+ sumn = (Re / r) ** 2 * dP2 * J2 + (Re / r) ** 3 * dP3 * J3 + (Re / r) ** 4 * dP4 * J4
360
+ sumr = 3 * (Re / r) ** 2 * P2 * J2 + 4 * (Re / r) ** 3 * P3 * J3 + 5 * (Re / r) ** 4 * P4 * J4
361
+ deltagn = -(mu * cosphi / (r * r)) * sumn
362
+ deltagr = -(mu / (r * r)) * sumr
363
+
364
+ # Oblateness acceleration in ECI then projected into RTN
365
+ dgv = (
366
+ deltagn * inn[0] - deltagr * ir[0],
367
+ deltagn * inn[1] - deltagr * ir[1],
368
+ deltagn * inn[2] - deltagr * ir[2],
369
+ )
370
+ Deltag1 = _dot(ir, dgv)
371
+ Deltag2 = _dot(it, dgv)
372
+ Deltag3 = _dot(ih, dgv)
373
+
374
+ # Thrust acceleration in RTN
375
+ thr = c_thrust * (1.0 + 0.01 * tau_s) / m
376
+ DeltaT1, DeltaT2, DeltaT3 = thr * ur, thr * ut, thr * uh
377
+
378
+ D1 = Deltag1 + DeltaT1
379
+ D2 = Deltag2 + DeltaT2
380
+ D3 = Deltag3 + DeltaT3
381
+
382
+ # Equations of motion
383
+ p_dot = (2 * p / q) * smp * D2
384
+ f_dot = smp * sL * D1 + smp * ((q + 1) * cL + f) / q * D2 - smp * g / q * (h * sL - k * cL) * D3
385
+ g_dot = -smp * cL * D1 + smp * ((q + 1) * sL + g) / q * D2 + smp * f / q * (h * sL - k * cL) * D3
386
+ h_dot = smp * s2 * cL / (2 * q) * D3
387
+ k_dot = smp * s2 * sL / (2 * q) * D3
388
+ L_dot = smp / q * (h * sL - k * cL) * D3 + ox.Sqrt(mu * p) * (q / p) ** 2
389
+ m_dot = -c_mdot * (1.0 + 0.01 * tau_s)
390
+
391
+ dynamics = {
392
+ "p": p_dot,
393
+ "f": f_dot,
394
+ "g": g_dot,
395
+ "h": h_dot,
396
+ "k": k_dot,
397
+ "L": L_dot,
398
+ "mass": m_dot,
399
+ }
400
+
401
+ # ── Constraints ───────────────────────────────────────────────────────────────
402
+ constraints = []
403
+
404
+ # Path constraint: thrust direction has unit norm, ‖u‖ = 1. ‖u‖ ≤ 1 is
405
+ # convex; ‖u‖ ≥ 1 is non-convex.
406
+ unorm = ox.linalg.Norm(u)
407
+ constraints.append(ox.ctcs(unorm <= 1.0))
408
+
409
+ # Terminal (event) constraints at the final node.
410
+ fN, gN, hN, kN = f_el[0], g_el[0], h_el[0], k_el[0]
411
+ nodal_eqs = [
412
+ (fN**2 + gN**2, ecc_f**2), # final eccentricity
413
+ (hN**2 + kN**2, chi_f**2), # final tan(i/2)
414
+ (fN * hN + gN * kN, 0.0),
415
+ ]
416
+ for expr, val in nodal_eqs:
417
+ constraints.append(ox.NodalConstraint(expr == val, nodes=[N - 1]))
418
+ constraints.append(ox.NodalConstraint(gN * hN - kN * fN <= 0.0, nodes=[N - 1]))
419
+
420
+ # ── Time ────────────────────────────────────────────────────
421
+ time = ox.Time(
422
+ initial=0.0,
423
+ final=ox.Free(tf_guess),
424
+ min=0.0,
425
+ max=3 * tf_max,
426
+ guess=t_nodes.reshape(-1, 1),
427
+ time_dilation_min=tf_min,
428
+ time_dilation_max=tf_max,
429
+ uniform_time_grid=True,
430
+ )
431
+ time.time_dilation_guess = np.full((N, 1), tf_guess)
432
+
433
+ # ── Problem ───────────────────────────────────────────────────────────────────
434
+ problem = Problem(
435
+ dynamics=dynamics,
436
+ states=states,
437
+ controls=controls,
438
+ constraints=constraints,
439
+ time=time,
440
+ N=N,
441
+ float_dtype="float64",
442
+ discretizer={"ode_solver": "Dopri8"},
443
+ algorithm={
444
+ "autotuner": ox.AugmentedLagrangian(),
445
+ "k_max": 200,
446
+ "lam_prox": 1e0,
447
+ "lam_vc": 1e2,
448
+ "lam_vb": 1e1,
449
+ },
450
+ solver={"cvx_solver": "QOCO", "solver_args": {}},
451
+ )
452
+
453
+
454
+ def mee_to_cartesian(p_a, f_a, g_a, h_a, k_a, L_a):
455
+ """MEE → ECI position [LU]
456
+
457
+ Inputs are non-dimensional (``p`` in LU); multiply the result by ``LU`` for km.
458
+ """
459
+ q = 1.0 + f_a * np.cos(L_a) + g_a * np.sin(L_a)
460
+ r = p_a / q
461
+ alpha2 = h_a**2 - k_a**2
462
+ s2 = 1.0 + h_a**2 + k_a**2
463
+ cL, sL = np.cos(L_a), np.sin(L_a)
464
+ x = (r / s2) * (cL + alpha2 * cL + 2 * h_a * k_a * sL)
465
+ y = (r / s2) * (sL - alpha2 * sL + 2 * h_a * k_a * cL)
466
+ z = (2 * r / s2) * (h_a * sL - k_a * cL)
467
+ return x, y, z
468
+
469
+
470
+ def plot_final_orbit(results):
471
+ """3-D ECI plot of the integrated guess and propagated solution (km)."""
472
+ import plotly.graph_objects as go
473
+
474
+ # post_process() supplies the nonlinear trajectory between optimization nodes.
475
+ tr = results.trajectory
476
+ p, f, g, h, k, L = (np.asarray(tr[s]).flatten() for s in ("p", "f", "g", "h", "k", "L"))
477
+ x, y, z = mee_to_cartesian(p, f, g, h, k, L)
478
+ x, y, z = x * LU, y * LU, z * LU # canonical (LU) -> km
479
+
480
+ # Plot the full solve_ivp propagation, not just its N sampled guess nodes.
481
+ xg, yg, zg = mee_to_cartesian(
482
+ Xg_integrated[:, 0],
483
+ Xg_integrated[:, 1],
484
+ Xg_integrated[:, 2],
485
+ Xg_integrated[:, 3],
486
+ Xg_integrated[:, 4],
487
+ Xg_integrated[:, 5],
488
+ )
489
+ xg, yg, zg = xg * LU, yg * LU, zg * LU
490
+
491
+ # Earth sphere
492
+ u_s = np.linspace(0.0, 2.0 * np.pi, 60)
493
+ v_s = np.linspace(0.0, np.pi, 30)
494
+ xe = Re_phys * np.outer(np.cos(u_s), np.sin(v_s))
495
+ ye = Re_phys * np.outer(np.sin(u_s), np.sin(v_s))
496
+ ze = Re_phys * np.outer(np.ones_like(u_s), np.cos(v_s))
497
+
498
+ fig = go.Figure()
499
+ fig.add_trace(
500
+ go.Surface(x=xe, y=ye, z=ze, colorscale="Blues", showscale=False, opacity=0.7, name="Earth")
501
+ )
502
+ fig.add_trace(
503
+ go.Scatter3d(
504
+ x=xg,
505
+ y=yg,
506
+ z=zg,
507
+ mode="lines",
508
+ line=dict(color="lightgray", width=2, dash="dash"),
509
+ name="Initial guess (integrated)",
510
+ )
511
+ )
512
+ fig.add_trace(
513
+ go.Scatter3d(
514
+ x=x,
515
+ y=y,
516
+ z=z,
517
+ mode="lines",
518
+ line=dict(color="orange", width=3),
519
+ name="Transfer (solved)",
520
+ )
521
+ )
522
+ fig.add_trace(
523
+ go.Scatter3d(
524
+ x=[x[0]],
525
+ y=[y[0]],
526
+ z=[z[0]],
527
+ mode="markers",
528
+ marker=dict(size=6, color="green"),
529
+ name="Start (LEO)",
530
+ )
531
+ )
532
+ fig.add_trace(
533
+ go.Scatter3d(
534
+ x=[x[-1]],
535
+ y=[y[-1]],
536
+ z=[z[-1]],
537
+ mode="markers",
538
+ marker=dict(size=6, color="red"),
539
+ name="Final orbit",
540
+ )
541
+ )
542
+ fig.update_layout(
543
+ scene=dict(
544
+ xaxis_title="x [km]",
545
+ yaxis_title="y [km]",
546
+ zaxis_title="z [km]",
547
+ aspectmode="data",
548
+ camera=dict(eye=dict(x=1.3, y=1.3, z=0.9)),
549
+ ),
550
+ )
551
+ return fig
552
+
553
+
554
+ if __name__ == "__main__":
555
+ problem.initialize()
556
+ problem.solve()
557
+ results = problem.post_process()
558
+
559
+ # Results are in canonical units; convert back to physical for reporting.
560
+ tf_sol = float(np.asarray(results.t_final).reshape(-1)[0]) * TU # s
561
+ mf_n = float(results.trajectory["mass"][-1, 0]) # normalized mass
562
+ mf_sol = mf_n * MU # kg
563
+ print(f"Transfer time : {tf_sol:.0f} s ({tf_sol / 3600:.2f} hr)")
564
+ print(f"Final mass : {mf_sol:.6f} kg (propellant {(m0_val - mf_n) * MU:.6f} kg)")
565
+
566
+ plot_final_orbit(results).show()
567
+ plot_states(results).show()
568
+ plot_controls(results).show()
569
+ plot_scp_iterations(results).show()
@@ -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.dev58'
22
- __version_tuple__ = version_tuple = (0, 5, 3, 'dev58')
21
+ __version__ = version = '0.5.3.dev59'
22
+ __version_tuple__ = version_tuple = (0, 5, 3, 'dev59')
23
23
 
24
- __commit_id__ = commit_id = 'gb7be593bb'
24
+ __commit_id__ = commit_id = 'g939c7d7fa'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev58
3
+ Version: 0.5.3.dev59
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
@@ -205,6 +205,7 @@ examples/spacecraft/dual_deputy_inspection_cw.py
205
205
  examples/spacecraft/halo_orbit.py
206
206
  examples/spacecraft/hohmann_transfer.py
207
207
  examples/spacecraft/let_transfer.py
208
+ examples/spacecraft/low_thrust_transfer.py
208
209
  examples/spacecraft/proxops_cw.py
209
210
  examples/spacecraft/relative_loitering.py
210
211
  examples/spacecraft/capstone/capstone.bin
@@ -213,6 +213,7 @@
213
213
  "examples/spacecraft/halo_orbit.py",
214
214
  "examples/spacecraft/hohmann_transfer.py",
215
215
  "examples/spacecraft/let_transfer.py",
216
+ "examples/spacecraft/low_thrust_transfer.py",
216
217
  "examples/spacecraft/proxops_cw.py",
217
218
  "examples/spacecraft/relative_loitering.py",
218
219
  "figures/ctlos_cine.gif",