copp-py 0.2.1__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 (230) hide show
  1. copp_py-0.2.1/.cargo/config.toml +7 -0
  2. copp_py-0.2.1/.gitattributes +37 -0
  3. copp_py-0.2.1/.github/workflows/c-abi.yml +248 -0
  4. copp_py-0.2.1/.github/workflows/python-wheels.yml +186 -0
  5. copp_py-0.2.1/.github/workflows/rust.yml +54 -0
  6. copp_py-0.2.1/.gitignore +28 -0
  7. copp_py-0.2.1/CHANGELOG.md +38 -0
  8. copp_py-0.2.1/Cargo.lock +1961 -0
  9. copp_py-0.2.1/Cargo.toml +57 -0
  10. copp_py-0.2.1/LICENSE +21 -0
  11. copp_py-0.2.1/PKG-INFO +427 -0
  12. copp_py-0.2.1/README.md +344 -0
  13. copp_py-0.2.1/bindings/c/CMakeLists.txt +266 -0
  14. copp_py-0.2.1/bindings/c/Doxyfile +77 -0
  15. copp_py-0.2.1/bindings/c/README.md +420 -0
  16. copp_py-0.2.1/bindings/c/cbindgen.toml +25 -0
  17. copp_py-0.2.1/bindings/c/cmake/coppConfig.cmake.in +52 -0
  18. copp_py-0.2.1/bindings/c/examples/README.md +31 -0
  19. copp_py-0.2.1/bindings/c/examples/copp2_socp.c +96 -0
  20. copp_py-0.2.1/bindings/c/examples/copp3_socp.c +203 -0
  21. copp_py-0.2.1/bindings/c/examples/example_common.h +419 -0
  22. copp_py-0.2.1/bindings/c/examples/reach_set2.c +85 -0
  23. copp_py-0.2.1/bindings/c/examples/topp2_ra.c +73 -0
  24. copp_py-0.2.1/bindings/c/examples/topp3_lp.c +134 -0
  25. copp_py-0.2.1/bindings/c/examples/topp3_socp.c +134 -0
  26. copp_py-0.2.1/bindings/c/include/copp/copp.h +27 -0
  27. copp_py-0.2.1/bindings/c/include/copp/copp2.h +199 -0
  28. copp_py-0.2.1/bindings/c/include/copp/copp3.h +186 -0
  29. copp_py-0.2.1/bindings/c/include/copp/core.h +1011 -0
  30. copp_py-0.2.1/bindings/c/include/copp/formulation.h +406 -0
  31. copp_py-0.2.1/bindings/c/include/copp/interpolation.h +289 -0
  32. copp_py-0.2.1/bindings/c/include/copp/path.h +408 -0
  33. copp_py-0.2.1/bindings/c/include/copp/robot.h +744 -0
  34. copp_py-0.2.1/bindings/c/include/copp/topp2.h +192 -0
  35. copp_py-0.2.1/bindings/c/include/copp/topp3.h +160 -0
  36. copp_py-0.2.1/bindings/c/scripts/generate_docs.ps1 +30 -0
  37. copp_py-0.2.1/bindings/c/scripts/generate_docs.sh +28 -0
  38. copp_py-0.2.1/bindings/c/scripts/generate_headers.ps1 +598 -0
  39. copp_py-0.2.1/bindings/c/tests/package_consumer/CMakeLists.txt +19 -0
  40. copp_py-0.2.1/bindings/c/tests/package_consumer/main.c +15 -0
  41. copp_py-0.2.1/bindings/c/tests/test_copp2_socp.c +312 -0
  42. copp_py-0.2.1/bindings/c/tests/test_copp3_socp.c +325 -0
  43. copp_py-0.2.1/bindings/c/tests/test_error_handling.c +83 -0
  44. copp_py-0.2.1/bindings/c/tests/test_headers.c +206 -0
  45. copp_py-0.2.1/bindings/c/tests/test_path_evaluation.c +509 -0
  46. copp_py-0.2.1/bindings/c/tests/test_reach_set2.c +190 -0
  47. copp_py-0.2.1/bindings/c/tests/test_robot_raw_constraints.c +368 -0
  48. copp_py-0.2.1/bindings/c/tests/test_topp2_interpolation.c +85 -0
  49. copp_py-0.2.1/bindings/c/tests/test_topp2_ra.c +225 -0
  50. copp_py-0.2.1/bindings/c/tests/test_topp3_interpolation.c +181 -0
  51. copp_py-0.2.1/bindings/c/tests/test_topp3_lp.c +262 -0
  52. copp_py-0.2.1/bindings/c/tests/test_topp3_socp.c +246 -0
  53. copp_py-0.2.1/bindings/c/tests/test_version.c +27 -0
  54. copp_py-0.2.1/bindings/python/README.md +389 -0
  55. copp_py-0.2.1/bindings/python/copp_py/__init__.py +67 -0
  56. copp_py-0.2.1/bindings/python/copp_py/__init__.pyi +30 -0
  57. copp_py-0.2.1/bindings/python/copp_py/_native.pyi +17 -0
  58. copp_py-0.2.1/bindings/python/copp_py/_parametric.py +568 -0
  59. copp_py-0.2.1/bindings/python/copp_py/_stubs/__init__.pyi +1 -0
  60. copp_py-0.2.1/bindings/python/copp_py/_stubs/clarabel.pyi +275 -0
  61. copp_py-0.2.1/bindings/python/copp_py/_stubs/constraints.pyi +143 -0
  62. copp_py-0.2.1/bindings/python/copp_py/_stubs/copp2.pyi +121 -0
  63. copp_py-0.2.1/bindings/python/copp_py/_stubs/copp3.pyi +140 -0
  64. copp_py-0.2.1/bindings/python/copp_py/_stubs/core.pyi +125 -0
  65. copp_py-0.2.1/bindings/python/copp_py/_stubs/interpolation.pyi +410 -0
  66. copp_py-0.2.1/bindings/python/copp_py/_stubs/objective.pyi +136 -0
  67. copp_py-0.2.1/bindings/python/copp_py/_stubs/path.pyi +562 -0
  68. copp_py-0.2.1/bindings/python/copp_py/_stubs/robot.pyi +243 -0
  69. copp_py-0.2.1/bindings/python/copp_py/_stubs/topp2.pyi +228 -0
  70. copp_py-0.2.1/bindings/python/copp_py/_stubs/topp3.pyi +189 -0
  71. copp_py-0.2.1/bindings/python/copp_py/clarabel.py +36 -0
  72. copp_py-0.2.1/bindings/python/copp_py/clarabel.pyi +20 -0
  73. copp_py-0.2.1/bindings/python/copp_py/constraints.py +5 -0
  74. copp_py-0.2.1/bindings/python/copp_py/constraints.pyi +5 -0
  75. copp_py-0.2.1/bindings/python/copp_py/core.py +29 -0
  76. copp_py-0.2.1/bindings/python/copp_py/core.pyi +17 -0
  77. copp_py-0.2.1/bindings/python/copp_py/interpolation.py +27 -0
  78. copp_py-0.2.1/bindings/python/copp_py/interpolation.pyi +16 -0
  79. copp_py-0.2.1/bindings/python/copp_py/objective.py +26 -0
  80. copp_py-0.2.1/bindings/python/copp_py/objective.pyi +10 -0
  81. copp_py-0.2.1/bindings/python/copp_py/path.py +19 -0
  82. copp_py-0.2.1/bindings/python/copp_py/path.pyi +12 -0
  83. copp_py-0.2.1/bindings/python/copp_py/py.typed +1 -0
  84. copp_py-0.2.1/bindings/python/copp_py/robot.py +5 -0
  85. copp_py-0.2.1/bindings/python/copp_py/robot.pyi +5 -0
  86. copp_py-0.2.1/bindings/python/copp_py/solver/__init__.py +17 -0
  87. copp_py-0.2.1/bindings/python/copp_py/solver/__init__.pyi +10 -0
  88. copp_py-0.2.1/bindings/python/copp_py/solver/copp2_socp.py +25 -0
  89. copp_py-0.2.1/bindings/python/copp_py/solver/copp2_socp.pyi +20 -0
  90. copp_py-0.2.1/bindings/python/copp_py/solver/copp3_socp.py +23 -0
  91. copp_py-0.2.1/bindings/python/copp_py/solver/copp3_socp.pyi +18 -0
  92. copp_py-0.2.1/bindings/python/copp_py/solver/reach_set2.py +22 -0
  93. copp_py-0.2.1/bindings/python/copp_py/solver/reach_set2.pyi +17 -0
  94. copp_py-0.2.1/bindings/python/copp_py/solver/topp2_ra.py +20 -0
  95. copp_py-0.2.1/bindings/python/copp_py/solver/topp2_ra.pyi +16 -0
  96. copp_py-0.2.1/bindings/python/copp_py/solver/topp3_lp.py +23 -0
  97. copp_py-0.2.1/bindings/python/copp_py/solver/topp3_lp.pyi +18 -0
  98. copp_py-0.2.1/bindings/python/copp_py/solver/topp3_socp.py +23 -0
  99. copp_py-0.2.1/bindings/python/copp_py/solver/topp3_socp.pyi +18 -0
  100. copp_py-0.2.1/bindings/python/docs/Makefile +20 -0
  101. copp_py-0.2.1/bindings/python/docs/make.bat +35 -0
  102. copp_py-0.2.1/bindings/python/docs/source/api/clarabel.rst +29 -0
  103. copp_py-0.2.1/bindings/python/docs/source/api/copp2.rst +10 -0
  104. copp_py-0.2.1/bindings/python/docs/source/api/copp3.rst +10 -0
  105. copp_py-0.2.1/bindings/python/docs/source/api/core.rst +35 -0
  106. copp_py-0.2.1/bindings/python/docs/source/api/index.rst +16 -0
  107. copp_py-0.2.1/bindings/python/docs/source/api/interpolation.rst +34 -0
  108. copp_py-0.2.1/bindings/python/docs/source/api/objective.rst +12 -0
  109. copp_py-0.2.1/bindings/python/docs/source/api/path.rst +29 -0
  110. copp_py-0.2.1/bindings/python/docs/source/api/robot.rst +13 -0
  111. copp_py-0.2.1/bindings/python/docs/source/api/topp2.rst +16 -0
  112. copp_py-0.2.1/bindings/python/docs/source/api/topp3.rst +16 -0
  113. copp_py-0.2.1/bindings/python/docs/source/concepts/index.rst +11 -0
  114. copp_py-0.2.1/bindings/python/docs/source/concepts/opp.rst +150 -0
  115. copp_py-0.2.1/bindings/python/docs/source/concepts/solver_selection.rst +72 -0
  116. copp_py-0.2.1/bindings/python/docs/source/conf.py +104 -0
  117. copp_py-0.2.1/bindings/python/docs/source/how_to/diagnostics.rst +57 -0
  118. copp_py-0.2.1/bindings/python/docs/source/how_to/index.rst +12 -0
  119. copp_py-0.2.1/bindings/python/docs/source/how_to/interpolation.rst +61 -0
  120. copp_py-0.2.1/bindings/python/docs/source/how_to/paths_and_constraints.rst +135 -0
  121. copp_py-0.2.1/bindings/python/docs/source/index.rst +36 -0
  122. copp_py-0.2.1/bindings/python/docs/source/quickstart.rst +60 -0
  123. copp_py-0.2.1/bindings/python/docs/source/tutorials/copp2_socp.rst +35 -0
  124. copp_py-0.2.1/bindings/python/docs/source/tutorials/copp3_socp.rst +22 -0
  125. copp_py-0.2.1/bindings/python/docs/source/tutorials/index.rst +14 -0
  126. copp_py-0.2.1/bindings/python/docs/source/tutorials/reach_set2.rst +28 -0
  127. copp_py-0.2.1/bindings/python/docs/source/tutorials/topp2_ra.rst +38 -0
  128. copp_py-0.2.1/bindings/python/docs/source/tutorials/topp3_socp.rst +27 -0
  129. copp_py-0.2.1/bindings/python/examples/copp2_socp.py +87 -0
  130. copp_py-0.2.1/bindings/python/examples/copp3_socp.py +121 -0
  131. copp_py-0.2.1/bindings/python/examples/reach_set2.py +85 -0
  132. copp_py-0.2.1/bindings/python/examples/topp2_ra.py +77 -0
  133. copp_py-0.2.1/bindings/python/examples/topp3_socp.py +114 -0
  134. copp_py-0.2.1/bindings/python/tests/test_copp2_interpolation.py +25 -0
  135. copp_py-0.2.1/bindings/python/tests/test_copp2_socp.py +204 -0
  136. copp_py-0.2.1/bindings/python/tests/test_copp3_socp.py +111 -0
  137. copp_py-0.2.1/bindings/python/tests/test_path_evaluator.py +141 -0
  138. copp_py-0.2.1/bindings/python/tests/test_path_parametric.py +107 -0
  139. copp_py-0.2.1/bindings/python/tests/test_path_waypoints.py +115 -0
  140. copp_py-0.2.1/bindings/python/tests/test_public_namespaces.py +71 -0
  141. copp_py-0.2.1/bindings/python/tests/test_reach_set2.py +100 -0
  142. copp_py-0.2.1/bindings/python/tests/test_robot_constraints.py +159 -0
  143. copp_py-0.2.1/bindings/python/tests/test_topp2_ra.py +131 -0
  144. copp_py-0.2.1/bindings/python/tests/test_topp3_interpolation.py +56 -0
  145. copp_py-0.2.1/bindings/python/tests/test_topp3_problem.py +100 -0
  146. copp_py-0.2.1/bindings/python/tests/test_topp3_socp.py +79 -0
  147. copp_py-0.2.1/examples/copp2_socp.rs +87 -0
  148. copp_py-0.2.1/examples/copp3_socp.rs +161 -0
  149. copp_py-0.2.1/examples/reach_set2.rs +85 -0
  150. copp_py-0.2.1/examples/topp2_ra.rs +76 -0
  151. copp_py-0.2.1/examples/topp3_lp.rs +145 -0
  152. copp_py-0.2.1/examples/topp3_socp.rs +145 -0
  153. copp_py-0.2.1/mathjax-config.html +14 -0
  154. copp_py-0.2.1/pyproject.toml +54 -0
  155. copp_py-0.2.1/src/copp/clarabel_backend.rs +361 -0
  156. copp_py-0.2.1/src/copp/constraints.rs +2449 -0
  157. copp_py-0.2.1/src/copp/copp2/dp2/mod.rs +12 -0
  158. copp_py-0.2.1/src/copp/copp2/dp2/reach_set2.rs +834 -0
  159. copp_py-0.2.1/src/copp/copp2/dp2/topp2_ra.rs +397 -0
  160. copp_py-0.2.1/src/copp/copp2/formulation.rs +292 -0
  161. copp_py-0.2.1/src/copp/copp2/interpolation.rs +306 -0
  162. copp_py-0.2.1/src/copp/copp2/mod.rs +54 -0
  163. copp_py-0.2.1/src/copp/copp2/opt2/clarabel_constraints.rs +246 -0
  164. copp_py-0.2.1/src/copp/copp2/opt2/copp2_socp.rs +1460 -0
  165. copp_py-0.2.1/src/copp/copp2/opt2/mod.rs +33 -0
  166. copp_py-0.2.1/src/copp/copp3/formulation.rs +735 -0
  167. copp_py-0.2.1/src/copp/copp3/interpolation.rs +627 -0
  168. copp_py-0.2.1/src/copp/copp3/mod.rs +53 -0
  169. copp_py-0.2.1/src/copp/copp3/opt3/clarabel_constraints.rs +487 -0
  170. copp_py-0.2.1/src/copp/copp3/opt3/copp3_socp.rs +2129 -0
  171. copp_py-0.2.1/src/copp/copp3/opt3/mod.rs +38 -0
  172. copp_py-0.2.1/src/copp/copp3/opt3/topp3_lp.rs +463 -0
  173. copp_py-0.2.1/src/copp/copp3/opt3/topp3_socp.rs +622 -0
  174. copp_py-0.2.1/src/copp/general.rs +123 -0
  175. copp_py-0.2.1/src/copp/mod.rs +39 -0
  176. copp_py-0.2.1/src/copp/objectives.rs +263 -0
  177. copp_py-0.2.1/src/diag/diagnostics.rs +315 -0
  178. copp_py-0.2.1/src/diag/error.rs +578 -0
  179. copp_py-0.2.1/src/diag/mod.rs +12 -0
  180. copp_py-0.2.1/src/ffi/c/core/mod.rs +13 -0
  181. copp_py-0.2.1/src/ffi/c/core/status.rs +565 -0
  182. copp_py-0.2.1/src/ffi/c/core/types.rs +717 -0
  183. copp_py-0.2.1/src/ffi/c/core/verbosity.rs +39 -0
  184. copp_py-0.2.1/src/ffi/c/core/version.rs +22 -0
  185. copp_py-0.2.1/src/ffi/c/formulation.rs +466 -0
  186. copp_py-0.2.1/src/ffi/c/interpolation.rs +582 -0
  187. copp_py-0.2.1/src/ffi/c/mod.rs +31 -0
  188. copp_py-0.2.1/src/ffi/c/path.rs +1254 -0
  189. copp_py-0.2.1/src/ffi/c/robot.rs +1801 -0
  190. copp_py-0.2.1/src/ffi/c/solver/copp2/mod.rs +3 -0
  191. copp_py-0.2.1/src/ffi/c/solver/copp2/socp.rs +1235 -0
  192. copp_py-0.2.1/src/ffi/c/solver/copp3/mod.rs +3 -0
  193. copp_py-0.2.1/src/ffi/c/solver/copp3/socp.rs +287 -0
  194. copp_py-0.2.1/src/ffi/c/solver/mod.rs +14 -0
  195. copp_py-0.2.1/src/ffi/c/solver/topp2/mod.rs +4 -0
  196. copp_py-0.2.1/src/ffi/c/solver/topp2/ra.rs +200 -0
  197. copp_py-0.2.1/src/ffi/c/solver/topp2/reach_set.rs +207 -0
  198. copp_py-0.2.1/src/ffi/c/solver/topp3/lp.rs +132 -0
  199. copp_py-0.2.1/src/ffi/c/solver/topp3/mod.rs +4 -0
  200. copp_py-0.2.1/src/ffi/c/solver/topp3/socp.rs +132 -0
  201. copp_py-0.2.1/src/ffi/mod.rs +12 -0
  202. copp_py-0.2.1/src/ffi/python/array.rs +80 -0
  203. copp_py-0.2.1/src/ffi/python/error.rs +58 -0
  204. copp_py-0.2.1/src/ffi/python/interpolation.rs +649 -0
  205. copp_py-0.2.1/src/ffi/python/mod.rs +71 -0
  206. copp_py-0.2.1/src/ffi/python/objective.rs +368 -0
  207. copp_py-0.2.1/src/ffi/python/path.rs +1574 -0
  208. copp_py-0.2.1/src/ffi/python/robot.rs +1028 -0
  209. copp_py-0.2.1/src/ffi/python/solver/clarabel.rs +1064 -0
  210. copp_py-0.2.1/src/ffi/python/solver/common.rs +105 -0
  211. copp_py-0.2.1/src/ffi/python/solver/copp2.rs +461 -0
  212. copp_py-0.2.1/src/ffi/python/solver/copp3.rs +378 -0
  213. copp_py-0.2.1/src/ffi/python/solver/mod.rs +24 -0
  214. copp_py-0.2.1/src/ffi/python/solver/topp2.rs +434 -0
  215. copp_py-0.2.1/src/ffi/python/solver/topp3.rs +420 -0
  216. copp_py-0.2.1/src/lib.rs +249 -0
  217. copp_py-0.2.1/src/math/mod.rs +11 -0
  218. copp_py-0.2.1/src/math/numerical/general.rs +12 -0
  219. copp_py-0.2.1/src/math/numerical/lp.rs +3318 -0
  220. copp_py-0.2.1/src/math/numerical/mod.rs +11 -0
  221. copp_py-0.2.1/src/path/autodiff.rs +345 -0
  222. copp_py-0.2.1/src/path/mod.rs +556 -0
  223. copp_py-0.2.1/src/path/path_core.rs +1426 -0
  224. copp_py-0.2.1/src/path/spline.rs +820 -0
  225. copp_py-0.2.1/src/robot/demo/mod.rs +12 -0
  226. copp_py-0.2.1/src/robot/demo/robot_2dof.rs +245 -0
  227. copp_py-0.2.1/src/robot/mod.rs +28 -0
  228. copp_py-0.2.1/src/robot/robot_core.rs +1092 -0
  229. copp_py-0.2.1/tests/test_franka.rs +1504 -0
  230. copp_py-0.2.1/tests/test_random_spline.rs +795 -0
@@ -0,0 +1,7 @@
1
+ # .cargo/config.toml
2
+ [build]
3
+ rustdocflags = ["--html-in-header", "mathjax-config.html"]
4
+ rustflags = ["-C", "target-cpu=native"]
5
+
6
+ [doc]
7
+ rustdocflags = ["--html-in-header", "mathjax-config.html"]
@@ -0,0 +1,37 @@
1
+ * text=auto eol=lf
2
+
3
+ # Keep Windows command scripts in their native line ending.
4
+ *.bat text eol=crlf
5
+ *.cmd text eol=crlf
6
+
7
+ # Binary assets and archives should never be line-ending normalized.
8
+ *.7z binary
9
+ *.a binary
10
+ *.avi binary
11
+ *.bin binary
12
+ *.bmp binary
13
+ *.dll binary
14
+ *.doc binary
15
+ *.docx binary
16
+ *.dylib binary
17
+ *.exe binary
18
+ *.gif binary
19
+ *.gz binary
20
+ *.ico binary
21
+ *.jpeg binary
22
+ *.jpg binary
23
+ *.lib binary
24
+ *.mat binary
25
+ *.mov binary
26
+ *.mp4 binary
27
+ *.npy binary
28
+ *.npz binary
29
+ *.pdf binary
30
+ *.png binary
31
+ *.ppt binary
32
+ *.pptx binary
33
+ *.so binary
34
+ *.tar binary
35
+ *.xls binary
36
+ *.xlsx binary
37
+ *.zip binary
@@ -0,0 +1,248 @@
1
+ name: C ABI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - "**"
7
+ tags:
8
+ - "v*"
9
+ pull_request:
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ concurrency:
16
+ group: c-abi-${{ github.workflow }}-${{ github.ref }}
17
+ cancel-in-progress: true
18
+
19
+ env:
20
+ CARGO_TERM_COLOR: always
21
+ RUSTFLAGS: "-C target-cpu=generic"
22
+
23
+ jobs:
24
+ build-package:
25
+ name: ${{ matrix.platform }} / ${{ matrix.link }}
26
+ runs-on: ${{ matrix.os }}
27
+
28
+ strategy:
29
+ fail-fast: false
30
+ matrix:
31
+ include:
32
+ - os: ubuntu-24.04
33
+ platform: linux-x86_64-gnu
34
+ link: dynamic
35
+ static_flag: OFF
36
+ - os: ubuntu-24.04
37
+ platform: linux-x86_64-gnu
38
+ link: static
39
+ static_flag: ON
40
+ - os: windows-2022
41
+ platform: windows-x86_64-msvc
42
+ link: dynamic
43
+ static_flag: OFF
44
+ - os: windows-2022
45
+ platform: windows-x86_64-msvc
46
+ link: static
47
+ static_flag: ON
48
+ - os: macos-15
49
+ platform: macos-aarch64
50
+ link: dynamic
51
+ static_flag: OFF
52
+ - os: macos-15
53
+ platform: macos-aarch64
54
+ link: static
55
+ static_flag: ON
56
+ - os: macos-15-intel
57
+ platform: macos-x86_64
58
+ link: dynamic
59
+ static_flag: OFF
60
+ - os: macos-15-intel
61
+ platform: macos-x86_64
62
+ link: static
63
+ static_flag: ON
64
+
65
+ steps:
66
+ - name: Checkout
67
+ uses: actions/checkout@v4
68
+
69
+ - name: Prepare package metadata
70
+ shell: pwsh
71
+ run: |
72
+ $refName = "${{ github.ref_name }}"
73
+ if ("${{ github.event_name }}" -eq "pull_request") {
74
+ $refName = "pr-${{ github.event.pull_request.number }}"
75
+ }
76
+ $safeRefName = $refName -replace '[^A-Za-z0-9._-]', '-'
77
+ "COPP_PACKAGE_NAME=copp-c-$safeRefName-${{ matrix.platform }}-${{ matrix.link }}" >> $env:GITHUB_ENV
78
+
79
+ - name: Install Rust
80
+ uses: dtolnay/rust-toolchain@stable
81
+
82
+ - name: Install Linux system dependencies
83
+ if: runner.os == 'Linux'
84
+ run: |
85
+ sudo apt-get update
86
+ sudo apt-get install -y pkg-config libfontconfig1-dev
87
+
88
+ - name: Cache Cargo
89
+ uses: Swatinem/rust-cache@v2
90
+ with:
91
+ key: c-abi-${{ matrix.platform }}-${{ matrix.link }}
92
+
93
+ - name: Install cbindgen
94
+ run: cargo install cbindgen
95
+
96
+ - name: Build Rust native library
97
+ run: cargo build --release --lib --features c
98
+
99
+ - name: Install nightly Rust for cbindgen expand
100
+ run: rustup toolchain install nightly --profile minimal
101
+
102
+ - name: Generate C headers
103
+ shell: pwsh
104
+ env:
105
+ RUSTUP_TOOLCHAIN: nightly
106
+ run: ./bindings/c/scripts/generate_headers.ps1
107
+
108
+ - name: Check generated C headers are committed
109
+ shell: pwsh
110
+ run: |
111
+ $changes = git status --porcelain -- bindings/c/include/copp
112
+ if ($changes) {
113
+ git diff -- bindings/c/include/copp
114
+ $changes
115
+ exit 1
116
+ }
117
+
118
+ - name: Configure C tests and examples
119
+ shell: pwsh
120
+ run: |
121
+ cmake -S bindings/c -B bindings/c/build-c-abi `
122
+ -DCMAKE_BUILD_TYPE=Release `
123
+ -DCOPP_LINK_STATIC=${{ matrix.static_flag }} `
124
+ -DCOPP_BUILD_TESTS=ON `
125
+ -DCOPP_BUILD_EXAMPLES=ON `
126
+ -DCOPP_TEST_EXAMPLES=ON `
127
+ -DCOPP_BUILD_INSTALL_TESTS=ON
128
+
129
+ - name: Build C tests and examples
130
+ run: cmake --build bindings/c/build-c-abi --config Release --parallel
131
+
132
+ - name: Run C tests, examples, and install smoke tests
133
+ run: ctest --test-dir bindings/c/build-c-abi --output-on-failure -C Release
134
+
135
+ - name: Install C SDK package
136
+ shell: pwsh
137
+ run: |
138
+ $prefix = Join-Path "dist" $env:COPP_PACKAGE_NAME
139
+ cmake --install bindings/c/build-c-abi --config Release --prefix $prefix
140
+
141
+ Copy-Item README.md (Join-Path $prefix "README.md")
142
+ Copy-Item CHANGELOG.md (Join-Path $prefix "CHANGELOG.md")
143
+ Copy-Item bindings/c/README.md (Join-Path $prefix "C-README.md")
144
+ Copy-Item bindings/c/examples (Join-Path $prefix "examples") -Recurse
145
+
146
+ $license = Get-ChildItem -Path . -File |
147
+ Where-Object { $_.Name -match '^(LICENSE|COPYING)(\..*)?$' } |
148
+ Select-Object -First 1
149
+ if ($license) {
150
+ Copy-Item $license.FullName (Join-Path $prefix $license.Name)
151
+ }
152
+
153
+ - name: Archive C SDK package
154
+ shell: pwsh
155
+ run: |
156
+ New-Item -ItemType Directory -Force release-artifacts | Out-Null
157
+ $archive = Join-Path "release-artifacts" "$env:COPP_PACKAGE_NAME.zip"
158
+
159
+ Push-Location dist
160
+ cmake -E tar cfv "../$archive" --format=zip $env:COPP_PACKAGE_NAME
161
+ Pop-Location
162
+
163
+ $hash = Get-FileHash $archive -Algorithm SHA256
164
+ "$($hash.Hash.ToLower()) $(Split-Path $archive -Leaf)" |
165
+ Set-Content -Path "$archive.sha256" -NoNewline
166
+
167
+ - name: Smoke test archived package
168
+ shell: pwsh
169
+ run: |
170
+ $archive = Join-Path "release-artifacts" "$env:COPP_PACKAGE_NAME.zip"
171
+ $extractRoot = Join-Path "release-smoke" "extract"
172
+ $buildDir = Join-Path "release-smoke" "build"
173
+
174
+ New-Item -ItemType Directory -Force $extractRoot | Out-Null
175
+ Push-Location $extractRoot
176
+ cmake -E tar xf "../../$archive"
177
+ Pop-Location
178
+
179
+ $prefix = Resolve-Path (Join-Path $extractRoot $env:COPP_PACKAGE_NAME)
180
+ cmake -S bindings/c/tests/package_consumer -B $buildDir `
181
+ -DCMAKE_PREFIX_PATH="$prefix" `
182
+ -DCMAKE_BUILD_TYPE=Release
183
+ cmake --build $buildDir --config Release --parallel
184
+ ctest --test-dir $buildDir --output-on-failure -C Release
185
+
186
+ - name: Upload release package artifact
187
+ uses: actions/upload-artifact@v4
188
+ with:
189
+ name: ${{ env.COPP_PACKAGE_NAME }}
190
+ path: |
191
+ release-artifacts/${{ env.COPP_PACKAGE_NAME }}.zip
192
+ release-artifacts/${{ env.COPP_PACKAGE_NAME }}.zip.sha256
193
+ if-no-files-found: error
194
+
195
+ publish-draft:
196
+ name: Create Draft GitHub Release
197
+ needs: build-package
198
+ if: startsWith(github.ref, 'refs/tags/v')
199
+ runs-on: ubuntu-24.04
200
+ permissions:
201
+ contents: write
202
+
203
+ steps:
204
+ - name: Download release package artifacts
205
+ uses: actions/download-artifact@v4
206
+ with:
207
+ path: release-assets
208
+
209
+ - name: Create or update draft GitHub Release
210
+ shell: pwsh
211
+ env:
212
+ GH_TOKEN: ${{ github.token }}
213
+ GH_REPO: ${{ github.repository }}
214
+ RELEASE_TAG: ${{ github.ref_name }}
215
+ run: |
216
+ $assetPaths = @(
217
+ Get-ChildItem release-assets -Recurse -File |
218
+ Where-Object { $_.Name -like "*.zip" -or $_.Name -like "*.zip.sha256" } |
219
+ Sort-Object Name |
220
+ ForEach-Object { $_.FullName }
221
+ )
222
+ if ($assetPaths.Count -eq 0) {
223
+ throw "No release assets were downloaded."
224
+ }
225
+
226
+ $notesFile = "release-notes.md"
227
+ @'
228
+ Prebuilt C ABI SDK packages are attached below.
229
+
230
+ Each package contains the generated C headers, the Release native library, examples, and the CMake package files needed for `find_package(copp CONFIG REQUIRED)`.
231
+
232
+ See CHANGELOG.md in this tag for API changes and breaking changes.
233
+ '@ | Set-Content -Path $notesFile -NoNewline
234
+
235
+ gh release view $env:RELEASE_TAG *> $null
236
+ if ($LASTEXITCODE -eq 0) {
237
+ & gh release upload $env:RELEASE_TAG @assetPaths --clobber
238
+ & gh release edit $env:RELEASE_TAG `
239
+ --draft `
240
+ --title $env:RELEASE_TAG `
241
+ --notes-file $notesFile
242
+ } else {
243
+ & gh release create $env:RELEASE_TAG @assetPaths `
244
+ --draft `
245
+ --verify-tag `
246
+ --title $env:RELEASE_TAG `
247
+ --notes-file $notesFile
248
+ }
@@ -0,0 +1,186 @@
1
+ name: Python Wheels
2
+
3
+ on:
4
+ push:
5
+ branches: ["**"]
6
+ tags: ["v*"]
7
+ paths:
8
+ - "bindings/python/**"
9
+ - "src/**"
10
+ - "Cargo.toml"
11
+ - "Cargo.lock"
12
+ - "pyproject.toml"
13
+ - ".github/workflows/python-wheels.yml"
14
+ pull_request:
15
+ paths:
16
+ - "bindings/python/**"
17
+ - "src/**"
18
+ - "Cargo.toml"
19
+ - "Cargo.lock"
20
+ - "pyproject.toml"
21
+ - ".github/workflows/python-wheels.yml"
22
+ release:
23
+ types: [published]
24
+ workflow_dispatch:
25
+ inputs:
26
+ publish_testpypi:
27
+ description: "Publish built wheels and sdist to TestPyPI"
28
+ required: false
29
+ default: false
30
+ type: boolean
31
+
32
+ env:
33
+ RUSTFLAGS: "-C target-cpu=generic"
34
+
35
+ jobs:
36
+ build:
37
+ strategy:
38
+ fail-fast: false
39
+ matrix:
40
+ include:
41
+ - os: ubuntu-latest
42
+ target: x86_64
43
+ artifact: wheel-ubuntu-latest-x86_64
44
+ interpreter_args: -i python3.10 -i python3.11 -i python3.12 -i python3.13 -i python3.14
45
+ - os: ubuntu-latest
46
+ target: aarch64
47
+ artifact: wheel-ubuntu-latest-aarch64
48
+ interpreter_args: -i python3.10 -i python3.11 -i python3.12 -i python3.13 -i python3.14
49
+ - os: macos-15-intel
50
+ target: x86_64
51
+ artifact: wheel-macos-15-intel-x86_64
52
+ interpreter_args: -i python
53
+ - os: macos-14
54
+ target: aarch64
55
+ artifact: wheel-macos-14-aarch64
56
+ interpreter_args: -i python
57
+ - os: windows-latest
58
+ target: x86_64
59
+ artifact: wheel-windows-latest-x86_64
60
+ interpreter_args: -i python
61
+ runs-on: ${{ matrix.os }}
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ - uses: actions/setup-python@v5
65
+ if: runner.os != 'Linux'
66
+ with:
67
+ python-version: "3.10"
68
+ allow-prereleases: true
69
+ - uses: PyO3/maturin-action@v1
70
+ with:
71
+ target: ${{ matrix.target }}
72
+ args: --release --out dist ${{ matrix.interpreter_args }}
73
+ manylinux: auto
74
+ - uses: actions/upload-artifact@v4
75
+ with:
76
+ name: ${{ matrix.artifact }}
77
+ path: dist/*.whl
78
+
79
+ sdist:
80
+ runs-on: ubuntu-latest
81
+ steps:
82
+ - uses: actions/checkout@v4
83
+ - uses: PyO3/maturin-action@v1
84
+ with:
85
+ command: sdist
86
+ args: --out dist
87
+ - uses: actions/upload-artifact@v4
88
+ with:
89
+ name: sdist
90
+ path: dist/*.tar.gz
91
+
92
+ test:
93
+ needs: [build]
94
+ strategy:
95
+ fail-fast: false
96
+ matrix:
97
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
98
+ runs-on: ubuntu-latest
99
+ steps:
100
+ - uses: actions/checkout@v4
101
+ - uses: actions/setup-python@v5
102
+ with:
103
+ python-version: ${{ matrix.python-version }}
104
+ allow-prereleases: true
105
+ - uses: actions/download-artifact@v4
106
+ with:
107
+ name: wheel-ubuntu-latest-x86_64
108
+ path: dist
109
+ - env:
110
+ PYTEST_DISABLE_PLUGIN_AUTOLOAD: 1
111
+ run: |
112
+ python -m pip install numpy pytest
113
+ python -m pip install --no-index --find-links dist copp-py
114
+ python -m pytest bindings/python/tests/ -v
115
+
116
+ smoke-test:
117
+ needs: [build]
118
+ strategy:
119
+ fail-fast: false
120
+ matrix:
121
+ include:
122
+ - runner: ubuntu-latest
123
+ artifact: wheel-ubuntu-latest-x86_64
124
+ - runner: ubuntu-24.04-arm
125
+ artifact: wheel-ubuntu-latest-aarch64
126
+ - runner: macos-15-intel
127
+ artifact: wheel-macos-15-intel-x86_64
128
+ - runner: macos-14
129
+ artifact: wheel-macos-14-aarch64
130
+ - runner: windows-latest
131
+ artifact: wheel-windows-latest-x86_64
132
+ runs-on: ${{ matrix.runner }}
133
+ steps:
134
+ - uses: actions/checkout@v4
135
+ - uses: actions/setup-python@v5
136
+ with:
137
+ python-version: "3.10"
138
+ allow-prereleases: true
139
+ - uses: actions/download-artifact@v4
140
+ with:
141
+ name: ${{ matrix.artifact }}
142
+ path: dist
143
+ - env:
144
+ PYTEST_DISABLE_PLUGIN_AUTOLOAD: 1
145
+ run: |
146
+ python -m pip install numpy pytest
147
+ python -m pip install --no-index --find-links dist copp-py
148
+ python -m pytest bindings/python/tests/ -v
149
+
150
+ publish-testpypi:
151
+ name: Publish to TestPyPI
152
+ needs: [sdist, test, smoke-test]
153
+ if: (github.event_name == 'workflow_dispatch' && inputs.publish_testpypi) || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v'))
154
+ runs-on: ubuntu-latest
155
+ environment: testpypi
156
+ permissions:
157
+ contents: read
158
+ id-token: write
159
+ steps:
160
+ - uses: actions/download-artifact@v4
161
+ with:
162
+ path: dist
163
+ merge-multiple: true
164
+ - uses: pypa/gh-action-pypi-publish@release/v1
165
+ with:
166
+ repository-url: https://test.pypi.org/legacy/
167
+ packages-dir: dist
168
+ skip-existing: true
169
+
170
+ publish-pypi:
171
+ name: Publish to PyPI
172
+ needs: [sdist, test, smoke-test]
173
+ if: github.event_name == 'release' && startsWith(github.event.release.tag_name, 'v')
174
+ runs-on: ubuntu-latest
175
+ environment: pypi
176
+ permissions:
177
+ contents: read
178
+ id-token: write
179
+ steps:
180
+ - uses: actions/download-artifact@v4
181
+ with:
182
+ path: dist
183
+ merge-multiple: true
184
+ - uses: pypa/gh-action-pypi-publish@release/v1
185
+ with:
186
+ packages-dir: dist
@@ -0,0 +1,54 @@
1
+ name: Rust
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: rust-${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ env:
16
+ CARGO_TERM_COLOR: always
17
+ RUSTFLAGS: "-C target-cpu=generic"
18
+
19
+ jobs:
20
+ test:
21
+ name: ${{ matrix.os }}
22
+ runs-on: ${{ matrix.os }}
23
+
24
+ strategy:
25
+ fail-fast: false
26
+ matrix:
27
+ os:
28
+ - ubuntu-latest
29
+ - windows-latest
30
+ - macos-latest
31
+
32
+ steps:
33
+ - name: Checkout
34
+ uses: actions/checkout@v4
35
+
36
+ - name: Install Rust
37
+ uses: dtolnay/rust-toolchain@stable
38
+
39
+ - name: Install Linux system dependencies
40
+ if: runner.os == 'Linux'
41
+ run: |
42
+ sudo apt-get update
43
+ sudo apt-get install -y pkg-config libfontconfig1-dev
44
+
45
+ - name: Cache Cargo
46
+ uses: Swatinem/rust-cache@v2
47
+ with:
48
+ key: rust-${{ matrix.os }}
49
+
50
+ - name: Run Rust tests
51
+ run: cargo test --release --all-targets
52
+
53
+ - name: Run Rust doc tests
54
+ run: cargo test --release --doc
@@ -0,0 +1,28 @@
1
+ # Rust
2
+ /target
3
+ /data
4
+ /.vscode
5
+
6
+ # C
7
+ /bindings/**/build/
8
+ /bindings/**/build-*/
9
+ /bindings/c/docs/
10
+
11
+ # Python
12
+ __pycache__/
13
+ *.py[cod]
14
+ *$py.class
15
+ .pytest_cache/
16
+ .ruff_cache/
17
+ .mypy_cache/
18
+ .pyright/
19
+ .coverage
20
+ coverage.xml
21
+ htmlcov/
22
+ *.egg-info/
23
+ *.dist-info/
24
+ *.whl
25
+ *.pdb
26
+ pip-wheel-metadata/
27
+ /site/
28
+ /bindings/python/docs/build/
@@ -0,0 +1,38 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+
5
+ This changelog follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [0.2.1]
8
+
9
+ ### Added
10
+
11
+ - [Rust] Made `Constraints::new`, `Constraints::with_capacity`, `Constraints::with_s`, and `Constraints::with_q` public for advanced low-level constraint construction.
12
+ - [Rust] Added documentation examples for direct constraint construction, problem builders, custom path/robot integration, custom objective/sampler interfaces, and Clarabel expert status handling.
13
+ - [Python] Added the initial Python API surface, including path and robot bindings, problem/options/result types, and solver entry points.
14
+ - [c] Added a Cargo `c` feature for the C ABI; source builds now use `cargo build --release --lib --features c` when producing C libraries.
15
+
16
+ ## [0.2.0]
17
+
18
+ ### Breaking Changes
19
+
20
+ - [Rust] Changed the `RobotTorque::inverse_dynamics` contract to return `Result<(), RobotDynamicsError>`, allowing robot models to report inverse-dynamics failures with user-facing error messages.
21
+ - [Rust] Wrapped third-order trajectory results in dedicated profile types (`Topp3Profile` in Rust and `CoppProfile3rd` in the C API), replacing parts of the previous public API.
22
+
23
+ ### Added
24
+
25
+ - [Rust] Added dry-friction support to inverse-dynamics evaluation through `RobotTorque`. The current model supports biased Coulomb friction; viscous friction is not supported.
26
+ - [Rust] Added `Path::from_evaluator` as a compatibility constructor for third-order path evaluators.
27
+ - [C] Added the initial C API surface, including core types, path and robot bindings, formulation helpers, solver entry points, generated headers, and C integration tests.
28
+
29
+ ### Changed
30
+
31
+ - [Rust] Changed `ClarabelOptionsBuilder` defaults to accept Clarabel `AlmostSolved` status by default, aligning the Rust solver policy with the intended production-friendly default.
32
+ - [Rust] Made the `Robot::with_*` and `Constraints::with_*` builder APIs chainable.
33
+
34
+ ## [0.1.0] - Initial Release
35
+
36
+ ### Added
37
+
38
+ - [Rust] Initial Rust implementation of convex-objective path parameterization primitives and solvers.