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))))));
}