diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index 92fdecf0148..44266957746 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -21,7 +21,6 @@ NumpyDtypeTest::test_digitize NumpyDtypeTest::test_einsum NumpyDtypeTest::test_exp2 NumpyDtypeTest::test_eye -NumpyDtypeTest::test_flip NumpyDtypeTest::test_floor NumpyDtypeTest::test_hstack NumpyDtypeTest::test_inner @@ -88,6 +87,7 @@ NumpyOneInputOpsCorrectnessTest::test_cumprod NumpyOneInputOpsCorrectnessTest::test_diag NumpyOneInputOpsCorrectnessTest::test_diagonal NumpyOneInputOpsCorrectnessTest::test_exp2 +NumpyOneInputOpsCorrectnessTest::test_expm1 NumpyOneInputOpsCorrectnessTest::test_flip NumpyOneInputOpsCorrectnessTest::test_floor_divide NumpyOneInputOpsCorrectnessTest::test_hstack diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 4be6a6fb530..5600dc45ed0 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -715,7 +715,36 @@ def expm1(x): def flip(x, axis=None): - raise NotImplementedError("`flip` is not supported with openvino backend") + if axis == () or axis == []: + return x + x = get_ov_output(x) + rank = x.get_partial_shape().rank.get_length() + if axis is None: + axis = list(range(rank)) + else: + if np.isscalar(axis): + axis = [axis] + else: + axis = list(axis) + axis = [ax if ax >= 0 else ax + rank for ax in axis] + shape_of_x = ov_opset.shape_of(x) + for ax in sorted(axis): + dim_node = ov_opset.gather( + shape_of_x, + ov_opset.constant(ax, Type.i64).output(0), + ov_opset.constant(0, Type.i64).output(0), + ).output(0) + start = ov_opset.subtract( + dim_node, 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) + + reversed_indices = ov_opset.range(start, stop, step, Type.i64).output(0) + x = ov_opset.gather( + x, reversed_indices, ov_opset.constant(ax, Type.i64).output(0) + ).output(0) + return OpenVINOKerasTensor(x) def floor(x):