Skip to content

Commit 6aa09aa

Browse files
authored
Merge 9cdf55d into eb9a6c0
2 parents eb9a6c0 + 9cdf55d commit 6aa09aa

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

dpnp/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,13 @@
5454
from dpnp.dpnp_iface_types import *
5555
from dpnp.dpnp_iface import *
5656
from dpnp.dpnp_iface import __all__ as _iface__all__
57+
from dpnp.dpnp_iface_utils import *
58+
from dpnp.dpnp_iface_utils import __all__ as _ifaceutils__all__
5759
from dpnp._version import get_versions
5860

5961
__all__ = _iface__all__
62+
__all__ += _ifaceutils__all__
63+
6064

6165
__version__ = get_versions()["version"]
6266
del get_versions

dpnp/dpnp_iface_utils.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# -*- coding: utf-8 -*-
2+
# *****************************************************************************
3+
# Copyright (c) 2016-2024, Intel Corporation
4+
# All rights reserved.
5+
#
6+
# Redistribution and use in source and binary forms, with or without
7+
# modification, are permitted provided that the following conditions are met:
8+
# - Redistributions of source code must retain the above copyright notice,
9+
# this list of conditions and the following disclaimer.
10+
# - Redistributions in binary form must reproduce the above copyright notice,
11+
# this list of conditions and the following disclaimer in the documentation
12+
# and/or other materials provided with the distribution.
13+
#
14+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
18+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24+
# THE POSSIBILITY OF SUCH DAMAGE.
25+
# *****************************************************************************
26+
27+
"""
28+
Interface of the utils function of the DPNP
29+
30+
Notes
31+
-----
32+
This module is a face or public interface file for the library
33+
34+
"""
35+
36+
import dpnp
37+
38+
__all__ = ["byte_bounds"]
39+
40+
41+
def byte_bounds(a):
42+
"""
43+
Returns a 2-tuple with pointers to the end-points of the array.
44+
45+
For full documentation refer to
46+
:obj:`dpctl.tensor.usm_ndarray._byte_bounds`.
47+
48+
Parameters
49+
----------
50+
a : usm_ndarray
51+
Input array
52+
53+
Returns
54+
-------
55+
(beg, end) : tuple of 2 integers
56+
The first integer is the first byte of the array, the second
57+
integer is just past the last byte of the array
58+
59+
Examples
60+
--------
61+
>>> import dpnp as np
62+
>>> x = np.ones((3, 10, 7))
63+
>>> y = np.flip(x[:, 1::2], axis=1)
64+
>>> beg_p, end_p = np.byte_bounds(y)
65+
Bytes taken to store this array
66+
>>> bytes_extent = end_p - beg_p
67+
68+
"""
69+
70+
return dpnp.get_usm_ndarray(a)._byte_bounds

tests/test_usm_utils.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import dpctl.tensor as dpt
2+
from numpy.testing import assert_equal
3+
4+
import dpnp
5+
6+
7+
def test_byte_bounds():
8+
a = dpt.usm_ndarray((3, 4), dtype="int64", buffer="shared")
9+
values = dpt.arange(12, dtype="int64")
10+
for i in range(3):
11+
a[i, :] = values[i * 4 : (i + 1) * 4]
12+
low, high = dpnp.byte_bounds(a)
13+
assert_equal(high - low, a.size * a.itemsize)
14+
15+
16+
def test_unusual_order_positive_stride():
17+
a = dpt.usm_ndarray((3, 4), dtype="int64", buffer="shared")
18+
values = dpt.arange(12, dtype="int64")
19+
for i in range(3):
20+
a[i, :] = values[i * 4 : (i + 1) * 4]
21+
b = a.T
22+
low, high = dpnp.byte_bounds(b)
23+
assert_equal(high - low, b.size * b.itemsize)
24+
25+
26+
def test_unusual_order_negative_stride():
27+
a = dpt.usm_ndarray((3, 4), dtype="int64", buffer="shared")
28+
values = dpt.arange(12, dtype="int64")
29+
for i in range(3):
30+
a[i, :] = values[i * 4 : (i + 1) * 4]
31+
b = a.T[::-1]
32+
low, high = dpnp.byte_bounds(b)
33+
assert_equal(high - low, b.size * b.itemsize)
34+
35+
36+
def test_strided():
37+
a = dpt.usm_ndarray(12, dtype="int64", buffer="shared")
38+
a[:] = dpt.arange(12, dtype="int64")
39+
b = a[::2]
40+
low, high = dpnp.byte_bounds(b)
41+
expected_byte_diff = b.size * 2 * b.itemsize - b.itemsize
42+
assert_equal(high - low, expected_byte_diff)

0 commit comments

Comments
 (0)