diff --git a/.gitignore b/.gitignore index afd700b49952..d60111a20eed 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,4 @@ examples/**/*.jpg .python-version .coverage *coverage.xml -.ruff_cache \ No newline at end of file + diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index 48dd1ffb49e9..15504179dcd7 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -43,7 +43,6 @@ NumpyDtypeTest::test_meshgrid NumpyDtypeTest::test_minimum_python_types NumpyDtypeTest::test_multiply NumpyDtypeTest::test_power -NumpyDtypeTest::test_prod NumpyDtypeTest::test_quantile NumpyDtypeTest::test_repeat NumpyDtypeTest::test_roll @@ -104,7 +103,6 @@ NumpyOneInputOpsCorrectnessTest::test_pad_int16_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_int8_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_uint8_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_int32_constant_2 -NumpyOneInputOpsCorrectnessTest::test_prod NumpyOneInputOpsCorrectnessTest::test_real NumpyOneInputOpsCorrectnessTest::test_repeat NumpyOneInputOpsCorrectnessTest::test_reshape diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 4f9fae1c986f..ba82d965bb16 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1262,8 +1262,42 @@ def pad(x, pad_width, mode="constant", constant_values=None): def prod(x, axis=None, keepdims=False, dtype=None): - raise NotImplementedError("`prod` is not supported with openvino backend") + if axis == () or axis == []: + return x + + x = get_ov_output(x) + + if axis is None: + flatten_shape = ov_opset.constant([-1], Type.i32).output(0) + x = ov_opset.reshape(x, flatten_shape, False).output(0) + axis = 0 + elif isinstance(axis, tuple): + axis = list(axis) + + axis = ov_opset.constant(axis, Type.i32).output(0) + + x_type = x.get_element_type() + + if x_type == Type.boolean: + result_node = ov_opset.reduce_logical_and(x, axis, keepdims).output(0) + final_result = ov_opset.convert(result_node, Type.i32).output(0) + return OpenVINOKerasTensor(final_result) + + target_type = None + if dtype is None: + if x_type in [Type.i8, Type.i16]: + target_type = Type.i32 + elif x_type in [Type.u8, Type.u16]: + target_type = Type.u32 + else: + target_type = x_type + else: + dtype_string = standardize_dtype(dtype) + target_type = OPENVINO_DTYPES[dtype_string] + prod_result = ov_opset.reduce_prod(x, axis, keepdims).output(0) + final_result = ov_opset.convert(prod_result, target_type).output(0) + return OpenVINOKerasTensor(final_result) def quantile(x, q, axis=None, method="linear", keepdims=False): raise NotImplementedError(