diff --git a/CHANGELOG.md b/CHANGELOG.md index 12263e428cf5..22cb90a327c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ This release is compatible with NumPy 2.4.5. * Changed `dpnp.meshgrid` and `dpnp.tensor.meshgrid` to return a tuple instead of a list, aligning with NumPy 2.5+ behavior and 2025.12 version of the Python array API standard [#2854](https://github.com/IntelPython/dpnp/pull/2854) * Updated `searchsorted` implementations to align with the 2025.12 array API spec [gh-2902](https://github.com/IntelPython/dpnp/pull/2902) * Updated tests to align with NumPy 2.4.5 compatibility [gh-2920](https://github.com/IntelPython/dpnp/pull/2920) +* Replaced `.pxi` includes in `dpnp.tensor` with modular `.pxd`/`.pyx` Cython imports [#2913](https://github.com/IntelPython/dpnp/pull/2913) ### Deprecated diff --git a/dpnp/backend/include/dpnp4pybind11.hpp b/dpnp/backend/include/dpnp4pybind11.hpp index 6394987a5f82..a64a5074beb7 100644 --- a/dpnp/backend/include/dpnp4pybind11.hpp +++ b/dpnp/backend/include/dpnp4pybind11.hpp @@ -32,9 +32,10 @@ #include "dpctl4pybind11.hpp" // Include generated Cython headers for usm_ndarray -// (struct definition and constants only) #include "dpnp/tensor/_usmarray.h" #include "dpnp/tensor/_usmarray_api.h" +// Include usm_ndarray constants (flags, type numbers) +#include "../../tensor/include/usm_ndarray_constants.h" #include #include @@ -191,47 +192,47 @@ class dpnp_capi this->UsmNDArray_MakeSimpleFromPtr_ = UsmNDArray_MakeSimpleFromPtr; this->UsmNDArray_MakeFromPtr_ = UsmNDArray_MakeFromPtr; - // constants - this->USM_ARRAY_C_CONTIGUOUS_ = USM_ARRAY_C_CONTIGUOUS; - this->USM_ARRAY_F_CONTIGUOUS_ = USM_ARRAY_F_CONTIGUOUS; - this->USM_ARRAY_WRITABLE_ = USM_ARRAY_WRITABLE; - this->UAR_BOOL_ = UAR_BOOL; - this->UAR_BYTE_ = UAR_BYTE; - this->UAR_UBYTE_ = UAR_UBYTE; - this->UAR_SHORT_ = UAR_SHORT; - this->UAR_USHORT_ = UAR_USHORT; - this->UAR_INT_ = UAR_INT; - this->UAR_UINT_ = UAR_UINT; - this->UAR_LONG_ = UAR_LONG; - this->UAR_ULONG_ = UAR_ULONG; - this->UAR_LONGLONG_ = UAR_LONGLONG; - this->UAR_ULONGLONG_ = UAR_ULONGLONG; - this->UAR_FLOAT_ = UAR_FLOAT; - this->UAR_DOUBLE_ = UAR_DOUBLE; - this->UAR_CFLOAT_ = UAR_CFLOAT; - this->UAR_CDOUBLE_ = UAR_CDOUBLE; - this->UAR_TYPE_SENTINEL_ = UAR_TYPE_SENTINEL; - this->UAR_HALF_ = UAR_HALF; + // constants from usm_ndarray_constants.h + this->USM_ARRAY_C_CONTIGUOUS_ = USM_ARRAY_C_CONTIGUOUS_VALUE; + this->USM_ARRAY_F_CONTIGUOUS_ = USM_ARRAY_F_CONTIGUOUS_VALUE; + this->USM_ARRAY_WRITABLE_ = USM_ARRAY_WRITABLE_VALUE; + this->UAR_BOOL_ = UAR_BOOL_VALUE; + this->UAR_BYTE_ = UAR_BYTE_VALUE; + this->UAR_UBYTE_ = UAR_UBYTE_VALUE; + this->UAR_SHORT_ = UAR_SHORT_VALUE; + this->UAR_USHORT_ = UAR_USHORT_VALUE; + this->UAR_INT_ = UAR_INT_VALUE; + this->UAR_UINT_ = UAR_UINT_VALUE; + this->UAR_LONG_ = UAR_LONG_VALUE; + this->UAR_ULONG_ = UAR_ULONG_VALUE; + this->UAR_LONGLONG_ = UAR_LONGLONG_VALUE; + this->UAR_ULONGLONG_ = UAR_ULONGLONG_VALUE; + this->UAR_FLOAT_ = UAR_FLOAT_VALUE; + this->UAR_DOUBLE_ = UAR_DOUBLE_VALUE; + this->UAR_CFLOAT_ = UAR_CFLOAT_VALUE; + this->UAR_CDOUBLE_ = UAR_CDOUBLE_VALUE; + this->UAR_TYPE_SENTINEL_ = UAR_TYPE_SENTINEL_VALUE; + this->UAR_HALF_ = UAR_HALF_VALUE; // deduced disjoint types - this->UAR_INT8_ = UAR_BYTE; - this->UAR_UINT8_ = UAR_UBYTE; - this->UAR_INT16_ = UAR_SHORT; - this->UAR_UINT16_ = UAR_USHORT; + this->UAR_INT8_ = UAR_BYTE_VALUE; + this->UAR_UINT8_ = UAR_UBYTE_VALUE; + this->UAR_INT16_ = UAR_SHORT_VALUE; + this->UAR_UINT16_ = UAR_USHORT_VALUE; this->UAR_INT32_ = platform_typeid_lookup( - UAR_LONG, UAR_INT, UAR_SHORT); + UAR_LONG_VALUE, UAR_INT_VALUE, UAR_SHORT_VALUE); this->UAR_UINT32_ = platform_typeid_lookup(UAR_ULONG, UAR_UINT, - UAR_USHORT); + unsigned short>( + UAR_ULONG_VALUE, UAR_UINT_VALUE, UAR_USHORT_VALUE); this->UAR_INT64_ = platform_typeid_lookup( - UAR_LONG, UAR_LONGLONG, UAR_INT); + UAR_LONG_VALUE, UAR_LONGLONG_VALUE, UAR_INT_VALUE); this->UAR_UINT64_ = platform_typeid_lookup( - UAR_ULONG, UAR_ULONGLONG, UAR_UINT); + UAR_ULONG_VALUE, UAR_ULONGLONG_VALUE, UAR_UINT_VALUE); py::object py_default_usm_memory = ::dpctl::detail::dpctl_capi::get().default_usm_memory_pyobj(); diff --git a/dpnp/tensor/_slicing.pxd b/dpnp/tensor/_slicing.pxd new file mode 100644 index 000000000000..e556ff57f4a4 --- /dev/null +++ b/dpnp/tensor/_slicing.pxd @@ -0,0 +1,42 @@ +# ***************************************************************************** +# Copyright (c) 2026, Intel Corporation +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# - Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# - Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# - Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +# THE POSSIBILITY OF SUCH DAMAGE. +# ***************************************************************************** + +# distutils: language = c++ +# cython: language_level=3 + +cdef bint _is_buffer(object o) + +cdef Py_ssize_t _slice_len( + Py_ssize_t sl_start, + Py_ssize_t sl_stop, + Py_ssize_t sl_step +) + +cdef bint _is_integral(object x) except * + +cdef bint _is_boolean(object x) except * diff --git a/dpnp/tensor/_slicing.pxi b/dpnp/tensor/_slicing.pyx similarity index 99% rename from dpnp/tensor/_slicing.pxi rename to dpnp/tensor/_slicing.pyx index 9bfcee64f2b6..dde15bd30288 100644 --- a/dpnp/tensor/_slicing.pxi +++ b/dpnp/tensor/_slicing.pyx @@ -26,11 +26,15 @@ # THE POSSIBILITY OF SUCH DAMAGE. # ***************************************************************************** -import numbers +# distutils: language = c++ +# cython: language_level=3 + from operator import index from cpython.buffer cimport PyObject_CheckBuffer from numpy import ndarray +from ._usmarray cimport usm_ndarray + cdef bint _is_buffer(object o): return PyObject_CheckBuffer(o) diff --git a/dpnp/tensor/_stride_utils.pxd b/dpnp/tensor/_stride_utils.pxd new file mode 100644 index 000000000000..9aead47d76ce --- /dev/null +++ b/dpnp/tensor/_stride_utils.pxd @@ -0,0 +1,63 @@ +# ***************************************************************************** +# Copyright (c) 2026, Intel Corporation +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# - Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# - Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# - Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +# THE POSSIBILITY OF SUCH DAMAGE. +# ***************************************************************************** + +# distutils: language = c++ +# cython: language_level=3 + +cdef extern from "usm_ndarray_constants.h": + int USM_ARRAY_C_CONTIGUOUS_VALUE + int USM_ARRAY_F_CONTIGUOUS_VALUE + int USM_ARRAY_WRITABLE_VALUE + +cdef int USM_ARRAY_C_CONTIGUOUS +cdef int USM_ARRAY_F_CONTIGUOUS +cdef int USM_ARRAY_WRITABLE + +cdef int ERROR_MALLOC +cdef int ERROR_INTERNAL +cdef int ERROR_INCORRECT_ORDER +cdef int ERROR_UNEXPECTED_STRIDES + +cdef Py_ssize_t shape_to_elem_count(int nd, Py_ssize_t *shape_arr) + +cdef int _from_input_shape_strides( + int nd, object shape, object strides, int itemsize, char order, + Py_ssize_t **shape_ptr, Py_ssize_t **strides_ptr, + Py_ssize_t *nelems, Py_ssize_t *min_disp, Py_ssize_t *max_disp, + int *contig +) + +cdef object _make_int_tuple(int nd, const Py_ssize_t *ary) + +cdef object _make_reversed_int_tuple(int nd, const Py_ssize_t *ary) + +cdef object _c_contig_strides(int nd, Py_ssize_t *shape) + +cdef object _f_contig_strides(int nd, Py_ssize_t *shape) + +cdef object _swap_last_two(tuple t) diff --git a/dpnp/tensor/_stride_utils.pxi b/dpnp/tensor/_stride_utils.pyx similarity index 97% rename from dpnp/tensor/_stride_utils.pxi rename to dpnp/tensor/_stride_utils.pyx index 3caf8dd8fd1f..0a6a1d6e5bbe 100644 --- a/dpnp/tensor/_stride_utils.pxi +++ b/dpnp/tensor/_stride_utils.pyx @@ -29,20 +29,20 @@ # distutils: language = c++ # cython: language_level=3 -from cpython.mem cimport PyMem_Malloc +from cpython.mem cimport PyMem_Free, PyMem_Malloc from cpython.ref cimport Py_INCREF from cpython.tuple cimport PyTuple_New, PyTuple_SetItem +cdef int USM_ARRAY_C_CONTIGUOUS = USM_ARRAY_C_CONTIGUOUS_VALUE +cdef int USM_ARRAY_F_CONTIGUOUS = USM_ARRAY_F_CONTIGUOUS_VALUE +cdef int USM_ARRAY_WRITABLE = USM_ARRAY_WRITABLE_VALUE + cdef int ERROR_MALLOC = 1 cdef int ERROR_INTERNAL = -1 cdef int ERROR_INCORRECT_ORDER = 2 cdef int ERROR_UNEXPECTED_STRIDES = 3 -cdef int USM_ARRAY_C_CONTIGUOUS = 1 -cdef int USM_ARRAY_F_CONTIGUOUS = 2 -cdef int USM_ARRAY_WRITABLE = 4 - cdef Py_ssize_t shape_to_elem_count(int nd, Py_ssize_t *shape_arr): """ diff --git a/dpnp/tensor/_types.pxd b/dpnp/tensor/_types.pxd new file mode 100644 index 000000000000..6d644bc21662 --- /dev/null +++ b/dpnp/tensor/_types.pxd @@ -0,0 +1,77 @@ +# ***************************************************************************** +# Copyright (c) 2026, Intel Corporation +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# - Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# - Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# - Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +# THE POSSIBILITY OF SUCH DAMAGE. +# ***************************************************************************** + +# distutils: language = c++ +# cython: language_level=3 + +cdef extern from "usm_ndarray_constants.h": + int UAR_BOOL_VALUE + int UAR_BYTE_VALUE + int UAR_UBYTE_VALUE + int UAR_SHORT_VALUE + int UAR_USHORT_VALUE + int UAR_INT_VALUE + int UAR_UINT_VALUE + int UAR_LONG_VALUE + int UAR_ULONG_VALUE + int UAR_LONGLONG_VALUE + int UAR_ULONGLONG_VALUE + int UAR_FLOAT_VALUE + int UAR_DOUBLE_VALUE + int UAR_CFLOAT_VALUE + int UAR_CDOUBLE_VALUE + int UAR_TYPE_SENTINEL_VALUE + int UAR_HALF_VALUE + +cdef int UAR_BOOL +cdef int UAR_BYTE +cdef int UAR_UBYTE +cdef int UAR_SHORT +cdef int UAR_USHORT +cdef int UAR_INT +cdef int UAR_UINT +cdef int UAR_LONG +cdef int UAR_ULONG +cdef int UAR_LONGLONG +cdef int UAR_ULONGLONG +cdef int UAR_FLOAT +cdef int UAR_DOUBLE +cdef int UAR_CFLOAT +cdef int UAR_CDOUBLE +cdef int UAR_TYPE_SENTINEL +cdef int UAR_HALF + +cdef int type_bytesize(int typenum) + +cdef str _make_typestr(int typenum) + +cdef int typenum_from_format(str s) + +cdef int descr_to_typenum(object dtype) + +cdef int dtype_to_typenum(dtype) diff --git a/dpnp/tensor/_types.pxi b/dpnp/tensor/_types.pyx similarity index 86% rename from dpnp/tensor/_types.pxi rename to dpnp/tensor/_types.pyx index 090750658f4b..5bda0a50f404 100644 --- a/dpnp/tensor/_types.pxi +++ b/dpnp/tensor/_types.pyx @@ -26,25 +26,30 @@ # THE POSSIBILITY OF SUCH DAMAGE. # ***************************************************************************** -# these typenum values are aligned to values in NumPy -cdef: - int UAR_BOOL = 0 # pragma: no cover - int UAR_BYTE = 1 # pragma: no cover - int UAR_UBYTE = 2 # pragma: no cover - int UAR_SHORT = 3 # pragma: no cover - int UAR_USHORT = 4 # pragma: no cover - int UAR_INT = 5 # pragma: no cover - int UAR_UINT = 6 # pragma: no cover - int UAR_LONG = 7 # pragma: no cover - int UAR_ULONG = 8 # pragma: no cover - int UAR_LONGLONG = 9 # pragma: no cover - int UAR_ULONGLONG = 10 # pragma: no cover - int UAR_FLOAT = 11 # pragma: no cover - int UAR_DOUBLE = 12 # pragma: no cover - int UAR_CFLOAT = 14 # pragma: no cover - int UAR_CDOUBLE = 15 # pragma: no cover - int UAR_TYPE_SENTINEL = 17 # pragma: no cover - int UAR_HALF = 23 # pragma: no cover +# distutils: language = c++ +# cython: language_level=3 + +import numpy as np + + +cdef int UAR_BOOL = UAR_BOOL_VALUE +cdef int UAR_BYTE = UAR_BYTE_VALUE +cdef int UAR_UBYTE = UAR_UBYTE_VALUE +cdef int UAR_SHORT = UAR_SHORT_VALUE +cdef int UAR_USHORT = UAR_USHORT_VALUE +cdef int UAR_INT = UAR_INT_VALUE +cdef int UAR_UINT = UAR_UINT_VALUE +cdef int UAR_LONG = UAR_LONG_VALUE +cdef int UAR_ULONG = UAR_ULONG_VALUE +cdef int UAR_LONGLONG = UAR_LONGLONG_VALUE +cdef int UAR_ULONGLONG = UAR_ULONGLONG_VALUE +cdef int UAR_FLOAT = UAR_FLOAT_VALUE +cdef int UAR_DOUBLE = UAR_DOUBLE_VALUE +cdef int UAR_CFLOAT = UAR_CFLOAT_VALUE +cdef int UAR_CDOUBLE = UAR_CDOUBLE_VALUE +cdef int UAR_TYPE_SENTINEL = UAR_TYPE_SENTINEL_VALUE +cdef int UAR_HALF = UAR_HALF_VALUE + cdef int type_bytesize(int typenum): """ diff --git a/dpnp/tensor/_usmarray.pxd b/dpnp/tensor/_usmarray.pxd index ccb8f4c796b7..4179f09ed451 100644 --- a/dpnp/tensor/_usmarray.pxd +++ b/dpnp/tensor/_usmarray.pxd @@ -32,6 +32,29 @@ cimport dpctl +cdef extern from "usm_ndarray_constants.h": + int USM_ARRAY_C_CONTIGUOUS_VALUE + int USM_ARRAY_F_CONTIGUOUS_VALUE + int USM_ARRAY_WRITABLE_VALUE + + int UAR_BOOL_VALUE + int UAR_BYTE_VALUE + int UAR_UBYTE_VALUE + int UAR_SHORT_VALUE + int UAR_USHORT_VALUE + int UAR_INT_VALUE + int UAR_UINT_VALUE + int UAR_LONG_VALUE + int UAR_ULONG_VALUE + int UAR_LONGLONG_VALUE + int UAR_ULONGLONG_VALUE + int UAR_FLOAT_VALUE + int UAR_DOUBLE_VALUE + int UAR_CFLOAT_VALUE + int UAR_CDOUBLE_VALUE + int UAR_TYPE_SENTINEL_VALUE + int UAR_HALF_VALUE + cdef public api int USM_ARRAY_C_CONTIGUOUS cdef public api int USM_ARRAY_F_CONTIGUOUS cdef public api int USM_ARRAY_WRITABLE diff --git a/dpnp/tensor/_usmarray.pyx b/dpnp/tensor/_usmarray.pyx index 7d90ffeb05a1..3344f757cf1a 100644 --- a/dpnp/tensor/_usmarray.pyx +++ b/dpnp/tensor/_usmarray.pyx @@ -46,7 +46,6 @@ from ._print import usm_ndarray_repr, usm_ndarray_str cimport dpctl as c_dpctl cimport dpctl.memory as c_dpmem from cpython.mem cimport PyMem_Free -from cpython.tuple cimport PyTuple_New, PyTuple_SetItem from . cimport _dlpack as c_dlpack @@ -56,9 +55,51 @@ from . import _flags from ._dlpack import get_build_dlpack_version from ._tensor_impl import default_device_fp_type -include "_stride_utils.pxi" -include "_types.pxi" -include "_slicing.pxi" +from ._slicing cimport _is_buffer + +from ._slicing import _basic_slice_meta + +from ._stride_utils cimport ( + ERROR_INCORRECT_ORDER, + ERROR_MALLOC, + ERROR_UNEXPECTED_STRIDES, + _c_contig_strides, + _f_contig_strides, + _from_input_shape_strides, + _make_int_tuple, + _make_reversed_int_tuple, + _swap_last_two, + shape_to_elem_count, +) +from ._types cimport ( + _make_typestr, + dtype_to_typenum, + type_bytesize, +) + + +# Public API constants initialized from usm_ndarray_constants.h +cdef int USM_ARRAY_C_CONTIGUOUS = USM_ARRAY_C_CONTIGUOUS_VALUE +cdef int USM_ARRAY_F_CONTIGUOUS = USM_ARRAY_F_CONTIGUOUS_VALUE +cdef int USM_ARRAY_WRITABLE = USM_ARRAY_WRITABLE_VALUE + +cdef int UAR_BOOL = UAR_BOOL_VALUE +cdef int UAR_BYTE = UAR_BYTE_VALUE +cdef int UAR_UBYTE = UAR_UBYTE_VALUE +cdef int UAR_SHORT = UAR_SHORT_VALUE +cdef int UAR_USHORT = UAR_USHORT_VALUE +cdef int UAR_INT = UAR_INT_VALUE +cdef int UAR_UINT = UAR_UINT_VALUE +cdef int UAR_LONG = UAR_LONG_VALUE +cdef int UAR_ULONG = UAR_ULONG_VALUE +cdef int UAR_LONGLONG = UAR_LONGLONG_VALUE +cdef int UAR_ULONGLONG = UAR_ULONGLONG_VALUE +cdef int UAR_FLOAT = UAR_FLOAT_VALUE +cdef int UAR_DOUBLE = UAR_DOUBLE_VALUE +cdef int UAR_CFLOAT = UAR_CFLOAT_VALUE +cdef int UAR_CDOUBLE = UAR_CDOUBLE_VALUE +cdef int UAR_TYPE_SENTINEL = UAR_TYPE_SENTINEL_VALUE +cdef int UAR_HALF = UAR_HALF_VALUE class DLDeviceType(IntEnum): diff --git a/dpnp/tensor/include/usm_ndarray_constants.h b/dpnp/tensor/include/usm_ndarray_constants.h new file mode 100644 index 000000000000..ebafeca57912 --- /dev/null +++ b/dpnp/tensor/include/usm_ndarray_constants.h @@ -0,0 +1,62 @@ +/* ***************************************************************************** + * Copyright (c) 2026, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * ****************************************************************************/ + +#ifndef DPNP_TENSOR_USM_NDARRAY_CONSTANTS_H +#define DPNP_TENSOR_USM_NDARRAY_CONSTANTS_H + +/* Array contiguity flags */ +enum +{ + USM_ARRAY_C_CONTIGUOUS_VALUE = 1, + USM_ARRAY_F_CONTIGUOUS_VALUE = 2, + USM_ARRAY_WRITABLE_VALUE = 4 +}; + +/* These typenum values are aligned to values in NumPy */ +enum +{ + UAR_BOOL_VALUE = 0, + UAR_BYTE_VALUE = 1, + UAR_UBYTE_VALUE = 2, + UAR_SHORT_VALUE = 3, + UAR_USHORT_VALUE = 4, + UAR_INT_VALUE = 5, + UAR_UINT_VALUE = 6, + UAR_LONG_VALUE = 7, + UAR_ULONG_VALUE = 8, + UAR_LONGLONG_VALUE = 9, + UAR_ULONGLONG_VALUE = 10, + UAR_FLOAT_VALUE = 11, + UAR_DOUBLE_VALUE = 12, + UAR_CFLOAT_VALUE = 14, + UAR_CDOUBLE_VALUE = 15, + UAR_TYPE_SENTINEL_VALUE = 17, + UAR_HALF_VALUE = 23 +}; + +#endif /* DPNP_TENSOR_USM_NDARRAY_CONSTANTS_H */ diff --git a/dpnp/tests/tensor/test_usm_ndarray_ctor.py b/dpnp/tests/tensor/test_usm_ndarray_ctor.py index 59cb370118d4..c98acabca929 100644 --- a/dpnp/tests/tensor/test_usm_ndarray_ctor.py +++ b/dpnp/tests/tensor/test_usm_ndarray_ctor.py @@ -599,77 +599,6 @@ def test_datapi_device(): X.device.print_device_info() -def _pyx_capi_int(X, pyx_capi_name, caps_name=b"int", val_restype=ctypes.c_int): - import sys - - mod = sys.modules[X.__class__.__module__] - cap = mod.__pyx_capi__.get(pyx_capi_name, None) - if cap is None: - raise ValueError( - "__pyx_capi__ does not export {} capsule".format(pyx_capi_name) - ) - # construct Python callable to invoke these functions - cap_ptr_fn = ctypes.pythonapi.PyCapsule_GetPointer - cap_ptr_fn.restype = ctypes.c_void_p - cap_ptr_fn.argtypes = [ctypes.py_object, ctypes.c_char_p] - cap_ptr = cap_ptr_fn(cap, caps_name) - val_ptr = ctypes.cast(cap_ptr, ctypes.POINTER(val_restype)) - return val_ptr.contents.value - - -def test_pyx_capi_check_constants(): - try: - X = dpt.usm_ndarray(17, dtype="i1")[1::2] - except dpctl.SyclDeviceCreationError: - pytest.skip("No SYCL devices available") - cc_flag = _pyx_capi_int(X, "USM_ARRAY_C_CONTIGUOUS") - assert cc_flag > 0 and 0 == (cc_flag & (cc_flag - 1)) - fc_flag = _pyx_capi_int(X, "USM_ARRAY_F_CONTIGUOUS") - assert fc_flag > 0 and 0 == (fc_flag & (fc_flag - 1)) - w_flag = _pyx_capi_int(X, "USM_ARRAY_WRITABLE") - assert w_flag > 0 and 0 == (w_flag & (w_flag - 1)) - - bool_typenum = _pyx_capi_int(X, "UAR_BOOL") - assert bool_typenum == dpt.dtype("bool_").num - - byte_typenum = _pyx_capi_int(X, "UAR_BYTE") - assert byte_typenum == dpt.dtype(np.byte).num - ubyte_typenum = _pyx_capi_int(X, "UAR_UBYTE") - assert ubyte_typenum == dpt.dtype(np.ubyte).num - - short_typenum = _pyx_capi_int(X, "UAR_SHORT") - assert short_typenum == dpt.dtype(np.short).num - ushort_typenum = _pyx_capi_int(X, "UAR_USHORT") - assert ushort_typenum == dpt.dtype(np.ushort).num - - int_typenum = _pyx_capi_int(X, "UAR_INT") - assert int_typenum == dpt.dtype(np.intc).num - uint_typenum = _pyx_capi_int(X, "UAR_UINT") - assert uint_typenum == dpt.dtype(np.uintc).num - - long_typenum = _pyx_capi_int(X, "UAR_LONG") - assert long_typenum == dpt.dtype("l").num - ulong_typenum = _pyx_capi_int(X, "UAR_ULONG") - assert ulong_typenum == dpt.dtype("L").num - - longlong_typenum = _pyx_capi_int(X, "UAR_LONGLONG") - assert longlong_typenum == dpt.dtype(np.longlong).num - ulonglong_typenum = _pyx_capi_int(X, "UAR_ULONGLONG") - assert ulonglong_typenum == dpt.dtype(np.ulonglong).num - - half_typenum = _pyx_capi_int(X, "UAR_HALF") - assert half_typenum == dpt.dtype(np.half).num - float_typenum = _pyx_capi_int(X, "UAR_FLOAT") - assert float_typenum == dpt.dtype(np.single).num - double_typenum = _pyx_capi_int(X, "UAR_DOUBLE") - assert double_typenum == dpt.dtype(np.double).num - - cfloat_typenum = _pyx_capi_int(X, "UAR_CFLOAT") - assert cfloat_typenum == dpt.dtype(np.csingle).num - cdouble_typenum = _pyx_capi_int(X, "UAR_CDOUBLE") - assert cdouble_typenum == dpt.dtype(np.cdouble).num - - @pytest.mark.parametrize( "shape", [(), (1,), (5,), (2, 3), (2, 3, 4), (2, 2, 2, 2, 2)] )