openscvx 0.5.3.dev56__tar.gz → 0.5.3.dev57__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 (534) hide show
  1. {openscvx-0.5.3.dev56/openscvx.egg-info → openscvx-0.5.3.dev57}/PKG-INFO +1 -1
  2. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UnderTheHood/custom_algorithms_autotuners.md +5 -0
  3. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/_version.py +3 -3
  4. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/autotuner/acceptance_ratio.py +23 -0
  5. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/autotuner/augmented_lagrangian.py +19 -1
  6. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/autotuner/base.py +13 -0
  7. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/problem.py +28 -3
  8. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/__init__.py +3 -1
  9. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/expr.py +41 -1
  10. openscvx-0.5.3.dev57/openscvx/symbolic/expr/lie/_citations.py +14 -0
  11. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/lie/se3.py +10 -1
  12. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/lie/so3.py +10 -1
  13. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/stl.py +16 -1
  14. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/stljax.py +17 -1
  15. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/problem.py +39 -0
  16. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57/openscvx.egg-info}/PKG-INFO +1 -1
  17. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx.egg-info/SOURCES.txt +4 -0
  18. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx.egg-info/scm_file_list.json +4 -0
  19. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx.egg-info/scm_version.json +2 -2
  20. openscvx-0.5.3.dev57/tests/algorithms/autotuner/test_citation.py +44 -0
  21. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_expr.py +40 -1
  22. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_lie.py +26 -0
  23. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_stl.py +22 -0
  24. openscvx-0.5.3.dev57/tests/symbolic/test_citations.py +90 -0
  25. openscvx-0.5.3.dev57/tests/test_citation.py +98 -0
  26. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/assets/logo.svg +0 -0
  27. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/release-drafter.yml +0 -0
  28. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/_docs.yml +0 -0
  29. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/_extra.yml +0 -0
  30. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/branch-name.yml +0 -0
  31. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/docs.yml +0 -0
  32. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/lint.yml +0 -0
  33. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/nightly.yml +0 -0
  34. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/release-drafter.yml +0 -0
  35. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/release.yml +0 -0
  36. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/tests-cvxpygen.yml +0 -0
  37. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/tests-examples.yml +0 -0
  38. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/tests-lie.yml +0 -0
  39. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/tests-mjx.yml +0 -0
  40. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/tests-qpax.yml +0 -0
  41. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.github/workflows/tests.yml +0 -0
  42. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.gitignore +0 -0
  43. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/.gitmodules +0 -0
  44. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/CITATION.cff +0 -0
  45. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/CONTRIBUTING.md +0 -0
  46. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/LICENSE +0 -0
  47. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/README.md +0 -0
  48. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/Foundations/constraint_reformulation.md +0 -0
  49. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/Foundations/control_parameterization.md +0 -0
  50. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/Foundations/discretization.md +0 -0
  51. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/Foundations/ocp.md +0 -0
  52. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/Foundations/scvx.md +0 -0
  53. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/Foundations/time_dilation.md +0 -0
  54. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UnderTheHood/batching_jit_grad.md +0 -0
  55. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UnderTheHood/lowering_architecture.md +0 -0
  56. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  57. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/00_introduction.md +0 -0
  58. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  59. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  60. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  61. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  62. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/05_visualization.md +0 -0
  63. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/06_logic.md +0 -0
  64. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/07_lie.md +0 -0
  65. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/08_mpcc.md +0 -0
  66. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/UsersGuide/09_mjx_dynamics.md +0 -0
  67. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/favicon.png +0 -0
  68. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/images/ct-scvx_dark.png +0 -0
  69. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/images/ct-scvx_light.png +0 -0
  70. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/images/ctcs_dark.png +0 -0
  71. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/images/ctcs_light.png +0 -0
  72. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/images/problem_class_dark.png +0 -0
  73. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/images/problem_class_light.png +0 -0
  74. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/logo.svg +0 -0
  75. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/openscvx_logo_square.png +0 -0
  76. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/viser-client/index.html +0 -0
  77. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  78. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  79. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/changelog.md +0 -0
  80. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/citation.md +0 -0
  81. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/examples.md +0 -0
  82. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/index.md +0 -0
  83. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/installation.md +0 -0
  84. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/javascripts/mathjax.js +0 -0
  85. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/llms.txt +0 -0
  86. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/docs/versions.json +0 -0
  87. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/_maze.py +0 -0
  88. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/_maze_viz.py +0 -0
  89. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/_viser_embed_export.py +0 -0
  90. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/abstract/brachistochrone.py +0 -0
  91. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/abstract/brachistochrone_batched.py +0 -0
  92. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/abstract/chen_allgoewer.py +0 -0
  93. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/abstract/flappy_bird.py +0 -0
  94. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/abstract/hypersensitive.py +0 -0
  95. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/abstract/impulsive.py +0 -0
  96. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/abstract/stl_integer_variable.py +0 -0
  97. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/abstract/stl_or.py +0 -0
  98. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/aircraft/dynamic_soaring.py +0 -0
  99. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/aircraft/supersonic_time_to_climb.py +0 -0
  100. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/animations/7_dof_arm.py +0 -0
  101. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/animations/_camera.py +0 -0
  102. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/animations/_render.py +0 -0
  103. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/animations/_sensor_view.py +0 -0
  104. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/animations/dr_vp_polytope.py +0 -0
  105. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  106. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/animations/logo.py +0 -0
  107. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  108. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/animations/senss_hop_lidar_camera.py +0 -0
  109. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/arm/3_dof_arm.py +0 -0
  110. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/arm/7_dof_arm.py +0 -0
  111. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/arm/7_dof_arm_collision.py +0 -0
  112. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/arm/7_dof_arm_vp.py +0 -0
  113. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  114. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  115. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/arm/franka_fr3v2_viewplanning_nodal.py +0 -0
  116. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/dubins_car.py +0 -0
  117. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/dubins_car_disjoint.py +0 -0
  118. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  119. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/dubins_car_obstacle_stl.py +0 -0
  120. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/dubins_car_stl_or.py +0 -0
  121. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/dubins_car_waypoint_stl.py +0 -0
  122. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/_plotting.py +0 -0
  123. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/_time2spatial.py +0 -0
  124. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/_tracks/LMS_Track.txt +0 -0
  125. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/_tracks/LMS_Track_x4.txt +0 -0
  126. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/_tracks/readDataFcn.py +0 -0
  127. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/_viser.py +0 -0
  128. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/race_car_hybrid.py +0 -0
  129. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/race_car_ice.py +0 -0
  130. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/race_car_mpc.py +0 -0
  131. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/race_car_multi_agent.py +0 -0
  132. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/race_car_multi_agent_mpcc.py +0 -0
  133. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/race_car_multi_agent_mpcc_ice.py +0 -0
  134. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/car/racing/race_car_openscvx.py +0 -0
  135. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/double_integrator/_plotting.py +0 -0
  136. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/double_integrator/double_integrator_static.py +0 -0
  137. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/double_integrator/maze_rrt_scp.py +0 -0
  138. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/double_integrator/moving_safe_zones.py +0 -0
  139. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/double_integrator/multiphase_velocity.py +0 -0
  140. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/double_integrator/obstacle_avoidance_vmap.py +0 -0
  141. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/double_integrator/obstacle_avoidance_vmap_2d.py +0 -0
  142. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/_plotting.py +0 -0
  143. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/_terrain.py +0 -0
  144. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/boresight_trace_mpcc.py +0 -0
  145. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/cinema_vp.py +0 -0
  146. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/cinema_vp_nodal.py +0 -0
  147. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/dr_vp.py +0 -0
  148. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/dr_vp_nodal.py +0 -0
  149. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/dr_vp_polytope.py +0 -0
  150. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/drone_racing.py +0 -0
  151. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/drone_racing_batched_gates.py +0 -0
  152. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/logo.py +0 -0
  153. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/logo_utils/acl_logo.svg +0 -0
  154. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/logo_utils/circle.svg +0 -0
  155. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/logo_utils/openscvx_logo_single.svg +0 -0
  156. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/logo_utils/quadrotor_mesh.py +0 -0
  157. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  158. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/lunar_terrain_agl.py +0 -0
  159. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/maze_scp.py +0 -0
  160. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/moving_safe_columns.py +0 -0
  161. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/obstacle_avoidance.py +0 -0
  162. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  163. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/openscvx_logo.py +0 -0
  164. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/quadrotor_hector.py +0 -0
  165. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/drone/quadrotor_zigzag.py +0 -0
  166. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/frax/panda_frax.py +0 -0
  167. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/frax/panda_frax_pick_place.py +0 -0
  168. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/frax/panda_frax_viewplanning.py +0 -0
  169. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/frax/panda_frax_waypoint.py +0 -0
  170. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/frax/ur5e_assets/ur5e.urdf +0 -0
  171. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/frax/ur5e_pen_trace.py +0 -0
  172. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/frax/ur5e_pen_trace_mpcc.py +0 -0
  173. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mjx/cartpole_mjx.py +0 -0
  174. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mjx/double_cartpole_mjx.py +0 -0
  175. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mjx/skydio_x2_mjx.py +0 -0
  176. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  177. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mjx/triple_cartpole_game.py +0 -0
  178. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mjx/triple_cartpole_mjx.py +0 -0
  179. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mpc/double_integrator_discrete.py +0 -0
  180. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mpc/double_integrator_drone_racing.py +0 -0
  181. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  182. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  183. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  184. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/multi_agent/ilqgames_three_agent.py +0 -0
  185. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/multi_agent/ilqgames_three_agent_lqr.py +0 -0
  186. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/multi_agent/multi_agent_circle_swap.py +0 -0
  187. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/pendulum/pendulum_swingup_ocp.py +0 -0
  188. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/plotting.py +0 -0
  189. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/plotting_viser.py +0 -0
  190. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  191. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  192. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  193. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  194. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  195. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  196. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  197. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  198. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/cinema_vp_realtime.py +0 -0
  199. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/drone_racing_realtime.py +0 -0
  200. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/dubins_car_realtime.py +0 -0
  201. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  202. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/3DoF_pdg.py +0 -0
  203. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/6DoF_pdg.py +0 -0
  204. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/6DoF_pdg_batched_ic.py +0 -0
  205. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/6DoF_pdg_stc.py +0 -0
  206. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/6DoF_pdg_stc_ifthen.py +0 -0
  207. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/_cstc_plotting.py +0 -0
  208. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/ascent_launch_vehicle.py +0 -0
  209. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/reusable_launch_vehicle.py +0 -0
  210. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/rocket_ilqr.py +0 -0
  211. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/6DoF_pdg_dem.py +0 -0
  212. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/6DoF_pdg_dem_static.py +0 -0
  213. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/6DoF_pdg_stc_senss.py +0 -0
  214. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/6DoF_pdg_stc_senss_gimbal.py +0 -0
  215. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/6DoF_pdg_stc_senss_gimbal_hop.py +0 -0
  216. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/6DoF_pdg_stc_senss_hop.py +0 -0
  217. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/6DoF_pdg_stc_senss_planar.py +0 -0
  218. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/_dem.py +0 -0
  219. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/_halo/__init__.py +0 -0
  220. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/_halo/dem.py +0 -0
  221. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/_halo/lidar.py +0 -0
  222. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/_hop_lidar_overlay.py +0 -0
  223. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/rocket/senss/senss_dem.png +0 -0
  224. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/scaling/scaling_study.py +0 -0
  225. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/capstone/capstone.bin +0 -0
  226. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/capstone/capstone.gltf +0 -0
  227. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/capstone/capstone_albedo.jpg +0 -0
  228. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/capstone/capstone_ao.jpg +0 -0
  229. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/capstone/capstone_normals.png +0 -0
  230. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/capstone/capstone_pbr_jpg.jpg +0 -0
  231. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/capstone/capstone_plot_mesh.npz +0 -0
  232. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/capstone/foil_normal.jpg +0 -0
  233. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/dual_deputy_inspection_cw.py +0 -0
  234. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/halo_orbit.py +0 -0
  235. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/hohmann_transfer.py +0 -0
  236. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/let_transfer.py +0 -0
  237. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/proxops_cw.py +0 -0
  238. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/examples/spacecraft/relative_loitering.py +0 -0
  239. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/figures/ctlos_cine.gif +0 -0
  240. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/figures/ctlos_dr.gif +0 -0
  241. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/figures/dtlos_cine.gif +0 -0
  242. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/figures/dtlos_dr.gif +0 -0
  243. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/figures/openscvx_logo.svg +0 -0
  244. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/figures/openscvx_logo_square.png +0 -0
  245. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/figures/oscvx_structure_full_dark.svg +0 -0
  246. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/figures/video_preview.png +0 -0
  247. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/__init__.py +0 -0
  248. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/assets/stylesheets/custom.css +0 -0
  249. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  250. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  251. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  252. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/home.html +0 -0
  253. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/main.html +0 -0
  254. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/partials/home-diagram.html +0 -0
  255. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/partials/home-dropin-banner.html +0 -0
  256. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/partials/home-hero.html +0 -0
  257. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/partials/home-pipeline.html +0 -0
  258. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/partials/home-viser-strip.html +0 -0
  259. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/material/overrides/sitemap.xml +0 -0
  260. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/mkdocs.yml +0 -0
  261. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/__init__.py +0 -0
  262. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/__main__.py +0 -0
  263. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/__init__.py +0 -0
  264. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/autotuner/__init__.py +0 -0
  265. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  266. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  267. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  268. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/base.py +0 -0
  269. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/history.py +0 -0
  270. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/hyperparams.py +0 -0
  271. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/loop.py +0 -0
  272. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/optimization_results.py +0 -0
  273. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/penalty.py +0 -0
  274. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/scvx/__init__.py +0 -0
  275. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/scvx/iteration.py +0 -0
  276. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
  277. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/state.py +0 -0
  278. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/algorithms/weights.py +0 -0
  279. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/config.py +0 -0
  280. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/discretization/__init__.py +0 -0
  281. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/discretization/base.py +0 -0
  282. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/discretization/discretize_linearize.py +0 -0
  283. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/discretization/linearize_discretize.py +0 -0
  284. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  285. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  286. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  287. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  288. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/expert/__init__.py +0 -0
  289. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/expert/byof.py +0 -0
  290. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/expert/lowering.py +0 -0
  291. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/expert/validation.py +0 -0
  292. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/init/__init__.py +0 -0
  293. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/init/interpolation.py +0 -0
  294. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/init/inverse_kinematics.py +0 -0
  295. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/integrations/__init__.py +0 -0
  296. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/integrations/_utils.py +0 -0
  297. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/integrations/base.py +0 -0
  298. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/integrations/frax.py +0 -0
  299. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/integrations/menagerie.py +0 -0
  300. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/integrations/mjx.py +0 -0
  301. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/integrators/__init__.py +0 -0
  302. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/integrators/diffrax.py +0 -0
  303. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/integrators/runge_kutta.py +0 -0
  304. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/loader.py +0 -0
  305. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/lowered/__init__.py +0 -0
  306. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/lowered/cvxpy_constraints.py +0 -0
  307. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/lowered/cvxpy_variables.py +0 -0
  308. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/lowered/dynamics.py +0 -0
  309. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/lowered/jax_constraints.py +0 -0
  310. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/lowered/parameters.py +0 -0
  311. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/lowered/problem.py +0 -0
  312. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/lowered/unified.py +0 -0
  313. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/__init__.py +0 -0
  314. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/plotting.py +0 -0
  315. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/publication.py +0 -0
  316. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/scp_iteration.py +0 -0
  317. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/viser/__init__.py +0 -0
  318. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/viser/animated.py +0 -0
  319. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/viser/coordinates.py +0 -0
  320. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/viser/orbits.py +0 -0
  321. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/viser/plotly_integration.py +0 -0
  322. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/viser/primitives.py +0 -0
  323. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/viser/scp.py +0 -0
  324. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/plotting/viser/server.py +0 -0
  325. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/propagation/__init__.py +0 -0
  326. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/propagation/post_processing.py +0 -0
  327. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/propagation/propagation.py +0 -0
  328. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/solvers/__init__.py +0 -0
  329. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/solvers/base.py +0 -0
  330. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/solvers/cones.py +0 -0
  331. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
  332. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/solvers/moreau_ptr_solver.py +0 -0
  333. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/solvers/ptr_solver.py +0 -0
  334. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/solvers/qpax_ptr_solver.py +0 -0
  335. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/__init__.py +0 -0
  336. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/affine.py +0 -0
  337. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/augmentation.py +0 -0
  338. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/builder.py +0 -0
  339. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/canonicalize.py +0 -0
  340. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/constraint_set.py +0 -0
  341. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/arithmetic.py +0 -0
  342. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/array.py +0 -0
  343. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/autodiff.py +0 -0
  344. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/constraint.py +0 -0
  345. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/control.py +0 -0
  346. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  347. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  348. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/linalg.py +0 -0
  349. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/logic.py +0 -0
  350. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/math.py +0 -0
  351. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/parameter.py +0 -0
  352. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/spatial.py +0 -0
  353. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/state.py +0 -0
  354. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/time.py +0 -0
  355. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/variable.py +0 -0
  356. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/expr/vmap.py +0 -0
  357. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/hashing.py +0 -0
  358. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lower.py +0 -0
  359. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/__init__.py +0 -0
  360. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  361. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  362. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  363. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  364. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  365. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/autodiff.py +0 -0
  366. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  367. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  368. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  369. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  370. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  371. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  372. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  373. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  374. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  375. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  376. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  377. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  378. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/autodiff.py +0 -0
  379. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  380. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  381. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  382. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  383. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  384. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  385. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  386. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  387. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  388. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  389. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  390. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  391. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/__init__.py +0 -0
  392. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/_lowerer.py +0 -0
  393. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/_registry.py +0 -0
  394. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/arithmetic.py +0 -0
  395. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/array.py +0 -0
  396. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/autodiff.py +0 -0
  397. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/constraint.py +0 -0
  398. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/control.py +0 -0
  399. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/expr.py +0 -0
  400. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/formulation.py +0 -0
  401. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/lie.py +0 -0
  402. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/linalg.py +0 -0
  403. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/logic.py +0 -0
  404. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/math.py +0 -0
  405. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/spatial.py +0 -0
  406. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/state.py +0 -0
  407. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/stl.py +0 -0
  408. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/lowerers/latex/vmap.py +0 -0
  409. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/__init__.py +0 -0
  410. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/_registry.py +0 -0
  411. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/array.py +0 -0
  412. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/constraint.py +0 -0
  413. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/lie.py +0 -0
  414. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/linalg.py +0 -0
  415. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/logic.py +0 -0
  416. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/math.py +0 -0
  417. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/parser.py +0 -0
  418. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/spatial.py +0 -0
  419. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/stl.py +0 -0
  420. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/stljax.py +0 -0
  421. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/parser/tokenizer.py +0 -0
  422. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/preprocessing.py +0 -0
  423. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/sparsity.py +0 -0
  424. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/symbolic/unified.py +0 -0
  425. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/utils/__init__.py +0 -0
  426. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/utils/cache.py +0 -0
  427. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/utils/caching.py +0 -0
  428. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/utils/printing.py +0 -0
  429. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/utils/profiling.py +0 -0
  430. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx/utils/utils.py +0 -0
  431. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx.egg-info/dependency_links.txt +0 -0
  432. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx.egg-info/entry_points.txt +0 -0
  433. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx.egg-info/requires.txt +0 -0
  434. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/openscvx.egg-info/top_level.txt +0 -0
  435. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/pyproject.toml +0 -0
  436. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/scripts/gen_example_pages.py +0 -0
  437. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/scripts/gen_ref_pages.py +0 -0
  438. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  439. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/scripts/mkdocs_seo_hook.py +0 -0
  440. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/setup.cfg +0 -0
  441. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/__init__.py +0 -0
  442. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/__init__.py +0 -0
  443. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/_iteration_helpers.py +0 -0
  444. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/autotuner/__init__.py +0 -0
  445. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/autotuner/test_defaults_agreement.py +0 -0
  446. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/autotuner/test_hyper_overrides.py +0 -0
  447. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/autotuner/test_update_weights_jit.py +0 -0
  448. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/test_algorithm_state_pytree.py +0 -0
  449. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/test_iteration_fn_jit.py +0 -0
  450. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/test_iteration_fn_parity.py +0 -0
  451. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/algorithms/test_make_solve_loop.py +0 -0
  452. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/brachistochrone_analytical.py +0 -0
  453. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/conftest.py +0 -0
  454. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/__init__.py +0 -0
  455. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_brachistochrone.py +0 -0
  456. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_impulsive.py +0 -0
  457. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_multishot_propagation.py +0 -0
  458. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_solve_batched_brachistochrone.py +0 -0
  459. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_solve_batched_cvxpy_export_errors.py +0 -0
  460. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_solve_batched_export_roundtrip.py +0 -0
  461. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_solve_jax_bare_brachistochrone.py +0 -0
  462. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_solve_jax_jit_brachistochrone.py +0 -0
  463. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_solve_jax_vmap_brachistochrone.py +0 -0
  464. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/e2e/test_solve_jax_vmap_converged_no_drift.py +0 -0
  465. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/fixtures/brachistochrone.json +0 -0
  466. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/fixtures/brachistochrone.yaml +0 -0
  467. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/hohmann_analytical.py +0 -0
  468. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/integrations/__init__.py +0 -0
  469. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/integrations/test_mjx.py +0 -0
  470. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/integrations/test_mjx_dynamics.py +0 -0
  471. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/__init__.py +0 -0
  472. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/_iteration_callback_helpers.py +0 -0
  473. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/test_cvxpy_callback_jit_spike.py +0 -0
  474. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/test_iteration_callback_cvxpy.py +0 -0
  475. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/test_iteration_callback_moreau.py +0 -0
  476. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/test_iteration_callback_qpax.py +0 -0
  477. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/test_iteration_callback_vmap.py +0 -0
  478. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/test_moreau_ptr_solver.py +0 -0
  479. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/test_qpax_ptr_solver.py +0 -0
  480. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/solvers/test_subproblem_pytree.py +0 -0
  481. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/__init__.py +0 -0
  482. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/__init__.py +0 -0
  483. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_arithmetic.py +0 -0
  484. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_array.py +0 -0
  485. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_autodiff.py +0 -0
  486. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_constraint.py +0 -0
  487. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_guess_expr.py +0 -0
  488. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_linalg.py +0 -0
  489. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_logic.py +0 -0
  490. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_math.py +0 -0
  491. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_node_reference.py +0 -0
  492. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_parameters.py +0 -0
  493. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_scaling.py +0 -0
  494. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_spatial.py +0 -0
  495. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_variable.py +0 -0
  496. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/expr/test_vmap.py +0 -0
  497. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/__init__.py +0 -0
  498. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_array.py +0 -0
  499. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_constraint.py +0 -0
  500. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_lie.py +0 -0
  501. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_linalg.py +0 -0
  502. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_load.py +0 -0
  503. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_logic.py +0 -0
  504. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_math.py +0 -0
  505. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_parser.py +0 -0
  506. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_spatial.py +0 -0
  507. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_stl.py +0 -0
  508. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_tokenizer.py +0 -0
  509. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/parser/test_vmap.py +0 -0
  510. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_augmentation.py +0 -0
  511. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_gmsr.py +0 -0
  512. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_hashing.py +0 -0
  513. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_latex_formulation.py +0 -0
  514. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_lower_cvxpy.py +0 -0
  515. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_lower_jax.py +0 -0
  516. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_lower_latex.py +0 -0
  517. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_preprocessing.py +0 -0
  518. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_sparsity.py +0 -0
  519. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/symbolic/test_unified.py +0 -0
  520. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_autotuning.py +0 -0
  521. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_cvxpygen_optional.py +0 -0
  522. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_discretization.py +0 -0
  523. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_examples.py +0 -0
  524. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_expert.py +0 -0
  525. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_init.py +0 -0
  526. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_initialize_syncs_guesses.py +0 -0
  527. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_integrators.py +0 -0
  528. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_loader.py +0 -0
  529. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_optimization_results.py +0 -0
  530. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_plotting.py +0 -0
  531. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_post_process_batched_tau_clamp.py +0 -0
  532. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_propagation.py +0 -0
  533. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/tests/test_results_parameters.py +0 -0
  534. {openscvx-0.5.3.dev56 → openscvx-0.5.3.dev57}/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.dev56
3
+ Version: 0.5.3.dev57
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
@@ -120,6 +120,11 @@ To add columns to the iteration table, set the class attribute `COLUMNS` to a
120
120
  list of `openscvx.utils.printing.Column` specs; the algorithm concatenates
121
121
  them into its own table via `get_columns`.
122
122
 
123
+ If the update rule comes from a published scheme, override `citation()` to
124
+ return its BibTeX entries — `Problem.citation()` prints them in a dedicated
125
+ autotuner section. The default is an empty list, right for unpublished
126
+ heuristics.
127
+
123
128
  ## A custom algorithm
124
129
 
125
130
  An `Algorithm` owns the SCP iteration end to end: it *builds* the JAX-pure
@@ -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.dev56'
22
- __version_tuple__ = version_tuple = (0, 5, 3, 'dev56')
21
+ __version__ = version = '0.5.3.dev57'
22
+ __version_tuple__ = version_tuple = (0, 5, 3, 'dev57')
23
23
 
24
- __commit_id__ = commit_id = 'g96d2204af'
24
+ __commit_id__ = commit_id = 'g9f23a62a0'
@@ -88,6 +88,29 @@ class AcceptanceRatioAutotuner(AutotuningBase):
88
88
  Column("adaptive_state", "Adaptive", 16, "{}", color_adaptive_state, Verbosity.FULL),
89
89
  ]
90
90
 
91
+ def citation(self) -> List[str]:
92
+ """Return BibTeX citations for the SCvx acceptance-ratio update rule."""
93
+ return [
94
+ r"""@inproceedings{mao2016scvx,
95
+ title={Successive convexification of non-convex optimal control problems and its
96
+ convergence properties},
97
+ author={Mao, Yuanqi and Szmuk, Michael and A{\c{c}}{\i}kme{\c{s}}e, Beh{\c{c}}et},
98
+ booktitle={2016 IEEE 55th Conference on Decision and Control (CDC)},
99
+ pages={3636--3641},
100
+ year={2016},
101
+ publisher={IEEE}
102
+ }""",
103
+ r"""@misc{mao2019scvx,
104
+ title={Successive Convexification: A Superlinearly Convergent Algorithm for
105
+ Non-convex Optimal Control Problems},
106
+ author={Mao, Yuanqi and Szmuk, Michael and Xu, Xiangru and A{\c{c}}{\i}kme{\c{s}}e, Beh{\c{c}}et},
107
+ year={2019},
108
+ eprint={1804.06539},
109
+ archivePrefix={arXiv},
110
+ primaryClass={math.OC}
111
+ }""",
112
+ ]
113
+
91
114
  def _update_multipliers(
92
115
  self,
93
116
  state: "AlgorithmState",
@@ -6,7 +6,7 @@ SCP loop records history outside this module.
6
6
  """
7
7
 
8
8
  import warnings
9
- from typing import TYPE_CHECKING, Literal
9
+ from typing import TYPE_CHECKING, List, Literal
10
10
 
11
11
  import jax.numpy as jnp
12
12
  from pydantic import BaseModel, ConfigDict
@@ -256,6 +256,24 @@ class AugmentedLagrangian(AcceptanceRatioAutotuner):
256
256
  # :py:meth:`_update_virtual_buffer_nodal_weights`.
257
257
  return jnp.minimum(state.hyper.lam_vc_max, lam_vb_new)
258
258
 
259
+ def citation(self) -> List[str]:
260
+ """Return BibTeX citations for the augmented-Lagrangian multiplier updates.
261
+
262
+ Extends the inherited SCvx acceptance-ratio references with Luo's
263
+ dissertation, whose penalty-weight updates this autotuner implements.
264
+ """
265
+ return super().citation() + [
266
+ r"""@phdthesis{luo2025modeling,
267
+ title={Modeling and Algorithms for Nonconvex Trajectory Generation Problems:
268
+ From Constraint Reformulations and First-Order Proximal Methods to
269
+ Structure-Exploiting Convex Solvers},
270
+ author={Luo, Dayou},
271
+ school={University of Washington},
272
+ year={2025},
273
+ url={https://hdl.handle.net/1773/53364}
274
+ }"""
275
+ ]
276
+
259
277
 
260
278
  # =============================================================================
261
279
  # Pydantic spec for dict / YAML validation
@@ -257,3 +257,16 @@ class AutotuningBase(ABC):
257
257
  the autotuner's decision; the SCP loop records that into history
258
258
  and maps it to a printable label.
259
259
  """
260
+
261
+ def citation(self) -> List[str]:
262
+ """Return BibTeX citations for the published update rule this autotuner implements.
263
+
264
+ Autotuners implementing a published scheme override this so that
265
+ :meth:`openscvx.Problem.citation` can credit it alongside the
266
+ algorithm, solver, and discretization references. Unpublished
267
+ heuristics keep the default.
268
+
269
+ Returns:
270
+ List of BibTeX citation strings. Empty for uncited autotuners.
271
+ """
272
+ return []
@@ -2299,9 +2299,11 @@ class Problem:
2299
2299
  def citation(self) -> str:
2300
2300
  """Return BibTeX citations for all components used in this problem.
2301
2301
 
2302
- Aggregates citations from the algorithm and other components (discretization,
2303
- convex solver, etc.) Each section is prefixed with a comment indicating which component the
2304
- citation is for.
2302
+ Aggregates citations from the algorithm, its autotuner, the convex
2303
+ solver, the discretization, and every symbolic node in the problem's
2304
+ expression graphs (e.g. GMSR STL operators, jaxlie-backed Lie-group
2305
+ maps). Each section is prefixed with a comment indicating which
2306
+ component the citation is for.
2305
2307
 
2306
2308
  Returns:
2307
2309
  Formatted string containing all BibTeX citations with comments.
@@ -2324,6 +2326,14 @@ class Problem:
2324
2326
  citations = "\n".join(algo_citations)
2325
2327
  sections.append(f"{header}\n\n{citations}")
2326
2328
 
2329
+ # Autotuner citations
2330
+ tuner_citations = self._algorithm.autotuner.citation()
2331
+ if tuner_citations:
2332
+ tuner_name = type(self._algorithm.autotuner).__name__
2333
+ header = f"% Autotuner: {tuner_name}"
2334
+ citations = "\n".join(tuner_citations)
2335
+ sections.append(f"{header}\n\n{citations}")
2336
+
2327
2337
  # Solver citations
2328
2338
  solver_citations = self._solver.citation()
2329
2339
  if solver_citations:
@@ -2340,6 +2350,21 @@ class Problem:
2340
2350
  citations = "\n".join(dis_citations)
2341
2351
  sections.append(f"{header}\n\n{citations}")
2342
2352
 
2353
+ # Symbolic-node citations, gathered by walking the expression graphs.
2354
+ # Distinct node classes can share a reference (every GMSR operator
2355
+ # cites the same paper), so entries are deduplicated across classes.
2356
+ node_citations = self.symbolic.citations()
2357
+ if node_citations:
2358
+ names = ", ".join(sorted(node_citations))
2359
+ header = f"% Symbolic Operators: {names}"
2360
+ entries: list[str] = []
2361
+ for name in sorted(node_citations):
2362
+ for entry in node_citations[name]:
2363
+ if entry not in entries:
2364
+ entries.append(entry)
2365
+ citations = "\n".join(entries)
2366
+ sections.append(f"{header}\n\n{citations}")
2367
+
2343
2368
  sections.append(r"% --- END AUTO-GENERATED CITATIONS")
2344
2369
 
2345
2370
  return "\n\n".join(sections)
@@ -23,7 +23,7 @@ Module Organization:
23
23
 
24
24
  Core Expressions (expr.py):
25
25
  Base classes and utilities including `Expr`, `Leaf`, `Parameter`, `Constant`,
26
- and helper functions `to_expr` and `traverse`.
26
+ and helper functions `to_expr`, `traverse`, and `walk`.
27
27
 
28
28
  Arithmetic Operations (arithmetic.py):
29
29
  Fundamental arithmetic operations including `Add`, `Sub`, `Mul`, `Div`,
@@ -110,6 +110,7 @@ from .expr import (
110
110
  NodeReference,
111
111
  to_expr,
112
112
  traverse,
113
+ walk,
113
114
  )
114
115
 
115
116
  # Lie algebra operations
@@ -182,6 +183,7 @@ __all__ = [
182
183
  "Parameter",
183
184
  "to_expr",
184
185
  "traverse",
186
+ "walk",
185
187
  "transitive_closure",
186
188
  "discrete_sparsity",
187
189
  "Add",
@@ -67,7 +67,7 @@ import functools
67
67
  import hashlib
68
68
  import struct
69
69
  import threading
70
- from typing import TYPE_CHECKING, Callable, List, Tuple, Union
70
+ from typing import TYPE_CHECKING, Callable, Iterator, List, Tuple, Union
71
71
 
72
72
  if TYPE_CHECKING:
73
73
  from .linalg import Transpose
@@ -357,6 +357,20 @@ class Expr:
357
357
  """
358
358
  return []
359
359
 
360
+ def citation(self) -> List[str]:
361
+ """Return BibTeX citations for the published method behind this node.
362
+
363
+ Most nodes are plain arithmetic and cite nothing. Nodes that implement
364
+ a published formulation or defer to an external library (e.g. the GMSR
365
+ STL operators, the jaxlie-backed Lie-group maps) override this so that
366
+ :meth:`openscvx.Problem.citation` can credit the methods a problem
367
+ actually uses by scanning its expression trees.
368
+
369
+ Returns:
370
+ List of BibTeX citation strings. Empty for uncited nodes.
371
+ """
372
+ return []
373
+
360
374
  def canonicalize(self) -> "Expr":
361
375
  """
362
376
  Return a canonical (simplified) form of this expression.
@@ -631,6 +645,32 @@ def traverse(expr: Expr, visit: Callable[[Expr], None]):
631
645
  traverse(child, visit)
632
646
 
633
647
 
648
+ def walk(expr: Expr) -> Iterator[Expr]:
649
+ """Yield ``expr`` and every node reachable through ``children()``, each once.
650
+
651
+ The counterpart of :func:`ast.walk` for symbolic expressions: a pre-order
652
+ traversal of the expression graph. Unlike :func:`traverse`, each distinct
653
+ node is visited a single time — canonicalization preserves sharing, so an
654
+ expression is generally a DAG, and revisiting shared subexpressions can be
655
+ exponentially wasteful.
656
+
657
+ Args:
658
+ expr: Root expression to traverse.
659
+
660
+ Yields:
661
+ Each distinct node in the expression graph, parents before children.
662
+ """
663
+ seen = set()
664
+ stack = [expr]
665
+ while stack:
666
+ node = stack.pop()
667
+ if id(node) in seen:
668
+ continue
669
+ seen.add(id(node))
670
+ yield node
671
+ stack.extend(node.children())
672
+
673
+
634
674
  class Constant(Leaf):
635
675
  """Constant value expression.
636
676
 
@@ -0,0 +1,14 @@
1
+ """Shared BibTeX entry for the jaxlie-backed Lie-group nodes.
2
+
3
+ The SO(3)/SE(3) exponential and logarithm maps in this package lower through
4
+ :mod:`jaxlie`; its authors ask users to cite the paper below. The entry lives
5
+ here once so ``so3.py`` and ``se3.py`` can both return it from ``citation()``.
6
+ """
7
+
8
+ JAXLIE_CITATION = r"""@inproceedings{yi2021iros,
9
+ title={Differentiable Factor Graph Optimization for Learning Smoothers},
10
+ author={Brent Yi and Michelle Lee and Alina Kloss and Roberto Mart\'in-Mart\'in and
11
+ Jeannette Bohg},
12
+ booktitle={2021 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
13
+ year={2021}
14
+ }"""
@@ -12,11 +12,12 @@ Note:
12
12
  SE3 tangent parameterization, so no reordering is needed during lowering.
13
13
  """
14
14
 
15
- from typing import Tuple, Union
15
+ from typing import List, Tuple, Union
16
16
 
17
17
  import numpy as np
18
18
 
19
19
  from ..expr import Expr, to_expr
20
+ from ._citations import JAXLIE_CITATION
20
21
 
21
22
 
22
23
  class SE3Exp(Expr):
@@ -81,6 +82,10 @@ class SE3Exp(Expr):
81
82
  def children(self):
82
83
  return [self.twist]
83
84
 
85
+ def citation(self) -> List[str]:
86
+ """Return the BibTeX citation for jaxlie, which backs this map's lowering."""
87
+ return [JAXLIE_CITATION]
88
+
84
89
  def canonicalize(self) -> "Expr":
85
90
  twist = self.twist.canonicalize()
86
91
  return SE3Exp(twist)
@@ -150,6 +155,10 @@ class SE3Log(Expr):
150
155
  def children(self):
151
156
  return [self.transform]
152
157
 
158
+ def citation(self) -> List[str]:
159
+ """Return the BibTeX citation for jaxlie, which backs this map's lowering."""
160
+ return [JAXLIE_CITATION]
161
+
153
162
  def canonicalize(self) -> "Expr":
154
163
  transform = self.transform.canonicalize()
155
164
  return SE3Log(transform)
@@ -6,11 +6,12 @@ group, enabling axis-angle to rotation matrix conversions and vice versa.
6
6
  Requires jaxlie: pip install openscvx[lie]
7
7
  """
8
8
 
9
- from typing import Tuple, Union
9
+ from typing import List, Tuple, Union
10
10
 
11
11
  import numpy as np
12
12
 
13
13
  from ..expr import Expr, to_expr
14
+ from ._citations import JAXLIE_CITATION
14
15
 
15
16
 
16
17
  class SO3Exp(Expr):
@@ -58,6 +59,10 @@ class SO3Exp(Expr):
58
59
  def children(self):
59
60
  return [self.omega]
60
61
 
62
+ def citation(self) -> List[str]:
63
+ """Return the BibTeX citation for jaxlie, which backs this map's lowering."""
64
+ return [JAXLIE_CITATION]
65
+
61
66
  def canonicalize(self) -> "Expr":
62
67
  omega = self.omega.canonicalize()
63
68
  return SO3Exp(omega)
@@ -116,6 +121,10 @@ class SO3Log(Expr):
116
121
  def children(self):
117
122
  return [self.rotation]
118
123
 
124
+ def citation(self) -> List[str]:
125
+ """Return the BibTeX citation for jaxlie, which backs this map's lowering."""
126
+ return [JAXLIE_CITATION]
127
+
119
128
  def canonicalize(self) -> "Expr":
120
129
  rotation = self.rotation.canonicalize()
121
130
  return SO3Log(rotation)
@@ -57,7 +57,7 @@ See also:
57
57
  """
58
58
 
59
59
  from dataclasses import dataclass
60
- from typing import TYPE_CHECKING, Callable, Optional, Tuple, Union
60
+ from typing import TYPE_CHECKING, Callable, List, Optional, Tuple, Union
61
61
 
62
62
  import numpy as np
63
63
 
@@ -304,6 +304,21 @@ class STLExpr(Expr):
304
304
  # explicit `time` state). Currently raises
305
305
  # NotImplementedError at .over() time.
306
306
 
307
+ def citation(self) -> List[str]:
308
+ """Return the BibTeX citation for the GMSR robustness formulation."""
309
+ return [
310
+ r"""@misc{uzun2024gmsr,
311
+ title={Optimization with Temporal and Logical Specifications via Generalized
312
+ Mean-based Smooth Robustness Measures},
313
+ author={Uzun, Samet and Elango, Purnanand and Garoche, Pierre-Lo{\"i}c and
314
+ A{\c{c}}{\i}kme{\c{s}}e, Beh{\c{c}}et},
315
+ year={2024},
316
+ eprint={2405.10996},
317
+ archivePrefix={arXiv},
318
+ primaryClass={math.OC}
319
+ }"""
320
+ ]
321
+
307
322
  def over(
308
323
  self,
309
324
  interval: "IntervalLike",
@@ -9,7 +9,7 @@ STL operators accept Constraint objects (predicates) and extract robustness
9
9
  expressions which are lowered to STLJax during compilation.
10
10
  """
11
11
 
12
- from typing import TYPE_CHECKING, Callable, Optional, Tuple, Union
12
+ from typing import TYPE_CHECKING, Callable, List, Optional, Tuple, Union
13
13
 
14
14
  import numpy as np
15
15
 
@@ -53,6 +53,22 @@ class STLJaxExpr(Expr):
53
53
  Eventually, Always, or Until for actual STL specifications.
54
54
  """
55
55
 
56
+ def citation(self) -> List[str]:
57
+ """Return the BibTeX citation the stljax library asks its users to cite."""
58
+ return [
59
+ r"""@article{kapoor2025stlcg,
60
+ title={{STLCG++}: A Masking Approach for Differentiable Signal Temporal Logic
61
+ Specification},
62
+ author={Kapoor, Parv and Mizuta, Kazuki and Kang, Eunsuk and Leung, Karen},
63
+ journal={IEEE Robotics and Automation Letters},
64
+ volume={10},
65
+ number={9},
66
+ pages={9240--9247},
67
+ year={2025},
68
+ doi={10.1109/LRA.2025.3588389}
69
+ }"""
70
+ ]
71
+
56
72
  def over(
57
73
  self,
58
74
  interval: tuple[int, int],
@@ -117,3 +117,42 @@ class SymbolicProblem:
117
117
  2. Propagation dynamics have been set up
118
118
  """
119
119
  return self.constraints.is_categorized and self.dynamics_prop is not None
120
+
121
+ def citations(self) -> Dict[str, List[str]]:
122
+ """Collect BibTeX citations from every expression node in the problem.
123
+
124
+ Walks the dynamics, constraint, and propagation expression graphs and
125
+ gathers :meth:`~openscvx.symbolic.expr.expr.Expr.citation` from each
126
+ node, so :meth:`openscvx.Problem.citation` can credit the published
127
+ methods a problem actually uses (e.g. GMSR STL operators, jaxlie-backed
128
+ Lie-group maps). Works at either lifecycle stage: unsorted constraints
129
+ are scanned before preprocessing, categorized ones after.
130
+
131
+ Returns:
132
+ Mapping from node class name to the deduplicated BibTeX entries
133
+ cited by nodes of that name, containing only names that cite
134
+ anything. Same-named classes (e.g. the GMSR and stljax ``Or``)
135
+ share a key; their entries are merged.
136
+ """
137
+ from openscvx.symbolic.expr import walk
138
+
139
+ roots: List["Expr"] = [self.dynamics]
140
+ for optional in (self.dynamics_discrete, self.dynamics_prop):
141
+ if optional is not None:
142
+ roots.append(optional)
143
+ if self.algebraic_prop:
144
+ roots.extend(self.algebraic_prop.values())
145
+ c = self.constraints
146
+ roots.extend(
147
+ [*c.unsorted, *c.ctcs, *c.nodal, *c.nodal_convex, *c.cross_node, *c.cross_node_convex]
148
+ )
149
+
150
+ cited: Dict[str, List[str]] = {}
151
+ for root in roots:
152
+ for node in walk(root):
153
+ entries = node.citation()
154
+ if not entries:
155
+ continue
156
+ bucket = cited.setdefault(type(node).__name__, [])
157
+ bucket.extend(e for e in entries if e not in bucket)
158
+ return cited
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.3.dev56
3
+ Version: 0.5.3.dev57
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
@@ -353,6 +353,7 @@ openscvx/symbolic/expr/time.py
353
353
  openscvx/symbolic/expr/variable.py
354
354
  openscvx/symbolic/expr/vmap.py
355
355
  openscvx/symbolic/expr/lie/__init__.py
356
+ openscvx/symbolic/expr/lie/_citations.py
356
357
  openscvx/symbolic/expr/lie/adjoint.py
357
358
  openscvx/symbolic/expr/lie/se3.py
358
359
  openscvx/symbolic/expr/lie/so3.py
@@ -434,6 +435,7 @@ tests/brachistochrone_analytical.py
434
435
  tests/conftest.py
435
436
  tests/hohmann_analytical.py
436
437
  tests/test_autotuning.py
438
+ tests/test_citation.py
437
439
  tests/test_cvxpygen_optional.py
438
440
  tests/test_discretization.py
439
441
  tests/test_examples.py
@@ -455,6 +457,7 @@ tests/algorithms/test_iteration_fn_jit.py
455
457
  tests/algorithms/test_iteration_fn_parity.py
456
458
  tests/algorithms/test_make_solve_loop.py
457
459
  tests/algorithms/autotuner/__init__.py
460
+ tests/algorithms/autotuner/test_citation.py
458
461
  tests/algorithms/autotuner/test_defaults_agreement.py
459
462
  tests/algorithms/autotuner/test_hyper_overrides.py
460
463
  tests/algorithms/autotuner/test_update_weights_jit.py
@@ -486,6 +489,7 @@ tests/solvers/test_qpax_ptr_solver.py
486
489
  tests/solvers/test_subproblem_pytree.py
487
490
  tests/symbolic/__init__.py
488
491
  tests/symbolic/test_augmentation.py
492
+ tests/symbolic/test_citations.py
489
493
  tests/symbolic/test_gmsr.py
490
494
  tests/symbolic/test_hashing.py
491
495
  tests/symbolic/test_latex_formulation.py
@@ -328,6 +328,7 @@
328
328
  "openscvx/symbolic/expr/control.py",
329
329
  "openscvx/symbolic/expr/expr.py",
330
330
  "openscvx/symbolic/expr/lie/__init__.py",
331
+ "openscvx/symbolic/expr/lie/_citations.py",
331
332
  "openscvx/symbolic/expr/lie/adjoint.py",
332
333
  "openscvx/symbolic/expr/lie/se3.py",
333
334
  "openscvx/symbolic/expr/lie/so3.py",
@@ -426,6 +427,7 @@
426
427
  "tests/algorithms/__init__.py",
427
428
  "tests/algorithms/_iteration_helpers.py",
428
429
  "tests/algorithms/autotuner/__init__.py",
430
+ "tests/algorithms/autotuner/test_citation.py",
429
431
  "tests/algorithms/autotuner/test_defaults_agreement.py",
430
432
  "tests/algorithms/autotuner/test_hyper_overrides.py",
431
433
  "tests/algorithms/autotuner/test_update_weights_jit.py",
@@ -495,6 +497,7 @@
495
497
  "tests/symbolic/parser/test_tokenizer.py",
496
498
  "tests/symbolic/parser/test_vmap.py",
497
499
  "tests/symbolic/test_augmentation.py",
500
+ "tests/symbolic/test_citations.py",
498
501
  "tests/symbolic/test_gmsr.py",
499
502
  "tests/symbolic/test_hashing.py",
500
503
  "tests/symbolic/test_latex_formulation.py",
@@ -505,6 +508,7 @@
505
508
  "tests/symbolic/test_sparsity.py",
506
509
  "tests/symbolic/test_unified.py",
507
510
  "tests/test_autotuning.py",
511
+ "tests/test_citation.py",
508
512
  "tests/test_cvxpygen_optional.py",
509
513
  "tests/test_discretization.py",
510
514
  "tests/test_examples.py",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "tag": "0.5.2",
3
- "distance": 56,
4
- "node": "g96d2204af37e61cf48047680c0b1ef85ef003dc9",
3
+ "distance": 57,
4
+ "node": "g9f23a62a02aec6e55b7267396e27bf5e6dfa143a",
5
5
  "dirty": false,
6
6
  "branch": "main",
7
7
  "node_date": "2026-09-21"
@@ -0,0 +1,44 @@
1
+ """Autotuner ``citation()`` returns the references behind each update rule.
2
+
3
+ Published schemes cite their papers; unpublished heuristics return the base
4
+ class's empty default. Like the sibling autotuner tests, this reads class
5
+ metadata only — no solves.
6
+ """
7
+
8
+ from openscvx.algorithms.autotuner.acceptance_ratio import AcceptanceRatioAutotuner
9
+ from openscvx.algorithms.autotuner.adaptive_proximal_weight import AdaptiveProximalWeight
10
+ from openscvx.algorithms.autotuner.augmented_lagrangian import AugmentedLagrangian
11
+ from openscvx.algorithms.autotuner.constant_proximal_weight import ConstantProximalWeight
12
+ from openscvx.algorithms.autotuner.ramp_proximal_weight import RampProximalWeight
13
+
14
+ # =============================================================================
15
+ # Published update rules cite their papers
16
+ # =============================================================================
17
+
18
+
19
+ def test_acceptance_ratio_cites_scvx():
20
+ entries = AcceptanceRatioAutotuner().citation()
21
+ assert any("mao2016scvx" in e for e in entries)
22
+ assert any("mao2019scvx" in e for e in entries)
23
+
24
+
25
+ def test_augmented_lagrangian_extends_scvx_with_luo_dissertation():
26
+ entries = AugmentedLagrangian().citation()
27
+ # Inherits the SCvx acceptance-ratio references and adds Luo's dissertation.
28
+ assert any("mao2016scvx" in e for e in entries)
29
+ assert any("luo2025modeling" in e for e in entries)
30
+
31
+
32
+ def test_adaptive_proximal_weight_inherits_scvx_citations():
33
+ entries = AdaptiveProximalWeight().citation()
34
+ assert any("mao2016scvx" in e for e in entries)
35
+
36
+
37
+ # =============================================================================
38
+ # Unpublished heuristics keep the empty default
39
+ # =============================================================================
40
+
41
+
42
+ def test_uncited_autotuners_return_empty():
43
+ assert ConstantProximalWeight().citation() == []
44
+ assert RampProximalWeight().citation() == []
@@ -3,7 +3,7 @@
3
3
  This module tests the fundamental AST infrastructure of the symbolic expression
4
4
  system, including:
5
5
  - to_expr() conversion function
6
- - traverse() tree traversal function
6
+ - traverse() and walk() tree traversal functions
7
7
  - Tree structure and pretty printing
8
8
  - Base Expr/Leaf behavior
9
9
 
@@ -23,6 +23,7 @@ from openscvx.symbolic.expr import (
23
23
  Variable,
24
24
  to_expr,
25
25
  traverse,
26
+ walk,
26
27
  )
27
28
  from openscvx.symbolic.preprocessing import validate_shapes
28
29
 
@@ -102,6 +103,44 @@ def test_traverse_visits_all_nodes_in_preorder():
102
103
  assert visited == ["Add", "Constant", "Mul", "Constant", "Constant"]
103
104
 
104
105
 
106
+ # =============================================================================
107
+ # walk() Function Tests
108
+ # =============================================================================
109
+
110
+
111
+ def test_walk_yields_every_node_parents_first():
112
+ a, b, c = Constant(1), Constant(2), Constant(3)
113
+ expr = Add(a, Mul(b, c))
114
+
115
+ visited = list(walk(expr))
116
+
117
+ assert visited[0] is expr
118
+ assert {id(n) for n in visited} == {id(n) for n in (expr, a, b, c, expr.children()[1])}
119
+
120
+
121
+ def test_walk_visits_shared_subexpressions_once():
122
+ # (x + 1) * (x + 1) with a genuinely shared child, as canonicalization produces
123
+ x = State("x", shape=(2,))
124
+ shared = Add(x, Constant(1))
125
+ expr = Mul(shared, shared)
126
+
127
+ visited = list(walk(expr))
128
+
129
+ assert sum(1 for n in visited if n is shared) == 1
130
+ assert len(visited) == 4 # Mul, Add, State, Constant
131
+
132
+
133
+ # =============================================================================
134
+ # Expr.citation() Default Tests
135
+ # =============================================================================
136
+
137
+
138
+ def test_citation_defaults_to_empty():
139
+ x = State("x", shape=(2,))
140
+ assert x.citation() == []
141
+ assert (x + 1).citation() == []
142
+
143
+
105
144
  # =============================================================================
106
145
  # Expr.canonicalize() Method Tests
107
146
  # =============================================================================