InterpolatePy 3.2.2__tar.gz → 3.3.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 (273) hide show
  1. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.github/workflows/docs.yml +9 -5
  2. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.github/workflows/pre-commit.yml +4 -2
  3. interpolatepy-3.3.1/.github/workflows/publish.yml +54 -0
  4. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.github/workflows/test.yml +14 -10
  5. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.gitignore +9 -0
  6. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/ALGORITHMS.md +34 -2
  7. {interpolatepy-3.2.2/InterpolatePy.egg-info → interpolatepy-3.3.1}/PKG-INFO +22 -22
  8. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/README.md +12 -7
  9. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/CMakeLists.txt +47 -18
  10. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/CMakeLists.txt +2 -1
  11. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_quaternion.cpp +78 -0
  12. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/CMakeLists.txt +1 -0
  13. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/bspline_approx_smooth_example.cpp +4 -3
  14. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/concepts_example.cpp +4 -3
  15. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/paths_example.cpp +5 -4
  16. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/quaternion_example.cpp +5 -4
  17. interpolatepy-3.3.1/cpp/examples/spring_quaternion_example.cpp +81 -0
  18. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/concepts.hpp +1 -1
  19. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/config.hpp +3 -1
  20. interpolatepy-3.3.1/cpp/include/interpolatecpp/quat/shooting_quaternion_interpolation.hpp +61 -0
  21. interpolatepy-3.3.1/cpp/include/interpolatecpp/quat/spring_quaternion_interpolation.hpp +146 -0
  22. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_bspline_interpolation.cpp +8 -9
  23. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/double_s_trajectory.cpp +5 -4
  24. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/log_quaternion_interpolation.cpp +7 -6
  25. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/modified_log_quaternion_interpolation.cpp +39 -1
  26. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/quaternion.cpp +2 -1
  27. interpolatepy-3.3.1/cpp/src/shooting_quaternion_interpolation.cpp +117 -0
  28. interpolatepy-3.3.1/cpp/src/shooting_solver.cpp +282 -0
  29. interpolatepy-3.3.1/cpp/src/shooting_solver.hpp +22 -0
  30. interpolatepy-3.3.1/cpp/src/spring_energy.hpp +80 -0
  31. interpolatepy-3.3.1/cpp/src/spring_gauss_newton.cpp +194 -0
  32. interpolatepy-3.3.1/cpp/src/spring_quaternion_interpolation.cpp +281 -0
  33. interpolatepy-3.3.1/cpp/src/spring_solver.cpp +320 -0
  34. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/CMakeLists.txt +2 -0
  35. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_bspline_variants.cpp +4 -3
  36. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_concepts.cpp +6 -0
  37. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_cubic_spline.cpp +5 -4
  38. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_paths.cpp +6 -5
  39. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_quaternion.cpp +9 -8
  40. interpolatepy-3.3.1/cpp/tests/test_shooting_quaternion.cpp +154 -0
  41. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_smoothing_search.cpp +2 -1
  42. interpolatepy-3.3.1/cpp/tests/test_spring_quaternion.cpp +316 -0
  43. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/algorithms.md +1 -1
  44. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/api-reference.md +31 -2
  45. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/architecture.md +29 -13
  46. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/changelog.md +39 -0
  47. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/contributing.md +12 -5
  48. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/examples.md +3 -2
  49. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/index.md +1 -1
  50. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/installation.md +10 -7
  51. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/troubleshooting.md +4 -4
  52. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/tutorials/motion-profiles.md +2 -2
  53. interpolatepy-3.3.1/docs/tutorials/quaternion-interpolation.md +444 -0
  54. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/user-guide.md +2 -2
  55. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/c_s_smoot_search_ex.py +1 -1
  56. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/double_s_ex.py +30 -10
  57. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/log_quat_new_ex.py +1 -1
  58. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/lqi_spiral_frenet_ex.py +1 -1
  59. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/mlqi_spiral_frenet_ex.py +1 -1
  60. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/polynomials_ex.py +3 -3
  61. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/quat_visualization_ex.py +1 -1
  62. interpolatepy-3.3.1/examples/shooting_quaternion_benchmark.py +74 -0
  63. interpolatepy-3.3.1/examples/spring_quaternion_ex.py +377 -0
  64. interpolatepy-3.3.1/examples/spring_solver_benchmark.py +84 -0
  65. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/squad_c2_ex.py +1 -1
  66. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/trapezoidal_ex.py +1 -1
  67. interpolatepy-3.3.1/graphify-out/GRAPH_REPORT.md +1080 -0
  68. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/mkdocs.yml +1 -1
  69. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/pyproject.toml +88 -15
  70. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/scripts/check_python_examples.py +6 -2
  71. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/__init__.py +18 -6
  72. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/__init__.py +8 -6
  73. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_bspline.py +3 -3
  74. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_direct.py +7 -7
  75. interpolatepy-3.3.1/src/interpolatepy/_adapters/_motion_double_s.py +96 -0
  76. interpolatepy-3.3.1/src/interpolatepy/_adapters/_motion_parabolic.py +98 -0
  77. interpolatepy-3.3.1/src/interpolatepy/_adapters/_motion_polynomial.py +224 -0
  78. interpolatepy-3.3.1/src/interpolatepy/_adapters/_motion_trapezoidal.py +91 -0
  79. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_quaternion.py +5 -5
  80. interpolatepy-3.3.1/src/interpolatepy/_adapters/_quaternion_shooting.py +59 -0
  81. interpolatepy-3.3.1/src/interpolatepy/_adapters/_quaternion_spring.py +132 -0
  82. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_spline.py +3 -2
  83. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_api.py +38 -32
  84. interpolatepy-3.3.1/src/interpolatepy/bsplines/__init__.py +37 -0
  85. interpolatepy-3.3.1/src/interpolatepy/bsplines/_approximation_system.py +157 -0
  86. interpolatepy-3.3.1/src/interpolatepy/bsplines/_interpolation_system.py +215 -0
  87. interpolatepy-3.3.1/src/interpolatepy/bsplines/_parameterization.py +36 -0
  88. interpolatepy-3.2.2/interpolatepy/b_spline_approx.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/approximation.py +20 -261
  89. interpolatepy-3.2.2/interpolatepy/b_spline.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/core.py +17 -140
  90. interpolatepy-3.2.2/interpolatepy/b_spline_cubic.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/cubic.py +5 -99
  91. interpolatepy-3.2.2/interpolatepy/b_spline_interpolate.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/interpolation.py +8 -244
  92. interpolatepy-3.2.2/interpolatepy/b_spline_smooth.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/smoothing.py +4 -78
  93. interpolatepy-3.3.1/src/interpolatepy/motion/__init__.py +69 -0
  94. interpolatepy-3.3.1/src/interpolatepy/motion/_double_s_planner.py +243 -0
  95. {interpolatepy-3.2.2/interpolatepy → interpolatepy-3.3.1/src/interpolatepy/motion}/double_s.py +4 -235
  96. interpolatepy-3.2.2/interpolatepy/lin_poly_parabolic.py → interpolatepy-3.3.1/src/interpolatepy/motion/parabolic.py +2 -1
  97. interpolatepy-3.3.1/src/interpolatepy/paths/__init__.py +52 -0
  98. interpolatepy-3.2.2/interpolatepy/frenet_frame.py → interpolatepy-3.3.1/src/interpolatepy/paths/frenet.py +8 -2
  99. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/protocols.py +9 -4
  100. interpolatepy-3.3.1/src/interpolatepy/quaternion/__init__.py +63 -0
  101. interpolatepy-3.3.1/src/interpolatepy/quaternion/_shooting_solver.py +245 -0
  102. interpolatepy-3.3.1/src/interpolatepy/quaternion/_spring_energy.py +62 -0
  103. interpolatepy-3.3.1/src/interpolatepy/quaternion/_spring_gauss_newton.py +85 -0
  104. interpolatepy-3.3.1/src/interpolatepy/quaternion/_spring_slerp.py +40 -0
  105. interpolatepy-3.3.1/src/interpolatepy/quaternion/_spring_solver.py +199 -0
  106. interpolatepy-3.2.2/interpolatepy/log_quat.py → interpolatepy-3.3.1/src/interpolatepy/quaternion/logarithmic.py +2 -2
  107. interpolatepy-3.3.1/src/interpolatepy/quaternion/shooting.py +199 -0
  108. interpolatepy-3.2.2/interpolatepy/quat_spline.py → interpolatepy-3.3.1/src/interpolatepy/quaternion/spline.py +1 -1
  109. interpolatepy-3.3.1/src/interpolatepy/quaternion/spring.py +399 -0
  110. interpolatepy-3.2.2/interpolatepy/squad_c2.py → interpolatepy-3.3.1/src/interpolatepy/quaternion/squad.py +21 -7
  111. interpolatepy-3.3.1/src/interpolatepy/splines/__init__.py +39 -0
  112. interpolatepy-3.2.2/interpolatepy/c_s_with_acc1.py → interpolatepy-3.3.1/src/interpolatepy/splines/acceleration1.py +3 -2
  113. interpolatepy-3.2.2/interpolatepy/c_s_with_acc2.py → interpolatepy-3.3.1/src/interpolatepy/splines/acceleration2.py +1 -1
  114. interpolatepy-3.2.2/interpolatepy/cubic_spline.py → interpolatepy-3.3.1/src/interpolatepy/splines/cubic.py +3 -2
  115. interpolatepy-3.2.2/interpolatepy/c_s_smoot_search.py → interpolatepy-3.3.1/src/interpolatepy/splines/search.py +6 -12
  116. interpolatepy-3.2.2/interpolatepy/c_s_smoothing.py → interpolatepy-3.3.1/src/interpolatepy/splines/smoothing.py +2 -1
  117. interpolatepy-3.3.1/src/interpolatepy/version.py +9 -0
  118. interpolatepy-3.3.1/src/interpolatepy/visualization/__init__.py +13 -0
  119. interpolatepy-3.3.1/src/interpolatepy/visualization/bspline.py +122 -0
  120. interpolatepy-3.2.2/interpolatepy/quat_visualization.py → interpolatepy-3.3.1/src/interpolatepy/visualization/quaternion.py +20 -75
  121. interpolatepy-3.3.1/src/interpolatepy/visualization/quaternion_math.py +80 -0
  122. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/inv_test.py +1 -1
  123. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_b_spline.py +1 -1
  124. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_b_spline_variants.py +6 -11
  125. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_backend.py +5 -6
  126. interpolatepy-3.3.1/tests/test_cpp_parity.py +143 -0
  127. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_cubic_spline.py +1 -1
  128. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_lin_poly_parabolic.py +1 -1
  129. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_linear.py +1 -1
  130. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_log_quat.py +2 -2
  131. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_motion_profiles.py +30 -11
  132. interpolatepy-3.3.1/tests/test_native_adapter_api.py +234 -0
  133. interpolatepy-3.3.1/tests/test_package_structure.py +79 -0
  134. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_path_planning.py +3 -3
  135. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_polynomials.py +7 -7
  136. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_quat_interp.py +2 -2
  137. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_quat_visualization.py +7 -7
  138. interpolatepy-3.3.1/tests/test_shooting_quaternion.py +307 -0
  139. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_smoothing.py +9 -10
  140. interpolatepy-3.3.1/tests/test_spring_gauss_newton.py +151 -0
  141. interpolatepy-3.3.1/tests/test_spring_performance.py +192 -0
  142. interpolatepy-3.3.1/tests/test_spring_quaternion.py +390 -0
  143. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_squad_c2.py +44 -3
  144. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/uv.lock +19 -3
  145. interpolatepy-3.2.2/.github/workflows/publish.yml +0 -28
  146. interpolatepy-3.2.2/InterpolatePy.egg-info/SOURCES.txt +0 -220
  147. interpolatepy-3.2.2/InterpolatePy.egg-info/requires.txt +0 -3
  148. interpolatepy-3.2.2/InterpolatePy.egg-info/top_level.txt +0 -1
  149. interpolatepy-3.2.2/PKG-INFO +0 -172
  150. interpolatepy-3.2.2/docs/tutorials/quaternion-interpolation.md +0 -216
  151. interpolatepy-3.2.2/interpolatepy/_adapters/_motion.py +0 -534
  152. interpolatepy-3.2.2/interpolatepy/version.py +0 -5
  153. interpolatepy-3.2.2/setup.cfg +0 -4
  154. interpolatepy-3.2.2/tests/test_native_adapter_api.py +0 -127
  155. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.editorconfig +0 -0
  156. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.gitattributes +0 -0
  157. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.github/FUNDING.yml +0 -0
  158. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.pre-commit-config.yaml +0 -0
  159. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.python-version +0 -0
  160. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/LICENSE +0 -0
  161. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/codecov.yml +0 -0
  162. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_acc_splines.cpp +0 -0
  163. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_bspline.cpp +0 -0
  164. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_cubic_spline.cpp +0 -0
  165. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_motion.cpp +0 -0
  166. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_paths.cpp +0 -0
  167. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_smoothing_search.cpp +0 -0
  168. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_smoothing_spline.cpp +0 -0
  169. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_tridiagonal.cpp +0 -0
  170. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/module.cpp +0 -0
  171. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/cmake/InterpolateCppConfig.cmake.in +0 -0
  172. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/cmake/version.hpp.in +0 -0
  173. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/bspline_cubic_example.cpp +0 -0
  174. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/bspline_example.cpp +0 -0
  175. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/bspline_interpolator_example.cpp +0 -0
  176. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/cubic_smoothing_example.cpp +0 -0
  177. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/cubic_spline_acc1_example.cpp +0 -0
  178. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/cubic_spline_acc2_example.cpp +0 -0
  179. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/cubic_spline_example.cpp +0 -0
  180. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/double_s_example.cpp +0 -0
  181. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/parabolic_linear_example.cpp +0 -0
  182. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/polynomial_example.cpp +0 -0
  183. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/shared/example_utils.hpp +0 -0
  184. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/trapezoidal_example.cpp +0 -0
  185. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/approximation_bspline.hpp +0 -0
  186. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/bspline.hpp +0 -0
  187. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/bspline_interpolator.hpp +0 -0
  188. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/bspline_parameters.hpp +0 -0
  189. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/cubic_bspline_interpolation.hpp +0 -0
  190. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/smoothing_cubic_bspline.hpp +0 -0
  191. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/double_s_trajectory.hpp +0 -0
  192. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/motion_types.hpp +0 -0
  193. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/parabolic_blend_trajectory.hpp +0 -0
  194. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/polynomial_trajectory.hpp +0 -0
  195. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/trapezoidal_trajectory.hpp +0 -0
  196. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/path/circular_path.hpp +0 -0
  197. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/path/frenet_frame.hpp +0 -0
  198. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/path/linear_path.hpp +0 -0
  199. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/path/linear_traj.hpp +0 -0
  200. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/log_quaternion_interpolation.hpp +0 -0
  201. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/modified_log_quaternion_interpolation.hpp +0 -0
  202. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/quaternion.hpp +0 -0
  203. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/quaternion_spline.hpp +0 -0
  204. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/squad_c2.hpp +0 -0
  205. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/cubic_smoothing_spline.hpp +0 -0
  206. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/cubic_spline.hpp +0 -0
  207. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/cubic_spline_with_acc1.hpp +0 -0
  208. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/cubic_spline_with_acc2.hpp +0 -0
  209. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/smoothing_search.hpp +0 -0
  210. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/spline_parameters.hpp +0 -0
  211. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/tridiagonal.hpp +0 -0
  212. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/approximation_bspline.cpp +0 -0
  213. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/bspline.cpp +0 -0
  214. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/bspline_interpolator.cpp +0 -0
  215. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/circular_path.cpp +0 -0
  216. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_smoothing_spline.cpp +0 -0
  217. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_spline.cpp +0 -0
  218. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_spline_with_acc1.cpp +0 -0
  219. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_spline_with_acc2.cpp +0 -0
  220. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/frenet_frame.cpp +0 -0
  221. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/linear_path.cpp +0 -0
  222. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/linear_traj.cpp +0 -0
  223. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/parabolic_blend_trajectory.cpp +0 -0
  224. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/polynomial_trajectory.cpp +0 -0
  225. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/quaternion_spline.cpp +0 -0
  226. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/smoothing_cubic_bspline.cpp +0 -0
  227. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/smoothing_search.cpp +0 -0
  228. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/squad_c2.cpp +0 -0
  229. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/trapezoidal_trajectory.cpp +0 -0
  230. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/shared/test_data.hpp +0 -0
  231. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_bspline.cpp +0 -0
  232. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_cubic_smoothing_spline.cpp +0 -0
  233. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_cubic_spline_with_acc1.cpp +0 -0
  234. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_cubic_spline_with_acc2.cpp +0 -0
  235. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_double_s_trajectory.cpp +0 -0
  236. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_parabolic_blend_trajectory.cpp +0 -0
  237. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_polynomial_trajectory.cpp +0 -0
  238. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_quaternion_spline.cpp +0 -0
  239. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_trapezoidal_trajectory.cpp +0 -0
  240. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_tridiagonal.cpp +0 -0
  241. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/assets/extra.css +0 -0
  242. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/assets/extra.js +0 -0
  243. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/quickstart.md +0 -0
  244. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/tutorials/path-planning.md +0 -0
  245. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/tutorials/spline-interpolation.md +0 -0
  246. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_approx_ex.py +0 -0
  247. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_cubic_ex.py +0 -0
  248. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_ex.py +0 -0
  249. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_interpolate_ex.py +0 -0
  250. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_smooth_ex.py +0 -0
  251. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/c_s_smoothing_ex.py +0 -0
  252. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/c_s_with_acc1_ex.py +0 -0
  253. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/c_s_with_acc2_ex.py +0 -0
  254. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/cubic_spline_ex.py +0 -0
  255. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/frenet_frame_ex.py +0 -0
  256. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/lin_poly_parabolic_ex.py +0 -0
  257. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/linear_ex.py +0 -0
  258. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/main.py +0 -0
  259. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/protocols_ex.py +0 -0
  260. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/simple_paths_ex.py +0 -0
  261. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/scripts/__init__.py +0 -0
  262. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/scripts/check_doc_snippets.py +0 -0
  263. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_paths.py +0 -0
  264. {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_backend.py +0 -0
  265. /interpolatepy-3.2.2/interpolatepy/tridiagonal_inv.py → /interpolatepy-3.3.1/src/interpolatepy/linalg.py +0 -0
  266. /interpolatepy-3.2.2/interpolatepy/polynomials.py → /interpolatepy-3.3.1/src/interpolatepy/motion/polynomial.py +0 -0
  267. {interpolatepy-3.2.2/interpolatepy → interpolatepy-3.3.1/src/interpolatepy/motion}/trapezoidal.py +0 -0
  268. /interpolatepy-3.2.2/interpolatepy/simple_paths.py → /interpolatepy-3.3.1/src/interpolatepy/paths/geometric.py +0 -0
  269. {interpolatepy-3.2.2/interpolatepy → interpolatepy-3.3.1/src/interpolatepy/paths}/linear.py +0 -0
  270. /interpolatepy-3.2.2/InterpolatePy.egg-info/dependency_links.txt → /interpolatepy-3.3.1/src/interpolatepy/py.typed +0 -0
  271. /interpolatepy-3.2.2/interpolatepy/quat_core.py → /interpolatepy-3.3.1/src/interpolatepy/quaternion/core.py +0 -0
  272. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/__init__.py +0 -0
  273. {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_protocols.py +0 -0
@@ -8,7 +8,7 @@ on:
8
8
  - 'ALGORITHMS.md'
9
9
  - 'docs/**'
10
10
  - 'mkdocs.yml'
11
- - 'interpolatepy/**/*.py' # Only Python files for API docs
11
+ - 'src/interpolatepy/**/*.py' # Only Python files for API docs
12
12
  - 'scripts/check_doc_snippets.py'
13
13
  - 'pyproject.toml'
14
14
  - 'uv.lock'
@@ -20,7 +20,7 @@ on:
20
20
  - 'ALGORITHMS.md'
21
21
  - 'docs/**'
22
22
  - 'mkdocs.yml'
23
- - 'interpolatepy/**/*.py'
23
+ - 'src/interpolatepy/**/*.py'
24
24
  - 'scripts/check_doc_snippets.py'
25
25
  - 'pyproject.toml'
26
26
  - 'uv.lock'
@@ -52,16 +52,20 @@ jobs:
52
52
  cache-dependency-glob: uv.lock
53
53
 
54
54
  - name: Sync dependencies
55
- run: uv sync --locked --no-default-groups --group docs
55
+ run: uv sync --locked --no-default-groups --group docs --no-install-project
56
56
 
57
57
  - name: Check documentation snippets
58
58
  env:
59
59
  INTERPOLATEPY_NO_CPP: '1'
60
60
  MPLBACKEND: Agg
61
- run: uv run python -m scripts.check_doc_snippets
61
+ PYTHONPATH: src
62
+ run: uv run --no-sync python -m scripts.check_doc_snippets
62
63
 
63
64
  - name: Build documentation
64
- run: uv run mkdocs build --clean --strict
65
+ env:
66
+ INTERPOLATEPY_NO_CPP: '1'
67
+ PYTHONPATH: src
68
+ run: uv run --no-sync mkdocs build --clean --strict
65
69
 
66
70
  - name: Setup Pages
67
71
  if: github.ref == 'refs/heads/main' && github.event_name == 'push'
@@ -16,7 +16,7 @@ jobs:
16
16
  enable-cache: true
17
17
  cache-dependency-glob: uv.lock
18
18
  - name: Sync dependencies
19
- run: uv sync --locked --no-default-groups --group dev
19
+ run: uv sync --locked --no-default-groups --group dev --no-install-project
20
20
  - name: Cache pre-commit hook environments
21
21
  uses: actions/cache@v5
22
22
  with:
@@ -25,4 +25,6 @@ jobs:
25
25
  restore-keys: |
26
26
  pre-commit-${{ runner.os }}-
27
27
  - name: Run pre-commit
28
- run: uv run pre-commit run --all-files --show-diff-on-failure
28
+ run: uv run --no-sync pre-commit run --all-files --show-diff-on-failure
29
+ - name: Run Pyright
30
+ run: uv run --no-sync pyright src/interpolatepy
@@ -0,0 +1,54 @@
1
+ name: Publish
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ build-sdist:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v6
12
+ with:
13
+ fetch-depth: 0
14
+ - uses: astral-sh/setup-uv@v8.1.0
15
+ - name: Build source distribution
16
+ run: uv build --sdist
17
+ - uses: actions/upload-artifact@v6
18
+ with:
19
+ name: dist-sdist
20
+ path: dist/*.tar.gz
21
+
22
+ build-wheels:
23
+ name: Build wheels on ${{ matrix.os }}
24
+ runs-on: ${{ matrix.os }}
25
+ strategy:
26
+ fail-fast: false
27
+ matrix:
28
+ os: [ubuntu-latest, macos-15-intel, macos-latest]
29
+ steps:
30
+ - uses: actions/checkout@v6
31
+ - uses: actions/setup-python@v6
32
+ - name: Install cibuildwheel
33
+ run: python -m pip install cibuildwheel==4.2.0
34
+ - name: Build and test wheels
35
+ run: python -m cibuildwheel --output-dir wheelhouse
36
+ - uses: actions/upload-artifact@v6
37
+ with:
38
+ name: dist-wheel-${{ matrix.os }}
39
+ path: wheelhouse/*.whl
40
+
41
+ publish:
42
+ needs: [build-sdist, build-wheels]
43
+ runs-on: ubuntu-latest
44
+ permissions:
45
+ id-token: write
46
+ contents: read
47
+ environment: pypi
48
+ steps:
49
+ - uses: actions/download-artifact@v5
50
+ with:
51
+ pattern: dist-*
52
+ path: dist
53
+ merge-multiple: true
54
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -14,6 +14,8 @@ jobs:
14
14
  os: [ubuntu-latest, macos-latest]
15
15
  python-version: ['3.11', '3.12', '3.13']
16
16
  env:
17
+ INTERPOLATEPY_NO_CPP: '1'
18
+ PYTHONPATH: src
17
19
  UV_PYTHON: ${{ matrix.python-version }}
18
20
  steps:
19
21
  - uses: actions/checkout@v6
@@ -23,9 +25,9 @@ jobs:
23
25
  enable-cache: true
24
26
  cache-dependency-glob: uv.lock
25
27
  - name: Sync dependencies
26
- run: uv sync --locked --no-default-groups --group test
28
+ run: uv sync --locked --no-default-groups --group test --no-install-project
27
29
  - name: Testing with coverage
28
- run: uv run pytest tests --cov=interpolatepy --cov-report=xml --cov-report=term-missing
30
+ run: uv run --no-sync pytest tests --cov=interpolatepy --cov-report=xml --cov-report=term-missing
29
31
  - name: Upload coverage to Codecov
30
32
  uses: codecov/codecov-action@v6
31
33
  with:
@@ -38,6 +40,7 @@ jobs:
38
40
  python-examples:
39
41
  runs-on: ubuntu-latest
40
42
  env:
43
+ PYTHONPATH: src
41
44
  UV_PYTHON: '3.12'
42
45
  steps:
43
46
  - uses: actions/checkout@v6
@@ -47,13 +50,14 @@ jobs:
47
50
  enable-cache: true
48
51
  cache-dependency-glob: uv.lock
49
52
  - name: Sync dependencies
50
- run: uv sync --locked --no-default-groups --group test
53
+ run: uv sync --locked --no-default-groups --group test --no-install-project
51
54
  - name: Run Python examples with the fallback backend
52
- run: uv run python -m scripts.check_python_examples --backend python
55
+ run: uv run --no-sync python -m scripts.check_python_examples --backend python
53
56
 
54
57
  native:
55
58
  runs-on: ubuntu-latest
56
59
  env:
60
+ PYTHONPATH: src
57
61
  UV_PYTHON: '3.12'
58
62
  steps:
59
63
  - uses: actions/checkout@v6
@@ -63,25 +67,25 @@ jobs:
63
67
  enable-cache: true
64
68
  cache-dependency-glob: uv.lock
65
69
  - name: Sync dependencies
66
- run: uv sync --locked --no-default-groups --group test
70
+ run: uv sync --locked --no-default-groups --group test --no-install-project
67
71
  - name: Configure C++ tests, examples, and Python bindings
68
72
  run: |
69
73
  cmake -S cpp -B build/cpp \
70
74
  -DINTERPOLATECPP_BUILD_TESTS=ON \
71
75
  -DINTERPOLATECPP_BUILD_EXAMPLES=ON \
72
76
  -DINTERPOLATECPP_BUILD_BINDINGS=ON \
73
- -DPython_EXECUTABLE=$(uv run python -c 'import sys; print(sys.executable)')
77
+ -DPython_EXECUTABLE=$(uv run --no-sync python -c 'import sys; print(sys.executable)')
74
78
  - name: Build native targets
75
79
  run: cmake --build build/cpp --parallel 4
76
80
  - name: Run C++ tests and examples
77
81
  run: ctest --test-dir build/cpp --output-on-failure
78
82
  - name: Activate the native Python backend
79
- run: cp build/cpp/bindings/interpolatecpp_py*.so interpolatepy/
83
+ run: cp build/cpp/bindings/interpolatecpp_py*.so src/interpolatepy/
80
84
  - name: Run native adapter regressions
81
- run: uv run pytest tests/test_backend.py tests/test_native_adapter_api.py
85
+ run: uv run --no-sync pytest tests/test_backend.py tests/test_native_adapter_api.py
82
86
  - name: Run documentation snippets with the native backend
83
87
  env:
84
88
  MPLBACKEND: Agg
85
- run: uv run python -m scripts.check_doc_snippets
89
+ run: uv run --no-sync python -m scripts.check_doc_snippets
86
90
  - name: Run Python examples with the native backend
87
- run: uv run python -m scripts.check_python_examples --backend native
91
+ run: uv run --no-sync python -m scripts.check_python_examples --backend native
@@ -148,3 +148,12 @@ cpp/build/
148
148
  *.so
149
149
  *.dylib
150
150
  compile_commands.json
151
+
152
+ ################################
153
+ ########### GRAPHIFY ###########
154
+ ################################
155
+ # Generated graph: keep the human-readable report (and wiki, if built), drop the
156
+ # 9 MB of graph.json/graph.html plus caches that churn on every `graphify update`.
157
+ graphify-out/*
158
+ !graphify-out/GRAPH_REPORT.md
159
+ !graphify-out/wiki/
@@ -1,6 +1,6 @@
1
1
  # InterpolatePy algorithm guide
2
2
 
3
- This page is a compact map of the algorithms exposed by InterpolatePy 3.2.1.
3
+ This page is a compact map of the algorithms exposed by InterpolatePy 3.3.1.
4
4
  For constructor signatures and complete method documentation, use the
5
5
  [API reference](docs/api-reference.md). For worked code, use the
6
6
  [tutorials](docs/user-guide.md) and [`examples/`](examples/).
@@ -23,6 +23,8 @@ For constructor signatures and complete method documentation, use the
23
23
  | Interpolate two orientations | `Quaternion.slerp()` | Shortest-path spherical interpolation |
24
24
  | Interpolate orientation keyframes | `QuaternionSpline` | Piecewise SLERP/SQUAD selected explicitly or automatically |
25
25
  | Require a smooth SQUAD-style orientation trajectory | `SquadC2` | Virtual endpoints and smooth angular derivative evaluation |
26
+ | Reduce curvature globally across orientation keyframes | `SpringQuaternionInterpolation` | Numerical SPRING relaxation with fixed keyframes |
27
+ | Solve continuous natural Riemannian cubics | `ShootingQuaternionInterpolation` | Sparse multiple shooting with nine unknowns per keyframe interval |
26
28
  | Interpolate rotations in logarithmic coordinates | `LogQuaternionInterpolation` | B-spline interpolation of continuous rotation vectors |
27
29
  | Decouple rotation angle and axis | `ModifiedLogQuaternionInterpolation` | Separate angle and unit-axis spline state |
28
30
  | Describe a 3D line or circle geometrically | `LinearPath` or `CircularPath` | Arc-length parameterized position and geometric derivatives |
@@ -99,7 +101,7 @@ Scalar and NumPy-array times are supported. Times are clipped to the planned
99
101
  duration. Inspect `get_duration()` and `get_phase_durations()` for timing.
100
102
 
101
103
  `TrapezoidalTrajectory.generate_trajectory()` returns a callable and duration.
102
- Its `TrajectoryParams` lives in `interpolatepy.trapezoidal`; the top-level
104
+ Its `TrajectoryParams` lives in `interpolatepy.motion.trapezoidal`; the top-level
103
105
  `interpolatepy.TrajectoryParams` is the distinct multipoint polynomial
104
106
  configuration class.
105
107
 
@@ -122,6 +124,36 @@ equality when sign is irrelevant.
122
124
  the quaternion trajectory protocol. `SquadC2` adds virtual endpoints and
123
125
  derivative-aware interpolation.
124
126
 
127
+ `SpringQuaternionInterpolation` globally relaxes a sampled piecewise-SLERP
128
+ curve to reduce tangential curvature while keeping keyframes fixed. It has a
129
+ higher one-time construction cost than the closed-form methods, so compare
130
+ setup and repeated evaluation separately. The runnable
131
+ [`spring_quaternion_ex.py`](examples/spring_quaternion_ex.py) example plots
132
+ SPRING beside multiple shooting, LQI, mLQI, piecewise SLERP, SQUAD, and
133
+ SQUAD-C2 and measures both costs on the active backend. A second figure repeats
134
+ the acceleration-energy comparison for the smoothest methods alone, which the
135
+ shared scale of the overview figure flattens.
136
+
137
+ For the same discrete SPRING problem, `SpringConfig(solver="gauss_newton")`
138
+ replaces only the final-grid optimizer with a banded Gauss-Newton solve.
139
+ Coarse solves remain identical to the default `"gradient_descent"`. Check `converged` and `stage_gradient_norms` rather than
140
+ assuming a finite iteration budget reached a solution. `final_iterations`
141
+ can increase just the final-grid budget without changing coarse inputs.
142
+ [`spring_solver_benchmark.py`](examples/spring_solver_benchmark.py) compares
143
+ both solvers at a common tolerance and reports the angular difference.
144
+
145
+ `ShootingQuaternionInterpolation` solves the natural Riemannian cubic equations
146
+ using independent integrations between keyframes, analytic sensitivities, and
147
+ sparse damped Newton steps. Orientation, body angular velocity, and angular
148
+ acceleration match at knots; endpoint acceleration is zero. Its `9*(K-1)`
149
+ unknowns depend on keyframe count, not output resolution. This is a local
150
+ stationary solution of continuous squared covariant acceleration, not a
151
+ replacement for SPRING's discrete chord-parameterized objective or a guarantee
152
+ of global minimality. The C++ implementation is selected automatically when
153
+ available; the NumPy/SciPy reference remains available. Run
154
+ [`shooting_quaternion_benchmark.py`](examples/shooting_quaternion_benchmark.py)
155
+ to compare construction and sampling costs against different SPRING grids.
156
+
125
157
  The logarithmic interpolators support B-spline degrees 3, 4, and 5 and, since
126
158
  3.2.0, accept as few as two quaternion waypoints. `evaluate_velocity()` and
127
159
  `evaluate_acceleration()` return derivatives of the interpolated internal
@@ -1,18 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: InterpolatePy
3
- Version: 3.2.2
3
+ Version: 3.3.1
4
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
5
  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
6
+ Author-Email: Giorgio Medico <giorgio.medico11@gmail.com>
7
+ Maintainer-Email: Giorgio Medico <giorgio.medico11@gmail.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
16
10
  Classifier: Intended Audience :: Science/Research
17
11
  Classifier: Intended Audience :: Developers
18
12
  Classifier: Intended Audience :: Education
@@ -31,13 +25,14 @@ Classifier: Topic :: Scientific/Engineering :: Visualization
31
25
  Classifier: Topic :: Software Development :: Libraries
32
26
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
33
27
  Classifier: Programming Language :: C++
28
+ Project-URL: Homepage, https://github.com/GiorgioMedico/InterpolatePy
29
+ Project-URL: Bug Tracker, https://github.com/GiorgioMedico/InterpolatePy/issues
34
30
  Requires-Python: >=3.11
35
- Description-Content-Type: text/markdown
36
- License-File: LICENSE
37
31
  Requires-Dist: numpy>=1.26
38
- Requires-Dist: matplotlib>=3.6
39
32
  Requires-Dist: scipy>=1.11
40
- Dynamic: license-file
33
+ Provides-Extra: plot
34
+ Requires-Dist: matplotlib>=3.6; extra == "plot"
35
+ Description-Content-Type: text/markdown
41
36
 
42
37
  # InterpolatePy
43
38
 
@@ -61,8 +56,12 @@ at import time.
61
56
  python -m pip install InterpolatePy
62
57
  ```
63
58
 
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.
59
+ InterpolatePy 3.3.1 requires Python 3.11 or newer, NumPy 1.26 or newer,
60
+ and SciPy 1.11 or newer. Install plotting support when needed:
61
+
62
+ ```bash
63
+ python -m pip install "InterpolatePy[plot]"
64
+ ```
66
65
 
67
66
  ## Quick start
68
67
 
@@ -104,7 +103,7 @@ component, or `evaluate_full()` for all four.
104
103
  | Scalar splines | `CubicSpline`, `CubicSmoothingSpline`, `CubicSplineWithAcceleration1`, `CubicSplineWithAcceleration2` | Smooth scalar waypoint trajectories and noisy data |
105
104
  | B-splines | `BSpline`, `BSplineInterpolator`, `CubicBSplineInterpolation`, `ApproximationBSpline`, `SmoothingCubicBSpline` | Parametric curves, interpolation, approximation, and smoothing |
106
105
  | 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 |
106
+ | Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `SpringQuaternionInterpolation`, `ShootingQuaternionInterpolation`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
108
107
  | Paths and utilities | `LinearPath`, `CircularPath`, Frenet-frame helpers, `linear_traj`, `solve_tridiagonal` | Geometric paths, moving frames, and numerical helpers |
109
108
 
110
109
  Degrees 3, 4, and 5 of `BSplineInterpolator`,
@@ -117,7 +116,8 @@ See the [algorithm selection guide](ALGORITHMS.md), the
117
116
 
118
117
  ## Optional C++ backend
119
118
 
120
- The package falls back to Python automatically when the extension is absent:
119
+ Platform wheels include the compiled backend. The package falls back to Python
120
+ automatically when the extension is absent:
121
121
 
122
122
  ```python
123
123
  import interpolatepy
@@ -126,9 +126,9 @@ print(interpolatepy.HAS_CPP)
126
126
  ```
127
127
 
128
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;
129
+ implementation. Installing a published wheel does not need a compiler. Building
130
+ from a source distribution or source checkout requires CMake 3.21+, a C++20
131
+ compiler, and network access for CMake's fetched dependencies;
132
132
  see the [installation guide](docs/installation.md#optional-c-backend).
133
133
 
134
134
  ## Development
@@ -20,8 +20,12 @@ at import time.
20
20
  python -m pip install InterpolatePy
21
21
  ```
22
22
 
23
- InterpolatePy 3.2.1 requires Python 3.11 or newer, NumPy 1.26 or newer,
24
- SciPy 1.11 or newer, and Matplotlib 3.6 or newer.
23
+ InterpolatePy 3.3.1 requires Python 3.11 or newer, NumPy 1.26 or newer,
24
+ and SciPy 1.11 or newer. Install plotting support when needed:
25
+
26
+ ```bash
27
+ python -m pip install "InterpolatePy[plot]"
28
+ ```
25
29
 
26
30
  ## Quick start
27
31
 
@@ -63,7 +67,7 @@ component, or `evaluate_full()` for all four.
63
67
  | Scalar splines | `CubicSpline`, `CubicSmoothingSpline`, `CubicSplineWithAcceleration1`, `CubicSplineWithAcceleration2` | Smooth scalar waypoint trajectories and noisy data |
64
68
  | B-splines | `BSpline`, `BSplineInterpolator`, `CubicBSplineInterpolation`, `ApproximationBSpline`, `SmoothingCubicBSpline` | Parametric curves, interpolation, approximation, and smoothing |
65
69
  | Motion profiles | `DoubleSTrajectory`, `TrapezoidalTrajectory`, `PolynomialTrajectory`, `ParabolicBlendTrajectory` | Bounded or boundary-conditioned scalar motion |
66
- | Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
70
+ | Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `SpringQuaternionInterpolation`, `ShootingQuaternionInterpolation`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
67
71
  | Paths and utilities | `LinearPath`, `CircularPath`, Frenet-frame helpers, `linear_traj`, `solve_tridiagonal` | Geometric paths, moving frames, and numerical helpers |
68
72
 
69
73
  Degrees 3, 4, and 5 of `BSplineInterpolator`,
@@ -76,7 +80,8 @@ See the [algorithm selection guide](ALGORITHMS.md), the
76
80
 
77
81
  ## Optional C++ backend
78
82
 
79
- The package falls back to Python automatically when the extension is absent:
83
+ Platform wheels include the compiled backend. The package falls back to Python
84
+ automatically when the extension is absent:
80
85
 
81
86
  ```python
82
87
  import interpolatepy
@@ -85,9 +90,9 @@ print(interpolatepy.HAS_CPP)
85
90
  ```
86
91
 
87
92
  Set `INTERPOLATEPY_NO_CPP=1` before importing the package to force the Python
88
- implementation. The standard Python package does not need a compiler. Building
89
- the native library or Python extension from a source checkout requires CMake
90
- 3.21+, a C++20 compiler, and network access for CMake's fetched dependencies;
93
+ implementation. Installing a published wheel does not need a compiler. Building
94
+ from a source distribution or source checkout requires CMake 3.21+, a C++20
95
+ compiler, and network access for CMake's fetched dependencies;
91
96
  see the [installation guide](docs/installation.md#optional-c-backend).
92
97
 
93
98
  ## Development
@@ -1,6 +1,13 @@
1
1
  cmake_minimum_required(VERSION 3.21)
2
+
3
+ if(DEFINED SKBUILD_PROJECT_VERSION)
4
+ set(INTERPOLATECPP_VERSION "${SKBUILD_PROJECT_VERSION}")
5
+ else()
6
+ set(INTERPOLATECPP_VERSION "3.3.1")
7
+ endif()
8
+
2
9
  project(InterpolateCpp
3
- VERSION 0.1.0
10
+ VERSION "${INTERPOLATECPP_VERSION}"
4
11
  LANGUAGES CXX
5
12
  DESCRIPTION "C++ port of InterpolatePy trajectory planning library"
6
13
  )
@@ -9,6 +16,9 @@ set(CMAKE_CXX_STANDARD 20)
9
16
  set(CMAKE_CXX_STANDARD_REQUIRED ON)
10
17
  set(CMAKE_CXX_EXTENSIONS OFF)
11
18
  set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
19
+ set(PYBIND11_FINDPYTHON ON)
20
+
21
+ include(GNUInstallDirs)
12
22
 
13
23
  # Options
14
24
  option(INTERPOLATECPP_BUILD_TESTS "Build tests" ON)
@@ -24,13 +34,17 @@ configure_file(
24
34
  # Dependencies via FetchContent
25
35
  include(FetchContent)
26
36
 
27
- FetchContent_Declare(
28
- Eigen
29
- GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
30
- GIT_TAG 3.4.0
31
- GIT_SHALLOW TRUE
32
- SYSTEM
33
- )
37
+ find_package(Eigen3 3.4 CONFIG QUIET)
38
+
39
+ if(NOT Eigen3_FOUND)
40
+ FetchContent_Declare(
41
+ Eigen
42
+ GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
43
+ GIT_TAG 3.4.0
44
+ GIT_SHALLOW TRUE
45
+ SYSTEM
46
+ )
47
+ endif()
34
48
 
35
49
  if(INTERPOLATECPP_BUILD_TESTS)
36
50
  FetchContent_Declare(
@@ -41,7 +55,7 @@ if(INTERPOLATECPP_BUILD_TESTS)
41
55
  )
42
56
  endif()
43
57
 
44
- if(INTERPOLATECPP_BUILD_BINDINGS)
58
+ if(INTERPOLATECPP_BUILD_BINDINGS AND NOT SKBUILD)
45
59
  FetchContent_Declare(
46
60
  pybind11
47
61
  GIT_REPOSITORY https://github.com/pybind/pybind11.git
@@ -50,12 +64,14 @@ if(INTERPOLATECPP_BUILD_BINDINGS)
50
64
  )
51
65
  endif()
52
66
 
53
- # Make Eigen available (suppress its tests and docs)
54
- set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
55
- set(EIGEN_BUILD_TESTING OFF CACHE BOOL "" FORCE)
56
- set(EIGEN_BUILD_DOC OFF CACHE BOOL "" FORCE)
57
- FetchContent_MakeAvailable(Eigen)
58
- set(BUILD_TESTING ON CACHE BOOL "" FORCE)
67
+ # Make the fallback Eigen dependency available without building its tests or docs.
68
+ if(NOT Eigen3_FOUND)
69
+ set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
70
+ set(EIGEN_BUILD_TESTING OFF CACHE BOOL "" FORCE)
71
+ set(EIGEN_BUILD_DOC OFF CACHE BOOL "" FORCE)
72
+ FetchContent_MakeAvailable(Eigen)
73
+ set(BUILD_TESTING ON CACHE BOOL "" FORCE)
74
+ endif()
59
75
 
60
76
  # Library sources
61
77
  set(INTERPOLATECPP_SOURCES
@@ -79,6 +95,11 @@ set(INTERPOLATECPP_SOURCES
79
95
  src/quaternion.cpp
80
96
  src/quaternion_spline.cpp
81
97
  src/squad_c2.cpp
98
+ src/spring_quaternion_interpolation.cpp
99
+ src/spring_solver.cpp
100
+ src/spring_gauss_newton.cpp
101
+ src/shooting_quaternion_interpolation.cpp
102
+ src/shooting_solver.cpp
82
103
  src/log_quaternion_interpolation.cpp
83
104
  src/modified_log_quaternion_interpolation.cpp
84
105
  # Phase 5: Path
@@ -106,6 +127,13 @@ set_target_properties(interpolatecpp PROPERTIES
106
127
  VISIBILITY_INLINES_HIDDEN ON
107
128
  )
108
129
 
130
+ # INTERPOLATECPP_API must export while building the library and stay empty for a
131
+ # static one; without this MSVC marks every symbol dllimport and the link fails.
132
+ target_compile_definitions(interpolatecpp
133
+ PRIVATE INTERPOLATECPP_EXPORTS
134
+ PUBLIC $<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:INTERPOLATECPP_STATIC_DEFINE>
135
+ )
136
+
109
137
  target_compile_options(interpolatecpp PRIVATE
110
138
  $<$<CXX_COMPILER_ID:GNU,Clang,AppleClang>:
111
139
  -Wall -Wextra -Wpedantic -Wconversion -Wshadow
@@ -124,7 +152,10 @@ endif()
124
152
 
125
153
  # Bindings
126
154
  if(INTERPOLATECPP_BUILD_BINDINGS)
127
- FetchContent_MakeAvailable(pybind11)
155
+ find_package(pybind11 CONFIG QUIET)
156
+ if(NOT pybind11_FOUND)
157
+ FetchContent_MakeAvailable(pybind11)
158
+ endif()
128
159
  add_subdirectory(bindings)
129
160
  endif()
130
161
 
@@ -134,8 +165,6 @@ if(INTERPOLATECPP_BUILD_EXAMPLES)
134
165
  endif()
135
166
 
136
167
  # Install rules
137
- include(GNUInstallDirs)
138
-
139
168
  install(TARGETS interpolatecpp
140
169
  EXPORT InterpolateCppTargets
141
170
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
@@ -22,5 +22,6 @@ target_link_libraries(interpolatecpp_py
22
22
  )
23
23
 
24
24
  install(TARGETS interpolatecpp_py
25
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
25
+ LIBRARY DESTINATION interpolatepy COMPONENT python
26
+ RUNTIME DESTINATION interpolatepy COMPONENT python
26
27
  )
@@ -6,6 +6,8 @@
6
6
  #include <interpolatecpp/quat/modified_log_quaternion_interpolation.hpp>
7
7
  #include <interpolatecpp/quat/quaternion.hpp>
8
8
  #include <interpolatecpp/quat/quaternion_spline.hpp>
9
+ #include <interpolatecpp/quat/spring_quaternion_interpolation.hpp>
10
+ #include <interpolatecpp/quat/shooting_quaternion_interpolation.hpp>
9
11
  #include <interpolatecpp/quat/squad_c2.hpp>
10
12
 
11
13
  namespace py = pybind11;
@@ -106,6 +108,82 @@ void bind_quaternion(py::module_& m) {
106
108
  .def_property_readonly("t_max", &SquadC2::t_max)
107
109
  .def_property_readonly("validate_continuity", &SquadC2::validate_continuity);
108
110
 
111
+ // SpringConfig
112
+ py::class_<SpringConfig>(quat_mod, "SpringConfig")
113
+ .def(py::init<>())
114
+ .def_readwrite("num_samples", &SpringConfig::num_samples)
115
+ .def_readwrite("iterations", &SpringConfig::iterations)
116
+ .def_readwrite("refinement_levels", &SpringConfig::refinement_levels)
117
+ .def_readwrite("step_size", &SpringConfig::step_size)
118
+ .def_readwrite("norm_penalty", &SpringConfig::norm_penalty)
119
+ .def_readwrite("keyframe_curvature_weight",
120
+ &SpringConfig::keyframe_curvature_weight)
121
+ .def_readwrite("tolerance", &SpringConfig::tolerance)
122
+ .def_readwrite("solver", &SpringConfig::solver)
123
+ .def_readwrite("final_iterations", &SpringConfig::final_iterations);
124
+
125
+ // SpringQuaternionInterpolation
126
+ py::class_<SpringQuaternionInterpolation>(quat_mod,
127
+ "SpringQuaternionInterpolation")
128
+ .def(py::init<const std::vector<double>&,
129
+ const std::vector<Quaternion>&, SpringConfig>(),
130
+ py::arg("time_points"), py::arg("quaternions"),
131
+ py::arg("config") = SpringConfig{},
132
+ py::call_guard<py::gil_scoped_release>())
133
+ .def("evaluate", &SpringQuaternionInterpolation::evaluate, py::arg("t"))
134
+ .def("evaluate_velocity",
135
+ &SpringQuaternionInterpolation::evaluate_velocity, py::arg("t"))
136
+ .def("evaluate_acceleration",
137
+ &SpringQuaternionInterpolation::evaluate_acceleration, py::arg("t"))
138
+ .def("generate_trajectory",
139
+ &SpringQuaternionInterpolation::generate_trajectory,
140
+ py::arg("num_points") = 100)
141
+ .def("get_time_points", &SpringQuaternionInterpolation::time_points)
142
+ .def("get_quaternions", &SpringQuaternionInterpolation::quaternions)
143
+ .def("get_sample_times", &SpringQuaternionInterpolation::sample_times)
144
+ .def("get_samples", &SpringQuaternionInterpolation::samples)
145
+ .def("get_keyframe_indices",
146
+ &SpringQuaternionInterpolation::keyframe_indices)
147
+ .def("get_refinement_sample_counts",
148
+ &SpringQuaternionInterpolation::refinement_sample_counts)
149
+ .def("get_stage_energy_history",
150
+ &SpringQuaternionInterpolation::stage_energy_history)
151
+ .def("get_stage_gradient_norms", &SpringQuaternionInterpolation::stage_gradient_norms)
152
+ .def_property_readonly("converged", &SpringQuaternionInterpolation::converged)
153
+ .def_property_readonly("initial_energy",
154
+ &SpringQuaternionInterpolation::initial_energy)
155
+ .def_property_readonly("final_energy",
156
+ &SpringQuaternionInterpolation::final_energy)
157
+ .def_property_readonly("iterations_run",
158
+ &SpringQuaternionInterpolation::iterations_run)
159
+ .def_property_readonly("t_min", &SpringQuaternionInterpolation::t_min)
160
+ .def_property_readonly("t_max", &SpringQuaternionInterpolation::t_max);
161
+
162
+ py::class_<ShootingConfig>(quat_mod, "ShootingConfig")
163
+ .def(py::init<>())
164
+ .def_readwrite("tolerance", &ShootingConfig::tolerance)
165
+ .def_readwrite("max_iterations", &ShootingConfig::max_iterations)
166
+ .def_readwrite("integration_steps", &ShootingConfig::integration_steps)
167
+ .def_readwrite("max_integration_steps", &ShootingConfig::max_integration_steps);
168
+
169
+ py::class_<ShootingQuaternionInterpolation>(quat_mod, "ShootingQuaternionInterpolation")
170
+ .def(py::init<const std::vector<double>&, const std::vector<Quaternion>&, ShootingConfig>(),
171
+ py::arg("time_points"), py::arg("quaternions"), py::arg("config") = ShootingConfig{},
172
+ py::call_guard<py::gil_scoped_release>())
173
+ .def("evaluate", &ShootingQuaternionInterpolation::evaluate, py::arg("t"))
174
+ .def("evaluate_velocity", &ShootingQuaternionInterpolation::evaluate_velocity, py::arg("t"))
175
+ .def("evaluate_acceleration", &ShootingQuaternionInterpolation::evaluate_acceleration, py::arg("t"))
176
+ .def("generate_trajectory", &ShootingQuaternionInterpolation::generate_trajectory, py::arg("num_points") = 100)
177
+ .def("get_time_points", &ShootingQuaternionInterpolation::time_points)
178
+ .def("get_quaternions", &ShootingQuaternionInterpolation::quaternions)
179
+ .def_property_readonly("iterations_run", &ShootingQuaternionInterpolation::iterations_run)
180
+ .def_property_readonly("integration_steps", &ShootingQuaternionInterpolation::integration_steps)
181
+ .def_property_readonly("num_variables", &ShootingQuaternionInterpolation::num_variables)
182
+ .def_property_readonly("residual_norm", &ShootingQuaternionInterpolation::residual_norm)
183
+ .def_property_readonly("acceleration_energy", &ShootingQuaternionInterpolation::acceleration_energy)
184
+ .def_property_readonly("t_min", &ShootingQuaternionInterpolation::t_min)
185
+ .def_property_readonly("t_max", &ShootingQuaternionInterpolation::t_max);
186
+
109
187
  // LogQuaternionInterpolation
110
188
  py::class_<LogQuaternionInterpolation>(quat_mod, "LogQuaternionInterpolation")
111
189
  .def(py::init<const std::vector<double>&, const std::vector<Quaternion>&, int,
@@ -16,6 +16,7 @@ set(EXAMPLE_SOURCES
16
16
  parabolic_linear_example.cpp
17
17
  # Phase 4: Quaternion
18
18
  quaternion_example.cpp
19
+ spring_quaternion_example.cpp
19
20
  # Phase 5: Paths & Concepts
20
21
  paths_example.cpp
21
22
  concepts_example.cpp