openscvx 2.dev1__tar.gz → 2.dev2__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-2.dev1/openscvx.egg-info → openscvx-2.dev2}/PKG-INFO +1 -1
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/abstract/brachistochrone.py +13 -4
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/rocket/6DoF_pdg.py +58 -46
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/_version.py +3 -3
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/penalized_trust_region.py +32 -3
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/hashing.py +16 -3
- {openscvx-2.dev1 → openscvx-2.dev2/openscvx.egg-info}/PKG-INFO +1 -1
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/expr/test_gmsr.py +12 -7
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_stl.py +1 -1
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_brachistochrone.py +5 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/assets/logo.svg +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/release-drafter.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/_docs.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/branch-name.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/docs.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/lint.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/nightly.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/release-drafter.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/release.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/tests-integration.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.github/workflows/tests-unit.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.gitignore +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/.gitmodules +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/CONTRIBUTING.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/LICENSE +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/README.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/constraint_reformulation.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/control_parameterization.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/discretization.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/ocp.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/scvx.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/Foundations/time_dilation.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UnderTheHood/lowering_architecture.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/00_introduction.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/01_hello_world_brachistochrone.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/02_drone_racing_constraints.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/03_obstacle_avoidance_vmap.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/04_viewpoint_constraints.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/05_visualization.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/06_logic.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/07_lie.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/UsersGuide/08_mpcc.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/favicon.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/ct-scvx_dark.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/ct-scvx_light.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/ctcs_dark.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/ctcs_light.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/problem_class_dark.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/images/problem_class_light.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/logo.svg +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/openscvx_logo_square.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/viser-client/index.html +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/viser-recordings/drone_racing.viser +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/citation.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/examples.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/index.md +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/javascripts/mathjax.js +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/docs/versions.json +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/_viser_embed_export.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/abstract/impulsive.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/abstract/stl_integer_variable.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/abstract/stl_or.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/7_dof_arm.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/_camera.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/_render.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/_sensor_view.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/dr_vp_polytope.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/franka_fr3v2_pick_place.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/logo.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/animations/obstacle_avoidance_vmap.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/3_dof_arm.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/7_dof_arm.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/7_dof_arm_collision.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/7_dof_arm_vp.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/franka_fr3v2_pick_place.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/arm/franka_fr3v2_viewplanning.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_disjoint.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_obstacle_conditional.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_obstacle_stl.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_stl_or.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/car/dubins_car_waypoint_stl.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/cinema_vp.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/dr_double_integrator.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/dr_vp.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/dr_vp_nodal.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/dr_vp_polytope.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/drone_racing.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/logo.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/logo_utils/acl_logo.svg +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/logo_utils/svg_path_utils.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/obstacle_avoidance.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/obstacle_avoidance_nodal.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/drone/obstacle_avoidance_vmap.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/cartpole_mjx.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/double_cartpole_mjx.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/skydio_x2_mjx.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/triple_cartpole_3d_mjx.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/triple_cartpole_game.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mjx/triple_cartpole_mjx.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/double_integrator_discrete.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/double_integrator_drone_racing.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/dubins_car_circle_analytical.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/dubins_car_circle_discrete.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/mpc/realtime_double_integrator_drone_racing.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/plotting.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/plotting_viser.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/3DoF_pdg_realtime.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/6DoF_pdg_realtime.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/3DoF_pdg_realtime_base.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/6DoF_pdg_realtime_base.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/cinema_vp_realtime_base.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/drone_racing_realtime_base.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/dubins_car_realtime_base.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/base_problems/obstacle_avoidance_realtime_base.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/cinema_vp_realtime.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/drone_racing_realtime.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/dubins_car_realtime.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/rocket/3DoF_pdg.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/spacecraft/halo_orbit.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/spacecraft/hohmann_transfer.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/examples/spacecraft/proxops_cw.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/figures/ctlos_cine.gif +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/figures/ctlos_dr.gif +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/figures/dtlos_cine.gif +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/figures/dtlos_dr.gif +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/figures/openscvx_logo.svg +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/figures/openscvx_logo_square.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/figures/oscvx_structure_full_dark.svg +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/figures/video_preview.png +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/assets/stylesheets/custom.css +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/assets/stylesheets/home-dropin.css +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/assets/stylesheets/home-hero.css +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/assets/stylesheets/home-viser.css +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/home.html +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/main.html +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-diagram.html +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-dropin-banner.html +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-hero.html +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-pipeline.html +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/material/overrides/partials/home-viser-strip.html +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/mkdocs.yml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/__main__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/augmented_lagrangian.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/base.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/constant_proximal_weight.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/optimization_results.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/ramp_proximal_weight.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/algorithms/weights.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/config.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/base.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/discretize_linearize.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/linearize_discretize.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/linearize_discretize_sparse.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/sparse_utils/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/sparse_utils/bcoo_helpers.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/discretization/sparse_utils/sparse_jacobian.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/expert/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/expert/byof.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/expert/lowering.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/expert/validation.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/init/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/init/interpolation.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/init/inverse_kinematics.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrations/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrations/menagerie.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrations/mjx.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrators/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrators/diffrax.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/integrators/runge_kutta.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/loader.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/cvxpy_constraints.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/cvxpy_variables.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/dynamics.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/jax_constraints.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/parameters.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/problem.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/lowered/unified.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/plotting.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/scp_iteration.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/animated.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/orbits.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/plotly_integration.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/primitives.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/scp.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/plotting/viser/server.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/problem.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/propagation/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/propagation/post_processing.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/propagation/propagation.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/solvers/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/solvers/base.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/solvers/ptr_solver.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/augmentation.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/builder.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/constraint_set.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/arithmetic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/array.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/constraint.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/control.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/expr.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/lie/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/lie/se3.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/lie/so3.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/linalg.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/logic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/math.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/parameter.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/spatial.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/state.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/stl.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/stljax.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/time.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/variable.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/expr/vmap.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lower.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/_lowerer.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/_registry.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/arithmetic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/array.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/constraint.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/control.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/expr.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/linalg.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/logic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/math.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/cvxpy/state.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/_lowerer.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/_registry.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/arithmetic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/array.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/constraint.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/control.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/expr.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/lie.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/linalg.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/logic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/math.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/spatial.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/state.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/stl.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/stljax.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/lowerers/jax/vmap.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/_registry.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/array.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/constraint.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/lie.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/linalg.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/logic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/math.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/parser.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/spatial.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/stl.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/stljax.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/parser/tokenizer.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/preprocessing.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/problem.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/sparsity.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/symbolic/unified.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/cache.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/caching.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/printing.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/profiling.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx/utils/utils.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/SOURCES.txt +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/dependency_links.txt +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/entry_points.txt +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/requires.txt +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/openscvx.egg-info/top_level.txt +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/pyproject.toml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/scripts/gen_example_pages.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/scripts/gen_ref_pages.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/scripts/mkdocs_copy_viser_client_hook.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/setup.cfg +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/brachistochrone_analytical.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/expr/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/fixtures/brachistochrone.json +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/fixtures/brachistochrone.yaml +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/hohmann_analytical.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/integrations/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/integrations/test_mjx.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_arithmetic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_array.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_constraint.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_expr.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_lie.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_linalg.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_logic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_math.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_node_reference.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_parameters.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_scaling.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_spatial.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_variable.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/expr/test_vmap.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/__init__.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_array.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_constraint.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_lie.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_linalg.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_load.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_logic.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_math.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_parser.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_spatial.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_stl.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_tokenizer.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/parser/test_vmap.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_augmentation.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_hashing.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_lower_cvxpy.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_lower_jax.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_preprocessing.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_sparsity.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/symbolic/test_unified.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_autotuning.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_cvxpygen_optional.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_discretization.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_examples.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_expert.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_impulsive.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_init.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_integrators.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_loader.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_optimization_results.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_plotting.py +0 -0
- {openscvx-2.dev1 → openscvx-2.dev2}/tests/test_propagation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.dev2
|
|
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
|
|
@@ -84,16 +84,25 @@ problem = Problem(
|
|
|
84
84
|
time=time,
|
|
85
85
|
constraints=constraint_exprs,
|
|
86
86
|
N=n,
|
|
87
|
-
|
|
87
|
+
float_dtype="float64",
|
|
88
88
|
algorithm={
|
|
89
89
|
"autotuner": "ConstantProximalWeight",
|
|
90
90
|
"lam_prox": 1e0,
|
|
91
|
-
"lam_cost":
|
|
91
|
+
"lam_cost": 6e-1,
|
|
92
|
+
# Tighter SCP stopping: reduces platform-dependent early exit vs analytical cycloid
|
|
93
|
+
"ep_tr": 1e-5,
|
|
94
|
+
"ep_vb": 1e-5,
|
|
95
|
+
"ep_vc": 1e-9,
|
|
96
|
+
},
|
|
97
|
+
solver={
|
|
98
|
+
"solver_args": {
|
|
99
|
+
"enforce_dpp": True,
|
|
100
|
+
"abstol": 1e-8,
|
|
101
|
+
"reltol": 1e-10,
|
|
102
|
+
},
|
|
92
103
|
},
|
|
93
104
|
)
|
|
94
105
|
|
|
95
|
-
problem.settings.prp.dt = 0.01
|
|
96
|
-
|
|
97
106
|
plotting_dict = {}
|
|
98
107
|
|
|
99
108
|
if __name__ == "__main__":
|
|
@@ -5,10 +5,6 @@
|
|
|
5
5
|
This example was adapted from the SCvxGEN repository by Abhi Kamath, https://scvxgen.mintlify.app/introduction.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
import jax
|
|
9
|
-
|
|
10
|
-
jax.config.update("jax_enable_x64", True)
|
|
11
|
-
|
|
12
8
|
import os
|
|
13
9
|
import sys
|
|
14
10
|
|
|
@@ -28,34 +24,30 @@ from openscvx import Problem
|
|
|
28
24
|
|
|
29
25
|
n = 5
|
|
30
26
|
|
|
31
|
-
#
|
|
32
|
-
gI =
|
|
33
|
-
l_arm =
|
|
34
|
-
J_diag =
|
|
35
|
-
"J_diag",
|
|
36
|
-
shape=(3,),
|
|
37
|
-
value=np.array([0.168 * 2e-2, 0.168, 0.168]),
|
|
38
|
-
)
|
|
27
|
+
# Fixed physical and scenario constants
|
|
28
|
+
gI = 1.0
|
|
29
|
+
l_arm = 0.25
|
|
30
|
+
J_diag = np.array([0.168 * 2e-2, 0.168, 0.168])
|
|
39
31
|
J_mat = ox.Diag(J_diag)
|
|
40
32
|
J_inv_mat = ox.Inv(ox.Diag(J_diag))
|
|
41
|
-
g0 =
|
|
42
|
-
Isp =
|
|
43
|
-
m_dry =
|
|
44
|
-
v_max =
|
|
45
|
-
w_max =
|
|
46
|
-
del_max =
|
|
47
|
-
theta_max =
|
|
48
|
-
T_min =
|
|
49
|
-
T_max =
|
|
50
|
-
gamma =
|
|
51
|
-
beta =
|
|
52
|
-
c_ax =
|
|
53
|
-
c_ayz =
|
|
54
|
-
S_a =
|
|
55
|
-
rho =
|
|
56
|
-
l_p =
|
|
57
|
-
initial_position =
|
|
58
|
-
final_position =
|
|
33
|
+
g0 = 1.0
|
|
34
|
+
Isp = 30.0
|
|
35
|
+
m_dry = 1.0
|
|
36
|
+
v_max = 3.0
|
|
37
|
+
w_max = 0.3752
|
|
38
|
+
del_max = 20.0
|
|
39
|
+
theta_max = 75.0
|
|
40
|
+
T_min = 1.5
|
|
41
|
+
T_max = 6.5
|
|
42
|
+
gamma = 75.0
|
|
43
|
+
beta = 0.01
|
|
44
|
+
c_ax = 0.5
|
|
45
|
+
c_ayz = 1.0
|
|
46
|
+
S_a = 0.5
|
|
47
|
+
rho = 1.0
|
|
48
|
+
l_p = 0.05
|
|
49
|
+
initial_position = np.array([7.5, 4.5, 2.5])
|
|
50
|
+
final_position = np.array([0.0, 0.0])
|
|
59
51
|
|
|
60
52
|
# Concat (not Stack): JAX lowering stacks scalars as (3,1); Diag needs a length-3 vector (3,).
|
|
61
53
|
CA = ox.Diag(ox.Concat(c_ax, c_ayz, c_ayz))
|
|
@@ -72,15 +64,15 @@ position = ox.State("position", shape=(3,))
|
|
|
72
64
|
position.max = [10.0, 10.0, 10.0]
|
|
73
65
|
position.min = [-10.0, -10.0, -10.0]
|
|
74
66
|
position.initial = [
|
|
75
|
-
ox.Free(float(initial_position
|
|
76
|
-
ox.Free(float(initial_position
|
|
77
|
-
ox.Free(float(initial_position
|
|
67
|
+
ox.Free(float(initial_position[0])),
|
|
68
|
+
ox.Free(float(initial_position[1])),
|
|
69
|
+
ox.Free(float(initial_position[2])),
|
|
78
70
|
]
|
|
79
71
|
position.final = [ox.Free(0.0), ox.Free(0.0), 0.0]
|
|
80
72
|
|
|
81
73
|
velocity = ox.State("velocity", shape=(3,))
|
|
82
|
-
velocity.max = [v_max
|
|
83
|
-
velocity.min = [-v_max
|
|
74
|
+
velocity.max = [v_max, v_max, v_max]
|
|
75
|
+
velocity.min = [-v_max, -v_max, -v_max]
|
|
84
76
|
velocity.initial = [-0.5, -2.8, 0.0]
|
|
85
77
|
velocity.final = [-0.1, 0.0, 0.0]
|
|
86
78
|
|
|
@@ -91,17 +83,17 @@ attitude.initial = [ox.Free(0.0), ox.Free(0.0), ox.Free(0.0), ox.Free(1.0)]
|
|
|
91
83
|
attitude.final = [0.0, 0.0, 0.0, 1.0]
|
|
92
84
|
|
|
93
85
|
angular_velocity = ox.State("angular_velocity", shape=(3,))
|
|
94
|
-
angular_velocity.max = [w_max
|
|
95
|
-
angular_velocity.min = [-w_max
|
|
86
|
+
angular_velocity.max = [w_max, w_max, w_max]
|
|
87
|
+
angular_velocity.min = [-w_max, -w_max, -w_max]
|
|
96
88
|
angular_velocity.initial = [1e-8, 0.0, 0.0]
|
|
97
89
|
angular_velocity.final = [1e-8, 0.0, 0.0]
|
|
98
90
|
|
|
99
91
|
thrust = ox.Control("thrust", shape=(3,))
|
|
100
|
-
thrust.max = [T_max
|
|
101
|
-
thrust.min = [-T_max
|
|
92
|
+
thrust.max = [T_max, T_max, T_max]
|
|
93
|
+
thrust.min = [-T_max, -T_max, -T_max]
|
|
102
94
|
thrust.guess = np.linspace(
|
|
103
|
-
np.array([gI
|
|
104
|
-
np.array([gI
|
|
95
|
+
np.array([gI * mass.initial[0], 0, 0]),
|
|
96
|
+
np.array([gI * m_dry, 0, 0]),
|
|
105
97
|
n,
|
|
106
98
|
).reshape(-1, 3)
|
|
107
99
|
|
|
@@ -169,15 +161,26 @@ constraint_exprs.append((position[0:2] == final_position).convex().at([n - 1]))
|
|
|
169
161
|
|
|
170
162
|
constraint_exprs.append(ox.ctcs(1.0 * (mass - m_dry) >= 0))
|
|
171
163
|
constraint_exprs.append(
|
|
172
|
-
ox.ctcs(
|
|
164
|
+
ox.ctcs(
|
|
165
|
+
0.1 * ox.linalg.Norm(position[1:])
|
|
166
|
+
- ox.Tan(ox.Constant(np.array(gamma * np.pi / 180.0))) * position[0]
|
|
167
|
+
<= 0
|
|
168
|
+
)
|
|
173
169
|
)
|
|
174
170
|
constraint_exprs.append(ox.ctcs(0.1 * ox.linalg.Norm(velocity) ** 2 - v_max**2 <= 0))
|
|
175
171
|
constraint_exprs.append(
|
|
176
|
-
ox.ctcs(
|
|
172
|
+
ox.ctcs(
|
|
173
|
+
1.0 * ox.Cos(ox.Constant(np.array(theta_max * np.pi / 180.0))) - 1.0 + 2.0 * (q2**2 + q3**2)
|
|
174
|
+
<= 0
|
|
175
|
+
)
|
|
177
176
|
)
|
|
178
177
|
constraint_exprs.append(ox.ctcs(1.0 * ox.linalg.Norm(angular_velocity) ** 2 - w_max**2 <= 0))
|
|
179
178
|
constraint_exprs.append(
|
|
180
|
-
ox.ctcs(
|
|
179
|
+
ox.ctcs(
|
|
180
|
+
0.1 * ox.linalg.Norm(thrust)
|
|
181
|
+
- thrust[0] / ox.Cos(ox.Constant(np.array(del_max * np.pi / 180.0)))
|
|
182
|
+
<= 0
|
|
183
|
+
)
|
|
181
184
|
)
|
|
182
185
|
constraint_exprs.append(ox.ctcs(0.1 * ox.linalg.Norm(thrust) ** 2 - T_max**2 <= 0))
|
|
183
186
|
constraint_exprs.append(ox.ctcs(0.1 * T_min**2 - ox.linalg.Norm(thrust) ** 2 <= 0))
|
|
@@ -194,6 +197,8 @@ time = ox.Time(
|
|
|
194
197
|
time_dilation_max=2.0 * t_final_guess,
|
|
195
198
|
)
|
|
196
199
|
|
|
200
|
+
import diffrax as dfx # noqa: F401
|
|
201
|
+
|
|
197
202
|
problem = Problem(
|
|
198
203
|
N=n,
|
|
199
204
|
states=states,
|
|
@@ -210,10 +215,17 @@ problem = Problem(
|
|
|
210
215
|
"ep_tr": 5e-3,
|
|
211
216
|
"ep_vc": 1e-6,
|
|
212
217
|
},
|
|
218
|
+
discretizer={
|
|
219
|
+
"diffrax_kwargs": {"stepsize_controller": dfx.StepTo(np.linspace(0.0, 1 / (n - 1), 3))}
|
|
220
|
+
},
|
|
221
|
+
solver={
|
|
222
|
+
"cvxpygen": True,
|
|
223
|
+
"cvx_solver": "qocogen",
|
|
224
|
+
"solver_args": {},
|
|
225
|
+
},
|
|
213
226
|
)
|
|
214
227
|
|
|
215
|
-
problem.
|
|
216
|
-
|
|
228
|
+
problem.settings.dev.printing = False
|
|
217
229
|
|
|
218
230
|
if __name__ == "__main__":
|
|
219
231
|
problem.initialize()
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '2.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, '
|
|
21
|
+
__version__ = version = '2.dev2'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 'dev2')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'gbe5a1b946'
|
|
@@ -6,8 +6,9 @@ optimization problems through iterative convex approximation.
|
|
|
6
6
|
|
|
7
7
|
import time
|
|
8
8
|
import warnings
|
|
9
|
-
from typing import TYPE_CHECKING, Callable, Dict, List, Union
|
|
9
|
+
from typing import TYPE_CHECKING, Callable, Dict, List, Tuple, Union
|
|
10
10
|
|
|
11
|
+
import jax
|
|
11
12
|
import numpy as np
|
|
12
13
|
import numpy.linalg as la
|
|
13
14
|
|
|
@@ -188,6 +189,11 @@ class PenalizedTrustRegion(Algorithm):
|
|
|
188
189
|
return solver.call(*args)
|
|
189
190
|
return solver(*args)
|
|
190
191
|
|
|
192
|
+
@staticmethod
|
|
193
|
+
def _block_until_ready_outputs(outputs: Tuple[object, ...]) -> None:
|
|
194
|
+
"""Finish any pending XLA work from discretization exports (warm-up helper)."""
|
|
195
|
+
jax.block_until_ready(outputs)
|
|
196
|
+
|
|
191
197
|
def _recover_prior_node_from_initial(
|
|
192
198
|
self,
|
|
193
199
|
settings: Config,
|
|
@@ -286,7 +292,8 @@ class PenalizedTrustRegion(Algorithm):
|
|
|
286
292
|
"""Initialize PTR algorithm.
|
|
287
293
|
|
|
288
294
|
Stores compiled infrastructure and performs a warm-start solve to
|
|
289
|
-
initialize DPP and JAX jacobians.
|
|
295
|
+
initialize DPP and JAX jacobians. Also runs post-subproblem discretization
|
|
296
|
+
on the throwaway CVX solution so XLA/export caches match the first ``step()``.
|
|
290
297
|
|
|
291
298
|
Args:
|
|
292
299
|
solver: Convex subproblem solver (e.g., CVXPySolver)
|
|
@@ -333,7 +340,29 @@ class PenalizedTrustRegion(Algorithm):
|
|
|
333
340
|
params,
|
|
334
341
|
)
|
|
335
342
|
init_state.add_impulsive_discretization(W_multi_shoot.__array__())
|
|
336
|
-
_ = self._subproblem(params, init_state, settings)
|
|
343
|
+
(x_sol, u_sol, *_) = self._subproblem(params, init_state, settings)
|
|
344
|
+
|
|
345
|
+
# Prime the same exported discretization calls used after every subproblem in
|
|
346
|
+
# step() (candidate trajectory). initialize() previously only discretized the
|
|
347
|
+
# initial guess, so the first step() in solve() could still hit an XLA cache_miss
|
|
348
|
+
# on post-CVX (x_sol, u_sol). Running that path here moves compilation into init.
|
|
349
|
+
cont_out = self._invoke_solver(
|
|
350
|
+
self._discretization_solver, x_sol, u_sol.astype(float), params
|
|
351
|
+
)
|
|
352
|
+
x_prop_c = cont_out[3]
|
|
353
|
+
u_candidate = u_sol.astype(float)
|
|
354
|
+
x0_prior_c = self._recover_prior_node_from_initial(settings, x_sol[0])
|
|
355
|
+
x_nodes_prior_c = np.vstack((x0_prior_c, np.asarray(x_prop_c)))
|
|
356
|
+
if self._discretization_solver_impulsive is not None:
|
|
357
|
+
imp_out = self._invoke_solver(
|
|
358
|
+
self._discretization_solver_impulsive,
|
|
359
|
+
x_nodes_prior_c,
|
|
360
|
+
u_candidate,
|
|
361
|
+
params,
|
|
362
|
+
)
|
|
363
|
+
self._block_until_ready_outputs(cont_out + imp_out)
|
|
364
|
+
else:
|
|
365
|
+
self._block_until_ready_outputs(cont_out)
|
|
337
366
|
|
|
338
367
|
def step(
|
|
339
368
|
self,
|
|
@@ -9,16 +9,29 @@ the same structure, the cached compiled artifacts can be reused.
|
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
import hashlib
|
|
12
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
12
13
|
from typing import TYPE_CHECKING
|
|
13
14
|
|
|
14
15
|
import numpy as np
|
|
15
16
|
|
|
16
|
-
from openscvx._version import __version__
|
|
17
|
-
|
|
18
17
|
if TYPE_CHECKING:
|
|
19
18
|
from openscvx.symbolic.problem import SymbolicProblem
|
|
20
19
|
|
|
21
20
|
|
|
21
|
+
def _openscvx_version() -> str:
|
|
22
|
+
"""Package version for cache invalidation; works without generated _version.py."""
|
|
23
|
+
try:
|
|
24
|
+
return version("openscvx")
|
|
25
|
+
except PackageNotFoundError:
|
|
26
|
+
pass
|
|
27
|
+
try:
|
|
28
|
+
from openscvx._version import __version__ as v
|
|
29
|
+
|
|
30
|
+
return v
|
|
31
|
+
except ImportError:
|
|
32
|
+
return "0.0.0"
|
|
33
|
+
|
|
34
|
+
|
|
22
35
|
def hash_symbolic_problem(problem: "SymbolicProblem") -> str:
|
|
23
36
|
"""Compute a structural hash of a symbolic optimization problem.
|
|
24
37
|
|
|
@@ -47,7 +60,7 @@ def hash_symbolic_problem(problem: "SymbolicProblem") -> str:
|
|
|
47
60
|
hasher = hashlib.sha256()
|
|
48
61
|
|
|
49
62
|
# Include library version to invalidate cache on version changes
|
|
50
|
-
hasher.update(f"openscvx:{
|
|
63
|
+
hasher.update(f"openscvx:{_openscvx_version()}:".encode())
|
|
51
64
|
|
|
52
65
|
# Hash the dynamics
|
|
53
66
|
hasher.update(b"dynamics:")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openscvx
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.dev2
|
|
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
|
|
@@ -11,19 +11,24 @@ Each function is tested for:
|
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
13
|
import jax
|
|
14
|
-
import jax.numpy as jnp
|
|
15
|
-
import pytest
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
# Use float64 for more accurate tests; JAX must be configured before jnp.
|
|
16
|
+
jax.config.update("jax_enable_x64", True)
|
|
17
|
+
# isort: off
|
|
18
|
+
import jax.numpy as jnp # noqa: E402
|
|
19
|
+
import pytest # noqa: E402
|
|
20
|
+
|
|
21
|
+
from openscvx.symbolic.lowerers.jax.stl import ( # noqa: E402
|
|
18
22
|
AND,
|
|
19
23
|
OR,
|
|
20
24
|
AND_lite,
|
|
21
25
|
OR_lite,
|
|
22
26
|
_smooth_equality,
|
|
23
27
|
integer_variable,
|
|
28
|
+
gmsr_IfThen as IfThen,
|
|
29
|
+
gmsr_IfThen_lite as IfThen_lite,
|
|
24
30
|
)
|
|
25
|
-
|
|
26
|
-
from openscvx.symbolic.lowerers.jax.stl import gmsr_IfThen_lite as IfThen_lite
|
|
31
|
+
# isort: on
|
|
27
32
|
|
|
28
33
|
# =============================================================================
|
|
29
34
|
# Helpers
|
|
@@ -294,11 +299,11 @@ class TestORLite:
|
|
|
294
299
|
# OR_lite = 0 iff all y_i ≤ 0
|
|
295
300
|
y = jnp.array([-1.0, -0.5])
|
|
296
301
|
val = float(OR_lite(y, c=C))
|
|
297
|
-
assert val == pytest.approx(0.0, abs=1e-
|
|
302
|
+
assert val == pytest.approx(0.0, abs=1e-17)
|
|
298
303
|
|
|
299
304
|
def test_positive_when_any_positive(self):
|
|
300
305
|
y = jnp.array([0.5, -1.0])
|
|
301
|
-
assert float(OR_lite(y, c=C)) == pytest.approx(0.0, abs=1e-
|
|
306
|
+
assert float(OR_lite(y, c=C)) == pytest.approx(0.0, abs=1e-17)
|
|
302
307
|
|
|
303
308
|
def test_larger_positive_means_more_violated(self):
|
|
304
309
|
y_small = jnp.array([0.1, 10.0])
|
|
@@ -470,7 +470,7 @@ def test_or_jax_lite_variant():
|
|
|
470
470
|
fn = _lower_stl(Or(p1, p2, lite=True))
|
|
471
471
|
# lite variant: satisfied when at least one predicate satisfied
|
|
472
472
|
x_ok = jnp.array([0.5, 3.0])
|
|
473
|
-
assert float(fn(x_ok, None, None, None)) >=
|
|
473
|
+
assert float(fn(x_ok, None, None, None)) >= -1e-17
|
|
474
474
|
|
|
475
475
|
|
|
476
476
|
# =============================================================================
|
|
@@ -93,6 +93,11 @@ def test_example():
|
|
|
93
93
|
"""
|
|
94
94
|
from examples.abstract.brachistochrone import problem
|
|
95
95
|
|
|
96
|
+
# Dense output grid + tight IVP tolerances for trajectory vs analytical validation
|
|
97
|
+
problem.settings.prp.dt = 0.005
|
|
98
|
+
problem.settings.prp.atol = 1e-8
|
|
99
|
+
problem.settings.prp.rtol = 1e-10
|
|
100
|
+
|
|
96
101
|
# Disable printing for cleaner test output
|
|
97
102
|
if hasattr(problem.settings, "dev"):
|
|
98
103
|
problem.settings.dev.printing = False
|
|
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-2.dev1 → openscvx-2.dev2}/docs/assets/viser-recordings/franka_fr3v2_pick_place.viser
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
|
|
File without changes
|