commit c7093c2490827da3d10e491133f25a0c9cfc0d49
parent 0452dbbf7990cf2545ca49474accfa45512aa565
Author: BruceDai <feng.dai@intel.com>
Date: Fri, 26 Sep 2025 21:28:26 +0000
Bug 1990476 [wpt PR 55037] - [webnn] enhance to check input/constant/output rank, a=testonly
Automatic update from web-platform-tests
[webnn] enhance to check input/constant/output rank
This CL checks graph input/constant/output rank according to the
input/constant/output supported rank range via opSupportLimit.
Besides, it also checks operator's output rank according to each
operator's output supported rank range via opSupportLimit.
With this CL, these two tests "reshape (unsqueeze) float32 5D tensor by
adding 4th dimension" and "reshape (unsqueeze) float16 5D tensor by
adding 4th dimension" aren't satisfied as minimal tests that are skipped
running on Mac platforms.
Bug: 445826651
Change-Id: I94078cf83d9ba6f21ab12154ae61b153f7d3e17d
Cq-Include-Trybots: luci.chromium.try:win11-blink-rel, mac14.arm64-blink-rel, mac14-blink-rel, mac15.arm64-blink-rel, mac15-blink-rel, linux-blink-rel
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6972836
Reviewed-by: Reilly Grant <reillyg@chromium.org>
Commit-Queue: Feng Dai <feng.dai@intel.com>
Auto-Submit: Feng Dai <feng.dai@intel.com>
Reviewed-by: ningxin hu <ningxin.hu@intel.com>
Cr-Commit-Position: refs/heads/main@{#1520227}
--
wpt-commits: d53574c0ea577f0f8bf360e7a3c8d7144c42ff42
wpt-pr: 55037
Diffstat:
2 files changed, 478 insertions(+), 108 deletions(-)
diff --git a/testing/web-platform/tests/webnn/resources/minimum_datatype_set.json b/testing/web-platform/tests/webnn/resources/minimum_datatype_set.json
@@ -8,7 +8,10 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"add": {
"a": {
@@ -19,28 +22,40 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"argMax": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 1, "max": 5}
},
- "output": {"dataTypes": ["int32"]}
+ "output": {
+ "dataTypes": ["int32"],
+ "rankRange": {"min": 1, "max": 5}
+ }
},
"argMin": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 1, "max": 5}
},
- "output": {"dataTypes": ["int32"]}
+ "output": {
+ "dataTypes": ["int32"],
+ "rankRange": {"min": 1, "max": 5}
+ }
},
"averagePool2d": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 4, "max": 4}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 4, "max": 4}
+ }
},
"batchNormalization": {
"input": {
@@ -63,35 +78,50 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 1, "max": 1}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 3, "max": 5}
+ }
},
"cast": {
"input": {
"dataTypes": ["float32", "float16", "int32", "int8", "uint8"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32", "int8", "uint8"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32", "int8", "uint8"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"ceil": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"clamp": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"concat": {
"inputs": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"conv2d": {
"bias": {
@@ -106,7 +136,10 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 4, "max": 4}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 4, "max": 4}
+ }
},
"convTranspose2d": {
"input": {
@@ -121,21 +154,30 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 1, "max": 1}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 4, "max": 4}
+ }
},
"cos": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"cumulativeSum": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 1, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 1, "max": 5}
+ }
},
"dequantizeLinear": {
"input": {
@@ -147,7 +189,10 @@
"dataTypes": ["int32", "int8", "uint8"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32"]}
+ "output": {
+ "dataTypes": ["float32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"div": {
"a": {
@@ -158,14 +203,20 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"elu": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"equal": {
"a": {
@@ -176,35 +227,50 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"erf": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"exp": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"expand": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"floor": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"gather": {
"input": {
@@ -212,7 +278,10 @@
"rankRange": {"min": 1, "max": 5}
},
"indices": {"dataTypes": ["int32"], "rankRange": {"min": 0, "max": 5}},
- "output": {"dataTypes": ["float32", "float16", "int32", "int8", "uint8"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32", "int8", "uint8"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"gatherElements": {
"input": {
@@ -220,7 +289,10 @@
"rankRange": {"min": 1, "max": 5}
},
"indices": {"dataTypes": ["int32"], "rankRange": {"min": 1, "max": 5}},
- "output": {"dataTypes": ["float32", "float16", "int32", "int8", "uint8"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32", "int8", "uint8"],
+ "rankRange": {"min": 1, "max": 5}
+ }
},
"gatherND": {
"input": {
@@ -228,14 +300,20 @@
"rankRange": {"min": 1, "max": 5}
},
"indices": {"dataTypes": ["int32"], "rankRange": {"min": 1, "max": 5}},
- "output": {"dataTypes": ["float32", "float16", "int32", "int8", "uint8"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32", "int8", "uint8"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"gelu": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"gemm": {
"a": {
@@ -250,7 +328,10 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 2}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 2, "max": 2}
+ }
},
"greater": {
"a": {
@@ -261,7 +342,10 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"greaterOrEqual": {
"a": {
@@ -272,7 +356,10 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"gru": {
"input": {
@@ -299,7 +386,14 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 3, "max": 3}
},
- "outputs": {"dataTypes": ["float32", "float16"]}
+ "output0": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 3, "max": 3}
+ },
+ "output1": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 4, "max": 4}
+ }
},
"gruCell": {
"input": {
@@ -326,28 +420,40 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 1, "max": 1}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 2, "max": 2}
+ }
},
"hardSigmoid": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"hardSwish": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"identity": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"instanceNormalization": {
"input": {
@@ -362,25 +468,37 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 1, "max": 1}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 4, "max": 4}
+ }
},
"isNaN": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"isInfinite": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"l2Pool2d": {
"input": {"dataTypes": [], "rankRange": {}},
- "output": {"dataTypes": []}
+ "output": {
+ "dataTypes": [],
+ "rankRange": {}
+ }
},
"layerNormalization": {
"input": {
@@ -395,14 +513,20 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"leakyRelu": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"lesser": {
"a": {
@@ -413,7 +537,10 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"lesserOrEqual": {
"a": {
@@ -424,40 +551,61 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"linear": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"log": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"logicalAnd": {
"a": {"dataTypes": ["uint8"], "rankRange": {"min": 0, "max": 4}},
"b": {"dataTypes": ["uint8"], "rankRange": {"min": 0, "max": 4}},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"logicalNot": {
"a": {"dataTypes": ["uint8"], "rankRange": {"min": 0, "max": 5}},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"logicalOr": {
"a": {"dataTypes": ["uint8"], "rankRange": {"min": 0, "max": 4}},
"b": {"dataTypes": ["uint8"], "rankRange": {"min": 0, "max": 4}},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"logicalXor": {
"a": {"dataTypes": ["uint8"], "rankRange": {"min": 0, "max": 4}},
"b": {"dataTypes": ["uint8"], "rankRange": {"min": 0, "max": 4}},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"lstm": {
"input": {
@@ -492,7 +640,18 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 3, "max": 3}
},
- "outputs": {"dataTypes": ["float32", "float16"]}
+ "output0": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 3, "max": 3}
+ },
+ "output1": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 3, "max": 3}
+ },
+ "output2": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 4, "max": 4}
+ }
},
"lstmCell": {
"input": {
@@ -527,7 +686,14 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 1, "max": 1}
},
- "outputs": {"dataTypes": ["float32", "float16"]}
+ "output0": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 2, "max": 2}
+ },
+ "output1": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 2, "max": 2}
+ }
},
"matmul": {
"a": {
@@ -538,7 +704,10 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 2, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 2, "max": 5}
+ }
},
"max": {
"a": {
@@ -549,14 +718,20 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"maxPool2d": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 4, "max": 4}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 4, "max": 4}
+ }
},
"min": {
"a": {
@@ -567,7 +742,10 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"mul": {
"a": {
@@ -578,14 +756,20 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"neg": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"notEqual": {
"a": {
@@ -596,14 +780,20 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["uint8"]}
+ "output": {
+ "dataTypes": ["uint8"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"pad": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 1, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 1, "max": 5}
+ }
},
"pow": {
"a": {
@@ -614,7 +804,10 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"prelu": {
"input": {
@@ -625,126 +818,180 @@
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 4}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 4}
+ }
},
"quantizeLinear": {
"input": {"dataTypes": ["float32"], "rankRange": {"min": 0, "max": 5}},
"scale": {"dataTypes": ["float32"], "rankRange": {"min": 0, "max": 5}},
"zeroPoint":
{"dataTypes": ["int8", "uint8"], "rankRange": {"min": 0, "max": 5}},
- "output": {"dataTypes": ["int8", "uint8"]}
+ "output": {
+ "dataTypes": ["int8", "uint8"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reciprocal": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceL1": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceL2": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceLogSum": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceLogSumExp": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceMax": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceMean": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceMin": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceProduct": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceSum": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reduceSumSquare": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"relu": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"resample2d": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 4, "max": 4}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 4, "max": 4}
+ }
},
"reshape": {
"input": {
"dataTypes": ["float32", "float16", "int32", "int8", "uint8"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32", "int8", "uint8"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32", "int8", "uint8"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"reverse": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"roundEven": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"scatterElements": {
"input": {
@@ -756,7 +1003,10 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 1, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 1, "max": 5}
+ }
},
"scatterND": {
"input": {
@@ -766,69 +1016,99 @@
"indices": {"dataTypes": ["int32"], "rankRange": {"min": 1, "max": 5}},
"updates": {
"dataTypes": ["float32", "float16", "int32"],
- "rankRange": {"min": 1, "max": 5}
+ "rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 1, "max": 5}
+ }
},
"sigmoid": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"sign": {
"input": {"dataTypes": [], "rankRange": {"min": 0, "max": 0}},
- "output": {"dataTypes": []}
+ "output": {
+ "dataTypes": [],
+ "rankRange": {"min": 0, "max": 0}
+ }
},
"sin": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"slice": {
"input": {
"dataTypes": ["float32", "float16", "int32", "int8", "uint8"],
"rankRange": {"min": 1, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32", "int8", "uint8"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32", "int8", "uint8"],
+ "rankRange": {"min": 1, "max": 5}
+ }
},
"softmax": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 1, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 1, "max": 5}
+ }
},
"softplus": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"softsign": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"split": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "outputs": {"dataTypes": ["float32", "float16", "int32"]}
+ "outputs": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"sqrt": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"sub": {
"a": {
@@ -839,42 +1119,60 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"tan": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"tanh": {
"input": {
"dataTypes": ["float32", "float16"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16"]}
+ "output": {
+ "dataTypes": ["float32", "float16"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"tile": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"transpose": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
},
"triangular": {
"input": {
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 2, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 2, "max": 5}
+ }
},
"where": {
"condition": {"dataTypes": ["uint8"], "rankRange": {"min": 0, "max": 5}},
@@ -886,6 +1184,9 @@
"dataTypes": ["float32", "float16", "int32"],
"rankRange": {"min": 0, "max": 5}
},
- "output": {"dataTypes": ["float32", "float16", "int32"]}
+ "output": {
+ "dataTypes": ["float32", "float16", "int32"],
+ "rankRange": {"min": 0, "max": 5}
+ }
}
}
diff --git a/testing/web-platform/tests/webnn/resources/utils.js b/testing/web-platform/tests/webnn/resources/utils.js
@@ -697,14 +697,19 @@ function validateContextSupportsGraph(context, graph) {
const supportLimits = context.opSupportLimits();
const castOpSupportLimits = supportLimits.cast;
const inputDataTypes = supportLimits.input.dataTypes;
+ const inputRankRange = supportLimits.input.rankRange;
const constantDataTypes = supportLimits.constant.dataTypes;
+ const constantRankRange = supportLimits.constant.rankRange;
const outputDataTypes = supportLimits.output.dataTypes;
+ const outputRankRange = supportLimits.output.rankRange;
function validateInputOrConstantDataTypeAndRank(
inputName, operatorSupportLimits, operand) {
const inputDescriptor = graph.inputs[inputName].descriptor;
const inputDataType = inputDescriptor.dataType;
+ const inputRank = inputDescriptor.shape.length;
if (inputDescriptor.constant) {
+ // Check graph constant data type
if (!constantDataTypes.includes(inputDataType) &&
!findCompatibleType(
inputDataType, constantDataTypes, castOpSupportLimits)) {
@@ -712,7 +717,18 @@ function validateContextSupportsGraph(context, graph) {
`Unsupported data type, constant '${operand}' data type ${
inputDataType} must be one of [${constantDataTypes}].`);
}
+
+ // Check graph constant rank
+ if (inputRank < constantRankRange.min) {
+ throw new TypeError(`Unsupported rank ${inputRank} for constant '${
+ operand}' (must be at least ${constantRankRange.min}).`);
+ }
+ if (inputRank > constantRankRange.max) {
+ throw new TypeError(`Unsupported rank ${inputRank} for constant '${
+ operand}' (must be at most ${constantRankRange.max}).`);
+ }
} else {
+ // Check graph input data type
if (!inputDataTypes.includes(inputDataType) &&
!findCompatibleType(
inputDataType, inputDataTypes, castOpSupportLimits)) {
@@ -720,9 +736,20 @@ function validateContextSupportsGraph(context, graph) {
`Unsupported data type, input '${operand}' data type ${
inputDataType} must be one of [${inputDataTypes}].`);
}
+
+ // Check graph input rank
+ if (inputRank < inputRankRange.min) {
+ throw new TypeError(`Unsupported rank ${inputRank} for input '${
+ operand}' (must be at least ${inputRankRange.min}).`);
+ }
+ if (inputRank > inputRankRange.max) {
+ throw new TypeError(`Unsupported rank ${inputRank} for input '${
+ operand}' (must be at most ${inputRankRange.max}).`);
+ }
}
const operandSupportLimits = operatorSupportLimits[operand];
+ // Check operand data type
const inputOperandDataTypes = operandSupportLimits.dataTypes;
if (!inputOperandDataTypes.includes(inputDataType) &&
!findCompatibleType(
@@ -732,7 +759,7 @@ function validateContextSupportsGraph(context, graph) {
inputDataType} must be one of [${inputOperandDataTypes}].`);
}
- const inputRank = inputDescriptor.shape.length;
+ // Check operand rank
const limitsRankRange = operandSupportLimits.rankRange;
if (inputRank < limitsRankRange.min) {
throw new TypeError(`Unsupported rank ${inputRank} for argument ${
@@ -745,9 +772,13 @@ function validateContextSupportsGraph(context, graph) {
}
}
- function validateOutputDataType(outputName, operatorSupportLimits, operand) {
+ function validateOutputDataTypeAndRank(
+ outputName, operatorSupportLimits, operand) {
const outputDataType =
graph.expectedOutputs[outputName].descriptor.dataType;
+ const outputRank =
+ graph.expectedOutputs[outputName].descriptor.shape.length;
+ // Check graph output data type
if (!outputDataTypes.includes(outputDataType) &&
!findCompatibleType(
outputDataType, outputDataTypes, castOpSupportLimits)) {
@@ -756,6 +787,17 @@ function validateContextSupportsGraph(context, graph) {
outputDataType} must be one of [${outputDataTypes}].`);
}
+ // Check graph output rank
+ if (outputRank < outputRankRange.min) {
+ throw new TypeError(`Unsupported rank ${outputRank} for output '${
+ operand}' (must be at least ${outputRankRange.min}).`);
+ }
+ if (outputRank > outputRankRange.max) {
+ throw new TypeError(`Unsupported rank ${outputRank} for output '${
+ operand}' (must be at most ${outputRankRange.max}).`);
+ }
+
+ // Check output operand data type
const outputOperandDataTypes = operatorSupportLimits[operand].dataTypes;
if (!outputOperandDataTypes.includes(outputDataType) &&
!findCompatibleType(
@@ -764,6 +806,17 @@ function validateContextSupportsGraph(context, graph) {
`Unsupported data type, output '${operand}' data type ${
outputDataType} must be one of [${outputOperandDataTypes}].`);
}
+
+ // Check output operand rank
+ const outputOperandRankRange = operatorSupportLimits[operand].rankRange;
+ if (outputRank < outputOperandRankRange.min) {
+ throw new TypeError(`Unsupported rank ${outputRank} for output '${
+ operand}' (must be at least ${outputOperandRankRange.min}).`);
+ }
+ if (outputRank > outputOperandRankRange.max) {
+ throw new TypeError(`Unsupported rank ${outputRank} for output '${
+ operand}' (must be at most ${outputOperandRankRange.max}).`);
+ }
}
try {
@@ -780,10 +833,10 @@ function validateContextSupportsGraph(context, graph) {
// intermediate output
continue;
}
- validateOutputDataType(
+ validateOutputDataTypeAndRank(
operator.outputs, operatorSupportLimits, 'output');
} else if (operand === 'outputs') {
- // multiples output operands
+ // multiple output operands of split operator
assert(
Array.isArray(operator.outputs),
`the outputs of ${operatorName} should be a string array.`);
@@ -795,9 +848,19 @@ function validateContextSupportsGraph(context, graph) {
// intermediate output
continue;
}
- validateOutputDataType(
+ validateOutputDataTypeAndRank(
outputName, operatorSupportLimits, 'outputs');
}
+ } else if (/output[0-2]/.test(operand)) {
+ // multiple output operands of gru/lstm/lstmCell operators
+ assert(
+ Array.isArray(operator.outputs),
+ `the outputs of ${operatorName} should be a string array.`);
+ const index = parseInt(operand.match(/output([0-2])/)[1]);
+ if (index < operator.outputs.length) {
+ validateOutputDataTypeAndRank(
+ operator.outputs[index], operatorSupportLimits, operand);
+ }
} else {
// input operand(s)
if (operatorName === 'concat') {
@@ -1260,12 +1323,12 @@ const getResample2dPrecisionTolerance =
let minimumDataTypeSet;
-function checkMinimum(descriptor, operandMinimumLimits, isInput = true) {
+function checkMinimum(descriptor, operandMinimumLimits) {
const targetRank = descriptor.shape.length;
const targetDataType = descriptor.dataType;
let isMinimum = operandMinimumLimits.dataTypes.includes(targetDataType);
- if (isMinimum && isInput) {
+ if (isMinimum) {
isMinimum = operandMinimumLimits.rankRange.min <= targetRank &&
targetRank <= operandMinimumLimits.rankRange.max;
}
@@ -1275,24 +1338,30 @@ function checkMinimum(descriptor, operandMinimumLimits, isInput = true) {
function getOutputMinimumLimits(operatorsResources, outputOperandName) {
let operatorName;
- let outputsName;
+ let outputName;
for (let operator of operatorsResources) {
if (typeof operator.outputs === 'string' &&
operator.outputs === outputOperandName) {
operatorName = operator.name;
- outputsName = 'output';
+ outputName = 'output';
break;
} else if (
Array.isArray(operator.outputs) &&
operator.outputs.includes(outputOperandName)) {
// Current gru, lstm, lstmCell and split operators have multiple outputs
operatorName = operator.name;
- outputsName = 'outputs';
+ if (minimumDataTypeSet[operatorName].hasOwnProperty('outputs')) {
+ // for split operator
+ outputName = 'outputs';
+ } else {
+ // for gru, lstm, lstmCell operators
+ outputName = `output${operator.outputs.indexOf(outputOperandName)}`;
+ }
break;
}
}
- return minimumDataTypeSet[operatorName][outputsName];
+ return minimumDataTypeSet[operatorName][outputName];
}
async function getMinimumDataTypeSetJson() {
@@ -1367,7 +1436,7 @@ function isMinimumTest(test) {
for (let [outputOperandName, value] of Object.entries(outputsResources)) {
const outputMinimumLimits =
getOutputMinimumLimits(graphResources.operators, outputOperandName)
- isMinimum = checkMinimum(value.descriptor, outputMinimumLimits, false);
+ isMinimum = checkMinimum(value.descriptor, outputMinimumLimits);
if (!isMinimum) {
return isMinimum;
}