splineops 0.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. splineops-0.0.0/.binder/requirements.txt +0 -0
  2. splineops-0.0.0/.github/workflows/deploy-docs.yml +45 -0
  3. splineops-0.0.0/.github/workflows/release.yml +102 -0
  4. splineops-0.0.0/.github/workflows/test.yml +57 -0
  5. splineops-0.0.0/.gitignore +179 -0
  6. splineops-0.0.0/CMakeLists.txt +53 -0
  7. splineops-0.0.0/LICENSE +30 -0
  8. splineops-0.0.0/PKG-INFO +220 -0
  9. splineops-0.0.0/README.md +140 -0
  10. splineops-0.0.0/cpp/lsresize/CMakeLists.txt +53 -0
  11. splineops-0.0.0/cpp/lsresize/run_demo.cpp +359 -0
  12. splineops-0.0.0/cpp/lsresize/src/bspline.h +58 -0
  13. splineops-0.0.0/cpp/lsresize/src/filters.cpp +162 -0
  14. splineops-0.0.0/cpp/lsresize/src/filters.h +101 -0
  15. splineops-0.0.0/cpp/lsresize/src/resize1d.cpp +138 -0
  16. splineops-0.0.0/cpp/lsresize/src/resize1d.h +20 -0
  17. splineops-0.0.0/cpp/lsresize/src/resizend.cpp +80 -0
  18. splineops-0.0.0/cpp/lsresize/src/resizend.h +16 -0
  19. splineops-0.0.0/cpp/lsresize/src/utils.h +63 -0
  20. splineops-0.0.0/cpp/pybind/_lsresize_bindings.cpp +98 -0
  21. splineops-0.0.0/docs/Makefile +31 -0
  22. splineops-0.0.0/docs/_static/background.svg +167 -0
  23. splineops-0.0.0/docs/_static/css/custom.css +186 -0
  24. splineops-0.0.0/docs/_static/feature_01.jpg +0 -0
  25. splineops-0.0.0/docs/_static/feature_02.jpg +0 -0
  26. splineops-0.0.0/docs/_static/feature_03.jpg +0 -0
  27. splineops-0.0.0/docs/_static/logo.ico +0 -0
  28. splineops-0.0.0/docs/_static/logo.png +0 -0
  29. splineops-0.0.0/docs/_static/waveletbird_full.jpeg +0 -0
  30. splineops-0.0.0/docs/api/01_interpolate.rst +16 -0
  31. splineops-0.0.0/docs/api/02_resize.rst +19 -0
  32. splineops-0.0.0/docs/api/03_rotate.rst +18 -0
  33. splineops-0.0.0/docs/api/04_regress.rst +13 -0
  34. splineops-0.0.0/docs/api/05_denoise.rst +13 -0
  35. splineops-0.0.0/docs/api/06_differentiate.rst +21 -0
  36. splineops-0.0.0/docs/api/07_decompose.rst +91 -0
  37. splineops-0.0.0/docs/api/index.rst +37 -0
  38. splineops-0.0.0/docs/conf.py +218 -0
  39. splineops-0.0.0/docs/index.rst +48 -0
  40. splineops-0.0.0/docs/installation/index.rst +7 -0
  41. splineops-0.0.0/docs/make.bat +36 -0
  42. splineops-0.0.0/docs/sphinxext/move_gallery_links.py +199 -0
  43. splineops-0.0.0/docs/user-guide/01_interpolate.rst +135 -0
  44. splineops-0.0.0/docs/user-guide/02_resize.rst +194 -0
  45. splineops-0.0.0/docs/user-guide/03_rotate.rst +114 -0
  46. splineops-0.0.0/docs/user-guide/04_regress.rst +128 -0
  47. splineops-0.0.0/docs/user-guide/05_denoise.rst +165 -0
  48. splineops-0.0.0/docs/user-guide/06_differentiate.rst +118 -0
  49. splineops-0.0.0/docs/user-guide/07_decompose.rst +89 -0
  50. splineops-0.0.0/docs/user-guide/Illustrations/interpolate.nb +53715 -0
  51. splineops-0.0.0/docs/user-guide/index.rst +20 -0
  52. splineops-0.0.0/docs/user-guide/interpolatefig01.png +0 -0
  53. splineops-0.0.0/docs/user-guide/interpolatefig02.png +0 -0
  54. splineops-0.0.0/docs/user-guide/interpolatefig03.png +0 -0
  55. splineops-0.0.0/docs/user-guide/interpolatefig04.png +0 -0
  56. splineops-0.0.0/docs/user-guide/interpolatefig05.png +0 -0
  57. splineops-0.0.0/docs/user-guide/interpolatefig06.png +0 -0
  58. splineops-0.0.0/docs/user-guide/interpolatefig07.png +0 -0
  59. splineops-0.0.0/docs/user-guide/interpolatefig08.png +0 -0
  60. splineops-0.0.0/docs/user-guide/interpolatefig09.png +0 -0
  61. splineops-0.0.0/docs/user-guide/resizefig01.png +0 -0
  62. splineops-0.0.0/examples/01_quick-start/01_01_tensorspline_class.py +134 -0
  63. splineops-0.0.0/examples/01_quick-start/01_02_spline_bases.py +76 -0
  64. splineops-0.0.0/examples/01_quick-start/01_03_extension_modes.py +81 -0
  65. splineops-0.0.0/examples/01_quick-start/GALLERY_HEADER.rst +6 -0
  66. splineops-0.0.0/examples/02_resampling_using_1d_interpolation/02_01_interpolate_1d_samples.py +161 -0
  67. splineops-0.0.0/examples/02_resampling_using_1d_interpolation/02_02_resample_a_1d_spline.py +193 -0
  68. splineops-0.0.0/examples/02_resampling_using_1d_interpolation/02_03_compare_different_splines.py +390 -0
  69. splineops-0.0.0/examples/02_resampling_using_1d_interpolation/GALLERY_HEADER.rst +6 -0
  70. splineops-0.0.0/examples/03_resampling_using_2D_interpolation/03_01_resize_module.py +111 -0
  71. splineops-0.0.0/examples/03_resampling_using_2D_interpolation/03_02_standard_interpolation.py +292 -0
  72. splineops-0.0.0/examples/03_resampling_using_2D_interpolation/03_03_least-squares_projection.py +302 -0
  73. splineops-0.0.0/examples/03_resampling_using_2D_interpolation/03_04_antialiasing.py +168 -0
  74. splineops-0.0.0/examples/03_resampling_using_2D_interpolation/03_05_oblique_projection.py +326 -0
  75. splineops-0.0.0/examples/03_resampling_using_2D_interpolation/03_06_compare_different_methods.py +205 -0
  76. splineops-0.0.0/examples/03_resampling_using_2D_interpolation/GALLERY_HEADER.rst +6 -0
  77. splineops-0.0.0/examples/04_rotate/04_01_rotate_image.py +102 -0
  78. splineops-0.0.0/examples/04_rotate/04_02_rotation_animation.py +153 -0
  79. splineops-0.0.0/examples/04_rotate/GALLERY_HEADER.rst +6 -0
  80. splineops-0.0.0/examples/05_regress/05_01_regress_module.py +124 -0
  81. splineops-0.0.0/examples/05_regress/GALLERY_HEADER.rst +6 -0
  82. splineops-0.0.0/examples/06_denoise/06_01_1d_fractional_brownian_motion.py +94 -0
  83. splineops-0.0.0/examples/06_denoise/06_02_2d_image_smoothing.py +108 -0
  84. splineops-0.0.0/examples/06_denoise/06_03_3d_volume_smoothing.py +101 -0
  85. splineops-0.0.0/examples/06_denoise/06_04_recursive_smoothing_spline.py +66 -0
  86. splineops-0.0.0/examples/06_denoise/GALLERY_HEADER.rst +6 -0
  87. splineops-0.0.0/examples/07_differentiate/07_01_differentiate_module.py +208 -0
  88. splineops-0.0.0/examples/07_differentiate/GALLERY_HEADER.rst +6 -0
  89. splineops-0.0.0/examples/08_decompose/08_01_pyramid_decomposition.py +189 -0
  90. splineops-0.0.0/examples/08_decompose/08_02_wavelet_decomposition.py +224 -0
  91. splineops-0.0.0/examples/08_decompose/GALLERY_HEADER.rst +6 -0
  92. splineops-0.0.0/examples/README.txt +4 -0
  93. splineops-0.0.0/pyproject.toml +110 -0
  94. splineops-0.0.0/scripts/compare_resize_python_cpp.py +168 -0
  95. splineops-0.0.0/scripts/magnify_from_tif.py +187 -0
  96. splineops-0.0.0/src/splineops/__init__.py +7 -0
  97. splineops-0.0.0/src/splineops/bases/__init__.py +0 -0
  98. splineops-0.0.0/src/splineops/bases/bspline0basis.py +61 -0
  99. splineops-0.0.0/src/splineops/bases/bspline1basis.py +31 -0
  100. splineops-0.0.0/src/splineops/bases/bspline2basis.py +40 -0
  101. splineops-0.0.0/src/splineops/bases/bspline3basis.py +39 -0
  102. splineops-0.0.0/src/splineops/bases/bspline4basis.py +55 -0
  103. splineops-0.0.0/src/splineops/bases/bspline5basis.py +64 -0
  104. splineops-0.0.0/src/splineops/bases/bspline6basis.py +99 -0
  105. splineops-0.0.0/src/splineops/bases/bspline7basis.py +97 -0
  106. splineops-0.0.0/src/splineops/bases/bspline8basis.py +142 -0
  107. splineops-0.0.0/src/splineops/bases/bspline9basis.py +168 -0
  108. splineops-0.0.0/src/splineops/bases/keysbasis.py +43 -0
  109. splineops-0.0.0/src/splineops/bases/linearbasis.py +5 -0
  110. splineops-0.0.0/src/splineops/bases/nearestneighborbasis.py +6 -0
  111. splineops-0.0.0/src/splineops/bases/omoms0basis.py +6 -0
  112. splineops-0.0.0/src/splineops/bases/omoms1basis.py +5 -0
  113. splineops-0.0.0/src/splineops/bases/omoms2basis.py +95 -0
  114. splineops-0.0.0/src/splineops/bases/omoms3basis.py +47 -0
  115. splineops-0.0.0/src/splineops/bases/omoms4basis.py +163 -0
  116. splineops-0.0.0/src/splineops/bases/omoms5basis.py +85 -0
  117. splineops-0.0.0/src/splineops/bases/splinebasis.py +94 -0
  118. splineops-0.0.0/src/splineops/bases/utils.py +79 -0
  119. splineops-0.0.0/src/splineops/decompose/__init__.py +0 -0
  120. splineops-0.0.0/src/splineops/decompose/pyramid.py +444 -0
  121. splineops-0.0.0/src/splineops/decompose/wavelets/__init__.py +0 -0
  122. splineops-0.0.0/src/splineops/decompose/wavelets/abstractwavelets.py +141 -0
  123. splineops-0.0.0/src/splineops/decompose/wavelets/haar.py +160 -0
  124. splineops-0.0.0/src/splineops/decompose/wavelets/splinefilter.py +159 -0
  125. splineops-0.0.0/src/splineops/decompose/wavelets/splinewavelets.py +293 -0
  126. splineops-0.0.0/src/splineops/decompose/wavelets/splinewaveletstool.py +272 -0
  127. splineops-0.0.0/src/splineops/denoise/__init__.py +0 -0
  128. splineops-0.0.0/src/splineops/denoise/fBmper.py +85 -0
  129. splineops-0.0.0/src/splineops/denoise/fractsplineautocorr.py +70 -0
  130. splineops-0.0.0/src/splineops/denoise/smoothing_spline.py +214 -0
  131. splineops-0.0.0/src/splineops/differentiate/__init__.py +0 -0
  132. splineops-0.0.0/src/splineops/differentiate/differentials.py +466 -0
  133. splineops-0.0.0/src/splineops/interpolate/__init__.py +0 -0
  134. splineops-0.0.0/src/splineops/interpolate/tensorspline.py +425 -0
  135. splineops-0.0.0/src/splineops/interpolate/utils.py +310 -0
  136. splineops-0.0.0/src/splineops/modes/__init__.py +0 -0
  137. splineops-0.0.0/src/splineops/modes/extensionmode.py +23 -0
  138. splineops-0.0.0/src/splineops/modes/finitesupportcoefficients.py +90 -0
  139. splineops-0.0.0/src/splineops/modes/narrowmirroring.py +55 -0
  140. splineops-0.0.0/src/splineops/modes/periodicpadding.py +92 -0
  141. splineops-0.0.0/src/splineops/modes/utils.py +38 -0
  142. splineops-0.0.0/src/splineops/regress/__init__.py +0 -0
  143. splineops-0.0.0/src/splineops/regress/denoising.py +195 -0
  144. splineops-0.0.0/src/splineops/regress/sparsification.py +242 -0
  145. splineops-0.0.0/src/splineops/resize/__init__.py +3 -0
  146. splineops-0.0.0/src/splineops/resize/ls_oblique_resize.py +490 -0
  147. splineops-0.0.0/src/splineops/resize/resize.py +222 -0
  148. splineops-0.0.0/src/splineops/resize/utils.py +581 -0
  149. splineops-0.0.0/src/splineops/rotate/__init__.py +0 -0
  150. splineops-0.0.0/src/splineops/rotate/rotate.py +134 -0
  151. splineops-0.0.0/src/splineops/utils/__init__.py +36 -0
  152. splineops-0.0.0/src/splineops/utils/diagram.py +483 -0
  153. splineops-0.0.0/src/splineops/utils/image.py +69 -0
  154. splineops-0.0.0/src/splineops/utils/interop.py +14 -0
  155. splineops-0.0.0/src/splineops/utils/metrics.py +55 -0
  156. splineops-0.0.0/src/splineops/utils/plotting.py +274 -0
  157. splineops-0.0.0/src/splineops/utils/resample.py +132 -0
  158. splineops-0.0.0/tests/test_01_01_interpolate.py +210 -0
  159. splineops-0.0.0/tests/test_02_01_resize_ls_oblique_java.py +325 -0
  160. splineops-0.0.0/tests/test_02_02_resize_ls_oblique.py +90 -0
  161. splineops-0.0.0/tests/test_02_03_resize_ls_oblique_cpp.py +84 -0
  162. splineops-0.0.0/tests/test_03_01_rotate_2d.py +88 -0
  163. splineops-0.0.0/tests/test_03_02_rotate_3d.py +107 -0
  164. splineops-0.0.0/tests/test_04_01_regress.py +57 -0
  165. splineops-0.0.0/tests/test_05_01_denoise.py +68 -0
  166. splineops-0.0.0/tests/test_06_01_differentiate.py +533 -0
  167. splineops-0.0.0/tests/test_07_01_decompose.py +149 -0
  168. splineops-0.0.0/tox.ini +36 -0
Binary file
@@ -0,0 +1,45 @@
1
+ # splineops/.github/workflows/deploy-docs.yml
2
+ name: Deploy Sphinx Documentation to GitHub Pages
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+
8
+ permissions:
9
+ contents: write
10
+ pages: write
11
+ id-token: write
12
+
13
+ concurrency:
14
+ group: pages
15
+ cancel-in-progress: false
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+
21
+ steps:
22
+ - name: Checkout repository
23
+ uses: actions/checkout@v4
24
+
25
+ - name: Set up Python
26
+ uses: actions/setup-python@v5
27
+ with:
28
+ python-version: '3.12'
29
+ cache: 'pip'
30
+
31
+ - name: Install documentation requirements
32
+ run: |
33
+ python -m pip install --upgrade pip
34
+ pip install -e .[docs]
35
+
36
+ - name: Build Sphinx documentation
37
+ run: make -C docs html
38
+
39
+ - name: Deploy to GitHub Pages
40
+ uses: peaceiris/actions-gh-pages@v4
41
+ with:
42
+ deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
43
+ external_repository: splineops/splineops.github.io
44
+ publish_branch: main
45
+ publish_dir: docs/_build/html
@@ -0,0 +1,102 @@
1
+ # splineops/.github/workflows/release.yml
2
+ name: Build & publish to PyPI
3
+
4
+ on:
5
+ push:
6
+ tags:
7
+ - "v*"
8
+
9
+ permissions:
10
+ contents: read
11
+ id-token: write # OIDC for PyPI
12
+
13
+ jobs:
14
+ build_wheels:
15
+ name: Build wheels on ${{ matrix.os }}
16
+ runs-on: ${{ matrix.os }}
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ os: [ubuntu-latest, macos-latest, windows-latest]
21
+
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+
25
+ - uses: actions/setup-python@v5
26
+ with:
27
+ python-version: "3.12"
28
+
29
+ # macOS only: try to install libomp. Non-fatal if it fails.
30
+ - name: (macOS) Try to install libomp (non-fatal)
31
+ if: matrix.os == 'macos-latest'
32
+ run: |
33
+ if command -v brew >/dev/null 2>&1; then
34
+ brew list libomp >/dev/null 2>&1 || brew install libomp || true
35
+ else
36
+ echo "Homebrew not available; building without libomp."
37
+ fi
38
+
39
+ - name: Install cibuildwheel
40
+ run: python -m pip install -U pip cibuildwheel build
41
+
42
+ - name: Build wheels
43
+ run: python -m cibuildwheel --output-dir dist
44
+ env:
45
+ # CPython only, for versions we support
46
+ CIBW_BUILD: "cp310-* cp311-* cp312-*"
47
+
48
+ # Avoid unsupported/undesired targets
49
+ # - remove pp* warning by not listing it
50
+ # - skip musllinux explicitly (we don't ship those)
51
+ CIBW_SKIP: "*musllinux*"
52
+
53
+ # Limit architectures to where SciPy wheels exist & what we support
54
+ CIBW_ARCHS_LINUX: "x86_64"
55
+ CIBW_ARCHS_WINDOWS: "AMD64"
56
+ # macOS: leave default ("auto") or pin to arm64; arm64 is safest on Apple Silicon runners
57
+ CIBW_ARCHS_MACOS: "arm64"
58
+
59
+ # Simple smoke test: import and check native module presence
60
+ CIBW_TEST_COMMAND: >
61
+ python -c "import importlib.util, numpy as np, splineops;
62
+ print('ok', importlib.util.find_spec('splineops._lsresize') is not None)"
63
+
64
+ # Build sdist only once (Ubuntu)
65
+ - name: Build sdist (once on Ubuntu)
66
+ if: matrix.os == 'ubuntu-latest'
67
+ run: python -m build -s -o dist
68
+
69
+ # Upload wheels for this OS (unique name per matrix instance)
70
+ - name: Upload wheel artifacts
71
+ uses: actions/upload-artifact@v4
72
+ with:
73
+ name: wheels-${{ matrix.os }}
74
+ path: dist/*.whl
75
+ if-no-files-found: error
76
+
77
+ # Upload sdist only from Ubuntu
78
+ - name: Upload sdist artifact
79
+ if: matrix.os == 'ubuntu-latest'
80
+ uses: actions/upload-artifact@v4
81
+ with:
82
+ name: sdist
83
+ path: dist/*.tar.gz
84
+ if-no-files-found: error
85
+
86
+ publish:
87
+ needs: [build_wheels]
88
+ runs-on: ubuntu-latest
89
+ steps:
90
+ # Download all wheel artifacts from all OSes & the sdist, merged into ./dist
91
+ - uses: actions/download-artifact@v4
92
+ with:
93
+ pattern: wheels-*
94
+ merge-multiple: true
95
+ path: dist
96
+ - uses: actions/download-artifact@v4
97
+ with:
98
+ name: sdist
99
+ path: dist
100
+
101
+ - name: Publish to PyPI
102
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,57 @@
1
+ # splineops/.github/workflows/test.yml
2
+ name: Test Library
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ branches: [main]
9
+
10
+ jobs:
11
+ test:
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ os: [ubuntu-latest, macos-latest, windows-latest]
16
+ python-version: ["3.10", "3.11", "3.12"]
17
+
18
+ runs-on: ${{ matrix.os }}
19
+
20
+ steps:
21
+ - name: Checkout repository
22
+ uses: actions/checkout@v4
23
+
24
+ - name: Set up Python ${{ matrix.python-version }}
25
+ uses: actions/setup-python@v5
26
+ with:
27
+ python-version: ${{ matrix.python-version }}
28
+ cache: pip
29
+
30
+ - name: Install tox
31
+ run: python -m pip install --upgrade pip tox
32
+
33
+ # Build the package once (creates .pkg wheel) with C++ enabled
34
+ - name: Create tox env (build extension) — C++ path
35
+ env:
36
+ SPLINEOPS_ACCEL: always
37
+ OMP_NUM_THREADS: 1
38
+ OPENBLAS_NUM_THREADS: 1
39
+ MKL_NUM_THREADS: 1
40
+ NUMEXPR_NUM_THREADS: 1
41
+ run: tox -e py --notest
42
+
43
+ # Smoke check *inside the tox env* (no pytest! just the smoke env)
44
+ - name: Smoke check native extension (inside tox env)
45
+ env:
46
+ SPLINEOPS_ACCEL: always
47
+ run: tox -q -e smoke
48
+
49
+ # Run full test suite (C++ required)
50
+ - name: Run tests with tox (C++ required)
51
+ env:
52
+ SPLINEOPS_ACCEL: always
53
+ OMP_NUM_THREADS: 1
54
+ OPENBLAS_NUM_THREADS: 1
55
+ MKL_NUM_THREADS: 1
56
+ NUMEXPR_NUM_THREADS: 1
57
+ run: tox -e py
@@ -0,0 +1,179 @@
1
+ # JetBrains
2
+ .idea/
3
+
4
+ # VS Code
5
+ .vscode/
6
+
7
+ # macOS
8
+ .DS_Store
9
+
10
+ # Byte-compiled / optimized / DLL files
11
+ __pycache__/
12
+ *.py[cod]
13
+ *$py.class
14
+
15
+ # C extensions
16
+ *.so
17
+
18
+ # Environments
19
+ splineops_env/
20
+
21
+ # Tex files
22
+ *.aux
23
+ *.fdb_latexmk
24
+ *.fls
25
+ *.synctex.gz
26
+ *.pdf
27
+
28
+ # Distribution / packaging
29
+ .Python
30
+ build/
31
+ develop-eggs/
32
+ dist/
33
+ downloads/
34
+ eggs/
35
+ .eggs/
36
+ lib/
37
+ lib64/
38
+ parts/
39
+ sdist/
40
+ var/
41
+ wheels/
42
+ share/python-wheels/
43
+ *.egg-info/
44
+ .installed.cfg
45
+ *.egg
46
+ MANIFEST
47
+
48
+ # PyInstaller
49
+ # Usually these files are written by a python script from a template
50
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
51
+ *.manifest
52
+ *.spec
53
+
54
+ # Installer logs
55
+ pip-log.txt
56
+ pip-delete-this-directory.txt
57
+
58
+ # Unit test / coverage reports
59
+ htmlcov/
60
+ .tox/
61
+ .nox/
62
+ .coverage
63
+ .coverage.*
64
+ .cache
65
+ nosetests.xml
66
+ coverage.xml
67
+ *.cover
68
+ *.py,cover
69
+ .hypothesis/
70
+ .pytest_cache/
71
+ cover/
72
+
73
+ # Translations
74
+ *.mo
75
+ *.pot
76
+
77
+ # Django stuff:
78
+ *.log
79
+ local_settings.py
80
+ db.sqlite3
81
+ db.sqlite3-journal
82
+
83
+ # Flask stuff:
84
+ instance/
85
+ .webassets-cache
86
+
87
+ # Scrapy stuff:
88
+ .scrapy
89
+
90
+ # Sphinx documentation
91
+ docs/_build/
92
+ docs/_contents/
93
+ docs/sg_execution_times.rst
94
+ docs/auto_examples/
95
+ docs/gen_modules/
96
+ docs/notebooks_binder/
97
+ docs/notebooks_jupyterlite/
98
+
99
+ # PyBuilder
100
+ .pybuilder/
101
+ target/
102
+
103
+ # Jupyter Notebook
104
+ .ipynb_checkpoints
105
+
106
+ # IPython
107
+ profile_default/
108
+ ipython_config.py
109
+
110
+ # pyenv
111
+ # For a library or package, you might want to ignore these files since the code is
112
+ # intended to run in multiple environments; otherwise, check them in:
113
+ # .python-version
114
+
115
+ # pipenv
116
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
117
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
118
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
119
+ # install all needed dependencies.
120
+ #Pipfile.lock
121
+
122
+ # poetry
123
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
124
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
125
+ # commonly ignored for libraries.
126
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
127
+ #poetry.lock
128
+
129
+ # pdm
130
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
131
+ #pdm.lock
132
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
133
+ # in version control.
134
+ # https://pdm.fming.dev/#use-with-ide
135
+ .pdm.toml
136
+
137
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
138
+ __pypackages__/
139
+
140
+ # Celery stuff
141
+ celerybeat-schedule
142
+ celerybeat.pid
143
+
144
+ # SageMath parsed files
145
+ *.sage.py
146
+
147
+ # Environments
148
+ .env
149
+ .venv
150
+ env/
151
+ venv/
152
+ ENV/
153
+ env.bak/
154
+ venv.bak/
155
+ splineops-env
156
+
157
+ # Spyder project settings
158
+ .spyderproject
159
+ .spyproject
160
+
161
+ # Rope project settings
162
+ .ropeproject
163
+
164
+ # mkdocs documentation
165
+ /site
166
+
167
+ # mypy
168
+ .mypy_cache/
169
+ .dmypy.json
170
+ dmypy.json
171
+
172
+ # Pyre type checker
173
+ .pyre/
174
+
175
+ # pytype static type analyzer
176
+ .pytype/
177
+
178
+ # Cython debug symbols
179
+ cython_debug/
@@ -0,0 +1,53 @@
1
+ # splineops/CMakeLists.txt
2
+ cmake_minimum_required(VERSION 3.20)
3
+ project(splineops_native LANGUAGES CXX)
4
+
5
+ option(LSRESIZE_USE_OPENMP "Enable OpenMP for parallel loops" ON)
6
+
7
+ set(CMAKE_CXX_STANDARD 17)
8
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
9
+ set(CMAKE_CXX_EXTENSIONS OFF)
10
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
11
+
12
+ if (MSVC)
13
+ add_compile_options(/W4 /permissive- /Zc:preprocessor /Zc:__cplusplus)
14
+ else()
15
+ add_compile_options(-Wall -Wextra -Wpedantic)
16
+ endif()
17
+
18
+ # Let pybind11 find the matching Python
19
+ set(PYBIND11_FINDPYTHON ON)
20
+ find_package(Python REQUIRED COMPONENTS Interpreter Development.Module)
21
+ find_package(pybind11 CONFIG REQUIRED)
22
+
23
+ if (LSRESIZE_USE_OPENMP)
24
+ find_package(OpenMP QUIET)
25
+ endif()
26
+
27
+ # ---- Absolute source paths (robust on Windows) ----
28
+ set(LSRESIZE_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cpp/lsresize/src")
29
+ set(PYBIND_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cpp/pybind")
30
+
31
+ add_library(lsresize STATIC
32
+ "${LSRESIZE_SRC_DIR}/filters.cpp"
33
+ "${LSRESIZE_SRC_DIR}/resize1d.cpp"
34
+ "${LSRESIZE_SRC_DIR}/resizend.cpp"
35
+ )
36
+ target_include_directories(lsresize PUBLIC "${LSRESIZE_SRC_DIR}")
37
+ target_compile_features(lsresize PUBLIC cxx_std_17)
38
+ if (OpenMP_CXX_FOUND)
39
+ target_link_libraries(lsresize PUBLIC OpenMP::OpenMP_CXX)
40
+ target_compile_definitions(lsresize PUBLIC LSRESIZE_WITH_OPENMP=1)
41
+ endif()
42
+
43
+ pybind11_add_module(_lsresize
44
+ "${PYBIND_DIR}/_lsresize_bindings.cpp"
45
+ )
46
+ target_link_libraries(_lsresize PRIVATE lsresize)
47
+
48
+ install(TARGETS _lsresize
49
+ LIBRARY DESTINATION splineops
50
+ RUNTIME DESTINATION splineops
51
+ ARCHIVE DESTINATION splineops)
52
+
53
+ message(STATUS "OpenMP enabled: " $<BOOL:${OpenMP_CXX_FOUND}>)
@@ -0,0 +1,30 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2024, splineops
4
+ Copyright (c) 2023-2024, EPFL (Dimitris Perdios, Pablo Garcia-Amorena)
5
+ Copyright (c) 2021-2022, EPFL (Dimitris Perdios)
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are met:
9
+
10
+ 1. Redistributions of source code must retain the above copyright notice, this
11
+ list of conditions and the following disclaimer.
12
+
13
+ 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ this list of conditions and the following disclaimer in the documentation
15
+ and/or other materials provided with the distribution.
16
+
17
+ 3. Neither the name of the copyright holder nor the names of its
18
+ contributors may be used to endorse or promote products derived from
19
+ this software without specific prior written permission.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,220 @@
1
+ Metadata-Version: 2.2
2
+ Name: splineops
3
+ Version: 0.0.0
4
+ Summary: Spline signal processing in N-D with support for GPU computing.
5
+ Author: Dimitris Perdios, Pablo Garcia-Amorena, Philippe Thévenaz
6
+ License: BSD 3-Clause License
7
+
8
+ Copyright (c) 2024, splineops
9
+ Copyright (c) 2023-2024, EPFL (Dimitris Perdios, Pablo Garcia-Amorena)
10
+ Copyright (c) 2021-2022, EPFL (Dimitris Perdios)
11
+
12
+ Redistribution and use in source and binary forms, with or without
13
+ modification, are permitted provided that the following conditions are met:
14
+
15
+ 1. Redistributions of source code must retain the above copyright notice, this
16
+ list of conditions and the following disclaimer.
17
+
18
+ 2. Redistributions in binary form must reproduce the above copyright notice,
19
+ this list of conditions and the following disclaimer in the documentation
20
+ and/or other materials provided with the distribution.
21
+
22
+ 3. Neither the name of the copyright holder nor the names of its
23
+ contributors may be used to endorse or promote products derived from
24
+ this software without specific prior written permission.
25
+
26
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
30
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
34
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
+
37
+ Classifier: Topic :: Scientific/Engineering
38
+ Classifier: Intended Audience :: Science/Research
39
+ Classifier: Development Status :: 4 - Beta
40
+ Classifier: License :: OSI Approved :: BSD License
41
+ Classifier: Programming Language :: Python :: 3.10
42
+ Classifier: Programming Language :: Python :: 3.11
43
+ Classifier: Programming Language :: Python :: 3.12
44
+ Project-URL: Homepage, https://splineops.github.io/
45
+ Project-URL: Source, https://github.com/splineops/splineops
46
+ Project-URL: Issues, https://github.com/splineops/splineops/issues
47
+ Project-URL: Download, https://github.com/splineops/splineops.git
48
+ Requires-Python: >=3.10
49
+ Requires-Dist: numpy>=1.26
50
+ Requires-Dist: scipy>=1.15
51
+ Requires-Dist: matplotlib>=3.8
52
+ Requires-Dist: requests>=2.32.3
53
+ Provides-Extra: visualization
54
+ Requires-Dist: pooch>=1.8; extra == "visualization"
55
+ Requires-Dist: IPython>=8.26; extra == "visualization"
56
+ Provides-Extra: tests
57
+ Requires-Dist: tox>=4.13; extra == "tests"
58
+ Requires-Dist: pytest>=6.0; extra == "tests"
59
+ Provides-Extra: dev
60
+ Requires-Dist: splineops[tests,visualization]; extra == "dev"
61
+ Requires-Dist: black>=23.10; extra == "dev"
62
+ Requires-Dist: mypy>=1.8; extra == "dev"
63
+ Requires-Dist: build; extra == "dev"
64
+ Provides-Extra: dev-cupy
65
+ Requires-Dist: splineops[dev]; extra == "dev-cupy"
66
+ Requires-Dist: cupy>=12.2; extra == "dev-cupy"
67
+ Provides-Extra: docs
68
+ Requires-Dist: splineops[visualization]; extra == "docs"
69
+ Requires-Dist: sphinx>=7.3; extra == "docs"
70
+ Requires-Dist: sphinx-gallery>=0.17; extra == "docs"
71
+ Requires-Dist: sphinx-prompt>=1.8; extra == "docs"
72
+ Requires-Dist: sphinx-copybutton>=0.5; extra == "docs"
73
+ Requires-Dist: sphinx-remove-toctrees>=1.0; extra == "docs"
74
+ Requires-Dist: sphinx-design>=0.6; extra == "docs"
75
+ Requires-Dist: pydata-sphinx-theme>=0.15; extra == "docs"
76
+ Requires-Dist: myst-parser>=3.0; extra == "docs"
77
+ Requires-Dist: jupyterlite-sphinx>=0.16; extra == "docs"
78
+ Requires-Dist: jupyterlite-pyodide-kernel>=0.4; extra == "docs"
79
+ Description-Content-Type: text/markdown
80
+
81
+ <!-- splineops/README.md -->
82
+
83
+ # SplineOps: Spline Operations
84
+
85
+ See https://splineops.github.io/ for the documentation.
86
+
87
+ `splineops` is a Python-based N-dimensional signal-processing library with
88
+ support for GPU computing.
89
+
90
+ ## Installation
91
+
92
+ You need at least `Python 3.10` to install `splineops` (ideally `Python 3.12`). `Python 3.11` is also compatible.
93
+
94
+ Create and activate your Python virtual environment (on Unix or MacOS)
95
+
96
+ ```shell
97
+ python -m venv splineops-env
98
+ source splineops-env/bin/activate
99
+ ```
100
+
101
+ On Windows,
102
+
103
+ ```shell
104
+ python -m venv splineops-env
105
+ .splineops-env/Scripts/Activate
106
+ ```
107
+
108
+ To deactivate the environment use
109
+
110
+ ```shell
111
+ deactivate
112
+ ```
113
+
114
+ Minimal requirement:
115
+
116
+ ```shell
117
+ pip install numpy scipy matplotlib requests
118
+ ```
119
+
120
+ Simply install `splineops` using `pip`
121
+
122
+ ```shell
123
+ pip install splineops
124
+ ```
125
+
126
+ ## Formatting, Type Checking, and Testing
127
+
128
+ Formatting and type checking is performed as
129
+
130
+ ```shell
131
+ tox -e format
132
+ tox -e type
133
+ ```
134
+
135
+ The testing requires a valid environment with a supported Python version and `tox`
136
+ installed. The tests are run with the following command (automatic pick of the
137
+ Python version)
138
+
139
+ ```shell
140
+ tox
141
+ ```
142
+
143
+ The tests can also be launched for a specific Python version (must match the one
144
+ installed in the active environment)
145
+
146
+ ```shell
147
+ tox -e py310
148
+ tox -e py311
149
+ tox -e py312
150
+ ```
151
+
152
+ *IMPORTANT:* Since CI is not implemented, make sure to run, pass, and/or fix
153
+ `tox -e format`, `tox -e type`, and `tox`.
154
+
155
+ ## Packaging
156
+
157
+ Using `tox` (preferred)
158
+
159
+ ```shell
160
+ tox -e build
161
+ ```
162
+
163
+ Using `hatch`
164
+
165
+ ```shell
166
+ hatch build -t wheel
167
+ ```
168
+
169
+ ## Development Environment
170
+
171
+ Install `splineops` development environment in editable mode
172
+
173
+ ```shell
174
+ pip install -e .[dev]
175
+ ```
176
+
177
+ ## GPU Compatibility
178
+
179
+ You can benefit of `cupy` to deploy `splineops`. If a specific CUDA version is required, do
180
+
181
+ ```shell
182
+ pip install cupy cuda-version=12.3
183
+ ```
184
+
185
+ Install `splineops` cupy development environment in editable mode
186
+
187
+ ```shell
188
+ pip install -e .[dev_cupy]
189
+ ```
190
+
191
+ Potential other CuPy libraries
192
+ ([CuPy from Conda-Forge](https://docs.cupy.dev/en/stable/install.html#installing-cupy-from-conda-forge))
193
+
194
+ ```shell
195
+ pip install cupy cutensor cudnn nccl
196
+ ```
197
+
198
+ ## Building of the Documentation
199
+
200
+ To build the Sphinx documentation, install `splineops` doc dependencies
201
+
202
+ ```shell
203
+ pip install -e .[docs]
204
+ ```
205
+
206
+ Navigate to the `docs` directory and run the `make html` command
207
+
208
+ ```shell
209
+ cd docs
210
+ make html
211
+ ```
212
+
213
+ Then, go to `docs/_build/html` and open `index.html` to navigate the
214
+ documentation locally.
215
+
216
+ ### Troubleshooting
217
+
218
+ If you want to make a "clean" build, go to `docs` and manually delete the folders `_build`, `auto_examples`, `gen_modules`, `notebooks_jupyterlite`, and the file `sg_execution_times.rst`.
219
+ Why isn't this done automatically? Because Sphinx optimizes speed and removes redundant tasks, by not re-creating the examples notebooks if they have already been created.
220
+ If you, for example, modify the name of the examples files, you will have to delete at least the folder `auto_examples`. Otherwise, the old examples files will not have disappeared automatically and Sphinx will raise an internal warning referring to a toctree.