diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index 48dd1ffb49e9..9e45b2132cda 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -26,7 +26,6 @@ NumpyDtypeTest::test_digitize NumpyDtypeTest::test_einsum NumpyDtypeTest::test_exp2 NumpyDtypeTest::test_eye -NumpyDtypeTest::test_flip NumpyDtypeTest::test_floor NumpyDtypeTest::test_inner NumpyDtypeTest::test_isfinite @@ -87,7 +86,6 @@ NumpyOneInputOpsCorrectnessTest::test_cumprod NumpyOneInputOpsCorrectnessTest::test_diag NumpyOneInputOpsCorrectnessTest::test_diagonal NumpyOneInputOpsCorrectnessTest::test_exp2 -NumpyOneInputOpsCorrectnessTest::test_flip NumpyOneInputOpsCorrectnessTest::test_floor_divide NumpyOneInputOpsCorrectnessTest::test_imag NumpyOneInputOpsCorrectnessTest::test_isfinite diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 4f9fae1c986f..f951c75c9cf5 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -800,7 +800,35 @@ def expm1(x): def flip(x, axis=None): - raise NotImplementedError("`flip` is not supported with openvino backend") + x = get_ov_output(x) + rank = x.get_partial_shape().rank.get_length() + x_shape = ov_opset.shape_of(x) + if rank == 0: + return OpenVINOKerasTensor(x) + if axis is None: + axis = list(range(rank)) + elif isinstance(axis, int): + axis = [axis] + else: + axis = list(axis) + axis = [a + rank if a < 0 else a for a in axis] + flipped = x + for ax in axis: + dim_size = ov_opset.gather( + x_shape, + ov_opset.constant(ax, Type.i64).output(0), + axis=ov_opset.constant(0, Type.i64).output(0), + ).output(0) + start = ov_opset.subtract( + dim_size, ov_opset.constant(1, Type.i64).output(0) + ).output(0) + stop = ov_opset.constant(-1, Type.i64).output(0) + step = ov_opset.constant(-1, Type.i64).output(0) + indices = ov_opset.range(start, stop, step, Type.i64).output(0) + flipped = ov_opset.gather( + flipped, indices, ov_opset.constant(ax, Type.i64).output(0) + ).output(0) + return OpenVINOKerasTensor(flipped) def floor(x):