openscvx 0.4.1.dev91__tar.gz → 0.4.1.dev92__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 (308) hide show
  1. {openscvx-0.4.1.dev91/openscvx.egg-info → openscvx-0.4.1.dev92}/PKG-INFO +1 -1
  2. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/abstract/brachistochrone.py +1 -1
  3. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/car/dubins_car.py +2 -2
  4. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/car/dubins_car_conditional.py +1 -1
  5. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/car/dubins_car_disjoint.py +1 -1
  6. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/car/dubins_car_stljax.py +3 -2
  7. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/logo.py +2 -2
  8. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +1 -1
  9. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/__init__.py +1 -1
  10. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/_version.py +3 -3
  11. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/config.py +1 -4
  12. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/loader.py +2 -1
  13. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/problem.py +6 -11
  14. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/solvers/ptr_solver.py +1 -1
  15. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/augmentation.py +43 -25
  16. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/builder.py +1 -7
  17. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/__init__.py +5 -0
  18. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/control.py +15 -1
  19. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/state.py +23 -1
  20. openscvx-0.4.1.dev92/openscvx/symbolic/expr/time.py +248 -0
  21. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/state.py +1 -1
  22. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/state.py +1 -1
  23. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/preprocessing.py +1 -1
  24. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92/openscvx.egg-info}/PKG-INFO +1 -1
  25. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx.egg-info/SOURCES.txt +1 -1
  26. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/fixtures/brachistochrone.json +2 -1
  27. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/fixtures/brachistochrone.yaml +1 -0
  28. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_scaling.py +1 -1
  29. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_variable.py +354 -0
  30. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/test_augmentation.py +126 -5
  31. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/test_preprocessing.py +1 -1
  32. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_brachistochrone.py +7 -7
  33. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_loader.py +7 -3
  34. openscvx-0.4.1.dev91/openscvx/symbolic/time.py +0 -84
  35. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/assets/logo.svg +0 -0
  36. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/release-drafter.yml +0 -0
  37. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/workflows/_docs.yml +0 -0
  38. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/workflows/branch-name.yml +0 -0
  39. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/workflows/docs.yml +0 -0
  40. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/workflows/lint.yml +0 -0
  41. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/workflows/nightly.yml +0 -0
  42. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/workflows/release-drafter.yml +0 -0
  43. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/workflows/release.yml +0 -0
  44. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/workflows/tests-integration.yml +0 -0
  45. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.github/workflows/tests-unit.yml +0 -0
  46. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/.gitignore +0 -0
  47. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/CONTRIBUTING.md +0 -0
  48. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/LICENSE +0 -0
  49. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/README.md +0 -0
  50. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/Foundations/constraint_reformulation.md +0 -0
  51. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/Foundations/control_parameterization.md +0 -0
  52. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/Foundations/discretization.md +0 -0
  53. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/Foundations/ocp.md +0 -0
  54. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/Foundations/scvx.md +0 -0
  55. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/Foundations/time_dilation.md +0 -0
  56. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UnderTheHood/lowering_architecture.md +0 -0
  57. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  58. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UsersGuide/00_introduction.md +0 -0
  59. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
  60. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
  61. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
  62. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
  63. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UsersGuide/05_visualization.md +0 -0
  64. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UsersGuide/06_logic.md +0 -0
  65. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/UsersGuide/07_lie.md +0 -0
  66. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/assets/favicon.png +0 -0
  67. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/assets/images/ct-scvx_dark.png +0 -0
  68. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/assets/images/ct-scvx_light.png +0 -0
  69. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/assets/images/ctcs_dark.png +0 -0
  70. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/assets/images/ctcs_light.png +0 -0
  71. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/assets/images/problem_class_dark.png +0 -0
  72. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/assets/images/problem_class_light.png +0 -0
  73. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/assets/logo.svg +0 -0
  74. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/citation.md +0 -0
  75. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/examples.md +0 -0
  76. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/getting-started.md +0 -0
  77. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/index.md +0 -0
  78. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/docs/javascripts/mathjax.js +0 -0
  79. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/arm/three_link_arm.py +0 -0
  80. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/cinema_vp.py +0 -0
  81. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/dr_double_integrator.py +0 -0
  82. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/dr_vp.py +0 -0
  83. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/dr_vp_nodal.py +0 -0
  84. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/dr_vp_polytope.py +0 -0
  85. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/drone_racing.py +0 -0
  86. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/logo_utils/acl_logo.svg +0 -0
  87. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/logo_utils/svg_path_utils.py +0 -0
  88. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/obstacle_avoidance.py +0 -0
  89. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  90. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  91. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/plotting.py +0 -0
  92. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/plotting_viser.py +0 -0
  93. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
  94. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
  95. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/realtime/cinema_vp_realtime.py +0 -0
  96. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/realtime/drone_racing_realtime.py +0 -0
  97. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/realtime/dubins_car_realtime.py +0 -0
  98. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  99. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/rocket/3DoF_pdg.py +0 -0
  100. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/examples/spacecraft/proxops_cw.py +0 -0
  101. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/figures/ctlos_cine.gif +0 -0
  102. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/figures/ctlos_dr.gif +0 -0
  103. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/figures/dtlos_cine.gif +0 -0
  104. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/figures/dtlos_dr.gif +0 -0
  105. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/figures/openscvx_logo.svg +0 -0
  106. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/figures/openscvx_logo_square.png +0 -0
  107. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/figures/oscvx_structure_full_dark.svg +0 -0
  108. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/figures/video_preview.png +0 -0
  109. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/__init__.py +0 -0
  110. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/1-background.avif +0 -0
  111. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
  112. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
  113. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
  114. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
  115. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/2-mars.avif +0 -0
  116. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
  117. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
  118. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
  119. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
  120. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/3-moon.avif +0 -0
  121. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
  122. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
  123. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
  124. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
  125. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
  126. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
  127. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
  128. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
  129. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
  130. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/5-space.avif +0 -0
  131. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
  132. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
  133. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
  134. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
  135. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/6-earth.avif +0 -0
  136. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
  137. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
  138. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
  139. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
  140. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/javascripts/parallax.js +0 -0
  141. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/logo.svg +0 -0
  142. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/stylesheets/custom.css +0 -0
  143. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/assets/stylesheets/parallax.css +0 -0
  144. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/home.html +0 -0
  145. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/main.html +0 -0
  146. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/partials/parallax/hero.html +0 -0
  147. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/material/overrides/partials/parallax.html +0 -0
  148. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/mkdocs.yml +0 -0
  149. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/__main__.py +0 -0
  150. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/algorithms/AugmentedLagrangian.py +0 -0
  151. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/algorithms/ConstantProximalWeight.py +0 -0
  152. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/algorithms/RampProximalWeight.py +0 -0
  153. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/algorithms/__init__.py +0 -0
  154. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/algorithms/base.py +0 -0
  155. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/algorithms/optimization_results.py +0 -0
  156. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/algorithms/penalized_trust_region.py +0 -0
  157. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/discretization/__init__.py +0 -0
  158. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/discretization/base.py +0 -0
  159. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/discretization/linearize_discretize.py +0 -0
  160. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/expert/__init__.py +0 -0
  161. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/expert/byof.py +0 -0
  162. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/expert/lowering.py +0 -0
  163. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/expert/validation.py +0 -0
  164. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/init/__init__.py +0 -0
  165. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/init/interpolation.py +0 -0
  166. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/integrators/__init__.py +0 -0
  167. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/integrators/runge_kutta.py +0 -0
  168. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/lowered/__init__.py +0 -0
  169. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/lowered/cvxpy_constraints.py +0 -0
  170. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/lowered/cvxpy_variables.py +0 -0
  171. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/lowered/dynamics.py +0 -0
  172. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/lowered/jax_constraints.py +0 -0
  173. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/lowered/parameters.py +0 -0
  174. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/lowered/problem.py +0 -0
  175. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/lowered/unified.py +0 -0
  176. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/plotting/__init__.py +0 -0
  177. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/plotting/plotting.py +0 -0
  178. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/plotting/scp_iteration.py +0 -0
  179. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/plotting/viser/__init__.py +0 -0
  180. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/plotting/viser/animated.py +0 -0
  181. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/plotting/viser/plotly_integration.py +0 -0
  182. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/plotting/viser/primitives.py +0 -0
  183. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/plotting/viser/scp.py +0 -0
  184. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/plotting/viser/server.py +0 -0
  185. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/propagation/__init__.py +0 -0
  186. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/propagation/post_processing.py +0 -0
  187. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/propagation/propagation.py +0 -0
  188. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/solvers/__init__.py +0 -0
  189. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/solvers/base.py +0 -0
  190. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/__init__.py +0 -0
  191. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/constraint_set.py +0 -0
  192. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/arithmetic.py +0 -0
  193. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/array.py +0 -0
  194. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/constraint.py +0 -0
  195. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/expr.py +0 -0
  196. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  197. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  198. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/lie/se3.py +0 -0
  199. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/lie/so3.py +0 -0
  200. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/linalg.py +0 -0
  201. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/logic.py +0 -0
  202. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/math.py +0 -0
  203. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/spatial.py +0 -0
  204. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/stl.py +0 -0
  205. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/variable.py +0 -0
  206. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/expr/vmap.py +0 -0
  207. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/hashing.py +0 -0
  208. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lower.py +0 -0
  209. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/__init__.py +0 -0
  210. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
  211. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
  212. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
  213. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
  214. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
  215. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
  216. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
  217. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
  218. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
  219. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
  220. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
  221. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
  222. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
  223. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
  224. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
  225. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/array.py +0 -0
  226. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
  227. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/control.py +0 -0
  228. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
  229. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
  230. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
  231. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
  232. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/math.py +0 -0
  233. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
  234. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
  235. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
  236. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/__init__.py +0 -0
  237. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/_registry.py +0 -0
  238. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/array.py +0 -0
  239. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/constraint.py +0 -0
  240. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/lie.py +0 -0
  241. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/linalg.py +0 -0
  242. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/logic.py +0 -0
  243. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/math.py +0 -0
  244. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/parser.py +0 -0
  245. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/spatial.py +0 -0
  246. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/stl.py +0 -0
  247. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/parser/tokenizer.py +0 -0
  248. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/problem.py +0 -0
  249. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/sparsity.py +0 -0
  250. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/symbolic/unified.py +0 -0
  251. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/utils/__init__.py +0 -0
  252. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/utils/cache.py +0 -0
  253. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/utils/caching.py +0 -0
  254. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/utils/printing.py +0 -0
  255. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/utils/profiling.py +0 -0
  256. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx/utils/utils.py +0 -0
  257. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx.egg-info/dependency_links.txt +0 -0
  258. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx.egg-info/entry_points.txt +0 -0
  259. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx.egg-info/requires.txt +0 -0
  260. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/openscvx.egg-info/top_level.txt +0 -0
  261. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/pyproject.toml +0 -0
  262. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/scripts/gen_example_pages.py +0 -0
  263. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/scripts/gen_ref_pages.py +0 -0
  264. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/setup.cfg +0 -0
  265. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/__init__.py +0 -0
  266. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/brachistochrone_analytical.py +0 -0
  267. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/__init__.py +0 -0
  268. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/__init__.py +0 -0
  269. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_arithmetic.py +0 -0
  270. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_array.py +0 -0
  271. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_constraint.py +0 -0
  272. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_expr.py +0 -0
  273. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_lie.py +0 -0
  274. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_linalg.py +0 -0
  275. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_logic.py +0 -0
  276. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_math.py +0 -0
  277. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_node_reference.py +0 -0
  278. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_parameters.py +0 -0
  279. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_spatial.py +0 -0
  280. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/expr/test_vmap.py +0 -0
  281. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/__init__.py +0 -0
  282. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_array.py +0 -0
  283. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_constraint.py +0 -0
  284. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_lie.py +0 -0
  285. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_linalg.py +0 -0
  286. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_load.py +0 -0
  287. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_logic.py +0 -0
  288. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_math.py +0 -0
  289. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_parser.py +0 -0
  290. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_spatial.py +0 -0
  291. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_stl.py +0 -0
  292. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_tokenizer.py +0 -0
  293. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/parser/test_vmap.py +0 -0
  294. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/test_hashing.py +0 -0
  295. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/test_lower_cvxpy.py +0 -0
  296. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/test_lower_jax.py +0 -0
  297. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/test_sparsity.py +0 -0
  298. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/symbolic/test_unified.py +0 -0
  299. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_autotuning.py +0 -0
  300. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_cvxpygen_optional.py +0 -0
  301. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_discretization.py +0 -0
  302. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_examples.py +0 -0
  303. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_expert.py +0 -0
  304. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_init.py +0 -0
  305. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_integrators.py +0 -0
  306. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_optimization_results.py +0 -0
  307. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/tests/test_plotting.py +0 -0
  308. {openscvx-0.4.1.dev91 → openscvx-0.4.1.dev92}/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.dev91
3
+ Version: 0.4.1.dev92
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
@@ -74,6 +74,7 @@ time = ox.Time(
74
74
  final=("minimize", total_time),
75
75
  min=0.0,
76
76
  max=total_time,
77
+ uniform_time_grid=True,
77
78
  )
78
79
 
79
80
  problem = Problem(
@@ -91,7 +92,6 @@ problem.settings.prp.dt = 0.01
91
92
 
92
93
  problem.settings.scp.lam_prox = 1e1 # Weight on the Trust Reigon
93
94
  problem.settings.scp.lam_cost = 1e0 # Weight on the Minimal Time Objective
94
- problem.settings.scp.uniform_time_grid = True
95
95
 
96
96
 
97
97
  plotting_dict = {}
@@ -86,6 +86,8 @@ time = ox.Time(
86
86
  final=ox.Minimize(total_time),
87
87
  min=0.0,
88
88
  max=20,
89
+ time_dilation_min=0.02 * total_time,
90
+ uniform_time_grid=True,
89
91
  )
90
92
 
91
93
  problem = Problem(
@@ -96,13 +98,11 @@ problem = Problem(
96
98
  constraints=constraints,
97
99
  N=n,
98
100
  licq_max=1e-8,
99
- time_dilation_factor_min=0.02,
100
101
  )
101
102
 
102
103
  # Set solver parameters
103
104
  problem.settings.scp.lam_cost = 4e1
104
105
  problem.settings.scp.lam_vc = 1e3
105
- problem.settings.scp.uniform_time_grid = True
106
106
 
107
107
  plotting_dict = {
108
108
  "obs_radius": problem.parameters["obs_radius"],
@@ -99,6 +99,7 @@ time = ox.Time(
99
99
  final=ox.Minimize(total_time),
100
100
  min=0.0,
101
101
  max=20,
102
+ uniform_time_grid=True,
102
103
  )
103
104
 
104
105
  problem = Problem(
@@ -113,7 +114,6 @@ problem = Problem(
113
114
 
114
115
  # Set solver parameters
115
116
  problem.settings.scp.lam_vc = 1e3
116
- problem.settings.scp.uniform_time_grid = True
117
117
 
118
118
 
119
119
  plotting_dict = {
@@ -102,6 +102,7 @@ time = ox.Time(
102
102
  final=("minimize", total_time),
103
103
  min=0.0,
104
104
  max=20,
105
+ uniform_time_grid=True,
105
106
  )
106
107
 
107
108
  problem = Problem(
@@ -114,7 +115,6 @@ problem = Problem(
114
115
  )
115
116
  # Set solver parameters
116
117
  problem.settings.scp.lam_vc = 6e2
117
- problem.settings.scp.uniform_time_grid = True
118
118
  plotting_dict = {
119
119
  "wp1_radius": problem.parameters["wp1_radius"],
120
120
  "wp1_center": problem.parameters["wp1_center"],
@@ -57,7 +57,9 @@ angular_rate.guess = np.zeros((n, 1))
57
57
 
58
58
  # Define time (needed for time-dependent constraints)
59
59
  # Time is a State subclass, so it can be used directly in expressions
60
- time = ox.Time(initial=0.0, final=("minimize", total_time), min=0.0, max=10.0)
60
+ time = ox.Time(
61
+ initial=0.0, final=("minimize", total_time), min=0.0, max=10.0, uniform_time_grid=True
62
+ )
61
63
 
62
64
 
63
65
  # Define list of all states and controls
@@ -106,7 +108,6 @@ problem = Problem(
106
108
  )
107
109
  # Set solver parameters
108
110
  problem.settings.scp.lam_vc = 6e2
109
- problem.settings.scp.uniform_time_grid = True
110
111
  # Extract parameter values from problem.parameters (not Parameter objects)
111
112
  plotting_dict = {
112
113
  "wp1_center": problem.parameters.get("wp1_center", None),
@@ -127,6 +127,8 @@ time_state = ox.Time(
127
127
  final=total_time,
128
128
  min=0.0,
129
129
  max=total_time,
130
+ time_dilation_min=0.001 * total_time,
131
+ time_dilation_max=3.0 * total_time,
130
132
  )
131
133
 
132
134
  # Control components
@@ -353,8 +355,6 @@ problem = Problem(
353
355
  constraints=constraints,
354
356
  N=n,
355
357
  byof=byof,
356
- time_dilation_factor_min=0.001,
357
- time_dilation_factor_max=3.0,
358
358
  autotuner=ox.RampProximalWeight(),
359
359
  float_dtype="float64",
360
360
  )
@@ -142,6 +142,7 @@ time = ox.Time(
142
142
  final=("minimize", total_time),
143
143
  min=0.0,
144
144
  max=total_time,
145
+ time_dilation_min=0.2 * total_time,
145
146
  )
146
147
 
147
148
  problem = Problem(
@@ -151,7 +152,6 @@ problem = Problem(
151
152
  time=time,
152
153
  constraints=constraints,
153
154
  N=n,
154
- time_dilation_factor_min=0.2,
155
155
  autotuner=ox.ConstantProximalWeight(),
156
156
  )
157
157
 
@@ -70,7 +70,7 @@ from openscvx.symbolic.expr import (
70
70
  Vstack,
71
71
  ctcs,
72
72
  )
73
- from openscvx.symbolic.time import Time
73
+ from openscvx.symbolic.expr.time import Time
74
74
  from openscvx.utils.cache import clear_cache, get_cache_dir, get_cache_size
75
75
 
76
76
  load_results = OptimizationResults.load
@@ -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.dev91'
32
- __version_tuple__ = version_tuple = (0, 4, 1, 'dev91')
31
+ __version__ = version = '0.4.1.dev92'
32
+ __version_tuple__ = version_tuple = (0, 4, 1, 'dev92')
33
33
 
34
- __commit_id__ = commit_id = 'g3738e53c4'
34
+ __commit_id__ = commit_id = 'g624f43d2f'
@@ -409,7 +409,6 @@ class ScpConfig:
409
409
  ep_tr: float = 1e-4,
410
410
  ep_vb: float = 1e-4,
411
411
  ep_vc: float = 1e-8,
412
- uniform_time_grid: bool = False,
413
412
  autotuner: Optional["AutotuningBase"] = None,
414
413
  ):
415
414
  """
@@ -433,8 +432,6 @@ class ScpConfig:
433
432
  lam_cost (float): The weight for original cost. Defaults to 0.0.
434
433
  lam_vb (float): The weight for virtual buffer. This is only used if
435
434
  there are nonconvex nodal constraints present. Defaults to 0.0.
436
- uniform_time_grid (bool): Whether to use a uniform time grid.
437
- Defaults to `False`.
438
435
  autotuner: Optional custom autotuner instance. If not provided, defaults
439
436
  to ``AugmentedLagrangian()`` with default parameters. Useful for
440
437
  customizing parameters:
@@ -464,7 +461,7 @@ class ScpConfig:
464
461
  self.ep_vc = ep_vc
465
462
  self.lam_cost = lam_cost
466
463
  self.lam_vb = lam_vb
467
- self.uniform_time_grid = uniform_time_grid
464
+ self._uniform_time_grid = False
468
465
  # Store autotuner via property to support lazy default construction
469
466
  self.autotuner = autotuner
470
467
 
@@ -68,9 +68,9 @@ from openscvx.config import _resolve_autotuner
68
68
  from openscvx.symbolic.expr.control import Control
69
69
  from openscvx.symbolic.expr.expr import Expr, Parameter
70
70
  from openscvx.symbolic.expr.state import State
71
+ from openscvx.symbolic.expr.time import Time
71
72
  from openscvx.symbolic.parser._registry import _PARSE_FUNCTIONS
72
73
  from openscvx.symbolic.parser.parser import ExprParser
73
- from openscvx.symbolic.time import Time
74
74
 
75
75
  # ---------------------------------------------------------------------------
76
76
  # Public API
@@ -180,6 +180,7 @@ def load_dict(data: dict) -> dict:
180
180
  final=_parse_time_boundary(time_data["final"]),
181
181
  min=float(time_data["min"]),
182
182
  max=float(time_data["max"]),
183
+ uniform_time_grid=bool(time_data.get("uniform_time_grid", False)),
183
184
  )
184
185
 
185
186
  # ---- N -------------------------------------------------------------
@@ -55,9 +55,9 @@ from openscvx.symbolic.builder import preprocess_symbolic_problem
55
55
  from openscvx.symbolic.expr import CTCS, Constraint
56
56
  from openscvx.symbolic.expr.control import Control
57
57
  from openscvx.symbolic.expr.state import State
58
+ from openscvx.symbolic.expr.time import Time
58
59
  from openscvx.symbolic.lower import lower_symbolic_problem
59
60
  from openscvx.symbolic.problem import SymbolicProblem
60
- from openscvx.symbolic.time import Time
61
61
  from openscvx.utils import printing, profiling
62
62
  from openscvx.utils.caching import (
63
63
  get_solver_cache_paths,
@@ -82,8 +82,6 @@ class Problem:
82
82
  algebraic_prop: Optional[dict] = None,
83
83
  licq_min: float = 0.0,
84
84
  licq_max: float = 1e-4,
85
- time_dilation_factor_min: float = 0.3,
86
- time_dilation_factor_max: float = 3.0,
87
85
  autotuner: Optional[AutotuningBase] = AugmentedLagrangian(),
88
86
  byof: Optional[ByofSpec] = None,
89
87
  float_dtype: str = "float32",
@@ -113,10 +111,6 @@ class Problem:
113
111
  for outputs evaluated (not integrated) during propagation.
114
112
  licq_min (float): Minimum LICQ constraint value. Defaults to 0.0.
115
113
  licq_max (float): Maximum LICQ constraint value. Defaults to 1e-4.
116
- time_dilation_factor_min (float): Minimum time dilation factor.
117
- Defaults to 0.3.
118
- time_dilation_factor_max (float): Maximum time dilation factor.
119
- Defaults to 3.0.
120
114
  byof (ByofSpec, optional): Expert mode only. Raw JAX functions to
121
115
  bypass symbolic layer. See :class:`openscvx.expert.ByofSpec` for
122
116
  detailed documentation.
@@ -157,8 +151,6 @@ class Problem:
157
151
  time=time,
158
152
  licq_min=licq_min,
159
153
  licq_max=licq_max,
160
- time_dilation_factor_min=time_dilation_factor_min,
161
- time_dilation_factor_max=time_dilation_factor_max,
162
154
  dynamics_prop_extra=dynamics_prop,
163
155
  states_prop_extra=states_prop,
164
156
  algebraic_prop=algebraic_prop,
@@ -220,8 +212,11 @@ class Problem:
220
212
  prp=PropagationConfig(),
221
213
  )
222
214
 
223
- # OCP construction happens in initialize() so users can modify
224
- # settings (like uniform_time_grid) between __init__ and initialize()
215
+ # Copy time grid setting from Time to SCP config so the solver can
216
+ # read it during constraint assembly.
217
+ if isinstance(time, Time):
218
+ self.settings.scp._uniform_time_grid = time.uniform_time_grid
219
+
225
220
  self._discretization_solver: callable = None
226
221
 
227
222
  # Set up emitter & queue (thread started in initialize() after columns are known)
@@ -470,7 +470,7 @@ class PTRSolver(ConvexSolver):
470
470
  if settings.sim.x.final_type[i] == "Fix":
471
471
  constr += [x_nonscaled[-1][i] == x_term[i]] # Final Boundary Conditions
472
472
 
473
- if settings.scp.uniform_time_grid:
473
+ if settings.scp._uniform_time_grid:
474
474
  S_u_inv_td = inv_S_u[settings.sim.time_dilation_slice, settings.sim.time_dilation_slice]
475
475
  c_u_td = c_u[settings.sim.time_dilation_slice]
476
476
  constr += [
@@ -71,6 +71,7 @@ from openscvx.symbolic.expr import (
71
71
  )
72
72
  from openscvx.symbolic.expr.control import Control
73
73
  from openscvx.symbolic.expr.state import State
74
+ from openscvx.symbolic.expr.time import Time
74
75
 
75
76
 
76
77
  def _check_nonconvex_equality(constraint: Constraint, context: str) -> None:
@@ -440,8 +441,6 @@ def augment_dynamics_with_ctcs(
440
441
  N: int,
441
442
  licq_min: float = 0.0,
442
443
  licq_max: float = 1e-4,
443
- time_dilation_factor_min: float = 0.3,
444
- time_dilation_factor_max: float = 3.0,
445
444
  ) -> Tuple[Expr, List[State], List[Control]]:
446
445
  """Augment dynamics with continuous-time constraint satisfaction states.
447
446
 
@@ -467,8 +466,6 @@ def augment_dynamics_with_ctcs(
467
466
  N: Number of discretization nodes
468
467
  licq_min: Minimum bound for augmented states (default: 0.0)
469
468
  licq_max: Maximum bound for augmented states (default: 1e-4)
470
- time_dilation_factor_min: Minimum time dilation factor (default: 0.3)
471
- time_dilation_factor_max: Maximum time dilation factor (default: 3.0)
472
469
 
473
470
  Returns:
474
471
  Tuple of:
@@ -561,28 +558,49 @@ def augment_dynamics_with_ctcs(
561
558
  raise ValueError("No state named 'time' found in states list")
562
559
 
563
560
  time_final = time_state.final[0]
564
- time_dilation.min = np.array([time_dilation_factor_min * time_final])
565
- time_dilation.max = np.array([time_dilation_factor_max * time_final])
566
-
567
- # Compute initial guess for time_dilation from time.guess using finite differences
568
- # The relationship is: dt/dtau = time_dilation, where tau is normalized time [0,1]
569
- # With N nodes, dtau = 1/(N-1) between consecutive nodes
570
- if time_state.guess is None:
571
- raise ValueError("time state must have a guess set before augmentation")
572
-
573
- if N > 1:
574
- time_guess = time_state.guess.flatten() # Shape (N,)
575
- time_dilation_guess = np.zeros(N)
576
- dtau = 1.0 / (N - 1) # Normalized time step between nodes
577
- # Compute finite difference: time_dilation[k] = (time[k+1] - time[k]) / dtau
578
- for k in range(N - 1):
579
- time_dilation_guess[k] = (time_guess[k + 1] - time_guess[k]) / dtau
580
- # For the last node, use the previous value (extrapolate)
581
- time_dilation_guess[N - 1] = time_dilation_guess[N - 2]
582
- time_dilation.guess = time_dilation_guess.reshape(-1, 1)
561
+
562
+ # If time_state is a Time instance, use its time_dilation_* attributes.
563
+ # Otherwise fall back to default factor-based bounds (0.3 / 3.0).
564
+ is_time = isinstance(time_state, Time)
565
+
566
+ if is_time and time_state.time_dilation_min is not None:
567
+ time_dilation.min = np.array([time_state.time_dilation_min])
568
+ else:
569
+ time_dilation.min = np.array([0.3 * time_final])
570
+
571
+ if is_time and time_state.time_dilation_max is not None:
572
+ time_dilation.max = np.array([time_state.time_dilation_max])
583
573
  else:
584
- # Single node case: use time_final as guess
585
- time_dilation.guess = np.ones([N, 1]) * time_final
574
+ time_dilation.max = np.array([3.0 * time_final])
575
+
576
+ # Use user-provided time_dilation guess if available,
577
+ # otherwise compute from time.guess via finite differences
578
+ if is_time and time_state.time_dilation_guess is not None:
579
+ time_dilation.guess = time_state.time_dilation_guess
580
+ else:
581
+ # The relationship is: dt/dtau = time_dilation, where tau is normalized time [0,1]
582
+ # With N nodes, dtau = 1/(N-1) between consecutive nodes
583
+ if time_state.guess is None:
584
+ raise ValueError("time state must have a guess set before augmentation")
585
+
586
+ if N > 1:
587
+ time_guess = time_state.guess.flatten() # Shape (N,)
588
+ time_dilation_guess = np.zeros(N)
589
+ dtau = 1.0 / (N - 1) # Normalized time step between nodes
590
+ # Compute finite difference: time_dilation[k] = (time[k+1] - time[k]) / dtau
591
+ for k in range(N - 1):
592
+ time_dilation_guess[k] = (time_guess[k + 1] - time_guess[k]) / dtau
593
+ # For the last node, use the previous value (extrapolate)
594
+ time_dilation_guess[N - 1] = time_dilation_guess[N - 2]
595
+ time_dilation.guess = time_dilation_guess.reshape(-1, 1)
596
+ else:
597
+ # Single node case: use time_final as guess
598
+ time_dilation.guess = np.ones([N, 1]) * time_final
599
+
600
+ # Store a back-reference so that later mutations to the Time object
601
+ # (e.g. time.time_dilation_min = ...) propagate to the live control.
602
+ if is_time:
603
+ time_state._time_dilation_control = time_dilation
586
604
 
587
605
  controls_augmented.append(time_dilation)
588
606
 
@@ -43,6 +43,7 @@ from openscvx.symbolic.constraint_set import ConstraintSet
43
43
  from openscvx.symbolic.expr import Constant, Parameter, traverse
44
44
  from openscvx.symbolic.expr.control import Control
45
45
  from openscvx.symbolic.expr.state import State
46
+ from openscvx.symbolic.expr.time import Time
46
47
  from openscvx.symbolic.preprocessing import (
47
48
  collect_and_assign_slices,
48
49
  convert_dynamics_dict_to_expr,
@@ -61,7 +62,6 @@ from openscvx.symbolic.preprocessing import (
61
62
  validate_variable_names,
62
63
  )
63
64
  from openscvx.symbolic.problem import SymbolicProblem
64
- from openscvx.symbolic.time import Time
65
65
 
66
66
 
67
67
  def preprocess_symbolic_problem(
@@ -73,8 +73,6 @@ def preprocess_symbolic_problem(
73
73
  time: Time,
74
74
  licq_min: float = 0.0,
75
75
  licq_max: float = 1e-4,
76
- time_dilation_factor_min: float = 0.3,
77
- time_dilation_factor_max: float = 3.0,
78
76
  dynamics_prop_extra: dict = None,
79
77
  states_prop_extra: List[State] = None,
80
78
  algebraic_prop: dict = None,
@@ -109,8 +107,6 @@ def preprocess_symbolic_problem(
109
107
  time: Time configuration object specifying time bounds and constraints
110
108
  licq_min: Minimum bound for CTCS augmented states (default: 0.0)
111
109
  licq_max: Maximum bound for CTCS augmented states (default: 1e-4)
112
- time_dilation_factor_min: Minimum factor for time dilation control (default: 0.3)
113
- time_dilation_factor_max: Maximum factor for time dilation control (default: 3.0)
114
110
  dynamics_prop_extra: Optional dictionary of additional dynamics for propagation-only
115
111
  states (default: None)
116
112
  states_prop_extra: Optional list of additional State objects for propagation only
@@ -308,8 +304,6 @@ def preprocess_symbolic_problem(
308
304
  N,
309
305
  licq_min=licq_min,
310
306
  licq_max=licq_max,
311
- time_dilation_factor_min=time_dilation_factor_min,
312
- time_dilation_factor_max=time_dilation_factor_max,
313
307
  )
314
308
 
315
309
  # Assign slices to augmented states and controls in canonical order
@@ -149,6 +149,9 @@ from .state import BoundaryType, Fixed, Free, Maximize, Minimize, State
149
149
  # STL operations
150
150
  from .stl import Or
151
151
 
152
+ # Time
153
+ from .time import Time
154
+
152
155
  # Variable
153
156
  from .variable import Variable
154
157
 
@@ -190,6 +193,8 @@ __all__ = [
190
193
  "Maximize",
191
194
  # Control
192
195
  "Control",
196
+ # Time
197
+ "Time",
193
198
  # Mathematical functions
194
199
  "Sin",
195
200
  "Cos",
@@ -59,17 +59,31 @@ class Control(Variable):
59
59
  steer.guess = np.linspace([0, 0], [0, 1], 50) # Gradual acceleration
60
60
  """
61
61
 
62
- def __init__(self, name: str, shape: Tuple[int, ...]):
62
+ def __init__(
63
+ self,
64
+ name: str,
65
+ shape: Tuple[int, ...],
66
+ *,
67
+ min: Optional[np.ndarray] = None,
68
+ max: Optional[np.ndarray] = None,
69
+ ):
63
70
  """Initialize a Control object.
64
71
 
65
72
  Args:
66
73
  name: Name identifier for the control variable
67
74
  shape: Shape of the control vector (typically 1D tuple like (3,))
75
+ min: Optional minimum bounds array (keyword-only)
76
+ max: Optional maximum bounds array (keyword-only)
68
77
  """
69
78
  super().__init__(name, shape)
70
79
  self._scaling_min = None
71
80
  self._scaling_max = None
72
81
 
82
+ if min is not None:
83
+ self.min = min
84
+ if max is not None:
85
+ self.max = max
86
+
73
87
  def sparsity(self, n_x: int, n_u: int) -> Tuple[np.ndarray, np.ndarray]:
74
88
  """Element-level exact sparsity: diagonal block at ``_slice``."""
75
89
  n = self._shape[0]
@@ -197,12 +197,25 @@ class State(Variable):
197
197
  pos.final = [10, ("free", 5), ("maximize", 150)] # Maximize final altitude
198
198
  """
199
199
 
200
- def __init__(self, name: str, shape: Tuple[int, ...]):
200
+ def __init__(
201
+ self,
202
+ name: str,
203
+ shape: Tuple[int, ...],
204
+ *,
205
+ min: Optional[np.ndarray] = None,
206
+ max: Optional[np.ndarray] = None,
207
+ initial: Optional[list] = None,
208
+ final: Optional[list] = None,
209
+ ):
201
210
  """Initialize a State object.
202
211
 
203
212
  Args:
204
213
  name: Name identifier for the state variable
205
214
  shape: Shape of the state vector (typically 1D tuple)
215
+ min: Optional minimum bounds array (keyword-only)
216
+ max: Optional maximum bounds array (keyword-only)
217
+ initial: Optional initial boundary conditions array (keyword-only)
218
+ final: Optional final boundary conditions array (keyword-only)
206
219
  """
207
220
  super().__init__(name, shape)
208
221
  self._initial = None
@@ -212,6 +225,15 @@ class State(Variable):
212
225
  self._scaling_min = None
213
226
  self._scaling_max = None
214
227
 
228
+ if min is not None:
229
+ self.min = min
230
+ if max is not None:
231
+ self.max = max
232
+ if initial is not None:
233
+ self.initial = initial
234
+ if final is not None:
235
+ self.final = final
236
+
215
237
  def sparsity(self, n_x: int, n_u: int) -> Tuple[np.ndarray, np.ndarray]:
216
238
  """Element-level exact sparsity: diagonal block at ``_slice``."""
217
239
  n = self._shape[0]