UNPKG

@tensorflow/tfjs-backend-wasm

Version:

This package adds a WebAssembly backend to TensorFlow.js. It currently supports the following models from our [models](https://github.com/tensorflow/tfjs-models) repo: - BlazeFace - BodyPix - CocoSSD - Face landmarks detection - HandPose - KNN classifier

17 lines 144 kB
/** * @license * Copyright 2024 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@tensorflow/tfjs-core"),require("fs"),require("path"),require("perf_hooks"),require("os")):"function"==typeof define&&define.amd?define(["exports","@tensorflow/tfjs-core","fs","path","perf_hooks","os"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).tf=e.tf||{},e.tf.wasm=e.tf.wasm||{}),e.tf,e.fs,e.path,e.perf_hooks,e.require$$4)}(this,(function(e,t,n,a,r,u){"use strict";function i(e,t){return t.forEach((function(t){t&&"string"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(n){if("default"!==n&&!(n in e)){var a=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,a.get?a:{enumerable:!0,get:function(){return t[n]}})}}))})),e}var s,o;let d;!function(e){e[e.float32=0]="float32",e[e.int32=1]="int32",e[e.bool=2]="bool",e[e.string=3]="string",e[e.complex64=4]="complex64"}(s||(s={})),function(e){e[e.linear=0]="linear",e[e.relu=1]="relu",e[e.relu6=2]="relu6",e[e.prelu=3]="prelu",e[e.leakyrelu=4]="leakyrelu",e[e.sigmoid=5]="sigmoid",e[e.elu=6]="elu"}(o||(o={}));const l={kernelName:t._FusedMatMul,backendName:"wasm",setupFunc:function(e){d=e.wasm.cwrap(t._FusedMatMul,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{a:u,b:i,bias:s,preluActivationWeights:l}=n;if("float32"!==u.dtype||"float32"!==i.dtype)throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");const{transposeA:p,transposeB:c,activation:m,leakyreluAlpha:f}=r,h=a.dataIdMap.get(u.dataId).id,b=a.dataIdMap.get(i.dataId).id;let _=0;if(null!=s){const e=a.dataIdMap.get(s.dataId);if(1!==e.shape.length)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${e.shape.length}.`);_=e.id}const y=null==l?0:a.dataIdMap.get(l.dataId).id,g=o[m];if(null==g)throw new Error(`${m} activation not yet supported for FusedConv2D in the wasm backend.`);const k=p?u.shape[2]:u.shape[1],I=c?i.shape[1]:i.shape[2],w=t.broadcast_util.assertAndGetBroadcastShape(u.shape.slice(0,-2),i.shape.slice(0,-2)),M=a.makeOutput([...w,k,I],u.dtype),S=a.dataIdMap.get(M.dataId).id,A=new Uint8Array(new Int32Array(u.shape).buffer),v=new Uint8Array(new Int32Array(i.shape).buffer);return d(h,A,u.shape.length,b,v,i.shape.length,p,c,g,_,y,f||0,S),M}};function p(e,n){let a;return{kernelName:e,backendName:"wasm",setupFunc:function(t){a=t.wasm.cwrap(e,null,["number","number","number"])},kernelFunc:function(e){const{backend:r,inputs:{x:u}}=e,i=r.dataIdMap.get(u.dataId).id,o=r.makeOutput(u.shape,n||u.dtype),d=r.dataIdMap.get(o.dataId).id;return 0===t.util.sizeFromShape(o.shape)||a(i,s[u.dtype],d),o}}}const c=p(t.Abs),m=p(t.Acos),f=p(t.Acosh);function h(e,n,a){let r;return{kernelName:e,backendName:"wasm",setupFunc:function(t){r=t.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])},kernelFunc:function(e){const{backend:n,inputs:u}=e,{a:i,b:o}=u,d=n.dataIdMap.get(i.dataId).id,l=n.dataIdMap.get(o.dataId).id,p=null!=a?a:i.dtype,c=t.backend_util.assertAndGetBroadcastShape(i.shape,o.shape),m=n.makeOutput(c,p);if(0===t.util.sizeFromShape(c))return m;const f=new Uint8Array(new Int32Array(i.shape).buffer),h=new Uint8Array(new Int32Array(o.shape).buffer),b=n.dataIdMap.get(m.dataId).id;return r(d,f,i.shape.length,l,h,o.shape.length,s[i.dtype],b),m}}}const b=h(t.Add);let _;const y={kernelName:t.AddN,backendName:"wasm",setupFunc:function(e){_=e.wasm.cwrap(t.AddN,null,["array","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a}=e,r=a.makeOutput(n[0].shape,n[0].dtype);if(0===t.util.sizeFromShape(r.shape))return r;const u=n.map((e=>a.dataIdMap.get(e.dataId).id)),i=new Uint8Array(new Int32Array(u).buffer),o=a.dataIdMap.get(r.dataId).id;return _(i,u.length,s[r.dtype],o),r}};function g(e){const{inputs:{x:n},backend:a}=e;if("string"===n.dtype)return t.tensor(a.readSync(n.dataId),n.shape,n.dtype);const r=a.makeOutput(n.shape,n.dtype),u=a.typedArrayFromHeap(n);return a.typedArrayFromHeap(r).set(u),r}const k={kernelName:t.Identity,backendName:"wasm",kernelFunc:g};let I;function w(e){const{inputs:t,backend:n,attrs:a}=e,[r,u]=function(e,t){const n=[],a=[];for(let r=0;r<e.length;++r)1!==e[r]&&n.push(e[r]),1!==e[t[r]]&&a.push(t[r]);for(let e=0;e<a.length;++e){let t=-1;for(let n=0;n<a.length;++n)a[n]>=e&&(-1===t||a[t]>a[n])&&(t=n);a[t]=e}return[n,a]}(t.x.shape,a.perm);let i=!0;for(let e=0;e<u.length;e++)u[e]!==e&&(i=!1);const o=function(e,t){const n=new Array(e.length);for(let a=0;a<n.length;a++)n[a]=e[t[a]];return n}(t.x.shape,a.perm),d={dataId:t.x.dataId,shape:r,dtype:t.x.dtype};if(i){const e=g({inputs:t,backend:n});return e.shape=o,e}const l=n.makeOutput(o,d.dtype),p=n.dataIdMap.get(d.dataId).id,c=n.dataIdMap.get(l.dataId).id,m=new Uint8Array(new Int32Array(u).buffer),f=new Uint8Array(new Int32Array(d.shape).buffer);return I(p,f,d.shape.length,s[d.dtype],c,m,u.length),l}const M={kernelName:t.Transpose,backendName:"wasm",kernelFunc:w,setupFunc:function(e){I=e.wasm.cwrap(t.Transpose,null,["number","array","number","number","number","array","number"])}};function S(e,n,a){const r=e.shape,u=e.shape.length,i=t.util.parseAxisParam(n,r);let s=i;const o=t.backend_util.getAxesPermutation(s,u);let d=null,l=!1;if(null!=o){const n=new Array(u);for(let e=0;e<n.length;e++)n[e]=r[o[e]];s=t.backend_util.getInnerMostAxes(s.length,u),d=w({inputs:{x:e},attrs:{perm:o},backend:a});const i=a.dataIdMap.get(e.dataId).id;a.dataIdMap.get(d.dataId).id!==i&&(l=!0)}return{transposed:d,originalAxes:i,axes:s,inputWasTransposed:l}}let A;const v={kernelName:t.All,backendName:"wasm",setupFunc:function(e){A=e.wasm.cwrap(t.All,null,["number, number, number"])},kernelFunc:function(e){const{backend:n,inputs:a,attrs:r}=e,{axis:u,keepDims:i}=r,{x:s}=a;let o=n.dataIdMap.get(s.dataId).id,d=s;const{transposed:l,axes:p,originalAxes:c,inputWasTransposed:m}=S(s,u,n);if(m){d=l,o=n.dataIdMap.get(l.dataId).id}const f=d.shape.length;t.backend_util.assertAxesAreInnerMostDims("all",p,f);const[h,b]=t.backend_util.computeOutAndReduceShapes(d.shape,p),_=t.util.sizeFromShape(b),y=n.makeOutput(h,s.dtype);if(0!==t.util.sizeFromShape(d.shape)){const e=n.dataIdMap.get(y.dataId).id;A(o,_,e)}if(m&&n.disposeData(l.dataId),i){const e=t.backend_util.expandShapeToKeepDim(y.shape,c);y.shape=e}return y}};let x;const F={kernelName:t.Any,backendName:"wasm",setupFunc:function(e){x=e.wasm.cwrap(t.Any,null,["number, number, number"])},kernelFunc:function(e){const{backend:n,inputs:a,attrs:r}=e,{axis:u,keepDims:i}=r,{x:s}=a;let o=n.dataIdMap.get(s.dataId).id,d=s;const{transposed:l,axes:p,originalAxes:c,inputWasTransposed:m}=S(s,u,n);if(m){d=l,o=n.dataIdMap.get(l.dataId).id}const f=d.shape.length;t.backend_util.assertAxesAreInnerMostDims("any",p,f);const[h,b]=t.backend_util.computeOutAndReduceShapes(d.shape,p),_=t.util.sizeFromShape(b),y=n.makeOutput(h,s.dtype);if(0!==t.util.sizeFromShape(d.shape)){const e=n.dataIdMap.get(y.dataId).id;x(o,_,e)}if(m&&n.disposeData(l.dataId),i){const e=t.backend_util.expandShapeToKeepDim(y.shape,c);y.shape=e}return y}};function N(e){let n;return{kernelName:e,backendName:"wasm",setupFunc:function(t){n=t.wasm.cwrap(e,null,["number","number","number","number","number"])},kernelFunc:function(e){const{backend:a,inputs:r,attrs:u}=e,{axis:i}=u,{x:o}=r,d=a.dataIdMap.get(o.dataId).id;let l=d,p=o;const{transposed:c,axes:m,inputWasTransposed:f}=S(o,i,a);if(f){const e=a.dataIdMap.get(c.dataId).id;e!==d&&(p=c,l=e)}const h=p.shape.slice(0,-1),b=a.makeOutput(h,"int32"),_=a.dataIdMap.get(b.dataId).id,y=t.util.sizeFromShape(b.shape),g=p.shape[m[0]];return n(l,s[p.dtype],y,g,_),f&&a.disposeData(c.dataId),b}}}const D=N(t.ArgMax),R=N(t.ArgMin),E=p(t.Asin),P=p(t.Asinh),C=p(t.Atan),W=h(t.Atan2),O=p(t.Atanh);let T;const z={kernelName:t.AvgPool,backendName:"wasm",setupFunc:function(e){T=e.wasm.cwrap(t.AvgPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,attrs:a,backend:r}=e,u=n.x,i=r.dataIdMap.get(u.dataId).id,{filterSize:s,strides:o,pad:d,dimRoundingMode:l}=a,p=t.backend_util.computePool2DInfo(u.shape,s,o,1,d,l),c=p.filterHeight,m=p.filterWidth,f=p.padInfo.top,h=p.padInfo.right,b=p.padInfo.bottom,_=p.padInfo.left,y=p.strideHeight,g=p.strideWidth,k=p.inChannels;if("channelsLast"!==p.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${p.dataFormat}'. Please use 'channelsLast'.`);if(1!==p.dilationWidth||1!==p.dilationHeight)throw new Error(`was backend only supports average pooling with dilation = [1, 1], got [${p.dilationHeight}, ${p.dilationWidth}].`);const I=r.makeOutput(p.outShape,"float32"),w=r.dataIdMap.get(I.dataId).id;return T(i,u.shape[0],u.shape[1],u.shape[2],c,m,f,h,b,_,y,g,k,w),I}};let B;const H={kernelName:t.AvgPool3D,backendName:"wasm",setupFunc:function(e){B=e.wasm.cwrap("AvgPool3D",null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u}=n,{filterSize:i,strides:s,pad:o,dimRoundingMode:d,dataFormat:l}=r,p=t.backend_util.computePool3DInfo(u.shape,i,s,1,o,d,l),c=a.makeOutput(p.outShape,u.dtype);return B(a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(c.dataId).id,p.batchSize,p.inChannels,p.inDepth,p.inHeight,p.inWidth,p.outDepth,p.outHeight,p.outWidth,p.strideDepth,p.strideHeight,p.strideWidth,p.dilationDepth,p.dilationHeight,p.dilationWidth,p.effectiveFilterDepth,p.effectiveFilterHeight,p.effectiveFilterWidth,p.padInfo.front,p.padInfo.top,p.padInfo.left),c}};let L;const G={kernelName:t.AvgPool3DGrad,backendName:"wasm",setupFunc:function(e){L=e.wasm.cwrap("AvgPool3DGrad",null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{dy:u,input:i}=n,{filterSize:s,strides:o,pad:d,dimRoundingMode:l}=r,p=t.backend_util.computePool3DInfo(i.shape,s,o,1,d,l),c=a.makeOutput(i.shape,i.dtype);return L(a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(c.dataId).id,p.batchSize,p.inChannels,p.inDepth,p.inHeight,p.inWidth,p.outDepth,p.outHeight,p.outWidth,p.strideDepth,p.strideHeight,p.strideWidth,p.dilationDepth,p.dilationHeight,p.dilationWidth,p.effectiveFilterDepth,p.effectiveFilterHeight,p.effectiveFilterWidth,p.padInfo.front,p.padInfo.top,p.padInfo.left,p.filterDepth,p.filterHeight,p.filterWidth),c}};let U;const j={kernelName:t.AvgPoolGrad,backendName:"wasm",setupFunc:function(e){U=e.wasm.cwrap("AvgPoolGrad",null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{dy:u,input:i}=n,{filterSize:s,strides:o,pad:d}=r,l=t.backend_util.computePool2DInfo(i.shape,s,o,1,d),p=a.makeOutput(i.shape,i.dtype);return U(a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(p.dataId).id,l.batchSize,l.inChannels,l.inHeight,l.inWidth,l.outHeight,l.outWidth,l.strideHeight,l.strideWidth,l.dilationHeight,l.dilationWidth,l.effectiveFilterHeight,l.effectiveFilterWidth,l.padInfo.top,l.padInfo.left,l.filterHeight,l.filterWidth),p}};function q(e){const{inputs:n,attrs:a}=e,{x:r}=n,{shape:u}=a,i=t.util.sizeFromShape(r.shape),s=t.util.inferFromImplicitShape(u,i);return t.util.assert(i===t.util.sizeFromShape(s),(()=>`new shape: ${s}, old shape: ${r.shape}. New shape and old shape must have the same number of elements.`)),e.backend.incRef(r.dataId),{dataId:r.dataId,shape:s,dtype:r.dtype}}const V={kernelName:t.Reshape,backendName:"wasm",kernelFunc:q};let $;const K={kernelName:t.BatchMatMul,backendName:"wasm",setupFunc:function(e){$=e.wasm.cwrap(t.BatchMatMul,null,["number","array","number","number","array","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{a:u,b:i}=n,{transposeA:s,transposeB:o}=r;if("float32"!==u.dtype||"float32"!==i.dtype)throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");const d=u.shape.length,l=i.shape.length,p=s?u.shape[d-2]:u.shape[d-1],c=o?i.shape[l-1]:i.shape[l-2],m=s?u.shape[d-1]:u.shape[d-2],f=o?i.shape[l-2]:i.shape[l-1],h=u.shape.slice(0,-2),b=i.shape.slice(0,-2),_=t.util.sizeFromShape(h),y=t.util.sizeFromShape(b),g=t.broadcast_util.assertAndGetBroadcastShape(u.shape.slice(0,-2),i.shape.slice(0,-2)).concat([m,f]);t.util.assert(p===c,(()=>`Error in matMul: inner shapes (${p}) and (${c}) of Tensors with shapes ${u.shape} and ${i.shape} and transposeA=${s} and transposeB=${o} must match.`));const k=o?[y,f,c]:[y,c,f],I=q({inputs:{x:u},backend:a,attrs:{shape:s?[_,p,m]:[_,m,p]}}),w=q({inputs:{x:i},backend:a,attrs:{shape:k}}),M=a.dataIdMap.get(I.dataId).id,S=a.dataIdMap.get(w.dataId).id,A=s?I.shape[2]:I.shape[1],v=o?w.shape[1]:w.shape[2],x=Math.max(_,y),F=a.makeOutput([x,A,v],I.dtype),N=a.dataIdMap.get(F.dataId).id,D=new Uint8Array(new Int32Array(I.shape).buffer),R=new Uint8Array(new Int32Array(w.shape).buffer);return $(M,D,I.shape.length,S,R,w.shape.length,s,o,N),a.disposeData(I.dataId),a.disposeData(w.dataId),F.shape=g,F}};function X(e,n,a,r,u){const i=t.slice_util.isSliceContinous(r,n,a),s=t.util.sizeFromShape(a),o=t.util.computeStrides(r);if(i){const a=t.slice_util.computeFlatOffset(n,o);return"string"===u?e.slice(a,a+s):e.subarray(a,a+s)}const d="string"===u?t.backend_util.fromUint8ToStringArray(e):e,l=t.buffer(r,u,d),p=t.buffer(a,u);for(let e=0;e<p.size;++e){const t=p.indexToLoc(e),a=t.map(((e,t)=>e+n[t]));p.set(l.get(...a),...t)}return"string"===u?t.backend_util.fromStringArrayToUint8(p.values):p.values}t.backend_util.RowPartitionType;class Q{constructor(e,n,a,r,u,i){this.separator=t.util.encodeString(e),this.nGramWidths=n,this.leftPad=t.util.encodeString(a),this.rightPad=t.util.encodeString(r),this.padWidth=u,this.preserveShort=i}getPadWidth(e){return Math.min(this.padWidth<0?e-1:this.padWidth,e-1)}getNumNGrams(e,t){const n=this.getPadWidth(t);return Math.max(0,e+2*n-t+1)}createNGrams(e,t,n,a,r,u){for(let i=0;i<r;++i){const s=this.getPadWidth(u),o=Math.max(0,s-i),d=Math.max(0,s-(r-(i+1))),l=u-(o+d),p=t+(o>0?0:i-s);let c=0;c+=o*this.leftPad.length;for(let t=0;t<l;++t)c+=e[p+t].length;c+=d*this.rightPad.length;c+=(o+d+l-1)*this.separator.length,n[a+i]=new Uint8Array(c);const m=n[a+i];let f=0;const h=e=>e.forEach((e=>m[f++]=e));for(let e=0;e<o;++e)h(this.leftPad),h(this.separator);for(let t=0;t<l-1;++t)h(e[p+t]),h(this.separator);if(l>0){h(e[p+l-1]);for(let e=0;e<d;++e)h(this.separator),h(this.rightPad)}else{for(let e=0;e<d-1;++e)h(this.rightPad),h(this.separator);h(this.rightPad)}}}compute(e,n){const a=e.length,r=n.length;if(r>0){let e=n[0];if(0!==e)throw new Error(`First split value must be 0, got ${e}`);for(let t=1;t<r;++t){let r=n[t]>=e;if(r=r&&n[t]<=a,!r)throw new Error(`Invalid split value ${n[t]}, must be in [${e}, ${a}]`);e=n[t]}if(e!==a)throw new Error(`Last split value must be data size. Expected ${a}, got ${e}`)}const u=r-1,i=t.util.getArrayFromDType("int32",r);if(0===a||0===r){const e=new Array(a);for(let e=0;e<=u;++e)i[e]=0;return[e,i]}i[0]=0;for(let e=1;e<=u;++e){const t=n[e]-n[e-1];let a=0;this.nGramWidths.forEach((e=>{a+=this.getNumNGrams(t,e)})),this.preserveShort&&t>0&&0===a&&(a=1),i[e]=i[e-1]+a}const s=new Array(i[u]);for(let t=0;t<u;++t){const a=n[t];let r=i[t];if(this.nGramWidths.forEach((u=>{const i=n[t+1]-n[t],o=this.getNumNGrams(i,u);this.createNGrams(e,a,s,r,o,u),r+=o})),this.preserveShort&&r===i[t]){const u=n[t+1]-n[t];if(0===u)continue;const i=u+2*this.padWidth,o=1;this.createNGrams(e,a,s,r,o,i)}}return[s,i]}}function J(e,t,n,a){if(!e.length)return;if(0===t.length){for(let t=0;t<e.length;++t)a.push(e.subarray(t,t+1));return}if(1===t.length){const r=t[0];let u=e.indexOf(r);for(;-1!==u;){const t=e.subarray(0,u);n&&0===t.length||a.push(t),u=(e=e.subarray(u+1)).indexOf(r)}return void(n&&0===e.length||a.push(e))}let r=0;for(let u=0;u<e.length+1;u++)if(u===e.length||-1!==t.indexOf(e[u])){const t=e.subarray(r,u);n&&0===t.length||a.push(t),r=u+1}}function Z(e){const{inputs:{x:n},attrs:{begin:a,size:r},backend:u}=e,[i,s]=t.slice_util.parseSliceParams(n,a,r),o=t.slice_util.isSliceContinous(n.shape,i,s),d=u.readSync(n.dataId),l=u.makeOutput(s,n.dtype),p=t.util.computeStrides(n.shape),c=u.dataIdMap.get(l.dataId);if(o){const e=t.slice_util.computeFlatOffset(i,p);if("string"===n.dtype)c.stringBytes=d.slice(e,e+t.util.sizeFromShape(s));else{u.typedArrayFromHeap(l).set(d.subarray(e,e+t.util.sizeFromShape(s)))}return l}if("string"===n.dtype){const e=X(d,i,s,n.shape,n.dtype);return c.stringBytes=e,l}const m=u.typedArrayFromHeap(l),f=n.shape.length;if(2===f)!function(e,t,n,a,r){let u=0;const i=a[0],s=a[1],o=i+r[0];for(let a=i;a<o;a++){const i=a*t+s;n.set(e.subarray(i,i+r[1]),u),u+=r[1]}}(d,p[0],m,i,s);else if(3===f)!function(e,t,n,a,r,u){let i=0;const s=r[0],o=r[1],d=r[2],l=s+u[0],p=o+u[1];for(let r=s;r<l;r++)for(let s=o;s<p;s++){const o=r*t+s*n+d;a.set(e.subarray(o,o+u[2]),i),i+=u[2]}}(d,p[0],p[1],m,i,s);else if(4===f)!function(e,t,n,a,r,u,i){let s=0;const o=u[0],d=u[1],l=u[2],p=o+i[0],c=d+i[1],m=l+i[2],f=u[3];for(let u=o;u<p;u++)for(let o=d;o<c;o++)for(let d=l;d<m;d++){const l=u*t+o*n+d*a+f;r.set(e.subarray(l,l+i[3]),s),s+=i[3]}}(d,p[0],p[1],p[2],m,i,s);else{const e=X(d,i,s,n.shape,n.dtype);m.set(e)}return l}const Y={kernelName:t.Slice,backendName:"wasm",kernelFunc:Z};const ee={kernelName:t.BatchToSpaceND,backendName:"wasm",kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u}=n,{blockShape:i,crops:s}=r,o=i.reduce(((e,t)=>e*t)),d=t.backend_util.getReshaped(u.shape,i,o),l=t.backend_util.getPermuted(d.length,i.length),p=t.backend_util.getReshapedPermuted(u.shape,i,o),c=t.backend_util.getSliceBeginCoords(s,i.length),m=t.backend_util.getSliceSize(p,s,i.length),f=q({inputs:{x:u},backend:a,attrs:{shape:d}}),h=w({inputs:{x:f},backend:a,attrs:{perm:l}}),b=q({inputs:{x:h},backend:a,attrs:{shape:p}}),_=Z({inputs:{x:b},backend:a,attrs:{begin:c,size:m}});return a.disposeData(f.dataId),a.disposeData(h.dataId),a.disposeData(b.dataId),_}};let te;const ne={kernelName:t.Bincount,backendName:"wasm",setupFunc:function(e){te=e.wasm.cwrap(t.Bincount,null,["number","number","boolean","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{x:r,weights:u}=n,{size:i}=a,o=0!==u.shape.reduce(((e,t)=>e*t),1),d=1===r.shape.length?[i]:[r.shape[0],i],l=t.makeOutput(d,u.dtype);function p(e){return t.dataIdMap.get(e.dataId).id}return te(p(r),i,o,p(u),s[u.dtype],p(l)),l}},ae=h(t.BitwiseAnd);const re={kernelName:t.BroadcastArgs,backendName:"wasm",kernelFunc:function(e){const{inputs:n,backend:a}=e,{s0:r,s1:u}=n,i=a.typedArrayFromHeap(r),s=a.typedArrayFromHeap(u),o=t.backend_util.assertAndGetBroadcastShape(Array.from(i),Array.from(s));return a.makeOutput([o.length],"int32",void 0,new Int32Array(o))}};function ue(e){const{inputs:{x:t},attrs:{dtype:n},backend:a}=e,r=a.makeOutput(t.shape,n),u=a.typedArrayFromHeap(t);return a.typedArrayFromHeap(r).set(u),r}const ie={kernelName:t.Cast,backendName:"wasm",kernelFunc:ue},se=p(t.Ceil);let oe;const de={kernelName:t.ClipByValue,backendName:"wasm",setupFunc:function(e){oe=e.wasm.cwrap(t.ClipByValue,null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{clipValueMin:u,clipValueMax:i}=a,s=n.dataIdMap.get(r.dataId).id,o=n.makeOutput(r.shape,r.dtype),d=n.dataIdMap.get(o.dataId).id;return oe(s,u,i,d),o}};function le(e){const{inputs:n,backend:a}=e,r=t.util.parseAxisParam(e.attrs.axis,n[0].shape)[0],u=n.map((e=>e.shape));t.backend_util.assertParamsConsistent(u,r);let i=t.backend_util.computeOutShape(n.map((e=>e.shape)),r);const s=n.filter((e=>t.util.sizeFromShape(e.shape)>0));if(1===s.length)return g({inputs:{x:s[0]},backend:a});const o=a.makeOutput(i,n[0].dtype);if(0===t.util.sizeFromShape(i))return o;if("string"===s[0].dtype){const e=s.map((e=>{const n=t.util.sizeFromShape(e.shape.slice(r));return q({inputs:{x:e},backend:a,attrs:{shape:[-1,n]}})})),u=e.map((e=>({vals:a.readSync(e.dataId),shape:e.shape})));i=t.backend_util.computeOutShape(e.map((e=>e.shape)),1);const d=1===e[0].shape[0],l=function(e,n,a,r){const u=t.util.getArrayFromDType(a,t.util.sizeFromShape(n));if(r&&"string"!==a){let n=0;e.forEach((e=>{const a=t.util.sizeFromShape(e.shape);u.set(e.vals,n),n+=a}))}else{let r=0;e.forEach((e=>{const i="string"===a?t.backend_util.fromUint8ToStringArray(e.vals):e.vals;let s=0;for(let t=0;t<e.shape[0];++t){const a=t*n[1]+r;for(let t=0;t<e.shape[1];++t)u[a+t]=i[s++]}r+=e.shape[1]}))}return u}(u,i,n[0].dtype,d),p=t.backend_util.computeOutShape(s.map((e=>e.shape)),r);o.shape=p;return a.dataIdMap.get(o.dataId).stringBytes=t.backend_util.fromStringArrayToUint8(l),e.forEach((e=>a.disposeData(e.dataId))),o}const d=t.util.sizeFromShape(s[0].shape.slice(0,r));let l=0;const p=s.map((e=>{const n=t.util.sizeFromShape(e.shape.slice(r));return l+=n,n})),c=s.map((e=>a.typedArrayFromHeap(e))),m=a.typedArrayFromHeap(o);for(let e=0;e<d;e++){let t=e*l;for(let n=0;n<c.length;n++){const a=p[n],r=e*a,u=c[n].subarray(r,r+a);m.set(u,t),t+=a}}return o}const pe={kernelName:t.Concat,backendName:"wasm",kernelFunc:le};let ce;const me={kernelName:t.Conv2D,backendName:"wasm",setupFunc:function(e){ce=e.wasm.cwrap(t.Conv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,attrs:a,backend:r}=e,{x:u,filter:i}=n,s=r.dataIdMap.get(u.dataId).id,o=r.dataIdMap.get(i.dataId).id,{strides:d,dilations:l,pad:p,dimRoundingMode:c,dataFormat:m}=a,f=t.backend_util.convertConv2DDataFormat(m),h=t.backend_util.computeConv2DInfo(u.shape,i.shape,d,l,p,c,!1,f),b=h.filterHeight,_=h.filterWidth,y=h.padInfo.top,g=h.padInfo.right,k=h.padInfo.bottom,I=h.padInfo.left,w=h.dilationHeight,M=h.dilationWidth,S=h.strideHeight,A=h.strideWidth,v=h.inChannels,x=h.outChannels,F="SAME"===h.padInfo.type?1:0;if("channelsLast"!==h.dataFormat)throw new Error(`wasm backend Conv2D does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);const N=r.makeOutput(h.outShape,"float32"),D=r.dataIdMap.get(N.dataId).id;return ce(s,u.shape[0],u.shape[1],u.shape[2],o,b,_,y,g,k,I,F,w,M,S,A,v,x,D),N}};let fe;const he={kernelName:t.Conv2DBackpropInput,backendName:"wasm",setupFunc:function(e){fe=e.wasm.cwrap(t.Conv2DBackpropInput,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:n,inputs:a,attrs:r}=e,{dy:u,filter:i}=a,{strides:s,pad:o,dataFormat:d,dimRoundingMode:l,inputShape:p}=r,c=t.backend_util.convertConv2DDataFormat(d),m=t.backend_util.computeConv2DInfo(p,i.shape,s,1,o,l,!1,c),{batchSize:f,filterHeight:h,filterWidth:b,inChannels:_,inHeight:y,inWidth:g,outChannels:k,outHeight:I,outWidth:w,strideHeight:M,strideWidth:S}=m,A=h-1-m.padInfo.top,v=b-1-m.padInfo.left,x="channelsLast"===m.dataFormat,F=t.util.computeStrides(m.inShape),N=t.util.computeStrides(u.shape),[D,R,E]=t.util.computeStrides(i.shape),P=F[0],C=x?F[1]:F[2],W=x?F[2]:1,O=x?1:F[1],T=N[0],z=x?N[1]:N[2],B=x?N[2]:1,H=x?1:N[1],L=n.makeOutput(m.inShape,"float32"),G=n.dataIdMap.get(L.dataId).id,U=n.dataIdMap.get(u.dataId).id,j=n.dataIdMap.get(i.dataId).id;return fe(U,j,f,h,b,y,g,_,I,w,k,M,S,A,v,D,R,E,P,C,W,O,T,z,B,H,G),L}};let be;const _e={kernelName:t.Conv3D,backendName:"wasm",setupFunc:function(e){be=e.wasm.cwrap(t.Conv3D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u,filter:i}=n,{strides:s,pad:o,dilations:d}=r;if("float32"!==u.dtype)throw new Error(`Tensor x must have dtype float32, got ${u.dtype}`);if("float32"!==i.dtype)throw new Error(`Tensor filter must have dtype float32, got ${i.dtype}`);const l=t.backend_util.computeConv3DInfo(u.shape,i.shape,s,d,o),p=a.makeOutput(l.outShape,u.dtype);return be(a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(i.dataId).id,a.dataIdMap.get(p.dataId).id,l.batchSize,l.inDepth,l.inHeight,l.inWidth,l.inChannels,l.outDepth,l.outHeight,l.outWidth,l.outChannels,l.strideDepth,l.strideHeight,l.strideWidth,l.dilationDepth,l.dilationHeight,l.dilationWidth,l.filterDepth,l.filterHeight,l.filterWidth,l.padInfo.front,l.padInfo.top,l.padInfo.left),p}};let ye;const ge={kernelName:t.Conv3DBackpropFilterV2,backendName:"wasm",setupFunc:function(e){ye=e.wasm.cwrap(t.Conv3DBackpropFilterV2,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u,dy:i}=n,{strides:s,pad:o,filterShape:d}=r;if("float32"!==u.dtype)throw new Error(`Tensor dy must have dtype float32, got ${u.dtype}`);if("float32"!==i.dtype)throw new Error(`Tensor filter must have dtype float32, got ${i.dtype}`);const l=t.backend_util.computeConv3DInfo(u.shape,d,s,1,o),p=a.makeOutput(l.filterShape,i.dtype);return ye(a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(i.dataId).id,a.dataIdMap.get(p.dataId).id,l.batchSize,l.inDepth,l.inHeight,l.inWidth,l.inChannels,l.outDepth,l.outHeight,l.outWidth,l.outChannels,l.strideDepth,l.strideHeight,l.strideWidth,l.dilationDepth,l.dilationHeight,l.dilationWidth,l.filterDepth,l.filterHeight,l.filterWidth,l.padInfo.front,l.padInfo.top,l.padInfo.left),p}};let ke;const Ie={kernelName:t.Conv3DBackpropInputV2,backendName:"wasm",setupFunc:function(e){ke=e.wasm.cwrap(t.Conv3DBackpropInputV2,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{dy:u,filter:i}=n,{pad:s,strides:o,inputShape:d}=r;if("float32"!==u.dtype)throw new Error(`Tensor dy must have dtype float32, got ${u.dtype}`);if("float32"!==i.dtype)throw new Error(`Tensor filter must have dtype float32, got ${i.dtype}`);const l=t.backend_util.computeConv3DInfo(d,i.shape,o,1,s),p=a.makeOutput(l.inShape,u.dtype);return ke(a.dataIdMap.get(i.dataId).id,a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(p.dataId).id,l.batchSize,l.inDepth,l.inHeight,l.inWidth,l.inChannels,l.outDepth,l.outHeight,l.outWidth,l.outChannels,l.strideDepth,l.strideHeight,l.strideWidth,l.dilationDepth,l.dilationHeight,l.dilationWidth,l.filterDepth,l.filterHeight,l.filterWidth,l.padInfo.front,l.padInfo.top,l.padInfo.left),p}},we=p(t.Cos),Me=p(t.Cosh);var Se;let Ae;!function(e){e[e.bilinear=0]="bilinear",e[e.nearest=1]="nearest"}(Se||(Se={}));const ve={kernelName:t.CropAndResize,backendName:"wasm",setupFunc:function(e){Ae=e.wasm.cwrap(t.CropAndResize,null,["number","number","number","number","array","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{method:r,extrapolationValue:u,cropSize:i}=a,{image:s,boxes:o,boxInd:d}=n,l=o.shape[0],[p,c]=i,m=[l,p,c,s.shape[3]];let f,h=t.dataIdMap.get(s.dataId);"float32"!==s.dtype&&(f=ue({backend:t,inputs:{x:s},attrs:{dtype:"float32"}}),h=t.dataIdMap.get(f.dataId));const b=h.id,_=t.dataIdMap.get(o.dataId).id,y=t.dataIdMap.get(d.dataId).id,g=t.makeOutput(m,"float32"),k=t.dataIdMap.get(g.dataId).id,I=new Uint8Array(new Int32Array(s.shape).buffer);return Ae(b,_,y,l,I,p,c,Se[r],u,k),null!=f&&t.disposeData(f.dataId),g}};let xe;const Fe={kernelName:t.Cumprod,backendName:"wasm",setupFunc:function(e){xe=e.wasm.cwrap(t.Cumprod,null,["number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u}=n,{axis:i,exclusive:o,reverse:d}=r,l=u.shape.length;t.util.assert("float32"===u.dtype||"int32"===u.dtype,(()=>`cumprod does not support ${u.dtype} tensors in the WASM backend`));const p=t.backend_util.getAxesPermutation([i],l);let c=u;null!==p&&(c=w({inputs:{x:u},attrs:{perm:p},backend:a}));const m=t.backend_util.getInnerMostAxes(1,l)[0];t.backend_util.assertAxesAreInnerMostDims("cumprod",[m],l);const f=a.makeOutput(c.shape,c.dtype),h=c.shape[m],b=a.dataIdMap.get(c.dataId).id,_=a.dataIdMap.get(f.dataId).id;xe(b,o?1:0,d?1:0,h,_,s[u.dtype]);let y=f;if(null!==p){y=w({inputs:{x:f},attrs:{perm:t.backend_util.getUndoAxesPermutation(p)},backend:a}),a.disposeData(c.dataId),a.disposeData(f.dataId)}return y}};let Ne;const De={kernelName:t.Cumsum,backendName:"wasm",setupFunc:function(e){Ne=e.wasm.cwrap(t.Cumsum,null,["number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u}=n,{axis:i,exclusive:o,reverse:d}=r,l=u.shape.length;t.util.assert("float32"===u.dtype||"int32"===u.dtype,(()=>`cumsum does not support ${u.dtype} tensors in the WASM backend`));const p=t.backend_util.getAxesPermutation([i],l);let c=u;null!==p&&(c=w({inputs:{x:u},attrs:{perm:p},backend:a}));const m=t.backend_util.getInnerMostAxes(1,l)[0];t.backend_util.assertAxesAreInnerMostDims("cumsum",[m],l);const f=a.makeOutput(c.shape,c.dtype),h=c.shape[m],b=a.dataIdMap.get(c.dataId).id,_=a.dataIdMap.get(f.dataId).id;Ne(b,o?1:0,d?1:0,h,_,s[u.dtype]);let y=f;if(null!==p){y=w({inputs:{x:f},attrs:{perm:t.backend_util.getUndoAxesPermutation(p)},backend:a}),a.disposeData(c.dataId),a.disposeData(f.dataId)}return y}};let Re;const Ee={kernelName:t.DenseBincount,backendName:"wasm",setupFunc:function(e){Re=e.wasm.cwrap("DenseBincount",null,["number","array","number","number","boolean","number","number","boolean","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{x:r,weights:u}=n,{size:i,binaryOutput:o}=a,d=0!==u.shape.reduce(((e,t)=>e*t),1),l=1===r.shape.length?[i]:[r.shape[0],i],p=t.makeOutput(l,u.dtype);function c(e){return t.dataIdMap.get(e.dataId).id}return Re(c(r),new Uint8Array(new Int32Array(r.shape).buffer),r.shape.length,i,d,c(u),s[u.dtype],o,c(p)),p}};let Pe;const Ce={kernelName:t.DepthToSpace,backendName:"wasm",setupFunc:function(e){Pe=e.wasm.cwrap(t.DepthToSpace,null,["number","number","number","array","number","array","array","number","number"])},kernelFunc:function(e){const{backend:n,inputs:a,attrs:r}=e,{x:u}=a,{blockSize:i,dataFormat:s}=r,o=u.shape[0],d=("NHWC"===s?u.shape[1]:u.shape[2])*i,l=("NHWC"===s?u.shape[2]:u.shape[3])*i,p=("NHWC"===s?u.shape[3]:u.shape[1])/(i*i),c="NHWC"===s?[o,d,l,p]:[o,p,d,l],m=n.makeOutput(c,"float32"),f=n.dataIdMap.get(u.dataId).id,h=new Uint8Array(new Int32Array(t.util.computeStrides(u.shape)).buffer),b=new Uint8Array(new Int32Array(c).buffer),_=new Uint8Array(new Int32Array(t.util.computeStrides(c)).buffer),y=n.dataIdMap.get(m.dataId).id;return Pe(f,i,"NHWC"===s?1:0,h,u.shape.length-1,b,_,c.length,y),m}};let We;const Oe={kernelName:t.DepthwiseConv2dNative,backendName:"wasm",setupFunc:function(e){We=e.wasm.cwrap(t.DepthwiseConv2dNative,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,attrs:a,backend:r}=e,{x:u,filter:i}=n,s=r.dataIdMap.get(u.dataId).id,o=r.dataIdMap.get(i.dataId).id,{strides:d,dilations:l,pad:p,dimRoundingMode:c}=a,m=null==l?[1,1]:l,f=t.backend_util.computeConv2DInfo(u.shape,i.shape,d,m,p,c,!0),h=f.filterHeight,b=f.filterWidth,_=f.padInfo.top,y=f.padInfo.right,g=f.padInfo.bottom,k=f.padInfo.left,I=f.dilationHeight,w=f.dilationWidth,M=f.strideHeight,S=f.strideWidth,A=f.inChannels,v=f.outChannels,x="SAME"===f.padInfo.type?1:0;if("channelsLast"!==f.dataFormat)throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);const F=r.makeOutput(f.outShape,"float32"),N=r.dataIdMap.get(F.dataId).id;return We(s,u.shape[0],u.shape[1],u.shape[2],o,h,b,_,y,g,k,x,I,w,M,S,A,v,N),F}};let Te;const ze={kernelName:t.Diag,backendName:"wasm",setupFunc:function(e){Te=e.wasm.cwrap("Diag",null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a}=e,{x:r}=n,u=t.util.sizeFromShape(r.shape),i=a.makeOutput([...r.shape,...r.shape],r.dtype);return Te(a.dataIdMap.get(r.dataId).id,s[r.dtype],u,a.dataIdMap.get(i.dataId).id),i}};let Be;const He={kernelName:t.Dilation2D,backendName:"wasm",setupFunc:function(e){Be=e.wasm.cwrap(t.Dilation2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u,filter:i}=n,{strides:o,pad:d,dilations:l}=r;if(u.dtype!==i.dtype)throw new Error(`Dilation2D error: x must have the same dtype as filter. Got ${u.dtype} and ${i.dtype}`);const p=t.backend_util.computeDilation2DInfo(u.shape,i.shape,o,d,"NHWC",l),c=a.makeOutput(p.outShape,u.dtype);return Be(a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(i.dataId).id,a.dataIdMap.get(c.dataId).id,s[u.dtype],p.batchSize,p.inChannels,p.inHeight,p.inWidth,p.outHeight,p.outWidth,p.strideHeight,p.strideWidth,p.dilationHeight,p.dilationWidth,p.filterHeight,p.filterWidth,p.padInfo.top,p.padInfo.left),c}};let Le;const Ge={kernelName:t.Dilation2DBackpropFilter,backendName:"wasm",setupFunc:function(e){Le=e.wasm.cwrap(t.Dilation2DBackpropFilter,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u,filter:i,dy:o}=n,{strides:d,pad:l,dilations:p}=r;if(u.dtype!==i.dtype||u.dtype!==o.dtype)throw new Error(`Dilation2DBackpropFilter error: x must have the same dtype as filter and dy. Got ${u.dtype}, ${i.dtype}, and ${o.dtype}`);const c=t.backend_util.computeDilation2DInfo(u.shape,i.shape,d,l,"NHWC",p),m=a.makeOutput(i.shape,i.dtype);return Le(a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(i.dataId).id,a.dataIdMap.get(o.dataId).id,a.dataIdMap.get(m.dataId).id,s[u.dtype],c.batchSize,c.inChannels,c.inHeight,c.inWidth,c.outHeight,c.outWidth,c.strideHeight,c.strideWidth,c.dilationHeight,c.dilationWidth,c.filterHeight,c.filterWidth,c.padInfo.top,c.padInfo.left),m}};let Ue;const je={kernelName:t.Dilation2DBackpropInput,backendName:"wasm",setupFunc:function(e){Ue=e.wasm.cwrap(t.Dilation2DBackpropInput,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u,filter:i,dy:o}=n,{strides:d,pad:l,dilations:p}=r;if(u.dtype!==i.dtype||u.dtype!==o.dtype)throw new Error(`Dilation2DBackpropInput error: x must have the same dtype as filter and dy. Got ${u.dtype}, ${i.dtype}, and ${o.dtype}`);const c=t.backend_util.computeDilation2DInfo(u.shape,i.shape,d,l,"NHWC",p),m=a.makeOutput(u.shape,u.dtype);return Ue(a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(i.dataId).id,a.dataIdMap.get(o.dataId).id,a.dataIdMap.get(m.dataId).id,s[u.dtype],c.batchSize,c.inChannels,c.inHeight,c.inWidth,c.outHeight,c.outWidth,c.strideHeight,c.strideWidth,c.dilationHeight,c.dilationWidth,c.filterHeight,c.filterWidth,c.padInfo.top,c.padInfo.left),m}},qe=p(t.Elu);let Ve;const $e={kernelName:t.EluGrad,backendName:"wasm",setupFunc:function(e){Ve=e.wasm.cwrap(t.EluGrad,null,["number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,{dy:a,y:r}=t,u=n.makeOutput(r.shape,"float32"),i=e=>n.dataIdMap.get(e.dataId).id;return Ve(i(r),i(a),i(u)),u}},Ke=h(t.Equal,0,"bool"),Xe=p(t.Erf),Qe=p(t.Exp,"float32");function Je(e){const{inputs:n,attrs:a,backend:r}=e,{input:u}=n,{dim:i}=a,s=u.shape.length,o=u.shape.slice();let d=i;return i<0&&(t.util.assert(-(s+1)<=i,(()=>`Axis must be in the interval [${-(s+1)}, ${s}]`)),d=s+i+1),o.splice(d,0,1),q({inputs:{x:u},backend:r,attrs:{shape:o}})}const Ze={kernelName:t.ExpandDims,backendName:"wasm",kernelFunc:Je},Ye=p(t.Expm1,"float32");function et(e){const{attrs:{shape:n,value:a},backend:r}=e;let{attrs:{dtype:u}}=e;u=u||t.util.inferDtype(a);const i=r.makeOutput(n,u);return r.typedArrayFromHeap(i).fill(a),i}const tt={kernelName:t.Fill,backendName:"wasm",kernelFunc:et};let nt;const at={kernelName:t.FlipLeftRight,backendName:"wasm",kernelFunc:function(e){const{inputs:t,backend:n}=e,{image:a}=t,r=n.makeOutput(a.shape,a.dtype),u=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,[s,o,d,l]=a.shape;return nt(u,s,o,d,l,i),r},setupFunc:function(e){nt=e.wasm.cwrap(t.FlipLeftRight,null,["number","number","number","number","number","number"])}},rt=p(t.Floor),ut=h(t.FloorDiv);let it;const st={kernelName:t.FusedBatchNorm,backendName:"wasm",setupFunc:function(e){it=e.wasm.cwrap(t.FusedBatchNorm,null,["number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:n,inputs:a,attrs:r}=e,{varianceEpsilon:u}=r,{x:i,mean:s,variance:o,offset:d,scale:l}=a,p=n.dataIdMap.get(i.dataId).id,c=n.dataIdMap.get(s.dataId).id,m=n.dataIdMap.get(o.dataId).id,f=null!=d?n.dataIdMap.get(d.dataId).id:0,h=null!=l?n.dataIdMap.get(l.dataId).id:0,b=n.makeOutput(i.shape,i.dtype);if(0===t.util.sizeFromShape(i.shape))return b;const _=n.dataIdMap.get(b.dataId).id;return it(p,c,m,f,h,u,_),b}};let ot;const dt={kernelName:t.FusedConv2D,backendName:"wasm",setupFunc:function(e){ot=e.wasm.cwrap(t.FusedConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,attrs:a,backend:r}=e,{x:u,filter:i,bias:s,preluActivationWeights:d}=n,{strides:l,pad:p,dilations:c,dataFormat:m,dimRoundingMode:f,activation:h,leakyreluAlpha:b}=a,_=t.backend_util.computeConv2DInfo(u.shape,i.shape,l,c,p,f),y=o[h];if(null==y)throw new Error(`${h} activation not yet supported for FusedConv2D in the wasm backend.`);const g=r.dataIdMap.get(u.dataId).id,k=r.dataIdMap.get(i.dataId).id,I=_.outChannels;let w=0;if(null!=s){const e=r.dataIdMap.get(s.dataId);if(1!==e.shape.length)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==I)throw new Error(`FusedConv2D bias shape (${e.shape}) does not match the number of output channels (${I})`);w=e.id}const M=_.filterHeight,S=_.filterWidth,A=_.padInfo.top,v=_.padInfo.right,x=_.padInfo.bottom,F=_.padInfo.left,N=_.dilationHeight,D=_.dilationWidth,R=_.strideHeight,E=_.strideWidth,P=_.inChannels,C="SAME"===_.padInfo.type?1:0,W=_.batchSize,O=_.inHeight,T=_.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const z=r.makeOutput(_.outShape,"float32"),B=r.dataIdMap.get(z.dataId).id,H=null==d?0:r.dataIdMap.get(d.dataId).id;return ot(g,W,O,T,k,M,S,w,A,v,x,F,C,N,D,R,E,P,I,y,H,b||0,B),z}};let lt;const pt={kernelName:t.FusedDepthwiseConv2D,backendName:"wasm",setupFunc:function(e){lt=e.wasm.cwrap(t.FusedDepthwiseConv2D,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,attrs:a,backend:r}=e,{x:u,filter:i,bias:s,preluActivationWeights:d}=n,{strides:l,pad:p,dilations:c,dataFormat:m,dimRoundingMode:f,activation:h,leakyreluAlpha:b}=a,_=t.backend_util.computeConv2DInfo(u.shape,i.shape,l,c,p,f,!0),y=o[h];if(null==y)throw new Error(`${h} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);const g=r.dataIdMap.get(u.dataId).id,k=r.dataIdMap.get(i.dataId).id,I=_.outChannels;let w=0;if(null!=s){const e=r.dataIdMap.get(s.dataId);if(1!==e.shape.length)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${e.shape.length}.`);if(e.shape[0]!==I)throw new Error(`FusedDepthwiseConv2D bias shape (${e.shape}) does not match the number of output channels (${I})`);w=e.id}const M=_.filterHeight,S=_.filterWidth,A=_.padInfo.top,v=_.padInfo.right,x=_.padInfo.bottom,F=_.padInfo.left,N=_.dilationHeight,D=_.dilationWidth,R=_.strideHeight,E=_.strideWidth,P=_.inChannels,C="SAME"===_.padInfo.type?1:0,W=_.batchSize,O=_.inHeight,T=_.inWidth;if("NHWC"!==m)throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${m}'. Please use 'NHWC'.`);const z=r.makeOutput(_.outShape,"float32"),B=r.dataIdMap.get(z.dataId).id,H=null==d?0:r.dataIdMap.get(d.dataId).id;return lt(g,W,O,T,k,M,S,w,A,v,x,F,C,N,D,R,E,P,I,y,H,b||0,B),z}};let ct;const mt={kernelName:t.GatherNd,backendName:"wasm",setupFunc:function(e){ct=e.wasm.cwrap(t.GatherNd,null,["number","number","number","number","number","number","array","number"])},kernelFunc:function(e){const{backend:n,inputs:a}=e,{params:r,indices:u}=a,[i,o,d,l]=t.gather_util.prepareAndValidate(r,u),p=n.makeOutput(i,r.dtype);if(0===o)return p;const c=u.shape,m=c[c.length-1],f=n.dataIdMap.get(r.dataId).id,h=n.dataIdMap.get(u.dataId).id,b=new Uint8Array(new Int32Array(l).buffer),_=n.dataIdMap.get(p.dataId).id;return ct(f,s[r.dtype],h,o,m,d,b,_),p}};let ft;const ht={kernelName:t.GatherV2,backendName:"wasm",setupFunc:function(e){ft=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])},kernelFunc:function(e){const{backend:n,inputs:a,attrs:r}=e,{x:u,indices:i}=a,{axis:o,batchDims:d}=r,l=t.util.parseAxisParam(o,u.shape)[0],p=n.readSync(i.dataId),c=u.shape[l];for(let e=0;e<p.length;++e){const n=p[e];t.util.assert(n<=c-1&&n>=0,(()=>`GatherV2: the index value ${n} is not in [0, ${c-1}]`))}const m=t.backend_util.segment_util.collectGatherOpShapeInfo(u,i,l,d),f=q({inputs:{x:u},attrs:{shape:[m.batchSize,m.outerSize,m.dimSize,m.sliceSize]},backend:n}),h=t.util.sizeFromShape(i.shape),b=q({inputs:{x:i},attrs:{shape:[m.batchSize,h/m.batchSize]},backend:n}),_=[m.batchSize,m.outerSize,h/m.batchSize,m.sliceSize],y=n.makeOutput(_,u.dtype);if(0===t.util.sizeFromShape(u.shape))return y;const g=f.shape.length-1,k=n.dataIdMap.get(f.dataId).id,I=n.dataIdMap.get(b.dataId).id,w=n.dataIdMap.get(y.dataId).id,M=new Uint8Array(new Int32Array(t.util.computeStrides(f.shape)).buffer),S=new Uint8Array(new Int32Array(t.util.computeStrides(_)).buffer);return ft(k,s[u.dtype],M,g,I,m.batchSize,S,w),n.disposeData(f.dataId),n.disposeData(b.dataId),y.shape=m.outputShape,y}},bt=h(t.Greater,0,"bool"),_t=h(t.GreaterEqual,0,"bool"),yt=p(t.IsFinite,"bool"),gt=p(t.IsInf,"bool"),kt=p(t.IsNan,"bool");let It;const wt={kernelName:t.LeakyRelu,backendName:"wasm",setupFunc:function(e){It=e.wasm.cwrap(t.LeakyRelu,null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:{x:n},attrs:{alpha:a},backend:r}=e,u=r.dataIdMap.get(n.dataId).id,i=r.makeOutput(n.shape,"float32");if(0!==t.util.sizeFromShape(n.shape)){const e=r.dataIdMap.get(i.dataId).id;It(u,s[n.dtype],a,e)}return i}},Mt=h(t.Less,0,"bool"),St=h(t.LessEqual,0,"bool");let At;const vt={kernelName:t.LinSpace,backendName:"wasm",setupFunc:function(e){At=e.wasm.cwrap(t.LinSpace,null,["number","number","number","number"])},kernelFunc:function(e){const{attrs:t,backend:n}=e,{start:a,stop:r,num:u}=t,i=Math.floor(u),s=n.makeOutput([i],"float32");return At(n.dataIdMap.get(s.dataId).id,a,r,i),s}},xt=p(t.Log),Ft=p(t.Log1p),Nt=h(t.LogicalAnd,0,"bool"),Dt=p(t.LogicalNot),Rt=h(t.LogicalOr,0,"bool"),Et=h(t.LogicalXor,0,"bool");let Pt;const Ct={kernelName:t.LRN,backendName:"wasm",setupFunc:function(e){Pt=e.wasm.cwrap(t.LRN,null,["number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{depthRadius:u,bias:i,alpha:s,beta:o}=a;if("float32"!==r.dtype)throw new Error("LRN error: x must have dtype float32");const d=n.makeOutput(r.shape,r.dtype);return Pt(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(d.dataId).id,r.shape[3],u,i,s,o),d}};let Wt;const Ot={kernelName:t.LRNGrad,backendName:"wasm",setupFunc:function(e){Wt=e.wasm.cwrap(t.LRNGrad,null,["number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:r,y:u,dy:i}=t,{depthRadius:s,bias:o,alpha:d,beta:l}=a;if("float32"!==r.dtype||"float32"!==u.dtype||"float32"!==i.dtype)throw new Error("LRNGrad error: x, y, and dy must have dtype float32");const p=n.makeOutput(r.shape,r.dtype);return Wt(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(u.dataId).id,n.dataIdMap.get(i.dataId).id,n.dataIdMap.get(p.dataId).id,i.shape[3],s,o,d,l),p}};let Tt;const zt={kernelName:t.Max,backendName:"wasm",setupFunc:function(e){Tt=e.wasm.cwrap(t.Max,null,["number","number","number","number"])},kernelFunc:function(e){const{backend:n,inputs:a,attrs:r}=e,{reductionIndices:u,keepDims:i}=r,{x:o}=a;let d=n.dataIdMap.get(o.dataId).id,l=o;const{transposed:p,axes:c,originalAxes:m,inputWasTransposed:f}=S(o,u,n);if(f){l=p,d=n.dataIdMap.get(p.dataId).id}const h=l.shape.length;t.backend_util.assertAxesAreInnerMostDims("max",c,h);const[b,_]=t.backend_util.computeOutAndReduceShapes(l.shape,c),y=t.util.sizeFromShape(_),g=n.makeOutput(b,o.dtype);if(0!==t.util.sizeFromShape(l.shape)){const e=n.dataIdMap.get(g.dataId).id;Tt(d,s[o.dtype],y,e)}if(f&&n.disposeData(p.dataId),i){const e=t.backend_util.expandShapeToKeepDim(g.shape,m);g.shape=e}return g}},Bt=h(t.Maximum);let Ht;const Lt={kernelName:t.MaxPool,backendName:"wasm",setupFunc:function(e){Ht=e.wasm.cwrap(t.MaxPool,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,attrs:a,backend:r}=e,u=n.x,i=r.dataIdMap.get(u.dataId).id;t.util.assert("float32"===u.dtype,(()=>`Error in MaxPool: only float32 input is supported. Got ${u.dtype}.`));const{filterSize:s,strides:o,pad:d,dimRoundingMode:l}=a,p=t.backend_util.computePool2DInfo(u.shape,s,o,1,d,l),c=p.filterHeight,m=p.filterWidth,f=p.padInfo.top,h=p.padInfo.right,b=p.padInfo.bottom,_=p.padInfo.left,y=p.dilationHeight,g=p.dilationWidth,k=p.strideHeight,I=p.strideWidth,w=p.inChannels,M=p.outChannels;if("channelsLast"!==p.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${p.dataFormat}'. Please use 'channelsLast'.`);const S=r.makeOutput(p.outShape,"float32"),A=r.dataIdMap.get(S.dataId).id;return Ht(i,u.shape[0],u.shape[1],u.shape[2],c,m,f,h,b,_,y,g,k,I,w,M,A),S}};let Gt;const Ut={kernelName:t.MaxPool3D,backendName:"wasm",setupFunc:function(e){Gt=e.wasm.cwrap("MaxPool3D",null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{x:u}=n,{filterSize:i,strides:s,pad:o,dimRoundingMode:d,dataFormat:l}=r,p=t.backend_util.computePool3DInfo(u.shape,i,s,1,o,d,l),c=a.makeOutput(p.outShape,u.dtype);return Gt(a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(c.dataId).id,p.batchSize,p.inChannels,p.inDepth,p.inHeight,p.inWidth,p.outDepth,p.outHeight,p.outWidth,p.strideDepth,p.strideHeight,p.strideWidth,p.dilationDepth,p.dilationHeight,p.dilationWidth,p.effectiveFilterDepth,p.effectiveFilterHeight,p.effectiveFilterWidth,p.padInfo.front,p.padInfo.top,p.padInfo.left),c}};let jt;const qt={kernelName:t.MaxPool3DGrad,backendName:"wasm",setupFunc:function(e){jt=e.wasm.cwrap("MaxPool3DGrad",null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{dy:u,input:i}=n,{filterSize:s,strides:o,pad:d,dimRoundingMode:l}=r,p=t.backend_util.computePool3DInfo(i.shape,s,o,1,d,l),c=a.makeOutput(i.shape,i.dtype);return jt(a.dataIdMap.get(i.dataId).id,a.dataIdMap.get(u.dataId).id,a.dataIdMap.get(c.dataId).id,p.batchSize,p.inChannels,p.inDepth,p.inHeight,p.inWidth,p.outDepth,p.outHeight,p.outWidth,p.strideDepth,p.strideHeight,p.strideWidth,p.dilationDepth,p.dilationHeight,p.dilationWidth,p.effectiveFilterDepth,p.effectiveFilterHeight,p.effectiveFilterWidth,p.padInfo.front,p.padInfo.top,p.padInfo.left),c}};let Vt;const $t={kernelName:t.MaxPoolGrad,backendName:"wasm",setupFunc:function(e){Vt=e.wasm.cwrap("MaxPoolGrad",null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:n,backend:a,attrs:r}=e,{dy:u,input:i}=n,{filterSize:s,strides