openscvx 0.4.1.dev144__tar.gz → 0.4.1.dev145__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.dev144/openscvx.egg-info → openscvx-0.4.1.dev145}/PKG-INFO +1 -1
  2. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/_version.py +3 -3
  3. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/algorithms/base.py +145 -6
  4. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/algorithms/penalized_trust_region.py +19 -8
  5. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145/openscvx.egg-info}/PKG-INFO +1 -1
  6. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/assets/logo.svg +0 -0
  7. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/release-drafter.yml +0 -0
  8. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/workflows/_docs.yml +0 -0
  9. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/workflows/branch-name.yml +0 -0
  10. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/workflows/docs.yml +0 -0
  11. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/workflows/lint.yml +0 -0
  12. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/workflows/nightly.yml +0 -0
  13. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/workflows/release-drafter.yml +0 -0
  14. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/workflows/release.yml +0 -0
  15. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/workflows/tests-integration.yml +0 -0
  16. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.github/workflows/tests-unit.yml +0 -0
  17. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/.gitignore +0 -0
  18. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/CONTRIBUTING.md +0 -0
  19. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/LICENSE +0 -0
  20. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/README.md +0 -0
  21. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/Foundations/constraint_reformulation.md +0 -0
  22. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/Foundations/control_parameterization.md +0 -0
  23. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/Foundations/discretization.md +0 -0
  24. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/Foundations/ocp.md +0 -0
  25. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/Foundations/scvx.md +0 -0
  26. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/Foundations/time_dilation.md +0 -0
  27. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UnderTheHood/lowering_architecture.md +0 -0
  28. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  29. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UsersGuide/00_introduction.md +0 -0
  30. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  31. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  32. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  33. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  34. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UsersGuide/05_visualization.md +0 -0
  35. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UsersGuide/06_logic.md +0 -0
  36. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/UsersGuide/07_lie.md +0 -0
  37. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/assets/favicon.png +0 -0
  38. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/assets/images/ct-scvx_dark.png +0 -0
  39. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/assets/images/ct-scvx_light.png +0 -0
  40. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/assets/images/ctcs_dark.png +0 -0
  41. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/assets/images/ctcs_light.png +0 -0
  42. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/assets/images/problem_class_dark.png +0 -0
  43. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/assets/images/problem_class_light.png +0 -0
  44. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/assets/logo.svg +0 -0
  45. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/citation.md +0 -0
  46. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/examples.md +0 -0
  47. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/getting-started.md +0 -0
  48. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/index.md +0 -0
  49. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/docs/javascripts/mathjax.js +0 -0
  50. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/abstract/brachistochrone.py +0 -0
  51. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/abstract/impulsive.py +0 -0
  52. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/arm/three_link_arm.py +0 -0
  53. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/car/dubins_car.py +0 -0
  54. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/car/dubins_car_conditional.py +0 -0
  55. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/car/dubins_car_disjoint.py +0 -0
  56. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/car/dubins_car_stljax.py +0 -0
  57. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/cinema_vp.py +0 -0
  58. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/dr_double_integrator.py +0 -0
  59. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/dr_vp.py +0 -0
  60. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/dr_vp_nodal.py +0 -0
  61. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/dr_vp_polytope.py +0 -0
  62. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/drone_racing.py +0 -0
  63. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/logo.py +0 -0
  64. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/logo_utils/acl_logo.svg +0 -0
  65. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  66. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/obstacle_avoidance.py +0 -0
  67. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  68. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  69. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/plotting.py +0 -0
  70. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/plotting_viser.py +0 -0
  71. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  72. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  73. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
  74. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/realtime/cinema_vp_realtime.py +0 -0
  75. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/realtime/drone_racing_realtime.py +0 -0
  76. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/realtime/dubins_car_realtime.py +0 -0
  77. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  78. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/rocket/3DoF_pdg.py +0 -0
  79. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/spacecraft/hohmann_transfer.py +0 -0
  80. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/examples/spacecraft/proxops_cw.py +0 -0
  81. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/figures/ctlos_cine.gif +0 -0
  82. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/figures/ctlos_dr.gif +0 -0
  83. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/figures/dtlos_cine.gif +0 -0
  84. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/figures/dtlos_dr.gif +0 -0
  85. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/figures/openscvx_logo.svg +0 -0
  86. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/figures/openscvx_logo_square.png +0 -0
  87. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/figures/oscvx_structure_full_dark.svg +0 -0
  88. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/figures/video_preview.png +0 -0
  89. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/__init__.py +0 -0
  90. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/1-background.avif +0 -0
  91. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
  92. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
  93. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
  94. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
  95. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/2-mars.avif +0 -0
  96. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
  97. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
  98. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
  99. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
  100. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/3-moon.avif +0 -0
  101. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
  102. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
  103. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
  104. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
  105. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
  106. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
  107. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
  108. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
  109. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
  110. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/5-space.avif +0 -0
  111. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
  112. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
  113. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
  114. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
  115. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/6-earth.avif +0 -0
  116. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
  117. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
  118. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
  119. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
  120. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/javascripts/parallax.js +0 -0
  121. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/logo.svg +0 -0
  122. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/stylesheets/custom.css +0 -0
  123. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/assets/stylesheets/parallax.css +0 -0
  124. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/home.html +0 -0
  125. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/main.html +0 -0
  126. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/partials/parallax/hero.html +0 -0
  127. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/material/overrides/partials/parallax.html +0 -0
  128. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/mkdocs.yml +0 -0
  129. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/__init__.py +0 -0
  130. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/__main__.py +0 -0
  131. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/algorithms/__init__.py +0 -0
  132. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/algorithms/augmented_lagrangian.py +0 -0
  133. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/algorithms/constant_proximal_weight.py +0 -0
  134. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/algorithms/optimization_results.py +0 -0
  135. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/algorithms/ramp_proximal_weight.py +0 -0
  136. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/config.py +0 -0
  137. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/discretization/__init__.py +0 -0
  138. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/discretization/base.py +0 -0
  139. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/discretization/linearize_discretize.py +0 -0
  140. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/expert/__init__.py +0 -0
  141. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/expert/byof.py +0 -0
  142. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/expert/lowering.py +0 -0
  143. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/expert/validation.py +0 -0
  144. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/init/__init__.py +0 -0
  145. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/init/interpolation.py +0 -0
  146. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/integrators/__init__.py +0 -0
  147. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/integrators/runge_kutta.py +0 -0
  148. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/loader.py +0 -0
  149. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/lowered/__init__.py +0 -0
  150. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/lowered/cvxpy_constraints.py +0 -0
  151. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/lowered/cvxpy_variables.py +0 -0
  152. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/lowered/dynamics.py +0 -0
  153. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/lowered/jax_constraints.py +0 -0
  154. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/lowered/parameters.py +0 -0
  155. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/lowered/problem.py +0 -0
  156. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/lowered/unified.py +0 -0
  157. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/__init__.py +0 -0
  158. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/plotting.py +0 -0
  159. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/scp_iteration.py +0 -0
  160. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/viser/__init__.py +0 -0
  161. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/viser/animated.py +0 -0
  162. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/viser/orbits.py +0 -0
  163. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/viser/plotly_integration.py +0 -0
  164. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/viser/primitives.py +0 -0
  165. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/viser/scp.py +0 -0
  166. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/plotting/viser/server.py +0 -0
  167. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/problem.py +0 -0
  168. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/propagation/__init__.py +0 -0
  169. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/propagation/post_processing.py +0 -0
  170. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/propagation/propagation.py +0 -0
  171. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/solvers/__init__.py +0 -0
  172. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/solvers/base.py +0 -0
  173. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/solvers/ptr_solver.py +0 -0
  174. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/__init__.py +0 -0
  175. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/augmentation.py +0 -0
  176. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/builder.py +0 -0
  177. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/constraint_set.py +0 -0
  178. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/__init__.py +0 -0
  179. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/arithmetic.py +0 -0
  180. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/array.py +0 -0
  181. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/constraint.py +0 -0
  182. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/control.py +0 -0
  183. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/expr.py +0 -0
  184. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  185. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  186. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/lie/se3.py +0 -0
  187. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/lie/so3.py +0 -0
  188. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/linalg.py +0 -0
  189. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/logic.py +0 -0
  190. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/math.py +0 -0
  191. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/spatial.py +0 -0
  192. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/state.py +0 -0
  193. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/stl.py +0 -0
  194. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/time.py +0 -0
  195. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/variable.py +0 -0
  196. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/expr/vmap.py +0 -0
  197. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/hashing.py +0 -0
  198. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lower.py +0 -0
  199. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/__init__.py +0 -0
  200. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  201. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  202. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  203. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  204. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  205. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  206. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  207. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  208. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  209. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  210. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  211. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
  212. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  213. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  214. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  215. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  216. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  217. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  218. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  219. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  220. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  221. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  222. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  223. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  224. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  225. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/state.py +0 -0
  226. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  227. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  228. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/__init__.py +0 -0
  229. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/_registry.py +0 -0
  230. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/array.py +0 -0
  231. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/constraint.py +0 -0
  232. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/lie.py +0 -0
  233. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/linalg.py +0 -0
  234. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/logic.py +0 -0
  235. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/math.py +0 -0
  236. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/parser.py +0 -0
  237. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/spatial.py +0 -0
  238. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/stl.py +0 -0
  239. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/parser/tokenizer.py +0 -0
  240. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/preprocessing.py +0 -0
  241. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/problem.py +0 -0
  242. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/sparsity.py +0 -0
  243. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/symbolic/unified.py +0 -0
  244. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/utils/__init__.py +0 -0
  245. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/utils/cache.py +0 -0
  246. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/utils/caching.py +0 -0
  247. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/utils/printing.py +0 -0
  248. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/utils/profiling.py +0 -0
  249. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx/utils/utils.py +0 -0
  250. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx.egg-info/SOURCES.txt +0 -0
  251. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx.egg-info/dependency_links.txt +0 -0
  252. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx.egg-info/entry_points.txt +0 -0
  253. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx.egg-info/requires.txt +0 -0
  254. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/openscvx.egg-info/top_level.txt +0 -0
  255. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/pyproject.toml +0 -0
  256. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/scripts/gen_example_pages.py +0 -0
  257. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/scripts/gen_ref_pages.py +0 -0
  258. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/setup.cfg +0 -0
  259. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/__init__.py +0 -0
  260. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/brachistochrone_analytical.py +0 -0
  261. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/fixtures/brachistochrone.json +0 -0
  262. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/fixtures/brachistochrone.yaml +0 -0
  263. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/hohmann_analytical.py +0 -0
  264. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/__init__.py +0 -0
  265. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/__init__.py +0 -0
  266. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_arithmetic.py +0 -0
  267. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_array.py +0 -0
  268. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_constraint.py +0 -0
  269. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_expr.py +0 -0
  270. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_lie.py +0 -0
  271. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_linalg.py +0 -0
  272. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_logic.py +0 -0
  273. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_math.py +0 -0
  274. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_node_reference.py +0 -0
  275. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_parameters.py +0 -0
  276. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_scaling.py +0 -0
  277. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_spatial.py +0 -0
  278. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_variable.py +0 -0
  279. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/expr/test_vmap.py +0 -0
  280. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/__init__.py +0 -0
  281. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_array.py +0 -0
  282. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_constraint.py +0 -0
  283. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_lie.py +0 -0
  284. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_linalg.py +0 -0
  285. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_load.py +0 -0
  286. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_logic.py +0 -0
  287. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_math.py +0 -0
  288. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_parser.py +0 -0
  289. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_spatial.py +0 -0
  290. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_stl.py +0 -0
  291. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_tokenizer.py +0 -0
  292. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/parser/test_vmap.py +0 -0
  293. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/test_augmentation.py +0 -0
  294. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/test_hashing.py +0 -0
  295. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/test_lower_cvxpy.py +0 -0
  296. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/test_lower_jax.py +0 -0
  297. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/test_preprocessing.py +0 -0
  298. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/test_sparsity.py +0 -0
  299. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/symbolic/test_unified.py +0 -0
  300. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_autotuning.py +0 -0
  301. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_brachistochrone.py +0 -0
  302. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_cvxpygen_optional.py +0 -0
  303. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_discretization.py +0 -0
  304. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_examples.py +0 -0
  305. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_expert.py +0 -0
  306. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_impulsive.py +0 -0
  307. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_init.py +0 -0
  308. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_integrators.py +0 -0
  309. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_loader.py +0 -0
  310. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_optimization_results.py +0 -0
  311. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/tests/test_plotting.py +0 -0
  312. {openscvx-0.4.1.dev144 → openscvx-0.4.1.dev145}/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.dev144
3
+ Version: 0.4.1.dev145
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.dev144'
32
- __version_tuple__ = version_tuple = (0, 4, 1, 'dev144')
31
+ __version__ = version = '0.4.1.dev145'
32
+ __version_tuple__ = version_tuple = (0, 4, 1, 'dev145')
33
33
 
34
- __commit_id__ = commit_id = 'g137ef78b8'
34
+ __commit_id__ = commit_id = 'g8b0169a22'
@@ -101,6 +101,100 @@ def _expand_lam_cost_dict(
101
101
  return lam_arr
102
102
 
103
103
 
104
+ def _expand_lam_vc_dict(
105
+ lam_vc_dict: Dict[str, Union[float, list, np.ndarray]],
106
+ states: List["State"],
107
+ ) -> np.ndarray:
108
+ """Expand a ``{state_name: weight}`` dict to a per-state VC weight array.
109
+
110
+ Maps user-provided per-state virtual control weights to a dense array
111
+ using each state's ``_slice``. States not present in the dict default
112
+ to ``1.0`` (neutral weight — dynamics violations are still penalised at
113
+ the base rate).
114
+
115
+ Per-state values may be:
116
+
117
+ * **scalar** — broadcast to every component and every node.
118
+ * **1-D array** of length ``n_components`` — per-component weight,
119
+ same for every node.
120
+ * **2-D array** of shape ``(K, n_components)`` — per-node-per-component.
121
+ When any state supplies a 2-D value the output is 2-D with first
122
+ dimension *K* (all 2-D entries must agree on *K*).
123
+
124
+ Args:
125
+ lam_vc_dict: Mapping from state names to VC weights.
126
+ states: List of State objects (must already have ``_slice`` assigned).
127
+
128
+ Returns:
129
+ np.ndarray of shape ``(n_states,)`` when all entries are scalar/1-D,
130
+ or ``(K, n_states)`` when any entry is 2-D.
131
+
132
+ Raises:
133
+ ValueError: If the dict contains unknown state names or 2-D entries
134
+ disagree on the number of nodes.
135
+ """
136
+ n_states = sum(s.shape[0] if len(s.shape) > 0 else 1 for s in states)
137
+
138
+ valid_names = {s.name for s in states}
139
+ unknown = set(lam_vc_dict.keys()) - valid_names
140
+ if unknown:
141
+ raise ValueError(
142
+ f"lam_vc dict contains unknown state name(s): {unknown}. "
143
+ f"Valid state names: {sorted(valid_names)}"
144
+ )
145
+
146
+ # First pass: determine if any entry is 2-D and infer K.
147
+ n_nodes: Optional[int] = None
148
+ for state in states:
149
+ if state.name not in lam_vc_dict:
150
+ continue
151
+ val = np.asarray(lam_vc_dict[state.name], dtype=float)
152
+ if val.ndim == 2:
153
+ if n_nodes is None:
154
+ n_nodes = val.shape[0]
155
+ elif val.shape[0] != n_nodes:
156
+ raise ValueError(
157
+ f"lam_vc['{state.name}'] has {val.shape[0]} rows, but a "
158
+ f"previous entry had {n_nodes} rows. All 2-D entries "
159
+ f"must have the same number of rows (n_nodes-1)."
160
+ )
161
+
162
+ # Build the output array.
163
+ if n_nodes is not None:
164
+ lam_arr = np.ones((n_nodes, n_states))
165
+ else:
166
+ lam_arr = np.ones(n_states)
167
+
168
+ for state in states:
169
+ if state.name not in lam_vc_dict:
170
+ continue
171
+ val = np.asarray(lam_vc_dict[state.name], dtype=float)
172
+ n_components = state.shape[0] if len(state.shape) > 0 else 1
173
+
174
+ if val.ndim == 0:
175
+ # Scalar — broadcast to all components (and all nodes if 2-D).
176
+ lam_arr[..., state._slice] = float(val)
177
+ elif val.ndim == 1:
178
+ if val.shape[0] != n_components:
179
+ raise ValueError(
180
+ f"lam_vc['{state.name}'] has length {val.shape[0]}, "
181
+ f"expected scalar or length {n_components}"
182
+ )
183
+ lam_arr[..., state._slice] = val
184
+ elif val.ndim == 2:
185
+ if val.shape[1] != n_components:
186
+ raise ValueError(
187
+ f"lam_vc['{state.name}'] has {val.shape[1]} columns, expected {n_components}"
188
+ )
189
+ lam_arr[:, state._slice] = val
190
+ else:
191
+ raise ValueError(
192
+ f"lam_vc['{state.name}'] has {val.ndim} dimensions, expected scalar, 1-D, or 2-D"
193
+ )
194
+
195
+ return lam_arr
196
+
197
+
104
198
  @dataclass
105
199
  class Weights:
106
200
  """Normalized SCP weights used internally by the algorithm and autotuner.
@@ -121,7 +215,9 @@ class Weights:
121
215
 
122
216
  Attributes:
123
217
  lam_prox: Trust region (proximal) weight (normalized).
124
- lam_vc: Virtual control penalty weight (normalized).
218
+ lam_vc: Virtual control penalty weight (normalized). Scalar or
219
+ array of shape ``(n_states,)`` or ``(n_nodes-1, n_states)``
220
+ for per-state / per-node weighting.
125
221
  lam_cost: Cost weight per state (normalized). Scalar or array of
126
222
  shape ``(n_states,)`` for per-state weighting.
127
223
  lam_vb: Global virtual buffer penalty weight (normalized). Scalar
@@ -136,7 +232,7 @@ class Weights:
136
232
  """
137
233
 
138
234
  lam_prox: float = 1e0
139
- lam_vc: float = 1e1
235
+ lam_vc: Union[float, np.ndarray] = 1e1
140
236
  lam_cost: Union[float, np.ndarray] = 1e-1
141
237
  lam_vb: float = 0.0
142
238
  lam_vb_nodal: Optional[np.ndarray] = None
@@ -144,12 +240,16 @@ class Weights:
144
240
 
145
241
  def __post_init__(self):
146
242
  # Coerce lists/lists-of-lists to numpy arrays.
243
+ if isinstance(self.lam_vc, (list, tuple)):
244
+ self.lam_vc = np.asarray(self.lam_vc, dtype=float)
147
245
  if isinstance(self.lam_cost, (list, tuple)):
148
246
  self.lam_cost = np.asarray(self.lam_cost, dtype=float)
149
247
 
150
248
  # Snapshot the user-specified values so normalize() is idempotent.
151
249
  self._raw_lam_prox = self.lam_prox
152
- self._raw_lam_vc = self.lam_vc
250
+ self._raw_lam_vc = (
251
+ self.lam_vc.copy() if isinstance(self.lam_vc, np.ndarray) else self.lam_vc
252
+ )
153
253
  self._raw_lam_cost = (
154
254
  self.lam_cost.copy() if isinstance(self.lam_cost, np.ndarray) else self.lam_cost
155
255
  )
@@ -164,6 +264,11 @@ class Weights:
164
264
  making this method idempotent and safe to call after updating
165
265
  any individual raw weight.
166
266
  """
267
+ raw_vc_max = (
268
+ float(np.max(self._raw_lam_vc))
269
+ if isinstance(self._raw_lam_vc, np.ndarray)
270
+ else self._raw_lam_vc
271
+ )
167
272
  raw_cost_max = (
168
273
  float(np.max(self._raw_lam_cost))
169
274
  if isinstance(self._raw_lam_cost, np.ndarray)
@@ -176,7 +281,7 @@ class Weights:
176
281
  )
177
282
  else:
178
283
  raw_vb_max = self._raw_lam_vb
179
- scale = max(self._raw_lam_prox, self._raw_lam_vc, raw_cost_max, raw_vb_max)
284
+ scale = max(self._raw_lam_prox, raw_vc_max, raw_cost_max, raw_vb_max)
180
285
  if scale > 0:
181
286
  self.lam_prox = self._raw_lam_prox / scale
182
287
  self.lam_vc = self._raw_lam_vc / scale
@@ -787,8 +892,9 @@ class AlgorithmState:
787
892
 
788
893
  Args:
789
894
  settings: Configuration object containing initial guesses and SCP parameters
790
- weights: Normalized initial weights from the algorithm. The scalar
791
- ``lam_vc`` is expanded to an ``(N-1, n_states)`` array here.
895
+ weights: Normalized initial weights from the algorithm.
896
+ ``lam_vc`` is expanded to an ``(N-1, n_states)`` array here
897
+ (scalar or per-state values are broadcast).
792
898
 
793
899
  Returns:
794
900
  Fresh AlgorithmState initialized from settings with copied arrays
@@ -915,6 +1021,39 @@ class Algorithm(ABC):
915
1021
  return _expand_lam_cost_dict(lam_cost, states)
916
1022
  return lam_cost
917
1023
 
1024
+ @staticmethod
1025
+ def _resolve_lam_vc(
1026
+ lam_vc: Union[float, Dict[str, Union[float, list, np.ndarray]]],
1027
+ states: Optional[List["State"]] = None,
1028
+ ) -> Union[float, np.ndarray]:
1029
+ """Resolve a ``lam_vc`` spec to a numeric value.
1030
+
1031
+ If *lam_vc* is a float it is returned as-is. If it is a dict
1032
+ mapping state names to weights, *states* must be provided so the
1033
+ dict can be expanded to a per-state array via
1034
+ :func:`_expand_lam_vc_dict`.
1035
+
1036
+ Args:
1037
+ lam_vc: Scalar weight or ``{state_name: weight}`` dict.
1038
+ states: Symbolic State objects (required when *lam_vc* is a dict).
1039
+
1040
+ Returns:
1041
+ float or np.ndarray of shape ``(n_states,)`` or
1042
+ ``(K, n_states)``.
1043
+
1044
+ Raises:
1045
+ ValueError: If *lam_vc* is a dict and *states* is ``None``.
1046
+ """
1047
+ if isinstance(lam_vc, dict):
1048
+ if states is None:
1049
+ raise ValueError(
1050
+ "lam_vc was specified as a dict but no states were "
1051
+ "provided. Pass states so the dict can be expanded to "
1052
+ "a per-state weight array."
1053
+ )
1054
+ return _expand_lam_vc_dict(lam_vc, states)
1055
+ return lam_vc
1056
+
918
1057
  def _resolve_lam_vb(
919
1058
  self,
920
1059
  N: int,
@@ -86,7 +86,7 @@ class PenalizedTrustRegion(Algorithm):
86
86
  autotuner: "AutotuningBase" = None,
87
87
  k_max: int = 200,
88
88
  lam_prox: float = 1e0,
89
- lam_vc: float = 1e1,
89
+ lam_vc: Union[float, Dict[str, Union[float, list]]] = 1e1,
90
90
  lam_cost: Union[float, Dict[str, float]] = 1e-1,
91
91
  lam_vb: float = 0.0,
92
92
  ep_tr: float = 1e-4,
@@ -101,7 +101,14 @@ class PenalizedTrustRegion(Algorithm):
101
101
  :class:`AugmentedLagrangian` when ``None``.
102
102
  k_max: Maximum SCP iterations. Defaults to 200.
103
103
  lam_prox: Trust region (proximal) weight. Defaults to 1.0.
104
- lam_vc: Virtual control penalty weight. Defaults to 10.0.
104
+ lam_vc: Virtual control penalty weight. Either a float
105
+ (applied uniformly to all states) or a dict mapping state
106
+ names to per-state weights, e.g.
107
+ ``{"velocity": 1e1, "position": 5e0}``. Dict values may
108
+ be scalars, 1-D arrays for per-component weighting, or
109
+ 2-D arrays of shape ``(n_nodes-1, n_components)`` for
110
+ per-node-per-component weighting. States not in the dict
111
+ default to ``1.0``. Defaults to 10.0.
105
112
  lam_cost: Cost weight. Either a float (applied to all
106
113
  minimize/maximize states) or a dict mapping state names
107
114
  to per-state weights, e.g.
@@ -131,13 +138,14 @@ class PenalizedTrustRegion(Algorithm):
131
138
  # new dict via the property setter after construction).
132
139
  self._states: List["State"] = states
133
140
 
134
- # Resolve dict lam_cost → ndarray (requires states)
141
+ # Resolve dict lam_vc / lam_cost → ndarray (requires states)
142
+ resolved_lam_vc = self._resolve_lam_vc(lam_vc, states)
135
143
  resolved_lam_cost = self._resolve_lam_cost(lam_cost, states)
136
144
 
137
145
  # SCP weights (grouped dataclass, normalized for numerical conditioning)
138
146
  self.weights = Weights(
139
147
  lam_prox=lam_prox,
140
- lam_vc=lam_vc,
148
+ lam_vc=resolved_lam_vc,
141
149
  lam_cost=resolved_lam_cost,
142
150
  lam_vb=lam_vb,
143
151
  )
@@ -198,12 +206,15 @@ class PenalizedTrustRegion(Algorithm):
198
206
  self.weights.normalize()
199
207
 
200
208
  @property
201
- def lam_vc(self) -> float:
202
- """Virtual control penalty weight.
209
+ def lam_vc(self) -> Union[float, np.ndarray]:
210
+ """Virtual control penalty weight (pre-normalization).
203
211
 
204
212
  This is the user-specified value before normalization. Setting this
205
213
  property triggers automatic re-normalization of all weights.
206
214
 
215
+ Returns a float when a uniform scalar was provided, or an ndarray
216
+ when per-state weights were given (via dict or array).
217
+
207
218
  !!! note
208
219
  The autotuner may modify the normalized weight in
209
220
  ``self.weights.lam_vc`` during iteration. Those changes are
@@ -212,8 +223,8 @@ class PenalizedTrustRegion(Algorithm):
212
223
  return self.weights._raw_lam_vc
213
224
 
214
225
  @lam_vc.setter
215
- def lam_vc(self, value: float) -> None:
216
- self.weights._raw_lam_vc = value
226
+ def lam_vc(self, value: Union[float, Dict[str, Union[float, list]]]) -> None:
227
+ self.weights._raw_lam_vc = self._resolve_lam_vc(value, self._states)
217
228
  self.weights.normalize()
218
229
 
219
230
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.4.1.dev144
3
+ Version: 0.4.1.dev145
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
File without changes