imops 0.8.2__cp310-cp310-musllinux_1_1_i686.whl → 0.8.3__cp310-cp310-musllinux_1_1_i686.whl

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.

Potentially problematic release.


This version of imops might be problematic. Click here for more details.

Files changed (48) hide show
  1. _build_utils.py +87 -0
  2. imops/__init__.py +1 -0
  3. imops/__version__.py +1 -1
  4. imops/backend.py +14 -10
  5. imops/crop.py +18 -2
  6. imops/interp1d.py +7 -4
  7. imops/measure.py +7 -7
  8. imops/morphology.py +6 -5
  9. imops/numeric.py +376 -0
  10. imops/pad.py +41 -5
  11. imops/radon.py +7 -5
  12. imops/src/_backprojection.c +83 -83
  13. imops/src/_backprojection.cpython-310-i386-linux-gnu.so +0 -0
  14. imops/src/_fast_backprojection.c +96 -96
  15. imops/src/_fast_backprojection.cpython-310-i386-linux-gnu.so +0 -0
  16. imops/src/_fast_measure.c +96 -96
  17. imops/src/_fast_measure.cpython-310-i386-linux-gnu.so +0 -0
  18. imops/src/_fast_morphology.c +96 -96
  19. imops/src/_fast_morphology.cpython-310-i386-linux-gnu.so +0 -0
  20. imops/src/_fast_numeric.c +20545 -4996
  21. imops/src/_fast_numeric.cpython-310-i386-linux-gnu.so +0 -0
  22. imops/src/_fast_numeric.pyx +208 -30
  23. imops/src/_fast_radon.c +96 -96
  24. imops/src/_fast_radon.cpython-310-i386-linux-gnu.so +0 -0
  25. imops/src/_fast_zoom.c +96 -96
  26. imops/src/_fast_zoom.cpython-310-i386-linux-gnu.so +0 -0
  27. imops/src/_measure.c +83 -83
  28. imops/src/_measure.cpython-310-i386-linux-gnu.so +0 -0
  29. imops/src/_morphology.c +83 -83
  30. imops/src/_morphology.cpython-310-i386-linux-gnu.so +0 -0
  31. imops/src/_numeric.c +20532 -4983
  32. imops/src/_numeric.cpython-310-i386-linux-gnu.so +0 -0
  33. imops/src/_numeric.pyx +208 -30
  34. imops/src/_radon.c +83 -83
  35. imops/src/_radon.cpython-310-i386-linux-gnu.so +0 -0
  36. imops/src/_zoom.c +83 -83
  37. imops/src/_zoom.cpython-310-i386-linux-gnu.so +0 -0
  38. imops/utils.py +65 -12
  39. imops/zoom.py +2 -2
  40. {imops-0.8.2.dist-info → imops-0.8.3.dist-info}/METADATA +3 -2
  41. imops-0.8.3.dist-info/RECORD +61 -0
  42. {imops-0.8.2.dist-info → imops-0.8.3.dist-info}/WHEEL +1 -1
  43. imops-0.8.3.dist-info/top_level.txt +2 -0
  44. _pyproject_build.py +0 -61
  45. imops/_numeric.py +0 -124
  46. imops-0.8.2.dist-info/RECORD +0 -61
  47. imops-0.8.2.dist-info/top_level.txt +0 -2
  48. {imops-0.8.2.dist-info → imops-0.8.3.dist-info}/LICENSE +0 -0
imops/utils.py CHANGED
@@ -1,39 +1,92 @@
1
1
  import os
2
+ from contextlib import contextmanager
2
3
  from itertools import permutations
3
4
  from typing import Callable, Optional, Sequence, Tuple, Union
4
5
  from warnings import warn
5
6
 
6
7
  import numpy as np
7
8
 
8
- from .backend import BACKEND2NUM_THREADS_VAR_NAME, SINGLE_THREADED_BACKENDS, Backend
9
+ from .backend import BACKEND_NAME2ENV_NUM_THREADS_VAR_NAME, SINGLE_THREADED_BACKENDS, Backend
9
10
 
10
11
 
11
12
  AxesLike = Union[int, Sequence[int]]
12
13
  AxesParams = Union[float, Sequence[float]]
13
14
 
14
15
  ZOOM_SRC_DIM = 4
16
+ # TODO: define imops-specific environment variable like `OMP_NUM_THREADS`?
17
+ IMOPS_NUM_THREADS = None
15
18
 
16
19
 
17
- def normalize_num_threads(num_threads: int, backend: Backend):
20
+ def set_num_threads(num_threads: int) -> int:
21
+ assert isinstance(num_threads, int) or num_threads is None, 'Number of threads must be int value or None.'
22
+ global IMOPS_NUM_THREADS
23
+ current = IMOPS_NUM_THREADS
24
+ IMOPS_NUM_THREADS = num_threads
25
+ return current
26
+
27
+
28
+ @contextmanager
29
+ def imops_num_threads(num_threads: int):
30
+ previous = set_num_threads(num_threads)
31
+ try:
32
+ yield
33
+ finally:
34
+ set_num_threads(previous)
35
+
36
+
37
+ def normalize_num_threads(num_threads: int, backend: Backend, warn_stacklevel: int = 1) -> int:
38
+ """Calculate the effective number of threads"""
39
+
40
+ global IMOPS_NUM_THREADS
18
41
  if backend.name in SINGLE_THREADED_BACKENDS:
19
42
  if num_threads != -1:
20
- warn(f'"{backend.name}" backend is single-threaded. Setting `num_threads` has no effect.')
43
+ warn(
44
+ f'"{backend.name}" backend is single-threaded. Setting `num_threads` has no effect.',
45
+ stacklevel=warn_stacklevel,
46
+ )
21
47
  return 1
48
+
49
+ env_num_threads_var_name = BACKEND_NAME2ENV_NUM_THREADS_VAR_NAME[backend.name]
50
+ # here we also handle the case `env_num_threads_var_name`=" " gracefully
51
+ env_num_threads = os.environ.get(env_num_threads_var_name, '').strip()
52
+ env_num_threads = int(env_num_threads) if env_num_threads else None
53
+ # TODO: maybe let user set the absolute maximum number of threads?
54
+ num_available_cpus = len(os.sched_getaffinity(0))
55
+
56
+ max_num_threads = min(filter(bool, [IMOPS_NUM_THREADS, env_num_threads, num_available_cpus]))
57
+
22
58
  if num_threads >= 0:
23
59
  # FIXME
24
60
  if backend.name == 'Numba':
25
61
  warn(
26
62
  'Setting `num_threads` has no effect with "Numba" backend. '
27
- 'Use `NUMBA_NUM_THREADS` environment variable.'
63
+ 'Use `NUMBA_NUM_THREADS` environment variable.',
64
+ stacklevel=warn_stacklevel,
28
65
  )
29
- return num_threads
30
-
31
- num_threads_var_name = BACKEND2NUM_THREADS_VAR_NAME[backend.name]
32
- # here we also handle the case `num_threads_var`=" " gracefully
33
- env_num_threads = os.environ.get(num_threads_var_name, '').strip()
34
- max_threads = int(env_num_threads) if env_num_threads else len(os.sched_getaffinity(0))
35
-
36
- return max_threads + num_threads + 1
66
+ return num_threads
67
+
68
+ if num_threads > max_num_threads:
69
+ if max_num_threads == IMOPS_NUM_THREADS:
70
+ warn(
71
+ f'Required number of threads ({num_threads}) is greater than `IMOPS_NUM_THREADS` '
72
+ f'({IMOPS_NUM_THREADS}). Using {IMOPS_NUM_THREADS} threads.',
73
+ stacklevel=warn_stacklevel,
74
+ )
75
+ elif max_num_threads == env_num_threads:
76
+ warn(
77
+ f'Required number of threads ({num_threads}) is greater than `{env_num_threads_var_name}` '
78
+ f'({env_num_threads}). Using {env_num_threads} threads.',
79
+ stacklevel=warn_stacklevel,
80
+ )
81
+ else:
82
+ warn(
83
+ f'Required number of threads ({num_threads}) is greater than number of available CPU-s '
84
+ f'({num_available_cpus}). Using {num_available_cpus} threads.',
85
+ stacklevel=warn_stacklevel,
86
+ )
87
+ return min(num_threads, max_num_threads)
88
+
89
+ return max_num_threads + num_threads + 1
37
90
 
38
91
 
39
92
  def get_c_contiguous_permutaion(array: np.ndarray) -> Optional[np.ndarray]:
imops/zoom.py CHANGED
@@ -208,7 +208,7 @@ def _zoom(
208
208
 
209
209
  See `https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.zoom.html`
210
210
  """
211
- backend = resolve_backend(backend)
211
+ backend = resolve_backend(backend, warn_stacklevel=4)
212
212
  if backend.name not in ('Scipy', 'Numba', 'Cython'):
213
213
  raise ValueError(f'Unsupported backend "{backend.name}".')
214
214
 
@@ -216,7 +216,7 @@ def _zoom(
216
216
  dtype = input.dtype
217
217
  cval = np.dtype(dtype).type(cval)
218
218
  zoom = fill_by_indices(np.ones(input.ndim, 'float64'), zoom, range(input.ndim))
219
- num_threads = normalize_num_threads(num_threads, backend)
219
+ num_threads = normalize_num_threads(num_threads, backend, warn_stacklevel=4)
220
220
 
221
221
  if backend.name == 'Scipy':
222
222
  return scipy_zoom(
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: imops
3
- Version: 0.8.2
3
+ Version: 0.8.3
4
4
  Summary: Efficient parallelizable algorithms for multidimensional arrays to speed up your data pipelines
5
5
  Home-page: https://github.com/neuro-ml/imops
6
- Download-URL: https://github.com/neuro-ml/imops/archive/v0.8.2.tar.gz
6
+ Download-URL: https://github.com/neuro-ml/imops/archive/v0.8.3.tar.gz
7
7
  Author: maxme1, vovaf709, talgat
8
8
  Author-email: maxme1 <maxs987@gmail.com>, vovaf709 <vovaf709@yandex.ru>, talgat <saparov2130@gmail.com>
9
9
  License: MIT License
@@ -45,6 +45,7 @@ Requires-Python: >=3.6
45
45
  Description-Content-Type: text/markdown
46
46
  License-File: LICENSE
47
47
  Requires-Dist: scipy <2.0.0,>=1.0
48
+ Requires-Dist: scikit-image
48
49
  Requires-Dist: connected-components-3d
49
50
  Requires-Dist: fastremap
50
51
  Requires-Dist: dataclasses ; python_version < "3.7"
@@ -0,0 +1,61 @@
1
+ _build_utils.py,sha256=kAKNl7QL-PNT8k4py6PtQY5k_1SK3BU_tkphRehyKA4,3175
2
+ imops-0.8.3.dist-info/METADATA,sha256=_HIocNc4bo0fcnhbDoCuvuEJyWeZrykHBvYA_gDLOk4,8849
3
+ imops-0.8.3.dist-info/LICENSE,sha256=s4td51soCfOr_HP5fF2gTARksncu_DD1TgugcUGTBQ0,1064
4
+ imops-0.8.3.dist-info/WHEEL,sha256=POAWaITYRJ3Wom25yjK7N-cS2g56uhAplwun4aFyPzs,111
5
+ imops-0.8.3.dist-info/RECORD,,
6
+ imops-0.8.3.dist-info/top_level.txt,sha256=jd2uO-zsYvKeqkZbjEjtkGqCca0IEXEiEuoyr3nsHB0,19
7
+ imops.libs/libgomp-41890ef0.so.1.0.0,sha256=v1S9wI3pI7LI5wKB6AvV6AdAUscM_zZ95LWxXvmoAN8,195208
8
+ imops/morphology.py,sha256=rIzE7HXyBE91NWMR9rR1di4s0QccRnPMxivA3PnlM1M,12376
9
+ imops/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ imops/backend.py,sha256=9kJtdd4-66SOP7MEXF-o9-aFImLtvpaqTKe1ttNb0hk,2503
11
+ imops/__version__.py,sha256=LokQdkRCwhhLh0zOp7jizhyDgbtAU-IWRIObrz2zLjA,22
12
+ imops/radon.py,sha256=bygHhDe_SD7sjubcGBsXtTa3z4-z1JiOXpkIRSt8xpw,8968
13
+ imops/crop.py,sha256=PSOOlJUb_R8Hj3P18aRicwFXil19Q6a1QrwLmZZfZkQ,3945
14
+ imops/utils.py,sha256=X6dYRExW4nnpgO1z5-DcHhmReIvzaOBdBNKd5TeUbjg,6684
15
+ imops/measure.py,sha256=ehJ1F4DJK6FTS0XsuKzzxQnFX78Fo4eShinYYrbItu8,8433
16
+ imops/pad.py,sha256=AjgLCQVgGOwVNxYY7xMMyX7YO82uObxEroApuQxZE34,9069
17
+ imops/_configs.py,sha256=PoPlwnmmCz-Z8GmKYIqR8xsqcWHPKiYSGWldbQX9GU0,705
18
+ imops/zoom.py,sha256=cHKuXrKY5GmBDLMat1_ElIBuZGd8Mk5MXHtVD5WtEQk,9664
19
+ imops/__init__.py,sha256=FUVB4d2PQlM4PJUSIjyz9oRlWaqU6RSskyyrX56-RrY,504
20
+ imops/numeric.py,sha256=OUu-aXg2ZsULvBxwxFd3pbeFzIhlTlt5fO2Koje7wPo,13274
21
+ imops/box.py,sha256=3WrOdpUigoGKNnWhLLgX5NX_D9WzgwDKIWf75baTK-Y,1794
22
+ imops/interp1d.py,sha256=FUVvEIldoIf4_-RbRcZHrbNZ6UoW9cpRfW4flWCxdyI,8195
23
+ imops/testing.py,sha256=JgUWoD7fzshdaVrrgmf9y9jpl3EHgmoYYmHHGCFI4Ws,1650
24
+ imops/src/_numeric.pyx,sha256=05GbyyFzdill8M_L9KYA9hfYP7ULiAnvMpWyBATl7vQ,7979
25
+ imops/src/_backprojection.cpython-310-i386-linux-gnu.so,sha256=0YwNI0YbRJd9pues9k5CYokrROyCwvF3Zwdsm9M-HsA,1255892
26
+ imops/src/_radon.pyx,sha256=ztXVnOfUjsRY5R22-7LbodG_FAbUoBemTnaIDZsPeI4,2896
27
+ imops/src/_fast_backprojection.c,sha256=HF4bG2SwMgBc_PN_1ODuOC4I3T4BrKc46aplrviHYGA,1035312
28
+ imops/src/_fast_backprojection.cpython-310-i386-linux-gnu.so,sha256=ZgdIfUoQfouin04bpJ0X3OQNlyVFLUQd71X0VG_BqWw,1259996
29
+ imops/src/_fast_zoom.cpython-310-i386-linux-gnu.so,sha256=4hx2VgE9Hohi_5LCG4vKfmc8zZwTuBNJl4oEe6DRATY,2963912
30
+ imops/src/_measure.cpython-310-i386-linux-gnu.so,sha256=6XSxGiRxGq-uauPGwVKqJ-T57EsvJkCJatuxhg7D50Q,1710684
31
+ imops/src/_fast_radon.pyx,sha256=ztXVnOfUjsRY5R22-7LbodG_FAbUoBemTnaIDZsPeI4,2896
32
+ imops/src/_zoom.c,sha256=yAbBBqLFgRvb-5kCehNdQbjpgPn5UIgwPn9pVr1PcY8,2124853
33
+ imops/src/_fast_measure.cpython-310-i386-linux-gnu.so,sha256=6Q4ZY2Exas7AIuiWd6_jdp08tNGKIzZLwq4wggxKZXo,1710692
34
+ imops/src/_fast_measure.pyx,sha256=pKFBt8ITxy1QsO5wFkRrhdYMfT2ENCA7yPZ-ZJRCh44,2650
35
+ imops/src/_fast_morphology.pyx,sha256=X96ad1iadGPelOipNjXNd9s77x95LCVFBTAs0gr4iXE,9209
36
+ imops/src/_fast_radon.cpython-310-i386-linux-gnu.so,sha256=IvvRJe5zbFylxKOEKqlUqCcIFEnQqS7jlrdhBgp4RQc,1534420
37
+ imops/src/_fast_radon.c,sha256=OGY4Up_K_rjNb2el9ZkHjXDoeReNU3EhjJgt6Ro-0RA,1189303
38
+ imops/src/_morphology.pyx,sha256=X96ad1iadGPelOipNjXNd9s77x95LCVFBTAs0gr4iXE,9209
39
+ imops/src/_radon.cpython-310-i386-linux-gnu.so,sha256=RGPRjFCCJfcQlQ42XyqUPu_n5tnQE6oVKhC60Rh_Jz0,1530312
40
+ imops/src/_morphology.cpython-310-i386-linux-gnu.so,sha256=Pibx6daCVLWCTNowQaA6rOysTcPuQsnFDO1ntlL0DOk,1070980
41
+ imops/src/_radon.c,sha256=d7yPZPwHhL4m1p71yyC0XCv-_y4_0rXLp5mHtdtn8lo,1177318
42
+ imops/src/_fast_morphology.c,sha256=UIUON4Y9LhXcruR5LmPxG-OR0us8-JIAHJ8PTB-jEsw,970833
43
+ imops/src/_fast_numeric.c,sha256=wxJjf1hQyiMsqUFKCzTeYnmvsSZscrGYz8_sqpmVHQE,2106369
44
+ imops/src/_fast_zoom.c,sha256=6NsvAWdxl9jJHkjho1hwEAjK8PjW4Erpy8x9jcYKGcI,2144297
45
+ imops/src/_numba_zoom.py,sha256=NH1u-64xExw0b_l6GQJ7ICOoWVsGOH8ztuS1LFvsiz0,16354
46
+ imops/src/_measure.pyx,sha256=pKFBt8ITxy1QsO5wFkRrhdYMfT2ENCA7yPZ-ZJRCh44,2650
47
+ imops/src/_numeric.c,sha256=pZIN7HdJm-fTLk7CL4BEiOO-qvFT6jebNdiYCk2jrDU,2090063
48
+ imops/src/_backprojection.pyx,sha256=RMB_GS2mbOS8mQWeo640p9FdeHHFjmjW3qrlEGGoL0s,2645
49
+ imops/src/_fast_numeric.pyx,sha256=05GbyyFzdill8M_L9KYA9hfYP7ULiAnvMpWyBATl7vQ,7979
50
+ imops/src/_morphology.c,sha256=N2TyGuWEKCrxMttf1mz3GidHnzyUZxU4M6AWGb0hrCo,959244
51
+ imops/src/_fast_numeric.cpython-310-i386-linux-gnu.so,sha256=SSciOE5bPff7L8lmdw1XFGSmVBbR7gg9Iipc7rmBWSo,2926140
52
+ imops/src/_fast_measure.c,sha256=UOKOTkl6CVTB2ODGAirHocnSQJNJ84uYYQcfmiPz1R0,1335590
53
+ imops/src/_measure.c,sha256=hMojG43NjBtHFDRMjkMY537lDIv9dX20NZDNE7t_GTY,1323252
54
+ imops/src/_numeric.cpython-310-i386-linux-gnu.so,sha256=MPbSnaA3K2-VBxG4hCQLIIY90ePY7O9K_ddFgyhu4R8,2926132
55
+ imops/src/_fast_zoom.pyx,sha256=_7cPgowHRuFuc7WFuqSnbr_gVzsQi2Bu1nhwoi_yDmw,22566
56
+ imops/src/_fast_morphology.cpython-310-i386-linux-gnu.so,sha256=rm7Ux_Z1-0oLV8oZkDVUMxCf4O_NMZIZRIWcui4wTIE,1070992
57
+ imops/src/_zoom.cpython-310-i386-linux-gnu.so,sha256=8oMnEjcbtk0Q-s2PMbi4d4yLlQi5ZUH0M1uEvYibU_s,2959808
58
+ imops/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
+ imops/src/_backprojection.c,sha256=XADOHzBEuXVXw4PLSuYtzZZmh0ZtfQZGfzTDYjgJ3_M,1024265
60
+ imops/src/_fast_backprojection.pyx,sha256=RMB_GS2mbOS8mQWeo640p9FdeHHFjmjW3qrlEGGoL0s,2645
61
+ imops/src/_zoom.pyx,sha256=_7cPgowHRuFuc7WFuqSnbr_gVzsQi2Bu1nhwoi_yDmw,22566
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.1)
2
+ Generator: bdist_wheel (0.41.2)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp310-cp310-musllinux_1_1_i686
5
5
 
@@ -0,0 +1,2 @@
1
+ _build_utils
2
+ imops
_pyproject_build.py DELETED
@@ -1,61 +0,0 @@
1
- import shutil
2
- from pathlib import Path
3
-
4
- from setuptools import Extension
5
- from setuptools.command.build_py import build_py
6
-
7
-
8
- class NumpyImport(dict):
9
- """Hacky way to return Numpy's include path with lazy import."""
10
-
11
- # Must be json-serializable due to
12
- # https://github.com/cython/cython/blob/6ad6ca0e9e7d030354b7fe7d7b56c3f6e6a4bc23/Cython/Compiler/ModuleNode.py#L773
13
- def __init__(self):
14
- return super().__init__(self, description=self.__doc__)
15
-
16
- # Must be hashable due to
17
- # https://github.com/cython/cython/blob/6ad6ca0e9e7d030354b7fe7d7b56c3f6e6a4bc23/Cython/Compiler/Main.py#L307
18
- def __hash__(self):
19
- return id(self)
20
-
21
- def __repr__(self):
22
- import numpy as np
23
-
24
- return np.get_include()
25
-
26
- __fspath__ = __repr__
27
-
28
-
29
- class PyprojectBuild(build_py):
30
- def run(self):
31
- self.run_command('build_ext')
32
- return super().run()
33
-
34
- def initialize_options(self):
35
- super().initialize_options()
36
-
37
- name = 'imops'
38
- args = ['-fopenmp']
39
-
40
- if self.distribution.ext_modules is None:
41
- self.distribution.ext_modules = []
42
-
43
- # Cython extension and .pyx source file names must be the same to compile
44
- # https://stackoverflow.com/questions/8024805/cython-compiled-c-extension-importerror-dynamic-module-does-not-define-init-fu
45
- modules = ['backprojection', 'measure', 'morphology', 'numeric', 'radon', 'zoom']
46
- for module in modules:
47
- src_dir = Path(__file__).parent / name / 'src'
48
- shutil.copyfile(src_dir / f'_{module}.pyx', src_dir / f'_fast_{module}.pyx')
49
-
50
- for module in modules:
51
- for prefix, additional_args in zip(['', 'fast_'], [[], ['-ffast-math']]):
52
- self.distribution.ext_modules.append(
53
- Extension(
54
- f'{name}.src._{prefix}{module}',
55
- [f'{name}/src/_{prefix}{module}.pyx'],
56
- include_dirs=[NumpyImport()],
57
- extra_compile_args=args + additional_args,
58
- extra_link_args=args + additional_args,
59
- define_macros=[('NPY_NO_DEPRECATED_API', 'NPY_1_7_API_VERSION')],
60
- )
61
- )
imops/_numeric.py DELETED
@@ -1,124 +0,0 @@
1
- from warnings import warn
2
-
3
- import numpy as np
4
-
5
- from .backend import BackendLike, resolve_backend
6
- from .src._fast_numeric import (
7
- _parallel_pointwise_mul as cython_fast_parallel_pointwise_mul,
8
- _parallel_sum as cython_fast_parallel_sum,
9
- )
10
- from .src._numeric import _parallel_pointwise_mul as cython_parallel_pointwise_mul, _parallel_sum as cython_parallel_sum
11
- from .utils import normalize_num_threads
12
-
13
-
14
- def _sum(nums: np.ndarray, num_threads: int = -1, backend: BackendLike = None) -> float:
15
- """
16
- Parallel sum of flat numpy array
17
-
18
- Parameters
19
- ----------
20
- nums: np.ndarray
21
- 1-dimensional array
22
- num_threads: int
23
- the number of threads to use for computation. Default = the cpu count. If negative value passed
24
- cpu count + num_threads + 1 threads will be used
25
- backend: BackendLike
26
- which backend to use. `cython` and `scipy` (primarly for benchmarking) are available,
27
- `cython` is used by default
28
-
29
- Returns
30
- -------
31
- sum: float
32
-
33
- Examples
34
- --------
35
- >>> s = _sum(x, num_threads=1)
36
- >>> s = _sum(x, num_threads=8, backend=Cython(fast=True)) # ffast-math compiled version
37
- """
38
- ndim = nums.ndim
39
-
40
- if ndim != 1:
41
- raise ValueError(f'Input must be 1-dimensional instead of {ndim}-dimensional.')
42
-
43
- backend = resolve_backend(backend)
44
- if backend.name not in ('Cython', 'Scipy'):
45
- raise ValueError(f'Unsupported backend "{backend.name}"')
46
-
47
- num_threads = normalize_num_threads(num_threads, backend)
48
-
49
- if backend.name == 'Scipy':
50
- return nums.sum()
51
-
52
- if backend.name == 'Cython':
53
- src_parallel_sum = cython_fast_parallel_sum if backend.fast else cython_parallel_sum
54
-
55
- return src_parallel_sum(nums, num_threads)
56
-
57
-
58
- def _mul(nums1: np.ndarray, nums2: np.ndarray, num_threads: int = -1, backend: BackendLike = None) -> np.ndarray:
59
- """
60
- Parallel pointwise multiplication of 2 numpy arrays (aka x * y). Works faster only for ndim <= 3.
61
-
62
- Parameters
63
- ----------
64
- nums1: np.ndarray
65
- nums2: np.ndarray
66
- num_threads: int
67
- the number of threads to use for computation. Default = the cpu count. If negative value passed
68
- cpu count + num_threads + 1 threads will be used
69
- backend: BackendLike
70
- which backend to use. `cython` and `scipy` (primarly for benchmarking) are available,
71
- `cython` is used by default
72
-
73
- Returns
74
- -------
75
- multiplied: np.ndarray
76
- result of nums1 * nums2
77
-
78
- Examples
79
- --------
80
- >>> mul = _mul(nums1, nums2, num_threads=8)
81
- >>> mul = _mul(np.ones((2, 3)), np.ones((1, 3))) # broadcasting, mul.shape == (2, 3)
82
- >>> mul = _mul(nums1, nums2, backend=Cython(fast=True)) # ffast-math compiled version
83
- """
84
- if not nums1.size and not nums2.size:
85
- return np.array([], dtype=nums1.dtype)
86
- if bool(nums1.size) ^ bool(nums2.size):
87
- raise ValueError('One of the arrays is empty, hence pointwise multiplication cannot be performed.')
88
- if len(nums1.shape) != len(nums2.shape):
89
- raise ValueError('Both arrays must have the same number of dimensions for pointwise multiplication.')
90
- for dim1, dim2 in zip(nums1.shape, nums2.shape):
91
- if dim1 != dim2 and dim1 != 1 and dim2 != 1:
92
- raise ValueError(f'Arrays of shapes {nums1.shape} and {nums2.shape} are not broadcastable.')
93
-
94
- if nums1.ndim > 3:
95
- warn('Parallel pointwise multiplication is only supported for ndim<=3. Falling back to naive x * y.')
96
-
97
- return nums1 * nums2
98
-
99
- backend = resolve_backend(backend)
100
- if backend.name not in ('Cython', 'Scipy'):
101
- raise ValueError(f'Unsupported backend "{backend.name}"')
102
-
103
- num_threads = normalize_num_threads(num_threads, backend)
104
-
105
- if backend.name == 'Scipy':
106
- return nums1 * nums2
107
-
108
- if backend.name == 'Cython':
109
- src_parallel_pointwise_mul = (
110
- cython_fast_parallel_pointwise_mul if backend.fast else cython_parallel_pointwise_mul
111
- )
112
-
113
- n_dummy = 3 - nums1.ndim
114
-
115
- if n_dummy:
116
- nums1 = nums1[(None,) * n_dummy]
117
- nums2 = nums2[(None,) * n_dummy]
118
-
119
- out = src_parallel_pointwise_mul(nums1, nums2, np.maximum(nums1.shape, nums2.shape), num_threads)
120
-
121
- if n_dummy:
122
- out = out[(0,) * n_dummy]
123
-
124
- return out
@@ -1,61 +0,0 @@
1
- _pyproject_build.py,sha256=BHfwNLl3RrpbYqFvOJVlQNgKkMUL9Ut1Rhzga7k9mEU,2236
2
- imops/measure.py,sha256=CtR6Qx8oU_FX3XbC1HIqOV0kMr_E0qq3wwg646FTXV4,8351
3
- imops/pad.py,sha256=FBRsooy11j3XJbrTeewgVS_qpKvkMnc_0J-tGJ061DI,7238
4
- imops/crop.py,sha256=26dS16ryTDlizCzPQFjN9E-_dUgRR4XHZZwow2nJ4UU,3352
5
- imops/box.py,sha256=3WrOdpUigoGKNnWhLLgX5NX_D9WzgwDKIWf75baTK-Y,1794
6
- imops/radon.py,sha256=LjIrcDmhLc17vVbHERMNlrxsh8_kMXrPDlvZUJtqe64,8767
7
- imops/_numeric.py,sha256=gb217xV7z3dcH9sE4UFatinIVH9r_7WSRgoveZ7Neno,4259
8
- imops/_configs.py,sha256=PoPlwnmmCz-Z8GmKYIqR8xsqcWHPKiYSGWldbQX9GU0,705
9
- imops/utils.py,sha256=8pcn53Rw8LOyO-2vnazlNLrcJ9cEsGgQFQN8X-EYfCQ,4567
10
- imops/morphology.py,sha256=c_UJvHXsZEgz6b1PgHXkhMII7u7S8-WEJQTjo58045o,12279
11
- imops/testing.py,sha256=JgUWoD7fzshdaVrrgmf9y9jpl3EHgmoYYmHHGCFI4Ws,1650
12
- imops/backend.py,sha256=D1TJ1WB7lmzCwjT7KA9axbjC3B6rWRDQP1veTNwFqKI,2277
13
- imops/interp1d.py,sha256=lLnthTOIB7j7k638174se8omGIKehtNleTtFRIaPACk,7981
14
- imops/__version__.py,sha256=K2rsUy8S7UHe3tStL6NCs5z92apbvbkrpGIEjcCNCNs,22
15
- imops/zoom.py,sha256=9JrgjSzedETxCCfhsOrMz9XOQuTi4OtgeC4jFmEVRLE,9626
16
- imops/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- imops/__init__.py,sha256=qWjreqFvwVqyxDdV1_ylx-FxsLt9f0vRtgmMt3ZhHjg,450
18
- imops/src/_radon.c,sha256=Sj4Tvp2En_h0k-2_MKDapO1lTDFA8VLgBZOxTvhj5JM,1177318
19
- imops/src/_fast_backprojection.pyx,sha256=RMB_GS2mbOS8mQWeo640p9FdeHHFjmjW3qrlEGGoL0s,2645
20
- imops/src/_fast_morphology.cpython-310-i386-linux-gnu.so,sha256=FJ7Bja1V49hLORiHN0LMtp5kewSqUDGqXNR3-7sQqL8,1075104
21
- imops/src/_fast_zoom.pyx,sha256=_7cPgowHRuFuc7WFuqSnbr_gVzsQi2Bu1nhwoi_yDmw,22566
22
- imops/src/_zoom.c,sha256=3GFfCwFMTWd5XqfAN_zExZKs_zMe9H1D3CvNxLg6aGA,2124853
23
- imops/src/_fast_measure.c,sha256=DkP5JT2SPzwJ2okO_BLmnLFuANDItjnReoLDgMQZhiU,1335590
24
- imops/src/_zoom.pyx,sha256=_7cPgowHRuFuc7WFuqSnbr_gVzsQi2Bu1nhwoi_yDmw,22566
25
- imops/src/_fast_radon.cpython-310-i386-linux-gnu.so,sha256=DeF_Y2x73q6RPnS5U4SvqLf_liXBIRgFUIRkA5Mujc8,1526156
26
- imops/src/_backprojection.c,sha256=u_velMOM7X-u18KIk8zCMIKA9BnG0ibV6xkRxPN8RuY,1024265
27
- imops/src/_measure.c,sha256=Vhg2MIhqyNBCXC6wBENVfuTG-xPSgYPswJZF0NGFGEg,1323252
28
- imops/src/_measure.cpython-310-i386-linux-gnu.so,sha256=OgaIcujoHHBPp4qtaPszIu6hWhcN4TuebjE5vdbbOr8,1710684
29
- imops/src/_fast_numeric.cpython-310-i386-linux-gnu.so,sha256=tXdFJFdbm5isoYVPV8m3Rg1-g7GLIfpSdkC2PPgL7fA,1808784
30
- imops/src/_backprojection.cpython-310-i386-linux-gnu.so,sha256=uL0xHrnw3PgzVFw5iMSRhhYpLq91l9bl5V9FyzC6P8s,1255892
31
- imops/src/_zoom.cpython-310-i386-linux-gnu.so,sha256=G2mNUxUGHf5dUVjchPA7BIcG2545Ug4iDssMy_RS038,2959808
32
- imops/src/_morphology.pyx,sha256=X96ad1iadGPelOipNjXNd9s77x95LCVFBTAs0gr4iXE,9209
33
- imops/src/_backprojection.pyx,sha256=RMB_GS2mbOS8mQWeo640p9FdeHHFjmjW3qrlEGGoL0s,2645
34
- imops/src/_fast_measure.cpython-310-i386-linux-gnu.so,sha256=6_xP5KPr1Al4dNZx1fhZo3T-tT0wThkR8xpDmNTuGqM,1714804
35
- imops/src/_morphology.cpython-310-i386-linux-gnu.so,sha256=Fbr0BN1VmP3d8zgk7svpSY97Zfki6ZGBVdlQhwghozc,1070980
36
- imops/src/_fast_measure.pyx,sha256=pKFBt8ITxy1QsO5wFkRrhdYMfT2ENCA7yPZ-ZJRCh44,2650
37
- imops/src/_numeric.pyx,sha256=OHFH0W02-gwB_nW6A5GgVw-70Eb__tiRZnOY1igtqAE,1855
38
- imops/src/_fast_zoom.c,sha256=hH7fuNVYYwqJF_puR3w-vKu70-MCkiqmREZG-6dHmng,2144297
39
- imops/src/_fast_zoom.cpython-310-i386-linux-gnu.so,sha256=w-vL84oVD4ryUXuh5DjitrzQHZYcDi7Y3pjJ03P8XX4,2935216
40
- imops/src/_radon.cpython-310-i386-linux-gnu.so,sha256=uf71jpy9rBM-G8gkbqYMCHUgKFFutOKXEM8-WDNF0uw,1530312
41
- imops/src/_fast_numeric.c,sha256=C0zyzm72vNoP-tiXhhBv5_luqsTCimp8XSSWXQekfDs,1314532
42
- imops/src/_numba_zoom.py,sha256=NH1u-64xExw0b_l6GQJ7ICOoWVsGOH8ztuS1LFvsiz0,16354
43
- imops/src/_fast_backprojection.c,sha256=mEWzwh0YvIuxy-Os9_cT4gi4qsYSSDWcj2oqsRpkfjk,1035312
44
- imops/src/_fast_numeric.pyx,sha256=OHFH0W02-gwB_nW6A5GgVw-70Eb__tiRZnOY1igtqAE,1855
45
- imops/src/_fast_morphology.pyx,sha256=X96ad1iadGPelOipNjXNd9s77x95LCVFBTAs0gr4iXE,9209
46
- imops/src/_radon.pyx,sha256=ztXVnOfUjsRY5R22-7LbodG_FAbUoBemTnaIDZsPeI4,2896
47
- imops/src/_morphology.c,sha256=wUKZmq7W7bVk2h032VJrTqSw7KUL7ffLIx_fXaBQlPE,959244
48
- imops/src/_numeric.c,sha256=AydTMlNXawarzAhcsqa5ICKzavnkeks791-rfr7ivUA,1302732
49
- imops/src/_fast_morphology.c,sha256=pUi9md_8tN_fd3hMli2ONbohuVJCFYy1pFo__PPx5Qw,970833
50
- imops/src/_numeric.cpython-310-i386-linux-gnu.so,sha256=P00EnngLaIbLYUj9boBen2AGeY5umwqckoZ_laR2q8w,1804660
51
- imops/src/_measure.pyx,sha256=pKFBt8ITxy1QsO5wFkRrhdYMfT2ENCA7yPZ-ZJRCh44,2650
52
- imops/src/_fast_radon.pyx,sha256=ztXVnOfUjsRY5R22-7LbodG_FAbUoBemTnaIDZsPeI4,2896
53
- imops/src/_fast_backprojection.cpython-310-i386-linux-gnu.so,sha256=b9T0FNfIl5_TDd8QL34uyLAvaM3EQ0kK8tu-ucl2QOs,1259968
54
- imops/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- imops/src/_fast_radon.c,sha256=ahCGhY3LG737SX8KwIFCpbbllvvSzhp640Z4Szmip78,1189303
56
- imops.libs/libgomp-41890ef0.so.1.0.0,sha256=v1S9wI3pI7LI5wKB6AvV6AdAUscM_zZ95LWxXvmoAN8,195208
57
- imops-0.8.2.dist-info/LICENSE,sha256=s4td51soCfOr_HP5fF2gTARksncu_DD1TgugcUGTBQ0,1064
58
- imops-0.8.2.dist-info/RECORD,,
59
- imops-0.8.2.dist-info/top_level.txt,sha256=N1kO5Q0hGO9R4DFsT_VsHcDKv2KQSsrBF4eQd2ZeURA,23
60
- imops-0.8.2.dist-info/METADATA,sha256=btl3fEyhXFyOakt8km2fRpKaKmheONqCL2e8h5xPQd4,8821
61
- imops-0.8.2.dist-info/WHEEL,sha256=0mbhEW-WFSM_QdIUROkYGjPYwB9JTUdMr0X7LpSCJ3c,111
@@ -1,2 +0,0 @@
1
- _pyproject_build
2
- imops
File without changes