From d013c71838f2000b99238ef4c7a54708c6607517 Mon Sep 17 00:00:00 2001 From: Viktor Mukhachev <39690846+vmukhachev@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:04:26 +0100 Subject: [PATCH 1/5] fix reduceLogSumExp decomposition to not overflow so easily test case: reduceLogSumExp([89]) should give 89, not Infinity --- index.bs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.bs b/index.bs index c011e08a..475b61f1 100644 --- a/index.bs +++ b/index.bs @@ -8270,7 +8270,8 @@ partial dictionary MLOpSupportLimits { } function reduceLogSumExp(builder, input, options) { - return builder.log(builder.reduceSum(builder.exp(input), options)); + const maxX = builder.reduceMax(input, {axes: options.axes, keepDimensions: true}); + return builder.add(maxX, builder.log(builder.reduceSum(builder.exp(builder.sub(input, maxX)), options))); } function reduceSumSquare(builder, input, options) { From 63f20cab566f1f6158e0b8c018328d5f246de141 Mon Sep 17 00:00:00 2001 From: Viktor Mukhachev <39690846+vmukhachev@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:18:49 +0100 Subject: [PATCH 2/5] fix softplus decomposition to not overflow --- index.bs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/index.bs b/index.bs index 475b61f1..9b1587af 100644 --- a/index.bs +++ b/index.bs @@ -9487,8 +9487,7 @@ partial dictionary MLOpSupportLimits {
     function softplus(builder, input) {
-      return builder.log(
-        builder.add(builder.exp(input), builder.constant(input.dataType, 1)));
+      return builder.add(input, builder.log(builder.add(builder.constant(input.dataType, 1), builder.exp(builder.neg(input)))));
     }
     
From f1a28974bb44a1f3f65ba89781810ddecf55158d Mon Sep 17 00:00:00 2001 From: Viktor Mukhachev <39690846+vmukhachev@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:26:47 +0100 Subject: [PATCH 3/5] fix softplus(-100) --- index.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.bs b/index.bs index 9b1587af..4f66679b 100644 --- a/index.bs +++ b/index.bs @@ -9487,7 +9487,7 @@ partial dictionary MLOpSupportLimits {
     function softplus(builder, input) {
-      return builder.add(input, builder.log(builder.add(builder.constant(input.dataType, 1), builder.exp(builder.neg(input)))));
+      return builder.add(builder.max(input, builder.constant(input.dataType, 0)), builder.log(builder.add(builder.constant(input.dataType, 1), builder.exp(builder.neg(builder.abs(input))))));
     }
     
From f4471f2b2261bb93037e9cf2ca707c3ba6f5bc4b Mon Sep 17 00:00:00 2001 From: Viktor Mukhachev <39690846+vmukhachev@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:31:21 +0100 Subject: [PATCH 4/5] fix tanh(89) --- index.bs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.bs b/index.bs index 4f66679b..fd7a9744 100644 --- a/index.bs +++ b/index.bs @@ -9780,11 +9780,11 @@ partial dictionary MLOpSupportLimits { function tanh(builder, input) { return builder.div( builder.sub( - builder.exp(builder.mul(builder.constant(input.dataType, 2), input)), - builder.constant(input.dataType, 1)), + builder.constant(input.dataType, 1), + builder.exp(builder.mul(builder.constant(input.dataType, -2), input))), builder.add( - builder.exp(builder.mul(builder.constant(input.dataType, 2), input)), - builder.constant(input.dataType, 1))); + builder.constant(input.dataType, 1), + builder.exp(builder.mul(builder.constant(input.dataType, -2), input)))); } From 5e297bebd59249ebe3a3dd688f741325dbd2080a Mon Sep 17 00:00:00 2001 From: Viktor Mukhachev <39690846+vmukhachev@users.noreply.github.com> Date: Tue, 13 Jan 2026 22:46:11 +0100 Subject: [PATCH 5/5] fix tanh(-100) --- index.bs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.bs b/index.bs index fd7a9744..83c8138e 100644 --- a/index.bs +++ b/index.bs @@ -9778,13 +9778,13 @@ partial dictionary MLOpSupportLimits {
     function tanh(builder, input) {
-      return builder.div(
+      return builder.mul(builder.sign(input), builder.div(
         builder.sub(
           builder.constant(input.dataType, 1),
-          builder.exp(builder.mul(builder.constant(input.dataType, -2), input))),
+          builder.exp(builder.mul(builder.constant(input.dataType, -2), builder.abs(input)))),
         builder.add(
           builder.constant(input.dataType, 1),
-          builder.exp(builder.mul(builder.constant(input.dataType, -2), input))));
+          builder.exp(builder.mul(builder.constant(input.dataType, -2), builder.abs(input))))));
     }