Skip to content

Commit 88491ea

Browse files
committed
Added CFD tests
1 parent a2778bd commit 88491ea

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

dpnp/dpnp_iface_histograms.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def _ravel_check_a_and_weights(a, weights):
5959

6060
# ensure that `a` array has supported type
6161
dpnp.check_supported_arrays_type(a)
62+
usm_type = a.usm_type
6263

6364
# ensure that the array is a "subtractable" dtype
6465
if a.dtype == dpnp.bool:
@@ -73,6 +74,7 @@ def _ravel_check_a_and_weights(a, weights):
7374
if weights is not None:
7475
# check that `weights` array has supported type
7576
dpnp.check_supported_arrays_type(weights)
77+
usm_type = dpu.get_coerced_usm_type([usm_type, weights.usm_type])
7678

7779
# check that arrays have the same allocation queue
7880
if dpu.get_execution_queue([a.sycl_queue, weights.sycl_queue]) is None:
@@ -84,7 +86,7 @@ def _ravel_check_a_and_weights(a, weights):
8486
raise ValueError("weights should have the same shape as a.")
8587
weights = weights.ravel()
8688
a = a.ravel()
87-
return a, weights
89+
return a, weights, usm_type
8890

8991

9092
def _get_outer_edges(a, range):
@@ -124,12 +126,13 @@ def _get_outer_edges(a, range):
124126
return first_edge, last_edge
125127

126128

127-
def _get_bin_edges(a, bins, range):
129+
def _get_bin_edges(a, bins, range, usm_type):
128130
"""Computes the bins used internally by `histogram`."""
129131

130132
# parse the overloaded bins argument
131133
n_equal_bins = None
132134
bin_edges = None
135+
sycl_queue = a.sycl_queue
133136

134137
if isinstance(bins, str):
135138
raise NotImplementedError("only integer and array bins are implemented")
@@ -154,7 +157,7 @@ def _get_bin_edges(a, bins, range):
154157
bin_edges = bins
155158
else:
156159
bin_edges = dpnp.asarray(
157-
bins, sycl_queue=a.sycl_queue, usm_type=a.usm_type
160+
bins, sycl_queue=sycl_queue, usm_type=usm_type
158161
)
159162

160163
if dpnp.any(bin_edges[:-1] > bin_edges[1:]):
@@ -172,7 +175,7 @@ def _get_bin_edges(a, bins, range):
172175
bin_type = dpnp.result_type(first_edge, last_edge, a)
173176
if dpnp.issubdtype(bin_type, dpnp.integer):
174177
bin_type = dpnp.result_type(
175-
bin_type, dpnp.default_float_type(sycl_queue=a.sycl_queue), a
178+
bin_type, dpnp.default_float_type(sycl_queue=sycl_queue), a
176179
)
177180

178181
# bin edges must be computed
@@ -182,8 +185,8 @@ def _get_bin_edges(a, bins, range):
182185
n_equal_bins + 1,
183186
endpoint=True,
184187
dtype=bin_type,
185-
sycl_queue=a.sycl_queue,
186-
usm_type=a.usm_type,
188+
sycl_queue=sycl_queue,
189+
usm_type=usm_type,
187190
)
188191
return bin_edges, (first_edge, last_edge, n_equal_bins)
189192
return bin_edges, None
@@ -285,9 +288,9 @@ def histogram(a, bins=10, range=None, density=None, weights=None):
285288
286289
"""
287290

288-
a, weights = _ravel_check_a_and_weights(a, weights)
291+
a, weights, usm_type = _ravel_check_a_and_weights(a, weights)
289292

290-
bin_edges, uniform_bins = _get_bin_edges(a, bins, range)
293+
bin_edges, uniform_bins = _get_bin_edges(a, bins, range, usm_type)
291294

292295
# Histogram is an integer or a float array depending on the weights.
293296
if weights is None:
@@ -320,7 +323,9 @@ def histogram(a, bins=10, range=None, density=None, weights=None):
320323
sa = dpnp.sort(a[i : i + block_size])
321324
cum_n += _search_sorted_inclusive(sa, bin_edges)
322325
else:
323-
zero = dpnp.zeros(1, dtype=ntype)
326+
zero = dpnp.zeros(
327+
1, dtype=ntype, sycl_queue=a.sycl_queue, usm_type=a.usm_type
328+
)
324329
for i in _range(0, len(a), block_size):
325330
tmp_a = a[i : i + block_size]
326331
tmp_w = weights[i : i + block_size]

tests/test_sycl_queue.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,3 +2022,27 @@ def test_tensorsolve(device):
20222022
result_queue = result.sycl_queue
20232023

20242024
assert_sycl_queue_equal(result_queue, a_dp.sycl_queue)
2025+
2026+
2027+
@pytest.mark.parametrize("weights", [None, numpy.arange(7, 12)])
2028+
@pytest.mark.parametrize(
2029+
"device",
2030+
valid_devices,
2031+
ids=[device.filter_string for device in valid_devices],
2032+
)
2033+
def test_histogram(weights, device):
2034+
v = numpy.arange(5)
2035+
w = weights
2036+
2037+
iv = dpnp.array(v, device=device)
2038+
iw = None if weights is None else dpnp.array(w, sycl_queue=iv.sycl_queue)
2039+
2040+
expected_hist, expected_edges = numpy.histogram(v, weights=w)
2041+
result_hist, result_edges = dpnp.histogram(iv, weights=iw)
2042+
assert_array_equal(result_hist, expected_hist)
2043+
assert_dtype_allclose(result_edges, expected_edges)
2044+
2045+
hist_queue = result_hist.sycl_queue
2046+
edges_queue = result_edges.sycl_queue
2047+
assert_sycl_queue_equal(hist_queue, iv.sycl_queue)
2048+
assert_sycl_queue_equal(edges_queue, iv.sycl_queue)

tests/test_usm_type.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,3 +1170,16 @@ def test_tensorsolve(usm_type_a, usm_type_b):
11701170
assert a.usm_type == usm_type_a
11711171
assert b.usm_type == usm_type_b
11721172
assert result.usm_type == du.get_coerced_usm_type([usm_type_a, usm_type_b])
1173+
1174+
1175+
@pytest.mark.parametrize("usm_type_v", list_of_usm_types, ids=list_of_usm_types)
1176+
@pytest.mark.parametrize("usm_type_w", list_of_usm_types, ids=list_of_usm_types)
1177+
def test_histogram(usm_type_v, usm_type_w):
1178+
v = dp.arange(5, usm_type=usm_type_v)
1179+
w = dp.arange(7, 12, usm_type=usm_type_w)
1180+
1181+
hist, edges = dp.histogram(v, weights=w)
1182+
assert v.usm_type == usm_type_v
1183+
assert w.usm_type == usm_type_w
1184+
assert hist.usm_type == du.get_coerced_usm_type([usm_type_v, usm_type_w])
1185+
assert edges.usm_type == du.get_coerced_usm_type([usm_type_v, usm_type_w])

0 commit comments

Comments
 (0)