openscvx 0.5.3.dev26__tar.gz → 0.5.3.dev28__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 (424) hide show
  1. {openscvx-0.5.3.dev26/openscvx.egg-info → openscvx-0.5.3.dev28}/PKG-INFO +4 -1
  2. openscvx-0.5.3.dev28/examples/aircraft/supersonic_time_to_climb.py +343 -0
  3. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/car/dubins_car_waypoint_stl.py +0 -11
  4. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/dr_vp_polytope.py +2 -3
  5. openscvx-0.5.3.dev28/examples/frax/panda_frax.py +430 -0
  6. openscvx-0.5.3.dev28/examples/frax/panda_frax_pick_place.py +586 -0
  7. openscvx-0.5.3.dev28/examples/frax/panda_frax_viewplanning.py +608 -0
  8. openscvx-0.5.3.dev28/examples/frax/panda_frax_waypoint.py +575 -0
  9. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/rocket/ascent_launch_vehicle.py +0 -1
  10. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/__init__.py +2 -1
  11. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/_version.py +3 -3
  12. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/integrations/__init__.py +23 -4
  13. openscvx-0.5.3.dev28/openscvx/integrations/_utils.py +34 -0
  14. openscvx-0.5.3.dev28/openscvx/integrations/frax.py +309 -0
  15. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/integrations/mjx.py +1 -15
  16. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28/openscvx.egg-info}/PKG-INFO +4 -1
  17. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx.egg-info/SOURCES.txt +7 -0
  18. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx.egg-info/requires.txt +4 -0
  19. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/pyproject.toml +5 -1
  20. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_examples.py +5 -4
  21. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/assets/logo.svg +0 -0
  22. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/release-drafter.yml +0 -0
  23. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/workflows/_docs.yml +0 -0
  24. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/workflows/branch-name.yml +0 -0
  25. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/workflows/docs.yml +0 -0
  26. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/workflows/lint.yml +0 -0
  27. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/workflows/nightly.yml +0 -0
  28. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/workflows/release-drafter.yml +0 -0
  29. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/workflows/release.yml +0 -0
  30. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/workflows/tests-integration.yml +0 -0
  31. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.github/workflows/tests-unit.yml +0 -0
  32. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.gitignore +0 -0
  33. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/.gitmodules +0 -0
  34. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/CONTRIBUTING.md +0 -0
  35. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/LICENSE +0 -0
  36. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/README.md +0 -0
  37. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/Foundations/constraint_reformulation.md +0 -0
  38. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/Foundations/control_parameterization.md +0 -0
  39. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/Foundations/discretization.md +0 -0
  40. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/Foundations/ocp.md +0 -0
  41. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/Foundations/scvx.md +0 -0
  42. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/Foundations/time_dilation.md +0 -0
  43. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UnderTheHood/batching_jit_grad.md +0 -0
  44. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UnderTheHood/custom_algorithms_autotuners.md +0 -0
  45. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UnderTheHood/lowering_architecture.md +0 -0
  46. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  47. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/00_introduction.md +0 -0
  48. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  49. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  50. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  51. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  52. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/05_visualization.md +0 -0
  53. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/06_logic.md +0 -0
  54. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/07_lie.md +0 -0
  55. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/08_mpcc.md +0 -0
  56. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
  57. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/favicon.png +0 -0
  58. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/images/ct-scvx_dark.png +0 -0
  59. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/images/ct-scvx_light.png +0 -0
  60. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/images/ctcs_dark.png +0 -0
  61. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/images/ctcs_light.png +0 -0
  62. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/images/problem_class_dark.png +0 -0
  63. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/images/problem_class_light.png +0 -0
  64. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/logo.svg +0 -0
  65. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/openscvx_logo_square.png +0 -0
  66. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/viser-client/index.html +0 -0
  67. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  68. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  69. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/citation.md +0 -0
  70. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/examples.md +0 -0
  71. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/index.md +0 -0
  72. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/javascripts/mathjax.js +0 -0
  73. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/docs/versions.json +0 -0
  74. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/_viser_embed_export.py +0 -0
  75. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/abstract/brachistochrone.py +0 -0
  76. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/abstract/brachistochrone_batched.py +0 -0
  77. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/abstract/flappy_bird.py +0 -0
  78. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/abstract/hypersensitive.py +0 -0
  79. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/abstract/impulsive.py +0 -0
  80. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/abstract/stl_integer_variable.py +0 -0
  81. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/abstract/stl_or.py +0 -0
  82. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/animations/7_dof_arm.py +0 -0
  83. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/animations/_camera.py +0 -0
  84. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/animations/_render.py +0 -0
  85. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/animations/_sensor_view.py +0 -0
  86. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/animations/dr_vp_polytope.py +0 -0
  87. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  88. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/animations/logo.py +0 -0
  89. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  90. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/arm/3_dof_arm.py +0 -0
  91. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/arm/7_dof_arm.py +0 -0
  92. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/arm/7_dof_arm_collision.py +0 -0
  93. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/arm/7_dof_arm_vp.py +0 -0
  94. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  95. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  96. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/arm/franka_fr3v2_viewplanning_nodal.py +0 -0
  97. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/car/dubins_car.py +0 -0
  98. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/car/dubins_car_disjoint.py +0 -0
  99. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  100. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/car/dubins_car_obstacle_stl.py +0 -0
  101. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/car/dubins_car_stl_or.py +0 -0
  102. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/2d_obstacle_avoidance_batched_ic.py +0 -0
  103. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/cinema_vp.py +0 -0
  104. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/cinema_vp_nodal.py +0 -0
  105. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/dr_double_integrator.py +0 -0
  106. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/dr_vp.py +0 -0
  107. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/dr_vp_nodal.py +0 -0
  108. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/drone_racing.py +0 -0
  109. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/drone_racing_batched_gates.py +0 -0
  110. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/logo.py +0 -0
  111. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/logo_utils/acl_logo.svg +0 -0
  112. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/logo_utils/openscvx_logo_single.svg +0 -0
  113. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/logo_utils/quadrotor_mesh.py +0 -0
  114. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  115. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/obstacle_avoidance.py +0 -0
  116. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  117. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  118. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/obstacle_avoidance_vmap_2d.py +0 -0
  119. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/drone/openscvx_logo.py +0 -0
  120. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mjx/cartpole_mjx.py +0 -0
  121. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mjx/double_cartpole_mjx.py +0 -0
  122. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mjx/skydio_x2_mjx.py +0 -0
  123. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  124. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mjx/triple_cartpole_game.py +0 -0
  125. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mjx/triple_cartpole_mjx.py +0 -0
  126. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mpc/double_integrator_discrete.py +0 -0
  127. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mpc/double_integrator_drone_racing.py +0 -0
  128. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  129. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  130. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  131. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/plotting.py +0 -0
  132. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/plotting_viser.py +0 -0
  133. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  134. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  135. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  136. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  137. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  138. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  139. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  140. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  141. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/cinema_vp_realtime.py +0 -0
  142. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/drone_racing_realtime.py +0 -0
  143. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/dubins_car_realtime.py +0 -0
  144. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  145. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/rocket/3DoF_pdg.py +0 -0
  146. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/rocket/6DoF_pdg.py +0 -0
  147. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/rocket/6DoF_pdg_batched_ic.py +0 -0
  148. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/spacecraft/halo_orbit.py +0 -0
  149. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/spacecraft/hohmann_transfer.py +0 -0
  150. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/spacecraft/let_transfer.py +0 -0
  151. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/spacecraft/proxops_cw.py +0 -0
  152. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/examples/spacecraft/relative_loitering.py +0 -0
  153. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/figures/ctlos_cine.gif +0 -0
  154. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/figures/ctlos_dr.gif +0 -0
  155. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/figures/dtlos_cine.gif +0 -0
  156. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/figures/dtlos_dr.gif +0 -0
  157. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/figures/openscvx_logo.svg +0 -0
  158. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/figures/openscvx_logo_square.png +0 -0
  159. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/figures/oscvx_structure_full_dark.svg +0 -0
  160. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/figures/video_preview.png +0 -0
  161. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/__init__.py +0 -0
  162. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/assets/stylesheets/custom.css +0 -0
  163. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  164. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  165. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  166. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/home.html +0 -0
  167. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/main.html +0 -0
  168. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/partials/home-diagram.html +0 -0
  169. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/partials/home-dropin-banner.html +0 -0
  170. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/partials/home-hero.html +0 -0
  171. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/partials/home-pipeline.html +0 -0
  172. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/material/overrides/partials/home-viser-strip.html +0 -0
  173. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/mkdocs.yml +0 -0
  174. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/__main__.py +0 -0
  175. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/__init__.py +0 -0
  176. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/__init__.py +0 -0
  177. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/acceptance_ratio.py +0 -0
  178. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  179. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
  180. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/base.py +0 -0
  181. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  182. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  183. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/base.py +0 -0
  184. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/history.py +0 -0
  185. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/hyperparams.py +0 -0
  186. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/loop.py +0 -0
  187. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/optimization_results.py +0 -0
  188. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/penalty.py +0 -0
  189. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/scvx/__init__.py +0 -0
  190. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/scvx/iteration.py +0 -0
  191. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
  192. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/state.py +0 -0
  193. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/algorithms/weights.py +0 -0
  194. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/config.py +0 -0
  195. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/discretization/__init__.py +0 -0
  196. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/discretization/base.py +0 -0
  197. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/discretization/discretize_linearize.py +0 -0
  198. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/discretization/linearize_discretize.py +0 -0
  199. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  200. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  201. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  202. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  203. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/expert/__init__.py +0 -0
  204. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/expert/byof.py +0 -0
  205. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/expert/lowering.py +0 -0
  206. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/expert/validation.py +0 -0
  207. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/init/__init__.py +0 -0
  208. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/init/interpolation.py +0 -0
  209. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/init/inverse_kinematics.py +0 -0
  210. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/integrations/base.py +0 -0
  211. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/integrations/menagerie.py +0 -0
  212. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/integrators/__init__.py +0 -0
  213. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/integrators/diffrax.py +0 -0
  214. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/integrators/runge_kutta.py +0 -0
  215. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/loader.py +0 -0
  216. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/lowered/__init__.py +0 -0
  217. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/lowered/cvxpy_constraints.py +0 -0
  218. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/lowered/cvxpy_variables.py +0 -0
  219. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/lowered/dynamics.py +0 -0
  220. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/lowered/jax_constraints.py +0 -0
  221. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/lowered/parameters.py +0 -0
  222. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/lowered/problem.py +0 -0
  223. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/lowered/unified.py +0 -0
  224. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/__init__.py +0 -0
  225. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/plotting.py +0 -0
  226. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/publication.py +0 -0
  227. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/scp_iteration.py +0 -0
  228. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/__init__.py +0 -0
  229. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/animated.py +0 -0
  230. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/coordinates.py +0 -0
  231. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/orbits.py +0 -0
  232. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/plotly_integration.py +0 -0
  233. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/primitives.py +0 -0
  234. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/scp.py +0 -0
  235. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/plotting/viser/server.py +0 -0
  236. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/problem.py +0 -0
  237. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/propagation/__init__.py +0 -0
  238. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/propagation/post_processing.py +0 -0
  239. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/propagation/propagation.py +0 -0
  240. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/solvers/__init__.py +0 -0
  241. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/solvers/base.py +0 -0
  242. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/solvers/cones.py +0 -0
  243. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
  244. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/solvers/moreau_ptr_solver.py +0 -0
  245. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/solvers/ptr_solver.py +0 -0
  246. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/solvers/qpax_ptr_solver.py +0 -0
  247. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/__init__.py +0 -0
  248. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/affine.py +0 -0
  249. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/augmentation.py +0 -0
  250. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/builder.py +0 -0
  251. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/canonicalize.py +0 -0
  252. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/constraint_set.py +0 -0
  253. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/__init__.py +0 -0
  254. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/arithmetic.py +0 -0
  255. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/array.py +0 -0
  256. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/constraint.py +0 -0
  257. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/control.py +0 -0
  258. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/expr.py +0 -0
  259. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  260. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  261. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/lie/se3.py +0 -0
  262. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/lie/so3.py +0 -0
  263. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/linalg.py +0 -0
  264. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/logic.py +0 -0
  265. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/math.py +0 -0
  266. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/parameter.py +0 -0
  267. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/spatial.py +0 -0
  268. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/state.py +0 -0
  269. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/stl.py +0 -0
  270. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/stljax.py +0 -0
  271. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/time.py +0 -0
  272. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/variable.py +0 -0
  273. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/expr/vmap.py +0 -0
  274. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/hashing.py +0 -0
  275. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lower.py +0 -0
  276. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/__init__.py +0 -0
  277. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  278. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  279. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  280. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  281. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  282. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  283. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  284. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  285. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  286. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  287. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  288. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  289. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  290. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  291. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  292. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  293. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  294. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  295. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  296. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  297. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  298. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  299. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  300. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  301. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  302. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  303. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  304. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  305. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  306. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/__init__.py +0 -0
  307. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/_registry.py +0 -0
  308. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/array.py +0 -0
  309. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/constraint.py +0 -0
  310. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/lie.py +0 -0
  311. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/linalg.py +0 -0
  312. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/logic.py +0 -0
  313. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/math.py +0 -0
  314. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/parser.py +0 -0
  315. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/spatial.py +0 -0
  316. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/stl.py +0 -0
  317. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/stljax.py +0 -0
  318. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/parser/tokenizer.py +0 -0
  319. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/preprocessing.py +0 -0
  320. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/problem.py +0 -0
  321. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/sparsity.py +0 -0
  322. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/symbolic/unified.py +0 -0
  323. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/utils/__init__.py +0 -0
  324. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/utils/cache.py +0 -0
  325. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/utils/caching.py +0 -0
  326. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/utils/printing.py +0 -0
  327. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/utils/profiling.py +0 -0
  328. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx/utils/utils.py +0 -0
  329. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx.egg-info/dependency_links.txt +0 -0
  330. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx.egg-info/entry_points.txt +0 -0
  331. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/openscvx.egg-info/top_level.txt +0 -0
  332. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/scripts/gen_example_pages.py +0 -0
  333. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/scripts/gen_ref_pages.py +0 -0
  334. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  335. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/setup.cfg +0 -0
  336. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/__init__.py +0 -0
  337. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/_marks.py +0 -0
  338. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/__init__.py +0 -0
  339. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/_iteration_helpers.py +0 -0
  340. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/autotuner/__init__.py +0 -0
  341. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/autotuner/test_defaults_agreement.py +0 -0
  342. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/autotuner/test_hyper_overrides.py +0 -0
  343. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
  344. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
  345. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/test_iteration_fn_jit.py +0 -0
  346. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/test_iteration_fn_parity.py +0 -0
  347. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/algorithms/test_make_solve_loop.py +0 -0
  348. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/brachistochrone_analytical.py +0 -0
  349. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/conftest.py +0 -0
  350. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/expr/__init__.py +0 -0
  351. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/expr/test_gmsr.py +0 -0
  352. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/fixtures/brachistochrone.json +0 -0
  353. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/fixtures/brachistochrone.yaml +0 -0
  354. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/hohmann_analytical.py +0 -0
  355. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/integrations/__init__.py +0 -0
  356. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/integrations/test_mjx.py +0 -0
  357. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/integrations/test_mjx_dynamics.py +0 -0
  358. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/__init__.py +0 -0
  359. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/_iteration_callback_helpers.py +0 -0
  360. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
  361. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/test_iteration_callback_cvxpy.py +0 -0
  362. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/test_iteration_callback_moreau.py +0 -0
  363. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/test_iteration_callback_qpax.py +0 -0
  364. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/test_iteration_callback_vmap.py +0 -0
  365. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/test_moreau_ptr_solver.py +0 -0
  366. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/test_qpax_ptr_solver.py +0 -0
  367. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/solvers/test_subproblem_pytree.py +0 -0
  368. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/__init__.py +0 -0
  369. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/__init__.py +0 -0
  370. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_arithmetic.py +0 -0
  371. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_array.py +0 -0
  372. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_constraint.py +0 -0
  373. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_expr.py +0 -0
  374. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_lie.py +0 -0
  375. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_linalg.py +0 -0
  376. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_logic.py +0 -0
  377. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_math.py +0 -0
  378. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_node_reference.py +0 -0
  379. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_parameters.py +0 -0
  380. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_scaling.py +0 -0
  381. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_spatial.py +0 -0
  382. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_stl.py +0 -0
  383. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_variable.py +0 -0
  384. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/expr/test_vmap.py +0 -0
  385. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/__init__.py +0 -0
  386. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_array.py +0 -0
  387. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_constraint.py +0 -0
  388. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_lie.py +0 -0
  389. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_linalg.py +0 -0
  390. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_load.py +0 -0
  391. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_logic.py +0 -0
  392. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_math.py +0 -0
  393. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_parser.py +0 -0
  394. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_spatial.py +0 -0
  395. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_stl.py +0 -0
  396. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_tokenizer.py +0 -0
  397. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/parser/test_vmap.py +0 -0
  398. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/test_augmentation.py +0 -0
  399. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/test_hashing.py +0 -0
  400. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/test_lower_cvxpy.py +0 -0
  401. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/test_lower_jax.py +0 -0
  402. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/test_preprocessing.py +0 -0
  403. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/test_sparsity.py +0 -0
  404. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/symbolic/test_unified.py +0 -0
  405. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_autotuning.py +0 -0
  406. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_brachistochrone.py +0 -0
  407. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_cvxpygen_optional.py +0 -0
  408. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_discretization.py +0 -0
  409. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_expert.py +0 -0
  410. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_impulsive.py +0 -0
  411. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_init.py +0 -0
  412. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_integrators.py +0 -0
  413. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_loader.py +0 -0
  414. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_optimization_results.py +0 -0
  415. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_plotting.py +0 -0
  416. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_propagation.py +0 -0
  417. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_solve_batched_brachistochrone.py +0 -0
  418. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_solve_batched_cvxpy_export_errors.py +0 -0
  419. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_solve_batched_export_roundtrip.py +0 -0
  420. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_solve_batched_inference.py +0 -0
  421. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_solve_jax_bare_brachistochrone.py +0 -0
  422. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_solve_jax_jit_brachistochrone.py +0 -0
  423. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_solve_jax_vmap_brachistochrone.py +0 -0
  424. {openscvx-0.5.3.dev26 → openscvx-0.5.3.dev28}/tests/test_solve_jax_vmap_converged_no_drift.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev26
3
+ Version: 0.5.3.dev28
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
@@ -37,12 +37,15 @@ Requires-Dist: jaxlie; extra == "lie"
37
37
  Provides-Extra: mjx
38
38
  Requires-Dist: mujoco>=3.0; extra == "mjx"
39
39
  Requires-Dist: mujoco-mjx>=3.0; extra == "mjx"
40
+ Provides-Extra: frax
41
+ Requires-Dist: frax>=0.0.4; extra == "frax"
40
42
  Provides-Extra: test
41
43
  Requires-Dist: pytest; extra == "test"
42
44
  Requires-Dist: scipy; extra == "test"
43
45
  Requires-Dist: jaxlie; extra == "test"
44
46
  Requires-Dist: svgpathtools; extra == "test"
45
47
  Requires-Dist: pytest-xdist; extra == "test"
48
+ Requires-Dist: frax>=0.0.4; extra == "test"
46
49
  Dynamic: license-file
47
50
 
48
51
  <a id="readme-top"></a>
@@ -0,0 +1,343 @@
1
+ """Minimum time-to-climb of a supersonic aircraft (Bryson's interceptor).
2
+
3
+ The classic minimum time-to-climb benchmark from Bryson, Desai and Hoffman,
4
+ *"Energy-State Approximation in Performance Optimization of Supersonic Aircraft,"*
5
+ Journal of Aircraft, Vol. 6, No. 6, 1969, pp. 481-488, reproduced in the GPOPS-II
6
+ user's guide. The aircraft starts at sea level in level flight and must reach
7
+ 20 km altitude at a prescribed speed and flight-path angle in minimum time. The
8
+ optimal trajectory dashes near the ground to build kinetic energy, then
9
+ zoom-climbs through the transonic region — energy management, not a monotonic
10
+ climb.
11
+
12
+ Point-mass dynamics over a spherical, non-rotating Earth (state ``[h, v, gamma,
13
+ m]`` = altitude, speed, flight-path angle, mass; control ``alpha`` = angle of
14
+ attack):
15
+
16
+ h_dot = v sin(gamma)
17
+ v_dot = (T cos(alpha) - D) / m - mu sin(gamma) / r^2
18
+ gamma_dot = (T sin(alpha) + L) / (m v) + cos(gamma) (v / r - mu / (v r^2))
19
+ m_dot = -T / (g0 Isp)
20
+
21
+ with ``r = Re + h``, dynamic pressure ``q = 0.5 rho v^2``, lift ``L = q S CL``
22
+ and drag ``D = q S CD``, ``CL = Clalpha alpha`` and ``CD = CD0 + eta Clalpha
23
+ alpha^2``. The objective is the free final time.
24
+
25
+ The model is defined by lookup tables, and the interpolant matters for SCP — the
26
+ dynamics are re-linearized every iteration, so a C0 ``Linterp`` chatters:
27
+
28
+ - Atmosphere ``rho(h)``, ``a(h)`` (U.S. 1976 Standard Atmosphere): cubic
29
+ ``Cinterp``, since the tables are smooth and monotone.
30
+ - Aerodynamics ``CD0(M)``, ``Clalpha(M)``, ``eta(M)``: PCHIP ``Cinterp``. These
31
+ have a sharp transonic peak that a cubic overshoots non-physically (e.g.
32
+ ``eta`` dipping ~30% below its tabulated floor), so the shape-preserving PCHIP
33
+ is used instead.
34
+ - Engine thrust ``T(h, M)``: bilinear ``Bilerp`` (the only 2-D primitive) — a
35
+ faithful stand-in for the GPOPS 2-D spline.
36
+
37
+ States are kept in SI units; OpenSCvx auto-scales them from their min/max bounds.
38
+ """
39
+
40
+ import os
41
+ import sys
42
+
43
+ import numpy as np
44
+ import plotly.graph_objects as go
45
+ from plotly.subplots import make_subplots
46
+
47
+ current_dir = os.path.dirname(os.path.abspath(__file__))
48
+ grandparent_dir = os.path.dirname(os.path.dirname(current_dir))
49
+ if grandparent_dir not in sys.path:
50
+ sys.path.append(grandparent_dir)
51
+
52
+ import openscvx as ox
53
+ from openscvx.plotting import plot_controls, plot_scp_iterations, plot_states
54
+
55
+ # ---------------------------------------------------------------------------
56
+ # Physical constants (SI)
57
+ # ---------------------------------------------------------------------------
58
+ Re = 6378145.0 # Earth radius (m)
59
+ mu = 3.986e14 # Earth gravitational parameter (m^3 / s^2)
60
+ S = 49.2386 # aerodynamic reference area (m^2)
61
+ g0 = 9.80665 # standard gravity (m / s^2)
62
+ Isp = 1600.0 # specific impulse (s)
63
+
64
+ # ---------------------------------------------------------------------------
65
+ # Tabulated aircraft data
66
+ # ---------------------------------------------------------------------------
67
+ # U.S. 1976 Standard Atmosphere, truncated to the climb envelope
68
+ # (altitude m, density kg/m^3, speed of sound m/s).
69
+ atmosphere = np.array(
70
+ [
71
+ [-2000.0, 1.478e00, 3.479e02],
72
+ [0.0, 1.225e00, 3.403e02],
73
+ [2000.0, 1.007e00, 3.325e02],
74
+ [4000.0, 8.193e-01, 3.246e02],
75
+ [6000.0, 6.601e-01, 3.165e02],
76
+ [8000.0, 5.258e-01, 3.081e02],
77
+ [10000.0, 4.135e-01, 2.995e02],
78
+ [12000.0, 3.119e-01, 2.951e02],
79
+ [14000.0, 2.279e-01, 2.951e02],
80
+ [16000.0, 1.665e-01, 2.951e02],
81
+ [18000.0, 1.216e-01, 2.951e02],
82
+ [20000.0, 8.891e-02, 2.951e02],
83
+ [22000.0, 6.451e-02, 2.964e02],
84
+ [24000.0, 4.694e-02, 2.977e02],
85
+ [26000.0, 3.426e-02, 2.991e02],
86
+ [28000.0, 2.508e-02, 3.004e02],
87
+ [30000.0, 1.841e-02, 3.017e02],
88
+ [32000.0, 1.355e-02, 3.030e02],
89
+ ]
90
+ )
91
+ alt_table = atmosphere[:, 0]
92
+ rho_table = atmosphere[:, 1]
93
+ sos_table = atmosphere[:, 2]
94
+
95
+ # Aerodynamic coefficients vs. Mach number (Bryson 1969).
96
+ mach_table = np.array([0.0, 0.4, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8])
97
+ Clalpha_table = np.array([3.44, 3.44, 3.44, 3.58, 4.44, 3.44, 3.01, 2.86, 2.44])
98
+ CD0_table = np.array([0.013, 0.013, 0.013, 0.014, 0.031, 0.041, 0.039, 0.036, 0.035])
99
+ eta_table = np.array([0.54, 0.54, 0.54, 0.75, 0.79, 0.78, 0.89, 0.93, 0.93])
100
+
101
+ # Engine thrust (N) on an (altitude, Mach) grid. The raw table is indexed
102
+ # [Mach, altitude] and given in 1000-lbf; convert to Newtons and transpose so
103
+ # that thrust_grid[i, j] is the thrust at (thrust_alt[i], thrust_mach[j]).
104
+ thrust_mach = np.array([0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8])
105
+ thrust_alt = 304.8 * np.array([0.0, 5, 10, 15, 20, 25, 30, 40, 50, 70])
106
+ thrust_lbf = np.array(
107
+ [
108
+ [24.2, 24.0, 20.3, 17.3, 14.5, 12.2, 10.2, 5.7, 3.4, 0.1],
109
+ [28.0, 24.6, 21.1, 18.1, 15.2, 12.8, 10.7, 6.5, 3.9, 0.2],
110
+ [28.3, 25.2, 21.9, 18.7, 15.9, 13.4, 11.2, 7.3, 4.4, 0.4],
111
+ [30.8, 27.2, 23.8, 20.5, 17.3, 14.7, 12.3, 8.1, 4.9, 0.8],
112
+ [34.5, 30.3, 26.6, 23.2, 19.8, 16.8, 14.1, 9.4, 5.6, 1.1],
113
+ [37.9, 34.3, 30.4, 26.8, 23.3, 19.8, 16.8, 11.2, 6.8, 1.4],
114
+ [36.1, 38.0, 34.9, 31.3, 27.3, 23.6, 20.1, 13.4, 8.3, 1.7],
115
+ [36.1, 36.6, 38.5, 36.1, 31.6, 28.1, 24.2, 16.2, 10.0, 2.2],
116
+ [36.1, 35.2, 42.1, 38.7, 35.7, 32.0, 28.1, 19.3, 11.9, 2.9],
117
+ [36.1, 33.8, 45.7, 41.3, 39.8, 34.6, 31.1, 21.7, 13.3, 3.1],
118
+ ]
119
+ )
120
+ thrust_grid = (4448.222 * thrust_lbf).T # -> N, shape (alt, Mach)
121
+
122
+ # ---------------------------------------------------------------------------
123
+ # Boundary conditions and limits
124
+ # ---------------------------------------------------------------------------
125
+ alt0, altf = 0.0, 19994.88 # altitude (m)
126
+ speed0, speedf = 129.314, 295.092 # speed (m/s)
127
+ fpa0, fpaf = 0.0, 0.0 # flight-path angle (rad)
128
+ mass0 = 19050.864 # initial mass (kg)
129
+
130
+ n = 80 # discretization nodes
131
+ tf_guess = 300.0 # initial guess for the (free) final time
132
+
133
+ # Hold near the altitude floor for the first dash_fraction of the horizon, then
134
+ # climb: this steers the local solver into the energy-optimal "sea-level dash,
135
+ # then zoom-climb" basin rather than the suboptimal "climb immediately" one.
136
+ dash_fraction = 0.15
137
+ _climb = np.clip((np.linspace(0.0, 1.0, n) - dash_fraction) / (1.0 - dash_fraction), 0.0, 1.0)
138
+
139
+ # ---------------------------------------------------------------------------
140
+ # States — guesses default to a linear initial->final interpolation when unset,
141
+ # so only altitude (the dash hold) needs an explicit guess.
142
+ # ---------------------------------------------------------------------------
143
+ h = ox.State("altitude", shape=(1,))
144
+ h.min, h.max = [0.0], [21031.2]
145
+ h.initial, h.final = [alt0], [altf]
146
+ h.guess = (altf * _climb).reshape(-1, 1)
147
+
148
+ v = ox.State("speed", shape=(1,))
149
+ v.min, v.max = [5.0], [1000.0]
150
+ v.initial, v.final = [speed0], [speedf]
151
+
152
+ gamma = ox.State("flight_path_angle", shape=(1,))
153
+ gamma.min, gamma.max = [np.deg2rad(-40.0)], [np.deg2rad(40.0)]
154
+ gamma.initial, gamma.final = [fpa0], [fpaf]
155
+
156
+ mass = ox.State("mass", shape=(1,))
157
+ mass.min, mass.max = [22.0], [20410.0]
158
+ mass.initial, mass.final = [mass0], [ox.Free(mass0)] # final mass free (fuel burned)
159
+
160
+ # ---------------------------------------------------------------------------
161
+ # Control (controls always need an explicit guess)
162
+ # ---------------------------------------------------------------------------
163
+ alpha = ox.Control("angle_of_attack", shape=(1,))
164
+ alpha.min, alpha.max = [np.deg2rad(-45.0)], [np.deg2rad(45.0)]
165
+ alpha.guess = np.zeros((n, 1))
166
+
167
+ states = [h, v, gamma, mass]
168
+ controls = [alpha]
169
+
170
+ # ---------------------------------------------------------------------------
171
+ # Dynamics
172
+ # ---------------------------------------------------------------------------
173
+ hs, vs, fpas, ms = h[0], v[0], gamma[0], mass[0]
174
+ a = alpha[0]
175
+
176
+ r = hs + Re
177
+ rho = ox.Cinterp(hs, alt_table, rho_table)
178
+ sos = ox.Cinterp(hs, alt_table, sos_table)
179
+ mach = vs / sos
180
+
181
+ # PCHIP for the aero coefficients: a cubic overshoots their sharp transonic peak
182
+ # (see the module docstring).
183
+ CD0 = ox.Cinterp(mach, mach_table, CD0_table, method="pchip")
184
+ Clalpha = ox.Cinterp(mach, mach_table, Clalpha_table, method="pchip")
185
+ eta = ox.Cinterp(mach, mach_table, eta_table, method="pchip")
186
+ thrust = ox.Bilerp(hs, mach, thrust_alt, thrust_mach, thrust_grid)
187
+
188
+ CL = Clalpha * a
189
+ CD = CD0 + eta * Clalpha * a**2
190
+ q = 0.5 * rho * vs**2
191
+ lift = q * S * CL
192
+ drag = q * S * CD
193
+
194
+ dynamics = {
195
+ "altitude": vs * ox.Sin(fpas),
196
+ "speed": (thrust * ox.Cos(a) - drag) / ms - mu * ox.Sin(fpas) / r**2,
197
+ "flight_path_angle": (thrust * ox.Sin(a) + lift) / (ms * vs)
198
+ + ox.Cos(fpas) * (vs / r - mu / (vs * r**2)),
199
+ "mass": -thrust / (g0 * Isp),
200
+ }
201
+
202
+ # ---------------------------------------------------------------------------
203
+ # Constraints: keep every state inside its box along the trajectory.
204
+ # ---------------------------------------------------------------------------
205
+ constraints = []
206
+ for state in states:
207
+ constraints.extend([ox.ctcs(state <= state.max), ox.ctcs(state.min <= state)])
208
+
209
+ # ---------------------------------------------------------------------------
210
+ # Free final time, minimized.
211
+ # ---------------------------------------------------------------------------
212
+ time = ox.Time(
213
+ initial=0.0,
214
+ final=("minimize", tf_guess),
215
+ min=0.0,
216
+ max=800.0,
217
+ )
218
+
219
+ # A fixed proximal weight converges cleaner and faster than the adaptive default
220
+ # here; lam_prox = 2e-2 is the sweet spot for this problem.
221
+ problem = ox.Problem(
222
+ dynamics=dynamics,
223
+ states=states,
224
+ controls=controls,
225
+ time=time,
226
+ constraints=constraints,
227
+ N=n,
228
+ licq_max=1e-8,
229
+ algorithm={"lam_prox": 2e-2, "autotuner": ox.ConstantProximalWeight()},
230
+ )
231
+
232
+
233
+ def plot_gpops_comparison(results):
234
+ """Reproduce the four GPOPS-II diagnostic plots for this benchmark.
235
+
236
+ Lays out altitude vs. time, the altitude-vs-speed energy path, flight-path
237
+ angle vs. time, and angle of attack vs. time. The high-resolution propagated
238
+ trajectory is drawn as a line with the discretization nodes overlaid.
239
+ """
240
+ nodes, traj = results.nodes, results.trajectory
241
+
242
+ def col(source, key):
243
+ return np.asarray(source[key]).flatten()
244
+
245
+ fig = make_subplots(
246
+ rows=2,
247
+ cols=2,
248
+ subplot_titles=(
249
+ "Altitude vs. Time",
250
+ "Altitude vs. Speed (energy path)",
251
+ "Flight-Path Angle vs. Time",
252
+ "Angle of Attack vs. Time",
253
+ ),
254
+ )
255
+
256
+ # (row, col, x, y) for each panel, in (trajectory, node) units.
257
+ panels = [
258
+ (
259
+ 1,
260
+ 1,
261
+ col(traj, "time"),
262
+ col(traj, "altitude") / 1e3,
263
+ col(nodes, "time"),
264
+ col(nodes, "altitude") / 1e3,
265
+ ),
266
+ (
267
+ 1,
268
+ 2,
269
+ col(traj, "speed"),
270
+ col(traj, "altitude") / 1e3,
271
+ col(nodes, "speed"),
272
+ col(nodes, "altitude") / 1e3,
273
+ ),
274
+ (
275
+ 2,
276
+ 1,
277
+ col(traj, "time"),
278
+ np.rad2deg(col(traj, "flight_path_angle")),
279
+ col(nodes, "time"),
280
+ np.rad2deg(col(nodes, "flight_path_angle")),
281
+ ),
282
+ (
283
+ 2,
284
+ 2,
285
+ col(traj, "time"),
286
+ np.rad2deg(col(traj, "angle_of_attack")),
287
+ col(nodes, "time"),
288
+ np.rad2deg(col(nodes, "angle_of_attack")),
289
+ ),
290
+ ]
291
+ for i, (r, c, xt, yt, xn, yn) in enumerate(panels):
292
+ first = i == 0
293
+ fig.add_trace(
294
+ go.Scatter(
295
+ x=xt,
296
+ y=yt,
297
+ mode="lines",
298
+ name="Propagated",
299
+ line={"color": "#19d3f3", "width": 2},
300
+ legendgroup="traj",
301
+ showlegend=first,
302
+ ),
303
+ row=r,
304
+ col=c,
305
+ )
306
+ fig.add_trace(
307
+ go.Scatter(
308
+ x=xn,
309
+ y=yn,
310
+ mode="markers",
311
+ name="Nodes",
312
+ marker={"color": "#ffa600", "size": 5},
313
+ legendgroup="nodes",
314
+ showlegend=first,
315
+ ),
316
+ row=r,
317
+ col=c,
318
+ )
319
+
320
+ fig.update_xaxes(title_text="Time [s]", row=1, col=1)
321
+ fig.update_yaxes(title_text="Altitude [km]", row=1, col=1)
322
+ fig.update_xaxes(title_text="Speed [m/s]", row=1, col=2)
323
+ fig.update_yaxes(title_text="Altitude [km]", row=1, col=2)
324
+ fig.update_xaxes(title_text="Time [s]", row=2, col=1)
325
+ fig.update_yaxes(title_text="Flight-path angle [deg]", row=2, col=1)
326
+ fig.update_xaxes(title_text="Time [s]", row=2, col=2)
327
+ fig.update_yaxes(title_text="Angle of attack [deg]", row=2, col=2)
328
+ fig.update_layout(title="Supersonic Minimum Time-to-Climb", template="plotly_dark")
329
+ return fig
330
+
331
+
332
+ if __name__ == "__main__":
333
+ problem.initialize()
334
+ results = problem.solve()
335
+ results = problem.post_process()
336
+
337
+ final_time = float(np.asarray(results.nodes["time"]).flatten()[-1])
338
+ print(f"Minimum time-to-climb: {final_time:.2f} s")
339
+
340
+ plot_gpops_comparison(results).show()
341
+ plot_states(results).show()
342
+ plot_controls(results).show()
343
+ plot_scp_iterations(results).show()
@@ -133,20 +133,9 @@ problem = Problem(
133
133
  "lam_prox": 6e-3,
134
134
  "lam_vc": 1e1,
135
135
  "lam_cost": 1e-3,
136
- # "ep_vc": 1e-6,
137
- # "ep_tr": 1e-3,
138
136
  },
139
137
  float_dtype="float64",
140
138
  licq_max=1e-10,
141
- solver={
142
- "cvx_solver": "Mosek",
143
- "solver_args": {
144
- "canon_backend": "COO",
145
- "enforce_dpp": True,
146
- # "abstol": 1e-7,
147
- # "reltol": 1e-10,
148
- },
149
- },
150
139
  )
151
140
 
152
141
  plotting_dict = {
@@ -32,7 +32,7 @@ from openscvx import Problem
32
32
  from openscvx.utils import gen_vertices, rot
33
33
 
34
34
  n = 33 # Number of Nodes
35
- total_time = 30.0 # Total time for the simulation
35
+ total_time = 40.0 # Total time for the simulation
36
36
 
37
37
  # Define state components
38
38
  position = ox.State("position", shape=(3,)) # 3D position [x, y, z]
@@ -241,8 +241,7 @@ problem = Problem(
241
241
  time=time,
242
242
  constraints=constraints,
243
243
  N=n,
244
- algorithm={"lam_prox": 5e-2, "lam_vc": 1e0, "lam_cost": 2.5e-3, "ep_tr": 1e-5},
245
- discretizer=ox.VectorizeDiscretizeLinearize(diffrax_kwargs={"atol": 1e-4}),
244
+ # algorithm={"lam_prox": 5e-2, "lam_vc": 1e0, "lam_cost": 2.5e-3, "ep_tr": 1e-5},
246
245
  )
247
246
 
248
247
  plotting_dict = {