round_even.https.any.js (6167B)
1 // META: title=test WebNN API element-wise roundEven operation 2 // META: global=window 3 // META: variant=?cpu 4 // META: variant=?gpu 5 // META: variant=?npu 6 // META: script=../resources/utils.js 7 // META: timeout=long 8 9 'use strict'; 10 11 // https://www.w3.org/TR/webnn/#api-mlgraphbuilder-unary 12 // Round the input tensor with halves to the nearest even value, element-wise. 13 // 14 // MLOperand roundEven(MLOperand input); 15 const getRoundEvenPrecisionTolerance = () => { 16 return {metricType: 'ULP', value: 0}; 17 }; 18 19 const roundEvenTests = [ 20 // roundEven tests 21 { 22 'name': 'roundEven float32 positive 0D scalar', 23 'graph': { 24 'inputs': { 25 'roundEvenInput': { 26 'data': [1.5], 27 'descriptor': {shape: [], dataType: 'float32'} 28 } 29 }, 30 'operators': [{ 31 'name': 'roundEven', 32 'arguments': [{'input': 'roundEvenInput'}], 33 'outputs': 'roundEvenOutput' 34 }], 35 'expectedOutputs': { 36 'roundEvenOutput': { 37 'data': [2], 38 'descriptor': {shape: [], dataType: 'float32'} 39 } 40 } 41 } 42 }, 43 { 44 'name': 'roundEven float32 negative 1D tensor', 45 'graph': { 46 'inputs': { 47 'roundEvenInput': { 48 'data': [-1.5], 49 'descriptor': {shape: [1], dataType: 'float32'} 50 } 51 }, 52 'operators': [{ 53 'name': 'roundEven', 54 'arguments': [{'input': 'roundEvenInput'}], 55 'outputs': 'roundEvenOutput' 56 }], 57 'expectedOutputs': { 58 'roundEvenOutput': { 59 'data': [-2], 60 'descriptor': {shape: [1], dataType: 'float32'} 61 } 62 } 63 } 64 }, 65 { 66 'name': 'roundEven float32 2D tensor', 67 'graph': { 68 'inputs': { 69 'roundEvenInput': { 70 'data': [-1.5, 0.5], 71 'descriptor': {shape: [1, 2], dataType: 'float32'} 72 } 73 }, 74 'operators': [{ 75 'name': 'roundEven', 76 'arguments': [{'input': 'roundEvenInput'}], 77 'outputs': 'roundEvenOutput' 78 }], 79 'expectedOutputs': { 80 'roundEvenOutput': { 81 'data': [-2, 0], 82 'descriptor': {shape: [1, 2], dataType: 'float32'} 83 } 84 } 85 } 86 }, 87 { 88 'name': 'roundEven float32 3D tensor', 89 'graph': { 90 'inputs': { 91 'roundEvenInput': { 92 'data': [-2.5, -1.5, 0.5, 1.5], 93 'descriptor': {shape: [1, 2, 2], dataType: 'float32'} 94 } 95 }, 96 'operators': [{ 97 'name': 'roundEven', 98 'arguments': [{'input': 'roundEvenInput'}], 99 'outputs': 'roundEvenOutput' 100 }], 101 'expectedOutputs': { 102 'roundEvenOutput': { 103 'data': [-2, -2, 0, 2], 104 'descriptor': {shape: [1, 2, 2], dataType: 'float32'} 105 } 106 } 107 } 108 }, 109 { 110 'name': 'roundEven float32 4D tensor', 111 'graph': { 112 'inputs': { 113 'roundEvenInput': { 114 'data': [-2.5, -1.5, 0.5, 1.5], 115 'descriptor': {shape: [1, 2, 1, 2], dataType: 'float32'} 116 } 117 }, 118 'operators': [{ 119 'name': 'roundEven', 120 'arguments': [{'input': 'roundEvenInput'}], 121 'outputs': 'roundEvenOutput' 122 }], 123 'expectedOutputs': { 124 'roundEvenOutput': { 125 'data': [-2, -2, 0, 2], 126 'descriptor': {shape: [1, 2, 1, 2], dataType: 'float32'} 127 } 128 } 129 } 130 }, 131 132 // float16 tests 133 { 134 'name': 'roundEven float16 positive 0D scalar', 135 'graph': { 136 'inputs': { 137 'roundEvenInput': { 138 'data': [1.5], 139 'descriptor': {shape: [], dataType: 'float16'} 140 } 141 }, 142 'operators': [{ 143 'name': 'roundEven', 144 'arguments': [{'input': 'roundEvenInput'}], 145 'outputs': 'roundEvenOutput' 146 }], 147 'expectedOutputs': { 148 'roundEvenOutput': { 149 'data': [2], 150 'descriptor': {shape: [], dataType: 'float16'} 151 } 152 } 153 } 154 }, 155 { 156 'name': 'roundEven float16 negative 1D tensor', 157 'graph': { 158 'inputs': { 159 'roundEvenInput': { 160 'data': [-1.5], 161 'descriptor': {shape: [1], dataType: 'float16'} 162 } 163 }, 164 'operators': [{ 165 'name': 'roundEven', 166 'arguments': [{'input': 'roundEvenInput'}], 167 'outputs': 'roundEvenOutput' 168 }], 169 'expectedOutputs': { 170 'roundEvenOutput': { 171 'data': [-2], 172 'descriptor': {shape: [1], dataType: 'float16'} 173 } 174 } 175 } 176 }, 177 { 178 'name': 'roundEven float16 2D tensor', 179 'graph': { 180 'inputs': { 181 'roundEvenInput': { 182 'data': [-1.5, 0.5], 183 'descriptor': {shape: [1, 2], dataType: 'float16'} 184 } 185 }, 186 'operators': [{ 187 'name': 'roundEven', 188 'arguments': [{'input': 'roundEvenInput'}], 189 'outputs': 'roundEvenOutput' 190 }], 191 'expectedOutputs': { 192 'roundEvenOutput': { 193 'data': [-2, 0], 194 'descriptor': {shape: [1, 2], dataType: 'float16'} 195 } 196 } 197 } 198 }, 199 { 200 'name': 'roundEven float16 3D tensor', 201 'graph': { 202 'inputs': { 203 'roundEvenInput': { 204 'data': [-2.5, -1.5, 0.5, 1.5], 205 'descriptor': {shape: [1, 2, 2], dataType: 'float16'} 206 } 207 }, 208 'operators': [{ 209 'name': 'roundEven', 210 'arguments': [{'input': 'roundEvenInput'}], 211 'outputs': 'roundEvenOutput' 212 }], 213 'expectedOutputs': { 214 'roundEvenOutput': { 215 'data': [-2, -2, 0, 2], 216 'descriptor': {shape: [1, 2, 2], dataType: 'float16'} 217 } 218 } 219 } 220 }, 221 { 222 'name': 'roundEven float16 4D tensor', 223 'graph': { 224 'inputs': { 225 'roundEvenInput': { 226 'data': [-2.5, -1.5, 0.5, 1.5], 227 'descriptor': {shape: [1, 2, 1, 2], dataType: 'float16'} 228 } 229 }, 230 'operators': [{ 231 'name': 'roundEven', 232 'arguments': [{'input': 'roundEvenInput'}], 233 'outputs': 'roundEvenOutput' 234 }], 235 'expectedOutputs': { 236 'roundEvenOutput': { 237 'data': [-2, -2, 0, 2], 238 'descriptor': {shape: [1, 2, 1, 2], dataType: 'float16'} 239 } 240 } 241 } 242 }, 243 ] 244 245 webnn_conformance_test( 246 roundEvenTests, buildAndExecuteGraph, getRoundEvenPrecisionTolerance);