openscvx 0.4.1.dev146__tar.gz → 0.4.1.dev147__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 (312) hide show
  1. {openscvx-0.4.1.dev146/openscvx.egg-info → openscvx-0.4.1.dev147}/PKG-INFO +1 -1
  2. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/_version.py +3 -3
  3. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/problem.py +9 -5
  4. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/augmentation.py +36 -10
  5. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/builder.py +9 -5
  6. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147/openscvx.egg-info}/PKG-INFO +1 -1
  7. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_augmentation.py +99 -0
  8. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/assets/logo.svg +0 -0
  9. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/release-drafter.yml +0 -0
  10. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/_docs.yml +0 -0
  11. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/branch-name.yml +0 -0
  12. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/docs.yml +0 -0
  13. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/lint.yml +0 -0
  14. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/nightly.yml +0 -0
  15. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/release-drafter.yml +0 -0
  16. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/release.yml +0 -0
  17. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/tests-integration.yml +0 -0
  18. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/tests-unit.yml +0 -0
  19. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.gitignore +0 -0
  20. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/CONTRIBUTING.md +0 -0
  21. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/LICENSE +0 -0
  22. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/README.md +0 -0
  23. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/constraint_reformulation.md +0 -0
  24. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/control_parameterization.md +0 -0
  25. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/discretization.md +0 -0
  26. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/ocp.md +0 -0
  27. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/scvx.md +0 -0
  28. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/time_dilation.md +0 -0
  29. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UnderTheHood/lowering_architecture.md +0 -0
  30. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  31. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/00_introduction.md +0 -0
  32. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  33. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  34. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  35. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  36. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/05_visualization.md +0 -0
  37. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/06_logic.md +0 -0
  38. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/07_lie.md +0 -0
  39. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/favicon.png +0 -0
  40. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/ct-scvx_dark.png +0 -0
  41. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/ct-scvx_light.png +0 -0
  42. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/ctcs_dark.png +0 -0
  43. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/ctcs_light.png +0 -0
  44. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/problem_class_dark.png +0 -0
  45. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/problem_class_light.png +0 -0
  46. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/logo.svg +0 -0
  47. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/citation.md +0 -0
  48. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/examples.md +0 -0
  49. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/getting-started.md +0 -0
  50. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/index.md +0 -0
  51. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/javascripts/mathjax.js +0 -0
  52. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/abstract/brachistochrone.py +0 -0
  53. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/abstract/impulsive.py +0 -0
  54. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/arm/three_link_arm.py +0 -0
  55. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/car/dubins_car.py +0 -0
  56. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/car/dubins_car_conditional.py +0 -0
  57. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/car/dubins_car_disjoint.py +0 -0
  58. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/car/dubins_car_stljax.py +0 -0
  59. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/cinema_vp.py +0 -0
  60. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/dr_double_integrator.py +0 -0
  61. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/dr_vp.py +0 -0
  62. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/dr_vp_nodal.py +0 -0
  63. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/dr_vp_polytope.py +0 -0
  64. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/drone_racing.py +0 -0
  65. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/logo.py +0 -0
  66. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/logo_utils/acl_logo.svg +0 -0
  67. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  68. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/obstacle_avoidance.py +0 -0
  69. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  70. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  71. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/plotting.py +0 -0
  72. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/plotting_viser.py +0 -0
  73. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  74. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  75. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  76. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/cinema_vp_realtime.py +0 -0
  77. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/drone_racing_realtime.py +0 -0
  78. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/dubins_car_realtime.py +0 -0
  79. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  80. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/rocket/3DoF_pdg.py +0 -0
  81. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/spacecraft/hohmann_transfer.py +0 -0
  82. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/spacecraft/proxops_cw.py +0 -0
  83. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/ctlos_cine.gif +0 -0
  84. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/ctlos_dr.gif +0 -0
  85. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/dtlos_cine.gif +0 -0
  86. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/dtlos_dr.gif +0 -0
  87. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/openscvx_logo.svg +0 -0
  88. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/openscvx_logo_square.png +0 -0
  89. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/oscvx_structure_full_dark.svg +0 -0
  90. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/video_preview.png +0 -0
  91. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/__init__.py +0 -0
  92. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background.avif +0 -0
  93. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
  94. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
  95. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
  96. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
  97. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars.avif +0 -0
  98. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
  99. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
  100. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
  101. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
  102. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon.avif +0 -0
  103. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
  104. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
  105. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
  106. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
  107. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
  108. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
  109. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
  110. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
  111. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
  112. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space.avif +0 -0
  113. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
  114. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
  115. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
  116. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
  117. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth.avif +0 -0
  118. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
  119. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
  120. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
  121. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
  122. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/javascripts/parallax.js +0 -0
  123. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/logo.svg +0 -0
  124. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/stylesheets/custom.css +0 -0
  125. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/stylesheets/parallax.css +0 -0
  126. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/home.html +0 -0
  127. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/main.html +0 -0
  128. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/partials/parallax/hero.html +0 -0
  129. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/partials/parallax.html +0 -0
  130. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/mkdocs.yml +0 -0
  131. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/__init__.py +0 -0
  132. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/__main__.py +0 -0
  133. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/__init__.py +0 -0
  134. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/augmented_lagrangian.py +0 -0
  135. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/base.py +0 -0
  136. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/constant_proximal_weight.py +0 -0
  137. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/optimization_results.py +0 -0
  138. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/penalized_trust_region.py +0 -0
  139. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/ramp_proximal_weight.py +0 -0
  140. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/config.py +0 -0
  141. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/discretization/__init__.py +0 -0
  142. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/discretization/base.py +0 -0
  143. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/discretization/linearize_discretize.py +0 -0
  144. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/expert/__init__.py +0 -0
  145. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/expert/byof.py +0 -0
  146. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/expert/lowering.py +0 -0
  147. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/expert/validation.py +0 -0
  148. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/init/__init__.py +0 -0
  149. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/init/interpolation.py +0 -0
  150. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/integrators/__init__.py +0 -0
  151. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/integrators/runge_kutta.py +0 -0
  152. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/loader.py +0 -0
  153. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/__init__.py +0 -0
  154. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/cvxpy_constraints.py +0 -0
  155. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/cvxpy_variables.py +0 -0
  156. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/dynamics.py +0 -0
  157. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/jax_constraints.py +0 -0
  158. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/parameters.py +0 -0
  159. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/problem.py +0 -0
  160. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/unified.py +0 -0
  161. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/__init__.py +0 -0
  162. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/plotting.py +0 -0
  163. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/scp_iteration.py +0 -0
  164. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/__init__.py +0 -0
  165. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/animated.py +0 -0
  166. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/orbits.py +0 -0
  167. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/plotly_integration.py +0 -0
  168. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/primitives.py +0 -0
  169. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/scp.py +0 -0
  170. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/server.py +0 -0
  171. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/propagation/__init__.py +0 -0
  172. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/propagation/post_processing.py +0 -0
  173. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/propagation/propagation.py +0 -0
  174. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/solvers/__init__.py +0 -0
  175. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/solvers/base.py +0 -0
  176. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/solvers/ptr_solver.py +0 -0
  177. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/__init__.py +0 -0
  178. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/constraint_set.py +0 -0
  179. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/__init__.py +0 -0
  180. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/arithmetic.py +0 -0
  181. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/array.py +0 -0
  182. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/constraint.py +0 -0
  183. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/control.py +0 -0
  184. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/expr.py +0 -0
  185. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  186. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  187. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/lie/se3.py +0 -0
  188. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/lie/so3.py +0 -0
  189. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/linalg.py +0 -0
  190. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/logic.py +0 -0
  191. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/math.py +0 -0
  192. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/spatial.py +0 -0
  193. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/state.py +0 -0
  194. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/stl.py +0 -0
  195. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/time.py +0 -0
  196. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/variable.py +0 -0
  197. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/vmap.py +0 -0
  198. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/hashing.py +0 -0
  199. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lower.py +0 -0
  200. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/__init__.py +0 -0
  201. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  202. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  203. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  204. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  205. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  206. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  207. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  208. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  209. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  210. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  211. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  212. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  213. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  214. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  215. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  216. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  217. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  218. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  219. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  220. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  221. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  222. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  223. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  224. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  225. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  226. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  227. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  228. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  229. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/__init__.py +0 -0
  230. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/_registry.py +0 -0
  231. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/array.py +0 -0
  232. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/constraint.py +0 -0
  233. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/lie.py +0 -0
  234. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/linalg.py +0 -0
  235. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/logic.py +0 -0
  236. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/math.py +0 -0
  237. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/parser.py +0 -0
  238. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/spatial.py +0 -0
  239. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/stl.py +0 -0
  240. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/tokenizer.py +0 -0
  241. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/preprocessing.py +0 -0
  242. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/problem.py +0 -0
  243. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/sparsity.py +0 -0
  244. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/unified.py +0 -0
  245. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/__init__.py +0 -0
  246. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/cache.py +0 -0
  247. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/caching.py +0 -0
  248. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/printing.py +0 -0
  249. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/profiling.py +0 -0
  250. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/utils.py +0 -0
  251. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/SOURCES.txt +0 -0
  252. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/dependency_links.txt +0 -0
  253. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/entry_points.txt +0 -0
  254. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/requires.txt +0 -0
  255. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/top_level.txt +0 -0
  256. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/pyproject.toml +0 -0
  257. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/scripts/gen_example_pages.py +0 -0
  258. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/scripts/gen_ref_pages.py +0 -0
  259. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/setup.cfg +0 -0
  260. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/__init__.py +0 -0
  261. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/brachistochrone_analytical.py +0 -0
  262. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/fixtures/brachistochrone.json +0 -0
  263. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/fixtures/brachistochrone.yaml +0 -0
  264. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/hohmann_analytical.py +0 -0
  265. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/__init__.py +0 -0
  266. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/__init__.py +0 -0
  267. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_arithmetic.py +0 -0
  268. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_array.py +0 -0
  269. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_constraint.py +0 -0
  270. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_expr.py +0 -0
  271. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_lie.py +0 -0
  272. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_linalg.py +0 -0
  273. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_logic.py +0 -0
  274. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_math.py +0 -0
  275. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_node_reference.py +0 -0
  276. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_parameters.py +0 -0
  277. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_scaling.py +0 -0
  278. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_spatial.py +0 -0
  279. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_variable.py +0 -0
  280. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_vmap.py +0 -0
  281. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/__init__.py +0 -0
  282. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_array.py +0 -0
  283. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_constraint.py +0 -0
  284. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_lie.py +0 -0
  285. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_linalg.py +0 -0
  286. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_load.py +0 -0
  287. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_logic.py +0 -0
  288. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_math.py +0 -0
  289. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_parser.py +0 -0
  290. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_spatial.py +0 -0
  291. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_stl.py +0 -0
  292. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_tokenizer.py +0 -0
  293. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_vmap.py +0 -0
  294. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_hashing.py +0 -0
  295. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_lower_cvxpy.py +0 -0
  296. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_lower_jax.py +0 -0
  297. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_preprocessing.py +0 -0
  298. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_sparsity.py +0 -0
  299. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_unified.py +0 -0
  300. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_autotuning.py +0 -0
  301. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_brachistochrone.py +0 -0
  302. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_cvxpygen_optional.py +0 -0
  303. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_discretization.py +0 -0
  304. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_examples.py +0 -0
  305. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_expert.py +0 -0
  306. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_impulsive.py +0 -0
  307. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_init.py +0 -0
  308. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_integrators.py +0 -0
  309. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_loader.py +0 -0
  310. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_optimization_results.py +0 -0
  311. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_plotting.py +0 -0
  312. {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_propagation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.4.1.dev146
3
+ Version: 0.4.1.dev147
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
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.4.1.dev146'
32
- __version_tuple__ = version_tuple = (0, 4, 1, 'dev146')
31
+ __version__ = version = '0.4.1.dev147'
32
+ __version_tuple__ = version_tuple = (0, 4, 1, 'dev147')
33
33
 
34
- __commit_id__ = commit_id = 'g66b4191a1'
34
+ __commit_id__ = commit_id = 'g50fc80214'
@@ -18,7 +18,7 @@ import os
18
18
  import queue
19
19
  import threading
20
20
  import time
21
- from typing import List, Optional, Union
21
+ from typing import Dict, List, Optional, Union
22
22
 
23
23
  import jax
24
24
 
@@ -83,8 +83,8 @@ class Problem:
83
83
  dynamics_prop: Optional[dict] = None,
84
84
  states_prop: Optional[List[State]] = None,
85
85
  algebraic_prop: Optional[dict] = None,
86
- licq_min: float = 0.0,
87
- licq_max: float = 1e-4,
86
+ licq_min: Union[float, Dict[int, float]] = 0.0,
87
+ licq_max: Union[float, Dict[int, float]] = 1e-4,
88
88
  algorithm: Optional[Union[Algorithm, dict]] = None,
89
89
  discretizer: Optional[Union[Discretizer, dict]] = None,
90
90
  solver: Optional[Union[ConvexSolver, dict]] = None,
@@ -114,8 +114,12 @@ class Problem:
114
114
  Only specify additional states beyond optimization states. Used with dynamics_prop.
115
115
  algebraic_prop (dict, optional): Dictionary mapping names to symbolic expressions
116
116
  for outputs evaluated (not integrated) during propagation.
117
- licq_min (float): Minimum LICQ constraint value. Defaults to 0.0.
118
- licq_max (float): Maximum LICQ constraint value. Defaults to 1e-4.
117
+ licq_min: Minimum LICQ constraint value. Defaults to 0.0.
118
+ Either a scalar (applied to all CTCS groups) or a dict
119
+ mapping CTCS group ``idx`` to per-group bounds.
120
+ licq_max: Maximum LICQ constraint value. Defaults to 1e-4.
121
+ Either a scalar (applied to all CTCS groups) or a dict
122
+ mapping CTCS group ``idx`` to per-group bounds.
119
123
  algorithm: SCP algorithm configuration. Accepts:
120
124
 
121
125
  - ``None`` — uses ``PenalizedTrustRegion()`` with defaults.
@@ -54,7 +54,7 @@ Example:
54
54
  # controls_aug includes original controls + time dilation
55
55
  """
56
56
 
57
- from typing import Dict, List, Optional, Tuple
57
+ from typing import Dict, List, Optional, Tuple, Union
58
58
 
59
59
  import numpy as np
60
60
 
@@ -484,8 +484,8 @@ def augment_dynamics_with_ctcs(
484
484
  N: int,
485
485
  xdelta: Optional[Expr] = None,
486
486
  *,
487
- licq_min: float = 0.0,
488
- licq_max: float = 1e-4,
487
+ licq_min: Union[float, Dict[int, float]] = 0.0,
488
+ licq_max: Union[float, Dict[int, float]] = 1e-4,
489
489
  ) -> Tuple[Expr, Optional[Expr], List[State], List[Control]]:
490
490
  """Augment dynamics with continuous-time constraint satisfaction states.
491
491
 
@@ -509,8 +509,12 @@ def augment_dynamics_with_ctcs(
509
509
  controls: List of control variables
510
510
  constraints_ctcs: List of CTCS constraints (should be sorted and grouped)
511
511
  N: Number of discretization nodes
512
- licq_min: Minimum bound for augmented states (default: 0.0)
513
- licq_max: Maximum bound for augmented states (default: 1e-4)
512
+ licq_min: Minimum bound for augmented states (default: 0.0).
513
+ Either a scalar (applied to all groups) or a dict mapping
514
+ CTCS group ``idx`` to per-group bounds.
515
+ licq_max: Maximum bound for augmented states (default: 1e-4).
516
+ Either a scalar (applied to all groups) or a dict mapping
517
+ CTCS group ``idx`` to per-group bounds.
514
518
 
515
519
  Returns:
516
520
  Tuple of:
@@ -567,6 +571,24 @@ def augment_dynamics_with_ctcs(
567
571
  penalty_groups[ctcs.idx] = []
568
572
  penalty_groups[ctcs.idx].append(ctcs)
569
573
 
574
+ # Validate dict-valued licq_min / licq_max keys against actual groups.
575
+ valid_ids = set(penalty_groups.keys())
576
+ for name, val in [("licq_min", licq_min), ("licq_max", licq_max)]:
577
+ if isinstance(val, dict):
578
+ unknown = set(val.keys()) - valid_ids
579
+ if unknown:
580
+ raise ValueError(
581
+ f"{name} dict contains unknown CTCS group idx: {unknown}. "
582
+ f"Valid idx values: {sorted(valid_ids)}"
583
+ )
584
+ missing = valid_ids - set(val.keys())
585
+ if missing:
586
+ raise ValueError(
587
+ f"{name} dict is missing entries for CTCS group idx: "
588
+ f"{sorted(missing)}. When using a dict, all groups must "
589
+ f"have an entry. Valid idx values: {sorted(valid_ids)}"
590
+ )
591
+
570
592
  # Create augmented state expressions for each group and corresponding
571
593
  # augmented state variables. For discrete dynamics, preserve these states
572
594
  # by identity mapping across impulsive updates.
@@ -580,13 +602,17 @@ def augment_dynamics_with_ctcs(
580
602
  augmented_state_expr = Add(*penalty_terms)
581
603
  augmented_state_exprs.append(augmented_state_expr)
582
604
 
605
+ # Resolve per-group LICQ bounds
606
+ idx_min = licq_min[idx] if isinstance(licq_min, dict) else licq_min
607
+ idx_max = licq_max[idx] if isinstance(licq_max, dict) else licq_max
608
+
583
609
  aug_var = State(f"_ctcs_aug_{idx}", shape=(1,))
584
- aug_var.initial = np.array([licq_min]) # Set initial to respect bounds
610
+ aug_var.initial = np.array([idx_min]) # Set initial to respect bounds
585
611
  aug_var.final = [("free", 0)]
586
- aug_var.min = np.array([licq_min])
587
- aug_var.max = np.array([licq_max])
588
- # Set guess to licq_min as well
589
- aug_var.guess = np.full([N, 1], licq_min) # N x num augmented states
612
+ aug_var.min = np.array([idx_min])
613
+ aug_var.max = np.array([idx_max])
614
+ # Set guess to idx_min as well
615
+ aug_var.guess = np.full([N, 1], idx_min) # N x num augmented states
590
616
  states_augmented.append(aug_var)
591
617
  augmented_state_exprs_discrete.append(aug_var)
592
618
 
@@ -29,7 +29,7 @@ Pipeline stages:
29
29
  See `preprocess_symbolic_problem()` for the main entry point.
30
30
  """
31
31
 
32
- from typing import Dict, List, Optional, Tuple
32
+ from typing import Dict, List, Optional, Tuple, Union
33
33
 
34
34
  import numpy as np
35
35
 
@@ -71,8 +71,8 @@ def preprocess_symbolic_problem(
71
71
  controls: List[Control],
72
72
  N: int,
73
73
  time: Time,
74
- licq_min: float = 0.0,
75
- licq_max: float = 1e-4,
74
+ licq_min: Union[float, Dict[int, float]] = 0.0,
75
+ licq_max: Union[float, Dict[int, float]] = 1e-4,
76
76
  dynamics_prop_extra: dict = None,
77
77
  dynamics_discrete: dict = None,
78
78
  states_prop_extra: List[State] = None,
@@ -106,8 +106,12 @@ def preprocess_symbolic_problem(
106
106
  controls: List of user-defined Control objects (should NOT include time dilation)
107
107
  N: Number of discretization nodes in the trajectory
108
108
  time: Time configuration object specifying time bounds and constraints
109
- licq_min: Minimum bound for CTCS augmented states (default: 0.0)
110
- licq_max: Maximum bound for CTCS augmented states (default: 1e-4)
109
+ licq_min: Minimum bound for CTCS augmented states (default: 0.0).
110
+ Either a scalar (applied to all groups) or a dict mapping
111
+ CTCS group ``idx`` to per-group bounds.
112
+ licq_max: Maximum bound for CTCS augmented states (default: 1e-4).
113
+ Either a scalar (applied to all groups) or a dict mapping
114
+ CTCS group ``idx`` to per-group bounds.
111
115
  dynamics_prop_extra: Optional dictionary of additional dynamics for propagation-only
112
116
  states (default: None)
113
117
  states_prop_extra: Optional list of additional State objects for propagation only
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.4.1.dev146
3
+ Version: 0.4.1.dev147
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
@@ -821,6 +821,105 @@ def test_augmented_state_bounds():
821
821
  assert np.allclose(aug_state.guess, 0.001), "Augmented state guess should be licq_min"
822
822
 
823
823
 
824
+ def test_augmented_state_bounds_per_group_dict():
825
+ """Per-group LICQ bounds via dict keyed by idx."""
826
+ x = State("x", (1,))
827
+ time = State("time", (1,))
828
+ time.final = np.array([10.0])
829
+ xdot = x
830
+ states = [time, x]
831
+ controls = []
832
+ N = 5
833
+ time.guess = np.linspace(0, time.final[0], N).reshape(-1, 1)
834
+
835
+ # Two constraints with different node intervals → two groups (idx 0 and 1)
836
+ c0 = ctcs(x <= 1.0, penalty="squared_relu", nodes=(0, 3))
837
+ c1 = ctcs(x <= 2.0, penalty="squared_relu", nodes=(3, 5))
838
+
839
+ _, _, states_aug, _ = augment_dynamics_with_ctcs(
840
+ xdot,
841
+ states,
842
+ controls,
843
+ [c0, c1],
844
+ N,
845
+ licq_min={0: 0.0, 1: 0.001},
846
+ licq_max={0: 1e-8, 1: 0.01},
847
+ )
848
+
849
+ aug0 = states_aug[2] # _ctcs_aug_0
850
+ aug1 = states_aug[3] # _ctcs_aug_1
851
+
852
+ assert aug0.min[0] == 0.0
853
+ assert aug0.max[0] == 1e-8
854
+ assert aug0.initial[0] == 0.0
855
+ assert np.allclose(aug0.guess, 0.0)
856
+
857
+ assert aug1.min[0] == 0.001
858
+ assert aug1.max[0] == 0.01
859
+ assert aug1.initial[0] == 0.001
860
+ assert np.allclose(aug1.guess, 0.001)
861
+
862
+
863
+ def test_augmented_state_bounds_scalar_with_multiple_groups():
864
+ """Scalar LICQ bounds broadcast to all groups."""
865
+ x = State("x", (1,))
866
+ time = State("time", (1,))
867
+ time.final = np.array([10.0])
868
+ xdot = x
869
+ states = [time, x]
870
+ controls = []
871
+ N = 5
872
+ time.guess = np.linspace(0, time.final[0], N).reshape(-1, 1)
873
+
874
+ c0 = ctcs(x <= 1.0, penalty="squared_relu", nodes=(0, 3))
875
+ c1 = ctcs(x <= 2.0, penalty="squared_relu", nodes=(3, 5))
876
+
877
+ _, _, states_aug, _ = augment_dynamics_with_ctcs(
878
+ xdot,
879
+ states,
880
+ controls,
881
+ [c0, c1],
882
+ N,
883
+ licq_min=0.002,
884
+ licq_max=0.05,
885
+ )
886
+
887
+ for i in [2, 3]:
888
+ aug = states_aug[i]
889
+ assert aug.min[0] == 0.002
890
+ assert aug.max[0] == 0.05
891
+ assert aug.initial[0] == 0.002
892
+
893
+
894
+ def test_licq_dict_unknown_idx_raises():
895
+ """Dict licq with unknown idx raises helpful error."""
896
+ x = State("x", (1,))
897
+ time = State("time", (1,))
898
+ time.final = np.array([10.0])
899
+ states = [time, x]
900
+ N = 5
901
+ time.guess = np.linspace(0, time.final[0], N).reshape(-1, 1)
902
+ c0 = ctcs(x <= 1.0, penalty="squared_relu", nodes=(0, 5))
903
+
904
+ with pytest.raises(ValueError, match="unknown CTCS group idx.*5"):
905
+ augment_dynamics_with_ctcs(x, states, [], [c0], N, licq_max={0: 1e-8, 5: 1e-4})
906
+
907
+
908
+ def test_licq_dict_missing_idx_raises():
909
+ """Dict licq missing a group idx raises helpful error."""
910
+ x = State("x", (1,))
911
+ time = State("time", (1,))
912
+ time.final = np.array([10.0])
913
+ states = [time, x]
914
+ N = 5
915
+ time.guess = np.linspace(0, time.final[0], N).reshape(-1, 1)
916
+ c0 = ctcs(x <= 1.0, penalty="squared_relu", nodes=(0, 3))
917
+ c1 = ctcs(x <= 2.0, penalty="squared_relu", nodes=(3, 5))
918
+
919
+ with pytest.raises(ValueError, match="missing entries for CTCS group idx.*1"):
920
+ augment_dynamics_with_ctcs(x, states, [], [c0, c1], N, licq_max={0: 1e-8})
921
+
922
+
824
923
  def test_time_dilation_control_bounds():
825
924
  """Test that time dilation control has correct min/max bounds based on time."""
826
925
  x = State("x", (2,))
File without changes