Skip to content

Commit 66cc6d5

Browse files
authored
[OpenVino BackEnd] support np.diff for ov BackEnd (#20950)
* [OpenVino BackEnd] support np.diff for ov BackEnd * [OpenVino BackEnd] support np.diff for ov BackEnd * [OpenVino BackEnd] support np.diff for ov BackEnd * [OpenVino BackEnd] support np.diff for ov BackEnd * [OpenVino BackEnd] support np.diff for ov BackEnd * [OpenVino BackEnd] support np.diff for ov BackEnd * [OpenVino BackEnd] support np.diff for ov BackEnd
1 parent df2fc37 commit 66cc6d5

File tree

2 files changed

+70
-3
lines changed

2 files changed

+70
-3
lines changed

keras/src/backend/openvino/excluded_concrete_tests.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ NumpyDtypeTest::test_cross
1818
NumpyDtypeTest::test_cumprod
1919
NumpyDtypeTest::test_cumsum_bool
2020
NumpyDtypeTest::test_diag
21-
NumpyDtypeTest::test_diff
2221
NumpyDtypeTest::test_digitize
2322
NumpyDtypeTest::test_einsum
2423
NumpyDtypeTest::test_empty
@@ -93,7 +92,6 @@ NumpyOneInputOpsCorrectnessTest::test_correlate
9392
NumpyOneInputOpsCorrectnessTest::test_cumprod
9493
NumpyOneInputOpsCorrectnessTest::test_diag
9594
NumpyOneInputOpsCorrectnessTest::test_diagonal
96-
NumpyOneInputOpsCorrectnessTest::test_diff
9795
NumpyOneInputOpsCorrectnessTest::test_exp
9896
NumpyOneInputOpsCorrectnessTest::test_expand_dims
9997
NumpyOneInputOpsCorrectnessTest::test_exp2

keras/src/backend/openvino/numpy.py

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,76 @@ def diagonal(x, offset=0, axis1=0, axis2=1):
568568

569569

570570
def diff(a, n=1, axis=-1):
571-
raise NotImplementedError("`diff` is not supported with openvino backend")
571+
if n == 0:
572+
return OpenVINOKerasTensor(get_ov_output(a))
573+
if n < 0:
574+
raise ValueError("order must be non-negative but got " + repr(n))
575+
a = get_ov_output(a)
576+
a_type = a.get_element_type()
577+
if isinstance(a, np.ndarray):
578+
rank = a.ndim
579+
else:
580+
rank = a.get_partial_shape().rank.get_length()
581+
if axis < 0:
582+
axis = axis + rank
583+
result = a
584+
for _ in range(n):
585+
rank = result.get_partial_shape().rank.get_length()
586+
strides = ov_opset.constant(
587+
np.array([1] * rank, dtype=np.int64), Type.i64
588+
).output(0)
589+
590+
begin_upper_list = [0] * rank
591+
begin_upper_list[axis] = 1
592+
begin_upper = ov_opset.constant(
593+
np.array(begin_upper_list, dtype=np.int64), Type.i64
594+
).output(0)
595+
end_upper = ov_opset.constant(
596+
np.array([0] * rank, dtype=np.int64), Type.i64
597+
).output(0)
598+
begin_mask_upper = [1] * rank
599+
begin_mask_upper[axis] = 0
600+
end_mask_upper = [1] * rank
601+
upper = ov_opset.strided_slice(
602+
data=result,
603+
begin=begin_upper,
604+
end=end_upper,
605+
strides=strides,
606+
begin_mask=begin_mask_upper,
607+
end_mask=end_mask_upper,
608+
new_axis_mask=[],
609+
shrink_axis_mask=[],
610+
ellipsis_mask=[],
611+
).output(0)
612+
613+
begin_lower = ov_opset.constant(
614+
np.array([0] * rank, dtype=np.int64), Type.i64
615+
).output(0)
616+
end_lower_list = [0] * rank
617+
end_lower_list[axis] = -1
618+
end_lower = ov_opset.constant(
619+
np.array(end_lower_list, dtype=np.int64), Type.i64
620+
).output(0)
621+
begin_mask_lower = [1] * rank
622+
end_mask_lower = [1] * rank
623+
end_mask_lower[axis] = 0
624+
lower = ov_opset.strided_slice(
625+
data=result,
626+
begin=begin_lower,
627+
end=end_lower,
628+
strides=strides,
629+
begin_mask=begin_mask_lower,
630+
end_mask=end_mask_lower,
631+
new_axis_mask=[],
632+
shrink_axis_mask=[],
633+
ellipsis_mask=[],
634+
).output(0)
635+
636+
if a_type == Type.boolean:
637+
result = ov_opset.not_equal(upper, lower).output(0)
638+
else:
639+
result = ov_opset.subtract(upper, lower).output(0)
640+
return OpenVINOKerasTensor(result)
572641

573642

574643
def digitize(x, bins):

0 commit comments

Comments
 (0)