pyopencl 2025.2.1__cp311-cp311-win_amd64.whl → 2025.2.3__cp311-cp311-win_amd64.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 pyopencl might be problematic. Click here for more details.

pyopencl/compyte/array.py CHANGED
@@ -20,10 +20,13 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
20
  THE SOFTWARE.
21
21
  """
22
22
 
23
+ from typing import Any, Protocol
24
+
23
25
  import numpy as np
26
+ from typing_extensions import override
24
27
 
25
28
 
26
- def f_contiguous_strides(itemsize, shape):
29
+ def f_contiguous_strides(itemsize: int, shape: tuple[int, ...]) -> tuple[int, ...]:
27
30
  if shape:
28
31
  strides = [itemsize]
29
32
  for s in shape[:-1]:
@@ -36,7 +39,7 @@ def f_contiguous_strides(itemsize, shape):
36
39
  return ()
37
40
 
38
41
 
39
- def c_contiguous_strides(itemsize, shape):
42
+ def c_contiguous_strides(itemsize: int, shape: tuple[int, ...]) -> tuple[int, ...]:
40
43
  if shape:
41
44
  strides = [itemsize]
42
45
  for s in shape[:0:-1]:
@@ -49,7 +52,11 @@ def c_contiguous_strides(itemsize, shape):
49
52
  return ()
50
53
 
51
54
 
52
- def equal_strides(strides1, strides2, shape):
55
+ def equal_strides(
56
+ strides1: tuple[int, ...],
57
+ strides2: tuple[int, ...],
58
+ shape: tuple[int, ...]
59
+ ) -> bool:
53
60
  if strides1 == strides2:
54
61
  return True
55
62
 
@@ -63,33 +70,53 @@ def equal_strides(strides1, strides2, shape):
63
70
  return True
64
71
 
65
72
 
66
- def is_f_contiguous_strides(strides, itemsize, shape):
73
+ def is_f_contiguous_strides(
74
+ strides: tuple[int, ...],
75
+ itemsize: int,
76
+ shape: tuple[int, ...]
77
+ ) -> bool:
67
78
  from pytools import product
68
79
  return (
69
80
  equal_strides(strides, f_contiguous_strides(itemsize, shape), shape)
70
81
  or product(shape) == 0)
71
82
 
72
83
 
73
- def is_c_contiguous_strides(strides, itemsize, shape):
84
+ def is_c_contiguous_strides(
85
+ strides: tuple[int, ...],
86
+ itemsize: int,
87
+ shape: tuple[int, ...]
88
+ ) -> bool:
74
89
  from pytools import product
75
90
  return (equal_strides(strides, c_contiguous_strides(itemsize, shape), shape)
76
91
  or product(shape) == 0)
77
92
 
78
93
 
94
+ class ArrayIsh(Protocol):
95
+ shape: tuple[int, ...]
96
+ strides: tuple[int, ...]
97
+ dtype: np.dtype[Any]
98
+
99
+
79
100
  class ArrayFlags:
80
- def __init__(self, ary):
101
+ f_contiguous: bool
102
+ c_contiguous: bool
103
+ forc: bool
104
+
105
+ def __init__(self, ary: ArrayIsh):
81
106
  self.f_contiguous = is_f_contiguous_strides(
82
107
  ary.strides, ary.dtype.itemsize, ary.shape)
83
108
  self.c_contiguous = is_c_contiguous_strides(
84
109
  ary.strides, ary.dtype.itemsize, ary.shape)
85
110
  self.forc = self.f_contiguous or self.c_contiguous
86
111
 
112
+ @override
87
113
  def __repr__(self):
88
114
  return (
89
115
  f" C_CONTIGUOUS : {self.c_contiguous}\n"
90
116
  f" F_CONTIGUOUS : {self.f_contiguous}"
91
117
  )
92
118
 
119
+ @override
93
120
  def __str__(self):
94
121
  return repr(self)
95
122
 
@@ -26,7 +26,11 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26
26
  OTHER DEALINGS IN THE SOFTWARE.
27
27
  """
28
28
 
29
+ from collections.abc import Sequence
30
+ from typing import Any, Callable, TypeVar
31
+
29
32
  import numpy as np
33
+ from numpy.typing import DTypeLike
30
34
 
31
35
 
32
36
  class TypeNameNotKnown(RuntimeError): # noqa: N818
@@ -36,11 +40,16 @@ class TypeNameNotKnown(RuntimeError): # noqa: N818
36
40
  # {{{ registry
37
41
 
38
42
  class DTypeRegistry:
43
+ dtype_to_name: dict[np.dtype[Any] | str, str]
44
+ name_to_dtype: dict[str, np.dtype[Any]]
45
+
39
46
  def __init__(self):
40
47
  self.dtype_to_name = {}
41
48
  self.name_to_dtype = {}
42
49
 
43
- def get_or_register_dtype(self, c_names, dtype=None):
50
+ def get_or_register_dtype(self,
51
+ names: str | Sequence[str],
52
+ dtype: DTypeLike | None = None) -> np.dtype[Any]:
44
53
  """Get or register a :class:`numpy.dtype` associated with the C type names
45
54
  in the string list *c_names*. If *dtype* is `None`, no registration is
46
55
  performed, and the :class:`numpy.dtype` must already have been registered.
@@ -57,12 +66,12 @@ class DTypeRegistry:
57
66
  .. versionadded:: 2012.2
58
67
  """
59
68
 
60
- if isinstance(c_names, str):
61
- c_names = [c_names]
69
+ if isinstance(names, str):
70
+ names = [names]
62
71
 
63
72
  if dtype is None:
64
73
  from pytools import single_valued
65
- return single_valued(self.name_to_dtype[name] for name in c_names)
74
+ return single_valued(self.name_to_dtype[name] for name in names)
66
75
 
67
76
  dtype = np.dtype(dtype)
68
77
 
@@ -77,7 +86,7 @@ class DTypeRegistry:
77
86
  assert existing_dtype == dtype
78
87
  dtype = existing_dtype
79
88
 
80
- for nm in c_names:
89
+ for nm in names:
81
90
  try:
82
91
  name_dtype = self.name_to_dtype[nm]
83
92
  except KeyError:
@@ -88,13 +97,13 @@ class DTypeRegistry:
88
97
  f"name '{nm}' already registered to different dtype")
89
98
 
90
99
  if not existed:
91
- self.dtype_to_name[dtype] = c_names[0]
100
+ self.dtype_to_name[dtype] = names[0]
92
101
  if str(dtype) not in self.dtype_to_name:
93
- self.dtype_to_name[str(dtype)] = c_names[0]
102
+ self.dtype_to_name[str(dtype)] = names[0]
94
103
 
95
104
  return dtype
96
105
 
97
- def dtype_to_ctype(self, dtype):
106
+ def dtype_to_ctype(self, dtype: DTypeLike) -> str:
98
107
  if dtype is None:
99
108
  raise ValueError("dtype may not be None")
100
109
 
@@ -110,7 +119,11 @@ class DTypeRegistry:
110
119
 
111
120
  # {{{ C types
112
121
 
113
- def fill_registry_with_c_types(reg, respect_windows, include_bool=True):
122
+ def fill_registry_with_c_types(
123
+ reg: DTypeRegistry,
124
+ respect_windows: bool,
125
+ include_bool: bool = True
126
+ ) -> None:
114
127
  import struct
115
128
  from sys import platform
116
129
 
@@ -147,17 +160,11 @@ def fill_registry_with_c_types(reg, respect_windows, include_bool=True):
147
160
  f"{i64_name} unsigned int"],
148
161
  np.uint64)
149
162
 
150
- # https://github.com/numpy/numpy/issues/2610
151
- if is_64_bit:
152
- reg.get_or_register_dtype([f"unsigned {i64_name}"], np.uintp)
153
- else:
154
- reg.get_or_register_dtype(["unsigned"], np.uintp)
155
-
156
163
  reg.get_or_register_dtype("float", np.float32)
157
164
  reg.get_or_register_dtype("double", np.float64)
158
165
 
159
166
 
160
- def fill_registry_with_opencl_c_types(reg):
167
+ def fill_registry_with_opencl_c_types(reg: DTypeRegistry) -> None:
161
168
  reg.get_or_register_dtype(["char", "signed char"], np.int8)
162
169
  reg.get_or_register_dtype(["uchar", "unsigned char"], np.uint8)
163
170
  reg.get_or_register_dtype(["short", "signed short",
@@ -183,7 +190,7 @@ def fill_registry_with_opencl_c_types(reg):
183
190
  reg.get_or_register_dtype("double", np.float64)
184
191
 
185
192
 
186
- def fill_registry_with_c99_stdint_types(reg):
193
+ def fill_registry_with_c99_stdint_types(reg: DTypeRegistry) -> None:
187
194
  reg.get_or_register_dtype("bool", np.bool_)
188
195
 
189
196
  reg.get_or_register_dtype("int8_t", np.int8)
@@ -200,7 +207,7 @@ def fill_registry_with_c99_stdint_types(reg):
200
207
  reg.get_or_register_dtype("double", np.float64)
201
208
 
202
209
 
203
- def fill_registry_with_c99_complex_types(reg):
210
+ def fill_registry_with_c99_complex_types(reg: DTypeRegistry) -> None:
204
211
  reg.get_or_register_dtype("float complex", np.complex64)
205
212
  reg.get_or_register_dtype("double complex", np.complex128)
206
213
  reg.get_or_register_dtype("long double complex", np.clongdouble)
@@ -229,12 +236,21 @@ def _fill_dtype_registry(respect_windows, include_bool=True):
229
236
 
230
237
  # {{{ c declarator parsing
231
238
 
232
- def parse_c_arg_backend(c_arg, scalar_arg_factory, vec_arg_factory,
233
- name_to_dtype=None):
239
+ ArgTypeT = TypeVar("ArgTypeT")
240
+
241
+
242
+ def parse_c_arg_backend(
243
+ c_arg: str,
244
+ scalar_arg_factory: Callable[[np.dtype[Any], str], ArgTypeT],
245
+ vec_arg_factory: Callable[[np.dtype[Any], str], ArgTypeT],
246
+ name_to_dtype: Callable[[str], np.dtype[Any]] | DTypeRegistry | None = None,
247
+ ):
234
248
  if isinstance(name_to_dtype, DTypeRegistry):
235
- name_to_dtype = name_to_dtype.name_to_dtype__getitem__
249
+ name_to_dtype_clbl = name_to_dtype.name_to_dtype.__getitem__
236
250
  elif name_to_dtype is None:
237
- name_to_dtype = NAME_TO_DTYPE.__getitem__
251
+ name_to_dtype_clbl = NAME_TO_DTYPE.__getitem__
252
+ else:
253
+ name_to_dtype_clbl = name_to_dtype
238
254
 
239
255
  c_arg = (c_arg
240
256
  .replace("const", "")
@@ -261,7 +277,7 @@ def parse_c_arg_backend(c_arg, scalar_arg_factory, vec_arg_factory,
261
277
  tp = " ".join(tp.split())
262
278
 
263
279
  try:
264
- dtype = name_to_dtype(tp)
280
+ dtype = name_to_dtype_clbl(tp)
265
281
  except KeyError:
266
282
  raise ValueError(f"unknown type '{tp}'") from None
267
283
 
@@ -270,7 +286,11 @@ def parse_c_arg_backend(c_arg, scalar_arg_factory, vec_arg_factory,
270
286
  # }}}
271
287
 
272
288
 
273
- def register_dtype(dtype, c_names, alias_ok=False):
289
+ def register_dtype(
290
+ dtype: DTypeLike,
291
+ c_names: Sequence[str] | str,
292
+ alias_ok: bool = False
293
+ ) -> None:
274
294
  from warnings import warn
275
295
  warn("register_dtype is deprecated. Use get_or_register_dtype instead.",
276
296
  DeprecationWarning, stacklevel=2)
@@ -32,3 +32,21 @@ known-first-party = [
32
32
  "pytools",
33
33
  ]
34
34
  lines-after-imports = 2
35
+
36
+
37
+ [tool.basedpyright]
38
+ reportImplicitStringConcatenation = "none"
39
+ reportUnnecessaryIsInstance = "none"
40
+ reportUnusedCallResult = "none"
41
+ reportExplicitAny = "none"
42
+ reportUnreachable = "hint"
43
+ # array.py looks like stdlib array, but pyright doesn't know this
44
+ # won't ever be a top-level anything.
45
+ reportShadowedImports = "none"
46
+
47
+ # This reports even cycles that are qualified by 'if TYPE_CHECKING'. Not what
48
+ # we care about at this moment.
49
+ # https://github.com/microsoft/pyright/issues/746
50
+ reportImportCycles = "none"
51
+ pythonVersion = "3.10"
52
+ pythonPlatform = "All"
pyopencl/reduction.py CHANGED
@@ -30,12 +30,14 @@ Based on code/ideas by Mark Harris <mharris@nvidia.com>.
30
30
  None of the original source code remains.
31
31
  """
32
32
 
33
+ import builtins
33
34
  from dataclasses import dataclass
34
- from typing import Any
35
+ from typing import TYPE_CHECKING, Any, Literal, cast, overload
35
36
 
36
37
  import numpy as np
37
38
 
38
39
  import pyopencl as cl
40
+ import pyopencl.array as cl_array
39
41
  from pyopencl.tools import (
40
42
  DtypedArgument,
41
43
  KernelTemplateBase,
@@ -45,6 +47,10 @@ from pyopencl.tools import (
45
47
  )
46
48
 
47
49
 
50
+ if TYPE_CHECKING:
51
+ from pyopencl.typing import Allocator
52
+
53
+
48
54
  # {{{ kernel source
49
55
 
50
56
  KERNEL = r"""//CL//
@@ -351,7 +357,40 @@ class ReductionKernel:
351
357
  name=f"{name}_stage2", options=options, preamble=preamble,
352
358
  max_group_size=max_group_size)
353
359
 
354
- def __call__(self, *args: Any, **kwargs: Any) -> cl.Event:
360
+ @overload
361
+ def __call__(self,
362
+ *args: object,
363
+ return_event: Literal[True],
364
+ queue: cl.CommandQueue | None = None,
365
+ allocator: Allocator | None = None,
366
+ wait_for: cl.WaitList = None,
367
+ out: cl_array.Array | None = None,
368
+ range: slice | None = None,
369
+ slice: slice | None = None
370
+ ) -> tuple[cl_array.Array, cl.Event]: ...
371
+
372
+ @overload
373
+ def __call__(self,
374
+ *args: object,
375
+ return_event: Literal[False],
376
+ queue: cl.CommandQueue | None = None,
377
+ allocator: Allocator | None = None,
378
+ wait_for: cl.WaitList = None,
379
+ out: cl_array.Array | None = None,
380
+ range: slice | None = None,
381
+ slice: slice | None = None
382
+ ) -> cl_array.Array: ...
383
+
384
+ def __call__(self,
385
+ *args: object,
386
+ return_event: bool = False,
387
+ queue: cl.CommandQueue | None = None,
388
+ allocator: Allocator | None = None,
389
+ wait_for: cl.WaitList = None,
390
+ out: cl_array.Array | None = None,
391
+ range: slice | None = None,
392
+ slice: slice | None = None
393
+ ) -> cl_array.Array | tuple[cl_array.Array, cl.Event]:
355
394
  """Invoke the generated kernel.
356
395
 
357
396
  |explain-waitfor|
@@ -390,18 +429,6 @@ class ReductionKernel:
390
429
  ``(scalar_array, event)``.
391
430
  """
392
431
 
393
- queue = kwargs.pop("queue", None)
394
- allocator = kwargs.pop("allocator", None)
395
- wait_for = kwargs.pop("wait_for", None)
396
- return_event = kwargs.pop("return_event", False)
397
- out = kwargs.pop("out", None)
398
-
399
- range_ = kwargs.pop("range", None)
400
- slice_ = kwargs.pop("slice", None)
401
-
402
- if kwargs:
403
- raise TypeError("invalid keyword argument to reduction kernel")
404
-
405
432
  if wait_for is None:
406
433
  wait_for = []
407
434
  else:
@@ -415,13 +442,14 @@ class ReductionKernel:
415
442
 
416
443
  while True:
417
444
  invocation_args = []
418
- vectors = []
445
+ vectors: list[cl_array.Array] = []
419
446
 
420
447
  array_empty = empty
421
448
 
422
449
  from pyopencl.tools import VectorArg
423
450
  for arg, arg_tp in zip(args, stage_inf.arg_types, strict=True):
424
451
  if isinstance(arg_tp, VectorArg):
452
+ assert isinstance(arg, cl_array.Array)
425
453
  array_empty = arg.__class__
426
454
  if not arg.flags.forc:
427
455
  raise RuntimeError(
@@ -443,31 +471,30 @@ class ReductionKernel:
443
471
 
444
472
  # {{{ range/slice processing
445
473
 
446
- if range_ is not None:
447
- if slice_ is not None:
474
+ if range is not None:
475
+ if slice is not None:
448
476
  raise TypeError("may not specify both range and slice "
449
477
  "keyword arguments")
450
478
 
451
479
  else:
452
- if slice_ is None:
453
- slice_ = slice(None)
480
+ if slice is None:
481
+ slice = builtins.slice(None)
454
482
 
455
483
  if repr_vec is None:
456
484
  raise TypeError(
457
485
  "must have vector argument when range is not specified")
458
486
 
459
- range_ = slice(*slice_.indices(repr_vec.size))
487
+ range = builtins.slice(*slice.indices(repr_vec.size))
460
488
 
461
- assert range_ is not None
489
+ assert range is not None
462
490
 
463
- start = range_.start
491
+ start = cast("int | None", range.start)
464
492
  if start is None:
465
493
  start = 0
466
- if range_.step is None:
494
+ step = cast("int | None", range.step)
495
+ if step is None:
467
496
  step = 1
468
- else:
469
- step = range_.step
470
- sz = abs(range_.stop - start)//step
497
+ sz = abs(cast("int", range.stop) - start) //step
471
498
 
472
499
  # }}}
473
500
 
@@ -504,7 +531,7 @@ class ReductionKernel:
504
531
  macrogroup_size = group_count*stage_inf.group_size
505
532
  seq_count = (sz + macrogroup_size - 1) // macrogroup_size
506
533
 
507
- size_args = [start, step, range_.stop, seq_count, sz]
534
+ size_args = [start, step, range.stop, seq_count, sz]
508
535
 
509
536
  if group_count == 1 and out is not None:
510
537
  result = out
@@ -536,7 +563,7 @@ class ReductionKernel:
536
563
  stage_inf = self.stage_2_inf
537
564
  args = (result, *stage1_args)
538
565
 
539
- range_ = slice_ = None
566
+ range = slice = None
540
567
 
541
568
  # }}}
542
569
 
pyopencl/typing.py CHANGED
@@ -23,7 +23,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
23
  THE SOFTWARE.
24
24
  """
25
25
 
26
- from collections.abc import Sequence
26
+ from collections.abc import Callable, Sequence
27
27
  from typing import TYPE_CHECKING, Any, TypeAlias, TypeVar
28
28
 
29
29
  import numpy as np
@@ -33,6 +33,7 @@ from typing_extensions import Buffer as abc_Buffer
33
33
 
34
34
  if TYPE_CHECKING:
35
35
  import pyopencl as _cl
36
+ import pyopencl.array as _cl_array
36
37
 
37
38
 
38
39
  DTypeT = TypeVar("DTypeT", bound=np.dtype[Any])
@@ -49,4 +50,8 @@ KernelArg: TypeAlias = """
49
50
  | _cl.Buffer
50
51
  | _cl.Image
51
52
  | _cl.Sampler
52
- | _cl.SVMPointer"""
53
+ | _cl.SVMPointer
54
+ | _cl_array.Array
55
+ | None"""
56
+
57
+ Allocator: TypeAlias = "Callable[[int], _cl.MemoryObjectHolder | _cl.SVMPointer]"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyopencl
3
- Version: 2025.2.1
3
+ Version: 2025.2.3
4
4
  Summary: Python wrapper for OpenCL
5
5
  Author-Email: Andreas Kloeckner <inform@tiker.net>
6
6
  License-Expression: MIT
@@ -1,11 +1,11 @@
1
- pyopencl/__init__.py,sha256=tF-6Bz22ydaM-nymBImLy7EajeklT_CQgdQNFIFWEl0,64721
2
- pyopencl/_cl.cp311-win_amd64.pyd,sha256=_mkZirJDgf7oyhF92YkEXzuR8Z4G7qUqjEpMK7zH_aM,633344
1
+ pyopencl/__init__.py,sha256=JAui3XXEV-mVuAeufIOvmvg4TwagUkNsppoJewozayg,65173
2
+ pyopencl/_cl.cp311-win_amd64.pyd,sha256=yb6pp_7lzvYIe3HTeIqlhKkQLbFLoBBORRPpwCfMf9Q,633344
3
3
  pyopencl/_cl.pyi,sha256=QnCqG_fjW3VyUQsxcdcZ8M3ZePQ1BtA4XWFfgjfwGPg,58241
4
4
  pyopencl/_cluda.py,sha256=zlp4ECLzlQOF5ERjXeDJ6j5wYsxPm3VAYwd7adnNYo0,2168
5
5
  pyopencl/_monkeypatch.py,sha256=EyC-4DeFCaSBKQ00kJZxF6z-e44P-XSL6xAN2X0oDXM,35908
6
6
  pyopencl/_mymako.py,sha256=Ki5F6iY5oAdm_R6Mll-ltbO-DZF37FDEINimG2HRyRY,674
7
7
  pyopencl/algorithm.py,sha256=Gx7xqny_g7SA56gbApRdWUvm8UHWJDNvkdL1L3eQ4rY,52824
8
- pyopencl/array.py,sha256=QImtVkujKnC93uOtZvFIXes8Rlp4e1S9-gVqNtxwfm4,112961
8
+ pyopencl/array.py,sha256=a99NDsxrpzEWfLx8vqUmLF9RY9U3XIgxjAQY5AIjhag,114958
9
9
  pyopencl/bitonic_sort.py,sha256=RQUC8tpezdTQGzSEFyue86gVjc76vLKDwaNkqi4afa8,8297
10
10
  pyopencl/bitonic_sort_templates.py,sha256=RQaGOQf7f3f4FPX80h4rxOq3_gAq0e6OKaZIuBjcoUI,16785
11
11
  pyopencl/cache.py,sha256=R_EW9ekoMe9V4Am6MbIgtnMm-BbRQyWZgzfscKEtkB0,16552
@@ -28,19 +28,19 @@ pyopencl/clrandom.py,sha256=ozqtoMU9-68DaLDR6SEpjq0rPZ-UeqQuJU-vlp_y2eA,13493
28
28
  pyopencl/cltypes.py,sha256=gjRNaTQKQvyWI2ObF-BczGqEIAcgu_SzoW1-_22YLCY,6247
29
29
  pyopencl/compyte/.gitignore,sha256=PFMRSJycIqPtcpEn7VqbcenWJqHFDuYtwQm_tLbADt8,189
30
30
  pyopencl/compyte/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- pyopencl/compyte/array.py,sha256=3V7o2uIzebJ3H-g23NP2qe5DGXAkuoLYaQJtKcXc6yU,7594
32
- pyopencl/compyte/dtypes.py,sha256=HNNh35QPyhsWn-BzvidltBA3Hi72XGlW3-62vRp-bkc,10201
33
- pyopencl/compyte/pyproject.toml,sha256=y_MOlhePlmLI24oycBBDKqDpfePj2U_fju4mOcbV4GI,756
31
+ pyopencl/compyte/array.py,sha256=uJWC8KBRU29Wzx35VZ-bXRjC-2Qzr8y-4J0UdgldVik,8276
32
+ pyopencl/compyte/dtypes.py,sha256=oNDNExqCOwjI5P17zuGhxcNSbXzEbSMlgEWMdnSZ6JU,10862
33
+ pyopencl/compyte/pyproject.toml,sha256=iUOcs-BY0oYBQyIjT0knJM95TYcoWF-nB7E_FmuyIaE,1332
34
34
  pyopencl/elementwise.py,sha256=9VOX-sg8vkPne3PGROxuXLSf1FeQ8E8uGKRYvxrRIg4,39852
35
35
  pyopencl/invoker.py,sha256=hMmVaXOgmOjTjCI6Evjx4x_c8FrbBPlClFGCqirAtOE,14123
36
36
  pyopencl/ipython_ext.py,sha256=Hfx5go15On4B0CRDuZcsa3d-lme4-xPNHPdgEa9fbJ8,2021
37
37
  pyopencl/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- pyopencl/reduction.py,sha256=PUd_5n0ZShiNs8s-Cy4_fqfEiZLx9LICSCuo9wrwe60,26295
38
+ pyopencl/reduction.py,sha256=QypvaTblYw0oKcNv_Gs-pYz96RvcQa2GouAkVhvft58,27459
39
39
  pyopencl/scan.py,sha256=tmYbMbSx0CfilgZoRzbROX9TbjptPCxHD-WDUx11uTg,67535
40
40
  pyopencl/tools.py,sha256=jLvZAjCBJKwN0Wg_jH9XAObvqIJh-haz_VXpFSfXB1M,48161
41
- pyopencl/typing.py,sha256=QJTJMuVZ7C5og65xT8s0VJQ6AibQ-Vz7DoEk-vmeg84,1857
41
+ pyopencl/typing.py,sha256=JX9tpZPtwyDb2IpM8Ka3YopLpxe1Iidz-Ot7IFprrU8,2027
42
42
  pyopencl/version.py,sha256=Z5G_fsr_KVWqiYzK_pOQ2PbAO20wrFlEuqqKBGiAv4I,315
43
- pyopencl-2025.2.1.dist-info/METADATA,sha256=ZWuBJXxGy78MiQ68EB8rPStHxAZ7PNgk5LJqDH2OFbg,4756
44
- pyopencl-2025.2.1.dist-info/WHEEL,sha256=snOjF3_Qdfl83AvEPF_jBYJIRsss89-Tk83TV05TAGs,106
45
- pyopencl-2025.2.1.dist-info/licenses/LICENSE,sha256=jib9h6nV8oAvCkKPKDecpLakmQi1SktCn4YXmllgySY,15566
46
- pyopencl-2025.2.1.dist-info/RECORD,,
43
+ pyopencl-2025.2.3.dist-info/METADATA,sha256=2_oRPyLkdxIGNHm3rCoXzlT-GQkg97zLWGWae1v0GIo,4756
44
+ pyopencl-2025.2.3.dist-info/WHEEL,sha256=snOjF3_Qdfl83AvEPF_jBYJIRsss89-Tk83TV05TAGs,106
45
+ pyopencl-2025.2.3.dist-info/licenses/LICENSE,sha256=jib9h6nV8oAvCkKPKDecpLakmQi1SktCn4YXmllgySY,15566
46
+ pyopencl-2025.2.3.dist-info/RECORD,,