Skip to content

Commit fa2e547

Browse files
authored
Implement logaddexp2 function in keras.ops (#21691)
* Add logaddexp2 method for ops * rollback gptq_test * correct code by gemini * Add example for logaddexp2 * Correct example for logaddexp2 * correct excluded_concrete_tests.txt
1 parent 2229a68 commit fa2e547

File tree

12 files changed

+129
-0
lines changed

12 files changed

+129
-0
lines changed

keras/api/_tf_keras/keras/ops/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@
219219
from keras.src.ops.numpy import log2 as log2
220220
from keras.src.ops.numpy import log10 as log10
221221
from keras.src.ops.numpy import logaddexp as logaddexp
222+
from keras.src.ops.numpy import logaddexp2 as logaddexp2
222223
from keras.src.ops.numpy import logical_and as logical_and
223224
from keras.src.ops.numpy import logical_not as logical_not
224225
from keras.src.ops.numpy import logical_or as logical_or

keras/api/_tf_keras/keras/ops/numpy/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
from keras.src.ops.numpy import log2 as log2
108108
from keras.src.ops.numpy import log10 as log10
109109
from keras.src.ops.numpy import logaddexp as logaddexp
110+
from keras.src.ops.numpy import logaddexp2 as logaddexp2
110111
from keras.src.ops.numpy import logical_and as logical_and
111112
from keras.src.ops.numpy import logical_not as logical_not
112113
from keras.src.ops.numpy import logical_or as logical_or

keras/api/ops/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@
219219
from keras.src.ops.numpy import log2 as log2
220220
from keras.src.ops.numpy import log10 as log10
221221
from keras.src.ops.numpy import logaddexp as logaddexp
222+
from keras.src.ops.numpy import logaddexp2 as logaddexp2
222223
from keras.src.ops.numpy import logical_and as logical_and
223224
from keras.src.ops.numpy import logical_not as logical_not
224225
from keras.src.ops.numpy import logical_or as logical_or

keras/api/ops/numpy/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
from keras.src.ops.numpy import log2 as log2
108108
from keras.src.ops.numpy import log10 as log10
109109
from keras.src.ops.numpy import logaddexp as logaddexp
110+
from keras.src.ops.numpy import logaddexp2 as logaddexp2
110111
from keras.src.ops.numpy import logical_and as logical_and
111112
from keras.src.ops.numpy import logical_not as logical_not
112113
from keras.src.ops.numpy import logical_or as logical_or

keras/src/backend/jax/numpy.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,15 @@ def logaddexp(x1, x2):
895895
return jnp.logaddexp(x1, x2)
896896

897897

898+
def logaddexp2(x1, x2):
899+
x1 = convert_to_tensor(x1)
900+
x2 = convert_to_tensor(x2)
901+
dtype = dtypes.result_type(x1.dtype, x2.dtype, float)
902+
x1 = cast(x1, dtype)
903+
x2 = cast(x2, dtype)
904+
return jnp.logaddexp2(x1, x2)
905+
906+
898907
def logical_and(x1, x2):
899908
x1 = convert_to_tensor(x1)
900909
x2 = convert_to_tensor(x2)

keras/src/backend/numpy/numpy.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,13 @@ def logaddexp(x1, x2):
838838
return np.logaddexp(x1, x2)
839839

840840

841+
def logaddexp2(x1, x2):
842+
x1 = convert_to_tensor(x1)
843+
x2 = convert_to_tensor(x2)
844+
dtype = dtypes.result_type(x1.dtype, x2.dtype, float)
845+
return np.logaddexp2(x1, x2).astype(dtype)
846+
847+
841848
def logical_and(x1, x2):
842849
return np.logical_and(x1, x2)
843850

keras/src/backend/openvino/excluded_concrete_tests.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ NumpyDtypeTest::test_isposinf
4040
NumpyDtypeTest::test_kron
4141
NumpyDtypeTest::test_lcm
4242
NumpyDtypeTest::test_linspace
43+
NumpyDtypeTest::test_logaddexp2
4344
NumpyDtypeTest::test_logspace
4445
NumpyDtypeTest::test_matmul_
4546
NumpyDtypeTest::test_max
@@ -95,6 +96,7 @@ NumpyOneInputOpsCorrectnessTest::test_imag
9596
NumpyOneInputOpsCorrectnessTest::test_isfinite
9697
NumpyOneInputOpsCorrectnessTest::test_isinf
9798
NumpyOneInputOpsCorrectnessTest::test_isposinf
99+
NumpyOneInputOpsCorrectnessTest::test_logaddexp2
98100
NumpyOneInputOpsCorrectnessTest::test_max
99101
NumpyOneInputOpsCorrectnessTest::test_mean
100102
NumpyOneInputOpsCorrectnessTest::test_median

keras/src/backend/openvino/numpy.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,12 @@ def logaddexp(x1, x2):
11421142
return OpenVINOKerasTensor(result)
11431143

11441144

1145+
def logaddexp2(x1, x2):
1146+
raise NotImplementedError(
1147+
"`logaddexp2` is not supported with openvino backend"
1148+
)
1149+
1150+
11451151
def logical_and(x1, x2):
11461152
x1 = get_ov_output(x1)
11471153
x2 = get_ov_output(x2)

keras/src/backend/tensorflow/numpy.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1910,6 +1910,22 @@ def logaddexp(x1, x2):
19101910
)
19111911

19121912

1913+
def logaddexp2(x1, x2):
1914+
x1 = tf.convert_to_tensor(x1)
1915+
x2 = tf.convert_to_tensor(x2)
1916+
dtype = dtypes.result_type(x1.dtype, x2.dtype, float)
1917+
x1 = tf.cast(x1, dtype)
1918+
x2 = tf.cast(x2, dtype)
1919+
delta = x1 - x2
1920+
log2 = tf.cast(tf.math.log(2.0), dtype)
1921+
return tf.where(
1922+
tf.math.is_nan(delta),
1923+
x1 + x2,
1924+
tf.maximum(x1, x2)
1925+
+ tf.math.log1p(tf.math.exp(-tf.abs(delta) * log2)) / log2,
1926+
)
1927+
1928+
19131929
def logical_and(x1, x2):
19141930
x1 = tf.cast(x1, "bool")
19151931
x2 = tf.cast(x2, "bool")

keras/src/backend/torch/numpy.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,6 +1054,15 @@ def logaddexp(x1, x2):
10541054
return torch.logaddexp(x1, x2)
10551055

10561056

1057+
def logaddexp2(x1, x2):
1058+
x1 = convert_to_tensor(x1)
1059+
x2 = convert_to_tensor(x2)
1060+
dtype = dtypes.result_type(x1.dtype, x2.dtype, float)
1061+
x1 = cast(x1, dtype)
1062+
x2 = cast(x2, dtype)
1063+
return torch.logaddexp2(x1, x2)
1064+
1065+
10571066
def logical_and(x1, x2):
10581067
x1, x2 = convert_to_tensor(x1), convert_to_tensor(x2)
10591068
return torch.logical_and(x1, x2)

0 commit comments

Comments
 (0)