diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index f1ae053e623..5bf017138ef 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -41,7 +41,6 @@ NumpyDtypeTest::test_multiply NumpyDtypeTest::test_nan NumpyDtypeTest::test_outer_ NumpyDtypeTest::test_power -NumpyDtypeTest::test_prod NumpyDtypeTest::test_quantile NumpyDtypeTest::test_ravel NumpyDtypeTest::test_repeat @@ -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_ravel NumpyOneInputOpsCorrectnessTest::test_real NumpyOneInputOpsCorrectnessTest::test_reciprocal diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index a242a3c8d56..5e4135a9a5d 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1117,8 +1117,52 @@ def pad(x, pad_width, mode="constant", constant_values=None): ) +""" +Helper Function to convert the string dtype to ov type +""" + + +def string_to_ov_type(dtype_str): + from openvino.runtime import Type + + mapping = { + "bool": Type.boolean, + "int8": Type.i8, + "int16": Type.i16, + "int32": Type.i32, + "int64": Type.i64, + "uint8": Type.u8, + "uint16": Type.u16, + "uint32": Type.u32, + "uint64": Type.u64, + "float16": Type.f16, + "float32": Type.f32, + "float64": Type.f64, + } + return mapping[dtype_str] + + 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 + + if isinstance(axis, tuple): + axis = list(axis) + axis = ov_opset.constant(axis, Type.i32).output(0) + + result = ov_opset.reduce_prod(x, axis, keepdims).output(0) + + if dtype: + result = ov_opset.convert(result, string_to_ov_type(dtype)).output(0) + + return OpenVINOKerasTensor(result) def quantile(x, q, axis=None, method="linear", keepdims=False):