openscvx 0.3.2.dev339__tar.gz → 0.3.2.dev343__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.
- {openscvx-0.3.2.dev339/openscvx.egg-info → openscvx-0.3.2.dev343}/PKG-INFO +2 -2
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/ocp.md +3 -3
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +7 -4
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/04_viewpoint_constraints.md +6 -3
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/abstract/brachistochrone.py +2 -7
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/arm/three_link_arm.py +2 -5
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/car/dubins_car.py +1 -14
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/car/dubins_car_conditional.py +1 -5
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/car/dubins_car_disjoint.py +0 -4
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/car/dubins_car_stljax.py +0 -4
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/cinema_vp.py +1 -8
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/dr_double_integrator.py +0 -14
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/dr_vp.py +0 -14
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/dr_vp_nodal.py +6 -14
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/dr_vp_polytope.py +3 -10
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/drone_racing.py +1 -87
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/obstacle_avoidance.py +0 -9
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/obstacle_avoidance_nodal.py +0 -3
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/drone/obstacle_avoidance_vmap.py +0 -27
- {openscvx-0.3.2.dev339/examples/drone → openscvx-0.3.2.dev343/examples/realtime/base_problems}/cinema_vp_realtime_base.py +3 -3
- openscvx-0.3.2.dev343/examples/realtime/base_problems/drone_racing_realtime_base.py +216 -0
- {openscvx-0.3.2.dev339/examples/drone → openscvx-0.3.2.dev343/examples/realtime/base_problems}/obstacle_avoidance_realtime_base.py +2 -5
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/realtime/cinema_vp_realtime.py +8 -8
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/realtime/drone_racing_realtime.py +8 -8
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/realtime/dubins_car_realtime.py +2 -2
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/realtime/obstacle_avoidance_realtime.py +8 -8
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/rocket/3DoF_pdg.py +8 -11
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/spacecraft/proxops_cw.py +0 -5
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/__init__.py +9 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/_version.py +3 -3
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/algorithms/__init__.py +13 -2
- openscvx-0.3.2.dev343/openscvx/algorithms/autotuning.py +467 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/algorithms/base.py +200 -82
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/algorithms/optimization_results.py +6 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/algorithms/penalized_trust_region.py +213 -51
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/config.py +108 -34
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/cvxpy_variables.py +2 -2
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/__init__.py +2 -1
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/scp_iteration.py +189 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/problem.py +38 -13
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/solvers/base.py +1 -1
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/solvers/ptr_solver.py +36 -7
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lower.py +2 -2
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/constraint.py +14 -35
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/logic.py +4 -2
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/printing.py +167 -94
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343/openscvx.egg-info}/PKG-INFO +2 -2
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx.egg-info/SOURCES.txt +4 -2
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx.egg-info/requires.txt +1 -1
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/pyproject.toml +1 -1
- openscvx-0.3.2.dev343/tests/test_autotuning.py +1128 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_brachistochrone.py +132 -8
- openscvx-0.3.2.dev339/openscvx/algorithms/autotuning.py +0 -24
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/release-drafter.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/docs.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/lint.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/release.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/.gitignore +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/CONTRIBUTING.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/LICENSE +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/README.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/favicon.png +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/citation.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/examples.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/getting-started.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/index.md +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/plotting.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/examples/plotting_viser.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/figures/video_preview.png +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/javascripts/parallax.js +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/assets/stylesheets/parallax.css +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/home.html +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/main.html +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/partials/parallax/hero.html +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/material/overrides/partials/parallax.html +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/mkdocs.yml +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/discretization/discretization.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/expert/byof.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/expert/validation.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/init/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/time.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/cache.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/caching.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx/utils/utils.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/setup.cfg +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_discretization.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_examples.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_expert.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_init.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_integrators.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_plotting.py +0 -0
- {openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/tests/test_propagation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.3.2.
|
|
3
|
+
Version: 0.3.2.dev343
|
|
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
|
|
@@ -10,7 +10,7 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
10
10
|
Requires-Python: >=3.9
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
12
|
License-File: LICENSE
|
|
13
|
-
Requires-Dist: cvxpy
|
|
13
|
+
Requires-Dist: cvxpy==1.7.5
|
|
14
14
|
Requires-Dist: qoco
|
|
15
15
|
Requires-Dist: numpy
|
|
16
16
|
Requires-Dist: jax
|
|
@@ -14,7 +14,7 @@ The state, constrol and additional parameters are defined as follows:
|
|
|
14
14
|
|
|
15
15
|
```python
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
lam_prox = cp.Parameter(nonneg = True, name='lam_prox') # Weight on the Trust Region
|
|
18
18
|
lam_cost = cp.Parameter(nonneg=True, name='lam_cost') # Weight on the Nonlinear Cost
|
|
19
19
|
|
|
20
20
|
x = cp.Variable((params.scp.n, params.sim.n_states), name='x') # State
|
|
@@ -97,7 +97,7 @@ def OptimalControlProblem(params: Config):
|
|
|
97
97
|
########################
|
|
98
98
|
|
|
99
99
|
# Parameters
|
|
100
|
-
|
|
100
|
+
lam_prox = cp.Parameter(nonneg = True, name='lam_prox')
|
|
101
101
|
lam_cost = cp.Parameter(nonneg=True, name='lam_cost')
|
|
102
102
|
|
|
103
103
|
# State
|
|
@@ -206,7 +206,7 @@ def OptimalControlProblem(params: Config):
|
|
|
206
206
|
########
|
|
207
207
|
|
|
208
208
|
inv = block([[inv_S_x, np.zeros((S_x.shape[0], S_u.shape[1]))], [np.zeros((S_u.shape[0], S_x.shape[1])), inv_S_u]])
|
|
209
|
-
cost += sum(
|
|
209
|
+
cost += sum(lam_prox * cp.sum_squares(inv @ cp.hstack((dx[i], du[i]))) for i in range(params.scp.n)) # Trust Region Cost
|
|
210
210
|
cost += sum(params.scp.lam_vc * cp.sum(cp.abs(nu[i-1])) for i in range(1, params.scp.n)) # Virtual Control Slack
|
|
211
211
|
|
|
212
212
|
idx_ncvx = 0
|
{openscvx-0.3.2.dev339 → openscvx-0.3.2.dev343}/docs/UsersGuide/03_obstacle_avoidance_vmap.md
RENAMED
|
@@ -258,11 +258,14 @@ problem = ox.Problem(
|
|
|
258
258
|
The SCP algorithm has several tuning parameters that affect convergence. For this obstacle avoidance problem:
|
|
259
259
|
|
|
260
260
|
```python
|
|
261
|
-
problem.settings.scp.
|
|
261
|
+
problem.settings.scp.lam_prox = 1e1 # Trust region weight
|
|
262
262
|
problem.settings.scp.lam_cost = 1e1 # Cost objective weight
|
|
263
263
|
problem.settings.scp.lam_vc = 1e2 # Virtual control weight
|
|
264
|
-
|
|
265
|
-
problem.settings.scp.
|
|
264
|
+
# Configure cost relaxation via autotuner
|
|
265
|
+
problem.settings.scp.autotuner = ox.AugmentedLagrangian(
|
|
266
|
+
lam_cost_drop=4, # Iteration to start relaxing cost
|
|
267
|
+
lam_cost_relax=0.5 # Cost relaxation factor
|
|
268
|
+
)
|
|
266
269
|
```
|
|
267
270
|
|
|
268
271
|
### Solution
|
|
@@ -389,7 +392,7 @@ if step_result.J_vc < 1e-4:
|
|
|
389
392
|
problem.settings.scp.lam_cost *= 1.1
|
|
390
393
|
|
|
391
394
|
# Tighten trust region if solution is oscillating
|
|
392
|
-
problem.settings.scp.
|
|
395
|
+
problem.settings.scp.lam_prox = 2.0
|
|
393
396
|
```
|
|
394
397
|
|
|
395
398
|
### Resetting the Problem
|
|
@@ -328,11 +328,14 @@ problem = ox.Problem(
|
|
|
328
328
|
)
|
|
329
329
|
|
|
330
330
|
# Tuning for this problem
|
|
331
|
-
problem.settings.scp.
|
|
331
|
+
problem.settings.scp.lam_prox = 2e0
|
|
332
332
|
problem.settings.scp.lam_cost = 1e-1
|
|
333
333
|
problem.settings.scp.lam_vc = 1e2
|
|
334
|
-
|
|
335
|
-
problem.settings.scp.
|
|
334
|
+
# Configure cost relaxation via autotuner
|
|
335
|
+
problem.settings.scp.autotuner = ox.AugmentedLagrangian(
|
|
336
|
+
lam_cost_drop=10,
|
|
337
|
+
lam_cost_relax=0.8
|
|
338
|
+
)
|
|
336
339
|
|
|
337
340
|
problem.initialize()
|
|
338
341
|
results = problem.solve()
|
|
@@ -84,20 +84,15 @@ problem = Problem(
|
|
|
84
84
|
constraints=constraint_exprs,
|
|
85
85
|
N=n,
|
|
86
86
|
licq_max=1e-8,
|
|
87
|
+
autotuner=ox.ConstantProximalWeight(),
|
|
87
88
|
)
|
|
88
89
|
|
|
89
90
|
problem.settings.prp.dt = 0.01
|
|
90
91
|
|
|
91
|
-
|
|
92
|
-
# problem.settings.cvx.cvxpygen = True
|
|
93
|
-
problem.settings.cvx.solver_args = {"abstol": 1e-6, "reltol": 1e-9}
|
|
94
|
-
|
|
95
|
-
problem.settings.scp.w_tr = 1e1 # Weight on the Trust Reigon
|
|
92
|
+
problem.settings.scp.lam_prox = 1e1 # Weight on the Trust Reigon
|
|
96
93
|
problem.settings.scp.lam_cost = 1e0 # Weight on the Minimal Time Objective
|
|
97
|
-
problem.settings.scp.lam_vc = 1e1 # Weight on the Virtual Control Objective
|
|
98
94
|
problem.settings.scp.uniform_time_grid = True
|
|
99
95
|
|
|
100
|
-
problem.settings.sim.save_compiled = False
|
|
101
96
|
|
|
102
97
|
plotting_dict = {}
|
|
103
98
|
|
|
@@ -28,7 +28,7 @@ sys.path.append(grandparent_dir)
|
|
|
28
28
|
|
|
29
29
|
import openscvx as ox
|
|
30
30
|
from openscvx import Problem
|
|
31
|
-
from openscvx.plotting import plot_scp_iterations
|
|
31
|
+
from openscvx.plotting import plot_scp_convergence_histories, plot_scp_iterations
|
|
32
32
|
|
|
33
33
|
# =============================================================================
|
|
34
34
|
# Robot Parameters
|
|
@@ -205,9 +205,6 @@ problem = Problem(
|
|
|
205
205
|
|
|
206
206
|
# Solver settings
|
|
207
207
|
problem.settings.prp.dt = 0.01
|
|
208
|
-
problem.settings.scp.w_tr = 1e0
|
|
209
|
-
problem.settings.scp.lam_cost = 1e0
|
|
210
|
-
problem.settings.scp.lam_vc = 1e1
|
|
211
208
|
problem.settings.scp.lam_vb = 1e1
|
|
212
209
|
|
|
213
210
|
if __name__ == "__main__":
|
|
@@ -243,7 +240,7 @@ if __name__ == "__main__":
|
|
|
243
240
|
return T_final[:3, 3]
|
|
244
241
|
|
|
245
242
|
plot_scp_iterations(results).show()
|
|
246
|
-
|
|
243
|
+
plot_scp_convergence_histories(results).show()
|
|
247
244
|
tgt = target.value
|
|
248
245
|
final_ee = compute_ee_position(final_q)
|
|
249
246
|
error = np.linalg.norm(final_ee - tgt)
|
|
@@ -100,22 +100,10 @@ problem = Problem(
|
|
|
100
100
|
)
|
|
101
101
|
|
|
102
102
|
# Set solver parameters
|
|
103
|
-
problem.settings.prp.dt = 0.01
|
|
104
|
-
# problem.settings.scp.w_tr_adapt = 1.3
|
|
105
|
-
problem.settings.scp.w_tr = 1e0
|
|
106
103
|
problem.settings.scp.lam_cost = 4e1
|
|
107
104
|
problem.settings.scp.lam_vc = 1e3
|
|
108
105
|
problem.settings.scp.uniform_time_grid = True
|
|
109
106
|
|
|
110
|
-
# Enable CLI printing for optimization iterations
|
|
111
|
-
problem.settings.dev.printing = True
|
|
112
|
-
|
|
113
|
-
# problem.settings.cvx.cvxpygen = True
|
|
114
|
-
# problem.settings.cvx.solver = "qocogen"
|
|
115
|
-
problem.settings.cvx.solver_args = {}
|
|
116
|
-
# problem.settings.cvx.cvxpygen_override = True
|
|
117
|
-
|
|
118
|
-
|
|
119
107
|
plotting_dict = {
|
|
120
108
|
"obs_radius": problem.parameters["obs_radius"],
|
|
121
109
|
"obs_center": problem.parameters["obs_center"],
|
|
@@ -130,10 +118,9 @@ if __name__ == "__main__":
|
|
|
130
118
|
plot_dubins_car(results, problem.settings).show()
|
|
131
119
|
|
|
132
120
|
# Second run with different parameters
|
|
121
|
+
problem.reset()
|
|
133
122
|
problem.parameters["obs_center"] = np.array([0.5, 0.0])
|
|
134
123
|
total_time = 0.7 # Adjust total time for second run
|
|
135
|
-
problem.settings.scp.lam_cost = 1e-1 # Disable minimal time objective for second run
|
|
136
|
-
problem.settings.scp.w_tr = 1e0
|
|
137
124
|
problem.settings.scp.lam_vc = 1e2 # Adjust virtual control weight
|
|
138
125
|
position.guess = np.linspace([0, -2], [0, 2], n)
|
|
139
126
|
theta.guess = np.zeros((n, 1))
|
|
@@ -27,7 +27,7 @@ from examples.plotting import plot_dubins_car, plot_velocity_vs_distance
|
|
|
27
27
|
from openscvx import Problem
|
|
28
28
|
|
|
29
29
|
n = 8
|
|
30
|
-
total_time =
|
|
30
|
+
total_time = 3.0 # Total simulation time
|
|
31
31
|
|
|
32
32
|
# Define state components
|
|
33
33
|
position = ox.State("position", shape=(2,)) # 2D position [x, y]
|
|
@@ -112,10 +112,6 @@ problem = Problem(
|
|
|
112
112
|
)
|
|
113
113
|
|
|
114
114
|
# Set solver parameters
|
|
115
|
-
problem.settings.scp.w_tr = 1e0
|
|
116
|
-
problem.settings.scp.w_tr_adapt = 1.1
|
|
117
|
-
problem.settings.scp.w_tr_max_scaling_factor = 1e2
|
|
118
|
-
problem.settings.scp.lam_cost = 1e0
|
|
119
115
|
problem.settings.scp.lam_vc = 1e3
|
|
120
116
|
problem.settings.scp.uniform_time_grid = True
|
|
121
117
|
|
|
@@ -113,10 +113,6 @@ problem = Problem(
|
|
|
113
113
|
N=n,
|
|
114
114
|
)
|
|
115
115
|
# Set solver parameters
|
|
116
|
-
problem.settings.prp.dt = 0.01
|
|
117
|
-
problem.settings.scp.w_tr_adapt = 1.1
|
|
118
|
-
problem.settings.scp.w_tr = 1e0
|
|
119
|
-
problem.settings.scp.lam_cost = 1e-1
|
|
120
116
|
problem.settings.scp.lam_vc = 6e2
|
|
121
117
|
problem.settings.scp.uniform_time_grid = True
|
|
122
118
|
plotting_dict = {
|
|
@@ -105,10 +105,6 @@ problem = Problem(
|
|
|
105
105
|
N=n,
|
|
106
106
|
)
|
|
107
107
|
# Set solver parameters
|
|
108
|
-
problem.settings.prp.dt = 0.01
|
|
109
|
-
problem.settings.scp.w_tr_adapt = 1.1
|
|
110
|
-
problem.settings.scp.w_tr = 1e0
|
|
111
|
-
problem.settings.scp.lam_cost = 1e-1
|
|
112
108
|
problem.settings.scp.lam_vc = 6e2
|
|
113
109
|
problem.settings.scp.uniform_time_grid = True
|
|
114
110
|
# Extract parameter values from problem.parameters (not Parameter objects)
|
|
@@ -238,15 +238,8 @@ problem = Problem(
|
|
|
238
238
|
)
|
|
239
239
|
|
|
240
240
|
|
|
241
|
-
problem.settings.scp.
|
|
242
|
-
problem.settings.scp.lam_cost = 1e-2 # Weight on the Minimal Fuel Objective
|
|
243
|
-
problem.settings.scp.lam_vc = 1e1 # Weight on the Virtual Control Objective
|
|
244
|
-
|
|
241
|
+
problem.settings.scp.lam_prox = 4e0 # Weight on the Trust Reigon
|
|
245
242
|
problem.settings.scp.ep_tr = 1e-6 # Trust Region Tolerance
|
|
246
|
-
problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
|
|
247
|
-
problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
|
|
248
|
-
problem.settings.scp.w_tr_adapt = 1.3 # Trust Region Adaptation Factor
|
|
249
|
-
problem.settings.scp.w_tr_max_scaling_factor = 1e3 # Maximum Trust Region Weight
|
|
250
243
|
|
|
251
244
|
plotting_dict = {
|
|
252
245
|
"n_subs": n_subs,
|
|
@@ -137,21 +137,7 @@ problem = Problem(
|
|
|
137
137
|
N=n,
|
|
138
138
|
)
|
|
139
139
|
|
|
140
|
-
problem.settings.prp.dt = 0.01
|
|
141
|
-
problem.settings.dis.custom_integrator = True
|
|
142
|
-
|
|
143
|
-
problem.settings.scp.w_tr = 2e0 # Weight on the Trust Reigon
|
|
144
|
-
problem.settings.scp.lam_cost = 1e-1 # 0e-1, # Weight on the Minimal Time Objective
|
|
145
|
-
problem.settings.scp.lam_vc = (
|
|
146
|
-
1e1 # 1e1, # Weight on the Virtual Control Objective (not including CTCS Augmentation)
|
|
147
|
-
)
|
|
148
140
|
problem.settings.scp.ep_tr = 1e-3 # Trust Region Tolerance
|
|
149
|
-
problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
|
|
150
|
-
problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
|
|
151
|
-
problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
|
|
152
|
-
problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
|
|
153
|
-
problem.settings.scp.w_tr_adapt = 1.4 # Trust Region Adaptation Factor
|
|
154
|
-
problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
|
|
155
141
|
|
|
156
142
|
plotting_dict = {"vertices": vertices}
|
|
157
143
|
|
|
@@ -226,21 +226,7 @@ problem = Problem(
|
|
|
226
226
|
N=n,
|
|
227
227
|
)
|
|
228
228
|
|
|
229
|
-
problem.settings.prp.dt = 0.01
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
problem.settings.scp.w_tr = 2e0 # Weight on the Trust Reigon
|
|
233
|
-
problem.settings.scp.lam_cost = 1e-1 # 0e-1, # Weight on the Minimal Time Objective
|
|
234
|
-
problem.settings.scp.lam_vc = (
|
|
235
|
-
1e2 # 1e1, # Weight on the Virtual Control Objective (not including CTCS Augmentation)
|
|
236
|
-
)
|
|
237
229
|
problem.settings.scp.ep_tr = 1e-3 # Trust Region Tolerance
|
|
238
|
-
problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
|
|
239
|
-
problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance
|
|
240
|
-
problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
|
|
241
|
-
problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
|
|
242
|
-
problem.settings.scp.w_tr_adapt = 1.4 # Trust Region Adaptation Factor
|
|
243
|
-
problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
|
|
244
230
|
|
|
245
231
|
plotting_dict = {
|
|
246
232
|
"vertices": vertices,
|
|
@@ -28,6 +28,7 @@ from examples.plotting_viser import (
|
|
|
28
28
|
create_scp_animated_plotting_server,
|
|
29
29
|
)
|
|
30
30
|
from openscvx import Problem
|
|
31
|
+
from openscvx.plotting import plot_scp_convergence_histories
|
|
31
32
|
from openscvx.utils import gen_vertices, rot
|
|
32
33
|
|
|
33
34
|
n = 33 # Number of Nodes
|
|
@@ -226,23 +227,12 @@ problem = Problem(
|
|
|
226
227
|
N=n,
|
|
227
228
|
)
|
|
228
229
|
|
|
229
|
-
problem.settings.prp.dt = 0.1
|
|
230
230
|
|
|
231
|
-
problem.settings.scp.
|
|
231
|
+
problem.settings.scp.lam_prox = 8e1 # Weight on the Trust Reigon
|
|
232
232
|
problem.settings.scp.lam_cost = 2e1 # Weight on the Minimal Time Objective
|
|
233
|
-
problem.settings.scp.lam_vc =
|
|
234
|
-
|
|
235
|
-
)
|
|
236
|
-
problem.settings.scp.lam_vb = (
|
|
237
|
-
4e0 # Weight on the Virtual Control Objective (not including CTCS Augmentation)
|
|
238
|
-
)
|
|
233
|
+
problem.settings.scp.lam_vc = 1e2 # Weight on the Virtual Control Objective
|
|
234
|
+
problem.settings.scp.lam_vb = 4e0 # Weight on the Virtual Buffer Objective
|
|
239
235
|
problem.settings.scp.ep_tr = 1e-3 # Trust Region Tolerance
|
|
240
|
-
problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
|
|
241
|
-
problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance
|
|
242
|
-
problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
|
|
243
|
-
problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
|
|
244
|
-
problem.settings.scp.w_tr_adapt = 1.05 # Trust Region Adaptation Factor
|
|
245
|
-
problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
|
|
246
236
|
|
|
247
237
|
plotting_dict = {
|
|
248
238
|
"vertices": vertices,
|
|
@@ -261,6 +251,8 @@ if __name__ == "__main__":
|
|
|
261
251
|
|
|
262
252
|
results.update_plotting_data(**plotting_dict)
|
|
263
253
|
|
|
254
|
+
plot_scp_convergence_histories(results).show()
|
|
255
|
+
|
|
264
256
|
# Create both visualization servers (viser auto-assigns ports)
|
|
265
257
|
traj_server = create_animated_plotting_server(
|
|
266
258
|
results,
|
|
@@ -243,19 +243,11 @@ problem = Problem(
|
|
|
243
243
|
N=n,
|
|
244
244
|
)
|
|
245
245
|
|
|
246
|
-
problem.settings.
|
|
247
|
-
|
|
248
|
-
problem.settings.scp.w_tr = 2e0 # 2e0, # Weight on the Trust Reigon
|
|
249
|
-
problem.settings.scp.lam_cost = 2e-1 # 0e-1, # Weight on the Minimal Time Objective
|
|
246
|
+
problem.settings.scp.lam_prox = 2e0 # Weight on the Trust Reigon
|
|
250
247
|
problem.settings.scp.lam_vc = 4e1 # Weight on the Virtual Control Objective
|
|
251
248
|
|
|
252
249
|
problem.settings.scp.ep_tr = 1e-5 # Trust Region Tolerance
|
|
253
|
-
|
|
254
|
-
problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
|
|
255
|
-
problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
|
|
256
|
-
problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
|
|
257
|
-
problem.settings.scp.w_tr_adapt = 1.2 # Trust Region Adaptation Factor
|
|
258
|
-
problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
|
|
250
|
+
|
|
259
251
|
plotting_dict = {
|
|
260
252
|
"vertices": vertices,
|
|
261
253
|
"n_subs": n_subs,
|
|
@@ -265,6 +257,7 @@ plotting_dict = {
|
|
|
265
257
|
"init_poses": init_poses,
|
|
266
258
|
"norm_type": norm_type,
|
|
267
259
|
}
|
|
260
|
+
|
|
268
261
|
if __name__ == "__main__":
|
|
269
262
|
problem.initialize()
|
|
270
263
|
results = problem.solve()
|
|
@@ -140,85 +140,11 @@ for node, gate_center_param in zip(gate_nodes, gate_center_params):
|
|
|
140
140
|
)
|
|
141
141
|
constraints.append(gate_constraint)
|
|
142
142
|
|
|
143
|
-
|
|
144
|
-
# Define symbolic utility functions
|
|
145
|
-
def symbolic_qdcm(q):
|
|
146
|
-
"""Quaternion to Direction Cosine Matrix conversion using symbolic expressions"""
|
|
147
|
-
# Normalize quaternion
|
|
148
|
-
q_norm = ox.Sqrt(ox.Sum(q * q))
|
|
149
|
-
q_normalized = q / q_norm
|
|
150
|
-
|
|
151
|
-
w, x, y, z = q_normalized[0], q_normalized[1], q_normalized[2], q_normalized[3]
|
|
152
|
-
|
|
153
|
-
# Create DCM elements and assemble into 3x3 matrix
|
|
154
|
-
return ox.Block(
|
|
155
|
-
[
|
|
156
|
-
[1.0 - 2.0 * (y * y + z * z), 2.0 * (x * y - z * w), 2.0 * (x * z + y * w)],
|
|
157
|
-
[2.0 * (x * y + z * w), 1.0 - 2.0 * (x * x + z * z), 2.0 * (y * z - x * w)],
|
|
158
|
-
[2.0 * (x * z - y * w), 2.0 * (y * z + x * w), 1.0 - 2.0 * (x * x + y * y)],
|
|
159
|
-
]
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def symbolic_ssmp(w):
|
|
164
|
-
"""Angular rate to 4x4 skew symmetric matrix for quaternion dynamics"""
|
|
165
|
-
x, y, z = w[0], w[1], w[2]
|
|
166
|
-
|
|
167
|
-
return ox.Block(
|
|
168
|
-
[
|
|
169
|
-
[0.0, -x, -y, -z],
|
|
170
|
-
[x, 0.0, z, -y],
|
|
171
|
-
[y, -z, 0.0, x],
|
|
172
|
-
[z, y, -x, 0.0],
|
|
173
|
-
]
|
|
174
|
-
)
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
def symbolic_ssm(w):
|
|
178
|
-
"""Angular rate to 3x3 skew symmetric matrix"""
|
|
179
|
-
x, y, z = w[0], w[1], w[2]
|
|
180
|
-
|
|
181
|
-
return ox.Block(
|
|
182
|
-
[
|
|
183
|
-
[0.0, -z, y],
|
|
184
|
-
[z, 0.0, -x],
|
|
185
|
-
[-y, x, 0.0],
|
|
186
|
-
]
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
def symbolic_diag(v):
|
|
191
|
-
"""Create diagonal matrix from vector"""
|
|
192
|
-
if len(v) == 3:
|
|
193
|
-
return ox.Block(
|
|
194
|
-
[
|
|
195
|
-
[v[0], 0.0, 0.0],
|
|
196
|
-
[0.0, v[1], 0.0],
|
|
197
|
-
[0.0, 0.0, v[2]],
|
|
198
|
-
]
|
|
199
|
-
)
|
|
200
|
-
else:
|
|
201
|
-
raise NotImplementedError("Only 3x3 diagonal matrices supported")
|
|
202
|
-
|
|
203
|
-
|
|
204
143
|
# Create symbolic dynamics
|
|
205
144
|
# Normalize quaternion for dynamics
|
|
206
145
|
q_norm = ox.linalg.Norm(attitude)
|
|
207
146
|
attitude_normalized = attitude / q_norm
|
|
208
147
|
|
|
209
|
-
# Option 1: Full symbolic dynamics (more flexible but potentially slower)
|
|
210
|
-
# r_dot = velocity
|
|
211
|
-
# v_dot = (Constant(1.0 / m)) * symbolic_qdcm(attitude) @ thrust_force + Constant(
|
|
212
|
-
# np.array([0, 0, g_const], dtype=np.float64)
|
|
213
|
-
# )
|
|
214
|
-
# q_dot = Constant(0.5) * symbolic_ssmp(angular_velocity) @ attitude
|
|
215
|
-
# J_b_inv = Constant(1.0 / J_b)
|
|
216
|
-
# J_b_diag = symbolic_diag([Constant(J_b[0]), Constant(J_b[1]), Constant(J_b[2])])
|
|
217
|
-
# w_dot = symbolic_diag([J_b_inv[0], J_b_inv[1], J_b_inv[2]]) @ (
|
|
218
|
-
# torque - symbolic_ssm(angular_velocity) @ J_b_diag @ angular_velocity
|
|
219
|
-
# )
|
|
220
|
-
|
|
221
|
-
# Option 2: Efficient dynamics using direct JAX lowering (better performance)
|
|
222
148
|
J_b_inv = 1.0 / J_b
|
|
223
149
|
J_b_diag = ox.linalg.Diag(J_b)
|
|
224
150
|
|
|
@@ -255,21 +181,9 @@ problem = Problem(
|
|
|
255
181
|
# licq_max=1E-8
|
|
256
182
|
)
|
|
257
183
|
|
|
258
|
-
problem.settings.prp.dt = 0.01
|
|
259
|
-
|
|
260
|
-
problem.settings.scp.w_tr = 2e0 # Weight on the Trust Reigon
|
|
261
|
-
problem.settings.scp.lam_cost = 1e-1 # 0e-1, # Weight on the Minimal Time Objective
|
|
262
|
-
problem.settings.scp.lam_vc = (
|
|
263
|
-
1e1 # 1e1, # Weight on the Virtual Control Objective (not including CTCS Augmentation)
|
|
264
|
-
)
|
|
265
184
|
problem.settings.scp.ep_tr = 1e-3 # Trust Region Tolerance
|
|
266
|
-
problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
|
|
267
|
-
problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
|
|
268
|
-
# problem.settings.scp.cost_drop = 10 # SCP iteration to relax minimal final time objective
|
|
269
|
-
# problem.settings.scp.cost_relax = 0.8 # Minimal Time Relaxation Factor
|
|
270
|
-
problem.settings.scp.w_tr_adapt = 1.4 # Trust Region Adaptation Factor
|
|
271
|
-
problem.settings.scp.w_tr_max_scaling_factor = 1e2 # Maximum Trust Region Weight
|
|
272
185
|
|
|
186
|
+
problem.settings.cvx.solver_args = {"abstol": 1e-6, "reltol": 1e-9}
|
|
273
187
|
plotting_dict = {
|
|
274
188
|
"vertices": vertices,
|
|
275
189
|
"gate_centers": modified_centers,
|
|
@@ -154,15 +154,6 @@ problem = Problem(
|
|
|
154
154
|
N=n,
|
|
155
155
|
)
|
|
156
156
|
|
|
157
|
-
problem.settings.prp.dt = 0.001
|
|
158
|
-
problem.settings.scp.lam_vb = 1e0
|
|
159
|
-
problem.settings.scp.w_tr_adapt = 1.8
|
|
160
|
-
problem.settings.scp.w_tr = 1e1
|
|
161
|
-
problem.settings.scp.lam_cost = 1e1 # Weight on the Nonlinear Cost
|
|
162
|
-
problem.settings.scp.lam_vc = 1e2 # Weight on the Virtual Control Objective
|
|
163
|
-
problem.settings.scp.cost_drop = 4 # SCP iteration to relax minimal final time objective
|
|
164
|
-
problem.settings.scp.cost_relax = 0.5 # Minimal Time Relaxation Factor
|
|
165
|
-
|
|
166
157
|
plotting_dict = {
|
|
167
158
|
"obstacles_centers": obstacle_center_positions,
|
|
168
159
|
"obstacles_axes": axes,
|
|
@@ -152,10 +152,7 @@ problem = Problem(
|
|
|
152
152
|
N=n,
|
|
153
153
|
)
|
|
154
154
|
|
|
155
|
-
problem.settings.prp.dt = 0.01
|
|
156
155
|
problem.settings.scp.lam_vb = 1e0
|
|
157
|
-
problem.settings.scp.cost_drop = 4 # SCP iteration to relax minimal final time objective
|
|
158
|
-
problem.settings.scp.cost_relax = 0.5 # Minimal Time Relaxation Factor
|
|
159
156
|
|
|
160
157
|
plotting_dict = {
|
|
161
158
|
"obstacles_centers": obstacle_center_positions,
|
|
@@ -136,11 +136,6 @@ constraints.extend(
|
|
|
136
136
|
# =============================================================================
|
|
137
137
|
# Obstacle Avoidance
|
|
138
138
|
# =============================================================================
|
|
139
|
-
# Two approaches are shown below for benchmarking. Comment/uncomment to toggle.
|
|
140
|
-
|
|
141
|
-
# --- APPROACH 1: Vmap (single constraint, vectorized) ---
|
|
142
|
-
# - Single CTCS constraint with vectorized evaluation
|
|
143
|
-
# - Vmap computes distance to all obstacles in parallel
|
|
144
139
|
|
|
145
140
|
obstacle_avoidance = ox.ctcs(
|
|
146
141
|
obstacle_radii
|
|
@@ -151,18 +146,6 @@ obstacle_avoidance = ox.ctcs(
|
|
|
151
146
|
)
|
|
152
147
|
constraints.append(obstacle_avoidance)
|
|
153
148
|
|
|
154
|
-
# --- APPROACH 2: Individual constraints (loop, no vmap) ---
|
|
155
|
-
# - Creates n_obstacles separate CTCS constraints
|
|
156
|
-
# - Each constraint is lowered and traced independently
|
|
157
|
-
|
|
158
|
-
# for i in range(n_obstacles):
|
|
159
|
-
# obs_center = obstacle_centers[i]
|
|
160
|
-
# radius = obstacle_radii[i]
|
|
161
|
-
# obstacle_constraint = ox.ctcs(
|
|
162
|
-
# radius <= ox.linalg.Norm(position - obs_center)
|
|
163
|
-
# )
|
|
164
|
-
# constraints.append(obstacle_constraint)
|
|
165
|
-
|
|
166
149
|
# =============================================================================
|
|
167
150
|
# Initial Guesses
|
|
168
151
|
# =============================================================================
|
|
@@ -192,17 +175,7 @@ problem = Problem(
|
|
|
192
175
|
N=n,
|
|
193
176
|
)
|
|
194
177
|
|
|
195
|
-
# SCP settings
|
|
196
|
-
problem.settings.prp.dt = 0.01
|
|
197
|
-
problem.settings.scp.w_tr = 5e0
|
|
198
|
-
problem.settings.scp.lam_cost = 1e0
|
|
199
|
-
problem.settings.scp.lam_vc = 1e2
|
|
200
178
|
problem.settings.scp.ep_tr = 1e-3
|
|
201
|
-
problem.settings.scp.ep_vb = 1e-4
|
|
202
|
-
problem.settings.scp.ep_vc = 1e-8
|
|
203
|
-
problem.settings.scp.cost_drop = 5
|
|
204
|
-
problem.settings.scp.cost_relax = 0.7
|
|
205
|
-
problem.settings.scp.w_tr_adapt = 1.5
|
|
206
179
|
|
|
207
180
|
# =============================================================================
|
|
208
181
|
# Solve and Visualize
|
|
@@ -199,15 +199,15 @@ problem = Problem(
|
|
|
199
199
|
licq_max=1e-8,
|
|
200
200
|
)
|
|
201
201
|
|
|
202
|
-
problem.settings.scp.
|
|
202
|
+
problem.settings.scp.lam_prox = 4e0 # Weight on the Trust Region
|
|
203
203
|
problem.settings.scp.lam_cost = 1e-2 # Weight on the Minimal Fuel Objective
|
|
204
204
|
problem.settings.scp.lam_vc = 1e1 # Weight on the Virtual Control Objective
|
|
205
205
|
|
|
206
206
|
problem.settings.scp.ep_tr = 1e-6 # Trust Region Tolerance
|
|
207
207
|
problem.settings.scp.ep_vb = 1e-4 # Virtual Control Tolerance
|
|
208
208
|
problem.settings.scp.ep_vc = 1e-8 # Virtual Control Tolerance for CTCS
|
|
209
|
-
problem.settings.scp.
|
|
210
|
-
problem.settings.scp.
|
|
209
|
+
problem.settings.scp.lam_prox_adapt = 1.3 # Trust Region Adaptation Factor
|
|
210
|
+
problem.settings.scp.lam_prox_max_scaling_factor = 1e3 # Maximum Trust Region Weight
|
|
211
211
|
|
|
212
212
|
plotting_dict = {
|
|
213
213
|
"n_subs": n_subs,
|