@datagrok/eda 1.3.4 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/111.js +1 -1
- package/dist/111.js.map +1 -1
- package/dist/128.js +1 -1
- package/dist/128.js.map +1 -1
- package/dist/153.js +1 -1
- package/dist/153.js.map +1 -1
- package/dist/23.js +1 -1
- package/dist/23.js.map +1 -1
- package/dist/234.js +1 -1
- package/dist/234.js.map +1 -1
- package/dist/242.js +1 -1
- package/dist/242.js.map +1 -1
- package/dist/260.js +1 -1
- package/dist/260.js.map +1 -1
- package/dist/33.js +1 -1
- package/dist/33.js.map +1 -1
- package/dist/348.js +1 -1
- package/dist/348.js.map +1 -1
- package/dist/377.js +1 -1
- package/dist/377.js.map +1 -1
- package/dist/412.js +1 -1
- package/dist/412.js.map +1 -1
- package/dist/415.js +1 -1
- package/dist/415.js.map +1 -1
- package/dist/531.js +1 -1
- package/dist/531.js.map +1 -1
- package/dist/583.js +1 -1
- package/dist/583.js.map +1 -1
- package/dist/589.js +1 -1
- package/dist/589.js.map +1 -1
- package/dist/603.js +1 -1
- package/dist/603.js.map +1 -1
- package/dist/656.js +1 -1
- package/dist/656.js.map +1 -1
- package/dist/682.js +1 -1
- package/dist/682.js.map +1 -1
- package/dist/705.js +1 -1
- package/dist/705.js.map +1 -1
- package/dist/727.js +1 -1
- package/dist/727.js.map +1 -1
- package/dist/731.js +1 -1
- package/dist/731.js.map +1 -1
- package/dist/738.js +1 -1
- package/dist/738.js.map +1 -1
- package/dist/763.js +1 -1
- package/dist/763.js.map +1 -1
- package/dist/778.js +1 -1
- package/dist/778.js.map +1 -1
- package/dist/783.js +1 -1
- package/dist/783.js.map +1 -1
- package/dist/793.js +1 -1
- package/dist/793.js.map +1 -1
- package/dist/810.js +2 -0
- package/dist/810.js.map +1 -0
- package/dist/860.js +1 -1
- package/dist/860.js.map +1 -1
- package/dist/907.js +1 -1
- package/dist/907.js.map +1 -1
- package/dist/950.js +1 -1
- package/dist/950.js.map +1 -1
- package/dist/980.js +1 -1
- package/dist/980.js.map +1 -1
- package/dist/990.js +1 -1
- package/dist/990.js.map +1 -1
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/package.json +6 -6
- package/src/package.ts +1 -1
- package/src/pls/pls-constants.ts +7 -7
- package/src/pls/pls-tools.ts +5 -13
- package/test-console-output-1.log +0 -343
- package/test-record-1.mp4 +0 -0
package/dist/738.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/*! For license information please see 738.js.LICENSE.txt */
|
|
2
|
-
(self.webpackChunkeda=self.webpackChunkeda||[]).push([[738],{5540:(e,n,t)=>{"use strict";e=t.hmd(e);var r,i=(r="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,function(e={}){var n,t,i=void 0!==e?e:{};i.ready=new Promise((function(e,r){n=e,t=r}));var a,s=Object.assign({},i),o="object"==typeof window,u="function"==typeof importScripts,l=("object"==typeof process&&"object"==typeof process.versions&&process.versions.node,"");(o||u)&&(u?l=self.location.href:"undefined"!=typeof document&&document.currentScript&&(l=document.currentScript.src),r&&(l=r),l=0!==l.indexOf("blob:")?l.substr(0,l.replace(/[?#].*/,"").lastIndexOf("/")+1):"",u&&(a=e=>{var n=new XMLHttpRequest;return n.open("GET",e,!1),n.responseType="arraybuffer",n.send(null),new Uint8Array(n.response)})),i.print||console.log.bind(console);var c,f,h=i.printErr||console.warn.bind(console);Object.assign(i,s),s=null,i.arguments&&i.arguments,i.thisProgram&&i.thisProgram,i.quit&&i.quit,i.wasmBinary&&(c=i.wasmBinary),i.noExitRuntime,"object"!=typeof WebAssembly&&E("no native wasm support detected");var d,p,g,m=!1;function y(){var e=f.buffer;i.HEAP8=d=new Int8Array(e),i.HEAP16=new Int16Array(e),i.HEAP32=new Int32Array(e),i.HEAPU8=p=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAPU32=g=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e)}var w=[],b=[],x=[],v=0,A=null,S=null;function E(e){i.onAbort&&i.onAbort(e),h(e="Aborted("+e+")"),m=!0,e+=". Build with -sASSERTIONS for more info.";var n=new WebAssembly.RuntimeError(e);throw t(n),n}var I,M;function N(e){return e.startsWith("data:application/octet-stream;base64,")}function P(e){try{if(e==I&&c)return new Uint8Array(c);if(a)return a(e);throw"both async and sync fetching of the wasm failed"}catch(e){E(e)}}function D(e,n,t){return function(e){return c||!o&&!u||"function"!=typeof fetch?Promise.resolve().then((function(){return P(e)})):fetch(e,{credentials:"same-origin"}).then((function(n){if(!n.ok)throw"failed to load wasm binary file at '"+e+"'";return n.arrayBuffer()})).catch((function(){return P(e)}))}(e).then((function(e){return WebAssembly.instantiate(e,n)})).then((function(e){return e})).then(t,(function(e){h("failed to asynchronously prepare wasm: "+e),E(e)}))}function C(e){for(;e.length>0;)e.shift()(i)}function k(e){this.excPtr=e,this.ptr=e-24,this.set_type=function(e){g[this.ptr+4>>2]=e},this.get_type=function(){return g[this.ptr+4>>2]},this.set_destructor=function(e){g[this.ptr+8>>2]=e},this.get_destructor=function(){return g[this.ptr+8>>2]},this.set_caught=function(e){e=e?1:0,d[this.ptr+12|0]=e},this.get_caught=function(){return 0!=d[this.ptr+12|0]},this.set_rethrown=function(e){e=e?1:0,d[this.ptr+13|0]=e},this.get_rethrown=function(){return 0!=d[this.ptr+13|0]},this.init=function(e,n){this.set_adjusted_ptr(0),this.set_type(e),this.set_destructor(n)},this.set_adjusted_ptr=function(e){g[this.ptr+16>>2]=e},this.get_adjusted_ptr=function(){return g[this.ptr+16>>2]},this.get_exception_ptr=function(){if($(this.get_type()))return g[this.excPtr>>2];var e=this.get_adjusted_ptr();return 0!==e?e:this.excPtr}}function R(e){var n=f.buffer;try{return f.grow(e-n.byteLength+65535>>>16),y(),1}catch(e){}}function U(e){return i["_"+e]}N(I="wasmDbscan.wasm")||(M=I,I=i.locateFile?i.locateFile(M,l):l+M);var T="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function B(e,n,t,r,i){var a={string:e=>{var n=0;return null!=e&&0!==e&&(n=function(e){var n=function(e){for(var n=0,t=0;t<e.length;++t){var r=e.charCodeAt(t);r<=127?n++:r<=2047?n+=2:r>=55296&&r<=57343?(n+=4,++t):n+=3}return n}(e)+1,t=G(n);return function(e,n,t){!function(e,n,t,r){if(!(r>0))return 0;for(var i=t+r-1,a=0;a<e.length;++a){var s=e.charCodeAt(a);if(s>=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++a)),s<=127){if(t>=i)break;n[t++]=s}else if(s<=2047){if(t+1>=i)break;n[t++]=192|s>>6,n[t++]=128|63&s}else if(s<=65535){if(t+2>=i)break;n[t++]=224|s>>12,n[t++]=128|s>>6&63,n[t++]=128|63&s}else{if(t+3>=i)break;n[t++]=240|s>>18,n[t++]=128|s>>12&63,n[t++]=128|s>>6&63,n[t++]=128|63&s}}n[t]=0}(e,p,n,t)}(e,t,n),t}(e)),n},array:e=>{var n,t,r=G(e.length);return n=e,t=r,d.set(n,t),r}},s=U(e),o=[],u=0;if(r)for(var l=0;l<r.length;l++){var c=a[t[l]];c?(0===u&&(u=_()),o[l]=c(r[l])):o[l]=r[l]}var f=s.apply(null,o);return function(e){return 0!==u&&L(u),function(e){return"string"===n?(t=e)?function(e,n,t){for(var r=n+t,i=n;e[i]&&!(i>=r);)++i;if(i-n>16&&e.buffer&&T)return T.decode(e.subarray(n,i));for(var a="";n<i;){var s=e[n++];if(128&s){var o=63&e[n++];if(192!=(224&s)){var u=63&e[n++];if((s=224==(240&s)?(15&s)<<12|o<<6|u:(7&s)<<18|o<<12|u<<6|63&e[n++])<65536)a+=String.fromCharCode(s);else{var l=s-65536;a+=String.fromCharCode(55296|l>>10,56320|1023&l)}}else a+=String.fromCharCode((31&s)<<6|o)}else a+=String.fromCharCode(s)}return a}(p,t,r):"":"boolean"===n?Boolean(e):e;var t,r}(e)}(f)}var O,z={__cxa_throw:function(e,n,t){throw new k(e).init(n,t),e},abort:function(){E("")},emscripten_memcpy_big:function(e,n,t){p.copyWithin(e,n,n+t)},emscripten_resize_heap:function(e){var n,t=p.length,r=2147483648;if((e>>>=0)>r)return!1;for(var i=1;i<=4;i*=2){var a=t*(1+.2/i);if(a=Math.min(a,e+100663296),R(Math.min(r,(n=Math.max(e,a))+(65536-n%65536)%65536)))return!0}return!1}},_=(function(){var e,n,r,a,s={env:z,wasi_snapshot_preview1:z};function o(e,n){var t,r=e.exports;return i.asm=r,f=i.asm.memory,y(),i.asm.__indirect_function_table,t=i.asm.__wasm_call_ctors,b.unshift(t),function(){if(v--,i.monitorRunDependencies&&i.monitorRunDependencies(v),0==v&&(null!==A&&(clearInterval(A),A=null),S)){var e=S;S=null,e()}}(),r}if(v++,i.monitorRunDependencies&&i.monitorRunDependencies(v),i.instantiateWasm)try{return i.instantiateWasm(s,o)}catch(e){h("Module.instantiateWasm callback failed with error: "+e),t(e)}(e=c,n=I,r=s,a=function(e){o(e.instance)},e||"function"!=typeof WebAssembly.instantiateStreaming||N(n)||"function"!=typeof fetch?D(n,r,a):fetch(n,{credentials:"same-origin"}).then((function(e){return WebAssembly.instantiateStreaming(e,r).then(a,(function(e){return h("wasm streaming compile failed: "+e),h("falling back to ArrayBuffer instantiation"),D(n,r,a)}))}))).catch(t)}(),i._dbscan=function(){return(i._dbscan=i.asm.dbscan).apply(null,arguments)},i._malloc=function(){return(i._malloc=i.asm.malloc).apply(null,arguments)},i._free=function(){return(i._free=i.asm.free).apply(null,arguments)},function(){return(_=i.asm.stackSave).apply(null,arguments)}),L=function(){return(L=i.asm.stackRestore).apply(null,arguments)},G=function(){return(G=i.asm.stackAlloc).apply(null,arguments)},$=function(){return($=i.asm.__cxa_is_pointer_type).apply(null,arguments)};function F(){function e(){O||(O=!0,i.calledRun=!0,m||(C(b),n(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),function(){if(i.postRun)for("function"==typeof i.postRun&&(i.postRun=[i.postRun]);i.postRun.length;)e=i.postRun.shift(),x.unshift(e);var e;C(x)}()))}v>0||(function(){if(i.preRun)for("function"==typeof i.preRun&&(i.preRun=[i.preRun]);i.preRun.length;)e=i.preRun.shift(),w.unshift(e);var e;C(w)}(),v>0||(i.setStatus?(i.setStatus("Running..."),setTimeout((function(){setTimeout((function(){i.setStatus("")}),1),e()}),1)):e()))}if(i.ccall=B,i.cwrap=function(e,n,t,r){var i=!t||t.every((e=>"number"===e||"boolean"===e));return"string"!==n&&i&&!r?U(e):function(){return B(e,n,t,arguments)}},S=function e(){O||F(),O||(S=e)},i.preInit)for("function"==typeof i.preInit&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return F(),e.ready});"object"==typeof exports?e.exports=i:"function"==typeof define&&t.amdO?define([],(function(){return i})):"object"==typeof exports&&(exports.exportCppDbscanLib=i)},606:(e,n,t)=>{"use strict";t.d(n,{Qt:()=>i,gD:()=>r}),t(6066);const r=e=>null==e;function i(e,n,t,r){if(t>e[e.length-1])return;const i=e.findIndex((e=>t<e));e.pop(),e.splice(i,0,t),n.pop(),n.splice(i,0,r)}},5738:(e,n,t)=>{"use strict";class r extends Float32Array{}var i=t(8498),a=t(2787),s=t(944),o=t(6295);function u(e=!1,n="Assertion error."){if(!e)throw new Error(n)}var l=t(4572);const c={[i.Pn.Euclidean]:function(e,n){let t=0;const r=e.length;if(r!==n.length)throw new Error("The dimensionality of the vectors must match");for(let i=0;i<r;++i)t+=Math.pow(e[i]-n[i],2);return Math.sqrt(t)}},f={[i.xL.Levenshtein]:a.I,[i.xL.JaroWinkler]:s.Vb,[i.xL.Manhattan]:function(e,n){if(e.length!==n.length)return 1;{let t=0;for(let r=1;r<e.length;r++)t+=e[r]==n[r]?0:1;return t/e.length}},[i.xL.Onehot]:function(e,n){return e===n?0:1}},h={[i.aT.Tanimoto]:o.tO,[i.aT.Dice]:o.zn,[i.aT.Asymmetric]:o.gt,[i.aT.BraunBlanquet]:o.ij,[i.aT.Cosine]:o.lO,[i.aT.Kulczynski]:o.rR,[i.aT.McConnaughey]:o.lP,[i.aT.RogotGoldberg]:o.TK,[i.aT.Russel]:o.yK,[i.aT.Sokal]:o.Ii,[i.aT.Hamming]:o.be,[i.aT.Euclidean]:o.a4},d={[i.m6.TanimotoIntArray]:o.v_},p={[i.RR.Difference]:o.T6},g={[i.Wn.CommonItems]:o.Hr},m={[i.EG.Vector]:{[i.Pn.Euclidean]:c[i.Pn.Euclidean]},[i.EG.String]:{[i.xL.Levenshtein]:f[i.xL.Levenshtein],[i.xL.JaroWinkler]:f[i.xL.JaroWinkler],[i.xL.Manhattan]:f[i.xL.Manhattan],[i.xL.Onehot]:f[i.xL.Onehot]},[i.EG.BitArray]:{[i.aT.Tanimoto]:h[i.aT.Tanimoto],[i.aT.Dice]:h[i.aT.Dice],[i.aT.Asymmetric]:h[i.aT.Asymmetric],[i.aT.BraunBlanquet]:h[i.aT.BraunBlanquet],[i.aT.Cosine]:h[i.aT.Cosine],[i.aT.Kulczynski]:h[i.aT.Kulczynski],[i.aT.McConnaughey]:h[i.aT.McConnaughey],[i.aT.RogotGoldberg]:h[i.aT.RogotGoldberg],[i.aT.Russel]:h[i.aT.Russel],[i.aT.Sokal]:h[i.aT.Sokal]},[i.EG.MacroMolecule]:{[l.Z.HAMMING]:l.V[l.Z.HAMMING],[l.Z.LEVENSHTEIN]:l.V[l.Z.LEVENSHTEIN],[l.Z.NEEDLEMANN_WUNSCH]:l.V[l.Z.NEEDLEMANN_WUNSCH],[l.Z.MONOMER_CHEMICAL_DISTANCE]:l.V[l.Z.MONOMER_CHEMICAL_DISTANCE]},[i.EG.Number]:{[i.RR.Difference]:p[i.RR.Difference]},[i.EG.IntArray]:{[i.m6.TanimotoIntArray]:d[i.m6.TanimotoIntArray]},[i.EG.NumberArray]:{[i.Wn.CommonItems]:g[i.Wn.CommonItems]}},y=Object.keys(m).reduce(((e,n)=>{for(const t of Object.keys(m[n]))e[t]=n;return e}),{});class w{constructor(e){this.method=e,this.dataType=y[e]}metricNeedsArgs(e){return y[e]==i.EG.MacroMolecule.toString()||y[e]==i.EG.Number.toString()||function(e){return y[e]==i.EG.NumberArray.toString()}(e)}getMeasure(e){const n=m;if(!n.hasOwnProperty(this.dataType)||!n[this.dataType].hasOwnProperty(this.method))throw new Error(`Unknown measure ${this.method} for data type ${this.dataType}`);return this.metricNeedsArgs(this.method)?n[this.dataType][this.method](e):n[this.dataType][this.method]}static getMetricByDataType(e){return Object.keys(m[e])}static get availableMeasures(){return Object.keys(m)}}t(606);var b=t(6066);class x{constructor(e=!0,n=!0){const r=navigator.hardwareConcurrency;this._workerCount=e?Math.max(r-2,1):1,this._workers=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(793),t.b)))),this._terminateOnComplete=n}async calc(e,n,t=!0,r){return await this.calcMulti([e],[n],t,[r??{}],[1],b.G.MANHATTAN)}async calcMulti(e,n,t=!0,r=[{}],i=[1],a=b.G.MANHATTAN){if(e.length<1)throw new Error("values must contain at least one array");if(n.length!==e.length||r.length!==e.length||i.length!==e.length)throw new Error("values, fnNames, weights and opts must have the same length");return new Promise((async(s,o)=>{try{const o=e[0].length,u=new Array(this._workerCount),l=o*(o-1)/2;this._workerCount=Math.min(this._workerCount,l);const c=l/this._workerCount,f=new Float32Array(l);let h=0,d=1,p=0,g=Number.MIN_VALUE;for(let t=0;t<this._workerCount;t++){const s=Math.floor(t*c),m=t===this._workerCount-1?l:Math.floor((t+1)*c),y=h,w=d;t!==this._workerCount-1&&(h=o-2-Math.floor(Math.sqrt(-8*m+4*o*(o-1)-7)/2-.5),d=m-o*h+Math.floor((h+1)*(h+2)/2)),this._workers[t].postMessage({values:e,fnNames:n,startRow:y,startCol:w,chunckSize:m-s,opts:r,weights:i,aggregationMethod:a}),u[t]=new Promise(((e,n)=>{this._workers[t].onmessage=({data:{error:r,distanceMatrixData:i,min:a,max:o}})=>{this._terminateOnComplete&&setTimeout((()=>this._workers[t].terminate())),r?n(r):(f.set(i,s),a<p&&(p=a),o>g&&(g=o),e())}}))}await Promise.all(u),t&&f.forEach(((e,n)=>{f[n]=(e-p)/(g-p)})),s(f)}catch(e){o(e)}}))}terminate(){this._workers.forEach((e=>e.terminate()))}}function v(e,n){return Math.floor(n()*e)}function A(e){return e()}function S(e){const n=[];for(let t=0;t<e;t++)n.push(void 0);return n}function E(e){return S(e).map(((e,n)=>n))}function I(e,n){return S(e).map((()=>n))}function M(e){return I(e,0)}function N(e){return function(e){return e.reduce(((e,n)=>e+n))}(e)/e.length}function P(e){let n=0;for(let t=0;t<e.length;t++)n=e[t]>n?e[t]:n;return n}function D(e,n,t){const r=M(e);for(let i=0;i<e;i++){let e=!0;for(;e;){const a=v(n,t);let s=!1;for(let e=0;e<i;e++)if(a===r[e]){s=!0;break}s||(e=!1),r[i]=a}}return r}function C(e,n,t){const r=[];let i=0;if(e.length!==n*t)throw new Error("Array dimensions must match input length.");for(let a=0;a<n;a++){const n=[];for(let r=0;r<t;r++)n.push(e[i]),i+=1;r.push(n)}return r}function k(e,n){const t=t=>S(e).map((()=>I(n,t))),r=[];return r.push(t(-1)),r.push(t(1/0)),r.push(t(0)),r}function R(e,n,t){const r=M(e);for(let i=0;i<e;i++){let e=!0,a=0;for(;e;){a=v(n,t);let s=!1;for(let e=0;e<i;e++)if(a===r[e]){s=!0;break}s||(e=!1)}r[i]=a}return r}function U(e,n,t,r,i){n=Math.floor(n);const a=e[0][n];if(t>=e[1][n][0])return 0;for(let e=0;e<a.length;e++)if(r===a[e])return 0;return T(e,n,t,r,i)}function T(e,n,t,r,i){const a=e[0][n],s=e[1][n],o=e[2][n];if(t>=s[0])return 0;s[0]=t,a[0]=r,o[0]=i;let u=0,l=0;for(;;){const n=2*u+1,r=n+1,i=e[0][0].length;if(n>=i)break;if(r>=i){if(!(s[n]>t))break;l=n}else if(s[n]>=s[r]){if(!(t<s[n]))break;l=n}else{if(!(t<s[r]))break;l=r}s[u]=s[l],a[u]=a[l],o[u]=o[l],u=l}return s[u]=t,a[u]=r,o[u]=i,1}function B(e,n,t,r,i){const a=k(n,r);for(let r=0;r<n;r++)for(let n=0;n<t;n++){if(e[0][r][n]<0)continue;const t=e[0][r][n],s=e[2][r][n],o=A(i);U(a,r,o,t,s),U(a,t,o,r,s),e[2][r][n]=0}return a}function O(e){const n=e[0],t=e[1];for(let e=0;e<n.length;e++){const r=n[e],i=t[e];for(let e=0;e<r.length-1;e++){const n=r.length-e-1,t=i.length-e-1,a=r[0];r[0]=r[n],r[n]=a;const s=i[0];i[0]=i[t],i[t]=s,z(i,r,t,0)}}return{indices:n,weights:t}}function z(e,n,t,r){for(;2*r+1<t;){const i=2*r+1,a=i+1;let s=r;if(e[s]<e[i]&&(s=i),a<t&&e[s]<e[a]&&(s=a),s===r)break;{const t=e[r];e[r]=e[s],e[s]=t;const i=n[r];n[r]=n[s],n[s]=i,r=s}}}function _(e,n){const t=e[0][n],r=e[1][n],i=e[2][n];let a=1/0,s=-1;for(let e=0;e>t.length;e++)1===i[e]&&r[e]<a&&(a=r[e],s=e);return s>=0?(i[s]=0,Math.floor(t[s])):-1}class L{constructor(e,n,t,r){if(this.entries=new Map,this.nRows=0,this.nCols=0,e.length!==n.length||e.length!==t.length)throw new Error("rows, cols and values arrays must all have the same length");this.nRows=r[0],this.nCols=r[1];for(let r=0;r<t.length;r++){const i=e[r],a=n[r];this.checkDims(i,a);const s=this.makeKey(i,a);this.entries.set(s,{value:t[r],row:i,col:a})}}makeKey(e,n){return`${e}:${n}`}checkDims(e,n){if(!(e<this.nRows&&n<this.nCols))throw new Error("row and/or col specified outside of matrix dimensions")}set(e,n,t){this.checkDims(e,n);const r=this.makeKey(e,n);this.entries.has(r)?this.entries.get(r).value=t:this.entries.set(r,{value:t,row:e,col:n})}get(e,n,t=0){const r=this.makeKey(e,n);return this.entries.has(r)?this.entries.get(r).value:t}getAll(e=!0){const n=new Array(this.entries.size).fill(null);let t=0;return this.entries.forEach((e=>{n[t++]=e})),e&&n.sort(((e,n)=>e.row===n.row?e.col-n.col:e.row-n.row)),n}getDims(){return[this.nRows,this.nCols]}getRows(){return Array.from(this.entries,(([e,n])=>n.row))}getCols(){return Array.from(this.entries,(([e,n])=>n.col))}getValues(){return Array.from(this.entries,(([e,n])=>n.value))}forEach(e){this.entries.forEach((n=>e(n.value,n.row,n.col)))}map(e){const n=new Float32Array(this.entries.size);let t=0;this.entries.forEach((r=>{n[t++]=e(r.value,r.row,r.col)}));const r=[this.nRows,this.nCols];return new L(this.getRows(),this.getCols(),n,r)}toArray(){const e=S(this.nRows).map((()=>M(this.nCols)));return this.entries.forEach((n=>{e[n.row][n.col]=n.value})),e}}function G(e){const n=e.getRows(),t=e.getCols(),r=e.getValues(),i=t.length,a=new Int32Array(i),s=new Int32Array(i),o=new Float32Array(i);a.set(n),s.set(t),o.set(r);const u=[e.nCols,e.nRows];return new L(s,a,o,u)}function $(e,n){return W(e,n,((e,n)=>e*n))}function F(e,n){return W(e,n,((e,n)=>e+n))}function j(e,n){return W(e,n,((e,n)=>e-n))}function Y(e,n){return e.map((e=>e*n))}function V(e){const n=new Set,t=e.getValues(),r=e.getRows(),i=e.getCols();for(let e=0;e<t.length;e++)0===t[e]&&n.add(e);const a=(e,t)=>!n.has(t),s=t.filter(a),o=r.filter(a),u=i.filter(a);return new L(o,u,s,e.getDims())}function K(e,n="l2"){const t=q[n],r=new Map;e.forEach(((e,n,t)=>{const i=r.get(n)||[];i.push(t),r.set(n,i)}));const i=new L([],[],[],e.getDims());for(const n of r.keys()){const a=r.get(n).sort(),s=t(a.map((t=>e.get(n,t))));for(let e=0;e<s.length;e++)i.set(n,a[e],s[e])}return i}const q={max:e=>{let n=-1/0;for(let t=0;t<e.length;t++)n=e[t]>n?e[t]:n;return e.map((e=>e/n))},l1:e=>{let n=0;for(let t=0;t<e.length;t++)n+=e[t];return e.map((e=>e/n))},l2:e=>{let n=0;for(let t=0;t<e.length;t++)n+=e[t]**2;return e.map((e=>Math.sqrt(e**2/n)))}};function W(e,n,t){const r=new Set,i=[],a=[],s=[],o=(r,o)=>{i.push(r),a.push(o);const u=t(e.get(r,o),n.get(r,o));s.push(u)},u=e.getValues(),l=e.getRows(),c=e.getCols();for(let e=0;e<u.length;e++){const n=l[e],t=c[e],i=`${n}:${t}`;r.add(i),o(n,t)}const f=n.getValues(),h=n.getRows(),d=n.getCols();for(let e=0;e<f.length;e++){const n=h[e],t=d[e],i=`${n}:${t}`;r.has(i)||o(n,t)}const p=[e.nRows,e.nCols];return new L(i,a,s,p)}function H(e){const n=[];e.forEach(((e,t,r)=>{n.push({value:e,row:t,col:r})})),n.sort(((e,n)=>e.row===n.row?e.col-n.col:e.row-n.row));const t=[],r=[],i=[];let a=-1;for(let e=0;e<n.length;e++){const{row:s,col:o,value:u}=n[e];s!==a&&(a=s,i.push(e)),t.push(o),r.push(u)}return{indices:t,values:r,indptr:i}}class Z{constructor(e,n,t,r){this.hyperplanes=e,this.offsets=n,this.children=t,this.indices=r}}function X(e,n,t,r){const i=Math.max(10,n),a=E(t).map(((n,t)=>function(e,n=30,t,r){return Q(e,E(e.length),n,t,r)}(e,i,t,r))),s=a.map((e=>function(e,n){const t=ee(e),r=ne(e),i=E(t).map((()=>e.hyperplane?1:0)),a=M(t),s=E(t).map((()=>[-1,-1])),o=E(r).map((()=>E(n).map((()=>-1))));return J(e,i,a,s,o,0,0),new Z(i,a,s,o)}(e,i)));return s}function Q(e,n,t=30,r,i){if(n.length>t){const a=function(e,n,t){const r=v(n.length,t);let i=v(n.length,t);i+=r===i?1:0,i%=n.length;const a=n[r],s=n[i];let o=0,u=0;u=e[a]-e[s],o-=u*(e[a]+e[s])/2;let l=0,c=0;const f=M(n.length);for(let r=0;r<n.length;r++){let i=o;i+=u*e[n[r]],0===i?(f[r]=v(2,t),0===f[r]?l+=1:c+=1):i>0?(f[r]=0,l+=1):(f[r]=1,c+=1)}const h=M(l),d=M(c);l=0,c=0;for(let e=0;e<f.length;e++)0===f[e]?(h[l]=n[e],l+=1):(d[c]=n[e],c+=1);return{indicesLeft:h,indicesRight:d,hyperplane:u,offset:o}}(e,n,i),{indicesLeft:s,indicesRight:o,hyperplane:u,offset:l}=a;return{leftChild:Q(e,s,t,r+1,i),rightChild:Q(e,o,t,r+1,i),isLeaf:!1,hyperplane:u,offset:l}}return{indices:n,isLeaf:!0}}function J(e,n,t,r,i,a,s){if(e.isLeaf)return r[a][0]=-s,i[s].splice(0,e.indices.length,...e.indices),{nodeNum:a,leafNum:s+=1};{n[a]=e.hyperplane,t[a]=e.offset,r[a][0]=a+1;const o=a;let u=J(e.leftChild,n,t,r,i,a+1,s);return a=u.nodeNum,s=u.leafNum,r[o][1]=a+1,u=J(e.rightChild,n,t,r,i,a+1,s),{nodeNum:u.nodeNum,leafNum:u.leafNum}}}function ee(e){return e.isLeaf?1:1+ee(e.leftChild)+ee(e.rightChild)}function ne(e){return e.isLeaf?1:ne(e.leftChild)+ne(e.rightChild)}function te(e,n,t,r){let i=n;return i+=e*t,0===i?v(2,r):i>0?0:1}function re(e,n,t){let r=0;for(;n.children[r][0]>0;)r=0===te(n.hyperplanes[r],n.offsets[r],e,t)?n.children[r][0]:n.children[r][1];const i=-1*n.children[r][0];return n.indices[i]}const ie=Object.prototype.toString;function ae(e){return ie.call(e).endsWith("Array]")}function se(e,n,t){let r=0;const i=t(n);for(let n=0;n<e.x.length;n++)r+=Math.abs(e.y[n]-i(e.x[n]));return r}var oe=t(5907);function ue(e,n,t,r,i){let a=t*r*r,s=oe.uq.eye(n.length,n.length,a);const o=i(n);let u=new Float64Array(e.x.length);for(let n=0;n<e.x.length;n++)u[n]=o(e.x[n]);let l=function(e,n,t,r,i){const a=t.length,s=e.x.length;let o=new Array(a);for(let u=0;u<a;u++){o[u]=new Array(s);let a=t.slice();a[u]+=r;let l=i(a);for(let t=0;t<s;t++)o[u][t]=n[t]-l(e.x[t])}return new oe.uq(o)}(e,u,n,r,i),c=function(e,n){const t=e.x.length;let r=new Array(t);for(let i=0;i<t;i++)r[i]=[e.y[i]-n[i]];return new oe.uq(r)}(e,u),f=(0,oe.DI)(s.add(l.mmul(l.transpose())));return(n=(n=new oe.uq([n])).sub(f.mmul(l).mmul(c).mul(r).transpose())).to1DArray()}const le=1e-5,ce=.001;class fe{get neighbors(){return this.nNeighbors}constructor(e={}){this.learningRate=1,this.localConnectivity=1,this.minDist=.1,this.nComponents=2,this.nEpochs=0,this.nNeighbors=15,this.negativeSampleRate=5,this.random=Math.random,this.repulsionStrength=1,this.setOpMixRatio=1,this.spread=1,this.transformQueueSize=4,this.targetMetric="categorical",this.targetWeight=.5,this.targetNNeighbors=15,this.distanceFn=he,this.isInitialized=!1,this.rpForest=[],this.embedding=[],this.optimizationState=new de;const n=n=>{void 0!==e[n]&&(this[n]=e[n])};n("distanceFn"),n("learningRate"),n("localConnectivity"),n("minDist"),n("nComponents"),n("nEpochs"),n("nNeighbors"),n("negativeSampleRate"),n("random"),n("repulsionStrength"),n("setOpMixRatio"),n("spread"),n("transformQueueSize"),this.targetNNeighbors=e.nNeighbors||this.nNeighbors||this.targetNNeighbors}fit(e){return this.initializeFit(e),this.optimizeLayout(),this.embedding}async fitAsync(e,n=()=>!0){return this.initializeFit(e),await this.optimizeLayoutAsync(n),this.embedding}setSupervisedProjection(e,n={}){this.Y=e,this.targetMetric=n.targetMetric||this.targetMetric,this.targetWeight=n.targetWeight||this.targetWeight,this.targetNNeighbors=n.targetNNeighbors||this.targetNNeighbors}setPrecomputedKNN(e,n){this.knnIndices=e,this.knnDistances=n}initializeFit(e){if(e.length<=this.nNeighbors)throw new Error(`Not enough data points (${e.length}) to create nNeighbors: ${this.nNeighbors}. Add more data points or adjust the configuration.`);if(this.X===e&&this.isInitialized)return this.getNEpochs();if(this.X=e,!this.knnIndices&&!this.knnDistances){const n=this.nearestNeighbors(e);this.knnIndices=n.knnIndices,this.knnDistances=n.knnDistances}this.graph=this.fuzzySimplicialSet(e,this.nNeighbors,this.setOpMixRatio),this.makeSearchFns(),this.searchGraph=this.makeSearchGraph(e),this.processGraphForSupervisedProjection();const{head:n,tail:t,epochsPerSample:r}=this.initializeSimplicialSetEmbedding();return this.optimizationState.head=n,this.optimizationState.tail=t,this.optimizationState.epochsPerSample=r,this.initializeOptimization(),this.prepareForOptimizationLoop(),this.isInitialized=!0,this.getNEpochs()}makeSearchFns(){const{initFromTree:e,initFromRandom:n}=(t=this.distanceFn,{initFromRandom:function(e,n,r,i,a){for(let s=0;s<r.length;s++){const o=D(e,n.length,a);for(let e=0;e<o.length;e++)o[e]<0||U(i,s,t(n[o[e]],r[s]),o[e],1)}},initFromTree:function(e,n,r,i,a){for(let s=0;s<r.length;s++){const o=re(r[s],e,a);for(let e=0;e<o.length;e++){if(o[e]<0)return;U(i,s,t(n[o[e]],r[s]),o[e],1)}}}});var t;this.initFromTree=e,this.initFromRandom=n,this.search=function(e){return function(n,t,r,i){const{indices:a,indptr:s}=H(t);for(let t=0;t<i.length;t++){const o=new Set(r[0][t]);for(;;){const u=_(r,t);if(-1===u)break;const l=a.slice(s[u],s[u+1]);for(const a of l)a===u||-1===a||o.has(a)||(T(r,t,e(n[a],i[t]),a,1),o.add(a))}}return r}}(this.distanceFn)}makeSearchGraph(e){const n=this.knnIndices,t=this.knnDistances,r=[e.length,e.length],i=new L([],[],[],r);for(let e=0;e<n.length;e++){const r=n[e],a=t[e];for(let n=0;n<r.length;n++){const t=r[n],s=a[n];s>0&&i.set(e,t,s)}}return W(i,G(i),((e,n)=>e>n?e:n))}transform(e){const n=this.X;if(void 0===n||0===n.length)throw new Error("No data has been fit.");let t=Math.floor(this.nNeighbors*this.transformQueueSize);t=Math.min(n.length,t);const r=function(e,n,t,r,i,a,s){const o=k(t.length,r);if(i(r,n,t,o,s),e)for(const r of e)a(r,n,t,o,s);return o}(this.rpForest,n,e,t,this.initFromRandom,this.initFromTree,this.random),i=this.search(n,this.searchGraph,r,e);let{indices:a,weights:s}=O(i);a=a.map((e=>e.slice(0,this.nNeighbors))),s=s.map((e=>e.slice(0,this.nNeighbors)));const o=Math.max(0,this.localConnectivity-1),{sigmas:u,rhos:l}=this.smoothKNNDistance(s,this.nNeighbors,o),{rows:c,cols:f,vals:h}=this.computeMembershipStrengths(a,s,u,l),d=[e.length,n.length];let p=new L(c,f,h,d);const g=H(K(p,"l1")),m=e.length,y=function(e,n,t){const r=M(e.length).map((e=>M(t[0].length)));for(let i=0;i<e.length;i++)for(let a=0;a<e[0].length;a++)for(let s=0;s<t[0].length;s++){const o=e[i][a];r[i][s]+=n[i][a]*t[o][s]}return r}(C(g.indices,m,this.nNeighbors),C(g.values,m,this.nNeighbors),this.embedding),w=this.nEpochs?this.nEpochs/3:p.nRows<=1e4?100:30,b=p.getValues().reduce(((e,n)=>n>e?n:e),0);p=p.map((e=>e<b/w?0:e)),p=V(p);const x=this.makeEpochsPerSample(p.getValues(),w),v=p.getRows(),A=p.getCols();return this.assignOptimizationStateParameters({headEmbedding:y,tailEmbedding:this.embedding,head:v,tail:A,currentEpoch:0,nEpochs:w,nVertices:p.getDims()[1],epochsPerSample:x}),this.prepareForOptimizationLoop(),this.optimizeLayout()}processGraphForSupervisedProjection(){const{Y:e,X:n}=this;if(e){if(e.length!==n.length)throw new Error("Length of X and y must be equal");if("categorical"===this.targetMetric){const n=this.targetWeight<1?1/(1-this.targetWeight)*2.5:1e12;this.graph=this.categoricalSimplicialSetIntersection(this.graph,e,n)}}}step(){const{currentEpoch:e}=this.optimizationState;return e<this.getNEpochs()&&this.optimizeLayoutStep(e),this.optimizationState.currentEpoch}getEmbedding(){return this.embedding}nearestNeighbors(e){const{distanceFn:n,nNeighbors:t}=this,r=function(e,n){return function(t,r,i,a=10,s=50,o=.001,u=.5,l=!0){const c=t.length,f=k(t.length,i);for(let r=0;r<t.length;r++){const a=R(i,t.length,n);for(let n=0;n<a.length;n++){const i=e(t[r],t[a[n]]);U(f,r,i,a[n],1),U(f,a[n],i,r,1)}}if(l)for(let n=0;n<r.length;n++)for(let i=0;i<r[n].length&&!(r[n][i]<0);i++)for(let a=i+1;a<r[n].length&&!(r[n][a]<0);a++){const s=e(t[r[n][i]],t[r[n][a]]);U(f,r[n][i],s,r[n][a],1),U(f,r[n][a],s,r[n][i],1)}for(let r=0;r<a;r++){const r=B(f,c,i,s,n);let a=0;for(let i=0;i<c;i++)for(let o=0;o<s;o++){const l=Math.floor(r[0][i][o]);if(!(l<0||A(n)<u))for(let n=0;n<s;n++){const s=Math.floor(r[0][i][n]),u=r[2][i][o],c=r[2][i][n];if(s<0||!u&&!c)continue;const h=e(t[l],t[s]);a+=U(f,l,h,s,1),a+=U(f,s,h,l,1)}}if(a<=o*i*t.length)break}return O(f)}}(n,this.random),i=5+Math.floor(.5==(a=e.length**.5/20)?0:Math.round(a));var a;const s=Math.max(5,Math.floor(Math.round((e=>Math.log(e)/Math.log(2))(e.length))));this.rpForest=X(e,t,i,this.random);const o=function(e){if(e.length>0){const n=[];for(const t of e)n.push(...t.indices);return n}return[[-1]]}(this.rpForest),{indices:u,weights:l}=r(e,o,t,s);return{knnIndices:u,knnDistances:l}}fuzzySimplicialSet(e,n,t=1){const{knnIndices:r=[],knnDistances:i=[],localConnectivity:a}=this,{sigmas:s,rhos:o}=this.smoothKNNDistance(i,n,a),{rows:u,cols:l,vals:c}=this.computeMembershipStrengths(r,i,s,o),f=[e.length,e.length],h=new L(u,l,c,f),d=G(h),p=$(h,d),g=j(F(h,d),p);return F(Y(g,t),Y(p,1-t))}categoricalSimplicialSetIntersection(e,n,t,r=1){let i=function(e,n,t=1,r=5){return e.map(((e,i,a)=>-1===n[i]||-1===n[a]?e*Math.exp(-t):n[i]!==n[a]?e*Math.exp(-r):e))}(e,n,r,t);return i=V(i),function(e){const n=G(e=K(e,"max"));return V(e=F(e,j(n,$(n,e))))}(i)}smoothKNNDistance(e,n,t=1,r=64,i=1){const a=Math.log(n)/Math.log(2)*i,s=M(e.length),o=M(e.length);for(let n=0;n<e.length;n++){let i=0,u=1/0,l=1;const c=e[n],f=c.filter((e=>e>0));if(f.length>=t){const e=Math.floor(t),r=t-e;e>0?(s[n]=f[e-1],r>le&&(s[n]+=r*(f[e]-f[e-1]))):s[n]=r*f[0]}else f.length>0&&(s[n]=P(f));for(let t=0;t<r;t++){let t=0;for(let r=1;r<e[n].length;r++){const i=e[n][r]-s[n];t+=i>0?Math.exp(-i/l):1}if(Math.abs(t-a)<le)break;t>a?(u=l,l=(i+u)/2):(i=l,u===1/0?l*=2:l=(i+u)/2)}if(o[n]=l,s[n]>0){const e=N(c);o[n]<ce*e&&(o[n]=ce*e)}else{const t=N(e.map(N));o[n]<ce*t&&(o[n]=ce*t)}}return{sigmas:o,rhos:s}}computeMembershipStrengths(e,n,t,r){const i=e.length,a=e[0].length,s=M(i*a),o=M(i*a),u=M(i*a);for(let l=0;l<i;l++)for(let i=0;i<a;i++){let c=0;-1!==e[l][i]&&(c=e[l][i]===l?0:n[l][i]-r[l]<=0?1:Math.exp(-(n[l][i]-r[l])/t[l]),s[l*a+i]=l,o[l*a+i]=e[l][i],u[l*a+i]=c)}return{rows:s,cols:o,vals:u}}initializeSimplicialSetEmbedding(){const e=this.getNEpochs(),{nComponents:n}=this,t=this.graph.getValues();let r=0;for(let e=0;e<t.length;e++){const n=t[e];r<t[e]&&(r=n)}const i=this.graph.map((n=>n<r/e?0:n));this.embedding=M(i.nRows).map((()=>M(n).map((()=>20*A(this.random)-10))));const a=[],s=[],o=[],u=i.getAll();for(let e=0;e<u.length;e++){const n=u[e];n.value&&(a.push(n.value),o.push(n.row),s.push(n.col))}return{head:s,tail:o,epochsPerSample:this.makeEpochsPerSample(a,e)}}makeEpochsPerSample(e,n){const t=I(e.length,-1),r=P(e),i=e.map((e=>e/r*n));return i.forEach(((e,r)=>{e>0&&(t[r]=n/i[r])})),t}assignOptimizationStateParameters(e){Object.assign(this.optimizationState,e)}prepareForOptimizationLoop(){const{repulsionStrength:e,learningRate:n,negativeSampleRate:t}=this,{epochsPerSample:r,headEmbedding:i,tailEmbedding:a}=this.optimizationState,s=i[0].length,o=i.length===a.length,u=r.map((e=>e/t)),l=[...u],c=[...r];this.assignOptimizationStateParameters({epochOfNextSample:c,epochOfNextNegativeSample:l,epochsPerNegativeSample:u,moveOther:o,initialAlpha:n,alpha:n,gamma:e,dim:s})}initializeOptimization(){const e=this.embedding,n=this.embedding,{head:t,tail:r,epochsPerSample:i}=this.optimizationState,a=this.getNEpochs(),s=this.graph.nCols,{a:o,b:u}=function(e,n){const t=function(e,n){return S(300).map(((e,t)=>0+t*((n-0)/299)))}(0,3*e).map((e=>e<n?1:e)),r=M(t.length).map(((r,i)=>t[i]>=n?Math.exp(-(t[i]-n)/e):r)),i={x:t,y:r},{parameterValues:a}=function(e,n,t={}){let{maxIterations:r=100,gradientDifference:i=.1,damping:a=0,errorTolerance:s=.01,minValues:o,maxValues:u,initialValues:l}=t;if(a<=0)throw new Error("The damping option must be a positive number");if(!e.x||!e.y)throw new Error("The data parameter must have x and y elements");if(!ae(e.x)||e.x.length<2||!ae(e.y)||e.y.length<2)throw new Error("The data parameter elements must be an array with more than 2 points");if(e.x.length!==e.y.length)throw new Error("The data parameter elements must have the same size");let c=l||new Array(n.length).fill(1),f=c.length;if(u=u||new Array(f).fill(Number.MAX_SAFE_INTEGER),o=o||new Array(f).fill(Number.MIN_SAFE_INTEGER),u.length!==o.length)throw new Error("minValues and maxValues must be the same size");if(!ae(c))throw new Error("initialValues must be an array");let h,d=se(e,c,n),p=d<=s;for(h=0;h<r&&!p;h++){c=ue(e,c,a,i,n);for(let e=0;e<f;e++)c[e]=Math.min(Math.max(o[e],c[e]),u[e]);if(d=se(e,c,n),isNaN(d))break;p=d<=s}return{parameterValues:c,parameterError:d,iterations:h}}(i,(([e,n])=>t=>1/(1+e*t**(2*n))),{damping:1.5,initialValues:[.5,.5],gradientDifference:.1,maxIterations:100,errorTolerance:.01}),[s,o]=a;return{a:s,b:o}}(this.spread,this.minDist);this.assignOptimizationStateParameters({headEmbedding:e,tailEmbedding:n,head:t,tail:r,epochsPerSample:i,a:o,b:u,nEpochs:a,nVertices:s})}optimizeLayoutStep(e){const{optimizationState:n}=this,{head:t,tail:r,headEmbedding:i,tailEmbedding:a,epochsPerSample:s,epochOfNextSample:o,epochOfNextNegativeSample:u,epochsPerNegativeSample:l,moveOther:c,initialAlpha:f,alpha:h,gamma:d,a:p,b:g,dim:m,nEpochs:y,nVertices:w}=n;for(let n=0;n<s.length;n++){if(o[n]>e)continue;const f=t[n],y=r[n],b=i[f],x=a[y],A=ge(b,x);let S=0;A>0&&(S=-2*p*g*Math.pow(A,g-1),S/=p*Math.pow(A,g)+1);for(let e=0;e<m;e++){const n=pe(S*(b[e]-x[e]),4);b[e]+=n*h,c&&(x[e]+=-n*h)}o[n]+=s[n];const E=Math.floor((e-u[n])/l[n]);for(let e=0;e<E;e++){const e=v(w,this.random),n=a[e],t=ge(b,n);let r=0;if(t>0)r=2*d*g,r/=(.001+t)*(p*Math.pow(t,g)+1);else if(f===e)continue;for(let e=0;e<m;e++){let t=4;r>0&&(t=pe(r*(b[e]-n[e]),4)),b[e]+=t*h}}u[n]+=E*l[n]}return n.alpha=f*(1-e/y),n.currentEpoch+=1,i}optimizeLayoutAsync(e=()=>!0){return new Promise(((n,t)=>{const r=async()=>{try{const{nEpochs:t,currentEpoch:i}=this.optimizationState;this.embedding=this.optimizeLayoutStep(i);const a=this.optimizationState.currentEpoch,s=!1===e(a),o=a===t;if(s||o)return n(o);setTimeout((()=>r()),0)}catch(e){t(e)}};setTimeout((()=>r()),0)}))}optimizeLayout(e=()=>!0){let n=!1,t=[];for(;!n;){const{nEpochs:r,currentEpoch:i}=this.optimizationState;t=this.optimizeLayoutStep(i);const a=this.optimizationState.currentEpoch,s=!1===e(a);n=a===r||s}return t}getNEpochs(){const e=this.graph;if(this.nEpochs>0)return this.nEpochs;if(!e)return 200;const n=e.nRows;return n<=2500?500:n<=5e3?400:n<=7500?300:200}}function he(e,n){return Math.abs(e-n)}class de{constructor(){this.currentEpoch=0,this.headEmbedding=[],this.tailEmbedding=[],this.head=[],this.tail=[],this.epochsPerSample=[],this.epochOfNextSample=[],this.epochOfNextNegativeSample=[],this.epochsPerNegativeSample=[],this.moveOther=!0,this.initialAlpha=1,this.alpha=1,this.gamma=1,this.a=1.5769434603113077,this.b=.8950608779109733,this.dim=2,this.nEpochs=500,this.nVertices=0}}function pe(e,n){return e>n?n:e<-n?-n:e}function ge(e,n){let t=0;for(let r=0;r<e.length;r++)t+=Math.pow(e[r]-n[r],2);return t}var me=t(5731),ye=t(8774),we=t(7391),be=t.n(we);class xe{assert(e,n){if(!e)throw n||"Assertion failed"}getopt(e,n,t){return e.hasOwnProperty(n)?e[n]:t}gaussRandom(){if(this.returnV)return this.returnV=!1,this.vValue;const e=2*this.random()-1,n=2*this.random()-1,t=e*e+n*n;if(0===t||t>1)return this.gaussRandom();const r=Math.sqrt(-2*Math.log(t)/t);return this.vValue=n*r,this.returnV=!0,e*r}randn(e,n){return e+this.gaussRandom()*n}zeros(e){if(void 0===e||isNaN(e))return new Float32Array;if("undefined"==typeof ArrayBuffer){const n=new Float32Array(e);for(let t=0;t<e;t++)n[t]=0;return n}return new Float32Array(e)}randn2d(e,n,t){const r=void 0!==t,i=new Array(e).fill(null).map((()=>new Float32Array(n)));if(r)for(let r=0;r<e;r++)i[r]=new Float32Array(n).fill(t);else for(let t=0;t<e;t++)for(let e=0;e<n;e++)i[t][e]=this.randn(0,1e-4);return i}l2(e,n){const t=e.length;let r=0;for(let i=0;i<t;i++){const t=e[i],a=n[i];r+=(t-a)*(t-a)}return r}xtod(e){const n=e.length,t=this.zeros(n*n);for(let r=0;r<n;r++)for(let i=r+1;i<n;i++){const a=this.l2(e[r],e[i]);t[r*n+i]=a,t[i*n+r]=a}return t}getIterSize(e){return e<=2e3?100:e<=3e3?90:e<=5e3?80:70}d2p(e,n,t,r){const i=(s=r,(e,n)=>s*e+n-Math.floor((e+2)*(e+1)/2)),a=new Float32Array(r*r);var s;for(let n=0;n<r;n++)for(let t=n+1;t<r;t++)a[n*r+t]=a[t*r+n]=e[i(n,t)];const o=r,u=Math.log(n),l=this.zeros(o*o),c=this.zeros(o);for(let e=0;e<o;e++){let n=-1/0,i=1/0,s=1,f=!1;const h=Math.floor(this.getIterSize(r)/5);let d=0;for(;!f;){let r=0;for(let n=0;n<o;n++){const t=e===n?0:Math.exp(-a[e*o+n]*s);c[n]=t,r+=t}let l=0;for(let e=0;e<o;e++){let n;n=0===r?0:c[e]/r,c[e]=n,n>1e-7&&(l-=n*Math.log(n))}l>u?(n=s,i===1/0?s*=2:s=(s+i)/2):(i=s,n===-1/0?s/=2:s=(s+n)/2),d++,Math.abs(l-u)<t&&(f=!0),d>=h&&(f=!0)}for(let n=0;n<o;n++)l[e*o+n]=c[n]}const f=this.zeros(o*o),h=2*o;for(let e=0;e<o;e++)for(let n=0;n<o;n++)f[e*o+n]=Math.max((l[e*o+n]+l[n*o+e])/h,1e-100);return f}sign(e){return e>0?1:e<0?-1:0}constructor(e){this.iter=0,this.random=Math.random,this.returnV=!1,this.vValue=0,e=e||{},this.perplexity=this.getopt(e,"perplexity",30),this.dim=this.getopt(e,"dim",2),this.epsilon=this.getopt(e,"epsilon",10),this.random=this.getopt(e,"random",Math.random)}initDataRaw(e){const n=e.length,t=e[0].length;this.assert(n>0," X is empty? You must have some data!"),this.assert(t>0," X[0] is empty? Where is the data?");const r=this.xtod(e);this.P=this.d2p(r,this.perplexity,1e-4,t),this.N=n,this.initSolution()}initDataDist(e,n){const t=e.length;this.assert(t>0," X is empty? You must have some data!"),console.time("distances to matrix"),this.P=this.d2p(e,this.perplexity,1e-4,n),console.timeEnd("distances to matrix"),this.N=n,this.initSolution()}initSolution(){this.Y=this.randn2d(this.N,this.dim),this.gains=this.randn2d(this.N,this.dim,1),this.ystep=this.randn2d(this.N,this.dim,0),this.iter=0}getSolution(){return this.Y}step(){this.iter+=1;const e=this.N,n=this.costGrad(this.Y),t=n.cost,r=n.grad,i=this.zeros(this.dim);for(let n=0;n<e;n++)for(let e=0;e<this.dim;e++){const t=r[n][e],a=this.ystep[n][e],s=this.gains[n][e];let o=this.sign(t)===this.sign(a)?.8*s:s+.2;o<.01&&(o=.01),this.gains[n][e]=o;const u=(this.iter<250?.5:.8)*a-this.epsilon*o*r[n][e];this.ystep[n][e]=u,this.Y[n][e]+=u,i[e]+=this.Y[n][e]}for(let n=0;n<e;n++)for(let t=0;t<this.dim;t++)this.Y[n][t]-=i[t]/e;return t}debugGrad(){const e=this.N,n=this.costGrad(this.Y).grad,t=1e-5;for(let r=0;r<e;r++)for(let e=0;e<this.dim;e++){const i=this.Y[r][e];this.Y[r][e]=i+t;const a=this.costGrad(this.Y);this.Y[r][e]=i-t;const s=this.costGrad(this.Y),o=n[r][e],u=(a.cost-s.cost)/(2*t);console.log(r+","+e+": gradcheck analytic: "+o+" vs. numerical: "+u),this.Y[r][e]=i}}costGrad(e){const n=this.N,t=this.dim,r=this.P,i=this.iter<100?4:1;this.quArr??(this.quArr=this.zeros(n*n));let a=0;for(let r=0;r<n;r++)for(let i=r+1;i<n;i++){const s=1/(1+new Array(t).reduce(((n,t,a)=>n+Math.pow(e[r][a]-e[i][a],2)),0));this.quArr[r*n+i]=s,this.quArr[i*n+r]=s,a+=2*s}let s=0;const o=new Array(n).fill(null).map((()=>new Float32Array(t).fill(0)));for(let u=0;u<n;u++)for(let l=u+1;l<n;l++){const c=Math.max(this.quArr[u*n+l]/a,1e-100);s+=-r[u*n+l]*Math.log(c)*2;const f=4*(i*r[u*n+l]-c)*this.quArr[u*n+l];for(let n=0;n<t;n++)o[u][n]+=f*(e[u][n]-e[l][n]),o[l][n]+=f*(e[l][n]-e[u][n])}return{cost:s,grad:o}}}t(5540);var ve=function(e,n,t,r){return new(t||(t=Promise))((function(i,a){function s(e){try{u(r.next(e))}catch(e){a(e)}}function o(e){try{u(r.throw(e))}catch(e){a(e)}}function u(e){var n;e.done?i(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(s,o)}u((r=r.apply(e,n||[])).next())}))};let Ae=null,Se=null;function Ee(){return ve(this,void 0,void 0,(function*(){if(!navigator.gpu)return console.error("WebGPU is not supported in this browser"),null;if(!Ae&&(Ae=yield navigator.gpu.requestAdapter({powerPreference:"high-performance"}),null==Ae))return null;let e=!1;if(Se&&(Se.lost.then((()=>{e=!0})),yield new Promise((e=>setTimeout(e,10)))),!Se||e){const e=1e9,n=Ae.limits,t=n.maxBufferSize,r=n.maxStorageBufferBindingSize;try{return Se=yield Ae.requestDevice({requiredLimits:{maxBufferSize:Math.min(t,e),maxStorageBufferBindingSize:Math.min(r,e)}}),Se}catch(e){return console.error("Failed to create device with required limits",e),Se=yield Ae.requestDevice(),Se}}return Se}))}var Ie,Me;(Me=Ie||(Ie={})).EUCLIDEAN="EUCLIDEAN",Me.MANHATTAN="MANHATTAN";const Ne={[Ie.EUCLIDEAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `},[Ie.MANHATTAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `}};var Pe,De;(De=Pe||(Pe={})).HAMMING="Hamming",De.EUCLIDEAN="Euclidean",De.MANHATTAN="Manhattan",De.TANIMOTO="Tanimoto",De.LEVENSTEIN="Levenshtein",De.NEEDLEMAN_WUNSCH="Needlemann-Wunsch",De.MONOMER_CHEMICAL_DISTANCE="Monomer chemical distance",De.SOKAL="Sokal",De.COSINE="Cosine",De.ASYMMETRIC="Asymmetric",De.Difference="Difference",De.OneHot="One-Hot";const Ce={[Pe.HAMMING]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[Pe.EUCLIDEAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `},[Pe.MANHATTAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `},[Pe.TANIMOTO]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `},[Pe.LEVENSTEIN]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `},[Pe.NEEDLEMAN_WUNSCH]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${e+1}u>;\n var horizontalGaps: array<u32, ${e+1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${n};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${n};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty; // accounting for the fact that left and right gaps are less costly\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${n}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0 || i == 1 || i == bLength) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0 || j == 1 || j == aLength) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(minLength);\n\n `},[Pe.MONOMER_CHEMICAL_DISTANCE]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${n}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[Pe.SOKAL]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `},[Pe.COSINE]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `},[Pe.ASYMMETRIC]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `},[Pe.Difference]:function(e,n){return`\n let range = suppInfo.range${n};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `},[Pe.OneHot]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `}},ke={[Pe.HAMMING]:e=>Math.ceil(e/30),[Pe.EUCLIDEAN]:e=>Math.ceil(e/30),[Pe.MANHATTAN]:e=>Math.ceil(e/30),[Pe.TANIMOTO]:e=>Math.ceil(e/30),[Pe.SOKAL]:e=>Math.ceil(e/30),[Pe.COSINE]:e=>Math.ceil(e/30),[Pe.ASYMMETRIC]:e=>Math.ceil(e/30),[Pe.LEVENSTEIN]:e=>Math.ceil(e*e/60),[Pe.NEEDLEMAN_WUNSCH]:e=>Math.ceil(e*e/60),[Pe.MONOMER_CHEMICAL_DISTANCE]:e=>Math.ceil(e/25),[Pe.Difference]:e=>1,[Pe.OneHot]:e=>Math.ceil(e/40)},Re={STRING:new Set([Pe.HAMMING,Pe.LEVENSTEIN,Pe.NEEDLEMAN_WUNSCH,Pe.MONOMER_CHEMICAL_DISTANCE,Pe.OneHot]),UINT32ARRAY:new Set([Pe.HAMMING,Pe.EUCLIDEAN,Pe.MANHATTAN,Pe.MONOMER_CHEMICAL_DISTANCE,Pe.LEVENSTEIN,Pe.NEEDLEMAN_WUNSCH,Pe.TANIMOTO,Pe.COSINE,Pe.SOKAL,Pe.ASYMMETRIC,Pe.OneHot,Pe.Difference]),INT32ARRAY:new Set([Pe.EUCLIDEAN,Pe.MANHATTAN,Pe.OneHot,Pe.Difference]),FLOAT32ARRAY:new Set([Pe.EUCLIDEAN,Pe.MANHATTAN,Pe.Difference]),NUMBER:new Set([Pe.EUCLIDEAN,Pe.MANHATTAN,Pe.Difference]),BITARRAY:new Set([Pe.TANIMOTO,Pe.COSINE,Pe.SOKAL,Pe.ASYMMETRIC])};var Ue,Te,Be;function Oe(e,n=15,t,r,i,a){return s=this,o=void 0,l=function*(){if(a.length!==e.length||a.length!==t.length||a.length!==i.length)throw new Error("Options, weigths and distance functions must be provided for each column");if(e.some((n=>n.length!==e[0].length)))throw new Error("All entry lists must be the same length");const s=Object.values(Pe);if(t.some((e=>!s.includes(e))))throw new Error("Invalid distance metrics provided: "+t.join(", "));if(!Object.values(Ie).includes(r))throw new Error("Invalid aggregation function provided: "+r);const o=e.length;if(0===o)throw new Error("No columns provided. Please provide at least one column of data.");const u=yield Ee();if(!u)return null;let l=!1;u.lost.then((()=>{l=!0}));const c=e[0].length,f=e.map(((e,n)=>function(e,n=Pe.HAMMING,t,r={gapOpenPenalty:1,gapExtensionPenalty:.6}){var i,a;let s=null;const o=e.some((e=>"string"==typeof e))?(s="STRING",e.map((e=>new Uint32Array(e.split("").map((e=>e.charCodeAt(0))))))):e.some((e=>"number"==typeof e))?(s="NUMBER",e.map((e=>new Float32Array([e])))):"object"==typeof e[0]&&e.some((e=>"_data"in e&&"_length"in e))?(s="BITARRAY",e.map((e=>e._data))):e.some((e=>e instanceof Float32Array))?(s="FLOAT32ARRAY",e):e.some((e=>e instanceof Uint32Array))?(s="UINT32ARRAY",e):e.some((e=>e instanceof Int32Array))?(s="INT32ARRAY",e):void 0;if(!o||!s)throw new Error("Invalid entry type, could not determine entry type from input list");const u=o[0]instanceof Int32Array?"INT32ARRAY":o[0]instanceof Float32Array?"FLOAT32ARRAY":"UINT32ARRAY",l=new Uint32Array(o.map((e=>e.length)));if(!Re[s]||!Re[s].has(n))throw new Error(`Distance metric '${n}' not supported for entry type '${s}'`);const c=l.reduce(((e,n)=>Math.max(e,n)),0),f=ke[n](c),h="INT32ARRAY"===u?Int32Array:"FLOAT32ARRAY"===u?Float32Array:Uint32Array,d=new h(o.length*c);o.forEach(((e,n)=>{d.set(e,n*c)}));let p="",g=0,m="FLOAT32ARRAY",y=null;if(n===Pe.NEEDLEMAN_WUNSCH||n===Pe.MONOMER_CHEMICAL_DISTANCE){let e=r.scoringMatrix&&r.alphabetIndexes?Object.keys(r.alphabetIndexes).reduce(((e,n)=>Math.max(e,n.charCodeAt(0))),0):-1;if(!r.alphabetIndexes||!r.scoringMatrix){for(let n=0;n<d.length;n++)d[n]>e&&(e=d[n]);r.scoringMatrix=new Array(e+1).fill(null).map((()=>new Array(e+1).fill(0))),r.alphabetIndexes={};for(let e=0;e<r.scoringMatrix.length;e++)r.scoringMatrix[e][e]=1,r.alphabetIndexes[String.fromCharCode(e)]=e}const n=(e+1)*(e+1),s=new Array(e+1).fill(null).map((()=>new Float32Array(e+1)));for(let n=0;n<e+1;n++)s[n][n]=1;const o=r.alphabetIndexes;for(const e of Object.keys(o))for(const n of Object.keys(o))e!==n&&(s[e.charCodeAt(0)][n.charCodeAt(0)]=r.scoringMatrix[o[e]][o[n]]);g=2+n,m="FLOAT32ARRAY",y=new Float32Array(g),y[0]=null!==(i=r.gapOpenPenalty)&&void 0!==i?i:1,y[1]=null!==(a=r.gapExtensionPenalty)&&void 0!==a?a:.6;let u=2;for(let e=0;e<s.length;e++)y.set(s[e],u),u+=s[e].length;p=`\n gapOpenPenalty${t}: f32,\n gapExtensionPenalty${t}: f32,\n similarityMatrix${t}: array<array<f32, ${e+1}>, ${e+1}>`}else if(n===Pe.Difference){if(!r.range||"number"!=typeof r.range||r.range<=0){const e=d.reduce(((e,n)=>Math.min(e,n)),d[0]),n=d.reduce(((e,n)=>Math.max(e,n)),d[0]);r.range=n-e}r.range<=0&&(r.range=1),g=1,m="FLOAT32ARRAY",y=new Float32Array([r.range]),p=`\n range${t}: f32`}const w=d instanceof Int32Array?"i32":d instanceof Float32Array?"f32":"u32",b=`data${t}: array<array<${w}, ${c}>, ${o.length}>`;return{flatSourceArray:d,sourceArraySize:d.length,maxEntryLen:c,arraySizes:l,complexity:f,suppInfoBuffer:y,suppInfoSize:g,suppInfoType:m,suppInfoStructWgsl:p,entryType:s,dataTypeWGSL:w,dataStructWgsl:b,EncodedArrayConstructor:h}}(e,t[n],n,a[n])));1===o&&(r=Ie.MANHATTAN);let h=f.map((e=>e.suppInfoStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),d=!1;h&&""!=h.trim()||(d=!0,h="\ndummy: f32\n");const p=f.reduce(((e,n)=>e+n.complexity),0),g=f.map((e=>e.dataStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),m=new Uint32Array(o*c);f.forEach(((e,n)=>{m.set(e.arraySizes,n*c)}));const y=1e4,w=Math.ceil(1e4/p),b=Math.ceil(Math.sqrt(Math.ceil(100))),x=10*b,v=new Array(c).fill(null).map((()=>new Uint32Array(n))),A=new Array(c).fill(null).map((()=>new Float32Array(n))),S=u.createShaderModule({label:"KNN compute shader",code:`\n // this struct will contain all the info about the computation, startAtEndAt will contain the start and end of the knnDistances and knnIndexes.\n // array of sizes for each entries, and the main data as arrays of arrays called data0, data1 and so on. good thing is that because the first entry is vec4<u32>,\n // there will be no paddings, so no need to worry about padding data. also, arrays and matrices get stucked together, so no padding there as well.\n // what we need to worry about is the padding of overall struct. the size of overall struct will be factor of 16 bytes, so keep that in mind.\n struct ComputeInfo {\n // the x coordinate will contain the start index of the knnDistances and knnIndexes, while y will contain the end index \n // the z coordinate will contain the start of the pair comparisons, while w will contain the end of the pair comparisons\n // just keep in mind that this vec4 will be in first 16 bytes of corresponding buffer.\n startAtEndAt: vec4<u32>,\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${c}>, ${o}>,\n // the weights for each entry\n weights: array<f32, ${o}>,\n // the data for each entry\n ${g} // an example of the dataWgsl would be:\n //data0: array<array<u32,20>,100>,\n //data1: array<array<u32,20>,100>\n };\n\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${h}\n };\n \n @group(0) @binding(0) var<storage, read_write> knnIndexes: array<array<u32, ${n}>, 10000>;\n @group(0) @binding(1) var<storage, read_write> knnDistances: array<array<f32, ${n}>, 10000>; // each time just compute for a subset of the list\n @group(0) @binding(2) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(3) var<storage, read_write> suppInfo: SuppInfo;\n \n @compute @workgroup_size(10, 10) fn calcKNN(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${d?"let otherDummy = suppInfo.dummy * 2;":""} // just to make sure that the suppInfo is not optimized out\n let col = id.x; //* 10 + localId.x;\n let row = id.y; //* 10 + localId.y;\n let graphIndex = row * ${x} + col;\n let index = graphIndex + computeInfo.startAtEndAt.x; // add the starting index of the knnDistances and knnIndexes\n \n if (index >= min(${c}u, computeInfo.startAtEndAt.y)) {return;}\n \n let pairComparisonStartAt = computeInfo.startAtEndAt.z;\n let pairComparisonEndAt = min(computeInfo.startAtEndAt.w, ${c}u);\n \n \n // only clear the knnDistances and knnIndexes if we are at the start of the pair comparison\n if (pairComparisonStartAt == 0u) {\n for (var i = 0u; i < ${n}; i = i + 1u) {\n knnDistances[graphIndex][i] = 99999.0;\n knnIndexes[graphIndex][i] = 0u;\n }\n }\n \n for (var i: u32 = pairComparisonStartAt; i < pairComparisonEndAt; i = i + 1u) {\n if (i == index) {continue;}\n let dist = combinedDistance(index, i);\n insertKnn(graphIndex, dist, i);\n }\n \n }\n // this will generate the distance script for each distance metric and then combine them into one\n ${ze(t,f.map((e=>e.maxEntryLen)),n,r)}\n \n fn insertKnn(knnIndex: u32, dist: f32, index: u32) {\n // small optimization, if the distance is larger than the last element in the knnDistances, we can skip\n if (dist >= knnDistances[knnIndex][${n} - 1u]) {return;}\n for (var i = 0u; i < ${n}; i = i + 1u) {\n if (dist < knnDistances[knnIndex][i]) {\n for (var j = ${n} - 1u; j > i; j = j - 1u) {\n knnDistances[knnIndex][j] = knnDistances[knnIndex][j - 1u];\n knnIndexes[knnIndex][j] = knnIndexes[knnIndex][j - 1u];\n }\n knnDistances[knnIndex][i] = dist;\n knnIndexes[knnIndex][i] = index;\n return;\n }\n }\n }\n `}),E=u.createComputePipeline({label:"hamming compute pipeline",layout:"auto",compute:{module:S,entryPoint:"calcKNN"}}),I=4+o*c+o+f.reduce(((e,n)=>e+n.sourceArraySize),0),M=f.reduce(((e,n)=>e+n.suppInfoSize),0),N=I*Uint32Array.BYTES_PER_ELEMENT;let P=N;const D=15&N;0!==D&&(P+=16-D);const C=u.createBuffer({label:"compute info buffer",size:P,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),k=C.getMappedRange();let R=0,U=y,T=0,B=w,O=0;new Uint32Array(k,O,4).set([R,U,T,B]),O+=4*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(k,O,m.length).set(m),O+=m.byteLength,new Float32Array(k,O,o).set(i),O+=o*Float32Array.BYTES_PER_ELEMENT;for(const e of f){const n=e.EncodedArrayConstructor,t=e.sourceArraySize;new n(k,O,t).set(e.flatSourceArray),O+=t*n.BYTES_PER_ELEMENT}C.unmap();const z=M*Uint32Array.BYTES_PER_ELEMENT;let _=z;const L=15&z;0!==L&&(_+=16-L),_=Math.max(_,16);const G=u.createBuffer({label:"supp info buffer",size:_,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),$=G.getMappedRange();let F=0;for(const e of f)e.suppInfoBuffer&&e.suppInfoBuffer.byteLength>0&&e.suppInfoSize>0&&(new("UINT32ARRAY"===e.suppInfoType?Uint32Array:Float32Array)($,F,e.suppInfoBuffer.length).set(e.suppInfoBuffer),F+=e.suppInfoBuffer.byteLength);0===F&&new Uint32Array($,0,4).set([1,1,1,1]),G.unmap();const j=n*Uint32Array.BYTES_PER_ELEMENT*y,Y=u.createBuffer({label:"buffer distances",size:j,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),V=u.createBuffer({label:"buffer indexes",size:j,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),K=n*Uint32Array.BYTES_PER_ELEMENT,q=u.createBindGroup({label:"bindGroup for knn buffer",layout:E.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:V}},{binding:1,resource:{buffer:Y}},{binding:2,resource:{buffer:C}},{binding:3,resource:{buffer:G}}]}),W=u.createBuffer({label:"result buffer distances",size:Y.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),H=u.createBuffer({label:"result buffer indexes",size:V.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let e=0;e<Math.ceil(c/y);e++){R=e*y,U=Math.min((e+1)*y,c);const t=Math.ceil(c/w);for(let e=0;e<t;e++){T=e*w,B=Math.min((e+1)*w,c),u.queue.writeBuffer(C,0,new Uint32Array([R,U,T,B]));const r=u.createCommandEncoder({label:"distance encoder"}),i=r.beginComputePass({label:"distance compute pass"});if(i.setPipeline(E),i.setBindGroup(0,q),i.dispatchWorkgroups(b,Math.ceil(y/b/100)),i.end(),e===t-1){r.copyBufferToBuffer(Y,0,W,0,W.size),r.copyBufferToBuffer(V,0,H,0,H.size);const e=r.finish();u.queue.submit([e]),yield u.queue.onSubmittedWorkDone(),yield W.mapAsync(GPUMapMode.READ),yield H.mapAsync(GPUMapMode.READ);const t=H.getMappedRange(),i=W.getMappedRange();for(let e=0;e<U-R;e++){const r=new Uint32Array(t,e*K,n),a=new Float32Array(i,e*K,n);v[R+e].set(r),A[R+e].set(a)}H.unmap(),W.unmap()}else{const e=r.finish();u.queue.submit([e]),yield u.queue.onSubmittedWorkDone()}if(l)return null}}return Y.destroy(),V.destroy(),C.destroy(),G.destroy(),W.destroy(),H.destroy(),l?null:{knnIndexes:v,knnDistances:A}},new((u=void 0)||(u=Promise))((function(e,n){function t(e){try{i(l.next(e))}catch(e){n(e)}}function r(e){try{i(l.throw(e))}catch(e){n(e)}}function i(n){var i;n.done?e(n.value):(i=n.value,i instanceof u?i:new u((function(e){e(i)}))).then(t,r)}i((l=l.apply(s,o||[])).next())}));var s,o,u,l}function ze(e,n,t,r){return e.map(((e,r)=>`\n fn distanceScript${r}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${r}[aIndex];\n let b = computeInfo.data${r}[bIndex];\n let maxDistance: f32 = knnDistances[aIndex - computeInfo.startAtEndAt.x][${t} - 1u];\n ${Ce[e](n[r],r)}\n }\n `)).join("\n")+"\n"+`\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${e.length}>;\n ${e.map(((e,n)=>`distances[${n}] = distanceScript${n}(aIndex, bIndex);`)).join("\n")}\n ${Ne[r](e.length)}\n }\n \n `}!function(e){e.ADD="ADD",e.SUB="SUB",e.MULT="MULT"}(Ue||(Ue={})),function(e){e.SQUARE="SQUARE",e.INVERSE="INVERSE",e.TRANSPOSE="TRANSPOSE",e.NORM="NORM",e.COLUMN_NORM="COLUMN_NORM"}(Te||(Te={})),function(e){e.SCALARMULT="SCALARMULT",e.SCALARADD="SCALARADD",e.SCALARPOW="SCALARPOW"}(Be||(Be={}));var _e=function(e,n,t,r){return new(t||(t=Promise))((function(i,a){function s(e){try{u(r.next(e))}catch(e){a(e)}}function o(e){try{u(r.throw(e))}catch(e){a(e)}}function u(e){var n;e.done?i(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(s,o)}u((r=r.apply(e,n||[])).next())}))};function Le(e,n,t,r,i,a,s,o,u){return _e(this,void 0,void 0,(function*(){const l=Math.ceil(s/100),c=Math.ceil(Math.sqrt(l)),f=10*c,h=t[t.length-1],d=a[a.length-1],p=o[o.length-1],g=`\n struct SparseKNNStorage1 {\n indexes:array<i32, ${h}>,\n knnDistances: array<f32, ${h}>,\n offsets: array<u32, ${s+1}>\n }\n\n struct SparseKNNStorage2 {\n indexes:array<i32, ${d}>,\n knnDistances: array<f32, ${d}>,\n offsets: array<u32, ${s+1}>\n }\n\n struct ResKnn {\n knnIndexes: array<i32, ${p}>,\n knnDistances: array<f32, ${p}>\n }\n\n @group(0) @binding(0) var<storage, read_write> source1: SparseKNNStorage1;\n @group(0) @binding(1) var<storage, read_write> source2: SparseKNNStorage2;\n @group(0) @binding(2) var<storage, read_write> result: ResKnn;\n @group(0) @binding(3) var<storage, read_write> unionMatrixOffsets: array<u32, ${s+1}>;\n @compute @workgroup_size(10, 10) fn pairwiseOp(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n\n let col: u32 = id.x;\n let row: u32 = id.y;\n let workingIndex: u32 = row * ${f} + col;\n\n if (workingIndex >= ${s}) {\n return;\n }\n var curUnionOffset: u32 = unionMatrixOffsets[workingIndex]; // offset at which to start writing in union matrix\n\n let start1 = source1.offsets[workingIndex];\n let end1 = source1.offsets[workingIndex + 1];\n let start2 = source2.offsets[workingIndex];\n let end2 = source2.offsets[workingIndex + 1];\n // TODO: sort a copy of these arrays, will make operation faster\n for (var i: u32 = start1; i < end1; i++) {\n let val1: f32 = source1.knnDistances[i];\n var val2: f32 = 0.0;\n let curIndex: i32 = source1.indexes[i];\n for (var j: u32 = start2; j < end2; j++) {\n if (source2.indexes[j] == curIndex) {\n val2 = source2.knnDistances[j];\n break;\n }\n }\n \n result.knnIndexes[curUnionOffset] = curIndex;\n result.knnDistances[curUnionOffset] = val1 ${u} val2;\n curUnionOffset += 1;\n }\n\n if (curUnionOffset >= unionMatrixOffsets[workingIndex + 1]) {\n // small optimization applicable only to our case, but saves a good amount of time\n return;\n }\n\n // do the same for source2 but skip the indexes where they are already present in source1\n for (var i: u32 = start2; i < end2; i++) {\n let val1: f32 = source2.knnDistances[i];\n let curIndex: i32 = source2.indexes[i];\n var found = false;\n for (var j: u32 = start1; j < end1; j++) {\n if (source1.indexes[j] == curIndex) {\n found = true;\n break;\n }\n }\n if (!found) {\n result.knnIndexes[curUnionOffset] = curIndex;\n result.knnDistances[curUnionOffset] = val1 ${u} 0.0;\n curUnionOffset += 1;\n }\n }\n }\n`;let m=4*(2*h+s+1);const y=15&m;0!==y&&(m+=16-y);let w=4*(2*d+s+1);const b=15&w;0!==b&&(w+=16-b);let x=2*p*4;const v=15&x;0!==v&&(x+=16-v);const A=yield Ee();if(null==A)return;const S=A.createShaderModule({label:"pairwiseOpShader",code:g}),E=A.createComputePipeline({label:"pairwiseOpPipeline",layout:"auto",compute:{module:S,entryPoint:"pairwiseOp"}}),I=A.createBuffer({label:"source 1 buffer",size:m,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),M=I.getMappedRange();new Int32Array(M,0,h).set(e),new Float32Array(M,4*h,h).set(n),new Uint32Array(M,8*h,s+1).set(t),I.unmap();const N=A.createBuffer({label:"source 2 buffer",size:w,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),P=N.getMappedRange();new Int32Array(P,0,d).set(r),new Float32Array(P,4*d,d).set(i),new Uint32Array(P,8*d,s+1).set(a),N.unmap();const D=A.createBuffer({label:"res buffer",size:x,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),C=A.createBuffer({label:"union matrix offsets buffer",size:4*(s+1),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),k=C.getMappedRange();new Uint32Array(k).set(o),C.unmap();const R=A.createBindGroup({label:"bindGroup for pairwise ops",layout:E.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:I}},{binding:1,resource:{buffer:N}},{binding:2,resource:{buffer:D}},{binding:3,resource:{buffer:C}}]}),U=A.createCommandEncoder({label:"matrix ops encoder"}),T=U.beginComputePass({label:"matrix ops compute pass"});T.setPipeline(E),T.setBindGroup(0,R),T.dispatchWorkgroups(c,c),T.end();const B=A.createBuffer({label:"result buffer",size:x,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});U.copyBufferToBuffer(D,0,B,0,B.size);const O=U.finish();A.queue.submit([O]),yield A.queue.onSubmittedWorkDone(),yield B.mapAsync(GPUMapMode.READ);const z=B.getMappedRange(),_=new Int32Array(p),L=new Float32Array(p);return _.set(new Int32Array(z,0,p)),L.set(new Float32Array(z,4*p,p)),B.unmap(),B.destroy(),I.destroy(),N.destroy(),D.destroy(),C.destroy(),{resultKnnIndexes:_,resultKnnDistances:L}}))}var Ge=t(788);function $e(e,n,t,r){let i=0;const a=t(n);for(let n=0;n<e.x.length;n++)i+=Math.pow(e.y[n]-a(e.x[n]),2)/r[n];return i}function Fe(e,n,t,r,i,a,s){let o=t,u=oe.uq.eye(n.length,n.length,o);const l=i(n);let c=new Float64Array(e.x.length);for(let n=0;n<e.x.length;n++)c[n]=l(e.x[n]);let f=function(e,n,t,r,i,a){const s=t.length,o=e.x.length;let u=oe.uq.zeros(s,o),l=0;for(let c=0;c<s;c++){if(0===r[c])continue;let s=r[c],f=t.slice();f[c]+=s;let h=i(f);if(a){f=t.slice(),f[c]-=s,s*=2;let n=i(f);for(let t=0;t<o;t++)u.set(l,t,(n(e.x[t])-h(e.x[t]))/s)}else for(let t=0;t<o;t++)u.set(l,t,(n[t]-h(e.x[t]))/s);l++}return u}(e,c,n,r,i,a),h=function(e,n){const t=e.x.length;let r=new oe.uq(t,1);for(let i=0;i<t;i++)r.set(i,0,e.y[i]-n[i]);return r}(e,c),d=(0,oe.DI)(u.add(f.mmul(f.transpose().scale("row",{scale:s})))),p=f.mmul(h.scale("row",{scale:s}));return{perturbations:d.mmul(p),jacobianWeightResidualError:p}}function je(e,n){const t=function(e,n){const t=(n-0)/299;return Array.from({length:300},((e,n)=>0+t*n))}(0,3*e).map((e=>e<n?1:e)),r=new Array(t.length).fill(0).map(((r,i)=>t[i]>=n?Math.exp(-(t[i]-n)/e):r)),i={x:t,y:r},{parameterValues:a}=function(e,n,t){let{checkTimeout:r,minValues:i,maxValues:a,parameters:s,weightSquare:o,damping:u,dampingStepUp:l,dampingStepDown:c,maxIterations:f,errorTolerance:h,centralDifference:d,gradientDifference:p,improvementThreshold:g}=function(e,n,t){let{timeout:r,minValues:i,maxValues:a,initialValues:s,weights:o=1,damping:u=.01,dampingStepUp:l=11,dampingStepDown:c=9,maxIterations:f=100,errorTolerance:h=1e-7,centralDifference:d=!1,gradientDifference:p=.1,improvementThreshold:g=.001}=t;if(u<=0)throw new Error("The damping option must be a positive number");if(!e.x||!e.y)throw new Error("The data parameter must have x and y elements");if(!(0,Ge.isAnyArray)(e.x)||e.x.length<2||!(0,Ge.isAnyArray)(e.y)||e.y.length<2)throw new Error("The data parameter elements must be an array with more than 2 points");if(e.x.length!==e.y.length)throw new Error("The data parameter elements must have the same size");if(!(s&&s.length>0))throw new Error("The initialValues option is mandatory and must be an array");let m,y,w=s,b=e.y.length,x=w.length;if(a=a||new Array(x).fill(Number.MAX_SAFE_INTEGER),i=i||new Array(x).fill(Number.MIN_SAFE_INTEGER),a.length!==i.length)throw new Error("minValues and maxValues must be the same size");if("number"==typeof p)p=new Array(w.length).fill(p);else{if(!(0,Ge.isAnyArray)(p))throw new Error("gradientDifference should be a number or array with length equal to the number of parameters");p.length!==x&&(p=new Array(x).fill(p[0]))}if("number"==typeof o){let e=1/o**2;m=()=>e}else{if(!(0,Ge.isAnyArray)(o))throw new Error("weights should be a number or array with length equal to the number of data points");if(o.length<e.x.length){let e=1/o[0]**2;m=()=>e}else m=e=>1/o[e]**2}if(void 0!==r){if("number"!=typeof r)throw new Error("timeout should be a number");let e=Date.now()+1e3*r;y=()=>Date.now()>e}else y=()=>!1;let v=new Array(e.x.length);for(let e=0;e<b;e++)v[e]=m(e);return{checkTimeout:y,minValues:i,maxValues:a,parameters:w,weightSquare:v,damping:u,dampingStepUp:l,dampingStepDown:c,maxIterations:f,errorTolerance:h,centralDifference:d,gradientDifference:p,improvementThreshold:g}}(e,0,t),m=$e(e,s,n,o),y=m,w=s.slice(),b=m<=h,x=0;for(;x<f&&!b;x++){let f=m,{perturbations:x,jacobianWeightResidualError:v}=Fe(e,s,u,p,n,d,o);for(let e=0;e<s.length;e++)s[e]=Math.min(Math.max(i[e],s[e]-x.get(e,0)),a[e]);if(m=$e(e,s,n,o),isNaN(m))break;if(m<y-h&&(y=m,w=s.slice()),u=(f-m)/x.transpose().mmul(x.mul(u).add(v)).get(0,0)>g?Math.max(u/c,1e-7):Math.min(u*l,1e7),r())throw new Error(`The execution time is over to ${t.timeout} seconds`);b=m<=h}return{parameterValues:w,parameterError:y,iterations:x}}(i,(([e,n])=>t=>1/(1+e*Math.pow(t,2*n))),{damping:1.5,initialValues:[.5,.5],gradientDifference:.1,maxIterations:100,errorTolerance:.01}),[s,o]=a;return{a:s,b:o}}function Ye(e){const n=new Uint32Array(e.length+1);let t=0;for(let r=0;r<e.length;r++)n[r]=t,t+=e[r];return n[e.length]=t,n}function Ve(e,n){for(let t=0;t<e.length;t++)e[t]=e[t]*n}function Ke(e,n,t=1){return r=this,i=void 0,s=function*(){const r=new Int32Array(e.length*e[0].length),i=new Float32Array(n.length*n[0].length);for(let t=0;t<e.length;t++)r.set(e[t],t*e[t].length),i.set(n[t],t*n[t].length);const a=yield function(e){return n=this,t=void 0,i=function*(){const n=e.length,t=Math.ceil(n/100),r=Math.ceil(Math.sqrt(t)),i=e[0].length,a=function(e,n,t,r=15){return`\n\n @group(0) @binding(0) var<storage, read_write> knnIndexes: array<array<i32, ${r}>, ${t}>;\n @group(0) @binding(1) var<storage, read_write> resTransposedSizes: array<atomic<u32>, ${t}>;\n // this array will store the union of knn and its transpose sizes per index. should be initialized to knnSize each.\n @group(0) @binding(2) var<storage, read_write> resUnionMatrixSizes: array<atomic<u32>, ${t}>;\n\n @compute @workgroup_size(${e}, ${e}) fn countTransposedCols(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col: u32 = id.x;\n let row: u32 = id.y;\n let workingIndex: u32 = row * ${n} + col;\n\n if (workingIndex >= ${t}) {\n return;\n }\n \n for (var i = 0u; i < ${r}u; i++) {\n let otherIndex: i32 = knnIndexes[workingIndex][i];\n if (otherIndex != -1 && otherIndex < ${t}) {\n atomicAdd(&resTransposedSizes[otherIndex], 1u);\n atomicAdd(&resUnionMatrixSizes[otherIndex], 1u);\n let otherIndexes = &knnIndexes[otherIndex];\n for(var j = 0u; j < ${r}; j++) {\n if ((*otherIndexes)[j] == i32(workingIndex)) {\n atomicSub(&resUnionMatrixSizes[workingIndex], 1u);\n // if same is found in other array, decrement by one;\n break;\n }\n }\n }\n\n }\n }\n `}(10,10*r,n,i),s=n*e[0].length,o=yield Ee();if(null==o)return;const u=o.createShaderModule({label:"transposedSizesCalulation",code:a}),l=o.createComputePipeline({label:"transposedSizesPipeline",layout:"auto",compute:{module:u,entryPoint:"countTransposedCols"}}),c=o.createBuffer({label:"indexes buffer",size:4*s,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),f=c.getMappedRange(),h=new Int32Array(f);for(let n=0;n<e.length;n++)h.set(e[n],n*e[n].length);c.unmap();const d=o.createBuffer({label:"transpose sizes buffer",size:4*e.length,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),p=o.createBuffer({label:"union sizes buffer",size:4*e.length,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),g=p.getMappedRange();new Uint32Array(g).fill(i),p.unmap();const m=o.createBindGroup({label:"bindGroup for count ops",layout:l.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:c}},{binding:1,resource:{buffer:d}},{binding:2,resource:{buffer:p}}]}),y=o.createCommandEncoder({label:"matrix ops encoder"}),w=y.beginComputePass({label:"matrix ops compute pass"});w.setPipeline(l),w.setBindGroup(0,m),w.dispatchWorkgroups(r,r),w.end();const b=o.createBuffer({label:"result transpose sizes",size:d.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),x=o.createBuffer({label:"result union sizes",size:p.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});y.copyBufferToBuffer(d,0,b,0,b.size),y.copyBufferToBuffer(p,0,x,0,x.size);const v=y.finish();o.queue.submit([v]),yield o.queue.onSubmittedWorkDone(),yield b.mapAsync(GPUMapMode.READ),yield x.mapAsync(GPUMapMode.READ);const A=b.getMappedRange(),S=x.getMappedRange(),E=new Uint32Array(e.length);E.set(new Uint32Array(A,0,e.length)),b.unmap();const I=new Uint32Array(e.length);I.set(new Uint32Array(S,0,e.length)),x.unmap();const M=I.reduce(((e,n)=>e+n),0);return x.destroy(),b.destroy(),d.destroy(),c.destroy(),p.destroy(),{resultTransposeSizesArray:E,resultUnionSizesArray:I,unionMatrixSize:M}},new((r=void 0)||(r=Promise))((function(e,a){function s(e){try{u(i.next(e))}catch(e){a(e)}}function o(e){try{u(i.throw(e))}catch(e){a(e)}}function u(n){var t;n.done?e(n.value):(t=n.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}u((i=i.apply(n,t||[])).next())}));var n,t,r,i}(e),s=e.length,o=yield function(e,n,t,r=15){return i=this,a=void 0,o=function*(){const i=e.length,a=r*i,s=Ye(t.resultTransposeSizesArray),o=new Uint32Array(s.length);o.set(s);const u=new Int32Array(a).fill(0),l=new Float32Array(a).fill(0);for(let t=0;t<i;t++)for(let i=0;i<r;i++){const r=e[t][i],a=o[r];u[a]=t,l[a]=n[t][i],o[r]+=1}return{transposeKNNIndexes:u,transposeKNNDistances:l,transposeOffsets:s}},new((s=void 0)||(s=Promise))((function(e,n){function t(e){try{u(o.next(e))}catch(e){n(e)}}function r(e){try{u(o.throw(e))}catch(e){n(e)}}function u(n){var i;n.done?e(n.value):(i=n.value,i instanceof s?i:new s((function(e){e(i)}))).then(t,r)}u((o=o.apply(i,a||[])).next())}));var i,a,s,o}(e,n,a,n[0].length),u=Ye(new Uint32Array(s).fill(e[0].length)),l=Ye(a.resultUnionSizesArray),c=yield Le(r,i,u,o.transposeKNNIndexes,o.transposeKNNDistances,o.transposeOffsets,s,l,"*"),f=yield Le(r,i,u,o.transposeKNNIndexes,o.transposeKNNDistances,o.transposeOffsets,s,l,"+"),h=yield Le(f.resultKnnIndexes,f.resultKnnDistances,l,c.resultKnnIndexes,c.resultKnnDistances,l,s,l,"-");return 1!==t?(Ve(h.resultKnnDistances,t),Ve(c.resultKnnDistances,1-t),{res:yield Le(h.resultKnnIndexes,h.resultKnnDistances,l,c.resultKnnIndexes,c.resultKnnDistances,l,s,l,"+"),unionMatrixOffsets:l}):{res:h,unionMatrixOffsets:l,unionSizes:a.resultUnionSizesArray}},new((a=void 0)||(a=Promise))((function(e,n){function t(e){try{u(s.next(e))}catch(e){n(e)}}function o(e){try{u(s.throw(e))}catch(e){n(e)}}function u(n){var r;n.done?e(n.value):(r=n.value,r instanceof a?r:new a((function(e){e(r)}))).then(t,o)}u((s=s.apply(r,i||[])).next())}));var r,i,a,s}function qe(e,n=15,t=1,r=64,i=1){return a=this,s=void 0,u=function*(){const a=e.length,s=Math.ceil(a/100),o=Math.ceil(Math.sqrt(s)),u=function(e=10,n,t,r=15,i=1,a=64,s=1){const o=t.length;let u=0;for(let e=0;e<o;e++){let n=0;for(let i=0;i<r;i++)n+=t[e][i];u+=n/r}return` \n var<private> SMOOTH_K_TOLERANCE: f32 = 1e-5;\n var<private> MIN_K_DIST_SCALE: f32 = 1e-3;\n var<private> nNeighbors: u32 = ${r};\n var<private> localConnectivity: f32 = ${i}; \n var<private> nIter: u32 = ${a};\n var<private> bandwidth: u32 = ${s};\n var<private> meanDistances: f32 = ${u/o};\n var<private> targetValue: f32 = ${Math.log(r)/Math.log(2)*s};\n @group(0) @binding(0) var<storage, read_write> sigmas: array<f32, ${o}>;\n @group(0) @binding(1) var<storage, read_write> rhos: array<f32, ${o}>;\n @group(0) @binding(2) var<storage, read> distances: array<array<f32, ${r}>, ${o}>;\n @compute @workgroup_size(${e}, ${e}) fn smoothKNNDistance(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col: u32 = id.x;\n let row: u32 = id.y;\n let workingIndex: u32 = row * ${n} + col;\n\n if (workingIndex >= ${o}) {\n return;\n }\n\n var lo: f32 = 0.0;\n var hi: f32 = 1.0e+30; // treated as Infinity\n var mid: f32 = 1.0;\n\n var nonZeroDists: array<f32, ${r}>;\n var nonZeroDistsSize: u32 = 0;\n for (var j = 0u; j < nNeighbors; j = j + 1u) {\n if (distances[workingIndex][j] > 0.0) {\n nonZeroDists[nonZeroDistsSize] = distances[workingIndex][j];\n nonZeroDistsSize = nonZeroDistsSize + 1u;\n }\n }\n\n if (f32(nonZeroDistsSize) >= localConnectivity) {\n let index: u32 = u32(floor(localConnectivity));\n let interpolation: f32 = localConnectivity - f32(index);\n if (index > 0) {\n rhos[workingIndex] = nonZeroDists[index - 1];\n if (interpolation > SMOOTH_K_TOLERANCE) {\n rhos[workingIndex] += interpolation * (nonZeroDists[index] - nonZeroDists[index - 1]);\n }\n }\n else {\n rhos[workingIndex] = interpolation * nonZeroDists[0];\n }\n }\n else if (nonZeroDistsSize > 0u) {\n var maxDist: f32 = 0.0;\n for (var j = 0u; j < nonZeroDistsSize; j = j + 1u) {\n maxDist = max(nonZeroDists[j], maxDist);\n }\n rhos[workingIndex] = maxDist;\n }\n\n for (var n = 0u; n < nIter; n = n + 1u) {\n var psum: f32 = 0.0;\n for (var j = 1u; j < ${r}; j = j + 1u) {\n let d: f32 = distances[workingIndex][j] - rhos[workingIndex];\n if (d > 0.0) {\n psum += exp(0.0 - (d / mid));\n }\n else {\n psum += 1.0;\n }\n }\n\n if (abs(psum - targetValue) < SMOOTH_K_TOLERANCE) {\n break;\n }\n\n if (psum > targetValue) {\n hi = mid;\n mid = (lo + hi) / 2.0;\n }\n else {\n lo = mid;\n if (hi == 1.0e+30) {\n mid *= 2.0;\n }\n else {\n mid = (lo + hi) / 2.0;\n }\n }\n }\n\n sigmas[workingIndex] = mid;\n\n if (rhos[workingIndex] > 0.0) {\n var sum: f32 = 0.0;\n for (var j = 0u; j < ${r}; j = j + 1u) {\n sum += distances[workingIndex][j];\n }\n let meanIthDistances: f32 = sum / ${r}.0;\n if (sigmas[workingIndex] < MIN_K_DIST_SCALE * meanIthDistances) {\n sigmas[workingIndex] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n }\n else {\n if (sigmas[workingIndex] < MIN_K_DIST_SCALE * meanDistances) {\n sigmas[workingIndex] = MIN_K_DIST_SCALE * meanDistances;\n }\n }\n }\n `}(10,10*o,e,n,t,r,i),l=a*e[0].length,c=yield Ee();if(null==c)return;const f=new Float32Array(a),h=new Float32Array(a),d=c.createShaderModule({label:"sigmaRhoCalulation",code:u}),p=c.createComputePipeline({label:"sigmaRhoPipeline",layout:"auto",compute:{module:d,entryPoint:"smoothKNNDistance"}}),g=c.createBuffer({label:"distance buffer",size:4*l,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),m=g.getMappedRange(),y=new Float32Array(m);for(let n=0;n<e.length;n++)y.set(e[n],n*e[n].length);g.unmap();const w=c.createBuffer({label:"buffer sigmas",size:4*a,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),b=c.createBuffer({label:"buffer Rhos",size:4*a,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),x=c.createBindGroup({label:"bindGroup for sigmarho buffers",layout:p.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:w}},{binding:1,resource:{buffer:b}},{binding:2,resource:{buffer:g}}]}),v=c.createCommandEncoder({label:"sigmarho encoder"}),A=v.beginComputePass({label:"sigmarho compute pass"});A.setPipeline(p),A.setBindGroup(0,x),A.dispatchWorkgroups(o,o),A.end();const S=c.createBuffer({label:"result buffer rhos",size:b.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),E=c.createBuffer({label:"result buffer sigmas",size:w.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});v.copyBufferToBuffer(b,0,S,0,S.size),v.copyBufferToBuffer(w,0,E,0,E.size);const I=v.finish();return c.queue.submit([I]),yield c.queue.onSubmittedWorkDone(),yield S.mapAsync(GPUMapMode.READ),yield E.mapAsync(GPUMapMode.READ),h.set(new Float32Array(S.getMappedRange())),f.set(new Float32Array(E.getMappedRange())),S.unmap(),E.unmap(),g.destroy(),w.destroy(),b.destroy(),S.destroy(),E.destroy(),{resultRhos:h,resultSigmas:f}},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{i(u.next(e))}catch(e){n(e)}}function r(e){try{i(u.throw(e))}catch(e){n(e)}}function i(n){var i;n.done?e(n.value):(i=n.value,i instanceof o?i:new o((function(e){e(i)}))).then(t,r)}i((u=u.apply(a,s||[])).next())}));var a,s,o,u}var We=function(e,n,t,r){return new(t||(t=Promise))((function(i,a){function s(e){try{u(r.next(e))}catch(e){a(e)}}function o(e){try{u(r.throw(e))}catch(e){a(e)}}function u(e){var n;e.done?i(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(s,o)}u((r=r.apply(e,n||[])).next())}))};class He{constructor(){this.nComponents=2,this.gamma=1,this.alpha=1,this.entryLen=0,this.nNeighbours=15,this.spread=1,this.minDist=.1,this.negativeSampleRate=5,this.localConnectivity=1,this.setOpMixRatio=1}}class Ze{constructor(e,n){this.params=new He,this.knnIndexes=null,this.knnDistances=null,this.rhos=null,this.sigmas=null,this.membershipStrengths=null,this.params.entryLen=e,Object.assign(this.params,n)}setPrecomputedKNN(e,n){this.knnIndexes=e,this.knnDistances=n}initializeFit(){return We(this,void 0,void 0,(function*(){yield this.calcSmoothKNNDistances(),yield this.calcMembershipStrengths()}))}fit(){return We(this,void 0,void 0,(function*(){yield this.initializeFit();const e=yield this.initializeSimplicialSetEmbedding();if(!e)throw new Error("failed to compute umap simplistical set embeddings");const{head:n,tail:t,epochsPerSample:r,epochsPerNegativeSample:i,a,b:s,gamma:o,initialAlpha:u,nComponents:l,nEpochs:c,entryLen:f}=e,h=yield function(e,n,t,r,i,a,s,o,u,l,c,f){return h=this,d=void 0,g=function*(){const h=Math.ceil(e.length/100),d=Math.ceil(Math.sqrt(h)),p=10*d,g=yield Ee();if(!g)return;const m=1e7,y=e.length,w=function(e,n,t,r,i,a,s,o,u,l,c,f,h=1e5){return`\n// first define some functions\n\nfn rDist(ar1: array<f32, ${o}>, ar2: array<f32, ${o}>) -> f32 {\n var res = 0.0;\n for (var i1 = 0u; i1 < ${o}; i1++) {\n let diff = ar1[i1] - ar2[i1];\n res += pow(diff, 2);\n }\n return res;\n}\n\nfn clip(x: f32, clipValue: f32) -> f32 {\n if (x > clipValue) {\n return clipValue;\n }\n else if (x < 0.0 - clipValue) {\n return 0.0 - clipValue;\n }\n return x;\n}\n\nvar<private> randomSeedInt: u32 = 0;\nvar<private> nVertices: u32 = ${l};\nvar<private> initialAlpha: f32 = ${r};\nvar<private> gamma: f32 = ${i};\nvar<private> a: f32 = ${a};\nvar<private> b: f32 = ${s};\nvar<private> dim: u32 = ${o};\nvar<private> nEpochs: f32 = ${u};\nvar<private> moveOther: u32 = 1;\n\nfn random() -> u32 {\n randomSeedInt = (randomSeedInt ^ 61) ^ (randomSeedInt >> 16);\n randomSeedInt *= 9;\n randomSeedInt = randomSeedInt ^ (randomSeedInt >> 4);\n randomSeedInt *= 0x27d4eb2d;\n randomSeedInt = randomSeedInt ^ (randomSeedInt >> 15);\n return randomSeedInt;\n}\n\nfn randInt(maxVal: u32) -> u32 {\n let nextRandomNum = random();\n return u32(floor((f32(nextRandomNum) * (f32(maxVal) / 4294967296.0))));\n}\n\nstruct MatrixStorage {\n head: array<u32, ${e}>,\n tail: array<u32, ${e}>,\n}\n\nstruct EpochStorage {\n epochsPerSample: array<f32, ${e}>,\n epochOfNextSample: array<f32, ${e}>,\n epochsPerNegativeSample: array<f32, ${e}>,\n epochOfNextNegativeSample: array<f32, ${e}>\n}\n\nstruct EmbeddingStorage {\n // embeddings will be in range of -10 to 10, as atomics only can store i32 or u32, we will store them as floor(f32 * 100_000)\n headEmbeddings: array<array<atomic<i32>, ${o}>, ${n}>,\n tailEmbeddings: array<array<atomic<i32>, ${o}>, ${n}>\n}\n\nstruct ComputeInfo {\n n: f32,\n alpha: f32,\n randomNumbers: array<u32, ${e}>,\n //tailOffsets: array<u32, ${n+1}>\n}\n @group(0) @binding(0) var<storage, read_write> matrixStorage: MatrixStorage;\n @group(0) @binding(1) var<storage, read_write> epochStorage: EpochStorage;\n @group(0) @binding(2) var<storage, read_write> embedStorage: EmbeddingStorage;\n @group(0) @binding(3) var<storage, read_write> computeInfo: ComputeInfo;\n @compute @workgroup_size(${c}, ${c}) fn optimizeStep(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let divisionFactor: f32 = ${h};\n let col: u32 = id.x;\n let row: u32 = id.y;\n let threadIndex: u32 = row * ${f} + col;\n let clipValue: f32 = 4.0;\n\n if (threadIndex >= ${e}) {\n return;\n }\n\n let workingIndex = threadIndex;\n //let startAtOffset = computeInfo.tailOffsets[threadIndex];\n //let endAtOffset = computeInfo.tailOffsets[threadIndex + 1];\n //for (var workingIndex = startAtOffset; workingIndex < endAtOffset; workingIndex++) {\n randomSeedInt = computeInfo.randomNumbers[workingIndex] * u32(computeInfo.n);\n\n let epochOfNextSample = epochStorage.epochOfNextSample[workingIndex];\n if (epochOfNextSample > computeInfo.n) {\n return;\n }\n\n let j = matrixStorage.head[workingIndex];\n let k = matrixStorage.tail[workingIndex];\n\n // as said before, we will store embeddings as floor(f32 * 100_000)\n var current: array<f32, ${o}>;\n var other: array<f32, ${o}>;\n for (var i = 0u; i < ${o}u; i++) {\n current[i] = f32(atomicLoad(&embedStorage.headEmbeddings[j][i])) / divisionFactor;\n other[i] = f32(atomicLoad(&embedStorage.tailEmbeddings[k][i])) / divisionFactor;\n }\n\n let distSquared = rDist(current, other);\n \n var gradCoeff: f32 = 0.0;\n if (distSquared > 0.0) {\n gradCoeff = (0.0 - 2.0) * ${a} * ${s} * pow(distSquared, b - 1.0);\n gradCoeff /= (a * pow(distSquared, b) + 1.0);\n }\n\n var gradBuff: array<i32, ${o}>;\n for (var d = 0u; d < ${o}u; d++) {\n let gradD = clip((gradCoeff * (current[d] - other[d])), clipValue);\n let toAdd = gradD * computeInfo.alpha;\n gradBuff[d] = i32(floor(toAdd * divisionFactor));\n current[d] += toAdd;\n other[d] -= toAdd;\n }\n\n for (var d = 0u; d < ${o}u; d++) {\n atomicAdd(&embedStorage.headEmbeddings[j][d], gradBuff[d]);\n atomicSub(&embedStorage.tailEmbeddings[k][d], gradBuff[d]);\n }\n\n epochStorage.epochOfNextSample[workingIndex] += epochStorage.epochsPerSample[workingIndex];\n var nNegSamples: i32 = i32(floor((computeInfo.n - epochStorage.epochOfNextNegativeSample[workingIndex]) / epochStorage.epochsPerNegativeSample[workingIndex]));\n\n for (var p = 0i; p < nNegSamples; p++) {\n let k1 = randInt(nVertices);\n var other1: array<f32, ${o}>;\n for (var i = 0u; i < ${o}u; i++) {\n other1[i] = f32(atomicLoad(&embedStorage.tailEmbeddings[k1][i])) / divisionFactor;\n }\n\n let distSquared1 = rDist(current, other1);\n\n var gradCoeff1: f32 = 0.0;\n if (distSquared1 > 0.0) {\n gradCoeff1 = 2.0 * gamma * b;\n gradCoeff1 /= (0.001 + distSquared1) * (a * pow(distSquared1, b) + 1);\n }\n else if (j == k1) {\n continue;\n }\n\n var gradDBuff: array<i32, ${o}>;\n for (var d = 0u; d < ${o}u; d++) {\n var gradD: f32 = 4.0;\n if (gradCoeff1 > 0.0) {\n gradD = clip(gradCoeff1 * (current[d] - other1[d]), clipValue);\n }\n\n gradDBuff[d] = i32(floor(gradD * computeInfo.alpha * divisionFactor));\n \n }\n for (var d = 0u; d < ${o}u; d++) {\n atomicAdd(&embedStorage.headEmbeddings[j][d], gradDBuff[d]);\n }\n }\n epochStorage.epochOfNextNegativeSample[workingIndex] += f32(nNegSamples) * epochStorage.epochsPerNegativeSample[workingIndex];\n //}\n }\n`}(y,t,0,a,s,o,u,l,c,f,10,p,m);let b=2*y*4;const x=15&b;0!==x&&(b+=16-x);let v=4*y*4;const A=15&v;0!==A&&(v+=16-A);let S=2*t*2*4;const E=15&S;0!==E&&(S+=16-E);let I=4*(2+y);const M=15&I;0!==M&&(I+=16-M);const N=g.createShaderModule({label:"optimizeShader",code:w}),P=g.createComputePipeline({label:"optimizePipeline",layout:"auto",compute:{module:N,entryPoint:"optimizeStep"}}),D=g.createBuffer({label:"matrix storage buffer",size:b,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),C=D.getMappedRange();new Uint32Array(C,0,y).set(e),new Uint32Array(C,4*y,y).set(n),D.unmap();const k=g.createBuffer({label:"epoch storage buffer",size:v,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),R=k.getMappedRange(),U=new Float32Array(R);U.set(r,0),U.set(r,y),U.set(i,2*y),U.set(i,3*y),k.unmap();const T=new Int32Array(t*l).map((()=>Math.floor((2*Math.random()-1)*m)));new Int32Array(t*l).set(T);const B=g.createBuffer({label:"embedding storage buffer",size:S,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),O=B.getMappedRange(),z=new Int32Array(O);z.set(T,0),z.set(T,T.length),B.unmap();const _=g.createBuffer({label:"compute info buffer",size:I,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),L=new Uint32Array(y).map((()=>Math.floor(Math.random()*m))),G=_.getMappedRange();new Float32Array(G,0,2).set([0,a]),new Uint32Array(G,8,y).set(L),_.unmap();const $=g.createBindGroup({label:"bindGroup for optimize",layout:P.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:D}},{binding:1,resource:{buffer:k}},{binding:2,resource:{buffer:B}},{binding:3,resource:{buffer:_}}]});let F=a;const j=g.createBuffer({label:"result buffer",size:B.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let e=0;e<c;e++){g.queue.writeBuffer(_,0,new Float32Array([e,F]),0);const n=g.createCommandEncoder({label:"matrix ops encoder"}),t=n.beginComputePass({label:"matrix ops compute pass"});t.setPipeline(P),t.setBindGroup(0,$),t.dispatchWorkgroups(d,d),t.end(),e===c-1&&n.copyBufferToBuffer(B,0,j,0,j.size);const r=n.finish();g.queue.submit([r]),yield g.queue.onSubmittedWorkDone(),F=a*(1-e/c)}yield j.mapAsync(GPUMapMode.READ);const Y=j.getMappedRange(),V=new Int32Array(Y,0,T.length);T.set(V),j.unmap();const K=new Array(l).fill(null).map((e=>new Float32Array(t)));for(let e=0;e<t;e++)for(let n=0;n<l;n++)K[n][e]=T[e*l+n]/m;return D.destroy(),k.destroy(),B.destroy(),_.destroy(),j.destroy(),K},new((p=void 0)||(p=Promise))((function(e,n){function t(e){try{i(g.next(e))}catch(e){n(e)}}function r(e){try{i(g.throw(e))}catch(e){n(e)}}function i(n){var i;n.done?e(n.value):(i=n.value,i instanceof p?i:new p((function(e){e(i)}))).then(t,r)}i((g=g.apply(h,d||[])).next())}));var h,d,p,g}(n,t,f,r,i,u,o,a,s,l,c,f);return h}))}calcSmoothKNNDistances(){return We(this,void 0,void 0,(function*(){if(!this.knnIndexes||!this.knnDistances)throw new Error("knn indexes and distances must be set before calling fit");const e=yield qe(this.knnDistances,this.params.nNeighbours,this.params.localConnectivity,64);if(!e)throw new Error("failed to compute smooth knn distances");this.rhos=e.resultRhos,this.sigmas=e.resultSigmas}))}calcMembershipStrengths(){return We(this,void 0,void 0,(function*(){if(!(this.knnIndexes&&this.knnDistances&&this.rhos&&this.sigmas))throw new Error("knn indexes, distances, rhos, and sigmas must be set before calling fit");const e=yield function(e,n,t){return r=this,i=void 0,s=function*(){const r=e.length,i=Math.ceil(r/100),a=Math.ceil(Math.sqrt(i)),s=function(e=10,n,t,r,i){const a=t.length,s=r.length,o=i.length;return`\n struct MembershipStrengthsInfo {\n knnDistances: array<array<f32, ${t[0].length}>, ${a}>,\n sigmas: array<f32, ${s}>,\n rhos: array<f32, ${o}>\n };\n var<private> nNeighbors: u32 = ${t[0].length};\n @group(0) @binding(0) var<storage, read> membershipStrengthsInfo: MembershipStrengthsInfo;\n @group(0) @binding(1) var<storage, read_write> resultKnnDistances: array<array<f32, ${t[0].length}>, ${a}>;\n @compute @workgroup_size(${e}, ${e}) fn computeMembershipStrengths(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col: u32 = id.x;\n let row: u32 = id.y;\n let workingIndex: u32 = row * ${n} + col;\n\n if (workingIndex >= ${a}) {\n return;\n }\n\n let workingResKnnDistances = &resultKnnDistances[workingIndex];\n let knnDistances = &membershipStrengthsInfo.knnDistances[workingIndex];\n for (var j = 0u; j < nNeighbors; j = j + 1u) {\n var val: f32 = 0.0;\n\n if ((*knnDistances)[j] - membershipStrengthsInfo.rhos[workingIndex] <= 0.0) {\n val = 1.0;\n } else {\n val = exp(0.0 - ((knnDistances[j] - membershipStrengthsInfo.rhos[workingIndex]) / membershipStrengthsInfo.sigmas[workingIndex])); \n }\n\n (*workingResKnnDistances)[j] = val;\n }\n }\n `}(10,10*a,e,n,t),o=r*e[0].length,u=yield Ee();if(null==u)return;const l=u.createShaderModule({label:"rowsColsValsCalulation",code:s}),c=u.createComputePipeline({label:"rowsColsValsPipeline",layout:"auto",compute:{module:l,entryPoint:"computeMembershipStrengths"}});let f=4*(t.length+n.length+o);const h=15&f;0!=h&&(f+=16-h);const d=u.createBuffer({label:"info buffer",size:f,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),p=d.getMappedRange(),g=new Float32Array(p);for(let n=0;n<e.length;n++)g.set(e[n],n*e[n].length);let m=e[0].length*e.length;g.set(n,m),m+=n.length,g.set(t,m),d.unmap();const y=u.createBuffer({label:"knn distance buffer",size:e[0].length*e.length*Float32Array.BYTES_PER_ELEMENT,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),w=u.createBindGroup({label:"bindGroup for membership strhegths buffers",layout:c.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:d}},{binding:1,resource:{buffer:y}}]}),b=u.createCommandEncoder({label:"membership strengths encoder"}),x=b.beginComputePass({label:"membership strengths compute pass"});x.setPipeline(c),x.setBindGroup(0,w),x.dispatchWorkgroups(a,a),x.end();const v=u.createBuffer({label:"result buffer distances",size:y.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});b.copyBufferToBuffer(y,0,v,0,v.size);const A=b.finish();u.queue.submit([A]),yield u.queue.onSubmittedWorkDone(),yield v.mapAsync(GPUMapMode.READ);const S=v.getMappedRange(),E=e[0].length*Float32Array.BYTES_PER_ELEMENT,I=new Array(e.length).fill(null).map(((n,t)=>{const r=new Float32Array(S,E*t,e[0].length),i=new Float32Array(e[0].length);return i.set(r),i}));return v.unmap(),v.destroy(),y.destroy(),d.destroy(),I},new((a=void 0)||(a=Promise))((function(e,n){function t(e){try{u(s.next(e))}catch(e){n(e)}}function o(e){try{u(s.throw(e))}catch(e){n(e)}}function u(n){var r;n.done?e(n.value):(r=n.value,r instanceof a?r:new a((function(e){e(r)}))).then(t,o)}u((s=s.apply(r,i||[])).next())}));var r,i,a,s}(this.knnDistances,this.sigmas,this.rhos);if(!e)throw new Error("failed to compute membership strengths");this.membershipStrengths=e}))}fuzzySimplicialSet(){return We(this,void 0,void 0,(function*(){if(!(this.knnIndexes&&this.knnDistances&&this.rhos&&this.sigmas&&this.membershipStrengths))throw new Error("knn indexes, distances, rhos, sigmas, and membership strengths must be set before calling fit");const e=yield Ke(this.knnIndexes,this.membershipStrengths,this.params.setOpMixRatio);if(!e)throw new Error("failed to compute pairwise multiply with transpose");return e}))}initializeSimplicialSetEmbedding(){return We(this,void 0,void 0,(function*(){const e=yield this.fuzzySimplicialSet();if(!(e&&e.res&&e.unionMatrixOffsets&&e.unionSizes))throw new Error("failed to compute fuzzy simplicial set");const n=yield function(e,n,t,r,i=5){return a=this,s=void 0,u=function*(){if(!e.unionSizes)return;const a=function(e){return e<=2500?1e3:e<=5e3?800:e<=7500?650:400}(n),s=e.res.resultKnnDistances.reduce(((e,n)=>Math.max(e,n))),o=s/a,u=new Uint32Array(e.unionSizes.length);u.set(e.unionSizes);let l=0;for(let n=0;n<e.unionSizes.length;n++){for(let t=0;t<e.unionSizes[n];t++){const r=l+t;e.res.resultKnnDistances[r]<o&&(e.res.resultKnnDistances[r]=0,u[n]--)}l+=e.unionSizes[n]}const c=Ye(u),f=c[c.length-1],h=new Float32Array(f),d=new Uint32Array(f),p=new Uint32Array(f);l=0;for(let n=0;n<e.unionSizes.length;n++)for(let t=0;t<e.unionSizes[n];t++){const r=e.unionMatrixOffsets[n]+t;0!=e.res.resultKnnDistances[r]&&(h[l]=e.res.resultKnnDistances[r],d[l]=e.res.resultKnnIndexes[r],p[l]=n,l+=1)}const g=new Float32Array(h.length).fill(-1),m=h.map((e=>e/s*a));m.forEach(((e,n)=>{e>0&&(g[n]=a/m[n])}));const{a:y,b:w}=je(t,r),b=g.map((e=>e/i));return{epochsPerSample:g,epochsPerNegativeSample:b,a:y,b:w,head:d,tail:p,entryLen:n,nEpochs:a,nComponents:2,initialAlpha:1,gamma:1}},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{i(u.next(e))}catch(e){n(e)}}function r(e){try{i(u.throw(e))}catch(e){n(e)}}function i(n){var i;n.done?e(n.value):(i=n.value,i instanceof o?i:new o((function(e){e(i)}))).then(t,r)}i((u=u.apply(a,s||[])).next())}));var a,s,o,u}(e,this.params.entryLen,this.params.spread,this.params.minDist,this.params.negativeSampleRate);if(!n)throw new Error("failed to compute umap simplistical set embeddings");return n}))}}class Xe{constructor(e){this.data=e.data,this.weights=e.weights,this.aggregationMethod=e.aggregationMethod}}class Qe extends Xe{constructor(e){super(e);const n=e.randomSeed??Date(),t=be()(n);e.dim=2,e.random=t,this.reducer=new xe(e),this.iterations=e?.iterations??this.reducer.getIterSize(this.data[0].length),this.distanceFnames=e.distanceFnames,this.distanceFns=e.distanceFns,this.distanceFnArgs=e.distanceFnArgs,this.progressFunc=e.progressFunc}async transform(){if(this.data[0].length>1e4)throw new Error("Maximum number of samples for T-SNE is 10000");const e=new x(!0,!1);try{const n=await e.calcMulti(this.data,this.distanceFnames,!1,this.distanceFnArgs,this.weights,this.aggregationMethod);e.terminate(),this.reducer.initDataDist(n,this.data[0].length);for(let e=0;e<this.iterations;++e)this.reducer.step(),this.progressFunc&&this.progressFunc(e,this.iterations,[]);return this.reducer.getSolution()}catch(n){throw e.terminate(),n}}}class Je extends Xe{constructor(e){const n=e.randomSeed??Date(),t=be()(n);super(e),this.useWebGPU=!1,u("distanceFnames"in e),u("distanceFns"in e),this.distanceFnArgs=e.distanceFnArgs,this.distanceFns=e.distanceFns,this.progressFunc=e.progressFunc,this.useWebGPU=e.useWebGPU??!1,this.distanceFnames=e.distanceFnames,e.nComponents=2,this.vectors=new Array(this.data[0].length).fill(0).map(((e,n)=>n)),this.data[0].length<=(e.nNeighbors??15)&&(e.nNeighbors=this.data[0].length-1),e.random=t,this.reducer=new fe(e)}async transform(e){let n;if(console.time("knn graph"),this.useWebGPU)try{n=await Oe(this.data,this.reducer.neighbors,this.distanceFnames,this.aggregationMethod,this.weights,this.distanceFnArgs)}catch(e){console.error(e)}n||(this.useWebGPU&&console.error("WEBGPU KNN failed, falling back to multithreaded CPU implementation"),n=await(new me.p).multiColumnKNN(this.data,this.distanceFnames,this.reducer.neighbors,this.distanceFnArgs,this.weights,this.aggregationMethod)),console.timeEnd("knn graph"),this.useWebGPU?(this.webGPUReducer=new Ze(this.vectors.length,{nComponents:this.reducer.nComponents,gamma:this.reducer.repulsionStrength,alpha:this.reducer.learningRate,nNeighbours:this.reducer.neighbors,spread:this.reducer.spread,minDist:this.reducer.minDist,negativeSampleRate:this.reducer.negativeSampleRate,localConnectivity:this.reducer.localConnectivity,setOpMixRatio:this.reducer.setOpMixRatio}),this.webGPUReducer.setPrecomputedKNN(n.knnIndexes,n.knnDistances)):this.reducer.setPrecomputedKNN(n.knnIndexes,n.knnDistances),await new Promise((e=>{setTimeout((()=>{e()}),300)}));let t=null;console.time("fit");try{if(this.useWebGPU&&this.webGPUReducer){if(t=await this.webGPUReducer.fit(),!t)throw new Error("Failed to compute embedding");t=new Array(t[0].length).fill(null).map(((e,n)=>new Float32Array(t.map((e=>e[n])))))}}catch(e){console.error(e)}return t||(this.useWebGPU&&console.error("WEBGPU UMAP failed, falling back to CPU implementation"),t=await this.reducer.fitAsync(this.vectors,(e=>{this.progressFunc&&this.progressFunc(e,this.reducer.getNEpochs(),this.reducer.getEmbedding())}))),console.timeEnd("fit"),i=t,new Array(i.length).fill(0).map(((e,n)=>r.from(i[n])));var i}}const en={UMAP:Je,"t-SNE":Qe};class nn{constructor(e,n,t,r,i,a){const s=[];for(let n=0;n<t.length;++n){const r=new w(t[n]).getMeasure(a.distanceFnArgs[n]);s.push(r);let i=2048;for(let t=0;t<e[n].length;++t)if(e[n][t]&&e[n][t]._length){i=e[n][t]._length;break}if(o=t[n],"BitArray"==y[o])for(let t=0;t<e[n].length;++t)e[n][t]&&e[n][t]._data?e[n][t]=new ye.A(e[n][t]._data,e[n][t]._length):e[n][t]=new ye.A(i)}var o;"UMAP"==n?this.reducer=new Je({data:e,distanceFnames:t,distanceFns:s,distanceFnArgs:a.distanceFnArgs,weights:r,aggregationMethod:i,...a}):"t-SNE"==n&&(this.reducer=new Qe({data:e,distanceFnames:t,distanceFns:s,distanceFnArgs:a.distanceFnArgs,weights:r,aggregationMethod:i,...a}))}async transform(e=!1){if(void 0===this.reducer)throw new Error("Reducer was not defined.");let n=await this.reducer.transform();return e&&(n=function(e){return new Array(e[0].length).fill(0).map(((n,t)=>new r(e.length).fill(0).map(((n,r)=>e[r][t]))))}(n)),n}static availableMetricsByType(e){return Object.keys(m[e])}static get availableMethods(){return Object.keys(en)}static get availableMetrics(){let e=[];return Object.values(m).forEach((n=>{const t=Object.values(n);e=[...e,...t]})),e}}async function tn(e,n,t){e%5==0&&self.postMessage({epochNum:e,epochsLength:n,embedding:t})}self.onmessage=async({data:{columnsData:e,method:n,distanceMetrics:t,options:r,weights:i,aggregationMethod:a}})=>{let s;try{const o=await async function(e,n,t,r,i,a){const s=new nn(e,n,t,r,i,{...a,progressFunc:tn});return await s.transform(!0)}(e,n,t,i,a,r);s={embedding:o}}catch(e){s={error:e}}self.postMessage({error:s.error,embedding:s.embedding})}},7391:(e,n,t)=>{var r=t(7180),i=t(3181),a=t(3031),s=t(9067),o=t(6833),u=t(3717),l=t(4801);l.alea=r,l.xor128=i,l.xorwow=a,l.xorshift7=s,l.xor4096=o,l.tychei=u,e.exports=l},7180:function(e,n,t){var r;!function(e,i){function a(e){var n,t=this,r=(n=4022871197,function(e){e=String(e);for(var t=0;t<e.length;t++){var r=.02519603282416938*(n+=e.charCodeAt(t));r-=n=r>>>0,n=(r*=n)>>>0,n+=4294967296*(r-=n)}return 2.3283064365386963e-10*(n>>>0)});t.next=function(){var e=2091639*t.s0+2.3283064365386963e-10*t.c;return t.s0=t.s1,t.s1=t.s2,t.s2=e-(t.c=0|e)},t.c=1,t.s0=r(" "),t.s1=r(" "),t.s2=r(" "),t.s0-=r(e),t.s0<0&&(t.s0+=1),t.s1-=r(e),t.s1<0&&(t.s1+=1),t.s2-=r(e),t.s2<0&&(t.s2+=1),r=null}function s(e,n){return n.c=e.c,n.s0=e.s0,n.s1=e.s1,n.s2=e.s2,n}function o(e,n){var t=new a(e),r=n&&n.state,i=t.next;return i.int32=function(){return 4294967296*t.next()|0},i.double=function(){return i()+11102230246251565e-32*(2097152*i()|0)},i.quick=i,r&&("object"==typeof r&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.alea=o}(0,e=t.nmd(e),t.amdD)},3717:function(e,n,t){var r;!function(e,i){function a(e){var n=this,t="";n.next=function(){var e=n.b,t=n.c,r=n.d,i=n.a;return e=e<<25^e>>>7^t,t=t-r|0,r=r<<24^r>>>8^i,i=i-e|0,n.b=e=e<<20^e>>>12^t,n.c=t=t-r|0,n.d=r<<16^t>>>16^i,n.a=i-e|0},n.a=0,n.b=0,n.c=-1640531527,n.d=1367130551,e===Math.floor(e)?(n.a=e/4294967296|0,n.b=0|e):t+=e;for(var r=0;r<t.length+20;r++)n.b^=0|t.charCodeAt(r),n.next()}function s(e,n){return n.a=e.a,n.b=e.b,n.c=e.c,n.d=e.d,n}function o(e,n){var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&("object"==typeof r&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.tychei=o}(0,e=t.nmd(e),t.amdD)},3181:function(e,n,t){var r;!function(e,i){function a(e){var n=this,t="";n.x=0,n.y=0,n.z=0,n.w=0,n.next=function(){var e=n.x^n.x<<11;return n.x=n.y,n.y=n.z,n.z=n.w,n.w^=n.w>>>19^e^e>>>8},e===(0|e)?n.x=e:t+=e;for(var r=0;r<t.length+64;r++)n.x^=0|t.charCodeAt(r),n.next()}function s(e,n){return n.x=e.x,n.y=e.y,n.z=e.z,n.w=e.w,n}function o(e,n){var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&("object"==typeof r&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.xor128=o}(0,e=t.nmd(e),t.amdD)},6833:function(e,n,t){var r;!function(e,i){function a(e){var n=this;n.next=function(){var e,t,r=n.w,i=n.X,a=n.i;return n.w=r=r+1640531527|0,t=i[a+34&127],e=i[a=a+1&127],t^=t<<13,e^=e<<17,t^=t>>>15,e^=e>>>12,t=i[a]=t^e,n.i=a,t+(r^r>>>16)|0},function(e,n){var t,r,i,a,s,o=[],u=128;for(n===(0|n)?(r=n,n=null):(n+="\0",r=0,u=Math.max(u,n.length)),i=0,a=-32;a<u;++a)n&&(r^=n.charCodeAt((a+32)%n.length)),0===a&&(s=r),r^=r<<10,r^=r>>>15,r^=r<<4,r^=r>>>13,a>=0&&(s=s+1640531527|0,i=0==(t=o[127&a]^=r+s)?i+1:0);for(i>=128&&(o[127&(n&&n.length||0)]=-1),i=127,a=512;a>0;--a)r=o[i+34&127],t=o[i=i+1&127],r^=r<<13,t^=t<<17,r^=r>>>15,t^=t>>>12,o[i]=r^t;e.w=s,e.X=o,e.i=i}(n,e)}function s(e,n){return n.i=e.i,n.w=e.w,n.X=e.X.slice(),n}function o(e,n){null==e&&(e=+new Date);var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&(r.X&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.xor4096=o}(0,e=t.nmd(e),t.amdD)},9067:function(e,n,t){var r;!function(e,i){function a(e){var n=this;n.next=function(){var e,t,r=n.x,i=n.i;return e=r[i],t=(e^=e>>>7)^e<<24,t^=(e=r[i+1&7])^e>>>10,t^=(e=r[i+3&7])^e>>>3,t^=(e=r[i+4&7])^e<<7,e=r[i+7&7],t^=(e^=e<<13)^e<<9,r[i]=t,n.i=i+1&7,t},function(e,n){var t,r=[];if(n===(0|n))r[0]=n;else for(n=""+n,t=0;t<n.length;++t)r[7&t]=r[7&t]<<15^n.charCodeAt(t)+r[t+1&7]<<13;for(;r.length<8;)r.push(0);for(t=0;t<8&&0===r[t];++t);for(8==t?r[7]=-1:r[t],e.x=r,e.i=0,t=256;t>0;--t)e.next()}(n,e)}function s(e,n){return n.x=e.x.slice(),n.i=e.i,n}function o(e,n){null==e&&(e=+new Date);var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&(r.x&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.xorshift7=o}(0,e=t.nmd(e),t.amdD)},3031:function(e,n,t){var r;!function(e,i){function a(e){var n=this,t="";n.next=function(){var e=n.x^n.x>>>2;return n.x=n.y,n.y=n.z,n.z=n.w,n.w=n.v,(n.d=n.d+362437|0)+(n.v=n.v^n.v<<4^e^e<<1)|0},n.x=0,n.y=0,n.z=0,n.w=0,n.v=0,e===(0|e)?n.x=e:t+=e;for(var r=0;r<t.length+64;r++)n.x^=0|t.charCodeAt(r),r==t.length&&(n.d=n.x<<10^n.x>>>4),n.next()}function s(e,n){return n.x=e.x,n.y=e.y,n.z=e.z,n.w=e.w,n.v=e.v,n.d=e.d,n}function o(e,n){var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&("object"==typeof r&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.xorwow=o}(0,e=t.nmd(e),t.amdD)},4801:function(e,n,t){var r;!function(i,a,s){var o,u=256,l=s.pow(u,6),c=s.pow(2,52),f=2*c,h=u-1;function d(e,n,t){var r=[],h=y(m((n=1==n?{entropy:!0}:n||{}).entropy?[e,w(a)]:null==e?function(){try{var e;return o&&(e=o.randomBytes)?e=e(u):(e=new Uint8Array(u),(i.crypto||i.msCrypto).getRandomValues(e)),w(e)}catch(e){var n=i.navigator,t=n&&n.plugins;return[+new Date,i,t,i.screen,w(a)]}}():e,3),r),d=new p(r),b=function(){for(var e=d.g(6),n=l,t=0;e<c;)e=(e+t)*u,n*=u,t=d.g(1);for(;e>=f;)e/=2,n/=2,t>>>=1;return(e+t)/n};return b.int32=function(){return 0|d.g(4)},b.quick=function(){return d.g(4)/4294967296},b.double=b,y(w(d.S),a),(n.pass||t||function(e,n,t,r){return r&&(r.S&&g(r,d),e.state=function(){return g(d,{})}),t?(s.random=e,n):e})(b,h,"global"in n?n.global:this==s,n.state)}function p(e){var n,t=e.length,r=this,i=0,a=r.i=r.j=0,s=r.S=[];for(t||(e=[t++]);i<u;)s[i]=i++;for(i=0;i<u;i++)s[i]=s[a=h&a+e[i%t]+(n=s[i])],s[a]=n;(r.g=function(e){for(var n,t=0,i=r.i,a=r.j,s=r.S;e--;)n=s[i=h&i+1],t=t*u+s[h&(s[i]=s[a=h&a+n])+(s[a]=n)];return r.i=i,r.j=a,t})(u)}function g(e,n){return n.i=e.i,n.j=e.j,n.S=e.S.slice(),n}function m(e,n){var t,r=[],i=typeof e;if(n&&"object"==i)for(t in e)try{r.push(m(e[t],n-1))}catch(e){}return r.length?r:"string"==i?e:e+"\0"}function y(e,n){for(var t,r=e+"",i=0;i<r.length;)n[h&i]=h&(t^=19*n[h&i])+r.charCodeAt(i++);return w(n)}function w(e){return String.fromCharCode.apply(0,e)}if(y(s.random(),a),e.exports){e.exports=d;try{o=t(1234)}catch(e){}}else void 0===(r=function(){return d}.call(n,t,n,e))||(e.exports=r)}("undefined"!=typeof self?self:this,[],Math)}}]);
|
|
2
|
+
(self.webpackChunkeda=self.webpackChunkeda||[]).push([[738],{606:(e,n,t)=>{"use strict";t.d(n,{Qt:()=>i,gD:()=>r}),t(6066);const r=e=>null==e;function i(e,n,t,r){if(t>e[e.length-1])return;const i=e.findIndex((e=>t<e));e.pop(),e.splice(i,0,t),n.pop(),n.splice(i,0,r)}},3031:function(e,n,t){var r;!function(e,i){function a(e){var n=this,t="";n.next=function(){var e=n.x^n.x>>>2;return n.x=n.y,n.y=n.z,n.z=n.w,n.w=n.v,(n.d=n.d+362437|0)+(n.v=n.v^n.v<<4^e^e<<1)|0},n.x=0,n.y=0,n.z=0,n.w=0,n.v=0,e===(0|e)?n.x=e:t+=e;for(var r=0;r<t.length+64;r++)n.x^=0|t.charCodeAt(r),r==t.length&&(n.d=n.x<<10^n.x>>>4),n.next()}function s(e,n){return n.x=e.x,n.y=e.y,n.z=e.z,n.w=e.w,n.v=e.v,n.d=e.d,n}function o(e,n){var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&("object"==typeof r&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.xorwow=o}(0,e=t.nmd(e),t.amdD)},3181:function(e,n,t){var r;!function(e,i){function a(e){var n=this,t="";n.x=0,n.y=0,n.z=0,n.w=0,n.next=function(){var e=n.x^n.x<<11;return n.x=n.y,n.y=n.z,n.z=n.w,n.w^=n.w>>>19^e^e>>>8},e===(0|e)?n.x=e:t+=e;for(var r=0;r<t.length+64;r++)n.x^=0|t.charCodeAt(r),n.next()}function s(e,n){return n.x=e.x,n.y=e.y,n.z=e.z,n.w=e.w,n}function o(e,n){var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&("object"==typeof r&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.xor128=o}(0,e=t.nmd(e),t.amdD)},3717:function(e,n,t){var r;!function(e,i){function a(e){var n=this,t="";n.next=function(){var e=n.b,t=n.c,r=n.d,i=n.a;return e=e<<25^e>>>7^t,t=t-r|0,r=r<<24^r>>>8^i,i=i-e|0,n.b=e=e<<20^e>>>12^t,n.c=t=t-r|0,n.d=r<<16^t>>>16^i,n.a=i-e|0},n.a=0,n.b=0,n.c=-1640531527,n.d=1367130551,e===Math.floor(e)?(n.a=e/4294967296|0,n.b=0|e):t+=e;for(var r=0;r<t.length+20;r++)n.b^=0|t.charCodeAt(r),n.next()}function s(e,n){return n.a=e.a,n.b=e.b,n.c=e.c,n.d=e.d,n}function o(e,n){var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&("object"==typeof r&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.tychei=o}(0,e=t.nmd(e),t.amdD)},4801:function(e,n,t){var r;!function(i,a,s){var o,u=256,l=s.pow(u,6),c=s.pow(2,52),f=2*c,h=255;function d(e,n,t){var r=[],h=y(g((n=1==n?{entropy:!0}:n||{}).entropy?[e,w(a)]:null==e?function(){try{var e;return o&&(e=o.randomBytes)?e=e(u):(e=new Uint8Array(u),(i.crypto||i.msCrypto).getRandomValues(e)),w(e)}catch(e){var n=i.navigator,t=n&&n.plugins;return[+new Date,i,t,i.screen,w(a)]}}():e,3),r),d=new p(r),b=function(){for(var e=d.g(6),n=l,t=0;e<c;)e=(e+t)*u,n*=u,t=d.g(1);for(;e>=f;)e/=2,n/=2,t>>>=1;return(e+t)/n};return b.int32=function(){return 0|d.g(4)},b.quick=function(){return d.g(4)/4294967296},b.double=b,y(w(d.S),a),(n.pass||t||function(e,n,t,r){return r&&(r.S&&m(r,d),e.state=function(){return m(d,{})}),t?(s.random=e,n):e})(b,h,"global"in n?n.global:this==s,n.state)}function p(e){var n,t=e.length,r=this,i=0,a=r.i=r.j=0,s=r.S=[];for(t||(e=[t++]);i<u;)s[i]=i++;for(i=0;i<u;i++)s[i]=s[a=h&a+e[i%t]+(n=s[i])],s[a]=n;(r.g=function(e){for(var n,t=0,i=r.i,a=r.j,s=r.S;e--;)n=s[i=h&i+1],t=t*u+s[h&(s[i]=s[a=h&a+n])+(s[a]=n)];return r.i=i,r.j=a,t})(u)}function m(e,n){return n.i=e.i,n.j=e.j,n.S=e.S.slice(),n}function g(e,n){var t,r=[],i=typeof e;if(n&&"object"==i)for(t in e)try{r.push(g(e[t],n-1))}catch(e){}return r.length?r:"string"==i?e:e+"\0"}function y(e,n){for(var t,r=e+"",i=0;i<r.length;)n[h&i]=h&(t^=19*n[h&i])+r.charCodeAt(i++);return w(n)}function w(e){return String.fromCharCode.apply(0,e)}if(y(s.random(),a),e.exports){e.exports=d;try{o=t(1234)}catch(e){}}else void 0===(r=function(){return d}.call(n,t,n,e))||(e.exports=r)}("undefined"!=typeof self?self:this,[],Math)},5540:(e,n,t)=>{"use strict";e=t.hmd(e);var r,i=(r="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,function(e={}){var n,t,i=void 0!==e?e:{};i.ready=new Promise((function(e,r){n=e,t=r}));var a,s=Object.assign({},i),o="object"==typeof window,u="function"==typeof importScripts,l=("object"==typeof process&&"object"==typeof process.versions&&process.versions.node,"");(o||u)&&(u?l=self.location.href:"undefined"!=typeof document&&document.currentScript&&(l=document.currentScript.src),r&&(l=r),l=0!==l.indexOf("blob:")?l.substr(0,l.replace(/[?#].*/,"").lastIndexOf("/")+1):"",u&&(a=e=>{var n=new XMLHttpRequest;return n.open("GET",e,!1),n.responseType="arraybuffer",n.send(null),new Uint8Array(n.response)})),i.print||console.log.bind(console);var c,f,h=i.printErr||console.warn.bind(console);Object.assign(i,s),s=null,i.arguments&&i.arguments,i.thisProgram&&i.thisProgram,i.quit&&i.quit,i.wasmBinary&&(c=i.wasmBinary),i.noExitRuntime,"object"!=typeof WebAssembly&&M("no native wasm support detected");var d,p,m,g=!1;function y(){var e=f.buffer;i.HEAP8=d=new Int8Array(e),i.HEAP16=new Int16Array(e),i.HEAP32=new Int32Array(e),i.HEAPU8=p=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAPU32=m=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e)}var w,b,x=[],v=[],A=[],S=0,E=null,I=null;function M(e){i.onAbort&&i.onAbort(e),h(e="Aborted("+e+")"),g=!0,e+=". Build with -sASSERTIONS for more info.";var n=new WebAssembly.RuntimeError(e);throw t(n),n}function N(e){return e.startsWith("data:application/octet-stream;base64,")}function P(e){try{if(e==w&&c)return new Uint8Array(c);if(a)return a(e);throw"both async and sync fetching of the wasm failed"}catch(e){M(e)}}function C(e,n,t){return function(e){return c||!o&&!u||"function"!=typeof fetch?Promise.resolve().then((function(){return P(e)})):fetch(e,{credentials:"same-origin"}).then((function(n){if(!n.ok)throw"failed to load wasm binary file at '"+e+"'";return n.arrayBuffer()})).catch((function(){return P(e)}))}(e).then((function(e){return WebAssembly.instantiate(e,n)})).then((function(e){return e})).then(t,(function(e){h("failed to asynchronously prepare wasm: "+e),M(e)}))}function D(e){for(;e.length>0;)e.shift()(i)}function k(e){this.excPtr=e,this.ptr=e-24,this.set_type=function(e){m[this.ptr+4>>2]=e},this.get_type=function(){return m[this.ptr+4>>2]},this.set_destructor=function(e){m[this.ptr+8>>2]=e},this.get_destructor=function(){return m[this.ptr+8>>2]},this.set_caught=function(e){e=e?1:0,d[this.ptr+12|0]=e},this.get_caught=function(){return 0!=d[this.ptr+12|0]},this.set_rethrown=function(e){e=e?1:0,d[this.ptr+13|0]=e},this.get_rethrown=function(){return 0!=d[this.ptr+13|0]},this.init=function(e,n){this.set_adjusted_ptr(0),this.set_type(e),this.set_destructor(n)},this.set_adjusted_ptr=function(e){m[this.ptr+16>>2]=e},this.get_adjusted_ptr=function(){return m[this.ptr+16>>2]},this.get_exception_ptr=function(){if($(this.get_type()))return m[this.excPtr>>2];var e=this.get_adjusted_ptr();return 0!==e?e:this.excPtr}}function R(e){var n=f.buffer;try{return f.grow(e-n.byteLength+65535>>>16),y(),1}catch(e){}}function U(e){return i["_"+e]}N(w="wasmDbscan.wasm")||(b=w,w=i.locateFile?i.locateFile(b,l):l+b);var O="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function T(e,n,t,r,i){var a={string:e=>{var n=0;return null!=e&&0!==e&&(n=function(e){var n=function(e){for(var n=0,t=0;t<e.length;++t){var r=e.charCodeAt(t);r<=127?n++:r<=2047?n+=2:r>=55296&&r<=57343?(n+=4,++t):n+=3}return n}(e)+1,t=G(n);return function(e,n,t){!function(e,n,t,r){if(!(r>0))return 0;for(var i=t+r-1,a=0;a<e.length;++a){var s=e.charCodeAt(a);if(s>=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++a)),s<=127){if(t>=i)break;n[t++]=s}else if(s<=2047){if(t+1>=i)break;n[t++]=192|s>>6,n[t++]=128|63&s}else if(s<=65535){if(t+2>=i)break;n[t++]=224|s>>12,n[t++]=128|s>>6&63,n[t++]=128|63&s}else{if(t+3>=i)break;n[t++]=240|s>>18,n[t++]=128|s>>12&63,n[t++]=128|s>>6&63,n[t++]=128|63&s}}n[t]=0}(e,p,n,t)}(e,t,n),t}(e)),n},array:e=>{var n,t,r=G(e.length);return n=e,t=r,d.set(n,t),r}},s=U(e),o=[],u=0;if(r)for(var l=0;l<r.length;l++){var c=a[t[l]];c?(0===u&&(u=z()),o[l]=c(r[l])):o[l]=r[l]}var f=s.apply(null,o);return function(e){return 0!==u&&L(u),function(e){return"string"===n?(t=e)?function(e,n,t){for(var r=n+t,i=n;e[i]&&!(i>=r);)++i;if(i-n>16&&e.buffer&&O)return O.decode(e.subarray(n,i));for(var a="";n<i;){var s=e[n++];if(128&s){var o=63&e[n++];if(192!=(224&s)){var u=63&e[n++];if((s=224==(240&s)?(15&s)<<12|o<<6|u:(7&s)<<18|o<<12|u<<6|63&e[n++])<65536)a+=String.fromCharCode(s);else{var l=s-65536;a+=String.fromCharCode(55296|l>>10,56320|1023&l)}}else a+=String.fromCharCode((31&s)<<6|o)}else a+=String.fromCharCode(s)}return a}(p,t,r):"":"boolean"===n?Boolean(e):e;var t,r}(e)}(f)}var B,_={__cxa_throw:function(e,n,t){throw new k(e).init(n,t),e},abort:function(){M("")},emscripten_memcpy_big:function(e,n,t){p.copyWithin(e,n,n+t)},emscripten_resize_heap:function(e){var n,t=p.length,r=2147483648;if((e>>>=0)>r)return!1;for(var i=1;i<=4;i*=2){var a=t*(1+.2/i);if(a=Math.min(a,e+100663296),R(Math.min(r,(n=Math.max(e,a))+(65536-n%65536)%65536)))return!0}return!1}},z=(function(){var e,n,r,a,s={env:_,wasi_snapshot_preview1:_};function o(e,n){var t,r=e.exports;return i.asm=r,f=i.asm.memory,y(),i.asm.__indirect_function_table,t=i.asm.__wasm_call_ctors,v.unshift(t),function(){if(S--,i.monitorRunDependencies&&i.monitorRunDependencies(S),0==S&&(null!==E&&(clearInterval(E),E=null),I)){var e=I;I=null,e()}}(),r}if(S++,i.monitorRunDependencies&&i.monitorRunDependencies(S),i.instantiateWasm)try{return i.instantiateWasm(s,o)}catch(e){h("Module.instantiateWasm callback failed with error: "+e),t(e)}(e=c,n=w,r=s,a=function(e){o(e.instance)},e||"function"!=typeof WebAssembly.instantiateStreaming||N(n)||"function"!=typeof fetch?C(n,r,a):fetch(n,{credentials:"same-origin"}).then((function(e){return WebAssembly.instantiateStreaming(e,r).then(a,(function(e){return h("wasm streaming compile failed: "+e),h("falling back to ArrayBuffer instantiation"),C(n,r,a)}))}))).catch(t)}(),i._dbscan=function(){return(i._dbscan=i.asm.dbscan).apply(null,arguments)},i._malloc=function(){return(i._malloc=i.asm.malloc).apply(null,arguments)},i._free=function(){return(i._free=i.asm.free).apply(null,arguments)},function(){return(z=i.asm.stackSave).apply(null,arguments)}),L=function(){return(L=i.asm.stackRestore).apply(null,arguments)},G=function(){return(G=i.asm.stackAlloc).apply(null,arguments)},$=function(){return($=i.asm.__cxa_is_pointer_type).apply(null,arguments)};function F(){function e(){B||(B=!0,i.calledRun=!0,g||(D(v),n(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),function(){if(i.postRun)for("function"==typeof i.postRun&&(i.postRun=[i.postRun]);i.postRun.length;)e=i.postRun.shift(),A.unshift(e);var e;D(A)}()))}S>0||(function(){if(i.preRun)for("function"==typeof i.preRun&&(i.preRun=[i.preRun]);i.preRun.length;)e=i.preRun.shift(),x.unshift(e);var e;D(x)}(),S>0||(i.setStatus?(i.setStatus("Running..."),setTimeout((function(){setTimeout((function(){i.setStatus("")}),1),e()}),1)):e()))}if(i.ccall=T,i.cwrap=function(e,n,t,r){var i=!t||t.every((e=>"number"===e||"boolean"===e));return"string"!==n&&i&&!r?U(e):function(){return T(e,n,t,arguments)}},I=function e(){B||F(),B||(I=e)},i.preInit)for("function"==typeof i.preInit&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return F(),e.ready});"object"==typeof exports?e.exports=i:"function"==typeof define&&t.amdO?define([],(function(){return i})):"object"==typeof exports&&(exports.exportCppDbscanLib=i)},5738:(e,n,t)=>{"use strict";class r extends Float32Array{}var i=t(8498),a=t(2787),s=t(944),o=t(6295),u=t(4572);const l={[i.Pn.Euclidean]:o.jL,[i.Pn.Manhattan]:o.Hf,[i.Pn.Cosine]:o.w_},c={[i.xL.Levenshtein]:a.I,[i.xL.JaroWinkler]:s.Vb,[i.xL.Manhattan]:function(e,n){if(e.length!==n.length)return 1;{let t=0;for(let r=1;r<e.length;r++)t+=e[r]==n[r]?0:1;return t/e.length}},[i.xL.Onehot]:function(e,n){return e===n?0:1}},f={[i.aT.Tanimoto]:o.tO,[i.aT.Dice]:o.zn,[i.aT.Asymmetric]:o.gt,[i.aT.BraunBlanquet]:o.ij,[i.aT.Cosine]:o.lO,[i.aT.Kulczynski]:o.rR,[i.aT.McConnaughey]:o.lP,[i.aT.RogotGoldberg]:o.TK,[i.aT.Russel]:o.yK,[i.aT.Sokal]:o.Ii,[i.aT.Hamming]:o.be,[i.aT.Euclidean]:o.Qj},h={[i.m6.TanimotoIntArray]:o.v_},d={[i.RR.Difference]:o.T6},p={[i.Wn.CommonItems]:o.Hr},m={[i.EG.Vector]:{[i.Pn.Euclidean]:l[i.Pn.Euclidean],[i.Pn.Manhattan]:l[i.Pn.Manhattan],[i.Pn.Cosine]:l[i.Pn.Cosine]},[i.EG.String]:{[i.xL.Levenshtein]:c[i.xL.Levenshtein],[i.xL.JaroWinkler]:c[i.xL.JaroWinkler],[i.xL.Manhattan]:c[i.xL.Manhattan],[i.xL.Onehot]:c[i.xL.Onehot]},[i.EG.BitArray]:{[i.aT.Tanimoto]:f[i.aT.Tanimoto],[i.aT.Dice]:f[i.aT.Dice],[i.aT.Asymmetric]:f[i.aT.Asymmetric],[i.aT.BraunBlanquet]:f[i.aT.BraunBlanquet],[i.aT.Cosine]:f[i.aT.Cosine],[i.aT.Kulczynski]:f[i.aT.Kulczynski],[i.aT.McConnaughey]:f[i.aT.McConnaughey],[i.aT.RogotGoldberg]:f[i.aT.RogotGoldberg],[i.aT.Russel]:f[i.aT.Russel],[i.aT.Sokal]:f[i.aT.Sokal]},[i.EG.MacroMolecule]:{[u.Z.HAMMING]:u.V[u.Z.HAMMING],[u.Z.LEVENSHTEIN]:u.V[u.Z.LEVENSHTEIN],[u.Z.NEEDLEMANN_WUNSCH]:u.V[u.Z.NEEDLEMANN_WUNSCH],[u.Z.MONOMER_CHEMICAL_DISTANCE]:u.V[u.Z.MONOMER_CHEMICAL_DISTANCE]},[i.EG.Number]:{[i.RR.Difference]:d[i.RR.Difference]},[i.EG.IntArray]:{[i.m6.TanimotoIntArray]:h[i.m6.TanimotoIntArray]},[i.EG.NumberArray]:{[i.Wn.CommonItems]:p[i.Wn.CommonItems]}},g=Object.keys(m).reduce(((e,n)=>{for(const t of Object.keys(m[n]))e[t]=n;return e}),{});class y{constructor(e){this.method=e,this.dataType=g[e]}metricNeedsArgs(e){return g[e]==i.EG.MacroMolecule.toString()||g[e]==i.EG.Number.toString()||function(e){return g[e]==i.EG.NumberArray.toString()}(e)}getMeasure(e){const n=m;if(!n.hasOwnProperty(this.dataType)||!n[this.dataType].hasOwnProperty(this.method))throw new Error(`Unknown measure ${this.method} for data type ${this.dataType}`);return this.metricNeedsArgs(this.method)?n[this.dataType][this.method](e):n[this.dataType][this.method]}static getMetricByDataType(e){return Object.keys(m[e])}static get availableMeasures(){return Object.keys(m)}}t(606);var w=t(6066);class b{constructor(e=!0,n=!0){const r=navigator.hardwareConcurrency;this._workerCount=e?Math.max(r-2,1):1,this._workers=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(793),t.b)))),this._terminateOnComplete=n}async calc(e,n,t=!0,r){return await this.calcMulti([e],[n],t,[r??{}],[1],w.G.MANHATTAN)}async calcMulti(e,n,t=!0,r=[{}],i=[1],a=w.G.MANHATTAN){if(e.length<1)throw new Error("values must contain at least one array");if(n.length!==e.length||r.length!==e.length||i.length!==e.length)throw new Error("values, fnNames, weights and opts must have the same length");return new Promise((async(s,o)=>{try{const o=e[0].length,u=new Array(this._workerCount),l=o*(o-1)/2;this._workerCount=Math.min(this._workerCount,l);const c=l/this._workerCount,f=new Float32Array(l);let h=0,d=1,p=0,m=Number.MIN_VALUE;for(let t=0;t<this._workerCount;t++){const s=Math.floor(t*c),g=t===this._workerCount-1?l:Math.floor((t+1)*c),y=h,w=d;t!==this._workerCount-1&&(h=o-2-Math.floor(Math.sqrt(-8*g+4*o*(o-1)-7)/2-.5),d=g-o*h+Math.floor((h+1)*(h+2)/2)),this._workers[t].postMessage({values:e,fnNames:n,startRow:y,startCol:w,chunckSize:g-s,opts:r,weights:i,aggregationMethod:a}),u[t]=new Promise(((e,n)=>{this._workers[t].onmessage=({data:{error:r,distanceMatrixData:i,min:a,max:o}})=>{this._terminateOnComplete&&setTimeout((()=>this._workers[t].terminate())),r?n(r):(f.set(i,s),a<p&&(p=a),o>m&&(m=o),e())}}))}await Promise.all(u),t&&f.forEach(((e,n)=>{f[n]=(e-p)/(m-p)})),s(f)}catch(e){o(e)}}))}terminate(){this._workers.forEach((e=>e.terminate()))}}function x(e,n){return Math.floor(n()*e)}function v(e){return e()}function A(e){const n=[];for(let t=0;t<e;t++)n.push(void 0);return n}function S(e){return A(e).map(((e,n)=>n))}function E(e,n){return A(e).map((()=>n))}function I(e){return E(e,0)}function M(e){return function(e){return e.reduce(((e,n)=>e+n))}(e)/e.length}function N(e){let n=0;for(let t=0;t<e.length;t++)n=e[t]>n?e[t]:n;return n}function P(e,n,t){const r=I(e);for(let i=0;i<e;i++){let e=!0;for(;e;){const a=x(n,t);let s=!1;for(let e=0;e<i;e++)if(a===r[e]){s=!0;break}s||(e=!1),r[i]=a}}return r}function C(e,n,t){const r=[];let i=0;if(e.length!==n*t)throw new Error("Array dimensions must match input length.");for(let a=0;a<n;a++){const n=[];for(let r=0;r<t;r++)n.push(e[i]),i+=1;r.push(n)}return r}function D(e,n){const t=t=>A(e).map((()=>E(n,t))),r=[];return r.push(t(-1)),r.push(t(1/0)),r.push(t(0)),r}function k(e,n,t){const r=I(e);for(let i=0;i<e;i++){let e=!0,a=0;for(;e;){a=x(n,t);let s=!1;for(let e=0;e<i;e++)if(a===r[e]){s=!0;break}s||(e=!1)}r[i]=a}return r}function R(e,n,t,r,i){n=Math.floor(n);const a=e[0][n];if(t>=e[1][n][0])return 0;for(let e=0;e<a.length;e++)if(r===a[e])return 0;return U(e,n,t,r,i)}function U(e,n,t,r,i){const a=e[0][n],s=e[1][n],o=e[2][n];if(t>=s[0])return 0;s[0]=t,a[0]=r,o[0]=i;let u=0,l=0;for(;;){const n=2*u+1,r=n+1,i=e[0][0].length;if(n>=i)break;if(r>=i){if(!(s[n]>t))break;l=n}else if(s[n]>=s[r]){if(!(t<s[n]))break;l=n}else{if(!(t<s[r]))break;l=r}s[u]=s[l],a[u]=a[l],o[u]=o[l],u=l}return s[u]=t,a[u]=r,o[u]=i,1}function O(e,n,t,r,i){const a=D(n,r);for(let r=0;r<n;r++)for(let n=0;n<t;n++){if(e[0][r][n]<0)continue;const t=e[0][r][n],s=e[2][r][n],o=v(i);R(a,r,o,t,s),R(a,t,o,r,s),e[2][r][n]=0}return a}function T(e){const n=e[0],t=e[1];for(let e=0;e<n.length;e++){const r=n[e],i=t[e];for(let e=0;e<r.length-1;e++){const n=r.length-e-1,t=i.length-e-1,a=r[0];r[0]=r[n],r[n]=a;const s=i[0];i[0]=i[t],i[t]=s,B(i,r,t,0)}}return{indices:n,weights:t}}function B(e,n,t,r){for(;2*r+1<t;){const i=2*r+1,a=i+1;let s=r;if(e[s]<e[i]&&(s=i),a<t&&e[s]<e[a]&&(s=a),s===r)break;{const t=e[r];e[r]=e[s],e[s]=t;const i=n[r];n[r]=n[s],n[s]=i,r=s}}}function _(e,n){const t=e[0][n],r=e[1][n],i=e[2][n];let a=1/0,s=-1;for(let e=0;e>t.length;e++)1===i[e]&&r[e]<a&&(a=r[e],s=e);return s>=0?(i[s]=0,Math.floor(t[s])):-1}class z{constructor(e,n,t,r){if(this.entries=new Map,this.nRows=0,this.nCols=0,e.length!==n.length||e.length!==t.length)throw new Error("rows, cols and values arrays must all have the same length");this.nRows=r[0],this.nCols=r[1];for(let r=0;r<t.length;r++){const i=e[r],a=n[r];this.checkDims(i,a);const s=this.makeKey(i,a);this.entries.set(s,{value:t[r],row:i,col:a})}}makeKey(e,n){return`${e}:${n}`}checkDims(e,n){if(!(e<this.nRows&&n<this.nCols))throw new Error("row and/or col specified outside of matrix dimensions")}set(e,n,t){this.checkDims(e,n);const r=this.makeKey(e,n);this.entries.has(r)?this.entries.get(r).value=t:this.entries.set(r,{value:t,row:e,col:n})}get(e,n,t=0){const r=this.makeKey(e,n);return this.entries.has(r)?this.entries.get(r).value:t}getAll(e=!0){const n=new Array(this.entries.size).fill(null);let t=0;return this.entries.forEach((e=>{n[t++]=e})),e&&n.sort(((e,n)=>e.row===n.row?e.col-n.col:e.row-n.row)),n}getDims(){return[this.nRows,this.nCols]}getRows(){return Array.from(this.entries,(([e,n])=>n.row))}getCols(){return Array.from(this.entries,(([e,n])=>n.col))}getValues(){return Array.from(this.entries,(([e,n])=>n.value))}forEach(e){this.entries.forEach((n=>e(n.value,n.row,n.col)))}map(e){const n=new Float32Array(this.entries.size);let t=0;this.entries.forEach((r=>{n[t++]=e(r.value,r.row,r.col)}));const r=[this.nRows,this.nCols];return new z(this.getRows(),this.getCols(),n,r)}toArray(){const e=A(this.nRows).map((()=>I(this.nCols)));return this.entries.forEach((n=>{e[n.row][n.col]=n.value})),e}}function L(e){const n=e.getRows(),t=e.getCols(),r=e.getValues(),i=t.length,a=new Int32Array(i),s=new Int32Array(i),o=new Float32Array(i);a.set(n),s.set(t),o.set(r);const u=[e.nCols,e.nRows];return new z(s,a,o,u)}function G(e,n){return K(e,n,((e,n)=>e*n))}function $(e,n){return K(e,n,((e,n)=>e+n))}function F(e,n){return K(e,n,((e,n)=>e-n))}function j(e,n){return e.map((e=>e*n))}function Y(e){const n=new Set,t=e.getValues(),r=e.getRows(),i=e.getCols();for(let e=0;e<t.length;e++)0===t[e]&&n.add(e);const a=(e,t)=>!n.has(t),s=t.filter(a),o=r.filter(a),u=i.filter(a);return new z(o,u,s,e.getDims())}function q(e,n="l2"){const t=V[n],r=new Map;e.forEach(((e,n,t)=>{const i=r.get(n)||[];i.push(t),r.set(n,i)}));const i=new z([],[],[],e.getDims());for(const n of r.keys()){const a=r.get(n).sort(),s=t(a.map((t=>e.get(n,t))));for(let e=0;e<s.length;e++)i.set(n,a[e],s[e])}return i}const V={max:e=>{let n=-1/0;for(let t=0;t<e.length;t++)n=e[t]>n?e[t]:n;return e.map((e=>e/n))},l1:e=>{let n=0;for(let t=0;t<e.length;t++)n+=e[t];return e.map((e=>e/n))},l2:e=>{let n=0;for(let t=0;t<e.length;t++)n+=e[t]**2;return e.map((e=>Math.sqrt(e**2/n)))}};function K(e,n,t){const r=new Set,i=[],a=[],s=[],o=(r,o)=>{i.push(r),a.push(o);const u=t(e.get(r,o),n.get(r,o));s.push(u)},u=e.getValues(),l=e.getRows(),c=e.getCols();for(let e=0;e<u.length;e++){const n=l[e],t=c[e],i=`${n}:${t}`;r.add(i),o(n,t)}const f=n.getValues(),h=n.getRows(),d=n.getCols();for(let e=0;e<f.length;e++){const n=h[e],t=d[e],i=`${n}:${t}`;r.has(i)||o(n,t)}const p=[e.nRows,e.nCols];return new z(i,a,s,p)}function W(e){const n=[];e.forEach(((e,t,r)=>{n.push({value:e,row:t,col:r})})),n.sort(((e,n)=>e.row===n.row?e.col-n.col:e.row-n.row));const t=[],r=[],i=[];let a=-1;for(let e=0;e<n.length;e++){const{row:s,col:o,value:u}=n[e];s!==a&&(a=s,i.push(e)),t.push(o),r.push(u)}return{indices:t,values:r,indptr:i}}class H{constructor(e,n,t,r){this.hyperplanes=e,this.offsets=n,this.children=t,this.indices=r}}function Z(e,n,t,r){const i=Math.max(10,n),a=S(t).map(((n,t)=>function(e,n=30,t,r){return X(e,S(e.length),n,t,r)}(e,i,t,r))),s=a.map((e=>function(e,n){const t=J(e),r=ee(e),i=S(t).map((()=>e.hyperplane?1:0)),a=I(t),s=S(t).map((()=>[-1,-1])),o=S(r).map((()=>S(n).map((()=>-1))));return Q(e,i,a,s,o,0,0),new H(i,a,s,o)}(e,i)));return s}function X(e,n,t=30,r,i){if(n.length>t){const a=function(e,n,t){const r=x(n.length,t);let i=x(n.length,t);i+=r===i?1:0,i%=n.length;const a=n[r],s=n[i];let o=0,u=0;u=e[a]-e[s],o-=u*(e[a]+e[s])/2;let l=0,c=0;const f=I(n.length);for(let r=0;r<n.length;r++){let i=o;i+=u*e[n[r]],0===i?(f[r]=x(2,t),0===f[r]?l+=1:c+=1):i>0?(f[r]=0,l+=1):(f[r]=1,c+=1)}const h=I(l),d=I(c);l=0,c=0;for(let e=0;e<f.length;e++)0===f[e]?(h[l]=n[e],l+=1):(d[c]=n[e],c+=1);return{indicesLeft:h,indicesRight:d,hyperplane:u,offset:o}}(e,n,i),{indicesLeft:s,indicesRight:o,hyperplane:u,offset:l}=a;return{leftChild:X(e,s,t,r+1,i),rightChild:X(e,o,t,r+1,i),isLeaf:!1,hyperplane:u,offset:l}}return{indices:n,isLeaf:!0}}function Q(e,n,t,r,i,a,s){if(e.isLeaf)return r[a][0]=-s,i[s].splice(0,e.indices.length,...e.indices),{nodeNum:a,leafNum:s+=1};{n[a]=e.hyperplane,t[a]=e.offset,r[a][0]=a+1;const o=a;let u=Q(e.leftChild,n,t,r,i,a+1,s);return a=u.nodeNum,s=u.leafNum,r[o][1]=a+1,u=Q(e.rightChild,n,t,r,i,a+1,s),{nodeNum:u.nodeNum,leafNum:u.leafNum}}}function J(e){return e.isLeaf?1:1+J(e.leftChild)+J(e.rightChild)}function ee(e){return e.isLeaf?1:ee(e.leftChild)+ee(e.rightChild)}function ne(e,n,t,r){let i=n;return i+=e*t,0===i?x(2,r):i>0?0:1}function te(e,n,t){let r=0;for(;n.children[r][0]>0;)r=0===ne(n.hyperplanes[r],n.offsets[r],e,t)?n.children[r][0]:n.children[r][1];const i=-1*n.children[r][0];return n.indices[i]}const re=Object.prototype.toString;function ie(e){return re.call(e).endsWith("Array]")}function ae(e,n,t){let r=0;const i=t(n);for(let n=0;n<e.x.length;n++)r+=Math.abs(e.y[n]-i(e.x[n]));return r}var se=t(5907);function oe(e,n,t,r,i){let a=t*r*r,s=se.uq.eye(n.length,n.length,a);const o=i(n);let u=new Float64Array(e.x.length);for(let n=0;n<e.x.length;n++)u[n]=o(e.x[n]);let l=function(e,n,t,r,i){const a=t.length,s=e.x.length;let o=new Array(a);for(let u=0;u<a;u++){o[u]=new Array(s);let a=t.slice();a[u]+=r;let l=i(a);for(let t=0;t<s;t++)o[u][t]=n[t]-l(e.x[t])}return new se.uq(o)}(e,u,n,r,i),c=function(e,n){const t=e.x.length;let r=new Array(t);for(let i=0;i<t;i++)r[i]=[e.y[i]-n[i]];return new se.uq(r)}(e,u),f=(0,se.DI)(s.add(l.mmul(l.transpose())));return(n=(n=new se.uq([n])).sub(f.mmul(l).mmul(c).mul(r).transpose())).to1DArray()}const ue=1e-5,le=.001;class ce{get neighbors(){return this.nNeighbors}constructor(e={}){this.learningRate=1,this.localConnectivity=1,this.minDist=.1,this.nComponents=2,this.nEpochs=0,this.nNeighbors=15,this.negativeSampleRate=5,this.random=Math.random,this.repulsionStrength=1,this.setOpMixRatio=1,this.spread=1,this.transformQueueSize=4,this.targetMetric="categorical",this.targetWeight=.5,this.targetNNeighbors=15,this.distanceFn=fe,this.isInitialized=!1,this.rpForest=[],this.embedding=[],this.optimizationState=new he;const n=n=>{void 0!==e[n]&&(this[n]=e[n])};n("distanceFn"),n("learningRate"),n("localConnectivity"),n("minDist"),n("nComponents"),n("nEpochs"),n("nNeighbors"),n("negativeSampleRate"),n("random"),n("repulsionStrength"),n("setOpMixRatio"),n("spread"),n("transformQueueSize"),this.targetNNeighbors=e.nNeighbors||this.nNeighbors||this.targetNNeighbors}fit(e){return this.initializeFit(e),this.optimizeLayout(),this.embedding}async fitAsync(e,n=()=>!0){return this.initializeFit(e),await this.optimizeLayoutAsync(n),this.embedding}setSupervisedProjection(e,n={}){this.Y=e,this.targetMetric=n.targetMetric||this.targetMetric,this.targetWeight=n.targetWeight||this.targetWeight,this.targetNNeighbors=n.targetNNeighbors||this.targetNNeighbors}setPrecomputedKNN(e,n){this.knnIndices=e,this.knnDistances=n}initializeFit(e){if(e.length<=this.nNeighbors)throw new Error(`Not enough data points (${e.length}) to create nNeighbors: ${this.nNeighbors}. Add more data points or adjust the configuration.`);if(this.X===e&&this.isInitialized)return this.getNEpochs();if(this.X=e,!this.knnIndices&&!this.knnDistances){const n=this.nearestNeighbors(e);this.knnIndices=n.knnIndices,this.knnDistances=n.knnDistances}this.graph=this.fuzzySimplicialSet(e,this.nNeighbors,this.setOpMixRatio),this.makeSearchFns(),this.searchGraph=this.makeSearchGraph(e),this.processGraphForSupervisedProjection();const{head:n,tail:t,epochsPerSample:r}=this.initializeSimplicialSetEmbedding();return this.optimizationState.head=n,this.optimizationState.tail=t,this.optimizationState.epochsPerSample=r,this.initializeOptimization(),this.prepareForOptimizationLoop(),this.isInitialized=!0,this.getNEpochs()}makeSearchFns(){const{initFromTree:e,initFromRandom:n}=(t=this.distanceFn,{initFromRandom:function(e,n,r,i,a){for(let s=0;s<r.length;s++){const o=P(e,n.length,a);for(let e=0;e<o.length;e++)o[e]<0||R(i,s,t(n[o[e]],r[s]),o[e],1)}},initFromTree:function(e,n,r,i,a){for(let s=0;s<r.length;s++){const o=te(r[s],e,a);for(let e=0;e<o.length;e++){if(o[e]<0)return;R(i,s,t(n[o[e]],r[s]),o[e],1)}}}});var t;this.initFromTree=e,this.initFromRandom=n,this.search=function(e){return function(n,t,r,i){const{indices:a,indptr:s}=W(t);for(let t=0;t<i.length;t++){const o=new Set(r[0][t]);for(;;){const u=_(r,t);if(-1===u)break;const l=a.slice(s[u],s[u+1]);for(const a of l)a===u||-1===a||o.has(a)||(U(r,t,e(n[a],i[t]),a,1),o.add(a))}}return r}}(this.distanceFn)}makeSearchGraph(e){const n=this.knnIndices,t=this.knnDistances,r=[e.length,e.length],i=new z([],[],[],r);for(let e=0;e<n.length;e++){const r=n[e],a=t[e];for(let n=0;n<r.length;n++){const t=r[n],s=a[n];s>0&&i.set(e,t,s)}}return K(i,L(i),((e,n)=>e>n?e:n))}transform(e){const n=this.X;if(void 0===n||0===n.length)throw new Error("No data has been fit.");let t=Math.floor(this.nNeighbors*this.transformQueueSize);t=Math.min(n.length,t);const r=function(e,n,t,r,i,a,s){const o=D(t.length,r);if(i(r,n,t,o,s),e)for(const r of e)a(r,n,t,o,s);return o}(this.rpForest,n,e,t,this.initFromRandom,this.initFromTree,this.random),i=this.search(n,this.searchGraph,r,e);let{indices:a,weights:s}=T(i);a=a.map((e=>e.slice(0,this.nNeighbors))),s=s.map((e=>e.slice(0,this.nNeighbors)));const o=Math.max(0,this.localConnectivity-1),{sigmas:u,rhos:l}=this.smoothKNNDistance(s,this.nNeighbors,o),{rows:c,cols:f,vals:h}=this.computeMembershipStrengths(a,s,u,l),d=[e.length,n.length];let p=new z(c,f,h,d);const m=W(q(p,"l1")),g=e.length,y=function(e,n,t){const r=I(e.length).map((e=>I(t[0].length)));for(let i=0;i<e.length;i++)for(let a=0;a<e[0].length;a++)for(let s=0;s<t[0].length;s++){const o=e[i][a];r[i][s]+=n[i][a]*t[o][s]}return r}(C(m.indices,g,this.nNeighbors),C(m.values,g,this.nNeighbors),this.embedding),w=this.nEpochs?this.nEpochs/3:p.nRows<=1e4?100:30,b=p.getValues().reduce(((e,n)=>n>e?n:e),0);p=p.map((e=>e<b/w?0:e)),p=Y(p);const x=this.makeEpochsPerSample(p.getValues(),w),v=p.getRows(),A=p.getCols();return this.assignOptimizationStateParameters({headEmbedding:y,tailEmbedding:this.embedding,head:v,tail:A,currentEpoch:0,nEpochs:w,nVertices:p.getDims()[1],epochsPerSample:x}),this.prepareForOptimizationLoop(),this.optimizeLayout()}processGraphForSupervisedProjection(){const{Y:e,X:n}=this;if(e){if(e.length!==n.length)throw new Error("Length of X and y must be equal");if("categorical"===this.targetMetric){const n=this.targetWeight<1?1/(1-this.targetWeight)*2.5:1e12;this.graph=this.categoricalSimplicialSetIntersection(this.graph,e,n)}}}step(){const{currentEpoch:e}=this.optimizationState;return e<this.getNEpochs()&&this.optimizeLayoutStep(e),this.optimizationState.currentEpoch}getEmbedding(){return this.embedding}nearestNeighbors(e){const{distanceFn:n,nNeighbors:t}=this,r=function(e,n){return function(t,r,i,a=10,s=50,o=.001,u=.5,l=!0){const c=t.length,f=D(t.length,i);for(let r=0;r<t.length;r++){const a=k(i,t.length,n);for(let n=0;n<a.length;n++){const i=e(t[r],t[a[n]]);R(f,r,i,a[n],1),R(f,a[n],i,r,1)}}if(l)for(let n=0;n<r.length;n++)for(let i=0;i<r[n].length&&!(r[n][i]<0);i++)for(let a=i+1;a<r[n].length&&!(r[n][a]<0);a++){const s=e(t[r[n][i]],t[r[n][a]]);R(f,r[n][i],s,r[n][a],1),R(f,r[n][a],s,r[n][i],1)}for(let r=0;r<a;r++){const r=O(f,c,i,s,n);let a=0;for(let i=0;i<c;i++)for(let o=0;o<s;o++){const l=Math.floor(r[0][i][o]);if(!(l<0||v(n)<u))for(let n=0;n<s;n++){const s=Math.floor(r[0][i][n]),u=r[2][i][o],c=r[2][i][n];if(s<0||!u&&!c)continue;const h=e(t[l],t[s]);a+=R(f,l,h,s,1),a+=R(f,s,h,l,1)}}if(a<=o*i*t.length)break}return T(f)}}(n,this.random),i=5+Math.floor(.5==(a=e.length**.5/20)?0:Math.round(a));var a;const s=Math.max(5,Math.floor(Math.round((e=>Math.log(e)/Math.log(2))(e.length))));this.rpForest=Z(e,t,i,this.random);const o=function(e){if(e.length>0){const n=[];for(const t of e)n.push(...t.indices);return n}return[[-1]]}(this.rpForest),{indices:u,weights:l}=r(e,o,t,s);return{knnIndices:u,knnDistances:l}}fuzzySimplicialSet(e,n,t=1){const{knnIndices:r=[],knnDistances:i=[],localConnectivity:a}=this,{sigmas:s,rhos:o}=this.smoothKNNDistance(i,n,a),{rows:u,cols:l,vals:c}=this.computeMembershipStrengths(r,i,s,o),f=[e.length,e.length],h=new z(u,l,c,f),d=L(h),p=G(h,d),m=F($(h,d),p);return $(j(m,t),j(p,1-t))}categoricalSimplicialSetIntersection(e,n,t,r=1){let i=function(e,n,t=1,r=5){return e.map(((e,i,a)=>-1===n[i]||-1===n[a]?e*Math.exp(-t):n[i]!==n[a]?e*Math.exp(-r):e))}(e,n,r,t);return i=Y(i),function(e){const n=L(e=q(e,"max"));return Y(e=$(e,F(n,G(n,e))))}(i)}smoothKNNDistance(e,n,t=1,r=64,i=1){const a=Math.log(n)/Math.log(2)*i,s=I(e.length),o=I(e.length);for(let n=0;n<e.length;n++){let i=0,u=1/0,l=1;const c=e[n],f=c.filter((e=>e>0));if(f.length>=t){const e=Math.floor(t),r=t-e;e>0?(s[n]=f[e-1],r>ue&&(s[n]+=r*(f[e]-f[e-1]))):s[n]=r*f[0]}else f.length>0&&(s[n]=N(f));for(let t=0;t<r;t++){let t=0;for(let r=1;r<e[n].length;r++){const i=e[n][r]-s[n];t+=i>0?Math.exp(-i/l):1}if(Math.abs(t-a)<ue)break;t>a?(u=l,l=(i+u)/2):(i=l,u===1/0?l*=2:l=(i+u)/2)}if(o[n]=l,s[n]>0){const e=M(c);o[n]<le*e&&(o[n]=le*e)}else{const t=M(e.map(M));o[n]<le*t&&(o[n]=le*t)}}return{sigmas:o,rhos:s}}computeMembershipStrengths(e,n,t,r){const i=e.length,a=e[0].length,s=I(i*a),o=I(i*a),u=I(i*a);for(let l=0;l<i;l++)for(let i=0;i<a;i++){let c=0;-1!==e[l][i]&&(c=e[l][i]===l?0:n[l][i]-r[l]<=0?1:Math.exp(-(n[l][i]-r[l])/t[l]),s[l*a+i]=l,o[l*a+i]=e[l][i],u[l*a+i]=c)}return{rows:s,cols:o,vals:u}}initializeSimplicialSetEmbedding(){const e=this.getNEpochs(),{nComponents:n}=this,t=this.graph.getValues();let r=0;for(let e=0;e<t.length;e++){const n=t[e];r<t[e]&&(r=n)}const i=this.graph.map((n=>n<r/e?0:n));this.embedding=I(i.nRows).map((()=>I(n).map((()=>20*v(this.random)-10))));const a=[],s=[],o=[],u=i.getAll();for(let e=0;e<u.length;e++){const n=u[e];n.value&&(a.push(n.value),o.push(n.row),s.push(n.col))}return{head:s,tail:o,epochsPerSample:this.makeEpochsPerSample(a,e)}}makeEpochsPerSample(e,n){const t=E(e.length,-1),r=N(e),i=e.map((e=>e/r*n));return i.forEach(((e,r)=>{e>0&&(t[r]=n/i[r])})),t}assignOptimizationStateParameters(e){Object.assign(this.optimizationState,e)}prepareForOptimizationLoop(){const{repulsionStrength:e,learningRate:n,negativeSampleRate:t}=this,{epochsPerSample:r,headEmbedding:i,tailEmbedding:a}=this.optimizationState,s=i[0].length,o=i.length===a.length,u=r.map((e=>e/t)),l=[...u],c=[...r];this.assignOptimizationStateParameters({epochOfNextSample:c,epochOfNextNegativeSample:l,epochsPerNegativeSample:u,moveOther:o,initialAlpha:n,alpha:n,gamma:e,dim:s})}initializeOptimization(){const e=this.embedding,n=this.embedding,{head:t,tail:r,epochsPerSample:i}=this.optimizationState,a=this.getNEpochs(),s=this.graph.nCols,{a:o,b:u}=function(e,n){const t=function(e,n){return A(300).map(((e,t)=>0+t*((n-0)/299)))}(0,3*e).map((e=>e<n?1:e)),r=I(t.length).map(((r,i)=>t[i]>=n?Math.exp(-(t[i]-n)/e):r)),i={x:t,y:r},{parameterValues:a}=function(e,n,t={}){let{maxIterations:r=100,gradientDifference:i=.1,damping:a=0,errorTolerance:s=.01,minValues:o,maxValues:u,initialValues:l}=t;if(a<=0)throw new Error("The damping option must be a positive number");if(!e.x||!e.y)throw new Error("The data parameter must have x and y elements");if(!ie(e.x)||e.x.length<2||!ie(e.y)||e.y.length<2)throw new Error("The data parameter elements must be an array with more than 2 points");if(e.x.length!==e.y.length)throw new Error("The data parameter elements must have the same size");let c=l||new Array(n.length).fill(1),f=c.length;if(u=u||new Array(f).fill(Number.MAX_SAFE_INTEGER),o=o||new Array(f).fill(Number.MIN_SAFE_INTEGER),u.length!==o.length)throw new Error("minValues and maxValues must be the same size");if(!ie(c))throw new Error("initialValues must be an array");let h,d=ae(e,c,n),p=d<=s;for(h=0;h<r&&!p;h++){c=oe(e,c,a,i,n);for(let e=0;e<f;e++)c[e]=Math.min(Math.max(o[e],c[e]),u[e]);if(d=ae(e,c,n),isNaN(d))break;p=d<=s}return{parameterValues:c,parameterError:d,iterations:h}}(i,(([e,n])=>t=>1/(1+e*t**(2*n))),{damping:1.5,initialValues:[.5,.5],gradientDifference:.1,maxIterations:100,errorTolerance:.01}),[s,o]=a;return{a:s,b:o}}(this.spread,this.minDist);this.assignOptimizationStateParameters({headEmbedding:e,tailEmbedding:n,head:t,tail:r,epochsPerSample:i,a:o,b:u,nEpochs:a,nVertices:s})}optimizeLayoutStep(e){const{optimizationState:n}=this,{head:t,tail:r,headEmbedding:i,tailEmbedding:a,epochsPerSample:s,epochOfNextSample:o,epochOfNextNegativeSample:u,epochsPerNegativeSample:l,moveOther:c,initialAlpha:f,alpha:h,gamma:d,a:p,b:m,dim:g,nEpochs:y,nVertices:w}=n;for(let n=0;n<s.length;n++){if(o[n]>e)continue;const f=t[n],y=r[n],b=i[f],v=a[y],A=pe(b,v);let S=0;A>0&&(S=-2*p*m*Math.pow(A,m-1),S/=p*Math.pow(A,m)+1);for(let e=0;e<g;e++){const n=de(S*(b[e]-v[e]),4);b[e]+=n*h,c&&(v[e]+=-n*h)}o[n]+=s[n];const E=Math.floor((e-u[n])/l[n]);for(let e=0;e<E;e++){const e=x(w,this.random),n=a[e],t=pe(b,n);let r=0;if(t>0)r=2*d*m,r/=(.001+t)*(p*Math.pow(t,m)+1);else if(f===e)continue;for(let e=0;e<g;e++){let t=4;r>0&&(t=de(r*(b[e]-n[e]),4)),b[e]+=t*h}}u[n]+=E*l[n]}return n.alpha=f*(1-e/y),n.currentEpoch+=1,i}optimizeLayoutAsync(e=()=>!0){return new Promise(((n,t)=>{const r=async()=>{try{const{nEpochs:t,currentEpoch:i}=this.optimizationState;this.embedding=this.optimizeLayoutStep(i);const a=this.optimizationState.currentEpoch,s=!1===e(a),o=a===t;if(s||o)return n(o);setTimeout((()=>r()),0)}catch(e){t(e)}};setTimeout((()=>r()),0)}))}optimizeLayout(e=()=>!0){let n=!1,t=[];for(;!n;){const{nEpochs:r,currentEpoch:i}=this.optimizationState;t=this.optimizeLayoutStep(i);const a=this.optimizationState.currentEpoch,s=!1===e(a);n=a===r||s}return t}getNEpochs(){const e=this.graph;if(this.nEpochs>0)return this.nEpochs;if(!e)return 200;const n=e.nRows;return n<=2500?500:n<=5e3?400:n<=7500?300:200}}function fe(e,n){return Math.abs(e-n)}class he{constructor(){this.currentEpoch=0,this.headEmbedding=[],this.tailEmbedding=[],this.head=[],this.tail=[],this.epochsPerSample=[],this.epochOfNextSample=[],this.epochOfNextNegativeSample=[],this.epochsPerNegativeSample=[],this.moveOther=!0,this.initialAlpha=1,this.alpha=1,this.gamma=1,this.a=1.5769434603113077,this.b=.8950608779109733,this.dim=2,this.nEpochs=500,this.nVertices=0}}function de(e,n){return e>n?n:e<-n?-n:e}function pe(e,n){let t=0;for(let r=0;r<e.length;r++)t+=Math.pow(e[r]-n[r],2);return t}function me(e=!1,n="Assertion error."){if(!e)throw new Error(n)}var ge=t(5731),ye=t(8774),we=t(7391),be=t.n(we);class xe{assert(e,n){if(!e)throw n||"Assertion failed"}getopt(e,n,t){return e.hasOwnProperty(n)?e[n]:t}gaussRandom(){if(this.returnV)return this.returnV=!1,this.vValue;const e=2*this.random()-1,n=2*this.random()-1,t=e*e+n*n;if(0===t||t>1)return this.gaussRandom();const r=Math.sqrt(-2*Math.log(t)/t);return this.vValue=n*r,this.returnV=!0,e*r}randn(e,n){return e+this.gaussRandom()*n}zeros(e){if(void 0===e||isNaN(e))return new Float32Array;if("undefined"==typeof ArrayBuffer){const n=new Float32Array(e);for(let t=0;t<e;t++)n[t]=0;return n}return new Float32Array(e)}randn2d(e,n,t){const r=void 0!==t,i=new Array(e).fill(null).map((()=>new Float32Array(n)));if(r)for(let r=0;r<e;r++)i[r]=new Float32Array(n).fill(t);else for(let t=0;t<e;t++)for(let e=0;e<n;e++)i[t][e]=this.randn(0,1e-4);return i}l2(e,n){const t=e.length;let r=0;for(let i=0;i<t;i++){const t=e[i],a=n[i];r+=(t-a)*(t-a)}return r}xtod(e){const n=e.length,t=this.zeros(n*n);for(let r=0;r<n;r++)for(let i=r+1;i<n;i++){const a=this.l2(e[r],e[i]);t[r*n+i]=a,t[i*n+r]=a}return t}getIterSize(e){return e<=2e3?100:e<=3e3?90:e<=5e3?80:70}d2p(e,n,t,r){const i=(s=r,(e,n)=>s*e+n-Math.floor((e+2)*(e+1)/2)),a=new Float32Array(r*r);var s;for(let n=0;n<r;n++)for(let t=n+1;t<r;t++)a[n*r+t]=a[t*r+n]=e[i(n,t)];const o=r,u=Math.log(n),l=this.zeros(o*o),c=this.zeros(o);for(let e=0;e<o;e++){let n=-1/0,i=1/0,s=1,f=!1;const h=Math.floor(this.getIterSize(r)/5);let d=0;for(;!f;){let r=0;for(let n=0;n<o;n++){const t=e===n?0:Math.exp(-a[e*o+n]*s);c[n]=t,r+=t}let l=0;for(let e=0;e<o;e++){let n;n=0===r?0:c[e]/r,c[e]=n,n>1e-7&&(l-=n*Math.log(n))}l>u?(n=s,i===1/0?s*=2:s=(s+i)/2):(i=s,n===-1/0?s/=2:s=(s+n)/2),d++,Math.abs(l-u)<t&&(f=!0),d>=h&&(f=!0)}for(let n=0;n<o;n++)l[e*o+n]=c[n]}const f=this.zeros(o*o),h=2*o;for(let e=0;e<o;e++)for(let n=0;n<o;n++)f[e*o+n]=Math.max((l[e*o+n]+l[n*o+e])/h,1e-100);return f}sign(e){return e>0?1:e<0?-1:0}constructor(e){this.iter=0,this.random=Math.random,this.returnV=!1,this.vValue=0,e=e||{},this.perplexity=this.getopt(e,"perplexity",30),this.dim=this.getopt(e,"dim",2),this.epsilon=this.getopt(e,"epsilon",10),this.random=this.getopt(e,"random",Math.random)}initDataRaw(e){const n=e.length,t=e[0].length;this.assert(n>0," X is empty? You must have some data!"),this.assert(t>0," X[0] is empty? Where is the data?");const r=this.xtod(e);this.P=this.d2p(r,this.perplexity,1e-4,t),this.N=n,this.initSolution()}initDataDist(e,n){const t=e.length;this.assert(t>0," X is empty? You must have some data!"),console.time("distances to matrix"),this.P=this.d2p(e,this.perplexity,1e-4,n),console.timeEnd("distances to matrix"),this.N=n,this.initSolution()}initSolution(){this.Y=this.randn2d(this.N,this.dim),this.gains=this.randn2d(this.N,this.dim,1),this.ystep=this.randn2d(this.N,this.dim,0),this.iter=0}getSolution(){return this.Y}step(){this.iter+=1;const e=this.N,n=this.costGrad(this.Y),t=n.cost,r=n.grad,i=this.zeros(this.dim);for(let n=0;n<e;n++)for(let e=0;e<this.dim;e++){const t=r[n][e],a=this.ystep[n][e],s=this.gains[n][e];let o=this.sign(t)===this.sign(a)?.8*s:s+.2;o<.01&&(o=.01),this.gains[n][e]=o;const u=(this.iter<250?.5:.8)*a-this.epsilon*o*r[n][e];this.ystep[n][e]=u,this.Y[n][e]+=u,i[e]+=this.Y[n][e]}for(let n=0;n<e;n++)for(let t=0;t<this.dim;t++)this.Y[n][t]-=i[t]/e;return t}debugGrad(){const e=this.N,n=this.costGrad(this.Y).grad,t=1e-5;for(let r=0;r<e;r++)for(let e=0;e<this.dim;e++){const i=this.Y[r][e];this.Y[r][e]=i+t;const a=this.costGrad(this.Y);this.Y[r][e]=i-t;const s=this.costGrad(this.Y),o=n[r][e],u=(a.cost-s.cost)/(2*t);console.log(r+","+e+": gradcheck analytic: "+o+" vs. numerical: "+u),this.Y[r][e]=i}}costGrad(e){const n=this.N,t=this.dim,r=this.P,i=this.iter<100?4:1;this.quArr??(this.quArr=this.zeros(n*n));let a=0;for(let r=0;r<n;r++)for(let i=r+1;i<n;i++){const s=1/(1+new Array(t).reduce(((n,t,a)=>n+Math.pow(e[r][a]-e[i][a],2)),0));this.quArr[r*n+i]=s,this.quArr[i*n+r]=s,a+=2*s}let s=0;const o=new Array(n).fill(null).map((()=>new Float32Array(t).fill(0)));for(let u=0;u<n;u++)for(let l=u+1;l<n;l++){const c=Math.max(this.quArr[u*n+l]/a,1e-100);s+=-r[u*n+l]*Math.log(c)*2;const f=4*(i*r[u*n+l]-c)*this.quArr[u*n+l];for(let n=0;n<t;n++)o[u][n]+=f*(e[u][n]-e[l][n]),o[l][n]+=f*(e[l][n]-e[u][n])}return{cost:s,grad:o}}}t(5540);let ve=null,Ae=null;function Se(){return e=this,n=void 0,r=function*(){if(!navigator.gpu)return console.error("WebGPU is not supported in this browser"),null;if(!ve&&(ve=yield navigator.gpu.requestAdapter({powerPreference:"high-performance"}),null==ve))return null;let e=!1;if(Ae&&(Ae.lost.then((()=>{e=!0})),yield new Promise((e=>setTimeout(e,10)))),!Ae||e){const e=1e9,n=ve.limits,t=n.maxBufferSize,r=n.maxStorageBufferBindingSize;try{return Ae=yield ve.requestDevice({requiredLimits:{maxBufferSize:Math.min(t,e),maxStorageBufferBindingSize:Math.min(r,e)}}),Ae}catch(e){return console.error("Failed to create device with required limits",e),Ae=yield ve.requestDevice(),Ae}}return Ae},new((t=void 0)||(t=Promise))((function(i,a){function s(e){try{u(r.next(e))}catch(e){a(e)}}function o(e){try{u(r.throw(e))}catch(e){a(e)}}function u(e){var n;e.done?i(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(s,o)}u((r=r.apply(e,n||[])).next())}));var e,n,t,r}var Ee,Ie;(Ie=Ee||(Ee={})).EUCLIDEAN="EUCLIDEAN",Ie.MANHATTAN="MANHATTAN";const Me={[Ee.EUCLIDEAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `},[Ee.MANHATTAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `}};var Ne,Pe;(Pe=Ne||(Ne={})).HAMMING="Hamming",Pe.EUCLIDEAN="Euclidean",Pe.VECTOR_COSINE="Vector Cosine",Pe.MANHATTAN="Manhattan",Pe.TANIMOTO="Tanimoto",Pe.LEVENSTEIN="Levenshtein",Pe.NEEDLEMAN_WUNSCH="Needlemann-Wunsch",Pe.MONOMER_CHEMICAL_DISTANCE="Monomer chemical distance",Pe.SOKAL="Sokal",Pe.COSINE="Cosine",Pe.ASYMMETRIC="Asymmetric",Pe.Difference="Difference",Pe.OneHot="One-Hot";const Ce={[Ne.HAMMING]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[Ne.EUCLIDEAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `},[Ne.MANHATTAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `},[Ne.VECTOR_COSINE]:function(e,n){return`\n var dist: f32 = 0.0;\n var productSum: f32 = 0.0;\n var aSquareSum: f32 = 0.0;\n var bSquareSum: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n productSum = productSum + f32(a[i] * b[i]);\n aSquareSum = aSquareSum + f32(a[i] * a[i]);\n bSquareSum = bSquareSum + f32(b[i] * b[i]);\n }\n var sim = productSum / (sqrt(aSquareSum) * sqrt(bSquareSum));\n return (1.0 - sim) / 2.0;\n `},[Ne.TANIMOTO]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `},[Ne.LEVENSTEIN]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `},[Ne.NEEDLEMAN_WUNSCH]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${e+1}u>;\n var horizontalGaps: array<u32, ${e+1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${n};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${n};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty; // accounting for the fact that left and right gaps are less costly\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${n}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0 || i == 1 || i == bLength) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0 || j == 1 || j == aLength) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(minLength);\n\n `},[Ne.MONOMER_CHEMICAL_DISTANCE]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${n}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[Ne.SOKAL]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `},[Ne.COSINE]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `},[Ne.ASYMMETRIC]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `},[Ne.Difference]:function(e,n){return`\n let range = suppInfo.range${n};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `},[Ne.OneHot]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `}},De={[Ne.HAMMING]:e=>Math.ceil(e/30),[Ne.EUCLIDEAN]:e=>Math.ceil(e/30),[Ne.MANHATTAN]:e=>Math.ceil(e/30),[Ne.TANIMOTO]:e=>Math.ceil(e/30),[Ne.SOKAL]:e=>Math.ceil(e/30),[Ne.COSINE]:e=>Math.ceil(e/30),[Ne.ASYMMETRIC]:e=>Math.ceil(e/30),[Ne.LEVENSTEIN]:e=>Math.ceil(e*e/60),[Ne.NEEDLEMAN_WUNSCH]:e=>Math.ceil(e*e/60),[Ne.MONOMER_CHEMICAL_DISTANCE]:e=>Math.ceil(e/25),[Ne.Difference]:e=>1,[Ne.OneHot]:e=>Math.ceil(e/40),[Ne.VECTOR_COSINE]:e=>Math.ceil(e/30)},ke={STRING:new Set([Ne.HAMMING,Ne.LEVENSTEIN,Ne.NEEDLEMAN_WUNSCH,Ne.MONOMER_CHEMICAL_DISTANCE,Ne.OneHot]),UINT32ARRAY:new Set([Ne.HAMMING,Ne.EUCLIDEAN,Ne.MANHATTAN,Ne.MONOMER_CHEMICAL_DISTANCE,Ne.LEVENSTEIN,Ne.NEEDLEMAN_WUNSCH,Ne.TANIMOTO,Ne.COSINE,Ne.VECTOR_COSINE,Ne.SOKAL,Ne.ASYMMETRIC,Ne.OneHot,Ne.Difference]),INT32ARRAY:new Set([Ne.EUCLIDEAN,Ne.MANHATTAN,Ne.OneHot,Ne.Difference,Ne.VECTOR_COSINE]),FLOAT32ARRAY:new Set([Ne.EUCLIDEAN,Ne.MANHATTAN,Ne.Difference,Ne.VECTOR_COSINE]),NUMBER:new Set([Ne.EUCLIDEAN,Ne.MANHATTAN,Ne.Difference]),BITARRAY:new Set([Ne.TANIMOTO,Ne.COSINE,Ne.SOKAL,Ne.ASYMMETRIC])};var Re,Ue,Oe;function Te(e,n=15,t,r,i,a){return s=this,o=void 0,l=function*(){if(a.length!==e.length||a.length!==t.length||a.length!==i.length)throw new Error("Options, weigths and distance functions must be provided for each column");if(e.some((n=>n.length!==e[0].length)))throw new Error("All entry lists must be the same length");const s=Object.values(Ne);if(t.some((e=>!s.includes(e))))throw new Error("Invalid distance metrics provided: "+t.join(", "));if(!Object.values(Ee).includes(r))throw new Error("Invalid aggregation function provided: "+r);const o=e.length;if(0===o)throw new Error("No columns provided. Please provide at least one column of data.");const u=yield Se();if(!u)return null;let l=!1;u.lost.then((()=>{l=!0}));const c=e[0].length,f=e.map(((e,n)=>function(e,n=Ne.HAMMING,t,r={gapOpenPenalty:1,gapExtensionPenalty:.6}){var i,a;let s=null;const o=e.some((e=>"string"==typeof e))?(s="STRING",e.map((e=>new Uint32Array(e.split("").map((e=>e.charCodeAt(0))))))):e.some((e=>"number"==typeof e))?(s="NUMBER",e.map((e=>new Float32Array([e])))):"object"==typeof e[0]&&e.some((e=>"_data"in e&&"_length"in e))?(s="BITARRAY",e.map((e=>e._data))):e.some((e=>e instanceof Float32Array))?(s="FLOAT32ARRAY",e):e.some((e=>e instanceof Uint32Array))?(s="UINT32ARRAY",e):e.some((e=>e instanceof Int32Array))?(s="INT32ARRAY",e):void 0;if(!o||!s)throw new Error("Invalid entry type, could not determine entry type from input list");const u=o[0]instanceof Int32Array?"INT32ARRAY":o[0]instanceof Float32Array?"FLOAT32ARRAY":"UINT32ARRAY",l=new Uint32Array(o.map((e=>e.length)));if(!ke[s]||!ke[s].has(n))throw new Error(`Distance metric '${n}' not supported for entry type '${s}'`);const c=l.reduce(((e,n)=>Math.max(e,n)),0),f=De[n](c),h="INT32ARRAY"===u?Int32Array:"FLOAT32ARRAY"===u?Float32Array:Uint32Array,d=new h(o.length*c);o.forEach(((e,n)=>{d.set(e,n*c)}));let p="",m=0,g="FLOAT32ARRAY",y=null;if(n===Ne.NEEDLEMAN_WUNSCH||n===Ne.MONOMER_CHEMICAL_DISTANCE){let e=r.scoringMatrix&&r.alphabetIndexes?Object.keys(r.alphabetIndexes).reduce(((e,n)=>Math.max(e,n.charCodeAt(0))),0):-1;if(!r.alphabetIndexes||!r.scoringMatrix){for(let n=0;n<d.length;n++)d[n]>e&&(e=d[n]);r.scoringMatrix=new Array(e+1).fill(null).map((()=>new Array(e+1).fill(0))),r.alphabetIndexes={};for(let e=0;e<r.scoringMatrix.length;e++)r.scoringMatrix[e][e]=1,r.alphabetIndexes[String.fromCharCode(e)]=e}const n=(e+1)*(e+1),s=new Array(e+1).fill(null).map((()=>new Float32Array(e+1)));for(let n=0;n<e+1;n++)s[n][n]=1;const o=r.alphabetIndexes;for(const e of Object.keys(o))for(const n of Object.keys(o))e!==n&&(s[e.charCodeAt(0)][n.charCodeAt(0)]=r.scoringMatrix[o[e]][o[n]]);m=2+n,g="FLOAT32ARRAY",y=new Float32Array(m),y[0]=null!==(i=r.gapOpenPenalty)&&void 0!==i?i:1,y[1]=null!==(a=r.gapExtensionPenalty)&&void 0!==a?a:.6;let u=2;for(let e=0;e<s.length;e++)y.set(s[e],u),u+=s[e].length;p=`\n gapOpenPenalty${t}: f32,\n gapExtensionPenalty${t}: f32,\n similarityMatrix${t}: array<array<f32, ${e+1}>, ${e+1}>`}else if(n===Ne.Difference){if(!r.range||"number"!=typeof r.range||r.range<=0){const e=d.reduce(((e,n)=>Math.min(e,n)),d[0]),n=d.reduce(((e,n)=>Math.max(e,n)),d[0]);r.range=n-e}r.range<=0&&(r.range=1),m=1,g="FLOAT32ARRAY",y=new Float32Array([r.range]),p=`\n range${t}: f32`}const w=d instanceof Int32Array?"i32":d instanceof Float32Array?"f32":"u32",b=`data${t}: array<array<${w}, ${c}>, ${o.length}>`;return{flatSourceArray:d,sourceArraySize:d.length,maxEntryLen:c,arraySizes:l,complexity:f,suppInfoBuffer:y,suppInfoSize:m,suppInfoType:g,suppInfoStructWgsl:p,entryType:s,dataTypeWGSL:w,dataStructWgsl:b,EncodedArrayConstructor:h}}(e,t[n],n,a[n])));1===o&&(r=Ee.MANHATTAN);let h=f.map((e=>e.suppInfoStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),d=!1;h&&""!=h.trim()||(d=!0,h="\ndummy: f32\n");const p=f.reduce(((e,n)=>e+n.complexity),0),m=f.map((e=>e.dataStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),g=new Uint32Array(o*c);f.forEach(((e,n)=>{g.set(e.arraySizes,n*c)}));const y=1e4,w=Math.ceil(1e4/p),b=Math.ceil(Math.sqrt(Math.ceil(100))),x=10*b,v=new Array(c).fill(null).map((()=>new Uint32Array(n))),A=new Array(c).fill(null).map((()=>new Float32Array(n))),S=u.createShaderModule({label:"KNN compute shader",code:`\n // this struct will contain all the info about the computation, startAtEndAt will contain the start and end of the knnDistances and knnIndexes.\n // array of sizes for each entries, and the main data as arrays of arrays called data0, data1 and so on. good thing is that because the first entry is vec4<u32>,\n // there will be no paddings, so no need to worry about padding data. also, arrays and matrices get stucked together, so no padding there as well.\n // what we need to worry about is the padding of overall struct. the size of overall struct will be factor of 16 bytes, so keep that in mind.\n struct ComputeInfo {\n // the x coordinate will contain the start index of the knnDistances and knnIndexes, while y will contain the end index \n // the z coordinate will contain the start of the pair comparisons, while w will contain the end of the pair comparisons\n // just keep in mind that this vec4 will be in first 16 bytes of corresponding buffer.\n startAtEndAt: vec4<u32>,\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${c}>, ${o}>,\n // the weights for each entry\n weights: array<f32, ${o}>,\n // the data for each entry\n ${m} // an example of the dataWgsl would be:\n //data0: array<array<u32,20>,100>,\n //data1: array<array<u32,20>,100>\n };\n\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${h}\n };\n \n @group(0) @binding(0) var<storage, read_write> knnIndexes: array<array<u32, ${n}>, 10000>;\n @group(0) @binding(1) var<storage, read_write> knnDistances: array<array<f32, ${n}>, 10000>; // each time just compute for a subset of the list\n @group(0) @binding(2) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(3) var<storage, read_write> suppInfo: SuppInfo;\n \n @compute @workgroup_size(10, 10) fn calcKNN(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${d?"let otherDummy = suppInfo.dummy * 2;":""} // just to make sure that the suppInfo is not optimized out\n let col = id.x; //* 10 + localId.x;\n let row = id.y; //* 10 + localId.y;\n let graphIndex = row * ${x} + col;\n let index = graphIndex + computeInfo.startAtEndAt.x; // add the starting index of the knnDistances and knnIndexes\n \n if (index >= min(${c}u, computeInfo.startAtEndAt.y)) {return;}\n \n let pairComparisonStartAt = computeInfo.startAtEndAt.z;\n let pairComparisonEndAt = min(computeInfo.startAtEndAt.w, ${c}u);\n \n \n // only clear the knnDistances and knnIndexes if we are at the start of the pair comparison\n if (pairComparisonStartAt == 0u) {\n for (var i = 0u; i < ${n}; i = i + 1u) {\n knnDistances[graphIndex][i] = 99999.0;\n knnIndexes[graphIndex][i] = 0u;\n }\n }\n \n for (var i: u32 = pairComparisonStartAt; i < pairComparisonEndAt; i = i + 1u) {\n if (i == index) {continue;}\n let dist = combinedDistance(index, i);\n insertKnn(graphIndex, dist, i);\n }\n \n }\n // this will generate the distance script for each distance metric and then combine them into one\n ${Be(t,f.map((e=>e.maxEntryLen)),n,r)}\n \n fn insertKnn(knnIndex: u32, dist: f32, index: u32) {\n // small optimization, if the distance is larger than the last element in the knnDistances, we can skip\n if (dist >= knnDistances[knnIndex][${n} - 1u]) {return;}\n for (var i = 0u; i < ${n}; i = i + 1u) {\n if (dist < knnDistances[knnIndex][i]) {\n for (var j = ${n} - 1u; j > i; j = j - 1u) {\n knnDistances[knnIndex][j] = knnDistances[knnIndex][j - 1u];\n knnIndexes[knnIndex][j] = knnIndexes[knnIndex][j - 1u];\n }\n knnDistances[knnIndex][i] = dist;\n knnIndexes[knnIndex][i] = index;\n return;\n }\n }\n }\n `}),E=u.createComputePipeline({label:"hamming compute pipeline",layout:"auto",compute:{module:S,entryPoint:"calcKNN"}}),I=4+o*c+o+f.reduce(((e,n)=>e+n.sourceArraySize),0),M=f.reduce(((e,n)=>e+n.suppInfoSize),0),N=I*Uint32Array.BYTES_PER_ELEMENT;let P=N;const C=15&N;0!==C&&(P+=16-C);const D=u.createBuffer({label:"compute info buffer",size:P,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),k=D.getMappedRange();let R=0,U=y,O=0,T=w,B=0;new Uint32Array(k,B,4).set([R,U,O,T]),B+=4*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(k,B,g.length).set(g),B+=g.byteLength,new Float32Array(k,B,o).set(i),B+=o*Float32Array.BYTES_PER_ELEMENT;for(const e of f){const n=e.EncodedArrayConstructor,t=e.sourceArraySize;new n(k,B,t).set(e.flatSourceArray),B+=t*n.BYTES_PER_ELEMENT}D.unmap();const _=M*Uint32Array.BYTES_PER_ELEMENT;let z=_;const L=15&_;0!==L&&(z+=16-L),z=Math.max(z,16);const G=u.createBuffer({label:"supp info buffer",size:z,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),$=G.getMappedRange();let F=0;for(const e of f)e.suppInfoBuffer&&e.suppInfoBuffer.byteLength>0&&e.suppInfoSize>0&&(new("UINT32ARRAY"===e.suppInfoType?Uint32Array:Float32Array)($,F,e.suppInfoBuffer.length).set(e.suppInfoBuffer),F+=e.suppInfoBuffer.byteLength);0===F&&new Uint32Array($,0,4).set([1,1,1,1]),G.unmap();const j=n*Uint32Array.BYTES_PER_ELEMENT*y,Y=u.createBuffer({label:"buffer distances",size:j,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),q=u.createBuffer({label:"buffer indexes",size:j,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),V=n*Uint32Array.BYTES_PER_ELEMENT,K=u.createBindGroup({label:"bindGroup for knn buffer",layout:E.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:q}},{binding:1,resource:{buffer:Y}},{binding:2,resource:{buffer:D}},{binding:3,resource:{buffer:G}}]}),W=u.createBuffer({label:"result buffer distances",size:Y.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),H=u.createBuffer({label:"result buffer indexes",size:q.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let e=0;e<Math.ceil(c/y);e++){R=e*y,U=Math.min((e+1)*y,c);const t=Math.ceil(c/w);for(let e=0;e<t;e++){O=e*w,T=Math.min((e+1)*w,c),u.queue.writeBuffer(D,0,new Uint32Array([R,U,O,T]));const r=u.createCommandEncoder({label:"distance encoder"}),i=r.beginComputePass({label:"distance compute pass"});if(i.setPipeline(E),i.setBindGroup(0,K),i.dispatchWorkgroups(b,Math.ceil(y/b/100)),i.end(),e===t-1){r.copyBufferToBuffer(Y,0,W,0,W.size),r.copyBufferToBuffer(q,0,H,0,H.size);const e=r.finish();u.queue.submit([e]),yield u.queue.onSubmittedWorkDone(),yield W.mapAsync(GPUMapMode.READ),yield H.mapAsync(GPUMapMode.READ);const t=H.getMappedRange(),i=W.getMappedRange();for(let e=0;e<U-R;e++){const r=new Uint32Array(t,e*V,n),a=new Float32Array(i,e*V,n);v[R+e].set(r),A[R+e].set(a)}H.unmap(),W.unmap()}else{const e=r.finish();u.queue.submit([e]),yield u.queue.onSubmittedWorkDone()}if(l)return null}}return Y.destroy(),q.destroy(),D.destroy(),G.destroy(),W.destroy(),H.destroy(),l?null:{knnIndexes:v,knnDistances:A}},new((u=void 0)||(u=Promise))((function(e,n){function t(e){try{i(l.next(e))}catch(e){n(e)}}function r(e){try{i(l.throw(e))}catch(e){n(e)}}function i(n){var i;n.done?e(n.value):(i=n.value,i instanceof u?i:new u((function(e){e(i)}))).then(t,r)}i((l=l.apply(s,o||[])).next())}));var s,o,u,l}function Be(e,n,t,r){return e.map(((e,r)=>`\n fn distanceScript${r}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${r}[aIndex];\n let b = computeInfo.data${r}[bIndex];\n let maxDistance: f32 = knnDistances[aIndex - computeInfo.startAtEndAt.x][${t} - 1u];\n ${Ce[e](n[r],r)}\n }\n `)).join("\n")+"\n"+`\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${e.length}>;\n ${e.map(((e,n)=>`distances[${n}] = distanceScript${n}(aIndex, bIndex);`)).join("\n")}\n ${Me[r](e.length)}\n }\n \n `}!function(e){e.ADD="ADD",e.SUB="SUB",e.MULT="MULT"}(Re||(Re={})),function(e){e.SQUARE="SQUARE",e.INVERSE="INVERSE",e.TRANSPOSE="TRANSPOSE",e.NORM="NORM",e.COLUMN_NORM="COLUMN_NORM"}(Ue||(Ue={})),function(e){e.SCALARMULT="SCALARMULT",e.SCALARADD="SCALARADD",e.SCALARPOW="SCALARPOW"}(Oe||(Oe={}));function _e(e,n,t,r,i,a,s,o,u){return l=this,c=void 0,h=function*(){const l=Math.ceil(s/100),c=Math.ceil(Math.sqrt(l)),f=10*c,h=t[t.length-1],d=a[a.length-1],p=o[o.length-1],m=`\n struct SparseKNNStorage1 {\n indexes:array<i32, ${h}>,\n knnDistances: array<f32, ${h}>,\n offsets: array<u32, ${s+1}>\n }\n\n struct SparseKNNStorage2 {\n indexes:array<i32, ${d}>,\n knnDistances: array<f32, ${d}>,\n offsets: array<u32, ${s+1}>\n }\n\n struct ResKnn {\n knnIndexes: array<i32, ${p}>,\n knnDistances: array<f32, ${p}>\n }\n\n @group(0) @binding(0) var<storage, read_write> source1: SparseKNNStorage1;\n @group(0) @binding(1) var<storage, read_write> source2: SparseKNNStorage2;\n @group(0) @binding(2) var<storage, read_write> result: ResKnn;\n @group(0) @binding(3) var<storage, read_write> unionMatrixOffsets: array<u32, ${s+1}>;\n @compute @workgroup_size(10, 10) fn pairwiseOp(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n\n let col: u32 = id.x;\n let row: u32 = id.y;\n let workingIndex: u32 = row * ${f} + col;\n\n if (workingIndex >= ${s}) {\n return;\n }\n var curUnionOffset: u32 = unionMatrixOffsets[workingIndex]; // offset at which to start writing in union matrix\n\n let start1 = source1.offsets[workingIndex];\n let end1 = source1.offsets[workingIndex + 1];\n let start2 = source2.offsets[workingIndex];\n let end2 = source2.offsets[workingIndex + 1];\n // TODO: sort a copy of these arrays, will make operation faster\n for (var i: u32 = start1; i < end1; i++) {\n let val1: f32 = source1.knnDistances[i];\n var val2: f32 = 0.0;\n let curIndex: i32 = source1.indexes[i];\n for (var j: u32 = start2; j < end2; j++) {\n if (source2.indexes[j] == curIndex) {\n val2 = source2.knnDistances[j];\n break;\n }\n }\n \n result.knnIndexes[curUnionOffset] = curIndex;\n result.knnDistances[curUnionOffset] = val1 ${u} val2;\n curUnionOffset += 1;\n }\n\n if (curUnionOffset >= unionMatrixOffsets[workingIndex + 1]) {\n // small optimization applicable only to our case, but saves a good amount of time\n return;\n }\n\n // do the same for source2 but skip the indexes where they are already present in source1\n for (var i: u32 = start2; i < end2; i++) {\n let val1: f32 = source2.knnDistances[i];\n let curIndex: i32 = source2.indexes[i];\n var found = false;\n for (var j: u32 = start1; j < end1; j++) {\n if (source1.indexes[j] == curIndex) {\n found = true;\n break;\n }\n }\n if (!found) {\n result.knnIndexes[curUnionOffset] = curIndex;\n result.knnDistances[curUnionOffset] = val1 ${u} 0.0;\n curUnionOffset += 1;\n }\n }\n }\n`;let g=4*(2*h+s+1);const y=15&g;0!==y&&(g+=16-y);let w=4*(2*d+s+1);const b=15&w;0!==b&&(w+=16-b);let x=2*p*4;const v=15&x;0!==v&&(x+=16-v);const A=yield Se();if(null==A)return;const S=A.createShaderModule({label:"pairwiseOpShader",code:m}),E=A.createComputePipeline({label:"pairwiseOpPipeline",layout:"auto",compute:{module:S,entryPoint:"pairwiseOp"}}),I=A.createBuffer({label:"source 1 buffer",size:g,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),M=I.getMappedRange();new Int32Array(M,0,h).set(e),new Float32Array(M,4*h,h).set(n),new Uint32Array(M,8*h,s+1).set(t),I.unmap();const N=A.createBuffer({label:"source 2 buffer",size:w,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),P=N.getMappedRange();new Int32Array(P,0,d).set(r),new Float32Array(P,4*d,d).set(i),new Uint32Array(P,8*d,s+1).set(a),N.unmap();const C=A.createBuffer({label:"res buffer",size:x,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),D=A.createBuffer({label:"union matrix offsets buffer",size:4*(s+1),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),k=D.getMappedRange();new Uint32Array(k).set(o),D.unmap();const R=A.createBindGroup({label:"bindGroup for pairwise ops",layout:E.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:I}},{binding:1,resource:{buffer:N}},{binding:2,resource:{buffer:C}},{binding:3,resource:{buffer:D}}]}),U=A.createCommandEncoder({label:"matrix ops encoder"}),O=U.beginComputePass({label:"matrix ops compute pass"});O.setPipeline(E),O.setBindGroup(0,R),O.dispatchWorkgroups(c,c),O.end();const T=A.createBuffer({label:"result buffer",size:x,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});U.copyBufferToBuffer(C,0,T,0,T.size);const B=U.finish();A.queue.submit([B]),yield A.queue.onSubmittedWorkDone(),yield T.mapAsync(GPUMapMode.READ);const _=T.getMappedRange(),z=new Int32Array(p),L=new Float32Array(p);return z.set(new Int32Array(_,0,p)),L.set(new Float32Array(_,4*p,p)),T.unmap(),T.destroy(),I.destroy(),N.destroy(),C.destroy(),D.destroy(),{resultKnnIndexes:z,resultKnnDistances:L}},new((f=void 0)||(f=Promise))((function(e,n){function t(e){try{i(h.next(e))}catch(e){n(e)}}function r(e){try{i(h.throw(e))}catch(e){n(e)}}function i(n){var i;n.done?e(n.value):(i=n.value,i instanceof f?i:new f((function(e){e(i)}))).then(t,r)}i((h=h.apply(l,c||[])).next())}));var l,c,f,h}var ze=t(788);function Le(e,n,t,r){let i=0;const a=t(n);for(let n=0;n<e.x.length;n++)i+=Math.pow(e.y[n]-a(e.x[n]),2)/r[n];return i}function Ge(e,n,t,r,i,a,s){let o=t,u=se.uq.eye(n.length,n.length,o);const l=i(n);let c=new Float64Array(e.x.length);for(let n=0;n<e.x.length;n++)c[n]=l(e.x[n]);let f=function(e,n,t,r,i,a){const s=t.length,o=e.x.length;let u=se.uq.zeros(s,o),l=0;for(let c=0;c<s;c++){if(0===r[c])continue;let s=r[c],f=t.slice();f[c]+=s;let h=i(f);if(a){f=t.slice(),f[c]-=s,s*=2;let n=i(f);for(let t=0;t<o;t++)u.set(l,t,(n(e.x[t])-h(e.x[t]))/s)}else for(let t=0;t<o;t++)u.set(l,t,(n[t]-h(e.x[t]))/s);l++}return u}(e,c,n,r,i,a),h=function(e,n){const t=e.x.length;let r=new se.uq(t,1);for(let i=0;i<t;i++)r.set(i,0,e.y[i]-n[i]);return r}(e,c),d=(0,se.DI)(u.add(f.mmul(f.transpose().scale("row",{scale:s})))),p=f.mmul(h.scale("row",{scale:s}));return{perturbations:d.mmul(p),jacobianWeightResidualError:p}}function $e(e,n){const t=function(e,n){const t=(n-0)/299;return Array.from({length:300},((e,n)=>0+t*n))}(0,3*e).map((e=>e<n?1:e)),r=new Array(t.length).fill(0).map(((r,i)=>t[i]>=n?Math.exp(-(t[i]-n)/e):r)),i={x:t,y:r},{parameterValues:a}=function(e,n,t){let{checkTimeout:r,minValues:i,maxValues:a,parameters:s,weightSquare:o,damping:u,dampingStepUp:l,dampingStepDown:c,maxIterations:f,errorTolerance:h,centralDifference:d,gradientDifference:p,improvementThreshold:m}=function(e,n,t){let{timeout:r,minValues:i,maxValues:a,initialValues:s,weights:o=1,damping:u=.01,dampingStepUp:l=11,dampingStepDown:c=9,maxIterations:f=100,errorTolerance:h=1e-7,centralDifference:d=!1,gradientDifference:p=.1,improvementThreshold:m=.001}=t;if(u<=0)throw new Error("The damping option must be a positive number");if(!e.x||!e.y)throw new Error("The data parameter must have x and y elements");if(!(0,ze.isAnyArray)(e.x)||e.x.length<2||!(0,ze.isAnyArray)(e.y)||e.y.length<2)throw new Error("The data parameter elements must be an array with more than 2 points");if(e.x.length!==e.y.length)throw new Error("The data parameter elements must have the same size");if(!(s&&s.length>0))throw new Error("The initialValues option is mandatory and must be an array");let g,y,w=s,b=e.y.length,x=w.length;if(a=a||new Array(x).fill(Number.MAX_SAFE_INTEGER),i=i||new Array(x).fill(Number.MIN_SAFE_INTEGER),a.length!==i.length)throw new Error("minValues and maxValues must be the same size");if("number"==typeof p)p=new Array(w.length).fill(p);else{if(!(0,ze.isAnyArray)(p))throw new Error("gradientDifference should be a number or array with length equal to the number of parameters");p.length!==x&&(p=new Array(x).fill(p[0]))}if("number"==typeof o){let e=1/o**2;g=()=>e}else{if(!(0,ze.isAnyArray)(o))throw new Error("weights should be a number or array with length equal to the number of data points");if(o.length<e.x.length){let e=1/o[0]**2;g=()=>e}else g=e=>1/o[e]**2}if(void 0!==r){if("number"!=typeof r)throw new Error("timeout should be a number");let e=Date.now()+1e3*r;y=()=>Date.now()>e}else y=()=>!1;let v=new Array(e.x.length);for(let e=0;e<b;e++)v[e]=g(e);return{checkTimeout:y,minValues:i,maxValues:a,parameters:w,weightSquare:v,damping:u,dampingStepUp:l,dampingStepDown:c,maxIterations:f,errorTolerance:h,centralDifference:d,gradientDifference:p,improvementThreshold:m}}(e,0,t),g=Le(e,s,n,o),y=g,w=s.slice(),b=g<=h,x=0;for(;x<f&&!b;x++){let f=g,{perturbations:x,jacobianWeightResidualError:v}=Ge(e,s,u,p,n,d,o);for(let e=0;e<s.length;e++)s[e]=Math.min(Math.max(i[e],s[e]-x.get(e,0)),a[e]);if(g=Le(e,s,n,o),isNaN(g))break;if(g<y-h&&(y=g,w=s.slice()),u=(f-g)/x.transpose().mmul(x.mul(u).add(v)).get(0,0)>m?Math.max(u/c,1e-7):Math.min(u*l,1e7),r())throw new Error(`The execution time is over to ${t.timeout} seconds`);b=g<=h}return{parameterValues:w,parameterError:y,iterations:x}}(i,(([e,n])=>t=>1/(1+e*Math.pow(t,2*n))),{damping:1.5,initialValues:[.5,.5],gradientDifference:.1,maxIterations:100,errorTolerance:.01}),[s,o]=a;return{a:s,b:o}}function Fe(e){const n=new Uint32Array(e.length+1);let t=0;for(let r=0;r<e.length;r++)n[r]=t,t+=e[r];return n[e.length]=t,n}function je(e,n){for(let t=0;t<e.length;t++)e[t]=e[t]*n}function Ye(e,n,t=1){return r=this,i=void 0,s=function*(){const r=new Int32Array(e.length*e[0].length),i=new Float32Array(n.length*n[0].length);for(let t=0;t<e.length;t++)r.set(e[t],t*e[t].length),i.set(n[t],t*n[t].length);const a=yield function(e){return n=this,t=void 0,i=function*(){const n=e.length,t=Math.ceil(n/100),r=Math.ceil(Math.sqrt(t)),i=e[0].length,a=function(e,n,t,r=15){return`\n\n @group(0) @binding(0) var<storage, read_write> knnIndexes: array<array<i32, ${r}>, ${t}>;\n @group(0) @binding(1) var<storage, read_write> resTransposedSizes: array<atomic<u32>, ${t}>;\n // this array will store the union of knn and its transpose sizes per index. should be initialized to knnSize each.\n @group(0) @binding(2) var<storage, read_write> resUnionMatrixSizes: array<atomic<u32>, ${t}>;\n\n @compute @workgroup_size(${e}, ${e}) fn countTransposedCols(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col: u32 = id.x;\n let row: u32 = id.y;\n let workingIndex: u32 = row * ${n} + col;\n\n if (workingIndex >= ${t}) {\n return;\n }\n \n for (var i = 0u; i < ${r}u; i++) {\n let otherIndex: i32 = knnIndexes[workingIndex][i];\n if (otherIndex != -1 && otherIndex < ${t}) {\n atomicAdd(&resTransposedSizes[otherIndex], 1u);\n atomicAdd(&resUnionMatrixSizes[otherIndex], 1u);\n let otherIndexes = &knnIndexes[otherIndex];\n for(var j = 0u; j < ${r}; j++) {\n if ((*otherIndexes)[j] == i32(workingIndex)) {\n atomicSub(&resUnionMatrixSizes[workingIndex], 1u);\n // if same is found in other array, decrement by one;\n break;\n }\n }\n }\n\n }\n }\n `}(10,10*r,n,i),s=n*e[0].length,o=yield Se();if(null==o)return;const u=o.createShaderModule({label:"transposedSizesCalulation",code:a}),l=o.createComputePipeline({label:"transposedSizesPipeline",layout:"auto",compute:{module:u,entryPoint:"countTransposedCols"}}),c=o.createBuffer({label:"indexes buffer",size:4*s,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),f=c.getMappedRange(),h=new Int32Array(f);for(let n=0;n<e.length;n++)h.set(e[n],n*e[n].length);c.unmap();const d=o.createBuffer({label:"transpose sizes buffer",size:4*e.length,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),p=o.createBuffer({label:"union sizes buffer",size:4*e.length,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),m=p.getMappedRange();new Uint32Array(m).fill(i),p.unmap();const g=o.createBindGroup({label:"bindGroup for count ops",layout:l.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:c}},{binding:1,resource:{buffer:d}},{binding:2,resource:{buffer:p}}]}),y=o.createCommandEncoder({label:"matrix ops encoder"}),w=y.beginComputePass({label:"matrix ops compute pass"});w.setPipeline(l),w.setBindGroup(0,g),w.dispatchWorkgroups(r,r),w.end();const b=o.createBuffer({label:"result transpose sizes",size:d.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),x=o.createBuffer({label:"result union sizes",size:p.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});y.copyBufferToBuffer(d,0,b,0,b.size),y.copyBufferToBuffer(p,0,x,0,x.size);const v=y.finish();o.queue.submit([v]),yield o.queue.onSubmittedWorkDone(),yield b.mapAsync(GPUMapMode.READ),yield x.mapAsync(GPUMapMode.READ);const A=b.getMappedRange(),S=x.getMappedRange(),E=new Uint32Array(e.length);E.set(new Uint32Array(A,0,e.length)),b.unmap();const I=new Uint32Array(e.length);I.set(new Uint32Array(S,0,e.length)),x.unmap();const M=I.reduce(((e,n)=>e+n),0);return x.destroy(),b.destroy(),d.destroy(),c.destroy(),p.destroy(),{resultTransposeSizesArray:E,resultUnionSizesArray:I,unionMatrixSize:M}},new((r=void 0)||(r=Promise))((function(e,a){function s(e){try{u(i.next(e))}catch(e){a(e)}}function o(e){try{u(i.throw(e))}catch(e){a(e)}}function u(n){var t;n.done?e(n.value):(t=n.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}u((i=i.apply(n,t||[])).next())}));var n,t,r,i}(e),s=e.length,o=yield function(e,n,t,r=15){return i=this,a=void 0,o=function*(){const i=e.length,a=r*i,s=Fe(t.resultTransposeSizesArray),o=new Uint32Array(s.length);o.set(s);const u=new Int32Array(a).fill(0),l=new Float32Array(a).fill(0);for(let t=0;t<i;t++)for(let i=0;i<r;i++){const r=e[t][i],a=o[r];u[a]=t,l[a]=n[t][i],o[r]+=1}return{transposeKNNIndexes:u,transposeKNNDistances:l,transposeOffsets:s}},new((s=void 0)||(s=Promise))((function(e,n){function t(e){try{u(o.next(e))}catch(e){n(e)}}function r(e){try{u(o.throw(e))}catch(e){n(e)}}function u(n){var i;n.done?e(n.value):(i=n.value,i instanceof s?i:new s((function(e){e(i)}))).then(t,r)}u((o=o.apply(i,a||[])).next())}));var i,a,s,o}(e,n,a,n[0].length),u=Fe(new Uint32Array(s).fill(e[0].length)),l=Fe(a.resultUnionSizesArray),c=yield _e(r,i,u,o.transposeKNNIndexes,o.transposeKNNDistances,o.transposeOffsets,s,l,"*"),f=yield _e(r,i,u,o.transposeKNNIndexes,o.transposeKNNDistances,o.transposeOffsets,s,l,"+"),h=yield _e(f.resultKnnIndexes,f.resultKnnDistances,l,c.resultKnnIndexes,c.resultKnnDistances,l,s,l,"-");return 1!==t?(je(h.resultKnnDistances,t),je(c.resultKnnDistances,1-t),{res:yield _e(h.resultKnnIndexes,h.resultKnnDistances,l,c.resultKnnIndexes,c.resultKnnDistances,l,s,l,"+"),unionMatrixOffsets:l}):{res:h,unionMatrixOffsets:l,unionSizes:a.resultUnionSizesArray}},new((a=void 0)||(a=Promise))((function(e,n){function t(e){try{u(s.next(e))}catch(e){n(e)}}function o(e){try{u(s.throw(e))}catch(e){n(e)}}function u(n){var r;n.done?e(n.value):(r=n.value,r instanceof a?r:new a((function(e){e(r)}))).then(t,o)}u((s=s.apply(r,i||[])).next())}));var r,i,a,s}function qe(e,n=15,t=1,r=64,i=1){return a=this,s=void 0,u=function*(){const a=e.length,s=Math.ceil(a/100),o=Math.ceil(Math.sqrt(s)),u=function(e=10,n,t,r=15,i=1,a=64,s=1){const o=t.length;let u=0;for(let e=0;e<o;e++){let n=0;for(let i=0;i<r;i++)n+=t[e][i];u+=n/r}return` \n var<private> SMOOTH_K_TOLERANCE: f32 = 1e-5;\n var<private> MIN_K_DIST_SCALE: f32 = 1e-3;\n var<private> nNeighbors: u32 = ${r};\n var<private> localConnectivity: f32 = ${i}; \n var<private> nIter: u32 = ${a};\n var<private> bandwidth: u32 = ${s};\n var<private> meanDistances: f32 = ${u/o};\n var<private> targetValue: f32 = ${Math.log(r)/Math.log(2)*s};\n @group(0) @binding(0) var<storage, read_write> sigmas: array<f32, ${o}>;\n @group(0) @binding(1) var<storage, read_write> rhos: array<f32, ${o}>;\n @group(0) @binding(2) var<storage, read> distances: array<array<f32, ${r}>, ${o}>;\n @compute @workgroup_size(${e}, ${e}) fn smoothKNNDistance(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col: u32 = id.x;\n let row: u32 = id.y;\n let workingIndex: u32 = row * ${n} + col;\n\n if (workingIndex >= ${o}) {\n return;\n }\n\n var lo: f32 = 0.0;\n var hi: f32 = 1.0e+30; // treated as Infinity\n var mid: f32 = 1.0;\n\n var nonZeroDists: array<f32, ${r}>;\n var nonZeroDistsSize: u32 = 0;\n for (var j = 0u; j < nNeighbors; j = j + 1u) {\n if (distances[workingIndex][j] > 0.0) {\n nonZeroDists[nonZeroDistsSize] = distances[workingIndex][j];\n nonZeroDistsSize = nonZeroDistsSize + 1u;\n }\n }\n\n if (f32(nonZeroDistsSize) >= localConnectivity) {\n let index: u32 = u32(floor(localConnectivity));\n let interpolation: f32 = localConnectivity - f32(index);\n if (index > 0) {\n rhos[workingIndex] = nonZeroDists[index - 1];\n if (interpolation > SMOOTH_K_TOLERANCE) {\n rhos[workingIndex] += interpolation * (nonZeroDists[index] - nonZeroDists[index - 1]);\n }\n }\n else {\n rhos[workingIndex] = interpolation * nonZeroDists[0];\n }\n }\n else if (nonZeroDistsSize > 0u) {\n var maxDist: f32 = 0.0;\n for (var j = 0u; j < nonZeroDistsSize; j = j + 1u) {\n maxDist = max(nonZeroDists[j], maxDist);\n }\n rhos[workingIndex] = maxDist;\n }\n\n for (var n = 0u; n < nIter; n = n + 1u) {\n var psum: f32 = 0.0;\n for (var j = 1u; j < ${r}; j = j + 1u) {\n let d: f32 = distances[workingIndex][j] - rhos[workingIndex];\n if (d > 0.0) {\n psum += exp(0.0 - (d / mid));\n }\n else {\n psum += 1.0;\n }\n }\n\n if (abs(psum - targetValue) < SMOOTH_K_TOLERANCE) {\n break;\n }\n\n if (psum > targetValue) {\n hi = mid;\n mid = (lo + hi) / 2.0;\n }\n else {\n lo = mid;\n if (hi == 1.0e+30) {\n mid *= 2.0;\n }\n else {\n mid = (lo + hi) / 2.0;\n }\n }\n }\n\n sigmas[workingIndex] = mid;\n\n if (rhos[workingIndex] > 0.0) {\n var sum: f32 = 0.0;\n for (var j = 0u; j < ${r}; j = j + 1u) {\n sum += distances[workingIndex][j];\n }\n let meanIthDistances: f32 = sum / ${r}.0;\n if (sigmas[workingIndex] < MIN_K_DIST_SCALE * meanIthDistances) {\n sigmas[workingIndex] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n }\n else {\n if (sigmas[workingIndex] < MIN_K_DIST_SCALE * meanDistances) {\n sigmas[workingIndex] = MIN_K_DIST_SCALE * meanDistances;\n }\n }\n }\n `}(10,10*o,e,n,t,r,i),l=a*e[0].length,c=yield Se();if(null==c)return;const f=new Float32Array(a),h=new Float32Array(a),d=c.createShaderModule({label:"sigmaRhoCalulation",code:u}),p=c.createComputePipeline({label:"sigmaRhoPipeline",layout:"auto",compute:{module:d,entryPoint:"smoothKNNDistance"}}),m=c.createBuffer({label:"distance buffer",size:4*l,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),g=m.getMappedRange(),y=new Float32Array(g);for(let n=0;n<e.length;n++)y.set(e[n],n*e[n].length);m.unmap();const w=c.createBuffer({label:"buffer sigmas",size:4*a,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),b=c.createBuffer({label:"buffer Rhos",size:4*a,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),x=c.createBindGroup({label:"bindGroup for sigmarho buffers",layout:p.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:w}},{binding:1,resource:{buffer:b}},{binding:2,resource:{buffer:m}}]}),v=c.createCommandEncoder({label:"sigmarho encoder"}),A=v.beginComputePass({label:"sigmarho compute pass"});A.setPipeline(p),A.setBindGroup(0,x),A.dispatchWorkgroups(o,o),A.end();const S=c.createBuffer({label:"result buffer rhos",size:b.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),E=c.createBuffer({label:"result buffer sigmas",size:w.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});v.copyBufferToBuffer(b,0,S,0,S.size),v.copyBufferToBuffer(w,0,E,0,E.size);const I=v.finish();return c.queue.submit([I]),yield c.queue.onSubmittedWorkDone(),yield S.mapAsync(GPUMapMode.READ),yield E.mapAsync(GPUMapMode.READ),h.set(new Float32Array(S.getMappedRange())),f.set(new Float32Array(E.getMappedRange())),S.unmap(),E.unmap(),m.destroy(),w.destroy(),b.destroy(),S.destroy(),E.destroy(),{resultRhos:h,resultSigmas:f}},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{i(u.next(e))}catch(e){n(e)}}function r(e){try{i(u.throw(e))}catch(e){n(e)}}function i(n){var i;n.done?e(n.value):(i=n.value,i instanceof o?i:new o((function(e){e(i)}))).then(t,r)}i((u=u.apply(a,s||[])).next())}));var a,s,o,u}var Ve=function(e,n,t,r){return new(t||(t=Promise))((function(i,a){function s(e){try{u(r.next(e))}catch(e){a(e)}}function o(e){try{u(r.throw(e))}catch(e){a(e)}}function u(e){var n;e.done?i(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(s,o)}u((r=r.apply(e,n||[])).next())}))};class Ke{constructor(){this.nComponents=2,this.gamma=1,this.alpha=1,this.entryLen=0,this.nNeighbours=15,this.spread=1,this.minDist=.1,this.negativeSampleRate=5,this.localConnectivity=1,this.setOpMixRatio=1}}class We{constructor(e,n){this.params=new Ke,this.knnIndexes=null,this.knnDistances=null,this.rhos=null,this.sigmas=null,this.membershipStrengths=null,this.params.entryLen=e,Object.assign(this.params,n)}setPrecomputedKNN(e,n){this.knnIndexes=e,this.knnDistances=n}initializeFit(){return Ve(this,void 0,void 0,(function*(){yield this.calcSmoothKNNDistances(),yield this.calcMembershipStrengths()}))}fit(){return Ve(this,void 0,void 0,(function*(){yield this.initializeFit();const e=yield this.initializeSimplicialSetEmbedding();if(!e)throw new Error("failed to compute umap simplistical set embeddings");const{head:n,tail:t,epochsPerSample:r,epochsPerNegativeSample:i,a,b:s,gamma:o,initialAlpha:u,nComponents:l,nEpochs:c,entryLen:f}=e,h=yield function(e,n,t,r,i,a,s,o,u,l,c,f){return h=this,d=void 0,m=function*(){const h=Math.ceil(e.length/100),d=Math.ceil(Math.sqrt(h)),p=10*d,m=yield Se();if(!m)return;const g=1e7,y=e.length,w=function(e,n,t,r,i,a,s,o,u,l,c,f,h=1e5){return`\n// first define some functions\n\nfn rDist(ar1: array<f32, ${o}>, ar2: array<f32, ${o}>) -> f32 {\n var res = 0.0;\n for (var i1 = 0u; i1 < ${o}; i1++) {\n let diff = ar1[i1] - ar2[i1];\n res += pow(diff, 2);\n }\n return res;\n}\n\nfn clip(x: f32, clipValue: f32) -> f32 {\n if (x > clipValue) {\n return clipValue;\n }\n else if (x < 0.0 - clipValue) {\n return 0.0 - clipValue;\n }\n return x;\n}\n\nvar<private> randomSeedInt: u32 = 0;\nvar<private> nVertices: u32 = ${l};\nvar<private> initialAlpha: f32 = ${r};\nvar<private> gamma: f32 = ${i};\nvar<private> a: f32 = ${a};\nvar<private> b: f32 = ${s};\nvar<private> dim: u32 = ${o};\nvar<private> nEpochs: f32 = ${u};\nvar<private> moveOther: u32 = 1;\n\nfn random() -> u32 {\n randomSeedInt = (randomSeedInt ^ 61) ^ (randomSeedInt >> 16);\n randomSeedInt *= 9;\n randomSeedInt = randomSeedInt ^ (randomSeedInt >> 4);\n randomSeedInt *= 0x27d4eb2d;\n randomSeedInt = randomSeedInt ^ (randomSeedInt >> 15);\n return randomSeedInt;\n}\n\nfn randInt(maxVal: u32) -> u32 {\n let nextRandomNum = random();\n return u32(floor((f32(nextRandomNum) * (f32(maxVal) / 4294967296.0))));\n}\n\nstruct MatrixStorage {\n head: array<u32, ${e}>,\n tail: array<u32, ${e}>,\n}\n\nstruct EpochStorage {\n epochsPerSample: array<f32, ${e}>,\n epochOfNextSample: array<f32, ${e}>,\n epochsPerNegativeSample: array<f32, ${e}>,\n epochOfNextNegativeSample: array<f32, ${e}>\n}\n\nstruct EmbeddingStorage {\n // embeddings will be in range of -10 to 10, as atomics only can store i32 or u32, we will store them as floor(f32 * 100_000)\n headEmbeddings: array<array<atomic<i32>, ${o}>, ${n}>,\n tailEmbeddings: array<array<atomic<i32>, ${o}>, ${n}>\n}\n\nstruct ComputeInfo {\n n: f32,\n alpha: f32,\n randomNumbers: array<u32, ${e}>,\n //tailOffsets: array<u32, ${n+1}>\n}\n @group(0) @binding(0) var<storage, read_write> matrixStorage: MatrixStorage;\n @group(0) @binding(1) var<storage, read_write> epochStorage: EpochStorage;\n @group(0) @binding(2) var<storage, read_write> embedStorage: EmbeddingStorage;\n @group(0) @binding(3) var<storage, read_write> computeInfo: ComputeInfo;\n @compute @workgroup_size(${c}, ${c}) fn optimizeStep(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let divisionFactor: f32 = ${h};\n let col: u32 = id.x;\n let row: u32 = id.y;\n let threadIndex: u32 = row * ${f} + col;\n let clipValue: f32 = 4.0;\n\n if (threadIndex >= ${e}) {\n return;\n }\n\n let workingIndex = threadIndex;\n //let startAtOffset = computeInfo.tailOffsets[threadIndex];\n //let endAtOffset = computeInfo.tailOffsets[threadIndex + 1];\n //for (var workingIndex = startAtOffset; workingIndex < endAtOffset; workingIndex++) {\n randomSeedInt = computeInfo.randomNumbers[workingIndex] * u32(computeInfo.n);\n\n let epochOfNextSample = epochStorage.epochOfNextSample[workingIndex];\n if (epochOfNextSample > computeInfo.n) {\n return;\n }\n\n let j = matrixStorage.head[workingIndex];\n let k = matrixStorage.tail[workingIndex];\n\n // as said before, we will store embeddings as floor(f32 * 100_000)\n var current: array<f32, ${o}>;\n var other: array<f32, ${o}>;\n for (var i = 0u; i < ${o}u; i++) {\n current[i] = f32(atomicLoad(&embedStorage.headEmbeddings[j][i])) / divisionFactor;\n other[i] = f32(atomicLoad(&embedStorage.tailEmbeddings[k][i])) / divisionFactor;\n }\n\n let distSquared = rDist(current, other);\n \n var gradCoeff: f32 = 0.0;\n if (distSquared > 0.0) {\n gradCoeff = (0.0 - 2.0) * ${a} * ${s} * pow(distSquared, b - 1.0);\n gradCoeff /= (a * pow(distSquared, b) + 1.0);\n }\n\n var gradBuff: array<i32, ${o}>;\n for (var d = 0u; d < ${o}u; d++) {\n let gradD = clip((gradCoeff * (current[d] - other[d])), clipValue);\n let toAdd = gradD * computeInfo.alpha;\n gradBuff[d] = i32(floor(toAdd * divisionFactor));\n current[d] += toAdd;\n other[d] -= toAdd;\n }\n\n for (var d = 0u; d < ${o}u; d++) {\n atomicAdd(&embedStorage.headEmbeddings[j][d], gradBuff[d]);\n atomicSub(&embedStorage.tailEmbeddings[k][d], gradBuff[d]);\n }\n\n epochStorage.epochOfNextSample[workingIndex] += epochStorage.epochsPerSample[workingIndex];\n var nNegSamples: i32 = i32(floor((computeInfo.n - epochStorage.epochOfNextNegativeSample[workingIndex]) / epochStorage.epochsPerNegativeSample[workingIndex]));\n\n for (var p = 0i; p < nNegSamples; p++) {\n let k1 = randInt(nVertices);\n var other1: array<f32, ${o}>;\n for (var i = 0u; i < ${o}u; i++) {\n other1[i] = f32(atomicLoad(&embedStorage.tailEmbeddings[k1][i])) / divisionFactor;\n }\n\n let distSquared1 = rDist(current, other1);\n\n var gradCoeff1: f32 = 0.0;\n if (distSquared1 > 0.0) {\n gradCoeff1 = 2.0 * gamma * b;\n gradCoeff1 /= (0.001 + distSquared1) * (a * pow(distSquared1, b) + 1);\n }\n else if (j == k1) {\n continue;\n }\n\n var gradDBuff: array<i32, ${o}>;\n for (var d = 0u; d < ${o}u; d++) {\n var gradD: f32 = 4.0;\n if (gradCoeff1 > 0.0) {\n gradD = clip(gradCoeff1 * (current[d] - other1[d]), clipValue);\n }\n\n gradDBuff[d] = i32(floor(gradD * computeInfo.alpha * divisionFactor));\n \n }\n for (var d = 0u; d < ${o}u; d++) {\n atomicAdd(&embedStorage.headEmbeddings[j][d], gradDBuff[d]);\n }\n }\n epochStorage.epochOfNextNegativeSample[workingIndex] += f32(nNegSamples) * epochStorage.epochsPerNegativeSample[workingIndex];\n //}\n }\n`}(y,t,0,a,s,o,u,l,c,f,10,p,g);let b=2*y*4;const x=15&b;0!==x&&(b+=16-x);let v=4*y*4;const A=15&v;0!==A&&(v+=16-A);let S=2*t*2*4;const E=15&S;0!==E&&(S+=16-E);let I=4*(2+y);const M=15&I;0!==M&&(I+=16-M);const N=m.createShaderModule({label:"optimizeShader",code:w}),P=m.createComputePipeline({label:"optimizePipeline",layout:"auto",compute:{module:N,entryPoint:"optimizeStep"}}),C=m.createBuffer({label:"matrix storage buffer",size:b,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),D=C.getMappedRange();new Uint32Array(D,0,y).set(e),new Uint32Array(D,4*y,y).set(n),C.unmap();const k=m.createBuffer({label:"epoch storage buffer",size:v,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),R=k.getMappedRange(),U=new Float32Array(R);U.set(r,0),U.set(r,y),U.set(i,2*y),U.set(i,3*y),k.unmap();const O=new Int32Array(t*l).map((()=>Math.floor((2*Math.random()-1)*g)));new Int32Array(t*l).set(O);const T=m.createBuffer({label:"embedding storage buffer",size:S,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),B=T.getMappedRange(),_=new Int32Array(B);_.set(O,0),_.set(O,O.length),T.unmap();const z=m.createBuffer({label:"compute info buffer",size:I,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),L=new Uint32Array(y).map((()=>Math.floor(Math.random()*g))),G=z.getMappedRange();new Float32Array(G,0,2).set([0,a]),new Uint32Array(G,8,y).set(L),z.unmap();const $=m.createBindGroup({label:"bindGroup for optimize",layout:P.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:C}},{binding:1,resource:{buffer:k}},{binding:2,resource:{buffer:T}},{binding:3,resource:{buffer:z}}]});let F=a;const j=m.createBuffer({label:"result buffer",size:T.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let e=0;e<c;e++){m.queue.writeBuffer(z,0,new Float32Array([e,F]),0);const n=m.createCommandEncoder({label:"matrix ops encoder"}),t=n.beginComputePass({label:"matrix ops compute pass"});t.setPipeline(P),t.setBindGroup(0,$),t.dispatchWorkgroups(d,d),t.end(),e===c-1&&n.copyBufferToBuffer(T,0,j,0,j.size);const r=n.finish();m.queue.submit([r]),yield m.queue.onSubmittedWorkDone(),F=a*(1-e/c)}yield j.mapAsync(GPUMapMode.READ);const Y=j.getMappedRange(),q=new Int32Array(Y,0,O.length);O.set(q),j.unmap();const V=new Array(l).fill(null).map((e=>new Float32Array(t)));for(let e=0;e<t;e++)for(let n=0;n<l;n++)V[n][e]=O[e*l+n]/g;return C.destroy(),k.destroy(),T.destroy(),z.destroy(),j.destroy(),V},new((p=void 0)||(p=Promise))((function(e,n){function t(e){try{i(m.next(e))}catch(e){n(e)}}function r(e){try{i(m.throw(e))}catch(e){n(e)}}function i(n){var i;n.done?e(n.value):(i=n.value,i instanceof p?i:new p((function(e){e(i)}))).then(t,r)}i((m=m.apply(h,d||[])).next())}));var h,d,p,m}(n,t,f,r,i,u,o,a,s,l,c,f);return h}))}calcSmoothKNNDistances(){return Ve(this,void 0,void 0,(function*(){if(!this.knnIndexes||!this.knnDistances)throw new Error("knn indexes and distances must be set before calling fit");const e=yield qe(this.knnDistances,this.params.nNeighbours,this.params.localConnectivity,64);if(!e)throw new Error("failed to compute smooth knn distances");this.rhos=e.resultRhos,this.sigmas=e.resultSigmas}))}calcMembershipStrengths(){return Ve(this,void 0,void 0,(function*(){if(!(this.knnIndexes&&this.knnDistances&&this.rhos&&this.sigmas))throw new Error("knn indexes, distances, rhos, and sigmas must be set before calling fit");const e=yield function(e,n,t){return r=this,i=void 0,s=function*(){const r=e.length,i=Math.ceil(r/100),a=Math.ceil(Math.sqrt(i)),s=function(e=10,n,t,r,i){const a=t.length,s=r.length,o=i.length;return`\n struct MembershipStrengthsInfo {\n knnDistances: array<array<f32, ${t[0].length}>, ${a}>,\n sigmas: array<f32, ${s}>,\n rhos: array<f32, ${o}>\n };\n var<private> nNeighbors: u32 = ${t[0].length};\n @group(0) @binding(0) var<storage, read> membershipStrengthsInfo: MembershipStrengthsInfo;\n @group(0) @binding(1) var<storage, read_write> resultKnnDistances: array<array<f32, ${t[0].length}>, ${a}>;\n @compute @workgroup_size(${e}, ${e}) fn computeMembershipStrengths(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col: u32 = id.x;\n let row: u32 = id.y;\n let workingIndex: u32 = row * ${n} + col;\n\n if (workingIndex >= ${a}) {\n return;\n }\n\n let workingResKnnDistances = &resultKnnDistances[workingIndex];\n let knnDistances = &membershipStrengthsInfo.knnDistances[workingIndex];\n for (var j = 0u; j < nNeighbors; j = j + 1u) {\n var val: f32 = 0.0;\n\n if ((*knnDistances)[j] - membershipStrengthsInfo.rhos[workingIndex] <= 0.0) {\n val = 1.0;\n } else {\n val = exp(0.0 - ((knnDistances[j] - membershipStrengthsInfo.rhos[workingIndex]) / membershipStrengthsInfo.sigmas[workingIndex])); \n }\n\n (*workingResKnnDistances)[j] = val;\n }\n }\n `}(10,10*a,e,n,t),o=r*e[0].length,u=yield Se();if(null==u)return;const l=u.createShaderModule({label:"rowsColsValsCalulation",code:s}),c=u.createComputePipeline({label:"rowsColsValsPipeline",layout:"auto",compute:{module:l,entryPoint:"computeMembershipStrengths"}});let f=4*(t.length+n.length+o);const h=15&f;0!=h&&(f+=16-h);const d=u.createBuffer({label:"info buffer",size:f,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),p=d.getMappedRange(),m=new Float32Array(p);for(let n=0;n<e.length;n++)m.set(e[n],n*e[n].length);let g=e[0].length*e.length;m.set(n,g),g+=n.length,m.set(t,g),d.unmap();const y=u.createBuffer({label:"knn distance buffer",size:e[0].length*e.length*Float32Array.BYTES_PER_ELEMENT,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),w=u.createBindGroup({label:"bindGroup for membership strhegths buffers",layout:c.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:d}},{binding:1,resource:{buffer:y}}]}),b=u.createCommandEncoder({label:"membership strengths encoder"}),x=b.beginComputePass({label:"membership strengths compute pass"});x.setPipeline(c),x.setBindGroup(0,w),x.dispatchWorkgroups(a,a),x.end();const v=u.createBuffer({label:"result buffer distances",size:y.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});b.copyBufferToBuffer(y,0,v,0,v.size);const A=b.finish();u.queue.submit([A]),yield u.queue.onSubmittedWorkDone(),yield v.mapAsync(GPUMapMode.READ);const S=v.getMappedRange(),E=e[0].length*Float32Array.BYTES_PER_ELEMENT,I=new Array(e.length).fill(null).map(((n,t)=>{const r=new Float32Array(S,E*t,e[0].length),i=new Float32Array(e[0].length);return i.set(r),i}));return v.unmap(),v.destroy(),y.destroy(),d.destroy(),I},new((a=void 0)||(a=Promise))((function(e,n){function t(e){try{u(s.next(e))}catch(e){n(e)}}function o(e){try{u(s.throw(e))}catch(e){n(e)}}function u(n){var r;n.done?e(n.value):(r=n.value,r instanceof a?r:new a((function(e){e(r)}))).then(t,o)}u((s=s.apply(r,i||[])).next())}));var r,i,a,s}(this.knnDistances,this.sigmas,this.rhos);if(!e)throw new Error("failed to compute membership strengths");this.membershipStrengths=e}))}fuzzySimplicialSet(){return Ve(this,void 0,void 0,(function*(){if(!(this.knnIndexes&&this.knnDistances&&this.rhos&&this.sigmas&&this.membershipStrengths))throw new Error("knn indexes, distances, rhos, sigmas, and membership strengths must be set before calling fit");const e=yield Ye(this.knnIndexes,this.membershipStrengths,this.params.setOpMixRatio);if(!e)throw new Error("failed to compute pairwise multiply with transpose");return e}))}initializeSimplicialSetEmbedding(){return Ve(this,void 0,void 0,(function*(){const e=yield this.fuzzySimplicialSet();if(!(e&&e.res&&e.unionMatrixOffsets&&e.unionSizes))throw new Error("failed to compute fuzzy simplicial set");const n=yield function(e,n,t,r,i=5){return a=this,s=void 0,u=function*(){if(!e.unionSizes)return;const a=function(e){return e<=2500?1e3:e<=5e3?800:e<=7500?650:400}(n),s=e.res.resultKnnDistances.reduce(((e,n)=>Math.max(e,n))),o=s/a,u=new Uint32Array(e.unionSizes.length);u.set(e.unionSizes);let l=0;for(let n=0;n<e.unionSizes.length;n++){for(let t=0;t<e.unionSizes[n];t++){const r=l+t;e.res.resultKnnDistances[r]<o&&(e.res.resultKnnDistances[r]=0,u[n]--)}l+=e.unionSizes[n]}const c=Fe(u),f=c[c.length-1],h=new Float32Array(f),d=new Uint32Array(f),p=new Uint32Array(f);l=0;for(let n=0;n<e.unionSizes.length;n++)for(let t=0;t<e.unionSizes[n];t++){const r=e.unionMatrixOffsets[n]+t;0!=e.res.resultKnnDistances[r]&&(h[l]=e.res.resultKnnDistances[r],d[l]=e.res.resultKnnIndexes[r],p[l]=n,l+=1)}const m=new Float32Array(h.length).fill(-1),g=h.map((e=>e/s*a));g.forEach(((e,n)=>{e>0&&(m[n]=a/g[n])}));const{a:y,b:w}=$e(t,r),b=m.map((e=>e/i));return{epochsPerSample:m,epochsPerNegativeSample:b,a:y,b:w,head:d,tail:p,entryLen:n,nEpochs:a,nComponents:2,initialAlpha:1,gamma:1}},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{i(u.next(e))}catch(e){n(e)}}function r(e){try{i(u.throw(e))}catch(e){n(e)}}function i(n){var i;n.done?e(n.value):(i=n.value,i instanceof o?i:new o((function(e){e(i)}))).then(t,r)}i((u=u.apply(a,s||[])).next())}));var a,s,o,u}(e,this.params.entryLen,this.params.spread,this.params.minDist,this.params.negativeSampleRate);if(!n)throw new Error("failed to compute umap simplistical set embeddings");return n}))}}class He{constructor(e){this.data=e.data,this.weights=e.weights,this.aggregationMethod=e.aggregationMethod}}class Ze extends He{constructor(e){super(e);const n=e.randomSeed??Date(),t=be()(n);e.dim=2,e.random=t,this.reducer=new xe(e),this.iterations=e?.iterations??this.reducer.getIterSize(this.data[0].length),this.distanceFnames=e.distanceFnames,this.distanceFns=e.distanceFns,this.distanceFnArgs=e.distanceFnArgs,this.progressFunc=e.progressFunc}async transform(){if(this.data[0].length>1e4)throw new Error("Maximum number of samples for T-SNE is 10000");const e=new b(!0,!1);try{const n=await e.calcMulti(this.data,this.distanceFnames,!1,this.distanceFnArgs,this.weights,this.aggregationMethod);e.terminate(),this.reducer.initDataDist(n,this.data[0].length);for(let e=0;e<this.iterations;++e)this.reducer.step(),this.progressFunc&&this.progressFunc(e,this.iterations,[]);return this.reducer.getSolution()}catch(n){throw e.terminate(),n}}}class Xe extends He{constructor(e){const n=e.randomSeed??Date(),t=be()(n);super(e),this.useWebGPU=!1,me("distanceFnames"in e),me("distanceFns"in e),this.distanceFnArgs=e.distanceFnArgs,this.distanceFns=e.distanceFns,this.progressFunc=e.progressFunc,this.useWebGPU=e.useWebGPU??!1,this.distanceFnames=e.distanceFnames,e.nComponents=2,this.vectors=new Array(this.data[0].length).fill(0).map(((e,n)=>n)),this.data[0].length<=(e.nNeighbors??15)&&(e.nNeighbors=this.data[0].length-1),e.random=t,this.reducer=new ce(e)}async transform(e){let n;if(console.time("knn graph"),this.useWebGPU)try{n=await Te(this.data,this.reducer.neighbors,this.distanceFnames,this.aggregationMethod,this.weights,this.distanceFnArgs)}catch(e){console.error(e)}if(n||(this.useWebGPU&&console.error("WEBGPU KNN failed, falling back to multithreaded CPU implementation"),n=await(new ge.p).multiColumnKNN(this.data,this.distanceFnames,this.reducer.neighbors,this.distanceFnArgs,this.weights,this.aggregationMethod)),console.timeEnd("knn graph"),!n)throw new Error("Failed to compute KNN graph");const t=this.data[0].length;for(let e=0;e<n.knnIndexes.length;++e)for(let r=0;r<n.knnIndexes[e].length;++r)n.knnDistances[e][r]<0&&(n.knnDistances[e][r]=0),(n.knnIndexes[e][r]<0||n.knnIndexes[e][r]>=t||n.knnDistances[e][r]>10)&&(n.knnIndexes[e][r]=e==r?r+1:r,n.knnDistances[e][r]=10);this.useWebGPU?(this.webGPUReducer=new We(this.vectors.length,{nComponents:this.reducer.nComponents,gamma:this.reducer.repulsionStrength,alpha:this.reducer.learningRate,nNeighbours:this.reducer.neighbors,spread:this.reducer.spread,minDist:this.reducer.minDist,negativeSampleRate:this.reducer.negativeSampleRate,localConnectivity:this.reducer.localConnectivity,setOpMixRatio:this.reducer.setOpMixRatio}),this.webGPUReducer.setPrecomputedKNN(n.knnIndexes,n.knnDistances)):this.reducer.setPrecomputedKNN(n.knnIndexes,n.knnDistances),await new Promise((e=>{setTimeout((()=>{e()}),300)}));let i=null;console.time("fit");try{if(this.useWebGPU&&this.webGPUReducer){if(i=await this.webGPUReducer.fit(),!i)throw new Error("Failed to compute embedding");i=new Array(i[0].length).fill(null).map(((e,n)=>new Float32Array(i.map((e=>e[n])))))}}catch(e){console.error(e)}return i||(this.useWebGPU&&(console.error("WEBGPU UMAP failed, falling back to CPU implementation"),this.reducer.setPrecomputedKNN(n.knnIndexes,n.knnDistances)),i=await this.reducer.fitAsync(this.vectors,(e=>{this.progressFunc&&this.progressFunc(e,this.reducer.getNEpochs(),this.reducer.getEmbedding())}))),console.timeEnd("fit"),a=i,new Array(a.length).fill(0).map(((e,n)=>r.from(a[n])));var a}}const Qe={UMAP:Xe,"t-SNE":Ze};class Je{constructor(e,n,t,r,i,a){const s=[];for(let n=0;n<t.length;++n){const r=new y(t[n]).getMeasure(a.distanceFnArgs[n]);s.push(r);let i=2048;for(let t=0;t<e[n].length;++t)if(e[n][t]&&e[n][t]._length){i=e[n][t]._length;break}if(o=t[n],"BitArray"==g[o])for(let t=0;t<e[n].length;++t)e[n][t]&&e[n][t]._data?e[n][t]=new ye.A(e[n][t]._data,e[n][t]._length):e[n][t]=new ye.A(i)}var o;"UMAP"==n?this.reducer=new Xe({data:e,distanceFnames:t,distanceFns:s,distanceFnArgs:a.distanceFnArgs,weights:r,aggregationMethod:i,...a}):"t-SNE"==n&&(this.reducer=new Ze({data:e,distanceFnames:t,distanceFns:s,distanceFnArgs:a.distanceFnArgs,weights:r,aggregationMethod:i,...a}))}async transform(e=!1){if(void 0===this.reducer)throw new Error("Reducer was not defined.");let n=await this.reducer.transform();return e&&(n=function(e){return new Array(e[0].length).fill(0).map(((n,t)=>new r(e.length).fill(0).map(((n,r)=>e[r][t]))))}(n)),n}static availableMetricsByType(e){return Object.keys(m[e])}static get availableMethods(){return Object.keys(Qe)}static get availableMetrics(){let e=[];return Object.values(m).forEach((n=>{const t=Object.values(n);e=[...e,...t]})),e}}async function en(e,n,t){e%5==0&&self.postMessage({epochNum:e,epochsLength:n,embedding:t})}self.onmessage=async({data:{columnsData:e,method:n,distanceMetrics:t,options:r,weights:i,aggregationMethod:a}})=>{let s;try{const o=await async function(e,n,t,r,i,a){const s=new Je(e,n,t,r,i,{...a,progressFunc:en});return await s.transform(!0)}(e,n,t,i,a,r);s={embedding:o}}catch(e){s={error:e}}self.postMessage({error:s.error,embedding:s.embedding})}},6833:function(e,n,t){var r;!function(e,i){function a(e){var n=this;n.next=function(){var e,t,r=n.w,i=n.X,a=n.i;return n.w=r=r+1640531527|0,t=i[a+34&127],e=i[a=a+1&127],t^=t<<13,e^=e<<17,t^=t>>>15,e^=e>>>12,t=i[a]=t^e,n.i=a,t+(r^r>>>16)|0},function(e,n){var t,r,i,a,s,o=[],u=128;for(n===(0|n)?(r=n,n=null):(n+="\0",r=0,u=Math.max(u,n.length)),i=0,a=-32;a<u;++a)n&&(r^=n.charCodeAt((a+32)%n.length)),0===a&&(s=r),r^=r<<10,r^=r>>>15,r^=r<<4,r^=r>>>13,a>=0&&(s=s+1640531527|0,i=0==(t=o[127&a]^=r+s)?i+1:0);for(i>=128&&(o[127&(n&&n.length||0)]=-1),i=127,a=512;a>0;--a)r=o[i+34&127],t=o[i=i+1&127],r^=r<<13,t^=t<<17,r^=r>>>15,t^=t>>>12,o[i]=r^t;e.w=s,e.X=o,e.i=i}(n,e)}function s(e,n){return n.i=e.i,n.w=e.w,n.X=e.X.slice(),n}function o(e,n){null==e&&(e=+new Date);var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&(r.X&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.xor4096=o}(0,e=t.nmd(e),t.amdD)},7180:function(e,n,t){var r;!function(e,i){function a(e){var n,t=this,r=(n=4022871197,function(e){e=String(e);for(var t=0;t<e.length;t++){var r=.02519603282416938*(n+=e.charCodeAt(t));r-=n=r>>>0,n=(r*=n)>>>0,n+=4294967296*(r-=n)}return 2.3283064365386963e-10*(n>>>0)});t.next=function(){var e=2091639*t.s0+2.3283064365386963e-10*t.c;return t.s0=t.s1,t.s1=t.s2,t.s2=e-(t.c=0|e)},t.c=1,t.s0=r(" "),t.s1=r(" "),t.s2=r(" "),t.s0-=r(e),t.s0<0&&(t.s0+=1),t.s1-=r(e),t.s1<0&&(t.s1+=1),t.s2-=r(e),t.s2<0&&(t.s2+=1),r=null}function s(e,n){return n.c=e.c,n.s0=e.s0,n.s1=e.s1,n.s2=e.s2,n}function o(e,n){var t=new a(e),r=n&&n.state,i=t.next;return i.int32=function(){return 4294967296*t.next()|0},i.double=function(){return i()+11102230246251565e-32*(2097152*i()|0)},i.quick=i,r&&("object"==typeof r&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.alea=o}(0,e=t.nmd(e),t.amdD)},7391:(e,n,t)=>{var r=t(7180),i=t(3181),a=t(3031),s=t(9067),o=t(6833),u=t(3717),l=t(4801);l.alea=r,l.xor128=i,l.xorwow=a,l.xorshift7=s,l.xor4096=o,l.tychei=u,e.exports=l},9067:function(e,n,t){var r;!function(e,i){function a(e){var n=this;n.next=function(){var e,t,r=n.x,i=n.i;return e=r[i],t=(e^=e>>>7)^e<<24,t^=(e=r[i+1&7])^e>>>10,t^=(e=r[i+3&7])^e>>>3,t^=(e=r[i+4&7])^e<<7,e=r[i+7&7],t^=(e^=e<<13)^e<<9,r[i]=t,n.i=i+1&7,t},function(e,n){var t,r=[];if(n===(0|n))r[0]=n;else for(n=""+n,t=0;t<n.length;++t)r[7&t]=r[7&t]<<15^n.charCodeAt(t)+r[t+1&7]<<13;for(;r.length<8;)r.push(0);for(t=0;t<8&&0===r[t];++t);for(8==t?r[7]=-1:r[t],e.x=r,e.i=0,t=256;t>0;--t)e.next()}(n,e)}function s(e,n){return n.x=e.x.slice(),n.i=e.i,n}function o(e,n){null==e&&(e=+new Date);var t=new a(e),r=n&&n.state,i=function(){return(t.next()>>>0)/4294967296};return i.double=function(){do{var e=((t.next()>>>11)+(t.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=t.next,i.quick=i,r&&(r.x&&s(r,t),i.state=function(){return s(t,{})}),i}i&&i.exports?i.exports=o:t.amdD&&t.amdO?void 0===(r=function(){return o}.call(n,t,n,i))||(i.exports=r):this.xorshift7=o}(0,e=t.nmd(e),t.amdD)}}]);
|
|
3
3
|
//# sourceMappingURL=738.js.map
|