diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 5eba95f7e083..ccbf5e07015a 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -848,9 +848,30 @@ def log2(x): def logaddexp(x1, x2): - raise NotImplementedError( - "`logaddexp` is not supported with openvino backend" + element_type = None + if isinstance(x1, OpenVINOKerasTensor): + element_type = x1.output.get_element_type() + if isinstance(x2, OpenVINOKerasTensor): + element_type = x2.output.get_element_type() + x1 = get_ov_output(x1, element_type) + x2 = get_ov_output(x2, element_type) + x1, x2 = _align_operand_types(x1, x2, "logaddexp()") + x_type = x1.get_element_type() + if x_type.is_integral(): + ov_type = OPENVINO_DTYPES[config.floatx()] + x1 = ov_opset.convert(x1, ov_type) + x2 = ov_opset.convert(x2, ov_type) + max_element = ov_opset.maximum(x1, x2).output(0) + exp_k = ov_opset.exp(max_element).output(0) + exp_x1 = ov_opset.exp(ov_opset.subtract(x1, max_element).output(0)).output( + 0 + ) + exp_x2 = ov_opset.exp(ov_opset.subtract(x2, max_element).output(0)).output( + 0 ) + sum_exp = ov_opset.add(exp_x1, exp_x2).output(0) + mul_exp = ov_opset.multiply(exp_k, sum_exp).output(0) + return OpenVINOKerasTensor(ov_opset.log(mul_exp).output(0)) def logical_and(x1, x2):