@@ -1031,9 +1031,53 @@ def log2(x):
1031
1031
1032
1032
1033
1033
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 )
1037
1081
1038
1082
1039
1083
def logical_and (x1 , x2 ):
0 commit comments