openscvx 0.4.1.dev42__tar.gz → 0.4.1.dev45__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.dev42 → openscvx-0.4.1.dev45}/.github/workflows/_docs.yml +1 -1
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/lint.yml +1 -1
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/tests-integration.yml +1 -1
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/tests-unit.yml +1 -1
- {openscvx-0.4.1.dev42/openscvx.egg-info → openscvx-0.4.1.dev45}/PKG-INFO +108 -183
- openscvx-0.4.1.dev45/README.md +233 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/logo.py +30 -20
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/logo_utils/svg_path_utils.py +8 -3
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/plotting_viser.py +234 -162
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/_version.py +3 -3
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45/openscvx.egg-info}/PKG-INFO +108 -183
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_examples.py +10 -0
- openscvx-0.4.1.dev42/README.md +0 -308
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/assets/logo.svg +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/release-drafter.yml +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/branch-name.yml +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/docs.yml +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/nightly.yml +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.github/workflows/release.yml +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/.gitignore +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/CONTRIBUTING.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/LICENSE +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/discretization.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/ocp.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/scvx.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/favicon.png +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/assets/logo.svg +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/citation.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/examples.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/getting-started.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/index.md +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/docs/javascripts/mathjax.js +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/abstract/brachistochrone.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/arm/three_link_arm.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/car/dubins_car.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/car/dubins_car_conditional.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/car/dubins_car_stljax.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/cinema_vp.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/dr_vp.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/drone_racing.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/plotting.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/ctlos_cine.gif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/ctlos_dr.gif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/dtlos_cine.gif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/dtlos_dr.gif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/openscvx_logo.svg +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/openscvx_logo_square.png +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/figures/video_preview.png +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/javascripts/parallax.js +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/logo.svg +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/assets/stylesheets/parallax.css +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/home.html +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/main.html +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/partials/parallax/hero.html +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/material/overrides/partials/parallax.html +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/mkdocs.yml +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/__main__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/autotuning.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/base.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/algorithms/penalized_trust_region.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/config.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/discretization/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/discretization/discretization.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/expert/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/expert/byof.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/expert/lowering.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/expert/validation.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/init/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/init/interpolation.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/integrators/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/loader.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/parameters.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/problem.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/lowered/unified.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/plotting.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/problem.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/propagation/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/propagation/propagation.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/solvers/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/solvers/base.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/builder.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/hashing.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lower.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/problem.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/time.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/symbolic/unified.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/cache.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/caching.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/printing.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/profiling.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx/utils/utils.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/SOURCES.txt +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/pyproject.toml +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/scripts/gen_example_pages.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/scripts/gen_ref_pages.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/setup.cfg +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/symbolic/test_unified.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_autotuning.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_brachistochrone.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_discretization.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_expert.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_init.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_integrators.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_loader.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_optimization_results.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_plotting.py +0 -0
- {openscvx-0.4.1.dev42 → openscvx-0.4.1.dev45}/tests/test_propagation.py +0 -0
|
@@ -17,7 +17,7 @@ jobs:
|
|
|
17
17
|
fail-fast: false # Continue testing other examples even if one fails
|
|
18
18
|
matrix:
|
|
19
19
|
os: [ubuntu-latest, macos-latest]
|
|
20
|
-
python-version: ['3.11', '3.12', '3.13']
|
|
20
|
+
python-version: ['3.11', '3.12', '3.13', '3.14']
|
|
21
21
|
|
|
22
22
|
steps:
|
|
23
23
|
- name: Checkout repository
|
|
@@ -18,7 +18,7 @@ jobs:
|
|
|
18
18
|
fail-fast: false # Continue testing other versions even if one fails
|
|
19
19
|
matrix:
|
|
20
20
|
os: [ubuntu-latest, macos-latest]
|
|
21
|
-
python-version: ['3.11', '3.12', '3.13']
|
|
21
|
+
python-version: ['3.11', '3.12', '3.13', '3.14']
|
|
22
22
|
|
|
23
23
|
steps:
|
|
24
24
|
- name: Checkout repository
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 0.4.1.
|
|
3
|
+
Version: 0.4.1.dev45
|
|
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
|
|
@@ -60,248 +60,173 @@ Dynamic: license-file
|
|
|
60
60
|
<!-- PROJECT LOGO -->
|
|
61
61
|
<br />
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
## Getting Started
|
|
63
|
+
## What is OpenSCvx
|
|
65
64
|
|
|
66
|
-
|
|
65
|
+
OpenSCvx is a general python-based successive convexification implementation which uses a JAX backend.
|
|
66
|
+
It is designed to be easy to use for anyone and fast enough for everyone, all while being open and modular for contributors.
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
<summary>Stable</summary>
|
|
68
|
+
OpenSCvx provides a clean symbolic interface for problem definition which should be intuitive to users of NumPy, JAX, and CVXPY. This allows us to hide a lot of the under-the-hood magic away from the user while also providing a modular architecture, enabling contributors to focus on the algorithms without worrying about interface design.
|
|
70
69
|
|
|
71
|
-
|
|
70
|
+
OpenSCvx makes heavy use of [JAX](https://github.com/jax-ml/jax) to efficiently perform calculations in the successive convex programming loop through automatic differentiation, ahead-of-time (AOT) compilation, vectorization, and GPU acceleration. Behind this is a [CVXPY](https://github.com/cvxpy/cvxpy/)-based backend to solve the convex subproblems.
|
|
72
71
|
|
|
73
|
-
|
|
74
|
-
pip install openscvx
|
|
75
|
-
```
|
|
72
|
+
This is an open project and is under active development. Try it out, give us feedback, and help contribute.
|
|
76
73
|
|
|
77
|
-
|
|
74
|
+
```python
|
|
75
|
+
import openscvx as ox
|
|
78
76
|
|
|
79
|
-
|
|
77
|
+
g = 9.81
|
|
80
78
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
# Define states
|
|
80
|
+
position = ox.State("position", shape=(2,))
|
|
81
|
+
position.min = [0.0, 0.0]
|
|
82
|
+
position.max = [10.0, 10.0]
|
|
83
|
+
position.initial = [0.0, 10.0]
|
|
84
|
+
position.final = [10.0, 5.0]
|
|
84
85
|
|
|
85
|
-
|
|
86
|
+
velocity = ox.State("velocity", shape=(1,))
|
|
87
|
+
velocity.min = [0.0]
|
|
88
|
+
velocity.max = [10.0]
|
|
89
|
+
velocity.initial = [0.0]
|
|
90
|
+
velocity.final = [ox.Free(10.0)]
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
</details>
|
|
93
|
-
|
|
94
|
-
<details>
|
|
95
|
-
<summary>Nightly</summary>
|
|
92
|
+
# Define control (angle from vertical)
|
|
93
|
+
theta = ox.Control("theta", shape=(1,))
|
|
94
|
+
theta.min = [0.0]
|
|
95
|
+
theta.max = [1.755]
|
|
96
|
+
theta.guess = [[0.09], [1.755]]
|
|
96
97
|
|
|
97
|
-
|
|
98
|
+
# Define dynamics
|
|
99
|
+
dynamics = {
|
|
100
|
+
"position": ox.Concat(
|
|
101
|
+
velocity * ox.Sin(theta),
|
|
102
|
+
-velocity * ox.Cos(theta),
|
|
103
|
+
),
|
|
104
|
+
"velocity": g * ox.Cos(theta),
|
|
105
|
+
}
|
|
98
106
|
|
|
99
|
-
|
|
100
|
-
|
|
107
|
+
constraints = []
|
|
108
|
+
for state in [position, velocity]:
|
|
109
|
+
constraints.append(ox.ctcs(state <= state.max))
|
|
110
|
+
constraints.append(ox.ctcs(state.min <= state))
|
|
111
|
+
|
|
112
|
+
# Build and solve
|
|
113
|
+
problem = ox.Problem(
|
|
114
|
+
dynamics=dynamics,
|
|
115
|
+
constraints=constraints,
|
|
116
|
+
states=[position, velocity],
|
|
117
|
+
controls=[theta],
|
|
118
|
+
time=ox.Time(initial=0.0, final=ox.Minimize(2.0), min=0.0, max=2.0),
|
|
119
|
+
N=2,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
problem.initialize()
|
|
124
|
+
results = problem.solve()
|
|
125
|
+
results = problem.post_process()
|
|
101
126
|
```
|
|
102
127
|
|
|
103
|
-
|
|
128
|
+
## Installation
|
|
104
129
|
|
|
105
|
-
|
|
106
|
-
pip install --pre openscvx[gui,cvxpygen]
|
|
107
|
-
```
|
|
130
|
+
OpenSCvx is available on [PyPI](https://pypi.org/project/openscvx/) and can be trivially installed with pip.
|
|
108
131
|
|
|
109
|
-
|
|
132
|
+
It is recommended to install OpenSCvx inside a virtual environment (venv, conda, uv, *etc.*). If you don't already have one set up:
|
|
110
133
|
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
uv pip install --pre openscvx[gui,cvxpygen]
|
|
134
|
+
```bash
|
|
135
|
+
python3 -m venv .venv
|
|
136
|
+
source .venv/bin/activate
|
|
115
137
|
```
|
|
116
138
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
Alternatively, for local development with the latest source:
|
|
120
|
-
|
|
121
|
-
```sh
|
|
122
|
-
# Clone the repo
|
|
123
|
-
git clone https://github.com/OpenSCvx/OpenSCvx.git
|
|
124
|
-
cd OpenSCvx
|
|
139
|
+
### Using pip
|
|
125
140
|
|
|
126
|
-
|
|
127
|
-
pip install
|
|
128
|
-
# or with uv
|
|
129
|
-
uv pip install -e .
|
|
141
|
+
```bash
|
|
142
|
+
pip install openscvx
|
|
130
143
|
```
|
|
131
144
|
|
|
132
|
-
|
|
145
|
+
### Using uv
|
|
133
146
|
|
|
134
|
-
|
|
147
|
+
If you have [uv installed](https://docs.astral.sh/uv/getting-started/installation/) you can prefix the commands with `uv` for faster installation:
|
|
135
148
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
- `jax` - is used for determining the Jacobians using automatic differentiation, vectorization, and ahead-of-time (AOT) compilation of the dynamics and their Jacobians
|
|
140
|
-
- `numpy` - is used for numerical operations
|
|
141
|
-
- `diffrax` - is used for the numerical integration of the dynamics
|
|
142
|
-
- `termcolor` - is used for pretty command line output
|
|
143
|
-
- `plotly` - is used for all visualizations
|
|
144
|
-
|
|
145
|
-
These will be installed automatically, but can be installed via conda or pip if you are building from source.
|
|
149
|
+
```bash
|
|
150
|
+
uv pip install openscvx
|
|
151
|
+
```
|
|
146
152
|
|
|
147
|
-
|
|
153
|
+
> [!TIP]
|
|
154
|
+
> **Optional Dependencies**
|
|
155
|
+
>
|
|
156
|
+
> For GUI support or CVXPYGen code generation:
|
|
157
|
+
> ```bash
|
|
158
|
+
> pip install openscvx[gui,cvxpygen]
|
|
159
|
+
> ```
|
|
148
160
|
|
|
149
|
-
|
|
161
|
+
> [!TIP]
|
|
162
|
+
> **Nightly Builds**
|
|
163
|
+
>
|
|
164
|
+
> To install the latest development version (nightly), use the `--pre` flag:
|
|
165
|
+
> ```bash
|
|
166
|
+
> pip install --pre openscvx
|
|
167
|
+
> ```
|
|
150
168
|
|
|
151
|
-
|
|
152
|
-
- `PyQt5` - provides the Qt5 GUI framework for pyqtgraph
|
|
153
|
-
- `scipy` - is used for spatial transformations in plotting functions
|
|
154
|
-
- `PyOpenGL` - provides OpenGL bindings for Python, required for 3D plotting
|
|
155
|
-
- `PyOpenGL_accelerate` - (optional) speeds up PyOpenGL
|
|
169
|
+
## Installing From Source
|
|
156
170
|
|
|
171
|
+
### Using pip
|
|
157
172
|
|
|
158
|
-
|
|
173
|
+
```bash
|
|
174
|
+
git clone https://github.com/OpenSCvx/OpenSCvx.git
|
|
175
|
+
cd OpenSCvx
|
|
159
176
|
|
|
160
|
-
|
|
161
|
-
|
|
177
|
+
python3 -m venv .venv
|
|
178
|
+
source .venv/bin/activate
|
|
179
|
+
pip install -e .
|
|
162
180
|
```
|
|
163
181
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
For code generation and faster solver performance, CVXPYGen can be installed:
|
|
167
|
-
|
|
168
|
-
- `cvxpygen` - enables code generation for faster solver performance
|
|
169
|
-
- `qocogen` - custom solver backend for CVXPYGen (included with cvxpygen extras)
|
|
182
|
+
### Using uv
|
|
170
183
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
pip install openscvx[cvxpygen]
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
Or for both GUI and CVXPYGen:
|
|
184
|
+
```bash
|
|
185
|
+
git clone https://github.com/OpenSCvx/OpenSCvx.git
|
|
186
|
+
cd OpenSCvx
|
|
178
187
|
|
|
179
|
-
|
|
180
|
-
|
|
188
|
+
uv venv
|
|
189
|
+
source .venv/bin/activate
|
|
190
|
+
uv pip install -e .
|
|
181
191
|
```
|
|
182
192
|
|
|
183
|
-
|
|
184
|
-
- Automatic C++ code generation for optimization problems
|
|
185
|
-
- Faster solver performance through compiled code
|
|
186
|
-
- Support for custom solver backends like QOCOGen
|
|
193
|
+
## Getting Started
|
|
187
194
|
|
|
188
|
-
|
|
195
|
+
Check out the OpenSCvx documentation to help you get started
|
|
189
196
|
|
|
190
|
-
|
|
197
|
+
- [Getting Started Docs](https://openscvx.github.io/OpenSCvx/latest/getting-started/)
|
|
198
|
+
- [Users Guide](https://openscvx.github.io/OpenSCvx/latest/UsersGuide/00_introduction/)
|
|
199
|
+
- [API Reference](https://openscvx.github.io/OpenSCvx/latest/Reference/problem/)
|
|
191
200
|
|
|
192
|
-
|
|
193
|
-
git clone https://github.com/OpenSCvx/OpenSCvx.git
|
|
194
|
-
```
|
|
201
|
+
### Running the Examples
|
|
195
202
|
|
|
196
|
-
|
|
203
|
+
We also have a selection of problems in the `examples/` folder as well as on the [Examples page](https://openscvx.github.io/OpenSCvx/latest/Examples/abstract/brachistochrone/) of the documentation. The example trajectory optimization problems are grouped by application and represent some of the problem types that can be solved by OpenSCvx.
|
|
197
204
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
```
|
|
205
|
+
> [!Note]
|
|
206
|
+
> To run the examples, you'll need to clone this repository and install OpenSCvx in editable mode (`pip install -e .`). See the [Installing From Source](#installing-from-source) section above for detailed installation instructions.
|
|
201
207
|
|
|
202
|
-
Dependencies can then be installed using Conda or Pip
|
|
203
|
-
|
|
204
|
-
<details>
|
|
205
|
-
<summary>Via Conda</summary>
|
|
206
|
-
|
|
207
|
-
1. Clone the repo using https or ssh
|
|
208
|
-
2. Create a conda environment with Python:
|
|
209
|
-
```sh
|
|
210
|
-
conda create -n openscvx python>=3.9
|
|
211
|
-
```
|
|
212
|
-
3. Activate the environment:
|
|
213
|
-
```sh
|
|
214
|
-
conda activate openscvx
|
|
215
|
-
```
|
|
216
|
-
4. Install the package with dependencies:
|
|
217
|
-
```sh
|
|
218
|
-
pip install -e .
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
Or install with optional dependencies:
|
|
222
|
-
```sh
|
|
223
|
-
pip install -e ".[gui,cvxpygen]"
|
|
224
|
-
```
|
|
225
|
-
</details>
|
|
226
|
-
|
|
227
|
-
<details>
|
|
228
|
-
<summary>Via uv</summary>
|
|
229
|
-
|
|
230
|
-
1. Prerequisites
|
|
231
|
-
- Install [uv](https://docs.astral.sh/uv/getting-started/installation/)
|
|
232
|
-
2. Clone the repo using https or ssh
|
|
233
|
-
3. Create virtual environment and install the package:
|
|
234
|
-
```sh
|
|
235
|
-
uv venv
|
|
236
|
-
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
237
|
-
uv pip install -e .
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
Or install with optional dependencies:
|
|
241
|
-
```sh
|
|
242
|
-
uv pip install -e ".[gui,cvxpygen]"
|
|
243
|
-
```
|
|
244
|
-
</details>
|
|
245
|
-
|
|
246
|
-
<details>
|
|
247
|
-
<summary>Via pip</summary>
|
|
248
|
-
|
|
249
|
-
1. Prerequisites
|
|
250
|
-
Python >= 3.9
|
|
251
|
-
2. Clone the repo using https or ssh
|
|
252
|
-
3. Create virtual environment (called `venv` here) and source it
|
|
253
|
-
```sh
|
|
254
|
-
python3 -m venv venv
|
|
255
|
-
source venv/bin/activate
|
|
256
|
-
```
|
|
257
|
-
4. Install the package with dependencies:
|
|
258
|
-
```sh
|
|
259
|
-
pip install -e .
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
Or install with optional dependencies:
|
|
263
|
-
```sh
|
|
264
|
-
pip install -e ".[gui,cvxpygen]"
|
|
265
|
-
```
|
|
266
|
-
</details>
|
|
267
|
-
|
|
268
|
-
### Running Trajectory Optimization
|
|
269
|
-
|
|
270
|
-
See `examples/` folder for several example trajectory optimization problems grouped by application.
|
|
271
208
|
To run a problem simply run any of the examples directly, for example:
|
|
272
209
|
|
|
273
210
|
```sh
|
|
274
211
|
python3 examples/abstract/brachistochrone.py
|
|
275
212
|
```
|
|
276
213
|
|
|
277
|
-
> **Note:** To run the examples, you'll need to clone this repository and install OpenSCvx in editable mode (`pip install -e .`). See the [Local Development](#local-development) section above for detailed installation instructions.
|
|
278
|
-
|
|
279
214
|
and adjust the plotting as needed.
|
|
280
215
|
|
|
281
216
|
Check out the problem definitions inside `examples/` to see how to define your own problems.
|
|
282
217
|
|
|
283
218
|
## Code Structure
|
|
284
|
-
<img src="figures/oscvx_structure_full_dark.svg" width="1200"/>
|
|
285
|
-
|
|
286
|
-
## ToDos
|
|
287
219
|
|
|
288
|
-
|
|
289
|
-
- [X] Implement QOCOGen with CVPYGEN
|
|
290
|
-
- [X] Non-Dilated Time Propagation
|
|
291
|
-
- [X] Save and reload the compiled JAX code
|
|
292
|
-
- [x] Unified Mathematical Interface
|
|
293
|
-
- [ ] Auto-SCvx Weight Tuning
|
|
294
|
-
- [ ] Compiled at the subproblem level with JAX
|
|
295
|
-
- [ ] Single Shot propagation
|
|
220
|
+
<img src="figures/oscvx_structure_full_dark.svg" width="1200"/>
|
|
296
221
|
|
|
297
222
|
## What is implemented
|
|
298
223
|
|
|
299
224
|
This repo has the following features:
|
|
300
225
|
|
|
301
226
|
1. Free Final Time
|
|
302
|
-
2. Fully adaptive time dilation (
|
|
227
|
+
2. Fully adaptive time dilation (`s` is appended to the control vector)
|
|
303
228
|
3. Continuous-Time Constraint Satisfaction
|
|
304
|
-
4. FOH and ZOH exact discretization (
|
|
229
|
+
4. FOH and ZOH exact discretization (`t` is a state so you can bring your own scheme)
|
|
305
230
|
6. Vectorized and Ahead-of-Time (AOT) Compiled Multishooting Discretization
|
|
306
231
|
7. JAX Autodiff for Jacobians
|
|
307
232
|
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
<a id="readme-top"></a>
|
|
2
|
+
|
|
3
|
+
<img src="figures/openscvx_logo.svg" width="1200"/>
|
|
4
|
+
<p align="center">
|
|
5
|
+
<a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/lint.yml/badge.svg"/></a>
|
|
6
|
+
<a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-unit.yml/badge.svg"/></a>
|
|
7
|
+
<a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/tests-integration.yml/badge.svg"/></a>
|
|
8
|
+
<a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/nightly.yml/badge.svg"/></a>
|
|
9
|
+
<a href="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml"><img src="https://github.com/OpenSCvx/OpenSCvx/actions/workflows/release.yml/badge.svg?event=release"/></a>
|
|
10
|
+
</p>
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://arxiv.org/abs/2410.22596"><img src="http://img.shields.io/badge/arXiv-2410.22596-B31B1B.svg"/></a>
|
|
13
|
+
<a href="https://www.apache.org/licenses/LICENSE-2.0"><img src="https://img.shields.io/badge/License-Apache_2.0-blue.svg" alt="License: Apache 2.0"/></a>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
<!-- PROJECT LOGO -->
|
|
17
|
+
<br />
|
|
18
|
+
|
|
19
|
+
## What is OpenSCvx
|
|
20
|
+
|
|
21
|
+
OpenSCvx is a general python-based successive convexification implementation which uses a JAX backend.
|
|
22
|
+
It is designed to be easy to use for anyone and fast enough for everyone, all while being open and modular for contributors.
|
|
23
|
+
|
|
24
|
+
OpenSCvx provides a clean symbolic interface for problem definition which should be intuitive to users of NumPy, JAX, and CVXPY. This allows us to hide a lot of the under-the-hood magic away from the user while also providing a modular architecture, enabling contributors to focus on the algorithms without worrying about interface design.
|
|
25
|
+
|
|
26
|
+
OpenSCvx makes heavy use of [JAX](https://github.com/jax-ml/jax) to efficiently perform calculations in the successive convex programming loop through automatic differentiation, ahead-of-time (AOT) compilation, vectorization, and GPU acceleration. Behind this is a [CVXPY](https://github.com/cvxpy/cvxpy/)-based backend to solve the convex subproblems.
|
|
27
|
+
|
|
28
|
+
This is an open project and is under active development. Try it out, give us feedback, and help contribute.
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
import openscvx as ox
|
|
32
|
+
|
|
33
|
+
g = 9.81
|
|
34
|
+
|
|
35
|
+
# Define states
|
|
36
|
+
position = ox.State("position", shape=(2,))
|
|
37
|
+
position.min = [0.0, 0.0]
|
|
38
|
+
position.max = [10.0, 10.0]
|
|
39
|
+
position.initial = [0.0, 10.0]
|
|
40
|
+
position.final = [10.0, 5.0]
|
|
41
|
+
|
|
42
|
+
velocity = ox.State("velocity", shape=(1,))
|
|
43
|
+
velocity.min = [0.0]
|
|
44
|
+
velocity.max = [10.0]
|
|
45
|
+
velocity.initial = [0.0]
|
|
46
|
+
velocity.final = [ox.Free(10.0)]
|
|
47
|
+
|
|
48
|
+
# Define control (angle from vertical)
|
|
49
|
+
theta = ox.Control("theta", shape=(1,))
|
|
50
|
+
theta.min = [0.0]
|
|
51
|
+
theta.max = [1.755]
|
|
52
|
+
theta.guess = [[0.09], [1.755]]
|
|
53
|
+
|
|
54
|
+
# Define dynamics
|
|
55
|
+
dynamics = {
|
|
56
|
+
"position": ox.Concat(
|
|
57
|
+
velocity * ox.Sin(theta),
|
|
58
|
+
-velocity * ox.Cos(theta),
|
|
59
|
+
),
|
|
60
|
+
"velocity": g * ox.Cos(theta),
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
constraints = []
|
|
64
|
+
for state in [position, velocity]:
|
|
65
|
+
constraints.append(ox.ctcs(state <= state.max))
|
|
66
|
+
constraints.append(ox.ctcs(state.min <= state))
|
|
67
|
+
|
|
68
|
+
# Build and solve
|
|
69
|
+
problem = ox.Problem(
|
|
70
|
+
dynamics=dynamics,
|
|
71
|
+
constraints=constraints,
|
|
72
|
+
states=[position, velocity],
|
|
73
|
+
controls=[theta],
|
|
74
|
+
time=ox.Time(initial=0.0, final=ox.Minimize(2.0), min=0.0, max=2.0),
|
|
75
|
+
N=2,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
problem.initialize()
|
|
80
|
+
results = problem.solve()
|
|
81
|
+
results = problem.post_process()
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Installation
|
|
85
|
+
|
|
86
|
+
OpenSCvx is available on [PyPI](https://pypi.org/project/openscvx/) and can be trivially installed with pip.
|
|
87
|
+
|
|
88
|
+
It is recommended to install OpenSCvx inside a virtual environment (venv, conda, uv, *etc.*). If you don't already have one set up:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
python3 -m venv .venv
|
|
92
|
+
source .venv/bin/activate
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Using pip
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
pip install openscvx
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Using uv
|
|
102
|
+
|
|
103
|
+
If you have [uv installed](https://docs.astral.sh/uv/getting-started/installation/) you can prefix the commands with `uv` for faster installation:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
uv pip install openscvx
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
> [!TIP]
|
|
110
|
+
> **Optional Dependencies**
|
|
111
|
+
>
|
|
112
|
+
> For GUI support or CVXPYGen code generation:
|
|
113
|
+
> ```bash
|
|
114
|
+
> pip install openscvx[gui,cvxpygen]
|
|
115
|
+
> ```
|
|
116
|
+
|
|
117
|
+
> [!TIP]
|
|
118
|
+
> **Nightly Builds**
|
|
119
|
+
>
|
|
120
|
+
> To install the latest development version (nightly), use the `--pre` flag:
|
|
121
|
+
> ```bash
|
|
122
|
+
> pip install --pre openscvx
|
|
123
|
+
> ```
|
|
124
|
+
|
|
125
|
+
## Installing From Source
|
|
126
|
+
|
|
127
|
+
### Using pip
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
git clone https://github.com/OpenSCvx/OpenSCvx.git
|
|
131
|
+
cd OpenSCvx
|
|
132
|
+
|
|
133
|
+
python3 -m venv .venv
|
|
134
|
+
source .venv/bin/activate
|
|
135
|
+
pip install -e .
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Using uv
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
git clone https://github.com/OpenSCvx/OpenSCvx.git
|
|
142
|
+
cd OpenSCvx
|
|
143
|
+
|
|
144
|
+
uv venv
|
|
145
|
+
source .venv/bin/activate
|
|
146
|
+
uv pip install -e .
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Getting Started
|
|
150
|
+
|
|
151
|
+
Check out the OpenSCvx documentation to help you get started
|
|
152
|
+
|
|
153
|
+
- [Getting Started Docs](https://openscvx.github.io/OpenSCvx/latest/getting-started/)
|
|
154
|
+
- [Users Guide](https://openscvx.github.io/OpenSCvx/latest/UsersGuide/00_introduction/)
|
|
155
|
+
- [API Reference](https://openscvx.github.io/OpenSCvx/latest/Reference/problem/)
|
|
156
|
+
|
|
157
|
+
### Running the Examples
|
|
158
|
+
|
|
159
|
+
We also have a selection of problems in the `examples/` folder as well as on the [Examples page](https://openscvx.github.io/OpenSCvx/latest/Examples/abstract/brachistochrone/) of the documentation. The example trajectory optimization problems are grouped by application and represent some of the problem types that can be solved by OpenSCvx.
|
|
160
|
+
|
|
161
|
+
> [!Note]
|
|
162
|
+
> To run the examples, you'll need to clone this repository and install OpenSCvx in editable mode (`pip install -e .`). See the [Installing From Source](#installing-from-source) section above for detailed installation instructions.
|
|
163
|
+
|
|
164
|
+
To run a problem simply run any of the examples directly, for example:
|
|
165
|
+
|
|
166
|
+
```sh
|
|
167
|
+
python3 examples/abstract/brachistochrone.py
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
and adjust the plotting as needed.
|
|
171
|
+
|
|
172
|
+
Check out the problem definitions inside `examples/` to see how to define your own problems.
|
|
173
|
+
|
|
174
|
+
## Code Structure
|
|
175
|
+
|
|
176
|
+
<img src="figures/oscvx_structure_full_dark.svg" width="1200"/>
|
|
177
|
+
|
|
178
|
+
## What is implemented
|
|
179
|
+
|
|
180
|
+
This repo has the following features:
|
|
181
|
+
|
|
182
|
+
1. Free Final Time
|
|
183
|
+
2. Fully adaptive time dilation (`s` is appended to the control vector)
|
|
184
|
+
3. Continuous-Time Constraint Satisfaction
|
|
185
|
+
4. FOH and ZOH exact discretization (`t` is a state so you can bring your own scheme)
|
|
186
|
+
6. Vectorized and Ahead-of-Time (AOT) Compiled Multishooting Discretization
|
|
187
|
+
7. JAX Autodiff for Jacobians
|
|
188
|
+
|
|
189
|
+
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
|
190
|
+
|
|
191
|
+
## Acknowledgements
|
|
192
|
+
|
|
193
|
+
This work was supported by a NASA Space Technology Graduate Research Opportunity and the Office of Naval Research under grant N00014-17-1-2433. The authors would like to acknowledge Natalia Pavlasek, Fabio Spada, Samuel Buckner, Abhi Kamath, Govind Chari, and Purnanand Elango as well as the other Autonomous Controls Laboratory members, for their many helpful discussions and support throughout this work.
|
|
194
|
+
|
|
195
|
+
## Citation
|
|
196
|
+
|
|
197
|
+
Please cite the following works if you use the repository,
|
|
198
|
+
|
|
199
|
+
```tex
|
|
200
|
+
@ARTICLE{hayner2025los,
|
|
201
|
+
author={Hayner, Christopher R. and Carson III, John M. and Açıkmeşe, Behçet and Leung, Karen},
|
|
202
|
+
journal={IEEE Robotics and Automation Letters},
|
|
203
|
+
title={Continuous-Time Line-of-Sight Constrained Trajectory Planning for 6-Degree of Freedom Systems},
|
|
204
|
+
year={2025},
|
|
205
|
+
volume={},
|
|
206
|
+
number={},
|
|
207
|
+
pages={1-8},
|
|
208
|
+
keywords={Robot sensing systems;Vectors;Vehicle dynamics;Line-of-sight propagation;Trajectory planning;Trajectory optimization;Quadrotors;Nonlinear dynamical systems;Heuristic algorithms;Convergence;Constrained Motion Planning;Optimization and Optimal Control;Aerial Systems: Perception and Autonomy},
|
|
209
|
+
doi={10.1109/LRA.2025.3545299}}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
```tex
|
|
213
|
+
@misc{elango2024ctscvx,
|
|
214
|
+
title={Successive Convexification for Trajectory Optimization with Continuous-Time Constraint Satisfaction},
|
|
215
|
+
author={Purnanand Elango and Dayou Luo and Abhinav G. Kamath and Samet Uzun and Taewan Kim and Behçet Açıkmeşe},
|
|
216
|
+
year={2024},
|
|
217
|
+
eprint={2404.16826},
|
|
218
|
+
archivePrefix={arXiv},
|
|
219
|
+
primaryClass={math.OC},
|
|
220
|
+
url={https://arxiv.org/abs/2404.16826},
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
```tex
|
|
225
|
+
@misc{chari2025qoco,
|
|
226
|
+
title = {QOCO: A Quadratic Objective Conic Optimizer with Custom Solver Generation},
|
|
227
|
+
author = {Chari, Govind M and A{\c{c}}{\i}kme{\c{s}}e, Beh{\c{c}}et},
|
|
228
|
+
year = {2025},
|
|
229
|
+
eprint = {2503.12658},
|
|
230
|
+
archiveprefix = {arXiv},
|
|
231
|
+
primaryclass = {math.OC},
|
|
232
|
+
}
|
|
233
|
+
```
|