@datagrok/bio 2.11.41 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +1 -1
  3. package/detectors.js +11 -11
  4. package/dist/36.js +1 -1
  5. package/dist/36.js.map +1 -1
  6. package/dist/413.js +1 -1
  7. package/dist/413.js.map +1 -1
  8. package/dist/590.js +1 -1
  9. package/dist/590.js.map +1 -1
  10. package/dist/709.js +1 -1
  11. package/dist/709.js.map +1 -1
  12. package/dist/895.js +1 -1
  13. package/dist/895.js.map +1 -1
  14. package/dist/package-test.js +2 -2
  15. package/dist/package-test.js.map +1 -1
  16. package/dist/package.js +2 -2
  17. package/dist/package.js.map +1 -1
  18. package/package.json +10 -10
  19. package/src/analysis/sequence-activity-cliffs.ts +9 -9
  20. package/src/analysis/sequence-diversity-viewer.ts +3 -3
  21. package/src/analysis/sequence-search-base-viewer.ts +2 -2
  22. package/src/analysis/sequence-similarity-viewer.ts +10 -10
  23. package/src/analysis/sequence-space.ts +26 -23
  24. package/src/calculations/monomerLevelMols.ts +13 -11
  25. package/src/const.ts +5 -0
  26. package/src/package.ts +8 -8
  27. package/src/tests/WebLogo-layout-tests.ts +5 -2
  28. package/src/tests/WebLogo-positions-test.ts +20 -16
  29. package/src/tests/bio-tests.ts +19 -7
  30. package/src/tests/converters-test.ts +4 -4
  31. package/src/tests/detectors-benchmark-tests.ts +5 -5
  32. package/src/tests/detectors-tests.ts +13 -13
  33. package/src/tests/fasta-export-tests.ts +10 -4
  34. package/src/tests/mm-distance-tests.ts +10 -10
  35. package/src/tests/msa-tests.ts +8 -15
  36. package/src/tests/renderers-monomer-placer.ts +3 -3
  37. package/src/tests/renderers-test.ts +6 -8
  38. package/src/tests/splitters-test.ts +14 -13
  39. package/src/tests/to-atomic-level-tests.ts +2 -2
  40. package/src/tests/units-handler-get-region.ts +4 -4
  41. package/src/tests/units-handler-splitted-tests.ts +19 -17
  42. package/src/tests/units-handler-tests.ts +32 -32
  43. package/src/utils/cell-renderer.ts +40 -34
  44. package/src/utils/check-input-column.ts +5 -5
  45. package/src/utils/context-menu.ts +9 -6
  46. package/src/utils/convert.ts +9 -9
  47. package/src/utils/get-region-func-editor.ts +11 -11
  48. package/src/utils/get-region.ts +10 -12
  49. package/src/utils/macromolecule-column-widget.ts +9 -5
  50. package/src/utils/monomer-lib/library-file-manager/event-manager.ts +1 -1
  51. package/src/utils/multiple-sequence-alignment-ui.ts +6 -6
  52. package/src/utils/pepsea.ts +1 -0
  53. package/src/utils/poly-tool/transformation.ts +3 -3
  54. package/src/utils/save-as-fasta.ts +14 -15
  55. package/src/utils/sequence-to-mol.ts +4 -4
  56. package/src/viewers/web-logo-viewer.ts +95 -110
  57. package/src/widgets/bio-substructure-filter.ts +3 -3
  58. package/src/widgets/composition-analysis-widget.ts +26 -19
package/dist/709.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"709.js","mappings":"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","sources":["webpack://bio/webpack/runtime/chunk loaded","webpack://bio/webpack/runtime/startup chunk dependencies","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/bio-layout.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/marcov-cluster.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-worker.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/ensure chunk","webpack://bio/webpack/runtime/get javascript chunk filename","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/publicPath","webpack://bio/webpack/runtime/importScripts chunk loading","webpack://bio/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(590).then(next);\n};","export async function bioLayout(cluster, sparseObject, threshold) {\n const n = cluster.length;\n const is = [];\n const js = [];\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const a = cluster[i];\n const b = cluster[j];\n if (sparseObject[a]?.[b] >= threshold) {\n is.push(i);\n js.push(j);\n }\n }\n }\n return getLayoutEmbeddings(is, js, cluster);\n}\nfunction getLayoutEmbeddings(is, js, cluster) {\n const embedX = new Float32Array(cluster.length).fill(0).map(() => Math.random() * 10);\n const embedY = new Float32Array(cluster.length).fill(0).map(() => Math.random() * 10);\n const iterations = 100;\n const xVelocities = new Float32Array(cluster.length).fill(0);\n const yVelocities = new Float32Array(cluster.length).fill(0);\n for (let i = 0; i < iterations; i++) {\n const temperature = (1 - i / iterations);\n xVelocities.fill(0);\n yVelocities.fill(0);\n for (let idx = 0; idx < is.length; idx++) {\n const a = is[idx];\n const b = js[idx];\n const dx = embedX[a] - embedX[b];\n const dy = embedY[a] - embedY[b];\n // const distance = Math.sqrt(dx * dx + dy * dy);\n // const factor = (distance - 1) / distance;\n // const offsetX = dx * factor;\n // const offsetY = dy * factor;\n if (Math.abs(dx) >= 1) {\n xVelocities[a] -= temperature * dx;\n xVelocities[b] += temperature * dx;\n }\n if (Math.abs(dy) >= 1) {\n yVelocities[a] -= temperature * dy;\n yVelocities[b] += temperature * dy;\n }\n // embedY[a] += offsetY * temperature;\n // embedY[b] -= offsetY * temperature;\n }\n for (let idx = 0; idx < cluster.length; idx++) {\n const vecSize = Math.sqrt(xVelocities[idx] * xVelocities[idx] + yVelocities[idx] * yVelocities[idx]);\n if (vecSize > 0) {\n embedX[idx] += xVelocities[idx] / vecSize * temperature;\n embedY[idx] += yVelocities[idx] / vecSize * temperature;\n }\n }\n }\n // normalize\n let minX = embedX[0];\n let minY = embedY[0];\n let maxX = embedX[0];\n let maxY = embedY[0];\n for (let idx = 1; idx < cluster.length; idx++) {\n minX = Math.min(minX, embedX[idx]);\n minY = Math.min(minY, embedY[idx]);\n maxX = Math.max(maxX, embedX[idx]);\n maxY = Math.max(maxY, embedY[idx]);\n }\n let rangeX = maxX - minX;\n let rangeY = maxY - minY;\n if (rangeX === 0)\n rangeX = maxX;\n for (let idx = 0; idx < cluster.length; idx++)\n embedX[idx] = (embedX[idx] - minX) / rangeX / 2 + 0.5;\n if (rangeY === 0)\n rangeY = maxY;\n for (let idx = 0; idx < cluster.length; idx++)\n embedY[idx] = (embedY[idx] - minY) / rangeY / 2 + 0.5;\n return { embedX, embedY };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvLWxheW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJpby1sYXlvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQUMsT0FBaUIsRUFBRSxZQUFnQyxFQUFFLFNBQWlCO0lBQ3BHLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDekIsTUFBTSxFQUFFLEdBQWEsRUFBRSxDQUFDO0lBQ3hCLE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztJQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUU7Z0JBQ3JDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNaO1NBQ0Y7S0FDRjtJQUNELE9BQU8sbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxFQUFZLEVBQUUsRUFBWSxFQUFFLE9BQWlCO0lBQ3hFLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxD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LEdBQUcsSUFBSSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFeEQsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTcGFyc2VNYXRyaXhPYmplY3R9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmlvTGF5b3V0KGNsdXN0ZXI6IG51bWJlcltdLCBzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCwgdGhyZXNob2xkOiBudW1iZXIpIHtcbiAgY29uc3QgbiA9IGNsdXN0ZXIubGVuZ3RoO1xuICBjb25zdCBpczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QganM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbjsgaisrKSB7XG4gICAgICBjb25zdCBhID0gY2x1c3RlcltpXTtcbiAgICAgIGNvbnN0IGIgPSBjbHVzdGVyW2pdO1xuICAgICAgaWYgKHNwYXJzZU9iamVjdFthXT8uW2JdID49IHRocmVzaG9sZCkge1xuICAgICAgICBpcy5wdXNoKGkpO1xuICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZ2V0TGF5b3V0RW1iZWRkaW5ncyhpcywganMsIGNsdXN0ZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXlvdXRFbWJlZGRpbmdzKGlzOiBudW1iZXJbXSwganM6IG51bWJlcltdLCBjbHVzdGVyOiBudW1iZXJbXSkge1xuICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLnJhbmRvbSgpICogMTApO1xuICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLnJhbmRvbSgpICogMTApO1xuICBjb25zdCBpdGVyYXRpb25zID0gMTAwO1xuICBjb25zdCB4VmVsb2NpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCk7XG4gIGNvbnN0IHlWZWxvY2l0aWVzID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHtcbiAgICBjb25zdCB0ZW1wZXJhdHVyZSA9ICgxIC0gaSAvIGl0ZXJhdGlvbnMpO1xuICAgIHhWZWxvY2l0aWVzLmZpbGwoMCk7XG4gICAgeVZlbG9jaXRpZXMuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICBjb25zdCBhID0gaXNbaWR4XTtcbiAgICAgIGNvbnN0IGIgPSBqc1tpZHhdO1xuICAgICAgY29uc3QgZHggPSBlbWJlZFhbYV0gLSBlbWJlZFhbYl07XG4gICAgICBjb25zdCBkeSA9IGVtYmVkWVthXSAtIGVtYmVkWVtiXTtcbiAgICAgIC8vICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgLy8gICBjb25zdCBmYWN0b3IgPSAoZGlzdGFuY2UgLSAxKSAvIGRpc3RhbmNlO1xuICAgICAgLy8gICBjb25zdCBvZmZzZXRYID0gZHggKiBmYWN0b3I7XG4gICAgICAvLyAgIGNvbnN0IG9mZnNldFkgPSBkeSAqIGZhY3RvcjtcbiAgICAgIGlmIChNYXRoLmFicyhkeCkgPj0gMSkge1xuICAgICAgICB4VmVsb2NpdGllc1thXSAtPSB0ZW1wZXJhdHVyZSAqIGR4O1xuICAgICAgICB4VmVsb2NpdGllc1tiXSArPSB0ZW1wZXJhdHVyZSAqIGR4O1xuICAgICAgfVxuICAgICAgaWYgKE1hdGguYWJzKGR5KSA+PSAxKSB7XG4gICAgICAgIHlWZWxvY2l0aWVzW2FdIC09IHRlbXBlcmF0dXJlICogZHk7XG4gICAgICAgIHlWZWxvY2l0aWVzW2JdICs9IHRlbXBlcmF0dXJlICogZHk7XG4gICAgICB9XG4gICAgLy8gICBlbWJlZFlbYV0gKz0gb2Zmc2V0WSAqIHRlbXBlcmF0dXJlO1xuICAgIC8vICAgZW1iZWRZW2JdIC09IG9mZnNldFkgKiB0ZW1wZXJhdHVyZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICBjb25zdCB2ZWNTaXplID0gTWF0aC5zcXJ0KHhWZWxvY2l0aWVzW2lkeF0gKiB4VmVsb2NpdGllc1tpZHhdICsgeVZlbG9jaXRpZXNbaWR4XSAqIHlWZWxvY2l0aWVzW2lkeF0pO1xuICAgICAgaWYgKHZlY1NpemUgPiAwKSB7XG4gICAgICAgIGVtYmVkWFtpZHhdICs9IHhWZWxvY2l0aWVzW2lkeF0gLyB2ZWNTaXplICogdGVtcGVyYXR1cmU7XG4gICAgICAgIGVtYmVkWVtpZHhdICs9IHlWZWxvY2l0aWVzW2lkeF0gLyB2ZWNTaXplICogdGVtcGVyYXR1cmU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm9ybWFsaXplXG4gIGxldCBtaW5YID0gZW1iZWRYWzBdO1xuICBsZXQgbWluWSA9IGVtYmVkWVswXTtcbiAgbGV0IG1heFggPSBlbWJlZFhbMF07XG4gIGxldCBtYXhZID0gZW1iZWRZWzBdO1xuICBmb3IgKGxldCBpZHggPSAxOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspIHtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgZW1iZWRYW2lkeF0pO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBlbWJlZFlbaWR4XSk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGVtYmVkWFtpZHhdKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgZW1iZWRZW2lkeF0pO1xuICB9XG4gIGxldCByYW5nZVggPSBtYXhYIC0gbWluWDtcbiAgbGV0IHJhbmdlWSA9IG1heFkgLSBtaW5ZO1xuICBpZiAocmFuZ2VYID09PSAwKVxuICAgIHJhbmdlWCA9IG1heFg7XG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKylcbiAgICBlbWJlZFhbaWR4XSA9IChlbWJlZFhbaWR4XSAtIG1pblgpIC8gcmFuZ2VYIC8gMiArIDAuNTtcbiAgaWYgKHJhbmdlWSA9PT0gMClcbiAgICByYW5nZVkgPSBtYXhZO1xuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspXG4gICAgZW1iZWRZW2lkeF0gPSAoZW1iZWRZW2lkeF0gLSBtaW5ZKSAvIHJhbmdlWSAvIDIgKyAwLjU7XG5cbiAgcmV0dXJuIHtlbWJlZFgsIGVtYmVkWX07XG59XG4iXX0=","import { bioLayout } from './bio-layout';\nexport const defaultMCLOptions = {\n expandFactor: 2,\n maxIterations: 5,\n inflateFactor: 2,\n multFactor: 1,\n};\nexport class MCLSparseReducer {\n _options;\n constructor(opts = {}) {\n this._options = { ...defaultMCLOptions, ...opts };\n }\n async transform(sparseMatrix, nRows) {\n // testWorkerMultiply();\n // return new Int32Array(nRows);\n let sparseObject = this.toObjectForm(sparseMatrix);\n if (this._options.maxIterations > 0) {\n this.addLoops(sparseObject, nRows);\n this.normalize(sparseObject);\n for (let i = 0; i < this._options.maxIterations; i++) {\n sparseObject = this.expand(sparseObject, nRows);\n this.inflate(sparseObject);\n this.normalize(sparseObject);\n }\n }\n const { clusters, is, js } = this.assignClusters(sparseObject, nRows);\n this.correctClusters(clusters);\n const embeddings = await this.layout(clusters, sparseObject, nRows);\n return { clusters, embedX: embeddings.embedX, embedY: embeddings.embedY, is, js };\n }\n correctClusters(clusters) {\n const clusterSizeMap = {};\n for (const cluster of clusters) {\n if (!clusterSizeMap[cluster])\n clusterSizeMap[cluster] = 0;\n clusterSizeMap[cluster]++;\n }\n const sortedIndexes = Object.keys(clusterSizeMap).map(Number).sort((a, b) => clusterSizeMap[a] - clusterSizeMap[b]);\n const clusterMap = {};\n sortedIndexes.forEach((clusterIdx, i) => clusterMap[clusterIdx] = i + 1);\n for (let i = 0; i < clusters.length; i++)\n clusters[i] = clusterMap[clusters[i]];\n // let curCluster = 1;\n // for (let i = 0; i < clusters.length; i++) {\n // if (!clusterMap[clusters[i]]) {\n // clusterMap[clusters[i]] = curCluster;\n // clusters[i] = curCluster;\n // curCluster++;\n // } else {\n // clusters[i] = clusterMap[clusters[i]];\n // }\n // }\n }\n async layout(clusters, sparseMatrix, nRows) {\n const embedX = new Float32Array(nRows).fill(0);\n const embedY = new Float32Array(nRows).fill(0);\n const clusterMap = {};\n clusters.forEach((cluster, i) => {\n if (!clusterMap[cluster])\n clusterMap[cluster] = [];\n clusterMap[cluster].push(i);\n });\n // const nClusters = Object.keys(clusterMap).length;\n // const perRow = Math.floor(Math.sqrt(nClusters));\n let clusterNum = 0;\n const sortedClusterNames = Object.keys(clusterMap);\n sortedClusterNames.sort((a, b) => clusterMap[b].length - clusterMap[a].length);\n let perRow = 6;\n let yOffset = 0;\n const layoutSize = 5;\n for (const clusterName of sortedClusterNames) {\n const cluster = clusterMap[clusterName];\n const embeddings = await bioLayout(cluster, sparseMatrix, 0.001);\n if (clusterNum === Math.ceil(perRow / 1.5)) {\n clusterNum = 0;\n yOffset += layoutSize / perRow;\n perRow = Math.ceil(perRow * 1.5);\n }\n const offsetX = ((clusterNum % perRow) * layoutSize / perRow) * 1.5;\n // const offsetY = Math.floor(clusterNum / perRow) * 2;\n for (let i = 0; i < embeddings.embedX.length; i++) {\n embedX[cluster[i]] = embeddings.embedX[i] * layoutSize / perRow + offsetX;\n embedY[cluster[i]] = embeddings.embedY[i] * layoutSize / perRow + yOffset;\n }\n clusterNum++;\n }\n return { embedX, embedY };\n }\n mergeClusters(clusters, i, j) {\n const iCluster = clusters[i];\n const jCluster = clusters[j];\n for (let k = 0; k < clusters.length; k++) {\n if (clusters[k] === jCluster)\n clusters[k] = iCluster;\n }\n }\n assignClusters(sparseMatrix, nRows) {\n let clusterNum = 0;\n const is = [];\n const js = [];\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = Math.pow(10, order);\n const clusters = new Array(nRows).fill(-1);\n for (const i of Object.keys(sparseMatrix)) {\n for (const j of Object.keys(sparseMatrix[i])) {\n if (Math.round(sparseMatrix[i][j] * minOrder) / minOrder > 0 &&\n sparseMatrix[i][j] !== Number(i) && Number(j) > Number(i)) {\n is.push(Number(i));\n js.push(Number(j));\n if (clusters[Number(i)] !== -1 && clusters[Number(j)] !== -1) {\n if (clusters[Number(i)] !== clusters[Number(j)])\n this.mergeClusters(clusters, Number(i), Number(j));\n }\n else if (clusters[Number(i)] !== -1) {\n clusters[Number(j)] = clusters[Number(i)];\n }\n else if (clusters[Number(j)] !== -1) {\n clusters[Number(i)] = clusters[Number(j)];\n }\n else {\n clusterNum++;\n clusters[Number(i)] = clusterNum;\n clusters[Number(j)] = clusterNum;\n }\n }\n }\n }\n for (let i = 0; i < clusters.length; i++) {\n if (clusters[i] === -1) {\n clusterNum++;\n clusters[i] = clusterNum;\n }\n }\n return { clusters, is, js };\n }\n toObjectForm(sparseMatrix) {\n const sparseObject = {};\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n if (!sparseObject[sparseMatrix.i[i]])\n sparseObject[sparseMatrix.i[i]] = {};\n sparseObject[sparseMatrix.i[i]][sparseMatrix.j[i]] = 1 - sparseMatrix.distance[i];\n if (!sparseObject[sparseMatrix.j[i]])\n sparseObject[sparseMatrix.j[i]] = {};\n sparseObject[sparseMatrix.j[i]][sparseMatrix.i[i]] = 1 - sparseMatrix.distance[i];\n }\n return sparseObject;\n }\n addLoops(sparseObject, nRows) {\n for (let i = 0; i < nRows; i++) {\n if (!sparseObject[i])\n sparseObject[i] = {};\n sparseObject[i][i] = this._options.multFactor;\n }\n }\n normalize(sparseObject) {\n for (const i of Object.keys(sparseObject)) {\n const row = sparseObject[i];\n let sum = 0;\n for (const j of Object.keys(row))\n sum += row[j];\n if (sum === 0)\n continue;\n for (const j of Object.keys(row))\n sparseObject[i][j] /= sum;\n }\n }\n expand(sparseObject, nRows) {\n const expandedObject = {};\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = Math.pow(10, order);\n for (let i = 0; i < nRows; i++) {\n if (!sparseObject[i])\n continue;\n // const row = sparseObject[i];\n expandedObject[i] = {};\n for (let j = i; j < nRows; j++) {\n if (!sparseObject[i]?.[j])\n continue;\n const val = this.getExpandValue(sparseObject, i, j); //pruning step\n if (Math.round(val * minOrder) / minOrder > 0) {\n expandedObject[i][j] = val;\n if (!expandedObject[j])\n expandedObject[j] = {};\n expandedObject[j][i] = val;\n }\n }\n }\n return expandedObject;\n }\n // private prune(row: SparseMatrixObject[number]) {\n // }\n inflate(sparseObject) {\n for (const i of Object.keys(sparseObject)) {\n const row = sparseObject[i];\n for (const j of Object.keys(row))\n sparseObject[i][j] = Math.pow(sparseObject[i][j], this._options.inflateFactor);\n }\n }\n getExpandValue(sparseObject, i, j) {\n let val = 0;\n const currentIndexes = Object.keys(sparseObject[i] ?? {});\n const otherIndexes = Object.keys(sparseObject[j] ?? {});\n for (const k of currentIndexes) {\n if (otherIndexes.includes(k))\n val += sparseObject[i][k] * sparseObject[j][k];\n }\n return val;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyY292LWNsdXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXJjb3YtY2x1c3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBR3ZDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFlO0lBQzNDLFlBQVksRUFBRSxDQUFDO0lBQ2YsYUFBYSxFQUFFLENBQUM7SUFDaEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUYsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixRQUFRLENBQWE7SUFFN0IsWUFBWSxPQUE0QixFQUFFO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBQyxHQUFHLGlCQUFpQixFQUFFLEdBQUcsSUFBSSxFQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBZ0MsRUFBRSxLQUFhO1FBQ3BFLHdCQUF3QjtRQUN4QixnQ0FBZ0M7UUFDaEMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEQsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsU0FBUyxD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Q0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFRLENBQUMsQ0FBQztTQUNoRTtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTcGFyc2VNYXRyaXhSZXN1bHR9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXNlcnZpY2UnO1xuaW1wb3J0IHtiaW9MYXlvdXR9IGZyb20gJy4vYmlvLWxheW91dCc7XG5pbXBvcnQge01DTE9wdGlvbnMsIFNwYXJzZU1hdHJpeE9iamVjdH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0TUNMT3B0aW9uczogTUNMT3B0aW9ucyA9IHtcbiAgZXhwYW5kRmFjdG9yOiAyLFxuICBtYXhJdGVyYXRpb25zOiA1LFxuICBpbmZsYXRlRmFjdG9yOiAyLFxuICBtdWx0RmFjdG9yOiAxLFxufTtcblxuZXhwb3J0IGNsYXNzIE1DTFNwYXJzZVJlZHVjZXIge1xuICBwcml2YXRlIF9vcHRpb25zOiBNQ0xPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IFBhcnRpYWw8TUNMT3B0aW9ucz4gPSB7fSkge1xuICAgIHRoaXMuX29wdGlvbnMgPSB7Li4uZGVmYXVsdE1DTE9wdGlvbnMsIC4uLm9wdHN9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybShzcGFyc2VNYXRyaXg6IFNwYXJzZU1hdHJpeFJlc3VsdCwgblJvd3M6IG51bWJlcikge1xuICAgIC8vIHRlc3RXb3JrZXJNdWx0aXBseSgpO1xuICAgIC8vIHJldHVybiBuZXcgSW50MzJBcnJheShuUm93cyk7XG4gICAgbGV0IHNwYXJzZU9iamVjdCA9IHRoaXMudG9PYmplY3RGb3JtKHNwYXJzZU1hdHJpeCk7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucyA+IDApIHtcbiAgICAgIHRoaXMuYWRkTG9vcHMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICB0aGlzLm5vcm1hbGl6ZShzcGFyc2VPYmplY3QpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICBzcGFyc2VPYmplY3QgPSB0aGlzLmV4cGFuZChzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgdGhpcy5pbmZsYXRlKHNwYXJzZU9iamVjdCk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplKHNwYXJzZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtjbHVzdGVycywgaXMsIGpzfSA9IHRoaXMuYXNzaWduQ2x1c3RlcnMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCB0aGlzLmxheW91dChjbHVzdGVycywgc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgcmV0dXJuIHtjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXMsIGpzfTtcbiAgfVxuXG4gIHByaXZhdGUgY29ycmVjdENsdXN0ZXJzKGNsdXN0ZXJzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGNsdXN0ZXJTaXplTWFwOiB7W186IG51bWJlcl06IG51bWJlcn0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgIGlmICghY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0pXG4gICAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdID0gMDtcbiAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKys7XG4gICAgfVxuICAgIGNvbnN0IHNvcnRlZEluZGV4ZXMgPSBPYmplY3Qua2V5cyhjbHVzdGVyU2l6ZU1hcCkubWFwKE51bWJlcikuc29ydCgoYSwgYikgPT4gY2x1c3RlclNpemVNYXBbYV0gLSBjbHVzdGVyU2l6ZU1hcFtiXSk7XG4gICAgY29uc3QgY2x1c3Rlck1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgc29ydGVkSW5kZXhlcy5mb3JFYWNoKChjbHVzdGVySWR4LCBpKSA9PiBjbHVzdGVyTWFwW2NsdXN0ZXJJZHhdID0gaSArIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspXG4gICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dO1xuICAgIC8vIGxldCBjdXJDbHVzdGVyID0gMTtcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dKSB7XG4gICAgLy8gICAgIGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dID0gY3VyQ2x1c3RlcjtcbiAgICAvLyAgICAgY2x1c3RlcnNbaV0gPSBjdXJDbHVzdGVyO1xuICAgIC8vICAgICBjdXJDbHVzdGVyKys7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbGF5b3V0KGNsdXN0ZXJzOiBudW1iZXJbXSwgc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXhPYmplY3QsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKS5maWxsKDApO1xuICAgIGNvbnN0IGVtYmVkWSA9IG5ldyBGbG9hdDMyQXJyYXkoblJvd3MpLmZpbGwoMCk7XG4gICAgY29uc3QgY2x1c3Rlck1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJbXX0gPSB7fTtcbiAgICBjbHVzdGVycy5mb3JFYWNoKChjbHVzdGVyLCBpKSA9PiB7XG4gICAgICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3Rlcl0pXG4gICAgICAgIGNsdXN0ZXJNYXBbY2x1c3Rlcl0gPSBbXTtcbiAgICAgIGNsdXN0ZXJNYXBbY2x1c3Rlcl0ucHVzaChpKTtcbiAgICB9KTtcbiAgICAvLyBjb25zdCBuQ2x1c3RlcnMgPSBPYmplY3Qua2V5cyhjbHVzdGVyTWFwKS5sZW5ndGg7XG4gICAgLy8gY29uc3QgcGVyUm93ID0gTWF0aC5mbG9vcihNYXRoLnNxcnQobkNsdXN0ZXJzKSk7XG4gICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgIGNvbnN0IHNvcnRlZENsdXN0ZXJOYW1lcyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJNYXApO1xuICAgIHNvcnRlZENsdXN0ZXJOYW1lcy5zb3J0KChhLCBiKSA9PiBjbHVzdGVyTWFwW2IgYXMgYW55XS5sZW5ndGggLSBjbHVzdGVyTWFwW2EgYXMgYW55XS5sZW5ndGgpO1xuICAgIGxldCBwZXJSb3cgPSA2O1xuXG4gICAgbGV0IHlPZmZzZXQgPSAwO1xuICAgIGNvbnN0IGxheW91dFNpemUgPSA1O1xuICAgIGZvciAoY29uc3QgY2x1c3Rlck5hbWUgb2Ygc29ydGVkQ2x1c3Rlck5hbWVzKSB7XG4gICAgICBjb25zdCBjbHVzdGVyID0gY2x1c3Rlck1hcFtjbHVzdGVyTmFtZSBhcyBhbnldITtcbiAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCBiaW9MYXlvdXQoY2x1c3Rlciwgc3BhcnNlTWF0cml4LCAwLjAwMSk7XG4gICAgICBpZiAoY2x1c3Rlck51bSA9PT0gTWF0aC5jZWlsKHBlclJvdyAvIDEuNSkpIHtcbiAgICAgICAgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIHlPZmZzZXQgKz0gbGF5b3V0U2l6ZSAvIHBlclJvdztcbiAgICAgICAgcGVyUm93ID0gTWF0aC5jZWlsKHBlclJvdyAqIDEuNSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvZmZzZXRYID0gKChjbHVzdGVyTnVtICUgcGVyUm93KSAqIGxheW91dFNpemUgLyBwZXJSb3cpICogMS41O1xuICAgICAgLy8gY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IoY2x1c3Rlck51bSAvIHBlclJvdykgKiAyO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVtYmVkZGluZ3MuZW1iZWRYLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVtYmVkWFtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRYW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIG9mZnNldFg7XG4gICAgICAgIGVtYmVkWVtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRZW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIHlPZmZzZXQ7XG4gICAgICB9XG4gICAgICBjbHVzdGVyTnVtKys7XG4gICAgfVxuICAgIHJldHVybiB7ZW1iZWRYLCBlbWJlZFl9O1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzOiBudW1iZXJbXSwgaTogbnVtYmVyLCBqOiBudW1iZXIpIHtcbiAgICBjb25zdCBpQ2x1c3RlciA9IGNsdXN0ZXJzW2ldO1xuICAgIGNvbnN0IGpDbHVzdGVyID0gY2x1c3RlcnNbal07XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjbHVzdGVycy5sZW5ndGg7IGsrKykge1xuICAgICAgaWYgKGNsdXN0ZXJzW2tdID09PSBqQ2x1c3RlcilcbiAgICAgICAgY2x1c3RlcnNba10gPSBpQ2x1c3RlcjtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFzc2lnbkNsdXN0ZXJzKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4T2JqZWN0LCBuUm93czogbnVtYmVyKSB7XG4gICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgIGNvbnN0IGlzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGpzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICBjb25zdCBtaW5PcmRlciA9IE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgY29uc3QgY2x1c3RlcnM6IG51bWJlcltdID0gbmV3IEFycmF5KG5Sb3dzKS5maWxsKC0xKTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlTWF0cml4KSkge1xuICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHNwYXJzZU1hdHJpeFtpIGFzIGFueV0pKSB7XG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHNwYXJzZU1hdHJpeFtpIGFzIGFueV1baiBhcyBhbnldICogbWluT3JkZXIpIC8gbWluT3JkZXIgPiAwICYmXG4gICAgICAgICAgc3BhcnNlTWF0cml4W2kgYXMgYW55XVtqIGFzIGFueV0gIT09IE51bWJlcihpKSAmJiBOdW1iZXIoaikgPiBOdW1iZXIoaSkpIHtcbiAgICAgICAgICBpcy5wdXNoKE51bWJlcihpKSk7XG4gICAgICAgICAganMucHVzaChOdW1iZXIoaikpO1xuICAgICAgICAgIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSAtMSAmJiBjbHVzdGVyc1tOdW1iZXIoaildICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IGNsdXN0ZXJzW051bWJlcihqKV0pXG4gICAgICAgICAgICAgIHRoaXMubWVyZ2VDbHVzdGVycyhjbHVzdGVycywgTnVtYmVyKGkpLCBOdW1iZXIoaikpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihqKV0gPSBjbHVzdGVyc1tOdW1iZXIoaSldO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2x1c3RlcnNbTnVtYmVyKGopXSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihpKV0gPSBjbHVzdGVyc1tOdW1iZXIoaildO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaSldID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihqKV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpPTA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICBjbHVzdGVyTnVtICsrO1xuICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7Y2x1c3RlcnMsIGlzLCBqc307XG4gIH1cblxuICBwdWJsaWMgdG9PYmplY3RGb3JtKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4UmVzdWx0KTogU3BhcnNlTWF0cml4T2JqZWN0IHtcbiAgICBjb25zdCBzcGFyc2VPYmplY3Q6IHtbXzogbnVtYmVyXToge1tfOiBudW1iZXJdOiBudW1iZXJ9fSA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXSlcbiAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXSA9IHt9O1xuICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXVtzcGFyc2VNYXRyaXgualtpXV0gPSAxIC0gc3BhcnNlTWF0cml4LmRpc3RhbmNlW2ldO1xuICAgICAgaWYgKCFzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dKVxuICAgICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dID0ge307XG4gICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dW3NwYXJzZU1hdHJpeC5pW2ldXSA9IDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV07XG4gICAgfVxuICAgIHJldHVybiBzcGFyc2VPYmplY3Q7XG4gIH1cblxuICBwcml2YXRlIGFkZExvb3BzKHNwYXJzZU9iamVjdDogU3BhcnNlTWF0cml4T2JqZWN0LCBuUm93czogbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKSB7XG4gICAgICBpZiAoIXNwYXJzZU9iamVjdFtpXSlcbiAgICAgICAgc3BhcnNlT2JqZWN0W2ldID0ge307XG4gICAgICBzcGFyc2VPYmplY3RbaV1baV0gPSB0aGlzLl9vcHRpb25zLm11bHRGYWN0b3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemUoc3BhcnNlT2JqZWN0OiBTcGFyc2VNYXRyaXhPYmplY3QpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2kgYXMgYW55XTtcbiAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgIHN1bSArPSByb3dbaiBhcyBhbnldO1xuICAgICAgaWYgKHN1bSA9PT0gMCkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgc3BhcnNlT2JqZWN0W2kgYXMgYW55XVtqIGFzIGFueV0gLz0gc3VtO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXhwYW5kKHNwYXJzZU9iamVjdDogU3BhcnNlTWF0cml4T2JqZWN0LCBuUm93czogbnVtYmVyKSB7XG4gICAgY29uc3QgZXhwYW5kZWRPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCA9IHt9O1xuICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICBjb25zdCBtaW5PcmRlciA9IE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKSB7XG4gICAgICBpZiAoIXNwYXJzZU9iamVjdFtpXSlcbiAgICAgICAgY29udGludWU7XG4gICAgICAvLyBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaV07XG4gICAgICBleHBhbmRlZE9iamVjdFtpXSA9IHt9O1xuICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBuUm93czsgaisrKSB7XG4gICAgICAgIGlmICghc3BhcnNlT2JqZWN0W2ldPy5bal0pXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0RXhwYW5kVmFsdWUoc3BhcnNlT2JqZWN0LCBpLCBqKTsgLy9wcnVuaW5nIHN0ZXBcbiAgICAgICAgaWYgKE1hdGgucm91bmQodmFsICogbWluT3JkZXIpIC8gbWluT3JkZXIgPiAwKSB7XG4gICAgICAgICAgZXhwYW5kZWRPYmplY3RbaV1bal0gPSB2YWw7XG4gICAgICAgICAgaWYgKCFleHBhbmRlZE9iamVjdFtqXSlcbiAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2pdID0ge307XG4gICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal1baV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cGFuZGVkT2JqZWN0O1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBwcnVuZShyb3c6IFNwYXJzZU1hdHJpeE9iamVjdFtudW1iZXJdKSB7XG5cbiAgLy8gfVxuXG4gIHByaXZhdGUgaW5mbGF0ZShzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCkge1xuICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3QpKSB7XG4gICAgICBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaSBhcyBhbnldO1xuICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgIHNwYXJzZU9iamVjdFtpIGFzIGFueV1baiBhcyBhbnldID0gTWF0aC5wb3coc3BhcnNlT2JqZWN0W2kgYXMgYW55XVtqIGFzIGFueV0sIHRoaXMuX29wdGlvbnMuaW5mbGF0ZUZhY3Rvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHBhbmRWYWx1ZShzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCwgaTogYW55LCBqOiBhbnkpIHtcbiAgICBsZXQgdmFsID0gMDtcbiAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdFtpXSA/PyB7fSk7XG4gICAgY29uc3Qgb3RoZXJJbmRleGVzID0gT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0W2pdID8/IHt9KTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgY3VycmVudEluZGV4ZXMpIHtcbiAgICAgIGlmIChvdGhlckluZGV4ZXMuaW5jbHVkZXMoaykpXG4gICAgICAgIHZhbCArPSBzcGFyc2VPYmplY3RbaV1bayBhcyBhbnldICogc3BhcnNlT2JqZWN0W2pdW2sgYXMgYW55XTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuXG4iXX0=","import { SparseMatrixService } from '../distance-matrix/sparse-matrix-service';\nimport { MCLSparseReducer } from './marcov-cluster';\nonmessage = async (event) => {\n const { data, threshold, weights, aggregationMethod, distanceFnArgs, distanceFns, maxIterations } = event.data;\n const sparse = await new SparseMatrixService()\n .calcMultiColumn(data, distanceFns, threshold / 100, distanceFnArgs, weights, aggregationMethod);\n const res = await new MCLSparseReducer({ maxIterations: maxIterations ?? 5 }).transform(sparse, data[0].length);\n postMessage({ res });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFHN0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFbEQsU0FBUyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtJQUMxQixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUMsR0FHaEIsS0FBSyxDQUFDLElBQUksQ0FBQztJQUMxRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksbUJBQW1CLEVBQUU7U0FDM0MsZUFBZSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxHQUFHLEdBQUcsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDbkcsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLGdCQUFnQixDQUFDLEVBQUMsYUFBYSxFQUFFLGFBQWEsSUFBSSxDQUFDLEVBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlHLFdBQVcsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTcGFyc2VNYXRyaXhTZXJ2aWNlfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvc3BhcnNlLW1hdHJpeC1zZXJ2aWNlJztcbmltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZH0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3R5cGVzJztcbmltcG9ydCB7S25vd25NZXRyaWNzfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7TUNMU3BhcnNlUmVkdWNlcn0gZnJvbSAnLi9tYXJjb3YtY2x1c3Rlcic7XG5cbm9ubWVzc2FnZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICBjb25zdCB7ZGF0YSwgdGhyZXNob2xkLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCwgZGlzdGFuY2VGbkFyZ3MsIGRpc3RhbmNlRm5zLCBtYXhJdGVyYXRpb25zfTpcbiAgIHtkYXRhOiBhbnlbXVtdLCB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsXG4gICAgZGlzdGFuY2VGbnM6IEtub3duTWV0cmljc1tdLCBkaXN0YW5jZUZuQXJnczogYW55W10sIG1heEl0ZXJhdGlvbnM6IG51bWJlcn0gPSBldmVudC5kYXRhO1xuICBjb25zdCBzcGFyc2UgPSBhd2FpdCBuZXcgU3BhcnNlTWF0cml4U2VydmljZSgpXG4gICAgLmNhbGNNdWx0aUNvbHVtbihkYXRhLCBkaXN0YW5jZUZucywgdGhyZXNob2xkIC8gMTAwLCBkaXN0YW5jZUZuQXJncywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpO1xuICBjb25zdCByZXMgPSBhd2FpdCBuZXcgTUNMU3BhcnNlUmVkdWNlcih7bWF4SXRlcmF0aW9uczogbWF4SXRlcmF0aW9ucyA/PyA1fSkudHJhbnNmb3JtKHNwYXJzZSwgZGF0YVswXS5sZW5ndGgpO1xuICBwb3N0TWVzc2FnZSh7cmVzfSk7XG59O1xuIl19","import { DistanceAggregationMethods } from './types';\nexport const isNil = (x) => x === null || x === undefined;\nexport function insertSmaller(distancesAr, indexes, num, index) {\n if (num > distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num < v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function insertLarger(distancesAr, indexes, num, index) {\n if (num < distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num > v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function getAggregationFunction(aggregationMethod, weights) {\n switch (aggregationMethod) {\n case DistanceAggregationMethods.MANHATTAN:\n return (vs) => vs.reduce((acc, val, idx) => acc + val * weights[idx], 0);\n default:\n return (vs) => {\n // euclidean\n const sum = vs.reduce((acc, val, idx) => acc + (val * weights[idx]) ** 2, 0);\n return Math.sqrt(sum);\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFO1FBQ3pCLEtBQUssMEJBQTBCLENBQUMsU0FBUztZQUN2QyxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JGO1lBQ0UsT0FBTyxDQUFDLEVBQVksRUFBRSxFQUFFO2dCQUN0QixZQUFZO2dCQUNaLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztLQUNMO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeDogYW55KSA9PiB4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFNtYWxsZXIoZGlzdGFuY2VzQXI6IG51bWJlcltdLCBpbmRleGVzOiBudW1iZXJbXSwgbnVtOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgaWYgKG51bSA+IGRpc3RhbmNlc0FyW2Rpc3RhbmNlc0FyLmxlbmd0aC0xXSlcbiAgICByZXR1cm47XG5cbiAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXN0YW5jZXNBci5maW5kSW5kZXgoKHYpID0+IG51bSA8IHYpO1xuICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICBpbmRleGVzLnBvcCgpO1xuICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGFyZ2VyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oXG4gIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzOiBudW1iZXJbXVxuKTogKHZhbHVlczogbnVtYmVyW10pID0+IG51bWJlciB7XG4gIHN3aXRjaCAoYWdncmVnYXRpb25NZXRob2QpIHtcbiAgICBjYXNlIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTjpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArIHZhbCAqIHdlaWdodHNbaWR4XSwgMCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICBjb25zdCBzdW0gPSB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArICh2YWwgKiB3ZWlnaHRzW2lkeF0pICoqIDIsIDApO1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHN1bSk7XG4gICAgICB9O1xuICB9XG59XG4iXX0=","// 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\t// no module.id needed\n\t\t// no module.loaded needed\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// 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// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [590], () => (__webpack_require__(2357)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// 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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\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__.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) 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\t709: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkbio\"] = self[\"webpackChunkbio\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","async","bioLayout","cluster","sparseObject","threshold","n","length","is","js","i","j","a","b","push","embedX","Float32Array","fill","map","Math","random","embedY","xVelocities","yVelocities","temperature","idx","dx","dy","abs","vecSize","sqrt","minX","minY","maxX","maxY","min","max","rangeX","rangeY","getLayoutEmbeddings","defaultMCLOptions","expandFactor","maxIterations","inflateFactor","multFactor","MCLSparseReducer","_options","constructor","opts","this","sparseMatrix","nRows","toObjectForm","addLoops","normalize","expand","inflate","clusters","assignClusters","correctClusters","embeddings","layout","clusterSizeMap","sortedIndexes","Object","keys","Number","sort","clusterMap","forEach","clusterIdx","clusterNum","sortedClusterNames","perRow","yOffset","clusterName","ceil","offsetX","mergeClusters","iCluster","jCluster","k","order","floor","log10","minOrder","pow","Array","round","distance","row","sum","expandedObject","val","getExpandValue","currentIndexes","otherIndexes","includes","onmessage","event","data","weights","aggregationMethod","distanceFnArgs","distanceFns","sparse","calcMultiColumn","res","transform","postMessage","isNil","x","insertSmaller","distancesAr","indexes","num","index","newPosition","findIndex","v","pop","splice","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","__webpack_exports__","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","every","key","r","d","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","call","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","Error","replace","p","self","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","then"],"sourceRoot":""}
1
+ {"version":3,"file":"709.js","mappings":"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","sources":["webpack://bio/webpack/runtime/chunk loaded","webpack://bio/webpack/runtime/startup chunk dependencies","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/bio-layout.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/marcov-cluster.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-worker.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/ensure chunk","webpack://bio/webpack/runtime/get javascript chunk filename","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/publicPath","webpack://bio/webpack/runtime/importScripts chunk loading","webpack://bio/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(590).then(next);\n};","export async function bioLayout(cluster, sparseObject, threshold) {\n const n = cluster.length;\n const is = [];\n const js = [];\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const a = cluster[i];\n const b = cluster[j];\n if (sparseObject[a]?.[b] >= threshold) {\n is.push(i);\n js.push(j);\n }\n }\n }\n return getLayoutEmbeddings(is, js, cluster);\n}\nfunction getLayoutEmbeddings(is, js, cluster) {\n const embedX = new Float32Array(cluster.length).fill(0).map(() => Math.random() * 10);\n const embedY = new Float32Array(cluster.length).fill(0).map(() => Math.random() * 10);\n const iterations = 100;\n const xVelocities = new Float32Array(cluster.length).fill(0);\n const yVelocities = new Float32Array(cluster.length).fill(0);\n for (let i = 0; i < iterations; i++) {\n const temperature = (1 - i / iterations);\n xVelocities.fill(0);\n yVelocities.fill(0);\n for (let idx = 0; idx < is.length; idx++) {\n const a = is[idx];\n const b = js[idx];\n const dx = embedX[a] - embedX[b];\n const dy = embedY[a] - embedY[b];\n // const distance = Math.sqrt(dx * dx + dy * dy);\n // const factor = (distance - 1) / distance;\n // const offsetX = dx * factor;\n // const offsetY = dy * factor;\n if (Math.abs(dx) >= 1) {\n xVelocities[a] -= temperature * dx;\n xVelocities[b] += temperature * dx;\n }\n if (Math.abs(dy) >= 1) {\n yVelocities[a] -= temperature * dy;\n yVelocities[b] += temperature * dy;\n }\n // embedY[a] += offsetY * temperature;\n // embedY[b] -= offsetY * temperature;\n }\n for (let idx = 0; idx < cluster.length; idx++) {\n const vecSize = Math.sqrt(xVelocities[idx] * xVelocities[idx] + yVelocities[idx] * yVelocities[idx]);\n if (vecSize > 0) {\n embedX[idx] += xVelocities[idx] / vecSize * temperature;\n embedY[idx] += yVelocities[idx] / vecSize * temperature;\n }\n }\n }\n // normalize\n let minX = embedX[0];\n let minY = embedY[0];\n let maxX = embedX[0];\n let maxY = embedY[0];\n for (let idx = 1; idx < cluster.length; idx++) {\n minX = Math.min(minX, embedX[idx]);\n minY = Math.min(minY, embedY[idx]);\n maxX = Math.max(maxX, embedX[idx]);\n maxY = Math.max(maxY, embedY[idx]);\n }\n let rangeX = maxX - minX;\n let rangeY = maxY - minY;\n if (rangeX === 0)\n rangeX = maxX;\n for (let idx = 0; idx < cluster.length; idx++)\n embedX[idx] = (embedX[idx] - minX) / rangeX / 2 + 0.5;\n if (rangeY === 0)\n rangeY = maxY;\n for (let idx = 0; idx < cluster.length; idx++)\n embedY[idx] = (embedY[idx] - minY) / rangeY / 2 + 0.5;\n return { embedX, embedY };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvLWxheW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJpby1sYXlvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQUMsT0FBaUIsRUFBRSxZQUFnQyxFQUFFLFNBQWlCO0lBQ3BHLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDekIsTUFBTSxFQUFFLEdBQWEsRUFBRSxDQUFDO0lBQ3hCLE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztJQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUU7Z0JBQ3JDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNaO1NBQ0Y7S0FDRjtJQUNELE9BQU8sbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxFQUFZLEVBQUUsRUFBWSxFQUFFLE9BQWlCO0lBQ3hFLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxD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LEdBQUcsSUFBSSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFeEQsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTcGFyc2VNYXRyaXhPYmplY3R9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmlvTGF5b3V0KGNsdXN0ZXI6IG51bWJlcltdLCBzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCwgdGhyZXNob2xkOiBudW1iZXIpIHtcbiAgY29uc3QgbiA9IGNsdXN0ZXIubGVuZ3RoO1xuICBjb25zdCBpczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QganM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbjsgaisrKSB7XG4gICAgICBjb25zdCBhID0gY2x1c3RlcltpXTtcbiAgICAgIGNvbnN0IGIgPSBjbHVzdGVyW2pdO1xuICAgICAgaWYgKHNwYXJzZU9iamVjdFthXT8uW2JdID49IHRocmVzaG9sZCkge1xuICAgICAgICBpcy5wdXNoKGkpO1xuICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZ2V0TGF5b3V0RW1iZWRkaW5ncyhpcywganMsIGNsdXN0ZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXlvdXRFbWJlZGRpbmdzKGlzOiBudW1iZXJbXSwganM6IG51bWJlcltdLCBjbHVzdGVyOiBudW1iZXJbXSkge1xuICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLnJhbmRvbSgpICogMTApO1xuICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLnJhbmRvbSgpICogMTApO1xuICBjb25zdCBpdGVyYXRpb25zID0gMTAwO1xuICBjb25zdCB4VmVsb2NpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCk7XG4gIGNvbnN0IHlWZWxvY2l0aWVzID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHtcbiAgICBjb25zdCB0ZW1wZXJhdHVyZSA9ICgxIC0gaSAvIGl0ZXJhdGlvbnMpO1xuICAgIHhWZWxvY2l0aWVzLmZpbGwoMCk7XG4gICAgeVZlbG9jaXRpZXMuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICBjb25zdCBhID0gaXNbaWR4XTtcbiAgICAgIGNvbnN0IGIgPSBqc1tpZHhdO1xuICAgICAgY29uc3QgZHggPSBlbWJlZFhbYV0gLSBlbWJlZFhbYl07XG4gICAgICBjb25zdCBkeSA9IGVtYmVkWVthXSAtIGVtYmVkWVtiXTtcbiAgICAgIC8vICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgLy8gICBjb25zdCBmYWN0b3IgPSAoZGlzdGFuY2UgLSAxKSAvIGRpc3RhbmNlO1xuICAgICAgLy8gICBjb25zdCBvZmZzZXRYID0gZHggKiBmYWN0b3I7XG4gICAgICAvLyAgIGNvbnN0IG9mZnNldFkgPSBkeSAqIGZhY3RvcjtcbiAgICAgIGlmIChNYXRoLmFicyhkeCkgPj0gMSkge1xuICAgICAgICB4VmVsb2NpdGllc1thXSAtPSB0ZW1wZXJhdHVyZSAqIGR4O1xuICAgICAgICB4VmVsb2NpdGllc1tiXSArPSB0ZW1wZXJhdHVyZSAqIGR4O1xuICAgICAgfVxuICAgICAgaWYgKE1hdGguYWJzKGR5KSA+PSAxKSB7XG4gICAgICAgIHlWZWxvY2l0aWVzW2FdIC09IHRlbXBlcmF0dXJlICogZHk7XG4gICAgICAgIHlWZWxvY2l0aWVzW2JdICs9IHRlbXBlcmF0dXJlICogZHk7XG4gICAgICB9XG4gICAgLy8gICBlbWJlZFlbYV0gKz0gb2Zmc2V0WSAqIHRlbXBlcmF0dXJlO1xuICAgIC8vICAgZW1iZWRZW2JdIC09IG9mZnNldFkgKiB0ZW1wZXJhdHVyZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICBjb25zdCB2ZWNTaXplID0gTWF0aC5zcXJ0KHhWZWxvY2l0aWVzW2lkeF0gKiB4VmVsb2NpdGllc1tpZHhdICsgeVZlbG9jaXRpZXNbaWR4XSAqIHlWZWxvY2l0aWVzW2lkeF0pO1xuICAgICAgaWYgKHZlY1NpemUgPiAwKSB7XG4gICAgICAgIGVtYmVkWFtpZHhdICs9IHhWZWxvY2l0aWVzW2lkeF0gLyB2ZWNTaXplICogdGVtcGVyYXR1cmU7XG4gICAgICAgIGVtYmVkWVtpZHhdICs9IHlWZWxvY2l0aWVzW2lkeF0gLyB2ZWNTaXplICogdGVtcGVyYXR1cmU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm9ybWFsaXplXG4gIGxldCBtaW5YID0gZW1iZWRYWzBdO1xuICBsZXQgbWluWSA9IGVtYmVkWVswXTtcbiAgbGV0IG1heFggPSBlbWJlZFhbMF07XG4gIGxldCBtYXhZID0gZW1iZWRZWzBdO1xuICBmb3IgKGxldCBpZHggPSAxOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspIHtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgZW1iZWRYW2lkeF0pO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBlbWJlZFlbaWR4XSk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGVtYmVkWFtpZHhdKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgZW1iZWRZW2lkeF0pO1xuICB9XG4gIGxldCByYW5nZVggPSBtYXhYIC0gbWluWDtcbiAgbGV0IHJhbmdlWSA9IG1heFkgLSBtaW5ZO1xuICBpZiAocmFuZ2VYID09PSAwKVxuICAgIHJhbmdlWCA9IG1heFg7XG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKylcbiAgICBlbWJlZFhbaWR4XSA9IChlbWJlZFhbaWR4XSAtIG1pblgpIC8gcmFuZ2VYIC8gMiArIDAuNTtcbiAgaWYgKHJhbmdlWSA9PT0gMClcbiAgICByYW5nZVkgPSBtYXhZO1xuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspXG4gICAgZW1iZWRZW2lkeF0gPSAoZW1iZWRZW2lkeF0gLSBtaW5ZKSAvIHJhbmdlWSAvIDIgKyAwLjU7XG5cbiAgcmV0dXJuIHtlbWJlZFgsIGVtYmVkWX07XG59XG4iXX0=","import { bioLayout } from './bio-layout';\nexport const defaultMCLOptions = {\n expandFactor: 2,\n maxIterations: 5,\n inflateFactor: 2,\n multFactor: 1,\n};\nexport class MCLSparseReducer {\n constructor(opts = {}) {\n this._options = { ...defaultMCLOptions, ...opts };\n }\n async transform(sparseMatrix, nRows) {\n // testWorkerMultiply();\n // return new Int32Array(nRows);\n let sparseObject = this.toObjectForm(sparseMatrix);\n if (this._options.maxIterations > 0) {\n this.addLoops(sparseObject, nRows);\n this.normalize(sparseObject);\n for (let i = 0; i < this._options.maxIterations; i++) {\n sparseObject = this.expand(sparseObject, nRows);\n this.inflate(sparseObject);\n this.normalize(sparseObject);\n }\n }\n const { clusters, is, js } = this.assignClusters(sparseObject, nRows);\n this.correctClusters(clusters);\n const embeddings = await this.layout(clusters, sparseObject, nRows);\n return { clusters, embedX: embeddings.embedX, embedY: embeddings.embedY, is, js };\n }\n correctClusters(clusters) {\n const clusterSizeMap = {};\n for (const cluster of clusters) {\n if (!clusterSizeMap[cluster])\n clusterSizeMap[cluster] = 0;\n clusterSizeMap[cluster]++;\n }\n const sortedIndexes = Object.keys(clusterSizeMap).map(Number).sort((a, b) => clusterSizeMap[a] - clusterSizeMap[b]);\n const clusterMap = {};\n sortedIndexes.forEach((clusterIdx, i) => clusterMap[clusterIdx] = i + 1);\n for (let i = 0; i < clusters.length; i++)\n clusters[i] = clusterMap[clusters[i]];\n // let curCluster = 1;\n // for (let i = 0; i < clusters.length; i++) {\n // if (!clusterMap[clusters[i]]) {\n // clusterMap[clusters[i]] = curCluster;\n // clusters[i] = curCluster;\n // curCluster++;\n // } else {\n // clusters[i] = clusterMap[clusters[i]];\n // }\n // }\n }\n async layout(clusters, sparseMatrix, nRows) {\n const embedX = new Float32Array(nRows).fill(0);\n const embedY = new Float32Array(nRows).fill(0);\n const clusterMap = {};\n clusters.forEach((cluster, i) => {\n if (!clusterMap[cluster])\n clusterMap[cluster] = [];\n clusterMap[cluster].push(i);\n });\n // const nClusters = Object.keys(clusterMap).length;\n // const perRow = Math.floor(Math.sqrt(nClusters));\n let clusterNum = 0;\n const sortedClusterNames = Object.keys(clusterMap);\n sortedClusterNames.sort((a, b) => clusterMap[b].length - clusterMap[a].length);\n let perRow = 6;\n let yOffset = 0;\n const layoutSize = 5;\n for (const clusterName of sortedClusterNames) {\n const cluster = clusterMap[clusterName];\n const embeddings = await bioLayout(cluster, sparseMatrix, 0.001);\n if (clusterNum === Math.ceil(perRow / 1.5)) {\n clusterNum = 0;\n yOffset += layoutSize / perRow;\n perRow = Math.ceil(perRow * 1.5);\n }\n const offsetX = ((clusterNum % perRow) * layoutSize / perRow) * 1.5;\n // const offsetY = Math.floor(clusterNum / perRow) * 2;\n for (let i = 0; i < embeddings.embedX.length; i++) {\n embedX[cluster[i]] = embeddings.embedX[i] * layoutSize / perRow + offsetX;\n embedY[cluster[i]] = embeddings.embedY[i] * layoutSize / perRow + yOffset;\n }\n clusterNum++;\n }\n return { embedX, embedY };\n }\n mergeClusters(clusters, i, j) {\n const iCluster = clusters[i];\n const jCluster = clusters[j];\n for (let k = 0; k < clusters.length; k++) {\n if (clusters[k] === jCluster)\n clusters[k] = iCluster;\n }\n }\n assignClusters(sparseMatrix, nRows) {\n let clusterNum = 0;\n const is = [];\n const js = [];\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = Math.pow(10, order);\n const clusters = new Array(nRows).fill(-1);\n for (const i of Object.keys(sparseMatrix)) {\n for (const j of Object.keys(sparseMatrix[i])) {\n if (Math.round(sparseMatrix[i][j] * minOrder) / minOrder > 0 &&\n sparseMatrix[i][j] !== Number(i) && Number(j) > Number(i)) {\n is.push(Number(i));\n js.push(Number(j));\n if (clusters[Number(i)] !== -1 && clusters[Number(j)] !== -1) {\n if (clusters[Number(i)] !== clusters[Number(j)])\n this.mergeClusters(clusters, Number(i), Number(j));\n }\n else if (clusters[Number(i)] !== -1) {\n clusters[Number(j)] = clusters[Number(i)];\n }\n else if (clusters[Number(j)] !== -1) {\n clusters[Number(i)] = clusters[Number(j)];\n }\n else {\n clusterNum++;\n clusters[Number(i)] = clusterNum;\n clusters[Number(j)] = clusterNum;\n }\n }\n }\n }\n for (let i = 0; i < clusters.length; i++) {\n if (clusters[i] === -1) {\n clusterNum++;\n clusters[i] = clusterNum;\n }\n }\n return { clusters, is, js };\n }\n toObjectForm(sparseMatrix) {\n const sparseObject = {};\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n if (!sparseObject[sparseMatrix.i[i]])\n sparseObject[sparseMatrix.i[i]] = {};\n sparseObject[sparseMatrix.i[i]][sparseMatrix.j[i]] = 1 - sparseMatrix.distance[i];\n if (!sparseObject[sparseMatrix.j[i]])\n sparseObject[sparseMatrix.j[i]] = {};\n sparseObject[sparseMatrix.j[i]][sparseMatrix.i[i]] = 1 - sparseMatrix.distance[i];\n }\n return sparseObject;\n }\n addLoops(sparseObject, nRows) {\n for (let i = 0; i < nRows; i++) {\n if (!sparseObject[i])\n sparseObject[i] = {};\n sparseObject[i][i] = this._options.multFactor;\n }\n }\n normalize(sparseObject) {\n for (const i of Object.keys(sparseObject)) {\n const row = sparseObject[i];\n let sum = 0;\n for (const j of Object.keys(row))\n sum += row[j];\n if (sum === 0)\n continue;\n for (const j of Object.keys(row))\n sparseObject[i][j] /= sum;\n }\n }\n expand(sparseObject, nRows) {\n const expandedObject = {};\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = Math.pow(10, order);\n for (let i = 0; i < nRows; i++) {\n if (!sparseObject[i])\n continue;\n // const row = sparseObject[i];\n expandedObject[i] = {};\n for (let j = i; j < nRows; j++) {\n if (!sparseObject[i]?.[j])\n continue;\n const val = this.getExpandValue(sparseObject, i, j); //pruning step\n if (Math.round(val * minOrder) / minOrder > 0) {\n expandedObject[i][j] = val;\n if (!expandedObject[j])\n expandedObject[j] = {};\n expandedObject[j][i] = val;\n }\n }\n }\n return expandedObject;\n }\n // private prune(row: SparseMatrixObject[number]) {\n // }\n inflate(sparseObject) {\n for (const i of Object.keys(sparseObject)) {\n const row = sparseObject[i];\n for (const j of Object.keys(row))\n sparseObject[i][j] = Math.pow(sparseObject[i][j], this._options.inflateFactor);\n }\n }\n getExpandValue(sparseObject, i, j) {\n let val = 0;\n const currentIndexes = Object.keys(sparseObject[i] ?? {});\n const otherIndexes = Object.keys(sparseObject[j] ?? {});\n for (const k of currentIndexes) {\n if (otherIndexes.includes(k))\n val += sparseObject[i][k] * sparseObject[j][k];\n }\n return val;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyY292LWNsdXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXJjb3YtY2x1c3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBR3ZDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFlO0lBQzNDLFlBQVksRUFBRSxDQUFDO0lBQ2YsYUFBYSxFQUFFLENBQUM7SUFDaEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUYsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFZLE9BQTRCLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFDLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLEVBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFnQyxFQUFFLEtBQWE7UUFDcEUsd0JBQXdCO1FBQ3hCLGdDQUFnQztRQUNoQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNwRCxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENB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QUFDLENBQUM7Z0JBQzFCLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVEsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NwYXJzZU1hdHJpeFJlc3VsdH0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3NwYXJzZS1tYXRyaXgtc2VydmljZSc7XG5pbXBvcnQge2Jpb0xheW91dH0gZnJvbSAnLi9iaW8tbGF5b3V0JztcbmltcG9ydCB7TUNMT3B0aW9ucywgU3BhcnNlTWF0cml4T2JqZWN0fSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRNQ0xPcHRpb25zOiBNQ0xPcHRpb25zID0ge1xuICBleHBhbmRGYWN0b3I6IDIsXG4gIG1heEl0ZXJhdGlvbnM6IDUsXG4gIGluZmxhdGVGYWN0b3I6IDIsXG4gIG11bHRGYWN0b3I6IDEsXG59O1xuXG5leHBvcnQgY2xhc3MgTUNMU3BhcnNlUmVkdWNlciB7XG4gIHByaXZhdGUgX29wdGlvbnM6IE1DTE9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0czogUGFydGlhbDxNQ0xPcHRpb25zPiA9IHt9KSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHsuLi5kZWZhdWx0TUNMT3B0aW9ucywgLi4ub3B0c307XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4UmVzdWx0LCBuUm93czogbnVtYmVyKSB7XG4gICAgLy8gdGVzdFdvcmtlck11bHRpcGx5KCk7XG4gICAgLy8gcmV0dXJuIG5ldyBJbnQzMkFycmF5KG5Sb3dzKTtcbiAgICBsZXQgc3BhcnNlT2JqZWN0ID0gdGhpcy50b09iamVjdEZvcm0oc3BhcnNlTWF0cml4KTtcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5tYXhJdGVyYXRpb25zID4gMCkge1xuICAgICAgdGhpcy5hZGRMb29wcyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgIHRoaXMubm9ybWFsaXplKHNwYXJzZU9iamVjdCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgIHNwYXJzZU9iamVjdCA9IHRoaXMuZXhwYW5kKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICB0aGlzLmluZmxhdGUoc3BhcnNlT2JqZWN0KTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemUoc3BhcnNlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qge2NsdXN0ZXJzLCBpcywganN9ID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICB0aGlzLmNvcnJlY3RDbHVzdGVycyhjbHVzdGVycyk7XG4gICAgY29uc3QgZW1iZWRkaW5ncyA9IGF3YWl0IHRoaXMubGF5b3V0KGNsdXN0ZXJzLCBzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICByZXR1cm4ge2NsdXN0ZXJzLCBlbWJlZFg6IGVtYmVkZGluZ3MuZW1iZWRYLCBlbWJlZFk6IGVtYmVkZGluZ3MuZW1iZWRZLCBpcywganN9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnM6IG51bWJlcltdKSB7XG4gICAgY29uc3QgY2x1c3RlclNpemVNYXA6IHtbXzogbnVtYmVyXTogbnVtYmVyfSA9IHt9O1xuICAgIGZvciAoY29uc3QgY2x1c3RlciBvZiBjbHVzdGVycykge1xuICAgICAgaWYgKCFjbHVzdGVyU2l6ZU1hcFtjbHVzdGVyXSlcbiAgICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0gPSAwO1xuICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0rKztcbiAgICB9XG4gICAgY29uc3Qgc29ydGVkSW5kZXhlcyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJTaXplTWFwKS5tYXAoTnVtYmVyKS5zb3J0KChhLCBiKSA9PiBjbHVzdGVyU2l6ZU1hcFthXSAtIGNsdXN0ZXJTaXplTWFwW2JdKTtcbiAgICBjb25zdCBjbHVzdGVyTWFwOiB7W186IG51bWJlcl06IG51bWJlcn0gPSB7fTtcbiAgICBzb3J0ZWRJbmRleGVzLmZvckVhY2goKGNsdXN0ZXJJZHgsIGkpID0+IGNsdXN0ZXJNYXBbY2x1c3RlcklkeF0gPSBpICsgMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKylcbiAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV07XG4gICAgLy8gbGV0IGN1ckNsdXN0ZXIgPSAxO1xuICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV0pIHtcbiAgICAvLyAgICAgY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV0gPSBjdXJDbHVzdGVyO1xuICAgIC8vICAgICBjbHVzdGVyc1tpXSA9IGN1ckNsdXN0ZXI7XG4gICAgLy8gICAgIGN1ckNsdXN0ZXIrKztcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV07XG4gICAgLy8gICB9XG4gICAgLy8gfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsYXlvdXQoY2x1c3RlcnM6IG51bWJlcltdLCBzcGFyc2VNYXRyaXg6IFNwYXJzZU1hdHJpeE9iamVjdCwgblJvd3M6IG51bWJlcikge1xuICAgIGNvbnN0IGVtYmVkWCA9IG5ldyBGbG9hdDMyQXJyYXkoblJvd3MpLmZpbGwoMCk7XG4gICAgY29uc3QgZW1iZWRZID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgICBjb25zdCBjbHVzdGVyTWFwOiB7W186IG51bWJlcl06IG51bWJlcltdfSA9IHt9O1xuICAgIGNsdXN0ZXJzLmZvckVhY2goKGNsdXN0ZXIsIGkpID0+IHtcbiAgICAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyXSlcbiAgICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXSA9IFtdO1xuICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXS5wdXNoKGkpO1xuICAgIH0pO1xuICAgIC8vIGNvbnN0IG5DbHVzdGVycyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJNYXApLmxlbmd0aDtcbiAgICAvLyBjb25zdCBwZXJSb3cgPSBNYXRoLmZsb29yKE1hdGguc3FydChuQ2x1c3RlcnMpKTtcbiAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgY29uc3Qgc29ydGVkQ2x1c3Rlck5hbWVzID0gT2JqZWN0LmtleXMoY2x1c3Rlck1hcCk7XG4gICAgc29ydGVkQ2x1c3Rlck5hbWVzLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJNYXBbYiBhcyBhbnldLmxlbmd0aCAtIGNsdXN0ZXJNYXBbYSBhcyBhbnldLmxlbmd0aCk7XG4gICAgbGV0IHBlclJvdyA9IDY7XG5cbiAgICBsZXQgeU9mZnNldCA9IDA7XG4gICAgY29uc3QgbGF5b3V0U2l6ZSA9IDU7XG4gICAgZm9yIChjb25zdCBjbHVzdGVyTmFtZSBvZiBzb3J0ZWRDbHVzdGVyTmFtZXMpIHtcbiAgICAgIGNvbnN0IGNsdXN0ZXIgPSBjbHVzdGVyTWFwW2NsdXN0ZXJOYW1lIGFzIGFueV0hO1xuICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IGF3YWl0IGJpb0xheW91dChjbHVzdGVyLCBzcGFyc2VNYXRyaXgsIDAuMDAxKTtcbiAgICAgIGlmIChjbHVzdGVyTnVtID09PSBNYXRoLmNlaWwocGVyUm93IC8gMS41KSkge1xuICAgICAgICBjbHVzdGVyTnVtID0gMDtcbiAgICAgICAgeU9mZnNldCArPSBsYXlvdXRTaXplIC8gcGVyUm93O1xuICAgICAgICBwZXJSb3cgPSBNYXRoLmNlaWwocGVyUm93ICogMS41KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9mZnNldFggPSAoKGNsdXN0ZXJOdW0gJSBwZXJSb3cpICogbGF5b3V0U2l6ZSAvIHBlclJvdykgKiAxLjU7XG4gICAgICAvLyBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcihjbHVzdGVyTnVtIC8gcGVyUm93KSAqIDI7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iZWRkaW5ncy5lbWJlZFgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZW1iZWRYW2NsdXN0ZXJbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFhbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93ICsgb2Zmc2V0WDtcbiAgICAgICAgZW1iZWRZW2NsdXN0ZXJbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFlbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93ICsgeU9mZnNldDtcbiAgICAgIH1cbiAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICB9XG4gICAgcmV0dXJuIHtlbWJlZFgsIGVtYmVkWX07XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ2x1c3RlcnMoY2x1c3RlcnM6IG51bWJlcltdLCBpOiBudW1iZXIsIGo6IG51bWJlcikge1xuICAgIGNvbnN0IGlDbHVzdGVyID0gY2x1c3RlcnNbaV07XG4gICAgY29uc3QgakNsdXN0ZXIgPSBjbHVzdGVyc1tqXTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNsdXN0ZXJzLmxlbmd0aDsgaysrKSB7XG4gICAgICBpZiAoY2x1c3RlcnNba10gPT09IGpDbHVzdGVyKVxuICAgICAgICBjbHVzdGVyc1trXSA9IGlDbHVzdGVyO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYXNzaWduQ2x1c3RlcnMoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXhPYmplY3QsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgY29uc3QgaXM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QganM6IG51bWJlcltdID0gW107XG4gICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgIGNvbnN0IG1pbk9yZGVyID0gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICBjb25zdCBjbHVzdGVyczogbnVtYmVyW10gPSBuZXcgQXJyYXkoblJvd3MpLmZpbGwoLTEpO1xuICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhzcGFyc2VNYXRyaXgpKSB7XG4gICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMoc3BhcnNlTWF0cml4W2kgYXMgYW55XSkpIHtcbiAgICAgICAgaWYgKE1hdGgucm91bmQoc3BhcnNlTWF0cml4W2kgYXMgYW55XVtqIGFzIGFueV0gKiBtaW5PcmRlcikgLyBtaW5PcmRlciA+IDAgJiZcbiAgICAgICAgICBzcGFyc2VNYXRyaXhbaSBhcyBhbnldW2ogYXMgYW55XSAhPT0gTnVtYmVyKGkpICYmIE51bWJlcihqKSA+IE51bWJlcihpKSkge1xuICAgICAgICAgIGlzLnB1c2goTnVtYmVyKGkpKTtcbiAgICAgICAgICBqcy5wdXNoKE51bWJlcihqKSk7XG4gICAgICAgICAgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IC0xICYmIGNsdXN0ZXJzW051bWJlcihqKV0gIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gY2x1c3RlcnNbTnVtYmVyKGopXSlcbiAgICAgICAgICAgICAgdGhpcy5tZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzLCBOdW1iZXIoaSksIE51bWJlcihqKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSAtMSkge1xuICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGopXSA9IGNsdXN0ZXJzW051bWJlcihpKV07XG4gICAgICAgICAgfSBlbHNlIGlmIChjbHVzdGVyc1tOdW1iZXIoaildICE9PSAtMSkge1xuICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGkpXSA9IGNsdXN0ZXJzW051bWJlcihqKV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihpKV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGopXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGk9MDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY2x1c3RlcnNbaV0gPT09IC0xKSB7XG4gICAgICAgIGNsdXN0ZXJOdW0gKys7XG4gICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck51bTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtjbHVzdGVycywgaXMsIGpzfTtcbiAgfVxuXG4gIHB1YmxpYyB0b09iamVjdEZvcm0oc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXhSZXN1bHQpOiBTcGFyc2VNYXRyaXhPYmplY3Qge1xuICAgIGNvbnN0IHNwYXJzZU9iamVjdDoge1tfOiBudW1iZXJdOiB7W186IG51bWJlcl06IG51bWJlcn19ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmlbaV1dKVxuICAgICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmlbaV1dID0ge307XG4gICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmlbaV1dW3NwYXJzZU1hdHJpeC5qW2ldXSA9IDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV07XG4gICAgICBpZiAoIXNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV0pXG4gICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV0gPSB7fTtcbiAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV1bc3BhcnNlTWF0cml4LmlbaV1dID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIHNwYXJzZU9iamVjdDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTG9vcHMoc3BhcnNlT2JqZWN0OiBTcGFyc2VNYXRyaXhPYmplY3QsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgIGlmICghc3BhcnNlT2JqZWN0W2ldKVxuICAgICAgICBzcGFyc2VPYmplY3RbaV0gPSB7fTtcbiAgICAgIHNwYXJzZU9iamVjdFtpXVtpXSA9IHRoaXMuX29wdGlvbnMubXVsdEZhY3RvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZShzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCkge1xuICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3QpKSB7XG4gICAgICBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaSBhcyBhbnldO1xuICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgc3VtICs9IHJvd1tqIGFzIGFueV07XG4gICAgICBpZiAoc3VtID09PSAwKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgaiBvZiBPYmplY3Qua2V5cyhyb3cpKVxuICAgICAgICBzcGFyc2VPYmplY3RbaSBhcyBhbnldW2ogYXMgYW55XSAvPSBzdW07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBleHBhbmQoc3BhcnNlT2JqZWN0OiBTcGFyc2VNYXRyaXhPYmplY3QsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICBjb25zdCBleHBhbmRlZE9iamVjdDogU3BhcnNlTWF0cml4T2JqZWN0ID0ge307XG4gICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgIGNvbnN0IG1pbk9yZGVyID0gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgIGlmICghc3BhcnNlT2JqZWN0W2ldKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIC8vIGNvbnN0IHJvdyA9IHNwYXJzZU9iamVjdFtpXTtcbiAgICAgIGV4cGFuZGVkT2JqZWN0W2ldID0ge307XG4gICAgICBmb3IgKGxldCBqID0gaTsgaiA8IG5Sb3dzOyBqKyspIHtcbiAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0/LltqXSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXRFeHBhbmRWYWx1ZShzcGFyc2VPYmplY3QsIGksIGopOyAvL3BydW5pbmcgc3RlcFxuICAgICAgICBpZiAoTWF0aC5yb3VuZCh2YWwgKiBtaW5PcmRlcikgLyBtaW5PcmRlciA+IDApIHtcbiAgICAgICAgICBleHBhbmRlZE9iamVjdFtpXVtqXSA9IHZhbDtcbiAgICAgICAgICBpZiAoIWV4cGFuZGVkT2JqZWN0W2pdKVxuICAgICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal0gPSB7fTtcbiAgICAgICAgICBleHBhbmRlZE9iamVjdFtqXVtpXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXhwYW5kZWRPYmplY3Q7XG4gIH1cblxuICAvLyBwcml2YXRlIHBydW5lKHJvdzogU3BhcnNlTWF0cml4T2JqZWN0W251bWJlcl0pIHtcblxuICAvLyB9XG5cbiAgcHJpdmF0ZSBpbmZsYXRlKHNwYXJzZU9iamVjdDogU3BhcnNlTWF0cml4T2JqZWN0KSB7XG4gICAgZm9yIChjb25zdCBpIG9mIE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdCkpIHtcbiAgICAgIGNvbnN0IHJvdyA9IHNwYXJzZU9iamVjdFtpIGFzIGFueV07XG4gICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgc3BhcnNlT2JqZWN0W2kgYXMgYW55XVtqIGFzIGFueV0gPSBNYXRoLnBvdyhzcGFyc2VPYmplY3RbaSBhcyBhbnldW2ogYXMgYW55XSwgdGhpcy5fb3B0aW9ucy5pbmZsYXRlRmFjdG9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEV4cGFuZFZhbHVlKHNwYXJzZU9iamVjdDogU3BhcnNlTWF0cml4T2JqZWN0LCBpOiBhbnksIGo6IGFueSkge1xuICAgIGxldCB2YWwgPSAwO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleGVzID0gT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0W2ldID8/IHt9KTtcbiAgICBjb25zdCBvdGhlckluZGV4ZXMgPSBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3Rbal0gPz8ge30pO1xuICAgIGZvciAoY29uc3QgayBvZiBjdXJyZW50SW5kZXhlcykge1xuICAgICAgaWYgKG90aGVySW5kZXhlcy5pbmNsdWRlcyhrKSlcbiAgICAgICAgdmFsICs9IHNwYXJzZU9iamVjdFtpXVtrIGFzIGFueV0gKiBzcGFyc2VPYmplY3Rbal1bayBhcyBhbnldO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5cbiJdfQ==","import { SparseMatrixService } from '../distance-matrix/sparse-matrix-service';\nimport { MCLSparseReducer } from './marcov-cluster';\nonmessage = async (event) => {\n const { data, threshold, weights, aggregationMethod, distanceFnArgs, distanceFns, maxIterations } = event.data;\n const sparse = await new SparseMatrixService()\n .calcMultiColumn(data, distanceFns, threshold / 100, distanceFnArgs, weights, aggregationMethod);\n const res = await new MCLSparseReducer({ maxIterations: maxIterations ?? 5 }).transform(sparse, data[0].length);\n postMessage({ res });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFHN0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFbEQsU0FBUyxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtJQUMxQixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUMsR0FHaEIsS0FBSyxDQUFDLElBQUksQ0FBQztJQUMxRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksbUJBQW1CLEVBQUU7U0FDM0MsZUFBZSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxHQUFHLEdBQUcsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDbkcsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLGdCQUFnQixDQUFDLEVBQUMsYUFBYSxFQUFFLGFBQWEsSUFBSSxDQUFDLEVBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlHLFdBQVcsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTcGFyc2VNYXRyaXhTZXJ2aWNlfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvc3BhcnNlLW1hdHJpeC1zZXJ2aWNlJztcbmltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZH0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3R5cGVzJztcbmltcG9ydCB7S25vd25NZXRyaWNzfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7TUNMU3BhcnNlUmVkdWNlcn0gZnJvbSAnLi9tYXJjb3YtY2x1c3Rlcic7XG5cbm9ubWVzc2FnZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICBjb25zdCB7ZGF0YSwgdGhyZXNob2xkLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCwgZGlzdGFuY2VGbkFyZ3MsIGRpc3RhbmNlRm5zLCBtYXhJdGVyYXRpb25zfTpcbiAgIHtkYXRhOiBhbnlbXVtdLCB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsXG4gICAgZGlzdGFuY2VGbnM6IEtub3duTWV0cmljc1tdLCBkaXN0YW5jZUZuQXJnczogYW55W10sIG1heEl0ZXJhdGlvbnM6IG51bWJlcn0gPSBldmVudC5kYXRhO1xuICBjb25zdCBzcGFyc2UgPSBhd2FpdCBuZXcgU3BhcnNlTWF0cml4U2VydmljZSgpXG4gICAgLmNhbGNNdWx0aUNvbHVtbihkYXRhLCBkaXN0YW5jZUZucywgdGhyZXNob2xkIC8gMTAwLCBkaXN0YW5jZUZuQXJncywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpO1xuICBjb25zdCByZXMgPSBhd2FpdCBuZXcgTUNMU3BhcnNlUmVkdWNlcih7bWF4SXRlcmF0aW9uczogbWF4SXRlcmF0aW9ucyA/PyA1fSkudHJhbnNmb3JtKHNwYXJzZSwgZGF0YVswXS5sZW5ndGgpO1xuICBwb3N0TWVzc2FnZSh7cmVzfSk7XG59O1xuIl19","import { DistanceAggregationMethods } from './types';\nexport const isNil = (x) => x === null || x === undefined;\nexport function insertSmaller(distancesAr, indexes, num, index) {\n if (num > distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num < v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function insertLarger(distancesAr, indexes, num, index) {\n if (num < distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num > v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function getAggregationFunction(aggregationMethod, weights) {\n switch (aggregationMethod) {\n case DistanceAggregationMethods.MANHATTAN:\n return (vs) => vs.reduce((acc, val, idx) => acc + val * weights[idx], 0);\n default:\n return (vs) => {\n // euclidean\n const sum = vs.reduce((acc, val, idx) => acc + (val * weights[idx]) ** 2, 0);\n return Math.sqrt(sum);\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFO1FBQ3pCLEtBQUssMEJBQTBCLENBQUMsU0FBUztZQUN2QyxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JGO1lBQ0UsT0FBTyxDQUFDLEVBQVksRUFBRSxFQUFFO2dCQUN0QixZQUFZO2dCQUNaLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztLQUNMO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeDogYW55KSA9PiB4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFNtYWxsZXIoZGlzdGFuY2VzQXI6IG51bWJlcltdLCBpbmRleGVzOiBudW1iZXJbXSwgbnVtOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgaWYgKG51bSA+IGRpc3RhbmNlc0FyW2Rpc3RhbmNlc0FyLmxlbmd0aC0xXSlcbiAgICByZXR1cm47XG5cbiAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXN0YW5jZXNBci5maW5kSW5kZXgoKHYpID0+IG51bSA8IHYpO1xuICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICBpbmRleGVzLnBvcCgpO1xuICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGFyZ2VyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oXG4gIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzOiBudW1iZXJbXVxuKTogKHZhbHVlczogbnVtYmVyW10pID0+IG51bWJlciB7XG4gIHN3aXRjaCAoYWdncmVnYXRpb25NZXRob2QpIHtcbiAgICBjYXNlIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTjpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArIHZhbCAqIHdlaWdodHNbaWR4XSwgMCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICBjb25zdCBzdW0gPSB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArICh2YWwgKiB3ZWlnaHRzW2lkeF0pICoqIDIsIDApO1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHN1bSk7XG4gICAgICB9O1xuICB9XG59XG4iXX0=","// 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\t// no module.id needed\n\t\t// no module.loaded needed\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// 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// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [590], () => (__webpack_require__(2357)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// 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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\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__.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) 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\t709: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkbio\"] = self[\"webpackChunkbio\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","async","bioLayout","cluster","sparseObject","threshold","n","length","is","js","i","j","a","b","push","embedX","Float32Array","fill","map","Math","random","embedY","xVelocities","yVelocities","temperature","idx","dx","dy","abs","vecSize","sqrt","minX","minY","maxX","maxY","min","max","rangeX","rangeY","getLayoutEmbeddings","defaultMCLOptions","expandFactor","maxIterations","inflateFactor","multFactor","MCLSparseReducer","constructor","opts","this","_options","sparseMatrix","nRows","toObjectForm","addLoops","normalize","expand","inflate","clusters","assignClusters","correctClusters","embeddings","layout","clusterSizeMap","sortedIndexes","Object","keys","Number","sort","clusterMap","forEach","clusterIdx","clusterNum","sortedClusterNames","perRow","yOffset","clusterName","ceil","offsetX","mergeClusters","iCluster","jCluster","k","order","floor","log10","minOrder","pow","Array","round","distance","row","sum","expandedObject","val","getExpandValue","currentIndexes","otherIndexes","includes","onmessage","event","data","weights","aggregationMethod","distanceFnArgs","distanceFns","sparse","calcMultiColumn","res","transform","postMessage","isNil","x","insertSmaller","distancesAr","indexes","num","index","newPosition","findIndex","v","pop","splice","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","__webpack_exports__","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","every","key","r","d","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","call","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","Error","replace","p","self","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","then"],"sourceRoot":""}