Skip to content

Commit 121f819

Browse files
committed
add new tests to improve coverage
1 parent 21e1415 commit 121f819

File tree

6 files changed

+87
-141
lines changed

6 files changed

+87
-141
lines changed

dpctl/tensor/_elementwise_common.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ def __call__(self, x, out=None, order="K"):
9393
else:
9494
if res_dt != out.dtype:
9595
raise TypeError(
96-
f"Expected output array of type {res_dt} is supported"
97-
f", got {out.dtype}"
96+
f"Output array of type {res_dt} is needed,"
97+
f" got {out.dtype}"
9898
)
9999

100100
ht, _ = self.unary_fn_(x, out, sycl_queue=exec_q)
@@ -119,8 +119,7 @@ def __call__(self, x, out=None, order="K"):
119119
else:
120120
if buf_dt != out.dtype:
121121
raise TypeError(
122-
f"Expected output array of type {buf_dt} is supported,"
123-
f"got {out.dtype}"
122+
f"Output array of type {buf_dt} is needed, got {out.dtype}"
124123
)
125124

126125
ht, _ = self.unary_fn_(buf, out, sycl_queue=exec_q, depends=[copy_ev])

dpctl/tests/elementwise/test_abs.py

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,17 @@ def test_abs_out_type(dtype):
2222
np.dtype("c16"): np.dtype("f8"),
2323
}
2424
assert dpt.abs(X).dtype == type_map[arg_dt]
25+
26+
out = dpt.empty_like(X, dtype=type_map[arg_dt])
27+
dpt.abs(X, out)
28+
assert np.allclose(dpt.asnumpy(out), dpt.asnumpy(dpt.abs(X)))
2529
else:
2630
assert dpt.abs(X).dtype == arg_dt
2731

32+
out = dpt.empty_like(X, dtype=arg_dt)
33+
dpt.abs(X, out)
34+
assert np.allclose(dpt.asnumpy(out), dpt.asnumpy(dpt.abs(X)))
35+
2836

2937
@pytest.mark.parametrize("usm_type", _usm_types)
3038
def test_abs_usm_type(usm_type):
@@ -89,20 +97,3 @@ def test_abs_complex(dtype):
8997
np.testing.assert_allclose(
9098
dpt.asnumpy(Y), expected_Y, atol=tol, rtol=tol
9199
)
92-
93-
94-
@pytest.mark.parametrize("dtype", _all_dtypes[:-2])
95-
def test_abs_out_keyword(dtype):
96-
q = get_queue_or_skip()
97-
skip_if_dtype_not_supported(dtype, q)
98-
99-
arg_dt = np.dtype(dtype)
100-
input_shape = (10, 10, 10, 10)
101-
X = dpt.empty(input_shape, dtype=arg_dt, sycl_queue=q)
102-
X[..., 0::2] = 1
103-
X[..., 1::2] = 0
104-
Y = dpt.empty_like(X, dtype=arg_dt)
105-
dpt.abs(X, Y)
106-
107-
expected_Y = dpt.asnumpy(X)
108-
assert np.allclose(dpt.asnumpy(Y), expected_Y)

dpctl/tests/elementwise/test_add.py

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import dpctl
88
import dpctl.tensor as dpt
99
from dpctl.tests.helper import get_queue_or_skip, skip_if_dtype_not_supported
10+
from dpctl.utils import ExecutionPlacementError
1011

1112
from .utils import _all_dtypes, _compare_dtypes, _usm_types
1213

@@ -32,6 +33,10 @@ def test_add_dtype_matrix(op1_dtype, op2_dtype):
3233
assert (dpt.asnumpy(r) == np.full(r.shape, 2, dtype=r.dtype)).all()
3334
assert r.sycl_queue == ar1.sycl_queue
3435

36+
out = dpt.empty_like(ar1, dtype=expected_dtype)
37+
dpt.add(ar1, ar2, out)
38+
assert (dpt.asnumpy(out) == np.full(out.shape, 2, dtype=out.dtype)).all()
39+
3540
ar3 = dpt.ones(sz, dtype=op1_dtype)
3641
ar4 = dpt.ones(2 * sz, dtype=op2_dtype)
3742

@@ -44,6 +49,10 @@ def test_add_dtype_matrix(op1_dtype, op2_dtype):
4449
assert r.shape == ar3.shape
4550
assert (dpt.asnumpy(r) == np.full(r.shape, 2, dtype=r.dtype)).all()
4651

52+
out = dpt.empty_like(ar1, dtype=expected_dtype)
53+
dpt.add(ar3[::-1], ar4[::2], out)
54+
assert (dpt.asnumpy(out) == np.full(out.shape, 2, dtype=out.dtype)).all()
55+
4756

4857
@pytest.mark.parametrize("op1_usm_type", _usm_types)
4958
@pytest.mark.parametrize("op2_usm_type", _usm_types)
@@ -105,7 +114,6 @@ def test_add_broadcasting():
105114
v = dpt.arange(5, dtype="i4")
106115

107116
r = dpt.add(m, v)
108-
109117
assert (dpt.asnumpy(r) == np.arange(1, 6, dtype="i4")[np.newaxis, :]).all()
110118

111119
r2 = dpt.add(v, m)
@@ -180,26 +188,8 @@ def __sycl_usm_array_interface__(self):
180188
dpt.add(a, c)
181189

182190

183-
@pytest.mark.parametrize("op1_dtype", _all_dtypes)
184-
@pytest.mark.parametrize("op2_dtype", _all_dtypes)
185-
def test_add_dtype_out_keyword(op1_dtype, op2_dtype):
186-
q = get_queue_or_skip()
187-
skip_if_dtype_not_supported(op1_dtype, q)
188-
skip_if_dtype_not_supported(op2_dtype, q)
189-
190-
sz = 127
191-
ar1 = dpt.ones(sz, dtype=op1_dtype)
192-
ar2 = dpt.ones_like(ar1, dtype=op2_dtype)
193-
194-
r = dpt.add(ar1, ar2)
195-
196-
y = dpt.zeros_like(ar1, dtype=r.dtype)
197-
dpt.add(ar1, ar2, y)
198-
199-
assert np.array_equal(dpt.asnumpy(r), dpt.asnumpy(y))
200-
201-
202191
def test_add_errors():
192+
get_queue_or_skip()
203193
try:
204194
gpu_queue = dpctl.SyclQueue("gpu")
205195
except dpctl.SyclQueueCreationError:
@@ -245,11 +235,14 @@ def test_add_errors():
245235
y,
246236
)
247237

248-
ar1 = dpt.ones(2, dtype="float32")
249-
ar2 = dpt.ones_like(ar1, dtype="int32")
250-
y = dpt.empty_like(ar1, dtype="int32")
238+
ar1 = np.ones(2, dtype="float32")
239+
ar2 = np.ones_like(ar1, dtype="int32")
251240
assert_raises_regex(
252-
TypeError, "Output array of type.*is needed", dpt.add, ar1, ar2, y
241+
ExecutionPlacementError,
242+
"Execution placement can not be unambiguously inferred.*",
243+
dpt.add,
244+
ar1,
245+
ar2,
253246
)
254247

255248
ar1 = dpt.ones(2, dtype="float32")
@@ -263,3 +256,19 @@ def test_add_errors():
263256
ar2,
264257
y,
265258
)
259+
260+
261+
@pytest.mark.parametrize("dtype", _all_dtypes)
262+
def test_add_dtype_error(
263+
dtype,
264+
):
265+
q = get_queue_or_skip()
266+
skip_if_dtype_not_supported(dtype, q)
267+
268+
ar1 = dpt.ones(5, dtype=dtype)
269+
ar2 = dpt.ones_like(ar1, dtype="f8")
270+
271+
y = dpt.zeros_like(ar1, dtype="int8")
272+
assert_raises_regex(
273+
TypeError, "Output array of type.*is needed", dpt.add, ar1, ar2, y
274+
)

dpctl/tests/elementwise/test_cos.py

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ def test_cos_out_type(dtype):
2121
expected_dtype = _map_to_device_dtype(expected_dtype, q.sycl_device)
2222
assert dpt.cos(X).dtype == expected_dtype
2323

24+
X = dpt.asarray(0, dtype=dtype, sycl_queue=q)
25+
expected_dtype = np.cos(np.array(0, dtype=dtype)).dtype
26+
expected_dtype = _map_to_device_dtype(expected_dtype, q.sycl_device)
27+
Y = dpt.empty_like(X, dtype=expected_dtype)
28+
dpt.cos(X, Y)
29+
np.testing.assert_allclose(dpt.asnumpy(dpt.cos(X)), dpt.asnumpy(Y))
30+
2431

2532
@pytest.mark.parametrize("dtype", ["f2", "f4", "f8", "c8", "c16"])
2633
def test_cos_output(dtype):
@@ -40,6 +47,13 @@ def test_cos_output(dtype):
4047
dpt.asnumpy(Y), np.repeat(np.cos(Xnp), n_rep), atol=tol, rtol=tol
4148
)
4249

50+
Z = dpt.empty_like(X, dtype=dtype)
51+
dpt.cos(X, Z)
52+
53+
np.testing.assert_allclose(
54+
dpt.asnumpy(Z), np.repeat(np.cos(Xnp), n_rep), atol=tol, rtol=tol
55+
)
56+
4357

4458
@pytest.mark.parametrize("usm_type", ["device", "shared", "host"])
4559
def test_cos_usm_type(usm_type):
@@ -89,27 +103,8 @@ def test_cos_order(dtype):
89103
)
90104

91105

92-
@pytest.mark.parametrize("dtype", ["f2", "f4", "f8", "c8", "c16"])
93-
def test_cos_out_keyword(dtype):
94-
q = get_queue_or_skip()
95-
skip_if_dtype_not_supported(dtype, q)
96-
97-
n_seq = 100
98-
n_rep = 137
99-
100-
Xnp = np.linspace(-np.pi / 4, np.pi / 4, num=n_seq, dtype=dtype)
101-
X = dpt.asarray(np.repeat(Xnp, n_rep), dtype=dtype, sycl_queue=q)
102-
Y = dpt.empty_like(X, dtype=dtype)
103-
104-
dpt.cos(X, Y)
105-
tol = 8 * dpt.finfo(Y.dtype).resolution
106-
107-
np.testing.assert_allclose(
108-
dpt.asnumpy(Y), np.repeat(np.cos(Xnp), n_rep), atol=tol, rtol=tol
109-
)
110-
111-
112106
def test_cos_errors():
107+
get_queue_or_skip()
113108
try:
114109
gpu_queue = dpctl.SyclQueue("gpu")
115110
except dpctl.SyclQueueCreationError:
@@ -145,14 +140,20 @@ def test_cos_errors():
145140
TypeError, "Input and output arrays have memory overlap", dpt.cos, x, y
146141
)
147142

148-
x = dpt.zeros(2, dtype="int32")
149-
y = dpt.empty_like(x, dtype="int32")
150-
assert_raises_regex(
151-
TypeError, "Expected output array of type.*is supported", dpt.cos, x, y
152-
)
153-
154143
x = dpt.zeros(2, dtype="float32")
155144
y = np.empty_like(x)
156145
assert_raises_regex(
157146
TypeError, "output array must be of usm_ndarray type", dpt.cos, x, y
158147
)
148+
149+
150+
@pytest.mark.parametrize("dtype", _all_dtypes)
151+
def test_cos_error_dtype(dtype):
152+
q = get_queue_or_skip()
153+
skip_if_dtype_not_supported(dtype, q)
154+
155+
x = dpt.zeros(5, dtype=dtype)
156+
y = dpt.empty_like(x, dtype="int16")
157+
assert_raises_regex(
158+
TypeError, "Output array of type.*is needed", dpt.cos, x, y
159+
)

dpctl/tests/elementwise/test_isfinite.py

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ def test_isfinite_complex(dtype):
4141
Y = dpt.asarray(Ynp, sycl_queue=q)
4242
assert np.array_equal(dpt.asnumpy(dpt.isfinite(Y)), np.isfinite(Ynp))
4343

44+
out = dpt.empty_like(Y, dtype="bool")
45+
dpt.isfinite(Y, out)
46+
assert np.array_equal(dpt.asnumpy(out)[()], np.isfinite(Ynp))
47+
4448

4549
@pytest.mark.parametrize("dtype", ["f2", "f4", "f8"])
4650
def test_isfinite_floats(dtype):
@@ -56,6 +60,10 @@ def test_isfinite_floats(dtype):
5660
Y = dpt.asarray(Ynp, sycl_queue=q)
5761
assert np.array_equal(dpt.asnumpy(dpt.isfinite(Y)), np.isfinite(Ynp))
5862

63+
out = dpt.empty_like(Y, dtype="bool")
64+
dpt.isfinite(Y, out)
65+
assert np.array_equal(dpt.asnumpy(out)[()], np.isfinite(Ynp))
66+
5967

6068
@pytest.mark.parametrize("dtype", _all_dtypes)
6169
def test_isfinite_order(dtype):
@@ -72,38 +80,3 @@ def test_isfinite_order(dtype):
7280
Y = dpt.isfinite(U, order=ord)
7381
expected_Y = np.full(Y.shape, True, dtype=Y.dtype)
7482
assert np.allclose(dpt.asnumpy(Y), expected_Y)
75-
76-
77-
@pytest.mark.parametrize("dtype", ["c8", "c16"])
78-
def test_isnan_complex_out_keyword(dtype):
79-
q = get_queue_or_skip()
80-
skip_if_dtype_not_supported(dtype, q)
81-
82-
y1 = complex(np.nan, np.nan)
83-
y2 = complex(1, np.nan)
84-
y3 = complex(np.nan, 1)
85-
y4 = complex(2, 1)
86-
y5 = complex(np.inf, 1)
87-
88-
Ynp = np.repeat(np.array([y1, y2, y3, y4, y5], dtype=dtype), 12)
89-
Y = dpt.asarray(Ynp, sycl_queue=q)
90-
out = dpt.empty_like(Y, dtype="bool")
91-
dpt.isfinite(Y, out)
92-
assert np.array_equal(dpt.asnumpy(out)[()], np.isfinite(Ynp))
93-
94-
95-
@pytest.mark.parametrize("dtype", ["f2", "f4", "f8"])
96-
def test_isfinite_floats_out_keyword(dtype):
97-
q = get_queue_or_skip()
98-
skip_if_dtype_not_supported(dtype, q)
99-
100-
y1 = np.nan
101-
y2 = 1
102-
y3 = np.inf
103-
104-
for mult in [123, 137, 255, 271, 272]:
105-
Ynp = np.repeat(np.array([y1, y2, y3], dtype=dtype), mult)
106-
Y = dpt.asarray(Ynp, sycl_queue=q)
107-
out = dpt.empty_like(Y, dtype="bool")
108-
dpt.isfinite(Y, out)
109-
assert np.array_equal(dpt.asnumpy(out)[()], np.isfinite(Ynp))

dpctl/tests/elementwise/test_isnan.py

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ def test_isnan_complex(dtype):
4141
Y = dpt.asarray(Ynp, sycl_queue=q)
4242
assert np.array_equal(dpt.asnumpy(dpt.isnan(Y)), np.isnan(Ynp))
4343

44+
out = dpt.empty_like(Y, dtype="bool")
45+
dpt.isnan(Y, out)
46+
assert np.array_equal(dpt.asnumpy(out)[()], np.isnan(Ynp))
47+
4448

4549
@pytest.mark.parametrize("dtype", ["f2", "f4", "f8"])
4650
def test_isnan_floats(dtype):
@@ -56,6 +60,10 @@ def test_isnan_floats(dtype):
5660
Y = dpt.asarray(Ynp, sycl_queue=q)
5761
assert np.array_equal(dpt.asnumpy(dpt.isnan(Y)), np.isnan(Ynp))
5862

63+
out = dpt.empty_like(Y, dtype="bool")
64+
dpt.isnan(Y, out)
65+
assert np.array_equal(dpt.asnumpy(out)[()], np.isnan(Ynp))
66+
5967

6068
@pytest.mark.parametrize("dtype", _all_dtypes)
6169
def test_isnan_order(dtype):
@@ -72,38 +80,3 @@ def test_isnan_order(dtype):
7280
Y = dpt.isnan(U, order=ord)
7381
expected_Y = np.full(Y.shape, False, dtype=Y.dtype)
7482
assert np.allclose(dpt.asnumpy(Y), expected_Y)
75-
76-
77-
@pytest.mark.parametrize("dtype", ["c8", "c16"])
78-
def test_isnan_complex_out_keyword(dtype):
79-
q = get_queue_or_skip()
80-
skip_if_dtype_not_supported(dtype, q)
81-
82-
y1 = complex(np.nan, np.nan)
83-
y2 = complex(1, np.nan)
84-
y3 = complex(np.nan, 1)
85-
y4 = complex(2, 1)
86-
y5 = complex(np.inf, 1)
87-
88-
Ynp = np.repeat(np.array([y1, y2, y3, y4, y5], dtype=dtype), 123)
89-
Y = dpt.asarray(Ynp, sycl_queue=q)
90-
out = dpt.empty_like(Y, dtype="bool")
91-
dpt.isnan(Y, out)
92-
assert np.array_equal(dpt.asnumpy(out)[()], np.isnan(Ynp))
93-
94-
95-
@pytest.mark.parametrize("dtype", ["f2", "f4", "f8"])
96-
def test_isnan_floats_out_keyword(dtype):
97-
q = get_queue_or_skip()
98-
skip_if_dtype_not_supported(dtype, q)
99-
100-
y1 = np.nan
101-
y2 = 1
102-
y3 = np.inf
103-
104-
for mult in [123, 137, 255, 271, 272]:
105-
Ynp = np.repeat(np.array([y1, y2, y3], dtype=dtype), mult)
106-
Y = dpt.asarray(Ynp, sycl_queue=q)
107-
out = dpt.empty_like(Y, dtype="bool")
108-
dpt.isnan(Y, out)
109-
assert np.array_equal(dpt.asnumpy(out)[()], np.isnan(Ynp))

0 commit comments

Comments
 (0)