Skip to content

Commit f2b335d

Browse files
committed
Adds tests for in-place bitwise elementwise funcs
1 parent 0af493f commit f2b335d

File tree

5 files changed

+272
-0
lines changed

5 files changed

+272
-0
lines changed

dpctl/tests/elementwise/test_bitwise_and.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import pytest
1919

2020
import dpctl.tensor as dpt
21+
from dpctl.tensor._type_utils import _can_cast
2122
from dpctl.tests.helper import get_queue_or_skip, skip_if_dtype_not_supported
2223

2324
from .utils import _integral_dtypes
@@ -85,3 +86,58 @@ def test_bitwise_and_bool():
8586
r_lo = dpt.logical_and(x1[:, dpt.newaxis], x2[dpt.newaxis])
8687

8788
assert dpt.all(dpt.equal(r_bw, r_lo))
89+
90+
91+
@pytest.mark.parametrize("dtype", ["?"] + _integral_dtypes)
92+
def test_bitwise_and_inplace_python_scalar(dtype):
93+
q = get_queue_or_skip()
94+
skip_if_dtype_not_supported(dtype, q)
95+
X = dpt.zeros((10, 10), dtype=dtype, sycl_queue=q)
96+
dt_kind = X.dtype.kind
97+
if dt_kind == "b":
98+
X &= False
99+
else:
100+
X &= int(0)
101+
102+
103+
@pytest.mark.parametrize("op1_dtype", ["?"] + _integral_dtypes)
104+
@pytest.mark.parametrize("op2_dtype", ["?"] + _integral_dtypes)
105+
def test_bitwise_and_inplace_dtype_matrix(op1_dtype, op2_dtype):
106+
q = get_queue_or_skip()
107+
skip_if_dtype_not_supported(op1_dtype, q)
108+
skip_if_dtype_not_supported(op2_dtype, q)
109+
110+
sz = 127
111+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
112+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
113+
114+
dev = q.sycl_device
115+
_fp16 = dev.has_aspect_fp16
116+
_fp64 = dev.has_aspect_fp64
117+
if _can_cast(ar2.dtype, ar1.dtype, _fp16, _fp64):
118+
ar1 &= ar2
119+
assert dpt.all(ar1 == 1)
120+
121+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
122+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
123+
ar3 &= ar4
124+
assert dpt.all(ar3 == 1)
125+
else:
126+
with pytest.raises(TypeError):
127+
ar1 &= ar2
128+
dpt.bitwise_and(ar1, ar2, out=ar1)
129+
130+
# out is second arg
131+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
132+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
133+
if _can_cast(ar1.dtype, ar2.dtype, _fp16, _fp64):
134+
dpt.bitwise_and(ar1, ar2, out=ar2)
135+
assert dpt.all(ar2 == 1)
136+
137+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
138+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
139+
dpt.bitwise_and(ar3, ar4, out=ar4)
140+
dpt.all(ar4 == 1)
141+
else:
142+
with pytest.raises(TypeError):
143+
dpt.bitwise_and(ar1, ar2, out=ar2)

dpctl/tests/elementwise/test_bitwise_left_shift.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import pytest
1919

2020
import dpctl.tensor as dpt
21+
from dpctl.tensor._type_utils import _can_cast
2122
from dpctl.tests.helper import get_queue_or_skip, skip_if_dtype_not_supported
2223

2324
from .utils import _integral_dtypes
@@ -97,3 +98,54 @@ def test_bitwise_left_shift_range(op_dtype):
9798

9899
z = dpt.bitwise_left_shift(x, y)
99100
assert dpt.all(dpt.equal(z, 0))
101+
102+
103+
@pytest.mark.parametrize("dtype", _integral_dtypes)
104+
def test_bitwise_left_shift_inplace_python_scalar(dtype):
105+
q = get_queue_or_skip()
106+
skip_if_dtype_not_supported(dtype, q)
107+
X = dpt.zeros((10, 10), dtype=dtype, sycl_queue=q)
108+
X <<= int(0)
109+
110+
111+
@pytest.mark.parametrize("op1_dtype", _integral_dtypes)
112+
@pytest.mark.parametrize("op2_dtype", _integral_dtypes)
113+
def test_bitwise_left_shift_inplace_dtype_matrix(op1_dtype, op2_dtype):
114+
q = get_queue_or_skip()
115+
skip_if_dtype_not_supported(op1_dtype, q)
116+
skip_if_dtype_not_supported(op2_dtype, q)
117+
118+
sz = 127
119+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
120+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
121+
122+
dev = q.sycl_device
123+
_fp16 = dev.has_aspect_fp16
124+
_fp64 = dev.has_aspect_fp64
125+
if _can_cast(ar2.dtype, ar1.dtype, _fp16, _fp64):
126+
ar1 <<= ar2
127+
assert dpt.all(ar1 == 2)
128+
129+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
130+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
131+
ar3 <<= ar4
132+
assert dpt.all(ar3 == 2)
133+
else:
134+
with pytest.raises(TypeError):
135+
ar1 <<= ar2
136+
dpt.bitwise_left_shift(ar1, ar2, out=ar1)
137+
138+
# out is second arg
139+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
140+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
141+
if _can_cast(ar1.dtype, ar2.dtype, _fp16, _fp64):
142+
dpt.bitwise_left_shift(ar1, ar2, out=ar2)
143+
assert dpt.all(ar2 == 2)
144+
145+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
146+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
147+
dpt.bitwise_left_shift(ar3, ar4, out=ar4)
148+
dpt.all(ar4 == 2)
149+
else:
150+
with pytest.raises(TypeError):
151+
dpt.bitwise_left_shift(ar1, ar2, out=ar2)

dpctl/tests/elementwise/test_bitwise_or.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import pytest
1919

2020
import dpctl.tensor as dpt
21+
from dpctl.tensor._type_utils import _can_cast
2122
from dpctl.tests.helper import get_queue_or_skip, skip_if_dtype_not_supported
2223

2324
from .utils import _integral_dtypes
@@ -85,3 +86,58 @@ def test_bitwise_or_bool():
8586
r_lo = dpt.logical_or(x1[:, dpt.newaxis], x2[dpt.newaxis])
8687

8788
assert dpt.all(dpt.equal(r_bw, r_lo))
89+
90+
91+
@pytest.mark.parametrize("dtype", ["?"] + _integral_dtypes)
92+
def test_bitwise_or_inplace_python_scalar(dtype):
93+
q = get_queue_or_skip()
94+
skip_if_dtype_not_supported(dtype, q)
95+
X = dpt.zeros((10, 10), dtype=dtype, sycl_queue=q)
96+
dt_kind = X.dtype.kind
97+
if dt_kind == "b":
98+
X |= False
99+
else:
100+
X |= int(0)
101+
102+
103+
@pytest.mark.parametrize("op1_dtype", ["?"] + _integral_dtypes)
104+
@pytest.mark.parametrize("op2_dtype", ["?"] + _integral_dtypes)
105+
def test_bitwise_or_inplace_dtype_matrix(op1_dtype, op2_dtype):
106+
q = get_queue_or_skip()
107+
skip_if_dtype_not_supported(op1_dtype, q)
108+
skip_if_dtype_not_supported(op2_dtype, q)
109+
110+
sz = 127
111+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
112+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
113+
114+
dev = q.sycl_device
115+
_fp16 = dev.has_aspect_fp16
116+
_fp64 = dev.has_aspect_fp64
117+
if _can_cast(ar2.dtype, ar1.dtype, _fp16, _fp64):
118+
ar1 |= ar2
119+
assert dpt.all(ar1 == 1)
120+
121+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
122+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
123+
ar3 |= ar4
124+
assert dpt.all(ar3 == 1)
125+
else:
126+
with pytest.raises(TypeError):
127+
ar1 |= ar2
128+
dpt.bitwise_or(ar1, ar2, out=ar1)
129+
130+
# out is second arg
131+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
132+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
133+
if _can_cast(ar1.dtype, ar2.dtype, _fp16, _fp64):
134+
dpt.bitwise_or(ar1, ar2, out=ar2)
135+
assert dpt.all(ar2 == 1)
136+
137+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
138+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
139+
dpt.bitwise_or(ar3, ar4, out=ar4)
140+
dpt.all(ar4 == 1)
141+
else:
142+
with pytest.raises(TypeError):
143+
dpt.bitwise_or(ar1, ar2, out=ar2)

dpctl/tests/elementwise/test_bitwise_right_shift.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import pytest
1919

2020
import dpctl.tensor as dpt
21+
from dpctl.tensor._type_utils import _can_cast
2122
from dpctl.tests.helper import get_queue_or_skip, skip_if_dtype_not_supported
2223

2324
from .utils import _integral_dtypes
@@ -97,3 +98,54 @@ def test_bitwise_right_shift_range(op_dtype):
9798

9899
z = dpt.bitwise_right_shift(x, y)
99100
assert dpt.all(dpt.equal(z, 0))
101+
102+
103+
@pytest.mark.parametrize("dtype", _integral_dtypes)
104+
def test_bitwise_right_shift_inplace_python_scalar(dtype):
105+
q = get_queue_or_skip()
106+
skip_if_dtype_not_supported(dtype, q)
107+
X = dpt.zeros((10, 10), dtype=dtype, sycl_queue=q)
108+
X >>= int(0)
109+
110+
111+
@pytest.mark.parametrize("op1_dtype", _integral_dtypes)
112+
@pytest.mark.parametrize("op2_dtype", _integral_dtypes)
113+
def test_bitwise_right_shift_inplace_dtype_matrix(op1_dtype, op2_dtype):
114+
q = get_queue_or_skip()
115+
skip_if_dtype_not_supported(op1_dtype, q)
116+
skip_if_dtype_not_supported(op2_dtype, q)
117+
118+
sz = 127
119+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
120+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
121+
122+
dev = q.sycl_device
123+
_fp16 = dev.has_aspect_fp16
124+
_fp64 = dev.has_aspect_fp64
125+
if _can_cast(ar2.dtype, ar1.dtype, _fp16, _fp64):
126+
ar1 >>= ar2
127+
assert dpt.all(ar1 == 0)
128+
129+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
130+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
131+
ar3 >>= ar4
132+
assert dpt.all(ar3 == 0)
133+
else:
134+
with pytest.raises(TypeError):
135+
ar1 >>= ar2
136+
dpt.bitwise_right_shift(ar1, ar2, out=ar1)
137+
138+
# out is second arg
139+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
140+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
141+
if _can_cast(ar1.dtype, ar2.dtype, _fp16, _fp64):
142+
dpt.bitwise_right_shift(ar1, ar2, out=ar2)
143+
assert dpt.all(ar2 == 0)
144+
145+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
146+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
147+
dpt.bitwise_right_shift(ar3, ar4, out=ar4)
148+
dpt.all(ar4 == 0)
149+
else:
150+
with pytest.raises(TypeError):
151+
dpt.bitwise_right_shift(ar1, ar2, out=ar2)

dpctl/tests/elementwise/test_bitwise_xor.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import pytest
1919

2020
import dpctl.tensor as dpt
21+
from dpctl.tensor._type_utils import _can_cast
2122
from dpctl.tests.helper import get_queue_or_skip, skip_if_dtype_not_supported
2223

2324
from .utils import _integral_dtypes
@@ -85,3 +86,58 @@ def test_bitwise_xor_bool():
8586
r_lo = dpt.logical_xor(x1[:, dpt.newaxis], x2[dpt.newaxis])
8687

8788
assert dpt.all(dpt.equal(r_bw, r_lo))
89+
90+
91+
@pytest.mark.parametrize("dtype", ["?"] + _integral_dtypes)
92+
def test_bitwise_xor_inplace_python_scalar(dtype):
93+
q = get_queue_or_skip()
94+
skip_if_dtype_not_supported(dtype, q)
95+
X = dpt.zeros((10, 10), dtype=dtype, sycl_queue=q)
96+
dt_kind = X.dtype.kind
97+
if dt_kind == "b":
98+
X ^= False
99+
else:
100+
X ^= int(0)
101+
102+
103+
@pytest.mark.parametrize("op1_dtype", ["?"] + _integral_dtypes)
104+
@pytest.mark.parametrize("op2_dtype", ["?"] + _integral_dtypes)
105+
def test_bitwise_xor_inplace_dtype_matrix(op1_dtype, op2_dtype):
106+
q = get_queue_or_skip()
107+
skip_if_dtype_not_supported(op1_dtype, q)
108+
skip_if_dtype_not_supported(op2_dtype, q)
109+
110+
sz = 127
111+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
112+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
113+
114+
dev = q.sycl_device
115+
_fp16 = dev.has_aspect_fp16
116+
_fp64 = dev.has_aspect_fp64
117+
if _can_cast(ar2.dtype, ar1.dtype, _fp16, _fp64):
118+
ar1 ^= ar2
119+
assert dpt.all(ar1 == 0)
120+
121+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
122+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
123+
ar3 ^= ar4
124+
assert dpt.all(ar3 == 0)
125+
else:
126+
with pytest.raises(TypeError):
127+
ar1 ^= ar2
128+
dpt.bitwise_xor(ar1, ar2, out=ar1)
129+
130+
# out is second arg
131+
ar1 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)
132+
ar2 = dpt.ones_like(ar1, dtype=op2_dtype, sycl_queue=q)
133+
if _can_cast(ar1.dtype, ar2.dtype, _fp16, _fp64):
134+
dpt.bitwise_xor(ar1, ar2, out=ar2)
135+
assert dpt.all(ar2 == 0)
136+
137+
ar3 = dpt.ones(sz, dtype=op1_dtype, sycl_queue=q)[::-1]
138+
ar4 = dpt.ones(2 * sz, dtype=op2_dtype, sycl_queue=q)[::2]
139+
dpt.bitwise_xor(ar3, ar4, out=ar4)
140+
dpt.all(ar4 == 0)
141+
else:
142+
with pytest.raises(TypeError):
143+
dpt.bitwise_xor(ar1, ar2, out=ar2)

0 commit comments

Comments
 (0)