Skip to content

Commit 97a087e

Browse files
committed
feat: implement numpy.bincount for openvino backend
1 parent 1eee113 commit 97a087e

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

keras/src/backend/openvino/excluded_concrete_tests.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ NumpyDtypeTest::test_argpartition
1313
NumpyDtypeTest::test_argsort
1414
NumpyDtypeTest::test_array
1515
NumpyDtypeTest::test_average_
16-
NumpyDtypeTest::test_bincount
1716
NumpyDtypeTest::test_bitwise
1817
NumpyDtypeTest::test_ceil
1918
NumpyDtypeTest::test_concatenate
@@ -97,7 +96,6 @@ NumpyOneInputOpsCorrectnessTest::test_argpartition
9796
NumpyOneInputOpsCorrectnessTest::test_argsort
9897
NumpyOneInputOpsCorrectnessTest::test_array
9998
NumpyOneInputOpsCorrectnessTest::test_average
100-
NumpyOneInputOpsCorrectnessTest::test_bincount
10199
NumpyOneInputOpsCorrectnessTest::test_bitwise_invert
102100
NumpyOneInputOpsCorrectnessTest::test_conj
103101
NumpyOneInputOpsCorrectnessTest::test_correlate

keras/src/backend/openvino/numpy.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,9 +322,37 @@ def average(x, axis=None, weights=None):
322322

323323

324324
def bincount(x, weights=None, minlength=0, sparse=False):
325-
raise NotImplementedError(
326-
"`bincount` is not supported with openvino backend"
325+
if x is None:
326+
raise ValueError("input x is None")
327+
x = get_ov_output(x)
328+
x_type = x.get_element_type()
329+
minlength = get_ov_output(minlength)
330+
minlength = ov_opset.convert(minlength, x_type).output(0)
331+
const_one = ov_opset.constant(1, x_type).output(0)
332+
const_zero = ov_opset.constant(0, x_type).output(0)
333+
max_element = ov_opset.reduce_max(x, const_zero, keep_dims=False).output(0)
334+
depth = ov_opset.add(max_element, const_one).output(0)
335+
depth = ov_opset.maximum(depth, minlength).output(0)
336+
depth = ov_opset.convert(depth,x_type).output(0)
337+
one_hot = ov_opset.one_hot(x, depth, const_one, const_zero, axis=-1).output(
338+
0
327339
)
340+
if weights is not None:
341+
weights = get_ov_output(weights)
342+
weights_type = weights.get_element_type()
343+
weights_new = ov_opset.reshape(weights, [-1, 1], False).output(0)
344+
one_hot = ov_opset.convert(one_hot, weights_type).output(0)
345+
final_one_hot = ov_opset.multiply(one_hot, weights_new).output(0)
346+
final_output = ov_opset.reduce_sum(
347+
final_one_hot, const_zero, keep_dims=False
348+
).output(0)
349+
return OpenVINOKerasTensor(final_output)
350+
else:
351+
one_hot = ov_opset.convert(one_hot, x_type).output(0)
352+
final_output = ov_opset.reduce_sum(
353+
one_hot, const_zero, keep_dims=False
354+
).output(0)
355+
return OpenVINOKerasTensor(final_output)
328356

329357

330358
def broadcast_to(x, shape):

0 commit comments

Comments
 (0)