pycddp 0.1.0__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.
Files changed (184) hide show
  1. pycddp-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +55 -0
  2. pycddp-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. pycddp-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +36 -0
  4. pycddp-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +16 -0
  5. pycddp-0.1.0/.github/workflows/build.yaml +29 -0
  6. pycddp-0.1.0/.github/workflows/pages.yml +58 -0
  7. pycddp-0.1.0/.github/workflows/publish.yml +91 -0
  8. pycddp-0.1.0/.github/workflows/python-dependency-guard.yaml +41 -0
  9. pycddp-0.1.0/.github/workflows/wheels.yml +70 -0
  10. pycddp-0.1.0/.gitignore +32 -0
  11. pycddp-0.1.0/.python-version +1 -0
  12. pycddp-0.1.0/CMakeLists.txt +324 -0
  13. pycddp-0.1.0/CODE_OF_CONDUCT.md +27 -0
  14. pycddp-0.1.0/CONTRIBUTING.md +68 -0
  15. pycddp-0.1.0/Dockerfile +39 -0
  16. pycddp-0.1.0/LICENSE +201 -0
  17. pycddp-0.1.0/PKG-INFO +203 -0
  18. pycddp-0.1.0/README.md +169 -0
  19. pycddp-0.1.0/SECURITY.md +26 -0
  20. pycddp-0.1.0/cmake/cddpConfig.cmake.in +8 -0
  21. pycddp-0.1.0/docs/assets/cddp_in_cpp.png +0 -0
  22. pycddp-0.1.0/docs/assets/python_portfolio/cartpole_swing_up.gif +0 -0
  23. pycddp-0.1.0/docs/assets/python_portfolio/mpcc_racing_line.gif +0 -0
  24. pycddp-0.1.0/docs/assets/python_portfolio/pendulum_swing_up.gif +0 -0
  25. pycddp-0.1.0/docs/assets/python_portfolio/unicycle_obstacle_avoidance.gif +0 -0
  26. pycddp-0.1.0/docs/cpp.md +32 -0
  27. pycddp-0.1.0/docs/index.md +42 -0
  28. pycddp-0.1.0/docs/install.md +57 -0
  29. pycddp-0.1.0/docs/python.md +39 -0
  30. pycddp-0.1.0/docs/python_portfolio.md +73 -0
  31. pycddp-0.1.0/docs/release.md +48 -0
  32. pycddp-0.1.0/docs/stylesheets/extra.css +110 -0
  33. pycddp-0.1.0/examples/CMakeLists.txt +28 -0
  34. pycddp-0.1.0/examples/cddp_cartpole.cpp +80 -0
  35. pycddp-0.1.0/examples/cddp_manipulator.cpp +82 -0
  36. pycddp-0.1.0/examples/cddp_pendulum.cpp +79 -0
  37. pycddp-0.1.0/examples/cddp_quadrotor_point.cpp +111 -0
  38. pycddp-0.1.0/examples/cddp_unicycle.cpp +79 -0
  39. pycddp-0.1.0/examples/data/README.md +9 -0
  40. pycddp-0.1.0/examples/data/mpcc_racing_track.csv +490 -0
  41. pycddp-0.1.0/examples/generate_quadrotor_acados.py +203 -0
  42. pycddp-0.1.0/examples/generate_unicycle_acados.py +149 -0
  43. pycddp-0.1.0/examples/ipopt_spacecraft_linear.ipynb +2630 -0
  44. pycddp-0.1.0/examples/ipopt_spacecraft_linear_fuel.ipynb +1248 -0
  45. pycddp-0.1.0/examples/python_portfolio.py +85 -0
  46. pycddp-0.1.0/examples/python_portfolio_lib.py +1426 -0
  47. pycddp-0.1.0/include/cddp-cpp/cddp.hpp +59 -0
  48. pycddp-0.1.0/include/cddp-cpp/cddp_core/barrier.hpp +539 -0
  49. pycddp-0.1.0/include/cddp-cpp/cddp_core/boxqp.hpp +168 -0
  50. pycddp-0.1.0/include/cddp-cpp/cddp_core/cddp_core.hpp +442 -0
  51. pycddp-0.1.0/include/cddp-cpp/cddp_core/cddp_solver_base.hpp +188 -0
  52. pycddp-0.1.0/include/cddp-cpp/cddp_core/clddp_solver.hpp +53 -0
  53. pycddp-0.1.0/include/cddp-cpp/cddp_core/constraint.hpp +1052 -0
  54. pycddp-0.1.0/include/cddp-cpp/cddp_core/dynamical_system.hpp +154 -0
  55. pycddp-0.1.0/include/cddp-cpp/cddp_core/helper.hpp +239 -0
  56. pycddp-0.1.0/include/cddp-cpp/cddp_core/ipddp_solver.hpp +138 -0
  57. pycddp-0.1.0/include/cddp-cpp/cddp_core/logddp_solver.hpp +83 -0
  58. pycddp-0.1.0/include/cddp-cpp/cddp_core/msipddp_solver.hpp +149 -0
  59. pycddp-0.1.0/include/cddp-cpp/cddp_core/objective.hpp +321 -0
  60. pycddp-0.1.0/include/cddp-cpp/cddp_core/options.hpp +217 -0
  61. pycddp-0.1.0/include/cddp-cpp/cddp_core/qp_solver.hpp +150 -0
  62. pycddp-0.1.0/include/cddp-cpp/cddp_core/terminal_constraint.hpp +254 -0
  63. pycddp-0.1.0/include/cddp-cpp/cddp_example_utils.hpp +61 -0
  64. pycddp-0.1.0/include/cddp-cpp/dynamics_model/acrobot.hpp +155 -0
  65. pycddp-0.1.0/include/cddp-cpp/dynamics_model/bicycle.hpp +119 -0
  66. pycddp-0.1.0/include/cddp-cpp/dynamics_model/car.hpp +147 -0
  67. pycddp-0.1.0/include/cddp-cpp/dynamics_model/cartpole.hpp +158 -0
  68. pycddp-0.1.0/include/cddp-cpp/dynamics_model/dreyfus_rocket.hpp +129 -0
  69. pycddp-0.1.0/include/cddp-cpp/dynamics_model/dubins_car.hpp +129 -0
  70. pycddp-0.1.0/include/cddp-cpp/dynamics_model/euler_attitude.hpp +186 -0
  71. pycddp-0.1.0/include/cddp-cpp/dynamics_model/forklift.hpp +151 -0
  72. pycddp-0.1.0/include/cddp-cpp/dynamics_model/lti_system.hpp +127 -0
  73. pycddp-0.1.0/include/cddp-cpp/dynamics_model/manipulator.hpp +221 -0
  74. pycddp-0.1.0/include/cddp-cpp/dynamics_model/mrp_attitude.hpp +164 -0
  75. pycddp-0.1.0/include/cddp-cpp/dynamics_model/pendulum.hpp +135 -0
  76. pycddp-0.1.0/include/cddp-cpp/dynamics_model/quadrotor.hpp +175 -0
  77. pycddp-0.1.0/include/cddp-cpp/dynamics_model/quadrotor_rate.hpp +205 -0
  78. pycddp-0.1.0/include/cddp-cpp/dynamics_model/quaternion_attitude.hpp +173 -0
  79. pycddp-0.1.0/include/cddp-cpp/dynamics_model/spacecraft_landing2d.hpp +175 -0
  80. pycddp-0.1.0/include/cddp-cpp/dynamics_model/spacecraft_linear.hpp +134 -0
  81. pycddp-0.1.0/include/cddp-cpp/dynamics_model/spacecraft_linear_fuel.hpp +152 -0
  82. pycddp-0.1.0/include/cddp-cpp/dynamics_model/spacecraft_nonlinear.hpp +150 -0
  83. pycddp-0.1.0/include/cddp-cpp/dynamics_model/spacecraft_twobody.hpp +121 -0
  84. pycddp-0.1.0/include/cddp-cpp/dynamics_model/unicycle.hpp +131 -0
  85. pycddp-0.1.0/include/cddp-cpp/dynamics_model/usv_3dof.hpp +149 -0
  86. pycddp-0.1.0/mkdocs.yml +38 -0
  87. pycddp-0.1.0/pyproject.toml +51 -0
  88. pycddp-0.1.0/python/CMakeLists.txt +34 -0
  89. pycddp-0.1.0/python/pycddp/__init__.py +88 -0
  90. pycddp-0.1.0/python/pycddp/_version.py +1 -0
  91. pycddp-0.1.0/python/src/bind_constraints.cpp +160 -0
  92. pycddp-0.1.0/python/src/bind_dynamics.cpp +258 -0
  93. pycddp-0.1.0/python/src/bind_objective.cpp +64 -0
  94. pycddp-0.1.0/python/src/bind_options.cpp +126 -0
  95. pycddp-0.1.0/python/src/bind_solver.cpp +663 -0
  96. pycddp-0.1.0/python/src/main.cpp +18 -0
  97. pycddp-0.1.0/python/tests/test_all_dynamics.py +86 -0
  98. pycddp-0.1.0/python/tests/test_constraints.py +139 -0
  99. pycddp-0.1.0/python/tests/test_custom_dynamics.py +160 -0
  100. pycddp-0.1.0/python/tests/test_nonlinear_objective.py +58 -0
  101. pycddp-0.1.0/python/tests/test_options.py +48 -0
  102. pycddp-0.1.0/python/tests/test_pendulum.py +109 -0
  103. pycddp-0.1.0/python/tests/test_portfolio.py +69 -0
  104. pycddp-0.1.0/python/tests/test_solver_errors.py +149 -0
  105. pycddp-0.1.0/security/python-direct-deps-allowlist.txt +8 -0
  106. pycddp-0.1.0/src/cddp_core/boxqp.cpp +252 -0
  107. pycddp-0.1.0/src/cddp_core/cddp_core.cpp +713 -0
  108. pycddp-0.1.0/src/cddp_core/cddp_solver_base.cpp +426 -0
  109. pycddp-0.1.0/src/cddp_core/clddp_solver.cpp +295 -0
  110. pycddp-0.1.0/src/cddp_core/constraint.cpp +22 -0
  111. pycddp-0.1.0/src/cddp_core/dynamical_system.cpp +217 -0
  112. pycddp-0.1.0/src/cddp_core/helper.cpp +208 -0
  113. pycddp-0.1.0/src/cddp_core/ipddp_solver.cpp +1643 -0
  114. pycddp-0.1.0/src/cddp_core/logddp_solver.cpp +714 -0
  115. pycddp-0.1.0/src/cddp_core/msipddp_solver.cpp +2047 -0
  116. pycddp-0.1.0/src/cddp_core/objective.cpp +290 -0
  117. pycddp-0.1.0/src/cddp_core/qp_solver.cpp +207 -0
  118. pycddp-0.1.0/src/dynamics_model/acrobot.cpp +165 -0
  119. pycddp-0.1.0/src/dynamics_model/bicycle.cpp +178 -0
  120. pycddp-0.1.0/src/dynamics_model/car.cpp +231 -0
  121. pycddp-0.1.0/src/dynamics_model/cartpole.cpp +201 -0
  122. pycddp-0.1.0/src/dynamics_model/dreyfus_rocket.cpp +97 -0
  123. pycddp-0.1.0/src/dynamics_model/dubins_car.cpp +142 -0
  124. pycddp-0.1.0/src/dynamics_model/euler_attitude.cpp +176 -0
  125. pycddp-0.1.0/src/dynamics_model/forklift.cpp +200 -0
  126. pycddp-0.1.0/src/dynamics_model/lti_system.cpp +122 -0
  127. pycddp-0.1.0/src/dynamics_model/manipulator.cpp +274 -0
  128. pycddp-0.1.0/src/dynamics_model/mrp_attitude.cpp +101 -0
  129. pycddp-0.1.0/src/dynamics_model/pendulum.cpp +128 -0
  130. pycddp-0.1.0/src/dynamics_model/quadrotor.cpp +321 -0
  131. pycddp-0.1.0/src/dynamics_model/quadrotor_rate.cpp +268 -0
  132. pycddp-0.1.0/src/dynamics_model/quaternion_attitude.cpp +207 -0
  133. pycddp-0.1.0/src/dynamics_model/spacecraft_landing2d.cpp +150 -0
  134. pycddp-0.1.0/src/dynamics_model/spacecraft_linear.cpp +156 -0
  135. pycddp-0.1.0/src/dynamics_model/spacecraft_linear_fuel.cpp +160 -0
  136. pycddp-0.1.0/src/dynamics_model/spacecraft_nonlinear.cpp +122 -0
  137. pycddp-0.1.0/src/dynamics_model/spacecraft_twobody.cpp +75 -0
  138. pycddp-0.1.0/src/dynamics_model/unicycle.cpp +137 -0
  139. pycddp-0.1.0/src/dynamics_model/usv_3dof.cpp +249 -0
  140. pycddp-0.1.0/tests/CMakeLists.txt +196 -0
  141. pycddp-0.1.0/tests/cddp_core/test_boxqp.cpp +238 -0
  142. pycddp-0.1.0/tests/cddp_core/test_cddp_core.cpp +645 -0
  143. pycddp-0.1.0/tests/cddp_core/test_clddp_solver.cpp +828 -0
  144. pycddp-0.1.0/tests/cddp_core/test_constraint.cpp +405 -0
  145. pycddp-0.1.0/tests/cddp_core/test_finite_difference.cpp +69 -0
  146. pycddp-0.1.0/tests/cddp_core/test_ipddp_core.cpp +235 -0
  147. pycddp-0.1.0/tests/cddp_core/test_ipddp_solver.cpp +823 -0
  148. pycddp-0.1.0/tests/cddp_core/test_logddp_solver.cpp +955 -0
  149. pycddp-0.1.0/tests/cddp_core/test_msipddp_core.cpp +317 -0
  150. pycddp-0.1.0/tests/cddp_core/test_msipddp_solver.cpp +823 -0
  151. pycddp-0.1.0/tests/cddp_core/test_objective.cpp +259 -0
  152. pycddp-0.1.0/tests/dynamics_model/test_acrobot.cpp +193 -0
  153. pycddp-0.1.0/tests/dynamics_model/test_attitude_dynamics.cpp +284 -0
  154. pycddp-0.1.0/tests/dynamics_model/test_bicycle.cpp +135 -0
  155. pycddp-0.1.0/tests/dynamics_model/test_car.cpp +442 -0
  156. pycddp-0.1.0/tests/dynamics_model/test_cartpole.cpp +105 -0
  157. pycddp-0.1.0/tests/dynamics_model/test_dreyfus_rocket.cpp +74 -0
  158. pycddp-0.1.0/tests/dynamics_model/test_dubins_car.cpp +71 -0
  159. pycddp-0.1.0/tests/dynamics_model/test_forklift.cpp +148 -0
  160. pycddp-0.1.0/tests/dynamics_model/test_lti_system.cpp +141 -0
  161. pycddp-0.1.0/tests/dynamics_model/test_manipulator.cpp +95 -0
  162. pycddp-0.1.0/tests/dynamics_model/test_mrp_attitude.cpp +287 -0
  163. pycddp-0.1.0/tests/dynamics_model/test_pendulum.cpp +74 -0
  164. pycddp-0.1.0/tests/dynamics_model/test_quadrotor.cpp +496 -0
  165. pycddp-0.1.0/tests/dynamics_model/test_quadrotor_rate.cpp +380 -0
  166. pycddp-0.1.0/tests/dynamics_model/test_spacecraft_landing2d.cpp +78 -0
  167. pycddp-0.1.0/tests/dynamics_model/test_spacecraft_linear.cpp +148 -0
  168. pycddp-0.1.0/tests/dynamics_model/test_spacecraft_linear_fuel.cpp +131 -0
  169. pycddp-0.1.0/tests/dynamics_model/test_spacecraft_nonlinear.cpp +233 -0
  170. pycddp-0.1.0/tests/dynamics_model/test_unicycle.cpp +67 -0
  171. pycddp-0.1.0/tests/dynamics_model/test_usv_3dof.cpp +92 -0
  172. pycddp-0.1.0/tests/package_smoke/CMakeLists.txt +8 -0
  173. pycddp-0.1.0/tests/package_smoke/main.cpp +8 -0
  174. pycddp-0.1.0/tests/package_smoke_test.cmake +43 -0
  175. pycddp-0.1.0/tests/test_animation.cpp +80 -0
  176. pycddp-0.1.0/tests/test_autodiff.cpp +138 -0
  177. pycddp-0.1.0/tests/test_casadi_solver.cpp +213 -0
  178. pycddp-0.1.0/tests/test_eigen.cpp +13 -0
  179. pycddp-0.1.0/tests/test_hessian.cpp +265 -0
  180. pycddp-0.1.0/tests/test_ipddp_car.cpp +133 -0
  181. pycddp-0.1.0/tests/test_ipddp_pendulum.cpp +111 -0
  182. pycddp-0.1.0/tests/test_ipddp_quadrotor.cpp +315 -0
  183. pycddp-0.1.0/tests/test_msipddp_car.cpp +138 -0
  184. pycddp-0.1.0/tools/check_python_dependency_policy.py +234 -0
@@ -0,0 +1,55 @@
1
+ name: Bug report
2
+ description: Report a reproducible defect in the solver, bindings, build, or docs
3
+ title: "[bug] "
4
+ labels:
5
+ - bug
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Thanks for taking the time to report a problem.
11
+
12
+ Please include a minimal reproduction and the exact commands you ran.
13
+ - type: textarea
14
+ id: summary
15
+ attributes:
16
+ label: Summary
17
+ description: What happened, and what did you expect to happen instead?
18
+ placeholder: A concise description of the bug and expected behavior.
19
+ validations:
20
+ required: true
21
+ - type: textarea
22
+ id: reproduction
23
+ attributes:
24
+ label: Reproduction
25
+ description: Provide the smallest reproduction you can, including commands and inputs.
26
+ placeholder: |
27
+ 1. Configure with ...
28
+ 2. Run ...
29
+ 3. Observe ...
30
+ validations:
31
+ required: true
32
+ - type: textarea
33
+ id: logs
34
+ attributes:
35
+ label: Logs and output
36
+ description: Paste the relevant error message, stack trace, or failing test output.
37
+ render: text
38
+ - type: textarea
39
+ id: environment
40
+ attributes:
41
+ label: Environment
42
+ description: Share the platform and toolchain details relevant to the bug.
43
+ placeholder: |
44
+ OS:
45
+ Compiler:
46
+ CMake:
47
+ Python:
48
+ Build flags:
49
+ validations:
50
+ required: true
51
+ - type: textarea
52
+ id: context
53
+ attributes:
54
+ label: Additional context
55
+ description: Add anything else that might help debug the issue.
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Security policy
4
+ url: https://github.com/astomodynamics/cddp-cpp/blob/master/SECURITY.md
5
+ about: Read the security reporting guidance before disclosing a vulnerability.
@@ -0,0 +1,36 @@
1
+ name: Feature request
2
+ description: Propose an improvement to the solver, examples, bindings, or docs
3
+ title: "[feature] "
4
+ labels:
5
+ - enhancement
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Please describe the problem first, then the change you want.
11
+ - type: textarea
12
+ id: problem
13
+ attributes:
14
+ label: Problem or use case
15
+ description: What limitation, missing capability, or workflow pain does this address?
16
+ placeholder: I am trying to ...
17
+ validations:
18
+ required: true
19
+ - type: textarea
20
+ id: proposal
21
+ attributes:
22
+ label: Proposed change
23
+ description: Describe the API, behavior, or workflow you would like to see.
24
+ placeholder: Add support for ...
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: alternatives
29
+ attributes:
30
+ label: Alternatives considered
31
+ description: What workarounds or alternative designs have you considered?
32
+ - type: textarea
33
+ id: context
34
+ attributes:
35
+ label: Additional context
36
+ description: Benchmarks, references, examples, or prior art that help clarify the request.
@@ -0,0 +1,16 @@
1
+ ## Summary
2
+ - Describe the change and why it is needed.
3
+
4
+ ## Changes
5
+ - List the concrete code, API, testing, or documentation updates.
6
+
7
+ ## Validation
8
+ - [ ] `...`
9
+
10
+ ## Checklist
11
+ - [ ] I ran the relevant tests or explained why they were not run.
12
+ - [ ] I updated documentation when behavior or public interfaces changed.
13
+ - [ ] I kept the change focused and avoided unrelated cleanup.
14
+
15
+ ## Notes
16
+ - Add reviewer context only when it is needed.
@@ -0,0 +1,29 @@
1
+ name: C++ CI with Docker
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ${{ matrix.os }}
12
+ strategy:
13
+ matrix:
14
+ os: [ubuntu-latest, macos-latest]
15
+ steps:
16
+ - uses: actions/checkout@v3
17
+
18
+ # Only run Docker steps on Linux
19
+ - name: Login to Docker Hub
20
+ if: runner.os == 'Linux'
21
+ run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
22
+
23
+ - name: Build and Test the Docker image
24
+ if: runner.os == 'Linux'
25
+ run: docker build -t astomodynamics/cddp-cpp .
26
+
27
+ - name: Push the Docker image (optional)
28
+ if: runner.os == 'Linux'
29
+ run: docker push astomodynamics/cddp-cpp
@@ -0,0 +1,58 @@
1
+ name: Docs
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ paths:
7
+ - "docs/**"
8
+ - "mkdocs.yml"
9
+ - ".github/workflows/pages.yml"
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+ pages: write
15
+ id-token: write
16
+
17
+ concurrency:
18
+ group: pages
19
+ cancel-in-progress: true
20
+
21
+ jobs:
22
+ build:
23
+ name: Build docs
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - name: Check out repository
27
+ uses: actions/checkout@v4
28
+
29
+ - name: Set up Python
30
+ uses: actions/setup-python@v5
31
+ with:
32
+ python-version: "3.12"
33
+
34
+ - name: Install uv
35
+ run: python -m pip install uv
36
+
37
+ - name: Configure GitHub Pages
38
+ uses: actions/configure-pages@v5
39
+
40
+ - name: Build site
41
+ run: uvx --from mkdocs --with mkdocs-material mkdocs build --strict
42
+
43
+ - name: Upload Pages artifact
44
+ uses: actions/upload-pages-artifact@v3
45
+ with:
46
+ path: site
47
+
48
+ deploy:
49
+ name: Deploy docs
50
+ runs-on: ubuntu-latest
51
+ needs: build
52
+ environment:
53
+ name: github-pages
54
+ url: ${{ steps.deployment.outputs.page_url }}
55
+ steps:
56
+ - name: Deploy to GitHub Pages
57
+ id: deployment
58
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,91 @@
1
+ name: Publish PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ build-sdist:
13
+ name: Build sdist
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Check out repository
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.12"
23
+
24
+ - name: Install build frontend
25
+ run: python -m pip install build
26
+
27
+ - name: Build source distribution
28
+ run: python -m build --sdist
29
+
30
+ - name: Upload source distribution
31
+ uses: actions/upload-artifact@v4
32
+ with:
33
+ name: dist-sdist
34
+ path: dist/*.tar.gz
35
+
36
+ build-wheels:
37
+ name: Build wheels (${{ matrix.os }})
38
+ runs-on: ${{ matrix.os }}
39
+ strategy:
40
+ fail-fast: false
41
+ matrix:
42
+ os: [ubuntu-latest, windows-latest, macos-14]
43
+
44
+ steps:
45
+ - name: Check out repository
46
+ uses: actions/checkout@v4
47
+
48
+ - name: Set up Python
49
+ uses: actions/setup-python@v5
50
+ with:
51
+ python-version: "3.12"
52
+
53
+ - name: Install cibuildwheel
54
+ run: python -m pip install cibuildwheel
55
+
56
+ - name: Build wheels
57
+ run: python -m cibuildwheel --output-dir wheelhouse
58
+ env:
59
+ CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-*"
60
+ CIBW_SKIP: "*-musllinux_* *-win32"
61
+ CIBW_ARCHS_LINUX: auto64
62
+ CIBW_ARCHS_WINDOWS: auto64
63
+ CIBW_ARCHS_MACOS: auto64
64
+
65
+ - name: Upload wheel artifacts
66
+ uses: actions/upload-artifact@v4
67
+ with:
68
+ name: dist-wheels-${{ matrix.os }}
69
+ path: wheelhouse/*.whl
70
+
71
+ publish:
72
+ name: Publish to PyPI
73
+ runs-on: ubuntu-latest
74
+ needs: [build-sdist, build-wheels]
75
+ permissions:
76
+ id-token: write
77
+ contents: read
78
+ environment:
79
+ name: pypi
80
+ url: https://pypi.org/p/pycddp
81
+
82
+ steps:
83
+ - name: Download distribution artifacts
84
+ uses: actions/download-artifact@v4
85
+ with:
86
+ pattern: dist-*
87
+ path: dist
88
+ merge-multiple: true
89
+
90
+ - name: Publish distributions
91
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,41 @@
1
+ name: Python Dependency Guard
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [ master ]
6
+ paths:
7
+ - "pyproject.toml"
8
+ - "uv.lock"
9
+ - "security/python-direct-deps-allowlist.txt"
10
+ - "tools/check_python_dependency_policy.py"
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ policy:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - name: Check out repository
20
+ uses: actions/checkout@v4
21
+ with:
22
+ fetch-depth: 0
23
+
24
+ - name: Set up Python
25
+ uses: actions/setup-python@v5
26
+ with:
27
+ python-version: "3.12"
28
+
29
+ - name: Enforce dependency policy
30
+ run: python tools/check_python_dependency_policy.py --base-ref "origin/${{ github.base_ref }}"
31
+
32
+ dependency-review:
33
+ runs-on: ubuntu-latest
34
+ permissions:
35
+ contents: read
36
+ pull-requests: write
37
+ steps:
38
+ - name: Check dependency review
39
+ uses: actions/dependency-review-action@v4
40
+ with:
41
+ fail-on-severity: high
@@ -0,0 +1,70 @@
1
+ name: Wheel CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [master]
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ build-sdist:
14
+ name: Build sdist
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Check out repository
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Set up Python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.12"
24
+
25
+ - name: Install build frontend
26
+ run: python -m pip install build
27
+
28
+ - name: Build source distribution
29
+ run: python -m build --sdist
30
+
31
+ - name: Upload source distribution
32
+ uses: actions/upload-artifact@v4
33
+ with:
34
+ name: dist-sdist
35
+ path: dist/*.tar.gz
36
+
37
+ build-wheels:
38
+ name: Build wheels (${{ matrix.os }})
39
+ runs-on: ${{ matrix.os }}
40
+ strategy:
41
+ fail-fast: false
42
+ matrix:
43
+ os: [ubuntu-latest, windows-latest, macos-14]
44
+
45
+ steps:
46
+ - name: Check out repository
47
+ uses: actions/checkout@v4
48
+
49
+ - name: Set up Python
50
+ uses: actions/setup-python@v5
51
+ with:
52
+ python-version: "3.12"
53
+
54
+ - name: Install cibuildwheel
55
+ run: python -m pip install cibuildwheel
56
+
57
+ - name: Build wheels
58
+ run: python -m cibuildwheel --output-dir wheelhouse
59
+ env:
60
+ CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-*"
61
+ CIBW_SKIP: "*-musllinux_* *-win32"
62
+ CIBW_ARCHS_LINUX: auto64
63
+ CIBW_ARCHS_WINDOWS: auto64
64
+ CIBW_ARCHS_MACOS: auto64
65
+
66
+ - name: Upload wheel artifacts
67
+ uses: actions/upload-artifact@v4
68
+ with:
69
+ name: dist-wheels-${{ matrix.os }}
70
+ path: wheelhouse/*.whl
@@ -0,0 +1,32 @@
1
+ # IDE
2
+ .vscode/
3
+
4
+ # Build
5
+ build/
6
+
7
+ # Output
8
+ plots/
9
+ results/
10
+
11
+ # Models
12
+ models/
13
+ neural_models/
14
+
15
+ # Generated code (acados)
16
+ examples/c_generated_code/
17
+ examples/*_acados_ocp.json
18
+
19
+ # PDF images
20
+ pdf_images/
21
+
22
+ # Solver output
23
+ solver_snopt.out
24
+
25
+ # Python / uv
26
+ .venv/
27
+ uv.lock
28
+ site/
29
+ *.egg-info/
30
+ __pycache__/
31
+ *.so
32
+ *.pyd
@@ -0,0 +1 @@
1
+ 3.13