openscvx 0.4.1.dev146__tar.gz → 0.4.1.dev147__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openscvx-0.4.1.dev146/openscvx.egg-info → openscvx-0.4.1.dev147}/PKG-INFO +1 -1
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/_version.py +3 -3
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/problem.py +9 -5
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/augmentation.py +36 -10
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/builder.py +9 -5
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_augmentation.py +99 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/assets/logo.svg +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/release-drafter.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/docs.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/lint.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/release.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/.gitignore +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/CONTRIBUTING.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/LICENSE +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/README.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/favicon.png +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/assets/logo.svg +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/citation.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/examples.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/getting-started.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/index.md +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/abstract/impulsive.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/arm/three_link_arm.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/car/dubins_car.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/car/dubins_car_conditional.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/car/dubins_car_stljax.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/logo.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/logo_utils/svg_path_utils.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/plotting.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/plotting_viser.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/figures/video_preview.png +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/javascripts/parallax.js +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/logo.svg +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/stylesheets/parallax.css +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/home.html +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/main.html +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/partials/parallax/hero.html +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/partials/parallax.html +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/mkdocs.yml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/__main__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/augmented_lagrangian.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/constant_proximal_weight.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/penalized_trust_region.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/algorithms/ramp_proximal_weight.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/config.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/discretization/base.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/expert/byof.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/expert/validation.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/init/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/loader.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/solvers/base.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/cache.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/caching.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/printing.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx/utils/utils.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/SOURCES.txt +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/pyproject.toml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/setup.cfg +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/hohmann_analytical.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_autotuning.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_discretization.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_examples.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_expert.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_impulsive.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_init.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_integrators.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_loader.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_optimization_results.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_plotting.py +0 -0
- {openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/tests/test_propagation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.4.1.
|
|
3
|
+
Version: 0.4.1.dev147
|
|
4
4
|
Summary: A general Python-based successive convexification implementation which uses a JAX backend.
|
|
5
5
|
Author-email: Chris Hayner and Griffin Norris <haynec@uw.edu>
|
|
6
6
|
License: Apache Software License
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.4.1.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 4, 1, '
|
|
31
|
+
__version__ = version = '0.4.1.dev147'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 4, 1, 'dev147')
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g50fc80214'
|
|
@@ -18,7 +18,7 @@ import os
|
|
|
18
18
|
import queue
|
|
19
19
|
import threading
|
|
20
20
|
import time
|
|
21
|
-
from typing import List, Optional, Union
|
|
21
|
+
from typing import Dict, List, Optional, Union
|
|
22
22
|
|
|
23
23
|
import jax
|
|
24
24
|
|
|
@@ -83,8 +83,8 @@ class Problem:
|
|
|
83
83
|
dynamics_prop: Optional[dict] = None,
|
|
84
84
|
states_prop: Optional[List[State]] = None,
|
|
85
85
|
algebraic_prop: Optional[dict] = None,
|
|
86
|
-
licq_min: float = 0.0,
|
|
87
|
-
licq_max: float = 1e-4,
|
|
86
|
+
licq_min: Union[float, Dict[int, float]] = 0.0,
|
|
87
|
+
licq_max: Union[float, Dict[int, float]] = 1e-4,
|
|
88
88
|
algorithm: Optional[Union[Algorithm, dict]] = None,
|
|
89
89
|
discretizer: Optional[Union[Discretizer, dict]] = None,
|
|
90
90
|
solver: Optional[Union[ConvexSolver, dict]] = None,
|
|
@@ -114,8 +114,12 @@ class Problem:
|
|
|
114
114
|
Only specify additional states beyond optimization states. Used with dynamics_prop.
|
|
115
115
|
algebraic_prop (dict, optional): Dictionary mapping names to symbolic expressions
|
|
116
116
|
for outputs evaluated (not integrated) during propagation.
|
|
117
|
-
licq_min
|
|
118
|
-
|
|
117
|
+
licq_min: Minimum LICQ constraint value. Defaults to 0.0.
|
|
118
|
+
Either a scalar (applied to all CTCS groups) or a dict
|
|
119
|
+
mapping CTCS group ``idx`` to per-group bounds.
|
|
120
|
+
licq_max: Maximum LICQ constraint value. Defaults to 1e-4.
|
|
121
|
+
Either a scalar (applied to all CTCS groups) or a dict
|
|
122
|
+
mapping CTCS group ``idx`` to per-group bounds.
|
|
119
123
|
algorithm: SCP algorithm configuration. Accepts:
|
|
120
124
|
|
|
121
125
|
- ``None`` — uses ``PenalizedTrustRegion()`` with defaults.
|
|
@@ -54,7 +54,7 @@ Example:
|
|
|
54
54
|
# controls_aug includes original controls + time dilation
|
|
55
55
|
"""
|
|
56
56
|
|
|
57
|
-
from typing import Dict, List, Optional, Tuple
|
|
57
|
+
from typing import Dict, List, Optional, Tuple, Union
|
|
58
58
|
|
|
59
59
|
import numpy as np
|
|
60
60
|
|
|
@@ -484,8 +484,8 @@ def augment_dynamics_with_ctcs(
|
|
|
484
484
|
N: int,
|
|
485
485
|
xdelta: Optional[Expr] = None,
|
|
486
486
|
*,
|
|
487
|
-
licq_min: float = 0.0,
|
|
488
|
-
licq_max: float = 1e-4,
|
|
487
|
+
licq_min: Union[float, Dict[int, float]] = 0.0,
|
|
488
|
+
licq_max: Union[float, Dict[int, float]] = 1e-4,
|
|
489
489
|
) -> Tuple[Expr, Optional[Expr], List[State], List[Control]]:
|
|
490
490
|
"""Augment dynamics with continuous-time constraint satisfaction states.
|
|
491
491
|
|
|
@@ -509,8 +509,12 @@ def augment_dynamics_with_ctcs(
|
|
|
509
509
|
controls: List of control variables
|
|
510
510
|
constraints_ctcs: List of CTCS constraints (should be sorted and grouped)
|
|
511
511
|
N: Number of discretization nodes
|
|
512
|
-
licq_min: Minimum bound for augmented states (default: 0.0)
|
|
513
|
-
|
|
512
|
+
licq_min: Minimum bound for augmented states (default: 0.0).
|
|
513
|
+
Either a scalar (applied to all groups) or a dict mapping
|
|
514
|
+
CTCS group ``idx`` to per-group bounds.
|
|
515
|
+
licq_max: Maximum bound for augmented states (default: 1e-4).
|
|
516
|
+
Either a scalar (applied to all groups) or a dict mapping
|
|
517
|
+
CTCS group ``idx`` to per-group bounds.
|
|
514
518
|
|
|
515
519
|
Returns:
|
|
516
520
|
Tuple of:
|
|
@@ -567,6 +571,24 @@ def augment_dynamics_with_ctcs(
|
|
|
567
571
|
penalty_groups[ctcs.idx] = []
|
|
568
572
|
penalty_groups[ctcs.idx].append(ctcs)
|
|
569
573
|
|
|
574
|
+
# Validate dict-valued licq_min / licq_max keys against actual groups.
|
|
575
|
+
valid_ids = set(penalty_groups.keys())
|
|
576
|
+
for name, val in [("licq_min", licq_min), ("licq_max", licq_max)]:
|
|
577
|
+
if isinstance(val, dict):
|
|
578
|
+
unknown = set(val.keys()) - valid_ids
|
|
579
|
+
if unknown:
|
|
580
|
+
raise ValueError(
|
|
581
|
+
f"{name} dict contains unknown CTCS group idx: {unknown}. "
|
|
582
|
+
f"Valid idx values: {sorted(valid_ids)}"
|
|
583
|
+
)
|
|
584
|
+
missing = valid_ids - set(val.keys())
|
|
585
|
+
if missing:
|
|
586
|
+
raise ValueError(
|
|
587
|
+
f"{name} dict is missing entries for CTCS group idx: "
|
|
588
|
+
f"{sorted(missing)}. When using a dict, all groups must "
|
|
589
|
+
f"have an entry. Valid idx values: {sorted(valid_ids)}"
|
|
590
|
+
)
|
|
591
|
+
|
|
570
592
|
# Create augmented state expressions for each group and corresponding
|
|
571
593
|
# augmented state variables. For discrete dynamics, preserve these states
|
|
572
594
|
# by identity mapping across impulsive updates.
|
|
@@ -580,13 +602,17 @@ def augment_dynamics_with_ctcs(
|
|
|
580
602
|
augmented_state_expr = Add(*penalty_terms)
|
|
581
603
|
augmented_state_exprs.append(augmented_state_expr)
|
|
582
604
|
|
|
605
|
+
# Resolve per-group LICQ bounds
|
|
606
|
+
idx_min = licq_min[idx] if isinstance(licq_min, dict) else licq_min
|
|
607
|
+
idx_max = licq_max[idx] if isinstance(licq_max, dict) else licq_max
|
|
608
|
+
|
|
583
609
|
aug_var = State(f"_ctcs_aug_{idx}", shape=(1,))
|
|
584
|
-
aug_var.initial = np.array([
|
|
610
|
+
aug_var.initial = np.array([idx_min]) # Set initial to respect bounds
|
|
585
611
|
aug_var.final = [("free", 0)]
|
|
586
|
-
aug_var.min = np.array([
|
|
587
|
-
aug_var.max = np.array([
|
|
588
|
-
# Set guess to
|
|
589
|
-
aug_var.guess = np.full([N, 1],
|
|
612
|
+
aug_var.min = np.array([idx_min])
|
|
613
|
+
aug_var.max = np.array([idx_max])
|
|
614
|
+
# Set guess to idx_min as well
|
|
615
|
+
aug_var.guess = np.full([N, 1], idx_min) # N x num augmented states
|
|
590
616
|
states_augmented.append(aug_var)
|
|
591
617
|
augmented_state_exprs_discrete.append(aug_var)
|
|
592
618
|
|
|
@@ -29,7 +29,7 @@ Pipeline stages:
|
|
|
29
29
|
See `preprocess_symbolic_problem()` for the main entry point.
|
|
30
30
|
"""
|
|
31
31
|
|
|
32
|
-
from typing import Dict, List, Optional, Tuple
|
|
32
|
+
from typing import Dict, List, Optional, Tuple, Union
|
|
33
33
|
|
|
34
34
|
import numpy as np
|
|
35
35
|
|
|
@@ -71,8 +71,8 @@ def preprocess_symbolic_problem(
|
|
|
71
71
|
controls: List[Control],
|
|
72
72
|
N: int,
|
|
73
73
|
time: Time,
|
|
74
|
-
licq_min: float = 0.0,
|
|
75
|
-
licq_max: float = 1e-4,
|
|
74
|
+
licq_min: Union[float, Dict[int, float]] = 0.0,
|
|
75
|
+
licq_max: Union[float, Dict[int, float]] = 1e-4,
|
|
76
76
|
dynamics_prop_extra: dict = None,
|
|
77
77
|
dynamics_discrete: dict = None,
|
|
78
78
|
states_prop_extra: List[State] = None,
|
|
@@ -106,8 +106,12 @@ def preprocess_symbolic_problem(
|
|
|
106
106
|
controls: List of user-defined Control objects (should NOT include time dilation)
|
|
107
107
|
N: Number of discretization nodes in the trajectory
|
|
108
108
|
time: Time configuration object specifying time bounds and constraints
|
|
109
|
-
licq_min: Minimum bound for CTCS augmented states (default: 0.0)
|
|
110
|
-
|
|
109
|
+
licq_min: Minimum bound for CTCS augmented states (default: 0.0).
|
|
110
|
+
Either a scalar (applied to all groups) or a dict mapping
|
|
111
|
+
CTCS group ``idx`` to per-group bounds.
|
|
112
|
+
licq_max: Maximum bound for CTCS augmented states (default: 1e-4).
|
|
113
|
+
Either a scalar (applied to all groups) or a dict mapping
|
|
114
|
+
CTCS group ``idx`` to per-group bounds.
|
|
111
115
|
dynamics_prop_extra: Optional dictionary of additional dynamics for propagation-only
|
|
112
116
|
states (default: None)
|
|
113
117
|
states_prop_extra: Optional list of additional State objects for propagation only
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.4.1.
|
|
3
|
+
Version: 0.4.1.dev147
|
|
4
4
|
Summary: A general Python-based successive convexification implementation which uses a JAX backend.
|
|
5
5
|
Author-email: Chris Hayner and Griffin Norris <haynec@uw.edu>
|
|
6
6
|
License: Apache Software License
|
|
@@ -821,6 +821,105 @@ def test_augmented_state_bounds():
|
|
|
821
821
|
assert np.allclose(aug_state.guess, 0.001), "Augmented state guess should be licq_min"
|
|
822
822
|
|
|
823
823
|
|
|
824
|
+
def test_augmented_state_bounds_per_group_dict():
|
|
825
|
+
"""Per-group LICQ bounds via dict keyed by idx."""
|
|
826
|
+
x = State("x", (1,))
|
|
827
|
+
time = State("time", (1,))
|
|
828
|
+
time.final = np.array([10.0])
|
|
829
|
+
xdot = x
|
|
830
|
+
states = [time, x]
|
|
831
|
+
controls = []
|
|
832
|
+
N = 5
|
|
833
|
+
time.guess = np.linspace(0, time.final[0], N).reshape(-1, 1)
|
|
834
|
+
|
|
835
|
+
# Two constraints with different node intervals → two groups (idx 0 and 1)
|
|
836
|
+
c0 = ctcs(x <= 1.0, penalty="squared_relu", nodes=(0, 3))
|
|
837
|
+
c1 = ctcs(x <= 2.0, penalty="squared_relu", nodes=(3, 5))
|
|
838
|
+
|
|
839
|
+
_, _, states_aug, _ = augment_dynamics_with_ctcs(
|
|
840
|
+
xdot,
|
|
841
|
+
states,
|
|
842
|
+
controls,
|
|
843
|
+
[c0, c1],
|
|
844
|
+
N,
|
|
845
|
+
licq_min={0: 0.0, 1: 0.001},
|
|
846
|
+
licq_max={0: 1e-8, 1: 0.01},
|
|
847
|
+
)
|
|
848
|
+
|
|
849
|
+
aug0 = states_aug[2] # _ctcs_aug_0
|
|
850
|
+
aug1 = states_aug[3] # _ctcs_aug_1
|
|
851
|
+
|
|
852
|
+
assert aug0.min[0] == 0.0
|
|
853
|
+
assert aug0.max[0] == 1e-8
|
|
854
|
+
assert aug0.initial[0] == 0.0
|
|
855
|
+
assert np.allclose(aug0.guess, 0.0)
|
|
856
|
+
|
|
857
|
+
assert aug1.min[0] == 0.001
|
|
858
|
+
assert aug1.max[0] == 0.01
|
|
859
|
+
assert aug1.initial[0] == 0.001
|
|
860
|
+
assert np.allclose(aug1.guess, 0.001)
|
|
861
|
+
|
|
862
|
+
|
|
863
|
+
def test_augmented_state_bounds_scalar_with_multiple_groups():
|
|
864
|
+
"""Scalar LICQ bounds broadcast to all groups."""
|
|
865
|
+
x = State("x", (1,))
|
|
866
|
+
time = State("time", (1,))
|
|
867
|
+
time.final = np.array([10.0])
|
|
868
|
+
xdot = x
|
|
869
|
+
states = [time, x]
|
|
870
|
+
controls = []
|
|
871
|
+
N = 5
|
|
872
|
+
time.guess = np.linspace(0, time.final[0], N).reshape(-1, 1)
|
|
873
|
+
|
|
874
|
+
c0 = ctcs(x <= 1.0, penalty="squared_relu", nodes=(0, 3))
|
|
875
|
+
c1 = ctcs(x <= 2.0, penalty="squared_relu", nodes=(3, 5))
|
|
876
|
+
|
|
877
|
+
_, _, states_aug, _ = augment_dynamics_with_ctcs(
|
|
878
|
+
xdot,
|
|
879
|
+
states,
|
|
880
|
+
controls,
|
|
881
|
+
[c0, c1],
|
|
882
|
+
N,
|
|
883
|
+
licq_min=0.002,
|
|
884
|
+
licq_max=0.05,
|
|
885
|
+
)
|
|
886
|
+
|
|
887
|
+
for i in [2, 3]:
|
|
888
|
+
aug = states_aug[i]
|
|
889
|
+
assert aug.min[0] == 0.002
|
|
890
|
+
assert aug.max[0] == 0.05
|
|
891
|
+
assert aug.initial[0] == 0.002
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
def test_licq_dict_unknown_idx_raises():
|
|
895
|
+
"""Dict licq with unknown idx raises helpful error."""
|
|
896
|
+
x = State("x", (1,))
|
|
897
|
+
time = State("time", (1,))
|
|
898
|
+
time.final = np.array([10.0])
|
|
899
|
+
states = [time, x]
|
|
900
|
+
N = 5
|
|
901
|
+
time.guess = np.linspace(0, time.final[0], N).reshape(-1, 1)
|
|
902
|
+
c0 = ctcs(x <= 1.0, penalty="squared_relu", nodes=(0, 5))
|
|
903
|
+
|
|
904
|
+
with pytest.raises(ValueError, match="unknown CTCS group idx.*5"):
|
|
905
|
+
augment_dynamics_with_ctcs(x, states, [], [c0], N, licq_max={0: 1e-8, 5: 1e-4})
|
|
906
|
+
|
|
907
|
+
|
|
908
|
+
def test_licq_dict_missing_idx_raises():
|
|
909
|
+
"""Dict licq missing a group idx raises helpful error."""
|
|
910
|
+
x = State("x", (1,))
|
|
911
|
+
time = State("time", (1,))
|
|
912
|
+
time.final = np.array([10.0])
|
|
913
|
+
states = [time, x]
|
|
914
|
+
N = 5
|
|
915
|
+
time.guess = np.linspace(0, time.final[0], N).reshape(-1, 1)
|
|
916
|
+
c0 = ctcs(x <= 1.0, penalty="squared_relu", nodes=(0, 3))
|
|
917
|
+
c1 = ctcs(x <= 2.0, penalty="squared_relu", nodes=(3, 5))
|
|
918
|
+
|
|
919
|
+
with pytest.raises(ValueError, match="missing entries for CTCS group idx.*1"):
|
|
920
|
+
augment_dynamics_with_ctcs(x, states, [], [c0, c1], N, licq_max={0: 1e-8})
|
|
921
|
+
|
|
922
|
+
|
|
824
923
|
def test_time_dilation_control_bounds():
|
|
825
924
|
"""Test that time dilation control has correct min/max bounds based on time."""
|
|
826
925
|
x = State("x", (2,))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/constraint_reformulation.md
RENAMED
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/Foundations/control_parameterization.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UnderTheHood/vectorization_and_vmapping.md
RENAMED
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/01_hello_world_brachistochrone.md
RENAMED
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/02_drone_racing_constraints.md
RENAMED
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/docs/UsersGuide/03_obstacle_avoidance_vmap.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/examples/realtime/obstacle_avoidance_realtime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/2-mars.avif
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/3-moon.avif
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/4-sat1.avif
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/5-space.avif
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/images/layers/6-earth.avif
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/javascripts/parallax.js
RENAMED
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/stylesheets/custom.css
RENAMED
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/assets/stylesheets/parallax.css
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscvx-0.4.1.dev146 → openscvx-0.4.1.dev147}/material/overrides/partials/parallax/hero.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|