InterpolatePy 3.2.0__tar.gz → 3.2.2__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 (245) hide show
  1. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.github/workflows/docs.yml +16 -1
  2. interpolatepy-3.2.2/.github/workflows/test.yml +87 -0
  3. interpolatepy-3.2.2/ALGORITHMS.md +155 -0
  4. interpolatepy-3.2.2/InterpolatePy.egg-info/PKG-INFO +172 -0
  5. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/InterpolatePy.egg-info/SOURCES.txt +4 -0
  6. interpolatepy-3.2.2/PKG-INFO +172 -0
  7. interpolatepy-3.2.2/README.md +131 -0
  8. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/CMakeLists.txt +5 -0
  9. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/bspline_example.cpp +1 -1
  10. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/cubic_smoothing_example.cpp +1 -1
  11. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/cubic_spline_acc1_example.cpp +3 -3
  12. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/trapezoidal_example.cpp +3 -1
  13. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_quaternion_spline.cpp +48 -0
  14. interpolatepy-3.2.2/docs/algorithms.md +194 -0
  15. interpolatepy-3.2.2/docs/api-reference.md +214 -0
  16. interpolatepy-3.2.2/docs/architecture.md +134 -0
  17. interpolatepy-3.2.2/docs/changelog.md +119 -0
  18. interpolatepy-3.2.2/docs/contributing.md +207 -0
  19. interpolatepy-3.2.2/docs/examples.md +127 -0
  20. interpolatepy-3.2.2/docs/index.md +90 -0
  21. interpolatepy-3.2.2/docs/installation.md +176 -0
  22. interpolatepy-3.2.2/docs/quickstart.md +143 -0
  23. interpolatepy-3.2.2/docs/troubleshooting.md +249 -0
  24. interpolatepy-3.2.2/docs/tutorials/motion-profiles.md +223 -0
  25. interpolatepy-3.2.2/docs/tutorials/path-planning.md +180 -0
  26. interpolatepy-3.2.2/docs/tutorials/quaternion-interpolation.md +216 -0
  27. interpolatepy-3.2.2/docs/tutorials/spline-interpolation.md +256 -0
  28. interpolatepy-3.2.2/docs/user-guide.md +179 -0
  29. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_approx_ex.py +2 -2
  30. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_cubic_ex.py +2 -3
  31. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_ex.py +6 -9
  32. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_interpolate_ex.py +8 -12
  33. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_smooth_ex.py +3 -4
  34. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/c_s_smoot_search_ex.py +4 -4
  35. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/c_s_smoothing_ex.py +6 -6
  36. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/c_s_with_acc1_ex.py +1 -1
  37. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/c_s_with_acc2_ex.py +2 -2
  38. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/cubic_spline_ex.py +2 -1
  39. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/double_s_ex.py +3 -3
  40. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/frenet_frame_ex.py +4 -4
  41. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/lin_poly_parabolic_ex.py +1 -3
  42. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/linear_ex.py +1 -1
  43. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/log_quat_new_ex.py +4 -3
  44. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/lqi_spiral_frenet_ex.py +4 -4
  45. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/main.py +1 -1
  46. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/mlqi_spiral_frenet_ex.py +3 -3
  47. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/polynomials_ex.py +4 -4
  48. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/quat_visualization_ex.py +2 -2
  49. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/simple_paths_ex.py +5 -5
  50. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/squad_c2_ex.py +3 -3
  51. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/trapezoidal_ex.py +2 -2
  52. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_adapters/__init__.py +4 -4
  53. interpolatepy-3.2.2/interpolatepy/_adapters/_bspline.py +228 -0
  54. interpolatepy-3.2.2/interpolatepy/_adapters/_direct.py +43 -0
  55. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_adapters/_motion.py +73 -0
  56. interpolatepy-3.2.2/interpolatepy/_adapters/_quaternion.py +315 -0
  57. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_adapters/_spline.py +34 -0
  58. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline.py +1 -7
  59. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline_approx.py +7 -8
  60. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline_cubic.py +14 -16
  61. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline_interpolate.py +6 -10
  62. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline_smooth.py +10 -13
  63. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/c_s_smoothing.py +8 -16
  64. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/c_s_with_acc1.py +12 -17
  65. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/c_s_with_acc2.py +2 -3
  66. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/cubic_spline.py +10 -15
  67. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/double_s.py +40 -30
  68. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/frenet_frame.py +1 -2
  69. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/lin_poly_parabolic.py +1 -5
  70. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/log_quat.py +3 -3
  71. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/protocols.py +3 -2
  72. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/squad_c2.py +7 -8
  73. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/trapezoidal.py +5 -5
  74. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/version.py +1 -1
  75. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/pyproject.toml +1 -1
  76. interpolatepy-3.2.2/scripts/__init__.py +1 -0
  77. interpolatepy-3.2.2/scripts/check_doc_snippets.py +75 -0
  78. interpolatepy-3.2.2/scripts/check_python_examples.py +100 -0
  79. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_b_spline_variants.py +23 -0
  80. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_log_quat.py +4 -4
  81. interpolatepy-3.2.2/tests/test_native_adapter_api.py +127 -0
  82. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/uv.lock +1 -1
  83. interpolatepy-3.2.0/.github/workflows/test.yml +0 -36
  84. interpolatepy-3.2.0/ALGORITHMS.md +0 -1092
  85. interpolatepy-3.2.0/InterpolatePy.egg-info/PKG-INFO +0 -377
  86. interpolatepy-3.2.0/PKG-INFO +0 -377
  87. interpolatepy-3.2.0/README.md +0 -336
  88. interpolatepy-3.2.0/docs/algorithms.md +0 -819
  89. interpolatepy-3.2.0/docs/api-reference.md +0 -802
  90. interpolatepy-3.2.0/docs/architecture.md +0 -122
  91. interpolatepy-3.2.0/docs/changelog.md +0 -247
  92. interpolatepy-3.2.0/docs/contributing.md +0 -704
  93. interpolatepy-3.2.0/docs/examples.md +0 -1436
  94. interpolatepy-3.2.0/docs/index.md +0 -198
  95. interpolatepy-3.2.0/docs/installation.md +0 -433
  96. interpolatepy-3.2.0/docs/quickstart.md +0 -376
  97. interpolatepy-3.2.0/docs/troubleshooting.md +0 -452
  98. interpolatepy-3.2.0/docs/tutorials/motion-profiles.md +0 -906
  99. interpolatepy-3.2.0/docs/tutorials/path-planning.md +0 -248
  100. interpolatepy-3.2.0/docs/tutorials/quaternion-interpolation.md +0 -212
  101. interpolatepy-3.2.0/docs/tutorials/spline-interpolation.md +0 -941
  102. interpolatepy-3.2.0/docs/user-guide.md +0 -680
  103. interpolatepy-3.2.0/interpolatepy/_adapters/_bspline.py +0 -77
  104. interpolatepy-3.2.0/interpolatepy/_adapters/_direct.py +0 -23
  105. interpolatepy-3.2.0/interpolatepy/_adapters/_quaternion.py +0 -177
  106. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.editorconfig +0 -0
  107. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.gitattributes +0 -0
  108. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.github/FUNDING.yml +0 -0
  109. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.github/workflows/pre-commit.yml +0 -0
  110. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.github/workflows/publish.yml +0 -0
  111. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.gitignore +0 -0
  112. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.pre-commit-config.yaml +0 -0
  113. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.python-version +0 -0
  114. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/InterpolatePy.egg-info/dependency_links.txt +0 -0
  115. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/InterpolatePy.egg-info/requires.txt +0 -0
  116. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/InterpolatePy.egg-info/top_level.txt +0 -0
  117. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/LICENSE +0 -0
  118. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/codecov.yml +0 -0
  119. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/CMakeLists.txt +0 -0
  120. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/CMakeLists.txt +0 -0
  121. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_acc_splines.cpp +0 -0
  122. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_bspline.cpp +0 -0
  123. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_cubic_spline.cpp +0 -0
  124. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_motion.cpp +0 -0
  125. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_paths.cpp +0 -0
  126. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_quaternion.cpp +0 -0
  127. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_smoothing_search.cpp +0 -0
  128. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_smoothing_spline.cpp +0 -0
  129. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_tridiagonal.cpp +0 -0
  130. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/module.cpp +0 -0
  131. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/cmake/InterpolateCppConfig.cmake.in +0 -0
  132. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/cmake/version.hpp.in +0 -0
  133. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/bspline_approx_smooth_example.cpp +0 -0
  134. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/bspline_cubic_example.cpp +0 -0
  135. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/bspline_interpolator_example.cpp +0 -0
  136. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/concepts_example.cpp +0 -0
  137. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/cubic_spline_acc2_example.cpp +0 -0
  138. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/cubic_spline_example.cpp +0 -0
  139. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/double_s_example.cpp +0 -0
  140. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/parabolic_linear_example.cpp +0 -0
  141. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/paths_example.cpp +0 -0
  142. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/polynomial_example.cpp +0 -0
  143. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/quaternion_example.cpp +0 -0
  144. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/shared/example_utils.hpp +0 -0
  145. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/approximation_bspline.hpp +0 -0
  146. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/bspline.hpp +0 -0
  147. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/bspline_interpolator.hpp +0 -0
  148. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/bspline_parameters.hpp +0 -0
  149. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/cubic_bspline_interpolation.hpp +0 -0
  150. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/smoothing_cubic_bspline.hpp +0 -0
  151. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/concepts.hpp +0 -0
  152. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/config.hpp +0 -0
  153. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/double_s_trajectory.hpp +0 -0
  154. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/motion_types.hpp +0 -0
  155. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/parabolic_blend_trajectory.hpp +0 -0
  156. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/polynomial_trajectory.hpp +0 -0
  157. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/trapezoidal_trajectory.hpp +0 -0
  158. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/path/circular_path.hpp +0 -0
  159. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/path/frenet_frame.hpp +0 -0
  160. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/path/linear_path.hpp +0 -0
  161. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/path/linear_traj.hpp +0 -0
  162. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/log_quaternion_interpolation.hpp +0 -0
  163. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/modified_log_quaternion_interpolation.hpp +0 -0
  164. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/quaternion.hpp +0 -0
  165. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/quaternion_spline.hpp +0 -0
  166. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/squad_c2.hpp +0 -0
  167. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/cubic_smoothing_spline.hpp +0 -0
  168. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/cubic_spline.hpp +0 -0
  169. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/cubic_spline_with_acc1.hpp +0 -0
  170. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/cubic_spline_with_acc2.hpp +0 -0
  171. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/smoothing_search.hpp +0 -0
  172. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/spline_parameters.hpp +0 -0
  173. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/tridiagonal.hpp +0 -0
  174. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/approximation_bspline.cpp +0 -0
  175. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/bspline.cpp +0 -0
  176. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/bspline_interpolator.cpp +0 -0
  177. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/circular_path.cpp +0 -0
  178. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_bspline_interpolation.cpp +0 -0
  179. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_smoothing_spline.cpp +0 -0
  180. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_spline.cpp +0 -0
  181. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_spline_with_acc1.cpp +0 -0
  182. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_spline_with_acc2.cpp +0 -0
  183. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/double_s_trajectory.cpp +0 -0
  184. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/frenet_frame.cpp +0 -0
  185. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/linear_path.cpp +0 -0
  186. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/linear_traj.cpp +0 -0
  187. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/log_quaternion_interpolation.cpp +0 -0
  188. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/modified_log_quaternion_interpolation.cpp +0 -0
  189. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/parabolic_blend_trajectory.cpp +0 -0
  190. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/polynomial_trajectory.cpp +0 -0
  191. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/quaternion.cpp +0 -0
  192. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/quaternion_spline.cpp +0 -0
  193. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/smoothing_cubic_bspline.cpp +0 -0
  194. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/smoothing_search.cpp +0 -0
  195. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/squad_c2.cpp +0 -0
  196. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/trapezoidal_trajectory.cpp +0 -0
  197. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/CMakeLists.txt +0 -0
  198. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/shared/test_data.hpp +0 -0
  199. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_bspline.cpp +0 -0
  200. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_bspline_variants.cpp +0 -0
  201. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_concepts.cpp +0 -0
  202. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_cubic_smoothing_spline.cpp +0 -0
  203. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_cubic_spline.cpp +0 -0
  204. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_cubic_spline_with_acc1.cpp +0 -0
  205. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_cubic_spline_with_acc2.cpp +0 -0
  206. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_double_s_trajectory.cpp +0 -0
  207. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_parabolic_blend_trajectory.cpp +0 -0
  208. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_paths.cpp +0 -0
  209. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_polynomial_trajectory.cpp +0 -0
  210. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_quaternion.cpp +0 -0
  211. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_smoothing_search.cpp +0 -0
  212. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_trapezoidal_trajectory.cpp +0 -0
  213. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_tridiagonal.cpp +0 -0
  214. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/docs/assets/extra.css +0 -0
  215. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/docs/assets/extra.js +0 -0
  216. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/protocols_ex.py +0 -0
  217. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/__init__.py +0 -0
  218. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_adapters/_paths.py +0 -0
  219. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_api.py +0 -0
  220. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_backend.py +0 -0
  221. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/c_s_smoot_search.py +0 -0
  222. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/linear.py +0 -0
  223. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/polynomials.py +0 -0
  224. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/quat_core.py +0 -0
  225. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/quat_spline.py +0 -0
  226. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/quat_visualization.py +0 -0
  227. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/simple_paths.py +0 -0
  228. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/tridiagonal_inv.py +0 -0
  229. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/mkdocs.yml +0 -0
  230. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/setup.cfg +0 -0
  231. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/__init__.py +0 -0
  232. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/inv_test.py +0 -0
  233. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_b_spline.py +0 -0
  234. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_backend.py +0 -0
  235. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_cubic_spline.py +0 -0
  236. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_lin_poly_parabolic.py +0 -0
  237. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_linear.py +0 -0
  238. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_motion_profiles.py +0 -0
  239. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_path_planning.py +0 -0
  240. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_polynomials.py +0 -0
  241. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_protocols.py +0 -0
  242. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_quat_interp.py +0 -0
  243. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_quat_visualization.py +0 -0
  244. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_smoothing.py +0 -0
  245. {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_squad_c2.py +0 -0
@@ -4,16 +4,26 @@ on:
4
4
  push:
5
5
  branches: [ main, dev ]
6
6
  paths:
7
+ - 'README.md'
8
+ - 'ALGORITHMS.md'
7
9
  - 'docs/**'
8
10
  - 'mkdocs.yml'
9
11
  - 'interpolatepy/**/*.py' # Only Python files for API docs
12
+ - 'scripts/check_doc_snippets.py'
13
+ - 'pyproject.toml'
14
+ - 'uv.lock'
10
15
  - '.github/workflows/docs.yml'
11
16
  pull_request:
12
17
  branches: [ main ]
13
18
  paths:
19
+ - 'README.md'
20
+ - 'ALGORITHMS.md'
14
21
  - 'docs/**'
15
22
  - 'mkdocs.yml'
16
23
  - 'interpolatepy/**/*.py'
24
+ - 'scripts/check_doc_snippets.py'
25
+ - 'pyproject.toml'
26
+ - 'uv.lock'
17
27
  workflow_dispatch: # Allow manual triggering
18
28
 
19
29
  permissions:
@@ -44,6 +54,12 @@ jobs:
44
54
  - name: Sync dependencies
45
55
  run: uv sync --locked --no-default-groups --group docs
46
56
 
57
+ - name: Check documentation snippets
58
+ env:
59
+ INTERPOLATEPY_NO_CPP: '1'
60
+ MPLBACKEND: Agg
61
+ run: uv run python -m scripts.check_doc_snippets
62
+
47
63
  - name: Build documentation
48
64
  run: uv run mkdocs build --clean --strict
49
65
 
@@ -69,4 +85,3 @@ jobs:
69
85
  - name: Deploy to GitHub Pages
70
86
  id: deployment
71
87
  uses: actions/deploy-pages@v5
72
-
@@ -0,0 +1,87 @@
1
+ name: ci-test
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, master ]
6
+ pull_request:
7
+ branches: [ main, master ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ${{ matrix.os }}
12
+ strategy:
13
+ matrix:
14
+ os: [ubuntu-latest, macos-latest]
15
+ python-version: ['3.11', '3.12', '3.13']
16
+ env:
17
+ UV_PYTHON: ${{ matrix.python-version }}
18
+ steps:
19
+ - uses: actions/checkout@v6
20
+ - name: Install uv
21
+ uses: astral-sh/setup-uv@v8.1.0
22
+ with:
23
+ enable-cache: true
24
+ cache-dependency-glob: uv.lock
25
+ - name: Sync dependencies
26
+ run: uv sync --locked --no-default-groups --group test
27
+ - name: Testing with coverage
28
+ run: uv run pytest tests --cov=interpolatepy --cov-report=xml --cov-report=term-missing
29
+ - name: Upload coverage to Codecov
30
+ uses: codecov/codecov-action@v6
31
+ with:
32
+ token: ${{ secrets.CODECOV_TOKEN }}
33
+ files: ./coverage.xml
34
+ flags: unittests
35
+ name: codecov-umbrella
36
+ fail_ci_if_error: false
37
+
38
+ python-examples:
39
+ runs-on: ubuntu-latest
40
+ env:
41
+ UV_PYTHON: '3.12'
42
+ steps:
43
+ - uses: actions/checkout@v6
44
+ - name: Install uv
45
+ uses: astral-sh/setup-uv@v8.1.0
46
+ with:
47
+ enable-cache: true
48
+ cache-dependency-glob: uv.lock
49
+ - name: Sync dependencies
50
+ run: uv sync --locked --no-default-groups --group test
51
+ - name: Run Python examples with the fallback backend
52
+ run: uv run python -m scripts.check_python_examples --backend python
53
+
54
+ native:
55
+ runs-on: ubuntu-latest
56
+ env:
57
+ UV_PYTHON: '3.12'
58
+ steps:
59
+ - uses: actions/checkout@v6
60
+ - name: Install uv
61
+ uses: astral-sh/setup-uv@v8.1.0
62
+ with:
63
+ enable-cache: true
64
+ cache-dependency-glob: uv.lock
65
+ - name: Sync dependencies
66
+ run: uv sync --locked --no-default-groups --group test
67
+ - name: Configure C++ tests, examples, and Python bindings
68
+ run: |
69
+ cmake -S cpp -B build/cpp \
70
+ -DINTERPOLATECPP_BUILD_TESTS=ON \
71
+ -DINTERPOLATECPP_BUILD_EXAMPLES=ON \
72
+ -DINTERPOLATECPP_BUILD_BINDINGS=ON \
73
+ -DPython_EXECUTABLE=$(uv run python -c 'import sys; print(sys.executable)')
74
+ - name: Build native targets
75
+ run: cmake --build build/cpp --parallel 4
76
+ - name: Run C++ tests and examples
77
+ run: ctest --test-dir build/cpp --output-on-failure
78
+ - name: Activate the native Python backend
79
+ run: cp build/cpp/bindings/interpolatecpp_py*.so interpolatepy/
80
+ - name: Run native adapter regressions
81
+ run: uv run pytest tests/test_backend.py tests/test_native_adapter_api.py
82
+ - name: Run documentation snippets with the native backend
83
+ env:
84
+ MPLBACKEND: Agg
85
+ run: uv run python -m scripts.check_doc_snippets
86
+ - name: Run Python examples with the native backend
87
+ run: uv run python -m scripts.check_python_examples --backend native
@@ -0,0 +1,155 @@
1
+ # InterpolatePy algorithm guide
2
+
3
+ This page is a compact map of the algorithms exposed by InterpolatePy 3.2.1.
4
+ For constructor signatures and complete method documentation, use the
5
+ [API reference](docs/api-reference.md). For worked code, use the
6
+ [tutorials](docs/user-guide.md) and [`examples/`](examples/).
7
+
8
+ ## Choose by problem
9
+
10
+ | Problem | Start with | Why |
11
+ | --- | --- | --- |
12
+ | Interpolate scalar waypoints with specified endpoint velocities | `CubicSpline` | Piecewise cubic, C2 across interior knots, inexpensive evaluation |
13
+ | Fit noisy scalar samples | `CubicSmoothingSpline` | Trades waypoint error against curvature through `mu` and weights |
14
+ | Also constrain endpoint accelerations | `CubicSplineWithAcceleration1` or `CubicSplineWithAcceleration2` | Adds endpoint acceleration conditions with two different constructions |
15
+ | Evaluate a curve from known B-spline control points | `BSpline` | Direct control over degree, knots, and control points |
16
+ | Pass a B-spline through parametric samples | `BSplineInterpolator` | Degrees 3, 4, and 5; optional velocity/acceleration/cyclic constraints |
17
+ | Approximate many points with fewer controls | `ApproximationBSpline` | Weighted least-squares curve reduction |
18
+ | Smooth a vector-valued curve | `SmoothingCubicBSpline` | Cubic B-spline fit with a smoothness/fidelity trade-off |
19
+ | Limit velocity, acceleration, and jerk | `DoubleSTrajectory` | Seven-phase jerk-limited Double-S profile |
20
+ | Limit velocity and acceleration | `TrapezoidalTrajectory` | Trapezoidal or triangular velocity profile |
21
+ | Match endpoint derivatives exactly | `PolynomialTrajectory` | Cubic, quintic, or seventh-order polynomial boundary interpolation |
22
+ | Blend a scalar via-point sequence | `ParabolicBlendTrajectory` | Linear segments joined by parabolic blends |
23
+ | Interpolate two orientations | `Quaternion.slerp()` | Shortest-path spherical interpolation |
24
+ | Interpolate orientation keyframes | `QuaternionSpline` | Piecewise SLERP/SQUAD selected explicitly or automatically |
25
+ | Require a smooth SQUAD-style orientation trajectory | `SquadC2` | Virtual endpoints and smooth angular derivative evaluation |
26
+ | Interpolate rotations in logarithmic coordinates | `LogQuaternionInterpolation` | B-spline interpolation of continuous rotation vectors |
27
+ | Decouple rotation angle and axis | `ModifiedLogQuaternionInterpolation` | Separate angle and unit-axis spline state |
28
+ | Describe a 3D line or circle geometrically | `LinearPath` or `CircularPath` | Arc-length parameterized position and geometric derivatives |
29
+ | Attach a moving frame to a parametric curve | `compute_trajectory_frames()` | Frenet tangent, normal, and binormal, with optional tool rotation |
30
+
31
+ ## Scalar cubic splines
32
+
33
+ For times `t_i`, positions `q_i`, and segment duration `h_i`, each
34
+ `CubicSpline` segment is a cubic polynomial. Coefficients are chosen so that it
35
+ passes through both segment endpoints, matches waypoint velocities, and has
36
+ continuous acceleration at interior waypoints. `v0` and `vn` are clamped
37
+ endpoint velocities; the defaults are zero velocity, not natural (zero
38
+ curvature) boundary conditions.
39
+
40
+ `CubicSmoothingSpline` minimizes a combination of weighted data error and curve
41
+ roughness. Its parameter follows these conventions:
42
+
43
+ - `mu=1` gives exact interpolation.
44
+ - Smaller positive `mu` values emphasize smoothness.
45
+ - An infinite point weight pins that sample exactly.
46
+ - `mu` must be in `(0, 1]`.
47
+
48
+ Use `smoothing_spline_with_tolerance()` when the input requirement is a maximum
49
+ waypoint error rather than a preselected `mu`. It returns the spline, selected
50
+ `mu`, achieved maximum error, and iteration count.
51
+
52
+ The acceleration variants have different APIs:
53
+
54
+ - `CubicSplineWithAcceleration1(..., v0, vn, a0, an)` adds virtual endpoint
55
+ waypoints.
56
+ - `CubicSplineWithAcceleration2(..., params=SplineParameters(...))` replaces
57
+ the first and last cubic pieces with quintic segments when acceleration
58
+ constraints are supplied.
59
+
60
+ ## B-spline curves
61
+
62
+ A degree-`p` B-spline is
63
+
64
+ \[
65
+ C(u)=\sum_i N_{i,p}(u)P_i,
66
+ \]
67
+
68
+ where `P_i` are control points and `N_{i,p}` are basis functions induced by the
69
+ knot vector. The valid domain of a `BSpline` instance is
70
+ `[spline.u_min, spline.u_max]`. Use `evaluate_derivative(u, order)` for curve
71
+ derivatives and `generate_curve_points()` for sampled parameters and points.
72
+
73
+ `BSplineInterpolator` accepts scalar or vector-valued samples and optional
74
+ times. Degrees 3, 4, and 5 are supported. Since version 3.2.0, all three degrees
75
+ work with two or more samples; missing endpoint constraints are completed with
76
+ generated natural higher-derivative rows. Explicit velocity and acceleration
77
+ constraints take precedence.
78
+
79
+ `CubicBSplineInterpolation` is a cubic curve interpolator with chord-length,
80
+ centripetal, or equally-spaced parameterization. `ApproximationBSpline` uses a
81
+ chosen number of control points, while `SmoothingCubicBSpline` uses
82
+ `BSplineParams` to configure smoothing, weighting, endpoint enforcement, and
83
+ parameterization.
84
+
85
+ ## Scalar motion profiles
86
+
87
+ `DoubleSTrajectory` constructs a jerk-limited point-to-point motion from
88
+ `StateParams` and `TrajectoryBounds`. The useful sampling distinction is:
89
+
90
+ ```python
91
+ position = trajectory.evaluate(t)
92
+ velocity = trajectory.evaluate_velocity(t)
93
+ acceleration = trajectory.evaluate_acceleration(t)
94
+ jerk = trajectory.evaluate_jerk(t)
95
+ position, velocity, acceleration, jerk = trajectory.evaluate_full(t)
96
+ ```
97
+
98
+ Scalar and NumPy-array times are supported. Times are clipped to the planned
99
+ duration. Inspect `get_duration()` and `get_phase_durations()` for timing.
100
+
101
+ `TrapezoidalTrajectory.generate_trajectory()` returns a callable and duration.
102
+ Its `TrajectoryParams` lives in `interpolatepy.trapezoidal`; the top-level
103
+ `interpolatepy.TrajectoryParams` is the distinct multipoint polynomial
104
+ configuration class.
105
+
106
+ `PolynomialTrajectory` returns callables whose outputs are `(position,
107
+ velocity, acceleration, jerk)`. Cubic order matches position and velocity;
108
+ quintic also matches acceleration; seventh order also matches jerk.
109
+
110
+ `ParabolicBlendTrajectory.generate()` returns a `(position, velocity,
111
+ acceleration)` callable and total duration for a via-point path.
112
+
113
+ ## Quaternion interpolation
114
+
115
+ Quaternions `q` and `-q` represent the same orientation. The interpolation
116
+ classes account for this double cover when constructing their paths. Compare
117
+ orientations using the absolute quaternion dot product rather than component
118
+ equality when sign is irrelevant.
119
+
120
+ `QuaternionSpline` supports `"slerp"`, `"squad"`, and `"auto"`. Its
121
+ `evaluate()`, `evaluate_velocity()`, and `evaluate_acceleration()` methods match
122
+ the quaternion trajectory protocol. `SquadC2` adds virtual endpoints and
123
+ derivative-aware interpolation.
124
+
125
+ The logarithmic interpolators support B-spline degrees 3, 4, and 5 and, since
126
+ 3.2.0, accept as few as two quaternion waypoints. `evaluate_velocity()` and
127
+ `evaluate_acceleration()` return derivatives of the interpolated internal
128
+ coordinates. Use `get_physical_kinematics()` when physical angular velocity and
129
+ angular acceleration are required.
130
+
131
+ ## Paths and Frenet frames
132
+
133
+ `LinearPath` is parameterized by arc length from zero to `path.length`.
134
+ `CircularPath` takes an axis `r`, a point `d` on that axis, and a point `pi` on
135
+ the circle; one turn spans `2*pi*path.radius`. Their `velocity()` and
136
+ `acceleration()` methods are derivatives with respect to path length, not time.
137
+
138
+ `compute_trajectory_frames()` accepts a callable returning `(position,
139
+ first_derivative, second_derivative)` for each parameter. Each returned
140
+ `frames[i]` is a 3-by-3 rotation matrix whose columns are tangent, normal, and
141
+ binormal. A scalar `tool_orientation` rotates about the local binormal; a
142
+ three-tuple applies roll, pitch, and yaw.
143
+
144
+ ## Backend and numerical notes
145
+
146
+ - Import supported APIs from `interpolatepy`, not implementation modules, to
147
+ allow backend selection.
148
+ - The Python implementation is always available. `interpolatepy.HAS_CPP`
149
+ reports whether the optional native extension was loaded.
150
+ - Vectorized time evaluation is supported by scalar cubic splines and
151
+ Double-S trajectories. General B-spline and quaternion evaluators take one
152
+ parameter at a time; sample them in a comprehension.
153
+ - Validate strictly increasing time arrays and keep units consistent across
154
+ positions, derivatives, and bounds.
155
+ - Do not extrapolate B-splines beyond `u_min` and `u_max`.
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: InterpolatePy
3
+ Version: 3.2.2
4
+ Summary: A comprehensive Python library for generating smooth trajectories and curves with precise control over position, velocity, acceleration, and jerk profiles
5
+ Author-email: Giorgio Medico <giorgio.medico11@gmail.com>
6
+ Maintainer-email: Giorgio Medico <giorgio.medico11@gmail.com>
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://github.com/GiorgioMedico/InterpolatePy
9
+ Project-URL: Bug Tracker, https://github.com/GiorgioMedico/InterpolatePy/issues
10
+ Keywords: interpolation,trajectory planning,motion profiles,robotics,b-splines,cubic splines,frenet frames,path generation,motion control
11
+ Platform: unix
12
+ Platform: linux
13
+ Platform: osx
14
+ Platform: cygwin
15
+ Platform: win32
16
+ Classifier: Intended Audience :: Science/Research
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: Intended Audience :: Education
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Operating System :: POSIX :: Linux
24
+ Classifier: Operating System :: POSIX
25
+ Classifier: Operating System :: Unix
26
+ Classifier: Operating System :: MacOS
27
+ Classifier: Topic :: Scientific/Engineering
28
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
29
+ Classifier: Topic :: Scientific/Engineering :: Physics
30
+ Classifier: Topic :: Scientific/Engineering :: Visualization
31
+ Classifier: Topic :: Software Development :: Libraries
32
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
33
+ Classifier: Programming Language :: C++
34
+ Requires-Python: >=3.11
35
+ Description-Content-Type: text/markdown
36
+ License-File: LICENSE
37
+ Requires-Dist: numpy>=1.26
38
+ Requires-Dist: matplotlib>=3.6
39
+ Requires-Dist: scipy>=1.11
40
+ Dynamic: license-file
41
+
42
+ # InterpolatePy
43
+
44
+ ![Python](https://img.shields.io/badge/python-3.11+-blue)
45
+ [![PyPI Downloads](https://static.pepy.tech/badge/interpolatepy)](https://pepy.tech/projects/interpolatepy)
46
+ [![pre-commit](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/pre-commit.yml/badge.svg)](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/pre-commit.yml)
47
+ [![ci-test](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/test.yml/badge.svg)](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/test.yml)
48
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
49
+
50
+ InterpolatePy is a trajectory-planning and interpolation library for robotics,
51
+ animation, and scientific computing. It includes scalar splines, B-spline curve
52
+ tools, bounded motion profiles, quaternion interpolation, and 3D path utilities.
53
+
54
+ The package has a NumPy/SciPy implementation and an optional C++20 backend. Use
55
+ the public names exported by `interpolatepy`; they select the available backend
56
+ at import time.
57
+
58
+ ## Installation
59
+
60
+ ```bash
61
+ python -m pip install InterpolatePy
62
+ ```
63
+
64
+ InterpolatePy 3.2.1 requires Python 3.11 or newer, NumPy 1.26 or newer,
65
+ SciPy 1.11 or newer, and Matplotlib 3.6 or newer.
66
+
67
+ ## Quick start
68
+
69
+ ```python
70
+ import numpy as np
71
+
72
+ from interpolatepy import CubicSpline
73
+ from interpolatepy import DoubleSTrajectory
74
+ from interpolatepy import StateParams
75
+ from interpolatepy import TrajectoryBounds
76
+
77
+ # A clamped cubic spline: v0 and vn are endpoint velocities.
78
+ spline = CubicSpline(
79
+ [0.0, 1.0, 2.0, 3.0],
80
+ [0.0, 1.5, -0.5, 2.0],
81
+ v0=0.0,
82
+ vn=0.0,
83
+ )
84
+ times = np.linspace(0.0, 3.0, 100)
85
+ positions = spline.evaluate(times)
86
+ velocities = spline.evaluate_velocity(times)
87
+
88
+ # A jerk-limited Double-S motion profile.
89
+ state = StateParams(q_0=0.0, q_1=10.0, v_0=0.0, v_1=0.0)
90
+ bounds = TrajectoryBounds(v_bound=5.0, a_bound=10.0, j_bound=30.0)
91
+ motion = DoubleSTrajectory(state, bounds)
92
+ sample_times = np.linspace(0.0, motion.get_duration(), 100)
93
+ q, qd, qdd, qddd = motion.evaluate_full(sample_times)
94
+ ```
95
+
96
+ `DoubleSTrajectory.evaluate()` returns position only. Use
97
+ `evaluate_velocity()`, `evaluate_acceleration()`, and `evaluate_jerk()` for one
98
+ component, or `evaluate_full()` for all four.
99
+
100
+ ## What is included
101
+
102
+ | Area | Public APIs | Typical use |
103
+ | --- | --- | --- |
104
+ | Scalar splines | `CubicSpline`, `CubicSmoothingSpline`, `CubicSplineWithAcceleration1`, `CubicSplineWithAcceleration2` | Smooth scalar waypoint trajectories and noisy data |
105
+ | B-splines | `BSpline`, `BSplineInterpolator`, `CubicBSplineInterpolation`, `ApproximationBSpline`, `SmoothingCubicBSpline` | Parametric curves, interpolation, approximation, and smoothing |
106
+ | Motion profiles | `DoubleSTrajectory`, `TrapezoidalTrajectory`, `PolynomialTrajectory`, `ParabolicBlendTrajectory` | Bounded or boundary-conditioned scalar motion |
107
+ | Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
108
+ | Paths and utilities | `LinearPath`, `CircularPath`, Frenet-frame helpers, `linear_traj`, `solve_tridiagonal` | Geometric paths, moving frames, and numerical helpers |
109
+
110
+ Degrees 3, 4, and 5 of `BSplineInterpolator`,
111
+ `LogQuaternionInterpolation`, and `ModifiedLogQuaternionInterpolation` support
112
+ as few as two waypoints in version 3.2.0.
113
+
114
+ See the [algorithm selection guide](ALGORITHMS.md), the
115
+ [full documentation](https://giorgiomedico.github.io/InterpolatePy/), and the
116
+ [runnable examples](examples/).
117
+
118
+ ## Optional C++ backend
119
+
120
+ The package falls back to Python automatically when the extension is absent:
121
+
122
+ ```python
123
+ import interpolatepy
124
+
125
+ print(interpolatepy.HAS_CPP)
126
+ ```
127
+
128
+ Set `INTERPOLATEPY_NO_CPP=1` before importing the package to force the Python
129
+ implementation. The standard Python package does not need a compiler. Building
130
+ the native library or Python extension from a source checkout requires CMake
131
+ 3.21+, a C++20 compiler, and network access for CMake's fetched dependencies;
132
+ see the [installation guide](docs/installation.md#optional-c-backend).
133
+
134
+ ## Development
135
+
136
+ This project uses [uv](https://docs.astral.sh/uv/):
137
+
138
+ ```bash
139
+ git clone https://github.com/GiorgioMedico/InterpolatePy.git
140
+ cd InterpolatePy
141
+ uv sync
142
+ uv run pytest
143
+ uv run pre-commit run --all-files
144
+ ```
145
+
146
+ Documentation dependencies are in a separate group:
147
+
148
+ ```bash
149
+ uv sync --group docs
150
+ uv run mkdocs serve
151
+ ```
152
+
153
+ Every Python program in `examples/` can also be run directly, for example:
154
+
155
+ ```bash
156
+ uv run python examples/double_s_ex.py
157
+ ```
158
+
159
+ For the complete workflow, see [Contributing](docs/contributing.md).
160
+
161
+ ## License and citation
162
+
163
+ InterpolatePy is distributed under the [MIT License](LICENSE).
164
+
165
+ ```bibtex
166
+ @misc{InterpolatePy,
167
+ author = {Giorgio Medico},
168
+ title = {InterpolatePy: Trajectory Planning and Interpolation for Python},
169
+ year = {2026},
170
+ url = {https://github.com/GiorgioMedico/InterpolatePy}
171
+ }
172
+ ```
@@ -197,6 +197,9 @@ interpolatepy/_adapters/_motion.py
197
197
  interpolatepy/_adapters/_paths.py
198
198
  interpolatepy/_adapters/_quaternion.py
199
199
  interpolatepy/_adapters/_spline.py
200
+ scripts/__init__.py
201
+ scripts/check_doc_snippets.py
202
+ scripts/check_python_examples.py
200
203
  tests/__init__.py
201
204
  tests/inv_test.py
202
205
  tests/test_b_spline.py
@@ -207,6 +210,7 @@ tests/test_lin_poly_parabolic.py
207
210
  tests/test_linear.py
208
211
  tests/test_log_quat.py
209
212
  tests/test_motion_profiles.py
213
+ tests/test_native_adapter_api.py
210
214
  tests/test_path_planning.py
211
215
  tests/test_polynomials.py
212
216
  tests/test_protocols.py
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: InterpolatePy
3
+ Version: 3.2.2
4
+ Summary: A comprehensive Python library for generating smooth trajectories and curves with precise control over position, velocity, acceleration, and jerk profiles
5
+ Author-email: Giorgio Medico <giorgio.medico11@gmail.com>
6
+ Maintainer-email: Giorgio Medico <giorgio.medico11@gmail.com>
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://github.com/GiorgioMedico/InterpolatePy
9
+ Project-URL: Bug Tracker, https://github.com/GiorgioMedico/InterpolatePy/issues
10
+ Keywords: interpolation,trajectory planning,motion profiles,robotics,b-splines,cubic splines,frenet frames,path generation,motion control
11
+ Platform: unix
12
+ Platform: linux
13
+ Platform: osx
14
+ Platform: cygwin
15
+ Platform: win32
16
+ Classifier: Intended Audience :: Science/Research
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: Intended Audience :: Education
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Operating System :: POSIX :: Linux
24
+ Classifier: Operating System :: POSIX
25
+ Classifier: Operating System :: Unix
26
+ Classifier: Operating System :: MacOS
27
+ Classifier: Topic :: Scientific/Engineering
28
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
29
+ Classifier: Topic :: Scientific/Engineering :: Physics
30
+ Classifier: Topic :: Scientific/Engineering :: Visualization
31
+ Classifier: Topic :: Software Development :: Libraries
32
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
33
+ Classifier: Programming Language :: C++
34
+ Requires-Python: >=3.11
35
+ Description-Content-Type: text/markdown
36
+ License-File: LICENSE
37
+ Requires-Dist: numpy>=1.26
38
+ Requires-Dist: matplotlib>=3.6
39
+ Requires-Dist: scipy>=1.11
40
+ Dynamic: license-file
41
+
42
+ # InterpolatePy
43
+
44
+ ![Python](https://img.shields.io/badge/python-3.11+-blue)
45
+ [![PyPI Downloads](https://static.pepy.tech/badge/interpolatepy)](https://pepy.tech/projects/interpolatepy)
46
+ [![pre-commit](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/pre-commit.yml/badge.svg)](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/pre-commit.yml)
47
+ [![ci-test](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/test.yml/badge.svg)](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/test.yml)
48
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
49
+
50
+ InterpolatePy is a trajectory-planning and interpolation library for robotics,
51
+ animation, and scientific computing. It includes scalar splines, B-spline curve
52
+ tools, bounded motion profiles, quaternion interpolation, and 3D path utilities.
53
+
54
+ The package has a NumPy/SciPy implementation and an optional C++20 backend. Use
55
+ the public names exported by `interpolatepy`; they select the available backend
56
+ at import time.
57
+
58
+ ## Installation
59
+
60
+ ```bash
61
+ python -m pip install InterpolatePy
62
+ ```
63
+
64
+ InterpolatePy 3.2.1 requires Python 3.11 or newer, NumPy 1.26 or newer,
65
+ SciPy 1.11 or newer, and Matplotlib 3.6 or newer.
66
+
67
+ ## Quick start
68
+
69
+ ```python
70
+ import numpy as np
71
+
72
+ from interpolatepy import CubicSpline
73
+ from interpolatepy import DoubleSTrajectory
74
+ from interpolatepy import StateParams
75
+ from interpolatepy import TrajectoryBounds
76
+
77
+ # A clamped cubic spline: v0 and vn are endpoint velocities.
78
+ spline = CubicSpline(
79
+ [0.0, 1.0, 2.0, 3.0],
80
+ [0.0, 1.5, -0.5, 2.0],
81
+ v0=0.0,
82
+ vn=0.0,
83
+ )
84
+ times = np.linspace(0.0, 3.0, 100)
85
+ positions = spline.evaluate(times)
86
+ velocities = spline.evaluate_velocity(times)
87
+
88
+ # A jerk-limited Double-S motion profile.
89
+ state = StateParams(q_0=0.0, q_1=10.0, v_0=0.0, v_1=0.0)
90
+ bounds = TrajectoryBounds(v_bound=5.0, a_bound=10.0, j_bound=30.0)
91
+ motion = DoubleSTrajectory(state, bounds)
92
+ sample_times = np.linspace(0.0, motion.get_duration(), 100)
93
+ q, qd, qdd, qddd = motion.evaluate_full(sample_times)
94
+ ```
95
+
96
+ `DoubleSTrajectory.evaluate()` returns position only. Use
97
+ `evaluate_velocity()`, `evaluate_acceleration()`, and `evaluate_jerk()` for one
98
+ component, or `evaluate_full()` for all four.
99
+
100
+ ## What is included
101
+
102
+ | Area | Public APIs | Typical use |
103
+ | --- | --- | --- |
104
+ | Scalar splines | `CubicSpline`, `CubicSmoothingSpline`, `CubicSplineWithAcceleration1`, `CubicSplineWithAcceleration2` | Smooth scalar waypoint trajectories and noisy data |
105
+ | B-splines | `BSpline`, `BSplineInterpolator`, `CubicBSplineInterpolation`, `ApproximationBSpline`, `SmoothingCubicBSpline` | Parametric curves, interpolation, approximation, and smoothing |
106
+ | Motion profiles | `DoubleSTrajectory`, `TrapezoidalTrajectory`, `PolynomialTrajectory`, `ParabolicBlendTrajectory` | Bounded or boundary-conditioned scalar motion |
107
+ | Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
108
+ | Paths and utilities | `LinearPath`, `CircularPath`, Frenet-frame helpers, `linear_traj`, `solve_tridiagonal` | Geometric paths, moving frames, and numerical helpers |
109
+
110
+ Degrees 3, 4, and 5 of `BSplineInterpolator`,
111
+ `LogQuaternionInterpolation`, and `ModifiedLogQuaternionInterpolation` support
112
+ as few as two waypoints in version 3.2.0.
113
+
114
+ See the [algorithm selection guide](ALGORITHMS.md), the
115
+ [full documentation](https://giorgiomedico.github.io/InterpolatePy/), and the
116
+ [runnable examples](examples/).
117
+
118
+ ## Optional C++ backend
119
+
120
+ The package falls back to Python automatically when the extension is absent:
121
+
122
+ ```python
123
+ import interpolatepy
124
+
125
+ print(interpolatepy.HAS_CPP)
126
+ ```
127
+
128
+ Set `INTERPOLATEPY_NO_CPP=1` before importing the package to force the Python
129
+ implementation. The standard Python package does not need a compiler. Building
130
+ the native library or Python extension from a source checkout requires CMake
131
+ 3.21+, a C++20 compiler, and network access for CMake's fetched dependencies;
132
+ see the [installation guide](docs/installation.md#optional-c-backend).
133
+
134
+ ## Development
135
+
136
+ This project uses [uv](https://docs.astral.sh/uv/):
137
+
138
+ ```bash
139
+ git clone https://github.com/GiorgioMedico/InterpolatePy.git
140
+ cd InterpolatePy
141
+ uv sync
142
+ uv run pytest
143
+ uv run pre-commit run --all-files
144
+ ```
145
+
146
+ Documentation dependencies are in a separate group:
147
+
148
+ ```bash
149
+ uv sync --group docs
150
+ uv run mkdocs serve
151
+ ```
152
+
153
+ Every Python program in `examples/` can also be run directly, for example:
154
+
155
+ ```bash
156
+ uv run python examples/double_s_ex.py
157
+ ```
158
+
159
+ For the complete workflow, see [Contributing](docs/contributing.md).
160
+
161
+ ## License and citation
162
+
163
+ InterpolatePy is distributed under the [MIT License](LICENSE).
164
+
165
+ ```bibtex
166
+ @misc{InterpolatePy,
167
+ author = {Giorgio Medico},
168
+ title = {InterpolatePy: Trajectory Planning and Interpolation for Python},
169
+ year = {2026},
170
+ url = {https://github.com/GiorgioMedico/InterpolatePy}
171
+ }
172
+ ```