Skip to content

Commit 6fbaf64

Browse files
samthakur587samunderlincode
authored andcommitted
feat: logaddexp for openvino backend
1 parent 5d50953 commit 6fbaf64

File tree

1 file changed

+47
-3
lines changed

1 file changed

+47
-3
lines changed

keras/src/backend/openvino/numpy.py

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,9 +1031,53 @@ def log2(x):
10311031

10321032

10331033
def logaddexp(x1, x2):
1034-
raise NotImplementedError(
1035-
"`logaddexp` is not supported with openvino backend"
1036-
)
1034+
element_type = None
1035+
if isinstance(x1, OpenVINOKerasTensor):
1036+
element_type = x1.output.get_element_type()
1037+
if isinstance(x2, OpenVINOKerasTensor):
1038+
element_type = x2.output.get_element_type()
1039+
x1 = get_ov_output(x1, element_type)
1040+
x2 = get_ov_output(x2, element_type)
1041+
x1, x2 = _align_operand_types(x1, x2, "logaddexp()")
1042+
1043+
if x1.element_type.is_integral() or x2.element_type.is_integral():
1044+
float_dtype = OPENVINO_DTYPES[config.floatx()]
1045+
if x1.element_type.is_integral():
1046+
x1 = ov_opset.convert(x1, float_dtype)
1047+
if x2.element_type.is_integral():
1048+
x2 = ov_opset.convert(x2, float_dtype)
1049+
1050+
# Get the output nodes properly
1051+
max_val_node = ov_opset.maximum(x1, x2)
1052+
max_val = max_val_node.output(0)
1053+
1054+
# Compute absolute difference
1055+
sub_node = ov_opset.subtract(x1, x2)
1056+
abs_diff_node = ov_opset.abs(sub_node.output(0))
1057+
abs_diff = abs_diff_node.output(0)
1058+
1059+
# Compute negative absolute difference and its exponential
1060+
neg_abs_diff_node = ov_opset.negative(abs_diff)
1061+
neg_abs_diff = neg_abs_diff_node.output(0)
1062+
exp_neg_abs_node = ov_opset.exp(neg_abs_diff)
1063+
exp_neg_abs = exp_neg_abs_node.output(0)
1064+
1065+
# Get the element type from the node, not the output
1066+
element_type = exp_neg_abs_node.get_element_type()
1067+
one_node = ov_opset.constant(1, element_type)
1068+
one = one_node.output(0)
1069+
1070+
# Compute log term
1071+
one_plus_exp_node = ov_opset.add(one, exp_neg_abs)
1072+
one_plus_exp = one_plus_exp_node.output(0)
1073+
log_term_node = ov_opset.log(one_plus_exp)
1074+
log_term = log_term_node.output(0)
1075+
1076+
# Final result
1077+
result_node = ov_opset.add(max_val, log_term)
1078+
result = result_node.output(0)
1079+
1080+
return OpenVINOKerasTensor(result)
10371081

10381082

10391083
def logical_and(x1, x2):

0 commit comments

Comments
 (0)