splinekit 0.2.7__tar.gz → 0.2.8__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 (328) hide show
  1. {splinekit-0.2.7 → splinekit-0.2.8}/PKG-INFO +8 -5
  2. {splinekit-0.2.7 → splinekit-0.2.8}/README.md +5 -2
  3. {splinekit-0.2.7 → splinekit-0.2.8/dev/Accelerated}/pyproject.toml +1 -1
  4. splinekit-0.2.8/dev/Jupyter/periodic-spline/calculus/spline_antigrad.ipynb +146 -0
  5. splinekit-0.2.8/dev/Jupyter/periodic-spline/calculus/spline_derivative.ipynb +165 -0
  6. splinekit-0.2.8/dev/Jupyter/periodic-spline/calculus/spline_fourier_diff.ipynb +239 -0
  7. splinekit-0.2.8/dev/Jupyter/periodic-spline/calculus/spline_gradient.ipynb +173 -0
  8. splinekit-0.2.8/dev/Jupyter/periodic-spline/calculus/spline_integrate.ipynb +185 -0
  9. splinekit-0.2.8/dev/Jupyter/periodic-spline/construct/spline_from_c.ipynb +244 -0
  10. splinekit-0.2.8/dev/Jupyter/periodic-spline/conv_corr/spline_autocorr.ipynb +178 -0
  11. splinekit-0.2.8/dev/Jupyter/periodic-spline/conv_corr/spline_convolve.ipynb +190 -0
  12. splinekit-0.2.8/dev/Jupyter/periodic-spline/conv_corr/spline_correlate.ipynb +211 -0
  13. splinekit-0.2.8/dev/Jupyter/periodic-spline/extrema/spline_curated_xtrm.ipynb +205 -0
  14. splinekit-0.2.8/dev/Jupyter/periodic-spline/extrema/spline_xtrm.ipynb +186 -0
  15. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/fourier/spline_fourier.ipynb +4 -6
  16. splinekit-0.2.8/dev/Jupyter/periodic-spline/fourier/spline_smoothness.ipynb +139 -0
  17. splinekit-0.2.8/dev/Jupyter/periodic-spline/sgn/spline_curated_zeros.ipynb +220 -0
  18. splinekit-0.2.8/dev/Jupyter/periodic-spline/sgn/spline_sgn.ipynb +168 -0
  19. splinekit-0.2.8/dev/Jupyter/periodic-spline/sgn/spline_zeros.ipynb +365 -0
  20. {splinekit-0.2.7 → splinekit-0.2.8}/dev/PurePython/pyproject.toml +1 -1
  21. splinekit-0.2.8/docs/bibliography.rst +10 -0
  22. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/bspline_bases.rst +27 -27
  23. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/bspline_inverse.rst +7 -7
  24. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/bspline_m_scale.rst +1 -1
  25. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/bspline_poles.rst +13 -13
  26. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/bspline_stability.rst +5 -5
  27. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/bspline_vs_pi.rst +2 -2
  28. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/spline_engineer_func.rst +5 -5
  29. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/spline_vs_poly.rst +11 -11
  30. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/padding/change_basis.rst +1 -1
  31. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/padding/padding.rst +34 -34
  32. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/bounds.rst +16 -16
  33. splinekit-0.2.8/docs/demos/spline1d/calculus.rst +133 -0
  34. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/constructors.rst +14 -5
  35. splinekit-0.2.8/docs/demos/spline1d/conv_corr.rst +148 -0
  36. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/evaluation.rst +5 -5
  37. splinekit-0.2.8/docs/demos/spline1d/extrema.rst +23 -0
  38. splinekit-0.2.8/docs/demos/spline1d/fourier.rst +123 -0
  39. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/index.rst +5 -0
  40. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/plot.rst +1 -1
  41. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/polynomials.rst +13 -13
  42. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/random1d.rst +1 -1
  43. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/random2d.rst +1 -1
  44. splinekit-0.2.8/docs/demos/spline1d/signum.rst +78 -0
  45. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/stats.rst +1 -1
  46. {splinekit-0.2.7 → splinekit-0.2.8}/docs/index.rst +1 -0
  47. {splinekit-0.2.7/dev/Accelerated → splinekit-0.2.8}/pyproject.toml +1 -1
  48. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/periodic_spline_1d.py +5 -5
  49. splinekit-0.2.7/.virtual_documents/dev/Jupyter/spline_plot.ipynb +0 -323
  50. {splinekit-0.2.7 → splinekit-0.2.8}/.github/workflows/deploy-docs.yml +0 -0
  51. {splinekit-0.2.7 → splinekit-0.2.8}/.github/workflows/release.yml +0 -0
  52. {splinekit-0.2.7 → splinekit-0.2.8}/.github/workflows/test.yml +0 -0
  53. {splinekit-0.2.7 → splinekit-0.2.8}/.gitignore +0 -0
  54. {splinekit-0.2.7 → splinekit-0.2.8}/.jupyterlite.doit.db +0 -0
  55. {splinekit-0.2.7 → splinekit-0.2.8}/CMakeLists.txt +0 -0
  56. {splinekit-0.2.7 → splinekit-0.2.8}/LICENSE +0 -0
  57. {splinekit-0.2.7 → splinekit-0.2.8}/_output/api/translations/all.json +0 -0
  58. {splinekit-0.2.7 → splinekit-0.2.8}/_output/api/translations/en.json +0 -0
  59. {splinekit-0.2.7 → splinekit-0.2.8}/_output/api/workspaces/all.json +0 -0
  60. {splinekit-0.2.7 → splinekit-0.2.8}/_output/bootstrap.js +0 -0
  61. {splinekit-0.2.7 → splinekit-0.2.8}/_output/config-utils.js +0 -0
  62. {splinekit-0.2.7 → splinekit-0.2.8}/_output/consoles/favicon.ico +0 -0
  63. {splinekit-0.2.7 → splinekit-0.2.8}/_output/consoles/index.html +0 -0
  64. {splinekit-0.2.7 → splinekit-0.2.8}/_output/consoles/jupyter-lite.ipynb +0 -0
  65. {splinekit-0.2.7 → splinekit-0.2.8}/_output/consoles/jupyter-lite.json +0 -0
  66. {splinekit-0.2.7 → splinekit-0.2.8}/_output/consoles/package.json +0 -0
  67. {splinekit-0.2.7 → splinekit-0.2.8}/_output/doc/tree/index.html +0 -0
  68. {splinekit-0.2.7 → splinekit-0.2.8}/_output/doc/workspaces/index.html +0 -0
  69. {splinekit-0.2.7 → splinekit-0.2.8}/_output/edit/favicon.ico +0 -0
  70. {splinekit-0.2.7 → splinekit-0.2.8}/_output/edit/index.html +0 -0
  71. {splinekit-0.2.7 → splinekit-0.2.8}/_output/edit/jupyter-lite.ipynb +0 -0
  72. {splinekit-0.2.7 → splinekit-0.2.8}/_output/edit/jupyter-lite.json +0 -0
  73. {splinekit-0.2.7 → splinekit-0.2.8}/_output/edit/package.json +0 -0
  74. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/install.json +0 -0
  75. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/package.json +0 -0
  76. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/schemas/jupyterlab-jupytext/package.json.orig +0 -0
  77. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/schemas/jupyterlab-jupytext/plugin.json +0 -0
  78. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/static/48.0570848d2b31a5354b7d.js +0 -0
  79. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/static/48.0570848d2b31a5354b7d.js.LICENSE.txt +0 -0
  80. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/static/509.d51a8122d1920ac82323.js +0 -0
  81. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/static/720.094c38d70b1dec0ceea7.js +0 -0
  82. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/static/remoteEntry.94495aac41d2fef6ad41.js +0 -0
  83. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/static/style.js +0 -0
  84. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab-jupytext/static/third-party-licenses.json +0 -0
  85. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab_pygments/install.json +0 -0
  86. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab_pygments/package.json +0 -0
  87. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab_pygments/static/568.1e2faa2ba0bbe59c4780.js +0 -0
  88. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab_pygments/static/747.67662283a5707eeb4d4c.js +0 -0
  89. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab_pygments/static/remoteEntry.5cbb9d2323598fbda535.js +0 -0
  90. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab_pygments/static/style.js +0 -0
  91. {splinekit-0.2.7 → splinekit-0.2.8}/_output/extensions/jupyterlab_pygments/static/third-party-licenses.json +0 -0
  92. {splinekit-0.2.7 → splinekit-0.2.8}/_output/icon-120x120.png +0 -0
  93. {splinekit-0.2.7 → splinekit-0.2.8}/_output/icon-512x512.png +0 -0
  94. {splinekit-0.2.7 → splinekit-0.2.8}/_output/index.html +0 -0
  95. {splinekit-0.2.7 → splinekit-0.2.8}/_output/jupyter-lite.ipynb +0 -0
  96. {splinekit-0.2.7 → splinekit-0.2.8}/_output/jupyter-lite.json +0 -0
  97. {splinekit-0.2.7 → splinekit-0.2.8}/_output/jupyterlite.schema.v0.json +0 -0
  98. {splinekit-0.2.7 → splinekit-0.2.8}/_output/lab/favicon.ico +0 -0
  99. {splinekit-0.2.7 → splinekit-0.2.8}/_output/lab/index.html +0 -0
  100. {splinekit-0.2.7 → splinekit-0.2.8}/_output/lab/jupyter-lite.ipynb +0 -0
  101. {splinekit-0.2.7 → splinekit-0.2.8}/_output/lab/jupyter-lite.json +0 -0
  102. {splinekit-0.2.7 → splinekit-0.2.8}/_output/lab/package.json +0 -0
  103. {splinekit-0.2.7 → splinekit-0.2.8}/_output/lab/tree/index.html +0 -0
  104. {splinekit-0.2.7 → splinekit-0.2.8}/_output/lab/workspaces/index.html +0 -0
  105. {splinekit-0.2.7 → splinekit-0.2.8}/_output/manifest.webmanifest +0 -0
  106. {splinekit-0.2.7 → splinekit-0.2.8}/_output/notebooks/favicon.ico +0 -0
  107. {splinekit-0.2.7 → splinekit-0.2.8}/_output/notebooks/index.html +0 -0
  108. {splinekit-0.2.7 → splinekit-0.2.8}/_output/notebooks/jupyter-lite.ipynb +0 -0
  109. {splinekit-0.2.7 → splinekit-0.2.8}/_output/notebooks/jupyter-lite.json +0 -0
  110. {splinekit-0.2.7 → splinekit-0.2.8}/_output/notebooks/package.json +0 -0
  111. {splinekit-0.2.7 → splinekit-0.2.8}/_output/package.json +0 -0
  112. {splinekit-0.2.7 → splinekit-0.2.8}/_output/repl/index.html +0 -0
  113. {splinekit-0.2.7 → splinekit-0.2.8}/_output/repl/jupyter-lite.ipynb +0 -0
  114. {splinekit-0.2.7 → splinekit-0.2.8}/_output/repl/jupyter-lite.json +0 -0
  115. {splinekit-0.2.7 → splinekit-0.2.8}/_output/repl/package.json +0 -0
  116. {splinekit-0.2.7 → splinekit-0.2.8}/_output/service-worker.js +0 -0
  117. {splinekit-0.2.7 → splinekit-0.2.8}/_output/static/favicons/favicon-busy-1.ico +0 -0
  118. {splinekit-0.2.7 → splinekit-0.2.8}/_output/static/favicons/favicon-busy-2.ico +0 -0
  119. {splinekit-0.2.7 → splinekit-0.2.8}/_output/static/favicons/favicon-busy-3.ico +0 -0
  120. {splinekit-0.2.7 → splinekit-0.2.8}/_output/static/favicons/favicon-file.ico +0 -0
  121. {splinekit-0.2.7 → splinekit-0.2.8}/_output/static/favicons/favicon-notebook.ico +0 -0
  122. {splinekit-0.2.7 → splinekit-0.2.8}/_output/static/favicons/favicon-terminal.ico +0 -0
  123. {splinekit-0.2.7 → splinekit-0.2.8}/_output/static/favicons/favicon.ico +0 -0
  124. {splinekit-0.2.7 → splinekit-0.2.8}/_output/tree/favicon.ico +0 -0
  125. {splinekit-0.2.7 → splinekit-0.2.8}/_output/tree/index.html +0 -0
  126. {splinekit-0.2.7 → splinekit-0.2.8}/_output/tree/jupyter-lite.ipynb +0 -0
  127. {splinekit-0.2.7 → splinekit-0.2.8}/_output/tree/jupyter-lite.json +0 -0
  128. {splinekit-0.2.7 → splinekit-0.2.8}/_output/tree/package.json +0 -0
  129. {splinekit-0.2.7 → splinekit-0.2.8}/ansi_c/spline_padding/src/spline_padding.c +0 -0
  130. {splinekit-0.2.7 → splinekit-0.2.8}/ansi_c/spline_padding/src/spline_padding.h +0 -0
  131. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_cmake/CMakeLists.txt +0 -0
  132. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_cmake/spline_padding.c +0 -0
  133. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_cmake/spline_padding.h +0 -0
  134. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_xcode/libspline_padding.dylib +0 -0
  135. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_xcode/spline_padding.c +0 -0
  136. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_xcode/spline_padding.h +0 -0
  137. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/project.pbxproj +0 -0
  138. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  139. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/project.xcworkspace/xcuserdata/pthevena.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  140. {splinekit-0.2.7 → splinekit-0.2.8}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/xcuserdata/pthevena.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  141. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Accelerated/dispatch.sh +0 -0
  142. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Accelerated/release.yml +0 -0
  143. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Accelerated/spline_padding.py +0 -0
  144. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/bases/bspline_cardinal.ipynb +0 -0
  145. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/bases/bspline_dual.ipynb +0 -0
  146. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/bases/bspline_dual_property.ipynb +0 -0
  147. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/bases/bspline_member.ipynb +0 -0
  148. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/bases/bspline_ortho.ipynb +0 -0
  149. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/bases/bspline_ortho_property.ipynb +0 -0
  150. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/bases/bspline_sinc.ipynb +0 -0
  151. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/hello/bspline_hello.ipynb +0 -0
  152. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/hello/bspline_hello_grad.ipynb +0 -0
  153. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/hello/bspline_hello_integral.ipynb +0 -0
  154. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/inverse/bspline_inv.ipynb +0 -0
  155. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/inverse/bspline_periodic_inv.ipynb +0 -0
  156. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/m-scale/bspline_m_scale.ipynb +0 -0
  157. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/mathfunc/bspline_gauss_exo.ipynb +0 -0
  158. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/mathfunc/bspline_trigo_exo.ipynb +0 -0
  159. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/mathfunc/bspline_vs_cos.ipynb +0 -0
  160. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/mathfunc/bspline_vs_erf.ipynb +0 -0
  161. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/mathfunc/bspline_vs_exp.ipynb +0 -0
  162. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/mathfunc/bspline_vs_sin.ipynb +0 -0
  163. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/members/bspline_member.ipynb +0 -0
  164. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/members/bspline_member_diff.ipynb +0 -0
  165. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/members/bspline_member_integral.ipynb +0 -0
  166. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/poles/bspline_annihilate.ipynb +0 -0
  167. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/poles/bspline_poles.ipynb +0 -0
  168. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/poly/bspline_convolve_mono.ipynb +0 -0
  169. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/poly/bspline_partition_mono.ipynb +0 -0
  170. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/poly/bspline_spline_poly.ipynb +0 -0
  171. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/stability/bspline_numeric_stability.ipynb +0 -0
  172. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/vs-pi/bspline_vs_pi_as_sum.ipynb +0 -0
  173. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/bspline/vs-pi/bspline_vs_pi_at0.ipynb +0 -0
  174. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/padding/change-basis/padding_bases.ipynb +0 -0
  175. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/padding/padding/padding_data.ipynb +0 -0
  176. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/padding/padding/padding_speed.ipynb +0 -0
  177. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/bounds/spline_bounds.ipynb +0 -0
  178. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/construct/spline_approximation.ipynb +0 -0
  179. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/construct/spline_interpolation.ipynb +0 -0
  180. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/eval/spline_at_array.ipynb +0 -0
  181. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/eval/spline_at_scalar.ipynb +0 -0
  182. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/eval/spline_evaluation_speed.ipynb +0 -0
  183. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/ops/spline_simple_ops.ipynb +0 -0
  184. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/plot/spline_plot.ipynb +0 -0
  185. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/poly/spline_polynomials.ipynb +0 -0
  186. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/random-1d/spline_random_1d.ipynb +0 -0
  187. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/random-2d/spline_random_2d.ipynb +0 -0
  188. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Jupyter/periodic-spline/stats/spline_stats.ipynb +0 -0
  189. {splinekit-0.2.7 → splinekit-0.2.8}/dev/PurePython/dispatch.sh +0 -0
  190. {splinekit-0.2.7 → splinekit-0.2.8}/dev/PurePython/release.yml +0 -0
  191. {splinekit-0.2.7 → splinekit-0.2.8}/dev/PurePython/spline_padding.py +0 -0
  192. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/Bspline Poles.nb +0 -0
  193. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/IntervalChecks.nb +0 -0
  194. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/PeriodicSplinesChecks.nb +0 -0
  195. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/SplinePaddingChecks.nb +0 -0
  196. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/Test BSplines.nb +0 -0
  197. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/Test PeriodicNonuniformPiecewise.nb +0 -0
  198. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/Test PeriodicSpline1D.nb +0 -0
  199. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/Test SplinePadding.nb +0 -0
  200. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/Test SplineUtilities.nb +0 -0
  201. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/Verify doc.nb +0 -0
  202. {splinekit-0.2.7 → splinekit-0.2.8}/dev/Wolfram/rescued Test SplinePadding.nb +0 -0
  203. {splinekit-0.2.7 → splinekit-0.2.8}/docs/.jupyterlite.doit.db +0 -0
  204. {splinekit-0.2.7 → splinekit-0.2.8}/docs/_static/custom.css +0 -0
  205. {splinekit-0.2.7 → splinekit-0.2.8}/docs/bases/01_bases.rst +0 -0
  206. {splinekit-0.2.7 → splinekit-0.2.8}/docs/bases/index.rst +0 -0
  207. {splinekit-0.2.7 → splinekit-0.2.8}/docs/bases/noxfile.py +0 -0
  208. {splinekit-0.2.7 → splinekit-0.2.8}/docs/bsplines/01_bsplines.rst +0 -0
  209. {splinekit-0.2.7 → splinekit-0.2.8}/docs/bsplines/index.rst +0 -0
  210. {splinekit-0.2.7 → splinekit-0.2.8}/docs/bsplines/noxfile.py +0 -0
  211. {splinekit-0.2.7 → splinekit-0.2.8}/docs/conf.py +0 -0
  212. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/bspline_members.rst +0 -0
  213. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/bspline_numeric_stability.ipynb.gz +0 -0
  214. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/hello_bspline.rst +0 -0
  215. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/bspline/index.rst +0 -0
  216. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/index.rst +0 -0
  217. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/padding/index.rst +0 -0
  218. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/padding/padding_speed.ipynb.gz +0 -0
  219. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/simple_ops.rst +0 -0
  220. {splinekit-0.2.7 → splinekit-0.2.8}/docs/demos/spline1d/spline_evaluation_speed.ipynb.gz +0 -0
  221. {splinekit-0.2.7 → splinekit-0.2.8}/docs/environment.yml +0 -0
  222. {splinekit-0.2.7 → splinekit-0.2.8}/docs/glossary/glossary-numbers.rst +0 -0
  223. {splinekit-0.2.7 → splinekit-0.2.8}/docs/glossary/glossary-polynomials.rst +0 -0
  224. {splinekit-0.2.7 → splinekit-0.2.8}/docs/glossary/glossary-splines.rst +0 -0
  225. {splinekit-0.2.7 → splinekit-0.2.8}/docs/glossary/glossary-terminology.rst +0 -0
  226. {splinekit-0.2.7 → splinekit-0.2.8}/docs/glossary/index.rst +0 -0
  227. {splinekit-0.2.7 → splinekit-0.2.8}/docs/installation/index.rst +0 -0
  228. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/bounded/01_bounded.rst +0 -0
  229. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/bounded/02_open.rst +0 -0
  230. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/bounded/03_open_closed.rst +0 -0
  231. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/bounded/04_closed.rst +0 -0
  232. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/bounded/05_closed_open.rst +0 -0
  233. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/bounded/index.rst +0 -0
  234. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/bounded/noxfile.py +0 -0
  235. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/degenerate/01_degenerate.rst +0 -0
  236. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/degenerate/02_singleton.rst +0 -0
  237. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/degenerate/index.rst +0 -0
  238. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/degenerate/noxfile.py +0 -0
  239. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/half_bounded/01_half_bounded.rst +0 -0
  240. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/half_bounded/02_above.rst +0 -0
  241. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/half_bounded/03_not_below.rst +0 -0
  242. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/half_bounded/04_not_above.rst +0 -0
  243. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/half_bounded/05_below.rst +0 -0
  244. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/half_bounded/index.rst +0 -0
  245. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/half_bounded/noxfile.py +0 -0
  246. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/index.rst +0 -0
  247. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/interval/01_interval.rst +0 -0
  248. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/interval/index.rst +0 -0
  249. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/interval/noxfile.py +0 -0
  250. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/noxfile.py +0 -0
  251. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/universal/01_universal.rst +0 -0
  252. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/universal/02_empty.rst +0 -0
  253. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/universal/03_rr.rst +0 -0
  254. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/universal/index.rst +0 -0
  255. {splinekit-0.2.7 → splinekit-0.2.8}/docs/interval/universal/noxfile.py +0 -0
  256. {splinekit-0.2.7 → splinekit-0.2.8}/docs/noxfile.py +0 -0
  257. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_nonuniform_piecewise/01_periodic_nonuniform_piecewise.rst +0 -0
  258. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_nonuniform_piecewise/index.rst +0 -0
  259. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_nonuniform_piecewise/noxfile.py +0 -0
  260. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/01_periodic_spline_1d.rst +0 -0
  261. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/index.rst +0 -0
  262. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m00.png +0 -0
  263. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m01.png +0 -0
  264. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m02.png +0 -0
  265. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m03.png +0 -0
  266. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m04.png +0 -0
  267. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m05.png +0 -0
  268. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m06.png +0 -0
  269. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m07.png +0 -0
  270. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m08.png +0 -0
  271. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m09.png +0 -0
  272. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m10.png +0 -0
  273. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m11.png +0 -0
  274. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m12.png +0 -0
  275. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m13.png +0 -0
  276. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m14.png +0 -0
  277. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m15.png +0 -0
  278. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m16.png +0 -0
  279. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m17.png +0 -0
  280. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m18.png +0 -0
  281. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m19.png +0 -0
  282. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m20.png +0 -0
  283. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m21.png +0 -0
  284. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m22.png +0 -0
  285. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m23.png +0 -0
  286. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/m24.png +0 -0
  287. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/matplotlib-color.rst +0 -0
  288. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/matplotlib-linestyle.rst +0 -0
  289. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/matplotlib-marker.rst +0 -0
  290. {splinekit-0.2.7 → splinekit-0.2.8}/docs/periodic_spline_1d/noxfile.py +0 -0
  291. {splinekit-0.2.7 → splinekit-0.2.8}/docs/spline_padding/01_spline_padding.rst +0 -0
  292. {splinekit-0.2.7 → splinekit-0.2.8}/docs/spline_padding/index.rst +0 -0
  293. {splinekit-0.2.7 → splinekit-0.2.8}/docs/spline_padding/noxfile.py +0 -0
  294. {splinekit-0.2.7 → splinekit-0.2.8}/docs/spline_utilities/01_spline_utilities.rst +0 -0
  295. {splinekit-0.2.7 → splinekit-0.2.8}/docs/spline_utilities/index.rst +0 -0
  296. {splinekit-0.2.7 → splinekit-0.2.8}/docs/spline_utilities/noxfile.py +0 -0
  297. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/__init__.py +0 -0
  298. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/bases.py +0 -0
  299. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/bsplines.py +0 -0
  300. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/__init__.py +0 -0
  301. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/_known_intervals.py +0 -0
  302. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/above.py +0 -0
  303. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/below.py +0 -0
  304. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/bounded.py +0 -0
  305. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/closed.py +0 -0
  306. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/closed_open.py +0 -0
  307. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/degenerate.py +0 -0
  308. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/empty.py +0 -0
  309. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/half_bounded.py +0 -0
  310. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/interval.py +0 -0
  311. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/mypy.ini +0 -0
  312. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/not_above.py +0 -0
  313. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/not_below.py +0 -0
  314. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/open.py +0 -0
  315. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/open_closed.py +0 -0
  316. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/rr.py +0 -0
  317. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/singleton.py +0 -0
  318. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/interval/universal.py +0 -0
  319. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/mypy.ini +0 -0
  320. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/periodic_nonuniform_piecewise.py +0 -0
  321. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/spline_padding.py +0 -0
  322. {splinekit-0.2.7 → splinekit-0.2.8}/src/splinekit/spline_utilities.py +0 -0
  323. {splinekit-0.2.7 → splinekit-0.2.8}/temp/bspline_stability.py +0 -0
  324. {splinekit-0.2.7 → splinekit-0.2.8}/tests/test_bsplines.py +0 -0
  325. {splinekit-0.2.7 → splinekit-0.2.8}/tests/test_periodic_nonuniform_piecewise.py +0 -0
  326. {splinekit-0.2.7 → splinekit-0.2.8}/tests/test_periodic_spline_1d.py +0 -0
  327. {splinekit-0.2.7 → splinekit-0.2.8}/tests/test_spline_padding.py +0 -0
  328. {splinekit-0.2.7 → splinekit-0.2.8}/tests/test_spline_utilities.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splinekit
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: A set of functions and classes to handle periodic 1D polynomial splines
5
- Author-Email: =?utf-8?q?Philippe_Th=C3=A9venaz?= <philippe.thevenaz@icloud.com>
6
- Maintainer-Email: =?utf-8?q?Philippe_Th=C3=A9venaz?= <philippe.thevenaz@icloud.com>
5
+ Author-Email: Philippe Thévenaz <philippe.thevenaz@icloud.com>
6
+ Maintainer-Email: Philippe Thévenaz <philippe.thevenaz@icloud.com>
7
7
  License-Expression: MIT
8
8
  License-File: LICENSE
9
9
  Classifier: Programming Language :: Python :: 3
@@ -51,7 +51,7 @@ Description-Content-Type: text/markdown
51
51
 
52
52
  <!-- splinekit/README.md -->
53
53
 
54
- # Version 0.2.7
54
+ # Version 0.2.8
55
55
 
56
56
  # splinekit: Spline Operations
57
57
  `splinekit` is a Python-based open-source software library aimed at the manipulation of one-dimensional periodic splines.
@@ -116,7 +116,7 @@ pip install -e .[dev]
116
116
 
117
117
  ## Release Notes
118
118
 
119
- ### 0.1.0
119
+ ### 0.1.*
120
120
  First stable version. Pure Python.
121
121
 
122
122
  ### 0.2.1
@@ -133,3 +133,6 @@ Some demos added. Documentation minor updates.
133
133
 
134
134
  ### 0.2.7
135
135
  Upgraded to jupyterlite 0.7
136
+
137
+ ### 0.2.8
138
+ Some demos added.
@@ -1,6 +1,6 @@
1
1
  <!-- splinekit/README.md -->
2
2
 
3
- # Version 0.2.7
3
+ # Version 0.2.8
4
4
 
5
5
  # splinekit: Spline Operations
6
6
  `splinekit` is a Python-based open-source software library aimed at the manipulation of one-dimensional periodic splines.
@@ -65,7 +65,7 @@ pip install -e .[dev]
65
65
 
66
66
  ## Release Notes
67
67
 
68
- ### 0.1.0
68
+ ### 0.1.*
69
69
  First stable version. Pure Python.
70
70
 
71
71
  ### 0.2.1
@@ -82,3 +82,6 @@ Some demos added. Documentation minor updates.
82
82
 
83
83
  ### 0.2.7
84
84
  Upgraded to jupyterlite 0.7
85
+
86
+ ### 0.2.8
87
+ Some demos added.
@@ -10,7 +10,7 @@ build-backend = "scikit_build_core.build" # Activate for C dynamic library
10
10
  # Project
11
11
  [project]
12
12
  name = "splinekit"
13
- version = "0.2.7"
13
+ version = "0.2.8"
14
14
  dependencies = [
15
15
  "numpy >=1.26",
16
16
  "scipy >=1.15",
@@ -0,0 +1,146 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "02240a05-3526-4530-ae12-d9522465b594",
6
+ "metadata": {},
7
+ "source": [
8
+ "# Anti-Gradient of Periodic Splines\n",
9
+ "The spline $f$ whose anti-gradient is sought is shown as a <span style=\"color:#c20078\">**fuchsia**</span> curve, with data samples at the integers represented with circles and stem lines. The sample at the origin, as well as its periodized replicates, is indicated by a red circle and stem line. The small black disks depict the knots of the spline. The anti-gradient is shown in the <span style=\"color:#1f77b4\">**azure**</span> color, while the gradient of the anti-gradient is shown in <span style=\"color:#2ca02c\">**green**</span>. Up to some value offset that depends on $E\\{f\\},$ the green and the fuchsia curves are identical.\n",
10
+ "\n",
11
+ "It is instructive to realize that the knots of all three splines share their abscissa. This indicates that the delay associated to the anti-gradient is a half-integer away from the delay associated to the spline $f$ because the degree of one of these two splines is even when the degree of the other one is odd, and reciprocally."
12
+ ]
13
+ },
14
+ {
15
+ "cell_type": "code",
16
+ "execution_count": null,
17
+ "id": "230ca8a8-c806-4207-b416-9954d55f1377",
18
+ "metadata": {},
19
+ "outputs": [],
20
+ "source": [
21
+ "# Load the required libraries\n",
22
+ "import ipywidgets as widgets\n",
23
+ "import matplotlib.pyplot as plt\n",
24
+ "import numpy as np\n",
25
+ "\n",
26
+ "import splinekit as sk # This library\n",
27
+ "\n",
28
+ "# Setup\n",
29
+ "max_period = 15 # Maximal period\n",
30
+ "max_degree = 5 # Maximal spline degree\n",
31
+ "max_delay = 8.0 # Maximal absolute delay\n",
32
+ "\n",
33
+ "# Initialize the generator of random numbers\n",
34
+ "rng = np.random.default_rng()\n",
35
+ "\n",
36
+ "# Initial random periodic cubic splines with normal Gaussian coefficients\n",
37
+ "f0 = sk.PeriodicSpline1D.from_spline_coeff(rng.standard_normal(6), degree = 3)\n",
38
+ "f0 = f0.plus(rng.choice([-1.0, 1.0]) * rng.uniform(0.05, 0.15) - f0.mean())\n",
39
+ "\n",
40
+ "# Plot\n",
41
+ "def update_plot (\n",
42
+ " period = 6,\n",
43
+ " degree = 1,\n",
44
+ " delay = 0.0\n",
45
+ "):\n",
46
+ " global f0\n",
47
+ "\n",
48
+ " # Update of the spline\n",
49
+ " if f0.period != period:\n",
50
+ " f0 = sk.PeriodicSpline1D.from_spline_coeff(\n",
51
+ " rng.standard_normal(period),\n",
52
+ " degree = f0.degree\n",
53
+ " )\n",
54
+ " # Slight departure from zero-mean\n",
55
+ " f0 = f0.plus(rng.choice([-1.0, 1.0]) * rng.uniform(0.05, 0.15) - f0.mean())\n",
56
+ " f0.degree = degree\n",
57
+ " f0.delay = delay\n",
58
+ "\n",
59
+ " # Anti-gradient\n",
60
+ " g0 = f0.anti_grad()\n",
61
+ " # Gradient of the anti-gradient\n",
62
+ " f = g0.gradient()\n",
63
+ "\n",
64
+ " # Dynamic range\n",
65
+ " image = {f0.image(), g0.image(), f.image()}\n",
66
+ " plotrange = sk.interval.Interval.enclosure(image)\n",
67
+ " plotrange = sk.interval.Closed((\n",
68
+ " plotrange.midpoint - 0.55 * plotrange.diameter,\n",
69
+ " plotrange.midpoint + 0.55 * plotrange.diameter\n",
70
+ " ))\n",
71
+ "\n",
72
+ " # Plot of the spline\n",
73
+ " subplot = plt.subplots()\n",
74
+ " f0.plot(subplot, plotrange = plotrange, plotpoints = 200 + 1, curve_fmt = \"-m\")\n",
75
+ " g0.plot(subplot, plotrange = plotrange, plotpoints = 200 + 1, curve_fmt = \"-C0\")\n",
76
+ " f.plot(subplot, plotrange = plotrange, plotpoints = 200 + 1, curve_fmt = \"-C2\")\n",
77
+ " plt.show()\n",
78
+ "\n",
79
+ "# Interaction\n",
80
+ "widgets.interactive(\n",
81
+ " update_plot,\n",
82
+ " period = (1, max_period),\n",
83
+ " degree = (0, max_degree),\n",
84
+ " delay = (-max_delay, max_delay)\n",
85
+ ")\n"
86
+ ]
87
+ },
88
+ {
89
+ "cell_type": "code",
90
+ "execution_count": null,
91
+ "id": "c719d9b2-273a-431b-9812-11db4edcb69c",
92
+ "metadata": {},
93
+ "outputs": [],
94
+ "source": [
95
+ "\n",
96
+ "\n",
97
+ "\n",
98
+ "\n",
99
+ "\n",
100
+ "\n",
101
+ "\n",
102
+ "\n",
103
+ "\n",
104
+ "\n",
105
+ "\n",
106
+ "\n",
107
+ "\n",
108
+ "\n",
109
+ "\n",
110
+ "\n",
111
+ "\n",
112
+ "\n",
113
+ "\n",
114
+ "\n"
115
+ ]
116
+ }
117
+ ],
118
+ "metadata": {
119
+ "kernelspec": {
120
+ "display_name": "Python 3 (ipykernel)",
121
+ "language": "python",
122
+ "name": "python3"
123
+ },
124
+ "language_info": {
125
+ "codemirror_mode": {
126
+ "name": "ipython",
127
+ "version": 3
128
+ },
129
+ "file_extension": ".py",
130
+ "mimetype": "text/x-python",
131
+ "name": "python",
132
+ "nbconvert_exporter": "python",
133
+ "pygments_lexer": "ipython3",
134
+ "version": "3.12.6"
135
+ },
136
+ "widgets": {
137
+ "application/vnd.jupyter.widget-state+json": {
138
+ "state": {},
139
+ "version_major": 2,
140
+ "version_minor": 0
141
+ }
142
+ }
143
+ },
144
+ "nbformat": 4,
145
+ "nbformat_minor": 5
146
+ }
@@ -0,0 +1,165 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "02240a05-3526-4530-ae12-d9522465b594",
6
+ "metadata": {},
7
+ "source": [
8
+ "# Derivatives of Periodic Splines\n",
9
+ "We show in the <span style=\"color:#c20078\">**fuchsia**</span> color the spline $f$ of degree $n\\in{\\mathbb{N}}$ whose derivative of order $m\\in[0\\ldots n]$ is sought. The data samples of $f$ at the integers are represented with circles and stem lines. The sample at the origin, as well as its periodized replicates, is indicated by a red circle and stem line. The small black disks depict the knots of the spline. The derivative $\\frac{{\\mathrm{d}}^{m}f(x)}{{\\mathrm{d}}x^{m}}$ is shown in the <span style=\"color:#2ca02c\">**green**</span> color."
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "code",
14
+ "execution_count": null,
15
+ "id": "230ca8a8-c806-4207-b416-9954d55f1377",
16
+ "metadata": {},
17
+ "outputs": [],
18
+ "source": [
19
+ "# Load the required libraries\n",
20
+ "import ipywidgets as widgets\n",
21
+ "import matplotlib.pyplot as plt\n",
22
+ "import numpy as np\n",
23
+ "\n",
24
+ "import splinekit as sk # This library\n",
25
+ "\n",
26
+ "# Setup\n",
27
+ "max_period = 15 # Maximal period\n",
28
+ "max_degree = 5 # Maximal degree of the spline\n",
29
+ "max_delay = 2.0 # Maximal absolute delay\n",
30
+ "plotpoints = 200 + 1 # Number of rendered samples\n",
31
+ "\n",
32
+ "# Initialize the generator of random numbers\n",
33
+ "rng = np.random.default_rng()\n",
34
+ "\n",
35
+ "# Initial random periodic cubic splines with normal Gaussian coefficients\n",
36
+ "f = sk.PeriodicSpline1D.from_spline_coeff(rng.standard_normal(6), degree = 3)\n",
37
+ "\n",
38
+ "# Plot\n",
39
+ "def update_plot (\n",
40
+ " degree = 3,\n",
41
+ " order = 2,\n",
42
+ " period = 6,\n",
43
+ " delay = 0.0\n",
44
+ "):\n",
45
+ " global f\n",
46
+ "\n",
47
+ " # Update of the spline\n",
48
+ " if f.period != period:\n",
49
+ " f = sk.PeriodicSpline1D.from_spline_coeff(\n",
50
+ " rng.standard_normal(period),\n",
51
+ " degree = f.degree\n",
52
+ " )\n",
53
+ " f.degree = degree\n",
54
+ " f.delay = delay\n",
55
+ "\n",
56
+ " # Derivative of the specified order\n",
57
+ " g = f.differentiated(order)\n",
58
+ "\n",
59
+ " # Dynamic range\n",
60
+ " image = {f.image(), g.image()}\n",
61
+ " plotrange = sk.interval.Interval.enclosure(image)\n",
62
+ " plotrange = sk.interval.Closed((\n",
63
+ " plotrange.midpoint - 0.55 * plotrange.diameter,\n",
64
+ " plotrange.midpoint + 0.55 * plotrange.diameter\n",
65
+ " ))\n",
66
+ "\n",
67
+ " # Plot of the spline\n",
68
+ " subplot = plt.subplots()\n",
69
+ " f.plot(\n",
70
+ " subplot,\n",
71
+ " plotrange = plotrange,\n",
72
+ " plotpoints = 200 + 1,\n",
73
+ " curve_fmt = \"#eccdef\" if order == 0 else \"-m\",\n",
74
+ " curve_lw = 7.0 if order == 0 else 0.75\n",
75
+ " )\n",
76
+ " # Plot of the gradient\n",
77
+ " g.plot(\n",
78
+ " subplot,\n",
79
+ " plotrange = plotrange,\n",
80
+ " plotpoints = 200 + 1,\n",
81
+ " curve_fmt = \"-C2\",\n",
82
+ " curve_markerfmt = \" \",\n",
83
+ " curvestem_linefmt = \"None\",\n",
84
+ " knot_marker = \" \",\n",
85
+ " periodbound_markerfmt = \" \",\n",
86
+ " periodboundstem_linefmt = \"None\"\n",
87
+ " )\n",
88
+ " plt.show()\n",
89
+ "\n",
90
+ "# Interaction\n",
91
+ "degree_widget = widgets.IntSlider(min = 0, max = max_degree, value = 3)\n",
92
+ "order_widget = widgets.IntSlider(min = 0, max = 3, value = 2)\n",
93
+ "def update_order_range (\n",
94
+ " *args\n",
95
+ "):\n",
96
+ " order_widget.max = degree_widget.value\n",
97
+ "degree_widget.observe(update_order_range, \"value\")\n",
98
+ "widgets.interactive(\n",
99
+ " update_plot,\n",
100
+ " degree = degree_widget,\n",
101
+ " order = order_widget,\n",
102
+ " period = (1, max_period),\n",
103
+ " delay = (-max_delay, max_delay)\n",
104
+ ")\n"
105
+ ]
106
+ },
107
+ {
108
+ "cell_type": "code",
109
+ "execution_count": null,
110
+ "id": "c719d9b2-273a-431b-9812-11db4edcb69c",
111
+ "metadata": {},
112
+ "outputs": [],
113
+ "source": [
114
+ "\n",
115
+ "\n",
116
+ "\n",
117
+ "\n",
118
+ "\n",
119
+ "\n",
120
+ "\n",
121
+ "\n",
122
+ "\n",
123
+ "\n",
124
+ "\n",
125
+ "\n",
126
+ "\n",
127
+ "\n",
128
+ "\n",
129
+ "\n",
130
+ "\n",
131
+ "\n",
132
+ "\n",
133
+ "\n"
134
+ ]
135
+ }
136
+ ],
137
+ "metadata": {
138
+ "kernelspec": {
139
+ "display_name": "Python 3 (ipykernel)",
140
+ "language": "python",
141
+ "name": "python3"
142
+ },
143
+ "language_info": {
144
+ "codemirror_mode": {
145
+ "name": "ipython",
146
+ "version": 3
147
+ },
148
+ "file_extension": ".py",
149
+ "mimetype": "text/x-python",
150
+ "name": "python",
151
+ "nbconvert_exporter": "python",
152
+ "pygments_lexer": "ipython3",
153
+ "version": "3.12.6"
154
+ },
155
+ "widgets": {
156
+ "application/vnd.jupyter.widget-state+json": {
157
+ "state": {},
158
+ "version_major": 2,
159
+ "version_minor": 0
160
+ }
161
+ }
162
+ },
163
+ "nbformat": 4,
164
+ "nbformat_minor": 5
165
+ }
@@ -0,0 +1,239 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "02240a05-3526-4530-ae12-d9522465b594",
6
+ "metadata": {},
7
+ "source": [
8
+ "# Fourier Coefficients of Splines Derivatives\n",
9
+ "The disks with a notch represent a complex value. The phase is suggested by the orientation of the notch. The modulus is suggested by the color density, with a dense <span style=\"color:#1f77b4\">**blue**</span> color depicting a large modulus. As the modulus dwindles, the blue color fades into the white background. When the modulus becomes negligible, the phase becomes indefinite and the color turns to <span style=\"color:#d3d3d3\">**light gray**</span>.\n",
10
+ "\n",
11
+ "* The top row of complex numbers gives the first few Fourier coefficients of the gradient of a spline, as obtained through the proper adjustment of the Fourier coefficients $F\\{f\\}$ of the *spline* itself.\n",
12
+ "* The bottom row of complex numbers gives the first few Fourier coefficients $F\\{{\\mathrm{D}}^{m}\\{f\\}\\}$ of the *gradient of a spline*, as obtained directly.\n",
13
+ "* The two rows do match perfectly, which provides a visual illustration of the mathematical equivalence between the two computational methods.\n",
14
+ "\n",
15
+ "The spline $f$ of degree $n\\in{\\mathbb{N}}$ is shown in the <span style=\"color:#c20078\">**fuchsia**</span> color. Its derivative of order $m\\in[0\\ldots n]$ is ${\\mathrm{D}}^{m}\\{f\\}(x)=\\frac{{\\mathrm{d}}^{m}f(x)}{{\\mathrm{d}}x^{m}}$ and is shown in the <span style=\"color:#2ca02c\">**green**</span> color."
16
+ ]
17
+ },
18
+ {
19
+ "cell_type": "code",
20
+ "execution_count": null,
21
+ "id": "230ca8a8-c806-4207-b416-9954d55f1377",
22
+ "metadata": {},
23
+ "outputs": [],
24
+ "source": [
25
+ "# Load the required libraries\n",
26
+ "import cmath\n",
27
+ "import ipywidgets as widgets\n",
28
+ "import math\n",
29
+ "import matplotlib.patches as patches\n",
30
+ "import matplotlib.pyplot as plt\n",
31
+ "import matplotlib.ticker as ticker\n",
32
+ "import numpy as np\n",
33
+ "\n",
34
+ "import splinekit as sk # This library\n",
35
+ "\n",
36
+ "# Setup\n",
37
+ "max_period = 15 # Maximal period\n",
38
+ "max_degree = 9 # Maximal degree of the spline\n",
39
+ "max_delay = 2.0 # Maximal absolute delay\n",
40
+ "max_coeff = 15 # Maximal absolute Fourier index\n",
41
+ "\n",
42
+ "# Initialize the generator of random numbers\n",
43
+ "rng = np.random.default_rng()\n",
44
+ "\n",
45
+ "# Initial random periodic cubic splines with normal Gaussian coefficients\n",
46
+ "f = sk.PeriodicSpline1D.from_spline_coeff(rng.standard_normal(6), degree = 3)\n",
47
+ "\n",
48
+ "# Plot\n",
49
+ "def update_plot (\n",
50
+ " degree = 3,\n",
51
+ " order = 2,\n",
52
+ " period = 6,\n",
53
+ " delay = 0.0\n",
54
+ "):\n",
55
+ " global f\n",
56
+ "\n",
57
+ " # Update of the spline\n",
58
+ " if f.period != period:\n",
59
+ " f = sk.PeriodicSpline1D.from_spline_coeff(\n",
60
+ " rng.standard_normal(period),\n",
61
+ " degree = f.degree\n",
62
+ " )\n",
63
+ " f.degree = degree\n",
64
+ " f.delay = delay\n",
65
+ "\n",
66
+ " # Differentiation applied in the Fourier-series domain\n",
67
+ " def jw (\n",
68
+ " nu\n",
69
+ " ):\n",
70
+ " if 0 == order:\n",
71
+ " return(1.0)\n",
72
+ " return(((0 + 1j) * nu * 2.0 * np.pi / period) ** order)\n",
73
+ " ff = np.array(\n",
74
+ " [jw(nu) * f.fourier_coeff(nu) for nu in range(-max_coeff, max_coeff + 1)],\n",
75
+ " dtype = complex\n",
76
+ " )\n",
77
+ "\n",
78
+ " # Differentiation applied in the native (time or space) domain\n",
79
+ " g = f.differentiated(order)\n",
80
+ " fg = np.array(\n",
81
+ " [g.fourier_coeff(nu) for nu in range(-max_coeff, max_coeff + 1)],\n",
82
+ " dtype = complex\n",
83
+ " )\n",
84
+ "\n",
85
+ " # Plots\n",
86
+ " (fig, (ax1, ax2)) = plt.subplots(nrows = 2)\n",
87
+ " r = 0.48\n",
88
+ " # Caption\n",
89
+ " ax1.text(\n",
90
+ " -max_coeff,\n",
91
+ " 4.0 * r,\n",
92
+ " r\"$\\left({{\\mathrm{{j}}}}\\,\\nu\\,\\frac{{2\\,\\pi}}{{{}}}\\right)^{{{}}}\\,F\\{{f\\}}[\\nu]$\"\n",
93
+ " .format(period, order)\n",
94
+ " )\n",
95
+ " ax1.text(\n",
96
+ " -max_coeff,\n",
97
+ " -5.0 * r,\n",
98
+ " r\"$F\\{{{{\\mathrm{{D}}}}^{{{}}}\\{{f\\}}\\}}[\\nu]$\".format(order)\n",
99
+ " )\n",
100
+ " # Fourier coefficients\n",
101
+ " ax1.set_xlim(left = -max_coeff, right = max_coeff)\n",
102
+ " ax1.set_ylim(bottom = -2.0 * r - 0.1, top = 2.0 * r + 0.1)\n",
103
+ " ax1.set_aspect(1.0)\n",
104
+ " ax1.spines[:].set_color(\"None\")\n",
105
+ " ax1.tick_params(\n",
106
+ " bottom = True,\n",
107
+ " labelbottom = True,\n",
108
+ " top = True,\n",
109
+ " labeltop = False,\n",
110
+ " left = False,\n",
111
+ " labelleft = False\n",
112
+ " )\n",
113
+ " ax1.xaxis.set_major_locator(ticker.FixedLocator([-5, 0, 5, 10]))\n",
114
+ " ax1.xaxis.set_minor_locator(ticker.AutoMinorLocator())\n",
115
+ " a0 = math.log(min(abs(ff)) + 0.01)\n",
116
+ " a1 = math.log(max(abs(ff)) + 0.01)\n",
117
+ " af = (np.log(abs(ff) + 0.01) - a0) / (a1 - a0) if a1 > a0 else np.ones(len(ff))\n",
118
+ " ag = (np.log(abs(fg) + 0.01) - a0) / (a1 - a0) if a1 > a0 else np.ones(len(fg))\n",
119
+ " for k1 in range(len(ff)):\n",
120
+ " if cmath.isclose(\n",
121
+ " 0.0,\n",
122
+ " ff[k1],\n",
123
+ " rel_tol = math.sqrt(math.ulp(1.0)),\n",
124
+ " abs_tol = math.sqrt(math.ulp(1.0))\n",
125
+ " ):\n",
126
+ " ax1.add_patch(patches.Circle((k1 - max_coeff, 0.55), r, color = \"lightgray\"))\n",
127
+ " else:\n",
128
+ " ax1.add_patch(patches.Wedge(\n",
129
+ " (k1 - max_coeff, 0.55),\n",
130
+ " r,\n",
131
+ " cmath.phase(ff[k1]) * 180.0 / math.pi + 22.5,\n",
132
+ " cmath.phase(ff[k1]) * 180.0 / math.pi - 22.5,\n",
133
+ " color = \"C0\",\n",
134
+ " alpha = min(max(0.0, af[k1]), 1.0)\n",
135
+ " ))\n",
136
+ " for k1 in range(len(fg)):\n",
137
+ " if cmath.isclose(\n",
138
+ " 0.0,\n",
139
+ " fg[k1],\n",
140
+ " rel_tol = math.sqrt(math.ulp(1.0)),\n",
141
+ " abs_tol = math.sqrt(math.ulp(1.0))\n",
142
+ " ):\n",
143
+ " ax1.add_patch(patches.Circle((k1 - max_coeff, -0.55), r, color = \"lightgray\"))\n",
144
+ " else:\n",
145
+ " ax1.add_patch(patches.Wedge(\n",
146
+ " (k1 - max_coeff, -0.55),\n",
147
+ " r,\n",
148
+ " cmath.phase(fg[k1]) * 180.0 / math.pi + 22.5,\n",
149
+ " cmath.phase(fg[k1]) * 180.0 / math.pi - 22.5,\n",
150
+ " color = \"C0\",\n",
151
+ " alpha = min(max(0.0, ag[k1]), 1.0)\n",
152
+ " ))\n",
153
+ " # Splines\n",
154
+ " image = {f.image(), g.image()}\n",
155
+ " plotrange = sk.interval.Interval.enclosure(image)\n",
156
+ " plotrange = sk.interval.Closed((\n",
157
+ " plotrange.midpoint - 0.55 * plotrange.diameter,\n",
158
+ " plotrange.midpoint + 0.55 * plotrange.diameter\n",
159
+ " ))\n",
160
+ " g.plot((fig, ax2), plotpoints = 201, plotrange = plotrange, curve_fmt = \"-C2\")\n",
161
+ " f.plot((fig, ax2), plotpoints = 201, plotrange = plotrange, curve_fmt = \"-m\")\n",
162
+ " plt.show()\n",
163
+ "\n",
164
+ "# Interaction\n",
165
+ "degree_widget = widgets.IntSlider(min = 0, max = max_degree, value = 3)\n",
166
+ "order_widget = widgets.IntSlider(min = 0, max = 3, value = 2)\n",
167
+ "def update_order_range (\n",
168
+ " *args\n",
169
+ "):\n",
170
+ " order_widget.max = degree_widget.value\n",
171
+ "degree_widget.observe(update_order_range, \"value\")\n",
172
+ "widgets.interactive(\n",
173
+ " update_plot,\n",
174
+ " degree = degree_widget,\n",
175
+ " order = order_widget,\n",
176
+ " period = (1, max_period),\n",
177
+ " delay = (-max_delay, max_delay)\n",
178
+ ")\n"
179
+ ]
180
+ },
181
+ {
182
+ "cell_type": "code",
183
+ "execution_count": null,
184
+ "id": "c719d9b2-273a-431b-9812-11db4edcb69c",
185
+ "metadata": {},
186
+ "outputs": [],
187
+ "source": [
188
+ "\n",
189
+ "\n",
190
+ "\n",
191
+ "\n",
192
+ "\n",
193
+ "\n",
194
+ "\n",
195
+ "\n",
196
+ "\n",
197
+ "\n",
198
+ "\n",
199
+ "\n",
200
+ "\n",
201
+ "\n",
202
+ "\n",
203
+ "\n",
204
+ "\n",
205
+ "\n",
206
+ "\n",
207
+ "\n"
208
+ ]
209
+ }
210
+ ],
211
+ "metadata": {
212
+ "kernelspec": {
213
+ "display_name": "Python 3 (ipykernel)",
214
+ "language": "python",
215
+ "name": "python3"
216
+ },
217
+ "language_info": {
218
+ "codemirror_mode": {
219
+ "name": "ipython",
220
+ "version": 3
221
+ },
222
+ "file_extension": ".py",
223
+ "mimetype": "text/x-python",
224
+ "name": "python",
225
+ "nbconvert_exporter": "python",
226
+ "pygments_lexer": "ipython3",
227
+ "version": "3.12.6"
228
+ },
229
+ "widgets": {
230
+ "application/vnd.jupyter.widget-state+json": {
231
+ "state": {},
232
+ "version_major": 2,
233
+ "version_minor": 0
234
+ }
235
+ }
236
+ },
237
+ "nbformat": 4,
238
+ "nbformat_minor": 5
239
+ }