1var Yh=Object.defineProperty;var Jh=(e,t,r)=>t in e?Yh(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var ms=(e,t,r)=>Jh(e,typeof t!="symbol"?t+"":t,r);/*! 2 * ONNX Runtime Web v1.22.0-dev.20250409-89f8206ba4 3 * Copyright (c) Microsoft Corporation. All rights reserved. 4 * Licensed under the MIT License. 5 */var Sa=Object.defineProperty,em=Object.getOwnPropertyDescriptor,tm=Object.getOwnPropertyNames,rm=Object.prototype.hasOwnProperty,im=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),U=(e,t)=>()=>(e&&(t=e(e=0)),t),Pt=(e,t)=>{for(var r in t)Sa(e,r,{get:t[r],enumerable:!0})},am=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of tm(t))!rm.call(e,n)&&n!==r&&Sa(e,n,{get:()=>t[n],enumerable:!(a=em(t,n))||a.enumerable});return e},nr=e=>am(Sa({},"__esModule",{value:!0}),e),jt,pt,kt,gs,Zl,Ql=U(()=>{jt=new Map,pt=[],kt=(e,t,r)=>{if(t&&typeof t.init=="function"&&typeof t.createInferenceSessionHandler=="function"){let a=jt.get(e);if(a===void 0)jt.set(e,{backend:t,priority:r});else{if(a.priority>r)return;if(a.priority===r&&a.backend!==t)throw new Error(`cannot register backend "${e}" using priority ${r}`)}if(r>=0){let n=pt.indexOf(e);n!==-1&&pt.splice(n,1);for(let i=0;i<pt.length;i++)if(jt.get(pt[i]).priority<=r){pt.splice(i,0,e);return}pt.push(e)}return}throw new TypeError("not a valid backend")},gs=async e=>{let t=jt.get(e);if(!t)return"backend not found.";if(t.initialized)return t.backend;if(t.aborted)return t.error;{let r=!!t.initPromise;try{return r||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(a){return r||(t.error=`${a}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},Zl=async e=>{let t=e.executionProviders||[],r=t.map(d=>typeof d=="string"?d:d.name),a=r.length===0?pt:r,n,i=[],s=new Set;for(let d of a){let l=await gs(d);typeof l=="string"?i.push({name:d,err:l}):(n||(n=l),n===l&&s.add(d))}if(!n)throw new Error(`no available backend found. ERR: ${i.map(d=>`[${d.name}] ${d.err}`).join(", ")}`);for(let{name:d,err:l}of i)r.includes(d)&&console.warn(`removing requested execution provider "${d}" from session options because it is not available: ${l}`);let u=t.filter(d=>s.has(typeof d=="string"?d:d.name));return[n,new Proxy(e,{get:(d,l)=>l==="executionProviders"?u:Reflect.get(d,l)})]}}),nm=U(()=>{Ql()}),Xl,sm=U(()=>{Xl="1.22.0-dev.20250409-89f8206ba4"}),li,Pe,Yl=U(()=>{sm(),li="warning",Pe={wasm:{},webgl:{},webgpu:{},versions:{common:Xl},set logLevel(e){if(e!==void 0){if(typeof e!="string"||["verbose","info","warning","error","fatal"].indexOf(e)===-1)throw new Error(`Unsupported logging level: ${e}`);li=e}},get logLevel(){return li}},Object.defineProperty(Pe,"logLevel",{enumerable:!0})}),ye,om=U(()=>{Yl(),ye=Pe}),Jl,ed,um=U(()=>{Jl=(e,t)=>{let r=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);r.width=e.dims[3],r.height=e.dims[2];let a=r.getContext("2d");if(a!=null){let n,i;(t==null?void 0:t.tensorLayout)!==void 0&&t.tensorLayout==="NHWC"?(n=e.dims[2],i=e.dims[3]):(n=e.dims[3],i=e.dims[2]);let s=(t==null?void 0:t.format)!==void 0?t.format:"RGB",u=t==null?void 0:t.norm,d,l;u===void 0||u.mean===void 0?d=[255,255,255,255]:typeof u.mean=="number"?d=[u.mean,u.mean,u.mean,u.mean]:(d=[u.mean[0],u.mean[1],u.mean[2],0],u.mean[3]!==void 0&&(d[3]=u.mean[3])),u===void 0||u.bias===void 0?l=[0,0,0,0]:typeof u.bias=="number"?l=[u.bias,u.bias,u.bias,u.bias]:(l=[u.bias[0],u.bias[1],u.bias[2],0],u.bias[3]!==void 0&&(l[3]=u.bias[3]));let c=i*n,f=0,m=c,g=c*2,_=-1;s==="RGBA"?(f=0,m=c,g=c*2,_=c*3):s==="RGB"?(f=0,m=c,g=c*2):s==="RBG"&&(f=0,g=c,m=c*2);for(let b=0;b<i;b++)for(let x=0;x<n;x++){let w=(e.data[f++]-l[0])*d[0],$=(e.data[m++]-l[1])*d[1],k=(e.data[g++]-l[2])*d[2],S=_===-1?255:(e.data[_++]-l[3])*d[3];a.fillStyle="rgba("+w+","+$+","+k+","+S+")",a.fillRect(x,b,1,1)}if("toDataURL"in r)return r.toDataURL();throw new Error("toDataURL is not supported")}else throw new Error("Can not access image data")},ed=(e,t)=>{let r=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),a;if(r!=null){let n,i,s;(t==null?void 0:t.tensorLayout)!==void 0&&t.tensorLayout==="NHWC"?(n=e.dims[2],i=e.dims[1],s=e.dims[3]):(n=e.dims[3],i=e.dims[2],s=e.dims[1]);let u=t!==void 0&&t.format!==void 0?t.format:"RGB",d=t==null?void 0:t.norm,l,c;d===void 0||d.mean===void 0?l=[255,255,255,255]:typeof d.mean=="number"?l=[d.mean,d.mean,d.mean,d.mean]:(l=[d.mean[0],d.mean[1],d.mean[2],255],d.mean[3]!==void 0&&(l[3]=d.mean[3])),d===void 0||d.bias===void 0?c=[0,0,0,0]:typeof d.bias=="number"?c=[d.bias,d.bias,d.bias,d.bias]:(c=[d.bias[0],d.bias[1],d.bias[2],0],d.bias[3]!==void 0&&(c[3]=d.bi
vendor: 11,489 bytes, line 5
5as[3]));let f=i*n;if(t!==void 0&&(t.format!==void 0&&s===4&&t.format!=="RGBA"||s===3&&t.format!=="RGB"&&t.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let m=4,g=0,_=1,b=2,x=3,w=0,$=f,k=f*2,S=-1;u==="RGBA"?(w=0,$=f,k=f*2,S=f*3):u==="RGB"?(w=0,$=f,k=f*2):u==="RBG"&&(w=0,k=f,$=f*2),a=r.createImageData(n,i);for(let T=0;T<i*n;g+=m,_+=m,b+=m,x+=m,T++)a.data[g]=(e.data[w++]-c[0])*l[0],a.data[_]=(e.data[$++]-c[1])*l[1],a.data[b]=(e.data[k++]-c[2])*l[2],a.data[x]=S===-1?255:(e.data[S++]-c[3])*l[3]}else throw new Error("Can not access image data");return a}}),br,td,rd,id,ad,nd,lm=U(()=>{ka(),br=(e,t)=>{if(e===void 0)throw new Error("Image buffer must be defined");if(t.height===void 0||t.width===void 0)throw new Error("Image height and width must be defined");if(t.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:r,width:a}=t,n=t.norm??{mean:255,bias:0},i,s;typeof n.mean=="number"?i=[n.mean,n.mean,n.mean,n.mean]:i=[n.mean[0],n.mean[1],n.mean[2],n.mean[3]??255],typeof n.bias=="number"?s=[n.bias,n.bias,n.bias,n.bias]:s=[n.bias[0],n.bias[1],n.bias[2],n.bias[3]??0];let u=t.format!==void 0?t.format:"RGBA",d=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:"RGB",l=r*a,c=d==="RGBA"?new Float32Array(l*4):new Float32Array(l*3),f=4,m=0,g=1,_=2,b=3,x=0,w=l,$=l*2,k=-1;u==="RGB"&&(f=3,m=0,g=1,_=2,b=-1),d==="RGBA"?k=l*3:d==="RBG"?(x=0,$=l,w=l*2):d==="BGR"&&($=0,w=l,x=l*2);for(let S=0;S<l;S++,m+=f,_+=f,g+=f,b+=f)c[x++]=(e[m]+s[0])/i[0],c[w++]=(e[g]+s[1])/i[1],c[$++]=(e[_]+s[2])/i[2],k!==-1&&b!==-1&&(c[k++]=(e[b]+s[3])/i[3]);return d==="RGBA"?new Re("float32",c,[1,4,r,a]):new Re("float32",c,[1,3,r,a])},td=async(e,t)=>{let r=typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement,a=typeof ImageData<"u"&&e instanceof ImageData,n=typeof ImageBitmap<"u"&&e instanceof ImageBitmap,i=typeof e=="string",s,u=t??{},d=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},l=c=>typeof HTMLCanvasElement<"u"&&c instanceof HTMLCanvasElement||c instanceof OffscreenCanvas?c.getContext("2d"):null;if(r){let c=d();c.width=e.width,c.height=e.height;let f=l(c);if(f!=null){let m=e.height,g=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(m=t.resizedHeight,g=t.resizedWidth),t!==void 0){if(u=t,t.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");u.tensorFormat="RGBA",u.height=m,u.width=g}else u.tensorFormat="RGBA",u.height=m,u.width=g;f.drawImage(e,0,0),s=f.getImageData(0,0,g,m).data}else throw new Error("Can not access image data")}else if(a){let c,f;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(c=t.resizedHeight,f=t.resizedWidth):(c=e.height,f=e.width),t!==void 0&&(u=t),u.format="RGBA",u.height=c,u.width=f,t!==void 0){let m=d();m.width=f,m.height=c;let g=l(m);if(g!=null)g.putImageData(e,0,0),s=g.getImageData(0,0,f,c).data;else throw new Error("Can not access image data")}else s=e.data}else if(n){if(t===void 0)throw new Error("Please provide image config with format for Imagebitmap");let c=d();c.width=e.width,c.height=e.height;let f=l(c);if(f!=null){let m=e.height,g=e.width;return f.drawImage(e,0,0,g,m),s=f.getImageData(0,0,g,m).data,u.height=m,u.width=g,br(s,u)}else throw new Error("Can not access image data")}else{if(i)return new Promise((c,f)=>{let m=d(),g=l(m);if(!e||!g)return f();let _=new Image;_.crossOrigin="Anonymous",_.src=e,_.onload=()=>{m.width=_.width,m.height=_.height,g.drawImage(_,0,0,m.width,m.height);let b=g.getImageData(0,0,m.width,m.height);u.height=m.height,u.width=m.width,c(br(b.data,u))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(s!==void 0)return br(s,u);throw new Error("Input data provided is not supported - aborted tensor creation")},rd=(e,t)=>{let{width:r,height:a,download:n,dispose:i}=t,s=[1,a,r,4];return new Re({location:"texture",type:"float32",texture:e,dims:s,download:n,dispose:i})},id=(e,t)=>{let{dataType:r,dims:a,download:n,dispose:i}=t;return new Re({location:"gpu-buffer",type:r??"float32",gpuBuffer:e,dims:a,download:n,dispose:i})},ad=(e,t)=>{let{dataType:r,dims:a,download:n,dispose:i}=t;return new Re({location:"ml-tensor",type:r??"float32",mlTensor:e,dims:a,download:n,dispose:i})},nd=(e,t,r)=>new Re({location:"cpu-pinned",type:e,data:t,dims:r??[t.length]})}),xt,er,di,sd,dm=U(()=>{xt=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array],["int4",Uint8Array],["uint4",Uint8Array]]),er=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),di=!1,sd=()=>{if(!di){di=!0;let e=typeof BigInt64Array<"u"&&BigInt64Array.from,t=typeof BigUint64Array<"u"&&BigUint64Array.from,r=globalThis.Float16Array,a=typeof r<"u"&&r.from;e&&(xt.set("int64",BigInt64Array),er.set(BigInt64Array,"int64")),t&&(xt.set("uint64",BigUint64Array),er.set(BigUint64Array,"uint64")),a?(xt.set("float16",r),er.set(r,"float16")):xt.set("float16",Uint16Array)}}}),od,ud,pm=U(()=>{ka(),od=e=>{let t=1;for(let r=0;r<e.length;r++){let a=e[r];if(typeof a!="number"||!Number.isSafeInteger(a))throw new TypeError(`dims[${r}] must be an integer, got: ${a}`);if(a<0)throw new RangeError(`dims[${r}] must be a non-negative integer, got: ${a}`);t*=a}return t},ud=(e,t)=>{switch(e.location){case"cpu":return new Re(e.type,e.data,t);case"cpu-pinned":return new Re({location:"cpu-pinned",data:e.data,type:e.type,dims:t});case"texture":return new Re({location:"texture",texture:e.texture,type:e.type,dims:t});case"gpu-buffer":return new Re({location:"gpu-buffer",gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case"ml-tensor":return new Re({location:"ml-tensor",mlTensor:e.mlTensor,type:e.type,dims:t});default:throw new Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),Re,ka=U(()=>{um(),lm(),dm(),pm(),Re=class{constructor(e,t,r){sd();let a,n;if(typeof e=="object"&&"location"in e)switch(this.dataLocation=e.location,a=e.type,n=e.dims,e.location){case"cpu-pinned":{let s=xt.get(a);if(!s)throw new TypeError(`unsupported type "${a}" to create tensor from pinned buffer`);if(!(e.data instanceof s))throw new TypeError(`buffer should be of type ${s.name}`);this.cpuData=e.data;break}case"texture":{if(a!=="float32")throw new TypeError(`unsupported type "${a}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break}case"gpu-buffer":{if(a!=="float32"&&a!=="float16"&&a!=="int32"&&a!=="int64"&&a!=="uint32"&&a!=="uint8"&&a!=="bool"&&a!=="uint4"&&a!=="int4")throw new TypeError(`unsupported type "${a}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break}case"ml-tensor":{if(a!=="float32"&&a!=="float16"&&a!=="int32"&&a!=="int64"&&a!=="uint32"&&a!=="uint64"&&a!=="int8"&&a!=="uint8"&&a!=="bool"&&a!=="uint4"&&a!=="int4")throw new TypeError(`unsupported type "${a}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let s,u;if(typeof e=="string")if(a=e,u=r,e==="string"){if(!Array.isArray(t))throw new TypeError("A string tensor's data must be a string array.");s=t}else{let d=xt.get(e);if(d===void 0)throw new TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e==="float16"&&d===Uint16Array||e==="uint4"||e==="int4")throw new TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${d.name} as data.`);e==="uint64"||e==="int64"?s=d.from(t,BigInt):s=d.from(t)}else if(t instanceof d)s=t;else if(t instanceof Uint8ClampedArray)if(e==="uint8")s=Uint8Array.from(t);else throw new TypeError("A Uint8ClampedArray tensor's data must be type of uint8");else if(e==="float16"&&t instanceof Uint16Array&&d!==Uint16Array)s=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw new TypeError(`A ${a} tensor's data must be type of ${d}`)}else if(u=t,Array.isArray(e)){if(e.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let d=typeof e[0];if(d==="string")a="string",s=e;else if(d==="boolean")a="bool",s=Uint8Array.from(e);else throw new TypeError(`Invalid element type of data array: ${d}.`)}else if(e instanceof Uint8ClampedArray)a="uint8",s=Uint8Array.from(e);else{let d=er.get(e.constructor);if(d===void 0)throw new TypeError(`Unsupported type for tensor data: ${e.constructor}.`);a=d,s=e}if(u===void 0)u=[s.length];else if(!Array.isArray(u))throw new TypeError("A tensor's dims must be a number array");n=u,this.cpuData=s,this.dataLocation="cpu"}let i=od(n);if(this.cpuData&&i!==this.cpuData.length&&!((a==="uint4"||a==="int4")&&Math.ceil(i/2)===this.cpuData.length))throw new Error(`Tensor's size(${i}) does not match data length(${this.cpuData.length}).`);this.type=a,this.dims=n,this.size=i}static async fromImage(e,t){return td(e,t)}static fromTexture(e,t){return rd(e,t)}static fromGpuBuffer(e,t){return id(e,t)}static fromMLTensor(e,t){return ad(e,t)}static fromPinnedBuffer(e,t,r){return nd(e,t,r)}toDataURL(e){return Jl(this,e)}toImageData(e){return ed(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw new Error("The data is not stored as a WebNN MLTensor.");return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":case"ml-tensor":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return ud(this,e)}}}),Ge,ld=U(()=>{ka(),Ge=Re}),sr,pi,Fe,Ue,dd=U(()=>{Yl(),sr=(e,t)=>
5{(typeof Pe.trace>"u"?!Pe.wasm.trace:!Pe.trace)||console.timeStamp(`${e}::ORT::${t}`)},pi=(e,t)=>{var n;let r=((n=new Error().stack)==null?void 0:n.split(/\r\n|\r|\n/g))||[],a=!1;for(let i=0;i<r.length;i++){if(a&&!r[i].includes("TRACE_FUNC")){let s=`FUNC_${e}::${r[i].trim().split(" ")[1]}`;t&&(s+=`::${t}`),sr("CPU",s);return}r[i].includes("TRACE_FUNC")&&(a=!0)}},Fe=e=>{(typeof Pe.trace>"u"?!Pe.wasm.trace:!Pe.trace)||pi("BEGIN",e)},Ue=e=>{(typeof Pe.trace>"u"?!Pe.wasm.trace:!Pe.trace)||pi("END",e)}}),pd,cm=U(()=>{Ql(),ld(),dd(),pd=class cd{constructor(t){this.handler=t}async run(t,r,a){Fe();let n={},i={};if(typeof t!="object"||t===null||t instanceof Ge||Array.isArray(t))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let s=!0;if(typeof r=="object"){if(r===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(r instanceof Ge)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(r)){if(r.length===0)throw new TypeError("'fetches' cannot be an empty array.");s=!1;for(let l of r){if(typeof l!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(l)===-1)throw new RangeError(`'fetches' contains invalid output name: ${l}.`);n[l]=null}if(typeof a=="object"&&a!==null)i=a;else if(typeof a<"u")throw new TypeError("'options' must be an object.")}else{let l=!1,c=Object.getOwnPropertyNames(r);for(let f of this.outputNames)if(c.indexOf(f)!==-1){let m=r[f];(m===null||m instanceof Ge)&&(l=!0,s=!1,n[f]=m)}if(l){if(typeof a=="object"&&a!==null)i=a;else if(typeof a<"u")throw new TypeError("'options' must be an object.")}else i=r}}else if(typeof r<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let l of this.inputNames)if(typeof t[l]>"u")throw new Error(`input '${l}' is missing in 'feeds'.`);if(s)for(let l of this.outputNames)n[l]=null;let u=await this.handler.run(t,n,i),d={};for(let l in u)if(Object.hasOwnProperty.call(u,l)){let c=u[l];c instanceof Ge?d[l]=c:d[l]=new Ge(c.type,c.data,c.dims)}return Ue(),d}async release(){return this.handler.dispose()}static async create(t,r,a,n){Fe();let i,s={};if(typeof t=="string"){if(i=t,typeof r=="object"&&r!==null)s=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof Uint8Array){if(i=t,typeof r=="object"&&r!==null)s=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer){let c=t,f=0,m=t.byteLength;if(typeof r=="object"&&r!==null)s=r;else if(typeof r=="number"){if(f=r,!Number.isSafeInteger(f))throw new RangeError("'byteOffset' must be an integer.");if(f<0||f>=c.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${c.byteLength}).`);if(m=t.byteLength-f,typeof a=="number"){if(m=a,!Number.isSafeInteger(m))throw new RangeError("'byteLength' must be an integer.");if(m<=0||f+m>c.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${c.byteLength-f}].`);if(typeof n=="object"&&n!==null)s=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(typeof a<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof r<"u")throw new TypeError("'options' must be an object.");i=new Uint8Array(c,f,m)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[u,d]=await Zl(s),l=await u.createInferenceSessionHandler(i,d);return Ue(),new cd(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),Ta,fm=U(()=>{cm(),Ta=pd}),hm=U(()=>{}),mm=U(()=>{}),gm=U(()=>{}),_m=U(()=>{}),fd={};Pt(fd,{InferenceSession:()=>Ta,TRACE:()=>sr,TRACE_FUNC_BEGIN:()=>Fe,TRACE_FUNC_END:()=>Ue,Tensor:()=>Ge,env:()=>ye,registerBackend:()=>kt});var Ke=U(()=>{nm(),om(),fm(),ld(),hm(),mm(),dd(),gm(),_m()}),Ia=U(()=>{}),hd={};Pt(hd,{default:()=>md});var ci,fi,md,ym=U(()=>{var e;wf(),zt(),Ea(),ci="ort-wasm-proxy-worker",fi=((e=globalThis.self)==null?void 0:e.name)===ci,fi&&(self.onmessage=t=>{let{type:r,in:a}=t.data;
5try{switch(r){case"init-wasm":za(a.wasm).then(()=>{Fa(a).then(()=>{postMessage({type:r})},n=>{postMessage({type:r,err:n})})},n=>{postMessage({type:r,err:n})});break;case"init-ep":{let{epName:n,env:i}=a;Ka(i,n).then(()=>{postMessage({type:r})},s=>{postMessage({type:r,err:s})});break}case"copy-from":{let{buffer:n}=a,i=Wr(n);postMessage({type:r,out:i});break}case"create":{let{model:n,options:i}=a;Za(n,i).then(s=>{postMessage({type:r,out:s})},s=>{postMessage({type:r,err:s})});break}case"release":Qa(a),postMessage({type:r});break;case"run":{let{sessionId:n,inputIndices:i,inputs:s,outputIndices:u,options:d}=a;Xa(n,i,s,u,new Array(u.length).fill(null),d).then(l=>{l.some(c=>c[3]!=="cpu")?postMessage({type:r,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:r,out:l},Ja([...s,...l]))},l=>{postMessage({type:r,err:l})});break}case"end-profiling":Ya(a),postMessage({type:r});break;default:}}catch(n){postMessage({type:r,err:n})}}),md=fi?null:t=>new Worker(t??Be,{type:"module",name:ci})}),gd={};Pt(gd,{default:()=>_d});var hi,mi,_d,_s,bm=U(()=>{var e,t;mi=(hi=import.meta.url,async function(r={}){var hs;var a,n,i=r,s=new Promise((o,p)=>{a=o,n=p}),u=typeof window=="object",d=typeof WorkerGlobalScope<"u",l=d&&((hs=self.name)==null?void 0:hs.startsWith("em-pthread"));i.mountExternalData=(o,p)=>{o.startsWith("./")&&(o=o.substring(2)),(i.Eb||(i.Eb=new Map)).set(o,p)},i.unmountExternalData=()=>{delete i.Eb};var c=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,pc:!0}).buffer.constructor;let f=o=>async(...p)=>{var h;try{if(i.Fb)throw Error("Session already started");let y=i.Fb={dc:p[0],errors:[]},v=await o(...p);if(i.Fb!==y)throw Error("Session mismatch");(h=i.Jb)==null||h.flush();let I=y.errors;if(0<I.length){let B=await Promise.all(I);if(B=B.filter(M=>M),0<B.length)throw Error(B.join(` 6`))}return v}finally{i.Fb=null}};i.jsepInit=(o,p)=>{if(o==="webgpu"){[i.Jb,i.Ub,i.Yb,i.Kb,i.Xb,i.jb,i.Zb,i.ac,i.Vb,i.Wb,i.$b]=p;let h=i.Jb;i.jsepRegisterBuffer=(y,v,I,B)=>h.registerBuffer(y,v,I,B),i.jsepGetBuffer=y=>h.getBuffer(y),i.jsepCreateDownloader=(y,v,I)=>h.createDownloader(y,v,I),i.jsepOnCreateSession=y=>{h.onCreateSession(y)},i.jsepOnReleaseSession=y=>{h.onReleaseSession(y)},i.jsepOnRunStart=y=>h.onRunStart(y),i.bc=(y,v)=>{h.upload(y,v)}}else if(o==="webnn"){let h=p[0];[i.nc,i.Nb,i.webnnEnsureTensor,i.Ob,i.webnnDownloadTensor]=p.slice(1),i.webnnReleaseTensorId=i.Nb,i.webnnUploadTensor=i.Ob,i.webnnOnRunStart=y=>h.onRunStart(y),i.webnnOnRunEnd=h.onRunEnd.bind(h),i.webnnRegisterMLContext=(y,v)=>{h.registerMLContext(y,v)},i.webnnOnReleaseSession=y=>{h.onReleaseSession(y)},i.webnnCreateMLTensorDownloader=(y,v)=>h.createMLTensorDownloader(y,v),i.webnnRegisterMLTensor=(y,v,I,B)=>h.registerMLTensor(y,v,I,B),i.webnnCreateMLContext=y=>h.createMLContext(y),i.webnnRegisterMLConstant=(y,v,I,B,M,L)=>h.registerMLConstant(y,v,I,B,M,i.Eb,L),i.webnnRegisterGraphInput=h.registerGraphInput.bind(h),i.webnnIsGraphInput=h.isGraphInput.bind(h),i.webnnCreateTemporaryTensor=h.createTemporaryTensor.bind(h),i.webnnIsInt64Supported=h.isInt64Supported.bind(h)}};let m=()=>{let o=(p,h,y)=>(...v)=>{let I=Xe,B=h==null?void 0:h();v=p(...v);let M=h==null?void 0:h();return B!==M&&(p=M,y(B),h=y=null),Xe!=I?new Promise((L,K)=>{ti={resolve:L,reject:K}}):v};(()=>{for(let p of["_OrtAppendExecutionProvider","_OrtCreateSession","_OrtRun","_OrtRunWithBinding","_OrtBindInput"])i[p]=o(i[p],()=>i[p],h=>i[p]=h)})(),f!==void 0&&(i._OrtRun=f(i._OrtRun),i._OrtRunWithBinding=f(i._OrtRunWithBinding)),m=void 0};i.asyncInit=()=>{m==null||m()};var g,_,b=Object.assign({},i),x=(o,p)=>{throw p},w="";(u||d)&&(d?w=self.location.href:typeof document<"u"&&document.currentScript&&(w=document.currentScript.src),hi&&(w=hi),w=w.startsWith("blob:")?"":w.slice(0,w.replace(/[?#].*/,"").lastIndexOf("/")+1),d&&(_=o=>{var p=new XMLHttpRequest;return p.open("GET",o,!1),p.responseType="arraybuffer",p.send(null),new Uint8Array(p.response)}),g=async o=>{if(D(o))return new Promise((h,y)=>{var v=new XMLHttpRequest;v.open("GET",o,!0),v.responseType="arraybuffer",v.onload=()=>{v.status==200||v.status==0&&v.response?h(v.response):y(v.status)},v.onerror=y,v.send(null)});var p=await fetch(o,{credentials:"same-origin"});if(p.ok)return p.arrayBuffer();throw Error(p.status+" : "+p.url)});var $=console.log.bind(console),k=console.error.bind(console),S=$,T=k;Object.assign(i,b),b=null;var E,z,A,O,q,X,H,Q,oe,te,V,W,le,ee=i.wasmBinary,ae=!1,D=o=>o.startsWith("file://");function P(){return E.buffer!=O.buffer&&fe(),O}function j(){return E.buffer!=O.buffer&&fe(),q}function se(){return E.buffer!=O.buffer&&fe(),X}function ke(){return E.buffer!=O.buffer&&fe(),H}function N(){return E.buffer!=O.buffer&&fe(),Q}function me(){return E.buffer!=O.buffer&&fe(),oe}function Ne(){return E.buffer!=O.buffer&&fe(),te}function Ce(){return E.buffer!=O.buffer&&fe(),le}if(l){let o=function(p){try{var h=p.data,y=h.Bb;if(y==="load"){let v=[];self.onmessage=I=>v.push(I),self.startWorker=()=>{postMessage({Bb:"loaded"});for(let I of v)o(I);self.onmessage=o};for(let I of h.Rb)i[I]&&!i[I].proxy||(i[I]=(...B)=>{postMessage({Bb:"callHandler",Qb:I,args:B})},I=="print"&&(S=i[I]),I=="printErr"&&(T=i[I]));E=h.kc,fe(),gt(h.lc)}else if(y==="run"){Df(h.Ab),ni(h.Ab,0,0,1,0,0),un(),Jr(h.Ab),xe||(rs(),xe=!0);try{Nf(h.fc,h.Hb)}catch(v){if(v!="unwind")throw v}}else h.target!=="setimmediate"&&(y==="checkMailbox"?xe&&ur():y&&(T(`worker: received unknown command ${y}`),T(h)))}catch(v){throw is(),v}};var gt,xe=!1;T=function(...p){p=p.join(" "),console.error(p)},self.alert=function(...p){postMessage({Bb:"alert",text:p.join(" "),ic:gr()})},self.onunhandledrejection=p=>{throw p.reason||p},self.onmessage=o}function fe(){var o=E.buffer;i.HEAP8=O=new Int8Array(o),i.HEAP16=X=new Int16Array(o),i.HEAPU8=q=new
vendor: 7,026 bytes, line 6
6Uint8Array(o),i.HEAPU16=H=new Uint16Array(o),i.HEAP32=Q=new Int32Array(o),i.HEAPU32=oe=new Uint32Array(o),i.HEAPF32=te=new Float32Array(o),i.HEAPF64=le=new Float64Array(o),i.HEAP64=V=new BigInt64Array(o),i.HEAPU64=W=new BigUint64Array(o)}function Ze(){l?startWorker(i):Y.Ca()}l||(E=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),fe());var Ut,_t=0,qt=null;function en(){if(--_t==0&&qt){var o=qt;qt=null,o()}}function nt(o){throw T(o="Aborted("+o+")"),ae=!0,o=new WebAssembly.RuntimeError(o+". Build with -sASSERTIONS for more info."),n(o),o}function tn(){return{a:{L:Rf,Aa:Bf,b:Pf,$:cn,A:mn,pa:gn,X:yn,Z:bn,qa:$n,na:wn,ga:vn,ma:xn,J:Sn,Y:kn,V:Tn,oa:In,W:En,va:Uf,E:qf,Q:Wf,O:Vf,D:Hf,u:Gf,r:Ff,P:Kf,z:th,R:rh,ja:ih,T:ah,aa:nh,M:sh,F:oh,ia:Jr,sa:uh,t:lh,Ba:dh,w:fh,o:hh,l:gh,c:Qr,n:_h,j:$h,v:wh,p:vh,f:xh,s:Sh,m:kh,e:Th,k:Ih,i:Eh,g:zh,d:Ch,da:Ah,ea:Oh,fa:Bh,ba:Ln,ca:Vn,N:jn,xa:Dh,ua:Mh,h:Ph,C:Uh,G:qh,ta:Nh,x:Wh,ra:Lh,U:Vh,q:Rh,y:jh,K:Hh,S:Gh,za:Fh,ya:Kh,ka:Kn,la:Zn,_:Gr,B:Qn,I:Xn,ha:Yn,H:Jn,a:E,wa:Hr}}}var Lr={829644:(o,p,h,y,v)=>{if(i===void 0||!i.Eb)return 1;if((o=ve(Number(o>>>0))).startsWith("./")&&(o=o.substring(2)),!(o=i.Eb.get(o)))return 2;if(p=Number(p>>>0),h=Number(h>>>0),y=Number(y>>>0),p+h>o.byteLength)return 3;try{let I=o.subarray(p,p+h);switch(v){case 0:j().set(I,y>>>0);break;case 1:i.mc?i.mc(y,I):i.bc(y,I);break;default:return 4}return 0}catch{return 4}},830468:(o,p,h)=>{i.Ob(o,j().subarray(p>>>0,p+h>>>0))},830532:()=>i.nc(),830574:o=>{i.Nb(o)},830611:()=>{i.Vb()},830642:()=>{i.Wb()},830671:()=>{i.$b()},830696:o=>i.Ub(o),830729:o=>i.Yb(o),830761:(o,p,h)=>{i.Kb(Number(o),Number(p),Number(h),!0)},830824:(o,p,h)=>{i.Kb(Number(o),Number(p),Number(h))},830881:()=>typeof wasmOffsetConverter<"u",830938:o=>{i.jb("Abs",o,void 0)},830989:o=>{i.jb("Neg",o,void 0)},831040:o=>{i.jb("Floor",o,void 0)},831093:o=>{i.jb("Ceil",o,void 0)},831145:o=>{i.jb("Reciprocal",o,void 0)},831203:o=>{i.jb("Sqrt",o,void 0)},831255:o=>{i.jb("Exp",o,void 0)},831306:o=>{i.jb("Erf",o,void 0)},831357:o=>{i.jb("Sigmoid",o,void 0)},831412:(o,p,h)=>{i.jb("HardSigmoid",o,{alpha:p,beta:h})},831491:o=>{i.jb("Log",o,void 0)},831542:o=>{i.jb("Sin",o,void 0)},831593:o=>{i.jb("Cos",o,void 0)},831644:o=>{i.jb("Tan",o,void 0)},831695:o=>{i.jb("Asin",o,void 0)},831747:o=>{i.jb("Acos",o,void 0)},831799:o=>{i.jb("Atan",o,void 0)},831851:o=>{i.jb("Sinh",o,void 0)},831903:o=>{i.jb("Cosh",o,void 0)},831955:o=>{i.jb("Asinh",o,void 0)},832008:o=>{i.jb("Acosh",o,void 0)},832061:o=>{i.jb("Atanh",o,void 0)},832114:o=>{i.jb("Tanh",o,void 0)},832166:o=>{i.jb("Not",o,void 0)},832217:(o,p,h)=>{i.jb("Clip",o,{min:p,max:h})},832286:o=>{i.jb("Clip",o,void 0)},832338:(o,p)=>{i.jb("Elu",o,{alpha:p})},832396:o=>{i.jb("Gelu",o,void 0)},832448:o=>{i.jb("Relu",o,void 0)},832500:(o,p)=>{i.jb("LeakyRelu",o,{alpha:p})},832564:(o,p)=>{i.jb("ThresholdedRelu",o,{alpha:p})},832634:(o,p)=>{i.jb("Cast",o,{to:p})},832692:o=>{i.jb("Add",o,void 0)},832743:o=>{i.jb("Sub",o,void 0)},832794:o=>{i.jb("Mul",o,void 0)},832845:o=>{i.jb("Div",o,void 0)},832896:o=>{i.jb("Pow",o,void 0)},832947:o=>{i.jb("Equal",o,void 0)},833e3:o=>{i.jb("Greater",o,void 0)},833055:o=>{i.jb("GreaterOrEqual",o,void 0)},833117:o=>{i.jb("Less",o,void 0)},833169:o=>{i.jb("LessOrEqual",o,void 0)},833228:(o,p,h,y,v)=>{i.jb("ReduceMean",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},833403:(o,p,h,y,v)=>{i.jb("ReduceMax",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},833577:(o,p,h,y,v)=>{i.jb("ReduceMin",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},833751:(o,p,h,y,v)=>{i.jb("ReduceProd",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},833926:(o,p,h,y,v)=>{i.jb("ReduceSum",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},834100:(o,p,h,y,v)=>{i.jb("ReduceL1",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},834273:(o,p,h,y,v)=>{i.jb("ReduceL2",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},834446:(o,p,h,y,v)=>{i.jb("ReduceLogSum",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},834623:(o,p,h,y,v)=>{i.jb("ReduceSumSquare",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},834803:(o,p,h,y,v)=>{i.jb("ReduceLogSumExp",o,{keepDims:!!p,noopWithEmptyAxes:!!h,axes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},834983:o=>{i.jb("Where",o,void 0)},835036:(o,p,h)=>{i.jb("Transpose",o,{perm:p?Array.from(N().subarray(Number(p)>>>0,Number(h)>>>0)):[]})},835160:(o,p,h,y)=>{i.jb("DepthToSpace",o,{blocksize:p,mode:ve(h),format:y?"NHWC":"NCHW"})},835293:(o,p,h,y)=>{i.jb("DepthToSpace",o,{blocksize:p,mode:ve(h),format:y?"NHWC":"NCHW"})},835426:(o,p,h,y,v,I,B,M,L,K,ne,de,ge,Ie,Ot)=>{i.jb("ConvTranspose",o,{format:L?"NHWC":"NCHW",autoPad:p,dilations:[h],group:y,kernelShape:[v],pads:[I,B],strides:[M],wIsConst:()=>!!P()[K>>>0],outputPadding:ne?Array.from(N().subarray(Number(ne)>>>0,Number(de)>>>0)):[],outputShape:ge?Array.from(N().subarray(Number(ge)>>>0,Number(Ie)>>>0)):[],activation:ve(Ot)})},835859:(o,p,h,y,v,I,B,M,L,K,ne,de,ge,Ie)=>{i.jb("ConvTranspose",o,{format:M?"NHWC":"NCHW",autoPad:p,dilations:Array.from(N().subarray(Number(h)>>>0,2+(Number(h)>>>0)>>>0)),group:y,kernelShape:Array.from(N().subarray(Number(v)>>>0,2+(Number(v)>>>0)>>>0)),pads:Array.from(N().subarray(Number(I)>>>0,4+(Number(I)>>>0)>>>0)),strides:Array.from(N().subarray(Number(B)>>>0,2+(Number(B)>>>0)>>>0)),wIsConst:()=>!!P()[L>>>0],outputPadding:K?Array.from(N().subarray(Number(K)>>>0,Number(ne)>>>0)):[],outputShape:de?Array.from(N().subarray(Number(de)>>>0,Number(ge)>>>0)):[],activation:ve(Ie)})},836520:(o,p,h,y,v,I,B,M,L,K,ne,de,ge,Ie,Ot)=>{i.jb("ConvTranspose",o,{format:L?"NHWC":"NCHW",autoPad:p,dilations:[h],group:y,kernelShape:[v],pads:[I,B],strides:[M],wIsConst:()=>!!P()[K>>>0],outputPadding:ne?Array.from(N().subarray(Number(ne)>>>0,Number(de)>>>0)):[],outputShape:ge?Array.from(N().subarray(Number(ge)>>>0,Number(Ie)>>>0)):[],activation:ve(Ot)})},836953:(o,p,h,y,v,I,B,M,L,K,ne,de,ge,Ie)=>{i.jb("ConvTranspose",o,{format:M?"NHWC":"NCHW",autoPad:p,dilations:Array.from(N().subarray(Number(h)>>>0,2+(Number(h)>>>0)>>>0)),group:y,kernelShape:Array.from(N().subarray(Number(v)>>>0,2+(Number(v)>>>0)>>>0)),pads:Array.from(N().subarray(Number(I)>>>0,4+(Number(I)>>>0)>>>0)),strides:Array.from(N().subarray(Number(B)>>>0,2+(Number(B)>>>0)>>>0)),wIsConst:()=>!!P()[L>>>0],outputPadding:K?Array.from(N().subarray(Number(K)>>>0,Number(ne)>>>0)):[],outputShape:de?Array.from(N().subarray(Number(de)>>>0,Number(ge)>>>0)):[],activation:ve(Ie)})},837614:(o,p)=>{i.jb("GlobalAveragePool",o,{format:p?"NHWC":"NCHW"})},837705:(o,p,h,y,v,I,B,M,L,K,ne,de,ge,Ie)=>
6{i.jb("AveragePool",o,{format:Ie?"NHWC":"NCHW",auto_pad:p,ceil_mode:h,count_include_pad:y,storage_order:v,dilations:I?Array.from(N().subarray(Number(I)>>>0,Number(B)>>>0)):[],kernel_shape:M?Array.from(N().subarray(Number(M)>>>0,Number(L)>>>0)):[],pads:K?Array.from(N().subarray(Number(K)>>>0,Number(ne)>>>0)):[],strides:de?Array.from(N().subarray(Number(de)>>>0,Number(ge)>>>0)):[]})},838184:(o,p)=>{i.jb("GlobalAveragePool",o,{format:p?"NHWC":"NCHW"})},838275:(o,p,h,y,v,I,B,M,L,K,ne,de,ge,Ie)=>{i.jb("AveragePool",o,{format:Ie?"NHWC":"NCHW",auto_pad:p,ceil_mode:h,count_include_pad:y,storage_order:v,dilations:I?Array.from(N().subarray(Number(I)>>>0,Number(B)>>>0)):[],kernel_shape:M?Array.from(N().subarray(Number(M)>>>0,Number(L)>>>0)):[],pads:K?Array.from(N().subarray(Number(K)>>>0,Number(ne)>>>0)):[],strides:de?Array.from(N().subarray(Number(de)>>>0,Number(ge)>>>0)):[]})},838754:(o,p)=>{i.jb("GlobalMaxPool",o,{format:p?"NHWC":"NCHW"})},838841:(o,p,h,y,v,I,B,M,L,K,ne,de,ge,Ie)=>{i.jb("MaxPool",o,{format:Ie?"NHWC":"NCHW",auto_pad:p,ceil_mode:h,count_include_pad:y,storage_order:v,dilations:I?Array.from(N().subarray(Number(I)>>>0,Number(B)>>>0)):[],kernel_shape:M?Array.from(N().subarray(Number(M)>>>0,Number(L)>>>0)):[],pads:K?Array.from(N().subarray(Number(K)>>>0,Number(ne)>>>0)):[],strides:de?Array.from(N().subarray(Number(de)>>>0,Number(ge)>>>0)):[]})},839316:(o,p)=>{i.jb("GlobalMaxPool",o,{format:p?"NHWC":"NCHW"})},839403:(o,p,h,y,v,I,B,M,L,K,ne,de,ge,Ie)=>
vendor: 5,399 bytes, line 6
6{i.jb("MaxPool",o,{format:Ie?"NHWC":"NCHW",auto_pad:p,ceil_mode:h,count_include_pad:y,storage_order:v,dilations:I?Array.from(N().subarray(Number(I)>>>0,Number(B)>>>0)):[],kernel_shape:M?Array.from(N().subarray(Number(M)>>>0,Number(L)>>>0)):[],pads:K?Array.from(N().subarray(Number(K)>>>0,Number(ne)>>>0)):[],strides:de?Array.from(N().subarray(Number(de)>>>0,Number(ge)>>>0)):[]})},839878:(o,p,h,y,v)=>{i.jb("Gemm",o,{alpha:p,beta:h,transA:y,transB:v})},839982:o=>{i.jb("MatMul",o,void 0)},840036:(o,p,h,y)=>{i.jb("ArgMax",o,{keepDims:!!p,selectLastIndex:!!h,axis:y})},840144:(o,p,h,y)=>{i.jb("ArgMin",o,{keepDims:!!p,selectLastIndex:!!h,axis:y})},840252:(o,p)=>{i.jb("Softmax",o,{axis:p})},840315:(o,p)=>{i.jb("Concat",o,{axis:p})},840375:(o,p,h,y,v)=>{i.jb("Split",o,{axis:p,numOutputs:h,splitSizes:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},840531:o=>{i.jb("Expand",o,void 0)},840585:(o,p)=>{i.jb("Gather",o,{axis:Number(p)})},840656:(o,p)=>{i.jb("GatherElements",o,{axis:Number(p)})},840735:(o,p)=>{i.jb("GatherND",o,{batch_dims:Number(p)})},840814:(o,p,h,y,v,I,B,M,L,K,ne)=>{i.jb("Resize",o,{antialias:p,axes:h?Array.from(N().subarray(Number(h)>>>0,Number(y)>>>0)):[],coordinateTransformMode:ve(v),cubicCoeffA:I,excludeOutside:B,extrapolationValue:M,keepAspectRatioPolicy:ve(L),mode:ve(K),nearestMode:ve(ne)})},841176:(o,p,h,y,v,I,B)=>{i.jb("Slice",o,{starts:p?Array.from(N().subarray(Number(p)>>>0,Number(h)>>>0)):[],ends:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[],axes:I?Array.from(N().subarray(Number(I)>>>0,Number(B)>>>0)):[]})},841440:o=>{i.jb("Tile",o,void 0)},841492:(o,p,h)=>{i.jb("InstanceNormalization",o,{epsilon:p,format:h?"NHWC":"NCHW"})},841606:(o,p,h)=>{i.jb("InstanceNormalization",o,{epsilon:p,format:h?"NHWC":"NCHW"})},841720:o=>{i.jb("Range",o,void 0)},841773:(o,p)=>{i.jb("Einsum",o,{equation:ve(p)})},841854:(o,p,h,y,v)=>{i.jb("Pad",o,{mode:p,value:h,pads:y?Array.from(N().subarray(Number(y)>>>0,Number(v)>>>0)):[]})},841997:(o,p,h,y,v,I)=>{i.jb("BatchNormalization",o,{epsilon:p,momentum:h,spatial:!!v,trainingMode:!!y,format:I?"NHWC":"NCHW"})},842166:(o,p,h,y,v,I)=>{i.jb("BatchNormalization",o,{epsilon:p,momentum:h,spatial:!!v,trainingMode:!!y,format:I?"NHWC":"NCHW"})},842335:(o,p,h)=>{i.jb("CumSum",o,{exclusive:Number(p),reverse:Number(h)})},842432:(o,p,h)=>{i.jb("DequantizeLinear",o,{axis:p,blockSize:h})},842522:(o,p,h,y,v)=>{i.jb("GridSample",o,{align_corners:p,mode:ve(h),padding_mode:ve(y),format:v?"NHWC":"NCHW"})},842692:(o,p,h,y,v)=>{i.jb("GridSample",o,{align_corners:p,mode:ve(h),padding_mode:ve(y),format:v?"NHWC":"NCHW"})},842862:(o,p)=>{i.jb("ScatterND",o,{reduction:ve(p)})},842947:(o,p,h,y,v,I,B,M,L)=>{i.jb("Attention",o,{numHeads:p,isUnidirectional:h,maskFilterValue:y,scale:v,doRotary:I,qkvHiddenSizes:B?Array.from(N().subarray(Number(M)>>>0,Number(M)+B>>>0)):[],pastPresentShareBuffer:!!L})},843219:o=>{i.jb("BiasAdd",o,void 0)},843274:o=>{i.jb("BiasSplitGelu",o,void 0)},843335:o=>{i.jb("FastGelu",o,void 0)},843391:(o,p,h,y,v,I,B,M,L,K,ne,de,ge,Ie,Ot,Xh)=>{i.jb("Conv",o,{format:de?"NHWC":"NCHW",auto_pad:p,dilations:h?Array.from(N().subarray(Number(h)>>>0,Number(y)>>>0)):[],group:v,kernel_shape:I?Array.from(N().subarray(Number(I)>>>0,Number(B)>>>0)):[],pads:M?Array.from(N().subarray(Number(M)>>>0,Number(L)>>>0)):[],strides:K?Array.from(N().subarray(Number(K)>>>0,Number(ne)>>>0)):[],w_is_const:()=>!!P()[Number(ge)>>>0],activation:ve(Ie),activation_params:Ot?Array.from(Ne().subarray(Number(Ot)>>>0,Number(Xh)>>>0)):[]})},843975:o=>{i.jb("Gelu",o,void 0)},844027:(o,p,h,y,v,I,B,M,L)=>{i.jb("GroupQueryAttention",o,{numHeads:p,kvNumHeads:h,scale:y,softcap:v,doRotary:I,rotaryInterleaved:B,smoothSoftmax:M,localWindowSize:L})},844244:(o,p,h,y)=>{i.jb("LayerNormalization",o,{axis:p,epsilon:h,simplified:!!y})},844355:(o,p,h,y)=>{i.jb("LayerNormalization",o,{axis:p,epsilon:h,simplified:!!y})},844466:(o,p,h,y,v,I)=>{i.jb("MatMulNBits",o,{k:p,n:h,accuracyLevel:y,bits:v,blockSize:I})},844593:(o,p,h,y,v,I)=>{i.jb("MultiHeadAttention",o,{numHeads:p,isUnidirectional:h,maskFilterValue:y,scale:v,doRotary:I})},844752:(o,p)=>{i.jb("QuickGelu",o,{alpha:p})},844816:(o,p,h,y,v)=>{i.jb("RotaryEmbedding",o,{interleaved:!!p,numHeads:h,rotaryEmbeddingDim:y,scale:v})},844955:(o,p,h)=>{i.jb("SkipLayerNormalization",o,{epsilon:p,simplified:!!h})},845057:(o,p,h)=>{i.jb("SkipLayerNormalization",o,{epsilon:p,simplified:!!h})},845159:(o,p,h,y)=>{i.jb("GatherBlockQuantized",o,{gatherAxis:p,quantizeAxis:h,blockSize:y})},845280:o=>{i.Zb(o)},845314:(o,p)=>i.ac(Number(o),Number(p),i.Fb.dc,i.Fb.errors)};function Bf(o,p,h){return Nn(async()=>{await i.Xb(Number(o),Number(p),Number(h))})}function Rf(){return typeof wasmOffsetConverter<"u"}class Vr{constructor(p){ms(this,"name","ExitStatus");this.message=`Program terminated with exit(${p})`,this.status=p}}var rn=o=>{o.terminate(),o.onmessage=()=>{}},jr=[],an=o=>{ot.length==0&&(dn(),ln(ot[0]));var p=ot.pop();if(!p)return 6;Wt.push(p),yt[o.Ab]=p,p.Ab=o.Ab;var h={Bb:"run",fc:o.ec,Hb:o.Hb,Ab:o.Ab};return p.postMessage(h,o.Mb),0},st=0,be=(o,p,...h)=>{for(var y=2*h.length,v=ui(),I=oi(8*y),B=I>>>3,M=0;M<h.length;M++){var L=h[M];typeof L=="bigint"?(V[B+2*M]=1n,V[B+2*M+1]=L):(V[B+2*M]=0n,Ce()[B+2*M+1>>>0]=L)}return o=as(o,0,y,I,p),yr(v),o};function Hr(o){if(l)return be(0,1,o);if(A=o,!(0<st)){for(var p of Wt)rn(p);for(p of ot)rn(p);ot=[],Wt=[],yt={},ae=!0}x(0,new Vr(o))}
6function nn(o){if(l)return be(1,0,o);Gr(o)}var Gr=o=>{if(A=o,l)throw nn(o),"unwind";Hr(o)},ot=[],Wt=[],sn=[],yt={},on=o=>{var p=o.Ab;delete yt[p],ot.push(o),Wt.splice(Wt.indexOf(o),1),o.Ab=0,ns(p)};function un(){sn.forEach(o=>o())}var ln=o=>new Promise(p=>{o.onmessage=v=>{var I=(v=v.data).Bb;if(v.Gb&&v.Gb!=gr()){var B=yt[v.Gb];B?B.postMessage(v,v.Mb):T(`Internal error! Worker sent a message "${I}" to target pthread ${v.Gb}, but that thread no longer exists!`)}else I==="checkMailbox"?ur():I==="spawnThread"?an(v):I==="cleanupThread"?on(yt[v.hc]):I==="loaded"?(o.loaded=!0,p(o)):I==="alert"?alert(`Thread ${v.ic}: ${v.text}`):v.target==="setimmediate"?o.postMessage(v):I==="callHandler"?i[v.Qb](...v.args):I&&T(`worker sent an unknown command ${I}`)},o.onerror=v=>{throw T(`worker sent an error! ${v.filename}:${v.lineno}: ${v.message}`),v};var h,y=[];for(h of[])i.propertyIsEnumerable(h)&&y.push(h);o.postMessage({Bb:"load",Rb:y,kc:E,lc:z})});function dn(){var o=new Worker((()=>{let p=URL;return import.meta.url>"file:"&&import.meta.url<"file;"?new p("ort.bundle.min.mjs",import.meta.url):new URL(import.meta.url)})(),{type:"module",workerData:"em-pthread",name:"em-pthread"});ot.push(o)}var Df=o=>{fe();var p=me()[o+52>>>2>>>0];o=me()[o+56>>>2>>>0],us(p,p-o),yr(p)},Nf=(o,p)=>{st=0,o=ls(o,p),0<st?A=o:si(o)};class Mf{constructor(p){this.Ib=p-24}}function Pf(o,p,h){var y=new Mf(o>>>=0);throw p>>>=0,h>>>=0,me()[y.Ib+16>>>2>>>0]=0,me()[y.Ib+4>>>2>>>0]=p,me()[y.Ib+8>>>2>>>0]=h,o}function pn(o,p,h,y){return l?be(2,1,o,p,h,y):cn(o,p,h,y)}function cn(o,p,h,y){if(o>>>=0,h>>>=0,y>>>=0,c===void 0)return 6;var v=[];return l&&v.length===0?pn(o,p>>>=0,h,y):(o={ec:h,Ab:o,Hb:y,Mb:v},l?(o.Bb="spawnThread",postMessage(o,v),0):an(o))}var fn=typeof TextDecoder<"u"?new TextDecoder:void 0,hn=(o,p=0,h=NaN)=>{var y=(p>>>=0)+h;for(h=p;o[h]&&!(h>=y);)++h;if(16<h-p&&o.buffer&&fn)return fn.decode(o.buffer instanceof ArrayBuffer?o.subarray(p,h):o.slice(p,h));for(y="";p<h;){var v=o[p++];if(128&v){var I=63&o[p++];if((224&v)==192)y+=String.fromCharCode((31&v)<<6|I);else{var B=63&o[p++];65536>(v=(240&v)==224?(15&v)<<12|I<<6|B:(7&v)<<18|I<<12|B<<6|63&o[p++])?y+=String.fromCharCode(v):(v-=65536,y+=String.fromCharCode(55296|v>>10,56320|1023&v))}}else y+=String.fromCharCode(v)}return y},ve=(o,p)=>(o>>>=0)?hn(j(),o,p):"";function mn(o,p,h){return l?be(3,1,o,p,h):0}function gn(o,p){if(l)return be(4,1,o,p)}var _n=o=>{for(var p=0,h=0;h<o.length;++h){var y=o.charCodeAt(h);127>=y?p++:2047>=y?p+=2:55296<=y&&57343>=y?(p+=4,++h):p+=3}return p},At=(o,p,h)=>{var y=j();if(p>>>=0,0<h){var v=p;h=p+h-1;for(var I=0;I<o.length;++I){var B=o.charCodeAt(I);if(55296<=B&&57343>=B&&(B=65536+((1023&B)<<10)|1023&o.charCodeAt(++I)),127>=B){if(p>=h)break;y[p++>>>0]=B}else{if(2047>=B){if(p+1>=h)break;y[p++>>>0]=192|B>>6}else{if(65535>=B){if(p+2>=h)break;y[p++>>>0]=224|B>>12}else{if(p+3>=h)break;y[p++>>>0]=240|B>>18,y[p++>>>0]=128|B>>12&63}y[p++>>>0]=128|B>>6&63}y[p++>>>0]=128|63&B}}y[p>>>0]=0,o=p-v}else o=0;return o};function yn(o,p){if(l)return be(5,1,o,p)}function bn(o,p,h){if(l)return be(6,1,o,p,h)}function $n(o,p,h){return l?be(7,1,o,p,h):0}function wn(o,p){if(l)return be(8,1,o,p)}function vn(o,p,h){if(l)return be(9,1,o,p,h)}function xn(o,p,h,y){if(l)return be(10,1,o,p,h,y)}function Sn(o,p,h,y){if(l)return be(11,1,o,p,h,y)}function kn(o,p,h,y){if(l)return be(12,1,o,p,h,y)}function Tn(o){if(l)return be(13,1,o)}function In(o,p){if(l)return be(14,1,o,p)}function En(o,p,h){if(l)return be(15,1,o,p,h)}var zn,ut,Uf=()=>nt(""),Qe=o=>{for(var p="";j()[o>>>0];)p+=zn[j()[o++>>>0]];return p},Fr={},Kr={};function et(o,p,h={}){return function(y,v,I={}){var B=v.name;if(!y)throw new ut(`type "${B}" must have a positive integer typeid pointer`);if(Kr.hasOwnProperty(y)){if(I.Sb)return;throw new ut(`Cannot register type '${B}' twice`)}Kr[y]=v,Fr.hasOwnProperty(y)&&(v=Fr[y],delete Fr[y],v.forEach(M=>M()))}(o,p,h)}var Cn=(o,p,h)=>{switch(p){case 1:return h?y=>P()[y>>>0]:y=>j()[y>>>0];case 2:return h?y=>se()[y>>>1>>>0]:y=>ke()[y>>>1>>>0];case 4:return h?y=>N()[y>>>2>>>0]:y=>me()[y>>>2>>>0];case 8:return h?y=>V[y>>>3]:y=>W[y>>>3];default:throw new TypeError(`invalid integer width (${p}): ${o}`)}};function qf(o,p,h){h>>>=0,et(o>>>=0,{name:p=Qe(p>>>0),fromWireType:y=>y,toWireType:function(y,v){if(typeof v!="bigint"&&typeof v!="number")throw v=v===null?"null":(y=typeof v)=="object"||y==="array"||y==="function"?v.toString():""+v,new TypeError(`Cannot convert "${v}" to ${this.name}`);return typeof v=="number"&&(v=BigInt(v)),v},Cb:lt,readValueFromPointer:Cn(p,h,p.indexOf("u")==-1),Db:null})}var lt=8;function Wf(o,p,h,y){et(o>>>=0,{name:p=Qe(p>>>0),fromWireType:function(v){return!!v},toWireType:function(v,I){return I?h:y},Cb:lt,readValueFromPointer:function(v){return this.fromWireType(j()[v>>>0])},Db:null})}var Zr=[],tt=[];function Qr(o){9<(o>>>=0)&&--tt[o+1]==0&&(tt[o]=void 0,Zr.push(o))}var Oe=o=>
6{if(!o)throw new ut("Cannot use deleted val. handle = "+o);return tt[o]},Me=o=>{switch(o){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let p=Zr.pop()||tt.length;return tt[p]=o,tt[p+1]=1,p}};function Xr(o){return this.fromWireType(me()[o>>>2>>>0])}var Lf={name:"emscripten::val",fromWireType:o=>{var p=Oe(o);return Qr(o),p},toWireType:(o,p)=>Me(p),Cb:lt,readValueFromPointer:Xr,Db:null};function Vf(o){return et(o>>>0,Lf)}var jf=(o,p)=>{switch(p){case 4:return function(h){return this.fromWireType(Ne()[h>>>2>>>0])};case 8:return function(h){return this.fromWireType(Ce()[h>>>3>>>0])};default:throw new TypeError(`invalid float width (${p}): ${o}`)}};function Hf(o,p,h){h>>>=0,et(o>>>=0,{name:p=Qe(p>>>0),fromWireType:y=>y,toWireType:(y,v)=>v,Cb:lt,readValueFromPointer:jf(p,h),Db:null})}function Gf(o,p,h,y,v){if(o>>>=0,h>>>=0,p=Qe(p>>>0),v===-1&&(v=4294967295),v=M=>M,y===0){var I=32-8*h;v=M=>M<<I>>>I}var B=p.includes("unsigned")?function(M,L){return L>>>0}:function(M,L){return L};et(o,{name:p,fromWireType:v,toWireType:B,Cb:lt,readValueFromPointer:Cn(p,h,y!==0),Db:null})}function Ff(o,p,h){function y(I){var B=me()[I>>>2>>>0];return I=me()[I+4>>>2>>>0],new v(P().buffer,I,B)}var v=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][p];et(o>>>=0,{name:h=Qe(h>>>0),fromWireType:y,Cb:lt,readValueFromPointer:y},{Sb:!0})}function Kf(o,p){et(o>>>=0,{name:p=Qe(p>>>0),fromWireType:function(h){for(var y,v=me()[h>>>2>>>0],I=h+4,B=I,M=0;M<=v;++M){var L=I+M;M!=v&&j()[L>>>0]!=0||(B=ve(B,L-B),y===void 0?y=B:(y+="\0",y+=B),B=L+1)}return Ye(h),y},toWireType:function(h,y){y instanceof ArrayBuffer&&(y=new Uint8Array(y));var v=typeof y=="string";if(!(v||y instanceof Uint8Array||y instanceof Uint8ClampedArray||y instanceof Int8Array))throw new ut("Cannot pass non-string to std::string");var I=v?_n(y):y.length,B=_r(4+I+1),M=B+4;if(me()[B>>>2>>>0]=I,v)At(y,M,I+1);else if(v)for(v=0;v<I;++v){var L=y.charCodeAt(v);if(255<L)throw Ye(B),new ut("String has UTF-16 code units that do not fit in 8 bits");j()[M+v>>>0]=L}else for(v=0;v<I;++v)j()[M+v>>>0]=y[v];return h!==null&&h.push(Ye,B),B},Cb:lt,readValueFromPointer:Xr,Db(h){Ye(h)}})}var An=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,Zf=(o,p)=>{for(var h=o>>1,y=h+p/2;!(h>=y)&&ke()[h>>>0];)++h;if(32<(h<<=1)-o&&An)return An.decode(j().slice(o,h));for(h="",y=0;!(y>=p/2);++y){var v=se()[o+2*y>>>1>>>0];if(v==0)break;h+=String.fromCharCode(v)}return h},Qf=(o,p,h)=>{if(h??(h=2147483647),2>h)return 0;var y=p;h=(h-=2)<2*o.length?h/2:o.length;for(var v=0;v<h;++v){var I=o.charCodeAt(v);se()[p>>>1>>>0]=I,p+=2}return se()[p>>>1>>>0]=0,p-y},Xf=o=>2*o.length,Yf=(o,p)=>{for(var h=0,y="";!(h>=p/4);){var v=N()[o+4*h>>>2>>>0];if(v==0)break;++h,65536<=v?(v-=65536,y+=String.fromCharCode(55296|v>>10,56320|1023&v)):y+=String.fromCharCode(v)}return y},Jf=(o,p,h)=>{if(p>>>=0,h??(h=2147483647),4>h)return 0;var y=p;h=y+h-4;for(var v=0;v<o.length;++v){var I=o.charCodeAt(v);if(55296<=I&&57343>=I&&(I=65536+((1023&I)<<10)|1023&o.charCodeAt(++v)),N()[p>>>2>>>0]=I,(p+=4)+4>h)break}return N()[p>>>2>>>0]=0,p-y},eh=o=>{for(var p=0,h=0;h<o.length;++h){var y=o.charCodeAt(h);55296<=y&&57343>=y&&++h,p+=4}return p};function th(o,p,h){if(o>>>=0,p>>>=0,h=Qe(h>>>=0),p===2)var y=Zf,v=Qf,I=Xf,B=M=>ke()[M>>>1>>>0];else p===4&&(y=Yf,v=Jf,I=eh,B=M=>me()[M>>>2>>>0]);et(o,{name:h,fromWireType:M=>{for(var L,K=me()[M>>>2>>>0],ne=M+4,de=0;de<=K;++de){var ge=M+4+de*p;de!=K&&B(ge)!=0||(ne=y(ne,ge-ne),L===void 0?L=ne:(L+="\0",L+=ne),ne=ge+p)}return Ye(M),L},toWireType:(M,L)=>{if(typeof L!="string")throw new ut(`Cannot pass non-string to C++ string type ${h}`);var K=I(L),ne=_r(4+K+p);return me()[ne>>>2>>>0]=K/p,v(L,ne+4,K+p),M!==null&&M.push(Ye,ne),ne},Cb:lt,readValueFromPointer:Xr,Db(M){Ye(M)}})}function rh(o,p){et(o>>>=0,{Tb:!0,name:p=Qe(p>>>0),Cb:0,fromWireType:()=>{},toWireType:()=>{}})}function ih(o){ni(o>>>0,!d,1,!u,131072,!1),un()}var Yr=o=>{if(!ae)try{if(o(),!(0<st))try{l?si(A):Gr(A)}catch(p){p instanceof Vr||p=="unwind"||x(0,p)}}catch(p){p instanceof Vr||p=="unwind"||x(0,p)}};function Jr(o){o>>>
6=0,typeof Atomics.jc=="function"&&(Atomics.jc(N(),o>>>2,o).value.then(ur),o+=128,Atomics.store(N(),o>>>2,1))}var ur=()=>{var o=gr();o&&(Jr(o),Yr(os))};function ah(o,p){(o>>>=0)==p>>>0?setTimeout(ur):l?postMessage({Gb:o,Bb:"checkMailbox"}):(o=yt[o])&&o.postMessage({Bb:"checkMailbox"})}var ei=[];function nh(o,p,h,y,v){for(p>>>=0,y/=2,ei.length=y,h=v>>>0>>>3,v=0;v<y;v++)ei[v]=V[h+2*v]?V[h+2*v+1]:Ce()[h+2*v+1>>>0];return(p?Lr[p]:Qh[o])(...ei)}var sh=()=>{st=0};function oh(o){o>>>=0,l?postMessage({Bb:"cleanupThread",hc:o}):on(yt[o])}function uh(o){}var lr=(o,p)=>{var h=Kr[o];if(h===void 0)throw o=ts(o),h=Qe(o),Ye(o),new ut(`${p} has unknown type ${h}`);return h},On=(o,p,h)=>{var y=[];return o=o.toWireType(y,h),y.length&&(me()[p>>>2>>>0]=Me(y)),o};function lh(o,p,h){return p>>>=0,h>>>=0,o=Oe(o>>>0),p=lr(p,"emval::as"),On(p,h,o)}function dh(o,p){return p>>>=0,o=Oe(o>>>0),(p=lr(p,"emval::as")).toWireType(null,o)}var dr=o=>{try{o()}catch(p){nt(p)}},dt=0,Xe=null,Bn=0,pr=[],Rn={},Dn={},ph=0,ti=null,ch=[];function Nn(o){return function(p){if(!ae){if(dt===0){var h=!1,y=!1;p((v=0)=>{if(!ae&&(Bn=v,h=!0,y)){dt=2,dr(()=>cs(Xe)),typeof MainLoop<"u"&&MainLoop.Pb&&MainLoop.resume(),v=!1;try{var I=function(){var L=N()[Xe+8>>>2>>>0];return L=Y[Dn[L]],--st,L()}()}catch(L){I=L,v=!0}var B=!1;if(!Xe){var M=ti;M&&(ti=null,(v?M.reject:M.resolve)(I),B=!0)}if(v&&!B)throw I}}),y=!0,h||(dt=1,Xe=function(){var v=_r(65548),I=v+12;me()[v>>>2>>>0]=I,me()[v+4>>>2>>>0]=I+65536,I=pr[0];var B=Rn[I];return B===void 0&&(B=ph++,Rn[I]=B,Dn[B]=I),I=B,N()[v+8>>>2>>>0]=I,v}(),typeof MainLoop<"u"&&MainLoop.Pb&&MainLoop.pause(),dr(()=>ds(Xe)))}
vendor: 4,577 bytes, lines 6-11
6else dt===2?(dt=0,dr(fs),Ye(Xe),Xe=null,ch.forEach(Yr)):nt(`invalid state: ${dt}`);return Bn}}(p=>{o().then(p)})}function fh(o){return o>>>=0,Nn(async()=>{var p=await Oe(o);return Me(p)})}var cr=[];function hh(o,p,h,y){return h>>>=0,y>>>=0,(o=cr[o>>>0])(null,p=Oe(p>>>0),h,y)}var mh={},fr=o=>{var p=mh[o];return p===void 0?Qe(o):p};function gh(o,p,h,y,v){return h>>>=0,y>>>=0,v>>>=0,(o=cr[o>>>0])(p=Oe(p>>>0),p[h=fr(h)],y,v)}var Mn=()=>globalThis;function _h(o){return(o>>>=0)==0?Me(Mn()):(o=fr(o),Me(Mn()[o]))}var yh=o=>{var p=cr.length;return cr.push(o),p},bh=(o,p)=>{for(var h=Array(o),y=0;y<o;++y)h[y]=lr(me()[p+4*y>>>2>>>0],"parameter "+y);return h},Pn=(o,p)=>Object.defineProperty(p,"name",{value:o});function $h(o,p,h){var y=(p=bh(o,p>>>0)).shift();o--;var v=`return function (obj, func, destructorsRef, args) { 7`,I=0,B=[];h===0&&B.push("obj");for(var M=["retType"],L=[y],K=0;K<o;++K)B.push("arg"+K),M.push("argType"+K),L.push(p[K]),v+=` var arg${K} = argType${K}.readValueFromPointer(args${I?"+"+I:""}); 8`,I+=p[K].Cb;return v+=` var rv = ${h===1?"new func":"func.call"}(${B.join(", ")}); 9`,y.Tb||(M.push("emval_returnValue"),L.push(On),v+=` return emval_returnValue(retType, destructorsRef, rv); 10`),M.push(v+`}; 11`),o=function(ne){var de=Function;if(!(de instanceof Function))throw new TypeError(`new_ called with constructor type ${typeof de} which is not a function`);var ge=Pn(de.name||"unknownFunctionName",function(){});return ge.prototype=de.prototype,ge=new ge,(ne=de.apply(ge,ne))instanceof Object?ne:ge}(M)(...L),h=`methodCaller<(${p.map(ne=>ne.name).join(", ")}) => ${y.name}>`,yh(Pn(h,o))}function wh(o){return o=fr(o>>>0),Me(i[o])}function vh(o,p){return p>>>=0,o=Oe(o>>>0),p=Oe(p),Me(o[p])}function xh(o){9<(o>>>=0)&&(tt[o+1]+=1)}function Sh(){return Me([])}function kh(o){o=Oe(o>>>0);for(var p=Array(o.length),h=0;h<o.length;h++)p[h]=o[h];return Me(p)}function Th(o){return Me(fr(o>>>0))}function Ih(){return Me({})}function Eh(o){for(var p=Oe(o>>>=0);p.length;){var h=p.pop();p.pop()(h)}Qr(o)}function zh(o,p,h){p>>>=0,h>>>=0,o=Oe(o>>>0),p=Oe(p),h=Oe(h),o[p]=h}function Ch(o,p){return p>>>=0,o=(o=lr(o>>>0,"_emval_take_value")).readValueFromPointer(p),Me(o)}function Ah(o,p){o=-9007199254740992>o||9007199254740992<o?NaN:Number(o),p>>>=0,o=new Date(1e3*o),N()[p>>>2>>>0]=o.getUTCSeconds(),N()[p+4>>>2>>>0]=o.getUTCMinutes(),N()[p+8>>>2>>>0]=o.getUTCHours(),N()[p+12>>>2>>>0]=o.getUTCDate(),N()[p+16>>>2>>>0]=o.getUTCMonth(),N()[p+20>>>2>>>0]=o.getUTCFullYear()-1900,N()[p+24>>>2>>>0]=o.getUTCDay(),o=(o.getTime()-Date.UTC(o.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,N()[p+28>>>2>>>0]=o}var Un=o=>o%4==0&&(o%100!=0||o%400==0),qn=[0,31,60,91,121,152,182,213,244,274,305,335],Wn=[0,31,59,90,120,151,181,212,243,273,304,334];function Oh(o,p){o=-9007199254740992>o||9007199254740992<o?NaN:Number(o),p>>>=0,o=new Date(1e3*o),N()[p>>>2>>>0]=o.getSeconds(),N()[p+4>>>2>>>0]=o.getMinutes(),N()[p+8>>>2>>>0]=o.getHours(),N()[p+12>>>2>>>0]=o.getDate(),N()[p+16>>>2>>>0]=o.getMonth(),N()[p+20>>>2>>>0]=o.getFullYear()-1900,N()[p+24>>>2>>>0]=o.getDay();var h=(Un(o.getFullYear())?qn:Wn)[o.getMonth()]+o.getDate()-1|0;N()[p+28>>>2>>>0]=h,N()[p+36>>>2>>>0]=-60*o.getTimezoneOffset(),h=new Date(o.getFullYear(),6,1).getTimezoneOffset();var y=new Date(o.getFullYear(),0,1).getTimezoneOffset();o=0|(h!=y&&o.getTimezoneOffset()==Math.min(y,h)),N()[p+32>>>2>>>0]=o}function Bh(o){o>>>=0;var p=new Date(N()[o+20>>>2>>>0]+1900,N()[o+16>>>2>>>0],N()[o+12>>>2>>>0],N()[o+8>>>2>>>0],N()[o+4>>>2>>>0],N()[o>>>2>>>0],0),h=N()[o+32>>>2>>>0],y=p.getTimezoneOffset(),v=new Date(p.getFullYear(),6,1).getTimezoneOffset(),I=new Date(p.getFullYear(),0,1).getTimezoneOffset(),B=Math.min(I,v);return 0>h?N()[o+32>>>2>>>0]=+(v!=I&&B==y):0<h!=(B==y)&&(v=Math.max(I,v),p.setTime(p.getTime()+6e4*((0<h?B:v)-y))),N()[o+24>>>2>>>0]=p.getDay(),h=(Un(p.getFullYear())?qn:Wn)[p.getMonth()]+p.getDate()-1|0,N()[o+28>>>2>>>0]=h,N()[o>>>2>>>0]=p.getSeconds(),N()[o+4>>>2>>>0]=p.getMinutes(),N()[o+8>>>2>>>0]=p.getHours(),N()[o+12>>>2>>>0]=p.getDate(),N()[o+16>>>2>>>0]=p.getMonth(),N()[o+20>>>2>>>0]=p.getYear(),o=p.getTime(),BigInt(isNaN(o)?-1:o/1e3)}function Ln(o,p,h,y,v,I,B){return l?be(16,1,o,p,h,y,v,I,B):-52}function Vn(o,p,h,y,v,I){if(l)return be(17,1,o,p,h,y,v,I)}var Lt={},Rh=()=>performance.timeOrigin+performance.now();function jn(o,p){if(l)return be(18,1,o,p);if(Lt[o]&&(clearTimeout(Lt[o].id),delete Lt[o]),!p)return 0;var h=setTimeout(()=>{delete Lt[o],Yr(()=>ss(o,performance.timeOrigin+performance.now()))},p);return Lt[o]={id:h,qc:p},0}function Dh(o,p,h,y){o>>>=0,p>>>=0,h>>>=0,y>>>=0;
11var v=new Date().getFullYear(),I=new Date(v,0,1).getTimezoneOffset();v=new Date(v,6,1).getTimezoneOffset();var B=Math.max(I,v);me()[o>>>2>>>0]=60*B,N()[p>>>2>>>0]=+(I!=v),o=(p=M=>{var L=Math.abs(M);return`UTC${0<=M?"-":"+"}${String(Math.floor(L/60)).padStart(2,"0")}${String(L%60).padStart(2,"0")}`})(I),p=p(v),v<I?(At(o,h,17),At(p,y,17)):(At(o,y,17),At(p,h,17))}var Nh=()=>Date.now();function Mh(o,p,h){return 0<=o&&3>=o?(o===0?o=Date.now():o=performance.timeOrigin+performance.now(),V[h>>>0>>>3]=BigInt(Math.round(1e6*o)),0):28}var ri=[],Hn=(o,p)=>{ri.length=0;for(var h;h=j()[o++>>>0];){var y=h!=105;p+=(y&=h!=112)&&p%8?4:0,ri.push(h==112?me()[p>>>2>>>0]:h==106?V[p>>>3]:h==105?N()[p>>>2>>>0]:Ce()[p>>>3>>>0]),p+=y?8:4}return ri};function Ph(o,p,h){return o>>>=0,p=Hn(p>>>0,h>>>0),Lr[o](...p)}function Uh(o,p,h){return o>>>=0,p=Hn(p>>>0,h>>>0),Lr[o](...p)}var qh=()=>{};function Wh(o,p){return T(ve(o>>>0,p>>>0))}var Lh=()=>{throw st+=1,"unwind"};function Vh(){return 4294901760}var jh=()=>navigator.hardwareConcurrency;function Hh(){return nt("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER"),0}function Gh(o){o>>>=0;var p=j().length;if(o<=p||4294901760<o)return!1;for(var h=1;4>=h;h*=2){var y=p*(1+.2/h);y=Math.min(y,o+100663296);e:{y=(Math.min(4294901760,65536*Math.ceil(Math.max(o,y)/65536))-E.buffer.byteLength+65535)/65536|0;try{E.grow(y),fe();var v=1;break e}catch{}v=void 0}if(v)return!0}return!1}var hr=()=>(nt("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),Vt={},Gn=o=>{o.forEach(p=>{hr()})};function Fh(){var o=Error().stack.toString().split(` 12`);return o[0]=="Error"&&o.shift(),Gn(o),Vt.Lb=hr(),Vt.cc=o,Vt.Lb}function Kh(o,p,h){if(o>>>=0,p>>>=0,Vt.Lb==o)var y=Vt.cc;else(y=Error().stack.toString().split(` 13`))[0]=="Error"&&y.shift(),Gn(y);for(var v=3;y[v]&&hr()!=o;)++v;for(o=0;o<h&&y[o+v];++o)N()[p+4*o>>>2>>>0]=hr();return o}var ii,ai={},Fn=()=>{if(!ii){var o,p={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"};for(o in ai)ai[o]===void 0?delete p[o]:p[o]=ai[o];var h=[];for(o in p)h.push(`${o}=${p[o]}`);ii=h}return ii};function Kn(o,p){if(l)return be(19,1,o,p);o>>>=0,p>>>=0;var h=0;return Fn().forEach((y,v)=>{var I=p+h;for(v=me()[o+4*v>>>2>>>0]=I,I=0;I<y.length;++I)P()[v++>>>0]=y.charCodeAt(I);P()[v>>>0]=0,h+=y.length+1}),0}function Zn(o,p){if(l)return be(20,1,o,p);o>>>=0,p>>>=0;var h=Fn();me()[o>>>2>>>0]=h.length;var y=0;return h.forEach(v=>y+=v.length+1),me()[p>>>2>>>0]=y,0}function Qn(o){return l?be(21,1,o):52}function Xn(o,p,h,y){return l?be(22,1,o,p,h,y):52}function Yn(o,p,h,y){return l?be(23,1,o,p,h,y):70}var Zh=[null,[],[]];function Jn(o,p,h,y){if(l)return be(24,1,o,p,h,y);p>>>=0,h>>>=0,y>>>=0;for(var v=0,I=0;I<h;I++){var B=me()[p>>>2>>>0],M=me()[p+4>>>2>>>0];p+=8;for(var L=0;L<M;L++){var K=j()[B+L>>>0],ne=Zh[o];K===0||K===10?((o===1?S:T)(hn(ne)),ne.length=0):ne.push(K)}v+=M}return me()[y>>>2>>>0]=v,0}l||function(){for(var o=i.numThreads-1;o--;)dn();jr.unshift(()=>{_t++,function(p){l?p():Promise.all(ot.map(ln)).then(p)}(()=>en())})}();for(var es=Array(256),mr=0;256>mr;++mr)es[mr]=String.fromCharCode(mr);zn=es,ut=i.BindingError=class extends Error{constructor(o){super(o),this.name="BindingError"}},i.InternalError=class extends Error{constructor(o){super(o),this.name="InternalError"}},tt.push(0,1,void 0,1,null,1,!0,1,!1,1),i.count_emval_handles=()=>tt.length/2-5-Zr.length;var Y,Qh=[Hr,nn,pn,mn,gn,yn,bn,$n,wn,vn,xn,Sn,kn,Tn,In,En,Ln,Vn,jn,Kn,Zn,Qn,Xn,Yn,Jn];(async function(){function o(y,v){return Y=y.exports,Y=function(){var I=Y,B={};for(let[M,L]of Object.entries(I))B[M]=typeof L=="function"?(...K)=>{pr.push(M);try{return L(...K)}finally{ae||(pr.pop(),Xe&&dt===1&&pr.length===0&&(dt=0,st+=1,dr(ps),typeof Fibers<"u"&&Fibers.rc()))}}:L;return B}(),Y=function(){var I=Y,B=L=>K=>L(K)>>>0,M=L=>()=>L()>>>0;return(I=Object.assign({},I)).Da=B(I.Da),I.fb=M(I.fb),I.hb=B(I.hb),I.tb=B(I.tb),I.ub=M(I.ub),I.__cxa_get_exception_ptr=B(I.__cxa_get_exception_ptr),I}(),sn.push(Y.ib),z=v,en(),Y}_t++;var p=tn();if(i.instantiateWasm)return new Promise(y=>{i.instantiateWasm(p,(v,I)=>{o(v,I),y(v.exports)})});if(l)return new Promise(y=>{gt=v=>
vendor: 4,113 bytes, line 13
13{var I=new WebAssembly.Instance(v,tn());y(o(I,v))}});Ut??(Ut=i.locateFile?i.locateFile?i.locateFile("ort-wasm-simd-threaded.jsep.wasm",w):w+"ort-wasm-simd-threaded.jsep.wasm":new URL("/assets/ort-wasm-simd-threaded.jsepB0T3yYHD.wasm",import.meta.url).href);try{var h=await async function(y){var v=Ut;if(!ee&&typeof WebAssembly.instantiateStreaming=="function"&&!D(v))try{var I=fetch(v,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(I,y)}catch(B){T(`wasm streaming compile failed: ${B}`),T("falling back to ArrayBuffer instantiation")}return async function(B,M){try{var L=await async function(K){if(!ee)try{var ne=await g(K);return new Uint8Array(ne)}catch{}if(K==Ut&&ee)K=new Uint8Array(ee);else{if(!_)throw"both async and sync fetching of the wasm failed";K=_(K)}return K}(B);return await WebAssembly.instantiate(L,M)}catch(K){T(`failed to asynchronously prepare wasm: ${K}`),nt(K)}}(v,y)}(p);return o(h.instance,h.module)}catch(y){return n(y),Promise.reject(y)}})();var ts=o=>(ts=Y.Da)(o),rs=()=>(rs=Y.Ea)();i._OrtInit=(o,p)=>(i._OrtInit=Y.Fa)(o,p),i._OrtGetLastError=(o,p)=>(i._OrtGetLastError=Y.Ga)(o,p),i._OrtCreateSessionOptions=(o,p,h,y,v,I,B,M,L,K)=>(i._OrtCreateSessionOptions=Y.Ha)(o,p,h,y,v,I,B,M,L,K),i._OrtAppendExecutionProvider=(o,p,h,y,v)=>(i._OrtAppendExecutionProvider=Y.Ia)(o,p,h,y,v),i._OrtAddFreeDimensionOverride=(o,p,h)=>(i._OrtAddFreeDimensionOverride=Y.Ja)(o,p,h),i._OrtAddSessionConfigEntry=(o,p,h)=>(i._OrtAddSessionConfigEntry=Y.Ka)(o,p,h),i._OrtReleaseSessionOptions=o=>(i._OrtReleaseSessionOptions=Y.La)(o),i._OrtCreateSession=(o,p,h)=>(i._OrtCreateSession=Y.Ma)(o,p,h),i._OrtReleaseSession=o=>(i._OrtReleaseSession=Y.Na)(o),i._OrtGetInputOutputCount=(o,p,h)=>(i._OrtGetInputOutputCount=Y.Oa)(o,p,h),i._OrtGetInputOutputMetadata=(o,p,h,y)=>(i._OrtGetInputOutputMetadata=Y.Pa)(o,p,h,y),i._OrtFree=o=>(i._OrtFree=Y.Qa)(o),i._OrtCreateTensor=(o,p,h,y,v,I)=>(i._OrtCreateTensor=Y.Ra)(o,p,h,y,v,I),i._OrtGetTensorData=(o,p,h,y,v)=>(i._OrtGetTensorData=Y.Sa)(o,p,h,y,v),i._OrtReleaseTensor=o=>(i._OrtReleaseTensor=Y.Ta)(o),i._OrtCreateRunOptions=(o,p,h,y)=>(i._OrtCreateRunOptions=Y.Ua)(o,p,h,y),i._OrtAddRunConfigEntry=(o,p,h)=>(i._OrtAddRunConfigEntry=Y.Va)(o,p,h),i._OrtReleaseRunOptions=o=>(i._OrtReleaseRunOptions=Y.Wa)(o),i._OrtCreateBinding=o=>(i._OrtCreateBinding=Y.Xa)(o),i._OrtBindInput=(o,p,h)=>(i._OrtBindInput=Y.Ya)(o,p,h),i._OrtBindOutput=(o,p,h,y)=>(i._OrtBindOutput=Y.Za)(o,p,h,y),i._OrtClearBoundOutputs=o=>(i._OrtClearBoundOutputs=Y._a)(o),i._OrtReleaseBinding=o=>(i._OrtReleaseBinding=Y.$a)(o),i._OrtRunWithBinding=(o,p,h,y,v)=>(i._OrtRunWithBinding=Y.ab)(o,p,h,y,v),i._OrtRun=(o,p,h,y,v,I,B,M)=>(i._OrtRun=Y.bb)(o,p,h,y,v,I,B,M),i._OrtEndProfiling=o=>(i._OrtEndProfiling=Y.cb)(o),i._JsepOutput=(o,p,h)=>(i._JsepOutput=Y.db)(o,p,h),i._JsepGetNodeName=o=>(i._JsepGetNodeName=Y.eb)(o);var gr=()=>(gr=Y.fb)(),Ye=i._free=o=>(Ye=i._free=Y.gb)(o),_r=i._malloc=o=>(_r=i._malloc=Y.hb)(o),ni=(o,p,h,y,v,I)=>(ni=Y.kb)(o,p,h,y,v,I),is=()=>(is=Y.lb)(),as=(o,p,h,y,v)=>(as=Y.mb)(o,p,h,y,v),ns=o=>(ns=Y.nb)(o),si=o=>(si=Y.ob)(o),ss=(o,p)=>(ss=Y.pb)(o,p),os=()=>(os=Y.qb)(),us=(o,p)=>(us=Y.rb)(o,p),yr=o=>(yr=Y.sb)(o),oi=o=>(oi=Y.tb)(o),ui=()=>(ui=Y.ub)(),ls=i.dynCall_ii=(o,p)=>(ls=i.dynCall_ii=Y.vb)(o,p),ds=o=>(ds=Y.wb)(o),ps=()=>(ps=Y.xb)(),cs=o=>(cs=Y.yb)(o),fs=()=>(fs=Y.zb)();return i.stackSave=()=>ui(),i.stackRestore=o=>yr(o),i.stackAlloc=o=>oi(o),i.setValue=function(o,p,h="i8"){switch(h.endsWith("*")&&(h="*"),h){case"i1":case"i8":P()[o>>>0]=p;break;case"i16":se()[o>>>1>>>0]=p;break;case"i32":N()[o>>>2>>>0]=p;break;case"i64":V[o>>>3]=BigInt(p);break;case"float":Ne()[o>>>2>>>0]=p;break;case"double":Ce()[o>>>3>>>0]=p;break;case"*":me()[o>>>2>>>0]=p;break;default:nt(`invalid type for setValue: ${h}`)}},i.getValue=function(o,p="i8"){switch(p.endsWith("*")&&(p="*"),p){case"i1":case"i8":return P()[o>>>0];case"i16":return se()[o>>>1>>>0];case"i32":return N()[o>>>2>>>0];case"i64":return V[o>>>3];case"float":return Ne()[o>>>2>>>0];case"double":return Ce()[o>>>3>>>0];case"*":return me()[o>>>2>>>0];default:nt(`invalid type for getValue: ${p}`)}}
13,i.UTF8ToString=ve,i.stringToUTF8=At,i.lengthBytesUTF8=_n,function o(){if(0<_t)qt=o;else if(l)a(i),Ze();else{for(;0<jr.length;)jr.shift()(i);0<_t?qt=o:(i.calledRun=!0,ae||(Ze(),a(i)))}}(),i.PTR_SIZE=4,s}),_d=mi,_s=(t=(e=globalThis.self)==null?void 0:e.name)==null?void 0:t.startsWith("em-pthread"),_s&&mi()}),gi,ua,ys,Be,yd,$r,bs,$s,_i,ws,yi,bd,bi,$d,Ea=U(()=>{Ia(),gi=typeof location>"u"?void 0:location.origin,ua=import.meta.url>"file:"&&import.meta.url<"file;",ys=()=>{{if(ua){let e=URL;return new URL(new e("ort.bundle.min.mjs",import.meta.url).href,gi).href}return import.meta.url}},Be=ys(),yd=()=>{if(Be&&!Be.startsWith("blob:"))return Be.substring(0,Be.lastIndexOf("/")+1)},$r=(e,t)=>{try{let r=t??Be;return(r?new URL(e,r):new URL(e)).origin===gi}catch{return!1}},bs=(e,t)=>{let r=t??Be;try{return(r?new URL(e,r):new URL(e)).href}catch{return}},$s=(e,t)=>`${t??"./"}${e}`,_i=async e=>{let t=await(await fetch(e,{credentials:"same-origin"})).blob();return URL.createObjectURL(t)},ws=async e=>(await import(e)).default,yi=(ym(),nr(hd)).default,bd=async()=>{if(!Be)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if($r(Be))return[void 0,yi()];let e=await _i(Be);return[e,yi(e)]},bi=(bm(),nr(gd)).default,$d=async(e,t,r)=>{if(!e&&!t&&bi&&Be&&$r(Be))return[void 0,bi];{let a="ort-wasm-simd-threaded.jsep.mjs",n=e??bs(a,t),i=r&&n&&!$r(n,t),s=i?await _i(n):n??$s(a,t);return[i?s:void 0,await ws(s)]}}}),$i,wr,Ht,wi,vs,xs,Ss,za,_e,zt=U(()=>{Ea(),wr=!1,Ht=!1,wi=!1,vs=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},xs=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},Ss=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},za=async e=>{if(wr)return Promise.resolve();if(Ht)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(wi)throw new Error("previous call to 'initializeWebAssembly()' failed.");Ht=!0;let t=e.initTimeout,r=e.numThreads;if(e.simd!==!1){if(e.simd==="relaxed"){if(!Ss())throw new Error("Relaxed WebAssembly SIMD is not supported in the current environment.")}else if(!xs())throw new Error("WebAssembly SIMD is not supported in the current environment.")}let a=vs();r>1&&!a&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+r+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),e.numThreads=r=1);let n=e.wasmPaths,i=typeof n=="string"?n:void 0,s=n==null?void 0:n.mjs,u=(s==null?void 0:s.href)??s,d=n==null?void 0:n.wasm,l=(d==null?void 0:d.href)??d,c=e.wasmBinary,[f,m]=await $d(u,i,r>1),g=!1,_=[];if(t>0&&_.push(new Promise(b=>{setTimeout(()=>{g=!0,b()},t)})),_.push(new Promise((b,x)=>{let w={numThreads:r};if(c)w.wasmBinary=c;else if(l||i)w.locateFile=$=>l??i+$;else if(u&&u.indexOf("blob:")!==0)w.locateFile=$=>new URL($,u).href;else if(f){let $=yd();$&&(w.locateFile=k=>$+k)}m(w).then($=>{Ht=!1,wr=!0,$i=$,b(),f&&URL.revokeObjectURL(f)},$=>{Ht=!1,wi=!0,x($)})})),await Promise.race(_),g)throw new Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},_e=()=>{if(wr&&$i)return $i;throw new Error("WebAssembly is not initialized yet.")}}),He,Dr,he,Ca=U(()=>{zt(),He=(e,t)=>{let r=_e(),a=r.lengthBytesUTF8(e)+1,n=r._malloc(a);return r.stringToUTF8(e,n,a),t.push(n),n},Dr=(e,t,r,a)=>{if(typeof e=="object"&&e!==null){if(r.has(e))throw new Error("Circular reference in options");r.add(e)}Object.entries(e).forEach(([n,i])=>{let s=t?t+n:n;if(typeof i=="object")Dr(i,s+".",r,a);else if(typeof i=="string"||typeof i=="number")a(s,i.toString());else if(typeof i=="boolean")a(s,i?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof i}`)})},he=e=>{let t=_e(),r=t.stackSave();try{let a=t.PTR_SIZE,n=t.stackAlloc(2*a);t._OrtGetLastError(n,n+a);let i=Number(t.getValue(n,a===4?"i32":"i64")),s=t.getValue(n+a,"*"),u=s?t.UTF8ToString(s):"";throw new Error(`${e} ERROR_CODE: ${i}, ERROR_MESSAGE: ${u}`)}finally{t.stackRestore(r)}}}),wd,$m=U(()=>{zt(),Ca(),wd=e=>{let t=_e(),r=0,a=[],n=e||{};
13try{if((e==null?void 0:e.logSeverityLevel)===void 0)n.logSeverityLevel=2;else if(typeof e.logSeverityLevel!="number"||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${e.logSeverityLevel}`);if((e==null?void 0:e.logVerbosityLevel)===void 0)n.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!="number"||!Number.isInteger(e.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);(e==null?void 0:e.terminate)===void 0&&(n.terminate=!1);let i=0;return(e==null?void 0:e.tag)!==void 0&&(i=He(e.tag,a)),r=t._OrtCreateRunOptions(n.logSeverityLevel,n.logVerbosityLevel,!!n.terminate,i),r===0&&he("Can't create run options."),(e==null?void 0:e.extra)!==void 0&&Dr(e.extra,"",new WeakSet,(s,u)=>{let d=He(s,a),l=He(u,a);t._OrtAddRunConfigEntry(r,d,l)!==0&&he(`Can't set a run config entry: ${s} - ${u}.`)}),[r,a]}catch(i){throw r!==0&&t._OrtReleaseRunOptions(r),a.forEach(s=>t._free(s)),i}}}),ks,Ts,Is,Gt,Es,vd,wm=U(()=>{zt(),Ca(),ks=e=>{switch(e){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${e}`)}},Ts=e=>{switch(e){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${e}`)}},Is=e=>{e.extra||(e.extra={}),e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||(t.use_ort_model_bytes_directly="1"),e.executionProviders&&e.executionProviders.some(r=>(typeof r=="string"?r:r.name)==="webgpu")&&(e.enableMemPattern=!1)},Gt=(e,t,r,a)=>{let n=He(t,a),i=He(r,a);_e()._OrtAddSessionConfigEntry(e,n,i)!==0&&he(`Can't set a session config entry: ${t} - ${r}.`)},Es=async(e,t,r)=>{for(let a of t){let n=typeof a=="string"?a:a.name,i=[];switch(n){case"webnn":if(n="WEBNN",typeof a!="string"){let c=a==null?void 0:a.deviceType;c&&Gt(e,"deviceType",c,r)}break;case"webgpu":if(n="JS",typeof a!="string"){let c=a;if(c!=null&&c.preferredLayout){if(c.preferredLayout!=="NCHW"&&c.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${c.preferredLayout}`);Gt(e,"preferredLayout",c.preferredLayout,r)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${n}`)}let s=He(n,r),u=i.length,d=0,l=0;if(u>0){d=_e()._malloc(u*_e().PTR_SIZE),r.push(d),l=_e()._malloc(u*_e().PTR_SIZE),r.push(l);for(let c=0;c<u;c++)_e().setValue(d+c*_e().PTR_SIZE,i[c][0],"*"),_e().setValue(l+c*_e().PTR_SIZE,i[c][1],"*")}await _e()._OrtAppendExecutionProvider(e,s,d,l,u)!==0&&he(`Can't append execution provider: ${n}.`)}},vd=async e=>{let t=_e(),r=0,a=[],n=e||{};Is(n);try{let i=ks(n.graphOptimizationLevel??"all"),s=Ts(n.executionMode??"sequential"),u=typeof n.logId=="string"?He(n.logId,a):0,d=n.logSeverityLevel??2;if(!Number.isInteger(d)||d<0||d>4)throw new Error(`log serverity level is not valid: ${d}`);let l=n.logVerbosityLevel??0;if(!Number.isInteger(l)||l<0||l>4)throw new Error(`log verbosity level is not valid: ${l}`);let c=typeof n.optimizedModelFilePath=="string"?He(n.optimizedModelFilePath,a):0;if(r=t._OrtCreateSessionOptions(i,!!n.enableCpuMemArena,!!n.enableMemPattern,s,!!n.enableProfiling,0,u,d,l,c),r===0&&he("Can't create session options."),n.executionProviders&&await Es(r,n.executionProviders,a),n.enableGraphCapture!==void 0){if(typeof n.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${n.enableGraphCapture}`);Gt(r,"enableGraphCapture",n.enableGraphCapture.toString(),a)}if(n.freeDimensionOverrides)for(let[f,m]of Object.entries(n.freeDimensionOverrides)){if(typeof f!="string")throw new Error(`free dimension override name must be a string: ${f}`);if(typeof m!="number"||!Number.isInteger(m)||m<0)throw new Error(`free dimension override value must be a non-negative integer: ${m}`);let g=He(f,a);t._OrtAddFreeDimensionOverride(r,g,m)!==0&&he(`Can't set a free dimension override: ${f} - ${m}.`)}return n.extra!==void 0&&Dr(n.extra,"",new WeakSet,(f,m)=>{Gt(r,f,m,a)}),[r,a]}catch(i){throw r!==0&&t._OrtReleaseSessionOptions(r)!==0&&he("Can't release session options."),a.forEach(s=>t._free(s)),i}}}),Rt,it,St,Aa,Nr,Oa,Ba,la,J=U(()=>{Rt=e=>{switch(e){case"int8":return 3;case"uint8":return 2;case"bool":return 9;
vendor: 4,691 bytes, line 13
13case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;case"int4":return 22;case"uint4":return 21;default:throw new Error(`unsupported data type: ${e}`)}},it=e=>{switch(e){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";case 22:return"int4";case 21:return"uint4";default:throw new Error(`unsupported data type: ${e}`)}},St=(e,t)=>{let r=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],a=typeof t=="number"?t:t.reduce((n,i)=>n*i,1);return r>0?Math.ceil(a*r):void 0},Aa=e=>{switch(e){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${e}`)}},Nr=e=>{switch(e){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${e}`)}},Oa=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",Ba=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint64"||e==="int8"||e==="uint8"||e==="bool"||e==="uint4"||e==="int4",la=e=>{switch(e){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;case"ml-tensor":return 5;default:throw new Error(`unsupported data location: ${e}`)}}}),Ra,xd=U(()=>{Ia(),Ra=async e=>{if(typeof e=="string"){let t=await fetch(e);if(!t.ok)throw new Error(`failed to load external data file: ${e}`);let r=t.headers.get("Content-Length"),a=r?parseInt(r,10):0;if(a<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw new Error(`failed to load external data file: ${e}, no response body.`);let n=t.body.getReader(),i;try{i=new ArrayBuffer(a)}catch(u){if(u instanceof RangeError){let d=Math.ceil(a/65536);i=new WebAssembly.Memory({initial:d,maximum:d}).buffer}else throw u}let s=0;for(;;){let{done:u,value:d}=await n.read();if(u)break;let l=d.byteLength;new Uint8Array(i,s,l).set(d),s+=l}return new Uint8Array(i,0,a)}}else return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),zs,Cs,As,Os,Da,Bs,ue,at=U(()=>{J(),zs=["V","I","W","E","F"],Cs=(e,t)=>{`${zs[e]}${new Date().toISOString()}${t}`},Da=(e,t)=>{As=e,Os=t},Bs=(e,t)=>{let r=Nr(e),a=Nr(As);r>=a&&Cs(r,typeof t=="function"?t():t)},ue=(...e)=>{Os&&Bs(...e)}}),Rs,Nt,C,Mr,Sd,kd,Td,re=U(()=>{Rs=class{static calcMatMulShape(e,t){return e[1]!==t[0]?void 0:[e[0],t[1]]}},Nt=class{static calcShape(e,t,r=!1){let a=e.length,n=t.length;if(a===0)return t;if(n===0)return e;let i=Math.max(e.length,t.length),s=new Array(i);if(r){if(a<2||n<2)return;let u=Rs.calcMatMulShape([e[a-2],e[a-1]],[t[n-2],t[n-1]]);if(u===void 0)return;[s[i-2],s[i-1]]=u}for(let u=r?3:1;u<=i;u++){let d=a-u<0?1:e[a-u],l=n-u<0?1:t[n-u];if(d!==l&&d>1&&l>1)return;let c=Math.max(d,l);if(d&&l)s[i-u]=Math.max(d,l);else{if(c>1)return;s[i-u]=0}}return s}static isValidBroadcast(e,t){let r=e.length,a=t.length;if(r>a)return!1;for(let n=1;n<=r;n++)if(e[r-n]!==1&&e[r-n]!==t[a-n])return!1;return!0}},C=class Br{static size(t){return Br.getSizeFromDimensionRange(t,0,t.length)}static convertShape(t,r=4){let a=t.length;if(a===0)return[];let n=new Array(a),i=a-1;for(;i>=0;){if(t[i]%r===0){n[i]=t[i]/r;break}if(r%t[i]!==0)throw new Error("cannot convert shape");n[i]=1,r/=t[i],i--}for(i--;i>=0;i--)n[i]=t[i];return n}static sizeFromDimension(t,r){if(r<0||r>t.length)throw new Error(`invalid dimension of ${r} for sizeFromDimension as Tensor has ${t.length} dimensions.`);return Br.getSizeFromDimensionRange(t,r,t.length)}static sizeToDimension(t,r){if(r<0||r>t.length)throw new Error(`invalid dimension of ${r} for sizeToDimension as Tensor has ${t.length} dimensions.`);return Br.getSizeFromDimensionRange(t,0,r)}static getSizeFromDimensionRange(t,r,a){let n=1;for(let i=r;i<a;i++){if(t[i]<0)throw new Error("cannot get valid size from specified dimension range. Most likely the range contains
13negative values in them.");n*=Number(t[i])}return n}static computeStrides(t){let r=t.length;if(r===0)return[];if(r===1)return[1];let a=new Array(r);a[r-1]=1,a[r-2]=t[r-1];for(let n=r-3;n>=0;--n)a[n]=a[n+1]*t[n+1];return a}static normalizeAxis(t,r){if(t<-r&&t>=r)throw new Error("unsupported axis for this operation.");return t<0?t+r:t}static normalizeAxes(t,r){return t.map(a=>this.normalizeAxis(a,r??t.length))}static sortBasedOnPerm(t,r){return r?r.map(a=>t[a]):t.slice().reverse()}static padShape(t,r){let a=t.length;return t.map((n,i)=>n+r[i]+r[i+a])}static areEqual(t,r){return t.length!==r.length?!1:t.every((a,n)=>a===r[n])}},Mr=class tr{static adjustPoolAttributes(t,r,a,n,i,s){if(!t&&a.length!==r.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(t)for(let u=0;u<r.length-2;u++)u>=a.length?a.push(r[u+2]):a[u]=r[u+2];for(let u=0;u<a.length;u++)if(u<n.length){if(n[u]<0)throw new Error("strides should be greater than or equal to 1")}else n.push(1);for(let u=0;u<a.length;u++)if(u<i.length){if(i[u]<0)throw new Error("dilations should be greater than or equal to 1")}else i.push(1);for(let u=0;u<a.length*2;u++)if(u<s.length){if(s[u]<0)throw new Error("pad should be greater than or equal to 1")}else s.push(0);for(let u=0;u<a.length;u++){if(a[u]<=0)throw new Error("kernel shapes need to be greater than 0");if(s[u]>=a[u]||s[u+a.length]>=a[u])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(t,r,a,n,i,s,u){if(u){if(i.length!==2*(t.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(r.length!==t.length-2)throw new Error("length of strides should be the length of data dimensions");if(n.length!==t.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let d=0;d<t.length-2;d++)tr.adjustPadAndReturnShape(t[d+(s?1:2)],r[d],a[d],n[d],i,d,d+t.length-2,u)}}static computePoolOutputShape(t,r,a,n,i,s,u){if(r.length<=0)throw new Error("input shape must be of size greater than 0");let d=[r[0],r[1]];return tr.computeShapeHelper(t,r,d,a,n,i,s,u),d}static computeConvOutputShape(t,r,a,n,i,s,u){if(t.length<=0||r.length<=0)throw new Error("invalid input tensor dims or invalid filter tensor dims");let d=[t[0],r[0]];return tr.computeShapeHelper(!1,t,d,a,n,i,s,u),d}static computeShapeHelper(t,r,a,n,i,s,u,d){if(t)for(let l=0;l<r.length-2;l++)a.push(1);else for(let l=0;l<r.length-2;l++)a.push(tr.adjustPadAndReturnShape(r[l+2],n[l],i[l],s[l],u,l,l+r.length-2,d))}static adjustPadAndReturnShape(t,r,a,n,i,s,u,d){let l=a*(n-1)+1;if(d&&d!=="NOTSET")switch(d){case"VALID":return i[s]=0,i[u]=0,Math.floor((t-l)/r+1);case"SAME_LOWER":case"SAME_UPPER":if(a!==1)throw new Error("Dilation not supported for SAME_UPPER or SAME_LOWER");{let c=((t+r-1)/r-1)*r+n-t;return i[s]=Math.floor(d==="SAME_LOWER"?(c+1)/2:c/2),i[u]=c-i[s],Math.floor((t+c-n)/r+1)}default:throw new Error("Unsupported AutoPad type")}else return Math.floor((t+i[s]+i[u]-l)/r+1)}},Sd=class{static getShapeOfGemmResult(e,t,r,a,n){if(e.length!==2||r.length!==2)throw new Error("shape need to be of size 2");let i,s,u;t?(i=e[1],s=e[0]):(i=e[0],s=e[1]);let d=-1;if(a?(u=r[0],d=1):(u=r[1],d=0),r[d]!==s)throw new Error("dimension mismatch");if(i<=0||u<=0||s<=0)throw new Error("invalid shape specified");if(n&&!Nt.isValidBroadcast(n,[i,u]))throw new Error("gemm: invalid bias shape for broadcast");return[i,u,s]}},kd=-34028234663852886e22,Td=34028234663852886e22}),Na,Id=U(()=>{J(),Na=(e,t)=>new(Aa(t))(e)}),da,vi,Ds,xi,Ns,Si,ki,Ti,Ms,Ed,vm=U(()=>{at(),da=(e,t=!0)=>{if(e.byteLength%8!==0)throw new Error("Invalid Uint8Array length - must be a multiple of 8 (BigInt).");let r=e.byteLength/8,a=new BigInt64Array(e.buffer,e.byteOffset,r),n=new Int32Array(r);for(let i=0;i<r;i++){let s=a[i];if(s>2147483647n||s<-2147483648n)throw new Error(`Overflow occurred when converting BigInt to Int32 at index ${i}: ${s}`);n[i]=Number(s)}return t?new Uint8Array(n.buffer):n},vi=(e,t=!0)=>{if(e.byteLength%4!==0)throw new Error("Invalid Uint8Array length - must be a multiple of 4 (Int32).");let r=e.byteLength/4,a=new Int32Array(e.buffer,e.byteOffset,r),n=BigInt64Array.from(a,BigInt);return t?new Uint8Array(n.buffer):n},Ds=1,xi=()=>Ds++,Ns=new Map([["float32",32],["float16",16],["int32",32],["uint32",32],["int64",64],["uint64",64],["int8",8],["uint8",8],["int4",4],["uint4",4]]),Si=(e,t)=>{let r=Ns.get(e);if(!r)throw new Error("Unsupported data type.");return t.length>0?Math.ceil(t.reduce((a,n)=>a*n)*r/8):0},ki=class{constructor(e){this.shouldConvertInt64toInt32=!1,this.isInt64ToInt32Converted=!1;let{sessionId:t,context:r,tensor:a,dataType:n,shape:i,shouldConvertInt64toInt32:s=!1}=e;this.sessionId=t,this.mlContext=r,this.mlTensor=a,this.dataType=n,this.tensorShape=i,this.shouldConvertInt64toInt32=s}get tensor(){return this.mlTensor}get type(){return this.dataType}get shape(){return this.tensorShape}get byteLength(){return Si(this.dataType,this.tensorShape)}destroy(){ue("verbose",()=>"[WebNN] TensorWrapper.destroy"),this.mlTensor.destroy()}write(e){this.mlContext.writeTensor(this.mlTensor,e)}async read(e,t){if(e){let r=await this.mlContext.readTensor(this.mlTensor),a=vi(new Uint8Array(r));if(t){(t instanceof ArrayBuffer?new Uint8Array(t):new Uint8Array(t.buffer,t.byteOffset,t.byteLength)).set(a);return}else return a.buffer}else return t?this.mlContext.readTensor(this.mlTensor,t):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(e,t,r){return this.mlContext===e&&this.dataType===t&&this.tensorShape.length===r.length&&this.tensorShape.every((a,n)=>a===r[n])}setIsInt64ToInt32Converted(e){this.isInt64ToInt32Converted=e}},Ti=class{constructor(e,t){this.tensorManager=e,this.wrapper=t}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(e,t,r,a){let n=t,i=this.tensorManager.getMLContext(e),s=n==="int64"&&!i.opSupportLimits().input.dataTypes.includes("int64");if(s&&(n="int32",ue("verbose",()=>"[WebNN] TensorIdTracker.ensureTensor: convert dataType from int64 to int32")),this.wrapper){if(this.wrapper.canReuseTensor(i,n,r))return this.wrapper.tensor;if(a){if(this.wrapper.byteLength!==Si(n,r))throw new Error("Unable to copy data to tensor with different size.");this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let u=typeof MLTensorUsage>"u"?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(e,n,r,u,!0,!0,s),a&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(e){let t=e;if(this.wrapper)if(this.wrapper.shouldConvertInt64toInt32&&(t=da(e,!0),this.wrapper.setIsInt64ToInt32Converted(!0)),t.byteLength===this.wrapper.byteLength){this.wrapper.write(t);return}else ue("verbose",()=>"Data size does not match tensor size. Releasing tensor."),this.releaseTensor();this.activeUpload?this.activeUpload.set(t):this.activeUpload=new Uint8Array(t)}async download(e){var t,r,a;if(this.activeUpload){let n=(t=this.wrapper)!=null&&t.isInt64ToInt32Converted?vi(this.activeUpload):this.activeUpload;if(e){e instanceof ArrayBuffer?new Uint8Array(e).set(n):new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(n);return}else return n.buffer}if(!this.wrapper)throw new Error("Tensor has not been created.");return e?this.wrapper.read((r=this.wrapper)==null?void 0:r.shouldConvertInt64toInt32,e):this.wrapper.read((a=this.wrapper)==null?void 0:a.shouldConvertInt64toInt32)}},Ms=class{constructor(e){this.backend=e,this.tensorTrackersById=new Map,this.freeTensors=[],this.externalTensors=new Set}getMLContext(e){let t=this.backend.getMLContext(e);if(!t)throw new Error("MLContext not found for session.");return t}reserveTensorId(){let e=xi();return this.tensorTrackersById.set(e,new Ti(this)),e}releaseTensorId(e){let t=this.tensorTrackersById.get(e);t&&(this.tensorTrackersById.delete(e),t.tensorWrapper&&this.releaseTensor(t.tensorWrapper))}async ensureTensor(e,t,r,a,n){ue("verbose",()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${t}, dataType: ${r}, shape: ${a}, copyOld: ${n}}`);let i=this.tensorTrackersById.get(t);if(!i)throw new Error("Tensor not found.");return i.ensureTensor(e,r,a,n)}upload(e,t){let r=this.tensorTrackersById.get(e);if(!r)throw new Error("Tensor not found.");r.upload(t)}async download(e,t){ue("verbose",()=>`[WebNN] TensorManager.download {tensorId: ${e}, dstBuffer: ${t==null?void 0:t.byteLength}}`);let r=this.tensorTrackersById.get(e);if(!r)throw new Error("Tensor not found.");return r.download(t)}releaseTensorsForSession(e){for(let t of this.freeTensors)t.sessionId===e&&t.destroy();this.freeTensors=this.freeTensors.filter(t=>t.sessionId!==e)}registerTensor(e,t,r,a){let n=this.getMLContext(e),i=xi(),s=new ki({sessionId:e,context:n,tensor:t,dataType:r,shape:a});return this.tensorTrackersById.set(i,new Ti(this,s)),this.externalTensors.add(s),i}async getCachedTensor(e,t,r,a,n,i,s=!1){let u=this.getMLContext(e);for(let[l,c]of this.freeTensors.entries())if(c.canReuseTensor(u,t,r)){ue("verbose",()=>`[WebNN] Reusing tensor {dataType: ${t}, shape: ${r}}`);let f=this.freeTensors.splice(l,1)[0];return f.sessionId=e,f}ue("verbose",()=>`[WebNN] MLContext.createTensor {dataType: ${t}, shape: ${r}}`);let d=await u.createTensor({dataType:t,shape:r,dimensions:r,usage:a,writable:n,readable:i});return new ki({sessionId:e,context:u,tensor:d,dataType:t,shape:r,shouldConvertInt64toInt32:s})}releaseTensor(e){this.externalTensors.has(e)&&this.externalTensors.delete(e),this.freeTensors.push(e)}},Ed=(...e)=>new Ms(...e)}
13),vr,Ps,zd,xm=U(()=>{J(),zt(),Id(),vm(),at(),vr=new Map([[1,"float32"],[10,"float16"],[6,"int32"],[12,"uint32"],[7,"int64"],[13,"uint64"],[22,"int4"],[21,"uint4"],[3,"int8"],[2,"uint8"],[9,"uint8"]]),Ps=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let r=Object.keys(e).sort(),a=Object.keys(t).sort();return r.length===a.length&&r.every((n,i)=>n===a[i]&&e[n]===t[n])},zd=class{constructor(e){this.tensorManager=Ed(this),this.mlContextBySessionId=new Map,this.sessionIdsByMLContext=new Map,this.mlContextCache=[],this.sessionGraphInputs=new Map,this.temporaryGraphInputs=[],this.temporarySessionTensorIds=new Map,Da(e.logLevel,!!e.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw new Error("No active session");return this.activeSessionId}onRunStart(e){ue("verbose",()=>`[WebNN] onRunStart {sessionId: ${e}}`),this.activeSessionId=e}onRunEnd(e){ue("verbose",()=>`[WebNN] onRunEnd {sessionId: ${e}}`);let t=this.temporarySessionTensorIds.get(e);if(t){for(let r of t)ue("verbose",()=>`[WebNN] releasing temporary tensor {tensorId: ${r}}`),this.tensorManager.releaseTensorId(r);this.temporarySessionTensorIds.delete(e),this.activeSessionId=void 0}}async createMLContext(e){if(e instanceof GPUDevice){let r=this.mlContextCache.findIndex(a=>a.gpuDevice===e);if(r!==-1)return this.mlContextCache[r].mlContext;{let a=await navigator.ml.createContext(e);return this.mlContextCache.push({gpuDevice:e,mlContext:a}),a}}else if(e===void 0){let r=this.mlContextCache.findIndex(a=>a.options===void 0&&a.gpuDevice===void 0);if(r!==-1)return this.mlContextCache[r].mlContext;{let a=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:a}),a}}let t=this.mlContextCache.findIndex(r=>Ps(r.options,e));if(t!==-1)return this.mlContextCache[t].mlContext;{let r=await navigator.ml.createContext(e);return this.mlContextCache.push({options:e,mlContext:r}),r}}registerMLContext(e,t){this.mlContextBySessionId.set(e,t);let r=this.sessionIdsByMLContext.get(t);r||(r=new Set,this.sessionIdsByMLContext.set(t,r)),r.add(e),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(e,this.temporaryGraphInputs),this.temporaryGraphInputs=[])}onReleaseSession(e){this.sessionGraphInputs.delete(e);let t=this.mlContextBySessionId.get(e);if(!t)return;this.tensorManager.releaseTensorsForSession(e),this.mlContextBySessionId.delete(e);let r=this.sessionIdsByMLContext.get(t);if(r.delete(e),r.size===0){this.sessionIdsByMLContext.delete(t);let a=this.mlContextCache.findIndex(n=>n.mlContext===t);a!==-1&&this.mlContextCache.splice(a,1)}}getMLContext(e){return this.mlContextBySessionId.get(e)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(e){ue("verbose",()=>`[WebNN] releaseTensorId {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e)}async ensureTensor(e,t,r,a,n){let i=vr.get(r);if(!i)throw new Error(`Unsupported ONNX data type: ${r}`);return this.tensorManager.ensureTensor(e??this.currentSessionId,t,i,a,n)}async createTemporaryTensor(e,t,r){ue("verbose",()=>`[WebNN] createTemporaryTensor {onnxDataType: ${t}, shape: ${r}}`);let a=vr.get(t);if(!a)throw new Error(`Unsupported ONNX data type: ${t}`);let n=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(e,n,a,r,!1);let i=this.temporarySessionTensorIds.get(e);return i?i.push(n):this.temporarySessionTensorIds.set(e,[n]),n}uploadTensor(e,t){if(!_e().shouldTransferToMLTensor)throw new Error("Trying to upload to a MLTensor while shouldTransferToMLTensor is false");ue("verbose",()=>`[WebNN] uploadTensor {tensorId: ${e}, data: ${t.byteLength}}`),this.tensorManager.upload(e,t)}async downloadTensor(e,t){return this.tensorManager.download(e,t)}createMLTensorDownloader(e,t){return async()=>{let r=await this.tensorManager.download(e);return Na(r,t)}}registerMLTensor(e,t,r,a){let n=vr.get(r);if(!n)throw new Error(`Unsupported ONNX data type: ${r}`);let i=this.tensorManager.registerTensor(e,t,n,a);return ue("verbose",()=>`[WebNN] registerMLTensor {tensor: ${t}, dataType: ${n}, dimensions: ${a}} -> {tensorId: ${i}}`),i}registerMLConstant(e,t,r,a,n,i,s=!1){if(!i)throw new Error("External mounted files are not available.");let u=e;e.startsWith("./")&&(u=e.substring(2));let d=i.get(u);if(!d)throw new Error(`File with name ${u} not found in preloaded files.`);if(t+r>d.byteLength)throw new Error("Out of bounds: data offset and length exceed the external file data size.");let l=d.slice(t,t+r).buffer,c;switch(n.dataType){case"float32":c=new Float32Array(l);break;case"float16":c=typeof Float16Array<"u"&&Float16Array.from?new Float16Array(l):new Uint16Array(l);break;case"int32":c=new Int32Array(l);break;case"uint32":c=new Uint32Array(l);break;case"int64":s?(c=da(new Uint8Array(l),!1),n.dataType="int32"):c=new BigInt64Array(l);break;case"uint64":c=new BigUint64Array(l);break;case"int8":c=new Int8Array(l);break;case"int4":case"uint4":case"uint8":c=new Uint8Array(l);break;default:throw new Error(`Unsupported data type: ${n.dataType} in creating WebNN Constant from external data.`)}return ue("verbose",()=>`[WebNN] registerMLConstant {dataType: ${n.dataType}, shape: ${n.shape}}} ${s?"(Note: it was int64 data type and registered to int32 as workaround)":""}`),a.constant(n,c)}registerGraphInput(e){this.temporaryGraphInputs.push(e)}isGraphInput(e,t){let r=this.sessionGraphInputs.get(e);return r?r.includes(t):!1}isInt64Supported(e){var t;return!!((t=this.mlContextBySessionId.get(e))!=null&&t.opSupportLimits().input.dataTypes.includes("int64"))}flush(){}}}),Ma=U(()=>{}),Ii,xr,Sr,Us,qs,Ei,pa,Ws,Cd,Sm=U(()=>{at(),Ma(),Ii=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200
13],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),xr=[],Sr=e=>Math.ceil(Number(e)/16)*16,Us=e=>{for(let t=0;t<xr.length;t++){let r=xr[t];if(e<=r)return r}return Math.ceil(e/16)*16},qs=1,Ei=()=>qs++,pa=async(e,t,r,a)=>{let n=Sr(r),i=e.device.createBuffer({size:n,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let s=e.getCommandEncoder();e.endComputePass(),s.copyBufferToBuffer(t,0,i,0,n),e.flush(),await i.mapAsync(GPUMapMode.READ);let u=i.getMappedRange();if(a){let d=a();return d.set(new Uint8Array(u,0,r)),d}else return new Uint8Array(u.slice(0,r))}finally{i.destroy()}},Ws=class{constructor(e){this.backend=e,this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersPending=[],this.capturedPendingBuffers=new Map;for(let[t]of Ii)xr.push(t),this.freeBuffers.set(t,[]),this.freeUniformBuffers.set(t,[]);this.sessionCount=0}upload(e,t){let r=t.buffer,a=t.byteOffset,n=t.byteLength,i=Sr(n),s=this.storageCache.get(e);if(!s)throw new Error("gpu data for uploading does not exist");if(Number(s.originalSize)!==n)throw new Error(`inconsistent data size. gpu data size=${s.originalSize}, data size=${n}`);let u=this.backend.device.createBuffer({mappedAtCreation:!0,size:i,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),d=u.getMappedRange();new Uint8Array(d).set(new Uint8Array(r,a,n)),u.unmap();let l=this.backend.device.createCommandEncoder();l.copyBufferToBuffer(u,0,s.gpuData.buffer,0,i),this.backend.device.queue.submit([l.finish()]),u.destroy(),ue("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${e})`)}memcpy(e,t){let r=this.storageCache.get(e);if(!r)throw new Error("source gpu data for memcpy does not exist");let a=this.storageCache.get(t);if(!a)throw new Error("destination gpu data for memcpy does not exist");if(r.originalSize!==a.originalSize)throw new Error("inconsistent source and destination gpu data size");let n=Sr(r.originalSize),i=this.backend.getCommandEncoder();this.backend.endComputePass(),i.copyBufferToBuffer(r.gpuData.buffer,0,a.gpuData.buffer,0,n)}registerExternalBuffer(e,t,r){let a;if(r){if(a=r[0],e===r[1])return ue("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${t}) => id=${a}, buffer is the same, skip.`),a;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. 14 Please use the previous external buffer!`)}else a=Ei();return this.storageCache.set(a,{gpuData:{id:a,type:0,buffer:e},originalSize:t}),ue("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${t}) => id=${a}, registered.`),a}unregisterExternalBuffer(e){e!==void 0&&(this.storageCache.delete(e),ue("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${e}`))}create(e,t=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let r=Us(e),a,n=(t&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,i=(t&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(n||i){let u=(n?this.freeBuffers:this.freeUniformBuffers).get(r);u?u.length>0?a=u.pop():a=this.backend.device.createBuffer({size:r,usage:t}):a=this.backend.device.createBuffer({size:r,usage:t})}else a=this.backend.device.createBuffer({size:r,usage:t});let s={id:Ei(),type:0,buffer:a};return this.storageCache.set(s.id,{gpuData:s,originalSize:Number(e)}),ue("verbose",()=>`[WebGPU] GpuDataManager.create(size=${e}) => id=${s.id}`),s}get(e){var t;return(t=this.storageCache.get(e))==null?void 0:t.gpuData}release(e){let t=typeof e=="bigint"?Number(e):e,r=this.storageCache.get(t);if(!r){if(this.storageCache.size===0)return 0;throw new Error("releasing data does not exist")}return ue("verbose",()=>`[WebGPU] GpuDataManager.release(id=${t}), gpuDataId=${r.gpuData.id}`),this.storageCache.delete(t),this.buffersPending.push(r.gpuData.buffer),r.originalSize}async download(e,t){let r=this.storageCache.get(Number(e));if(!r)throw new Error("data does not exist");await pa(this.backend,r.gpuData.buffer,r.originalSize,t)}refreshPendingBuffers(){if(this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let e of this.buffersPending){let t=Ii.get(e.size);
vendor: 17,887 bytes, lines 14-121
14if((e.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let r=this.freeBuffers.get(e.size)||[];t===void 0||r.length>=t?e.destroy():r.push(e)}else if((e.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let r=this.freeUniformBuffers.get(e.size)||[];t===void 0||r.length>=t?e.destroy():r.push(e)}else e.destroy()}this.buffersPending=[]}else{let e=this.capturedPendingBuffers.get(this.backend.currentSessionId);e||(e=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,e));for(let t of this.buffersPending)e.push(t);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(e=>{e.forEach(t=>{t.destroy()})}),this.freeUniformBuffers.forEach(e=>{e.forEach(t=>{t.destroy()})}),this.storageCache.forEach(e=>{e.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(e=>{e.forEach(t=>{t.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onCreateSession(){this.sessionCount+=1}onReleaseSession(e){let t=this.capturedPendingBuffers.get(e);t&&(t.forEach(r=>{r.destroy()}),this.capturedPendingBuffers.delete(e)),this.sessionCount-=1,this.sessionCount===0&&(ue("warning",()=>"[WebGPU] Clearing webgpu buffer cache"),this.storageCache.forEach(r=>{r.gpuData.buffer.destroy()}),this.storageCache=new Map)}},Cd=(...e)=>new Ws(...e)}),Ls,ce,we=U(()=>{Ls=class{constructor(e){Object.assign(this,e)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(e=>`${this[e]}`).join(";")),this.key}},ce=e=>new Ls(e)}),Mt,kr,Se,Ee,Z,$e,ca,Dt,ht,F,Ft,R,G,Ad,Pa,Vs,Od,ie=U(()=>{J(),re(),Mt=64,kr=(e,t)=>{if(t===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(Number(e)){case 10:return t>1?`vec${t}<f16>`:"f16";case 1:return t>1?`vec${t}<f32>`:"f32";case 6:return t>1?`vec${t}<i32>`:"i32";case 12:return t>1?`vec${t}<u32>`:"u32";case 7:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2<u32>","i32"];case 13:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2<u32>","u32"];case 9:if(t!==4)throw new Error("bool must be vec4");return["u32","vec4<bool>"];case 22:return"i32";case 21:return"u32";default:throw new Error(`Unknown data type: ${e}`)}},Se=(e,t=1)=>{let r=kr(e,t);return typeof r=="string"?r:r[0]},Ee=(e,t=1)=>{let r=kr(e,t);return typeof r=="string"?r:r[1]},Z=(...e)=>{let t=[];return e.forEach(r=>{r.length!==0&&t.push({type:12,data:r},{type:12,data:C.computeStrides(r)})}),t},$e=e=>e%4===0?4:e%2===0?2:1,ca=(e="f32",t,r="0")=>!t||t===1?`${e}(${r})`:`vec${t}<${e}>(${r})`,Dt=(e,t,r)=>e==="f32"?r:t===1?`f32(${r})`:`vec${t}<f32>(${r})`,ht=(e,t)=>t===4?`(${e}.x + ${e}.y + ${e}.z + ${e}.w)`:t===2?`(${e}.x + ${e}.y)`:t===3?`(${e}.x + ${e}.y + ${e}.z)`:e,F=(e,t,r,a)=>e.startsWith("uniforms.")&&r>4?typeof t=="string"?a==="f16"?`${e}[(${t}) / 8][(${t}) % 8 / 4][(${t}) % 8 % 4]`:`${e}[(${t}) / 4][(${t}) % 4]`:a==="f16"?`${e}[${Math.floor(t/8)}][${Math.floor(t%8/4)}][${t%8%4}]`:`${e}[${Math.floor(t/4)}][${t%4}]`:r>1?`${e}[${t}]`:e,Ft=(e,t,r,a,n)=>{let i=typeof r=="number",s=i?r:r.length,u=[...new Array(s).keys()],d=s<2?"u32":s<=4?`vec${s}<u32>`:`array<u32, ${s}>`,l=kr(t,n),c=typeof l=="string"?l:l[1],f=typeof l=="string"?l:l[0],m={indices:d,value:c,storage:f,tensor:t},g=D=>typeof D=="string"?D:`${D}u`,_={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},b=i?"uniforms.":"",x=`${b}${e}_shape`,w=`${b}${e}_strides`,$="";for(let D=0;D<s-1;D++)$+=` 15 let dim${D} = current / ${F(w,D,s)}; 16 let rest${D} = current % ${F(w,D,s)}; 17 indices[${D}] = dim${D}; 18 current = rest${D}; 19 `;$+=`indices[${s-1}] = current;`;let k=s<2?"":` 20 fn o2i_${e}(offset: u32) -> ${m.indices} { 21 var indices: ${m.indices}; 22 var current = offset; 23 ${$} 24 return indices; 25 }`,S=D=>(_.offsetToIndices=!0,s<2?D:`o2i_${e}(${D})`),T=[];if(s>=2)for(let D=s-1;D>=0;D--)T.push(`${F(w,D,s)} * (indices[${D}])`);let E=s<2?"":` 26 fn i2o_${e}(indices: ${m.indices}) -> u32 { 27 return ${T.join("+")}; 28 }`,z=D=>(_.indicesToOffset=!0,s<2?D:`i2o_${e}(${D})`),A=(...D)=>s===0?"0u":`${m.indices}(${D.map(g).join(",")})`,O=(D,P)=>s<2?`${D}`:`${F(D,P,s)}`,q=(D,P,j)=>s<2?`${D}=${j};`:`${F(D,P,s)}=${j};`,X={},H=(D,P)=>{_.broadcastedIndicesToOffset=!0;let j=`${P.name}broadcastedIndicesTo${e}Offset`;if(j in X)return`${j}(${D})`;let se=[];for(let ke=s-1;ke>=0;ke--){let N=P.indicesGet("outputIndices",ke+P.rank-s);se.push(`${O(w,ke)} * (${N} % ${O(x,ke)})`)}return X[j]=`fn ${j}(outputIndices: ${P.type.indices}) -> u32 { 29 return ${se.length>0?se.join("+"):"0u"}; 30 }`,`${j}(${D})`},Q=(D,P)=>(()=>{if(m.storage===m.value)return`${e}[${D}]=${P};`;if(m.storage==="vec2<u32>"&&m.value==="i32")return`${e}[${D}]=vec2<u32>(u32(${P}), select(0u, 0xFFFFFFFFu, ${P} < 0));`;if(m.storage==="vec2<u32>"&&m.value==="u32")return`${e}[${D}]=vec2<u32>(u32(${P}), 0u);`;if(m.storage==="u32"&&m.value==="vec4<bool>")return`${e}[${D}]=dot(vec4<u32>(0x1, 0x100, 0x10000, 0x1000000), vec4<u32>(${P}));`;throw new Error(`not supported combination of storage type ${m.storage} and value type ${m.value} yet`)})(),oe=D=>(()=>{if(m.storage===m.value)return`${e}[${D}]`;if(m.storage==="vec2<u32>"&&m.value==="i32")return`i32(${e}[${D}].x)`;if(m.storage==="vec2<u32>"&&m.value==="u32")return`u32(${e}[${D}].x)`;if(m.storage==="u32"&&m.value==="vec4<bool>")return`vec4<bool>(bool(${e}[${D}] & 0xFFu), bool(${e}[${D}] & 0xFF00u), bool(${e}[${D}] & 0xFF0000u), bool(${e}[${D}] & 0xFF000000u))`;throw new Error(`not supported combination of storage type ${m.storage} and value type ${m.value} yet`)})(),te=s<2?"":` 31 fn get_${e}ByIndices(indices: ${m.indices}) -> ${c} { 32 return ${oe(`i2o_${e}(indices)`)}; 33 }`,V=s<2?"":(()=>{let D=u.map(j=>`d${j}: u32`).join(", "),P=u.map(j=>`d${j}`).join(", ");return` 34 fn get_${e}(${D}) -> ${c} { 35 return get_${e}ByIndices(${A(P)}); 36 }`})(),W=(...D)=>{if(D.length!==s)throw new Error(`indices length must be ${s}`);let P=D.map(g).join(",");return s===0?oe("0u"):s===1?oe(P[0]):(_.get=!0,_.getByIndices=!0,_.indicesToOffset=!0,`get_${e}(${P})`)},le=D=>s<2?oe(D):(_.getByIndices=!0,_.indicesToOffset=!0,`get_${e}ByIndices(${D})`),ee=s<2?"":` 37 fn set_${e}ByIndices(indices: ${m.indices}, value: ${c}) { 38 ${Q(`i2o_${e}(indices)`,"value")} 39 }`,ae=s<2?"":(()=>{let D=u.map(j=>`d${j}: u32`).join(", "),P=u.map(j=>`d${j}`).join(", ");return` 40 fn set_${e}(${D}, value: ${c}) { 41 set_${e}ByIndices(${A(P)}, value); 42 }`})();return{impl:()=>{let D=[],P=!1;return _.offsetToIndices&&(D.push(k),P=!0),_.indicesToOffset&&(D.push(E),P=!0),_.broadcastedIndicesToOffset&&(Object.values(X).forEach(j=>D.push(j)),P=!0),_.set&&(D.push(ae),P=!0),_.setByIndices&&(D.push(ee),P=!0),_.get&&(D.push(V),P=!0),_.getByIndices&&(D.push(te),P=!0),!i&&P&&D.unshift(`const ${x} = ${m.indices}(${r.join(",")});`,`const ${w} = ${m.indices}(${C.computeStrides(r).join(",")});`),D.join(` 43`)},type:m,offsetToIndices:S,indicesToOffset:z,broadcastedIndicesToOffset:H,indices:A,indicesGet:O,indicesSet:q,set:(...D)=>{if(D.length!==s+1)throw new Error(`indices length must be ${s}`);let P=D[s];if(typeof P!="string")throw new Error("value must be string");let j=D.slice(0,s).map(g).join(",");return s===0?Q("0u",P):s===1?Q(j[0],P):(_.set=!0,_.setByIndices=!0,_.indicesToOffset=!0,`set_${e}(${j}, ${P})`)},setByOffset:Q,setByIndices:(D,P)=>s<2?Q(D,P):(_.setByIndices=!0,_.indicesToOffset=!0,`set_${e}ByIndices(${D}, ${P});`),get:W,getByOffset:oe,getByIndices:le,usage:a,name:e,strides:w,shape:x,rank:s}},R=(e,t,r,a=1)=>Ft(e,t,r,"input",a),G=(e,t,r,a=1)=>Ft(e,t,r,"output",a),Ad=(e,t,r)=>Ft(e,t,r,"atomicOutput",1),Pa=(e,t,r,a=1)=>Ft(e,t,r,"internal",a),Vs=class{constructor(e,t){this.normalizedDispatchGroup=e,this.limits=t,this.internalVariables=[],this.variables=[],this.uniforms=[],this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(e){return`if (global_idx >= ${typeof e=="number"?`${e}u`:e}) { return; }`}mainStart(e=Mt){let t=typeof e=="number"?e:e[0],r=typeof e=="number"?1:e[1],a=typeof e=="number"?1:e[2];if(t>this.limits.maxComputeWorkgroupSizeX||r>this.limits.maxComputeWorkgroupSizeY||a>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${t}, ${r}, ${a}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(t*r*a>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${t}, ${r}, ${a}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let n=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,i=n?`@builtin(global_invocation_id) global_id : vec3<u32>, 44 @builtin(workgroup_id) workgroup_id : vec3<u32>, 45 @builtin(local_invocation_index) local_idx : u32, 46 @builtin(local_invocation_id) local_id : vec3<u32>`:`@builtin(global_invocation_id) global_id : vec3<u32>, 47 @builtin(local_invocation_id) local_id : vec3<u32>, 48 @builtin(local_invocation_index) local_idx : u32, 49 @builtin(workgroup_id) workgroup_id : vec3<u32>, 50 @builtin(num_workgroups) num_workgroups : vec3<u32>`,s=n?`let global_idx = global_id.x; 51 let workgroup_index = workgroup_id.x;`:`let workgroup_index = workgroup_id.z * num_workgroups[0] * num_workgroups[1] + 52 workgroup_id.y * num_workgroups[0] + workgroup_id.x; 53 let global_idx = workgroup_index * ${t*r*a}u + local_idx;`;return`@compute @workgroup_size(${t}, ${r}, ${a}) 54 fn main(${i}) { 55 ${s} 56 `}appendVariableUniforms(e){e.rank!==0&&(e.shape.startsWith("uniforms.")&&this.uniforms.push({name:e.shape.replace("uniforms.",""),type:"u32",length:e.rank}),e.strides.startsWith("uniforms.")&&this.uniforms.push({name:e.strides.replace("uniforms.",""),type:"u32",length:e.rank}))}declareVariable(e,t){if(e.usage==="internal")throw new Error("cannot use internal variable with declareVariable(). use registerInternalVariables() instead.");this.variables.push(e),this.appendVariableUniforms(e);let r=e.usage==="input"?"read":"read_write",a=e.usage==="atomicOutput"?"atomic<i32>":e.type.storage;return`@group(0) @binding(${t}) var<storage, ${r}> ${e.name}: array<${a}>;`}declareVariables(...e){return e.map(t=>this.declareVariable(t,this.variableIndex++)).join(` 57`)}registerInternalVariable(e){if(e.usage!=="internal")throw new Error("cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.");this.internalVariables.push(e),this.appendVariableUniforms(e)}registerInternalVariables(...e){return e.forEach(t=>this.registerInternalVariable(t)),this}registerUniform(e,t,r=1){return this.uniforms.push({name:e,type:t,length:r}),this}registerUniforms(e){return this.uniforms=this.uniforms.concat(e),this}uniformDeclaration(){if(this.uniforms.length===0)return"";let e=[];for(let{name:t,type:r,length:a}of this.uniforms)if(a&&a>4)r==="f16"?e.push(`@align(16) ${t}:array<mat2x4<${r}>, ${Math.ceil(a/8)}>`):e.push(`${t}:array<vec4<${r}>, ${Math.ceil(a/4)}>`);else{let n=a==null||a===1?r:`vec${a}<${r}>`;e.push(`${t}:${n}`)}return` 58 struct Uniforms { ${e.join(", ")} }; 59 @group(0) @binding(${this.variableIndex}) var<uniform> uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(e=>e.impl()).join(` 60`)+this.internalVariables.map(e=>e.impl()).join(` 61`)}get variablesInfo(){if(this.uniforms.length===0)return;let e=t=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(t)];return this.uniforms.map(t=>[e(t.type),t.length??1])}},Od=(e,t)=>new Vs(e,t)}),js,zi,Hs,Gs,Fs,Ks,De,Bd,Rd,mt=U(()=>{J(),re(),we(),ie(),js=(e,t)=>{if(!e||e.length!==1)throw new Error("Transpose requires 1 input.");if(t.length!==0&&t.length!==e[0].dims.length)throw new Error(`perm size ${t.length} does not match input rank ${e[0].dims.length}`)},zi=(e,t)=>t.length!==0?t:[...new Array(e).keys()].reverse(),Hs=(e,t)=>C.sortBasedOnPerm(e,zi(e.length,t)),Gs=(e,t,r,a)=>{let n=`fn perm(i: ${a.type.indices}) -> ${r.type.indices} { 62 var a: ${r.type.indices};`;for(let i=0;i<t;++i)n+=`a[${e[i]}]=i[${i}];`;return n+="return a;}"},Fs=(e,t)=>{let r=[],a=[];for(let n=0;n<e.length;++n)e[n]!==1&&r.push(e[n]),e[t[n]]!==1&&a.push(t[n]);return{newShape:r,newPerm:a}},Ks=(e,t)=>{let r=0;for(let a=0;a<e.length;++a)if(t[e[a]]!==1){if(e[a]<r)return!1;r=e[a]}return!0},De=(e,t)=>{let r=e.dataType,a=e.dims.length,n=zi(a,t),i=Hs(e.dims,n),s=e.dims,u=i,d=a<2||Ks(n,e.dims),l;if(d)return l=_=>{let b=R("input",r,s,4),x=G("output",r,u,4);return` 63 ${_.registerUniform("output_size","u32").declareVariables(b,x)} 64 ${_.mainStart()} 65 ${_.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 66 output[global_idx] = input[global_idx]; 67 }`},{name:"TransposeCopy",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let _=C.size(i);return{outputs:[{dims:i,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(_/64/4)},programUniforms:[{type:12,data:Math.ceil(_/4)}]}},getShaderSource:l};let{newShape:c,newPerm:f}=Fs(e.dims,n),m=C.areEqual(f,[2,3,1]),g=C.areEqual(f,[3,1,2]);if(c.length===2||m||g){s=m?[c[0],c[1]*c[2]]:g?[c[0]*c[1],c[2]]:c,u=[s[1],s[0]];let _=16;return l=b=>{let x=R("a",r,s.length),w=G("output",r,u.length);return` 68 ${b.registerUniform("output_size","u32").declareVariables(x,w)} 69 var<workgroup> tile : array<array<${w.type.value}, ${_+1}>, ${_}>; 70 ${b.mainStart([_,_,1])} 71 let stride = (uniforms.output_shape[1] - 1) / ${_} + 1; 72 let workgroup_id_x = workgroup_index % stride; 73 let workgroup_id_y = workgroup_index / stride; 74 let input_col = workgroup_id_y * ${_}u + local_id.x; 75 let input_row = workgroup_id_x * ${_}u + local_id.y; 76 if (input_row < uniforms.a_shape[0] && input_col < uniforms.a_shape[1]) { 77 tile[local_id.y][local_id.x] = ${x.getByIndices(`${x.type.indices}(input_row, input_col)`)}; 78 } 79 workgroupBarrier(); 80 81 let output_col = workgroup_id_x * ${_}u + local_id.x; 82 let output_row = workgroup_id_y * ${_}u + local_id.y; 83 if (output_row < uniforms.output_shape[0] && output_col < uniforms.output_shape[1]) { 84 ${w.setByIndices(`${w.type.indices}(output_row, output_col)`,"tile[local_id.x][local_id.y]")} 85 } 86 }`},{name:"TransposeShared",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let b=C.size(i);return{outputs:[{dims:i,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(u[1]/_),y:Math.ceil(u[0]/_)},programUniforms:[{type:12,data:b},...Z(s,u)]}},getShaderSource:l}}return l=_=>{let b=R("a",r,s.length),x=G("output",r,u.length);return` 87 ${_.registerUniform("output_size","u32").declareVariables(b,x)} 88 89 ${Gs(n,a,b,x)} 90 91 ${_.mainStart()} 92 ${_.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 93 94 let indices = ${x.offsetToIndices("global_idx")}; 95 let aIndices = perm(indices); 96 97 ${x.setByOffset("global_idx",b.getByIndices("aIndices"))} 98 }`},{name:"Transpose",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:()=>{let _=C.size(i);return{outputs:[{dims:i,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(_/64)},programUniforms:[{type:12,data:_},...Z(s,u)]}},getShaderSource:l}},Bd=(e,t)=>{js(e.inputs,t.perm),e.compute(De(e.inputs[0],t.perm))},Rd=e=>ce({perm:e.perm})}),Zs,Qs,Xs,Ys,Js,eo,to,ro,io,ao,qe,Dd,Nd,Md,Pd,Ud,qd,Wd,Ld,Vd,jd,km=U(()=>{J(),re(),ie(),Ua(),mt(),Zs={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},Qs={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},Xs={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},Ys={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},Js=(e,t)=>{let r=[];for(let a=t-e;a<t;++a)r.push(a);return r},eo=(e,t)=>{let r=[],a=e.length;for(let i=0;i<a;i++)t.indexOf(i)===-1&&r.push(e[i]);let n=t.map(i=>e[i]);return[r,n]},to=(e,t)=>{let r=e.length+t.length,a=[],n=0;for(let i=0;i<r;i++)t.indexOf(i)===-1?a.push(e[n++]):a.push(1);return a},ro=(e,t)=>{for(let r=0;r<e.length;++r)if(e[e.length-r-1]!==t-1-r)return!1;return!0},io=(e,t)=>{let r=[];if(!ro(e,t)){for(let a=0;a<t;++a)e.indexOf(a)===-1&&r.push(a);e.forEach(a=>r.push(a))}return r},ao=(e,t,r,a,n,i,s)=>{let u=r[0].dims,d=C.size(i),l=C.size(s),c=R("_A",r[0].dataType,u),f=G("output",n,i),m=64;d===1&&(m=256);let g=` 99 var<workgroup> aBestValues : array<f32, ${m}>; 100 `,_=b=>` 101 ${b.registerUniform("reduceSize","u32").declareVariables(c,f)} 102 ${g} 103 fn DIV_CEIL(a : u32, b : u32) -> u32 { 104 return ((a - 1u) / b + 1u); 105 } 106 ${b.mainStart(m)} 107 108 let outputIndex = global_idx / ${m}; 109 let offset = outputIndex * uniforms.reduceSize; 110 111 var bestValue = f32(${Xs[a]}); 112 let Length = uniforms.reduceSize; 113 for (var k = local_idx; k < Length; k = k + ${m}) { 114 let candidate = f32(${c.getByOffset("offset + k")}); 115 bestValue = ${Zs[a]}; 116 } 117 aBestValues[local_idx] = bestValue; 118 workgroupBarrier(); 119 120 var reduceSize = min(Length, ${m}u); 121 for (var currentSize = reduceSize / 2u; reduceSize > 1u;
122 currentSize = reduceSize / 2u) { 123 let interval = DIV_CEIL(reduceSize, 2u); 124 if (local_idx < currentSize) { 125 let candidate = aBestValues[local_idx + interval]; 126 bestValue = ${Qs[a]}; 127 aBestValues[local_idx] = bestValue; 128 } 129 reduceSize = interval; 130 workgroupBarrier(); 131 } 132 133 if (local_idx == 0u) { 134 ${f.setByOffset("outputIndex",`${a==="mean"?`${f.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${f.type.storage}(${Ys[a]})`}`)}; 135 } 136 }`;return{name:e,shaderCache:{hint:`${t};${m}`,inputDependencies:["type"]},getShaderSource:_,getRunData:()=>({outputs:[{dims:i,dataType:n}],dispatchGroup:{x:d},programUniforms:[{type:12,data:l}]})}},qe=(e,t,r,a)=>{let n=e.inputs.length===1?r:fa(e.inputs,r),i=n.axes;i.length===0&&!n.noopWithEmptyAxes&&(i=e.inputs[0].dims.map((g,_)=>_));let s=C.normalizeAxes(i,e.inputs[0].dims.length),u=s,d=e.inputs[0],l=io(u,e.inputs[0].dims.length);l.length>0&&(d=e.compute(De(e.inputs[0],l),{inputs:[0],outputs:[-1]})[0],u=Js(u.length,d.dims.length));let[c,f]=eo(d.dims,u),m=c;n.keepDims&&(m=to(c,s)),e.compute(ao(t,n.cacheKey,[d],a,e.inputs[0].dataType,m,f),{inputs:[d]})},Dd=(e,t)=>{qe(e,"ReduceMeanShared",t,"mean")},Nd=(e,t)=>{qe(e,"ReduceL1Shared",t,"l1")},Md=(e,t)=>{qe(e,"ReduceL2Shared",t,"l2")},Pd=(e,t)=>{qe(e,"ReduceLogSumExpShared",t,"logSumExp")},Ud=(e,t)=>{qe(e,"ReduceMaxShared",t,"max")},qd=(e,t)=>{qe(e,"ReduceMinShared",t,"min")},Wd=(e,t)=>{qe(e,"ReduceProdShared",t,"prod")},Ld=(e,t)=>{qe(e,"ReduceSumShared",t,"sum")},Vd=(e,t)=>{qe(e,"ReduceSumSquareShared",t,"sumSquare")},jd=(e,t)=>{qe(e,"ReduceLogSumShared",t,"logSum")}}),We,no,Pr,fa,Le,so,oo,uo,lo,po,co,fo,ho,mo,go,Ve,Hd,Gd,Fd,Kd,Zd,Qd,Xd,Yd,Jd,ep,Ua=U(()=>{J(),re(),we(),ie(),km(),We=e=>{if(!e||e.length===0||e.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(e.length===2&&e[1].dims.length!==1)throw new Error("Invalid axes input dims.")},no=e=>["","",`var value = ${e.getByIndices("input_indices")};`,""],Pr=(e,t,r,a,n,i,s=!1,u=!1)=>{let d=[],l=r[0].dims,c=l.length,f=C.normalizeAxes(n,c),m=!u&&f.length===0;l.forEach((b,x)=>{m||f.indexOf(x)>=0?s&&d.push(1):d.push(b)});let g=d.length,_=C.size(d);return{name:e,shaderCache:t,getShaderSource:b=>{let x=[],w=R("_A",r[0].dataType,c),$=G("output",i,g),k=a(w,$,f),S=k[2];for(let T=0,E=0;T<c;T++)m||f.indexOf(T)>=0?(s&&E++,S=`for(var j${T}: u32 = 0; j${T} < ${l[T]}; j${T}++) { 137 ${k[2].includes("last_index")?`let last_index = j${T};`:""} 138 ${w.indicesSet("input_indices",T,`j${T}`)} 139 ${S} 140 }`):(x.push(`${w.indicesSet("input_indices",T,$.indicesGet("output_indices",E))};`),E++);return` 141 142 ${b.registerUniform("output_size","u32").declareVariables(w,$)} 143 144 ${b.mainStart()} 145 ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 146 var input_indices: ${w.type.indices}; 147 let output_indices = ${$.offsetToIndices("global_idx")}; 148 149 ${x.join(` 150`)} 151 ${k[0]} // init ops for reduce max/min 152 ${k[1]} 153 ${S} 154 ${k[3]} 155 ${k.length===4?$.setByOffset("global_idx","value"):k.slice(4).join(` 156`)} 157 }`},getRunData:()=>({outputs:[{dims:d,dataType:i}],dispatchGroup:{x:Math.ceil(_/64)},programUniforms:[{type:12,data:_},...Z(l,d)]})}},fa=(e,t)=>{let r=[];return e[1].dims[0]>0&&e[1].getBigInt64Array().forEach(a=>r.push(Number(a))),ce({axes:r,keepDims:t.keepDims,noopWithEmptyAxes:t.noopWithEmptyAxes})},Le=(e,t,r,a)=>{let n=e.inputs,i=n.length===1?r:fa(n,r);e.compute(Pr(t,{hint:i.cacheKey,inputDependencies:["rank"]},[n[0]],i.noopWithEmptyAxes&&i.axes.length===0?no:a,i.axes,n[0].dataType,i.keepDims,i.noopWithEmptyAxes),{inputs:[0]})},so=(e,t)=>{We(e.inputs),Le(e,"ReduceLogSum",t,(r,a)=>[`var value = ${a.type.storage}(0);`,"",`value += ${r.getByIndices("input_indices")};`,"value = log(value);"])},oo=(e,t)=>{We(e.inputs),Le(e,"ReduceL1",t,(r,a)=>[`var value = ${a.type.storage}(0);`,"",`value += abs(${r.getByIndices("input_indices")});`,""])},uo=(e,t)=>
vendor: 37,543 bytes, lines 157-519
157{We(e.inputs),Le(e,"ReduceL2",t,(r,a)=>[`var t = ${a.type.value}(0); var value = ${a.type.value}(0);`,"",`t = ${r.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},lo=(e,t)=>{We(e.inputs),Le(e,"ReduceLogSumExp",t,(r,a)=>[`var value = ${a.type.storage}(0);`,"",`value += exp(${r.getByIndices("input_indices")});`,"value = log(value);"])},po=(e,t)=>{We(e.inputs),Le(e,"ReduceMax",t,(r,a,n)=>{let i=[];for(let s=0;s<r.rank;s++)(n.indexOf(s)>=0||n.length===0)&&i.push(r.indicesSet("input_indices",s,0));return[`${i.join(` 158`)}`,`var value = ${r.getByIndices("input_indices")};`,`value = max(value, ${r.getByIndices("input_indices")});`,""]})},co=(e,t)=>{We(e.inputs),Le(e,"ReduceMean",t,(r,a,n)=>{let i=1;for(let s=0;s<r.rank;s++)(n.indexOf(s)>=0||n.length===0)&&(i*=e.inputs[0].dims[s]);return["var sum = f32(0);","",`sum += f32(${r.getByIndices("input_indices")});`,`let value = ${a.type.value}(sum / ${i});`]})},fo=(e,t)=>{We(e.inputs),Le(e,"ReduceMin",t,(r,a,n)=>{let i=[];for(let s=0;s<r.rank;s++)(n.indexOf(s)>=0||n.length===0)&&i.push(`input_indices[${s}] = 0;`);return[`${i.join(` 159`)}`,`var value = ${r.getByIndices("input_indices")};`,`value = min(value, ${r.getByIndices("input_indices")});`,""]})},ho=(e,t)=>{We(e.inputs),Le(e,"ReduceProd",t,(r,a)=>[`var value = ${a.type.storage}(1);`,"",`value *= ${r.getByIndices("input_indices")};`,""])},mo=(e,t)=>{We(e.inputs),Le(e,"ReduceSum",t,(r,a)=>[`var value = ${a.type.storage}(0);`,"",`value += ${r.getByIndices("input_indices")};`,""])},go=(e,t)=>{We(e.inputs),Le(e,"ReduceSumSquare",t,(r,a)=>[`var t = ${a.type.value}(0); var value = ${a.type.value}(0);`,"",`t = ${r.getByIndices("input_indices")}; value += t * t;`,""])},Ve=(e,t,r)=>{if(t.length===0)return r;let a=1,n=1;for(let i=0;i<t.length;i++)t.indexOf(i)===-1?a*=e[i]:n*=e[i];return n<32&&a>1024},Hd=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?co(e,t):Dd(e,t)},Gd=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?oo(e,t):Nd(e,t)},Fd=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?uo(e,t):Md(e,t)},Kd=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?lo(e,t):Pd(e,t)},Zd=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?po(e,t):Ud(e,t)},Qd=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?fo(e,t):qd(e,t)},Xd=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?ho(e,t):Wd(e,t)},Yd=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?mo(e,t):Ld(e,t)},Jd=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?go(e,t):Vd(e,t)},ep=(e,t)=>{Ve(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?so(e,t):jd(e,t)}}),Ci,tp,rp,ha,Tm=U(()=>{J(),we(),Ua(),Ci=e=>{if(!e||e.length===0||e.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(e[0].dataType!==1)throw new Error("Invalid input type.")},tp=(e,t)=>{Ci(e.inputs);let r=(a,n,i)=>{let s=[];for(let u=0;u<a.rank;u++)(i.indexOf(u)>=0||i.length===0)&&s.push(`input_indices[${u}] = 0;`);return[`${s.join(` 160`)}`,`var value = ${a.getByIndices("input_indices")}; 161var best_index : i32 = 0;`,`if (${a.getByIndices("input_indices")} ${t.selectLastIndex>0?"<=":"<"} value) { 162 value = ${a.getByIndices("input_indices")}; 163 best_index = i32(last_index); 164 }`,"",n.setByOffset("global_idx","best_index")]};e.compute(Pr("ArgMin",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],r,[t.axis],7,t.keepDims),{inputs:[0]})},rp=(e,t)=>{Ci(e.inputs);let r=(a,n,i)=>{let s=[];for(let u=0;u<a.rank;u++)(i.indexOf(u)>=0||i.length===0)&&s.push(`input_indices[${u}] = 0;`);return[`${s.join(` 165`)}`,`var value = ${a.getByIndices("input_indices")}; 166var best_index : i32 = 0;`,`if (${a.getByIndices("input_indices")} ${t.selectLastIndex>0?">=":">"} value) { 167 value = ${a.getByIndices("input_indices")}; 168 best_index = i32(last_index); 169 }`,"",n.setByOffset("global_idx","best_index")]};e.compute(Pr("argMax",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],r,[t.axis],7,t.keepDims),{inputs:[0]})},ha=e=>ce(e)}),_o,Tr,yo,bo,$o,or,wo,ip,qa=U(()=>{J(),re(),Ma(),ie(),_o=(e,t)=>{let r=e[0],a=e[1],n=e[2],i=e[3],s=e[4],u=e[5];if(s&&u)throw new Error("Attention cannot have both past and attention_bias");if(r.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let d=r.dims[0],l=r.dims[1],c=r.dims[2];if(n.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(a.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(a.dims[0]!==c)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(n.dims[0]!==a.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let f=n.dims[0]/3,m=f,g=m;if(t.qkvHiddenSizes.length>0){if(t.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let k of t.qkvHiddenSizes)if(k%t.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");f=t.qkvHiddenSizes[0],m=t.qkvHiddenSizes[1],g=t.qkvHiddenSizes[2]}let _=l;if(f!==m)throw new Error("qkv_hidden_sizes first element should be same as the second");if(n.dims[0]!==f+m+g)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let b=0;if(s){if(m!==g)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(s.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(s.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(s.dims[1]!==d)throw new Error('Input "past" second dimension must be batch_size');if(s.dims[2]!==t.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(s.dims[4]!==m/t.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');t.pastPresentShareBuffer||(b=s.dims[3])}let x=_+b,w=-1,$=0;if(i)throw new Error("Mask not supported");if(s)throw new Error("past is not supported");if(u){if(u.dims.length!==4)throw new Error('Input "attention_bias" must have 4 dimensions');if(u.dims[0]!==d||u.dims[1]!==t.numHeads||u.dims[2]!==l||u.dims[3]!==x)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:d,sequenceLength:l,pastSequenceLength:b,kvSequenceLength:_,totalSequenceLength:x,maxSequenceLength:w,inputHiddenSize:c,hiddenSize:f,vHiddenSize:g,headSize:Math.floor(f/t.numHeads),vHeadSize:Math.floor(g/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:$,scale:t.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},Tr=(e,t,r)=>t&&e?` 170 let total_sequence_length_input = u32(${t.getByOffset("0")}); 171 let present_sequence_length = max(total_sequence_length_input, uniforms.past_sequence_length); 172 let is_subsequent_prompt: bool = sequence_length > 1 && sequence_length != total_sequence_length_input; 173 let is_first_prompt: bool = is_subsequent_prompt == false && sequence_length == total_sequence_length_input; 174 total_sequence_length = u32(${e==null?void 0:e.getByOffset("batchIdx")}) + 1; 175 var past_sequence_length: u32 = 0; 176 if (is_first_prompt == false) { 177 past_sequence_length = total_sequence_length - sequence_length; 178 } 179 `:` 180 ${r?"let past_sequence_length = uniforms.past_sequence_length":""}; 181 let present_sequence_length = total_sequence_length; 182 `,yo=(e,t,r,a,n,i,s,u)=>{let d=$e(s?1:i),l=64,c=i/d;c<l&&(l=32);let f=Math.ceil(i/d/l),m=[{type:12,data:t},{type:12,data:r},{type:12,data:a},{type:12,data:n},{type:12,data:c},{type:12,data:f}],g=Se(e.dataType,d),_=Ee(1,d),b=["type"];s&&b.push("type"),u&&b.push("type");let x=w=>{let $=G("x",e.dataType,e.dims,d),k=[$],S=s?R("seq_lens",s.dataType,s.dims):void 0;S&&k.push(S);let T=u?R("total_sequence_length_input",u.dataType,u.dims):void 0;T&&k.push(T);let E=Ee(e.dataType),z=[{name:"batch_size",type:"u32"},{name:"num_heads",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"sequence_length",type:"u32"},{name:"total_sequence_length",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` 183 var<workgroup> thread_max: array<f32, ${l}>; 184 var<workgroup> thread_sum: array<f32, ${l}>; 185 ${w.registerUniforms(z).declareVariables(...k)} 186 ${w.mainStart([l,1,1])} 187 let batchIdx = workgroup_id.z / uniforms.num_heads; 188 let headIdx = workgroup_id.z % uniforms.num_heads; 189 let sequence_length = uniforms.sequence_length; 190 var total_sequence_length = uniforms.total_sequence_length; 191 ${Tr(S,T,!1)} 192 let local_offset = local_idx * uniforms.elements_per_thread; 193 let offset = (global_idx / ${l}) * uniforms.total_sequence_length + local_offset; 194 let seq_causal_length = ${s?"u32(past_sequence_length + workgroup_id.y + 1)":"total_sequence_length"}; 195 var thread_max_vector = ${_}(-3.402823e+38f); 196 for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { 197 thread_max_vector = max(${_}(x[offset + i]), thread_max_vector); 198 } 199 thread_max[local_idx] = ${(()=>{switch(d){case 1:return"thread_max_vector";case 2:return"max(thread_max_vector.x, thread_max_vector.y)";case 4:return"max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))";default:throw new Error(`Unsupported components: ${d}`)}})()}; 200 workgroupBarrier(); 201 202 var max_value = f32(-3.402823e+38f); 203 for (var i = 0u; i < ${l}; i++) { 204 max_value = max(thread_max[i], max_value); 205 } 206 207 var sum_vector = ${_}(0); 208 for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { 209 sum_vector += exp(${_}(x[offset + i]) - max_value); 210 } 211 thread_sum[local_idx] = ${(()=>{switch(d){case 1:return"sum_vector";case 2:return"sum_vector.x + sum_vector.y";case 4:return"sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w";default:throw new Error(`Unsupported components: ${d}`)}})()}; 212 workgroupBarrier(); 213 214 var sum: f32 = 0; 215 for (var i = 0u; i < ${l}; i++) { 216 sum += thread_sum[i]; 217 } 218 219 if (sum == 0) { 220 for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { 221 x[offset + i] = ${$.type.value}(${E}(1.0) / ${E}(seq_causal_length)); 222 } 223 } else { 224 for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { 225 var f32input = ${_}(x[offset + i]); 226 x[offset + i] = ${$.type.value}(exp(f32input - max_value) / sum); 227 } 228 } 229 ${s?` 230 for (var total_seq_id: u32 = seq_causal_length; total_seq_id + local_offset < uniforms.total_sequence_length; total_seq_id++) { 231 x[offset + total_seq_id] = ${$.type.value}(${E}(0)); 232 }`:""}; 233 }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${l};${g};${d}`,inputDependencies:b},getShaderSource:x,getRunData:()=>({outputs:[],dispatchGroup:{x:1,y:n,z:t*r},programUniforms:m})}},bo=(e,t,r,a,n,i,s,u,d)=>{let l=s+i.kvSequenceLength,c=[i.batchSize,i.numHeads,i.sequenceLength,l],f=e>1&&a,m=i.kvNumHeads?i.kvNumHeads:i.numHeads,g=f?[i.batchSize,m,l,i.headSize]:void 0,_=i.nReps?i.nReps:1,b=i.scale===0?1/Math.sqrt(i.headSize):i.scale,x=$e(i.headSize),w=i.headSize/x,$=12,k={x:Math.ceil(l/$),y:Math.ceil(i.sequenceLength/$),z:i.batchSize*i.numHeads},S=[{type:12,data:i.sequenceLength},{type:12,data:w},{type:12,data:l},{type:12,data:i.numHeads},{type:12,data:i.headSize},{type:1,data:b},{type:12,data:s},{type:12,data:i.kvSequenceLength},{type:12,data:_}],T=f&&a&&C.size(a.dims)>0,E=["type","type"];T&&E.push("type"),n&&E.push("type"),u&&E.push("type"),d&&E.push("type");let z=[{dims:c,dataType:t.dataType,gpuDataType:0}];f&&z.push({dims:g,dataType:t.dataType,gpuDataType:0});let A=O=>{let q=R("q",t.dataType,t.dims,x),X=R("key",r.dataType,r.dims,x),H=[q,X];if(T){let ee=R("past_key",a.dataType,a.dims,x);H.push(ee)}n&&H.push(R("attention_bias",n.dataType,n.dims));let Q=u?R("seq_lens",u.dataType,u.dims):void 0;Q&&H.push(Q);let oe=d?R("total_sequence_length_input",d.dataType,d.dims):void 0;oe&&H.push(oe);let te=G("output",t.dataType,c),V=[te];f&&V.push(G("present_key",t.dataType,g,x));let W=Ee(1,x),le=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` 234 const TILE_SIZE = ${$}u; 235 236 var<workgroup> tileQ: array<${q.type.storage}, ${$*$}>; 237 var<workgroup> tileK: array<${q.type.storage}, ${$*$}>; 238 ${O.registerUniforms(le).declareVariables(...H,...V)} 239 ${O.mainStart([$,$,1])} 240 // x holds the N and y holds the M 241 let headIdx = workgroup_id.z % uniforms.num_heads; 242 let kvHeadIdx = ${_===1?"headIdx":"headIdx / uniforms.n_reps"}; 243 let kv_num_heads = ${_===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; 244 let batchIdx = workgroup_id.z / uniforms.num_heads; 245 let m = workgroup_id.y * TILE_SIZE; 246 let n = workgroup_id.x * TILE_SIZE; 247 let sequence_length = uniforms.M; 248 var total_sequence_length = uniforms.N; 249 ${Tr(Q,oe,!0)} 250 let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; 251 let qOffset = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; 252 ${T&&f?"let pastKeyOffset = absKvHeadIdx * uniforms.past_sequence_length * uniforms.K;":""}; 253 let kOffset = absKvHeadIdx * uniforms.kv_sequence_length * uniforms.K; 254 ${f?"let presentKeyOffset = absKvHeadIdx * uniforms.N * uniforms.K;":""} 255 var value = ${W}(0); 256 for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { 257 if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) { 258 tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x]; 259 } 260 if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) { 261 var idx = TILE_SIZE * local_id.y + local_id.x; 262 ${T&&f?` 263 if (n + local_id.y < past_sequence_length) { 264 tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; 265 } else if (n + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { 266 tileK[idx] = key[kOffset + (n + local_id.y - past_sequence_length) * uniforms.K + w + local_id.x]; 267 }`:` 268 if (n + local_id.y < uniforms.kv_sequence_length) { 269 tileK[idx] = key[kOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; 270 }`} 271 ${f?`if (n + local_id.y < present_sequence_length) { 272 present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx]; 273 }`:""} 274 } 275 workgroupBarrier(); 276 277 for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) { 278 value += ${W}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]); 279 } 280 281 workgroupBarrier(); 282 } 283 284 if (global_id.y < uniforms.M && global_id.x < total_sequence_length) { 285 let headOffset = workgroup_id.z * uniforms.M * uniforms.N; 286 let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x; 287 var sum: f32 = ${(()=>{switch(x){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw new Error(`Unsupported components: ${x}`)}})()}; 288 output[outputIdx] = ${te.type.value} (sum * uniforms.alpha) + ${n?"attention_bias[outputIdx]":"0.0"}; 289 } 290 }`};return{name:"AttentionProbs",shaderCache:{hint:`${x};${n!==void 0};${a!==void 0};${e}`,inputDependencies:E},getRunData:()=>({outputs:z,dispatchGroup:k,programUniforms:S}),getShaderSource:A}},$o=(e,t,r,a,n,i,s=void 0,u=void 0)=>{let d=i+n.kvSequenceLength,l=n.nReps?n.nReps:1,c=n.vHiddenSize*l,f=e>1&&a,m=n.kvNumHeads?n.kvNumHeads:n.numHeads,g=f?[n.batchSize,m,d,n.headSize]:void 0,_=[n.batchSize,n.sequenceLength,c],b=12,x={x:Math.ceil(n.vHeadSize/b),y:Math.ceil(n.sequenceLength/b),z:n.batchSize*n.numHeads},w=[{type:12,data:n.sequenceLength},{type:12,data:d},{type:12,data:n.vHeadSize},{type:12,data:n.numHeads},{type:12,data:n.headSize},{type:12,data:c},{type:12,data:i},{type:12,data:n.kvSequenceLength},{type:12,data:l}],$=f&&a&&C.size(a.dims)>0,k=["type","type"];$&&k.push("type"),s&&k.push("type"),u&&k.push("type");let S=[{dims:_,dataType:t.dataType,gpuDataType:0}];f&&S.push({dims:g,dataType:t.dataType,gpuDataType:0});let T=E=>{let z=R("probs",t.dataType,t.dims),A=R("v",r.dataType,r.dims),O=[z,A];$&&O.push(R("past_value",a.dataType,a.dims));let q=s?R("seq_lens",s.dataType,s.dims):void 0;s&&O.push(q);let X=u?R("total_sequence_length_input",u.dataType,u.dims):void 0;u&&O.push(X);let H=[G("output",t.dataType,_)];f&&H.push(G("present_value",t.dataType,g));let Q=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}];return` 291 const TILE_SIZE = ${b}u; 292 var<workgroup> tileQ: array<${z.type.value}, ${b*b}>; 293 var<workgroup> tileV: array<${z.type.value}, ${b*b}>; 294 ${E.registerUniforms(Q).declareVariables(...O,...H)} 295 ${E.mainStart([b,b,1])} 296 let headIdx = workgroup_id.z % uniforms.num_heads; 297 let batchIdx = workgroup_id.z / uniforms.num_heads; 298 let kvHeadIdx = ${l===1?"headIdx":"headIdx / uniforms.n_reps"}; 299 let kv_num_heads = ${l===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; 300 let m = global_id.y; 301 let n = global_id.x; 302 let sequence_length = uniforms.M; 303 var total_sequence_length = uniforms.K; 304 ${Tr(q,X,!0)} 305 let offsetA = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; 306 let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; // kvHeadIdx is relative to the batch 307 ${$&&f?"let pastValueOffset = absKvHeadIdx * uniforms.N * uniforms.past_sequence_length + n;":""}; 308 let vOffset = absKvHeadIdx * uniforms.N * uniforms.kv_sequence_length + n; 309 ${f?"let presentValueOffset = absKvHeadIdx * uniforms.N * uniforms.K + n;":""} 310 var value = ${z.type.storage}(0); 311 for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { 312 if (m < uniforms.M && w + local_id.x < uniforms.K) { 313 tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x]; 314 } 315 if (n < uniforms.N && w + local_id.y < uniforms.K) { 316 var idx = TILE_SIZE * local_id.y + local_id.x; 317 ${$&&f?` 318 if (w + local_id.y < past_sequence_length) { 319 tileV[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N]; 320 } else if (w + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { 321 tileV[idx] = v[vOffset + (w + local_id.y - past_sequence_length) * uniforms.N]; 322 } 323 `:` 324 if (w + local_id.y < uniforms.kv_sequence_length) { 325 tileV[idx] = v[vOffset + (w + local_id.y) * uniforms.N]; 326 }`} 327 ${f?` 328 if (w + local_id.y < present_sequence_length) { 329 present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileV[idx]; 330 }`:""} 331 } 332 workgroupBarrier(); 333 for (var k: u32 = 0u; k < TILE_SIZE && w+k < total_sequence_length; k++) { 334 value += tileQ[TILE_SIZE * local_id.y + k] * tileV[TILE_SIZE * k + local_id.x]; 335 } 336 workgroupBarrier(); 337 } 338 339 // we need to transpose output from BNSH_v to BSND_v 340 if (m < uniforms.M && n < uniforms.N) { 341 let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size 342 + headIdx * uniforms.N + n; 343 output[outputIdx] = value; 344 } 345 }`};return{name:"AttentionScore",shaderCache:{hint:`${a!==void 0};${e}`,inputDependencies:k},getRunData:()=>({outputs:S,dispatchGroup:x,programUniforms:w}),getShaderSource:T}},or=(e,t,r,a,n,i,s,u,d,l,c=void 0,f=void 0)=>{let m=Math.min(e.outputCount,1+(s?1:0)+(u?1:0)),g=m>1?l.pastSequenceLength:0,_=g+l.kvSequenceLength,b=d&&C.size(d.dims)>0?d:void 0,x=[t,r];m>1&&s&&C.size(s.dims)>0&&x.push(s),b&&x.push(b),c&&x.push(c),f&&x.push(f);let w=e.compute(bo(m,t,r,s,b,l,g,c,f),{inputs:x,outputs:m>1?[-1,1]:[-1]})[0];e.compute(yo(w,l.batchSize,l.numHeads,g,l.sequenceLength,_,c,f),{inputs:c&&f?[w,c,f]:[w],outputs:[]});let $=[w,a];m>1&&u&&C.size(u.dims)>0&&$.push(u),c&&$.push(c),f&&$.push(f),e.compute($o(m,w,a,u,l,g,c,f),{inputs:$,outputs:m>1?[0,2]:[0]})},wo=(e,t)=>{let r=[t.batchSize,t.numHeads,t.sequenceLength,t.headSize],a=t.sequenceLength,n=t.inputHiddenSize,i=t.headSize,s=12,u={x:Math.ceil(t.headSize/s),y:Math.ceil(t.sequenceLength/s),z:t.batchSize*t.numHeads},d=[e.inputs[0],e.inputs[1],e.inputs[2]],l=[{type:12,data:a},{type:12,data:n},{type:12,data:i},{type:12,data:t.numHeads},{type:12,data:t.headSize},{type:12,data:t.hiddenSize},{type:12,data:t.hiddenSize+t.hiddenSize+t.vHiddenSize}],c=f=>{let m=G("output_q",d[0].dataType,r),g=G("output_k",d[0].dataType,r),_=G("output_v",d[0].dataType,r),b=R("input",d[0].dataType,d[0].dims),x=R("weight",d[1].dataType,d[1].dims),w=R("bias",d[2].dataType,d[2].dims),$=b.type.storage,k=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` 346 const TILE_SIZE = ${s}u; 347 var<workgroup> tileInput: array<${$}, ${s*s}>; 348 var<workgroup> tileWeightQ: array<${$}, ${s*s}>; 349 var<workgroup> tileWeightK: array<${$}, ${s*s}>; 350 var<workgroup> tileWeightV: array<${$}, ${s*s}>; 351 ${f.registerUniforms(k).declareVariables(b,x,w,m,g,_)} 352 ${f.mainStart([s,s,1])} 353 let batchIndex = workgroup_id.z / uniforms.num_heads; 354 let headNumber = workgroup_id.z % uniforms.num_heads; 355 let m = global_id.y; 356 let n = global_id.x; 357 358 let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K; 359 let biasOffsetQ = headNumber * uniforms.head_size; 360 let biasOffsetK = uniforms.hidden_size + biasOffsetQ; 361 let biasOffsetV = uniforms.hidden_size + biasOffsetK; 362 363 var valueQ = ${$}(0); 364 var valueK = ${$}(0); 365 var valueV = ${$}(0); 366 for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { 367 if (m < uniforms.M && w + local_id.x < uniforms.K) { 368 tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x]; 369 } 370 if (n < uniforms.N && w + local_id.y < uniforms.K) { 371 let offset = n + (w + local_id.y) * uniforms.ldb; 372 tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset]; 373 tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset]; 374 tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset]; 375 } 376 workgroupBarrier(); 377 for (var k: u32 = 0u; k<TILE_SIZE && w+k < uniforms.K; k++) { 378 let inputTileOffset = TILE_SIZE * local_id.y + k; 379 let weightTileOffset = TILE_SIZE * k + local_id.x; 380 valueQ += tileInput[inputTileOffset] * tileWeightQ[weightTileOffset]; 381 valueK += tileInput[inputTileOffset] * tileWeightK[weightTileOffset]; 382 valueV += tileInput[inputTileOffset] * tileWeightV[weightTileOffset]; 383 } 384 385 workgroupBarrier(); 386 } 387 388 let headOffset = (m * uniforms.N + n) % uniforms.head_size; 389 valueQ += bias[headOffset + biasOffsetQ]; 390 valueK += bias[headOffset + biasOffsetK]; 391 valueV += bias[headOffset + biasOffsetV]; 392 393 let offset = workgroup_id.z * uniforms.M * uniforms.N; 394 if (m < uniforms.M && n < uniforms.N) { 395 let outputIdx = offset + m * uniforms.N + n; 396 output_q[outputIdx] = valueQ; 397 output_k[outputIdx] = valueK; 398 output_v[outputIdx] = valueV; 399 } 400 }`};return e.compute({name:"AttentionPrepare",shaderCache:{inputDependencies:["type","type","type"]},getRunData:()=>({outputs:[{dims:r,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:r,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:r,dataType:e.inputs[0].dataType,gpuDataType:0}],dispatchGroup:u,programUniforms:l}),getShaderSource:c},{inputs:d,outputs:[-1,-1,-1]})},ip=(e,t)=>{let r=_o(e.inputs,t),[a,n,i]=wo(e,r);return or(e,a,n,i,e.inputs[4],void 0,void 0,void 0,e.inputs[5],r)}}),vo,xo,So,ap,Im=U(()=>{Ke(),J(),re(),we(),ie(),vo=(e,t)=>{if(!e||e.length!==5)throw new Error("BatchNormalization requires 5 inputs");let r=(a,n,i)=>{let s=n.length;if(s!==a.length)throw new Error(`${i}: num dimensions != ${s}`);n.forEach((u,d)=>{if(u!==a[d])throw new Error(`${i}: dim[${d}] do not match`)})};if(e[0].dims.length>1){let a=t.format==="NHWC"?t.spatial?e[0].dims.slice(-1):e[0].dims.slice(-1).concat(e[0].dims.slice(1,e[0].dims.length-1)):e[0].dims.slice(1,t.spatial?2:void 0);r(e[1].dims,a,"Invalid input scale"),r(e[2].dims,a,"Invalid input B"),r(e[3].dims,a,"Invalid input mean"),r(e[4].dims,a,"Invalid input var")}else r(e[1].dims,[1],"Invalid input scale"),r(e[2].dims,[1],"Invalid input B"),r(e[3].dims,[1],"Invalid input mean"),r(e[4].dims,[1],"Invalid input var")},xo=(e,t)=>{let{epsilon:r,spatial:a,format:n}=t,i=e[0].dims,s=a?$e(i[i.length-1]):1,u=n==="NHWC"&&i.length>1?s:1,d=C.size(i)/s,l=a,c=l?i.length:i,f=R("x",e[0].dataType,e[0].dims,s),m=R("scale",e[1].dataType,e[1].dims,u),g=R("bias",e[2].dataType,e[2].dims,u),_=R("inputMean",e[3].dataType,e[3].dims,u),b=R("inputVar",e[4].dataType,e[4].dims,u),x=G("y",e[0].dataType,c,s),w=()=>{let k="";if(a)k=`let cOffset = ${i.length===1?"0u":n==="NHWC"?`outputIndices[${i.length-1}] / ${s}`:"outputIndices[1]"};`;else if(n==="NCHW")k=` 401 ${x.indicesSet("outputIndices","0","0")} 402 let cOffset = ${x.indicesToOffset("outputIndices")};`;else{k=`var cIndices = ${m.type.indices}(0); 403 cIndices[0] = outputIndices[${i.length-1}];`;for(let S=1;S<m.rank;S++)k+=`cIndices[${S}] = outputIndices[${S}];`;k+=`let cOffset = ${m.indicesToOffset("cIndices")};`}return k},$=k=>` 404 const epsilon = ${r}; 405 ${k.registerUniform("outputSize","u32").declareVariables(f,m,g,_,b,x)} 406 ${k.mainStart()} 407 ${k.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 408 var outputIndices = ${x.offsetToIndices(`global_idx * ${s}`)}; 409 ${w()} 410 let scale = ${m.getByOffset("cOffset")}; 411 let bias = ${g.getByOffset("cOffset")}; 412 let inputMean = ${_.getByOffset("cOffset")}; 413 let inputVar = ${b.getByOffset("cOffset")}; 414 let x = ${f.getByOffset("global_idx")}; 415 let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias; 416 ${x.setByOffset("global_idx","value")} 417 }`;return{name:"BatchNormalization",shaderCache:{hint:`${t.epsilon}_${t.format}_${a}_${s}`,inputDependencies:l?["rank","type","type","type","type"]:void 0},getShaderSource:$,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:l?[{type:12,data:d},...Z(i)]:[{type:12,data:d}]})}},So=e=>ce(e),ap=(e,t)=>{let{inputs:r,outputCount:a}=e,n=So({...t,outputCount:a});if(ye.webgpu.validateInputContent&&vo(r,n),t.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");e.compute(xo(r,n))}}),ko,To,np,Em=U(()=>{re(),ie(),ko=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(e[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},To=e=>{let t=e[0].dims,r=e[0].dims[2],a=C.size(t)/4,n=e[0].dataType,i=R("input",n,t,4),s=R("bias",n,[r],4),u=R("residual",n,t,4),d=G("output",n,t,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)}}),getShaderSource:l=>` 418 const channels = ${r}u / 4; 419 ${l.declareVariables(i,s,u,d)} 420 421 ${l.mainStart()} 422 ${l.guardAgainstOutOfBoundsWorkgroupSizes(a)} 423 let value = ${i.getByOffset("global_idx")} 424 + ${s.getByOffset("global_idx % channels")} + ${u.getByOffset("global_idx")}; 425 ${d.setByOffset("global_idx","value")} 426 }`}},np=e=>{ko(e.inputs),e.compute(To(e.inputs))}}),Io,pe,sp,op,up,lp,dp,pp,cp,fp,hp,Eo,mp,gp,_p,yp,rr,bp,Rr,$p,wp,vp,xp,Sp,kp,Tp,Ip,Ep,zp,Cp,Ap,Op,Bp,Rp,Dp,Ai,Np,ma,ga,Mp,Pp,Up,zo,Co,qp,Wa=U(()=>{J(),re(),we(),ie(),Io=(e,t,r,a,n,i,s)=>{let u=Math.ceil(t/4),d="";typeof n=="string"?d=`${n}(a)`:d=n("a");let l=R("inputData",r,[u],4),c=G("outputData",a,[u],4),f=[{name:"vec_size",type:"u32"}];return s&&f.push(...s),` 427 ${e.registerUniforms(f).declareVariables(l,c)} 428 429 ${i??""} 430 431 ${e.mainStart()} 432 ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} 433 434 let a = ${l.getByOffset("global_idx")}; 435 ${c.setByOffset("global_idx",d)} 436 }`},pe=(e,t,r,a,n,i=e.dataType,s,u)=>{let d=[{type:12,data:Math.ceil(C.size(e.dims)/4)}];return s&&d.push(...s),{name:t,shaderCache:{hint:n,inputDependencies:["type"]},getShaderSource:l=>Io(l,C.size(e.dims),e.dataType,i,r,a,u),getRunData:l=>({outputs:[{dims:e.dims,dataType:i}],dispatchGroup:{x:Math.ceil(C.size(l[0].dims)/64/4)},programUniforms:d})}},sp=e=>{e.compute(pe(e.inputs[0],"Abs","abs"))},op=e=>{e.compute(pe(e.inputs[0],"Acos","acos"))},up=e=>{e.compute(pe(e.inputs[0],"Acosh","acosh"))},lp=e=>{e.compute(pe(e.inputs[0],"Asin","asin"))},dp=e=>{e.compute(pe(e.inputs[0],"Asinh","asinh"))},pp=e=>{e.compute(pe(e.inputs[0],"Atan","atan"))},cp=e=>{e.compute(pe(e.inputs[0],"Atanh","atanh"))},fp=e=>ce(e),hp=(e,t)=>{let r;switch(t.to){case 10:r="vec4<f16>";break;case 1:r="vec4<f32>";break;case 12:r="vec4<u32>";break;case 6:r="vec4<i32>";break;case 9:r="vec4<bool>";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${t.to}`)}e.compute(pe(e.inputs[0],"Cast",r,void 0,t.cacheKey,t.to))},Eo=e=>{let t,r,a=e.length>=2&&e[1].data!==0,n=e.length>=3&&e[2].data!==0;switch(e[0].dataType){case 1:t=a?e[1].getFloat32Array()[0]:-34028234663852886e22,r=n?e[2].getFloat32Array()[0]:34028234663852886e22;break;case 10:t=a?e[1].getUint16Array()[0]:64511,r=n?e[2].getUint16Array()[0]:31743;break;default:throw new Error("Unsupport data type")}return ce({min:t,max:r})},mp=(e,t)=>{let r=t||Eo(e.inputs),a=Ee(e.inputs[0].dataType);e.compute(pe(e.inputs[0],"Clip",n=>`clamp(${n}, vec4<${a}>(uniforms.min), vec4<${a}>(uniforms.max))`,void 0,r.cacheKey,void 0,[{type:e.inputs[0].dataType,data:r.min},{type:e.inputs[0].dataType,data:r.max}],[{name:"min",type:a},{name:"max",type:a}]),{inputs:[0]})},gp=e=>{e.compute(pe(e.inputs[0],"Ceil","ceil"))},_p=e=>{e.compute(pe(e.inputs[0],"Cos","cos"))},yp=e=>{e.compute(pe(e.inputs[0],"Cosh","cosh"))},rr=e=>ce(e),bp=(e,t)=>{let r=Ee(e.inputs[0].dataType);e.compute(pe(e.inputs[0],"Elu",a=>`elu_vf32(${a})`,` 437 const elu_alpha_ = ${r}(${t.alpha}); 438 439 fn elu_f32(a: ${r}) -> ${r} { 440 return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0); 441 } 442 443 fn elu_vf32(v: vec4<${r}>) -> vec4<${r}> { 444 return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); 445 }`,t.cacheKey))},Rr=(e="f32")=>` 446const r0: ${e} = 0.3275911; 447const r1: ${e} = 0.254829592; 448const r2: ${e} = -0.284496736; 449const r3: ${e} = 1.421413741; 450const r4: ${e} = -1.453152027; 451const r5: ${e} = 1.061405429; 452 453fn erf_vf32(v: vec4<${e}>) -> vec4<${e}> { 454 let absv = abs(v); 455 let x = 1.0 / (1.0 + r0 * absv); 456 return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); 457}`,$p=e=>{let t=Ee(e.inputs[0].dataType);e.compute(pe(e.inputs[0],"Erf",r=>`erf_vf32(${r})`,Rr(t)))},wp=e=>{e.compute(pe(e.inputs[0],"Exp","exp"))},vp=e=>{e.compute(pe(e.inputs[0],"Floor","floor"))},xp=e=>{let t=Ee(e.inputs[0].dataType);e.compute(pe(e.inputs[0],"Gelu",r=>`0.5 * ${r} * (1.0 + erf_vf32(${r} * 0.7071067811865475))`,Rr(t)))},Sp=(e,t)=>{let r=Ee(e.inputs[0].dataType);e.compute(pe(e.inputs[0],"LeakyRelu",a=>`select(leaky_relu_alpha_ * ${a}, ${a}, ${a} >= vec4<${r}>(0.0))`,`const leaky_relu_alpha_ = ${r}(${t.alpha});`,t.cacheKey))},kp=e=>{e.compute(pe(e.inputs[0],"Not",t=>`!${t}`))},Tp=e=>{e.compute(pe(e.inputs[0],"Neg",t=>`-${t}`))},Ip=e=>{e.compute(pe(e.inputs[0],"Reciprocal",t=>`1.0/${t}`))},Ep=e=>{let t=Ee(e.inputs[0].dataType);e.compute(pe(e.inputs[0],"Relu",r=>`select(vec4<${t}>(0.0), ${r}, ${r} > vec4<${t}>(0.0))`))},zp=e=>{e.compute(pe(e.inputs[0],"Sigmoid",t=>`(1.0 / (1.0 + exp(-${t})))`))},Cp=e=>ce(e),Ap=(e,t)=>{let r=Ee(e.inputs[0].dataType);e.compute(pe(e.inputs[0],"HardSigmoid",a=>`max(vec4<${r}>(0.0), min(vec4<${r}>(1.0), ${t.alpha} * ${a} + vec4<${r}>(${t.beta})))`,void 0,t.cacheKey))},Op=e=>{e.compute(pe(e.inputs[0],"Sin","sin"))},Bp=e=>{e.compute(pe(e.inputs[0],"Sinh","sinh"))},Rp=e=>{e.compute(pe(e.inputs[0],"Sqrt","sqrt"))},Dp=e=>{e.compute(pe(e.inputs[0],"Tan","tan"))},Ai=e=>`sign(${e}) * (1 - exp(-2 * abs(${e}))) / (1 + exp(-2 * abs(${e})))`,Np=e=>{e.compute(pe(e.inputs[0],"Tanh",Ai))},ma=(e="f32")=>` 458const fast_gelu_a: ${e} = 0.5; 459const fast_gelu_b: ${e} = 0.7978845608028654; 460const fast_gelu_c: ${e} = 0.035677408136300125; 461 462fn tanh_v(v: vec4<${e}>) -> vec4<${e}> { 463 return ${Ai("v")}; 464} 465`,ga=e=>`(fast_gelu_a + fast_gelu_a * tanh_v(${e} * (fast_gelu_c * ${e} * ${e} + fast_gelu_b))) * ${e}`,Mp=e=>{let t=Ee(e.inputs[0].dataType);e.compute(pe(e.inputs[0],"FastGelu",ga,ma(t),void 0,e.inputs[0].dataType))},Pp=(e,t)=>{let r=Ee(e.inputs[0].dataType);return e.compute(pe(e.inputs[0],"ThresholdedRelu",a=>`select(vec4<${r}>(0.0), ${a}, ${a} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${r}>(${t.alpha});`,t.cacheKey)),0},Up=e=>{e.compute(pe(e.inputs[0],"Log","log"))},zo=(e,t)=>` 466const alpha = vec4<${e}>(${t}); 467const one = ${e}(1.0); 468const zero = ${e}(0.0); 469 470fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { 471 let v = x *alpha; 472 var x1 : vec4<${e}>; 473 for (var i = 0; i < 4; i = i + 1) { 474 if (v[i] >= zero) { 475 x1[i] = one / (one + exp(-v[i])); 476 } else { 477 x1[i] = one - one / (one + exp(v[i])); 478 } 479 } 480 return x * x1; 481} 482`,Co=e=>`quick_gelu_impl(${e})`,qp=(e,t)=>{let r=Ee(e.inputs[0].dataType);e.compute(pe(e.inputs[0],"QuickGelu",Co,zo(r,t.alpha),t.cacheKey,e.inputs[0].dataType))}}),Ao,Oo,Wp,zm=U(()=>{re(),ie(),Wa(),Ao=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(e[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},Oo=e=>{let t=e[0].dims.slice();t[2]=t[2]/2;let r=R("input",e[0].dataType,e[0].dims,4),a=R("bias",e[0].dataType,[e[0].dims[2]],4),n=G("output",e[0].dataType,t,4),i=C.size(t)/4,s=Se(e[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)}}),getShaderSource:u=>` 483 const M_SQRT2 = sqrt(2.0); 484 const halfChannels = ${e[0].dims[2]/4/2}u; 485 486 ${u.declareVariables(r,a,n)} 487 488 ${Rr(s)} 489 490 ${u.mainStart()} 491 ${u.guardAgainstOutOfBoundsWorkgroupSizes(i)} 492 let biasIdx = global_idx % halfChannels; 493 let batchIndex = global_idx / halfChannels; 494 let inputOffset = biasIdx + batchIndex * halfChannels * 2; 495 let valueLeft = input[inputOffset] + bias[biasIdx]; 496 let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels]; 497 let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); 498 499 ${n.setByOffset("global_idx","valueLeft * geluRight")} 500 }`}},Wp=e=>{Ao(e.inputs),e.compute(Oo(e.inputs))}}),Bo,Ro,je,Lp,Vp,jp,Hp,Gp,Fp,Kp,Zp,Qp,Xp,Cm=U(()=>{J(),re(),ie(),Bo=(e,t,r,a,n,i,s,u,d,l,c,f)=>{let m,g;typeof u=="string"?m=g=($,k)=>`${u}((${$}),(${k}))`:typeof u=="function"?m=g=u:(m=u.scalar,g=u.vector);let _=G("outputData",c,a.length,4),b=R("aData",d,t.length,4),x=R("bData",l,r.length,4),w;if(n)if(i){let $=C.size(t)===1,k=C.size(r)===1,S=t.length>0&&t[t.length-1]%4===0,T=r.length>0&&r[r.length-1]%4===0;$||k?w=_.setByOffset("global_idx",g($?`${b.type.value}(${b.getByOffset("0")}.x)`:b.getByOffset("global_idx"),k?`${x.type.value}(${x.getByOffset("0")}.x)`:x.getByOffset("global_idx"))):w=` 501 let outputIndices = ${_.offsetToIndices("global_idx * 4u")}; 502 let offsetA = ${b.broadcastedIndicesToOffset("outputIndices",_)}; 503 let offsetB = ${x.broadcastedIndicesToOffset("outputIndices",_)}; 504 ${_.setByOffset("global_idx",g(s||S?b.getByOffset("offsetA / 4u"):`${b.type.value}(${b.getByOffset("offsetA / 4u")}[offsetA % 4u])`,s||T?x.getByOffset("offsetB / 4u"):`${x.type.value}(${x.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} 505 `}else w=_.setByOffset("global_idx",g(b.getByOffset("global_idx"),x.getByOffset("global_idx")));else{if(!i)throw new Error("no necessary to use scalar implementation for element-wise binary op implementation.");let $=(k,S,T="")=>{let E=`aData[indexA${S}][componentA${S}]`,z=`bData[indexB${S}][componentB${S}]`;return` 506 let outputIndices${S} = ${_.offsetToIndices(`global_idx * 4u + ${S}u`)}; 507 let offsetA${S} = ${b.broadcastedIndicesToOffset(`outputIndices${S}`,_)}; 508 let offsetB${S} = ${x.broadcastedIndicesToOffset(`outputIndices${S}`,_)}; 509 let indexA${S} = offsetA${S} / 4u; 510 let indexB${S} = offsetB${S} / 4u; 511 let componentA${S} = offsetA${S} % 4u; 512 let componentB${S} = offsetB${S} % 4u; 513 ${k}[${S}] = ${T}(${m(E,z)}); 514 `};c===9?w=` 515 var data = vec4<u32>(0); 516 ${$("data",0,"u32")} 517 ${$("data",1,"u32")} 518 ${$("data",2,"u32")} 519 ${$("data",3,"u32")}
520 outputData[global_idx] = dot(vec4<u32>(0x1, 0x100, 0x10000, 0x1000000), vec4<u32>(data));`:w=` 521 ${$("outputData[global_idx]",0)} 522 ${$("outputData[global_idx]",1)} 523 ${$("outputData[global_idx]",2)} 524 ${$("outputData[global_idx]",3)} 525 `}return` 526 ${e.registerUniform("vec_size","u32").declareVariables(b,x,_)} 527 528 ${f??""} 529 530 ${e.mainStart()} 531 ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} 532 ${w} 533 }`},Ro=(e,t,r,a,n,i,s=r.dataType)=>{let u=r.dims.map(b=>Number(b)??1),d=a.dims.map(b=>Number(b)??1),l=!C.areEqual(u,d),c=u,f=C.size(u),m=!1,g=!1,_=[l];if(l){let b=Nt.calcShape(u,d,!1);if(!b)throw new Error("Can't perform binary op on the given tensors");c=b.slice(),f=C.size(c);let x=C.size(u)===1,w=C.size(d)===1,$=u.length>0&&u[u.length-1]%4===0,k=d.length>0&&d[d.length-1]%4===0;_.push(x),_.push(w),_.push($),_.push(k);let S=1;for(let T=1;T<c.length;T++){let E=u[u.length-T],z=d[d.length-T];if(E===z)S*=E;else break}S%4===0?(g=!0,m=!0):(x||w||$||k)&&(m=!0)}else m=!0;return _.push(m),{name:e,shaderCache:{hint:t+_.map(b=>b.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:b=>Bo(b,u,d,c,m,l,g,n,r.dataType,a.dataType,s,i),getRunData:()=>({outputs:[{dims:c,dataType:s}],dispatchGroup:{x:Math.ceil(f/64/4)},programUniforms:[{type:12,data:Math.ceil(C.size(c)/4)},...Z(u,d,c)]})}},je=(e,t,r,a,n,i)=>{e.compute(Ro(t,n??"",e.inputs[0],e.inputs[1],r,a,i))},Lp=e=>{je(e,"Add",(t,r)=>`${t}+${r}`)},Vp=e=>{je(e,"Div",(t,r)=>`${t}/${r}`)},jp=e=>{je(e,"Equal",{scalar:(t,r)=>`u32(${t}==${r})`,vector:(t,r)=>`vec4<u32>(${t}==${r})`},void 0,void 0,9)},Hp=e=>{je(e,"Mul",(t,r)=>`${t}*${r}`)},Gp=e=>{let t=R("input",e.inputs[0].dataType,e.inputs[0].dims).type.value;je(e,"Pow",{scalar:(r,a)=>`pow_custom(${r},${a})`,vector:(r,a)=>`pow_vector_custom(${r},${a})`},` 534 fn pow_custom(a : ${t}, b : ${t}) -> ${t} { 535 if (b == ${t}(0.0)) { 536 return ${t}(1.0); 537 } else if (a < ${t}(0.0) && f32(b) != floor(f32(b))) { 538 return ${t}(pow(f32(a), f32(b))); // NaN 539 } 540 return select(sign(a), ${t}(1.0), round(f32(abs(b) % ${t}(2.0))) != 1.0) * ${t}(${t==="i32"?"round":""}(pow(f32(abs(a)), f32(b)))); 541 } 542 fn pow_vector_custom(a : vec4<${t}>, b : vec4<${t}>) -> vec4<${t}> { 543 // TODO: implement vectorized pow 544 return vec4<${t}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); 545 } 546 `)},Fp=e=>{je(e,"Sub",(t,r)=>`${t}-${r}`)},Kp=e=>{je(e,"Greater",{scalar:(t,r)=>`u32(${t}>${r})`,vector:(t,r)=>`vec4<u32>(${t}>${r})`},void 0,void 0,9)},Zp=e=>{je(e,"Less",{scalar:(t,r)=>`u32(${t}<${r})`,vector:(t,r)=>`vec4<u32>(${t}<${r})`},void 0,void 0,9)},Qp=e=>{je(e,"GreaterOrEqual",{scalar:(t,r)=>`u32(${t}>=${r})`,vector:(t,r)=>`vec4<u32>(${t}>=${r})`},void 0,void 0,9)},Xp=e=>{je(e,"LessOrEqual",{scalar:(t,r)=>`u32(${t}<=${r})`,vector:(t,r)=>`vec4<u32>(${t}<=${r})`},void 0,void 0,9)}}),Do,No,Mo,Po,Yp,Jp,Am=U(()=>{J(),re(),we(),ie(),Do=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");let r=0,a=e[r],n=a.dataType,i=a.dims.length;e.forEach((s,u)=>{if(u!==r){if(s.dataType!==n)throw new Error("input tensors should be one type");if(s.dims.length!==i)throw new Error("input tensors should have the same shape");s.dims.forEach((d,l)=>{if(l!==t&&d!==a.dims[l])throw new Error("non concat dimensions must match")})}})},No=(e,t)=>` 547 fn calculateInputIndex(index: u32) -> u32 { 548 let sizeInConcatAxis = array<u32, ${e}u>(${t}); 549 for (var i: u32 = 0u; i < ${e}; i += 1u ) { 550 if (index < sizeInConcatAxis[i]) { 551 return i; 552 } 553 } 554 return ${e}u; 555 }`,Mo=(e,t)=>{let r=e.length,a=[];for(let n=0;n<r;++n){let i=t.setByOffset("global_idx",e[n].getByIndices("indices"));r===1?a.push(i):n===0?a.push(`if (inputIndex == ${n}u) { ${i} }`):n===r-1?a.push(`else { ${i} }`):a.push(`else if (inputIndex == ${n}) { ${i} }`)}return a.join(` 556`)},Po=(e,t,r,a)=>{let n=C.size(r),i=new Array(e.length),s=new Array(e.length),u=0,d=[],l=[],c=[{type:12,data:n}];for(let b=0;b<e.length;++b)u+=e[b].dims[t],i[b]=u,l.push(e[b].dims.length),s[b]=R(`input${b}`,a,l[b]),d.push("rank"),c.push({type:12,data:i[b]});for(let b=0;b<e.length;++b)c.push(...Z(e[b].dims));c.push(...Z(r));let f=G("output",a,r.length),m=f.indicesGet("indices",t),g=Array.from(Array(i.length).keys()).map(b=>`uniforms.sizeInConcatAxis${b}`).join(","),_=b=>` 557 558 ${(()=>{b.registerUniform("outputSize","u32");for(let x=0;x<e.length;x++)b.registerUniform(`sizeInConcatAxis${x}`,"u32");return b.declareVariables(...s,f)})()} 559 560 ${No(i.length,g)} 561 562 ${b.mainStart()} 563 ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 564 565 var indices = ${f.offsetToIndices("global_idx")}; 566 567 let inputIndex = calculateInputIndex(${m}); 568 if (inputIndex != 0u) { 569 let sizeInConcatAxis = array<u32, ${i.length}u>(${g}); 570 ${m} -= sizeInConcatAxis[inputIndex - 1u]; 571 } 572 573 ${Mo(s,f)} 574 }`;return{name:"Concat",shaderCache:{hint:`${t}`,inputDependencies:d},getRunData:()=>({outputs:[{dims:r,dataType:a}],dispatchGroup:{x:Math.ceil(n/64)},programUniforms:c}),getShaderSource:_}}
574,Yp=(e,t)=>{let r=e.inputs,a=r[0].dims,n=C.normalizeAxis(t.axis,a.length);Do(r,n);let i=a.slice();i[n]=r.reduce((u,d)=>u+(d.dims.length>n?d.dims[n]:0),0);let s=r.filter(u=>C.size(u.dims)>0);e.compute(Po(s,n,i,r[0].dataType),{inputs:s})},Jp=e=>ce({axis:e.axis})}),Tt,It,Et,La,Ct=U(()=>{J(),re(),Tt=(e,t,r="f32")=>{switch(e.activation){case"Relu":return`value = max(value, ${t}(0.0));`;case"Sigmoid":return`value = (${t}(1.0) / (${t}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${t}(${r}(uniforms.clip_min)), ${t}(${r}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${t}(0.0), min(${t}(1.0), ${r}(uniforms.alpha) * value + ${r}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${r}(uniforms.alpha) * value, value, value >= ${t}(0.0));`;case"Tanh":return`let e2x = exp(-2.0 * abs(value)); 575 value = sign(value) * (1.0 - e2x) / (1.0 + e2x); 576 `;case"":return"";default:throw new Error(`Unsupported activation ${e.activation}`)}},It=(e,t)=>{e.activation==="Clip"?t.push({type:1,data:e.clipMax},{type:1,data:e.clipMin}):e.activation==="HardSigmoid"?t.push({type:1,data:e.alpha},{type:1,data:e.beta}):e.activation==="LeakyRelu"&&t.push({type:1,data:e.alpha})},Et=(e,t)=>{e.activation==="Clip"?t.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):e.activation==="HardSigmoid"?t.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):e.activation==="LeakyRelu"&&t.push({name:"alpha",type:"f32"})},La=e=>{let t=(e==null?void 0:e.activation)||"";if(t==="HardSigmoid"){let[r,a]=(e==null?void 0:e.activation_params)||[.2,.5];return{activation:t,alpha:r,beta:a}}else if(t==="Clip"){let[r,a]=(e==null?void 0:e.activation_params)||[kd,Td];return{activation:t,clipMax:a,clipMin:r}}else if(t==="LeakyRelu"){let[r]=(e==null?void 0:e.activation_params)||[.01];return{activation:t,alpha:r}}return{activation:t}}}),Te,ec,Va=U(()=>{Te=(e,t)=>{switch(e){case 1:return t;case 2:return`vec2<${t}>`;case 3:return`vec3<${t}>`;case 4:return`vec4<${t}>`;default:throw new Error(`${e}-component is not supported.`)}},ec=e=>` 577 ${e?"value = value + getBiasByOutputCoords(coords);":""} 578 `}),tc,Om=U(()=>{tc=e=>` 579fn getIndexFromCoords4D(coords : vec4<i32>, shape : vec4<i32>) -> i32 { 580 return dot(coords, vec4<i32>( 581 shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); 582} 583fn getOutputIndexFromCoords(coords : vec4<i32>) -> i32 { 584 return dot(coords, vec4<i32>( 585 i32(${e}.x), i32(${e}.y), i32(${e}.z), 1)); 586} 587`}),ar,ja,Ha=U(()=>{J(),re(),ie(),Ct(),ar=(e,t,r,a,n)=>{let i=a-r;return` 588 ${Array.from({length:r}).map((s,u)=>` 589 if (${F(t.shape,u,t.rank)} != 1) { 590 ${t.indicesSet(e,u,F(n,u+i,a))} 591 } else { 592 ${t.indicesSet(e,u,0)} 593 }`).join("")} 594`},ja=(e,t,r,a,n=!1,i)=>{let s=e[0].dims,u=e[1].dims,d=s[s.length-2],l=u[u.length-1],c=s[s.length-1],f=$e(l),m=$e(c),g=$e(d),_=C.size(r)/f/g,b=e.length>2,x=a?a.slice(0,-2):r.slice(0,-2),w=[C.size(x),d,l],$=[{type:12,data:_},{type:12,data:d},{type:12,data:l},{type:12,data:c}];It(t,$),$.push(...Z(x,s,u)),b&&$.push(...Z(e[2].dims)),$.push(...Z(w));let k=S=>{let T=Pa("batch_dims",e[0].dataType,x.length),E=R("a",e[0].dataType,s.length,m),z=R("b",e[1].dataType,u.length,f),A=G("output",e[0].dataType,w.length,f),O=Se(A.type.tensor),q=Tt(t,A.type.value,O),X=[E,z],H="";if(b){let te=n?f:1;X.push(R("bias",e[2].dataType,e[2].dims.length,te)),H=`${n?`value += bias[col / ${te}];`:`value += ${A.type.value}(bias[row + i]);`}`}let Q=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];Et(t,Q);let oe=()=>{let te=`var a_data: ${E.type.value};`;for(let V=0;V<m;V++)te+=` 595 let b_data${V} = b[(b_offset + (k + ${V}) * uniforms.N + col) / ${f}];`;for(let V=0;V<g;V++){te+=`a_data = a[(a_offset + (row + ${V}) * uniforms.K + k) / ${m}];`;for(let W=0;W<m;W++)te+=` 596 values[${V}] = fma(${z.type.value}(a_data${m===1?"":`[${W}]`}), b_data${W}, values[${V}]); 597`}return te};return` 598 ${S.registerUniforms(Q).registerInternalVariables(T).declareVariables(...X,A)} 599 ${S.mainStart()} 600 ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")}
601 let col = (global_idx % (uniforms.N / ${f})) * ${f}; 602 var index1 = global_idx / (uniforms.N / ${f}); 603 let stride1 = uniforms.M / ${g}; 604 let row = (index1 % stride1) * ${g}; 605 let batch = index1 / stride1; 606 607 ${r.length===2?"":`let batch_indices = ${T.offsetToIndices("batch")};`} 608 609 var a_indices: ${E.type.indices}; 610 ${ar("a_indices",E,E.rank-2,T.rank,"batch_indices")} 611 ${E.indicesSet("a_indices",E.rank-2,0)} 612 ${E.indicesSet("a_indices",E.rank-1,0)} 613 let a_offset = ${E.indicesToOffset("a_indices")}; 614 615 var b_indices: ${z.type.indices}; 616 ${ar("b_indices",z,z.rank-2,T.rank,"batch_indices")} 617 ${z.indicesSet("b_indices",z.rank-2,0)} 618 ${z.indicesSet("b_indices",z.rank-1,0)} 619 let b_offset = ${z.indicesToOffset("b_indices")}; 620 var values: array<${A.type.value}, ${g}>; 621 for (var k: u32 = 0u; k < uniforms.K; k = k + ${m}) { 622 ${oe()} 623 } 624 for (var i = 0u; i < ${g}u; i++) { 625 var value = values[i]; 626 ${H} 627 ${q} 628 let cur_indices = ${A.type.indices}(batch, row + i, col); 629 let offset = ${A.indicesToOffset("cur_indices")}; 630 ${A.setByOffset(`offset / ${f}`,"value")}; 631 } 632 } 633 `};return{name:"MatMulNaive",shaderCache:{hint:`${t.activation};${f};${m};${g};${n}`,inputDependencies:b?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:i?i(r):r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(_/64)},programUniforms:$}),getShaderSource:k}}}),Uo,qo,_a,Oi,Wo,ya,Lo,Ur,Ga=U(()=>{J(),re(),ie(),Ct(),Ha(),Va(),Uo=(e,t)=>e?` 634 mm_Asub[inputRow][inputCol] = mm_readA(batch, 635 kStart + inputRow, 636 globalRowStart / innerElementSize + inputCol${t?", batchIndices":""}); 637 `:` 638 mm_Asub[inputRow][inputCol] = mm_readA(batch, 639 globalRow + innerRow, 640 kStart / innerElementSize + inputCol${t?", batchIndices":""}); 641 `,qo=(e,t)=>e?` 642 let ACached0 = mm_Asub[k * innerElementSize][localRow]; 643 let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; 644 let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; 645 ${t===3?"":"let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];"} 646 for (var i = 0; i < rowPerThread; i = i + 1) { 647 acc[i] = BCached0 * ACached0[i] + acc[i]; 648 acc[i] = BCached1 * ACached1[i] + acc[i]; 649 acc[i] = BCached2 * ACached2[i] + acc[i]; 650 ${t===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} 651 }`:` 652 for (var i = 0; i < rowPerThread; i = i + 1) { 653 let ACached = mm_Asub[tileRow + i][k]; 654 acc[i] = BCached0 * ACached.x + acc[i]; 655 acc[i] = BCached1 * ACached.y + acc[i]; 656 acc[i] = BCached2 * ACached.z + acc[i]; 657 ${t===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} 658 }`,_a=(e,t,r="f32",a,n=!1,i=32,s=!1,u=32)=>{let d=t[1]*e[1],l=t[0]*e[0],c=n?d:i,f=n?i:d,m=c/t[0],g=i/t[1];if(!((n&&m===4&&e[1]===4||!n&&(m===3||m===4))&&c%t[0]===0&&i%t[1]===0&&e[0]===4))throw new Error(`If transposeA ${n} is true, innerElementSize ${m} and workPerThread[1] ${e[1]} must be 4. 659 Otherwise, innerElementSize ${m} must be 3 or 4. 660 tileAWidth ${c} must be divisible by workgroupSize[0]${t[0]}. tileInner ${i} must be divisible by workgroupSize[1] ${t[1]}. colPerThread ${e[0]} must be 4.`);return` 661var<workgroup> mm_Asub: array<array<vec${m}<${r}>, ${c/m}>, ${f}>; 662var<workgroup> mm_Bsub: array<array<vec4<${r}>, ${l/e[0]}>, ${i}>; 663 664const rowPerThread = ${e[1]}; 665const colPerThread = ${e[0]}; 666const innerElementSize = ${m}; 667const tileInner = ${i}; 668 669@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) 670fn main(@builtin(local_invocation_id) localId : vec3<u32>, 671 @builtin(global_invocation_id) globalId : vec3<u32>, 672 @builtin(workgroup_id) workgroupId : vec3<u32>) { 673 let localRow = i32(localId.y); 674 let tileRow = localRow * rowPerThread; 675 let tileCol = i32(localId.x); 676 677 let globalRow =i32(globalId.y) * rowPerThread; 678 let globalCol = i32(globalId.x); 679 let batch = ${s?"0":"i32(globalId.z)"}; 680 ${a?`let batchIndices = ${a.offsetToIndices("u32(batch)")};`:""} 681 let globalRowStart = i32(workgroupId.y) * ${d}; 682 683 let num_tiles = ${s?`${Math.ceil(u/i)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; 684 var kStart = ${s?`i32(globalId.z) * ${u}`:"0"}; 685 686 var acc: array<vec4<${r}>, rowPerThread>; 687 688 // Loop over shared dimension. 689 let tileRowB = localRow * ${g}; 690 for (var t = 0; t < num_tiles; t = t + 1) { 691 // Load one tile of A into local memory. 692 for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { 693 let inputRow = tileRow + innerRow; 694 let inputCol = tileCol; 695 ${Uo(n,a)} 696 } 697 698 // Load one tile of B into local memory. 699 for (var innerRow = 0; innerRow < ${g}; innerRow = innerRow + 1) { 700 let inputRow = tileRowB + innerRow; 701 let inputCol = tileCol; 702 mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${a?", batchIndices":""}); 703 } 704 kStart = kStart + tileInner; 705 workgroupBarrier(); 706 707 // Compute acc values for a single thread. 708 for (var k = 0; k < tileInner / innerElementSize; k = k + 1) { 709 let BCached0 = mm_Bsub[k * innerElementSize][tileCol]; 710 let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol]; 711 let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; 712 ${m===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} 713 714 ${qo(n,m)} 715 } 716 717 workgroupBarrier(); 718 } 719 720 for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { 721 mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); 722 } 723}`},Oi=(e,t)=>e?` 724 mm_Asub[inputRow][inputCol] = mm_readA(batch, 725 kStart + inputRow, 726 globalRowStart + inputCol${t?", batchIndices":""}); 727 `:` 728 mm_Asub[inputRow][inputCol] = mm_readA(batch, 729 globalRowStart + inputRow, 730 kStart + inputCol${t?", batchIndices":""}); 731 `,Wo=e=>e?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",ya=(e,t,r="f32",a,n=!1,i=32,s=!1,u=32,d=!1)=>{let l=e[1]*t[1],c=e[0]*t[0],f=n?l:i,m=n?i:l;if(!(m%t[1]===0&&f%t[0]===0&&i%t[1]===0))throw new Error(`tileAHight ${m} must be divisible by workgroupSize[1]${t[1]}, tileAWidth ${f} must be divisible by workgroupSize[0]${t[0]}, tileInner ${i} must be divisible by workgroupSize[1]${t[1]}`);let g=m/t[1],_=f/t[0],b=i/t[1],x=d?`
732 let localRow = i32(localId.y); 733 let localCol = i32(localId.x); 734 let globalRowStart = i32(workgroupId.y) * ${l}; 735 let globalColStart = i32(workgroupId.x) * ${c}; 736 737 // Loop over shared dimension. 738 for (var t = 0; t < num_tiles; t = t + 1) { 739 // Load one tile of A into local memory. 740 for (var inputRow = localRow; inputRow < ${m}; inputRow = inputRow + ${t[1]}) { 741 for (var inputCol = localCol; inputCol < ${f}; inputCol = inputCol + ${t[0]}) { 742 ${Oi(n,a)} 743 } 744 } 745 // Load one tile of B into local memory. 746 for (var inputRow = localRow; inputRow < ${i}; inputRow = inputRow + ${t[1]}) { 747 for (var inputCol = localCol; inputCol < ${c}; inputCol = inputCol + ${t[0]}) { 748 mm_Bsub[inputRow][inputCol] = mm_readB(batch, 749 kStart + inputRow, 750 globalColStart + inputCol${a?", batchIndices":""}); 751 } 752 } 753 kStart = kStart + tileInner; 754 workgroupBarrier(); 755 756 // Compute acc values for a single thread. 757 var BCached : array<${r}, colPerThread>; 758 for (var k = 0; k < tileInner; k = k + 1) { 759 for (var inner = 0; inner < colPerThread; inner = inner + 1) { 760 BCached[inner] = mm_Bsub[k][localCol + inner * ${t[0]}]; 761 } 762 for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { 763 let ACached = ${n?`mm_Asub[k][localRow + innerRow * ${t[1]}];`:`mm_Asub[localRow + innerRow * ${t[1]}][k];`} 764 for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { 765 acc[innerRow][innerCol] = acc[innerRow][innerCol] + 766 ACached * BCached[innerCol]; 767 } 768 } 769 } 770 workgroupBarrier(); 771 } 772 for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { 773 let gRow = globalRowStart + localRow + innerRow * ${t[1]}; 774 for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { 775 let gCol = globalColStart + localCol + innerCol * ${t[0]}; 776 mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); 777 } 778 } 779 `:` 780let tileRow = i32(localId.y) * rowPerThread; 781let tileCol = i32(localId.x) * colPerThread; 782 783let globalRow = i32(globalId.y) * rowPerThread; 784let globalCol = i32(globalId.x) * colPerThread; 785let globalRowStart = i32(workgroupId.y) * ${l}; 786 787let tileRowA = i32(localId.y) * ${g}; 788let tileColA = i32(localId.x) * ${_}; 789let tileRowB = i32(localId.y) * ${b}; 790// Loop over shared dimension. 791for (var t = 0; t < num_tiles; t = t + 1) { 792 // Load one tile of A into local memory. 793 for (var innerRow = 0; innerRow < ${g}; innerRow = innerRow + 1) { 794 for (var innerCol = 0; innerCol < ${_}; innerCol = innerCol + 1) { 795 let inputRow = tileRowA + innerRow; 796 let inputCol = tileColA + innerCol; 797 ${Oi(n,a)} 798 } 799 } 800 801 // Load one tile of B into local memory. 802 for (var innerRow = 0; innerRow < ${b}; innerRow = innerRow + 1) { 803 for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { 804 let inputRow = tileRowB + innerRow; 805 let inputCol = tileCol + innerCol; 806 mm_Bsub[inputRow][inputCol] = mm_readB(batch, 807 kStart + inputRow, 808 globalCol + innerCol${a?", batchIndices":""}); 809 } 810 } 811 kStart = kStart + tileInner; 812 workgroupBarrier(); 813 814 // Compute acc values for a single thread. 815 var BCached : array<${r}, colPerThread>; 816 for (var k = 0; k < tileInner; k = k + 1) { 817 for (var inner = 0; inner < colPerThread; inner = inner + 1) { 818 BCached[inner] = mm_Bsub[k][tileCol + inner]; 819 } 820 821 for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { 822 ${Wo(n)} 823 for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { 824 acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; 825 } 826 } 827 } 828 829 workgroupBarrier(); 830} 831 832for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { 833 for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { 834 mm_write(batch, globalRow + innerRow, globalCol + innerCol, 835 acc[innerRow][innerCol]); 836 } 837} 838`;return`
839 var<workgroup> mm_Asub : array<array<${r}, ${f}>, ${m}>; 840 var<workgroup> mm_Bsub : array<array<${r}, ${c}>, ${i}>; 841 const rowPerThread = ${e[1]}; 842 const colPerThread = ${e[0]}; 843 const tileInner = ${i}; 844 845@compute @workgroup_size(${t[0]}, ${t[1]}, ${t[2]}) 846fn main(@builtin(local_invocation_id) localId : vec3<u32>, 847 @builtin(global_invocation_id) globalId : vec3<u32>, 848 @builtin(workgroup_id) workgroupId : vec3<u32>) { 849 let batch = ${s?"0":"i32(globalId.z)"}; 850 ${a?`let batchIndices = ${a.offsetToIndices("u32(batch)")};`:""} 851 let num_tiles = ${s?`${Math.ceil(u/i)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; 852 var kStart = ${s?`i32(globalId.z) * ${u}`:"0"}; 853 854 var acc : array<array<${r}, colPerThread>, rowPerThread>; 855 ${x} 856 } 857`},Lo=(e,t,r,a,n=!1)=>{let[i,s,u,d]=a,l=Se(a[0].type.tensor);return` 858 fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${i.type.indices}) -> ${Te(e,l)} { 859 var value = ${Te(e,l)}(0.0); 860 let col = colIn * ${e}; 861 if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) 862 { 863 var aIndices: ${s.type.indices}; 864 ${ar("aIndices",s,s.rank-2,i.rank,"batchIndices")} 865 ${s.indicesSet("aIndices",s.rank-2,"u32(row)")} 866 ${s.indicesSet("aIndices",s.rank-1,"u32(colIn)")} 867 value = ${s.getByIndices("aIndices")}; 868 } 869 return value; 870 } 871 872 fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${i.type.indices}) -> ${Te(e,l)} { 873 var value = ${Te(e,l)}(0.0); 874 let col = colIn * ${e}; 875 if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) 876 { 877 var bIndices: ${u.type.indices}; 878 ${ar("bIndices",u,u.rank-2,i.rank,"batchIndices")} 879 ${u.indicesSet("bIndices",u.rank-2,"u32(row)")} 880 ${u.indicesSet("bIndices",u.rank-1,"u32(colIn)")} 881 value = ${u.getByIndices("bIndices")}; 882 } 883 return value; 884 } 885 886 fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${Te(e,l)}) { 887 let col = colIn * ${e}; 888 if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { 889 var value = valueIn; 890 let coords = vec3<i32>(batch, row, colIn); 891 ${t?`value = value + ${n?"bias[colIn]":`${Te(e,l)}(bias[row])`};`:""} 892 ${r} 893 ${d.setByIndices("vec3<u32>(coords)","value")} 894 } 895 } 896 `},Ur=(e,t,r,a,n=!1,i)=>{let s=e[0].dims,u=e[1].dims,d=s.slice(0,-2),l=u.slice(0,-2),c=a?a.slice(0,-2):r.slice(0,-2),f=C.size(c),m=s[s.length-2],g=s[s.length-1],_=u[u.length-1],b=g%4===0&&_%4===0,x=m<=8?[4,1,1]:[4,4,1],w=[8,8,1],$=[Math.ceil(_/w[0]/x[0]),Math.ceil(m/w[1]/x[1]),Math.ceil(f/w[2]/x[2])],k=b?4:1,S=[...d,m,g/k],T=S.length,E=[...l,g,_/k],z=E.length,A=[f,m,_/k],O=[{type:6,data:m},{type:6,data:_},{type:6,data:g}];It(t,O),O.push(...Z(c,S,E));let q=["rank","rank"],X=e.length>2;X&&(O.push(...Z(e[2].dims)),q.push("rank")),O.push(...Z(A));let H=Q=>{let oe=c.length,te=Pa("batchDims",e[0].dataType,oe,1),V=Se(e[0].dataType),W=R("a",e[0].dataType,T,k),le=R("b",e[1].dataType,z,k),ee=G("result",e[0].dataType,A.length,k),ae=[W,le];if(X){let ke=n?k:1;ae.push(R("bias",e[2].dataType,e[2].dims.length,ke))}let D=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];Et(t,D);let P=Se(ee.type.tensor),j=Tt(t,ee.type.value,P),se=Lo(k,X,j,[te,W,le,ee],n);return` 897 ${Q.registerUniforms(D).registerInternalVariables(te).declareVariables(...ae,ee)} 898 ${se} 899 ${b?_a(x,w,V,te):ya(x,w,V,te)} 900 `};return{name:"MatMul",shaderCache:{hint:`${x};${t.activation};${b};${n}`,inputDependencies:q},getRunData:()=>({outputs:[{dims:i?i(r):r,dataType:e[0].dataType}],dispatchGroup:{x:$[0],y:$[1],z:$[2]},programUniforms:O}),getShaderSource:H}}}),Vo,rc,Bm=U(()=>{J(),at(),ie(),Ct(),Va(),Om(),Ga(),Vo=(e,t,r,a,n=!1,i,s=4,u=4,d=4,l="f32")=>{let c=O=>{switch(O){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${l}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${O} is not supported.`)}},f=O=>{switch(O){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${O} is not supported.`)}},m=e?`
901 let coord = vec4<i32>(batch, xRow, xCol, xCh); 902 `:` 903 let coord = vec4<i32>(batch, xCh, xRow, xCol); 904 `,g=e?` 905 let coords = vec4<i32>( 906 batch, 907 row / outWidth, 908 row % outWidth, 909 col); 910 `:` 911 let coords = vec4<i32>( 912 batch, 913 row, 914 col / outWidth, 915 col % outWidth); 916 `,_=e?"i32(uniforms.x_shape[1])":"i32(uniforms.x_shape[2])",b=e?"i32(uniforms.x_shape[2])":"i32(uniforms.x_shape[3])",x=e?"row":"col",w=e?"col":"row",$=` 917 let inChannels = i32(uniforms.w_shape[2]); 918 let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; 919 let outRow = ${x} / outWidth; 920 let outCol = ${x} % outWidth; 921 922 let WRow = ${w} / (i32(uniforms.w_shape[1]) * inChannels); 923 let WCol = ${w} / inChannels % i32(uniforms.w_shape[1]); 924 let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; 925 let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; 926 let xCh = ${w} % inChannels; 927 var resData = ${Te(s,l)}(0.0); 928 // The bounds checking is always needed since we use it to pad zero for 929 // the 'same' padding type. 930 if (xRow >= 0 && xRow < ${_} && xCol >= 0 && xCol < ${b}) { 931 ${m} 932 let xIndex = getIndexFromCoords4D(coord, vec4<i32>(uniforms.x_shape)); 933 ${c(s)} 934 } 935 return resData;`,k=e?t&&a?` 936 let col = colIn * ${s}; 937 ${$}`:` 938 let col = colIn * ${s}; 939 if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { 940 ${$} 941 } 942 return ${Te(s,l)}(0.0);`:a&&r?`
943 let col = colIn * ${s}; 944 ${$}`:` 945 let col = colIn * ${s}; 946 if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { 947 ${$} 948 } 949 return ${Te(s,l)}(0.0);`,S=e?a&&r?f(u):` 950 let col = colIn * ${u}; 951 if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { 952 ${f(u)} 953 } 954 return ${Te(u,l)}(0.0);`:` 955 let col = colIn * ${u}; 956 if (row < uniforms.dim_inner && col < uniforms.dim_a_outer) { 957 ${f(u)} 958 } 959 return ${Te(u,l)}(0.0);`,T=Te(d,l),E=Te(e?s:u,l),z=Te(e?u:s,l),A=Tt(i,T,l);return` 960 fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${E} { 961 ${e?k:S} 962 } 963 964 fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${z} { 965 ${e?S:k} 966 } 967 968 fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${T}) { 969 let col = colIn * ${d}; 970 if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) 971 { 972 var value = valueIn; 973 let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; 974 ${g} 975 ${ec(n)} 976 ${A} 977 setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); 978 } 979 }`},rc=(e,t,r,a,n,i,s,u,d)=>{let l=t.format==="NHWC",c=l?e[0].dims[3]:e[0].dims[1],f=r[0],m=l?r[2]:r[3],g=l?r[1]:r[2],_=l?r[3]:r[1],b=l&&(c%4===0||c%3===0)&&_%4===0,x=l?_:m*g,w=l?m*g:_,$=[8,8,1],k=a<=8?[4,1,1]:[4,4,1],S=[Math.ceil(x/$[0]/k[0]),Math.ceil(w/$[1]/k[1]),Math.ceil(f/$[2]/k[2])];ue("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${S}`);let T=b?l&&c%4!==0?3:4:1,E=$[1]*k[1],z=$[0]*k[0],A=Math.max($[0]*T,$[1]),O=a%E===0,q=n%z===0,X=i%A===0,H=b?[T,4,4]:[1,1,1],Q=[{type:6,data:a},{type:6,data:n},{type:6,data:i},{type:6,data:[t.pads[0],t.pads[1]]},{type:6,data:t.strides},{type:6,data:t.dilations}];It(t,Q),Q.push(...Z(e[0].dims,e[1].dims));let oe=["rank","rank"];s&&(Q.push(...Z(e[2].dims)),oe.push("rank")),Q.push(...Z(r));let te=V=>{let W=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];Et(t,W);let le=b?4:1,ee=Se(e[0].dataType),ae=` 980 fn setOutputAtIndex(flatIndex : i32, value : ${b?`vec4<${ee}>`:ee}) { 981 result[flatIndex] = ${b?`vec4<${ee}>`:ee}(value); 982 } 983 fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${b?`vec4<${ee}>`:ee}) { 984 let flatIndex = getOutputIndexFromCoords(vec4<i32>(d0, d1, d2, d3)); 985 setOutputAtIndex(flatIndex ${b?"/ 4":""}, value); 986 }`,D=R("x",e[0].dataType,e[0].dims.length,T===3?1:T),P=R("w",e[1].dataType,e[1].dims.length,le),j=[D,P],se=G("result",e[0].dataType,r.length,le);if(s){let ke=R("bias",e[2].dataType,e[2].dims.length,le);j.push(ke),ae+=` 987 fn getBiasByOutputCoords(coords : vec4<i32>) -> ${b?`vec4<${ee}>`:ee} { 988 return bias[coords.${l?"w":"y"}${b?"/ 4":""}]; 989 }`}return` 990 ${tc("uniforms.result_strides")} 991 //struct Uniforms { xShape : vec4<i32>, wShape : vec4<i32>, outShape : vec4<i32>, 992 // outShapeStrides: vec3<i32>, filterDims : vec2<i32>, pad : vec2<i32>, stride : vec2<i32>, 993 // dilation : vec2<i32>, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; 994 ${V.registerUniforms(W).declareVariables(...j,se)} 995 ${ae} 996 ${Vo(l,O,q,X,s,t,H[0],H[1],H[2],ee)} 997 ${b?_a(k,$,ee,void 0,!l,A):ya(k,$,ee,void 0,!l,A,!1,void 0,u)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${t.cacheKey};${T};${b};${O};${q};${X};${E};${z};${A}`,inputDependencies:oe},getRunData:()=>({outputs:[{dims:d?d(r):r,dataType:e[0].dataType}],dispatchGroup:{x:S[0],y:S[1],z:S[2]},programUniforms:Q}),getShaderSource:te}}}),jo,Bi,Kt,Ho,Ri,Go,ic,ac,Rm=U(()=>{J(),at(),re(),ie(),Ct(),Va(),jo=e=>{let t=1;for(let r=0;r<e.length;r++)t*=e[r];return t},Bi=e=>typeof e=="number"?[e,e,e]:e,Kt=(e,t)=>t<=1?e:e+(e-1)*(t-1),Ho=(e,t,r,a=1)=>{let n=Kt(t,a);return Math.floor((e[0]*(r-1)-r+n)/2)},Ri=(e,t,r,a,n)=>{n==null&&(n=Ho(e,t[0],a[0]));let i=[0,0,0,r];for(let s=0;s<3;s++)e[s]+2*n>=t[s]&&(i[s]=Math.trunc((e[s]-t[s]+2*n)/a[s]+1));return i},Go=(e,t,r,a,n,i,s,u,d,l)=>{let c,f,m,g;if(e==="VALID"&&(e=0),typeof e=="number"){c={top:e,bottom:e,left:e,right:e,front:e,back:e};let _=Ri([t,r,a,1],[u,d,l],1,[n,i,s],e);f=_[0],m=_[1],g=_[2]}else if(Array.isArray(e)){if(!e.every((b,x,w)=>b===w[0]))throw Error(`Unsupported padding parameter: ${e}`);c={top:e[0],bottom:e[1],left:e[2],right:e[3],front:e[4],back:e[5]};let _=Ri([t,r,a,1],[u,d,l],1,[n,i,s],e[0]);f=_[0],m=_[1],g=_[2]}else if(e==="SAME_UPPER"){f=Math.ceil(t/n),m=Math.ceil(r/i),g=Math.ceil(a/s);let _=(f-1)*n+u-t,b=(m-1)*i+d-r,x=(g-1)*s+l-a,w=Math.floor(_/2),$=_-w,k=Math.floor(b/2),S=b-k,T=Math.floor(x/2),E=x-T;c={top:k,bottom:S,left:T,right:E,front:w,back:$}}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:c,outDepth:f,outHeight:m,outWidth:g}},ic=(e,t,r,a,n,i=!1,s="channelsLast")=>{let u,d,l,c,f;if(s==="channelsLast")[u,d,l,c,f]=e;else if(s==="channelsFirst")[u,f,d,l,c]=e;else throw new Error(`Unknown dataFormat ${s}`);let[m,,g,_,b]=t,[x,w,$]=Bi(r),[k,S,T]=Bi(a),E=Kt(g,k),z=Kt(_,S),A=Kt(b,T),{padInfo:O,outDepth:q,outHeight:X,outWidth:H}=Go(n,d,l,c,x,w,$,E,z,A),Q=i?m*f:m,oe=[0,0,0,0,0];return s==="channelsFirst"?oe=[u,Q,q,X,H]:s==="channelsLast"&&(oe=[u,q,X,H,Q]),{batchSize:u,dataFormat:s,inDepth:d,inHeight:l,inWidth:c,inChannels:f,outDepth:q,outHeight:X,outWidth:H,outChannels:Q,padInfo:O,strideDepth:x,strideHeight:w,strideWidth:$,filterDepth:g,filterHeight:_,filterWidth:b,effectiveFilterDepth:E,effectiveFilterHeight:z,effectiveFilterWidth:A,dilationDepth:k,dilationHeight:S,dilationWidth:T,inShape:e,outShape:oe,filterShape:t}},ac=(e,t,r,a,n,i)=>{let s=i==="channelsLast";s?e[0].dims[3]:e[0].dims[1];let u=[64,1,1],d={x:r.map((x,w)=>w)},l=[Math.ceil(jo(d.x.map(x=>r[x]))/u[0]),1,1];ue("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${l}`);let c=1,f=C.size(r),m=[{type:12,data:f},{type:12,data:a},{type:12,data:n},{type:12,data:t.strides},{type:12,data:t.dilations}];It(t,m),m.push(...Z(e[0].dims,e[1].dims));let g=["rank","rank"],_=e.length===3;_&&(m.push(...Z(e[2].dims)),g.push("rank")),m.push(...Z(r));let b=x=>{let w=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:a.length},{name:"pads",type:"u32",length:n.length},{name:"strides",type:"u32",length:t.strides.length},{name:"dilations",type:"u32",length:t.dilations.length}];Et(t,w);let $=1,k=Se(e[0].dataType),S=R("x",e[0].dataType,e[0].dims.length,c),T=R("W",e[1].dataType,e[1].dims.length,$),E=[S,T],z=G("result",e[0].dataType,r.length,$),A="";if(_){let X=R("bias",e[2].dataType,e[2].dims.length,$);E.push(X),A+=` 998 fn getBiasByOutputCoords(coords : array<u32, 5>) -> ${k} { 999 return bias[${s?F("coords",4,5):F("coords",1,5)}]; 1000 }`}let O=Te(c,k),q=Tt(t,O,k);return` 1001 ${A} 1002 fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { 1003 let aIndices = array<u32, 5>(d0, d1, d2, d3, d4); 1004 return ${S.getByIndices("aIndices")}; 1005 } 1006 fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { 1007 let aIndices = array<u32, 5>(d0, d1, d2, d3, d4); 1008 return ${T.getByIndices("aIndices")}; 1009 } 1010 ${x.registerUniforms(w).declareVariables(...E,z)} 1011 ${x.mainStart()} 1012 ${x.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1013 let coords = ${z.offsetToIndices("global_idx")}; 1014 let batch = ${F("coords",0,S.rank)}; 1015 let d2 = ${s?F("coords",S.rank-1,S.rank):F("coords",1,S.rank)}; 1016 let xFRCCorner = vec3<u32>
1016(${s?F("coords",1,S.rank):F("coords",2,S.rank)}, 1017 ${s?F("coords",2,S.rank):F("coords",3,S.rank)}, 1018 ${s?F("coords",3,S.rank):F("coords",4,S.rank)}) * uniforms.strides - uniforms.pads; 1019 let xFCorner = xFRCCorner.x; 1020 let xRCorner = xFRCCorner.y; 1021 let xCCorner = xFRCCorner.z; 1022 let xShapeY = ${s?F("uniforms.x_shape",1,S.rank):F("uniforms.x_shape",2,S.rank)}; 1023 let xShapeZ = ${s?F("uniforms.x_shape",2,S.rank):F("uniforms.x_shape",3,S.rank)}; 1024 let xShapeW = ${s?F("uniforms.x_shape",3,S.rank):F("uniforms.x_shape",4,S.rank)}; 1025 let xShapeU = ${s?F("uniforms.x_shape",4,S.rank):F("uniforms.x_shape",1,S.rank)}; 1026 let inputDepthNearestVec4 = (xShapeU / 4) * 4; 1027 let inputDepthVec4Remainder = xShapeU % 4; 1028 1029 var value = 0.0; 1030 for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) { 1031 let xF = xFCorner + wF * uniforms.dilations[0]; 1032 if (xF < 0 || xF >= xShapeY) { 1033 continue; 1034 } 1035 1036 for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) { 1037 let xR = xRCorner + wR * uniforms.dilations[1]; 1038 if (xR < 0 || xR >= xShapeZ) { 1039 continue; 1040 } 1041 1042 for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) { 1043 let xC = xCCorner + wC * uniforms.dilations[2]; 1044 if (xC < 0 || xC >= xShapeW) { 1045 continue; 1046 } 1047 1048 for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) { 1049 ${s?`let xValues = vec4<f32>( 1050 getX(batch, xF, xR, xC, d1), 1051 getX(batch, xF, xR, xC, d1 + 1), 1052 getX(batch, xF, xR, xC, d1 + 2), 1053 getX(batch, xF, xR, xC, d1 + 3)); 1054 `:`let xValues = vec4<f32>( 1055 getX(batch, d1, xF, xR, xC), 1056 getX(batch, d1 + 1, xF, xR, xC), 1057 getX(batch, d1 + 2, xF, xR, xC), 1058 getX(batch, d1 + 3, xF, xR, xC)); 1059 `} 1060 let wValues = vec4<f32>( 1061 getW(d2, d1, wF, wR, wC), 1062 getW(d2, d1 + 1, wF, wR, wC), 1063 getW(d2, d1 + 2, wF, wR, wC), 1064 getW(d2, d1 + 3, wF, wR, wC)); 1065 value += dot(xValues, wValues); 1066 } 1067 if (inputDepthVec4Remainder == 1) { 1068 ${s?`value += getX(batch, xF, xR, xC, inputDepthNearestVec4) 1069 * getW(d2, inputDepthNearestVec4, wF, wR, wC);`:`value += getX(batch, inputDepthNearestVec4, xF, xR, xC) 1070 * getW(d2, inputDepthNearestVec4, wF, wR, wC);`} 1071 } else if (inputDepthVec4Remainder == 2) { 1072 ${s?`let xValues = vec2<f32>( 1073 getX(batch, xF, xR, xC, inputDepthNearestVec4), 1074 getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1)); 1075 `:`let xValues = vec2<f32>( 1076 getX(batch, inputDepthNearestVec4, xF, xR, xC), 1077 getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC)); 1078 `} 1079 let wValues = vec2<f32>( 1080 getW(d2, inputDepthNearestVec4, wF, wR, wC), 1081 getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC)); 1082 value += dot(xValues, wValues); 1083 } else if (inputDepthVec4Remainder == 3) { 1084 ${s?`let xValues = vec3<f32>( 1085 getX(batch, xF, xR, xC, inputDepthNearestVec4), 1086 getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1), 1087 getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2)); 1088 `:`let xValues = vec3<f32>(
1089 getX(batch, inputDepthNearestVec4, xF, xR, xC), 1090 getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC), 1091 getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC)); 1092 `} 1093 let wValues = vec3<f32>( 1094 getW(d2, inputDepthNearestVec4, wF, wR, wC), 1095 getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC), 1096 getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC)); 1097 value += dot(xValues, wValues); 1098 } 1099 } 1100 } 1101 } 1102 ${_?"value = value + getBiasByOutputCoords(coords)":""}; 1103 ${q} 1104 result[global_idx] = f32(value); 1105 }`};return{name:"Conv3DNaive",shaderCache:{hint:`${t.cacheKey};${s};${c};${_}`,inputDependencies:g},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:l[0],y:l[1],z:l[2]},programUniforms:m}),getShaderSource:b}}}),nc,sc,Dm=U(()=>{J(),re(),ie(),Ct(),nc=(e,t,r,a)=>{let n=e.length>2,i=n?"value += b[output_channel];":"",s=e[0].dims,u=e[1].dims,d=t.format==="NHWC",l=d?r[3]:r[1],c=l/t.group,f=d&&c>=4?$e(l):1,m=C.size(r)/f,g=[{type:12,data:m},{type:12,data:t.dilations},{type:12,data:[t.strides[0],t.strides[1]]},{type:12,data:[t.pads[0],t.pads[1]]},{type:12,data:c}];It(t,g),g.push(...Z(s,[u[0],u[1],u[2],u[3]/f]));let _=n?["rank","rank","rank"]:["rank","rank"];g.push(...Z([r[0],r[1],r[2],r[3]/f]));let b=x=>{let w=G("output",e[0].dataType,r.length,f),$=Se(w.type.tensor),k=Tt(t,w.type.value,$),S=R("x",e[0].dataType,s.length),T=R("w",e[1].dataType,u.length,f),E=[S,T];n&&E.push(R("b",e[2].dataType,e[2].dims,f));let z=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:t.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];Et(t,z);let A=d?` 1106 for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[0]; wHeight++) { 1107 let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; 1108 1109 if (xHeight < 0u || xHeight >= uniforms.x_shape[1]) { 1110 continue; 1111 } 1112 1113 for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[1]; wWidth++) { 1114 let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; 1115 if (xWidth < 0u || xWidth >= uniforms.x_shape[2]) { 1116 continue; 1117 } 1118 1119 for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[2]; wInChannel++) { 1120 let input_channel = in_channel_offset + wInChannel; 1121 let xVal = ${S.get("batch","xHeight","xWidth","input_channel")}; 1122 let wVal = ${T.get("wHeight","wWidth","wInChannel","output_channel")}; 1123 value += xVal * wVal; 1124 } 1125 } 1126 } 1127 `:` 1128 for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) { 1129 let input_channel = in_channel_offset + wInChannel; 1130 for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) { 1131 let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; 1132 1133 if (xHeight < 0u || xHeight >= uniforms.x_shape[2]) { 1134 continue; 1135 } 1136 1137 for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) { 1138 let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; 1139 if (xWidth < 0u || xWidth >= uniforms.x_shape[3]) { 1140 continue; 1141 } 1142 1143 let xVal = ${S.get("batch","input_channel","xHeight","xWidth")}; 1144 let wVal = ${T.get("output_channel","wInChannel","wHeight","wWidth")}; 1145 value += xVal * wVal; 1146 } 1147 } 1148 } 1149 `;return` 1150 ${x.registerUniforms(z).declareVariables(...E,w)} 1151 1152 ${x.mainStart()} 1153 ${x.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1154 1155 let outputIndices = ${w.offsetToIndices("global_idx")}; 1156 let batch: u32 = outputIndices[0]; 1157 let output_channel: u32 = outputIndices[${d?3:1}]; 1158 let xRCCorner: vec2<u32> = vec2<u32>(outputIndices[${d?1:2}], outputIndices[${d?2:3}]) * uniforms.strides - uniforms.pads; 1159 let group_id: u32 = output_channel * ${f} / uniforms.output_channels_per_group; 1160 var in_channel_offset = group_id * uniforms.w_shape[${d?2:1}]; 1161 1162 var value: ${w.type.value} = ${w.type.value}(0); 1163 ${A} 1164 ${i} 1165 ${k} 1166 ${w.setByOffset("global_idx","value")} 1167 }`};
vendor: 4,267 bytes, lines 1167-1212
1167return{name:"GroupedConv",shaderCache:{hint:`${t.cacheKey}_${f}`,inputDependencies:_},getRunData:()=>({outputs:[{dims:a?a(r):r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:g}),getShaderSource:b}},sc=(e,t,r,a)=>{let n=e.length>2,i=$e(r[3]),s=$e(r[2]),u=C.size(r)/i/s,d=[e[0].dims[0],e[0].dims[1],e[0].dims[2],e[0].dims[3]/i],l=[e[1].dims[0],e[1].dims[1],e[1].dims[2],e[1].dims[3]/i],c=[r[0],r[1],r[2],r[3]/i],f=[{type:12,data:u},{type:6,data:[t.strides[0],t.strides[1]]},{type:6,data:[t.pads[0],t.pads[1]]}];It(t,f),f.push(...Z(d,l,c));let m=(s-1)*t.strides[1]+l[1],g=_=>{let b=G("output",e[0].dataType,c.length,i),x=Se(b.type.tensor),w=Tt(t,b.type.value,x),$=R("x",e[0].dataType,d.length,i),k=R("w",e[1].dataType,l.length,i),S=[$,k];n&&S.push(R("b",e[2].dataType,e[2].dims,i));let T=n?"value += b[output_channel];":"",E=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return Et(t,E),` 1168 ${_.registerUniforms(E).declareVariables(...S,b)} 1169 ${_.mainStart()} 1170 ${_.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1171 let width0 = uniforms.output_shape[3]; 1172 let output_channel = global_idx % width0; 1173 var index1 = global_idx / width0; 1174 let width1 = uniforms.output_shape[2] / ${s}u; 1175 let col = (index1 % width1) * ${s}u; 1176 index1 = index1 / width1; 1177 let row = index1 % uniforms.output_shape[1]; 1178 let batch = index1 / uniforms.output_shape[1]; 1179 1180 let x_corner = vec2<i32>(i32(row), i32(col)) * uniforms.strides - uniforms.pads; 1181 1182 var x_vals: array<${$.type.value}, ${m}>; 1183 var values: array<${b.type.value}, ${s}>; 1184 let input_channel = output_channel; 1185 // Use constant instead of uniform can give better performance for w's height/width. 1186 for (var w_height: u32 = 0u; w_height < ${l[0]}; w_height++) { 1187 let x_height = x_corner.x + i32(w_height); 1188 if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) { 1189 for (var i = 0; i < ${m}; i++) { 1190 let x_width = x_corner.y + i; 1191 if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) { 1192 x_vals[i] = ${$.get("batch","u32(x_height)","u32(x_width)","input_channel")}; 1193 } else { 1194 x_vals[i] = ${$.type.value}(0); 1195 } 1196 } 1197 for (var w_width: u32 = 0u; w_width < ${l[1]}; w_width++) { 1198 let w_val = ${k.get("w_height","w_width","0","output_channel")}; 1199 for (var i = 0u; i < ${s}u; i++) { 1200 values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]); 1201 } 1202 } 1203 } 1204 } 1205 1206 for (var i = 0u; i < ${s}u; i++) { 1207 var value = values[i]; 1208 ${T} 1209 ${w} 1210 ${b.set("batch","row","col + i","output_channel","value")}; 1211 } 1212 }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${t.cacheKey};${i};${s};${m};${l[0]};${l[1]}`,inputDependencies:n?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:a?a(r):r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:f}),getShaderSource:g}}}),Fo,Ir,Ko,Er,ba,Di,Zo,Qo,$a,Nm=U(()=>{re(),Bm(),Rm(),Ga(),Dm(),Ct(),Ha(),mt(),Fo=(e,t,r,a,n,i)=>{let s=e[0],u=e.slice(i?1:2,i?3:4),d=u.length,l=t[0],c=t.slice(2).map((m,g)=>m+(m-1)*(r[g]-1)),f=u.map((m,g)=>m+a[g]+a[g+d]).map((m,g)=>Math.floor((m-c[g]+n[g])/n[g]));return f.splice(0,0,s),f.splice(i?3:1,0,l),f},Ir=[2,3,1,0],Ko=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length>5)throw new Error("greater than 5D is not supported");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let r=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],a=e[1].dims[1]*t.group;if(r!==a)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(e.length===3&&(e[2].dims.length!==1||e[1].dims[0]!==e[2].dims[0]))throw new Error("invalid bias");let n=e[0].dims.length-2;if(t.dilations.length!==n)throw new Error(`dilations should be ${n}D`);if(t.strides.length!==n)throw new Error(`strides should be ${n}D`);if(t.pads.length!==n*2)throw new Error(`pads should be ${n*2}D`);if(t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape")},Er=(e,t)=>
vendor: 34,960 bytes, lines 1212-1453
1212{let r=e.kernelShape.slice();r.length<t[1].dims.length-2&&r.push(...Array(t[1].dims.length-2-r.length).fill(0));for(let i=2;i<t[1].dims.length;++i)r[i-2]===0&&(r[i-2]=t[1].dims[i]);let a=e.pads.slice();Mr.adjustPadsBasedOnAutoPad(t[0].dims,e.strides,e.dilations,r,a,e.format==="NHWC",e.autoPad);let n=Object.assign({},e);return Object.assign(n,{kernelShape:r,pads:a}),n},ba=e=>{let t=La(e),r=e.format,a=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],n=e.dilations,i=e.group,s=e.kernel_shape,u=e.pads,d=e.strides,l=e.w_is_const();return{autoPad:a,format:r,dilations:n,group:i,kernelShape:s,pads:u,strides:d,wIsConst:l,...t,cacheKey:`${e.format};${t.activation};`}},Di=(e,t,r,a)=>{let n=r.format==="NHWC",i=Fo(t[0].dims,t[1].dims,r.dilations,r.pads,r.strides,n);if(r.group!==1){let E=[t[0]];if(n){let z=e.kernelCustomData.wT??e.compute(De(t[1],Ir),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=z),E.push(z)}else E.push(t[1]);t.length===3&&E.push(t[2]),!e.adapterInfo.isArchitecture("ampere")&&n&&t[1].dims[0]===r.group&&t[1].dims[1]===1&&r.dilations[0]===1&&r.dilations[1]===1?e.compute(sc(E,r,i,a),{inputs:E}):e.compute(nc(E,r,i,a),{inputs:E});return}let s=t.length===3,u=t[0].dims[n?1:2],d=t[0].dims[n?2:3],l=t[0].dims[n?3:1],c=t[1].dims[2],f=t[1].dims[3],m=i[n?1:2],g=i[n?2:3],_=i[n?3:1],b=n&&c===u&&f===d&&r.pads[0]===0&&r.pads[1]===0;if(b||c===1&&f===1&&r.dilations[0]===1&&r.dilations[1]===1&&r.strides[0]===1&&r.strides[1]===1&&r.pads[0]===0&&r.pads[1]===0){let E=i[0],z,A,O,q=[];if(n){let Q=e.kernelCustomData.wT??e.compute(De(t[1],Ir),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];if(r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=Q),b){let oe=u*d*l;z=t[0].reshape([1,E,oe]),A=Q.reshape([1,oe,_]),O=[1,E,_]}else z=t[0].reshape([E,u*d,l]),A=Q.reshape([1,l,_]),O=[E,m*g,_];q.push(z),q.push(A)}else z=t[0].reshape([E,l,u*d]),A=t[1].reshape([1,_,l]),O=[E,_,m*g],q.push(A),q.push(z);s&&q.push(t[2]);let X=O[2],H=q[0].dims[q[0].dims.length-1];X<8&&H<8?e.compute(ja(q,r,i,O,n,a),{inputs:q}):e.compute(Ur(q,r,i,O,n,a),{inputs:q});return}let x=!0,w=e.kernelCustomData.wT??e.compute(De(t[1],Ir),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=w);let $=[t[0],w];s&&$.push(t[2]);let k=n?m*g:_,S=n?_:m*g,T=c*f*l;e.compute(rc($,r,i,k,S,T,s,x,a),{inputs:$})},Zo=(e,t)=>{let r=t.format==="NHWC",a=[e.inputs[0].reshape(r?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&a.push(e.inputs[2]);let n=[0,t.pads[0],0,t.pads[1]],i=[1].concat(t.strides),s=[1].concat(t.dilations),u=[1].concat(t.kernelShape),d=Er({...t,pads:n,strides:i,dilations:s,kernelShape:u},a);Di(e,a,d,l=>r?[l[0],l[2],l[3]]:[l[0],l[1],l[3]])},Qo=(e,t,r)=>{let a=r.format==="NHWC"?"channelsLast":"channelsFirst",n=Er(r,t),i=r.autoPad==="NOTSET"?r.pads:r.autoPad,s=ic(t[0].dims,t[1].dims,r.strides,r.dilations,i,!1,a);e.compute(ac(t,n,s.outShape,[s.filterDepth,s.filterHeight,s.filterWidth],[s.padInfo.front,s.padInfo.top,s.padInfo.left],a))},$a=(e,t)=>{if(Ko(e.inputs,t),e.inputs[0].dims.length===3)Zo(e,t);else if(e.inputs[0].dims.length===5)Qo(e,e.inputs,t);else{let r=Er(t,e.inputs);Di(e,e.inputs,r)}}}),oc,Mm=U(()=>{J(),at(),re(),ie(),oc=(e,t,r)=>{let a=e.length>2,n=t.outputShape,i=t.format==="NHWC",s=t.group,u=e[1].dims,d=u[2]/s,l=u[3],c=i?$e(d):1,f=i&&l===1&&d>=4,m=f?Math.floor(d/4)*4:Math.floor(d/c)*c,g=d-m,_=i?$e(l):1,b=i?l===1?c:_:1,x=C.size(n)/_,w=[Math.ceil(x/64),1,1];ue("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${w}`);let $=["rank","rank"],k=[t.strides[0],t.strides[1]],S=[t.kernelShape[i?1:2],t.kernelShape[i?2:3]],T=[t.dilations[0],t.dilations[1]],E=[S[0]+(t.dilations[0]<=1?0:(t.kernelShape[i?1:2]-1)*(t.dilations[0]-1)),S[1]+(t.dilations[1]<=1?0:(t.kernelShape[i?2:3]-1)*(t.dilations[1]-1))],z=[E[0]-1-Math.floor((t.pads[0]+t.pads[2])/2),E[1]-1-Math.floor((t.pads[1]+t.pads[3])/2)],A=[{type:12,data:x},{type:12,data:k},{type:12,data:S},{type:12,data:T},{type:12,data:E},{type:6,data:z},{type:12,data:m},{type:12,data:d},{type:12,data:l},...Z(e[0].dims,e[1].dims)];a&&(A.push(...Z(e[2].dims)),$.push("rank")),A.push(...Z(n));let O=q=>{let X=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:k.length},{name:"filter_dims",type:"u32",length:S.length},{name:"dilations",type:"u32",length:S.length},{name:"effective_filter_dims",type:"u32",length:E.length},{name:"pads",type:"i32",length:z.length},{name:"input_channels_per_group_int",type:"u32"},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],H=Se(e[0].dataType),Q=i?1:2,oe=i?2:3,te=i?3:1,V=R("W",e[1].dataType,e[1].dims.length,b),W=R("Dy",e[0].dataType,e[0].dims.length,c),le=[W,V];a&&le.push(R("bias",e[2].dataType,[n[te]].length,_));let ee=G("result",e[0].dataType,n.length,_),ae=()=>{let j="";if(f)c===4?j+=` 1213 let xValue = ${W.getByOffset("x_offset")}; 1214 let wValue = ${V.getByOffset("w_offset")}; 1215 dotProd = dotProd + dot(xValue, wValue); 1216 x_offset += 1u; 1217 w_offset += 1u;`:c===2?j+=` 1218 dotProd = dotProd + dot(vec4<${H}>(${W.getByOffset("x_offset")}, ${W.getByOffset("x_offset + 1u")}), vec4<${H}>(${V.getByOffset("w_offset")}, ${V.getByOffset("w_offset + 1u")})); 1219 x_offset += 2u; 1220 w_offset += 2u;`:c===1&&(j+=` 1221 dotProd = dotProd + dot(vec4<${H}>(${W.getByOffset("x_offset")}, ${W.getByOffset("x_offset + 1u")}, ${W.getByOffset("x_offset + 2u")}, ${W.getByOffset("x_offset + 3u")}), vec4<${H}>(${V.getByOffset("w_offset")}, ${V.getByOffset("w_offset + 1u")}, ${V.getByOffset("w_offset + 2u")}, ${V.getByOffset("w_offset + 3u")})); 1222 x_offset += 4u; 1223 w_offset += 4u;`);else if(j+=` 1224 let xValue = ${i?W.getByOffset(`${W.indicesToOffset(`${W.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${c}`):W.get("batch","inputChannel","idyR","idyC")}; 1225 `,c===1)j+=` 1226 let w_offset = ${V.indicesToOffset(`${V.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)}; 1227 let wValue = ${V.getByOffset(`w_offset / ${b}`)}; 1228 dotProd = dotProd + xValue * wValue;`;else for(let se=0;se<c;se++)j+=` 1229 let wValue${se} = ${V.getByOffset(`${V.indicesToOffset(`${V.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel + ${se}, wOutChannel)`)} / ${b}`)}; 1230 dotProd = dotProd + xValue[${se}] * wValue${se};`;return j},D=()=>{if(g===0)return"";if(!f)throw new Error(`packInputAs4 ${f} is not true.`);let j="";if(c===1){j+="dotProd = dotProd";for(let se=0;se<g;se++)j+=` 1231 + ${W.getByOffset(`x_offset + ${se}`)} * ${V.getByOffset(`w_offset + ${se}`)}`;j+=";"}else if(c===2){if(g!==2)throw new Error(`Invalid inputChannelsRemainder ${g}.`);j+=` 1232 let xValue = ${W.getByOffset("x_offset")}; 1233 let wValue = ${V.getByOffset("w_offset")}; 1234 dotProd = dotProd + dot(xValue, wValue);`}return j},P=` 1235 let outputIndices = ${ee.offsetToIndices(`global_idx * ${_}`)}; 1236 let batch = ${ee.indicesGet("outputIndices",0)}; 1237 let d1 = ${ee.indicesGet("outputIndices",te)}; 1238 let r = ${ee.indicesGet("outputIndices",Q)}; 1239 let c = ${ee.indicesGet("outputIndices",oe)}; 1240 let dyCorner = vec2<i32>(i32(r), i32(c)) - uniforms.pads; 1241 let dyRCorner = dyCorner.x; 1242 let dyCCorner = dyCorner.y; 1243 let groupId = d1 / uniforms.output_channels_per_group; 1244 let wOutChannel = d1 - groupId * uniforms.output_channels_per_group; 1245 // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). 1246 // ? = to be determined. : = across all values in that axis. 1247 var dotProd = ${ee.type.value}(0.0); 1248 var wR: u32 = 0; 1249 if (uniforms.dilations.x == 1) { 1250 // Minimum wR >= 0 that satisfies (dyRCorner + wR) % (uniforms.strides.x) == 0 1251 wR = u32(((dyRCorner + i32(uniforms.strides.x) - 1) / i32(uniforms.strides.x)) * i32(uniforms.strides.x) - dyRCorner); 1252 } 1253 for (; wR < uniforms.effective_filter_dims.x; wR = wR + 1) { 1254 if (wR % uniforms.dilations.x != 0) { 1255 continue; 1256 } 1257 let dyR = (${H}(dyRCorner) + ${H}(wR)) / ${H}(uniforms.strides[0]); 1258 let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x; 1259 if (dyR < 0.0 || dyR >= ${H}(uniforms.Dy_shape[${Q}]) || fract(dyR) > 0.0 || 1260 wRPerm < 0) { 1261 continue; 1262 } 1263 let idyR: u32 = u32(dyR); 1264 var wC: u32 = 0; 1265 if (uniforms.dilations.y == 1) { 1266 // Minimum wC >= 0 that satisfies (dyCCorner + wC) % (uniforms.strides.y) == 0 1267 wC = u32(((dyCCorner + i32(uniforms.strides.y) - 1) / i32(uniforms.strides.y)) * i32(uniforms.strides.y) - dyCCorner); 1268 } 1269 for (; wC < uniforms.effective_filter_dims.y; wC = wC + 1) { 1270 if (wC % uniforms.dilations.y != 0) { 1271 continue; 1272 } 1273 let dyC = (${H}(dyCCorner) + ${H}(wC)) / ${H}(uniforms.strides.y); 1274 let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y; 1275 if (dyC < 0.0 || dyC >= ${H}(uniforms.Dy_shape[${oe}]) || 1276 fract(dyC) > 0.0 || wCPerm < 0) { 1277 continue; 1278 } 1279 let idyC: u32 = u32(dyC); 1280 var inputChannel = groupId * uniforms.input_channels_per_group; 1281 ${f?` 1282 var x_offset = ${W.indicesToOffset(`${W.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${c}; 1283 var w_offset = ${V.indicesToOffset(`${V.type.indices}(wRPerm, wCPerm, inputChannel, wOutChannel)`)} / ${b}; 1284 `:""} 1285 for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group_int; d2 = d2 + ${f?4:c}) { 1286 ${ae()} 1287 inputChannel = inputChannel + ${f?4:c}; 1288 } 1289 ${D()} 1290 wC = wC + uniforms.strides.y - 1; 1291 } 1292 wR = wR + uniforms.strides[0] - 1; 1293 } 1294 let value = dotProd${a?` + bias[d1 / ${_}]`:""}; 1295 ${ee.setByOffset("global_idx","value")}; 1296 `;return` 1297 ${q.registerUniforms(X).declareVariables(...le,ee)} 1298 ${q.mainStart()} 1299 ${q.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")}; 1300 ${P}}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${t.cacheKey};${c}${b}${_}${f}${g}`,inputDependencies:$},getRunData:()=>({dispatchGroup:{x:w[0],y:w[1],z:w[2]},outputs:[{dims:r?r(n):n,dataType:e[0].dataType}],programUniforms:A}),getShaderSource:O}}}),Xo,Yo,Jo,Ni,uc,eu,Mi,tu,lc,Pm=U(()=>{Mm(),Ct(),mt(),Xo=(e,t,r,a,n,i)=>(e-1)*t+r+(a-1)*n+1-i,Yo=(e,t,r,a,n)=>{let i=Math.floor(e/2);t==="SAME_UPPER"?(r[a]=i,r[n]=e-i):t==="SAME_LOWER"&&(r[a]=e-i,r[n]=i)},Jo=(e,t,r,a,n,i,s,u,d,l)=>{let c=e.length-2,f=l.length===0;d.length<c&&d.push(...Array(c-d.length).fill(0));let m=e[0],g=t[u?3:1]*n;for(let _=0,b=e.length-c-(u?1:0);_<c;++_,++b){let x=e[b],w=f?x*s[_]:l[_],$=Xo(x,s[_],i[_],t[b],r[_],w);Yo($,a,i,_,_+c),f&&l.push(s[_]*(x-1)+d[_]+(t[b]-1)*r[_]+1-i[_]-i[_+c])}l.splice(0,0,m),l.splice(u?3:1,0,g)},Ni=(e,t)=>{let r=e.kernelShape.slice();if(e.kernelShape.length===0||e.kernelShape.reduce((f,m)=>f*m,1)===0){r.length=0;for(let f=2;f<t[1].dims.length;++f)r.push(t[1].dims[f])}let a=e.format==="NHWC";r.splice(0,0,t[1].dims[0]),r.splice(a?3:1,0,t[1].dims[1]);let n=e.pads.slice(),i=e.outputShape.slice(),s=e.outputPadding.slice(),u=t[0].dims,d=e.dilations.slice();if(d.reduce((f,m)=>f+m,0)===0){let f=t[0].dims.length-2;d=new Array(f).fill(1)}let l=e.strides.slice();if(l.reduce((f,m)=>f+m,0)===0){let f=t[0].dims.length-2;l=new Array(f).fill(1)}Jo(u,r,d,e.autoPad,e.group,n,l,a,s,i);let c=Object.assign({},e);return Object.assign(c,{kernelShape:r,pads:n,outputPadding:s,outputShape:i,dilations:d,strides:l}),c},uc=e=>{let t=La(e),r=e.format,a=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof e.autoPad>"u"?0:e.autoPad],n=e.dilations,i=e.group,s=e.kernelShape,u=e.pads,d=e.strides,l=e.wIsConst(),c=e.outputPadding,f=e.outputShape;return{autoPad:a,format:r,dilations:n,group:i,kernelShape:s,outputPadding:c,outputShape:f,pads:u,strides:d,wIsConst:l,...t,cacheKey:`${e.format};${t.activation};`}},eu=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length!==4&&e[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let r=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],a=e[1].dims[0];if(r!==a)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let n=e[1].dims[1]*t.group;if(e.length===3&&(e[2].dims.length!==1||e[2].dims[0]!==n))throw new Error("invalid bias");let i=e[0].dims.length-2;if(t.dilations.reduce((s,u)=>s+u,0)>0&&t.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(t.strides.reduce((s,u)=>s+u,0)>0&&t.strides.length!==i)throw new Error(`strides should be ${i}D`);if(t.pads.reduce((s,u)=>s+u,0)>0&&t.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(t.outputPadding.length!==i&&t.outputPadding.length!==0)throw new Error(`output_padding should be ${i}D`);if(t.kernelShape.reduce((s,u)=>s+u,0)>0&&t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape");if(t.outputShape.length!==0&&t.outputShape.length!==e[0].dims.length-2)throw new Error("invalid output shape")},Mi=(e,t,r,a)=>{let n=e.kernelCustomData.wT??e.compute(De(t[1],[2,3,0,1]),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=n);let i=[t[0],n];t.length===3&&i.push(t[2]),e.compute(oc(i,r,a),{inputs:i})},tu=(e,t)=>{let r=t.format==="NHWC",a=[e.inputs[0].reshape(r?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&a.push(e.inputs[2]);let n=t.kernelShape;(n.length===0||n[0]===0)&&(n=[e.inputs[1].dims[2]]);let i=t.dilations;(i.length===0||i[0]===0)&&(i=[1]);let s=t.strides;(s.length===0||s[0]===0)&&(s=[1]);let u=t.pads;u.length===0&&(u=[0,0]),u=[0,u[0],0,u[1]],s=[1].concat(s),i=[1].concat(i),n=[1].concat(n);let d=t.outputPadding;d=[0].concat(d);let l=Ni({...t,pads:u,strides:s,dilations:i,kernelShape:n,outputPadding:d},a);Mi(e,a,l,c=>r?[c[0],c[2],c[3]]:[c[0],c[1],c[3]])},lc=(e,t)=>{if(eu(e.inputs,t),e.inputs[0].dims.length===3)tu(e,t);else{let r=Ni(t,e.inputs);Mi(e,e.inputs,r)}}}),ru,dc,pc,Um=U(()=>{J(),re(),we(),ie(),ru=(e,t,r,a)=>{let n=C.size(t),i=t.length,s=R("input",e,i),u=G("output",e,i),d=r.dataType===6?r.getInt32Array()[0]:Number(r.getBigInt64Array()[0]),l=C.normalizeAxis(d,i),c=f=>{let m=` i32(${s.indicesGet("inputIndices","uniforms.axis")}) `,g=F("uniforms.input_shape","uniforms.axis",i),_=a.reverse?m+(a.exclusive?" + 1":""):"0",b=a.reverse?g:m+(a.exclusive?"":" + 1");return` 1301 ${f.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(s,u)} 1302 ${f.mainStart()} 1303 ${f.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 1304 var inputIndices = ${u.offsetToIndices("global_idx")}; 1305 var sum = ${u.type.value}(0); 1306 let first : i32 = ${_}; 1307 let last : i32 = ${b}; 1308 for (var i : i32 = first; i < last; i++) { 1309 ${s.indicesSet("inputIndices","uniforms.axis","u32(i)")}; 1310 sum = sum + ${s.getByIndices("inputIndices")}; 1311 } 1312 ${u.setByOffset("global_idx","sum")}; 1313 }`};return{name:"CumSum",shaderCache:{hint:a.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(n/64)},programUniforms:[{type:12,data:n},{type:12,data:l},...Z(t,t)]}),getShaderSource:c}},dc=(e,t)=>{let r=e.inputs[0].dims,a=e.inputs[0].dataType,n=e.inputs[1];e.compute(ru(a,r,n,t),{inputs:[0]})},pc=e=>{let t=e.exclusive===1,r=e.reverse===1;return ce({exclusive:t,reverse:r})}}),iu,au,nu,cc,fc,qm=U(()=>{J(),re(),we(),ie(),iu=e=>{if(!e||e.length!==1)throw new Error("DepthToSpace requires 1 input.");if(e[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},au=(e,t,r,a)=>{let n=[];n.push(`fn perm(i: ${a.type.indices}) -> ${r.type.indices} { 1314 var a: ${r.type.indices};`);for(let i=0;i<t;++i)n.push(r.indicesSet("a",e[i],`i[${i}]`));return n.push("return a;}"),n.join(` 1315`)},nu=(e,t)=>{let r,a,n,i,s,u,d=t.format==="NHWC",l=t.blocksize,c=t.mode==="DCR";d?([r,a,n,i]=e.dims,s=c?[r,a,n,l,l,i/l**2]:[r,a,n,i/l**2,l,l],u=c?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([r,a,n,i]=[e.dims[0],e.dims[2],e.dims[3],e.dims[1]],s=c?[r,l,l,i/l**2,a,n]:[r,i/l**2,l,l,a,n],u=c?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let f=e.reshape(s),m=f.dims.length,g=e.dataType,_=R("a",g,m),b=G("output",g,m),x=w=>` 1316 ${w.registerUniform("output_size","u32").declareVariables(_,b)} 1317 1318 ${au(u,m,_,b)} 1319 1320 ${w.mainStart()} 1321 ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1322 1323 let indices = ${b.offsetToIndices("global_idx")}; 1324 let aIndices = perm(indices); 1325 1326 ${b.setByOffset("global_idx",_.getByIndices("aIndices"))} 1327 }`;return{name:"DepthToSpace",shaderCache:{hint:`${e.dims};${t.blocksize};${t.mode}`,inputDependencies:["rank"]},getRunData:w=>{let $=d?[r,a*l,n*l,i/l**2]:[r,i/l**2,a*l,n*l],k=C.size($),S=f.dims,T=C.sortBasedOnPerm(S,u);return{outputs:[{dims:$,dataType:w[0].dataType}],dispatchGroup:{x:Math.ceil(k/64)},programUniforms:[{type:12,data:k},...Z(S,T)]}},getShaderSource:x}},cc=(e,t)=>{iu(e.inputs),e.compute(nu(e.inputs[0],t))},fc=e=>ce({blocksize:e.blocksize,mode:e.mode,format:e.format})}),zr,Zt,Pi,su,ou,uu,lu,Ui,du,hc,mc,Wm=U(()=>{J(),re(),we(),ie(),zr="[a-zA-Z]|\\.\\.\\.",Zt="("+zr+")+",Pi="^"+Zt+"$",su="("+Zt+",)*"+Zt,ou="^"+su+"$",uu=class{constructor(e=-1){this.symbolToIndices=new Map,this.inputIndex=e}addSymbol(e,t){let r=this.symbolToIndices.get(e);r===void 0?r=[t]:r.push(t),this.symbolToIndices.set(e,r)}},lu=class{constructor(e,t){var n;this.equation=t,this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[r,a]=t.includes("->")?t.split("->",2):[t,""];if(!r.match(RegExp(ou)))throw new Error("Invalid LHS term");if(r.split(",").forEach((i,s)=>{let u=e[s].dims.slice();if(!i.match(RegExp(Pi)))throw new Error("Invalid LHS term");let d=this.processTerm(i,!0,u,s);this.lhs.push(d)}),a==="")a+=[...this.symbolToInfo.entries()].filter(([i,s])=>s.count===1||i==="...").map(([i])=>i).join("");else if(!a.match(RegExp(Zt)))throw new Error("Invalid RHS");(n=a.match(RegExp(zr,"g")))==null||n.forEach(i=>{if(i==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let s=this.symbolToInfo.get(i);if(s===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(s.dimValue)}}),this.rhs=this.processTerm(a,!1,this.outputDims)}addSymbol(e,t,r){let a=this.symbolToInfo.get(e);if(a!==void 0){if(a.dimValue!==t&&a.count!==1)throw new Error("Dimension mismatch");a.count++,a.inputIndices.push(r)}else a={count:1,dimValue:t,inputIndices:[r]};this.symbolToInfo.set(e,a)}processTerm(e,t,r,a=-1){let n=r.length,i=!1,s=[],u=0;if(!e.match(RegExp(Pi))&&!t&&e!=="")throw new Error("Invalid LHS term");let d=e.match(RegExp(zr,"g")),l=new uu(a);return d==null||d.forEach((c,f)=>{if(c==="..."){if(i)throw new Error("Only one ellipsis is allowed per input term");i=!0;let m=n-d.length+1;if(m<0)throw new Error("Ellipsis out of bounds");if(s=r.slice(u,u+m),this.hasEllipsis){if(this.ellipsisDims.length!==s.length||this.ellipsisDims.toString()!==s.toString())throw new Error("Ellipsis dimensions mismatch")}else if(t)this.hasEllipsis=!0,this.ellipsisDims=s;else throw new Error("Ellipsis must be specified in the LHS");for(let g=0;g<s.length;g++){let _=String.fromCharCode(48+g);l.addSymbol(_,f+g),this.addSymbol(_,r[u++],a)}}else l.addSymbol(c,f+(this.hasEllipsis?this.ellipsisDims.length-1:0)),this.addSymbol(c,r[u++],a)}),l}},Ui=e=>e+"_max",du=(e,t,r,a)=>{let n=e.map(l=>l.length).map((l,c)=>R(`input${c}`,t,l)),i=C.size(a),s=G("output",t,a.length),u=[...r.symbolToInfo.keys()].filter(l=>!r.rhs.symbolToIndices.has(l)),d=l=>{let c=[],f="var prod = 1.0;",m="var sum = 0.0;",g="sum += prod;",_=[],b=[],x=[],w=[],$=r.symbolToInfo.size===r.rhs.symbolToIndices.size;r.symbolToInfo.forEach((S,T)=>{var E;if(r.rhs.symbolToIndices.has(T)){let z=(E=r.rhs.symbolToIndices.get(T))==null?void 0:E[0];z!==void 0&&r.lhs.forEach((A,O)=>{if(S.inputIndices.includes(O)){let q=A.symbolToIndices.get(T);if(q===void 0)throw new Error("Invalid symbol error");q.forEach(X=>{c.push(`${n[O].indicesSet(`input${O}Indices`,X,s.indicesGet("outputIndices",z))}`)})}})}else r.lhs.forEach((z,A)=>{if(S.inputIndices.includes(A)){let O=z.symbolToIndices.get(T);if(O===void 0)throw new Error("Invalid symbol error");O.forEach(q=>{_.push(`${n[A].indicesSet(`input${A}Indices`,q,`${T}`)}`)}),w.push(`prod *= ${n[A].getByIndices(`input${A}Indices`)};`)}}),b.push(`for(var ${T}: u32 = 0; ${T} < uniforms.${Ui(T)}; ${T}++) {`),x.push("}")});let k=$?[...c,`let sum = ${n.map((S,T)=>S.getByIndices(`input${T}Indices`)).join(" * ")};`]:[...c,m,...b,..._,f,...w,g,...x];return` 1328 ${l.registerUniforms(u.map(S=>({name:`${Ui(S)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...n,s)} 1329 1330 ${l.mainStart()} 1331 ${l.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 1332 var outputIndices = ${s.offsetToIndices("global_idx")}; 1333 ${n.map((S,T)=>`var input${T}Indices: ${n[T].type.indices};`).join(` 1334`)} 1335 ${k.join(` 1336`)}; 1337 ${s.setByOffset("global_idx","sum")}; 1338 }`};return{name:"Einsum",shaderCache:{hint:r.equation,inputDependencies:e.map(()=>"rank")},getRunData:()=>{let l=u.filter(f=>r.symbolToInfo.has(f)).map(f=>{var m;return{type:12,data:((m=r.symbolToInfo.get(f))==null?void 0:m.dimValue)||0}});l.push({type:12,data:i});let c=e.map((f,m)=>[...Z(f)]).reduce((f,m)=>f.concat(m),l);return c.push(...Z(a)),{outputs:[{dims:a,dataType:t}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:c}},getShaderSource:d}},hc=(e,t)=>{let r=new lu(e.inputs,t.equation),a=r.outputDims,n=e.inputs.map((i,s)=>i.dims);e.compute(du(n,e.inputs[0].dataType,r,a))},mc=e=>{let t=e.equation.replace(/\s+/g,"");return ce({equation:t})}}),pu,qi,cu,fu,gc,Lm=U(()=>{J(),re(),ie(),pu=e=>{if(!e||e.length!==2)throw new Error("Expand requires 2 input.");let t=e[0].dims,r=Array.from(e[1].getBigInt64Array(),Number),a=r.length<t.length?0:r.length-t.length,n=t.length<r.length?0:t.length-r.length;for(;a<r.length&&n<t.length;++a,++n)if(r[a]!==t[n]&&r[a]!==1&&t[n]!==1)throw new Error("Expand requires shape to be broadcastable to input")},qi=(e,t)=>{let r=e.length-t.length,a=[];for(let n=0;n<r;++n)a.push(e[n]);for(let n=0;n<t.length;++n)a.push(t[n]===1?e[n+r]:t[n]);return a},cu=(e,t)=>e.length>t.length?qi(e,t):qi(t,e),fu=e=>{let t=e[0].dims,r=Array.from(e[1].getBigInt64Array(),Number),a=cu(t,r),n=e[0].dataType,i=n===9||C.size(t)===1,s=n===9||t.length>0&&t[t.length-1]%4===0?4:1,u=i||a.length>0&&a[a.length-1]%4===0?4:1,d=Math.ceil(C.size(a)/u),l=f=>{let m=R("input",n,t.length,s),g=G("output",n,a.length,u),_;if(n===9){let b=(x,w,$="")=>` 1339 let outputIndices${w} = ${g.offsetToIndices(`outputOffset + ${w}u`)}; 1340 let offset${w} = ${m.broadcastedIndicesToOffset(`outputIndices${w}`,g)}; 1341 let index${w} = offset${w} / 4u; 1342 let component${w} = offset${w} % 4u; 1343 ${x}[${w}] = ${$}(${m.getByOffset(`index${w}`)}[component${w}]); 1344 `;_=` 1345 let outputOffset = global_idx * ${u}; 1346 var data = vec4<u32>(0); 1347 ${b("data",0,"u32")} 1348 ${b("data",1,"u32")} 1349 ${b("data",2,"u32")} 1350 ${b("data",3,"u32")} 1351 ${g.setByOffset("global_idx","data")} 1352 }`}else _=` 1353 let outputIndices = ${g.offsetToIndices(`global_idx * ${u}`)}; 1354 let inputOffset = ${m.broadcastedIndicesToOffset("outputIndices",g)}; 1355 let data = ${g.type.value}(${m.getByOffset(`inputOffset / ${s}`)}); 1356 ${g.setByOffset("global_idx","data")} 1357 }`;return` 1358 ${f.registerUniform("vec_size","u32").declareVariables(m,g)} 1359 ${f.mainStart()} 1360 ${f.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} 1361 ${_}`},c=[{type:12,data:d},...Z(t,a)];return{name:"Expand",shaderCache:{hint:`${a.length};${s}${u}`,inputDependencies:["rank"]},getShaderSource:l,getRunData:()=>({outputs:[{dims:a,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:c})}},gc=e=>{pu(e.inputs),e.compute(fu(e.inputs),{inputs:[0]})}}),hu,_c,Vm=U(()=>{J(),re(),ie(),Wa(),hu=e=>{let t=e[0].dataType,r=C.size(e[0].dims),a=C.size(e[1].dims),n=a%4===0,i=s=>{let u=R("x",t,[1],4),d=R("bias",t,[1],4),l=G("y",t,[1],4),c=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],f=g=>` 1362 let bias${g}_offset: u32 = (global_idx * 4 + ${g}) % uniforms.bias_size; 1363 let bias${g} = ${d.getByOffset(`bias${g}_offset / 4`)}[bias${g}_offset % 4];`,m=n?` 1364 let bias = ${d.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${f(0)}${f(1)}${f(2)}${f(3)} 1365 let bias = ${u.type.value}(bias0, bias1, bias2, bias3);`;return`${s.registerUniforms(c).declareVariables(u,d,l)} 1366 1367 ${ma(Ee(t))} 1368 1369 ${s.mainStart(Mt)} 1370 ${s.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} 1371 1372 let x = ${u.getByOffset("global_idx")}; 1373 ${m} 1374 let x_in = x + bias; 1375 ${l.setByOffset("global_idx",ga("x_in"))} 1376 }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${n}`,inputDependencies:["type","type"]},getShaderSource:i,getRunData:s=>({outputs:[{dims:s[0].dims,dataType:s[0].dataType}],programUniforms:[{type:12,data:Math.ceil(r/4)},{type:12,data:a}],dispatchGroup:{x:Math.ceil(r/Mt/4)}})}},_c=e=>{e.inputs.length<2||C.size(e.inputs[1].dims)===0?Mp(e):e.compute(hu(e.inputs))}}),mu,gu,yc,bc,jm=U(()=>{J(),re(),we(),ie(),mu=e=>{if(!e||e.length!==2)throw new Error("Gather requires 2 inputs.")},gu=(e,t)=>{let r=e[0].dims,a=e[1].dims,n=r.length,i=C.normalizeAxis(t.axis,n),s=r.slice(0);s.splice(i,1,...a);let u=r[i],d=e[0].dataType===9?4:1,l=Math.ceil(C.size(s)/d),c=[{type:12,data:l},{type:6,data:u},{type:12,data:i},...Z(e[0].dims,e[1].dims,s)],f=m=>{let g=R("data",e[0].dataType,e[0].dims.length,d),_=R("inputIndices",e[1].dataType,e[1].dims.length),b=G("output",e[0].dataType,s.length,d),x=$=>{let k=a.length,S=`var indicesIndices${$} = ${_.type.indices}(0);`;for(let T=0;T<k;T++)S+=`${k>1?`indicesIndices${$}[${T}]`:`indicesIndices${$}`} = ${s.length>1?`outputIndices${$}[uniforms.axis + ${T}]`:`outputIndices${$}`};`;S+=` 1377 var idx${$} = ${_.getByIndices(`indicesIndices${$}`)}; 1378 if (idx${$} < 0) { 1379 idx${$} = idx${$} + uniforms.axisDimLimit; 1380 } 1381 var dataIndices${$} : ${g.type.indices}; 1382 `;for(let T=0,E=0;T<n;T++)T===i?(S+=`${n>1?`dataIndices${$}[${T}]`:`dataIndices${$}`} = u32(idx${$});`,E+=k):(S+=`${n>1?`dataIndices${$}[${T}]`:`dataIndices${$}`} = ${s.length>1?`outputIndices${$}[${E}]`:`outputIndices${$}`};`,E++);return S},w;if(e[0].dataType===9){let $=(k,S,T="")=>` 1383 let outputIndices${S} = ${b.offsetToIndices(`outputOffset + ${S}u`)}; 1384 ${x(S)}; 1385 let offset${S} = ${g.indicesToOffset(`dataIndices${S}`)}; 1386 let index${S} = offset${S} / 4u; 1387 let component${S} = offset${S} % 4u; 1388 ${k}[${S}] = ${T}(${g.getByOffset(`index${S}`)}[component${S}]); 1389 `;w=` 1390 let outputOffset = global_idx * ${d}; 1391 var value = vec4<u32>(0); 1392 ${$("value",0,"u32")} 1393 ${$("value",1,"u32")} 1394 ${$("value",2,"u32")} 1395 ${$("value",3,"u32")} 1396 ${b.setByOffset("global_idx","value")} 1397 `}else w=` 1398 let outputIndices = ${b.offsetToIndices("global_idx")}; 1399 ${x("")}; 1400 let value = ${g.getByIndices("dataIndices")}; 1401 ${b.setByOffset("global_idx","value")}; 1402 `;return` 1403 ${m.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(g,_,b)} 1404 ${m.mainStart()} 1405 ${m.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 1406 ${w} 1407 }`};return{name:"Gather",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:s,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:c}),getShaderSource:f}},yc=e=>ce({axis:e.axis}),bc=(e,t)=>{let r=e.inputs;mu(r),e.compute(gu(e.inputs,t))}}),_u,$c,wc,Hm=U(()=>{J(),re(),ie(),_u=(e,t,r,a,n,i,s,u,d)=>{let l=[{type:12,data:i},{type:12,data:a},{type:12,data:n},{type:12,data:r},{type:12,data:s},{type:12,data:u},{type:12,data:d}],c=[i];l.push(...Z(t.dims,c));let f=m=>{let g=R("indices_data",t.dataType,t.dims.length),_=G("input_slice_offsets_data",12,1,1),b=[g,_],x=[{name:"output_size",type:"u32"},{name:"batch_dims",type:"u32"},{name:"input_dims",type:"u32",length:n.length},{name:"sizes_from_slice_dims_data",type:"u32",length:r.length},{name:"num_slices_per_batch",type:"u32"},{name:"input_batch_stride",type:"u32"},{name:"num_slice_dims",type:"u32"}];return` 1408 ${m.registerUniforms(x).declareVariables(...b)} 1409 ${m.mainStart()} 1410 ${m.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1411 let batch_idx = global_idx / uniforms.num_slices_per_batch; 1412 let base_offset = batch_idx * uniforms.input_batch_stride; 1413 1414 let slice_indices_base_offset = global_idx * uniforms.num_slice_dims; 1415 var relative_slice_offset = 0; 1416 for (var dim_idx = 0u; dim_idx < uniforms.num_slice_dims; dim_idx ++) { 1417 var index = i32(indices_data[dim_idx + slice_indices_base_offset].x); 1418 let input_dim_idx = uniforms.batch_dims + dim_idx; 1419 if (index < 0) { 1420 ${n.length===1?"index += i32(uniforms.input_dims);":"index += i32(uniforms.input_dims[input_dim_idx]);"} 1421 } 1422 ${r.length===1?"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data);":"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data[dim_idx]);"} 1423 } 1424 1425 input_slice_offsets_data[global_idx] = base_offset + u32(relative_slice_offset); 1426 }`};return e.compute({name:"computeSliceOffsets",shaderCache:{hint:`${n.length}_${r.length}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:c,dataType:e.inputs[1].dataType}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:l}),getShaderSource:f},{inputs:[t],outputs:[-1]})[0]},$c=(e,t)=>{let r=e.inputs,a=r[0].dims,n=r[0].dataType,i=r[1].dims,s=i[i.length-1],u=C.sizeToDimension(i,i.length-1),d=C.sizeFromDimension(a,t.batchDims+s),l=C.sizeToDimension(a,t.batchDims),c=C.sizeFromDimension(a,t.batchDims),f=u/l,m=new Array(s),g=d;for(let S=0;S<s;++S)m[s-1-S]=g,g*=a[t.batchDims+s-1-S];let _=_u(e,r[1],m,t.batchDims,a,u,f,c,s),b=t.batchDims+s;if(b>a.length)throw new Error("last dimension of indices must not be larger than rank of input tensor");let x=i.slice(0,-1).concat(a.slice(b)),w=C.size(x),$=[{type:12,data:w},{type:12,data:d},...Z(r[0].dims,_.dims,x)],k=S=>{let T=R("data",r[0].dataType,r[0].dims.length),E=R("slice_offsets",12,_.dims.length),z=G("output",r[0].dataType,x.length);return` 1427 ${S.registerUniform("output_size","u32").registerUniform("slice_size","u32").declareVariables(T,E,z)} 1428 ${S.mainStart()} 1429 ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1430 let slice_offset = slice_offsets[global_idx / uniforms.slice_size]; 1431 output[global_idx] = data[u32(slice_offset) + global_idx % uniforms.slice_size]; 1432 }`};e.compute({name:"GatherND",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:x,dataType:n}],dispatchGroup:{x:Math.ceil(w/64)},programUniforms:$}),getShaderSource:k},{inputs:[r[0],_]})},wc=e=>({batchDims:e.batch_dims,cacheKey:""})}),yu,bu,vc,xc,Gm=U(()=>{J(),re(),we(),ie(),yu=(e,t)=>{if(e.length<3||e.length>4)throw new Error("GatherBlockQuantized requires 3 or 4 inputs.");let r=C.normalizeAxis(t.quantizeAxis,e[0].dims.length),a=t.blockSize,n=e[0],i=e[2],s=e.length===4?e[3]:void 0;if(i.dims.length!==n.dims.length||!n.dims.map((u,d)=>d===r?Math.ceil(u/a)===i.dims[d]:u===i.dims[d]).reduce((u,d)=>u&&d,!0))throw new Error("Scales must have the same rank as the input tensor and the dims should match except on gatherAxis.");if(s){if(s.dataType!==n.dataType)throw new Error("Zero point must have the same data type as the input tensor.");if(s.dims.length!==i.dims.length||!s.dims.map((u,d)=>u===i.dims[d]).reduce((u,d)=>u&&d,!0))throw new Error("Zero point must have the same rank as the input tensor and the dims should match except on quantizeAxis.")}},bu=(e,t)=>{let r=e[0].dims,a=e[1].dims,n=r.length,i=C.normalizeAxis(t.gatherAxis,n),s=C.normalizeAxis(t.quantizeAxis,n),u=r.slice(0);u.splice(i,1,...a);let d=C.size(u),l=e[2].dataType,c=e[0].dataType===22,f=[{type:12,data:d},{type:12,data:s},{type:12,data:i},{type:12,data:t.blockSize},...Z(...e.map((g,_)=>g.dims),u)],m=g=>{let _=R("data",e[0].dataType,e[0].dims.length),b=R("inputIndices",e[1].dataType,e[1].dims.length),x=R("scales",e[2].dataType,e[2].dims.length),w=e.length>3?R("zeroPoint",e[3].dataType,e[3].dims.length):void 0,$=G("output",l,u.length),k=[_,b,x];w&&k.push(w);let S=[{name:"output_size",type:"u32"},{name:"quantize_axis",type:"u32"},{name:"gather_axis",type:"u32"},{name:"block_size",type:"u32"}];return` 1433 ${g.registerUniforms(S).declareVariables(...k,$)} 1434 ${g.mainStart()} 1435 let output_indices = ${$.offsetToIndices("global_idx")}; 1436 var indices_indices = ${b.type.indices}(0); 1437 ${a.length>1?` 1438 for (var i: u32 = 0; i < ${a.length}; i++) { 1439 let index = ${$.indicesGet("output_indices","uniforms.gather_axis + i")}; 1440 ${b.indicesSet("indices_indices","i","index")}; 1441 }`:`indices_indices = ${$.indicesGet("output_indices","uniforms.gather_axis")};`}; 1442 var data_indices = ${_.type.indices}(0); 1443 for (var i: u32 = 0; i < uniforms.gather_axis; i++) { 1444 let index = ${$.indicesGet("output_indices","i")}; 1445 ${_.indicesSet("data_indices","i","index")}; 1446 } 1447 var index_from_indices = ${b.getByIndices("indices_indices")}; 1448 if (index_from_indices < 0) { 1449 index_from_indices += ${r[i]}; 1450 } 1451 ${_.indicesSet("data_indices","uniforms.gather_axis","u32(index_from_indices)")}; 1452 for (var i = uniforms.gather_axis + 1; i < ${u.length}; i++) { 1453 let index = ${$.indicesGet("output_indices",`i + ${a.length} - 1`)};
1454 ${_.indicesSet("data_indices","i","index")}; 1455 } 1456 let data_offset = ${_.indicesToOffset("data_indices")}; 1457 let data_index = data_offset % 8; 1458 // Convert 4-bit packed data to 8-bit packed data. 1459 let packed_4bit_quantized_data = ${_.getByOffset("data_offset / 8")}; 1460 let packed_8bit_quantized_data = (packed_4bit_quantized_data >> (4 * (data_index % 2))) & 0x0f0f0f0f; 1461 let quantized_data_vec = ${c?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_quantized_data)); 1462 let quantized_data = quantized_data_vec[data_index / 2]; 1463 var scale_indices = data_indices; 1464 let quantize_axis_index = ${x.indicesGet("data_indices","uniforms.quantize_axis")} / uniforms.block_size; 1465 ${x.indicesSet("scale_indices","uniforms.quantize_axis","quantize_axis_index")}; 1466 var scale = ${x.getByIndices("scale_indices")}; 1467 ${w?` 1468 let zero_point_indices = scale_indices; 1469 let zero_point_offset = ${w.indicesToOffset("zero_point_indices")}; 1470 let zero_point_index = zero_point_offset % 8; 1471 let packed_4bit_zero_points = ${w.getByOffset("zero_point_offset / 8")}; 1472 let packed_8bit_zero_points = (packed_4bit_zero_points >> (4 * (zero_point_index % 2))) & 0x0f0f0f0f; 1473 let zero_point_vec = ${c?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_zero_points)); 1474 let zero_point = zero_point_vec[zero_point_index / 2];`:"var zero_point = 0"}; 1475 let dequantized_data = ${Ee(l)}(quantized_data - zero_point) * scale; 1476 ${$.setByOffset("global_idx","dequantized_data")}; 1477 }`};return{name:"GatherBlockQuantized",shaderCache:{hint:`${t.cacheKey};${e.filter((g,_)=>_!==1).map(g=>g.dims.join("_")).join(";")}`,inputDependencies:Array.from({length:e.length},(g,_)=>"rank")},getRunData:()=>({outputs:[{dims:u,dataType:l}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:f}),getShaderSource:m}},vc=(e,t)=>{let r=e.inputs;yu(r,t),e.compute(bu(e.inputs,t))},xc=e=>ce({blockSize:e.blockSize,gatherAxis:e.gatherAxis,quantizeAxis:e.quantizeAxis})}),$u,wu,Sc,kc,Fm=U(()=>{J(),re(),we(),ie(),$u=e=>{if(!e||e.length!==2)throw new Error("GatherElements requires 2 inputs.");if(e[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(e[0].dims.length!==e[1].dims.length)throw new Error(`GatherElements requires that the data input and 1478 indices input tensors be of same rank.`)},wu=(e,t)=>{let r=e[0].dims,a=e[0].dataType,n=r.length,i=e[1].dims,s=e[1].dataType,u=C.normalizeAxis(t.axis,n),d=r[u],l=i.slice(0),c=C.size(l),f=R("input",a,n),m=R("indicesInput",s,i.length),g=G("output",a,l.length),_=[{type:12,data:c},{type:6,data:d},{type:12,data:u}];return _.push(...Z(r,i,l)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:l,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:_}),getShaderSource:b=>` 1479 ${b.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(f,m,g)} 1480 ${b.mainStart()} 1481 ${b.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 1482 1483 let outputIndices = ${g.offsetToIndices("global_idx")}; 1484 1485 var idx = ${m.getByOffset("global_idx")}; 1486 if (idx < 0) { 1487 idx = idx + uniforms.axisDimLimit; 1488 } 1489 var inputIndices = ${f.type.indices}(outputIndices); 1490 ${f.indicesSet("inputIndices","uniforms.axis","u32(idx)")}; 1491 let value = ${f.getByIndices("inputIndices")}; 1492 1493 ${g.setByOffset("global_idx","value")}; 1494 }`}},Sc=e=>ce({axis:e.axis}),kc=(e,t)=>{let r=e.inputs;$u(r),e.compute(wu(e.inputs,t))}}),vu,xu,Tc,Ic,Km=U(()=>{J(),re(),ie(),vu=e=>{if(!e)throw new Error("Input is missing");if(e.length<2||e.length>3)throw new Error("Invaid input number.");if(e.length===3&&e[2].dims.length>2)throw new Error("Invalid input shape of C");if(e[0].dataType!==e[1].dataType||e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("Input types are mismatched")},xu=(e,t)=>{let r=e[0].dims.slice(),a=e[1].dims.slice(),[n,i,s]=Sd.getShapeOfGemmResult(r,t.transA,a,t.transB,e.length===3?e[2].dims:void 0),u=[n,i];if(!u)throw new Error("Can't use gemm on the given tensors");let d=16,l=Math.ceil(i/d),c=Math.ceil(n/d),f=!0,m=C.size(u),g=[{type:12,data:f?l:m},{type:12,data:n},{type:12,data:i},{type:12,data:s},{type:1,data:t.alpha},{type:1,data:t.beta}],_=["type","type"];e.length===3&&(g.push(...Z(e[2].dims)),_.push("rank")),g.push(...Z(u));let b=w=>{let $="";t.transA&&t.transB?$="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":t.transA&&!t.transB?$="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!t.transA&&t.transB?$="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!t.transA&&!t.transB&&($="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let k=t.alpha===1?"":"value *= uniforms.alpha;",S=R("a",e[0].dataType,e[0].dims),T=R("b",e[1].dataType,e[1].dims),E=S.type.value,z=null,A=[S,T];e.length===3&&(z=R("c",e[2].dataType,e[2].dims.length),A.push(z));let O=G("output",e[0].dataType,u.length);A.push(O);let q=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` 1495 ${w.registerUniforms(q).declareVariables(...A)} 1496 1497 ${w.mainStart()} 1498 ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1499 1500 let m = global_idx / uniforms.N; 1501 let n = global_idx % uniforms.N; 1502 1503 var value = ${E}(0); 1504 for (var k: u32 = 0u; k < uniforms.K; k++) { 1505 ${$} 1506 } 1507 1508 ${k}
1509 ${z!=null?`let cOffset = ${z.broadcastedIndicesToOffset("vec2(m, n)",O)}; value += ${E}(uniforms.beta) * ${z.getByOffset("cOffset")};`:""} 1510 output[global_idx] = value; 1511 }`},x=w=>{let $=R("a",e[0].dataType,e[0].dims),k=R("b",e[1].dataType,e[1].dims),S=null,T=[$,k];e.length===3&&(S=R("c",e[2].dataType,e[2].dims.length),T.push(S));let E=G("output",e[0].dataType,u.length);T.push(E);let z=[{name:"num_tile_n",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}],A="",O="";t.transA&&t.transB?(O=` 1512 var col = tile_row_start + local_id.x; 1513 var row = k_start + local_id.y; 1514 if (col < uniforms.M && row < uniforms.K) { 1515 tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; 1516 } else { 1517 tile_a[local_id.y][local_id.x] = ${$.type.value}(0); 1518 } 1519 1520 col = k_start + local_id.x; 1521 row = tile_col_start + local_id.y; 1522 if (col < uniforms.K && row < uniforms.N) { 1523 tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; 1524 } else { 1525 tile_b[local_id.y][local_id.x] = ${k.type.value}(0); 1526 } 1527 `,A="value += tile_a[k][local_id.y] * tile_b[local_id.x][k];"):t.transA&&!t.transB?(O=` 1528 var col = tile_row_start + local_id.x; 1529 var row = k_start + local_id.y; 1530 if (col < uniforms.M && row < uniforms.K) { 1531 tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; 1532 } else { 1533 tile_a[local_id.y][local_id.x] = ${$.type.value}(0); 1534 } 1535 1536 col = tile_col_start + local_id.x; 1537 row = k_start + local_id.y; 1538 if (col < uniforms.N && row < uniforms.K) { 1539 tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; 1540 } else { 1541 tile_b[local_id.y][local_id.x] = ${k.type.value}(0); 1542 } 1543 `,A="value += tile_a[k][local_id.y] * tile_b[k][local_id.x];"):!t.transA&&t.transB?(O=` 1544 var col = k_start + local_id.x; 1545 var row = tile_row_start + local_id.y; 1546 if (col < uniforms.K && row < uniforms.M) { 1547 tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; 1548 } else { 1549 tile_a[local_id.y][local_id.x] = ${$.type.value}(0); 1550 } 1551 1552 col = k_start + local_id.x; 1553 row = tile_col_start + local_id.y; 1554 if (col < uniforms.K && row < uniforms.N) { 1555 tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; 1556 } else { 1557 tile_b[local_id.y][local_id.x] = ${k.type.value}(0); 1558 } 1559 `,A="value += tile_a[local_id.y][k] * tile_b[local_id.x][k];"):!t.transA&&!t.transB&&(O=` 1560 var col = k_start + local_id.x; 1561 var row = tile_row_start + local_id.y; 1562 if (col < uniforms.K && row < uniforms.M) { 1563 tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; 1564 } else { 1565 tile_a[local_id.y][local_id.x] = ${$.type.value}(0); 1566 } 1567 1568 col = tile_col_start + local_id.x; 1569 row = k_start + local_id.y; 1570 if (col < uniforms.N && row < uniforms.K) { 1571 tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; 1572 } else { 1573 tile_b[local_id.y][local_id.x] = ${k.type.value}(0); 1574 } 1575 `,A="value += tile_a[local_id.y][k] * tile_b[k][local_id.x];");let q=t.alpha===1?"":"value *= uniforms.alpha;";return` 1576 ${w.registerUniforms(z).declareVariables(...T)} 1577 var<workgroup> tile_a: array<array<${$.type.storage}, ${d}>, ${d}>; 1578 var<workgroup> tile_b: array<array<${k.type.storage}, ${d}>, ${d}>; 1579 ${w.mainStart([d,d,1])} 1580 let tile_col_start = (workgroup_index % uniforms.num_tile_n) * ${d}; 1581 let tile_row_start = (workgroup_index / uniforms.num_tile_n) * ${d}; 1582 let num_tiles = (uniforms.K - 1) / ${d} + 1; 1583 var k_start = 0u; 1584 var value = ${E.type.value}(0); 1585 for (var t: u32 = 0u; t < num_tiles; t++) { 1586 ${O} 1587 k_start = k_start + ${d}; 1588 workgroupBarrier(); 1589 1590 for (var k: u32 = 0u; k < ${d}; k++) { 1591 ${A} 1592 } 1593 workgroupBarrier(); 1594 } 1595 1596 ${q} 1597 let m = tile_row_start + local_id.y; 1598 let n = tile_col_start + local_id.x; 1599 ${S!=null?`let cOffset = ${S.broadcastedIndicesToOffset("vec2(m, n)",E)}; value += ${E.type.value}(uniforms.beta) * ${S.getByOffset("cOffset")};`:""} 1600 if (m < uniforms.M && n < uniforms.N) { 1601 output[m * uniforms.N + n] = value; 1602 } 1603 }`};
vendor: 5,298 bytes, lines 1603-1706
1603return f?{name:"GemmShared",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:_},getRunData:()=>({outputs:[{dims:u,dataType:e[0].dataType}],dispatchGroup:{x:l*c},programUniforms:g}),getShaderSource:x}:{name:"Gemm",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:_},getRunData:()=>({outputs:[{dims:u,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:g}),getShaderSource:b}},Tc=e=>{let t=e.transA,r=e.transB,a=e.alpha,n=e.beta;return{transA:t,transB:r,alpha:a,beta:n,cacheKey:`${e.transA};${e.transB};${e.alpha===1}`}},Ic=(e,t)=>{vu(e.inputs),e.compute(xu(e.inputs,t))}}),Je,rt,bt,$t,Su,ku,Tu,Iu,Eu,zu,Cu,Au,Ec,zc,Zm=U(()=>{J(),re(),we(),ie(),[Je,rt,bt,$t]=[0,1,2,3],Su=e=>{if(e[0].dims.length!==4)throw new Error("only 4-D tensor is supported.");if(e[0].dims.length!==e[1].dims.length)throw new Error("input dimensions must be equal to grid dimensions");if(e[0].dims.length-2!==e[1].dims[e[1].dims.length-1])throw new Error(`last dimension of grid must be equal to ${e[0].dims.length-2}`);if(e[0].dims[0]!==e[1].dims[0])throw new Error("grid batch size must match input batch size")},ku=` 1604 fn gs_get_cubic_coeffs(x: f32) -> vec4<f32> { 1605 let cubic_alpha = -0.75f; 1606 let x_abs = abs(x); 1607 var coeffs: vec4<f32>; 1608 coeffs[0] = (((cubic_alpha * (x_abs + 1) - 5 * cubic_alpha) * (x_abs + 1) + 8 * cubic_alpha) * (x_abs + 1) - 4 * cubic_alpha); 1609 coeffs[1] = (((cubic_alpha + 2) * x_abs - (cubic_alpha + 3)) * x_abs * x_abs + 1); 1610 coeffs[2] = (((cubic_alpha + 2) * (1 - x_abs) - (cubic_alpha + 3)) * (1 - x_abs) * (1 - x_abs) + 1); 1611 coeffs[3] = (((cubic_alpha * (2 - x_abs) - 5 * cubic_alpha) * (2 - x_abs) + 8 * cubic_alpha) * (2 - x_abs) - 4 * cubic_alpha); 1612 return coeffs; 1613 } 1614`,Tu=e=>` 1615 fn gs_bicubic_interpolate(p: mat4x4<${e}>, x: f32, y: f32) -> ${e} { 1616 var v: vec4<f32>; 1617 var coeffs = gs_get_cubic_coeffs(x); 1618 for (var i = 0; i < 4; i++) { 1619 v[i] = coeffs[0] * p[i][0] + coeffs[1] * p[i][1] + coeffs[2] * p[i][2] + coeffs[3] * p[i][3]; 1620 } 1621 coeffs = gs_get_cubic_coeffs(y); 1622 let pixel = ${e}(coeffs[0] * v[0] + coeffs[1] * v[1] + coeffs[2] * v[2] + coeffs[3] * v[3]); 1623 return pixel; 1624 } 1625`,Iu=e=>` 1626 fn gs_denormalize(n: f32, length: i32) -> f32 { 1627 ${e.alignCorners===0?` 1628 // alignCorners: false => [-1, 1] to [-0.5, length - 0.5] 1629 return ((n + 1.0) * f32(length) - 1.0) / 2.0; 1630 `:` 1631 // alignCorners: true => [-1, 1] to [0, length - 1] 1632 return (n + 1.0) / 2.0 * (f32(length - 1)); 1633 `} 1634 } 1635`,Eu=e=>` 1636 ${e.paddingMode==="reflection"?` 1637 fn gs_reflect(x: i32, x_min: f32, x_max: f32) -> u32 { 1638 var dx = 0.0; 1639 var fx = f32(x); 1640 let range = x_max - x_min; 1641 if (fx < x_min) { 1642 dx = x_min - fx; 1643 let n = u32(dx / range); 1644 let r = dx - f32(n) * range; 1645 if (n % 2 == 0) { 1646 fx = x_min + r; 1647 } else { 1648 fx = x_max - r; 1649 } 1650 } else if (fx > x_max) { 1651 dx = fx - x_max; 1652 let n = u32(dx / range); 1653 let r = dx - f32(n) * range; 1654 if (n % 2 == 0) { 1655 fx = x_max - r; 1656 } else { 1657 fx = x_min + r; 1658 } 1659 } 1660 return u32(fx); 1661 }`:""} 1662`,zu=(e,t,r)=>` 1663 fn pixel_at_grid(r: i32, c: i32, H: i32, W: i32, batch: u32, channel: u32, border: vec4<f32>) -> ${t} { 1664 var pixel = ${t}(0); 1665 var indices = vec4<u32>(0); 1666 indices[${Je}] = batch; 1667 indices[${rt}] = channel;`+(()=>{switch(r.paddingMode){case"zeros":return` 1668 if (r >= 0 && r < H && c >=0 && c < W) { 1669 indices[${bt}] = u32(r); 1670 indices[${$t}] = u32(c); 1671 } else { 1672 return ${t}(0); 1673 } 1674 `;case"border":return` 1675 indices[${bt}] = u32(clamp(r, 0, H - 1)); 1676 indices[${$t}] = u32(clamp(c, 0, W - 1)); 1677 `;case"reflection":return` 1678 indices[${bt}] = gs_reflect(r, border[1], border[3]); 1679 indices[${$t}] = gs_reflect(c, border[0], border[2]); 1680 `;default:throw new Error(`padding mode ${r.paddingMode} is not supported`)}})()+` 1681 return ${e.getByIndices("indices")}; 1682 } 1683`,Cu=(e,t,r)=>(()=>{switch(r.mode){case"nearest":return` 1684 let result = pixel_at_grid(i32(round(y)), i32(round(x)), H_in, W_in, indices[${Je}], indices[${rt}], border); 1685 `;case"bilinear":return` 1686 let x1 = i32(floor(x)); 1687 let y1 = i32(floor(y)); 1688 let x2 = x1 + 1; 1689 let y2 = y1 + 1; 1690 1691 let p11 = pixel_at_grid(y1, x1, H_in, W_in, indices[${Je}], indices[${rt}], border); 1692 let p12 = pixel_at_grid(y1, x2, H_in, W_in, indices[${Je}], indices[${rt}], border); 1693 let p21 = pixel_at_grid(y2, x1, H_in, W_in, indices[${Je}], indices[${rt}], border); 1694 let p22 = pixel_at_grid(y2, x2, H_in, W_in, indices[${Je}], indices[${rt}], border); 1695 1696 let dx2 = ${t}(f32(x2) - x); 1697 let dx1 = ${t}(x - f32(x1)); 1698 let dy2 = ${t}(f32(y2) - y); 1699 let dy1 = ${t}(y - f32(y1)); 1700 let result = dy2 * (dx2 * p11 + dx1 * p12) + dy1 * (dx2 * p21 + dx1 * p22); 1701 `;case"bicubic":return` 1702 let x0 = i32(floor(x)) - 1; 1703 let y0 = i32(floor(y)) - 1; 1704 var p: mat4x4<${t}>; 1705 for (var h = 0; h < 4; h++) { 1706 for (var w = 0; w < 4; w++) {
1707 p[h][w] = pixel_at_grid(h + y0, w + x0, H_in, W_in, indices[${Je}], indices[${rt}], border); 1708 } 1709 } 1710 1711 let dx = x - f32(x0 + 1); 1712 let dy = y - f32(y0 + 1); 1713 let result = gs_bicubic_interpolate(p, dx, dy); 1714 `;default:throw new Error(`mode ${r.mode} is not supported`)}})()+`${e.setByOffset("global_idx","result")}`,Au=(e,t)=>{let r=R("x",e[0].dataType,e[0].dims.length),a=[e[1].dims[0],e[1].dims[1],e[1].dims[2]],n=R("grid",e[1].dataType,a.length,2),i=[e[0].dims[0],e[0].dims[1],e[1].dims[1],e[1].dims[2]];t.format==="NHWC"&&(i=[e[0].dims[0],e[1].dims[1],e[1].dims[2],e[0].dims[3]],[Je,rt,bt,$t]=[0,3,1,2]);let s=G("output",e[0].dataType,i.length),u=r.type.value,d=C.size(i),l=[{type:12,data:d},...Z(e[0].dims,a,i)],c=f=>` 1715 ${f.registerUniform("output_size","u32").declareVariables(r,n,s)} 1716 ${ku} 1717 ${Tu(u)} 1718 ${Iu(t)} 1719 ${Eu(t)} 1720 ${zu(r,u,t)} 1721 1722 ${f.mainStart()} 1723 ${f.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1724 let H_in = i32(uniforms.x_shape[${bt}]); 1725 let W_in = i32(uniforms.x_shape[${$t}]); 1726 1727 ${t.alignCorners===0?` 1728 let x_min = -0.5; 1729 let x_max = f32(W_in) - 0.5; 1730 let y_min = -0.5; 1731 let y_max = f32(H_in) - 0.5; 1732 `:` 1733 let x_min = 0.0; 1734 let x_max = f32(W_in) - 1.0; 1735 let y_min = 0.0; 1736 let y_max = f32(H_in) - 1.0; 1737 `}; 1738 let border = vec4<f32>(x_min, y_min, x_max, y_max); 1739 1740 let indices = ${s.offsetToIndices("global_idx")}; 1741 var grid_indices = vec3<u32>(indices[${Je}], indices[${bt}], indices[${$t}]); 1742 let nxy = ${n.getByIndices("grid_indices")}; 1743 var x = gs_denormalize(f32(nxy[0]), W_in); 1744 var y = gs_denormalize(f32(nxy[1]), H_in); 1745 1746 ${Cu(s,u,t)} 1747 }`;return{name:"GridSample",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:["type","type"]},getRunData:f=>{let m=C.size(i);return{outputs:[{dims:i,dataType:f[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:l}},getShaderSource:c}},Ec=(e,t)=>{Su(e.inputs),e.compute(Au(e.inputs,t))},zc=e=>ce({alignCorners:e.align_corners,mode:e.mode,paddingMode:e.padding_mode,format:e.format})}),ze,Ou,Cc,Wi,Bu,ir,Ac,Oc=U(()=>{J(),re(),we(),Ma(),qa(),ie(),mt(),ze=(e,t)=>e.length>t&&e[t].dims.length>0?e[t]:void 0,Ou=(e,t)=>{let r=e[0],a=ze(e,1),n=ze(e,2),i=ze(e,3),s=ze(e,4),u=ze(e,5),d=ze(e,6),l=ze(e,7);if(r.dims.length!==3&&r.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let c=r.dims[0],f=r.dims[1],m=r.dims.length===3?r.dims[2]:t.numHeads*r.dims[4],g=f,_=0,b=0,x=Math.floor(m/t.numHeads);if(d&&l&&C.size(d.dims)&&C.size(l.dims)){if(d.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(d.dims[0]!==c||d.dims[1]!==t.numHeads||d.dims[3]!==x)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(l.dims[0]!==c||l.dims[1]!==t.numHeads||l.dims[3]!==x)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(d.dims[2]!==l.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(l.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');_=d.dims[2],b=d.dims[2]}else if(d&&C.size(d.dims)||l&&C.size(l.dims))throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let w;if(a&&C.size(a.dims)>0){if(r.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(a.dims.length<3||a.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(r.dims[0]!==a.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(a.dims.length===3){if(a.dims[2]!==r.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');w=2,g=a.dims[1]}else if(a.dims.length===5){if(a.dims[2]!==t.numHeads||a.dims[3]!==2||a.dims[4]!==x)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(n)throw new Error('Expect "value" be none when "key" has packed kv format.');w=5,g=a.dims[1]}else{if(a.dims[1]!==t.numHeads||a.dims[3]!==x)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');w=0,g=a.dims[2]}}else{if(r.dims.length!==5)throw new Error('Input "query" is expected to have 5 dimensions when key is empty');if(r.dims[2]!==t.numHeads||r.dims[3]!==3)throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');w=3}if(i&&C.size(i.dims)>0){if(i.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');
vendor: 5,370 bytes, lines 1747-1774
1747if(a&&a.dims.length===5&&a.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let $=_+g,k=0;if(s&&C.size(s.dims)>0){k=8;let z=s.dims;throw z.length===1?z[0]===c?k=1:z[0]===3*c+2&&(k=3):z.length===2&&z[0]===c&&z[1]===$&&(k=5),k===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, total_sequence_length)'):new Error("Mask not supported")}let S=!1,T=m;if(n&&C.size(n.dims)>0){if(n.dims.length!==3&&n.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(r.dims[0]!==n.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(n.dims.length===3){if(g!==n.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');T=n.dims[2]}else{if(g!==n.dims[2])throw new Error('Input "key" and "value" shall have the same dim 2 (kv_sequence_length)');T=n.dims[1]*n.dims[3],S=!0}}let E=!1;if(s&&C.size(s.dims)>0)throw new Error("Key padding mask is not supported");if(u&&C.size(u.dims)>0){if(u.dims.length!==4)throw new Error('Input "attention_bias" is expected to have 4 dimensions');if(u.dims[0]!==c||u.dims[1]!==t.numHeads||u.dims[2]!==f||u.dims[3]!==$)throw new Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:c,sequenceLength:f,pastSequenceLength:_,kvSequenceLength:g,totalSequenceLength:$,maxSequenceLength:b,inputHiddenSize:0,hiddenSize:m,vHiddenSize:T,headSize:x,vHeadSize:Math.floor(T/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:k,scale:t.scale,broadcastResPosBias:E,passPastInKv:S,qkvFormat:w}},Cc=e=>ce({...e}),Wi=ce({perm:[0,2,1,3]}),Bu=(e,t,r,a,n,i,s)=>{let u=[a,n,i],d=C.size(u),l=[{type:12,data:d},{type:12,data:s},{type:12,data:i}],c=f=>{let m=G("qkv_with_bias",t.dataType,u),g=R("qkv",t.dataType,u),_=R("bias",r.dataType,u),b=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` 1748 ${f.registerUniforms(b).declareVariables(g,_,m)} 1749 ${f.mainStart()} 1750 ${f.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1751 let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; 1752 1753 qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; 1754 }`};return e.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:u,dataType:t.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:l}),getShaderSource:c},{inputs:[t,r],outputs:[-1]})[0]},ir=(e,t,r,a,n,i,s,u)=>{let d=i;if(s&&C.size(s.dims)>0){if(a===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return d=Bu(e,i,s,t,a,r*n,u),d=d.reshape([t,a,r,n]),r===1||a===1?d:e.compute(De(d,Wi.perm),{inputs:[d],outputs:[-1]})[0]}else return i.dims.length===3&&(d=i.reshape([t,a,r,n])),r===1||a===1?d:e.compute(De(d,Wi.perm),{inputs:[d],outputs:[-1]})[0]},Ac=(e,t)=>{let r=Ou(e.inputs,t),a=e.inputs[0],n=ze(e.inputs,1),i=ze(e.inputs,2),s=ze(e.inputs,3),u=ze(e.inputs,4),d=ze(e.inputs,5),l=ze(e.inputs,6),c=ze(e.inputs,7);if(a.dims.length===5)throw new Error("Packed QKV is not implemented");if((n==null?void 0:n.dims.length)===5)throw new Error("Packed KV is not implemented");let f=n&&i&&n.dims.length===4&&i.dims.length===4,m=ir(e,r.batchSize,r.numHeads,r.sequenceLength,r.headSize,a,s,0);if(f)return or(e,m,n,i,u,void 0,l,c,d,r);if(!n||!i)throw new Error("key and value must be provided");let g=ir(e,r.batchSize,r.numHeads,r.kvSequenceLength,r.headSize,n,s,r.hiddenSize),_=ir(e,r.batchSize,r.numHeads,r.kvSequenceLength,r.vHeadSize,i,s,2*r.hiddenSize);or(e,m,g,_,u,void 0,l,c,d,r)}}),Ru,Du,Nu,Mu,wa,Bc,Rc,Dc=U(()=>{J(),re(),we(),ie(),Ru=e=>{if(!e||e.length<1)throw new Error("too few inputs")},Du=(e,t)=>{let r=[],a=t.numOutputs;return e[1].dims[0]>0&&(e[1].getBigInt64Array().forEach(n=>r.push(Number(n))),a=r.length),ce({numOutputs:a,axis:t.axis,splitSizes:r})},Nu=e=>` 1755fn calculateOutputIndex(index: u32) -> u32 { 1756 for (var i: u32 = 0u; i < ${e}u; i += 1u ) { 1757 if (index < ${F("uniforms.size_in_split_axis","i",e)}) { 1758 return i; 1759 } 1760 } 1761 return ${e}u; 1762}`,Mu=e=>{let t=e.length,r=[];for(let a=0;a<t;++a){let n=e[a].setByIndices("indices","input[global_idx]");t===1?r.push(n):a===0?r.push(`if (output_number == ${a}u) { ${n} }`):a===t-1?r.push(`else { ${n} }`):r.push(`else if (output_number == ${a}) { ${n} }`)}return` 1763 fn writeBufferData(output_number: u32, indices: ${e[0].type.indices}, global_idx: u32) { 1764 ${r.join(` 1765`)} 1766 }`},wa=(e,t)=>{let r=e[0].dims,a=C.size(r),n=e[0].dataType,i=C.normalizeAxis(t.axis,r.length),s=new Array(t.numOutputs),u=R("input",n,r.length),d=new Array(t.numOutputs),l=[],c=[],f=0,m=[{type:12,data:a}];for(let _=0;_<t.numOutputs;_++){f+=t.splitSizes[_],d[_]=f;let b=r.slice();b[i]=t.splitSizes[_],c.push(b),s[_]=G(`output${_}`,n,b.length),l.push({dims:c[_],dataType:e[0].dataType})}m.push({type:12,data:d},...Z(r,...c));let g=_=>` 1767 ${_.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",d.length).declareVariables(u,...s)} 1768 ${Nu(d.length)} 1769 ${Mu(s)} 1770 1771 ${_.mainStart()} 1772 ${_.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} 1773 1774 var indices = ${u.offsetToIndices("global_idx")};
1775 var index = ${u.indicesGet("indices",i)}; 1776 let output_number = calculateOutputIndex(index); 1777 if (output_number != 0) { 1778 index -= ${F("uniforms.size_in_split_axis","output_number - 1u",d.length)}; 1779 ${u.indicesSet("indices",i,"index")}; 1780 } 1781 writeBufferData(output_number, indices, global_idx); 1782 }`;return{name:"Split",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getShaderSource:g,getRunData:()=>({outputs:l,dispatchGroup:{x:Math.ceil(a/64)},programUniforms:m})}},Bc=(e,t)=>{Ru(e.inputs);let r=e.inputs.length===1?t:Du(e.inputs,t);e.compute(wa(e.inputs,r),{inputs:[0]})},Rc=e=>{let t=e.axis,r=e.splitSizes,a=e.numOutputs<0?r.length:e.numOutputs;if(a!==r.length)throw new Error("numOutputs and splitSizes lengh must be equal");return ce({axis:t,numOutputs:a,splitSizes:r})}}),Pu,qr,Nc,Mc=U(()=>{J(),re(),we(),ie(),Pu=(e,t)=>{let[r,a,n,i]=e,{numHeads:s,rotaryEmbeddingDim:u}=t;if(r.dims.length!==3&&r.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${r.dims.length}`);if(!C.areEqual(a.dims,[])&&!C.areEqual(a.dims,[1])&&a.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${a.dims.length}`);if(n.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${n.dims.length}`);if(i.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${i.dims.length}`);if(!C.areEqual(n.dims,i.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(u>0&&s===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let d=r.dims[0],l=r.dims[r.dims.length-2],c=n.dims[0],f=C.sizeFromDimension(r.dims,1)/l,m=u===0?n.dims[1]*2:f/s;if(u>m)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(a.dims.length===2){if(d!==a.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${a.dims[0]}`);if(l!==a.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${a.dims[1]}`)}if(m/2!==n.dims[1]&&u/2!==n.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${n.dims[1]}`);if(l>c)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},qr=(e,t)=>{let{interleaved:r,numHeads:a,rotaryEmbeddingDim:n,scale:i}=t,s=e[0].dims[0],u=C.sizeFromDimension(e[0].dims,1),d=e[0].dims[e[0].dims.length-2],l=u/d,c=e[2].dims[1],f=n===0?c*2:l/a,m=new Array(s,d,l/f,f-c),g=C.computeStrides(m),_=[{type:1,data:i},{type:12,data:m},{type:12,data:g},...e[0].dims.length===3?new Array({type:12,data:[u,l,f,1]}):[],...e[0].dims.length===4?new Array({type:12,data:[u,f,d*f,1]}):[],...Z(e[0].dims,e[1].dims,e[2].dims,e[3].dims,e[0].dims)],b=x=>{let w=R("input",e[0].dataType,e[0].dims.length),$=R("position_ids",e[1].dataType,e[1].dims.length),k=R("cos_cache",e[2].dataType,e[2].dims.length),S=R("sin_cache",e[3].dataType,e[3].dims.length),T=G("output",e[0].dataType,e[0].dims.length);return x.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:m.length},{name:"global_strides",type:"u32",length:g.length},{name:"input_output_strides",type:"u32",length:g.length}]),` 1783 ${x.declareVariables(w,$,k,S,T)} 1784 1785 ${x.mainStart(Mt)} 1786 let half_rotary_emb_dim = uniforms.${k.name}_shape[1]; 1787 let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape; 1788 let size = uniforms.global_shape[0] * uniforms.global_strides[0]; 1789 ${x.guardAgainstOutOfBoundsWorkgroupSizes("size")} 1790 1791 if (bsnh[3] < half_rotary_emb_dim) { 1792 let position_ids_idx = 1793 ${$.broadcastedIndicesToOffset("bsnh.xy",G("",$.type.tensor,2))}; 1794 let position_id = 1795 u32(${$.getByOffset("position_ids_idx")}) + select(0, bsnh[1], position_ids_idx == 0); 1796 let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${r}); 1797 let j = i + select(half_rotary_emb_dim, 1, ${r}); 1798 let re = ${w.getByOffset("i")}
1798 * ${k.get("position_id","bsnh[3]")} - 1799 ${w.getByOffset("j")} * ${S.get("position_id","bsnh[3]")}; 1800 ${T.setByOffset("i","re")} 1801 let im = ${w.getByOffset("i")} * ${S.get("position_id","bsnh[3]")} + 1802 ${w.getByOffset("j")} * ${k.get("position_id","bsnh[3]")}; 1803 ${T.setByOffset("j","im")} 1804 } else { 1805 let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; 1806 ${T.setByOffset("k",w.getByOffset("k"))} 1807 } 1808 }`};return{name:"RotaryEmbedding",shaderCache:{hint:ce({interleaved:r}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:b,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(C.size(m)/Mt)},programUniforms:_})}},Nc=(e,t)=>{Pu(e.inputs,t),e.compute(qr(e.inputs,t))}}),Uu,qu,Li,Wu,Pc,Qm=U(()=>{we(),J(),qa(),Oc(),Dc(),mt(),Mc(),ie(),Uu=(e,t)=>{if(t.doRotary&&e.length<=7)throw new Error("cos_cache and sin_cache inputs are required if do_rotary is specified");let r=e[0],a=e[1],n=e[2],i=e[3],s=e[4];if(t.doRotary!==0&&e.length<=7)throw new Error("cos_cast and sin_cache are expected if do_rotary attribute is non-zero");if(t.localWindowSize!==-1)throw new Error("Local attention is not supported");if(t.softcap!==0)throw new Error("Softcap is not supported");if(t.rotaryInterleaved!==0)throw new Error("Rotary interleaved is not supported");if(t.smoothSoftmax)throw new Error("Smooth softmax is not supported");if(r.dims.length!==3&&r.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let u=!1,d=r.dims[0],l=r.dims[1],c=r.dims.length===3?u?r.dims[2]/3:r.dims[2]:t.numHeads*r.dims[4],f=l,m=0,g=!a||a.dims.length===0,_=Math.floor(g?c/(t.numHeads+2*t.kvNumHeads):c/t.numHeads);g&&(c=_*t.numHeads);let b=i&&i.dims.length!==0,x=s&&s.dims.length!==0;if(b&&i.dims.length===4&&i.dims[0]===d&&i.dims[1]!==t.kvNumHeads&&i.dims[2]===t.kvNumHeads&&i.dims[3]===_)throw new Error("BSNH pastKey/pastValue is not supported");if(b&&x){if(i.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(s.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');m=i.dims[2]}else if(b||x)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let w=1;if(a&&a.dims.length>0){if(r.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(a.dims.length<3||a.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(r.dims[0]!==a.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(a.dims.length===3){if(r.dims[2]%a.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');f=a.dims[1]}else if(a.dims.length===5){if(a.dims[2]!==t.numHeads||a.dims[3]!==2||a.dims[4]!==_)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(n)throw new Error('Expect "value" be none when "key" has packed kv format.');f=a.dims[1]}else{if(a.dims[1]!==t.numHeads||a.dims[3]!==_)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');f=a.dims[2]}}else{if(r.dims.length!==3&&r.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(r.dims.length===5&&(r.dims[2]!==t.numHeads||r.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');w=3}let $=0,k=!1,S=t.kvNumHeads?_*t.kvNumHeads:c;if(n&&n.dims.length>0){if(n.dims.length!==3&&n.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(r.dims[0]!==n.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(n.dims.length===3){if(f!==n.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');S=n.dims[2]}else{if(f!==n.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');S=n.dims[1]*n.dims[3],k=!0}}let T=e.length>4?e[5]:void 0;if(T&&T.dims.length!==1&&T.dims[0]!==d)throw new Error('Input "seqlens" is expected to have 1 dimension and the same dim 0 as batch_size');return{batchSize:d,sequenceLength:l,pastSequenceLength:m,kvSequenceLength:f,totalSequenceLength:-1,maxSequenceLength:-1,inputHiddenSize:0,hiddenSize:c,vHiddenSize:S,headSize:_,vHeadSize:Math.floor(S/t.kvNumHeads),numHeads:t.numHeads,kvNumHeads:t.kvNumHeads,nReps:t.numHeads/t.kvNumHeads,pastPresentShareBuffer:!1,maskType:$,scale:t.scale,broadcastResPosBias:!1,passPastInKv:k,qkvFormat:w}},qu=ce({perm:[0,2,1,3]}),Li=(e,t,r)=>{let a=t,n=r.kvNumHeads;return t.dims.length===3&&r.kvSequenceLength!==0&&(a=t.reshape([r.batchSize,r.kvSequenceLength,n,r.headSize]),a=e.compute(De(a,qu.perm),{inputs:[a],outputs:[-1]})[0]),a},Wu=(e,t,r,a)=>{let n=7,i=["type","type"],s=[e*t],u=e*t,d=[{type:12,data:u},{type:12,data:t},{type:12,data:e}],l=c=>{let f=R("seq_lens",r.dataType,r.dims),m=R("total_seq_lens",a.dataType,a.dims),g=G("pos_ids",n,s),_=[{name:"output_size",type:"u32"},{name:"sequence_length",type:"u32"},{name:"batch_size",type:"u32"}];return` 1809 ${c.registerUniforms(_).declareVariables(f,m,g)} 1810 ${c.mainStart()} 1811 ${c.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1812 let total_sequence_length = u32(${m.getByOffset("0")}); 1813 let is_subsequent_prompt = uniforms.sequence_length > 1 && uniforms.sequence_length != total_sequence_length; 1814 let is_first_prompt = !is_subsequent_prompt && uniforms.sequence_length == total_sequence_length; 1815 let batch_idx = global_idx / uniforms.sequence_length; 1816 let sequence_idx = i32(global_idx % uniforms.sequence_length); 1817 var pos_id: i32 = 0; 1818 let seqlen = ${f.getByOffset("batch_idx")}; 1819 let total_seqlen = seqlen + 1; 1820 if (is_first_prompt) { 1821 if (sequence_idx < total_seqlen) { 1822 pos_id = sequence_idx; 1823 } else { 1824 pos_id = 1; 1825 } 1826 ${g.setByOffset("global_idx","pos_id")} 1827 } else if (is_subsequent_prompt) { 1828 let past_seqlen = total_seqlen - i32(uniforms.sequence_length); 1829 if (past_seqlen + sequence_idx < total_seqlen) { 1830 pos_id = past_seqlen + sequence_idx; 1831 } else { 1832 pos_id = 1; 1833 } 1834 ${g.setByOffset("global_idx","pos_id")} 1835 } else if (global_idx < uniforms.batch_size) { 1836 ${g.setByOffset("global_idx","seqlen")} 1837 }; 1838 } 1839 `};return{name:"GeneratePositionIds",shaderCache:{hint:`${e};${t}`,inputDependencies:i},getRunData:()=>({outputs:[{dims:s,dataType:n}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:d}),getShaderSource:l}},Pc=(e,t)=>{var S;
vendor: 13,105 bytes, lines 1839-1952
1839let r=Uu(e.inputs,t);if(e.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(((S=e.inputs[1])==null?void 0:S.dims.length)===5)throw new Error("Packed KV is not implemented");let a=e.inputs[0],n=e.inputs[1]&&e.inputs[1].dims.length>0?e.inputs[1]:void 0,i=e.inputs[2]&&e.inputs[2].dims.length>0?e.inputs[2]:void 0,s=e.inputs[3]&&e.inputs[3].dims.length!==0?e.inputs[3]:void 0,u=e.inputs[4]&&e.inputs[4].dims.length!==0?e.inputs[4]:void 0,d=e.inputs.length>4?e.inputs[5]:void 0,l=e.inputs.length>5?e.inputs[6]:void 0,c=r.kvNumHeads?r.kvNumHeads:r.numHeads,f=ce({axis:2,numOutputs:3,splitSizes:[r.numHeads*r.headSize,c*r.headSize,c*r.headSize]}),[m,g,_]=!n&&!i?e.compute(wa([a],f),{inputs:[a],outputs:[-1,-1,-1]}):[a,n,i],b,x;if(t.doRotary){let T=e.compute(Wu(r.batchSize,r.sequenceLength,d,l),{inputs:[d,l],outputs:[-1]})[0],E=e.inputs[7],z=e.inputs[8],A=ce({interleaved:t.rotaryInterleaved!==0,numHeads:r.numHeads,rotaryEmbeddingDim:0,scale:t.scale}),O=[m,T,E,z],q=[-1];b=e.compute(qr(O,A),{inputs:O,outputs:q})[0],O.splice(0,1,g);let X=ce({interleaved:t.rotaryInterleaved!==0,numHeads:r.kvNumHeads,rotaryEmbeddingDim:0,scale:t.scale});x=e.compute(qr(O,X),{inputs:O,outputs:q})[0]}let w=ir(e,r.batchSize,r.numHeads,r.sequenceLength,r.headSize,t.doRotary?b:m,void 0,0),$=Li(e,t.doRotary?x:g,r),k=Li(e,_,r);or(e,w,$,k,void 0,void 0,s,u,void 0,r,d,l)}}),Vi,Lu,Vu,Uc,Xm=U(()=>{J(),re(),mt(),ie(),Vi=(e,t,r,a,n,i,s,u)=>{let d=$e(i),l=d===1?"f32":`vec${d}f`,c=d===1?"vec2f":`mat2x${d}f`,f=n*s,m=64;f===1&&(m=256);let g=[n,s,i/d],_=[n,s,2],b=["rank","type","type"],x=[];x.push(...Z(g,_));let w=$=>{let k=R("x",t.dataType,3,d),S=R("scale",r.dataType,r.dims),T=R("bias",a.dataType,a.dims),E=G("output",1,3,2),z=[k,S,T,E];return` 1840 var<workgroup> workgroup_shared : array<${c}, ${m}>; 1841 const workgroup_size = ${m}u; 1842 ${$.declareVariables(...z)} 1843 ${$.mainStart(m)} 1844 let batch = workgroup_index / uniforms.x_shape[1]; 1845 let channel = workgroup_index % uniforms.x_shape[1]; 1846 let hight = uniforms.x_shape[2]; 1847 // initialize workgroup memory 1848 var sum = ${l}(0); 1849 var squared_sum = ${l}(0); 1850 for (var h = local_idx; h < hight; h += workgroup_size) { 1851 let value = ${l}(${k.get("batch","channel","h")}); 1852 sum += value; 1853 squared_sum += value * value; 1854 } 1855 workgroup_shared[local_idx] = ${c}(sum, squared_sum); 1856 workgroupBarrier(); 1857 1858 for (var currSize = workgroup_size >> 1; currSize > 0; currSize = currSize >> 1) { 1859 if (local_idx < currSize) { 1860 workgroup_shared[local_idx] = workgroup_shared[local_idx] + workgroup_shared[local_idx + currSize]; 1861 } 1862 workgroupBarrier(); 1863 } 1864 if (local_idx == 0) { 1865 let sum_final = ${ht("workgroup_shared[0][0]",d)} / f32(hight * ${d}); 1866 let squared_sum_final = ${ht("workgroup_shared[0][1]",d)} / f32(hight * ${d}); 1867 1868 let inv_std_dev = inverseSqrt(squared_sum_final - sum_final * sum_final + f32(${u})); 1869 let channel_scale = inv_std_dev * f32(scale[channel]); 1870 let channel_shift = f32(bias[channel]) - sum_final * channel_scale; 1871 output[workgroup_index] = vec2f(channel_scale, channel_shift); 1872 } 1873 }`};return e.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${d};${u};${m}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:_,dataType:1}],dispatchGroup:{x:f},programUniforms:x}),getShaderSource:w},{inputs:[t,r,a],outputs:[-1]})[0]},Lu=(e,t,r)=>{let a=t[0].dims,n=a,i=2,s=a[0],u=a[1],d=C.sizeFromDimension(a,i),l=$e(d),c=C.size(n)/l,f=Vi(e,t[0],t[1],t[2],s,d,u,r.epsilon),m=[s,u,d/l],g=[s,u],_=["type","none"],b=x=>{let w=R("x",t[0].dataType,m.length,l),$=R("scale_shift",1,g.length,2),k=G("output",t[0].dataType,m.length,l),S=[w,$,k];return` 1874 ${x.registerUniform("output_size","u32").declareVariables(...S)} 1875 ${x.mainStart()} 1876 ${x.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 1877 let outputIndices = ${k.offsetToIndices("global_idx")}; 1878 let batch = outputIndices[0]; 1879 let channel = outputIndices[1]; 1880 let scale_shift = ${$.getByIndices("vec2<u32>(batch, channel)")}; 1881 let value = ${w.getByOffset("global_idx")} * ${k.type.value}(scale_shift.x) + ${k.type.value}(scale_shift.y); 1882 ${k.setByOffset("global_idx","value")}; 1883 }`};e.compute({name:"InstanceNormalization",shaderCache:{hint:`${l}`,inputDependencies:_},getRunData:()=>({outputs:[{dims:n,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(c/64)},programUniforms:[{type:12,data:c},...Z(m,g,m)]}),getShaderSource:b},{inputs:[t[0],f]})},Vu=(e,t,r)=>{let a=t[0].dims,n=a,i=a[0],s=a[a.length-1],u=C.sizeFromDimension(a,1)/s,d=$e(s),l=C.size(n)/d,c=[{type:12,data:u},{type:12,data:Math.floor(s/d)}],f=["type","type"],m=!1,g=[0,a.length-1];for(let w=0;w<a.length-2;w++)m=m||a[w+1]!==1,g.push(w+1);m=m&&a[a.length-1]!==1;let _=m?e.compute(De(e.inputs[0],g),{inputs:[e.inputs[0]],outputs:[-1]})[0]:e.inputs[0].reshape(Array.from({length:a.length},(w,$)=>a[g[$]])),b=Vi(e,_,t[1],t[2],i,u,s,r.epsilon),x=w=>{let $=Se(t[0].dataType),k=d===1?"vec2f":`mat${d}x2f`,S=z=>{let A=z===0?"x":"y",O=d===1?"f32":`vec${d}f`;switch(d){case 1:return`${$}(${O}(scale.${A}))`;case 2:return`vec2<${$}>(${O}(scale[0].${A}, scale[1].${A}))`;case 4:return`vec4<${$}>(${O}(scale[0].${A}, scale[1].${A}, scale[2].${A}, scale[3].${A}))`;default:throw new Error(`Not supported compoents ${d}`)}},T=R("input",t[0].dataType,t[0].dims,d),E=G("output",t[0].dataType,n,d);return` 1884 @group(0) @binding(0) var<storage, read> input : array<${T.type.storage}>; 1885 @group(0) @binding(1) var<storage, read> scale_input : array<${k}>; 1886 @group(0) @binding(2) var<storage, read_write> output : array<${E.type.storage}>; 1887 struct Uniforms {H: u32, C : u32}; 1888 @group(0) @binding(3) var<uniform> uniforms: Uniforms; 1889 1890 ${w.mainStart()} 1891 let current_image_number = global_idx / (uniforms.C * uniforms.H); 1892 let current_channel_number = global_idx % uniforms.C; 1893 1894 let scale_offset = current_image_number * uniforms.C + current_channel_number; 1895 let scale = scale_input[scale_offset]; 1896 output[global_idx] = fma(input[global_idx], ${S(0)}, ${S(1)}); 1897 }`};e.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${d}`,inputDependencies:f},getRunData:()=>({outputs:[{dims:n,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:c}),getShaderSource:x},{inputs:[t[0],b]})},Uc=(e,t)=>{t.format==="NHWC"?Vu(e,e.inputs,t):Lu(e,e.inputs,t)}}),ju,Hu,qc,Ym=U(()=>{J(),re(),ie(),ju=e=>{if(!e||e.length<2)throw new Error("layerNorm requires at least 2 inputs.")},Hu=(e,t,r)=>{let a=t.simplified,n=e[0].dims,i=e[1],s=!a&&e[2],u=n,d=C.normalizeAxis(t.axis,n.length),l=C.sizeToDimension(n,d),c=C.sizeFromDimension(n,d),f=C.size(i.dims),m=s?C.size(s.dims):0;if(f!==c||s&&m!==c)throw new Error(`Size of X.shape()[axis:] == ${c}. 1898 Size of scale and bias (if provided) must match this. 1899 Got scale size of ${f} and bias size of ${m}`);let g=[];for(let T=0;T<n.length;++T)T<d?g.push(n[T]):g.push(1);let _=$e(c),b=["type","type"],x=[{type:12,data:l},{type:1,data:c},{type:12,data:Math.floor(c/_)},{type:1,data:t.epsilon}];s&&b.push("type");let w=r>1,$=r>2,k=T=>{let E=Se(e[0].dataType),z=[R("x",e[0].dataType,e[0].dims,_),R("scale",i.dataType,i.dims,_)];s&&z.push(R("bias",s.dataType,s.dims,_)),z.push(G("output",e[0].dataType,u,_)),w&&z.push(G("mean_data_output",1,g)),$&&z.push(G("inv_std_output",1,g));let A=[{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}];return` 1900 ${T.registerUniforms(A).declareVariables(...z)} 1901 ${T.mainStart()} 1902 ${T.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} 1903 let offset = global_idx * uniforms.norm_size_vectorized; 1904 var mean_vector = ${ca("f32",_)}; 1905 var mean_square_vector = ${ca("f32",_)}; 1906 1907 for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) { 1908 let value = ${Dt(E,_,"x[h + offset]")}; 1909 mean_vector += value; 1910 mean_square_vector += value * value; 1911 } 1912 let mean = ${ht("mean_vector",_)} / uniforms.norm_size; 1913 let inv_std_dev = inverseSqrt(${ht("mean_square_vector",_)} / uniforms.norm_size ${a?"":"- mean * mean"} + uniforms.epsilon); 1914 1915 for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { 1916 let f32input = ${Dt(E,_,"x[j + offset]")}; 1917 let f32scale = ${Dt(E,_,"scale[j]")}; 1918 output[j + offset] = ${z[0].type.value}((f32input ${a?"":"- mean"}) * inv_std_dev * f32scale 1919 ${s?`+ ${Dt(E,_,"bias[j]")}`:""} 1920 ); 1921 } 1922 1923 ${w?"mean_data_output[global_idx] = mean":""}; 1924 ${$?"inv_std_output[global_idx] = inv_std_dev":""}; 1925 }`},S=[{dims:u,dataType:e[0].dataType}];return w&&S.push({dims:g,dataType:1}),$&&S.push({dims:g,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${_};${r};${a}`,inputDependencies:b},getRunData:()=>({outputs:S,dispatchGroup:{x:Math.ceil(l/64)},programUniforms:x}),getShaderSource:k}},qc=(e,t)=>{ju(e.inputs),e.compute(Hu(e.inputs,t,e.outputCount))}}),Gu,Wc,Jm=U(()=>{re(),Ha(),Ga(),Gu=e=>{if(!e||e.length!==2)throw new Error("MatMul requires 2 inputs.");if(e[0].dims[e[0].dims.length-1]!==e[1].dims[e[1].dims.length-2])throw new Error("shared dimension does not match.")},Wc=e=>{Gu(e.inputs);let t=Nt.calcShape(e.inputs[0].dims,e.inputs[1].dims,!0);if(!t)throw new Error("Can't use matmul on the given tensors");let r=t[t.length-1],a=e.inputs[0].dims[e.inputs[0].dims.length-1];if(r<8&&a<8)e.compute(ja(e.inputs,{activation:""},t));else{let n=t[t.length-2],i=C.size(e.inputs[0].dims.slice(0,-2)),s=C.size(e.inputs[1].dims.slice(0,-2));if(i!==1&&n===1&&s===1){let u=e.inputs[0].reshape([1,i,a]),d=e.inputs[1].reshape([1,a,r]),l=[1,i,r],c=[u,d];e.compute(Ur(c,{activation:""},t,l),{inputs:c})}else e.compute(Ur(e.inputs,{activation:""},t))}}}),Fu,Ku,Zu,Lc,Vc,eg=U(()=>{J(),re(),we(),ie(),Fu=(e,t)=>{if(e.length<3||e.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let r=e[0],a=r.dims.length;if(r.dims[a-1]!==t.k)throw new Error("The last dim of input shape does not match the k value");let n=Math.floor((t.k+t.blockSize-1)/t.blockSize),i=t.blockSize/8*t.bits,s=e[1];if(!C.areEqual(s.dims,[t.n,n,i]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let u=e[2].dims;if(C.size(u)!==t.n*n)throw new Error("scales input size error.");if(e.length===4){let d=e[3].dims,l=t.bits>4?t.n*n:t.n*Math.floor((n+1)/2);if(C.size(d)!==l)throw new Error("zeroPoints input size error.")}},Ku=(e,t)=>{let r=e[0].dims,a=r.length,n=r[a-2],i=t.k,s=t.n,u=r.slice(0,a-2),d=C.size(u),l=e[1].dims[2]/4,c=e[0].dataType,f=$e(t.k),m=$e(l),g=$e(s),_=u.concat([n,s]),b=n>1&&s/g%2===0?2:1,x=C.size(_)/g/b,w=64,$=[],k=[d,n,i/f],S=C.convertShape(e[1].dims).slice();S.splice(-1,1,l/m),$.push(...Z(k)),$.push(...Z(S)),$.push(...Z(e[2].dims)),e.length===4&&$.push(...Z(C.convertShape(e[3].dims)));let T=[d,n,s/g];$.push(...Z(T));let E=z=>{let A=k.length,O=R("a",e[0].dataType,A,f),q=R("b",12,S.length,m),X=R("scales",e[2].dataType,e[2].dims.length),H=[O,q,X],Q=e.length===4?R("zero_points",12,e[3].dims.length):void 0;Q&&H.push(Q);let oe=T.length,te=G("output",e[0].dataType,oe,g),V=Se(e[0].dataType),W=(()=>{switch(f){case 1:return`array<${V}, 8>`;case 2:return`mat4x2<${V}>`;case 4:return`mat2x4<${V}>`;default:throw new Error(`${f}-component is not supported.`)}})(),le=()=>{let D=` 1926 // reuse a data 1927 var input_offset = ${O.indicesToOffset(`${O.type.indices}(batch, row, word_offset)`)}; 1928 var a_data: ${W}; 1929 for (var j: u32 = 0; j < ${8/f}; j++) { 1930 a_data[j] = ${O.getByOffset("input_offset")}; 1931 input_offset++; 1932 } 1933 `;for(let P=0;P<g*b;P++)D+=` 1934 b_value = ${m===1?`b${P}_data`:`b${P}_data[i]`}; 1935 b_value_lower = unpack4xU8(b_value & b_mask); 1936 b_value_upper = unpack4xU8((b_value >> 4) & b_mask); 1937 b_quantized_values = ${W}(${Array.from({length:4},(j,se)=>`${V}(b_value_lower[${se}]), ${V}(b_value_upper[${se}])`).join(", ")}); 1938 b_dequantized_values = ${f===1?`${W}(${Array.from({length:8},(j,se)=>`(b_quantized_values[${se}] - ${Q?`zero_point${P}`:"zero_point"}) * scale${P}`).join(", ")});`:`(b_quantized_values - ${W}(${Array(8).fill(`${Q?`zero_point${P}`:"zero_point"}`).join(",")})) * scale${P};`}; 1939 workgroup_shared[local_id.x * ${b} + ${Math.floor(P/g)}]${g>1?`[${P%g}]`:""} += ${Array.from({length:8/f},(j,se)=>`${f===1?`a_data[${se}] * b_dequantized_values[${se}]`:`dot(a_data[${se}], b_dequantized_values[${se}])`}`).join(" + ")}; 1940 `;return D},ee=()=>{let D=` 1941 var col_index = col * ${g}; 1942 ${Q?` 1943 let zero_point_bytes_per_col = (nBlocksPerCol + 1) / 2; 1944 var zero_point_byte_count: u32; 1945 var zero_point_word_index: u32; 1946 var zero_point_byte_offset: u32; 1947 let zero_point_nibble_offset: u32 = block & 0x1u; 1948 var zero_point_bits_offset: u32; 1949 var zero_point_word: u32;`:` 1950 // The default zero point is 8 for unsigned 4-bit quantization. 1951 let zero_point = ${V}(8);`} 1952 `;
vendor: 4,459 bytes, lines 1952-2015
1952for(let P=0;P<g*b;P++)D+=` 1953 let scale${P} = ${X.getByOffset("col_index * nBlocksPerCol + block")}; 1954 ${Q?` 1955 zero_point_byte_count = col_index * zero_point_bytes_per_col + (block >> 0x1u); 1956 zero_point_word_index = zero_point_byte_count >> 0x2u; 1957 zero_point_byte_offset = zero_point_byte_count & 0x3u; 1958 zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); 1959 zero_point_word = ${Q.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; 1960 let zero_point${P} = ${V}((zero_point_word) & 0xFu);`:""} 1961 col_index += 1;`;return D},ae=()=>{let D=`col_index = col * ${g};`;for(let P=0;P<g*b;P++)D+=` 1962 let b${P}_data = ${q.getByIndices(`${q.type.indices}(col_index, block, word)`)}; 1963 col_index += 1;`;return D+=` 1964 var b_value: u32; 1965 let b_mask: u32 = 0x0F0F0F0Fu; 1966 var b_value_lower: vec4<u32>; 1967 var b_value_upper: vec4<u32>; 1968 var b_quantized_values: ${W}; 1969 var b_dequantized_values: ${W};`,D};return` 1970 var<workgroup> workgroup_shared: array<${te.type.value}, ${b*w}>; 1971 ${z.declareVariables(...H,te)} 1972 ${z.mainStart([w,1,1])} 1973 let output_indices = ${te.offsetToIndices(`(global_idx / ${w}) * ${b}`)}; 1974 let col = output_indices[2]; 1975 let row = output_indices[1]; 1976 let batch = output_indices[0]; 1977 let nBlocksPerCol = uniforms.b_shape[1]; 1978 1979 for (var block = local_id.x; block < nBlocksPerCol; block += ${w}) { 1980 //process one block 1981 var word_offset: u32 = block * ${t.blockSize/f}; 1982 ${ee()} 1983 for (var word: u32 = 0; word < ${l}; word += ${m}) { 1984 ${ae()} 1985 for (var i: u32 = 0; i < ${m}; i++) { 1986 ${le()} 1987 word_offset += ${8/f}; 1988 } 1989 } 1990 } 1991 workgroupBarrier(); 1992 1993 if (local_id.x < ${b}) { 1994 var output_value: ${te.type.value} = ${te.type.value}(0); 1995 var workgroup_shared_offset: u32 = local_id.x; 1996 for (var b: u32 = 0u; b < ${w}u; b++) { 1997 output_value += workgroup_shared[workgroup_shared_offset]; 1998 workgroup_shared_offset += ${b}; 1999 } 2000 ${te.setByIndices(`${te.type.indices}(batch, row, col + local_id.x)`,"output_value")}; 2001 } 2002 }`};return{name:"MatMulNBits",shaderCache:{hint:`${t.blockSize};${t.bits};${f};${m};${g};${b};${w}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:_,dataType:c}],dispatchGroup:{x},programUniforms:$}),getShaderSource:E}},Zu=(e,t)=>{let r=e[0].dims,a=r.length,n=r[a-2],i=t.k,s=t.n,u=r.slice(0,a-2),d=C.size(u),l=e[1].dims[2]/4,c=e[0].dataType,f=$e(t.k),m=$e(l),g=u.concat([n,s]),_=128,b=s%8===0?8:s%4===0?4:1,x=_/b,w=x*m*8,$=w/f,k=w/t.blockSize,S=C.size(g)/b,T=[],E=[d,n,i/f],z=C.convertShape(e[1].dims).slice();z.splice(-1,1,l/m),T.push(...Z(E)),T.push(...Z(z)),T.push(...Z(e[2].dims)),e.length===4&&T.push(...Z(C.convertShape(e[3].dims)));let A=[d,n,s];T.push(...Z(A));let O=q=>{let X=E.length,H=R("a",e[0].dataType,X,f),Q=R("b",12,z.length,m),oe=R("scales",e[2].dataType,e[2].dims.length),te=[H,Q,oe],V=e.length===4?R("zero_points",12,e[3].dims.length):void 0;V&&te.push(V);let W=A.length,le=G("output",e[0].dataType,W),ee=Se(e[0].dataType),ae=()=>{switch(f){case 1:return` 2003 let a_data0 = vec4<${ee}>(sub_a[word_offset], sub_a[word_offset + 1], sub_a[word_offset + 2], sub_a[word_offset + 3]); 2004 let a_data1 = vec4<${ee}>(sub_a[word_offset + 4], sub_a[word_offset + 5], sub_a[word_offset + 6], sub_a[word_offset + 7]);`;case 2:return` 2005 let a_data0 = vec4<${ee}>(sub_a[word_offset], sub_a[word_offset + 1]); 2006 let a_data1 = vec4<${ee}>(sub_a[word_offset + 2], sub_a[word_offset + 3]);`;case 4:return` 2007 let a_data0 = sub_a[word_offset]; 2008 let a_data1 = sub_a[word_offset + 1];`;default:throw new Error(`${f}-component is not supported.`)}};return` 2009 var<workgroup> sub_a: array<${H.type.value}, ${$}>; 2010 var<workgroup> inter_results: array<array<${le.type.value}, ${x}>, ${b}>; 2011 ${q.declareVariables(...te,le)} 2012 ${q.mainStart([x,b,1])} 2013 let output_indices = ${le.offsetToIndices(`workgroup_index * ${b}`)}; 2014 let col = output_indices[2]; 2015 let row = output_indices[1];
2016 let batch = output_indices[0]; 2017 let n_blocks_per_col = uniforms.b_shape[1]; 2018 let num_tiles = (n_blocks_per_col - 1) / ${k} + 1; 2019 2020 // Loop over shared dimension. 2021 for (var tile: u32 = 0; tile < num_tiles; tile += 1) { 2022 let a_col_start = tile * ${$}; 2023 // load one tile A data into shared memory. 2024 for (var a_offset = local_idx; a_offset < ${$}; a_offset += ${_}) 2025 { 2026 let a_col = a_col_start + a_offset; 2027 if (a_col < uniforms.a_shape[2]) 2028 { 2029 sub_a[a_offset] = ${H.getByIndices(`${H.type.indices}(batch, row, a_col)`)}; 2030 } else { 2031 sub_a[a_offset] = ${H.type.value}(0); 2032 } 2033 } 2034 workgroupBarrier(); 2035 2036 // each thread process one block 2037 let b_row = col + local_id.y; 2038 let block = tile * ${k} + local_id.x; 2039 ${V?` 2040 let zero_point_bytes_per_col = (n_blocks_per_col + 1) / 2; 2041 let zero_point_byte_count = b_row * zero_point_bytes_per_col + (block >> 0x1u); 2042 let zero_point_word_index = zero_point_byte_count >> 0x2u; 2043 let zero_point_byte_offset = zero_point_byte_count & 0x3u; 2044 let zero_point_nibble_offset: u32 = block & 0x1u; 2045 let zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); 2046 let zero_point_word = ${V.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; 2047 let zero_point = ${ee}((zero_point_word) & 0xFu);`:` 2048 // The default zero point is 8 for unsigned 4-bit quantization. 2049 let zero_point = ${ee}(8);`} 2050 let scale = ${oe.getByOffset("b_row * n_blocks_per_col + block")}; 2051 let b_data = ${Q.getByIndices(`${Q.type.indices}(b_row, block, 0)`)}; 2052 var word_offset = local_id.x * ${t.blockSize/f}; 2053 for (var i: u32 = 0; i < ${m}; i++) { 2054 ${ae()} 2055 let b_value = ${m===1?"b_data":"b_data[i]"}; 2056 let b_value_lower = unpack4xU8(b_value & 0x0F0F0F0Fu); 2057 let b_value_upper = unpack4xU8((b_value >> 4) & 0x0F0F0F0Fu); 2058 let b_quantized_values = mat2x4<${ee}>(${Array.from({length:4},(D,P)=>`${ee}(b_value_lower[${P}]), ${ee}(b_value_upper[${P}])`).join(", ")}); 2059 let b_dequantized_values = (b_quantized_values - mat2x4<${ee}>(${Array(8).fill("zero_point").join(",")})) * scale; 2060 inter_results[local_id.y][local_id.x] += ${Array.from({length:2},(D,P)=>`${`dot(a_data${P}, b_dequantized_values[${P}])`}`).join(" + ")}; 2061 word_offset += ${8/f}; 2062 } 2063 workgroupBarrier(); 2064 } 2065 2066 if (local_idx < ${b}) { 2067 var output_value: ${le.type.value} = ${le.type.value}(0); 2068 for (var b = 0u; b < ${x}; b++) { 2069 output_value += inter_results[local_idx][b]; 2070 } 2071 if (col + local_idx < uniforms.output_shape[2]) 2072 { 2073 ${le.setByIndices(`${le.type.indices}(batch, row, col + local_idx)`,"output_value")} 2074 } 2075 } 2076 }`};return{name:"BlockwiseMatMulNBits32",shaderCache:{hint:`${t.blockSize};${f};${m};${x};${b}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:g,dataType:c}],dispatchGroup:{x:S},programUniforms:T}),getShaderSource:O}},Lc=(e,t)=>{Fu(e.inputs,t),t.blockSize===32&&e.adapterInfo.isVendor("intel")&&e.adapterInfo.isArchitecture("gen-12lp")?e.compute(Zu(e.inputs,t)):e.compute(Ku(e.inputs,t))},Vc=e=>ce(e)}),Qu,Xu,Yu,Ju,el,tl,rl,il,jc,tg=U(()=>{J(),re(),ie(),Qu=e=>{if(!e||e.length<1)throw new Error("Too few inputs");if(e[0].dataType!==1&&e[0].dataType!==10)throw new Error("Input type must be float or float16.");if(e.length>=2){let t=e[0].dims.length*2===e[1].dims[0];if(e.length===4&&(t=e[3].dims[0]*2===e[1].dims[0]),!t)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},Xu=(e,t,r)=>{let a="";for(let n=t-1;n>=0;--n)a+=` 2077 k = i32(${e.indicesGet("indices",n)}) - ${F("uniforms.pads",n,r)}; 2078 if (k < 0) { 2079 break; 2080 } 2081 if (k >= i32(${F("uniforms.x_shape",n,t)})) { 2082 break; 2083 } 2084 offset += k * i32(${F("uniforms.x_strides",n,t)}
2084); 2085 `;return` 2086 value = ${e.type.value}(uniforms.constant_value); 2087 for (var i = 0; i < 1; i++) { 2088 var offset = 0; 2089 var k = 0; 2090 ${a} 2091 value = x[offset]; 2092 } 2093 `},Yu=(e,t,r)=>{let a="";for(let n=t-1;n>=0;--n)a+=` 2094 k = i32(${e.indicesGet("indices",n)}) - ${F("uniforms.pads",n,r)}; 2095 if (k < 0) { 2096 k = -k; 2097 } 2098 { 2099 let _2n_1 = 2 * (i32(${F("uniforms.x_shape",n,t)}) - 1); 2100 k = k % _2n_1; 2101 if(k >= i32(${F("uniforms.x_shape",n,t)})) { 2102 k = _2n_1 - k; 2103 } 2104 } 2105 offset += k * i32(${F("uniforms.x_strides",n,t)}); 2106 `;return` 2107 var offset = 0; 2108 var k = 0; 2109 ${a} 2110 value = x[offset]; 2111 `},Ju=(e,t,r)=>{let a="";for(let n=t-1;n>=0;--n)a+=` 2112 k = i32(${e.indicesGet("indices",n)}) - ${F("uniforms.pads",n,r)}; 2113 if (k < 0) { 2114 k = 0; 2115 } 2116 if (k >= i32(${F("uniforms.x_shape",n,t)})) { 2117 k = i32(${F("uniforms.x_shape",n,t)}) - 1; 2118 } 2119 offset += k * i32(${F("uniforms.x_strides",n,t)}); 2120 `;return` 2121 var offset = 0; 2122 var k = 0; 2123 ${a} 2124 value = x[offset]; 2125 `},el=(e,t,r)=>{let a="";for(let n=t-1;n>=0;--n)a+=` 2126 k = i32(${e.indicesGet("indices",n)}) - ${F("uniforms.pads",n,r)}; 2127 if (k < 0) { 2128 k += i32(${F("uniforms.x_shape",n,t)}]); 2129 } 2130 if (k >= i32(${F("uniforms.x_shape",n,t)})) { 2131 k -= i32(${F("uniforms.x_shape",n,t)}); 2132 } 2133 offset += k * i32(${F("uniforms.x_strides",n,t)}); 2134 `;return` 2135 var offset = 0; 2136 var k = 0; 2137 ${a} 2138 value = x[offset]; 2139 `},tl=(e,t,r)=>{switch(r.mode){case 0:return Xu(e,t,r.pads.length);case 1:return Yu(e,t,r.pads.length);case 2:return Ju(e,t,r.pads.length);case 3:return el(e,t,r.pads.length);default:throw new Error("Invalid mode")}},rl=(e,t)=>{let r=C.padShape(e[0].dims.slice(),t.pads),a=e[0].dims,n=C.size(r),i=[{type:12,data:n},{type:6,data:t.pads}],s=e.length>=3&&e[2].data;t.mode===0&&i.push({type:s?e[2].dataType:1,data:t.value}),i.push(...Z(e[0].dims,r));let u=["rank"],d=l=>{let c=G("output",e[0].dataType,r.length),f=R("x",e[0].dataType,a.length),m=f.type.value,g=tl(c,a.length,t),_=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:t.pads.length}];return t.mode===0&&_.push({name:"constant_value",type:s?m:"f32"}),` 2140 ${l.registerUniforms(_).declareVariables(f,c)} 2141 ${l.mainStart()} 2142 ${l.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 2143 2144 let indices = ${c.offsetToIndices("global_idx")}; 2145 2146 var value = ${m}(0); 2147 ${g} 2148 output[global_idx] = value; 2149 }`};return{name:"Pad",shaderCache:{hint:`${t.mode}${s}`,inputDependencies:u},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(C.size(r)/64)},programUniforms:i}),getShaderSource:d}},il=(e,t)=>{if(e.length>1){let r=e[1].getBigInt64Array(),a=e.length>=3&&e[2].data?e[2].dataType===10?e[2].getUint16Array()[0]:e[2].getFloat32Array()[0]:0,n=e[0].dims.length,i=new Int32Array(2*n).fill(0);if(e.length>=4){let u=e[3].getBigInt64Array();for(let d=0;d<u.length;d++)i[Number(u[d])]=Number(r[d]),i[Number(u[d])+n]=Number(r[d+u.length])}else r.forEach((u,d)=>i[Number(d)]=Number(u));let s=[];return i.forEach(u=>s.push(u)),{mode:t.mode,value:a,pads:s}}else return t},jc=(e,t)=>{Qu(e.inputs);let r=il(e.inputs,t);e.compute(rl(e.inputs,r),{inputs:[0]})}}),Qt,ji,Hi,Gi,Fi,al,nl,Ki,Zi,Hc,Gc,Qi,Fc,Kc,Xi,Zc,Qc,Xc,Yc,rg=U(()=>{Ke(),J(),re(),ie(),Qt=e=>{if(ye.webgpu.validateInputContent&&(!e||e.length!==1))throw new Error("Pool ops requires 1 input.")},ji=(e,t,r)=>{let a=t.format==="NHWC",n=e.dims.slice();a&&n.splice(1,0,n.pop());let i=Object.hasOwnProperty.call(t,"dilations"),s=t.kernelShape.slice(),u=t.strides.slice(),d=i?t.dilations.slice():[],l=t.pads.slice();Mr.adjustPoolAttributes(r,n,s,u,d,l);let c=Mr.computePoolOutputShape(r,n,u,d,s,l,t.autoPad),f=Object.assign({},t);i?Object.assign(f,{kernelShape:s,strides:u,pads:l,dilations:d,cacheKey:t.cacheKey}):Object.assign(f,{kernelShape:s,strides:u,pads:l,cacheKey:t.cacheKey});let m=c.slice();return m.push(m.splice(1,1)[0]),[f,a?m:c]},Hi=(e,t)=>{let r=t.format==="NHWC",a=C.size(e),n=C.size(t.kernelShape),i=[{type:12,data:a},{type:12,data:n}],s=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(t.kernelShape.length<=2){let u=t.kernelShape[t.kernelShape.length-1],d=t.strides[t.strides.length-1],l=t.pads[t.pads.length/2-1],c=t.pads[t.pads.length-1],f=!!(l+c);i.push({type:12,data:u},{type:12,data:d}
vendor: 4,358 bytes, lines 2149-2229
2149,{type:12,data:l},{type:12,data:c}),s.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let m=!1;if(t.kernelShape.length===2){let g=t.kernelShape[t.kernelShape.length-2],_=t.strides[t.strides.length-2],b=t.pads[t.pads.length/2-2],x=t.pads[t.pads.length-2];m=!!(b+x),i.push({type:12,data:g},{type:12,data:_},{type:12,data:b},{type:12,data:x}),s.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[i,s,!0,f,m]}else{if(r)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let u=C.computeStrides(t.kernelShape);i.push({type:12,data:u},{type:12,data:t.pads},{type:12,data:t.strides}),s.push({name:"kernelStrides",type:"u32",length:u.length},{name:"pads",type:"u32",length:t.pads.length},{name:"strides",type:"u32",length:t.strides.length});let d=t.pads.reduce((l,c)=>l+c);return[i,s,!!d,!1,!1]}},Gi=(e,t,r,a,n,i,s,u,d,l,c,f)=>{let m=n.format==="NHWC",g=t.type.value,_=G("output",t.type.tensor,a);if(n.kernelShape.length<=2){let b="",x="",w="",$=r-(m?2:1);if(c?b=` 2150 for (var i: u32 = 0u; i < uniforms.kw; i++) { 2151 xIndices[${$}] = indices[${$}] * uniforms.sw - uniforms.pwStart + i; 2152 if (xIndices[${$}] < 0 || xIndices[${$}] 2153 >= uniforms.x_shape[${$}]) { 2154 pad++; 2155 continue; 2156 } 2157 let x_val = x[${t.indicesToOffset("xIndices")}]; 2158 ${i} 2159 }`:b=` 2160 for (var i: u32 = 0u; i < uniforms.kw; i++) { 2161 xIndices[${$}] = indices[${$}] * uniforms.sw - uniforms.pwStart + i; 2162 let x_val = x[${t.indicesToOffset("xIndices")}]; 2163 ${i} 2164 }`,n.kernelShape.length===2){let k=r-(m?3:2);f?x=` 2165 for (var j: u32 = 0u; j < uniforms.kh; j++) { 2166 xIndices[${k}] = indices[${k}] * uniforms.sh - uniforms.phStart + j; 2167 if (xIndices[${k}] < 0 || xIndices[${k}] >= uniforms.x_shape[${k}]) { 2168 pad += i32(uniforms.kw); 2169 continue; 2170 } 2171 `:x=` 2172 for (var j: u32 = 0u; j < uniforms.kh; j++) { 2173 xIndices[${k}] = indices[${k}] * uniforms.sh - uniforms.phStart + j; 2174 `,w=` 2175 } 2176 `}return` 2177 ${e.registerUniforms(d).declareVariables(t,_)} 2178 2179 ${e.mainStart()} 2180 ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 2181 2182 let indices = ${_.offsetToIndices("global_idx")}; 2183 var xIndices = ${_.offsetToIndices("global_idx")}; 2184 2185 var value = ${g}(${u}); 2186 var pad = 0; 2187 ${x} 2188 ${b} 2189 ${w} 2190 ${s} 2191 2192 output[global_idx] = value; 2193 }`}else{if(m)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let b=n.kernelShape.length,x=n.pads.length,w="";return l?w=` 2194 if (xIndices[j] >= uniforms.x_shape[j]) { 2195 pad++; 2196 isPad = true; 2197 break; 2198 } 2199 } 2200 if (!isPad) { 2201 let x_val = x[${t.indicesToOffset("xIndices")}]; 2202 ${i} 2203 }`:w=` 2204 } 2205 let x_val = x[${t.indicesToOffset("xIndices")}]; 2206 ${i} 2207 `,` 2208 ${e.registerUniforms(d).declareVariables(t,_)} 2209 2210 ${e.mainStart()} 2211 ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 2212 let indices = ${_.offsetToIndices("global_idx")}; 2213 var xIndices = ${_.offsetToIndices("global_idx")}; 2214 2215 var offsets: array<u32, ${b}>; 2216 2217 var value = ${g}(${u}); 2218 var pad = 0; 2219 var isPad = false; 2220 2221 for (var i: u32 = 0u; i < uniforms.kernelSize; i++) { 2222 var offset = i; 2223 for (var j = 0u; j < ${b-1}u; j++) { 2224 offsets[j] = offset / ${F("uniforms.kernelStrides","j",b)}; 2225 offset -= offsets[j] * ${F("uniforms.kernelStrides","j",b)}; 2226 } 2227 offsets[${b-1}] = offset; 2228 2229 isPad = false;
2230 for (var j = ${r-b}u; j < ${r}u; j++) { 2231 xIndices[j] = indices[j] * ${F("uniforms.strides",`j - ${r-b}u`,b)} 2232 + offsets[j - ${r-b}u] - ${F("uniforms.pads","j - 2u",x)}; 2233 ${w} 2234 } 2235 ${s} 2236 2237 output[global_idx] = value; 2238 }`}},Fi=e=>`${e.format};${e.ceilMode};${e.autoPad};${e.kernelShape.length}`,al=e=>`${Fi(e)};${e.countIncludePad}`,nl=e=>`${Fi(e)};${e.storageOrder};${e.dilations}`,Ki=e=>({format:e.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],ceilMode:e.ceil_mode,kernelShape:e.kernel_shape,strides:e.strides,pads:e.pads}),Zi=(e,t,r,a)=>{let[n,i]=ji(t,a,r),s=R("x",t.dataType,t.dims.length),u=s.type.value,d="value += x_val;",l="";n.countIncludePad?l+=`value /= ${u}(uniforms.kernelSize);`:l+=`value /= ${u}(i32(uniforms.kernelSize) - pad);`;let[c,f,m,g,_]=Hi(i,n);c.push(...Z(t.dims,i));let b=["rank"];return{name:e,shaderCache:{hint:`${a.cacheKey};${m};${g};${_}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:i,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(C.size(i)/64)},programUniforms:c}),getShaderSource:x=>Gi(x,s,t.dims.length,i.length,n,d,l,0,f,m,g,_)}},Hc=e=>{let t=e.count_include_pad!==0,r=Ki(e);if(r.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let a={countIncludePad:t,...r,cacheKey:""};return{...a,cacheKey:al(a)}},Gc=(e,t)=>{Qt(e.inputs),e.compute(Zi("AveragePool",e.inputs[0],!1,t))},Qi={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},Fc=e=>{let t=e.format;return{format:t,...Qi,cacheKey:t}},Kc=(e,t)=>{Qt(e.inputs),e.compute(Zi("GlobalAveragePool",e.inputs[0],!0,t))},Xi=(e,t,r,a)=>{let[n,i]=ji(t,a,r),s=` 2239 value = max(x_val, value); 2240 `,u="",d=R("x",t.dataType,t.dims.length),l=["rank"],[c,f,m,g,_]=Hi(i,n);return c.push(...Z(t.dims,i)),{name:e,shaderCache:{hint:`${a.cacheKey};${m};${g};${_}`,inputDependencies:l},getRunData:()=>({outputs:[{dims:i,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(C.size(i)/64)},programUniforms:c}),getShaderSource:b=>Gi(b,d,t.dims.length,i.length,n,s,u,t.dataType===10?-65504:-1e5,f,m,g,_)}},Zc=(e,t)=>{Qt(e.inputs),e.compute(Xi("MaxPool",e.inputs[0],!1,t))},Qc=e=>{let t=e.storage_order,r=e.dilations,a=Ki(e);if(t!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(a.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let n={storageOrder:t,dilations:r,...a,cacheKey:""};return{...n,cacheKey:nl(n)}},Xc=e=>{let t=e.format;return{format:t,...Qi,cacheKey:t}},Yc=(e,t)=>{Qt(e.inputs),e.compute(Xi("GlobalMaxPool",e.inputs[0],!0,t))}}),sl,ol,Jc,ef,ig=U(()=>{J(),re(),we(),ie(),sl=(e,t)=>{if(e.length<2||e.length>3)throw new Error("DequantizeLinear requires 2 or 3 inputs.");if(e.length===3&&e[1].dims===e[2].dims)throw new Error("x-scale and x-zero-point must have the same shape.");if(e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[0].dataType===6&&e.length>2)throw new Error("In the case of dequantizing int32 there is no zero point.");if(e[1].dims.length!==0&&e[1].dims.length!==1&&e[1].dims.length!==e[0].dims.length)throw new Error("scale input must be a scalar, a 1D tensor, or have the same rank as the input tensor.");if(e.length>2){if(e[0].dataType!==e[2].dataType)throw new Error("x and x-zero-point must have the same data type.");if(e[1].dims.length!==e[2].dims.length)throw new Error("scale and zero-point inputs must have the same rank.");if(!e[1].dims.map((r,a)=>r===e[2].dims[a]).reduce((r,a)=>r&&a,!0))throw new Error("scale and zero-point inputs must have the same shape.")}if(t.blockSize>0){if(e[1].dims.length===0||e[1].dims.length===1&&e[1].dims[0]===1)throw new Error("blockSize must be set only for block quantization.");if(!e[1].dims.map((n,i)=>i===t.axis||n===e[0].dims[i]).reduce((n,i)=>n&&i,!0))throw new Error("For block qunatization, scale input shape to match the input shape except for the axis");if(e[1].dims.length!==e[0].dims.length)throw new Error("For block qunatization the scale input rank must be the same as the x rank.");let r=e[0].dims[t.axis],a=e[1].dims[t.axis];if(t.blockSize<Math.ceil(r/a)||t.blockSize>Math.ceil(r/(a-1)-1))throw new Error("blockSize must be with in the range [ceil(dI / Si), ceil(dI / (Si - 1) - 1)].")}},ol=(e,t)=>{let r=C.normalizeAxis(t.axis,e[0].dims.length),a=e[0].dataType,n=a===3,i=e[0].dims,s=e[1].dataType,u=C.size(i),d=a===3||a===2,l=d?[Math.ceil(C.size(e[0].dims)/4)]:e[0].dims,c=e[1].dims,f=e.length>2?e[2]:void 0,m=f?d?[Math.ceil(C.size(f.dims)/4)]:f.dims:void 0,g=c.length===0||c.length===1&&c[0]===1,_=g===!1&&c.length===1,b=$e(u),x=g&&(!d||b===4),w=x?b:1,$=x&&!d?b:1,k=R("input",d?12:a,l.length,$),S=R("scale",s,c.length),T=f?R("zero_point",d?12:a,m.length):void 0,E=G("output",s,i.length,w),z=[k,S];T&&z.push(T);let A=[l,c];f&&A.push(m);let O=[{type:12,data:u/w},{type:12,data:r},{type:12,data:t.blockSize},...Z(...A,i)],q=X=>{let H=[{name:"output_size",type:"u32"},{name:"axis",type:"u32"},{name:"block_size",type:"u32"}];return` 2241 ${X.registerUniforms(H).declareVariables(...z,E)} 2242 ${X.mainStart()} 2243 ${X.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 2244 let output_indices = ${E.offsetToIndices("global_idx")}; 2245 2246 // Set input x 2247 ${d?` 2248 let input = ${k.getByOffset("global_idx / 4")}; 2249 let x_vec = ${n?"unpack4xI8(input)":"unpack4xU8(input)"}; 2250 let x_value = ${w===1?"x_vec[global_idx % 4]":"x_vec"};`:`let x_value = ${k.getByOffset("global_idx")};`}; 2251 2252 // Set scale input 2253 ${g?`let scale_value= ${S.getByOffset("0")}`:_?` 2254 let scale_index = ${E.indicesGet("output_indices","uniforms.axis")}; 2255 let scale_value= ${S.getByOffset("scale_index")};`:` 2256 var scale_indices: ${S.type.indices} = output_indices; 2257 let index = ${S.indicesGet("scale_indices","uniforms.axis")} / uniforms.block_size; 2258 ${S.indicesSet("scale_indices","uniforms.axis","index")}; 2259 let scale_value= ${S.getByIndices("scale_indices")};`}; 2260 2261 // Set zero-point input 2262 ${T?g?d?` 2263 let zero_point_input = ${T.getByOffset("0")}; 2264 let zero_point_vec = ${n?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; 2265 let zero_point_value= zero_point_vec[0]`:`let zero_point_value = ${T.getByOffset("0")}`:_?d?` 2266 let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; 2267 let zero_point_input = ${T.getByOffset("zero_point_index / 4")}; 2268 let zero_point_vec = ${n?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; 2269 let zero_point_value = zero_point_vec[zero_point_index % 4]`:` 2270 let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; 2271 let zero_point_value = ${T.getByOffset("zero_point_index")};`:d?` 2272 let zero_point_offset = ${S.indicesToOffset("scale_indices")}; 2273 let zero_point_input = ${T.getByOffset("zero_point_offset / 4")}; 2274 let zero_point_vec = ${n?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; 2275 let zero_point_value = zero_point_vec[zero_point_offset % 4];`:`let zero_point_value = ${T.getByIndices("scale_indices")};`:`let zero_point_value = ${d?n?"i32":"u32":k.type.value}(0);`}; 2276 // Compute and write output 2277 ${E.setByOffset("global_idx",`${E.type.value}(x_value - zero_point_value) * scale_value`)}; 2278 }`};return{name:"DequantizeLinear",shaderCache:{hint:t.cacheKey,inputDependencies:T?["rank","rank","rank"]:["rank","rank"]},getShaderSource:q,getRunData:()=>({outputs:[{dims:i,dataType:s}],dispatchGroup:{x:Math.ceil(u/w/64),y:1,z:1},programUniforms:O})}},Jc=(e,t)=>
vendor: 4,345 bytes, lines 2278-2330
2278{sl(e.inputs,t),e.compute(ol(e.inputs,t))},ef=e=>ce({axis:e.axis,blockSize:e.blockSize})}),ul,ll,tf,ag=U(()=>{Ke(),J(),ie(),ul=(e,t,r)=>{let a=e===t,n=e<t&&r<0,i=e>t&&r>0;if(a||n||i)throw new Error("Range these inputs' contents are invalid.")},ll=(e,t,r,a)=>{let n=Math.abs(Math.ceil((t-e)/r)),i=[n],s=n,u=[{type:12,data:s},{type:a,data:e},{type:a,data:r},...Z(i)],d=l=>{let c=G("output",a,i.length),f=c.type.value,m=[{name:"outputSize",type:"u32"},{name:"start",type:f},{name:"delta",type:f}];return` 2279 ${l.registerUniforms(m).declareVariables(c)} 2280 ${l.mainStart()} 2281 ${l.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 2282 output[global_idx] = uniforms.start + ${f}(global_idx) * uniforms.delta; 2283 }`};return{name:"Range",shaderCache:{hint:`${a}`},getShaderSource:d,getRunData:()=>({outputs:[{dims:i,dataType:a}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:u})}},tf=e=>{let t=0,r=0,a=0;e.inputs[0].dataType===6?(t=e.inputs[0].getInt32Array()[0],r=e.inputs[1].getInt32Array()[0],a=e.inputs[2].getInt32Array()[0]):e.inputs[0].dataType===1&&(t=e.inputs[0].getFloat32Array()[0],r=e.inputs[1].getFloat32Array()[0],a=e.inputs[2].getFloat32Array()[0]),ye.webgpu.validateInputContent&&ul(t,r,a),e.compute(ll(t,r,a,e.inputs[0].dataType),{inputs:[]})}}),dl,Yi,Ji,pl,rf,af,ng=U(()=>{J(),re(),we(),ie(),dl=(e,t,r,a)=>{if(e!=="none"&&a!=="i32"&&a!=="u32"&&a!=="f32")throw new Error(`Input ${a} is not supported with reduction ${e}.`);let n=`{ 2284 var oldValue = 0; 2285 loop { 2286 let newValueF32 =`,i=`; 2287 let newValue = bitcast<i32>(newValueF32); 2288 let res = atomicCompareExchangeWeak(&${t}, oldValue, newValue); 2289 if res.exchanged { 2290 break; 2291 } 2292 oldValue = res.old_value; 2293 } 2294 }`;switch(e){case"none":return`${t}=${r};`;case"add":return a==="i32"||a==="u32"?`atomicAdd(&${t}, bitcast<${a}>(${r}));`:` 2295 ${n}bitcast<${a}>(oldValue) + (${r})${i}`;case"max":return a==="i32"||a==="u32"?`atomicMax(&${t}, bitcast<${a}>(${r}));`:` 2296 ${n}max(bitcast<f32>(oldValue), (${r}))${i}`;case"min":return a==="i32"||a==="u32"?`atomicMin(&${t}, bitcast<${a}>(${r}));`:`${n}min(bitcast<${a}>(oldValue), (${r}))${i}`;case"mul":return`${n}(bitcast<${a}>(oldValue) * (${r}))${i}`;default:throw new Error(`Reduction ${e} is not supported.`)}},Yi=(e,t)=>`${e===1?` 2297 let element_count_dim = uniforms.output_strides; 2298 let dim_value = uniforms.output_shape;`:` 2299 let element_count_dim = uniforms.output_strides[${t?"i - indices_start":"i"}]; 2300 let dim_value = uniforms.output_shape[${t?"i - indices_start":"i"} + uniforms.last_index_dimension];`} 2301 2302 if (index >= 0) { 2303 if (index >= i32(dim_value)) { 2304 index = i32(dim_value - 1); 2305 } 2306 } else { 2307 if (index < -i32(dim_value)) { 2308 index = 0; 2309 } else { 2310 index += i32(dim_value); 2311 } 2312 } 2313 data_offset += u32((u32(index) * element_count_dim));`,Ji=(e,t,r)=>`for (var i = 0u; i < uniforms.num_updates_elements; i++) { 2314 let value = updates[uniforms.num_updates_elements * ${r?"global_idx":"idx"} + i]; 2315 ${dl(e.reduction,"output[data_offset + i]","value",t)} 2316 }`,pl=(e,t)=>{let r=e[0].dims,a=e[1].dims,n=r,i=1,s=Math.ceil(C.size(a)/i),u=a[a.length-1],d=C.sizeFromDimension(r,u),l=C.sizeFromDimension(a,0)/u,c=[{type:12,data:s},{type:12,data:u},{type:12,data:d},...Z(e[1].dims,e[2].dims,n)],f=m=>{let g=R("indices",e[1].dataType,e[1].dims.length),_=R("updates",e[2].dataType,e[2].dims.length,i),b=t.reduction!=="none"&&t.reduction!==""?Ad("output",e[0].dataType,n.length):G("output",e[0].dataType,n.length,i);return` 2317 ${m.registerUniform("output_size","u32").registerUniform("last_index_dimension","u32").registerUniform("num_updates_elements","u32").declareVariables(g,_,b)} 2318 ${m.mainStart()} 2319 ${m.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 2320 var hasDuplicates = false; 2321 if (${t.reduction==="none"}) { 2322 for (var i = 0; i < ${l}; i = i + 1) { 2323 for (var j = i + 1; j < ${l}; j = j + 1) { 2324 var index_i = i32(indices[i].x); 2325 var index_j = i32(indices[j].x); 2326 if (index_i == index_j) { 2327 hasDuplicates = true; 2328 break; 2329 } 2330 }
2331 if (hasDuplicates) { 2332 break; 2333 } 2334 } 2335 } 2336 2337 if (${t.reduction==="none"} && hasDuplicates) { 2338 if (global_idx != 0u) { 2339 return; 2340 } 2341 // Process each index-update pair individually when duplicates exist 2342 for (var idx = 0u; idx < ${l}u; idx++) { 2343 var data_offset = 0u; 2344 for (var i = 0u; i < uniforms.last_index_dimension; i++) { 2345 var index = i32(indices[idx * uniforms.last_index_dimension + i].x); 2346 ${Yi(r.length,!1)} 2347 } 2348 ${Ji(t,b.type.value,!1)} 2349 } 2350 return; 2351 } 2352 2353 var data_offset = 0u; 2354 var indices_start = uniforms.last_index_dimension * global_idx; 2355 var indices_end = indices_start + uniforms.last_index_dimension; 2356 for (var i = indices_start; i < indices_end; i++) { 2357 var index = i32(indices[i].x); 2358 ${Yi(r.length,!0)} 2359 } 2360 ${Ji(t,b.type.value,!0)} 2361 }`};return{name:"ScatterND",shaderCache:{hint:`${t.cacheKey}_${t.reduction}`,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:c}),getShaderSource:f}},rf=e=>ce({reduction:e.reduction}),af=(e,t)=>{e.compute(pl(e.inputs,t),{inputs:[e.inputs[1],e.inputs[2]],outputs:[]})}}),cl,fl,hl,ea,ml,gl,_l,yl,bl,$l,wl,vl,ta,xl,Sl,kl,Tl,Il,nf,sf,sg=U(()=>{J(),re(),we(),ie(),cl=(e,t)=>{if(e.every(r=>r>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),e.length>0){if(t.mode==="linear"){if(!(e.length===2||e.length===3||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1||e.length===5&&e[0]===1&&e[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and 2362 one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(t.mode==="cubic"&&!(e.length===2||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},fl=(e,t,r)=>{t.every(n=>n>=0&&n<r||(()=>{throw new Error("Resize requires axes input values to be positive and less than rank")}));let a=new Array(r).fill(1);return t.forEach((n,i)=>a[n]=e[i]),a},hl=(e,t,r,a,n,i)=>{let[s,u,d]=r>10?[1,2,3]:[-1,e.length>1?1:-1,-1],l=e[0].dims.length;if(s>0&&e.length>s&&e[s].dims.length>0)e[s].getFloat32Array().forEach(c=>i.push(c));else if(t.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(u>0&&e.length>u&&e[u].dims.length===1&&e[u].dims[0]>0){if(e[u].getFloat32Array().forEach(c=>a.push(c)),a.length!==0&&a.length!==l&&r>=18&&a.length!==t.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");cl(a,t),t.axes.length>0&&fl(a,t.axes,l).forEach((c,f)=>a[f]=c)}if(d>0&&e.length>d&&e[d].dims.length===1&&e[d].dims[0]>0&&(e[d].getBigInt64Array().forEach(c=>n.push(Number(c))),n.length!==0&&n.length!==l&&r>=18&&n.length!==t.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(t.axes.length>0){if(a.length!==0&&a.length!==t.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(n.length!==0&&n.length!==t.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof a<"u"&&typeof n<"u"&&a.length>0&&n.length>l)throw new Error("Resize requires only of scales or sizes to be specified")},ea=(e,t,r,a)=>` 2363 // The whole part and the fractional part are calculated separately due to inaccuracy of floating 2364 // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an 2365 // offset-by-one error later in floor(). 2366 let big = (${e}) * (${t}); 2367 let whole = ${a}(big / (${r})); 2368 let fract = ${a}(big % (${r})) / ${a}(${r}); 2369 return whole + fract; 2370`,ml=(e,t)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, 2371 lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${t} { `+(()=>{switch(e){case"asymmetric":return` 2372 if (xScale < 1.0 || floor(xScale) != xScale) { 2373 return ${t}(xResized) / ${t}(xScale); 2374 } else { 2375 ${ea("xResized","lengthOriginal","lengthResized",t)} 2376 } 2377 `;case"pytorch_half_pixel":return`if (lengthResized > 1) { 2378 return (${t}(xResized) + 0.5) / ${t}(xScale) - 0.5; 2379 } else { 2380 return 0.0; 2381 }`;case"tf_half_pixel_for_nn":return`return (${t}(xResized) + 0.5) / ${t}(xScale);`;case"align_corners":return`if (lengthResized == 1) { 2382 return 0.0; 2383 } else { 2384 ${ea("xResized","lengthOriginal - 1","lengthResized - 1",t)} 2385 }`;case"tf_crop_and_resize":return`if (lengthResized > 1) { 2386 return ${t}(roiStart) * ${t}(lengthOriginal - 1) + 2387 (${t}(xResized) * ${t}(roiEnd - roiStart) * ${t}(lengthOriginal - 1)) / 2388 ${t}(lengthResized - 1); 2389 } else { 2390 return 0.5 * ${t}(roiStart + roiEnd) * ${t}(lengthOriginal - 1); 2391 }`;case"half_pixel_symmetric":return`const outputWidth = ${t}xScale * ${t}(lengthResized); 2392 const adjustment = ${t}(lengthResized) / outputWidth; 2393 const center = ${t}(lengthOriginal) / 2; 2394 const offset = center * (1 - adjustment); 2395 return offset + ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;case"half_pixel":return`return ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${e} is not supported`)}})()+"}",gl=(e,t,r)=>`fn getNearestPixelFromOriginal(xOriginal: ${r}, isDownSample: bool) -> ${r} {`+(()=>{switch(e){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(t<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${e} is not supported`)}})()+"}",_l=(e,t,r)=>{let a=new Array(r).fill(0).concat(new Array(r).fill(1)),n=e.length===0?a:e.slice();return t.length>0?(t.forEach((i,s)=>{a[i]=n[s],a[s+r]=n[t.length+s]}),a):n},yl=(e,t,r,a)=>{let n=[];if(r.length>0)if(a.length>0){if(e.forEach(i=>
vendor: 4,611 bytes, lines 2395-2469
2395n.push(i)),Math.max(...a)>e.length)throw new Error("axes is out of bound");a.forEach((i,s)=>n[i]=r[s])}else r.forEach(i=>n.push(i));else{if(t.length===0)throw new Error("Resize requires either scales or sizes.");n=e.map((i,s)=>Math.round(i*t[s]))}return n},bl=(e,t,r)=>{let a=(()=>{switch(r.keepAspectRatioPolicy){case"not_larger":return r.axes.length>0?Math.min(...r.axes.map(i=>t[i]),Number.MAX_VALUE):Math.min(...t,Number.MAX_VALUE);case"not_smaller":return r.axes.length>0?Math.max(...r.axes.map(i=>t[i]),Number.MIN_VALUE):Math.max(...t,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${r.keepAspectRatioPolicy} is not supported`)}})();t.fill(1,0,t.length);let n=e.slice();return r.axes.length>0?(r.axes.forEach(i=>t[i]=a),r.axes.forEach(i=>n[i]=Math.round(e[i]*t[i]))):(t.fill(a,0,t.length),n.forEach((i,s)=>n[s]=Math.round(i*t[s]))),n},$l=(e,t,r,a,n)=>` 2396 fn calculateOriginalIndicesFromOutputIndices(output_indices: ${e.type.indices}) -> array<${e.type.value}, ${r.length}> { 2397 var original_indices: array<${e.type.value}, ${r.length}>; 2398 for (var i:u32 = 0; i < ${r.length}; i++) { 2399 var output_index = ${e.indicesGet("output_indices","i")}; 2400 var scale = ${F("uniforms.scales","i",a)}; 2401 var roi_low = ${F("uniforms.roi","i",n)}; 2402 var roi_hi = ${F("uniforms.roi",`i + ${t.length}`,n)}; 2403 if (scale == 1.0) { 2404 original_indices[i] = ${e.type.value}(output_index); 2405 } else { 2406 var input_shape_i = ${F("uniforms.input_shape","i",t.length)}; 2407 var output_shape_i = ${F("uniforms.output_shape","i",r.length)}; 2408 original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, 2409 input_shape_i, roi_low, roi_hi); 2410 } 2411 } 2412 return original_indices; 2413 }`,wl=(e,t,r,a,n,i,s)=>` 2414 fn calculateInputIndicesFromOutputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { 2415 var input_indices: ${e.type.indices}; 2416 for (var i:u32 = 0; i < ${a.length}; i++) { 2417 var output_index = ${t.indicesGet("output_indices","i")}; 2418 var input_index: u32; 2419 var scale = ${F("uniforms.scales","i",n)}; 2420 if (scale == 1.0) { 2421 input_index = output_index; 2422 } else { 2423 var roi_low = ${F("uniforms.roi","i",i)}; 2424 var roi_hi = ${F("uniforms.roi",`i + ${r.length}`,i)}; 2425 var input_shape_i = ${F("uniforms.input_shape","i",r.length)}; 2426 var output_shape_i = ${F("uniforms.output_shape","i",a.length)}; 2427 var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, 2428 input_shape_i, roi_low, roi_hi); 2429 if (!${s} || (original_idx >= 0 && original_idx < ${t.type.value}(input_shape_i))) { 2430 if (original_idx < 0) { 2431 input_index = 0; 2432 } else if (original_idx > ${t.type.value}(input_shape_i - 1)) { 2433 input_index = input_shape_i - 1; 2434 } else { 2435 input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1)); 2436 } 2437 } else { 2438 input_index = u32(original_idx); 2439 } 2440 } 2441 ${e.indicesSet("input_indices","i","input_index")} 2442 } 2443 return input_indices; 2444 }`,vl=(e,t)=>` 2445 fn checkInputIndices(input_indices: ${e.type.indices}) -> bool { 2446 for (var i:u32 = 0; i < ${t.length}; i++) { 2447 var input_index = ${e.indicesGet("input_indices","i")}; 2448 if (input_index < 0 || input_index >= ${F("uniforms.input_shape","i",t.length)}) { 2449 return false; 2450 } 2451 } 2452 return true; 2453 }`,ta=(e,t,r,a)=>e.rank>a?` 2454 ${e.indicesSet("input_indices",t,"channel")}; 2455 ${e.indicesSet("input_indices",r,"batch")}; 2456`:"",xl=(e,t,r,a,n)=>{let[i,s,u,d]=r.length===2?[-1,0,1,-1]:[0,2,3,1],l=e.type.value;return` 2457 fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${l} { 2458 var input_indices: ${e.type.indices}; 2459 ${e.indicesSet("input_indices",s,`max(0, min(row, ${r[s]} - 1))`)}; 2460 ${e.indicesSet("input_indices",u,`max(0, min(col, ${r[u]} - 1))`)}; 2461 ${ta(e,d,i,2)} 2462 return ${e.getByIndices("input_indices")}; 2463 } 2464 2465 fn bilinearInterpolation(output_indices: ${t.type.indices}) -> ${l} { 2466 var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); 2467 var row:${l} = originalIndices[${s}]; 2468 var col:${l} = originalIndices[${u}]; 2469 ${a?`if (row < 0 || row > (${r[s]}
vendor: 8,925 bytes, lines 2469-2631
2469 - 1) || col < 0 || col > (${r[u]} - 1)) { 2470 return ${n}; 2471 }`:""}; 2472 row = max(0, min(row, ${r[s]} - 1)); 2473 col = max(0, min(col, ${r[u]} - 1)); 2474 var row1: u32 = u32(row); 2475 var col1: u32 = u32(col); 2476 var row2: u32 = u32(row + 1); 2477 var col2: u32 = u32(col + 1); 2478 var channel: u32 = ${r.length>2?`u32(originalIndices[${d}])`:"0"}; 2479 var batch: u32 = ${r.length>2?`u32(originalIndices[${i}])`:"0"}; 2480 var x11: ${l} = getInputValue(batch, channel, row1, col1); 2481 var x12: ${l} = getInputValue(batch, channel, row1, col2); 2482 var x21: ${l} = getInputValue(batch, channel, row2, col1); 2483 var x22: ${l} = getInputValue(batch, channel, row2, col2); 2484 var dx1: ${l} = abs(row - ${l}(row1)); 2485 var dx2: ${l} = abs(${l}(row2) - row); 2486 var dy1: ${l} = abs(col - ${l}(col1)); 2487 var dy2: ${l} = abs(${l}(col2) - col); 2488 if (row1 == row2) { 2489 dx1 = 0.5; 2490 dx2 = 0.5; 2491 } 2492 if (col1 == col2) { 2493 dy1 = 0.5; 2494 dy2 = 0.5; 2495 } 2496 return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); 2497 }`},Sl=(e,t,r,a,n,i,s,u,d,l)=>{let c=r.length===2,[f,m]=c?[0,1]:[2,3],g=e.type.value,_=b=>{let x=b===f?"row":"col";return` 2498 fn ${x}CubicInterpolation(input_indices: ${e.type.indices}, output_indices: ${t.type.indices}) -> ${g} { 2499 var output_index = ${t.indicesGet("output_indices",b)}; 2500 var originalIdx: ${g} = getOriginalCoordinateFromResizedCoordinate(output_index, ${n[b]}, 2501 ${a[b]}, ${r[b]}, ${i[b]}, ${i[b]} + ${r.length}); 2502 var fractOriginalIdx: ${g} = originalIdx - floor(originalIdx); 2503 var coefs = getCubicInterpolationCoefs(fractOriginalIdx); 2504 2505 if (${u} && (originalIdx < 0 || originalIdx > (${r[b]} - 1))) { 2506 return ${d}; 2507 } 2508 var data: array<${g}, 4> = array<${g}, 4>(0.0, 0.0, 0.0, 0.0); 2509 for (var i: i32 = -1; i < 3; i++) { 2510 var ${x}: ${g} = originalIdx + ${g}(i); 2511 if (${x} < 0 || ${x} >= ${r[b]}) { 2512 ${l?`coefs[i + 1] = 0.0; 2513 continue;`:u?`return ${d};`:`${x} = max(0, min(${x}, ${r[b]} - 1));`}; 2514 } 2515 var input_indices_copy: ${e.type.indices} = input_indices; 2516 ${e.indicesSet("input_indices_copy",b,`u32(${x})`)}; 2517 data[i + 1] = ${b===f?e.getByIndices("input_indices_copy"):"rowCubicInterpolation(input_indices_copy, output_indices)"}; 2518 } 2519 return cubicInterpolation1D(data, coefs); 2520 }`};return` 2521 ${_(f)}; 2522 ${_(m)}; 2523 fn getCubicInterpolationCoefs(s: ${g}) -> array<${g}, 4> { 2524 var absS = abs(s); 2525 var coeffs: array<${g}, 4> = array<${g}, 4>(0.0, 0.0, 0.0, 0.0); 2526 var oneMinusAbsS: ${g} = 1.0 - absS; 2527 var twoMinusAbsS: ${g} = 2.0 - absS; 2528 var onePlusAbsS: ${g} = 1.0 + absS; 2529 coeffs[0] = ((${s} * onePlusAbsS - 5 * ${s}) * onePlusAbsS + 8 * ${s}) * onePlusAbsS - 4 * ${s}; 2530 coeffs[1] = ((${s} + 2) * absS - (${s} + 3)) * absS * absS + 1; 2531 coeffs[2] = ((${s} + 2) * oneMinusAbsS - (${s} + 3)) * oneMinusAbsS * oneMinusAbsS + 1; 2532 coeffs[3] = ((${s} * twoMinusAbsS - 5 * ${s}) * twoMinusAbsS + 8 * ${s}) * twoMinusAbsS - 4 * ${s}; 2533 return coeffs; 2534 } 2535 2536 fn cubicInterpolation1D(x: array<${g}, 4>, coefs: array<${g}, 4>) -> ${g} { 2537 var coefsSum: ${g} = coefs[0] + coefs[1] + coefs[2] + coefs[3]; 2538 return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum; 2539 } 2540 2541 fn bicubicInterpolation(output_indices: ${t.type.indices}) -> ${g} { 2542 var input_indices: ${e.type.indices} = output_indices; 2543 return colCubicInterpolation(input_indices, output_indices); 2544 } 2545 `},kl=(e,t,r,a,n)=>{let[i,s,u,d,l]=r.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],c=e.type.value;return` 2546 fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${c} { 2547 var input_indices: ${e.type.indices}; 2548 ${e.indicesSet("input_indices",s,`max(0, min(depth, ${r[s]} - 1))`)}; 2549 ${e.indicesSet("input_indices",u,`max(0, min(height, ${r[u]} - 1))`)}; 2550 ${e.indicesSet("input_indices",d,`max(0, min(width, ${r[d]} - 1))`)}; 2551 ${ta(e,l,i,3)} 2552 return ${e.getByIndices("input_indices")}; 2553 } 2554 2555 fn trilinearInterpolation(output_indices: ${t.type.indices}) -> ${c} { 2556 var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); 2557 var depth:${c} = originalIndices[${s}]; 2558 var height:${c} = originalIndices[${u}]; 2559 var width:${c} = originalIndices[${d}]; 2560 ${a?`if (depth < 0 || depth > (${r[s]} - 1) || height < 0 || height > (${r[u]} - 1) || width < 0 || (width > ${r[d]} - 1)) { 2561 return ${n}; 2562 }`:""}; 2563 2564 depth = max(0, min(depth, ${r[s]} - 1)); 2565 height = max(0, min(height, ${r[u]} - 1)); 2566 width = max(0, min(width, ${r[d]} - 1)); 2567 var depth1: u32 = u32(depth); 2568 var height1: u32 = u32(height); 2569 var width1: u32 = u32(width); 2570 var depth2: u32 = u32(depth + 1); 2571 var height2: u32 = u32(height + 1); 2572 var width2: u32 = u32(width + 1); 2573 var channel: u32 = ${r.length>3?`u32(originalIndices[${l}])`:"0"}; 2574 var batch: u32 = ${r.length>3?`u32(originalIndices[${i}])`:"0"}; 2575 2576 var x111: ${c} = getInputValue(batch, channel, depth1, height1, width1); 2577 var x112: ${c} = getInputValue(batch, channel, depth1, height1, width2); 2578 var x121: ${c} = getInputValue(batch, channel, depth1, height2, width1); 2579 var x122: ${c} = getInputValue(batch, channel, depth1, height2, width2); 2580 var x211: ${c} = getInputValue(batch, channel, depth2, height1, width1); 2581 var x212: ${c} = getInputValue(batch, channel, depth2, height1, width2); 2582 var x221: ${c} = getInputValue(batch, channel, depth2, height2, width1); 2583 var x222: ${c} = getInputValue(batch, channel, depth2, height2, width2); 2584 var dx1: ${c} = abs(depth - ${c}(depth1)); 2585 var dx2: ${c} = abs(${c}(depth2) - depth); 2586 var dy1: ${c} = abs(height - ${c}(height1)); 2587 var dy2: ${c} = abs(${c}(height2) - height); 2588 var dz1: ${c} = abs(width - ${c}(width1)); 2589 var dz2: ${c} = abs(${c}(width2) - width); 2590 if (depth1 == depth2) { 2591 dx1 = 0.5; 2592 dx2 = 0.5; 2593 } 2594 if (height1 == height2) { 2595 dy1 = 0.5; 2596 dy2 = 0.5; 2597 } 2598 if (width1 == width2) { 2599 dz1 = 0.5; 2600 dz2 = 0.5; 2601 } 2602 return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + 2603 x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); 2604 }`},Tl=(e,t,r,a,n,i)=>{let s=e.dims,u=_l(i,t.axes,s.length),d=yl(s,a,n,t.axes),l=a.slice();a.length===0&&(l=s.map(($,k)=>$===0?1:d[k]/$),t.keepAspectRatioPolicy!=="stretch"&&(d=bl(s,l,t)));let c=G("output",e.dataType,d.length),f=R("input",e.dataType,s.length),m=C.size(d),g=s.length===d.length&&s.every(($,k)=>$===d[k]),_=t.coordinateTransformMode==="tf_crop_and_resize",b=t.extrapolationValue,x=f.type.value,w=$=>` 2605 ${g?"":` 2606 ${ml(t.coordinateTransformMode,x)}; 2607 ${(()=>{switch(t.mode){case"nearest":return` 2608 ${vl(f,s)}; 2609 ${gl(t.nearestMode,r,x)}; 2610 ${wl(f,c,s,d,l.length,u.length,_)}; 2611 `;case"linear":return` 2612 ${$l(c,s,d,l.length,u.length)}; 2613 ${(()=>{if(s.length===2||s.length===4)return`${xl(f,c,s,_,b)}`;if(s.length===3||s.length===5)return`${kl(f,c,s,_,b)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; 2614 `;case"cubic":return` 2615 ${(()=>{if(s.length===2||s.length===4)return`${Sl(f,c,s,d,l,u,t.cubicCoeffA,_,t.extrapolationValue,t.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; 2616 `;default:throw Error("Invalid resize mode")}})()}; 2617 `} 2618 ${$.registerUniform("output_size","u32").registerUniform("scales","f32",l.length).registerUniform("roi","f32",u.length).declareVariables(f,c)} 2619 ${$.mainStart()} 2620 ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 2621 ${g?"output[global_idx] = input[global_idx];":` 2622 let output_indices = ${c.offsetToIndices("global_idx")}; 2623 var input_indices: ${f.type.indices}; 2624 ${(()=>{switch(t.mode){case"nearest":return`input_indices = calculateInputIndicesFromOutputIndices(output_indices); 2625 if (checkInputIndices(input_indices)) { 2626 output[global_idx] = ${f.getByIndices("input_indices")}; 2627 } else { 2628 output[global_idx] = ${t.extrapolationValue}; 2629 }`;case"linear":return`output[global_idx] = ${s.length===2||s.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${t.mode}`)}})()}; 2630`} 2631 }`;
vendor: 18,175 bytes, lines 2631-2823
2631return{name:"Resize",shaderCache:{hint:`${t.cacheKey}|${r}|${l.length>0?t.mode==="cubic"?l:l.length:""}|${n.length>0?n:""}|${u.length>0?u:""}|${g}|${t.mode==="nearest"?s.length:s}`,inputDependencies:["rank"]},getShaderSource:w,getRunData:()=>({outputs:[{dims:d,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:[{type:12,data:m},{type:1,data:l},{type:1,data:u},...Z(s,d)]})}},Il=e=>{let t=e.customDataBuffer;return new Uint32Array(t,t.byteOffset,1)[0]},nf=(e,t)=>{let r=[],a=[],n=[],i=Il(e);if(t.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");hl(e.inputs,t,i,r,a,n),e.compute(Tl(e.inputs[0],t,i,r,a,n),{inputs:[0]})},sf=e=>{let t=e.antialias,r=e.axes,a=e.coordinateTransformMode,n=e.cubicCoeffA,i=e.excludeOutside!==0,s=e.extrapolationValue,u=e.keepAspectRatioPolicy,d=e.mode,l=e.nearestMode===""?"simple":e.nearestMode;return ce({antialias:t,axes:r,coordinateTransformMode:a,cubicCoeffA:n,excludeOutside:i,extrapolationValue:s,keepAspectRatioPolicy:u,mode:d,nearestMode:l})}}),El,zl,of,og=U(()=>{J(),re(),ie(),El=e=>{if(!e||e.length<3)throw new Error("layerNorm requires at least 3 inputs.");let t=e[0],r=e[1],a=e[2];if(t.dataType!==r.dataType||t.dataType!==a.dataType)throw new Error("All inputs must have the same data type");if(t.dims.length!==3&&t.dims.length!==2)throw new Error("Input must be 2D or 3D");if(r.dims.length!==3&&r.dims.length!==2)throw new Error("Skip must be 2D or 3D");let n=t.dims[t.dims.length-1],i=t.dims[t.dims.length-2];if(r.dims[r.dims.length-1]!==n)throw new Error("Skip must have the same hidden size as input");if(r.dims[r.dims.length-2]!==i)throw new Error("Skip must have the same sequence length as input");if(a.dims.length!==1)throw new Error("Gamma must be 1D");if(a.dims[a.dims.length-1]!==n)throw new Error("Gamma must have the same hidden size as input");if(e.length>3){let s=e[3];if(s.dims.length!==1)throw new Error("Beta must be 1D");if(s.dims[s.dims.length-1]!==n)throw new Error("Beta must have the same hidden size as input")}if(e.length>4){let s=e[4];if(s.dims.length!==1)throw new Error("Bias must be 1D");if(s.dims[s.dims.length-1]!==n)throw new Error("Bias must have the same hidden size as input")}},zl=(e,t,r,a)=>{let n=t.simplified,i=e[0].dims,s=C.size(i),u=i,d=s,l=i.slice(-1)[0],c=a?i.slice(0,-1).concat(1):[],f=!n&&e.length>3,m=e.length>4,g=a&&r>1,_=a&&r>2,b=r>3,x=64,w=$e(l),$=[{type:12,data:d},{type:12,data:w},{type:12,data:l},{type:1,data:t.epsilon}],k=T=>{let E=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],z=[R("x",e[0].dataType,e[0].dims,w),R("skip",e[1].dataType,e[1].dims,w),R("gamma",e[2].dataType,e[2].dims,w)];f&&z.push(R("beta",e[3].dataType,e[3].dims,w)),m&&z.push(R("bias",e[4].dataType,e[4].dims,w)),z.push(G("output",e[0].dataType,u,w)),g&&z.push(G("mean_output",1,c)),_&&z.push(G("inv_std_output",1,c)),b&&z.push(G("input_skip_bias_sum",e[0].dataType,u,w));let A=Se(e[0].dataType),O=Se(1,w);return` 2632 2633 ${T.registerUniforms(E).declareVariables(...z)} 2634 var<workgroup> sum_shared : array<${O}, ${x}>; 2635 var<workgroup> sum_squared_shared : array<${O}, ${x}>; 2636 2637 ${T.mainStart([x,1,1])} 2638 let ix = local_id.x; 2639 let iy = global_id.x / ${x}; 2640 2641 let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components; 2642 var stride = hidden_size_vectorized / ${x}; 2643 let offset = ix * stride + iy * hidden_size_vectorized; 2644 let offset1d = stride * ix; 2645 if (ix == ${x-1}) { 2646 stride = hidden_size_vectorized - stride * ix; 2647 } 2648 for (var i: u32 = 0; i < stride; i++) { 2649 let skip_value = skip[offset + i]; 2650 let bias_value = ${m?"bias[offset1d + i]":A+"(0.0)"}; 2651 let input_value = x[offset + i]; 2652 let value = input_value + skip_value + bias_value; 2653 ${b?"input_skip_bias_sum[offset + i] = value;":""} 2654 output[offset + i] = value; 2655 let f32_value = ${Dt(A,w,"value")}; 2656 sum_shared[ix] += f32_value; 2657 sum_squared_shared[ix] += f32_value * f32_value; 2658 } 2659 workgroupBarrier(); 2660 2661 var reduce_size : u32 = ${x}; 2662 for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) { 2663 reduce_size = curr_size + (reduce_size & 1); 2664 if (ix < curr_size) { 2665 sum_shared[ix] += sum_shared[ix + reduce_size]; 2666 sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size]; 2667 } 2668 workgroupBarrier(); 2669 } 2670 2671 let sum = sum_shared[0]; 2672 let square_sum = sum_squared_shared[0]; 2673 let mean = ${ht("sum",w)} / f32(uniforms.hidden_size); 2674 let inv_std_dev = inverseSqrt(${ht("square_sum",w)} / f32(uniforms.hidden_size) ${n?"":"- mean * mean"} + uniforms.epsilon); 2675 ${g?"mean_output[global_idx] = mean;":""} 2676 ${_?"inv_std_output[global_idx] = inv_std_dev;":""} 2677 2678 for (var i: u32 = 0; i < stride; i++) { 2679 output[offset + i] = (output[offset + i] ${n?"":`- ${A}(mean)`}) * 2680 ${A}(inv_std_dev) * gamma[offset1d + i] 2681 ${f?"+ beta[offset1d + i]":""}; 2682 } 2683 }`},S=[{dims:u,dataType:e[0].dataType}];return r>1&&S.push({dims:c,dataType:1}),r>2&&S.push({dims:c,dataType:1}),r>3&&S.push({dims:i,dataType:e[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${w};${g};${_};${b}`,inputDependencies:e.map((T,E)=>"type")},getShaderSource:k,getRunData:()=>({outputs:S,dispatchGroup:{x:Math.ceil(d/l)},programUniforms:$})}},of=(e,t)=>{El(e.inputs);let r=[0];e.outputCount>1&&r.push(-3),e.outputCount>2&&r.push(-3),e.outputCount>3&&r.push(3),e.compute(zl(e.inputs,t,e.outputCount,!1),{outputs:r})}}),Cl,Xt,Al,ra,Ol,Bl,uf,lf,ug=U(()=>{J(),re(),we(),ie(),Cl=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");if(t.axes.length!==0){if(t.axes.length!==t.starts.length||t.axes.length!==t.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(t.starts.length!==t.ends.length)throw new Error("starts and ends must have the same length");e.slice(1).forEach((r,a)=>{if(e[a+1].dataType!==6&&e[a+1].dataType!==7)throw new Error(`Input ${a} must be an array of int32 or int64`)})},Xt=(e,t)=>{let r=[];if(e.length>t)if(e[t].dataType===7)e[t].getBigInt64Array().forEach(a=>r.push(Number(a)));else if(e[t].dataType===6)e[t].getInt32Array().forEach(a=>r.push(Number(a)));else throw new Error(`Input ${t} must be an array of int32 or int64`);return r},Al=(e,t)=>{if(e.length>1){let r=Xt(e,1),a=Xt(e,2),n=Xt(e,3);return n.length===0&&(n=[...Array(e[0].dims.length).keys()]),ce({starts:r,ends:a,axes:n})}else return t},ra=(e,t,r,a,n)=>{let i=e;return e<0&&(i+=r[a[t]]),n[t]<0?Math.max(0,Math.min(i,r[a[t]]-1)):Math.max(0,Math.min(i,r[a[t]]))},Ol=(e,t,r)=>`fn calculateInputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { 2684 var input_indices: ${e.type.indices}; 2685 var carry = 0u; 2686 for (var i = ${r.length}; i >= 0; i--) { 2687 let input_shape_i = ${F("uniforms.input_shape","i",r.length)}; 2688 let steps_i = ${F("uniforms.steps","i",r.length)}; 2689 let signs_i = ${F("uniforms.signs","i",r.length)}; 2690 let starts_i = ${F("uniforms.starts","i",r.length)}; 2691 var output_index = ${t.indicesGet("output_indices","i")}; 2692 var input_index = output_index * steps_i + starts_i + carry; 2693 carry = input_index / input_shape_i; 2694 input_index = input_index % input_shape_i; 2695 if (signs_i < 0) { 2696 input_index = input_shape_i - input_index - 1u + starts_i; 2697 } 2698 ${e.indicesSet("input_indices","i","input_index")}; 2699 } 2700 return input_indices; 2701 }`,Bl=(e,t)=>{let r=e[0].dims,a=C.size(r),n=t.axes.length>0?C.normalizeAxes(t.axes,r.length):[...Array(r.length).keys()],i=Xt(e,4);i.forEach(w=>w!==0||(()=>{throw new Error("step cannot be 0")})),i.length===0&&(i=Array(n.length).fill(1));let s=t.starts.map((w,$)=>ra(w,$,r,n,i)),u=t.ends.map((w,$)=>ra(w,$,r,n,i));if(n.length!==s.length||n.length!==u.length)throw new Error("start, ends and axes should have the same number of elements");if(n.length!==r.length)for(let w=0;w<r.length;++w)n.includes(w)||(s.splice(w,0,0),u.splice(w,0,r[w]),i.splice(w,0,1));let d=i.map(w=>Math.sign(w));i.forEach((w,$,k)=>{if(w<0){let S=(u[$]-s[$])/w,T=s[$],E=T+S*i[$];s[$]=E,u[$]=T,k[$]=-w}});let l=r.slice(0);n.forEach((w,$)=>{l[w]=Math.ceil((u[w]-s[w])/i[w])});let c={dims:l,dataType:e[0].dataType},f=G("output",e[0].dataType,l.length),m=R("input",e[0].dataType,e[0].dims.length),g=C.size(l),_=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:s.length},{name:"signs",type:"i32",length:d.length},{name:"steps",type:"u32",length:i.length}],b=[{type:12,data:g},{type:12,data:s},{type:6,data:d},{type:12,data:i},...Z(e[0].dims,l)],x=w=>` 2702 ${w.registerUniforms(_).declareVariables(m,f)} 2703 ${Ol(m,f,r)} 2704 ${w.mainStart()} 2705 ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} 2706 let output_indices = ${f.offsetToIndices("global_idx")}; 2707 let input_indices = calculateInputIndices(output_indices); 2708 ${f.setByOffset("global_idx",m.getByIndices("input_indices"))} 2709 }`;return{name:"Slice",shaderCache:{hint:`${d.length}_${s.length}_${i.length}`,inputDependencies:["rank"]},getShaderSource:x,getRunData:()=>({outputs:[c],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:b})}},uf=(e,t)=>{Cl(e.inputs,t);let r=Al(e.inputs,t);e.compute(Bl(e.inputs,r),{inputs:[0]})},lf=e=>{let t=e.starts,r=e.ends,a=e.axes;return ce({starts:t,ends:r,axes:a})}}),Rl,Dl,df,pf,lg=U(()=>{J(),re(),we(),mt(),ie(),Rl=e=>{if(!e||e.length!==1)throw new Error("Softmax op requires 1 input.")},Dl=(e,t)=>{let r=e.inputs[0],a=r.dims,n=C.size(a),i=a.length,s=C.normalizeAxis(t.axis,i),u=s<a.length-1,d,l=[];u?(l=Array.from({length:i},(z,A)=>A),l[s]=i-1,l[i-1]=s,d=e.compute(De(r,l),{inputs:[r],outputs:[-1]})[0]):d=r;let c=d.dims,f=c[i-1],m=n/f,g=$e(f),_=f/g,b=64;m===1&&(b=256);let x=(z,A)=>A===4?`max(max(${z}.x, ${z}.y), max(${z}.z, ${z}.w))`:A===2?`max(${z}.x, ${z}.y)`:A===3?`max(max(${z}.x, ${z}.y), ${z}.z)`:z,w=R("x",d.dataType,d.dims,g),$=G("result",d.dataType,d.dims,g),k=w.type.value,S=Se(d.dataType)==="f32"?`var threadMax = ${k}(-3.402823e+38f);`:`var threadMax = ${k}(-65504.0h);`,T=z=>` 2710 var<workgroup> rowMaxShared : ${k}; 2711 var<workgroup> rowSumShared : ${k}; 2712 var<workgroup> threadShared : array<${k}, ${b}>; 2713 2714 fn getValue(row: i32, col: i32, row_stride: i32) -> ${k} { 2715 let index = row * row_stride + col; 2716 return x[index]; 2717 } 2718 2719 fn setValue(row: i32, col: i32, row_stride: i32, value: ${k}) { 2720 let index = row * row_stride + col; 2721 result[index] = value; 2722 } 2723 ${z.registerUniform("packedCols","i32").declareVariables(w,$)} 2724 ${z.mainStart(b)} 2725 let gindex = i32(global_idx); 2726 let lindex = i32(local_idx); 2727 const wg = ${b}; 2728 let row = gindex / wg; 2729 let cols = uniforms.packedCols; 2730 let row_stride : i32 = uniforms.packedCols; 2731 2732 // find the rows max 2733 ${S} 2734 for (var col = lindex; col < cols; col += wg) { 2735 let value = getValue(row, col, row_stride); 2736 threadMax = max(threadMax, value); 2737 } 2738 if (lindex < cols) { 2739 threadShared[lindex] = threadMax; 2740 } 2741 workgroupBarrier(); 2742 2743 var reduceSize = min(cols, wg); 2744 for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) { 2745 reduceSize = currSize + (reduceSize & 1); 2746 if (lindex < currSize) { 2747 threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]); 2748 } 2749 workgroupBarrier(); 2750 } 2751 if (lindex == 0) { 2752 rowMaxShared = ${k}(${x("threadShared[0]",g)}); 2753 } 2754 workgroupBarrier(); 2755 2756 // find the rows sum 2757 var threadSum = ${k}(0.0); 2758 for (var col = lindex; col < cols; col += wg) { 2759 let subExp = exp(getValue(row, col, row_stride) - rowMaxShared); 2760 threadSum += subExp; 2761 } 2762 threadShared[lindex] = threadSum; 2763 workgroupBarrier(); 2764 2765 for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) { 2766 if (lindex < currSize) { 2767 threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize]; 2768 } 2769 workgroupBarrier(); 2770 } 2771 if (lindex == 0) { 2772 rowSumShared = ${k}(${ht("threadShared[0]",g)}); 2773 } 2774 workgroupBarrier(); 2775 2776 // calculate final value for each element in the row 2777 for (var col = lindex; col < cols; col += wg) { 2778 let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; 2779 setValue(row, col, row_stride, value); 2780 } 2781 }`,E=e.compute({name:"Softmax",shaderCache:{hint:`${g};${b}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:c,dataType:d.dataType}],dispatchGroup:{x:m},programUniforms:[{type:6,data:_}]}),getShaderSource:T},{inputs:[d],outputs:[u?-1:0]})[0];u&&e.compute(De(E,l),{inputs:[E]})},df=(e,t)=>{Rl(e.inputs),Dl(e,t)},pf=e=>ce({axis:e.axis})}),ia,Nl,Ml,Pl,cf,dg=U(()=>{J(),re(),ie(),ia=e=>Array.from(e.getBigInt64Array(),Number),Nl=e=>{if(!e||e.length!==2)throw new Error("Tile requires 2 inputs.");if(e[0].dataType!==1&&e[0].dataType!==10&&e[0].dataType!==6&&e[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(e[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(e[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(ia(e[1]).length!==e[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},Ml=(e,t)=>{let r=[];for(let a=0;a<e.length;++a)r.push(e[a]*t[a]);return r},Pl=(e,t)=>{let r=e[0].dims,a=t??ia(e[1]),n=Ml(r,a),i=C.size(n),s=e[0].dataType,u=R("input",s,r.length),d=G("output",s,n.length),l=c=>` 2782 const inputShape = ${u.indices(...r)}; 2783 ${c.registerUniform("output_size","u32").declareVariables(u,d)} 2784 ${c.mainStart()} 2785 ${c.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} 2786 let output_indices = ${d.offsetToIndices("global_idx")}; 2787 var input_indices: ${u.type.indices}; 2788 for (var i = 0; i < ${r.length}; i++) { 2789 let input_dim_i = ${u.indicesGet("uniforms.input_shape","i")}; 2790 let input_dim_value = ${d.indicesGet("output_indices","i")} % input_dim_i; 2791 2792 ${u.indicesSet("input_indices","i","input_dim_value")} 2793 } 2794 ${d.setByOffset("global_idx",u.getByIndices("input_indices"))} 2795 }`;return{name:"Tile",shaderCache:{hint:`${a}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:[{type:12,data:i},...Z(e[0].dims,n)]}),getShaderSource:l}},cf=e=>{Nl(e.inputs),e.compute(Pl(e.inputs),{inputs:[0]})}}),Ul,ql,ff,pg=U(()=>{J(),re(),ie(),Ul=(e,t,r,a,n)=>{let i=G("output_data",n,r.length,4),s=R("a_data",t[1].dataType,t[1].dims.length,4),u=R("b_data",t[2].dataType,t[2].dims.length,4),d=R("c_data",t[0].dataType,t[0].dims.length,4),l,c=(f,m,g)=>`select(${m}, ${f}, ${g})`;if(!a)l=i.setByOffset("global_idx",c(s.getByOffset("global_idx"),u.getByOffset("global_idx"),d.getByOffset("global_idx")));else{let f=(m,g,_="")=>{let b=`a_data[index_a${g}][component_a${g}]`,x=`b_data[index_b${g}][component_b${g}]`,w=`bool(c_data[index_c${g}] & (0xffu << (component_c${g} * 8)))`;return` 2796 let output_indices${g} = ${i.offsetToIndices(`global_idx * 4u + ${g}u`)}; 2797 let offset_a${g} = ${s.broadcastedIndicesToOffset(`output_indices${g}`,i)}; 2798 let offset_b${g} = ${u.broadcastedIndicesToOffset(`output_indices${g}`,i)}; 2799 let offset_c${g} = ${d.broadcastedIndicesToOffset(`output_indices${g}`,i)}; 2800 let index_a${g} = offset_a${g} / 4u; 2801 let index_b${g} = offset_b${g} / 4u; 2802 let index_c${g} = offset_c${g} / 4u; 2803 let component_a${g} = offset_a${g} % 4u; 2804 let component_b${g} = offset_b${g} % 4u; 2805 let component_c${g} = offset_c${g} % 4u; 2806 ${m}[${g}] = ${_}(${c(b,x,w)}); 2807 `};n===9?l=` 2808 var data = vec4<u32>(0); 2809 ${f("data",0,"u32")} 2810 ${f("data",1,"u32")} 2811 ${f("data",2,"u32")} 2812 ${f("data",3,"u32")} 2813 output_data[global_idx] = dot(vec4<u32>(0x1, 0x100, 0x10000, 0x1000000), vec4<u32>(data));`:l=` 2814 ${f("output_data[global_idx]",0)} 2815 ${f("output_data[global_idx]",1)} 2816 ${f("output_data[global_idx]",2)} 2817 ${f("output_data[global_idx]",3)} 2818 `}return` 2819 ${e.registerUniform("vec_size","u32").declareVariables(d,s,u,i)} 2820 ${e.mainStart()} 2821 ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} 2822 ${l} 2823 }`},ql=e=>{let t=e[1].dims,r=e[2].dims,a=e[0].dims,n=e[1].dataType,i=!(C.areEqual(t,r)&&C.areEqual(r,a)),s=t,u=C.size(t);if(i){let l=Nt.calcShape(Nt.calcShape(t,r,!1),a,!1);if(!l)throw new Error("Can't perform where op on the given tensors");s=l,u=C.size(s)}let d=Math.ceil(u/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:l=>Ul(l,e,s,i,n),getRunData:()=>({outputs:[{dims:s,dataType:n}],dispatchGroup:{x:Math.ceil(u/64/4)},programUniforms:[{type:12,data:d},...Z(a,t,r,s)]})}},ff=e=>{e.compute(ql(e.inputs))}}),hf,cg=U(()=>{Tm(),qa(),Im(),Em(),zm(),Cm(),Am(),Nm(),Pm(),Um(),qm(),Wm(),Lm(),Vm(),jm(),Hm(),Gm(),Fm(),Km(),Zm(),Qm(),Xm(),Ym(),Jm(),eg(),Oc(),tg(),rg(),ig(),ag(),ng(),Ua(),sg(),Mc(),og(),ug(),lg(),Dc(),dg(),mt(),Wa(),pg(),hf=new Map([["Abs",[sp]],["Acos",[op]],["Acosh",[up]],["Add",[Lp]],["ArgMax",[rp,ha]],["ArgMin",[tp,ha]],["Asin",[lp]],["Asinh",[dp]],["Atan",[pp]],["Atanh",[cp]],["Attention",[ip]],["AveragePool",[Gc,Hc]],["BatchNormalization",[ap]],["BiasAdd",[np]],["BiasSplitGelu",[Wp]],["Cast",[hp,fp]],["Ceil",[gp]],["Clip",[mp]],["Concat",[Yp,Jp]],["Conv",[$a,ba
2823]],["ConvTranspose",[lc,uc]],["Cos",[_p]],["Cosh",[yp]],["CumSum",[dc,pc]],["DepthToSpace",[cc,fc]],["DequantizeLinear",[Jc,ef]],["Div",[Vp]],["Einsum",[hc,mc]],["Elu",[bp,rr]],["Equal",[jp]],["Erf",[$p]],["Exp",[wp]],["Expand",[gc]],["FastGelu",[_c]],["Floor",[vp]],["FusedConv",[$a,ba]],["Gather",[bc,yc]],["GatherElements",[kc,Sc]],["GatherBlockQuantized",[vc,xc]],["GatherND",[$c,wc]],["Gelu",[xp]],["Gemm",[Ic,Tc]],["GlobalAveragePool",[Kc,Fc]],["GlobalMaxPool",[Yc,Xc]],["Greater",[Kp]],["GreaterOrEqual",[Qp]],["GridSample",[Ec,zc]],["GroupQueryAttention",[Pc]],["HardSigmoid",[Ap,Cp]],["InstanceNormalization",[Uc]],["LayerNormalization",[qc]],["LeakyRelu",[Sp,rr]],["Less",[Zp]],["LessOrEqual",[Xp]],["Log",[Up]],["MatMul",[Wc]],["MatMulNBits",[Lc,Vc]],["MaxPool",[Zc,Qc]],["Mul",[Hp]],["MultiHeadAttention",[Ac,Cc]],["Neg",[Tp]],["Not",[kp]],["Pad",[jc]],["Pow",[Gp]],["QuickGelu",[qp,rr]],["Range",[tf]],["Reciprocal",[Ip]],["ReduceMin",[Qd]],["ReduceMean",[Hd]],["ReduceMax",[Zd]],["ReduceSum",[Yd]],["ReduceProd",[Xd]],["ReduceL1",[Gd]],["ReduceL2",[Fd]],["ReduceLogSum",[ep]],["ReduceLogSumExp",[Kd]],["ReduceSumSquare",[Jd]],["Relu",[Ep]],["Resize",[nf,sf]],["RotaryEmbedding",[Nc]],["ScatterND",[af,rf]],["Sigmoid",[zp]],["Sin",[Op]],["Sinh",[Bp]],["Slice",[uf,lf]],["SkipLayerNormalization",[of]],["Split",[Bc,Rc]],["Sqrt",[Rp]],["Softmax",[df,pf]],["Sub",[Fp]],["Tan",[Dp]],["Tanh",[Np]],["ThresholdedRelu",[Pp,rr]],["Tile",[cf]],["Transpose",[Bd,Rd]],["Where",[ff]]])}),mf,fg=U(()=>{Ke(),at(),ie(),mf=class{constructor(e){this.backend=e,this.repo=new Map,this.attributesBound=!1}getArtifact(e){return this.repo.get(e)}setArtifact(e,t){this.repo.set(e,t)}run(e,t,r,a,n){Fe(e.programInfo.name);let i=this.backend.device,s=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let u=[];for(let l of t)u.push({binding:u.length,resource:{buffer:l.buffer}});for(let l of r)u.push({binding:u.length,resource:{buffer:l.buffer}});n&&u.push({binding:u.length,resource:n});let d=i.createBindGroup({layout:e.computePipeline.getBindGroupLayout(0),entries:u,label:e.programInfo.name});if(this.backend.sessionStatus==="capturing"){let l={kernelId:this.backend.currentKernelId,computePipeline:e.computePipeline,bindGroup:d,dispatchGroup:a};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(l)}s.setPipeline(e.computePipeline),s.setBindGroup(0,d),s.dispatchWorkgroups(...a),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),Ue(e.programInfo.name)}dispose(){}build(e,t){Fe(e.name);let r=this.backend.device,a=[];[{feature:"shader-f16",extension:"f16"},{feature:"subgroups",extension:"subgroups"}].forEach(l=>{r.features.has(l.feature)&&a.push(`enable ${l.extension};`)});let n=Od(t,this.backend.device.limits),i=e.getShaderSource(n),s=`${a.join(` 2824`)} 2825${n.additionalImplementations} 2826${i}`,u=r.createShaderModule({code:s,label:e.name});ue("verbose",()=>`[WebGPU] ${e.name} shader code: ${s}`);let d=r.createComputePipeline({compute:{module:u,entryPoint:"main"},layout:"auto",label:e.name});return Ue(e.name),{programInfo:e,computePipeline:d,uniformVariablesInfo:n.variablesInfo}}normalizeDispatchGroupSize(e){let t=typeof e=="number"?e:e.x,r=typeof e=="number"?1:e.y||1,a=typeof e=="number"?1:e.z||1,n=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(t<=n&&r<=n&&a<=n)return[t,r,a];let i=t*r*a,s=Math.ceil(Math.sqrt(i));if(s>n){if(s=Math.ceil(Math.cbrt(i)),s>n)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[s,s,s]}else return[s,s,1]}}}),gf={};Pt(gf,{WebGpuBackend:()=>_f});var Wl,Ll,Vl,_f,hg=U(()=>{Ke(),J(),at(),Id(),Sm(),cg(),fg(),Wl=(e,t)=>{if(t.length!==e.length)throw new Error(`inputDependencies length ${t.length} is not equal to inputTensors length ${e.length}.`);let r=[];for(let a=0;a<e.length;++a){let n=e[a].dataType;switch(t[a]){case"none":{r.push("");break}case"type":{r.push(`${n}`);break}case"rank":{let i=e[a].dims.length;r.push(`${n};${i}`);break}case"dims":{let i=e[a].dims.join(",");r.push(`${n};${i}`);break}default:throw new Error(`unsupported input dependency: ${t[a]}`)}}return r.join("|")},Ll=(e,t,r)=>{var n,i;let a=e.name;return(n=e.shaderCache)!=null&&n.hint&&(a+="["+e.shaderCache.hint+"]"),a+=":"+r+`:${Wl(t,((i=e.shaderCache)==null?void 0:i.inputDependencies)??new Array(t.length).fill("dims"))}`,a},Vl=class{constructor(e){e&&(this.architecture=e.architecture,this.vendor=e.vend
vendor: 1,773 bytes, line 2826
2826or)}isArchitecture(e){return this.architecture===e}isVendor(e){return this.vendor===e}},_f=class{constructor(){this.currentSessionId=null,this.currentKernelId=null,this.commandEncoder=null,this.computePassEncoder=null,this.maxDispatchNumber=16,this.pendingDispatchNumber=0,this.pendingKernels=[],this.pendingQueries=new Map,this.sessionStatus="default",this.capturedCommandList=new Map,this.capturedPendingKernels=new Map,this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let e=this.kernelCustomData.get(this.currentKernelId);return e||(e={},this.kernelCustomData.set(this.currentKernelId,e)),e}async initialize(e,t){this.env=e;let r=[],a={requiredLimits:{maxComputeWorkgroupStorageSize:t.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:t.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:t.limits.maxStorageBufferBindingSize,maxBufferSize:t.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:t.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:t.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:t.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:t.limits.maxComputeWorkgroupSizeZ},requiredFeatures:r},n=i=>t.features.has(i)&&r.push(i)&&!0;n("chromium-experimental-timestamp-query-inside-passes")||n("timestamp-query"),n("shader-f16"),n("subgroups"),this.device=await t.requestDevice(a),this.adapterInfo=new Vl(t.info||await t.requestAdapterInfo()),this.gpuDataManager=Cd(this),this.programManager=new mf(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,Da(e.logLevel,!!e.debug),this.device.onuncapturederror=i=>
2826{i.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${i.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:t,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let e=this.getCommandEncoder(),t={};this.queryType==="at-passes"&&(t.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=e.beginComputePass(t)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;Fe(),this.endComputePass();let e;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),e=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(e,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,e,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&e.mapAsync(GPUMapMode.READ).then(()=>{var a;let t=new BigUint64Array(e.getMappedRange()),r=this.pendingQueries.get(e);for(let n=0;n<t.length/2;n++){let i=r[n],s=i.kernelId,u=this.kernels.get(s),d=u.kernelType,l=u.kernelName,c=i.programName,f=i.inputTensorViews,m=i.outputTensorViews,g=t[n*2],_=t[n*2+1];typeof this.queryTimeBase>"u"&&(this.queryTimeBase=g);let b=Number(g-this.queryTimeBase),x=Number(_-this.queryTimeBase);if(!Number.isSafeInteger(b)||!Number.isSafeInteger(x))throw new RangeError("incorrect timestamp range");if((a=this.env.webgpu.profiling)!=null&&a.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:f.map(w=>({dims:w.dims,dataType:it(w.dataType)})),outputsMetadata:m.map(w=>({dims:w.dims,dataType:it(w.dataType)})),kernelId:s,kernelType:d,kernelName:l,programName:c,startTime:b,endTime:x});else{let w="";f.forEach((k,S)=>{w+=`input[${S}]: [${k.dims}
2826] | ${it(k.dataType)}, `});let $="";m.forEach((k,S)=>{$+=`output[${S}]: [${k.dims}] | ${it(k.dataType)}, `}),`${s}${d}${l}${c}${w}${$}`,x-b}sr("GPU",`${c}::${g}::${_}`)}e.unmap(),this.pendingQueries.delete(e)}),Ue()}run(e,t,r,a,n,i){Fe(e.name);let s=[];for(let $=0;$<t.length;++$){let k=t[$].data;if(k===0)continue;let S=this.gpuDataManager.get(k);if(!S)throw new Error(`no GPU data for input: ${k}`);s.push(S)}let{outputs:u,dispatchGroup:d,programUniforms:l}=e.getRunData(t),c=r.length===0?u.map(($,k)=>k):r;if(c.length!==u.length)throw new Error(`Output size ${c.length} must be equal to ${u.length}.`);let f=[],m=[];for(let $=0;$<u.length;++$){if(!Number.isInteger(c[$])||c[$]<-3||c[$]>=i)throw new Error(`Invalid output index: ${c[$]}`);if(c[$]===-3)continue;let k=c[$]===-1,S=c[$]===-2,T=k||S?n(u[$].dataType,u[$].dims):a(c[$],u[$].dataType,u[$].dims);if(f.push(T),T.data===0)continue;let E=this.gpuDataManager.get(T.data);if(!E)throw new Error(`no GPU data for output: ${T.data}`);if(k&&this.temporaryData.push(E),S){let z=this.kernelPersistentData.get(this.currentKernelId);z||(z=[],this.kernelPersistentData.set(this.currentKernelId,z)),z.push(E)}m.push(E)}if(s.length!==t.length||m.length!==f.length){if(m.length===0)return Ue(e.name),f;throw new Error(`Program ${e.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let g;if(l){let $=0,k=[];l.forEach(z=>{let A=typeof z.data=="number"?[z.data]:z.data;if(A.length===0)return;let O=z.type===10?2:4,q,X;z.type===10?(X=A.length>4?16:A.length>2?8:A.length*O,q=A.length>4?16:O*A.length):(X=A.length<=2?A.length*O:16,q=16),$=Math.ceil($/X)*X,k.push($);let H=z.type===10?8:4;$+=A.length>4?Math.ceil(A.length/H)*q:A.length*O});let S=16;$=Math.ceil($/S)*S;let T=new ArrayBuffer($);l.forEach((z,A)=>{let O=k[A],q=typeof z.data=="number"?[z.data]:z.data;if(z.type===6)new Int32Array(T,O,q.length).set(q);else if(z.type===12)new Uint32Array(T,O,q.length).set(q);else if(z.type===10)new Uint16Array(T,O,q.length).set(q);else if(z.type===1)new Float32Array(T,O,q.length).set(q);else throw new Error(`Unsupported uniform type: ${it(z.type)}`)});let E=this.gpuDataManager.create($,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(E.buffer,0,T,0,$),this.gpuDataManager.release(E.id),g={offset:0,size:$,buffer:E.buffer}}let _=this.programManager.normalizeDispatchGroupSize(d),b=_[1]===1&&_[2]===1,x=Ll(e,t,b),w=this.programManager.getArtifact(x);if(w||(w=this.programManager.build(e,_),this.programManager.setArtifact(x,w),ue("info",()=>`[artifact] key: ${x}, programName: ${e.name}`)),l&&w.uniformVariablesInfo){if(l.length!==w.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${w.uniformVariablesInfo.length}, got ${l.length} in program "${w.programInfo.name}".`);for(let $=0;$<l.length;$++){let k=l[$],S=k.type,T=typeof k.data=="number"?1:k.data.length,[E,z]=w.uniformVariablesInfo[$];if(S!==E||T!==z)throw new Error(`Uniform variable ${$} mismatch: expect type ${E} with size ${z}, got type ${S} with size ${T} in program "${w.programInfo.name}".`)}}if(ue("info",()=>`[ProgramManager] run "${e.name}" (key=${x}) with ${_[0]}x${_[1]}x${_[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let $={kernelId:this.currentKernelId,programName:w.programInfo.name,inputTensorViews:t,outputTensorViews:f};this.pendingKernels.push($),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push($)}return this.programManager.run(w,s,m,_,g),Ue(e.name),f}upload(e,t){this.gpuDataManager.upload(e,t)}memcpy(e,t){this.gpuDataManager.memcpy(e,t)}async download(e,t){await this.gpuDataManager.download(e,t)}alloc(e){return this.gpuDataManager.create(e).id}free(e){return this.gpuDataManager.release(e)}createKernel(e,t,r,a){let n=hf.get(e);if(!n)throw new Error(`kernel not implemented: ${e}`);let i={kernelType:e,kernelName:a,kernelEntry:n[0],attributes:[n[1],r]};this.kernels.set(t,i)}releaseKernel(e){let t=this.kernelPersistentData.get(e);if(t){for(let r of t)this.gpuDataManager.release(r.id);this.kernelPersistentData.delete(e)}this.kernelCustomData.delete(e),this.kernels.delete(e)}computeKernel(e,t,r){let a=this.kernels.get(e);if(!a)throw new Error(`kernel not created: ${e}`);let n=a.kernelType,i=a.kernelName,s=a.kernelEntry,u=a.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${n}] ${i}" is not allowed to be called recursively`);this.currentKernelId=e,u[0]&&(u[1]=u[0](u[1]),u[0]=void 0),ue("info",()=>`[WebGPU] Start to run kernel "[${n}] ${i}"...`);let d=this.env.debug;this.temporaryData=[];try{return d&&this.device.pushErrorScope("validation"),s(t,u[1]),0}
2826catch(l){return r.push(Promise.resolve(`[WebGPU] Kernel "[${n}] ${i}" failed. ${l}`)),1}finally{d&&r.push(this.device.popErrorScope().then(l=>l?`GPU validation error for kernel "[${n}] ${i}": ${l.message}`:null));for(let l of this.temporaryData)this.gpuDataManager.release(l.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(e,t,r,a){let n=this.sessionExternalDataMapping.get(e);n||(n=new Map,this.sessionExternalDataMapping.set(e,n));let i=n.get(t),s=this.gpuDataManager.registerExternalBuffer(r,a,i);return n.set(t,[s,r]),s}unregisterBuffers(e){let t=this.sessionExternalDataMapping.get(e);t&&(t.forEach(r=>this.gpuDataManager.unregisterExternalBuffer(r[0])),this.sessionExternalDataMapping.delete(e))}getBuffer(e){let t=this.gpuDataManager.get(e);if(!t)throw new Error(`no GPU data for buffer: ${e}`);return t.buffer}createDownloader(e,t,r){return async()=>{let a=await pa(this,e,t);return Na(a.buffer,r)}}writeTimestamp(e){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,e)}setQueryType(){var e;this.queryType="none",(((e=this.env.webgpu.profiling)==null?void 0:e.mode)==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){ue("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){ue("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){ue("info","replay"),this.sessionStatus="replaying";let e=this.capturedCommandList.get(this.currentSessionId),t=this.capturedPendingKernels.get(this.currentSessionId),r=e.length;this.pendingKernels=[];for(let a=0;a<r;a++){let n=this.getComputePassEncoder(),i=e[a];this.writeTimestamp(this.pendingDispatchNumber*2),n.setPipeline(i.computePipeline),n.setBindGroup(0,i.bindGroup),n.dispatchWorkgroups(...i.dispatchGroup),this.writeTimestamp(this.pendingDispatchNumber*2+1),this.pendingDispatchNumber++,this.queryType!=="none"&&this.pendingKernels.push(t[a]),(this.pendingDispatchNumber>=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onCreateSession(){this.gpuDataManager.onCreateSession()}onReleaseSession(e){this.unregisterBuffers(e),this.capturedCommandList.has(e)&&this.capturedCommandList.delete(e),this.capturedPendingKernels.has(e)&&this.capturedPendingKernels.delete(e),this.gpuDataManager.onReleaseSession(e)}onRunStart(e){this.currentSessionId=e,this.setQueryType()}}}),yf={};Pt(yf,{init:()=>bf});var Cr,jl,bf,mg=U(()=>{J(),at(),re(),xm(),Cr=class $f{constructor(t,r,a,n){this.module=t,this.dataType=r,this.data=a,this.dims=n}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let t=C.size(this.dims);return t===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,t)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let t=C.size(this.dims);return t===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,t)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let t=C.size(this.dims);return t===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,t)}getUint16Array(){if(this.dataType!==10&&this.dataType!==4)throw new Error("Invalid data type");let t=C.size(this.dims);return t===0?new Uint16Array:new Uint16Array(this.module.HEAP8.buffer,this.data,t)}reshape(t){if(C.size(t)!==C.size(this.dims))throw new Error("Invalid new shape");return new $f(this.module,this.dataType,this.data,t)}},jl=class{constructor(e,t,r){this.module=e,this.backend=t,this.customDataOffset=0,this.customDataSize=0,this.adapterInfo=t.adapterInfo;let a=e.PTR_SIZE,n=r/e.PTR_SIZE,i=a===4?"i32":"i64";this.opKernelContext=Number(e.getValue(a*n++,i));let s=Number(e.getValue(a*n++,i));this.outputCount=Number(e.getValue(a*n++,i)),this.customDataOffset=Number(e.getValue(a*n++,"*")),this.customDataSize=Number(e.getValue(a*n++,i));let u=[];for(let d=0;d<s;d++){let l=Number(e.getValue(a*n++,i)),c=Number(e.getValue(a*n++,"*")),f=Number(e.getValue(a*n++,i)),m=[];for(let g=0;g<f;g++)m.push(Number(e.getValue(a*n++,i)));u.push(new Cr(e,l,c,m))}this.inputs=u}get kernelCustomData(){return this.backend.currentKernelCustomData}get customDataBuffer(){return this.module.HEAPU8.subarray(this.customDataOffset,this.customDataOffset+this.customDataSize)}compute(e,t){var s;let r=((s=t==null?void 0:t.inputs)==null?void 0:s.map(u=>typeof u=="number"?this.inputs[u]:u))??this.inputs,a=(t==null?void 0:t.outputs)??[],n=(u,d,l)=>new Cr(this.module,d,this.output(u,l),l),i=(u,d)=>{let l=St(u,d);if(!l)throw new Error(`Unsupported data type: ${u}`);let c=l>0?this.backend.gpuDataManager.create(l).id:0;return new Cr(this.module,u,c,d)};return this.backend.run(e,r,a,n,i,this.outputCount)}output(e,t){let r=this.module.stackSave();try{let a=this.module.PTR_SIZE,n=a===4?"i32":"i64",i=this.module.stackAlloc((1+t.length)*a);this.module.setValue(i,t.length,n);for(let s=0;s<t.length;s++)this.module.setValue(i+a*(s+1),t[s],n);
2826return this.module._JsepOutput(this.opKernelContext,e,i)}catch(a){throw new Error(`Failed to generate kernel's output[${e}] with dims [${t}]. If you are running with pre-allocated output, please make sure the output type/dims are correct. Error: ${a}`)}finally{this.module.stackRestore(r)}}},bf=async(e,t,r,a)=>{let n=t.jsepInit;if(!n)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(e==="webgpu"){let i=(hg(),nr(gf)).WebGpuBackend,s=new i;await s.initialize(r,a),n("webgpu",[s,u=>s.alloc(Number(u)),u=>s.free(u),(u,d,l,c=!1)=>{if(c)ue("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${Number(u)}, dst=${Number(d)}, size=${Number(l)}`),s.memcpy(Number(u),Number(d));else{ue("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${Number(u)}, gpuDataId=${Number(d)}, size=${Number(l)}`);let f=t.HEAPU8.subarray(Number(u>>>0),Number(u>>>0)+Number(l));s.upload(Number(d),f)}},async(u,d,l)=>{ue("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${u}, dataOffset=${d}, size=${l}`),await s.download(Number(u),()=>t.HEAPU8.subarray(Number(d)>>>0,Number(d+l)>>>0))},(u,d,l)=>s.createKernel(u,Number(d),l,t.UTF8ToString(t._JsepGetNodeName(Number(d)))),u=>s.releaseKernel(u),(u,d,l,c)=>{ue("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${l}, kernel=${u}, contextDataOffset=${d}`);let f=new jl(t,s,Number(d));return s.computeKernel(Number(u),f,c)},()=>s.captureBegin(),()=>s.captureEnd(),()=>s.replay()])}else{let i=new zd(r);n("webnn",[i,()=>i.reserveTensorId(),s=>i.releaseTensorId(s),async(s,u,d,l,c)=>i.ensureTensor(s,u,d,l,c),(s,u)=>{i.uploadTensor(s,u)},async(s,u)=>i.downloadTensor(s,u)])}}}),Hl,Fa,Ka,ct,Gl,aa,Wr,Za,Qa,na,Xa,Ya,Ja,wf=U(()=>{$m(),wm(),J(),zt(),Ca(),xd(),Hl=(e,t)=>{_e()._OrtInit(e,t)!==0&&he("Can't initialize onnxruntime.")},Fa=async e=>{Hl(e.wasm.numThreads,Nr(e.logLevel))},Ka=async(e,t)=>{var r,a;(a=(r=_e()).asyncInit)==null||a.call(r);{let n=(mg(),nr(yf)).init;if(t==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");let i=e.webgpu.adapter;if(i){if(typeof i.limits!="object"||typeof i.features!="object"||typeof i.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let s=e.webgpu.powerPreference;if(s!==void 0&&s!=="low-power"&&s!=="high-performance")throw new Error(`Invalid powerPreference setting: "${s}"`);let u=e.webgpu.forceFallbackAdapter;if(u!==void 0&&typeof u!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${u}"`);if(i=await navigator.gpu.requestAdapter({powerPreference:s,forceFallbackAdapter:u}),!i)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await n("webgpu",_e(),e,i)}if(t==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw new Error("WebNN is not supported in current environment");await n("webnn",_e(),e)}}},ct=new Map,Gl=e=>{let t=_e(),r=t.stackSave();try{let a=t.PTR_SIZE,n=t.stackAlloc(2*a);t._OrtGetInputOutputCount(e,n,n+a)!==0&&he("Can't get session input/output count.");let i=a===4?"i32":"i64";return[Number(t.getValue(n,i)),Number(t.getValue(n+a,i))]}finally{t.stackRestore(r)}},aa=(e,t)=>{let r=_e(),a=r.stackSave(),n=0;try{let i=r.PTR_SIZE,s=r.stackAlloc(2*i);r._OrtGetInputOutputMetadata(e,t,s,s+i)!==0&&he("Can't get session input/output metadata.");let u=Number(r.getValue(s,"*"));n=Number(r.getValue(s+i,"*"));let d=r.HEAP32[n/4];if(d===0)return[u,0];let l=r.HEAPU32[n/4+1],c=[];for(let f=0;f<l;f++){let m=Number(r.getValue(n+8+f*i,"*"));c.push(m!==0?r.UTF8ToString(m):Number(r.getValue(n+8+(f+l)*i,"*")))}return[u,d,c]}finally{r.stackRestore(a),n!==0&&r._OrtFree(n)}},Wr=e=>{let t=_e(),r=t._malloc(e.byteLength);if(r===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,r),[r,e.byteLength]},Za=async(e,t)=>{var f,m,g,_;let r,a,n=_e();Array.isArray(e)?[r,a]=e:e.buffer===n.HEAPU8.buffer?[r,a]=[e.byteOffset,e.byteLength]:[r,a]=Wr(e);let i=0,s=0,u=0,d=[],l=[],c=[];
2826try{if([s,d]=await vd(t),(t==null?void 0:t.externalData)&&n.mountExternalData){let A=[];for(let O of t.externalData){let q=typeof O=="string"?O:O.path;A.push(Ra(typeof O=="string"?O:O.data).then(X=>{n.mountExternalData(q,X)}))}await Promise.all(A)}for(let A of(t==null?void 0:t.executionProviders)??[])if((typeof A=="string"?A:A.name)==="webnn"){if(n.shouldTransferToMLTensor=!1,typeof A!="string"){let O=A,q=O==null?void 0:O.context,X=O==null?void 0:O.gpuDevice,H=O==null?void 0:O.deviceType,Q=O==null?void 0:O.powerPreference;q?n.currentContext=q:X?n.currentContext=await n.webnnCreateMLContext(X):n.currentContext=await n.webnnCreateMLContext({deviceType:H,powerPreference:Q})}else n.currentContext=await n.webnnCreateMLContext();break}i=await n._OrtCreateSession(r,a,s),(f=n.webgpuOnCreateSession)==null||f.call(n,i),i===0&&he("Can't create a session."),(m=n.jsepOnCreateSession)==null||m.call(n),n.currentContext&&(n.webnnRegisterMLContext(i,n.currentContext),n.currentContext=void 0,n.shouldTransferToMLTensor=!0);let[b,x]=Gl(i),w=!!(t!=null&&t.enableGraphCapture),$=[],k=[],S=[],T=[],E=[];for(let A=0;A<b;A++){let[O,q,X]=aa(i,A);O===0&&he("Can't get an input name."),l.push(O);let H=n.UTF8ToString(O);$.push(H),S.push(q===0?{name:H,isTensor:!1}:{name:H,isTensor:!0,type:it(q),shape:X})}for(let A=0;A<x;A++){let[O,q,X]=aa(i,A+b);O===0&&he("Can't get an output name."),c.push(O);let H=n.UTF8ToString(O);k.push(H),T.push(q===0?{name:H,isTensor:!1}:{name:H,isTensor:!0,type:it(q),shape:X});{if(w&&(t==null?void 0:t.preferredOutputLocation)===void 0){E.push("gpu-buffer");continue}let Q=typeof(t==null?void 0:t.preferredOutputLocation)=="string"?t.preferredOutputLocation:((g=t==null?void 0:t.preferredOutputLocation)==null?void 0:g[H])??"cpu";if(Q!=="cpu"&&Q!=="cpu-pinned"&&Q!=="gpu-buffer"&&Q!=="ml-tensor")throw new Error(`Not supported preferred output location: ${Q}.`);if(w&&Q!=="gpu-buffer")throw new Error(`Not supported preferred output location: ${Q}. Only 'gpu-buffer' location is supported when enableGraphCapture is true.`);E.push(Q)}}let z=null;return E.some(A=>A==="gpu-buffer"||A==="ml-tensor")&&(u=n._OrtCreateBinding(i),u===0&&he("Can't create IO binding."),z={handle:u,outputPreferredLocations:E,outputPreferredLocationsEncoded:E.map(A=>la(A))}),ct.set(i,[i,l,c,z,w,!1]),[i,$,k,S,T]}catch(b){throw l.forEach(x=>n._OrtFree(x)),c.forEach(x=>n._OrtFree(x)),u!==0&&n._OrtReleaseBinding(u)!==0&&he("Can't release IO binding."),i!==0&&n._OrtReleaseSession(i)!==0&&he("Can't release session."),b}finally{n._free(r),s!==0&&n._OrtReleaseSessionOptions(s)!==0&&he("Can't release session options."),d.forEach(b=>n._free(b)),(_=n.unmountExternalData)==null||_.call(n)}},Qa=e=>{var d,l,c;let t=_e(),r=ct.get(e);if(!r)throw new Error(`cannot release session. invalid session id: ${e}`);let[a,n,i,s,u]=r;s&&(u&&t._OrtClearBoundOutputs(s.handle)!==0&&he("Can't clear bound outputs."),t._OrtReleaseBinding(s.handle)!==0&&he("Can't release IO binding.")),(d=t.jsepOnReleaseSession)==null||d.call(t,e),(l=t.webnnOnReleaseSession)==null||l.call(t,e),(c=t.webgpuOnReleaseSession)==null||c.call(t,e),n.forEach(f=>t._OrtFree(f)),i.forEach(f=>t._OrtFree(f)),t._OrtReleaseSession(a)!==0&&he("Can't release session."),ct.delete(e)},na=async(e,t,r,a,n,i,s=!1)=>{if(!e){t.push(0);return}let u=_e(),d=u.PTR_SIZE,l=e[0],c=e[1],f=e[3],m=f,g,_;if(l==="string"&&(f==="gpu-buffer"||f==="ml-tensor"))throw new Error("String tensor is not supported on GPU.");if(s&&f!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${i} when enableGraphCapture is true.`);if(f==="gpu-buffer"){let w=e[2].gpuBuffer;_=St(Rt(l),c);{let $=u.jsepRegisterBuffer;if(!$)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');g=$(a,i,w,_)}}else if(f==="ml-tensor"){let w=e[2].mlTensor;_=St(Rt(l),c);let $=u.webnnRegisterMLTensor;if(!$)throw new Error('Tensor location "ml-tensor" is not supported without using WebNN.');g=$(a,w,Rt(l),c)}else{let w=e[2];if(Array.isArray(w)){_=d*w.length,g=u._malloc(_),r.push(g);for(let $=0;$<w.length;$++){if(typeof w[$]!="string")throw new TypeError(`tensor data at index ${$} is not a string`);u.setValue(g+$*d,He(w[$],r),"*")}}else{let $=u.webnnIsGraphInput;if(l!=="string"&&$){let k=u.UTF8ToString(n);if($(a,k)){let S=Rt(l);_=St(S,c),m="ml-tensor";let T=u.webnnCreateTemporaryTensor,E=u.webnnUploadTensor;if(!T||!E)throw new Error('Tensor location "ml-tensor" is not supported without using WebNN.');let z=await T(a,S,c);
vendor: 1,305 bytes, line 2826
2826E(z,new Uint8Array(w.buffer,w.byteOffset,w.byteLength)),g=z}else _=w.byteLength,g=u._malloc(_),r.push(g),u.HEAPU8.set(new Uint8Array(w.buffer,w.byteOffset,_),g)}else _=w.byteLength,g=u._malloc(_),r.push(g),u.HEAPU8.set(new Uint8Array(w.buffer,w.byteOffset,_),g)}}let b=u.stackSave(),x=u.stackAlloc(4*c.length);try{c.forEach(($,k)=>u.setValue(x+k*d,$,d===4?"i32":"i64"));let w=u._OrtCreateTensor(Rt(l),g,_,x,c.length,la(m));w===0&&he(`Can't create tensor for input/output. session=${a}, index=${i}.`),t.push(w)}finally{u.stackRestore(b)}},Xa=async(e,t,r,a,n,i)=>{var X,H,Q,oe;let s=_e(),u=s.PTR_SIZE,d=ct.get(e);if(!d)throw new Error(`cannot run inference. invalid session id: ${e}`);let l=d[0],c=d[1],f=d[2],m=d[3],g=d[4],_=d[5],b=t.length,x=a.length,w=0,$=[],k=[],S=[],T=[],E=s.stackSave(),z=s.stackAlloc(b*u),A=s.stackAlloc(b*u),O=s.stackAlloc(x*u),q=s.stackAlloc(x*u);try{[w,$]=wd(i);for(let W=0;W<b;W++)await na(r[W],k,T,e,c[t[W]],t[W],g);for(let W=0;W<x;W++)await na(n[W],S,T,e,f[a[W]],b+a[W],g);for(let W=0;W<b;W++)s.setValue(z+W*u,k[W],"*"),s.setValue(A+W*u,c[t[W]],"*");for(let W=0;W<x;W++)s.setValue(O+W*u,S[W],"*"),s.setValue(q+W*u,f[a[W]],"*");if(m&&!_){let{handle:W,outputPreferredLocations:le,outputPreferredLocationsEncoded:ee}=m;if(c.length!==b)throw new Error(`input count from feeds (${b}
2826) is expected to be always equal to model's input count (${c.length}).`);for(let ae=0;ae<b;ae++){let D=t[ae];await s._OrtBindInput(W,c[D],k[ae])!==0&&he(`Can't bind input[${ae}] for session=${e}.`)}for(let ae=0;ae<x;ae++){let D=a[ae];(X=n[ae])!=null&&X[3]?s._OrtBindOutput(W,f[D],S[ae],0)!==0&&he(`Can't bind pre-allocated output[${ae}] for session=${e}.`):s._OrtBindOutput(W,f[D],0,ee[D])!==0&&he(`Can't bind output[${ae}] to ${le[ae]} for session=${e}.`)}ct.set(e,[l,c,f,m,g,!0])}(H=s.jsepOnRunStart)==null||H.call(s,l),(Q=s.webnnOnRunStart)==null||Q.call(s,l);let te;m?te=await s._OrtRunWithBinding(l,m.handle,x,O,w):te=await s._OrtRun(l,A,z,b,q,x,O,w),te!==0&&he("failed to call OrtRun().");let V=[];for(let W=0;W<x;W++){let le=Number(s.getValue(O+W*u,"*"));if(le===S[W]){V.push(n[W]);continue}let ee=s.stackSave(),ae=s.stackAlloc(4*u),D=!1,P,j=0;try{s._OrtGetTensorData(le,ae,ae+u,ae+2*u,ae+3*u)!==0&&he(`Can't access output tensor data on index ${W}.`);let se=u===4?"i32":"i64",ke=Number(s.getValue(ae,se));j=s.getValue(ae+u,"*");let N=s.getValue(ae+u*2,"*"),me=Number(s.getValue(ae+u*3,se)),Ne=[];for(let xe=0;xe<me;xe++)Ne.push(Number(s.getValue(N+xe*u,se)));s._OrtFree(N)!==0&&he("Can't free memory for tensor dims.");let Ce=Ne.reduce((xe,fe)=>xe*fe,1);P=it(ke);let gt=m==null?void 0:m.outputPreferredLocations[a[W]];if(P==="string"){if(gt==="gpu-buffer"||gt==="ml-tensor")throw new Error("String tensor is not supported on GPU.");let xe=[];for(let fe=0;fe<Ce;fe++){let Ze=s.getValue(j+fe*u,"*"),Ut=s.getValue(j+(fe+1)*u,"*"),_t=fe===Ce-1?void 0:Ut-Ze;xe.push(s.UTF8ToString(Ze,_t))}V.push([P,Ne,xe,"cpu"])}else if(gt==="gpu-buffer"&&Ce>0){let xe=s.jsepGetBuffer;if(!xe)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let fe=xe(j),Ze=St(ke,Ce);if(Ze===void 0||!Oa(P))throw new Error(`Unsupported data type: ${P}`);D=!0,V.push([P,Ne,{gpuBuffer:fe,download:s.jsepCreateDownloader(fe,Ze,P),dispose:()=>{s._OrtReleaseTensor(le)!==0&&he("Can't release tensor.")}},"gpu-buffer"])}else if(gt==="ml-tensor"&&Ce>0){let xe=s.webnnEnsureTensor,fe=s.webnnIsInt64Supported;if(!xe||!fe)throw new Error('preferredLocation "ml-tensor" is not supported without using WebNN.');if(St(ke,Ce)===void 0||!Ba(P))throw new Error(`Unsupported data type: ${P}`);if(P==="int64"&&!fe(e))throw new Error('preferredLocation "ml-tensor" for int64 output is not supported by current WebNN Context.');let Ze=await xe(e,j,ke,Ne,!1);D=!0,V.push([P,Ne,{mlTensor:Ze,download:s.webnnCreateMLTensorDownloader(j,P),dispose:()=>{s.webnnReleaseTensorId(j),s._OrtReleaseTensor(le)}},"ml-tensor"])}else{let xe=Aa(P),fe=new xe(Ce);new Uint8Array(fe.buffer,fe.byteOffset,fe.byteLength).set(s.HEAPU8.subarray(j,j+fe.byteLength)),V.push([P,Ne,fe,"cpu"])}}finally{s.stackRestore(ee),P==="string"&&j&&s._free(j),D||s._OrtReleaseTensor(le),(oe=s.webnnOnRunEnd)==null||oe.call(s,l)}}return m&&!g&&(s._OrtClearBoundOutputs(m.handle)!==0&&he("Can't clear bound outputs."),ct.set(e,[l,c,f,m,g,!1])),V}finally{s.stackRestore(E),k.forEach(te=>s._OrtReleaseTensor(te)),S.forEach(te=>s._OrtReleaseTensor(te)),T.forEach(te=>s._free(te)),w!==0&&s._OrtReleaseRunOptions(w),$.forEach(te=>s._free(te))}},Ya=e=>{let t=_e(),r=ct.get(e);if(!r)throw new Error("invalid session id");let a=r[0],n=t._OrtEndProfiling(a);n===0&&he("Can't get an profile file name."),t._OrtFree(n)},Ja=e=>{let t=[];for(let r of e){let a=r[2];!Array.isArray(a)&&"buffer"in a&&t.push(a.buffer)}return t}}),ft,Ae,Bt,Yt,Jt,Ar,sa,Or,wt,vt,Fl,vf,xf,Sf,kf,Tf,If,Ef,zf=U(()=>{Ke(),wf(),zt(),Ea(),ft=()=>!!ye.wasm.proxy&&typeof document<"u",Bt=!1,Yt=!1,Jt=!1,Or=new Map,wt=(e,t)=>{let r=Or.get(e);r?r.push(t):Or.set(e,[t])},vt=()=>{if(Bt||!Yt||Jt||!Ae)throw new Error("worker not ready")},Fl=e=>{switch(e.data.type){case"init-wasm":Bt=!1,e.data.err?(Jt=!0,sa[1](e.data.err)):(Yt=!0,sa[0]()),Ar&&(URL.revokeObjectURL(Ar),Ar=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let t=Or.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}}},vf=async()=>{if(!Yt){if(Bt)throw new Error("multiple calls to 'initWasm()' detected.");
vendor: 4,351 bytes, line 2826
2826if(Jt)throw new Error("previous call to 'initWasm()' failed.");if(Bt=!0,ft())return new Promise((e,t)=>{Ae==null||Ae.terminate(),bd().then(([r,a])=>{try{Ae=a,Ae.onerror=i=>t(i),Ae.onmessage=Fl,sa=[e,t];let n={type:"init-wasm",in:ye};!n.in.wasm.wasmPaths&&(r||ua)&&(n.in.wasm.wasmPaths={wasm:new URL("/assets/ort-wasm-simd-threaded.jsepB0T3yYHD.wasm",import.meta.url).href}),Ae.postMessage(n),Ar=r}catch(n){t(n)}},t)});try{await za(ye.wasm),await Fa(ye),Yt=!0}catch(e){throw Jt=!0,e}finally{Bt=!1}}},xf=async e=>{if(ft())return vt(),new Promise((t,r)=>{wt("init-ep",[t,r]);let a={type:"init-ep",in:{epName:e,env:ye}};Ae.postMessage(a)});await Ka(ye,e)},Sf=async e=>ft()?(vt(),new Promise((t,r)=>{wt("copy-from",[t,r]);let a={type:"copy-from",in:{buffer:e}};Ae.postMessage(a,[e.buffer])})):Wr(e),kf=async(e,t)=>{if(ft()){if(t!=null&&t.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return vt(),new Promise((r,a)=>{wt("create",[r,a]);let n={type:"create",in:{model:e,options:{...t}}},i=[];e instanceof Uint8Array&&i.push(e.buffer),Ae.postMessage(n,i)})}else return Za(e,t)},Tf=async e=>{if(ft())return vt(),new Promise((t,r)=>{wt("release",[t,r]);let a={type:"release",in:e};Ae.postMessage(a)});Qa(e)},If=async(e,t,r,a,n,i)=>{if(ft()){if(r.some(s=>s[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(n.some(s=>s))throw new Error("pre-allocated output tensor is not supported for proxy.");return vt(),new Promise((s,u)=>{wt("run",[s,u]);let d=r,l={type:"run",in:{sessionId:e,inputIndices:t,inputs:d,outputIndices:a,options:i}};Ae.postMessage(l,Ja(d))})}else return Xa(e,t,r,a,n,i)},Ef=async e=>{if(ft())return vt(),new Promise((t,r)=>{wt("end-profiling",[t,r]);let a={type:"end-profiling",in:e};Ae.postMessage(a)});Ya(e)}}),oa,Kl,Cf,gg=U(()=>{Ke(),zf(),J(),Ia(),xd(),oa=(e,t)=>{switch(e.location){case"cpu":return[e.type,e.dims,e.data,"cpu"];case"gpu-buffer":return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},"gpu-buffer"];case"ml-tensor":return[e.type,e.dims,{mlTensor:e.mlTensor},"ml-tensor"];default:throw new Error(`invalid data location: ${e.location} for ${t()}`)}},Kl=e=>{switch(e[3]){case"cpu":return new Ge(e[0],e[2],e[1]);case"gpu-buffer":{let t=e[0];if(!Oa(t))throw new Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:r,download:a,dispose:n}=e[2];return Ge.fromGpuBuffer(r,{dataType:t,dims:e[1],download:a,dispose:n})}case"ml-tensor":{let t=e[0];if(!Ba(t))throw new Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:r,download:a,dispose:n}=e[2];return Ge.fromMLTensor(r,{dataType:t,dims:e[1],download:a,dispose:n})}default:throw new Error(`invalid data location: ${e[3]}`)}},Cf=class{async fetchModelAndCopyToWasmMemory(e){return Sf(await Ra(e))}async loadModel(e,t){Fe();let r;typeof e=="string"?r=await this.fetchModelAndCopyToWasmMemory(e):r=e,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await kf(r,t),Ue()}async dispose(){return Tf(this.sessionId)}async run(e,t,r){Fe();let a=[],n=[];Object.entries(e).forEach(f=>{let m=f[0],g=f[1],_=this.inputNames.indexOf(m);if(_===-1)throw new Error(`invalid input '${m}'`);a.push(g),n.push(_)});let i=[],s=[];Object.entries(t).forEach(f=>{let m=f[0],g=f[1],_=this.outputNames.indexOf(m);if(_===-1)throw new Error(`invalid output '${m}'`);i.push(g),s.push(_)});let u=a.map((f,m)=>oa(f,()=>`input "${this.inputNames[n[m]]}"`)),d=i.map((f,m)=>f?oa(f,()=>`output "${this.outputNames[s[m]]}"`):null),l=await If(this.sessionId,n,u,s,d,r),c={};for(let f=0;f<l.length;f++)c[this.outputNames[s[f]]]=i[f]??Kl(l[f]);return Ue(),c}startProfiling(){}endProfiling(){Ef(this.sessionId)}}}),Af={};Pt(Af,{OnnxruntimeWebAssemblyBackend:()=>xa,initializeFlags:()=>va,wasmBackend:()=>Of});var va,xa,Of,_g=U(()=>{Ke(),zf(),gg(),va=()=>{(typeof ye.wasm.initTimeout!="number"||ye.wasm.initTimeout<0)&&(ye.wasm.initTimeout=0);let e=ye.wasm.simd;if(typeof e!="boolean"&&e!==void 0&&e!=="fixed"&&e!=="relaxed"&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${e}". Reset it to \`false\` and ignore SIMD feature checking.`),ye.wasm.simd=!1),typeof ye.wasm.proxy!="boolean"&&(ye.wasm.proxy=!1),typeof ye.wasm.trace!="boolean"&&(ye.wasm.trace=!1),typeof ye.wasm.numThreads!="number"||!Number.isInteger(ye.w
2826asm.numThreads)||ye.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)ye.wasm.numThreads=1;else{let t=typeof navigator>"u"?im("node:os").cpus().length:navigator.hardwareConcurrency;ye.wasm.numThreads=Math.min(4,Math.ceil((t||1)/2))}},xa=class{async init(e){va(),await vf(),await xf(e)}async createInferenceSessionHandler(e,t){let r=new Cf;return await r.loadModel(e,t),r}},Of=new xa});Ke();Ke();Ke();var yg="1.22.0-dev.20250409-89f8206ba4",bg=fd;{let e=(_g(),nr(Af)).wasmBackend;kt("webgpu",e,5),kt("webnn",e,5),kt("cpu",e,10),kt("wasm",e,10)}Object.defineProperty(ye.versions,"web",{value:yg,enumerable:!0});/** 2827* @license 2828* Copyright 2021 Google LLC. All Rights Reserved. 2829* Licensed under the Apache License, Version 2.0 (the "License"); 2830* you may not use this file except in compliance with the License. 2831* You may obtain a copy of the License at 2832* 2833* http://www.apache.org/licenses/LICENSE-2.0 2834* 2835* Unless required by applicable law or agreed to in writing, software 2836* distributed under the License is distributed on an "AS IS" BASIS, 2837* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 2838* See the License for the specific language governing permissions and 2839* limitations under the License. 2840* ============================================================================= 2841*//** 2842 * @license 2843 * Copyright 2020 Google LLC. All Rights Reserved. 2844 * Licensed under the Apache License, Version 2.0 (the "License"); 2845 * you may not use this file except in compliance with the License. 2846 * You may obtain a copy of the License at 2847 * 2848 * http://www.apache.org/licenses/LICENSE-2.0 2849 * 2850 * Unless required by applicable law or agreed to in writing, software 2851 * distributed under the License is distributed on an "AS IS" BASIS, 2852 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 2853 * See the License for the specific language governing permissions and 2854 * limitations under the License. 2855 * ============================================================================= 2856 *//** 2857 * @license 2858 * Copyright 2019 Google LLC. All Rights Reserved. 2859 * Licensed under the Apache License, Version 2.0 (the "License"); 2860 * you may not use this file except in compliance with the License. 2861 * You may obtain a copy of the License at 2862 * 2863 * http://www.apache.org/licenses/LICENSE-2.0 2864 * 2865 * Unless required by applicable law or agreed to in writing, software 2866 * distributed under the License is distributed on an "AS IS" BASIS, 2867 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 2868 * See the License for the specific language governing permissions and 2869 * limitations under the License. 2870 * ============================================================================= 2871 */const wg=Object.freeze(Object.defineProperty({__proto__:null,get InferenceSession(){return Ta},get TRACE(){return sr},get TRACE_FUNC_BEGIN(){return Fe},get TRACE_FUNC_END(){return Ue},get Tensor(){return Ge},default:bg,get env(){return ye},get registerBackend(){return kt}},Symbol.toStringTag,{value:"Module"}));export{wg as _};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.