From fd4bd4ff43fdcde3ce427c625a833d2659227eab Mon Sep 17 00:00:00 2001 From: Deep Chordia <73215996+DeepC004@users.noreply.github.com> Date: Sun, 16 Mar 2025 03:22:29 +0530 Subject: [PATCH 1/4] Add numpy.logaddexp to openvino backend --- keras/src/backend/openvino/numpy.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 5eba95f7e083..b388d8523b20 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -848,9 +848,23 @@ 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) + exp_x1 = ov_opset.exp(x1).output(0) + exp_x2 = ov_opset.exp(x2).output(0) + sum_exp = ov_opset.add(exp_x1, exp_x2).output(0) + return OpenVINOKerasTensor(ov_opset.log(sum_exp).output(0)) def logical_and(x1, x2): From 789947ccdf3a2223df2cf6eb92720c3211c6b2ba Mon Sep 17 00:00:00 2001 From: Deep Chordia <73215996+DeepC004@users.noreply.github.com> Date: Mon, 17 Mar 2025 09:31:45 +0530 Subject: [PATCH 2/4] Adapt to compute stable expression calculation --- keras/src/backend/openvino/numpy.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index b388d8523b20..a380cd069c17 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -861,10 +861,13 @@ def logaddexp(x1, x2): ov_type = OPENVINO_DTYPES[config.floatx()] x1 = ov_opset.convert(x1, ov_type) x2 = ov_opset.convert(x2, ov_type) - exp_x1 = ov_opset.exp(x1).output(0) - exp_x2 = ov_opset.exp(x2).output(0) + 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) - return OpenVINOKerasTensor(ov_opset.log(sum_exp).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): From ecf9645f6775888ec747b6327651fb7c814e8385 Mon Sep 17 00:00:00 2001 From: Deep Chordia <73215996+DeepC004@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:08:07 +0530 Subject: [PATCH 3/4] Fix linting issue --- keras/src/backend/openvino/numpy.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index a380cd069c17..0847569a222f 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -863,8 +863,10 @@ def logaddexp(x1, x2): 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) + 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)) From 271fb9a35887e79484775038113bbb424beafe92 Mon Sep 17 00:00:00 2001 From: Deep Chordia <73215996+DeepC004@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:18:53 +0530 Subject: [PATCH 4/4] Run format.sh to fix formatting error --- keras/src/backend/openvino/numpy.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 0847569a222f..ccbf5e07015a 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -863,10 +863,12 @@ def logaddexp(x1, x2): 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) + 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))