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 143 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. * ============================================================================= */ import{_FusedMatMul as e,broadcast_util as t,util as n,Abs as a,Acos as r,Acosh as u,backend_util as s,Add as i,AddN as o,Identity as d,tensor as p,Transpose as l,All as c,Any as m,ArgMax as f,ArgMin as h,Asin as b,Asinh as y,Atan as _,Atan2 as g,Atanh as I,AvgPool as w,AvgPool3D as k,AvgPool3DGrad as M,AvgPoolGrad as S,Reshape as A,BatchMatMul as v,slice_util as x,buffer as F,TensorBuffer as N,Slice as D,BatchToSpaceND as R,Bincount as E,BitwiseAnd as W,BroadcastArgs as P,Cast as O,Ceil as C,ClipByValue as T,Concat as z,Conv2D as H,Conv2DBackpropInput as B,Conv3D as L,Conv3DBackpropFilterV2 as U,Conv3DBackpropInputV2 as j,Cos as G,Cosh as q,CropAndResize as V,Cumprod as $,Cumsum as K,DenseBincount as X,DepthToSpace as Q,DepthwiseConv2dNative as J,Diag as Z,Dilation2D as Y,Dilation2DBackpropFilter as ee,Dilation2DBackpropInput as te,Elu as ne,EluGrad as ae,Equal as re,Erf as ue,Exp as se,ExpandDims as ie,Expm1 as oe,Fill as de,FlipLeftRight as pe,Floor as le,FloorDiv as ce,FusedBatchNorm as me,FusedConv2D as fe,FusedDepthwiseConv2D as he,GatherNd as be,gather_util as ye,GatherV2 as _e,Greater as ge,GreaterEqual as Ie,IsFinite as we,IsInf as ke,IsNan as Me,LeakyRelu as Se,Less as Ae,LessEqual as ve,LinSpace as xe,Log as Fe,Log1p as Ne,LogicalAnd as De,LogicalNot as Re,LogicalOr as Ee,LogicalXor as We,LRN as Pe,LRNGrad as Oe,Max as Ce,Maximum as Te,MaxPool as ze,MaxPool3D as He,MaxPool3DGrad as Be,MaxPoolGrad as Le,MaxPoolWithArgmax as Ue,Mean as je,Min as Ge,Minimum as qe,MirrorPad as Ve,Softmax as $e,Multinomial as Ke,Mod as Xe,Multiply as Qe,Neg as Je,NonMaxSuppressionV3 as Ze,NonMaxSuppressionV4 as Ye,NonMaxSuppressionV5 as et,NotEqual as tt,OneHot as nt,OnesLike as at,Pack as rt,PadV2 as ut,Pow as st,Prelu as it,Prod as ot,Range as dt,RealDiv as pt,Reciprocal as lt,Relu as ct,Relu6 as mt,ResizeBilinear as ft,ResizeBilinearGrad as ht,ResizeNearestNeighbor as bt,ResizeNearestNeighborGrad as yt,Reverse as _t,RotateWithOffset as gt,Round as It,Rsqrt as wt,ScatterNd as kt,scatter_util as Mt,SearchSorted as St,Select as At,Selu as vt,Sigmoid as xt,Sign as Ft,Sin as Nt,Sinh as Dt,Softplus as Rt,SpaceToBatchND as Et,SparseFillEmptyRows as Wt,SparseReshape as Pt,SparseSegmentMean as Ot,SparseSegmentSum as Ct,SparseToDense as Tt,SplitV as zt,Sqrt as Ht,Square as Bt,SquaredDifference as Lt,Step as Ut,StridedSlice as jt,StringNGrams as Gt,StringSplit as qt,StringToHashBucketFast as Vt,Sub as $t,Sum as Kt,Tan as Xt,Tanh as Qt,TensorScatterUpdate as Jt,Tile as Zt,TopK as Yt,Transform as en,Unique as tn,Unpack as nn,ZerosLike as an,registerKernel as rn,env as un,KernelBackend as sn,DataStorage as on,engine as dn,deprecationWarn as pn,registerBackend as ln}from"@tensorflow/tfjs-core";import cn from"fs";import mn from"path";import fn from"perf_hooks";import hn from"os";function bn(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 yn,_n;let gn;!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"}(yn||(yn={})),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"}(_n||(_n={}));const In={kernelName:e,backendName:"wasm",setupFunc:function(t){gn=t.wasm.cwrap(e,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:s,bias:i,preluActivationWeights:o}=n;if("float32"!==u.dtype||"float32"!==s.dtype)throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");const{transposeA:d,transposeB:p,activation:l,leakyreluAlpha:c}=r,m=a.dataIdMap.get(u.dataId).id,f=a.dataIdMap.get(s.dataId).id;let h=0;if(null!=i){const e=a.dataIdMap.get(i.dataId);if(1!==e.shape.length)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${e.shape.length}.`);h=e.id}const b=null==o?0:a.dataIdMap.get(o.dataId).id,y=_n[l];if(null==y)throw new Error(`${l} activation not yet supported for FusedConv2D in the wasm backend.`);const _=d?u.shape[2]:u.shape[1],g=p?s.shape[1]:s.shape[2],I=t.assertAndGetBroadcastShape(u.shape.slice(0,-2),s.shape.slice(0,-2)),w=a.makeOutput([...I,_,g],u.dtype),k=a.dataIdMap.get(w.dataId).id,M=new Uint8Array(new Int32Array(u.shape).buffer),S=new Uint8Array(new Int32Array(s.shape).buffer);return gn(m,M,u.shape.length,f,S,s.shape.length,d,p,y,h,b,c||0,k),w}};function wn(e,t){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,s=r.dataIdMap.get(u.dataId).id,i=r.makeOutput(u.shape,t||u.dtype),o=r.dataIdMap.get(i.dataId).id;return 0===n.sizeFromShape(i.shape)||a(s,yn[u.dtype],o),i}}}const kn=wn(a),Mn=wn(r),Sn=wn(u);function An(e,t,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:t,inputs:u}=e,{a:i,b:o}=u,d=t.dataIdMap.get(i.dataId).id,p=t.dataIdMap.get(o.dataId).id,l=null!=a?a:i.dtype,c=s.assertAndGetBroadcastShape(i.shape,o.shape),m=t.makeOutput(c,l);if(0===n.sizeFromShape(c))return m;const f=new Uint8Array(new Int32Array(i.shape).buffer),h=new Uint8Array(new Int32Array(o.shape).buffer),b=t.dataIdMap.get(m.dataId).id;return r(d,f,i.shape.length,p,h,o.shape.length,yn[i.dtype],b),m}}}const vn=An(i);let xn;const Fn={kernelName:o,backendName:"wasm",setupFunc:function(e){xn=e.wasm.cwrap(o,null,["array","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:a}=e,r=a.makeOutput(t[0].shape,t[0].dtype);if(0===n.sizeFromShape(r.shape))return r;const u=t.map((e=>a.dataIdMap.get(e.dataId).id)),s=new Uint8Array(new Int32Array(u).buffer),i=a.dataIdMap.get(r.dataId).id;return xn(s,u.length,yn[r.dtype],i),r}};function Nn(e){const{inputs:{x:t},backend:n}=e;if("string"===t.dtype)return p(n.readSync(t.dataId),t.shape,t.dtype);const a=n.makeOutput(t.shape,t.dtype),r=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(a).set(r),a}const Dn={kernelName:d,backendName:"wasm",kernelFunc:Nn};let Rn;function En(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 s=!0;for(let e=0;e<u.length;e++)u[e]!==e&&(s=!1);const i=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),o={dataId:t.x.dataId,shape:r,dtype:t.x.dtype};if(s){const e=Nn({inputs:t,backend:n});return e.shape=i,e}const d=n.makeOutput(i,o.dtype),p=n.dataIdMap.get(o.dataId).id,l=n.dataIdMap.get(d.dataId).id,c=new Uint8Array(new Int32Array(u).buffer),m=new Uint8Array(new Int32Array(o.shape).buffer);return Rn(p,m,o.shape.length,yn[o.dtype],l,c,u.length),d}const Wn={kernelName:l,backendName:"wasm",kernelFunc:En,setupFunc:function(e){Rn=e.wasm.cwrap(l,null,["number","array","number","number","number","array","number"])}};function Pn(e,t,a){const r=e.shape,u=e.shape.length,i=n.parseAxisParam(t,r);let o=i;const d=s.getAxesPermutation(o,u);let p=null,l=!1;if(null!=d){const t=new Array(u);for(let e=0;e<t.length;e++)t[e]=r[d[e]];o=s.getInnerMostAxes(o.length,u),p=En({inputs:{x:e},attrs:{perm:d},backend:a});const n=a.dataIdMap.get(e.dataId).id;a.dataIdMap.get(p.dataId).id!==n&&(l=!0)}return{transposed:p,originalAxes:i,axes:o,inputWasTransposed:l}}let On;const Cn={kernelName:c,backendName:"wasm",setupFunc:function(e){On=e.wasm.cwrap(c,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:a,attrs:r}=e,{axis:u,keepDims:i}=r,{x:o}=a;let d=t.dataIdMap.get(o.dataId).id,p=o;const{transposed:l,axes:c,originalAxes:m,inputWasTransposed:f}=Pn(o,u,t);if(f){p=l,d=t.dataIdMap.get(l.dataId).id}const h=p.shape.length;s.assertAxesAreInnerMostDims("all",c,h);const[b,y]=s.computeOutAndReduceShapes(p.shape,c),_=n.sizeFromShape(y),g=t.makeOutput(b,o.dtype);if(0!==n.sizeFromShape(p.shape)){const e=t.dataIdMap.get(g.dataId).id;On(d,_,e)}if(f&&t.disposeData(l.dataId),i){const e=s.expandShapeToKeepDim(g.shape,m);g.shape=e}return g}};let Tn;const zn={kernelName:m,backendName:"wasm",setupFunc:function(e){Tn=e.wasm.cwrap(m,null,["number, number, number"])},kernelFunc:function(e){const{backend:t,inputs:a,attrs:r}=e,{axis:u,keepDims:i}=r,{x:o}=a;let d=t.dataIdMap.get(o.dataId).id,p=o;const{transposed:l,axes:c,originalAxes:m,inputWasTransposed:f}=Pn(o,u,t);if(f){p=l,d=t.dataIdMap.get(l.dataId).id}const h=p.shape.length;s.assertAxesAreInnerMostDims("any",c,h);const[b,y]=s.computeOutAndReduceShapes(p.shape,c),_=n.sizeFromShape(y),g=t.makeOutput(b,o.dtype);if(0!==n.sizeFromShape(p.shape)){const e=t.dataIdMap.get(g.dataId).id;Tn(d,_,e)}if(f&&t.disposeData(l.dataId),i){const e=s.expandShapeToKeepDim(g.shape,m);g.shape=e}return g}};function Hn(e){let t;return{kernelName:e,backendName:"wasm",setupFunc:function(n){t=n.wasm.cwrap(e,null,["number","number","number","number","number"])},kernelFunc:function(e){const{backend:a,inputs:r,attrs:u}=e,{axis:s}=u,{x:i}=r,o=a.dataIdMap.get(i.dataId).id;let d=o,p=i;const{transposed:l,axes:c,inputWasTransposed:m}=Pn(i,s,a);if(m){const e=a.dataIdMap.get(l.dataId).id;e!==o&&(p=l,d=e)}const f=p.shape.slice(0,-1),h=a.makeOutput(f,"int32"),b=a.dataIdMap.get(h.dataId).id,y=n.sizeFromShape(h.shape),_=p.shape[c[0]];return t(d,yn[p.dtype],y,_,b),m&&a.disposeData(l.dataId),h}}}const Bn=Hn(f),Ln=Hn(h),Un=wn(b),jn=wn(y),Gn=wn(_),qn=An(g),Vn=wn(I);let $n;const Kn={kernelName:w,backendName:"wasm",setupFunc:function(e){$n=e.wasm.cwrap(w,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:n,backend:a}=e,r=t.x,u=a.dataIdMap.get(r.dataId).id,{filterSize:i,strides:o,pad:d,dimRoundingMode:p}=n,l=s.computePool2DInfo(r.shape,i,o,1,d,p),c=l.filterHeight,m=l.filterWidth,f=l.padInfo.top,h=l.padInfo.right,b=l.padInfo.bottom,y=l.padInfo.left,_=l.strideHeight,g=l.strideWidth,I=l.inChannels;if("channelsLast"!==l.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${l.dataFormat}'. Please use 'channelsLast'.`);if(1!==l.dilationWidth||1!==l.dilationHeight)throw new Error(`was backend only supports average pooling with dilation = [1, 1], got [${l.dilationHeight}, ${l.dilationWidth}].`);const w=a.makeOutput(l.outShape,"float32"),k=a.dataIdMap.get(w.dataId).id;return $n(u,r.shape[0],r.shape[1],r.shape[2],c,m,f,h,b,y,_,g,I,k),w}};let Xn;const Qn={kernelName:k,backendName:"wasm",setupFunc:function(e){Xn=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:t,backend:n,attrs:a}=e,{x:r}=t,{filterSize:u,strides:i,pad:o,dimRoundingMode:d,dataFormat:p}=a,l=s.computePool3DInfo(r.shape,u,i,1,o,d,p),c=n.makeOutput(l.outShape,r.dtype);return Xn(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(c.dataId).id,l.batchSize,l.inChannels,l.inDepth,l.inHeight,l.inWidth,l.outDepth,l.outHeight,l.outWidth,l.strideDepth,l.strideHeight,l.strideWidth,l.dilationDepth,l.dilationHeight,l.dilationWidth,l.effectiveFilterDepth,l.effectiveFilterHeight,l.effectiveFilterWidth,l.padInfo.front,l.padInfo.top,l.padInfo.left),c}};let Jn;const Zn={kernelName:M,backendName:"wasm",setupFunc:function(e){Jn=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:t,backend:n,attrs:a}=e,{dy:r,input:u}=t,{filterSize:i,strides:o,pad:d,dimRoundingMode:p}=a,l=s.computePool3DInfo(u.shape,i,o,1,d,p),c=n.makeOutput(u.shape,u.dtype);return Jn(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(c.dataId).id,l.batchSize,l.inChannels,l.inDepth,l.inHeight,l.inWidth,l.outDepth,l.outHeight,l.outWidth,l.strideDepth,l.strideHeight,l.strideWidth,l.dilationDepth,l.dilationHeight,l.dilationWidth,l.effectiveFilterDepth,l.effectiveFilterHeight,l.effectiveFilterWidth,l.padInfo.front,l.padInfo.top,l.padInfo.left,l.filterDepth,l.filterHeight,l.filterWidth),c}};let Yn;const ea={kernelName:S,backendName:"wasm",setupFunc:function(e){Yn=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:t,backend:n,attrs:a}=e,{dy:r,input:u}=t,{filterSize:i,strides:o,pad:d}=a,p=s.computePool2DInfo(u.shape,i,o,1,d),l=n.makeOutput(u.shape,u.dtype);return Yn(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(l.dataId).id,p.batchSize,p.inChannels,p.inHeight,p.inWidth,p.outHeight,p.outWidth,p.strideHeight,p.strideWidth,p.dilationHeight,p.dilationWidth,p.effectiveFilterHeight,p.effectiveFilterWidth,p.padInfo.top,p.padInfo.left,p.filterHeight,p.filterWidth),l}};function ta(e){const{inputs:t,attrs:a}=e,{x:r}=t,{shape:u}=a,s=n.sizeFromShape(r.shape),i=n.inferFromImplicitShape(u,s);return n.assert(s===n.sizeFromShape(i),(()=>`new shape: ${i}, 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:i,dtype:r.dtype}}const na={kernelName:A,backendName:"wasm",kernelFunc:ta};let aa;const ra={kernelName:v,backendName:"wasm",setupFunc:function(e){aa=e.wasm.cwrap(v,null,["number","array","number","number","array","number","number","number","number"])},kernelFunc:function(e){const{inputs:a,backend:r,attrs:u}=e,{a:s,b:i}=a,{transposeA:o,transposeB:d}=u;if("float32"!==s.dtype||"float32"!==i.dtype)throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");const p=s.shape.length,l=i.shape.length,c=o?s.shape[p-2]:s.shape[p-1],m=d?i.shape[l-1]:i.shape[l-2],f=o?s.shape[p-1]:s.shape[p-2],h=d?i.shape[l-2]:i.shape[l-1],b=s.shape.slice(0,-2),y=i.shape.slice(0,-2),_=n.sizeFromShape(b),g=n.sizeFromShape(y),I=t.assertAndGetBroadcastShape(s.shape.slice(0,-2),i.shape.slice(0,-2)).concat([f,h]);n.assert(c===m,(()=>`Error in matMul: inner shapes (${c}) and (${m}) of Tensors with shapes ${s.shape} and ${i.shape} and transposeA=${o} and transposeB=${d} must match.`));const w=d?[g,h,m]:[g,m,h],k=ta({inputs:{x:s},backend:r,attrs:{shape:o?[_,c,f]:[_,f,c]}}),M=ta({inputs:{x:i},backend:r,attrs:{shape:w}}),S=r.dataIdMap.get(k.dataId).id,A=r.dataIdMap.get(M.dataId).id,v=o?k.shape[2]:k.shape[1],x=d?M.shape[1]:M.shape[2],F=Math.max(_,g),N=r.makeOutput([F,v,x],k.dtype),D=r.dataIdMap.get(N.dataId).id,R=new Uint8Array(new Int32Array(k.shape).buffer),E=new Uint8Array(new Int32Array(M.shape).buffer);return aa(S,R,k.shape.length,A,E,M.shape.length,o,d,D),r.disposeData(k.dataId),r.disposeData(M.dataId),N.shape=I,N}};function ua(e,t,a,r,u){const i=x.isSliceContinous(r,t,a),o=n.sizeFromShape(a),d=n.computeStrides(r);if(i){const n=x.computeFlatOffset(t,d);return"string"===u?e.slice(n,n+o):e.subarray(n,n+o)}const p="string"===u?s.fromUint8ToStringArray(e):e,l=F(r,u,p),c=F(a,u);for(let e=0;e<c.size;++e){const n=c.indexToLoc(e),a=n.map(((e,n)=>e+t[n]));c.set(l.get(...a),...n)}return"string"===u?s.fromStringArrayToUint8(c.values):c.values}s.RowPartitionType;class sa{constructor(e,t,a,r,u,s){this.separator=n.encodeString(e),this.nGramWidths=t,this.leftPad=n.encodeString(a),this.rightPad=n.encodeString(r),this.padWidth=u,this.preserveShort=s}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 s=0;s<r;++s){const i=this.getPadWidth(u),o=Math.max(0,i-s),d=Math.max(0,i-(r-(s+1))),p=u-(o+d),l=t+(o>0?0:s-i);let c=0;c+=o*this.leftPad.length;for(let t=0;t<p;++t)c+=e[l+t].length;c+=d*this.rightPad.length;c+=(o+d+p-1)*this.separator.length,n[a+s]=new Uint8Array(c);const m=n[a+s];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<p-1;++t)h(e[l+t]),h(this.separator);if(p>0){h(e[l+p-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,t){const a=e.length,r=t.length;if(r>0){let e=t[0];if(0!==e)throw new Error(`First split value must be 0, got ${e}`);for(let n=1;n<r;++n){let r=t[n]>=e;if(r=r&&t[n]<=a,!r)throw new Error(`Invalid split value ${t[n]}, must be in [${e}, ${a}]`);e=t[n]}if(e!==a)throw new Error(`Last split value must be data size. Expected ${a}, got ${e}`)}const u=r-1,s=n.getArrayFromDType("int32",r);if(0===a||0===r){const e=new Array(a);for(let e=0;e<=u;++e)s[e]=0;return[e,s]}s[0]=0;for(let e=1;e<=u;++e){const n=t[e]-t[e-1];let a=0;this.nGramWidths.forEach((e=>{a+=this.getNumNGrams(n,e)})),this.preserveShort&&n>0&&0===a&&(a=1),s[e]=s[e-1]+a}const i=new Array(s[u]);for(let n=0;n<u;++n){const a=t[n];let r=s[n];if(this.nGramWidths.forEach((u=>{const s=t[n+1]-t[n],o=this.getNumNGrams(s,u);this.createNGrams(e,a,i,r,o,u),r+=o})),this.preserveShort&&r===s[n]){const u=t[n+1]-t[n];if(0===u)continue;const s=u+2*this.padWidth,o=1;this.createNGrams(e,a,i,r,o,s)}}return[i,s]}}function ia(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 oa(e){const{inputs:{x:t},attrs:{begin:a,size:r},backend:u}=e,[s,i]=x.parseSliceParams(t,a,r),o=x.isSliceContinous(t.shape,s,i),d=u.readSync(t.dataId),p=u.makeOutput(i,t.dtype),l=n.computeStrides(t.shape),c=u.dataIdMap.get(p.dataId);if(o){const e=x.computeFlatOffset(s,l);if("string"===t.dtype)c.stringBytes=d.slice(e,e+n.sizeFromShape(i));else{u.typedArrayFromHeap(p).set(d.subarray(e,e+n.sizeFromShape(i)))}return p}if("string"===t.dtype){const e=ua(d,s,i,t.shape,t.dtype);return c.stringBytes=e,p}const m=u.typedArrayFromHeap(p),f=t.shape.length;if(2===f)!function(e,t,n,a,r){let u=0;const s=a[0],i=a[1],o=s+r[0];for(let a=s;a<o;a++){const s=a*t+i;n.set(e.subarray(s,s+r[1]),u),u+=r[1]}}(d,l[0],m,s,i);else if(3===f)!function(e,t,n,a,r,u){let s=0;const i=r[0],o=r[1],d=r[2],p=i+u[0],l=o+u[1];for(let r=i;r<p;r++)for(let i=o;i<l;i++){const o=r*t+i*n+d;a.set(e.subarray(o,o+u[2]),s),s+=u[2]}}(d,l[0],l[1],m,s,i);else if(4===f)!function(e,t,n,a,r,u,s){let i=0;const o=u[0],d=u[1],p=u[2],l=o+s[0],c=d+s[1],m=p+s[2],f=u[3];for(let u=o;u<l;u++)for(let o=d;o<c;o++)for(let d=p;d<m;d++){const p=u*t+o*n+d*a+f;r.set(e.subarray(p,p+s[3]),i),i+=s[3]}}(d,l[0],l[1],l[2],m,s,i);else{const e=ua(d,s,i,t.shape,t.dtype);m.set(e)}return p}const da={kernelName:D,backendName:"wasm",kernelFunc:oa};const pa={kernelName:R,backendName:"wasm",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{blockShape:u,crops:i}=a,o=u.reduce(((e,t)=>e*t)),d=s.getReshaped(r.shape,u,o),p=s.getPermuted(d.length,u.length),l=s.getReshapedPermuted(r.shape,u,o),c=s.getSliceBeginCoords(i,u.length),m=s.getSliceSize(l,i,u.length),f=ta({inputs:{x:r},backend:n,attrs:{shape:d}}),h=En({inputs:{x:f},backend:n,attrs:{perm:p}}),b=ta({inputs:{x:h},backend:n,attrs:{shape:l}}),y=oa({inputs:{x:b},backend:n,attrs:{begin:c,size:m}});return n.disposeData(f.dataId),n.disposeData(h.dataId),n.disposeData(b.dataId),y}};let la;const ca={kernelName:E,backendName:"wasm",setupFunc:function(e){la=e.wasm.cwrap(E,null,["number","number","boolean","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:n,attrs:a}=e,{x:r,weights:u}=n,{size:s}=a,i=0!==u.shape.reduce(((e,t)=>e*t),1),o=1===r.shape.length?[s]:[r.shape[0],s],d=t.makeOutput(o,u.dtype);function p(e){return t.dataIdMap.get(e.dataId).id}return la(p(r),s,i,p(u),yn[u.dtype],p(d)),d}},ma=An(W);const fa={kernelName:P,backendName:"wasm",kernelFunc:function(e){const{inputs:t,backend:n}=e,{s0:a,s1:r}=t,u=n.typedArrayFromHeap(a),i=n.typedArrayFromHeap(r),o=s.assertAndGetBroadcastShape(Array.from(u),Array.from(i));return n.makeOutput([o.length],"int32",void 0,new Int32Array(o))}};function ha(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 ba={kernelName:O,backendName:"wasm",kernelFunc:ha},ya=wn(C);let _a;const ga={kernelName:T,backendName:"wasm",setupFunc:function(e){_a=e.wasm.cwrap(T,null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{clipValueMin:u,clipValueMax:s}=a,i=n.dataIdMap.get(r.dataId).id,o=n.makeOutput(r.shape,r.dtype),d=n.dataIdMap.get(o.dataId).id;return _a(i,u,s,d),o}};function Ia(e){const{inputs:t,backend:a}=e,r=n.parseAxisParam(e.attrs.axis,t[0].shape)[0],u=t.map((e=>e.shape));s.assertParamsConsistent(u,r);let i=s.computeOutShape(t.map((e=>e.shape)),r);const o=t.filter((e=>n.sizeFromShape(e.shape)>0));if(1===o.length)return Nn({inputs:{x:o[0]},backend:a});const d=a.makeOutput(i,t[0].dtype);if(0===n.sizeFromShape(i))return d;if("string"===o[0].dtype){const e=o.map((e=>{const t=n.sizeFromShape(e.shape.slice(r));return ta({inputs:{x:e},backend:a,attrs:{shape:[-1,t]}})})),u=e.map((e=>({vals:a.readSync(e.dataId),shape:e.shape})));i=s.computeOutShape(e.map((e=>e.shape)),1);const p=1===e[0].shape[0],l=function(e,t,a,r){const u=n.getArrayFromDType(a,n.sizeFromShape(t));if(r&&"string"!==a){let t=0;e.forEach((e=>{const a=n.sizeFromShape(e.shape);u.set(e.vals,t),t+=a}))}else{let n=0;e.forEach((e=>{const r="string"===a?s.fromUint8ToStringArray(e.vals):e.vals;let i=0;for(let a=0;a<e.shape[0];++a){const s=a*t[1]+n;for(let t=0;t<e.shape[1];++t)u[s+t]=r[i++]}n+=e.shape[1]}))}return u}(u,i,t[0].dtype,p),c=s.computeOutShape(o.map((e=>e.shape)),r);d.shape=c;return a.dataIdMap.get(d.dataId).stringBytes=s.fromStringArrayToUint8(l),e.forEach((e=>a.disposeData(e.dataId))),d}const p=n.sizeFromShape(o[0].shape.slice(0,r));let l=0;const c=o.map((e=>{const t=n.sizeFromShape(e.shape.slice(r));return l+=t,t})),m=o.map((e=>a.typedArrayFromHeap(e))),f=a.typedArrayFromHeap(d);for(let e=0;e<p;e++){let t=e*l;for(let n=0;n<m.length;n++){const a=c[n],r=e*a,u=m[n].subarray(r,r+a);f.set(u,t),t+=a}}return d}const wa={kernelName:z,backendName:"wasm",kernelFunc:Ia};let ka;const Ma={kernelName:H,backendName:"wasm",setupFunc:function(e){ka=e.wasm.cwrap(H,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:t,attrs:n,backend:a}=e,{x:r,filter:u}=t,i=a.dataIdMap.get(r.dataId).id,o=a.dataIdMap.get(u.dataId).id,{strides:d,dilations:p,pad:l,dimRoundingMode:c,dataFormat:m}=n,f=s.convertConv2DDataFormat(m),h=s.computeConv2DInfo(r.shape,u.shape,d,p,l,c,!1,f),b=h.filterHeight,y=h.filterWidth,_=h.padInfo.top,g=h.padInfo.right,I=h.padInfo.bottom,w=h.padInfo.left,k=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=a.makeOutput(h.outShape,"float32"),D=a.dataIdMap.get(N.dataId).id;return ka(i,r.shape[0],r.shape[1],r.shape[2],o,b,y,_,g,I,w,F,k,M,S,A,v,x,D),N}};let Sa;const Aa={kernelName:B,backendName:"wasm",setupFunc:function(e){Sa=e.wasm.cwrap(B,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:t,inputs:a,attrs:r}=e,{dy:u,filter:i}=a,{strides:o,pad:d,dataFormat:p,dimRoundingMode:l,inputShape:c}=r,m=s.convertConv2DDataFormat(p),f=s.computeConv2DInfo(c,i.shape,o,1,d,l,!1,m),{batchSize:h,filterHeight:b,filterWidth:y,inChannels:_,inHeight:g,inWidth:I,outChannels:w,outHeight:k,outWidth:M,strideHeight:S,strideWidth:A}=f,v=b-1-f.padInfo.top,x=y-1-f.padInfo.left,F="channelsLast"===f.dataFormat,N=n.computeStrides(f.inShape),D=n.computeStrides(u.shape),[R,E,W]=n.computeStrides(i.shape),P=N[0],O=F?N[1]:N[2],C=F?N[2]:1,T=F?1:N[1],z=D[0],H=F?D[1]:D[2],B=F?D[2]:1,L=F?1:D[1],U=t.makeOutput(f.inShape,"float32"),j=t.dataIdMap.get(U.dataId).id,G=t.dataIdMap.get(u.dataId).id,q=t.dataIdMap.get(i.dataId).id;return Sa(G,q,h,b,y,g,I,_,k,M,w,S,A,v,x,R,E,W,P,O,C,T,z,H,B,L,j),U}};let va;const xa={kernelName:L,backendName:"wasm",setupFunc:function(e){va=e.wasm.cwrap(L,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:t,backend:n,attrs:a}=e,{x:r,filter:u}=t,{strides:i,pad:o,dilations:d}=a;if("float32"!==r.dtype)throw new Error(`Tensor x must have dtype float32, got ${r.dtype}`);if("float32"!==u.dtype)throw new Error(`Tensor filter must have dtype float32, got ${u.dtype}`);const p=s.computeConv3DInfo(r.shape,u.shape,i,d,o),l=n.makeOutput(p.outShape,r.dtype);return va(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(u.dataId).id,n.dataIdMap.get(l.dataId).id,p.batchSize,p.inDepth,p.inHeight,p.inWidth,p.inChannels,p.outDepth,p.outHeight,p.outWidth,p.outChannels,p.strideDepth,p.strideHeight,p.strideWidth,p.dilationDepth,p.dilationHeight,p.dilationWidth,p.filterDepth,p.filterHeight,p.filterWidth,p.padInfo.front,p.padInfo.top,p.padInfo.left),l}};let Fa;const Na={kernelName:U,backendName:"wasm",setupFunc:function(e){Fa=e.wasm.cwrap(U,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:t,backend:n,attrs:a}=e,{x:r,dy:u}=t,{strides:i,pad:o,filterShape:d}=a;if("float32"!==r.dtype)throw new Error(`Tensor dy must have dtype float32, got ${r.dtype}`);if("float32"!==u.dtype)throw new Error(`Tensor filter must have dtype float32, got ${u.dtype}`);const p=s.computeConv3DInfo(r.shape,d,i,1,o),l=n.makeOutput(p.filterShape,u.dtype);return Fa(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(u.dataId).id,n.dataIdMap.get(l.dataId).id,p.batchSize,p.inDepth,p.inHeight,p.inWidth,p.inChannels,p.outDepth,p.outHeight,p.outWidth,p.outChannels,p.strideDepth,p.strideHeight,p.strideWidth,p.dilationDepth,p.dilationHeight,p.dilationWidth,p.filterDepth,p.filterHeight,p.filterWidth,p.padInfo.front,p.padInfo.top,p.padInfo.left),l}};let Da;const Ra={kernelName:j,backendName:"wasm",setupFunc:function(e){Da=e.wasm.cwrap(j,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:t,backend:n,attrs:a}=e,{dy:r,filter:u}=t,{pad:i,strides:o,inputShape:d}=a;if("float32"!==r.dtype)throw new Error(`Tensor dy must have dtype float32, got ${r.dtype}`);if("float32"!==u.dtype)throw new Error(`Tensor filter must have dtype float32, got ${u.dtype}`);const p=s.computeConv3DInfo(d,u.shape,o,1,i),l=n.makeOutput(p.inShape,r.dtype);return Da(n.dataIdMap.get(u.dataId).id,n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(l.dataId).id,p.batchSize,p.inDepth,p.inHeight,p.inWidth,p.inChannels,p.outDepth,p.outHeight,p.outWidth,p.outChannels,p.strideDepth,p.strideHeight,p.strideWidth,p.dilationDepth,p.dilationHeight,p.dilationWidth,p.filterDepth,p.filterHeight,p.filterWidth,p.padInfo.front,p.padInfo.top,p.padInfo.left),l}},Ea=wn(G),Wa=wn(q);var Pa;let Oa;!function(e){e[e.bilinear=0]="bilinear",e[e.nearest=1]="nearest"}(Pa||(Pa={}));const Ca={kernelName:V,backendName:"wasm",setupFunc:function(e){Oa=e.wasm.cwrap(V,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:s}=a,{image:i,boxes:o,boxInd:d}=n,p=o.shape[0],[l,c]=s,m=[p,l,c,i.shape[3]];let f,h=t.dataIdMap.get(i.dataId);"float32"!==i.dtype&&(f=ha({backend:t,inputs:{x:i},attrs:{dtype:"float32"}}),h=t.dataIdMap.get(f.dataId));const b=h.id,y=t.dataIdMap.get(o.dataId).id,_=t.dataIdMap.get(d.dataId).id,g=t.makeOutput(m,"float32"),I=t.dataIdMap.get(g.dataId).id,w=new Uint8Array(new Int32Array(i.shape).buffer);return Oa(b,y,_,p,w,l,c,Pa[r],u,I),null!=f&&t.disposeData(f.dataId),g}};let Ta;const za={kernelName:$,backendName:"wasm",setupFunc:function(e){Ta=e.wasm.cwrap($,null,["number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:a,attrs:r}=e,{x:u}=t,{axis:i,exclusive:o,reverse:d}=r,p=u.shape.length;n.assert("float32"===u.dtype||"int32"===u.dtype,(()=>`cumprod does not support ${u.dtype} tensors in the WASM backend`));const l=s.getAxesPermutation([i],p);let c=u;null!==l&&(c=En({inputs:{x:u},attrs:{perm:l},backend:a}));const m=s.getInnerMostAxes(1,p)[0];s.assertAxesAreInnerMostDims("cumprod",[m],p);const f=a.makeOutput(c.shape,c.dtype),h=c.shape[m],b=a.dataIdMap.get(c.dataId).id,y=a.dataIdMap.get(f.dataId).id;Ta(b,o?1:0,d?1:0,h,y,yn[u.dtype]);let _=f;if(null!==l){_=En({inputs:{x:f},attrs:{perm:s.getUndoAxesPermutation(l)},backend:a}),a.disposeData(c.dataId),a.disposeData(f.dataId)}return _}};let Ha;const Ba={kernelName:K,backendName:"wasm",setupFunc:function(e){Ha=e.wasm.cwrap(K,null,["number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:a,attrs:r}=e,{x:u}=t,{axis:i,exclusive:o,reverse:d}=r,p=u.shape.length;n.assert("float32"===u.dtype||"int32"===u.dtype,(()=>`cumsum does not support ${u.dtype} tensors in the WASM backend`));const l=s.getAxesPermutation([i],p);let c=u;null!==l&&(c=En({inputs:{x:u},attrs:{perm:l},backend:a}));const m=s.getInnerMostAxes(1,p)[0];s.assertAxesAreInnerMostDims("cumsum",[m],p);const f=a.makeOutput(c.shape,c.dtype),h=c.shape[m],b=a.dataIdMap.get(c.dataId).id,y=a.dataIdMap.get(f.dataId).id;Ha(b,o?1:0,d?1:0,h,y,yn[u.dtype]);let _=f;if(null!==l){_=En({inputs:{x:f},attrs:{perm:s.getUndoAxesPermutation(l)},backend:a}),a.disposeData(c.dataId),a.disposeData(f.dataId)}return _}};let La;const Ua={kernelName:X,backendName:"wasm",setupFunc:function(e){La=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:s,binaryOutput:i}=a,o=0!==u.shape.reduce(((e,t)=>e*t),1),d=1===r.shape.length?[s]:[r.shape[0],s],p=t.makeOutput(d,u.dtype);function l(e){return t.dataIdMap.get(e.dataId).id}return La(l(r),new Uint8Array(new Int32Array(r.shape).buffer),r.shape.length,s,o,l(u),yn[u.dtype],i,l(p)),p}};let ja;const Ga={kernelName:Q,backendName:"wasm",setupFunc:function(e){ja=e.wasm.cwrap(Q,null,["number","number","number","array","number","array","array","number","number"])},kernelFunc:function(e){const{backend:t,inputs:a,attrs:r}=e,{x:u}=a,{blockSize:s,dataFormat:i}=r,o=u.shape[0],d=("NHWC"===i?u.shape[1]:u.shape[2])*s,p=("NHWC"===i?u.shape[2]:u.shape[3])*s,l=("NHWC"===i?u.shape[3]:u.shape[1])/(s*s),c="NHWC"===i?[o,d,p,l]:[o,l,d,p],m=t.makeOutput(c,"float32"),f=t.dataIdMap.get(u.dataId).id,h=new Uint8Array(new Int32Array(n.computeStrides(u.shape)).buffer),b=new Uint8Array(new Int32Array(c).buffer),y=new Uint8Array(new Int32Array(n.computeStrides(c)).buffer),_=t.dataIdMap.get(m.dataId).id;return ja(f,s,"NHWC"===i?1:0,h,u.shape.length-1,b,y,c.length,_),m}};let qa;const Va={kernelName:J,backendName:"wasm",setupFunc:function(e){qa=e.wasm.cwrap(J,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:t,attrs:n,backend:a}=e,{x:r,filter:u}=t,i=a.dataIdMap.get(r.dataId).id,o=a.dataIdMap.get(u.dataId).id,{strides:d,dilations:p,pad:l,dimRoundingMode:c}=n,m=null==p?[1,1]:p,f=s.computeConv2DInfo(r.shape,u.shape,d,m,l,c,!0),h=f.filterHeight,b=f.filterWidth,y=f.padInfo.top,_=f.padInfo.right,g=f.padInfo.bottom,I=f.padInfo.left,w=f.dilationHeight,k=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=a.makeOutput(f.outShape,"float32"),N=a.dataIdMap.get(F.dataId).id;return qa(i,r.shape[0],r.shape[1],r.shape[2],o,h,b,y,_,g,I,x,w,k,M,S,A,v,N),F}};let $a;const Ka={kernelName:Z,backendName:"wasm",setupFunc:function(e){$a=e.wasm.cwrap("Diag",null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:a}=e,{x:r}=t,u=n.sizeFromShape(r.shape),s=a.makeOutput([...r.shape,...r.shape],r.dtype);return $a(a.dataIdMap.get(r.dataId).id,yn[r.dtype],u,a.dataIdMap.get(s.dataId).id),s}};let Xa;const Qa={kernelName:Y,backendName:"wasm",setupFunc:function(e){Xa=e.wasm.cwrap(Y,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:r,filter:u}=t,{strides:i,pad:o,dilations:d}=a;if(r.dtype!==u.dtype)throw new Error(`Dilation2D error: x must have the same dtype as filter. Got ${r.dtype} and ${u.dtype}`);const p=s.computeDilation2DInfo(r.shape,u.shape,i,o,"NHWC",d),l=n.makeOutput(p.outShape,r.dtype);return Xa(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(u.dataId).id,n.dataIdMap.get(l.dataId).id,yn[r.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),l}};let Ja;const Za={kernelName:ee,backendName:"wasm",setupFunc:function(e){Ja=e.wasm.cwrap(ee,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:t,backend:n,attrs:a}=e,{x:r,filter:u,dy:i}=t,{strides:o,pad:d,dilations:p}=a;if(r.dtype!==u.dtype||r.dtype!==i.dtype)throw new Error(`Dilation2DBackpropFilter error: x must have the same dtype as filter and dy. Got ${r.dtype}, ${u.dtype}, and ${i.dtype}`);const l=s.computeDilation2DInfo(r.shape,u.shape,o,d,"NHWC",p),c=n.makeOutput(u.shape,u.dtype);return Ja(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(u.dataId).id,n.dataIdMap.get(i.dataId).id,n.dataIdMap.get(c.dataId).id,yn[r.dtype],l.batchSize,l.inChannels,l.inHeight,l.inWidth,l.outHeight,l.outWidth,l.strideHeight,l.strideWidth,l.dilationHeight,l.dilationWidth,l.filterHeight,l.filterWidth,l.padInfo.top,l.padInfo.left),c}};let Ya;const er={kernelName:te,backendName:"wasm",setupFunc:function(e){Ya=e.wasm.cwrap(te,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:t,backend:n,attrs:a}=e,{x:r,filter:u,dy:i}=t,{strides:o,pad:d,dilations:p}=a;if(r.dtype!==u.dtype||r.dtype!==i.dtype)throw new Error(`Dilation2DBackpropInput error: x must have the same dtype as filter and dy. Got ${r.dtype}, ${u.dtype}, and ${i.dtype}`);const l=s.computeDilation2DInfo(r.shape,u.shape,o,d,"NHWC",p),c=n.makeOutput(r.shape,r.dtype);return Ya(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(u.dataId).id,n.dataIdMap.get(i.dataId).id,n.dataIdMap.get(c.dataId).id,yn[r.dtype],l.batchSize,l.inChannels,l.inHeight,l.inWidth,l.outHeight,l.outWidth,l.strideHeight,l.strideWidth,l.dilationHeight,l.dilationWidth,l.filterHeight,l.filterWidth,l.padInfo.top,l.padInfo.left),c}},tr=wn(ne);let nr;const ar={kernelName:ae,backendName:"wasm",setupFunc:function(e){nr=e.wasm.cwrap(ae,null,["number","number","number"])},kernelFunc:function(e){const{inputs:t,backend:n}=e,{dy:a,y:r}=t,u=n.makeOutput(r.shape,"float32"),s=e=>n.dataIdMap.get(e.dataId).id;return nr(s(r),s(a),s(u)),u}},rr=An(re,0,"bool"),ur=wn(ue),sr=wn(se,"float32");function ir(e){const{inputs:t,attrs:a,backend:r}=e,{input:u}=t,{dim:s}=a,i=u.shape.length,o=u.shape.slice();let d=s;return s<0&&(n.assert(-(i+1)<=s,(()=>`Axis must be in the interval [${-(i+1)}, ${i}]`)),d=i+s+1),o.splice(d,0,1),ta({inputs:{x:u},backend:r,attrs:{shape:o}})}const or={kernelName:ie,backendName:"wasm",kernelFunc:ir},dr=wn(oe,"float32");function pr(e){const{attrs:{shape:t,value:a},backend:r}=e;let{attrs:{dtype:u}}=e;u=u||n.inferDtype(a);const s=r.makeOutput(t,u);return r.typedArrayFromHeap(s).fill(a),s}const lr={kernelName:de,backendName:"wasm",kernelFunc:pr};let cr;const mr={kernelName:pe,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,s=n.dataIdMap.get(r.dataId).id,[i,o,d,p]=a.shape;return cr(u,i,o,d,p,s),r},setupFunc:function(e){cr=e.wasm.cwrap(pe,null,["number","number","number","number","number","number"])}},fr=wn(le),hr=An(ce);let br;const yr={kernelName:me,backendName:"wasm",setupFunc:function(e){br=e.wasm.cwrap(me,null,["number","number","number","number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:a,attrs:r}=e,{varianceEpsilon:u}=r,{x:s,mean:i,variance:o,offset:d,scale:p}=a,l=t.dataIdMap.get(s.dataId).id,c=t.dataIdMap.get(i.dataId).id,m=t.dataIdMap.get(o.dataId).id,f=null!=d?t.dataIdMap.get(d.dataId).id:0,h=null!=p?t.dataIdMap.get(p.dataId).id:0,b=t.makeOutput(s.shape,s.dtype);if(0===n.sizeFromShape(s.shape))return b;const y=t.dataIdMap.get(b.dataId).id;return br(l,c,m,f,h,u,y),b}};let _r;const gr={kernelName:fe,backendName:"wasm",setupFunc:function(e){_r=e.wasm.cwrap(fe,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:t,attrs:n,backend:a}=e,{x:r,filter:u,bias:i,preluActivationWeights:o}=t,{strides:d,pad:p,dilations:l,dataFormat:c,dimRoundingMode:m,activation:f,leakyreluAlpha:h}=n,b=s.computeConv2DInfo(r.shape,u.shape,d,l,p,m),y=_n[f];if(null==y)throw new Error(`${f} activation not yet supported for FusedConv2D in the wasm backend.`);const _=a.dataIdMap.get(r.dataId).id,g=a.dataIdMap.get(u.dataId).id,I=b.outChannels;let w=0;if(null!=i){const e=a.dataIdMap.get(i.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 k=b.filterHeight,M=b.filterWidth,S=b.padInfo.top,A=b.padInfo.right,v=b.padInfo.bottom,x=b.padInfo.left,F=b.dilationHeight,N=b.dilationWidth,D=b.strideHeight,R=b.strideWidth,E=b.inChannels,W="SAME"===b.padInfo.type?1:0,P=b.batchSize,O=b.inHeight,C=b.inWidth;if("NHWC"!==c)throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${c}'. Please use 'NHWC'.`);const T=a.makeOutput(b.outShape,"float32"),z=a.dataIdMap.get(T.dataId).id,H=null==o?0:a.dataIdMap.get(o.dataId).id;return _r(_,P,O,C,g,k,M,w,S,A,v,x,W,F,N,D,R,E,I,y,H,h||0,z),T}};let Ir;const wr={kernelName:he,backendName:"wasm",setupFunc:function(e){Ir=e.wasm.cwrap(he,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:t,attrs:n,backend:a}=e,{x:r,filter:u,bias:i,preluActivationWeights:o}=t,{strides:d,pad:p,dilations:l,dataFormat:c,dimRoundingMode:m,activation:f,leakyreluAlpha:h}=n,b=s.computeConv2DInfo(r.shape,u.shape,d,l,p,m,!0),y=_n[f];if(null==y)throw new Error(`${f} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);const _=a.dataIdMap.get(r.dataId).id,g=a.dataIdMap.get(u.dataId).id,I=b.outChannels;let w=0;if(null!=i){const e=a.dataIdMap.get(i.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 k=b.filterHeight,M=b.filterWidth,S=b.padInfo.top,A=b.padInfo.right,v=b.padInfo.bottom,x=b.padInfo.left,F=b.dilationHeight,N=b.dilationWidth,D=b.strideHeight,R=b.strideWidth,E=b.inChannels,W="SAME"===b.padInfo.type?1:0,P=b.batchSize,O=b.inHeight,C=b.inWidth;if("NHWC"!==c)throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${c}'. Please use 'NHWC'.`);const T=a.makeOutput(b.outShape,"float32"),z=a.dataIdMap.get(T.dataId).id,H=null==o?0:a.dataIdMap.get(o.dataId).id;return Ir(_,P,O,C,g,k,M,w,S,A,v,x,W,F,N,D,R,E,I,y,H,h||0,z),T}};let kr;const Mr={kernelName:be,backendName:"wasm",setupFunc:function(e){kr=e.wasm.cwrap(be,null,["number","number","number","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:n}=e,{params:a,indices:r}=n,[u,s,i,o]=ye.prepareAndValidate(a,r),d=t.makeOutput(u,a.dtype);if(0===s)return d;const p=r.shape,l=p[p.length-1],c=t.dataIdMap.get(a.dataId).id,m=t.dataIdMap.get(r.dataId).id,f=new Uint8Array(new Int32Array(o).buffer),h=t.dataIdMap.get(d.dataId).id;return kr(c,yn[a.dtype],m,s,l,i,f,h),d}};let Sr;const Ar={kernelName:_e,backendName:"wasm",setupFunc:function(e){Sr=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])},kernelFunc:function(e){const{backend:t,inputs:a,attrs:r}=e,{x:u,indices:i}=a,{axis:o,batchDims:d}=r,p=n.parseAxisParam(o,u.shape)[0],l=t.readSync(i.dataId),c=u.shape[p];for(let e=0;e<l.length;++e){const t=l[e];n.assert(t<=c-1&&t>=0,(()=>`GatherV2: the index value ${t} is not in [0, ${c-1}]`))}const m=s.segment_util.collectGatherOpShapeInfo(u,i,p,d),f=ta({inputs:{x:u},attrs:{shape:[m.batchSize,m.outerSize,m.dimSize,m.sliceSize]},backend:t}),h=n.sizeFromShape(i.shape),b=ta({inputs:{x:i},attrs:{shape:[m.batchSize,h/m.batchSize]},backend:t}),y=[m.batchSize,m.outerSize,h/m.batchSize,m.sliceSize],_=t.makeOutput(y,u.dtype);if(0===n.sizeFromShape(u.shape))return _;const g=f.shape.length-1,I=t.dataIdMap.get(f.dataId).id,w=t.dataIdMap.get(b.dataId).id,k=t.dataIdMap.get(_.dataId).id,M=new Uint8Array(new Int32Array(n.computeStrides(f.shape)).buffer),S=new Uint8Array(new Int32Array(n.computeStrides(y)).buffer);return Sr(I,yn[u.dtype],M,g,w,m.batchSize,S,k),t.disposeData(f.dataId),t.disposeData(b.dataId),_.shape=m.outputShape,_}},vr=An(ge,0,"bool"),xr=An(Ie,0,"bool"),Fr=wn(we,"bool"),Nr=wn(ke,"bool"),Dr=wn(Me,"bool");let Rr;const Er={kernelName:Se,backendName:"wasm",setupFunc:function(e){Rr=e.wasm.cwrap(Se,null,["number","number","number","number"])},kernelFunc:function(e){const{inputs:{x:t},attrs:{alpha:a},backend:r}=e,u=r.dataIdMap.get(t.dataId).id,s=r.makeOutput(t.shape,"float32");if(0!==n.sizeFromShape(t.shape)){const e=r.dataIdMap.get(s.dataId).id;Rr(u,yn[t.dtype],a,e)}return s}},Wr=An(Ae,0,"bool"),Pr=An(ve,0,"bool");let Or;const Cr={kernelName:xe,backendName:"wasm",setupFunc:function(e){Or=e.wasm.cwrap(xe,null,["number","number","number","number"])},kernelFunc:function(e){const{attrs:t,backend:n}=e,{start:a,stop:r,num:u}=t,s=Math.floor(u),i=n.makeOutput([s],"float32");return Or(n.dataIdMap.get(i.dataId).id,a,r,s),i}},Tr=wn(Fe),zr=wn(Ne),Hr=An(De,0,"bool"),Br=wn(Re),Lr=An(Ee,0,"bool"),Ur=An(We,0,"bool");let jr;const Gr={kernelName:Pe,backendName:"wasm",setupFunc:function(e){jr=e.wasm.cwrap(Pe,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:s,alpha:i,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 jr(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(d.dataId).id,r.shape[3],u,s,i,o),d}};let qr;const Vr={kernelName:Oe,backendName:"wasm",setupFunc:function(e){qr=e.wasm.cwrap(Oe,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:s}=t,{depthRadius:i,bias:o,alpha:d,beta:p}=a;if("float32"!==r.dtype||"float32"!==u.dtype||"float32"!==s.dtype)throw new Error("LRNGrad error: x, y, and dy must have dtype float32");const l=n.makeOutput(r.shape,r.dtype);return qr(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(u.dataId).id,n.dataIdMap.get(s.dataId).id,n.dataIdMap.get(l.dataId).id,s.shape[3],i,o,d,p),l}};let $r;const Kr={kernelName:Ce,backendName:"wasm",setupFunc:function(e){$r=e.wasm.cwrap(Ce,null,["number","number","number","number"])},kernelFunc:function(e){const{backend:t,inputs:a,attrs:r}=e,{reductionIndices:u,keepDims:i}=r,{x:o}=a;let d=t.dataIdMap.get(o.dataId).id,p=o;const{transposed:l,axes:c,originalAxes:m,inputWasTransposed:f}=Pn(o,u,t);if(f){p=l,d=t.dataIdMap.get(l.dataId).id}const h=p.shape.length;s.assertAxesAreInnerMostDims("max",c,h);const[b,y]=s.computeOutAndReduceShapes(p.shape,c),_=n.sizeFromShape(y),g=t.makeOutput(b,o.dtype);if(0!==n.sizeFromShape(p.shape)){const e=t.dataIdMap.get(g.dataId).id;$r(d,yn[o.dtype],_,e)}if(f&&t.disposeData(l.dataId),i){const e=s.expandShapeToKeepDim(g.shape,m);g.shape=e}return g}},Xr=An(Te);let Qr;const Jr={kernelName:ze,backendName:"wasm",setupFunc:function(e){Qr=e.wasm.cwrap(ze,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])},kernelFunc:function(e){const{inputs:t,attrs:a,backend:r}=e,u=t.x,i=r.dataIdMap.get(u.dataId).id;n.assert("float32"===u.dtype,(()=>`Error in MaxPool: only float32 input is supported. Got ${u.dtype}.`));const{filterSize:o,strides:d,pad:p,dimRoundingMode:l}=a,c=s.computePool2DInfo(u.shape,o,d,1,p,l),m=c.filterHeight,f=c.filterWidth,h=c.padInfo.top,b=c.padInfo.right,y=c.padInfo.bottom,_=c.padInfo.left,g=c.dilationHeight,I=c.dilationWidth,w=c.strideHeight,k=c.strideWidth,M=c.inChannels,S=c.outChannels;if("channelsLast"!==c.dataFormat)throw new Error(`wasm backend does not support dataFormat:'${c.dataFormat}'. Please use 'channelsLast'.`);const A=r.makeOutput(c.outShape,"float32"),v=r.dataIdMap.get(A.dataId).id;return Qr(i,u.shape[0],u.shape[1],u.shape[2],m,f,h,b,y,_,g,I,w,k,M,S,v),A}};let Zr;const Yr={kernelName:He,backendName:"wasm",setupFunc:function(e){Zr=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:t,backend:n,attrs:a}=e,{x:r}=t,{filterSize:u,strides:i,pad:o,dimRoundingMode:d,dataFormat:p}=a,l=s.computePool3DInfo(r.shape,u,i,1,o,d,p),c=n.makeOutput(l.outShape,r.dtype);return Zr(n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(c.dataId).id,l.batchSize,l.inChannels,l.inDepth,l.inHeight,l.inWidth,l.outDepth,l.outHeight,l.outWidth,l.strideDepth,l.strideHeight,l.strideWidth,l.dilationDepth,l.dilationHeight,l.dilationWidth,l.effectiveFilterDepth,l.effectiveFilterHeight,l.effectiveFilterWidth,l.padInfo.front,l.padInfo.top,l.padInfo.left),c}};let eu;const tu={kernelName:Be,backendName:"wasm",setupFunc:function(e){eu=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:t,backend:n,attrs:a}=e,{dy:r,input:u}=t,{filterSize:i,strides:o,pad:d,dimRoundingMode:p}=a,l=s.computePool3DInfo(u.shape,i,o,1,d,p),c=n.makeOutput(u.shape,u.dtype);return eu(n.dataIdMap.get(u.dataId).id,n.dataIdMap.get(r.dataId).id,n.dataIdMap.get(c.dataId).id,l.batchSize,l.inChannels,l.inDepth,l.inHeight,l.inWidth,l.outDepth,l.outHeight,l.outWidth,l.strideDepth,l.strideHeight,l.strideWidth,l.dilationDepth,l.dilationHeight,l.dilationWidth,l.effectiveFilterDepth,l.effectiveFilterHeight,l.effectiveFilterWidth,l.padInfo.front,l.padInfo.top,l.padInfo.left),c}};let nu;const au={kernelName:Le,backendName:"wasm",setupFunc:function(e){nu=e.wasm.cwrap("MaxPoolGrad",null,["number","number","number","number","number","number","n