openscvx 0.3.2.dev127__tar.gz → 0.3.2.dev143__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.dev127 → openscvx-0.3.2.dev143}/CONTRIBUTING.md +33 -0
- {openscvx-0.3.2.dev127/openscvx.egg-info → openscvx-0.3.2.dev143}/PKG-INFO +1 -1
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/_version.py +3 -3
- openscvx-0.3.2.dev143/openscvx/algorithms/__init__.py +92 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/algorithms/autotuning.py +2 -2
- openscvx-0.3.2.dev127/openscvx/algorithms/solver_state.py → openscvx-0.3.2.dev143/openscvx/algorithms/base.py +128 -9
- openscvx-0.3.2.dev143/openscvx/algorithms/penalized_trust_region.py +384 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/problem.py +124 -26
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/solvers/__init__.py +5 -1
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx.egg-info/SOURCES.txt +2 -2
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/test_cvxpygen_optional.py +1 -1
- openscvx-0.3.2.dev127/openscvx/algorithms/__init__.py +0 -45
- openscvx-0.3.2.dev127/openscvx/algorithms/ptr.py +0 -343
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/release-drafter.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/workflows/_docs.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/workflows/docs.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/workflows/lint.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/workflows/release.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/.gitignore +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/LICENSE +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/README.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Overview/constraint_reformulation.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Overview/control_parameterization.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Overview/discretization.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Overview/ocp.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Overview/scvx.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Overview/time_dilation.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/advanced_problem_setup.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/api.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/api_constraints.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/api_control.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/api_integrators.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/api_state.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/api_trajoptproblem.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/api_variable.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/basic_problem_setup.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/tutorial_6dof_los_guidance.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/tutorial_6dof_obstacle_avoidance.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/Usage/tutorials.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/assets/favicon.png +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/citation.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/examples.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/getting-started.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/index.md +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/abstract/3DoF_pdg.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/car/dubins_car.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/car/dubins_car_stljax.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/drone/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/plotting.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/plotting_viser.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/figures/video_preview.png +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/1-background.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/2-mars.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/3-moon.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/5-space.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/6-earth.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/javascripts/parallax.js +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/logo.svg +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/assets/stylesheets/parallax.css +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/home.html +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/main.html +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/partials/parallax/hero.html +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/material/overrides/partials/parallax.html +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/mkdocs.yml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/config.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/discretization/discretization.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/expert/byof.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/expert/validation.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/solvers/cvxpy.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/lowerers/cvxpy.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/lowerers/jax.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/time.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/utils/cache.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/utils/caching.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/utils/printing.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx/utils/utils.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/pyproject.toml +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/setup.cfg +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/test_discretization.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/test_examples.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/test_expert.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/test_integrators.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/test_plotting.py +0 -0
- {openscvx-0.3.2.dev127 → openscvx-0.3.2.dev143}/tests/test_propagation.py +0 -0
|
@@ -178,3 +178,36 @@ While we do not strictly follow [test driven development (TDD)](https://en.wikip
|
|
|
178
178
|
For example, the [symbolic-expression layer](openscvx/symbolic/__init__.py) is well covered by [tests](tests/symbolic/) which were written simultaneously with the symbolic layer.
|
|
179
179
|
|
|
180
180
|
The extensive test suite helps ensure that new features and refactors don't break existing functionality.
|
|
181
|
+
|
|
182
|
+
#### Documentation
|
|
183
|
+
|
|
184
|
+
We use [MkDocs](https://www.mkdocs.org/) with [Material](https://squidfunk.github.io/mkdocs-material/) theme for documentation, hosted at [haynec.github.io/OpenSCvx](https://haynec.github.io/OpenSCvx/).
|
|
185
|
+
|
|
186
|
+
API reference is auto-generated from docstrings using [mkdocstrings](https://mkdocstrings.github.io/). Please use [Google-style docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) for all public functions and classes:
|
|
187
|
+
|
|
188
|
+
```python
|
|
189
|
+
def solve(self, max_iterations: int = 100) -> OptimizationResult:
|
|
190
|
+
"""Solve the trajectory optimization problem.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
max_iterations: Maximum number of SCP iterations.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
The optimization result containing the trajectory and convergence info.
|
|
197
|
+
|
|
198
|
+
Raises:
|
|
199
|
+
ConvergenceError: If the solver fails to converge.
|
|
200
|
+
"""
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
To preview documentation locally, first install the dependencies:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
pip install mkdocs-material mkdocstrings-python mkdocs-gen-files mkdocs-literate-nav mkdocs-section-index
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Then serve the documentation locally:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
mkdocs serve
|
|
213
|
+
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.3.2.
|
|
3
|
+
Version: 0.3.2.dev143
|
|
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.3.2.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 3, 2, '
|
|
31
|
+
__version__ = version = '0.3.2.dev143'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 3, 2, 'dev143')
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'gfab08d1d7'
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Successive convexification algorithms for trajectory optimization.
|
|
2
|
+
|
|
3
|
+
This module provides implementations of SCvx (Successive Convexification) algorithms
|
|
4
|
+
for solving non-convex trajectory optimization problems through iterative convex
|
|
5
|
+
approximation.
|
|
6
|
+
|
|
7
|
+
All algorithms inherit from :class:`Algorithm`, enabling pluggable algorithm
|
|
8
|
+
implementations and custom SCvx variants:
|
|
9
|
+
|
|
10
|
+
```python
|
|
11
|
+
class Algorithm(ABC):
|
|
12
|
+
@abstractmethod
|
|
13
|
+
def initialize(self, ocp, discretization_solver, jax_constraints,
|
|
14
|
+
solve_ocp, emitter, params, settings) -> None:
|
|
15
|
+
'''Store compiled infrastructure and warm-start solvers.'''
|
|
16
|
+
...
|
|
17
|
+
|
|
18
|
+
@abstractmethod
|
|
19
|
+
def step(self, state, params, settings) -> bool:
|
|
20
|
+
'''Execute one iteration using stored infrastructure.'''
|
|
21
|
+
...
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Immutable components (ocp, discretization_solver, jax_constraints, etc.) are stored
|
|
25
|
+
during ``initialize()``. Mutable configuration (params, settings) is passed per-step
|
|
26
|
+
to support runtime parameter updates and tolerance tuning.
|
|
27
|
+
|
|
28
|
+
:class:`AlgorithmState` holds mutable state during SCP iterations. Algorithms
|
|
29
|
+
that require additional state can subclass it:
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
@dataclass
|
|
33
|
+
class MyAlgorithmState(AlgorithmState):
|
|
34
|
+
my_custom_field: float = 0.0
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Note:
|
|
38
|
+
``AlgorithmState`` currently combines iteration metrics (costs, weights),
|
|
39
|
+
trajectory history, and discretization data. A future refactor may separate
|
|
40
|
+
these concerns into distinct classes for clearer data flow:
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
@dataclass
|
|
44
|
+
class AlgorithmState:
|
|
45
|
+
# Mutable iteration state
|
|
46
|
+
k: int
|
|
47
|
+
J_tr: float
|
|
48
|
+
J_vb: float
|
|
49
|
+
J_vc: float
|
|
50
|
+
w_tr: float
|
|
51
|
+
lam_cost: float
|
|
52
|
+
lam_vc: ...
|
|
53
|
+
lam_vb: float
|
|
54
|
+
|
|
55
|
+
@dataclass
|
|
56
|
+
class TrajectoryHistory:
|
|
57
|
+
# Accumulated trajectory solutions
|
|
58
|
+
X: List[np.ndarray]
|
|
59
|
+
U: List[np.ndarray]
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def x(self): return self.X[-1]
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def u(self): return self.U[-1]
|
|
66
|
+
|
|
67
|
+
@dataclass
|
|
68
|
+
class DebugHistory:
|
|
69
|
+
# Optional diagnostic data (discretization matrices, etc.)
|
|
70
|
+
V_history: List[np.ndarray]
|
|
71
|
+
VC_history: List[np.ndarray]
|
|
72
|
+
TR_history: List[np.ndarray]
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Current Implementations:
|
|
76
|
+
|
|
77
|
+
- :class:`PenalizedTrustRegion`: Penalized Trust Region (PTR) algorithm
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
from .base import Algorithm, AlgorithmState
|
|
81
|
+
from .optimization_results import OptimizationResults
|
|
82
|
+
from .penalized_trust_region import PenalizedTrustRegion
|
|
83
|
+
|
|
84
|
+
__all__ = [
|
|
85
|
+
# Base class
|
|
86
|
+
"Algorithm",
|
|
87
|
+
"AlgorithmState",
|
|
88
|
+
# Core results
|
|
89
|
+
"OptimizationResults",
|
|
90
|
+
# PTR algorithm
|
|
91
|
+
"PenalizedTrustRegion",
|
|
92
|
+
]
|
|
@@ -5,10 +5,10 @@ from typing import TYPE_CHECKING
|
|
|
5
5
|
from openscvx.config import Config
|
|
6
6
|
|
|
7
7
|
if TYPE_CHECKING:
|
|
8
|
-
from .
|
|
8
|
+
from .base import AlgorithmState
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
def update_scp_weights(state: "
|
|
11
|
+
def update_scp_weights(state: "AlgorithmState", settings: Config, scp_k: int):
|
|
12
12
|
"""Update SCP weights and cost parameters based on iteration number.
|
|
13
13
|
|
|
14
14
|
Args:
|
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Base class for successive convexification algorithms.
|
|
2
2
|
|
|
3
|
-
This module
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
accidental mutation of initial conditions.
|
|
3
|
+
This module defines the abstract interface that all SCP algorithm implementations
|
|
4
|
+
must follow, along with the AlgorithmState dataclass that holds mutable state
|
|
5
|
+
during SCP iterations.
|
|
7
6
|
"""
|
|
8
7
|
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
9
|
from dataclasses import dataclass, field
|
|
10
10
|
from typing import TYPE_CHECKING, List, Union
|
|
11
11
|
|
|
12
12
|
import numpy as np
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
|
+
import cvxpy as cp
|
|
16
|
+
|
|
15
17
|
from openscvx.config import Config
|
|
18
|
+
from openscvx.lowered.jax_constraints import LoweredJaxConstraints
|
|
16
19
|
|
|
17
20
|
|
|
18
21
|
@dataclass
|
|
19
|
-
class
|
|
22
|
+
class AlgorithmState:
|
|
20
23
|
"""Mutable state for SCP iterations.
|
|
21
24
|
|
|
22
25
|
This dataclass holds all state that changes during the solve process.
|
|
@@ -200,8 +203,8 @@ class SolverState:
|
|
|
200
203
|
return V_final[:, i3:i4].reshape(self.N - 1, self.n_x, self.n_u)
|
|
201
204
|
|
|
202
205
|
@classmethod
|
|
203
|
-
def from_settings(cls, settings: "Config") -> "
|
|
204
|
-
"""Create initial
|
|
206
|
+
def from_settings(cls, settings: "Config") -> "AlgorithmState":
|
|
207
|
+
"""Create initial algorithm state from configuration.
|
|
205
208
|
|
|
206
209
|
Copies only the trajectory arrays from settings, leaving all metadata
|
|
207
210
|
(bounds, boundary conditions, etc.) in the original settings object.
|
|
@@ -210,7 +213,7 @@ class SolverState:
|
|
|
210
213
|
settings: Configuration object containing initial guesses and SCP parameters
|
|
211
214
|
|
|
212
215
|
Returns:
|
|
213
|
-
Fresh
|
|
216
|
+
Fresh AlgorithmState initialized from settings with copied arrays
|
|
214
217
|
"""
|
|
215
218
|
return cls(
|
|
216
219
|
k=1,
|
|
@@ -230,3 +233,119 @@ class SolverState:
|
|
|
230
233
|
VC_history=[],
|
|
231
234
|
TR_history=[],
|
|
232
235
|
)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class Algorithm(ABC):
|
|
239
|
+
"""Abstract base class for successive convexification algorithms.
|
|
240
|
+
|
|
241
|
+
This class defines the interface for SCP algorithms used in trajectory
|
|
242
|
+
optimization. Implementations should remain minimal and functional,
|
|
243
|
+
delegating state management to the AlgorithmState dataclass.
|
|
244
|
+
|
|
245
|
+
The two core methods mirror the SCP workflow:
|
|
246
|
+
|
|
247
|
+
- initialize: Store compiled infrastructure and warm-start solvers
|
|
248
|
+
- step: Execute one convex subproblem iteration
|
|
249
|
+
|
|
250
|
+
Immutable components (ocp, discretization_solver, jax_constraints, etc.) are
|
|
251
|
+
stored during initialize(). Mutable configuration (params, settings) is passed
|
|
252
|
+
per-step to support runtime parameter updates and tolerance tuning.
|
|
253
|
+
|
|
254
|
+
!!! tip "Statefullness"
|
|
255
|
+
Avoid storing mutable iteration state (costs, weights, trajectories) on
|
|
256
|
+
``self``. All iteration state should live in :class:`AlgorithmState` or
|
|
257
|
+
a subclass thereof, passed explicitly to ``step()``. This keeps algorithm
|
|
258
|
+
classes stateless w.r.t. iteration, making data flow explicit and staying
|
|
259
|
+
close to functional programming principles where possible.
|
|
260
|
+
|
|
261
|
+
Example:
|
|
262
|
+
Implementing a custom algorithm::
|
|
263
|
+
|
|
264
|
+
class MyAlgorithm(Algorithm):
|
|
265
|
+
def initialize(self, ocp, discretization_solver,
|
|
266
|
+
jax_constraints, solve_ocp, emitter,
|
|
267
|
+
params, settings):
|
|
268
|
+
# Store compiled infrastructure
|
|
269
|
+
self._ocp = ocp
|
|
270
|
+
self._discretization_solver = discretization_solver
|
|
271
|
+
self._jax_constraints = jax_constraints
|
|
272
|
+
self._solve_ocp = solve_ocp
|
|
273
|
+
self._emitter = emitter
|
|
274
|
+
# Warm-start with initial params/settings...
|
|
275
|
+
|
|
276
|
+
def step(self, state, params, settings):
|
|
277
|
+
# Run one iteration using self._* and per-step params/settings
|
|
278
|
+
return converged
|
|
279
|
+
"""
|
|
280
|
+
|
|
281
|
+
@abstractmethod
|
|
282
|
+
def initialize(
|
|
283
|
+
self,
|
|
284
|
+
ocp: "cp.Problem",
|
|
285
|
+
discretization_solver: callable,
|
|
286
|
+
jax_constraints: "LoweredJaxConstraints",
|
|
287
|
+
solve_ocp: callable,
|
|
288
|
+
emitter: callable,
|
|
289
|
+
params: dict,
|
|
290
|
+
settings: "Config",
|
|
291
|
+
) -> None:
|
|
292
|
+
"""Initialize the algorithm and store compiled infrastructure.
|
|
293
|
+
|
|
294
|
+
This method stores immutable components and performs any setup required
|
|
295
|
+
before the SCP loop begins (e.g., warm-starting solvers). The params and
|
|
296
|
+
settings are passed for warm-start but may change between steps.
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
ocp: The CVXPy optimal control problem
|
|
300
|
+
discretization_solver: Compiled discretization solver function
|
|
301
|
+
jax_constraints: JIT-compiled JAX constraint functions
|
|
302
|
+
solve_ocp: Callable that solves the OCP (captures solver config)
|
|
303
|
+
emitter: Callback for emitting iteration progress data
|
|
304
|
+
params: Problem parameters dictionary (for warm-start only)
|
|
305
|
+
settings: Configuration object (for warm-start only)
|
|
306
|
+
"""
|
|
307
|
+
...
|
|
308
|
+
|
|
309
|
+
@abstractmethod
|
|
310
|
+
def step(
|
|
311
|
+
self,
|
|
312
|
+
state: AlgorithmState,
|
|
313
|
+
params: dict,
|
|
314
|
+
settings: "Config",
|
|
315
|
+
) -> bool:
|
|
316
|
+
"""Execute one iteration of the SCP algorithm.
|
|
317
|
+
|
|
318
|
+
This method solves a single convex subproblem, updates the algorithm
|
|
319
|
+
state in place, and returns whether convergence criteria are met.
|
|
320
|
+
|
|
321
|
+
Uses stored infrastructure (ocp, discretization_solver, etc.) with
|
|
322
|
+
per-step params and settings to support runtime modifications.
|
|
323
|
+
|
|
324
|
+
Args:
|
|
325
|
+
state: Mutable algorithm state (modified in place)
|
|
326
|
+
params: Problem parameters dictionary (may change between steps)
|
|
327
|
+
settings: Configuration object (may change between steps)
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
True if convergence criteria are satisfied, False otherwise.
|
|
331
|
+
"""
|
|
332
|
+
...
|
|
333
|
+
|
|
334
|
+
@abstractmethod
|
|
335
|
+
def citation(self) -> List[str]:
|
|
336
|
+
"""Return BibTeX citations for this algorithm.
|
|
337
|
+
|
|
338
|
+
Implementations should return a list of BibTeX entry strings for the
|
|
339
|
+
papers that should be cited when using this algorithm.
|
|
340
|
+
|
|
341
|
+
Returns:
|
|
342
|
+
List of BibTeX citation strings.
|
|
343
|
+
|
|
344
|
+
Example:
|
|
345
|
+
Getting citations for an algorithm::
|
|
346
|
+
|
|
347
|
+
algorithm = PenalizedTrustRegion()
|
|
348
|
+
for bibtex in algorithm.citation():
|
|
349
|
+
print(bibtex)
|
|
350
|
+
"""
|
|
351
|
+
...
|