@datagrok/eda 1.1.25 → 1.1.28

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.
Files changed (111) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/CHANGELOG.md +12 -0
  3. package/README.md +1 -0
  4. package/dist/05e5e0770f54f07e9474.wasm +0 -0
  5. package/dist/111.js +2 -0
  6. package/dist/111.js.map +1 -0
  7. package/dist/153.js +2 -0
  8. package/dist/153.js.map +1 -0
  9. package/dist/23.js +2 -2
  10. package/dist/23.js.map +1 -0
  11. package/dist/234.js +2 -0
  12. package/dist/234.js.map +1 -0
  13. package/dist/242.js +2 -0
  14. package/dist/242.js.map +1 -0
  15. package/dist/260.js +2 -0
  16. package/dist/260.js.map +1 -0
  17. package/dist/317.js +2 -0
  18. package/dist/317.js.map +1 -0
  19. package/dist/33.js +2 -0
  20. package/dist/33.js.map +1 -0
  21. package/dist/348.js +2 -0
  22. package/dist/348.js.map +1 -0
  23. package/dist/377.js +2 -0
  24. package/dist/377.js.map +1 -0
  25. package/dist/412.js +2 -0
  26. package/dist/412.js.map +1 -0
  27. package/dist/415.js +2 -0
  28. package/dist/415.js.map +1 -0
  29. package/dist/531.js +2 -0
  30. package/dist/531.js.map +1 -0
  31. package/dist/583.js +2 -0
  32. package/dist/583.js.map +1 -0
  33. package/dist/589.js +2 -0
  34. package/dist/589.js.map +1 -0
  35. package/dist/603.js +2 -0
  36. package/dist/603.js.map +1 -0
  37. package/dist/656.js +2 -0
  38. package/dist/656.js.map +1 -0
  39. package/dist/682.js +2 -0
  40. package/dist/682.js.map +1 -0
  41. package/dist/705.js +2 -0
  42. package/dist/705.js.map +1 -0
  43. package/dist/731.js +2 -0
  44. package/dist/731.js.map +1 -0
  45. package/dist/738.js +3 -0
  46. package/dist/738.js.map +1 -0
  47. package/dist/763.js +2 -0
  48. package/dist/763.js.map +1 -0
  49. package/dist/778.js +2 -0
  50. package/dist/778.js.map +1 -0
  51. package/dist/783.js +2 -0
  52. package/dist/783.js.map +1 -0
  53. package/dist/793.js +2 -0
  54. package/dist/793.js.map +1 -0
  55. package/dist/907.js +2 -0
  56. package/dist/907.js.map +1 -0
  57. package/dist/91.js +2 -0
  58. package/dist/91.js.map +1 -0
  59. package/dist/950.js +2 -0
  60. package/dist/950.js.map +1 -0
  61. package/dist/package-test.js +2 -2
  62. package/dist/package-test.js.map +1 -0
  63. package/dist/package.js +2 -2
  64. package/dist/package.js.map +1 -0
  65. package/package.json +92 -92
  66. package/scripts/command.txt +1 -1
  67. package/scripts/func.json +1 -1
  68. package/scripts/module.json +1 -1
  69. package/src/missing-values-imputation/ui.ts +80 -66
  70. package/src/package.ts +288 -38
  71. package/src/pls/pls-tools.ts +16 -15
  72. package/src/regression.ts +232 -0
  73. package/src/svm.ts +78 -38
  74. package/tsconfig.json +4 -4
  75. package/wasm/EDA.js +65 -1
  76. package/wasm/EDA.wasm +0 -0
  77. package/wasm/EDAAPI.js +30 -0
  78. package/wasm/EDAForWebWorker.js +1 -1
  79. package/wasm/callWasm.js +384 -393
  80. package/wasm/regression-api.cpp +66 -0
  81. package/wasm/regression.h +128 -0
  82. package/wasm/workers/fitLinearRegressionParamsWithDataNormalizingWorker.js +13 -0
  83. package/wasm/workers/fitLinearRegressionParamsWorker.js +13 -0
  84. package/webpack.config.js +1 -1
  85. package/dist/208.js +0 -2
  86. package/dist/221.js +0 -2
  87. package/dist/231.js +0 -2
  88. package/dist/261.js +0 -2
  89. package/dist/282.js +0 -2
  90. package/dist/334.js +0 -2
  91. package/dist/356.js +0 -2
  92. package/dist/36.js +0 -2
  93. package/dist/367.js +0 -2
  94. package/dist/374.js +0 -2
  95. package/dist/40.js +0 -2
  96. package/dist/413.js +0 -2
  97. package/dist/42.js +0 -2
  98. package/dist/427.js +0 -2
  99. package/dist/467.js +0 -2
  100. package/dist/523.js +0 -3
  101. package/dist/533.js +0 -2
  102. package/dist/590.js +0 -2
  103. package/dist/65.js +0 -2
  104. package/dist/694.js +0 -2
  105. package/dist/729.js +0 -2
  106. package/dist/796.js +0 -2
  107. package/dist/902.js +0 -2
  108. package/dist/910.js +0 -2
  109. package/dist/972.js +0 -2
  110. package/dist/f5343e2c2e15952ce916.wasm +0 -0
  111. /package/dist/{523.js.LICENSE.txt → 738.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"705.js","mappings":"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","sources":["webpack://eda/./node_modules/@datagrok-libraries/math/src/hierarchical-clustering/wasm/wasmCluster.js","webpack://eda/webpack/bootstrap","webpack://eda/webpack/runtime/amd options","webpack://eda/webpack/runtime/define property getters","webpack://eda/webpack/runtime/global","webpack://eda/webpack/runtime/harmony module decorator","webpack://eda/webpack/runtime/hasOwnProperty shorthand","webpack://eda/webpack/runtime/publicPath","webpack://eda/webpack/runtime/importScripts chunk loading","webpack://eda/./node_modules/@datagrok-libraries/math/src/hierarchical-clustering/wasm/clustering-worker.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/hierarchical-clustering/wasm/clusterizerWasm.js"],"sourcesContent":["export var exportCppLib = (() => {\n var _scriptDir =\n typeof document !== \"undefined\" && document.currentScript\n ? document.currentScript.src\n : undefined;\n\n return function (exportCppLib = {}) {\n var Module = typeof exportCppLib != \"undefined\" ? exportCppLib : {};\n var readyPromiseResolve, readyPromiseReject;\n Module[\"ready\"] = new Promise(function (resolve, reject) {\n readyPromiseResolve = resolve;\n readyPromiseReject = reject;\n });\n var moduleOverrides = Object.assign({}, Module);\n var arguments_ = [];\n var thisProgram = \"./this.program\";\n var quit_ = (status, toThrow) => {\n throw toThrow;\n };\n var ENVIRONMENT_IS_WEB = typeof window == \"object\";\n var ENVIRONMENT_IS_WORKER = typeof importScripts == \"function\";\n var ENVIRONMENT_IS_NODE =\n typeof process == \"object\" &&\n typeof process.versions == \"object\" &&\n typeof process.versions.node == \"string\";\n var scriptDirectory = \"\";\n function locateFile(path) {\n if (Module[\"locateFile\"]) {\n return Module[\"locateFile\"](path, scriptDirectory);\n }\n return scriptDirectory + path;\n }\n var read_, readAsync, readBinary, setWindowTitle;\n if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n if (ENVIRONMENT_IS_WORKER) {\n scriptDirectory = self.location.href;\n } else if (typeof document != \"undefined\" && document.currentScript) {\n scriptDirectory = document.currentScript.src;\n }\n if (_scriptDir) {\n scriptDirectory = _scriptDir;\n }\n if (scriptDirectory.indexOf(\"blob:\") !== 0) {\n scriptDirectory = scriptDirectory.substr(\n 0,\n scriptDirectory.replace(/[?#].*/, \"\").lastIndexOf(\"/\") + 1\n );\n } else {\n scriptDirectory = \"\";\n }\n {\n read_ = (url) => {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.send(null);\n return xhr.responseText;\n };\n if (ENVIRONMENT_IS_WORKER) {\n readBinary = (url) => {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.responseType = \"arraybuffer\";\n xhr.send(null);\n return new Uint8Array(xhr.response);\n };\n }\n readAsync = (url, onload, onerror) => {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, true);\n xhr.responseType = \"arraybuffer\";\n xhr.onload = () => {\n if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {\n onload(xhr.response);\n return;\n }\n onerror();\n };\n xhr.onerror = onerror;\n xhr.send(null);\n };\n }\n setWindowTitle = (title) => (document.title = title);\n } else {\n }\n var out = Module[\"print\"] || console.log.bind(console);\n var err = Module[\"printErr\"] || console.warn.bind(console);\n Object.assign(Module, moduleOverrides);\n moduleOverrides = null;\n if (Module[\"arguments\"]) arguments_ = Module[\"arguments\"];\n if (Module[\"thisProgram\"]) thisProgram = Module[\"thisProgram\"];\n if (Module[\"quit\"]) quit_ = Module[\"quit\"];\n var wasmBinary;\n if (Module[\"wasmBinary\"]) wasmBinary = Module[\"wasmBinary\"];\n var noExitRuntime = Module[\"noExitRuntime\"] || true;\n if (typeof WebAssembly != \"object\") {\n abort(\"no native wasm support detected\");\n }\n var wasmMemory;\n var ABORT = false;\n var EXITSTATUS;\n var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n function updateMemoryViews() {\n var b = wasmMemory.buffer;\n Module[\"HEAP8\"] = HEAP8 = new Int8Array(b);\n Module[\"HEAP16\"] = HEAP16 = new Int16Array(b);\n Module[\"HEAP32\"] = HEAP32 = new Int32Array(b);\n Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(b);\n Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(b);\n Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(b);\n Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(b);\n Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(b);\n }\n var wasmTable;\n var __ATPRERUN__ = [];\n var __ATINIT__ = [];\n var __ATPOSTRUN__ = [];\n var runtimeInitialized = false;\n function preRun() {\n if (Module[\"preRun\"]) {\n if (typeof Module[\"preRun\"] == \"function\")\n Module[\"preRun\"] = [Module[\"preRun\"]];\n while (Module[\"preRun\"].length) {\n addOnPreRun(Module[\"preRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPRERUN__);\n }\n function initRuntime() {\n runtimeInitialized = true;\n callRuntimeCallbacks(__ATINIT__);\n }\n function postRun() {\n if (Module[\"postRun\"]) {\n if (typeof Module[\"postRun\"] == \"function\")\n Module[\"postRun\"] = [Module[\"postRun\"]];\n while (Module[\"postRun\"].length) {\n addOnPostRun(Module[\"postRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPOSTRUN__);\n }\n function addOnPreRun(cb) {\n __ATPRERUN__.unshift(cb);\n }\n function addOnInit(cb) {\n __ATINIT__.unshift(cb);\n }\n function addOnPostRun(cb) {\n __ATPOSTRUN__.unshift(cb);\n }\n var runDependencies = 0;\n var runDependencyWatcher = null;\n var dependenciesFulfilled = null;\n function addRunDependency(id) {\n runDependencies++;\n if (Module[\"monitorRunDependencies\"]) {\n Module[\"monitorRunDependencies\"](runDependencies);\n }\n }\n function removeRunDependency(id) {\n runDependencies--;\n if (Module[\"monitorRunDependencies\"]) {\n Module[\"monitorRunDependencies\"](runDependencies);\n }\n if (runDependencies == 0) {\n if (runDependencyWatcher !== null) {\n clearInterval(runDependencyWatcher);\n runDependencyWatcher = null;\n }\n if (dependenciesFulfilled) {\n var callback = dependenciesFulfilled;\n dependenciesFulfilled = null;\n callback();\n }\n }\n }\n function abort(what) {\n if (Module[\"onAbort\"]) {\n Module[\"onAbort\"](what);\n }\n what = \"Aborted(\" + what + \")\";\n err(what);\n ABORT = true;\n EXITSTATUS = 1;\n what += \". Build with -sASSERTIONS for more info.\";\n var e = new WebAssembly.RuntimeError(what);\n readyPromiseReject(e);\n throw e;\n }\n var dataURIPrefix = \"data:application/octet-stream;base64,\";\n function isDataURI(filename) {\n return filename.startsWith(dataURIPrefix);\n }\n var wasmBinaryFile;\n wasmBinaryFile = \"wasmCluster.wasm\";\n if (!isDataURI(wasmBinaryFile)) {\n wasmBinaryFile = locateFile(wasmBinaryFile);\n }\n function getBinary(file) {\n try {\n if (file == wasmBinaryFile && wasmBinary) {\n return new Uint8Array(wasmBinary);\n }\n if (readBinary) {\n return readBinary(file);\n }\n throw \"both async and sync fetching of the wasm failed\";\n } catch (err) {\n abort(err);\n }\n }\n function getBinaryPromise(binaryFile) {\n if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\n if (typeof fetch == \"function\") {\n return fetch(binaryFile, { credentials: \"same-origin\" })\n .then(function (response) {\n if (!response[\"ok\"]) {\n throw \"failed to load wasm binary file at '\" + binaryFile + \"'\";\n }\n return response[\"arrayBuffer\"]();\n })\n .catch(function () {\n return getBinary(binaryFile);\n });\n }\n }\n return Promise.resolve().then(function () {\n return getBinary(binaryFile);\n });\n }\n function instantiateArrayBuffer(binaryFile, imports, receiver) {\n return getBinaryPromise(binaryFile)\n .then(function (binary) {\n return WebAssembly.instantiate(binary, imports);\n })\n .then(function (instance) {\n return instance;\n })\n .then(receiver, function (reason) {\n err(\"failed to asynchronously prepare wasm: \" + reason);\n abort(reason);\n });\n }\n function instantiateAsync(binary, binaryFile, imports, callback) {\n if (\n !binary &&\n typeof WebAssembly.instantiateStreaming == \"function\" &&\n !isDataURI(binaryFile) &&\n typeof fetch == \"function\"\n ) {\n return fetch(binaryFile, { credentials: \"same-origin\" }).then(function (\n response\n ) {\n var result = WebAssembly.instantiateStreaming(response, imports);\n return result.then(callback, function (reason) {\n err(\"wasm streaming compile failed: \" + reason);\n err(\"falling back to ArrayBuffer instantiation\");\n return instantiateArrayBuffer(binaryFile, imports, callback);\n });\n });\n } else {\n return instantiateArrayBuffer(binaryFile, imports, callback);\n }\n }\n function createWasm() {\n var info = { a: wasmImports };\n function receiveInstance(instance, module) {\n var exports = instance.exports;\n Module[\"asm\"] = exports;\n wasmMemory = Module[\"asm\"][\"e\"];\n updateMemoryViews();\n wasmTable = Module[\"asm\"][\"i\"];\n addOnInit(Module[\"asm\"][\"f\"]);\n removeRunDependency(\"wasm-instantiate\");\n return exports;\n }\n addRunDependency(\"wasm-instantiate\");\n function receiveInstantiationResult(result) {\n receiveInstance(result[\"instance\"]);\n }\n if (Module[\"instantiateWasm\"]) {\n try {\n return Module[\"instantiateWasm\"](info, receiveInstance);\n } catch (e) {\n err(\"Module.instantiateWasm callback failed with error: \" + e);\n readyPromiseReject(e);\n }\n }\n instantiateAsync(\n wasmBinary,\n wasmBinaryFile,\n info,\n receiveInstantiationResult\n ).catch(readyPromiseReject);\n return {};\n }\n function callRuntimeCallbacks(callbacks) {\n while (callbacks.length > 0) {\n callbacks.shift()(Module);\n }\n }\n function ExceptionInfo(excPtr) {\n this.excPtr = excPtr;\n this.ptr = excPtr - 24;\n this.set_type = function (type) {\n HEAPU32[(this.ptr + 4) >> 2] = type;\n };\n this.get_type = function () {\n return HEAPU32[(this.ptr + 4) >> 2];\n };\n this.set_destructor = function (destructor) {\n HEAPU32[(this.ptr + 8) >> 2] = destructor;\n };\n this.get_destructor = function () {\n return HEAPU32[(this.ptr + 8) >> 2];\n };\n this.set_caught = function (caught) {\n caught = caught ? 1 : 0;\n HEAP8[(this.ptr + 12) >> 0] = caught;\n };\n this.get_caught = function () {\n return HEAP8[(this.ptr + 12) >> 0] != 0;\n };\n this.set_rethrown = function (rethrown) {\n rethrown = rethrown ? 1 : 0;\n HEAP8[(this.ptr + 13) >> 0] = rethrown;\n };\n this.get_rethrown = function () {\n return HEAP8[(this.ptr + 13) >> 0] != 0;\n };\n this.init = function (type, destructor) {\n this.set_adjusted_ptr(0);\n this.set_type(type);\n this.set_destructor(destructor);\n };\n this.set_adjusted_ptr = function (adjustedPtr) {\n HEAPU32[(this.ptr + 16) >> 2] = adjustedPtr;\n };\n this.get_adjusted_ptr = function () {\n return HEAPU32[(this.ptr + 16) >> 2];\n };\n this.get_exception_ptr = function () {\n var isPointer = ___cxa_is_pointer_type(this.get_type());\n if (isPointer) {\n return HEAPU32[this.excPtr >> 2];\n }\n var adjusted = this.get_adjusted_ptr();\n if (adjusted !== 0) return adjusted;\n return this.excPtr;\n };\n }\n var exceptionLast = 0;\n var uncaughtExceptionCount = 0;\n function ___cxa_throw(ptr, type, destructor) {\n var info = new ExceptionInfo(ptr);\n info.init(type, destructor);\n exceptionLast = ptr;\n uncaughtExceptionCount++;\n throw exceptionLast;\n }\n function _abort() {\n abort(\"\");\n }\n function _emscripten_memcpy_big(dest, src, num) {\n HEAPU8.copyWithin(dest, src, src + num);\n }\n function getHeapMax() {\n return 2147483648;\n }\n function emscripten_realloc_buffer(size) {\n var b = wasmMemory.buffer;\n try {\n wasmMemory.grow((size - b.byteLength + 65535) >>> 16);\n updateMemoryViews();\n return 1;\n } catch (e) {}\n }\n function _emscripten_resize_heap(requestedSize) {\n var oldSize = HEAPU8.length;\n requestedSize = requestedSize >>> 0;\n var maxHeapSize = getHeapMax();\n if (requestedSize > maxHeapSize) {\n return false;\n }\n let alignUp = (x, multiple) =>\n x + ((multiple - (x % multiple)) % multiple);\n for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\n overGrownHeapSize = Math.min(\n overGrownHeapSize,\n requestedSize + 100663296\n );\n var newSize = Math.min(\n maxHeapSize,\n alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)\n );\n var replacement = emscripten_realloc_buffer(newSize);\n if (replacement) {\n return true;\n }\n }\n return false;\n }\n function getCFunc(ident) {\n var func = Module[\"_\" + ident];\n return func;\n }\n function writeArrayToMemory(array, buffer) {\n HEAP8.set(array, buffer);\n }\n function lengthBytesUTF8(str) {\n var len = 0;\n for (var i = 0; i < str.length; ++i) {\n var c = str.charCodeAt(i);\n if (c <= 127) {\n len++;\n } else if (c <= 2047) {\n len += 2;\n } else if (c >= 55296 && c <= 57343) {\n len += 4;\n ++i;\n } else {\n len += 3;\n }\n }\n return len;\n }\n function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\n if (!(maxBytesToWrite > 0)) return 0;\n var startIdx = outIdx;\n var endIdx = outIdx + maxBytesToWrite - 1;\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i);\n if (u >= 55296 && u <= 57343) {\n var u1 = str.charCodeAt(++i);\n u = (65536 + ((u & 1023) << 10)) | (u1 & 1023);\n }\n if (u <= 127) {\n if (outIdx >= endIdx) break;\n heap[outIdx++] = u;\n } else if (u <= 2047) {\n if (outIdx + 1 >= endIdx) break;\n heap[outIdx++] = 192 | (u >> 6);\n heap[outIdx++] = 128 | (u & 63);\n } else if (u <= 65535) {\n if (outIdx + 2 >= endIdx) break;\n heap[outIdx++] = 224 | (u >> 12);\n heap[outIdx++] = 128 | ((u >> 6) & 63);\n heap[outIdx++] = 128 | (u & 63);\n } else {\n if (outIdx + 3 >= endIdx) break;\n heap[outIdx++] = 240 | (u >> 18);\n heap[outIdx++] = 128 | ((u >> 12) & 63);\n heap[outIdx++] = 128 | ((u >> 6) & 63);\n heap[outIdx++] = 128 | (u & 63);\n }\n }\n heap[outIdx] = 0;\n return outIdx - startIdx;\n }\n function stringToUTF8(str, outPtr, maxBytesToWrite) {\n return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);\n }\n function stringToUTF8OnStack(str) {\n var size = lengthBytesUTF8(str) + 1;\n var ret = stackAlloc(size);\n stringToUTF8(str, ret, size);\n return ret;\n }\n var UTF8Decoder =\n typeof TextDecoder != \"undefined\" ? new TextDecoder(\"utf8\") : undefined;\n function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) {\n var endIdx = idx + maxBytesToRead;\n var endPtr = idx;\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\n }\n var str = \"\";\n while (idx < endPtr) {\n var u0 = heapOrArray[idx++];\n if (!(u0 & 128)) {\n str += String.fromCharCode(u0);\n continue;\n }\n var u1 = heapOrArray[idx++] & 63;\n if ((u0 & 224) == 192) {\n str += String.fromCharCode(((u0 & 31) << 6) | u1);\n continue;\n }\n var u2 = heapOrArray[idx++] & 63;\n if ((u0 & 240) == 224) {\n u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\n } else {\n u0 =\n ((u0 & 7) << 18) |\n (u1 << 12) |\n (u2 << 6) |\n (heapOrArray[idx++] & 63);\n }\n if (u0 < 65536) {\n str += String.fromCharCode(u0);\n } else {\n var ch = u0 - 65536;\n str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));\n }\n }\n return str;\n }\n function UTF8ToString(ptr, maxBytesToRead) {\n return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : \"\";\n }\n function ccall(ident, returnType, argTypes, args, opts) {\n var toC = {\n string: (str) => {\n var ret = 0;\n if (str !== null && str !== undefined && str !== 0) {\n ret = stringToUTF8OnStack(str);\n }\n return ret;\n },\n array: (arr) => {\n var ret = stackAlloc(arr.length);\n writeArrayToMemory(arr, ret);\n return ret;\n },\n };\n function convertReturnValue(ret) {\n if (returnType === \"string\") {\n return UTF8ToString(ret);\n }\n if (returnType === \"boolean\") return Boolean(ret);\n return ret;\n }\n var func = getCFunc(ident);\n var cArgs = [];\n var stack = 0;\n if (args) {\n for (var i = 0; i < args.length; i++) {\n var converter = toC[argTypes[i]];\n if (converter) {\n if (stack === 0) stack = stackSave();\n cArgs[i] = converter(args[i]);\n } else {\n cArgs[i] = args[i];\n }\n }\n }\n var ret = func.apply(null, cArgs);\n function onDone(ret) {\n if (stack !== 0) stackRestore(stack);\n return convertReturnValue(ret);\n }\n ret = onDone(ret);\n return ret;\n }\n function cwrap(ident, returnType, argTypes, opts) {\n var numericArgs =\n !argTypes ||\n argTypes.every((type) => type === \"number\" || type === \"boolean\");\n var numericRet = returnType !== \"string\";\n if (numericRet && numericArgs && !opts) {\n return getCFunc(ident);\n }\n return function () {\n return ccall(ident, returnType, argTypes, arguments, opts);\n };\n }\n var wasmImports = {\n d: ___cxa_throw,\n a: _abort,\n c: _emscripten_memcpy_big,\n b: _emscripten_resize_heap,\n };\n var asm = createWasm();\n var ___wasm_call_ctors = function () {\n return (___wasm_call_ctors = Module[\"asm\"][\"f\"]).apply(null, arguments);\n };\n var _getDendrogram = (Module[\"_getDendrogram\"] = function () {\n return (_getDendrogram = Module[\"_getDendrogram\"] =\n Module[\"asm\"][\"g\"]).apply(null, arguments);\n });\n var _free = (Module[\"_free\"] = function () {\n return (_free = Module[\"_free\"] = Module[\"asm\"][\"h\"]).apply(\n null,\n arguments\n );\n });\n var ___errno_location = function () {\n return (___errno_location = Module[\"asm\"][\"__errno_location\"]).apply(\n null,\n arguments\n );\n };\n var _malloc = (Module[\"_malloc\"] = function () {\n return (_malloc = Module[\"_malloc\"] = Module[\"asm\"][\"j\"]).apply(\n null,\n arguments\n );\n });\n var stackSave = function () {\n return (stackSave = Module[\"asm\"][\"k\"]).apply(null, arguments);\n };\n var stackRestore = function () {\n return (stackRestore = Module[\"asm\"][\"l\"]).apply(null, arguments);\n };\n var stackAlloc = function () {\n return (stackAlloc = Module[\"asm\"][\"m\"]).apply(null, arguments);\n };\n var ___cxa_is_pointer_type = function () {\n return (___cxa_is_pointer_type = Module[\"asm\"][\"n\"]).apply(\n null,\n arguments\n );\n };\n Module[\"ccall\"] = ccall;\n Module[\"cwrap\"] = cwrap;\n var calledRun;\n dependenciesFulfilled = function runCaller() {\n if (!calledRun) run();\n if (!calledRun) dependenciesFulfilled = runCaller;\n };\n function run() {\n if (runDependencies > 0) {\n return;\n }\n preRun();\n if (runDependencies > 0) {\n return;\n }\n function doRun() {\n if (calledRun) return;\n calledRun = true;\n Module[\"calledRun\"] = true;\n if (ABORT) return;\n initRuntime();\n readyPromiseResolve(Module);\n if (Module[\"onRuntimeInitialized\"]) Module[\"onRuntimeInitialized\"]();\n postRun();\n }\n if (Module[\"setStatus\"]) {\n Module[\"setStatus\"](\"Running...\");\n setTimeout(function () {\n setTimeout(function () {\n Module[\"setStatus\"](\"\");\n }, 1);\n doRun();\n }, 1);\n } else {\n doRun();\n }\n }\n if (Module[\"preInit\"]) {\n if (typeof Module[\"preInit\"] == \"function\")\n Module[\"preInit\"] = [Module[\"preInit\"]];\n while (Module[\"preInit\"].length > 0) {\n Module[\"preInit\"].pop()();\n }\n }\n run();\n\n return exportCppLib.ready;\n };\n})();\nif (typeof exports === \"object\" && typeof module === \"object\")\n module.exports = exportCppLib;\nelse if (typeof define === \"function\" && define[\"amd\"])\n define([], function () {\n return exportCppLib;\n });\nelse if (typeof exports === \"object\") exports[\"exportCppLib\"] = exportCppLib;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdO = {};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = self.location + \"\";\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t705: 1\n};\n\n// no chunk install function needed\n// no chunk loading\n\n// no HMR\n\n// no HMR manifest","import { getClustersFromDistMatWasm } from './clusterizerWasm';\nonmessage = (event) => {\n const { distMatArray, n, methodCode } = event.data;\n const data = {};\n try {\n getClustersFromDistMatWasm(distMatArray, n, methodCode)\n .then((clusterMatrix) => {\n data.clusterMatrix = clusterMatrix;\n postMessage(data);\n });\n }\n catch (e) {\n data.error = e;\n postMessage(data);\n }\n};\n//# sourceMappingURL=clustering-worker.js.map","import {exportCppLib} from './wasmCluster.js';\n\n/**\n calls wasm function to get clustering merges and heights from distance matrix\n distmat: distance matrix as an array of floats comprising the top right triangle of the matrix\n n: number of observables\n method: 0 = single linkage, 1 = complete linkage, 2 = average linkage, 3 = median linkage\n result: { mergeResult: Int32Array, heightsResult: Float32Array }\n mergeResult has length of (n-1)*2 and heightResult has length of n-1\n together they describe the clustering as a dendrogram as a matrix of (n-1) X 3\n each row in the given matrix comprises the merge event at step i and last column is the height from the leaves.\n*/\nexport async function getClustersFromDistMatWasm(distmat, n, method) {\n const wasmUrl = new URL('./wasmCluster.wasm', import.meta.url).href;\n const wasmPath = wasmUrl.substring(0, wasmUrl.lastIndexOf('/') + 1) + 'wasmCluster.wasm';\n let wasmInstance;\n try {\n wasmInstance = await exportCppLib({locateFile: () => wasmPath, printErr: (_) => {}});\n } catch (e) {\n try {\n wasmInstance = await exportCppLib({locateFile: () => wasmUrl, printErr: (_) => {}});\n }\n catch (e) {\n console.error(e);\n throw new Error('Unable to load wasm file for hierarchical clustering');\n }\n }\n\n const getDendrogramWasm =\n wasmInstance.cwrap('getDendrogram', 'null', ['number', 'number', 'number', 'number', 'number']);\n // allocate a memory block on the wasm heap for the distance matrix\n const bytesForDistMat = Float32Array.BYTES_PER_ELEMENT * distmat.length;\n const dataPtr = wasmInstance._malloc(bytesForDistMat);\n const matHeap = new Uint8Array(wasmInstance.HEAPU8.buffer, dataPtr, bytesForDistMat);\n matHeap.set(new Uint8Array(distmat.buffer));\n\n //allocate a memory block on the wasm heap for the merges array\n const bytesForMergeArray = Int32Array.BYTES_PER_ELEMENT * (n - 1) * 2;\n const mergePtr = wasmInstance._malloc(bytesForMergeArray);\n const mergeHeap = new Uint8Array(wasmInstance.HEAPU8.buffer, mergePtr, bytesForMergeArray);\n\n //allocate a memory block on the wasm heap for the heigt array\n const bytesForHeightsArray = Float32Array.BYTES_PER_ELEMENT * (n - 1);\n const heightsPtr = wasmInstance._malloc(bytesForHeightsArray);\n const heightsHeap = new Uint8Array(wasmInstance.HEAPU8.buffer, heightsPtr, bytesForHeightsArray);\n\n // call the wasm function\n getDendrogramWasm(dataPtr, n, method, mergePtr, heightsPtr);\n // get the merges and heights from the wasm heap\n const mergeResult = new Int32Array(mergeHeap.buffer, mergeHeap.byteOffset, (n-1) * 2);\n const heightsResult = (new Float32Array(heightsHeap.buffer, heightsHeap.byteOffset, n-1)).slice(0, n-1);\n\n const mergeRow1 = mergeResult.slice(0, n-1);\n const mergeRow2 = mergeResult.slice(n-1, 2*n - 2);\n // free the memory blocks on the wasm heap\n wasmInstance._free(matHeap.byteOffset);\n wasmInstance._free(mergeHeap.byteOffset);\n wasmInstance._free(heightsHeap.byteOffset);\n return {mergeRow1, mergeRow2, heightsResult};\n}\n"],"names":["_scriptDir","exportCppLib","document","currentScript","src","undefined","readyPromiseResolve","readyPromiseReject","Module","Promise","resolve","reject","readBinary","moduleOverrides","Object","assign","ENVIRONMENT_IS_WEB","window","ENVIRONMENT_IS_WORKER","importScripts","scriptDirectory","process","versions","node","self","location","href","indexOf","substr","replace","lastIndexOf","url","xhr","XMLHttpRequest","open","responseType","send","Uint8Array","response","console","log","bind","wasmBinary","wasmMemory","err","warn","WebAssembly","abort","HEAP8","HEAPU8","HEAPU32","ABORT","updateMemoryViews","b","buffer","Int8Array","Int16Array","Int32Array","Uint16Array","Uint32Array","Float32Array","Float64Array","__ATPRERUN__","__ATINIT__","__ATPOSTRUN__","runDependencies","runDependencyWatcher","dependenciesFulfilled","what","e","RuntimeError","wasmBinaryFile","path","isDataURI","filename","startsWith","getBinary","file","instantiateArrayBuffer","binaryFile","imports","receiver","fetch","then","credentials","catch","getBinaryPromise","binary","instantiate","instance","reason","callRuntimeCallbacks","callbacks","length","shift","ExceptionInfo","excPtr","this","ptr","set_type","type","get_type","set_destructor","destructor","get_destructor","set_caught","caught","get_caught","set_rethrown","rethrown","get_rethrown","init","set_adjusted_ptr","adjustedPtr","get_adjusted_ptr","get_exception_ptr","___cxa_is_pointer_type","adjusted","emscripten_realloc_buffer","size","grow","byteLength","getCFunc","ident","UTF8Decoder","TextDecoder","ccall","returnType","argTypes","args","opts","toC","string","str","ret","len","i","c","charCodeAt","lengthBytesUTF8","stackAlloc","outPtr","maxBytesToWrite","heap","outIdx","endIdx","u","stringToUTF8Array","stringToUTF8","stringToUTF8OnStack","array","arr","set","func","cArgs","stack","converter","stackSave","apply","stackRestore","heapOrArray","idx","maxBytesToRead","endPtr","decode","subarray","u0","u1","u2","String","fromCharCode","ch","UTF8ArrayToString","Boolean","convertReturnValue","onDone","calledRun","wasmImports","d","a","dest","num","copyWithin","requestedSize","x","oldSize","maxHeapSize","cutDown","overGrownHeapSize","Math","min","max","callback","info","receiveInstance","module","cb","exports","unshift","clearInterval","removeRunDependency","result","instantiateStreaming","createWasm","arguments","run","doRun","postRun","preRun","setTimeout","numericArgs","every","runCaller","pop","ready","define","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","id","loaded","__webpack_modules__","m","amdO","definition","key","o","defineProperty","enumerable","get","g","globalThis","Function","hmd","create","children","Error","obj","prop","prototype","hasOwnProperty","call","scriptUrl","scripts","getElementsByTagName","test","p","onmessage","event","distMatArray","n","methodCode","data","async","distmat","method","wasmUrl","URL","wasmPath","substring","wasmInstance","locateFile","printErr","_","error","getDendrogramWasm","cwrap","bytesForDistMat","BYTES_PER_ELEMENT","dataPtr","_malloc","matHeap","bytesForMergeArray","mergePtr","mergeHeap","bytesForHeightsArray","heightsPtr","heightsHeap","mergeResult","byteOffset","heightsResult","slice","mergeRow1","mergeRow2","_free","getClustersFromDistMatWasm","clusterMatrix","postMessage"],"sourceRoot":""}
package/dist/731.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkeda=self.webpackChunkeda||[]).push([[731],{5731:(e,n,t)=>{t.d(n,{p:()=>a});var r=t(6066),s=t(606);class a{constructor(){this._workerCount=Math.max(navigator.hardwareConcurrency-2,1)}async calcMultiColumn(e,n,s,a=[{}],o=[1],l=r.G.EUCLIDEAN){const h=e[0].length*(e[0].length-1)/2,i=Math.floor(h/this._workerCount),c=e[0].length>2e4?await this.getMinimalThreshold(e,n,a,o,l):0;s<c&&(console.log(`using threshold ${c}`),s=c),a.forEach(((e,n)=>a[n].threshold=s));const w=new Array(this._workerCount),g=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(111),t.b))));for(let t=0;t<this._workerCount;t++)w[t]=new Promise(((r,c)=>{const w=t*i,u=t===this._workerCount-1?h:(t+1)*i;u<=w&&r({i:new Int32Array(0),j:new Int32Array(0),distance:new Float32Array(0),idx:t}),g[t].postMessage({values:e,startIdx:w,endIdx:u,threshold:s,fnNames:n,opts:a,weights:o,aggregationMethod:l}),g[t].onmessage=({data:{error:e,i:n,j:s,distance:a}})=>{e?(g[t].terminate(),c(e)):(g[t].terminate(),r({i:n,j:s,distance:a,idx:t}))}}));const u=await Promise.all(w),d=u.reduce(((e,n)=>e+n.i.length),0),k=new Int32Array(d),m=new Int32Array(d),f=new Float32Array(d);let y=0;for(const e of u)k.set(e.i,y),m.set(e.j,y),f.set(e.distance,y),y+=e.i.length;return{i:k,j:m,distance:f}}async calc(e,n,t,r={}){return await this.calcMultiColumn([e],[n],t,[r],[1])}async getKNN(e,n,t=15,r={}){return await this.multiColumnKNN([e],[n],t,[r],[1])}async getThresholdKNN(e,n,t=.8,r={}){return await this.multiColumnThresholdKnn([e],[n],t,[r],[1])}async multiColumnThresholdKnn(e,n,s=.8,a,o,l=r.G.EUCLIDEAN){if(e.length!==n.length||e.length!==a.length||e.length!==o.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const h=e[0].length*(e[0].length-1)/2,i=Math.floor(h/this._workerCount),c=new Array(this._workerCount),w=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(603),t.b))));for(let t=0;t<this._workerCount;t++)c[t]=new Promise(((r,c)=>{const g=t*i,u=t===this._workerCount-1?h:(t+1)*i;u<=g&&r({knnDistances:new Array(0),knnIndexes:new Array(0)}),w[t].postMessage({values:e,startIdx:g,endIdx:u,fnNames:n,opts:a,threshold:s,weights:o,aggregationMethod:l}),w[t].onmessage=({data:{error:e,knnDistances:n,knnIndexes:s}})=>{e?(w[t].terminate(),c(e)):(w[t].terminate(),r({knnDistances:n,knnIndexes:s}))}}));const g=await Promise.all(c),u=new Int32Array(e[0].length);for(const n of g)for(let t=0;t<e[0].length;++t)u[t]+=n.knnIndexes[t]?.length??0;const d={knnDistances:new Array(e[0].length).fill(null).map(((e,n)=>new Array(u[n]))),knnIndexes:new Array(e[0].length).fill(null).map(((e,n)=>new Array(u[n])))};for(const n of g)for(let t=0;t<e[0].length;++t)for(let e=0;e<n.knnDistances[t]?.length;++e)d.knnDistances[t][u[t]-1]=n.knnDistances[t][e],d.knnIndexes[t][u[t]-1]=n.knnIndexes[t][e],u[t]-=1;return d}async multiColumnKNN(e,n,a=15,o,l,h=r.G.EUCLIDEAN){if(e.length!==n.length||e.length!==o.length||e.length!==l.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const i=e[0].length*(e[0].length-1)/2,c=Math.floor(i/this._workerCount),w=new Array(this._workerCount),g=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(950),t.b))));for(let t=0;t<this._workerCount;t++)w[t]=new Promise(((r,s)=>{const w=t*c,u=t===this._workerCount-1?i:(t+1)*c;u<=w&&r({knnDistances:new Array(0),knnIndexes:new Array(0)}),g[t].postMessage({values:e,startIdx:w,endIdx:u,fnNames:n,opts:o,nNeighbours:a,weights:l,aggregationMethod:h}),g[t].onmessage=({data:{error:e,knnDistances:n,knnIndexes:a}})=>{e?(g[t].terminate(),s(e)):(g[t].terminate(),r({knnDistances:n,knnIndexes:a}))}}));const u=await Promise.all(w),d={knnDistances:new Array(e[0].length).fill(null).map((()=>new Array(a).fill(99999))),knnIndexes:new Array(e[0].length).fill(null).map((()=>new Array(a).fill(-1)))};for(const n of u)for(let t=0;t<e[0].length;++t)for(let e=0;e<n.knnDistances[t]?.length;++e)(0,s.Qt)(d.knnDistances[t],d.knnIndexes[t],n.knnDistances[t][e],n.knnIndexes[t][e]);return d}async getSampleDistances(e,n,s=[],a,o=r.G.EUCLIDEAN){const l=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(778),t.b))));try{const t=e[0].length*(e[0].length-1)/2,r=Math.floor(t/this._workerCount),h=1e6,i=Math.max(Math.min(t/1e3,h),Math.min(t,h)),c=Math.floor(i/this._workerCount),w=new Array(this._workerCount);for(let h=0;h<this._workerCount;h++)w[h]=new Promise(((i,w)=>{const g=h*r,u=h===this._workerCount-1?t:(h+1)*r;l[h].postMessage({values:e,startIdx:g,endIdx:u,sampleLength:c,fnNames:n,opts:s,weights:a,aggregationMethod:o}),l[h].onmessage=({data:{error:e,distance:n}})=>{l[h].terminate(),e?w(e):i({distance:n})}}));const g=await Promise.all(w),u=g.reduce(((e,n)=>e+n.distance.length),0),d=new Float32Array(u);let k=0;for(const e of g)d.set(e.distance,k),k+=e.distance.length;return d.sort(),d}catch(e){return l?.forEach((e=>e?.terminate())),console.error(e),new Float32Array(1).fill(.5)}}async getMinimalThreshold(e,n,t=[],s,a=r.G.EUCLIDEAN){try{const r=e.length*(e.length-1)/2,o=await this.getSampleDistances(e,n,t,s,a);return 1-o[Math.floor(7e7/r*o.length)]}catch(e){return console.error(e),.5}}static calcSync(e,n,t,r){const a=[],o=[],l=[];let h=0,i=0,c=0;const w=e.length*(e.length-1)/2;for(;h<w;){const n=(0,s.gD)(e[i])||(0,s.gD)(e[c])?1:t(e[i],e[c]);1-n>=r&&(a.push(i),o.push(c),l.push(n)),h++,c++,c===e.length&&(i++,c=i+1)}return{i:new Int32Array(a),j:new Int32Array(o),distance:new Float32Array(l)}}}},6066:(e,n,t)=>{var r;t.d(n,{G:()=>r}),function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(r||(r={}))}}]);
2
+ //# sourceMappingURL=731.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"731.js","mappings":"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","sources":["webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-service.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js"],"sourcesContent":["import { DistanceAggregationMethods } from './types';\nimport { insertSmaller, isNil } from './utils';\nexport class SparseMatrixService {\n constructor() {\n this._workerCount = Math.max(navigator.hardwareConcurrency - 2, 1);\n }\n async calcMultiColumn(values, fnNames, threshold, opts = [{}], weights = [1], aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const minThreshold = values[0].length > 20000 ?\n await this.getMinimalThreshold(values, fnNames, opts, weights, aggregationMethod) : 0;\n if (threshold < minThreshold) {\n console.log(`using threshold ${minThreshold}`);\n threshold = minThreshold;\n }\n opts.forEach((_, i) => opts[i]['threshold'] = threshold);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./sparse-matrix-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ i: new Int32Array(0), j: new Int32Array(0), distance: new Float32Array(0), idx });\n workers[idx].postMessage({ values, startIdx, endIdx, threshold, fnNames, opts, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, i, j, distance } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ i, j, distance, idx });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const fullSize = results.reduce((acc, val) => acc + val.i.length, 0);\n const i = new Int32Array(fullSize);\n const j = new Int32Array(fullSize);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n // setting the results\n for (const res of results) {\n i.set(res.i, offset);\n j.set(res.j, offset);\n distance.set(res.distance, offset);\n offset += res.i.length;\n }\n return { i, j, distance };\n }\n async calc(values, fnName, threshold, opts = {}) {\n //size of full matrix\n return await this.calcMultiColumn([values], [fnName], threshold, [opts], [1]);\n }\n async getKNN(values, fnName, nNeighbours = 15, opts = {}) {\n return await this.multiColumnKNN([values], [fnName], nNeighbours, [opts], [1]);\n }\n async getThresholdKNN(values, fnName, threshold = 0.8, opts = {}) {\n return await this.multiColumnThresholdKnn([values], [fnName], threshold, [opts], [1]);\n }\n async multiColumnThresholdKnn(values, fnNames, threshold = 0.8, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-threshold-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, threshold, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnSizes = new Int32Array(values[0].length);\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i)\n knnSizes[i] += res.knnIndexes[i]?.length ?? 0;\n }\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i])),\n knnIndexes: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i]))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j) {\n knnRes.knnDistances[i][knnSizes[i] - 1] = res.knnDistances[i][j];\n knnRes.knnIndexes[i][knnSizes[i] - 1] = res.knnIndexes[i][j];\n knnSizes[i] -= 1;\n }\n }\n }\n return knnRes;\n }\n async multiColumnKNN(values, fnNames, nNeighbours = 15, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, nNeighbours, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(99999)),\n knnIndexes: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(-1))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j)\n insertSmaller(knnRes.knnDistances[i], knnRes.knnIndexes[i], res.knnDistances[i][j], res.knnIndexes[i][j]);\n }\n }\n return knnRes;\n }\n async getSampleDistances(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const thresholdWorkers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./sparse-matrix-threshold-worker', import.meta.url)));\n try {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const maxSampleSize = 1000000;\n const sampleSise = Math.max(Math.min(matSize / 1000, maxSampleSize), Math.min(matSize, maxSampleSize));\n const testSetSizePerWorker = Math.floor(sampleSise / this._workerCount);\n const tPromises = new Array(this._workerCount);\n for (let idx = 0; idx < this._workerCount; idx++) {\n tPromises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n thresholdWorkers[idx].postMessage({\n values: values, startIdx, endIdx, sampleLength: testSetSizePerWorker,\n fnNames, opts, weights, aggregationMethod\n });\n thresholdWorkers[idx].onmessage = ({ data: { error, distance } }) => {\n thresholdWorkers[idx].terminate();\n if (error)\n rejectWorker(error);\n else\n resolveWorker({ distance });\n };\n });\n }\n const results = await Promise.all(tPromises);\n const fullSize = results.reduce((acc, val) => acc + val.distance.length, 0);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n for (const res of results) {\n distance.set(res.distance, offset);\n offset += res.distance.length;\n }\n distance.sort();\n return distance;\n }\n catch (e) {\n thresholdWorkers?.forEach((w) => w?.terminate());\n console.error(e);\n return new Float32Array(1).fill(0.5);\n }\n }\n async getMinimalThreshold(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n //We need to calculate the minimal threshold first,\n //in order to get matrix such that it does not exceed the maximum size of 1GB\n //we have 3 return arrays, each 4 bites per element, so if the maximum size of the matrix is 1GB,\n const maxSparseMatrixSize = 70000000;\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const distance = await this.getSampleDistances(values, fnNames, opts, weights, aggregationMethod);\n const fractionIndex = Math.floor(maxSparseMatrixSize / matSize * distance.length);\n const threshold = 1 - distance[fractionIndex];\n // threshold = Math.max(threshold, 0.3);\n return threshold;\n }\n catch (e) {\n console.error(e);\n return 0.5;\n }\n }\n static calcSync(values, fnName, distanceFn, threshold) {\n const i = [];\n const j = [];\n const distances = [];\n let cnt = 0;\n let mi = 0;\n let mj = 0;\n const fullSize = values.length * (values.length - 1) / 2;\n while (cnt < fullSize) {\n //const value = seq1List[mi] && seq1List[mj] ? hamming(seq1List[mi], seq1List[mj]) : 0;\n const value = !isNil(values[mi]) && !isNil(values[mj]) ?\n distanceFn(values[mi], values[mj]) : 1;\n const similarity = 1 - value;\n if (similarity >= threshold) {\n i.push(mi);\n j.push(mj);\n distances.push(value);\n }\n cnt++;\n mj++;\n if (mj === values.length) {\n mi++;\n mj = mi + 1;\n }\n }\n const iArray = new Int32Array(i);\n const jArray = new Int32Array(j);\n const distanceArray = new Float32Array(distances);\n return { i: iArray, j: jArray, distance: distanceArray };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsMEJBQTBCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFhN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUU1QjtRQUNFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQW9CLEVBQUUsT0FBdUIsRUFDeEUsU0FBaUIsRUFBRSxPQUE2QixDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQzdFLG9CQUErQywwQkFBMEIsQ0FBQyxTQUFTO1FBRW5GLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFMUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFNLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFD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Q0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLFVBQVUsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNYLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQztZQUNELEdBQUcsRUFBRSxDQUFDO1lBQ04sRUFBRSxFQUFFLENBQUM7WUFDTCxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVsRCxPQUFPLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7aW5zZXJ0U21hbGxlciwgaXNOaWx9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBTcGFyc2VNYXRyaXhSZXN1bHQgPSB7XG4gIGk6IEludDMyQXJyYXkgfCBVaW50MzJBcnJheSxcbiAgajogSW50MzJBcnJheSB8IFVpbnQzMkFycmF5LFxuICBkaXN0YW5jZTogRmxvYXQzMkFycmF5LFxuICBpZHg/OiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIEtublJlc3VsdCA9IHtcbiAga25uRGlzdGFuY2VzOiBudW1iZXJbXVtdLFxuICBrbm5JbmRleGVzOiBudW1iZXJbXVtdXG59XG5leHBvcnQgY2xhc3MgU3BhcnNlTWF0cml4U2VydmljZSB7XG4gICAgcHJpdmF0ZSBfd29ya2VyQ291bnQ6IG51bWJlcjtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX3dvcmtlckNvdW50ID0gTWF0aC5tYXgobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgLSAyLCAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsY011bHRpQ29sdW1uKHZhbHVlczogQXJyYXk8YW55W10+LCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSxcbiAgICAgIHRocmVzaG9sZDogbnVtYmVyLCBvcHRzOiB7W186IHN0cmluZ106IGFueX1bXSA9IFt7fV0sIHdlaWdodHM6IG51bWJlcltdID0gWzFdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU5cbiAgICApIHtcbiAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgIGNvbnN0IG1pblRocmVzaG9sZCA9IHZhbHVlc1swXS5sZW5ndGggPiAyMF8wMDAgP1xuICAgICAgICBhd2FpdCB0aGlzLmdldE1pbmltYWxUaHJlc2hvbGQodmFsdWVzLCBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCkgOiAwO1xuICAgICAgaWYgKHRocmVzaG9sZCA8IG1pblRocmVzaG9sZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgdXNpbmcgdGhyZXNob2xkICR7bWluVGhyZXNob2xkfWApO1xuICAgICAgICB0aHJlc2hvbGQgPSBtaW5UaHJlc2hvbGQ7XG4gICAgICB9XG4gICAgICBvcHRzLmZvckVhY2goKF8sIGkpID0+IG9wdHNbaV1bJ3RocmVzaG9sZCddID0gdGhyZXNob2xkKTtcbiAgICAgIGNvbnN0IHByb21pc2VzID1cbiAgICAgICAgbmV3IEFycmF5PFByb21pc2U8U3BhcnNlTWF0cml4UmVzdWx0Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuXG4gICAgICBjb25zdCB3b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KVxuICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3NwYXJzZS1tYXRyaXgtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgIHByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgIGlmIChlbmRJZHggPD0gc3RhcnRJZHgpXG4gICAgICAgICAgICByZXNvbHZlV29ya2VyKHtpOiBuZXcgSW50MzJBcnJheSgwKSwgajogbmV3IEludDMyQXJyYXkoMCksIGRpc3RhbmNlOiBuZXcgRmxvYXQzMkFycmF5KDApLCBpZHh9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgdGhyZXNob2xkLCBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgaSwgaiwgZGlzdGFuY2V9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7aSwgaiwgZGlzdGFuY2UsIGlkeH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgY29uc3QgZnVsbFNpemUgPSByZXN1bHRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbC5pLmxlbmd0aCwgMCk7XG4gICAgICBjb25zdCBpID0gbmV3IEludDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgY29uc3QgaiA9IG5ldyBJbnQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIC8vIHNldHRpbmcgdGhlIHJlc3VsdHNcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaS5zZXQocmVzLmksIG9mZnNldCk7XG4gICAgICAgIGouc2V0KHJlcy5qLCBvZmZzZXQpO1xuICAgICAgICBkaXN0YW5jZS5zZXQocmVzLmRpc3RhbmNlLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gcmVzLmkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtpLCBqLCBkaXN0YW5jZX07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGM8VD4odmFsdWVzOiBBcnJheTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIHRocmVzaG9sZDogbnVtYmVyLCBvcHRzOiB7W186IHN0cmluZ106IGFueX0gPSB7fSkge1xuICAgICAgLy9zaXplIG9mIGZ1bGwgbWF0cml4XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxjTXVsdGlDb2x1bW4oW3ZhbHVlc10sIFtmbk5hbWVdLCB0aHJlc2hvbGQsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S05OKFxuICAgICAgdmFsdWVzOiBBcnJheTxhbnk+LCBmbk5hbWU6IEtub3duTWV0cmljcywgbk5laWdoYm91cnM6IG51bWJlciA9IDE1LCBvcHRzOiB7W186IHN0cmluZ106IGFueX0gPSB7fVxuICAgICkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubXVsdGlDb2x1bW5LTk4oW3ZhbHVlc10sIFtmbk5hbWVdLCBuTmVpZ2hib3VycywgW29wdHNdLCBbMV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRUaHJlc2hvbGRLTk4oXG4gICAgICB2YWx1ZXM6IEFycmF5PGFueT4sIGZuTmFtZTogS25vd25NZXRyaWNzLCB0aHJlc2hvbGQ6IG51bWJlciA9IDAuOCwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge31cbiAgICApIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm11bHRpQ29sdW1uVGhyZXNob2xkS25uKFt2YWx1ZXNdLCBbZm5OYW1lXSwgdGhyZXNob2xkLCBbb3B0c10sIFsxXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG11bHRpQ29sdW1uVGhyZXNob2xkS25uKHZhbHVlczogQXJyYXk8QXJyYXk8YW55Pj4sIGZuTmFtZXM6IEtub3duTWV0cmljc1tdLCB0aHJlc2hvbGQ6IG51bWJlciA9IDAuOCxcbiAgICAgIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdLCB3ZWlnaHRzOiBudW1iZXJbXSxcbiAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kID0gRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOXG4gICAgKSB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCAhPT0gZm5OYW1lcy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gb3B0cy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzLCBkaXN0YW5jZSBmdW5jdGlvbnMsIG9wdGlvbnMgYW5kIHdlaWdodHMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICBpZiAodmFsdWVzLnNvbWUoKHYpID0+IHYubGVuZ3RoICE9PSB2YWx1ZXNbMF0ubGVuZ3RoKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGwgdmFsdWVzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHByb21pc2VzID1cbiAgICAgICAgbmV3IEFycmF5PFByb21pc2U8S25uUmVzdWx0Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgY29uc3Qgd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudClcbiAgICAgICAgLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9rbm4tdGhyZXNob2xkLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzOiBuZXcgQXJyYXkoMCksIGtubkluZGV4ZXM6IG5ldyBBcnJheSgwKX0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBmbk5hbWVzLCBvcHRzLCB0aHJlc2hvbGQsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICBjb25zdCBrbm5TaXplcyA9IG5ldyBJbnQzMkFycmF5KHZhbHVlc1swXS5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSlcbiAgICAgICAgICBrbm5TaXplc1tpXSArPSByZXMua25uSW5kZXhlc1tpXT8ubGVuZ3RoID8/IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBrbm5SZXM6IEtublJlc3VsdCA9IHtcbiAgICAgICAga25uRGlzdGFuY2VzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IG5ldyBBcnJheTxudW1iZXI+KGtublNpemVzW2ldKSksXG4gICAgICAgIGtubkluZGV4ZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4gbmV3IEFycmF5PG51bWJlcj4oa25uU2l6ZXNbaV0pKX07XG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMua25uRGlzdGFuY2VzW2ldPy5sZW5ndGggPz8gMDsgKytqKSB7XG4gICAgICAgICAgICBrbm5SZXMua25uRGlzdGFuY2VzW2ldW2tublNpemVzW2ldIC0gMV0gPSByZXMua25uRGlzdGFuY2VzW2ldW2pdO1xuICAgICAgICAgICAga25uUmVzLmtubkluZGV4ZXNbaV1ba25uU2l6ZXNbaV0gLSAxXSA9IHJlcy5rbm5JbmRleGVzW2ldW2pdO1xuICAgICAgICAgICAga25uU2l6ZXNbaV0gLT0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBrbm5SZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG11bHRpQ29sdW1uS05OKHZhbHVlczogQXJyYXk8QXJyYXk8YW55Pj4sIGZuTmFtZXM6IEtub3duTWV0cmljc1tdLCBuTmVpZ2hib3VyczogbnVtYmVyID0gMTUsXG4gICAgICBvcHRzOiB7W186IHN0cmluZ106IGFueX1bXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTlxuICAgICkge1xuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT09IGZuTmFtZXMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IG9wdHMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IHdlaWdodHMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlcywgZGlzdGFuY2UgZnVuY3Rpb25zLCBvcHRpb25zIGFuZCB3ZWlnaHRzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgaWYgKHZhbHVlcy5zb21lKCh2KSA9PiB2Lmxlbmd0aCAhPT0gdmFsdWVzWzBdLmxlbmd0aCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsIHZhbHVlcyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9XG4gICAgICAgIG5ldyBBcnJheTxQcm9taXNlPEtublJlc3VsdD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgIC5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4va25uLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzOiBuZXcgQXJyYXkoMCksIGtubkluZGV4ZXM6IG5ldyBBcnJheSgwKX0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBmbk5hbWVzLCBvcHRzLCBuTmVpZ2hib3Vycywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGtubkRpc3RhbmNlcywga25uSW5kZXhlc319KTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHtrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIGNvbnN0IGtublJlczogS25uUmVzdWx0ID0ge1xuICAgICAgICBrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXk8bnVtYmVyPihuTmVpZ2hib3VycykuZmlsbCg5OTk5OSkpLFxuICAgICAgICBrbm5JbmRleGVzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEFycmF5PG51bWJlcj4obk5laWdoYm91cnMpLmZpbGwoLTEpKX07XG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMua25uRGlzdGFuY2VzW2ldPy5sZW5ndGggPz8gMDsgKytqKVxuICAgICAgICAgICAgaW5zZXJ0U21hbGxlcihrbm5SZXMua25uRGlzdGFuY2VzW2ldLCBrbm5SZXMua25uSW5kZXhlc1tpXSwgcmVzLmtubkRpc3RhbmNlc1tpXVtqXSwgcmVzLmtubkluZGV4ZXNbaV1bal0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ga25uUmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTYW1wbGVEaXN0YW5jZXModmFsdWVzOiBBcnJheTxhbnlbXT4sXG4gICAgICBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTik6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgICBjb25zdCB0aHJlc2hvbGRXb3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KS5maWxsKG51bGwpXG4gICAgICAgIC5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3NwYXJzZS1tYXRyaXgtdGhyZXNob2xkLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCBtYXhTYW1wbGVTaXplID0gMV8wMDBfMDAwO1xuICAgICAgICBjb25zdCBzYW1wbGVTaXNlID0gTWF0aC5tYXgoTWF0aC5taW4obWF0U2l6ZSAvIDEwMDAsIG1heFNhbXBsZVNpemUpLCBNYXRoLm1pbihtYXRTaXplLCBtYXhTYW1wbGVTaXplKSk7XG4gICAgICAgIGNvbnN0IHRlc3RTZXRTaXplUGVyV29ya2VyID0gTWF0aC5mbG9vcihzYW1wbGVTaXNlIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCB0UHJvbWlzZXMgPSBuZXcgQXJyYXk8UHJvbWlzZTx7ZGlzdGFuY2U6IEZsb2F0MzJBcnJheX0+Pih0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgdFByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBzYW1wbGVMZW5ndGg6IHRlc3RTZXRTaXplUGVyV29ya2VyLFxuICAgICAgICAgICAgICBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGRpc3RhbmNlfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgdGhyZXNob2xkV29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJlamVjdFdvcmtlcihlcnJvcik7IGVsc2VcbiAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHtkaXN0YW5jZX0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0UHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBmdWxsU2l6ZSA9IHJlc3VsdHMucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLmRpc3RhbmNlLmxlbmd0aCwgMCk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgZGlzdGFuY2Uuc2V0KHJlcy5kaXN0YW5jZSwgb2Zmc2V0KTtcbiAgICAgICAgICBvZmZzZXQgKz0gcmVzLmRpc3RhbmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBkaXN0YW5jZS5zb3J0KCk7XG5cbiAgICAgICAgcmV0dXJuIGRpc3RhbmNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJlc2hvbGRXb3JrZXJzPy5mb3JFYWNoKCh3KSA9PiB3Py50ZXJtaW5hdGUoKSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KDEpLmZpbGwoMC41KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldE1pbmltYWxUaHJlc2hvbGQodmFsdWVzOiBBcnJheTxhbnlbXT4sXG4gICAgICBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTikge1xuICAgICAgLy9XZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWluaW1hbCB0aHJlc2hvbGQgZmlyc3QsXG4gICAgICAvL2luIG9yZGVyIHRvIGdldCBtYXRyaXggc3VjaCB0aGF0IGl0IGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplIG9mIDFHQlxuICAgICAgLy93ZSBoYXZlIDMgcmV0dXJuIGFycmF5cywgZWFjaCA0IGJpdGVzIHBlciBlbGVtZW50LCBzbyBpZiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRyaXggaXMgMUdCLFxuICAgICAgY29uc3QgbWF4U3BhcnNlTWF0cml4U2l6ZSA9IDcwXzAwMF8wMDA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGF3YWl0IHRoaXMuZ2V0U2FtcGxlRGlzdGFuY2VzKHZhbHVlcywgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgICBjb25zdCBmcmFjdGlvbkluZGV4ID0gTWF0aC5mbG9vcihtYXhTcGFyc2VNYXRyaXhTaXplIC8gbWF0U2l6ZSAqIGRpc3RhbmNlLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDEgLSBkaXN0YW5jZVtmcmFjdGlvbkluZGV4XTtcbiAgICAgICAgLy8gdGhyZXNob2xkID0gTWF0aC5tYXgodGhyZXNob2xkLCAwLjMpO1xuICAgICAgICByZXR1cm4gdGhyZXNob2xkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICByZXR1cm4gMC41O1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2FsY1N5bmM8VD4oXG4gICAgICB2YWx1ZXM6IEFycmF5PFQ+IHwgQXJyYXlMaWtlPFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcywgZGlzdGFuY2VGbjogRnVuY3Rpb24sIHRocmVzaG9sZDogbnVtYmVyXG4gICAgKSB7XG4gICAgICBjb25zdCBpOiBudW1iZXJbXSA9IFtdO1xuICAgICAgY29uc3QgajogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGxldCBjbnQgPSAwO1xuICAgICAgbGV0IG1pID0gMDtcbiAgICAgIGxldCBtaiA9IDA7XG4gICAgICBjb25zdCBmdWxsU2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIHdoaWxlIChjbnQgPCBmdWxsU2l6ZSkge1xuICAgICAgICAvL2NvbnN0IHZhbHVlID0gc2VxMUxpc3RbbWldICYmIHNlcTFMaXN0W21qXSA/IGhhbW1pbmcoc2VxMUxpc3RbbWldLCBzZXExTGlzdFttal0pIDogMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAhaXNOaWwodmFsdWVzW21pXSkgJiYgIWlzTmlsKHZhbHVlc1ttal0pID9cbiAgICAgICAgICBkaXN0YW5jZUZuKHZhbHVlc1ttaV0sIHZhbHVlc1ttal0pIDogMTtcbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IDEgLSB2YWx1ZTtcbiAgICAgICAgaWYgKHNpbWlsYXJpdHkgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgaS5wdXNoKG1pKTtcbiAgICAgICAgICBqLnB1c2gobWopO1xuICAgICAgICAgIGRpc3RhbmNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjbnQrKztcbiAgICAgICAgbWorKztcbiAgICAgICAgaWYgKG1qID09PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgbWkrKztcbiAgICAgICAgICBtaiA9IG1pICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpQXJyYXkgPSBuZXcgSW50MzJBcnJheShpKTtcbiAgICAgIGNvbnN0IGpBcnJheSA9IG5ldyBJbnQzMkFycmF5KGopO1xuICAgICAgY29uc3QgZGlzdGFuY2VBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZGlzdGFuY2VzKTtcblxuICAgICAgcmV0dXJuIHtpOiBpQXJyYXksIGo6IGpBcnJheSwgZGlzdGFuY2U6IGRpc3RhbmNlQXJyYXl9O1xuICAgIH1cbn1cbiJdfQ==","export var DistanceAggregationMethods;\n(function (DistanceAggregationMethods) {\n DistanceAggregationMethods[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n DistanceAggregationMethods[\"MANHATTAN\"] = \"MANHATTAN\";\n})(DistanceAggregationMethods || (DistanceAggregationMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSwwQkFHVDtBQUhILFdBQVksMEJBQTBCO0lBQ2xDLHFEQUF1QixDQUFBO0lBQ3ZCLHFEQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIUywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR25DO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIHtcbiAgICBFVUNMSURFQU4gPSAnRVVDTElERUFOJyxcbiAgICBNQU5IQVRUQU4gPSAnTUFOSEFUVEFOJyxcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IGtleW9mIHR5cGVvZiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbiJdfQ=="],"names":["SparseMatrixService","constructor","this","_workerCount","Math","max","navigator","hardwareConcurrency","calcMultiColumn","values","fnNames","threshold","opts","weights","aggregationMethod","EUCLIDEAN","matSize","length","chunkSize","floor","minThreshold","getMinimalThreshold","console","log","forEach","_","i","promises","Array","workers","fill","map","Worker","URL","idx","Promise","resolveWorker","rejectWorker","startIdx","endIdx","Int32Array","j","distance","Float32Array","postMessage","onmessage","data","error","terminate","results","all","fullSize","reduce","acc","val","offset","res","set","calc","fnName","getKNN","nNeighbours","multiColumnKNN","getThresholdKNN","multiColumnThresholdKnn","Error","some","v","knnDistances","knnIndexes","knnSizes","knnRes","getSampleDistances","thresholdWorkers","maxSampleSize","sampleSise","min","testSetSizePerWorker","tPromises","sampleLength","sort","e","w","calcSync","distanceFn","distances","cnt","mi","mj","value","push","DistanceAggregationMethods"],"sourceRoot":""}
package/dist/738.js ADDED
@@ -0,0 +1,3 @@
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,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=0,A=null,S=null;function E(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}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){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(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,g||(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},m={[i.Wn.CommonItems]:o.Hr},g={[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]:m[i.Wn.CommonItems]}},y=Object.keys(g).reduce(((e,n)=>{for(const t of Object.keys(g[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=g;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(g[e])}static get availableMeasures(){return Object.keys(g)}}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,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 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 m=H(K(p,"l1")),g=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(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=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),m=j(F(h,d),p);return F(Y(m,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: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],x=a[y],A=me(b,x);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=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=me(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=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 me(e,n){let t=0;for(let r=0;r<e.length;r++)t+=Math.pow(e[r]-n[r],2);return t}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);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(!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] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\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] = gapOpenPenalty + 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) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0) {\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(maxLength);\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/60),[Pe.SOKAL]:e=>Math.ceil(e/60),[Pe.COSINE]:e=>Math.ceil(e/60),[Pe.ASYMMETRIC]:e=>Math.ceil(e/60),[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="",m=0,g="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]]);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===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),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=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),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 ${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,g.length).set(g),O+=g.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],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 Ee();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 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: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,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 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,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;g=()=>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;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=$e(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}=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(g=$e(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 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}),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=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"}}),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 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,m=function*(){const h=Math.ceil(e.length/100),d=Math.ceil(Math.sqrt(h)),p=10*d,m=yield Ee();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"}}),D=m.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=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 T=new Int32Array(t*l).map((()=>Math.floor((2*Math.random()-1)*g)));new Int32Array(t*l).set(T);const B=m.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 _=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=_.getMappedRange();new Float32Array(G,0,2).set([0,a]),new Uint32Array(G,8,y).set(L),_.unmap();const $=m.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=m.createBuffer({label:"result buffer",size:B.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let e=0;e<c;e++){m.queue.writeBuffer(_,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(B,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(),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]/g;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(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 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(),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 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 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}=je(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 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 ge.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(g[e])}static get availableMethods(){return Object.keys(en)}static get availableMetrics(){let e=[];return Object.values(g).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(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)}}]);
3
+ //# sourceMappingURL=738.js.map