openscvx 0.5.2.dev13__tar.gz → 0.5.2.dev14__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 (363) hide show
  1. {openscvx-0.5.2.dev13/openscvx.egg-info → openscvx-0.5.2.dev14}/PKG-INFO +1 -1
  2. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/_version.py +3 -3
  3. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/base.py +97 -6
  4. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/moreau_ptr_solver.py +58 -7
  5. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/qpax_ptr_solver.py +26 -7
  6. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14/openscvx.egg-info}/PKG-INFO +1 -1
  7. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/solvers/test_moreau_ptr_solver.py +75 -0
  8. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/solvers/test_qpax_ptr_solver.py +71 -0
  9. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/assets/logo.svg +0 -0
  10. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/release-drafter.yml +0 -0
  11. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/_docs.yml +0 -0
  12. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/branch-name.yml +0 -0
  13. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/docs.yml +0 -0
  14. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/lint.yml +0 -0
  15. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/nightly.yml +0 -0
  16. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/release-drafter.yml +0 -0
  17. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/release.yml +0 -0
  18. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/tests-integration.yml +0 -0
  19. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.github/workflows/tests-unit.yml +0 -0
  20. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.gitignore +0 -0
  21. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/.gitmodules +0 -0
  22. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/CONTRIBUTING.md +0 -0
  23. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/LICENSE +0 -0
  24. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/README.md +0 -0
  25. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/constraint_reformulation.md +0 -0
  26. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/control_parameterization.md +0 -0
  27. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/discretization.md +0 -0
  28. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/ocp.md +0 -0
  29. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/scvx.md +0 -0
  30. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/Foundations/time_dilation.md +0 -0
  31. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UnderTheHood/lowering_architecture.md +0 -0
  32. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  33. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/00_introduction.md +0 -0
  34. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  35. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  36. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  37. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  38. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/05_visualization.md +0 -0
  39. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/06_logic.md +0 -0
  40. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/07_lie.md +0 -0
  41. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/UsersGuide/08_mpcc.md +0 -0
  42. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/favicon.png +0 -0
  43. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/ct-scvx_dark.png +0 -0
  44. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/ct-scvx_light.png +0 -0
  45. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/ctcs_dark.png +0 -0
  46. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/ctcs_light.png +0 -0
  47. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/problem_class_dark.png +0 -0
  48. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/images/problem_class_light.png +0 -0
  49. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/logo.svg +0 -0
  50. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/openscvx_logo_square.png +0 -0
  51. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/viser-client/index.html +0 -0
  52. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/viser-recordings/drone_racing.viser +0 -0
  53. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
  54. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/citation.md +0 -0
  55. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/examples.md +0 -0
  56. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/index.md +0 -0
  57. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/javascripts/mathjax.js +0 -0
  58. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/docs/versions.json +0 -0
  59. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/_viser_embed_export.py +0 -0
  60. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/brachistochrone.py +0 -0
  61. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/hypersensitive.py +0 -0
  62. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/impulsive.py +0 -0
  63. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/stl_integer_variable.py +0 -0
  64. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/abstract/stl_or.py +0 -0
  65. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/7_dof_arm.py +0 -0
  66. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/_camera.py +0 -0
  67. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/_render.py +0 -0
  68. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/_sensor_view.py +0 -0
  69. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/dr_vp_polytope.py +0 -0
  70. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/franka_fr3v2_pick_place.py +0 -0
  71. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/logo.py +0 -0
  72. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/animations/obstacle_avoidance_vmap.py +0 -0
  73. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/3_dof_arm.py +0 -0
  74. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/7_dof_arm.py +0 -0
  75. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/7_dof_arm_collision.py +0 -0
  76. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/7_dof_arm_vp.py +0 -0
  77. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/franka_fr3v2_pick_place.py +0 -0
  78. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
  79. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car.py +0 -0
  80. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_disjoint.py +0 -0
  81. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_obstacle_conditional.py +0 -0
  82. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_obstacle_stl.py +0 -0
  83. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_stl_or.py +0 -0
  84. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/car/dubins_car_waypoint_stl.py +0 -0
  85. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/cinema_vp.py +0 -0
  86. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/dr_double_integrator.py +0 -0
  87. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/dr_vp.py +0 -0
  88. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/dr_vp_nodal.py +0 -0
  89. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/dr_vp_polytope.py +0 -0
  90. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/drone_racing.py +0 -0
  91. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/logo.py +0 -0
  92. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/logo_utils/acl_logo.svg +0 -0
  93. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  94. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/obstacle_avoidance.py +0 -0
  95. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  96. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  97. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/cartpole_mjx.py +0 -0
  98. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/double_cartpole_mjx.py +0 -0
  99. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/skydio_x2_mjx.py +0 -0
  100. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
  101. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/triple_cartpole_game.py +0 -0
  102. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mjx/triple_cartpole_mjx.py +0 -0
  103. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/double_integrator_discrete.py +0 -0
  104. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/double_integrator_drone_racing.py +0 -0
  105. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/dubins_car_circle_analytical.py +0 -0
  106. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/dubins_car_circle_discrete.py +0 -0
  107. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
  108. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/plotting.py +0 -0
  109. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/plotting_viser.py +0 -0
  110. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/3DoF_pdg_realtime.py +0 -0
  111. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/6DoF_pdg_realtime.py +0 -0
  112. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
  113. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
  114. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  115. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  116. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
  117. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  118. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/cinema_vp_realtime.py +0 -0
  119. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/drone_racing_realtime.py +0 -0
  120. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/dubins_car_realtime.py +0 -0
  121. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  122. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/rocket/3DoF_pdg.py +0 -0
  123. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/rocket/6DoF_pdg.py +0 -0
  124. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/spacecraft/halo_orbit.py +0 -0
  125. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/spacecraft/hohmann_transfer.py +0 -0
  126. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/spacecraft/let_transfer.py +0 -0
  127. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/examples/spacecraft/proxops_cw.py +0 -0
  128. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/ctlos_cine.gif +0 -0
  129. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/ctlos_dr.gif +0 -0
  130. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/dtlos_cine.gif +0 -0
  131. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/dtlos_dr.gif +0 -0
  132. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/openscvx_logo.svg +0 -0
  133. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/openscvx_logo_square.png +0 -0
  134. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/oscvx_structure_full_dark.svg +0 -0
  135. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/figures/video_preview.png +0 -0
  136. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/__init__.py +0 -0
  137. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/assets/stylesheets/custom.css +0 -0
  138. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
  139. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/assets/stylesheets/home-hero.css +0 -0
  140. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/assets/stylesheets/home-viser.css +0 -0
  141. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/home.html +0 -0
  142. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/main.html +0 -0
  143. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-diagram.html +0 -0
  144. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-dropin-banner.html +0 -0
  145. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-hero.html +0 -0
  146. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-pipeline.html +0 -0
  147. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/material/overrides/partials/home-viser-strip.html +0 -0
  148. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/mkdocs.yml +0 -0
  149. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/__init__.py +0 -0
  150. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/__main__.py +0 -0
  151. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/__init__.py +0 -0
  152. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/__init__.py +0 -0
  153. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/adaptive_proximal_weight.py +0 -0
  154. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/augmented_lagrangian.py +0 -0
  155. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/constant_proximal_weight.py +0 -0
  156. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/autotuner/ramp_proximal_weight.py +0 -0
  157. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/base.py +0 -0
  158. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/optimization_results.py +0 -0
  159. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/scvx/__init__.py +0 -0
  160. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/scvx/penalized_trust_region.py +0 -0
  161. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/algorithms/weights.py +0 -0
  162. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/config.py +0 -0
  163. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/__init__.py +0 -0
  164. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/base.py +0 -0
  165. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/discretize_linearize.py +0 -0
  166. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/linearize_discretize.py +0 -0
  167. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
  168. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/sparse_utils/__init__.py +0 -0
  169. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
  170. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
  171. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/expert/__init__.py +0 -0
  172. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/expert/byof.py +0 -0
  173. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/expert/lowering.py +0 -0
  174. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/expert/validation.py +0 -0
  175. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/init/__init__.py +0 -0
  176. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/init/interpolation.py +0 -0
  177. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/init/inverse_kinematics.py +0 -0
  178. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrations/__init__.py +0 -0
  179. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrations/base.py +0 -0
  180. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrations/menagerie.py +0 -0
  181. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrations/mjx.py +0 -0
  182. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrators/__init__.py +0 -0
  183. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrators/diffrax.py +0 -0
  184. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/integrators/runge_kutta.py +0 -0
  185. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/loader.py +0 -0
  186. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/__init__.py +0 -0
  187. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/cvxpy_constraints.py +0 -0
  188. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/cvxpy_variables.py +0 -0
  189. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/dynamics.py +0 -0
  190. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/jax_constraints.py +0 -0
  191. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/parameters.py +0 -0
  192. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/problem.py +0 -0
  193. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/lowered/unified.py +0 -0
  194. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/__init__.py +0 -0
  195. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/plotting.py +0 -0
  196. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/scp_iteration.py +0 -0
  197. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/__init__.py +0 -0
  198. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/animated.py +0 -0
  199. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/orbits.py +0 -0
  200. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/plotly_integration.py +0 -0
  201. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/primitives.py +0 -0
  202. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/scp.py +0 -0
  203. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/plotting/viser/server.py +0 -0
  204. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/problem.py +0 -0
  205. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/propagation/__init__.py +0 -0
  206. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/propagation/post_processing.py +0 -0
  207. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/propagation/propagation.py +0 -0
  208. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/__init__.py +0 -0
  209. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/cvxpy_ptr_solver.py +0 -0
  210. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/solvers/ptr_solver.py +0 -0
  211. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/__init__.py +0 -0
  212. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/augmentation.py +0 -0
  213. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/builder.py +0 -0
  214. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/constraint_set.py +0 -0
  215. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/__init__.py +0 -0
  216. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/arithmetic.py +0 -0
  217. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/array.py +0 -0
  218. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/constraint.py +0 -0
  219. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/control.py +0 -0
  220. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/expr.py +0 -0
  221. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  222. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  223. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/lie/se3.py +0 -0
  224. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/lie/so3.py +0 -0
  225. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/linalg.py +0 -0
  226. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/logic.py +0 -0
  227. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/math.py +0 -0
  228. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/parameter.py +0 -0
  229. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/spatial.py +0 -0
  230. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/state.py +0 -0
  231. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/stl.py +0 -0
  232. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/stljax.py +0 -0
  233. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/time.py +0 -0
  234. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/variable.py +0 -0
  235. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/expr/vmap.py +0 -0
  236. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/hashing.py +0 -0
  237. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lower.py +0 -0
  238. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/__init__.py +0 -0
  239. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  240. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  241. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  242. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  243. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  244. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  245. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  246. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  247. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  248. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  249. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  250. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  251. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  252. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  253. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  254. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  255. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  256. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  257. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  258. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  259. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  260. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  261. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  262. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  263. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  264. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  265. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  266. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
  267. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  268. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/__init__.py +0 -0
  269. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/_registry.py +0 -0
  270. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/array.py +0 -0
  271. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/constraint.py +0 -0
  272. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/lie.py +0 -0
  273. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/linalg.py +0 -0
  274. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/logic.py +0 -0
  275. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/math.py +0 -0
  276. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/parser.py +0 -0
  277. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/spatial.py +0 -0
  278. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/stl.py +0 -0
  279. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/stljax.py +0 -0
  280. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/parser/tokenizer.py +0 -0
  281. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/preprocessing.py +0 -0
  282. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/problem.py +0 -0
  283. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/sparsity.py +0 -0
  284. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/symbolic/unified.py +0 -0
  285. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/__init__.py +0 -0
  286. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/cache.py +0 -0
  287. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/caching.py +0 -0
  288. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/printing.py +0 -0
  289. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/profiling.py +0 -0
  290. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx/utils/utils.py +0 -0
  291. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/SOURCES.txt +0 -0
  292. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/dependency_links.txt +0 -0
  293. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/entry_points.txt +0 -0
  294. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/requires.txt +0 -0
  295. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/openscvx.egg-info/top_level.txt +0 -0
  296. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/pyproject.toml +0 -0
  297. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/scripts/gen_example_pages.py +0 -0
  298. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/scripts/gen_ref_pages.py +0 -0
  299. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
  300. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/setup.cfg +0 -0
  301. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/__init__.py +0 -0
  302. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/_marks.py +0 -0
  303. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/brachistochrone_analytical.py +0 -0
  304. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/conftest.py +0 -0
  305. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/expr/__init__.py +0 -0
  306. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/expr/test_gmsr.py +0 -0
  307. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/fixtures/brachistochrone.json +0 -0
  308. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/fixtures/brachistochrone.yaml +0 -0
  309. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/hohmann_analytical.py +0 -0
  310. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/integrations/__init__.py +0 -0
  311. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/integrations/test_mjx.py +0 -0
  312. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/integrations/test_mjx_dynamics.py +0 -0
  313. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/solvers/__init__.py +0 -0
  314. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/__init__.py +0 -0
  315. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/__init__.py +0 -0
  316. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_arithmetic.py +0 -0
  317. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_array.py +0 -0
  318. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_constraint.py +0 -0
  319. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_expr.py +0 -0
  320. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_lie.py +0 -0
  321. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_linalg.py +0 -0
  322. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_logic.py +0 -0
  323. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_math.py +0 -0
  324. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_node_reference.py +0 -0
  325. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_parameters.py +0 -0
  326. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_scaling.py +0 -0
  327. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_spatial.py +0 -0
  328. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_stl.py +0 -0
  329. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_variable.py +0 -0
  330. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/expr/test_vmap.py +0 -0
  331. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/__init__.py +0 -0
  332. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_array.py +0 -0
  333. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_constraint.py +0 -0
  334. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_lie.py +0 -0
  335. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_linalg.py +0 -0
  336. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_load.py +0 -0
  337. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_logic.py +0 -0
  338. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_math.py +0 -0
  339. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_parser.py +0 -0
  340. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_spatial.py +0 -0
  341. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_stl.py +0 -0
  342. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_tokenizer.py +0 -0
  343. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/parser/test_vmap.py +0 -0
  344. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_augmentation.py +0 -0
  345. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_hashing.py +0 -0
  346. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_lower_cvxpy.py +0 -0
  347. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_lower_jax.py +0 -0
  348. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_preprocessing.py +0 -0
  349. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_sparsity.py +0 -0
  350. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/symbolic/test_unified.py +0 -0
  351. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_autotuning.py +0 -0
  352. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_brachistochrone.py +0 -0
  353. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_cvxpygen_optional.py +0 -0
  354. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_discretization.py +0 -0
  355. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_examples.py +0 -0
  356. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_expert.py +0 -0
  357. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_impulsive.py +0 -0
  358. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_init.py +0 -0
  359. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_integrators.py +0 -0
  360. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_loader.py +0 -0
  361. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_optimization_results.py +0 -0
  362. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_plotting.py +0 -0
  363. {openscvx-0.5.2.dev13 → openscvx-0.5.2.dev14}/tests/test_propagation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.2.dev13
3
+ Version: 0.5.2.dev14
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
@@ -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.2.dev13'
22
- __version_tuple__ = version_tuple = (0, 5, 2, 'dev13')
21
+ __version__ = version = '0.5.2.dev14'
22
+ __version_tuple__ = version_tuple = (0, 5, 2, 'dev14')
23
23
 
24
- __commit_id__ = commit_id = 'ga445685bf'
24
+ __commit_id__ = commit_id = 'g78ea9d746'
@@ -281,9 +281,24 @@ class PTRSolverSpec(BaseModel):
281
281
  or ``"moreau"``
282
282
  (:class:`openscvx.solvers.moreau_ptr_solver.MoreauPTRSolver`).
283
283
 
284
- ``cvx_solver``, ``cvxpygen``, and ``cvxpygen_override`` are CVXPy-only;
285
- setting them under ``backend="qpax"`` or ``backend="moreau"`` is a
286
- configuration error.
284
+ Backend-specific fields mirror the constructor parameters of each class.
285
+ Fields that don't belong to the active backend are a configuration error
286
+ and raise ``ValidationError``.
287
+
288
+ CVXPy-only:
289
+ ``cvx_solver``, ``cvxpygen``, ``cvxpygen_override``.
290
+
291
+ QPAX-only:
292
+ ``solver_tol``.
293
+
294
+ Moreau-only:
295
+ ``verbose``, ``device``, ``tol_gap_abs``, ``tol_feas``.
296
+
297
+ Shared between QPAX and Moreau:
298
+ ``max_iter``.
299
+
300
+ All backends:
301
+ ``solver_args`` (escape hatch for settings not covered by named fields).
287
302
 
288
303
  !!! warning
289
304
  Enabling ``cvxpygen`` currently disables sparse parameter declarations.
@@ -294,11 +309,27 @@ class PTRSolverSpec(BaseModel):
294
309
 
295
310
  type: Literal["PTRSolver"] = "PTRSolver"
296
311
  backend: Literal["cvxpy", "qpax", "moreau"] = "cvxpy"
312
+
313
+ # CVXPy-only
297
314
  cvx_solver: Optional[str] = None
298
- solver_args: Optional[Dict[str, Any]] = None
299
315
  cvxpygen: bool = False
300
316
  cvxpygen_override: bool = False
301
317
 
318
+ # QPAX-specific
319
+ solver_tol: Optional[float] = None
320
+
321
+ # Shared between QPAX and Moreau
322
+ max_iter: Optional[int] = None
323
+
324
+ # Moreau-specific
325
+ verbose: Optional[bool] = None
326
+ device: Optional[str] = None
327
+ tol_gap_abs: Optional[float] = None
328
+ tol_feas: Optional[float] = None
329
+
330
+ # Escape hatch for all backends
331
+ solver_args: Optional[Dict[str, Any]] = None
332
+
302
333
  model_config = ConfigDict(extra="forbid")
303
334
 
304
335
  @model_validator(mode="after")
@@ -318,6 +349,45 @@ class PTRSolverSpec(BaseModel):
318
349
  f"{offenders} only valid for backend='cvxpy'; "
319
350
  "remove these fields or set backend='cvxpy'."
320
351
  )
352
+ if self.backend == "cvxpy":
353
+ offenders = [
354
+ name
355
+ for name, value in (
356
+ ("solver_tol", self.solver_tol),
357
+ ("max_iter", self.max_iter),
358
+ ("verbose", self.verbose),
359
+ ("device", self.device),
360
+ ("tol_gap_abs", self.tol_gap_abs),
361
+ ("tol_feas", self.tol_feas),
362
+ )
363
+ if value is not None
364
+ ]
365
+ if offenders:
366
+ raise ValueError(
367
+ f"{offenders} not valid for backend='cvxpy'; pass these "
368
+ "via solver_args or switch to the qpax / moreau backend."
369
+ )
370
+ if self.backend == "qpax":
371
+ offenders = [
372
+ name
373
+ for name, value in (
374
+ ("verbose", self.verbose),
375
+ ("device", self.device),
376
+ ("tol_gap_abs", self.tol_gap_abs),
377
+ ("tol_feas", self.tol_feas),
378
+ )
379
+ if value is not None
380
+ ]
381
+ if offenders:
382
+ raise ValueError(
383
+ f"{offenders} only valid for backend='moreau'; "
384
+ "remove these fields or set backend='moreau'."
385
+ )
386
+ if self.backend == "moreau" and self.solver_tol is not None:
387
+ raise ValueError(
388
+ "solver_tol is only valid for backend='qpax'; "
389
+ "remove this field or set backend='qpax'."
390
+ )
321
391
  return self
322
392
 
323
393
  def build(self) -> ConvexSolver:
@@ -335,10 +405,31 @@ class PTRSolverSpec(BaseModel):
335
405
  if self.backend == "moreau":
336
406
  from .moreau_ptr_solver import MoreauPTRSolver
337
407
 
338
- return MoreauPTRSolver(solver_args=self.solver_args)
408
+ kwargs: Dict[str, Any] = {}
409
+ if self.max_iter is not None:
410
+ kwargs["max_iter"] = self.max_iter
411
+ if self.verbose is not None:
412
+ kwargs["verbose"] = self.verbose
413
+ if self.device is not None:
414
+ kwargs["device"] = self.device
415
+ if self.tol_gap_abs is not None:
416
+ kwargs["tol_gap_abs"] = self.tol_gap_abs
417
+ if self.tol_feas is not None:
418
+ kwargs["tol_feas"] = self.tol_feas
419
+ if self.solver_args is not None:
420
+ kwargs["solver_args"] = self.solver_args
421
+ return MoreauPTRSolver(**kwargs)
422
+
339
423
  from .qpax_ptr_solver import QPAXPTRSolver
340
424
 
341
- return QPAXPTRSolver(solver_args=self.solver_args)
425
+ kwargs = {}
426
+ if self.solver_tol is not None:
427
+ kwargs["solver_tol"] = self.solver_tol
428
+ if self.max_iter is not None:
429
+ kwargs["max_iter"] = self.max_iter
430
+ if self.solver_args is not None:
431
+ kwargs["solver_args"] = self.solver_args
432
+ return QPAXPTRSolver(**kwargs)
342
433
 
343
434
 
344
435
  def __getattr__(name: str):
@@ -241,24 +241,75 @@ class MoreauPTRSolver(PTRSolver):
241
241
  through a full SCvx solve.
242
242
 
243
243
  Args:
244
- solver_args: Keyword arguments forwarded to :class:`moreau.Settings`.
245
- Useful keys include ``max_iter`` (default 200), ``verbose``
246
- (default False), ``device`` (``'auto'``, ``'cpu'``, or
247
- ``'cuda'``), and a nested ``ipm_settings`` dict for IPM tolerances
248
- (e.g. ``{"tol_gap_abs": 1e-8, "tol_feas": 1e-8}``).
244
+ max_iter: Maximum number of IPM iterations forwarded to
245
+ :class:`moreau.Settings`. Defaults to ``200``.
246
+ verbose: Whether Moreau prints per-iteration diagnostics.
247
+ Forwarded to :class:`moreau.Settings`. Defaults to ``False``.
248
+ device: Compute device for Moreau's JAX kernels. One of
249
+ ``"auto"``, ``"cpu"``, or ``"cuda"``. Forwarded to
250
+ :class:`moreau.Settings`. Defaults to ``"auto"``.
251
+ tol_gap_abs: Absolute duality-gap tolerance forwarded to
252
+ :class:`moreau.IPMSettings`. ``None`` uses Moreau's default.
253
+ tol_feas: Primal/dual feasibility tolerance forwarded to
254
+ :class:`moreau.IPMSettings`. ``None`` uses Moreau's default.
255
+ solver_args: Additional keyword arguments forwarded verbatim to
256
+ :class:`moreau.Settings`. Use for settings not covered by the
257
+ named params above. ``solver_args["ipm_settings"]`` may be a
258
+ dict or a :class:`moreau.IPMSettings` object; if it is a dict,
259
+ ``tol_gap_abs`` / ``tol_feas`` are merged into it. Raises
260
+ ``ValueError`` at construction time if any top-level key or
261
+ IPM tolerance overlaps with a named param.
249
262
 
250
263
  Attributes:
251
264
  layout: :class:`_ConicLayout` describing flat decision-vector slot
252
265
  ranges. Populated by :meth:`create_variables`.
253
266
  """
254
267
 
255
- def __init__(self, solver_args: Optional[Dict] = None):
268
+ def __init__(
269
+ self,
270
+ *,
271
+ max_iter: int = 200,
272
+ verbose: bool = False,
273
+ device: str = "auto",
274
+ tol_gap_abs: Optional[float] = None,
275
+ tol_feas: Optional[float] = None,
276
+ solver_args: Optional[Dict] = None,
277
+ ):
256
278
  if not _MOREAU_AVAILABLE:
257
279
  raise ImportError(
258
280
  "MoreauPTRSolver requires the `moreau` package. "
259
281
  "Install it with: pip install openscvx[moreau]"
260
282
  )
261
- self.solver_args = dict(solver_args) if solver_args else {}
283
+
284
+ _named = {"max_iter": max_iter, "verbose": verbose, "device": device}
285
+ _extra = dict(solver_args) if solver_args else {}
286
+ _overlap = _named.keys() & _extra.keys()
287
+ if _overlap:
288
+ raise ValueError(
289
+ f"Moreau settings {sorted(_overlap)} appear as both named arguments "
290
+ "and inside solver_args; use one or the other."
291
+ )
292
+ merged = {**_named, **_extra}
293
+
294
+ _ipm = {
295
+ k: v for k, v in [("tol_gap_abs", tol_gap_abs), ("tol_feas", tol_feas)] if v is not None
296
+ }
297
+ if _ipm:
298
+ existing_ipm = merged.get("ipm_settings", {})
299
+ if not isinstance(existing_ipm, dict):
300
+ raise ValueError(
301
+ "Cannot combine tol_gap_abs / tol_feas named arguments with an "
302
+ "ipm_settings object in solver_args; use one form or the other."
303
+ )
304
+ ipm_overlap = _ipm.keys() & existing_ipm.keys()
305
+ if ipm_overlap:
306
+ raise ValueError(
307
+ f"Moreau IPM settings {sorted(ipm_overlap)} appear as both named "
308
+ "arguments and inside solver_args['ipm_settings']; use one or the other."
309
+ )
310
+ merged["ipm_settings"] = {**_ipm, **existing_ipm}
311
+
312
+ self.solver_args = merged
262
313
 
263
314
  self.layout: Optional[_ConicLayout] = None
264
315
  self._S_x: Optional[np.ndarray] = None
@@ -177,25 +177,44 @@ class QPAXPTRSolver(PTRSolver):
177
177
  what lets ``jax.grad`` / ``jax.vmap`` reach through a full SCvx solve.
178
178
 
179
179
  Args:
180
- solver_args: Keyword arguments forwarded to ``qpax.solve_qp``. Useful
181
- keys include ``solver_tol`` (default ``1e-5``), ``max_iter``
182
- (default ``30``), ``linear_solver``, and ``backend`` (``"i"`` for
183
- implicit retraction-manifold PDIP qpax's default — or ``"e"``
184
- for the explicit predictor-corrector path).
180
+ solver_tol: Convergence tolerance forwarded to ``qpax.solve_qp``
181
+ as ``solver_tol``. Defaults to ``1e-5``.
182
+ max_iter: Maximum number of PDIP iterations forwarded to
183
+ ``qpax.solve_qp`` as ``max_iter``. Defaults to ``30``.
184
+ solver_args: Additional keyword arguments forwarded verbatim to
185
+ ``qpax.solve_qp``. Use for settings not covered by the named
186
+ params above — e.g. ``backend="e"`` for the explicit
187
+ predictor-corrector path, or ``linear_solver``. Raises
188
+ ``ValueError`` at construction time if any key overlaps with a
189
+ named param.
185
190
 
186
191
  Attributes:
187
192
  layout: ``_QPLayout`` describing the flat decision-vector slot ranges.
188
193
  Populated by :meth:`create_variables`.
189
194
  """
190
195
 
191
- def __init__(self, solver_args: Optional[dict] = None):
196
+ def __init__(
197
+ self,
198
+ *,
199
+ solver_tol: float = 1e-5,
200
+ max_iter: int = 30,
201
+ solver_args: Optional[dict] = None,
202
+ ):
192
203
  if not _QPAX_AVAILABLE:
193
204
  raise ImportError(
194
205
  "QPAXPTRSolver requires the `qpax` package. "
195
206
  "Install it with: pip install openscvx[qpax]"
196
207
  )
197
208
 
198
- self.solver_args = dict(solver_args) if solver_args else {}
209
+ _named = {"solver_tol": solver_tol, "max_iter": max_iter}
210
+ _extra = dict(solver_args) if solver_args else {}
211
+ _overlap = _named.keys() & _extra.keys()
212
+ if _overlap:
213
+ raise ValueError(
214
+ f"QPAX settings {sorted(_overlap)} appear as both named arguments "
215
+ "and inside solver_args; use one or the other."
216
+ )
217
+ self.solver_args = {**_named, **_extra}
199
218
 
200
219
  # Populated by create_variables / initialize.
201
220
  self.layout: Optional[_QPLayout] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.5.2.dev13
3
+ Version: 0.5.2.dev14
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
@@ -122,6 +122,81 @@ def test_moreau_spec_build_returns_moreau_solver():
122
122
  assert isinstance(solver, MoreauPTRSolver)
123
123
 
124
124
 
125
+ def test_moreau_named_params_populate_solver_args():
126
+ """Named constructor params should be merged into solver_args so
127
+ _build_moreau_settings picks them up unchanged."""
128
+ solver = MoreauPTRSolver(max_iter=500, verbose=True, device="cpu")
129
+ assert solver.solver_args["max_iter"] == 500
130
+ assert solver.solver_args["verbose"] is True
131
+ assert solver.solver_args["device"] == "cpu"
132
+
133
+
134
+ def test_moreau_ipm_tolerances_nest_into_ipm_settings():
135
+ """tol_gap_abs and tol_feas should be folded into solver_args['ipm_settings']
136
+ so _build_moreau_settings receives them in the expected nested location."""
137
+ solver = MoreauPTRSolver(tol_gap_abs=1e-10, tol_feas=1e-10)
138
+ assert solver.solver_args["ipm_settings"] == {"tol_gap_abs": 1e-10, "tol_feas": 1e-10}
139
+
140
+
141
+ def test_moreau_ipm_tolerances_merge_with_solver_args_ipm_settings():
142
+ """Named IPM tolerance params should merge with a dict inside solver_args
143
+ rather than silently overwriting it."""
144
+ solver = MoreauPTRSolver(
145
+ tol_gap_abs=1e-10,
146
+ solver_args={"ipm_settings": {"tol_feas": 1e-9}},
147
+ )
148
+ assert solver.solver_args["ipm_settings"]["tol_gap_abs"] == 1e-10
149
+ assert solver.solver_args["ipm_settings"]["tol_feas"] == 1e-9
150
+
151
+
152
+ def test_moreau_named_param_overlap_with_solver_args_raises():
153
+ """Passing the same top-level key as a named arg and inside solver_args
154
+ should raise immediately."""
155
+ with pytest.raises(ValueError, match="max_iter"):
156
+ MoreauPTRSolver(max_iter=200, solver_args={"max_iter": 100})
157
+
158
+ with pytest.raises(ValueError, match="device"):
159
+ MoreauPTRSolver(device="cpu", solver_args={"device": "cuda"})
160
+
161
+
162
+ def test_moreau_ipm_overlap_with_solver_args_ipm_settings_raises():
163
+ """A named IPM tolerance and the same key inside solver_args['ipm_settings']
164
+ is a user error and should raise."""
165
+ with pytest.raises(ValueError, match="tol_gap_abs"):
166
+ MoreauPTRSolver(
167
+ tol_gap_abs=1e-10,
168
+ solver_args={"ipm_settings": {"tol_gap_abs": 1e-8}},
169
+ )
170
+
171
+
172
+ def test_moreau_spec_named_fields_build_correctly():
173
+ """PTRSolverSpec with Moreau named fields should build a MoreauPTRSolver
174
+ with the right solver_args."""
175
+ from openscvx.solvers import resolve_solver_config
176
+
177
+ spec = resolve_solver_config(
178
+ {
179
+ "backend": "moreau",
180
+ "max_iter": 300,
181
+ "device": "cpu",
182
+ "tol_gap_abs": 1e-10,
183
+ }
184
+ )
185
+ solver = spec.build()
186
+ assert isinstance(solver, MoreauPTRSolver)
187
+ assert solver.solver_args["max_iter"] == 300
188
+ assert solver.solver_args["device"] == "cpu"
189
+ assert solver.solver_args["ipm_settings"]["tol_gap_abs"] == 1e-10
190
+
191
+
192
+ def test_moreau_spec_rejects_qpax_only_fields():
193
+ """solver_tol (QPAX-only) must not be accepted under backend='moreau'."""
194
+ from openscvx.solvers import resolve_solver_config
195
+
196
+ with pytest.raises(ValueError, match="solver_tol"):
197
+ resolve_solver_config({"backend": "moreau", "solver_tol": 1e-8})
198
+
199
+
125
200
  # ============================================================================
126
201
  # Unsupported-feature rejection tests
127
202
  # ============================================================================
@@ -109,6 +109,77 @@ def test_qpax_spec_rejects_cvxpy_only_fields():
109
109
  resolve_solver_config({"backend": "qpax", "cvx_solver": "CLARABEL"})
110
110
 
111
111
 
112
+ def test_qpax_named_params_populate_solver_args():
113
+ """Named constructor params should be merged into solver_args so the
114
+ existing qpax.solve_qp(**self.solver_args) dispatch picks them up."""
115
+ solver = QPAXPTRSolver(solver_tol=1e-8, max_iter=50)
116
+ assert solver.solver_args["solver_tol"] == 1e-8
117
+ assert solver.solver_args["max_iter"] == 50
118
+
119
+
120
+ def test_qpax_named_param_overlap_with_solver_args_raises():
121
+ """Passing the same key as a named arg and inside solver_args is a user
122
+ error — the constructor should raise immediately rather than silently
123
+ discarding one value."""
124
+ with pytest.raises(ValueError, match="solver_tol"):
125
+ QPAXPTRSolver(solver_tol=1e-8, solver_args={"solver_tol": 1e-7})
126
+
127
+ with pytest.raises(ValueError, match="max_iter"):
128
+ QPAXPTRSolver(max_iter=50, solver_args={"max_iter": 100})
129
+
130
+
131
+ def test_qpax_solver_args_escape_hatch():
132
+ """Keys not covered by named params (e.g. backend='e') should pass
133
+ through the solver_args escape hatch unchanged."""
134
+ solver = QPAXPTRSolver(solver_tol=1e-6, solver_args={"backend": "e"})
135
+ assert solver.solver_args["backend"] == "e"
136
+ assert solver.solver_args["solver_tol"] == 1e-6
137
+
138
+
139
+ def test_qpax_spec_named_fields_build_correctly():
140
+ """PTRSolverSpec with QPAX named fields should build a QPAXPTRSolver
141
+ with the right solver_args."""
142
+ from openscvx.solvers import QPAXPTRSolver, resolve_solver_config
143
+
144
+ spec = resolve_solver_config({"backend": "qpax", "solver_tol": 1e-8, "max_iter": 75})
145
+ solver = spec.build()
146
+ assert isinstance(solver, QPAXPTRSolver)
147
+ assert solver.solver_args["solver_tol"] == 1e-8
148
+ assert solver.solver_args["max_iter"] == 75
149
+
150
+
151
+ def test_qpax_spec_rejects_moreau_only_fields():
152
+ """Moreau-specific fields (verbose, device, tol_gap_abs, tol_feas) must
153
+ not be accepted under backend='qpax'."""
154
+ from openscvx.solvers import resolve_solver_config
155
+
156
+ with pytest.raises(ValueError, match="only valid for backend='moreau'"):
157
+ resolve_solver_config({"backend": "qpax", "verbose": True})
158
+
159
+ with pytest.raises(ValueError, match="only valid for backend='moreau'"):
160
+ resolve_solver_config({"backend": "qpax", "tol_gap_abs": 1e-10})
161
+
162
+
163
+ def test_qpax_spec_rejects_solver_tol_under_moreau():
164
+ """solver_tol must not be accepted under backend='moreau'."""
165
+ from openscvx.solvers import resolve_solver_config
166
+
167
+ with pytest.raises(ValueError, match="solver_tol"):
168
+ resolve_solver_config({"backend": "moreau", "solver_tol": 1e-8})
169
+
170
+
171
+ def test_cvxpy_spec_rejects_jax_backend_fields():
172
+ """QPAX/Moreau named fields (solver_tol, max_iter, verbose, device, …)
173
+ must not be accepted under backend='cvxpy'."""
174
+ from openscvx.solvers import resolve_solver_config
175
+
176
+ with pytest.raises(ValueError, match="not valid for backend='cvxpy'"):
177
+ resolve_solver_config({"backend": "cvxpy", "solver_tol": 1e-8})
178
+
179
+ with pytest.raises(ValueError, match="not valid for backend='cvxpy'"):
180
+ resolve_solver_config({"backend": "cvxpy", "max_iter": 100})
181
+
182
+
112
183
  # ============================================================================
113
184
  # Unsupported-feature rejection tests
114
185
  # ============================================================================
File without changes
File without changes