@datagrok/eda 1.3.3 → 1.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/242.js +1 -1
- package/dist/242.js.map +1 -1
- package/dist/589.js +1 -1
- package/dist/589.js.map +1 -1
- package/dist/731.js +1 -1
- package/dist/731.js.map +1 -1
- package/dist/738.js +1 -1
- package/dist/738.js.map +1 -1
- package/dist/980.js +1 -1
- package/dist/980.js.map +1 -1
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/package.json +3 -3
- package/src/package.ts +1 -1
- package/test-console-output-1.log +76 -76
- package/test-record-1.mp4 +0 -0
package/dist/980.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"980.js","mappings":"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","sources":["webpack://eda/webpack/runtime/chunk loaded","webpack://eda/webpack/runtime/startup chunk dependencies","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-aggregation.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-multicol-distances.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/getGPUDevice.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/sparse-matrix/webGPU-sparse-matrix.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/preprocessing/webGPU-process-info.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-sparse-matrix-mult.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/clustering-steps.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/webCola.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/markov-cluster.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-worker.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/defaults.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/helpers.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/index.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/iterate.js","webpack://eda/./node_modules/graphology-utils/getters.js","webpack://eda/./node_modules/graphology-utils/is-graph.js","webpack://eda/./node_modules/graphology/dist/graphology.umd.min.js","webpack://eda/webpack/bootstrap","webpack://eda/webpack/runtime/compat get default export","webpack://eda/webpack/runtime/define property getters","webpack://eda/webpack/runtime/ensure chunk","webpack://eda/webpack/runtime/get javascript chunk filename","webpack://eda/webpack/runtime/global","webpack://eda/webpack/runtime/hasOwnProperty shorthand","webpack://eda/webpack/runtime/publicPath","webpack://eda/webpack/runtime/importScripts chunk loading","webpack://eda/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(731).then(next);\n};","function euclideanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `;\n}\n;\nfunction manhattanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `;\n}\nexport var WEBGSLAGGREGATION;\n(function (WEBGSLAGGREGATION) {\n WEBGSLAGGREGATION[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n WEBGSLAGGREGATION[\"MANHATTAN\"] = \"MANHATTAN\";\n})(WEBGSLAGGREGATION || (WEBGSLAGGREGATION = {}));\nexport const WEBGSLAGGREGATIONFUNCTIONS = {\n [WEBGSLAGGREGATION.EUCLIDEAN]: euclideanAggregationWgsl,\n [WEBGSLAGGREGATION.MANHATTAN]: manhattanAggregationWgsl\n};\n//# sourceMappingURL=webGPU-aggregation.js.map","/* eslint-disable max-len */\n// in all the functions below, the variables a and b are assumed to be arrays of uint32/f32\n//values which are infered from the code this chunk is injected into\n// also, we have access to computeInfo struct, which contains the following fields:\n// computeInfo.entrySizes: array of arrays of u32 containing the sizes of the entries\n// other fields are specific to the distance function should be injected from the main script that calls this function,\n// and should be available in the supplementaryInfo struct\n// like the similarity matrix for monomer chemical distance.\n// the getProcessInfo function should return correct buffer allocation mechanism for the supplementaryInfo,\n// for every entry list\n// the maxDistance variable is also assumed to be available in the\n// scope of the function, in case of knn it is the distance in the last postion of knn on this index,\n// in case of sparse matrix, it can be just the threshold for the distance.\n// hamming distance for sequnences of uint32 arrays of max length ${maxArraySize}\nexport function webGPUHamming(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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 < ${_maxArraySize}; 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 / ${_maxArraySize};\n `;\n}\nexport function webGPUMonomerChemicalDistance(_maxArraySize, entryIndex) {\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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${entryIndex}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${_maxArraySize}; 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 / ${_maxArraySize};\n `;\n}\nexport function webGPULevenstein(maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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, ${maxArraySize + 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 `;\n}\nexport function webGPUNeedlemanWunsch(maxArraySize, entryIndex) {\n // version of the levenshtain where the cost of substitution is customizable\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // and gapOpenPenalty, gapExtensionPenalty\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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, ${maxArraySize + 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, ${maxArraySize + 1}u>;\n var horizontalGaps: array<u32, ${maxArraySize + 1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${entryIndex};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${entryIndex};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty; // accounting for the fact that left and right gaps are less costly\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${entryIndex}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0 || i == 1 || i == bLength) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0 || j == 1 || j == aLength) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(minLength);\n\n `;\n}\nexport function webGPUEuclidean(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `;\n}\nexport function webGPUManhattan(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `;\n}\nexport function webGPUOneHotDistance(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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 `;\n}\nexport function webGPUNumericDistance(_maxArraySize, entryIndex) {\n // we assume that range${entryIndex} is available in the supplementaryInfo struct\n return `\n let range = suppInfo.range${entryIndex};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `;\n}\n// tanimoto distance for uint32 arrays of length ${maxArraySize}\nexport function webGPUTanimotoBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}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 < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `;\n}\nexport function webGPUAsymmetricBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}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 < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `;\n}\nexport function webGPUCosineBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}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 < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `;\n}\nexport function webGPUSokalBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}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 < ${maxArraySize}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 `;\n}\nexport var WEBGPUDISTANCE;\n(function (WEBGPUDISTANCE) {\n WEBGPUDISTANCE[\"HAMMING\"] = \"Hamming\";\n WEBGPUDISTANCE[\"EUCLIDEAN\"] = \"Euclidean\";\n WEBGPUDISTANCE[\"MANHATTAN\"] = \"Manhattan\";\n WEBGPUDISTANCE[\"TANIMOTO\"] = \"Tanimoto\";\n WEBGPUDISTANCE[\"LEVENSTEIN\"] = \"Levenshtein\";\n WEBGPUDISTANCE[\"NEEDLEMAN_WUNSCH\"] = \"Needlemann-Wunsch\";\n WEBGPUDISTANCE[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n WEBGPUDISTANCE[\"SOKAL\"] = \"Sokal\";\n WEBGPUDISTANCE[\"COSINE\"] = \"Cosine\";\n WEBGPUDISTANCE[\"ASYMMETRIC\"] = \"Asymmetric\";\n WEBGPUDISTANCE[\"Difference\"] = \"Difference\";\n WEBGPUDISTANCE[\"OneHot\"] = \"One-Hot\";\n})(WEBGPUDISTANCE || (WEBGPUDISTANCE = {}));\nexport const webGPUFunctions = {\n [WEBGPUDISTANCE.HAMMING]: webGPUHamming,\n [WEBGPUDISTANCE.EUCLIDEAN]: webGPUEuclidean,\n [WEBGPUDISTANCE.MANHATTAN]: webGPUManhattan,\n [WEBGPUDISTANCE.TANIMOTO]: webGPUTanimotoBitArray,\n [WEBGPUDISTANCE.LEVENSTEIN]: webGPULevenstein,\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: webGPUNeedlemanWunsch,\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: webGPUMonomerChemicalDistance,\n [WEBGPUDISTANCE.SOKAL]: webGPUSokalBitArray,\n [WEBGPUDISTANCE.COSINE]: webGPUCosineBitArray,\n [WEBGPUDISTANCE.ASYMMETRIC]: webGPUAsymmetricBitArray,\n [WEBGPUDISTANCE.Difference]: webGPUNumericDistance,\n [WEBGPUDISTANCE.OneHot]: webGPUOneHotDistance\n};\nexport const distanceFunctionComplexity = {\n [WEBGPUDISTANCE.HAMMING]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.EUCLIDEAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.MANHATTAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.TANIMOTO]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.SOKAL]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.COSINE]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.ASYMMETRIC]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.LEVENSTEIN]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: (maxEntrySize) => Math.ceil(maxEntrySize / 25),\n [WEBGPUDISTANCE.Difference]: (_maxEntrySize) => 1,\n [WEBGPUDISTANCE.OneHot]: (_maxEntrySize) => Math.ceil(_maxEntrySize / 40),\n};\nexport const TypeSupportedDistances = {\n [\"STRING\" /* WGPUENTRYTYPE.STRING */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.OneHot]),\n [\"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference]),\n [\"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference]),\n [\"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference]),\n [\"NUMBER\" /* WGPUENTRYTYPE.NUMBER */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference]),\n [\"BITARRAY\" /* WGPUENTRYTYPE.BITARRAY */]: new Set([WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC])\n};\n//# sourceMappingURL=webGPU-multicol-distances.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nlet gpuAdapter = null;\nlet gpuDevice = null;\nexport function getGPUDevice() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!navigator.gpu) {\n console.error('WebGPU is not supported in this browser');\n return null;\n }\n if (!gpuAdapter) {\n //reason: only here we get the gpuAdapter\n // eslint-disable-next-line no-restricted-syntax\n gpuAdapter = yield navigator.gpu.requestAdapter({ powerPreference: 'high-performance' });\n if (gpuAdapter == null)\n return null;\n }\n let isLost = false;\n if (gpuDevice) {\n gpuDevice.lost.then(() => {\n isLost = true;\n });\n yield new Promise((r) => setTimeout(r, 10)); // wait to see if the device is lost\n }\n if (!gpuDevice || isLost) {\n const requiredBufferSize = 1000000000; // ~1000MB\n const adapterLimits = gpuAdapter.limits;\n const buffferSizeLimit = adapterLimits.maxBufferSize;\n const storageBufferSizeLimit = adapterLimits.maxStorageBufferBindingSize;\n try {\n gpuDevice = yield gpuAdapter.requestDevice({ requiredLimits: {\n maxBufferSize: Math.min(buffferSizeLimit, requiredBufferSize),\n maxStorageBufferBindingSize: Math.min(storageBufferSizeLimit, requiredBufferSize)\n } });\n return gpuDevice;\n }\n catch (e) {\n console.error('Failed to create device with required limits', e);\n gpuDevice = yield gpuAdapter.requestDevice();\n return gpuDevice;\n }\n }\n return gpuDevice;\n });\n}\nexport function getGPUAdapterDescription() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!navigator.gpu) {\n console.error('WebGPU is not supported in this browser');\n return null;\n }\n if (!gpuAdapter) {\n // reason: only here we get the gpuAdapter\n // eslint-disable-next-line no-restricted-syntax\n gpuAdapter = yield navigator.gpu.requestAdapter();\n if (gpuAdapter == null)\n return null;\n }\n let info = null;\n if ('info' in gpuAdapter)\n info = gpuAdapter.info;\n // this option is sort of deprecated but still available in every initial release\n // else if ('requestAdapterInfo' in gpuAdapter && typeof gpuAdapter.requestAdapterInfo === 'function')\n // info = (await gpuAdapter.requestAdapterInfo()) as GPUAdapterInfo;\n if (!info)\n return 'No GPU description available';\n const outString = replaceEmptyString(info.description, replaceEmptyString(info.vendor, 'No GPU description available'));\n return outString;\n });\n}\nfunction replaceEmptyString(str, replacement) {\n return !str || str == '' ? replacement : str;\n}\n//# sourceMappingURL=getGPUDevice.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { WEBGSLAGGREGATION, WEBGSLAGGREGATIONFUNCTIONS, } from '../multi-col-distances/webGPU-aggregation';\nimport { WEBGPUDISTANCE, webGPUFunctions, } from '../multi-col-distances/webGPU-multicol-distances';\nimport { webGPUProcessInfo } from '../preprocessing/webGPU-process-info';\nimport { getGPUDevice } from '../getGPUDevice';\n/** generate sparse matrix based on list of lists of entries.\n * these entries are each encoded as Uint32Array or FLOAT32Array (depending on their type).\n * for example, sequences would be encoded as Uint32Array based on char code of the letter at each position.\n * [65, 66, 67, 68, 69] would be a sequence of 5 letters.\n * for chemical fingerprints, it would be a binary array of 0s and 1s,\n * represented as Uint32Array(_data property of DG bitarray).\n *\n * Be ware that size of entryList, distanceMetrics, weights and options must be the same.\n * if there are no options for entries i, pass an empty object.\n * for now options are needed for\n * needleman-wunsch and monomer chemical distances: see {@link BioDistanceFnOptions} as for how it should be passed\n * numeric distances (Difference): {range: number} where range is the range of the values in the column (max - min).\n * in both cases, if options are not provided, they will be calculated automatically.\n */\nexport function multiColWebGPUSparseMatrix(entryList, // list of lists of entries, for multiple columns\nthreshold = 0.8, // similarity threshold, be ware that if you use too small threshold, there might be memory overflow...\ndistanceMetrics, // distance metrics for each column\naggregationFunction, // aggregation function for the distances\nweights, // weights for each column\noptions // supplementary options for each column\n) {\n return __awaiter(this, void 0, void 0, function* () {\n const device = yield getGPUDevice();\n if (!device)\n return null; // if no device, return null, as we cannot do anything without it.\n const availableDistanceMetrics = Object.values(WEBGPUDISTANCE);\n if (distanceMetrics.some((metric) => !availableDistanceMetrics.includes(metric)))\n throw new Error('Invalid distance metrics provided: ' + distanceMetrics.join(', '));\n const availableAggregationFunctions = Object.values(WEBGSLAGGREGATION);\n if (!availableAggregationFunctions.includes(aggregationFunction))\n throw new Error('Invalid aggregation function provided: ' + aggregationFunction);\n const maxDistance = 1 - threshold; // maximum distance\n // first, check that all the supplementary options are provided and are the same length:\n if (options.length !== entryList.length ||\n options.length !== distanceMetrics.length ||\n options.length !== weights.length) {\n throw new Error('Options, weigths and distance functions must be provided for each column');\n }\n // check that all the entry lists are the same length\n if (entryList.some((list) => list.length !== entryList[0].length))\n throw new Error('All entry lists must be the same length');\n const numOfColumns = entryList.length; // number of columns\n const listSize = entryList[0].length; // size of each list (or column)\n const processInfo = entryList.map((entry, i) => {\n return webGPUProcessInfo(entry, distanceMetrics[i], i, options[i]);\n });\n if (numOfColumns === 0) {\n throw new Error('No columns provided. Please provide at least one column of data.');\n }\n if (numOfColumns === 1)\n aggregationFunction = WEBGSLAGGREGATION.MANHATTAN; // save a bit of time\n // combine all struct types into one to put into the suppInfo struct.\n let suppInfoWgsl = processInfo\n .map((info) => info.suppInfoStructWgsl)\n .filter((wgsl) => !!wgsl && wgsl != '')\n .join(',\\n');\n // structures in wgsl must have at least one member, so if we have no structures, we need to add a dummy one\n let needsDummy = false;\n if (!suppInfoWgsl || suppInfoWgsl.trim() == '') {\n needsDummy = true;\n suppInfoWgsl = '\\ndummy: f32\\n';\n }\n // combine all data wgsl struct code into one\n const dataWgsl = processInfo.map((info) => info.dataStructWgsl).filter((wgsl) => !!wgsl && wgsl != '').join(',\\n');\n // combine all array sizes into one array (easier for setting)\n const arraySizes = new Uint32Array(numOfColumns * listSize);\n processInfo.forEach((info, i) => {\n arraySizes.set(info.arraySizes, i * listSize);\n }); // array.flat is not as optimized as this\n // if we try to map large arrays directly from GPU, sometimes, device disconnects. so we need to do it in chunks, a good number\n // we found is 10000. So we will perform computations in chunks of 10000. meaning that we will dispatch 10000 threads at a time.\n const numOfThreads = 10000;\n // in this case we do not need to worry about complexity of the algorithm, as the 100 is low enaugh number, which is limited by memory usage.\n const sparseResultSizePerThread = 100; // number of iterations per thread (number of pair comparisons)\n const combinedComplexity = processInfo.reduce((a, b) => a + b.complexity, 0); // combined complexity of all the columns\n const maxIterationsPerThread = Math.ceil(6000 / combinedComplexity); // maximum number of iterations per thread\n const workGroupDivision = 10; // how many threads inside of one workgroup dimension (in this case 10 * 10 threads per workgroup)\n const threadsPerWorkgroup = workGroupDivision * workGroupDivision;\n const workgroupsDim = Math.ceil(Math.sqrt(Math.ceil(numOfThreads / threadsPerWorkgroup))); // how many workgroups per 2d dimension\n const globalThreadDimSize = workgroupsDim * workGroupDivision; // how many threads per 2d dimension\n const condensedDistanceMatrixSize = listSize * (listSize - 1) / 2; // size of the condensed distance matrix, this many comparisons will be made.\n const dmChunkSizePerThread = Math.ceil(condensedDistanceMatrixSize / numOfThreads); // how many comparisons per thread\n const module = device.createShaderModule({\n label: 'Sparse matrix compute shader',\n code: `\n // each thread will perform ${sparseResultSizePerThread} iterations at one time, comparing ${sparseResultSizePerThread} pairs of entries.\n // in total, each thread will perform at most ${dmChunkSizePerThread} comparisons.\n // first is the result struct, containing is, js, and distances. each array with length of ${sparseResultSizePerThread},\n // and also integer for how many pairs were found to be below threshold.\n struct SparseResult {\n i: array<array<u32, ${sparseResultSizePerThread}>, ${numOfThreads}>,\n j: array<array<u32, ${sparseResultSizePerThread}>, ${numOfThreads}>,\n distances: array<array<f32, ${sparseResultSizePerThread}>, ${numOfThreads}>,\n found: array<u32, ${numOfThreads}>,\n done: array<u32, ${numOfThreads}>\n }\n // struct for the data\n struct ComputeInfo {\n // start at cols and rows, and end at cols and rows for each thread, these will be calculated on cpu and passed to gpu.\n startAtCols: array<u32, ${numOfThreads}>,\n startAtRows: array<u32, ${numOfThreads}>,\n endAtCols: array<u32, ${numOfThreads}>,\n endAtRows: array<u32, ${numOfThreads}>,\n\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${listSize}>, ${numOfColumns}>,\n // the weights for each entry\n weights: array<f32, ${numOfColumns}>,\n // the data for each entry\n ${dataWgsl} // 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 for the supplementary information\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${suppInfoWgsl}\n };\n\n @group(0) @binding(0) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(1) var<storage, read_write> suppInfo: SuppInfo;\n @group(0) @binding(2) var<storage, read_write> results: SparseResult;\n @compute @workgroup_size(${workGroupDivision}, ${workGroupDivision}) fn calcSparseMatrix(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${needsDummy ? `let otherDummy = suppInfo.dummy * 2;` : ''} // just to make sure that the suppInfo is not optimized out\n let threadCol = id.x;\n let threadRow = id.y;\n let linearIndex = threadRow * ${globalThreadDimSize} + threadCol;\n if (linearIndex >= ${numOfThreads}) {\n return; // if we are out of bounds, return\n } \n var startAtCol: u32 = computeInfo.startAtCols[linearIndex];\n var startAtRow: u32 = computeInfo.startAtRows[linearIndex];\n let endAtCol: u32 = min(computeInfo.endAtCols[linearIndex], ${listSize}u);\n let endAtRow: u32 = min(computeInfo.endAtRows[linearIndex], ${listSize}u);\n let is = &results.i[linearIndex];\n let js = &results.j[linearIndex];\n let distances = &results.distances[linearIndex];\n results.found[linearIndex] = 0; // initialize the found counter\n var found: u32 = 0;\n if (results.done[linearIndex] > 0) {\n return; // if we are done, return\n }\n for (var i = 0; i < ${maxIterationsPerThread}; i++) {\n if (startAtCol >= endAtCol && startAtRow >= endAtRow) {\n results.done[linearIndex] = 1;\n break;\n }\n if (found >= ${sparseResultSizePerThread}) {\n break;\n }\n let dist = combinedDistance(startAtCol, startAtRow);\n if (dist <= ${maxDistance}) {\n (*is)[found] = startAtCol;\n (*js)[found] = startAtRow;\n (*distances)[found] = dist;\n found = found + 1;\n }\n startAtCol = startAtCol + 1;\n if (startAtCol >= ${listSize}u) {\n startAtRow += 1;\n startAtCol = startAtRow + 1;\n }\n }\n results.found[linearIndex] = found;\n // update the startAtCols and startAtRows\n computeInfo.startAtCols[linearIndex] = startAtCol;\n computeInfo.startAtRows[linearIndex] = startAtRow;\n\n }\n\n // this will generate the distance script for each distance metric and then combine them into one\n ${getCombinedDistanceScript(distanceMetrics, processInfo.map((info) => info.maxEntryLen), maxDistance, aggregationFunction)}\n\n\n `\n });\n const pipeline = device.createComputePipeline({\n label: 'sparse matrix compute pipeline',\n layout: 'auto',\n compute: {\n module,\n entryPoint: 'calcSparseMatrix',\n },\n });\n // generate startAtCols, startAtRows, endAtCols, endAtRows\n const startAtCols = new Uint32Array(numOfThreads);\n const startAtRows = new Uint32Array(numOfThreads);\n const endAtCols = new Uint32Array(numOfThreads);\n const endAtRows = new Uint32Array(numOfThreads);\n const chunkSize = Math.floor(condensedDistanceMatrixSize / numOfThreads); // size of the chunk per thread (in total)\n let startRow = 0;\n let startCol = 1;\n console.time('GPUthreadStarts');\n for (let i = 0; i < numOfThreads; i++) {\n const endIdx = i === numOfThreads - 1 ? condensedDistanceMatrixSize - 1 : (i + 1) * chunkSize;\n // fancy formulas to calculate the start and end indices for the condensed distance matrix for each thread start\n const endRow = listSize - 2 - Math.floor(Math.sqrt(-8 * endIdx + 4 * listSize * (listSize - 1) - 7) / 2 - 0.5);\n const endCol = endIdx - listSize * endRow + Math.floor((endRow + 1) * (endRow + 2) / 2);\n startAtCols[i] = startCol;\n startAtRows[i] = startRow;\n endAtCols[i] = endCol;\n endAtRows[i] = endRow;\n startRow = endRow;\n startCol = endCol;\n // const startRow = values[0].length - 2 - Math.floor(\n // Math.sqrt(-8 * startIdx + 4 * values[0].length * (values[0].length - 1) - 7) / 2 - 0.5);\n // const startCol = startIdx - values[0].length * startRow + Math.floor((startRow + 1) * (startRow + 2) / 2);\n }\n console.timeEnd('GPUthreadStarts');\n // size of the computeInfo buffer\n const computeInfoBuffer32Size = numOfThreads * 4 + // startAtCols, startAtRows, endAtCols, endAtRows\n listSize * numOfColumns + // entrySizes\n numOfColumns + // weights\n processInfo.reduce((a, b) => a + b.sourceArraySize, 0);\n // size of the suppInfo buffer\n const suppInfoBuffer32Size = processInfo.reduce((a, b) => a + b.suppInfoSize, 0);\n // size of the results buffer\n const sparseMatrixEachArray32Size = sparseResultSizePerThread * numOfThreads;\n const resultsBuffer32Size = 3 * sparseMatrixEachArray32Size + numOfThreads + numOfThreads; // i, j, distances, found, done\n // create a buffer on the GPU to hold computeInfo\n // beware that struct must be padded to 16 bytes, so we need to calculate the size of the struct in 32bit values\n const computeInfoBufferSize = computeInfoBuffer32Size * Uint32Array.BYTES_PER_ELEMENT;\n let paddedComputeInfoBufferSize = computeInfoBufferSize;\n const remainder = computeInfoBufferSize & 15; // check if the size is a multiple of 16\n if (remainder !== 0)\n paddedComputeInfoBufferSize += 16 - remainder; // pad the size accordingly\n const computeInfoBuffer = device.createBuffer({\n label: 'compute info buffer',\n size: paddedComputeInfoBufferSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n const mappedComputeInfoArrayBuffer = computeInfoBuffer.getMappedRange(); // get full buffer\n // dynamic offset for the computeInfo buffer\n let computeInfoOffSet = 0;\n // first write the startAtCols, startAtRows, endAtCols, endAtRows\n const startAtColsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n startAtColsBufferView.set(startAtCols);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n const startAtRowsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n startAtRowsBufferView.set(startAtRows);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n const endAtColsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n endAtColsBufferView.set(endAtCols);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n const endAtRowsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n endAtRowsBufferView.set(endAtRows);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n // then write the entrySizes\n const entrySizesView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, arraySizes.length);\n entrySizesView.set(arraySizes);\n computeInfoOffSet += arraySizes.length * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n // then write the weights\n const weightsView = new Float32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfColumns);\n weightsView.set(weights);\n computeInfoOffSet += numOfColumns * Float32Array.BYTES_PER_ELEMENT;\n // finally, write the data itself\n for (const info of processInfo) {\n const ArrayConstructor = info.EncodedArrayConstructor;\n const chunkSize = info.sourceArraySize;\n const dataView = new ArrayConstructor(mappedComputeInfoArrayBuffer, computeInfoOffSet, chunkSize); //new ArrayConstructor(computeInfoBuffer.getMappedRange(computeInfoOffSet, chunkByteSize));\n dataView.set(info.flatSourceArray);\n computeInfoOffSet += chunkSize * ArrayConstructor.BYTES_PER_ELEMENT;\n }\n // we are done at this point.\n computeInfoBuffer.unmap();\n // create a buffer on the GPU to hold suppInfo\n // same here, we need to pad the size of the struct to 16 bytes\n const suppInfoBufferSize = suppInfoBuffer32Size * Uint32Array.BYTES_PER_ELEMENT;\n let paddedSuppInfoBufferSize = suppInfoBufferSize;\n const suppInfoRemainder = suppInfoBufferSize & 15; // check if the size is a multiple of 16\n if (suppInfoRemainder !== 0)\n paddedSuppInfoBufferSize += 16 - suppInfoRemainder; // pad the size accordingly\n paddedSuppInfoBufferSize = Math.max(paddedSuppInfoBufferSize, 16);\n const suppInfoBuffer = device.createBuffer({\n label: 'supp info buffer',\n size: paddedSuppInfoBufferSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n const mappedSuppInfoArrayBuffer = suppInfoBuffer.getMappedRange(); // get full buffer\n let suppInfoOffSet = 0;\n for (const info of processInfo) {\n if (info.suppInfoBuffer && info.suppInfoBuffer.byteLength > 0 && info.suppInfoSize > 0) {\n const ArrayConstructor = info.suppInfoType === \"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */ ? Uint32Array : Float32Array;\n const suppInfoView = new ArrayConstructor(mappedSuppInfoArrayBuffer, suppInfoOffSet, info.suppInfoBuffer.length); //new ArrayConstructor(suppInfoBuffer.getMappedRange(suppInfoOffSet, info.suppInfoBuffer.byteLength));\n suppInfoView.set(info.suppInfoBuffer);\n suppInfoOffSet += info.suppInfoBuffer.byteLength; // info.suppInfoBuffer.length * ArrayConstructor.BYTES_PER_ELEMENT;\n }\n }\n if (suppInfoOffSet === 0) {\n const dummyView = new Uint32Array(mappedSuppInfoArrayBuffer, 0, 4); //new Uint32Array(suppInfoBuffer.getMappedRange(0, 16));\n dummyView.set([1, 1, 1, 1]);\n }\n suppInfoBuffer.unmap();\n // create a buffer for the results\n const resultsBufferSize = resultsBuffer32Size * Uint32Array.BYTES_PER_ELEMENT;\n let paddedResultsBufferSize = resultsBufferSize;\n const resultsRemainder = resultsBufferSize & 15; // check if the size is a multiple of 16\n if (resultsRemainder !== 0)\n paddedResultsBufferSize += 16 - resultsRemainder; // pad the size accordingly\n const resultsBuffer = device.createBuffer({\n label: 'results buffer',\n size: paddedResultsBufferSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC\n });\n // Setup a bindGroup to tell the shader which\n // buffer to use for the computation\n const bindGroup = device.createBindGroup({\n label: 'bindGroup for sparse matrix buffer',\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: computeInfoBuffer } },\n { binding: 1, resource: { buffer: suppInfoBuffer } },\n { binding: 2, resource: { buffer: resultsBuffer } },\n ],\n });\n //const pairComparisonsPerPass = maxIterationsPerThread * numOfThreads;\n //const passes = Math.ceil(condensedDistanceMatrixSize / pairComparisonsPerPass);\n // we will distpatch this many passes to the GPU, and it will handle indexes all by itself.\n // we already copied the start/end information to it, so it will know where to start and end on each pass.\n const resultsOutBuffer = device.createBuffer({\n label: 'results out buffer',\n size: resultsBuffer.size,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n const resultIs = [];\n const resultJs = [];\n const resultDistances = [];\n //let combinedFound = 0;\n let isAllDone = false;\n while (!isAllDone) {\n // Encode commands to do the computation\n const encoder = device.createCommandEncoder({\n label: 'distance encoder',\n });\n const pass = encoder.beginComputePass({\n label: 'distance compute pass',\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(workgroupsDim, workgroupsDim);\n pass.end();\n encoder.copyBufferToBuffer(resultsBuffer, 0, resultsOutBuffer, 0, resultsOutBuffer.size);\n // Finish encoding and submit the commands\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n // Read the results\n yield device.queue.onSubmittedWorkDone();\n yield resultsOutBuffer.mapAsync(GPUMapMode.READ);\n const resultsOutArrayBuffer = resultsOutBuffer.getMappedRange();\n // read the results\n let resultOffset = 0;\n const resultsI = new Uint32Array(resultsOutArrayBuffer, resultOffset, sparseMatrixEachArray32Size);\n resultOffset += sparseMatrixEachArray32Size * Uint32Array.BYTES_PER_ELEMENT;\n const resultsJ = new Uint32Array(resultsOutArrayBuffer, resultOffset, sparseMatrixEachArray32Size);\n resultOffset += sparseMatrixEachArray32Size * Uint32Array.BYTES_PER_ELEMENT;\n const resultsDistances = new Float32Array(resultsOutArrayBuffer, resultOffset, sparseMatrixEachArray32Size);\n resultOffset += sparseMatrixEachArray32Size * Float32Array.BYTES_PER_ELEMENT;\n const resultsFound = new Uint32Array(resultsOutArrayBuffer, resultOffset, numOfThreads);\n resultOffset += numOfThreads * Uint32Array.BYTES_PER_ELEMENT;\n const resultsDone = new Uint32Array(resultsOutArrayBuffer, resultOffset, numOfThreads);\n isAllDone = resultsDone.every((d) => d === 1);\n const totalResults = resultsFound.reduce((a, b) => a + b, 0);\n const combinedI = new Uint32Array(totalResults);\n const combinedJ = new Uint32Array(totalResults);\n const combinedDistances = new Float32Array(totalResults);\n let combinedOffset = 0;\n for (let resI = 0; resI < resultsFound.length; resI++) {\n const found = resultsFound[resI];\n if (found === 0)\n continue;\n combinedI.set(resultsI.subarray(resI * sparseResultSizePerThread, resI * sparseResultSizePerThread + found), combinedOffset);\n combinedJ.set(resultsJ.subarray(resI * sparseResultSizePerThread, resI * sparseResultSizePerThread + found), combinedOffset);\n combinedDistances.set(resultsDistances.subarray(resI * sparseResultSizePerThread, resI * sparseResultSizePerThread + found), combinedOffset);\n combinedOffset += found;\n }\n resultIs.push(combinedI);\n resultJs.push(combinedJ);\n resultDistances.push(combinedDistances);\n resultsOutBuffer.unmap();\n }\n const totalSize = resultIs.reduce((a, b) => a + b.length, 0);\n const finalI = new Uint32Array(totalSize);\n const finalJ = new Uint32Array(totalSize);\n const finalDistances = new Float32Array(totalSize);\n let finalOffset = 0;\n for (let i = 0; i < resultIs.length; i++) {\n finalI.set(resultIs[i], finalOffset);\n finalJ.set(resultJs[i], finalOffset);\n finalDistances.set(resultDistances[i], finalOffset);\n finalOffset += resultIs[i].length;\n }\n // as rule mandates, destroy all buffers.\n computeInfoBuffer.destroy();\n suppInfoBuffer.destroy();\n resultsBuffer.destroy();\n resultsOutBuffer.destroy();\n return { i: finalI, j: finalJ, distance: finalDistances };\n });\n}\nfunction getCombinedDistanceScript(distanceMetrics, maxEntryLens, maxDistance, aggregation) {\n const distanceWgsls = distanceMetrics.map((metric, i) => {\n return `\n fn distanceScript${i}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${i}[aIndex];\n let b = computeInfo.data${i}[bIndex];\n let maxDistance: f32 = ${maxDistance};\n ${webGPUFunctions[metric](maxEntryLens[i], i)}\n }\n `;\n });\n const allDistanceScripts = distanceWgsls.join('\\n');\n const combineDistancesScript = `\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${distanceMetrics.length}>;\n ${distanceMetrics.map((_, i) => `distances[${i}] = distanceScript${i}(aIndex, bIndex);`).join('\\n')}\n ${WEBGSLAGGREGATIONFUNCTIONS[aggregation](distanceMetrics.length)}\n }\n \n `;\n return allDistanceScripts + '\\n' + combineDistancesScript;\n}\n//# sourceMappingURL=webGPU-sparse-matrix.js.map","/* eslint-disable max-len */\nimport { distanceFunctionComplexity, TypeSupportedDistances, WEBGPUDISTANCE } from '../multi-col-distances/webGPU-multicol-distances';\nexport function webGPUProcessInfo(entryList, distanceMetric = WEBGPUDISTANCE.HAMMING, entryIndex, // index of the entries in the list of lists that we want to process\noptions = { gapOpenPenalty: 1.0, gapExtensionPenalty: 0.6 }) {\n var _a, _b;\n let entryType = null;\n const encodedList = (() => {\n if (entryList.some((e) => typeof e === 'string')) {\n entryType = \"STRING\" /* WGPUENTRYTYPE.STRING */;\n return entryList.map((entry) => new Uint32Array(entry.split('').map((c) => c.charCodeAt(0))));\n }\n if (entryList.some((e) => typeof e === 'number')) {\n entryType = \"NUMBER\" /* WGPUENTRYTYPE.NUMBER */;\n return entryList.map((entry) => new Float32Array([entry]));\n }\n if (typeof entryList[0] == 'object' && entryList.some((e) => '_data' in e && '_length' in e)) {\n entryType = \"BITARRAY\" /* WGPUENTRYTYPE.BITARRAY */;\n return entryList.map((entry) => entry._data);\n }\n if (entryList.some((e) => e instanceof Float32Array)) {\n entryType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n return entryList;\n }\n if (entryList.some((e) => e instanceof Uint32Array)) {\n entryType = \"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */;\n return entryList;\n }\n if (entryList.some((e) => e instanceof Int32Array)) {\n entryType = \"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */;\n return entryList;\n }\n //return entryList as Uint32Array[];\n })();\n if (!encodedList || !entryType)\n throw new Error('Invalid entry type, could not determine entry type from input list');\n const encodedListType = encodedList[0] instanceof Int32Array ? \"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */ :\n encodedList[0] instanceof Float32Array ? \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */ : \"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */;\n // sizes of each entries might differ, so we need to keep track of that for some distance metrics, like hamming for example\n const arraySizes = new Uint32Array(encodedList.map((arr) => arr.length));\n if (!TypeSupportedDistances[entryType] || !TypeSupportedDistances[entryType].has(distanceMetric))\n throw new Error(`Distance metric '${distanceMetric}' not supported for entry type '${entryType}'`);\n const maxEntryLen = arraySizes.reduce((a, b) => Math.max(a, b), 0);\n // get the complexity of used algorithm\n const complexity = distanceFunctionComplexity[distanceMetric](maxEntryLen);\n const EncodedArrayConstructor = encodedListType === \"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */ ? Int32Array :\n (encodedListType === \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */ ? Float32Array : Uint32Array);\n const flatSourceArray = new EncodedArrayConstructor(encodedList.length * maxEntryLen);\n // when setting, we need to set each array at a specific offset, which is controlled by maxArrayLen because each array might have different sizes.\n // this way we will get correct matrix representation in the compute shader\n encodedList.forEach((seq, i) => {\n flatSourceArray.set(seq, i * maxEntryLen);\n });\n // NB! all this before the line was generic, now we need to calculate some specific things for some specific distance metrics\n // initialize supp info line that will be included in the final shader;\n let suppInfoStructWgsl = ''; // the code that will be included in the struct of suppInfo\n let suppInfoSize = 0;\n let suppInfoType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n let suppInfoBuffer = null;\n if (distanceMetric === WEBGPUDISTANCE.NEEDLEMAN_WUNSCH || distanceMetric === WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE) {\n let maxMonomerIndex = options.scoringMatrix && options.alphabetIndexes ?\n Object.keys(options.alphabetIndexes).reduce((prev, n) => Math.max(prev, n.charCodeAt(0)), 0) : -1;\n // generate default similarity matrix if it is not provided\n if (!options.alphabetIndexes || !options.scoringMatrix) {\n for (let i = 0; i < flatSourceArray.length; i++) {\n if (flatSourceArray[i] > maxMonomerIndex)\n maxMonomerIndex = flatSourceArray[i];\n }\n options.scoringMatrix =\n new Array(maxMonomerIndex + 1).fill(null).map(() => new Array(maxMonomerIndex + 1).fill(0));\n options.alphabetIndexes = {};\n for (let i = 0; i < options.scoringMatrix.length; i++) {\n options.scoringMatrix[i][i] = 1;\n options.alphabetIndexes[String.fromCharCode(i)] = i;\n }\n }\n const similarityMatrixSize = (maxMonomerIndex + 1) * (maxMonomerIndex + 1);\n const transferedSimilarityMatrix = new Array(maxMonomerIndex + 1).fill(null).map(() => new Float32Array(maxMonomerIndex + 1));\n // set diagonal to 1\n for (let i = 0; i < maxMonomerIndex + 1; i++)\n transferedSimilarityMatrix[i][i] = 1;\n const alphabetIndexes = options.alphabetIndexes;\n for (const key of Object.keys(alphabetIndexes)) {\n for (const key2 of Object.keys(alphabetIndexes)) {\n if (key === key2)\n continue;\n transferedSimilarityMatrix[key.charCodeAt(0)][key2.charCodeAt(0)] =\n options.scoringMatrix[alphabetIndexes[key]][alphabetIndexes[key2]];\n }\n }\n // in memory layout, we will have 2 float32 s for gapOpen and gapExtension penalties, and then f32 array<array<f32>> for similarity matrix.\n // because of primitives, there will be no padding, so we can calculate the size directly\n suppInfoSize = 2 + similarityMatrixSize;\n suppInfoType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n suppInfoBuffer = new Float32Array(suppInfoSize);\n suppInfoBuffer[0] = (_a = options.gapOpenPenalty) !== null && _a !== void 0 ? _a : 1.0;\n suppInfoBuffer[1] = (_b = options.gapExtensionPenalty) !== null && _b !== void 0 ? _b : 0.6;\n let offset = 2;\n for (let i = 0; i < transferedSimilarityMatrix.length; i++) {\n suppInfoBuffer.set(transferedSimilarityMatrix[i], offset);\n offset += transferedSimilarityMatrix[i].length;\n }\n suppInfoStructWgsl = `\n gapOpenPenalty${entryIndex}: f32,\n gapExtensionPenalty${entryIndex}: f32,\n similarityMatrix${entryIndex}: array<array<f32, ${maxMonomerIndex + 1}>, ${maxMonomerIndex + 1}>`;\n }\n else if (distanceMetric === WEBGPUDISTANCE.Difference) {\n // for difference, we need range of values for normalization of the difference\n if (!options.range || typeof options.range !== 'number' || options.range <= 0) {\n const min = flatSourceArray.reduce((a, b) => Math.min(a, b), flatSourceArray[0]);\n const max = flatSourceArray.reduce((a, b) => Math.max(a, b), flatSourceArray[0]);\n options.range = max - min;\n }\n if (options.range <= 0)\n options.range = 1.0; // this means that all values are the same, and all distances will produce 0.\n suppInfoSize = 1;\n suppInfoType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n suppInfoBuffer = new Float32Array([options.range]);\n suppInfoStructWgsl = `\n range${entryIndex}: f32`;\n }\n const dataTypeWGSL = flatSourceArray instanceof Int32Array ? 'i32' : (flatSourceArray instanceof Float32Array ? 'f32' : 'u32');\n const dataStructWgsl = `data${entryIndex}: array<array<${dataTypeWGSL}, ${maxEntryLen}>, ${encodedList.length}>`;\n // for now, other distances do not require any additional information, so we can skip that\n return {\n flatSourceArray,\n sourceArraySize: flatSourceArray.length,\n maxEntryLen,\n arraySizes,\n complexity,\n suppInfoBuffer,\n suppInfoSize,\n suppInfoType: suppInfoType,\n suppInfoStructWgsl,\n entryType,\n dataTypeWGSL,\n dataStructWgsl,\n EncodedArrayConstructor\n };\n}\n//# sourceMappingURL=webGPU-process-info.js.map","// simple semaphore\nlet semaphore = Promise.resolve();\nconst lock = async () => {\n await semaphore;\n let release = () => { };\n const promise = new Promise((resolve) => {\n release = resolve;\n });\n semaphore = promise;\n return release;\n};\n/** Multiplies sparse matrix by itself. note that it expects that sparse matrix is full\n * (i.e. not only the upper right corner) and it has self loops if any */\nexport async function multSparseMatrix(sparseMatrix, nRows, pruneValue) {\n const workersNum = Math.min(Math.max(navigator.hardwareConcurrency - 2, 1), nRows);\n // number of horizontal strips that we will divide the matrix into\n // we divide the matrix into horizontal strips, because its faster for indexing and better for cache\n const numOfHorizontalStrinps = workersNum * 5;\n const indexStarts = new Uint32Array(numOfHorizontalStrinps);\n const indexEnds = new Uint32Array(numOfHorizontalStrinps);\n const blockHeight = nRows / numOfHorizontalStrinps;\n for (let i = 0; i < numOfHorizontalStrinps; i++) {\n indexStarts[i] = Math.floor(i * blockHeight);\n indexEnds[i] = i === numOfHorizontalStrinps - 1 ? nRows : Math.floor((i + 1) * blockHeight);\n }\n const workers = new Array(workersNum).fill(0)\n .map(() => new Worker(new URL('./mcl-sparse-matrix-mult-worker', import.meta.url)));\n const availableIndexes = new Set();\n for (let i = 0; i < numOfHorizontalStrinps; i++)\n availableIndexes.add(i);\n const initPromises = workers.map((worker) => {\n return new Promise((resolve) => {\n worker.postMessage({\n is: sparseMatrix.i,\n js: sparseMatrix.j,\n ds: sparseMatrix.distance,\n nRows,\n pruneValue\n });\n worker.onmessage = () => {\n resolve();\n };\n });\n });\n await Promise.all(initPromises);\n const res = [];\n const takeChunk = async (workerIdx) => {\n const release = await lock();\n const index = availableIndexes.values().next().value;\n if (index == null) {\n release();\n return;\n }\n availableIndexes.delete(index);\n release();\n await new Promise((resolve) => {\n workers[workerIdx].postMessage({\n blockStart: indexStarts[index],\n blockEnd: indexEnds[index],\n workerIdx\n });\n workers[workerIdx].onmessage = (e) => {\n res.push(e.data);\n resolve();\n };\n });\n await takeChunk(workerIdx);\n };\n const promises = workers.map((_worker, i) => {\n return takeChunk(i);\n });\n await Promise.all(promises);\n workers.forEach((worker) => worker.terminate());\n let totLen = 0;\n for (const r of res)\n totLen += r.i.length;\n const i = new Uint32Array(totLen);\n const j = new Uint32Array(totLen);\n const d = new Float32Array(totLen);\n let offset = 0;\n for (const r of res) {\n i.set(r.i, offset);\n j.set(r.j, offset);\n d.set(r.distance, offset);\n offset += r.i.length;\n }\n // don't forget to get the updated values for the diagonal, their rows need to be basically squared and summed\n // also, the diagonal values are not pruned\n return { i, j, distance: d };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLXNwYXJzZS1tYXRyaXgtbXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC1zcGFyc2UtbWF0cml4LW11bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsbUJBQW1CO0FBQ25CLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUVsQyxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtJQUN0QixNQUFNLFNBQVMsQ0FBQztJQUNoQixJQUFJLE9BQU8sR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM1QyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUNwQixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFHRjt5RUFDeUU7QUFDekUsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsWUFBMEIsRUFBRSxLQUFhLEVBQUUsVUFBa0I7SUFFN0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbkYsa0VBQWtFO0lBQ2xFLG9HQUFvRztJQUNwRyxNQUFNLHNCQUFzQixHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUM1RCxNQUFNLFNBQVMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBRTFELE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxzQkFBc0IsQ0FBQztJQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENB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LEVBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTcGFyc2VNYXRyaXh9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aCc7XG5cbi8vIHNpbXBsZSBzZW1hcGhvcmVcbmxldCBzZW1hcGhvcmUgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuY29uc3QgbG9jayA9IGFzeW5jICgpID0+IHtcbiAgYXdhaXQgc2VtYXBob3JlO1xuICBsZXQgcmVsZWFzZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICByZWxlYXNlID0gcmVzb2x2ZTtcbiAgfSk7XG4gIHNlbWFwaG9yZSA9IHByb21pc2U7XG4gIHJldHVybiByZWxlYXNlO1xufTtcblxuXG4vKiogTXVsdGlwbGllcyBzcGFyc2UgbWF0cml4IGJ5IGl0c2VsZi4gbm90ZSB0aGF0IGl0IGV4cGVjdHMgdGhhdCBzcGFyc2UgbWF0cml4IGlzIGZ1bGxcbiAqIChpLmUuIG5vdCBvbmx5IHRoZSB1cHBlciByaWdodCBjb3JuZXIpIGFuZCBpdCBoYXMgc2VsZiBsb29wcyBpZiBhbnkgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtdWx0U3BhcnNlTWF0cml4KFxuICBzcGFyc2VNYXRyaXg6IFNwYXJzZU1hdHJpeCwgblJvd3M6IG51bWJlciwgcHJ1bmVWYWx1ZTogbnVtYmVyXG4pOiBQcm9taXNlPFNwYXJzZU1hdHJpeD4ge1xuICBjb25zdCB3b3JrZXJzTnVtID0gTWF0aC5taW4oTWF0aC5tYXgobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgLSAyLCAxKSwgblJvd3MpO1xuXG4gIC8vIG51bWJlciBvZiBob3Jpem9udGFsIHN0cmlwcyB0aGF0IHdlIHdpbGwgZGl2aWRlIHRoZSBtYXRyaXggaW50b1xuICAvLyB3ZSBkaXZpZGUgdGhlIG1hdHJpeCBpbnRvIGhvcml6b250YWwgc3RyaXBzLCBiZWNhdXNlIGl0cyBmYXN0ZXIgZm9yIGluZGV4aW5nIGFuZCBiZXR0ZXIgZm9yIGNhY2hlXG4gIGNvbnN0IG51bU9mSG9yaXpvbnRhbFN0cmlucHMgPSB3b3JrZXJzTnVtICogNTtcblxuICBjb25zdCBpbmRleFN0YXJ0cyA9IG5ldyBVaW50MzJBcnJheShudW1PZkhvcml6b250YWxTdHJpbnBzKTtcbiAgY29uc3QgaW5kZXhFbmRzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mSG9yaXpvbnRhbFN0cmlucHMpO1xuXG4gIGNvbnN0IGJsb2NrSGVpZ2h0ID0gblJvd3MgLyBudW1PZkhvcml6b250YWxTdHJpbnBzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9mSG9yaXpvbnRhbFN0cmlucHM7IGkrKykge1xuICAgIGluZGV4U3RhcnRzW2ldID0gTWF0aC5mbG9vcihpICogYmxvY2tIZWlnaHQpO1xuICAgIGluZGV4RW5kc1tpXSA9IGkgPT09IG51bU9mSG9yaXpvbnRhbFN0cmlucHMgLSAxID8gblJvd3MgOiBNYXRoLmZsb29yKChpICsgMSkgKiBibG9ja0hlaWdodCk7XG4gIH1cblxuXG4gIGNvbnN0IHdvcmtlcnM6IFdvcmtlcltdID0gbmV3IEFycmF5KHdvcmtlcnNOdW0pLmZpbGwoMClcbiAgICAubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9tY2wtc3BhcnNlLW1hdHJpeC1tdWx0LXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcblxuXG4gIGNvbnN0IGF2YWlsYWJsZUluZGV4ZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1PZkhvcml6b250YWxTdHJpbnBzOyBpKyspXG4gICAgYXZhaWxhYmxlSW5kZXhlcy5hZGQoaSk7XG5cbiAgY29uc3QgaW5pdFByb21pc2VzID0gd29ya2Vycy5tYXAoKHdvcmtlcikgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgaXM6IHNwYXJzZU1hdHJpeC5pLFxuICAgICAgICBqczogc3BhcnNlTWF0cml4LmosXG4gICAgICAgIGRzOiBzcGFyc2VNYXRyaXguZGlzdGFuY2UsXG4gICAgICAgIG5Sb3dzLFxuICAgICAgICBwcnVuZVZhbHVlXG4gICAgICB9KTtcblxuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKGluaXRQcm9taXNlcyk7XG5cbiAgY29uc3QgcmVzOiBTcGFyc2VNYXRyaXhbXSA9IFtdO1xuXG4gIGNvbnN0IHRha2VDaHVuayA9IGFzeW5jICh3b3JrZXJJZHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHJlbGVhc2UgPSBhd2FpdCBsb2NrKCk7XG4gICAgY29uc3QgaW5kZXggPSBhdmFpbGFibGVJbmRleGVzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICBpZiAoaW5kZXggPT0gbnVsbCkge1xuICAgICAgcmVsZWFzZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhdmFpbGFibGVJbmRleGVzLmRlbGV0ZShpbmRleCk7XG4gICAgcmVsZWFzZSgpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB3b3JrZXJzW3dvcmtlcklkeF0ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBibG9ja1N0YXJ0OiBpbmRleFN0YXJ0c1tpbmRleF0sXG4gICAgICAgIGJsb2NrRW5kOiBpbmRleEVuZHNbaW5kZXhdLFxuICAgICAgICB3b3JrZXJJZHhcbiAgICAgIH0pO1xuXG4gICAgICB3b3JrZXJzW3dvcmtlcklkeF0ub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgICAgcmVzLnB1c2goZS5kYXRhKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBhd2FpdCB0YWtlQ2h1bmsod29ya2VySWR4KTtcbiAgfTtcblxuXG4gIGNvbnN0IHByb21pc2VzID0gd29ya2Vycy5tYXAoKF93b3JrZXIsIGkpID0+IHtcbiAgICByZXR1cm4gdGFrZUNodW5rKGkpO1xuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB3b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gd29ya2VyLnRlcm1pbmF0ZSgpKTtcblxuXG4gIGxldCB0b3RMZW4gPSAwO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVzKVxuICAgIHRvdExlbiArPSByLmkubGVuZ3RoO1xuXG4gIGNvbnN0IGkgPSBuZXcgVWludDMyQXJyYXkodG90TGVuKTtcbiAgY29uc3QgaiA9IG5ldyBVaW50MzJBcnJheSh0b3RMZW4pO1xuICBjb25zdCBkID0gbmV3IEZsb2F0MzJBcnJheSh0b3RMZW4pO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCByIG9mIHJlcykge1xuICAgIGkuc2V0KHIuaSwgb2Zmc2V0KTtcbiAgICBqLnNldChyLmosIG9mZnNldCk7XG4gICAgZC5zZXQoci5kaXN0YW5jZSwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gci5pLmxlbmd0aDtcbiAgfVxuXG4gIC8vIGRvbid0IGZvcmdldCB0byBnZXQgdGhlIHVwZGF0ZWQgdmFsdWVzIGZvciB0aGUgZGlhZ29uYWwsIHRoZWlyIHJvd3MgbmVlZCB0byBiZSBiYXNpY2FsbHkgc3F1YXJlZCBhbmQgc3VtbWVkXG4gIC8vIGFsc28sIHRoZSBkaWFnb25hbCB2YWx1ZXMgYXJlIG5vdCBwcnVuZWRcblxuICByZXR1cm4ge2ksIGosIGRpc3RhbmNlOiBkfTtcbn1cbiJdfQ==","import { multSparseMatrix } from './mcl-sparse-matrix-mult';\nexport function prune(sparseMatrix, pruneValue) {\n const is = [];\n const js = [];\n const ds = [];\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n if (sparseMatrix.distance[i] > pruneValue) {\n is.push(sparseMatrix.i[i]);\n js.push(sparseMatrix.j[i]);\n ds.push(sparseMatrix.distance[i]);\n }\n }\n return { i: new Uint32Array(is), j: new Uint32Array(js), distance: new Float32Array(ds) };\n}\nexport function mclInflate(sparseMatrix, pow) {\n const d = sparseMatrix.distance;\n for (let i = 0; i < sparseMatrix.i.length; i++)\n d[i] = Math.pow(d[i], pow);\n return sparseMatrix;\n}\nexport function colwiseNormilize(sparseMatrix, nRows, pruneValue, doPrune) {\n if (doPrune)\n sparseMatrix = prune(sparseMatrix, pruneValue);\n const colSums = new Float32Array(nRows);\n const d = sparseMatrix.distance;\n const js = sparseMatrix.j;\n for (let i = 0; i < sparseMatrix.i.length; i++)\n colSums[js[i]] += d[i];\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const sum = colSums[js[i]];\n if (sum !== 0)\n d[i] /= sum;\n }\n return sparseMatrix;\n}\nexport function initMCLMatrix(sparseMatrix, nRows, pruneValue) {\n // here we get sparse matrix that is only a half of the matrix\n // also, the matrix contains distances, need to convert those into similarities\n // also, we need to add self loops\n const is = new Uint32Array(sparseMatrix.i.length * 2 + nRows);\n const js = new Uint32Array(sparseMatrix.j.length * 2 + nRows);\n const ds = new Float32Array(sparseMatrix.distance.length * 2 + nRows);\n for (let i = 0; i < nRows; i++) {\n is[i] = i;\n js[i] = i;\n ds[i] = 1;\n }\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const start = i * 2 + nRows;\n is[start] = sparseMatrix.i[i];\n js[start] = sparseMatrix.j[i];\n ds[start] = 1 - sparseMatrix.distance[i];\n is[start + 1] = sparseMatrix.j[i];\n js[start + 1] = sparseMatrix.i[i];\n ds[start + 1] = 1 - sparseMatrix.distance[i];\n }\n // normalize\n colwiseNormilize({ i: is, j: js, distance: ds }, nRows, pruneValue, false);\n return { i: is, j: js, distance: ds };\n}\nexport async function runMarkovClustering(sparseMatrix, nRows, inflate, maxIter, pruneValue) {\n let matrix = initMCLMatrix(sparseMatrix, nRows, pruneValue);\n for (let i = 0; i < maxIter; i++) {\n matrix = await multSparseMatrix(matrix, nRows, pruneValue);\n // console.time('inflate');\n //@ts-ignore\n matrix = colwiseNormilize(matrix, nRows, pruneValue, false);\n matrix = mclInflate(matrix, inflate);\n //@ts-ignore\n matrix = colwiseNormilize(matrix, nRows, pruneValue, true);\n console.log('MCL iteration', i);\n }\n return matrix;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcmluZy1zdGVwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsdXN0ZXJpbmctc3RlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxZQUEwQixFQUFFLFVBQWtCO0lBQ2xFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNkLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNkLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQy9DLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQzFGLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLFlBQTBCLEVBQUUsR0FBVztJQUNoRSxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFD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RyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJDLFlBQVk7UUFDWixNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NwYXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoJztcbmltcG9ydCB7bXVsdFNwYXJzZU1hdHJpeH0gZnJvbSAnLi9tY2wtc3BhcnNlLW1hdHJpeC1tdWx0JztcblxuZXhwb3J0IGZ1bmN0aW9uIHBydW5lKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBwcnVuZVZhbHVlOiBudW1iZXIpOiBTcGFyc2VNYXRyaXgge1xuICBjb25zdCBpcyA9IFtdO1xuICBjb25zdCBqcyA9IFtdO1xuICBjb25zdCBkcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXSA+IHBydW5lVmFsdWUpIHtcbiAgICAgIGlzLnB1c2goc3BhcnNlTWF0cml4LmlbaV0pO1xuICAgICAganMucHVzaChzcGFyc2VNYXRyaXgualtpXSk7XG4gICAgICBkcy5wdXNoKHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7aTogbmV3IFVpbnQzMkFycmF5KGlzKSwgajogbmV3IFVpbnQzMkFycmF5KGpzKSwgZGlzdGFuY2U6IG5ldyBGbG9hdDMyQXJyYXkoZHMpfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jbEluZmxhdGUoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIHBvdzogbnVtYmVyKSB7XG4gIGNvbnN0IGQgPSBzcGFyc2VNYXRyaXguZGlzdGFuY2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspXG4gICAgZFtpXSA9IE1hdGgucG93KGRbaV0sIHBvdyk7XG5cbiAgcmV0dXJuIHNwYXJzZU1hdHJpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbHdpc2VOb3JtaWxpemUoXG4gIHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBuUm93czogbnVtYmVyLCBwcnVuZVZhbHVlOiBudW1iZXIsIGRvUHJ1bmU/OiBib29sZWFuXG4pOiBTcGFyc2VNYXRyaXgge1xuICBpZiAoZG9QcnVuZSlcbiAgICBzcGFyc2VNYXRyaXggPSBwcnVuZShzcGFyc2VNYXRyaXgsIHBydW5lVmFsdWUpO1xuXG4gIGNvbnN0IGNvbFN1bXMgPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKTtcbiAgY29uc3QgZCA9IHNwYXJzZU1hdHJpeC5kaXN0YW5jZTtcbiAgY29uc3QganMgPSBzcGFyc2VNYXRyaXguajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKylcbiAgICBjb2xTdW1zW2pzW2ldXSArPSBkW2ldO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdW0gPSBjb2xTdW1zW2pzW2ldXTtcbiAgICBpZiAoc3VtICE9PSAwKVxuICAgICAgZFtpXSAvPSBzdW07XG4gIH1cbiAgcmV0dXJuIHNwYXJzZU1hdHJpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRNQ0xNYXRyaXgoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIG5Sb3dzOiBudW1iZXIsIHBydW5lVmFsdWU6IG51bWJlcik6IFNwYXJzZU1hdHJpeCB7XG4gIC8vIGhlcmUgd2UgZ2V0IHNwYXJzZSBtYXRyaXggdGhhdCBpcyBvbmx5IGEgaGFsZiBvZiB0aGUgbWF0cml4XG4gIC8vIGFsc28sIHRoZSBtYXRyaXggY29udGFpbnMgZGlzdGFuY2VzLCBuZWVkIHRvIGNvbnZlcnQgdGhvc2UgaW50byBzaW1pbGFyaXRpZXNcbiAgLy8gYWxzbywgd2UgbmVlZCB0byBhZGQgc2VsZiBsb29wc1xuICBjb25zdCBpcyA9IG5ldyBVaW50MzJBcnJheShzcGFyc2VNYXRyaXguaS5sZW5ndGggKiAyICsgblJvd3MpO1xuICBjb25zdCBqcyA9IG5ldyBVaW50MzJBcnJheShzcGFyc2VNYXRyaXguai5sZW5ndGggKiAyICsgblJvd3MpO1xuICBjb25zdCBkcyA9IG5ldyBGbG9hdDMyQXJyYXkoc3BhcnNlTWF0cml4LmRpc3RhbmNlLmxlbmd0aCAqIDIgKyBuUm93cyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgIGlzW2ldID0gaTtcbiAgICBqc1tpXSA9IGk7XG4gICAgZHNbaV0gPSAxO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFydCA9IGkgKiAyICsgblJvd3M7XG4gICAgaXNbc3RhcnRdID0gc3BhcnNlTWF0cml4LmlbaV07XG4gICAganNbc3RhcnRdID0gc3BhcnNlTWF0cml4LmpbaV07XG4gICAgZHNbc3RhcnRdID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcblxuICAgIGlzW3N0YXJ0ICsgMV0gPSBzcGFyc2VNYXRyaXgualtpXTtcbiAgICBqc1tzdGFydCArIDFdID0gc3BhcnNlTWF0cml4LmlbaV07XG4gICAgZHNbc3RhcnQgKyAxXSA9IDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV07XG4gIH1cblxuICAvLyBub3JtYWxpemVcbiAgY29sd2lzZU5vcm1pbGl6ZSh7aTogaXMsIGo6IGpzLCBkaXN0YW5jZTogZHN9LCBuUm93cywgcHJ1bmVWYWx1ZSwgZmFsc2UpO1xuXG4gIHJldHVybiB7aTogaXMsIGo6IGpzLCBkaXN0YW5jZTogZHN9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWFya292Q2x1c3RlcmluZyhcbiAgc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIG5Sb3dzOiBudW1iZXIsIGluZmxhdGU6IG51bWJlciwgbWF4SXRlcjogbnVtYmVyLCBwcnVuZVZhbHVlOiBudW1iZXJcbikge1xuICBsZXQgbWF0cml4ID0gaW5pdE1DTE1hdHJpeChzcGFyc2VNYXRyaXgsIG5Sb3dzLCBwcnVuZVZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhJdGVyOyBpKyspIHtcbiAgICBtYXRyaXggPSBhd2FpdCBtdWx0U3BhcnNlTWF0cml4KG1hdHJpeCwgblJvd3MsIHBydW5lVmFsdWUpO1xuICAgIC8vIGNvbnNvbGUudGltZSgnaW5mbGF0ZScpO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIG1hdHJpeCA9IGNvbHdpc2VOb3JtaWxpemUobWF0cml4LCBuUm93cywgcHJ1bmVWYWx1ZSwgZmFsc2UpO1xuICAgIG1hdHJpeCA9IG1jbEluZmxhdGUobWF0cml4LCBpbmZsYXRlKTtcblxuICAgIC8vQHRzLWlnbm9yZVxuICAgIG1hdHJpeCA9IGNvbHdpc2VOb3JtaWxpemUobWF0cml4LCBuUm93cywgcHJ1bmVWYWx1ZSwgdHJ1ZSk7XG4gICAgY29uc29sZS5sb2coJ01DTCBpdGVyYXRpb24nLCBpKTtcbiAgfVxuXG4gIHJldHVybiBtYXRyaXg7XG59XG4iXX0=","/* eslint-disable max-len */\nimport Graph from 'graphology';\nimport forceAtlas2 from 'graphology-layout-forceatlas2';\n// note: subCluster is of size nRows and contains for each point which subcluster it belongs to\n// note: cluster is of size of this concrete supercluster, and contains the indexes of the points in that supercluster\nexport function getWebColaLayot(cluster, clusterConnections, _subCluster) {\n const graph = new Graph();\n for (let i = 0; i < cluster.length; i++)\n graph.addNode(cluster[i], { x: Math.random() * 20000, y: Math.random() * 20000 });\n for (let it = 0; it < clusterConnections.i.length; it++) {\n const i = clusterConnections.i[it];\n const j = clusterConnections.j[it];\n const v = clusterConnections.v[it];\n if (i === j || v <= 0)\n continue;\n const weight = _subCluster[i] === _subCluster[j] ? 2 : 1;\n graph.addEdge(i, j, { weight: v * weight });\n }\n const settings = {\n iterations: 100,\n // edgeWeightInfluence: 1, // Influence of edge weights on the layout\n // scalingRatio: 1, // Scaling ratio to account for node sizes\n // //barnesHutOptimize: true,\n // //barnesHutTheta: 0.5,\n // adjustSizes: true,\n // weighted: true,\n // strongGravityMode: true,\n getEdgeWeight: 'weight',\n settings: { ...forceAtlas2.inferSettings(graph), weighted: true, edgeWeightInfluence: 1 }\n };\n forceAtlas2.assign(graph, settings);\n const embedX1 = new Float32Array(cluster.length);\n const embedY1 = new Float32Array(cluster.length);\n for (let i = 0; i < cluster.length; i++) {\n const node = graph.getNodeAttributes(cluster[i]);\n embedX1[i] = node.x;\n embedY1[i] = node.y;\n }\n let minX = embedX1[0];\n let minY = embedY1[0];\n let maxX = embedX1[0];\n let maxY = embedY1[0];\n for (let i = 1; i < cluster.length; i++) {\n minX = Math.min(minX, embedX1[i]);\n minY = Math.min(minY, embedY1[i]);\n maxX = Math.max(maxX, embedX1[i]);\n maxY = Math.max(maxY, embedY1[i]);\n }\n let scaleX = maxX - minX;\n let scaleY = maxY - minY;\n if (scaleX === 0)\n scaleX = 1;\n if (scaleY === 0)\n scaleY = 1;\n for (let i = 0; i < cluster.length; i++) {\n embedX1[i] = (embedX1[i] - minX) / scaleX;\n embedY1[i] = (embedY1[i] - minY) / scaleY;\n }\n return { embedX: embedX1, embedY: embedY1 };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViQ29sYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYkNvbGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEJBQTRCO0FBRTVCLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RCwrRkFBK0Y7QUFDL0Ysc0hBQXNIO0FBQ3RILE1BQU0sVUFBVSxlQUFlLENBQzdCLE9BQWlCLEVBQUUsa0JBQTJELEVBQUUsV0FBcUI7SUFLckcsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDckMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBQyxDQUFDLENBQUM7SUFFbEYsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4RCxNQUFNLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkIsU0FBUztRQUNYLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FB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R0FBRyxNQUFNLENBQUM7UUFDMUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbmltcG9ydCBHcmFwaCBmcm9tICdncmFwaG9sb2d5JztcbmltcG9ydCBmb3JjZUF0bGFzMiBmcm9tICdncmFwaG9sb2d5LWxheW91dC1mb3JjZWF0bGFzMic7XG5cbi8vIG5vdGU6IHN1YkNsdXN0ZXIgaXMgb2Ygc2l6ZSBuUm93cyBhbmQgY29udGFpbnMgZm9yIGVhY2ggcG9pbnQgd2hpY2ggc3ViY2x1c3RlciBpdCBiZWxvbmdzIHRvXG4vLyBub3RlOiBjbHVzdGVyIGlzIG9mIHNpemUgb2YgdGhpcyBjb25jcmV0ZSBzdXBlcmNsdXN0ZXIsIGFuZCBjb250YWlucyB0aGUgaW5kZXhlcyBvZiB0aGUgcG9pbnRzIGluIHRoYXQgc3VwZXJjbHVzdGVyXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViQ29sYUxheW90KFxuICBjbHVzdGVyOiBudW1iZXJbXSwgY2x1c3RlckNvbm5lY3Rpb25zOiB7aTogbnVtYmVyW10sIGo6IG51bWJlcltdLCB2OiBudW1iZXJbXX0sIF9zdWJDbHVzdGVyOiBudW1iZXJbXVxuKToge1xuICAgIGVtYmVkWDogRmxvYXQzMkFycmF5O1xuICAgIGVtYmVkWTogRmxvYXQzMkFycmF5O1xufSB7XG4gIGNvbnN0IGdyYXBoID0gbmV3IEdyYXBoKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3Rlci5sZW5ndGg7IGkrKylcbiAgICBncmFwaC5hZGROb2RlKGNsdXN0ZXJbaV0sIHt4OiBNYXRoLnJhbmRvbSgpICogMjAwMDAsIHk6IE1hdGgucmFuZG9tKCkgKiAyMDAwMH0pO1xuXG4gIGZvciAobGV0IGl0ID0gMDsgaXQgPCBjbHVzdGVyQ29ubmVjdGlvbnMuaS5sZW5ndGg7IGl0KyspIHtcbiAgICBjb25zdCBpID0gY2x1c3RlckNvbm5lY3Rpb25zLmlbaXRdO1xuICAgIGNvbnN0IGogPSBjbHVzdGVyQ29ubmVjdGlvbnMualtpdF07XG4gICAgY29uc3QgdiA9IGNsdXN0ZXJDb25uZWN0aW9ucy52W2l0XTtcbiAgICBpZiAoaSA9PT0gaiB8fCB2IDw9IDApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCB3ZWlnaHQgPSBfc3ViQ2x1c3RlcltpXSA9PT0gX3N1YkNsdXN0ZXJbal0gPyAyIDogMTtcbiAgICBncmFwaC5hZGRFZGdlKGksIGosIHt3ZWlnaHQ6IHYgKiB3ZWlnaHR9KTtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0ge1xuICAgIGl0ZXJhdGlvbnM6IDEwMCxcbiAgICAvLyBlZGdlV2VpZ2h0SW5mbHVlbmNlOiAxLCAvLyBJbmZsdWVuY2Ugb2YgZWRnZSB3ZWlnaHRzIG9uIHRoZSBsYXlvdXRcbiAgICAvLyBzY2FsaW5nUmF0aW86IDEsIC8vIFNjYWxpbmcgcmF0aW8gdG8gYWNjb3VudCBmb3Igbm9kZSBzaXplc1xuICAgIC8vIC8vYmFybmVzSHV0T3B0aW1pemU6IHRydWUsXG4gICAgLy8gLy9iYXJuZXNIdXRUaGV0YTogMC41LFxuICAgIC8vIGFkanVzdFNpemVzOiB0cnVlLFxuICAgIC8vIHdlaWdodGVkOiB0cnVlLFxuICAgIC8vIHN0cm9uZ0dyYXZpdHlNb2RlOiB0cnVlLFxuICAgIGdldEVkZ2VXZWlnaHQ6ICd3ZWlnaHQnLFxuICAgIHNldHRpbmdzOiB7Li4uZm9yY2VBdGxhczIuaW5mZXJTZXR0aW5ncyhncmFwaCksIHdlaWdodGVkOiB0cnVlLCBlZGdlV2VpZ2h0SW5mbHVlbmNlOiAxfVxuICB9O1xuICBmb3JjZUF0bGFzMi5hc3NpZ24oZ3JhcGgsIHNldHRpbmdzKTtcblxuICBjb25zdCBlbWJlZFgxID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCk7XG4gIGNvbnN0IGVtYmVkWTEgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IGdyYXBoLmdldE5vZGVBdHRyaWJ1dGVzKGNsdXN0ZXJbaV0pO1xuICAgIGVtYmVkWDFbaV0gPSBub2RlLng7XG4gICAgZW1iZWRZMVtpXSA9IG5vZGUueTtcbiAgfVxuXG4gIGxldCBtaW5YID0gZW1iZWRYMVswXTtcbiAgbGV0IG1pblkgPSBlbWJlZFkxWzBdO1xuICBsZXQgbWF4WCA9IGVtYmVkWDFbMF07XG4gIGxldCBtYXhZID0gZW1iZWRZMVswXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIGVtYmVkWDFbaV0pO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBlbWJlZFkxW2ldKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgZW1iZWRYMVtpXSk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGVtYmVkWTFbaV0pO1xuICB9XG4gIGxldCBzY2FsZVggPSBtYXhYIC0gbWluWDtcbiAgbGV0IHNjYWxlWSA9IG1heFkgLSBtaW5ZO1xuICBpZiAoc2NhbGVYID09PSAwKVxuICAgIHNjYWxlWCA9IDE7XG4gIGlmIChzY2FsZVkgPT09IDApXG4gICAgc2NhbGVZID0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgZW1iZWRYMVtpXSA9IChlbWJlZFgxW2ldIC0gbWluWCkgLyBzY2FsZVg7XG4gICAgZW1iZWRZMVtpXSA9IChlbWJlZFkxW2ldIC0gbWluWSkgLyBzY2FsZVk7XG4gIH1cblxuICByZXR1cm4ge2VtYmVkWDogZW1iZWRYMSwgZW1iZWRZOiBlbWJlZFkxfTtcbn1cbiJdfQ==","import { runMarkovClustering } from './clustering-steps';\nimport { getWebColaLayot } from './webCola';\nexport const defaultMCLOptions = {\n expandFactor: 2,\n maxIterations: 5,\n inflateFactor: 2,\n multFactor: 1,\n pruneValue: 1e-17,\n};\nexport class MCLSparseReducer {\n constructor(opts = {}) {\n this._options = { ...defaultMCLOptions, ...opts };\n }\n async transform(sparseMatrix, nRows) {\n // get the superClusters before the MCL\n // this will be used for layouting\n const superClusters = this.assignClusters(sparseMatrix, nRows);\n this.correctClusters(superClusters.clusters);\n // before beggining the mcl, we need to save the connections between original points,\n // as MCL might mutate the matrix\n const clusterConnectionMap = this.splitConnectionsIntoClusters(sparseMatrix, superClusters.clusters);\n // perform the MCL\n const mclMatrix = await runMarkovClustering(sparseMatrix, nRows, this._options.inflateFactor, this._options.maxIterations, this._options.pruneValue);\n const { clusters } = this.assignClusters(mclMatrix, nRows);\n this.correctClusters(clusters);\n const embeddings = this.layout(superClusters.clusters, clusterConnectionMap, nRows, clusters);\n return { clusters, embedX: embeddings.embedX, embedY: embeddings.embedY, is: sparseMatrix.i, js: sparseMatrix.j };\n }\n async transformWebGPU(sparseMatrix, nRows) {\n // TODO: implement correct webGPU version\n return this.transform(sparseMatrix, nRows);\n }\n // here as we operate on original sparse matrix, we know for sure that there are no duplicates or self loops\n splitConnectionsIntoClusters(sparseMatrix, clusters) {\n const clusterConnections = new Map();\n for (let i = 0; i < clusters.length; i++) {\n if (!clusterConnections.has(clusters[i]))\n clusterConnections.set(clusters[i], { i: [], j: [], v: [] });\n }\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const cluster = clusters[sparseMatrix.i[i]];\n const cc = clusterConnections.get(cluster);\n cc.i.push(sparseMatrix.i[i]);\n cc.j.push(sparseMatrix.j[i]);\n cc.v.push(1 - sparseMatrix.distance[i]);\n }\n return clusterConnections;\n }\n assignClusters(sparseMatrix, nRows) {\n let clusterNum = 0;\n const is = [];\n const js = [];\n // array containing for each point which cluster it belongs to\n const clusters = new Array(nRows).fill(-1);\n for (let it = 0; it < sparseMatrix.i.length; it++) {\n const i = sparseMatrix.i[it];\n const j = sparseMatrix.j[it];\n if (i === j)\n continue;\n is.push(i);\n js.push(j);\n if (clusters[i] !== -1 && clusters[j] !== -1) {\n if (clusters[i] !== clusters[j])\n this.mergeClusters(clusters, i, j);\n }\n else if (clusters[i] !== -1) {\n clusters[j] = clusters[i];\n }\n else if (clusters[j] !== -1) {\n clusters[i] = clusters[j];\n }\n else {\n clusterNum++;\n clusters[i] = clusterNum;\n clusters[j] = clusterNum;\n }\n }\n // final step for the clusters that are not connected to anything\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: new Uint32Array(is), js: new Uint32Array(js) };\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 /** After assigning and merging, clusters will need reordering according to size */\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[b] - clusterSizeMap[a]);\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 }\n /** notice that here, first argument is the superclusters and last is the subClusters\n * the second argument is the original sparse matrix, and the third is the number of rows\n */\n layout(clusters, clusterConnectionMap, nRows, subCluster) {\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 // split sparse matrix connections into super-clusters, save only indexes\n let clusterNum = 0;\n const sortedClusterNames = Object.keys(clusterMap);\n sortedClusterNames.sort((a, b) => clusterMap[b].length - clusterMap[a].length);\n let perRow = 1;\n const perRowMultiplier = 3;\n let yOffset = 0;\n const layoutSize = 5;\n // cluster sizes could be different, but also very similar. first cluster size can be quite similar\n // to the second one. if not accounted for, the layout will be very unbalanced, and first cluster will\n // be very large\n const perRowSizes = [1];\n // if first two cluster sizes are very similar, first perrow should be 2\n if (sortedClusterNames.length > 1) {\n const clustSize1 = clusterMap[sortedClusterNames[0]].length;\n const clustSize2 = clusterMap[sortedClusterNames[1]].length;\n if (clustSize1 / clustSize2 < 2)\n perRowSizes[0] = 2;\n let curPerRowSize = perRowSizes[0];\n let maxClustersInNextRow = curPerRowSize * perRowMultiplier;\n let pointsInCurRow = curPerRowSize == 1 ? clustSize1 : clustSize1 + clustSize2;\n let pointsAccum = 0;\n let clustersAccum = 0;\n for (let i = 2; i < sortedClusterNames.length; i++) {\n pointsAccum += clusterMap[sortedClusterNames[i]].length;\n clustersAccum++;\n if (clustersAccum > maxClustersInNextRow || pointsAccum >= pointsInCurRow * 0.7 || i === sortedClusterNames.length - 1) {\n perRowSizes.push(i === sortedClusterNames.length - 1 ? maxClustersInNextRow : clustersAccum);\n curPerRowSize = clustersAccum;\n maxClustersInNextRow = curPerRowSize * perRowMultiplier;\n pointsInCurRow = Math.max(pointsAccum, pointsInCurRow);\n pointsAccum = 0;\n clustersAccum = 0;\n }\n }\n }\n perRow = perRowSizes[0];\n let perRowIdx = 0;\n for (const clusterName of sortedClusterNames) {\n const cluster = clusterMap[clusterName];\n const clusterConnections = clusterConnectionMap.get(Number(clusterName));\n const embeddings = getWebColaLayot(cluster, clusterConnections, subCluster);\n if (clusterNum === perRow) {\n clusterNum = 0;\n yOffset += layoutSize / perRow;\n perRowIdx++;\n perRow = Math.min(Math.ceil(perRowSizes[perRowIdx]), 45);\n }\n //const clustersPerRow = Math.ceil(perRow / 1.5);\n const offsetX = ((clusterNum) * layoutSize / perRow + layoutSize / perRow * (1 / 1.2 / 4));\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 / 1.2 + offsetX;\n embedY[cluster[i]] = embeddings.embedY[i] * layoutSize / perRow / 1.2 + yOffset;\n }\n clusterNum++;\n }\n return { embedX, embedY };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya292LWNsdXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXJrb3YtY2x1c3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRTFDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFlO0lBQzNDLFlBQVksRUFBRSxDQUFDO0lBQ2YsYUFBYSxFQUFFLENBQUM7SUFDaEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsVUFBVSxFQUFFLENBQUM7SUFDYixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDO0FBRUYsTUFBTSxPQUFPLGdCQUFnQjtJQUd6QixZQUFZLE9BQTRCLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFDLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLEVBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUEwQixFQUFFLEtBQWE7UUFDOUQsdUNBQXVDO1FBQ3ZDLGtDQUFrQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxxRkFBcUY7UUFDckYsaUNBQWlDO1FBQ2pDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckcsa0JBQWtCO1FBQ2xCLE1BQU0sU0FBUyxHQUFHLE1BQU0sbUJBQW1CLENBQ3pDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFB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YXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoJztcbmltcG9ydCB7TUNMT3B0aW9uc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3J1bk1hcmtvdkNsdXN0ZXJpbmd9IGZyb20gJy4vY2x1c3RlcmluZy1zdGVwcyc7XG5cbmltcG9ydCB7Z2V0V2ViQ29sYUxheW90fSBmcm9tICcuL3dlYkNvbGEnO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1DTE9wdGlvbnM6IE1DTE9wdGlvbnMgPSB7XG4gIGV4cGFuZEZhY3RvcjogMixcbiAgbWF4SXRlcmF0aW9uczogNSxcbiAgaW5mbGF0ZUZhY3RvcjogMixcbiAgbXVsdEZhY3RvcjogMSxcbiAgcHJ1bmVWYWx1ZTogMWUtMTcsXG59O1xuXG5leHBvcnQgY2xhc3MgTUNMU3BhcnNlUmVkdWNlciB7XG4gICAgcHJpdmF0ZSBfb3B0aW9uczogTUNMT3B0aW9ucztcblxuICAgIGNvbnN0cnVjdG9yKG9wdHM6IFBhcnRpYWw8TUNMT3B0aW9ucz4gPSB7fSkge1xuICAgICAgdGhpcy5fb3B0aW9ucyA9IHsuLi5kZWZhdWx0TUNMT3B0aW9ucywgLi4ub3B0c307XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRyYW5zZm9ybShzcGFyc2VNYXRyaXg6IFNwYXJzZU1hdHJpeCwgblJvd3M6IG51bWJlcikge1xuICAgICAgLy8gZ2V0IHRoZSBzdXBlckNsdXN0ZXJzIGJlZm9yZSB0aGUgTUNMXG4gICAgICAvLyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgbGF5b3V0aW5nXG4gICAgICBjb25zdCBzdXBlckNsdXN0ZXJzID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VNYXRyaXgsIG5Sb3dzKTtcbiAgICAgIHRoaXMuY29ycmVjdENsdXN0ZXJzKHN1cGVyQ2x1c3RlcnMuY2x1c3RlcnMpO1xuICAgICAgLy8gYmVmb3JlIGJlZ2dpbmluZyB0aGUgbWNsLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gb3JpZ2luYWwgcG9pbnRzLFxuICAgICAgLy8gYXMgTUNMIG1pZ2h0IG11dGF0ZSB0aGUgbWF0cml4XG4gICAgICBjb25zdCBjbHVzdGVyQ29ubmVjdGlvbk1hcCA9IHRoaXMuc3BsaXRDb25uZWN0aW9uc0ludG9DbHVzdGVycyhzcGFyc2VNYXRyaXgsIHN1cGVyQ2x1c3RlcnMuY2x1c3RlcnMpO1xuICAgICAgLy8gcGVyZm9ybSB0aGUgTUNMXG4gICAgICBjb25zdCBtY2xNYXRyaXggPSBhd2FpdCBydW5NYXJrb3ZDbHVzdGVyaW5nKFxuICAgICAgICBzcGFyc2VNYXRyaXgsIG5Sb3dzLCB0aGlzLl9vcHRpb25zLmluZmxhdGVGYWN0b3IsIHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucywgdGhpcy5fb3B0aW9ucy5wcnVuZVZhbHVlKTtcbiAgICAgIGNvbnN0IHtjbHVzdGVyc30gPSB0aGlzLmFzc2lnbkNsdXN0ZXJzKG1jbE1hdHJpeCwgblJvd3MpO1xuICAgICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IHRoaXMubGF5b3V0KHN1cGVyQ2x1c3RlcnMuY2x1c3RlcnMsIGNsdXN0ZXJDb25uZWN0aW9uTWFwLCBuUm93cywgY2x1c3RlcnMpO1xuICAgICAgcmV0dXJuIHtjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXM6IHNwYXJzZU1hdHJpeC5pLCBqczogc3BhcnNlTWF0cml4Lmp9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm1XZWJHUFUoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICAgIC8vIFRPRE86IGltcGxlbWVudCBjb3JyZWN0IHdlYkdQVSB2ZXJzaW9uXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oc3BhcnNlTWF0cml4LCBuUm93cyk7XG4gICAgfVxuXG4gICAgLy8gaGVyZSBhcyB3ZSBvcGVyYXRlIG9uIG9yaWdpbmFsIHNwYXJzZSBtYXRyaXgsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcyBvciBzZWxmIGxvb3BzXG4gICAgcHJpdmF0ZSBzcGxpdENvbm5lY3Rpb25zSW50b0NsdXN0ZXJzKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBjbHVzdGVyczogbnVtYmVyW10pIHtcbiAgICAgIGNvbnN0IGNsdXN0ZXJDb25uZWN0aW9ucyA9IG5ldyBNYXA8bnVtYmVyLCB7aTogbnVtYmVyW10sIGo6IG51bWJlcltdLCB2OiBudW1iZXJbXX0+KCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghY2x1c3RlckNvbm5lY3Rpb25zLmhhcyhjbHVzdGVyc1tpXSkpXG4gICAgICAgICAgY2x1c3RlckNvbm5lY3Rpb25zLnNldChjbHVzdGVyc1tpXSwge2k6IFtdLCBqOiBbXSwgdjogW119KTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJzW3NwYXJzZU1hdHJpeC5pW2ldXTtcbiAgICAgICAgY29uc3QgY2MgPSBjbHVzdGVyQ29ubmVjdGlvbnMuZ2V0KGNsdXN0ZXIpITtcbiAgICAgICAgY2MuaS5wdXNoKHNwYXJzZU1hdHJpeC5pW2ldKTtcbiAgICAgICAgY2Muai5wdXNoKHNwYXJzZU1hdHJpeC5qW2ldKTtcbiAgICAgICAgY2Mudi5wdXNoKDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsdXN0ZXJDb25uZWN0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzc2lnbkNsdXN0ZXJzKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBuUm93czogbnVtYmVyKSB7XG4gICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICBjb25zdCBpczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGpzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgLy8gYXJyYXkgY29udGFpbmluZyBmb3IgZWFjaCBwb2ludCB3aGljaCBjbHVzdGVyIGl0IGJlbG9uZ3MgdG9cbiAgICAgIGNvbnN0IGNsdXN0ZXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheShuUm93cykuZmlsbCgtMSk7XG4gICAgICBmb3IgKGxldCBpdCA9IDA7IGl0IDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpdCsrKSB7XG4gICAgICAgIGNvbnN0IGkgPSBzcGFyc2VNYXRyaXguaVtpdF07XG4gICAgICAgIGNvbnN0IGogPSBzcGFyc2VNYXRyaXgualtpdF07XG4gICAgICAgIGlmIChpID09PSBqKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpcy5wdXNoKGkpO1xuICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IC0xICYmIGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgIGlmIChjbHVzdGVyc1tpXSAhPT0gY2x1c3RlcnNbal0pXG4gICAgICAgICAgICB0aGlzLm1lcmdlQ2x1c3RlcnMoY2x1c3RlcnMsIGksIGopO1xuICAgICAgICB9IGVsc2UgaWYgKGNsdXN0ZXJzW2ldICE9PSAtMSkge1xuICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3RlcnNbaV07XG4gICAgICAgIH0gZWxzZSBpZiAoY2x1c3RlcnNbal0gIT09IC0xKSB7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyc1tqXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3Rlck51bTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaW5hbCBzdGVwIGZvciB0aGUgY2x1c3RlcnMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB0byBhbnl0aGluZ1xuICAgICAgZm9yIChsZXQgaT0wOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICAgIGNsdXN0ZXJOdW0gKys7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge2NsdXN0ZXJzLCBpczogbmV3IFVpbnQzMkFycmF5KGlzKSwganM6IG5ldyBVaW50MzJBcnJheShqcyl9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVyZ2VDbHVzdGVycyhjbHVzdGVyczogbnVtYmVyW10sIGk6IG51bWJlciwgajogbnVtYmVyKSB7XG4gICAgICBjb25zdCBpQ2x1c3RlciA9IGNsdXN0ZXJzW2ldO1xuICAgICAgY29uc3QgakNsdXN0ZXIgPSBjbHVzdGVyc1tqXTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY2x1c3RlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKGNsdXN0ZXJzW2tdID09PSBqQ2x1c3RlcilcbiAgICAgICAgICBjbHVzdGVyc1trXSA9IGlDbHVzdGVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZnRlciBhc3NpZ25pbmcgYW5kIG1lcmdpbmcsIGNsdXN0ZXJzIHdpbGwgbmVlZCByZW9yZGVyaW5nIGFjY29yZGluZyB0byBzaXplICovXG4gICAgcHJpdmF0ZSBjb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnM6IG51bWJlcltdKSB7XG4gICAgICBjb25zdCBjbHVzdGVyU2l6ZU1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgICAgaWYgKCFjbHVzdGVyU2l6ZU1hcFtjbHVzdGVyXSlcbiAgICAgICAgICBjbHVzdGVyU2l6ZU1hcFtjbHVzdGVyXSA9IDA7XG4gICAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKys7XG4gICAgICB9XG4gICAgICBjb25zdCBzb3J0ZWRJbmRleGVzID1cbiAgICAgICAgT2JqZWN0LmtleXMoY2x1c3RlclNpemVNYXApLm1hcChOdW1iZXIpLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJTaXplTWFwW2JdIC0gY2x1c3RlclNpemVNYXBbYV0pO1xuICAgICAgY29uc3QgY2x1c3Rlck1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgICBzb3J0ZWRJbmRleGVzLmZvckVhY2goKGNsdXN0ZXJJZHgsIGkpID0+IGNsdXN0ZXJNYXBbY2x1c3RlcklkeF0gPSBpICsgMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dO1xuICAgIH1cblxuXG4gICAgLyoqIG5vdGljZSB0aGF0IGhlcmUsIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBzdXBlcmNsdXN0ZXJzIGFuZCBsYXN0IGlzIHRoZSBzdWJDbHVzdGVyc1xuICAgICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG9yaWdpbmFsIHNwYXJzZSBtYXRyaXgsIGFuZCB0aGUgdGhpcmQgaXMgdGhlIG51bWJlciBvZiByb3dzXG4gICAgICovXG4gICAgcHJpdmF0ZSBsYXlvdXQoY2x1c3RlcnM6IG51bWJlcltdLCBjbHVzdGVyQ29ubmVjdGlvbk1hcDogTWFwPG51bWJlciwge1xuICAgICAgICBpOiBudW1iZXJbXTtcbiAgICAgICAgajogbnVtYmVyW107XG4gICAgICAgIHY6IG51bWJlcltdO30+LCBuUm93czogbnVtYmVyLCBzdWJDbHVzdGVyOiBudW1iZXJbXSkge1xuICAgICAgY29uc3QgZW1iZWRYID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgICAgIGNvbnN0IGVtYmVkWSA9IG5ldyBGbG9hdDMyQXJyYXkoblJvd3MpLmZpbGwoMCk7XG4gICAgICBjb25zdCBjbHVzdGVyTWFwOiB7W186IG51bWJlcl06IG51bWJlcltdfSA9IHt9O1xuICAgICAgY2x1c3RlcnMuZm9yRWFjaCgoY2x1c3RlciwgaSkgPT4ge1xuICAgICAgICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3Rlcl0pXG4gICAgICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXSA9IFtdO1xuICAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdLnB1c2goaSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gc3BsaXQgc3BhcnNlIG1hdHJpeCBjb25uZWN0aW9ucyBpbnRvIHN1cGVyLWNsdXN0ZXJzLCBzYXZlIG9ubHkgaW5kZXhlc1xuICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgY29uc3Qgc29ydGVkQ2x1c3Rlck5hbWVzID0gT2JqZWN0LmtleXMoY2x1c3Rlck1hcCk7XG4gICAgICBzb3J0ZWRDbHVzdGVyTmFtZXMuc29ydCgoYSwgYikgPT4gY2x1c3Rlck1hcFtiIGFzIGFueV0ubGVuZ3RoIC0gY2x1c3Rlck1hcFthIGFzIGFueV0ubGVuZ3RoKTtcbiAgICAgIGxldCBwZXJSb3cgPSAxO1xuICAgICAgY29uc3QgcGVyUm93TXVsdGlwbGllciA9IDM7XG5cbiAgICAgIGxldCB5T2Zmc2V0ID0gMDtcbiAgICAgIGNvbnN0IGxheW91dFNpemUgPSA1O1xuICAgICAgLy8gY2x1c3RlciBzaXplcyBjb3VsZCBiZSBkaWZmZXJlbnQsIGJ1dCBhbHNvIHZlcnkgc2ltaWxhci4gZmlyc3QgY2x1c3RlciBzaXplIGNhbiBiZSBxdWl0ZSBzaW1pbGFyXG4gICAgICAvLyB0byB0aGUgc2Vjb25kIG9uZS4gaWYgbm90IGFjY291bnRlZCBmb3IsIHRoZSBsYXlvdXQgd2lsbCBiZSB2ZXJ5IHVuYmFsYW5jZWQsIGFuZCBmaXJzdCBjbHVzdGVyIHdpbGxcbiAgICAgIC8vIGJlIHZlcnkgbGFyZ2VcbiAgICAgIGNvbnN0IHBlclJvd1NpemVzOiBudW1iZXJbXSA9IFsxXTtcbiAgICAgIC8vIGlmIGZpcnN0IHR3byBjbHVzdGVyIHNpemVzIGFyZSB2ZXJ5IHNpbWlsYXIsIGZpcnN0IHBlcnJvdyBzaG91bGQgYmUgMlxuICAgICAgaWYgKHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGNsdXN0U2l6ZTEgPSBjbHVzdGVyTWFwW3NvcnRlZENsdXN0ZXJOYW1lc1swXSBhcyBhbnldLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY2x1c3RTaXplMiA9IGNsdXN0ZXJNYXBbc29ydGVkQ2x1c3Rlck5hbWVzWzFdIGFzIGFueV0ubGVuZ3RoO1xuICAgICAgICBpZiAoY2x1c3RTaXplMSAvIGNsdXN0U2l6ZTIgPCAyKVxuICAgICAgICAgIHBlclJvd1NpemVzWzBdID0gMjtcbiAgICAgICAgbGV0IGN1clBlclJvd1NpemUgPSBwZXJSb3dTaXplc1swXTtcbiAgICAgICAgbGV0IG1heENsdXN0ZXJzSW5OZXh0Um93ID0gY3VyUGVyUm93U2l6ZSAqIHBlclJvd011bHRpcGxpZXI7XG4gICAgICAgIGxldCBwb2ludHNJbkN1clJvdyA9IGN1clBlclJvd1NpemUgPT0gMSA/IGNsdXN0U2l6ZTEgOiBjbHVzdFNpemUxICsgY2x1c3RTaXplMjtcbiAgICAgICAgbGV0IHBvaW50c0FjY3VtID0gMDtcbiAgICAgICAgbGV0IGNsdXN0ZXJzQWNjdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHBvaW50c0FjY3VtICs9IGNsdXN0ZXJNYXBbc29ydGVkQ2x1c3Rlck5hbWVzW2ldIGFzIGFueV0ubGVuZ3RoO1xuICAgICAgICAgIGNsdXN0ZXJzQWNjdW0rKztcbiAgICAgICAgICBpZiAoY2x1c3RlcnNBY2N1bSA+IG1heENsdXN0ZXJzSW5OZXh0Um93IHx8IHBvaW50c0FjY3VtID49IHBvaW50c0luQ3VyUm93ICogMC43IHx8IGkgPT09IHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBwZXJSb3dTaXplcy5wdXNoKGkgPT09IHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGggLSAxID8gbWF4Q2x1c3RlcnNJbk5leHRSb3cgOiBjbHVzdGVyc0FjY3VtKTtcbiAgICAgICAgICAgIGN1clBlclJvd1NpemUgPSBjbHVzdGVyc0FjY3VtO1xuICAgICAgICAgICAgbWF4Q2x1c3RlcnNJbk5leHRSb3cgPSBjdXJQZXJSb3dTaXplICogcGVyUm93TXVsdGlwbGllcjtcbiAgICAgICAgICAgIHBvaW50c0luQ3VyUm93ID0gTWF0aC5tYXgocG9pbnRzQWNjdW0sIHBvaW50c0luQ3VyUm93KTtcbiAgICAgICAgICAgIHBvaW50c0FjY3VtID0gMDtcbiAgICAgICAgICAgIGNsdXN0ZXJzQWNjdW0gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGVyUm93ID0gcGVyUm93U2l6ZXNbMF07XG4gICAgICBsZXQgcGVyUm93SWR4ID0gMDtcblxuICAgICAgZm9yIChjb25zdCBjbHVzdGVyTmFtZSBvZiBzb3J0ZWRDbHVzdGVyTmFtZXMpIHtcbiAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJNYXBbY2x1c3Rlck5hbWUgYXMgYW55XSE7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJDb25uZWN0aW9ucyA9IGNsdXN0ZXJDb25uZWN0aW9uTWFwLmdldChOdW1iZXIoY2x1c3Rlck5hbWUpKSE7XG4gICAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBnZXRXZWJDb2xhTGF5b3QoY2x1c3RlciwgY2x1c3RlckNvbm5lY3Rpb25zLCBzdWJDbHVzdGVyKTtcbiAgICAgICAgaWYgKGNsdXN0ZXJOdW0gPT09IHBlclJvdykge1xuICAgICAgICAgIGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICAgIHlPZmZzZXQgKz0gbGF5b3V0U2l6ZSAvIHBlclJvdztcbiAgICAgICAgICBwZXJSb3dJZHgrKztcbiAgICAgICAgICBwZXJSb3cgPSBNYXRoLm1pbihNYXRoLmNlaWwocGVyUm93U2l6ZXNbcGVyUm93SWR4XSksIDQ1KTtcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnN0IGNsdXN0ZXJzUGVyUm93ID0gTWF0aC5jZWlsKHBlclJvdyAvIDEuNSk7XG4gICAgICAgIGNvbnN0IG9mZnNldFggPSAoKGNsdXN0ZXJOdW0pICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIGxheW91dFNpemUgLyBwZXJSb3cgKiAoMSAvIDEuMiAvIDQpKTtcbiAgICAgICAgLy8gY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IoY2x1c3Rlck51bSAvIHBlclJvdykgKiAyO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iZWRkaW5ncy5lbWJlZFgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBlbWJlZFhbY2x1c3RlcltpXV0gPSBlbWJlZGRpbmdzLmVtYmVkWFtpXSAqIGxheW91dFNpemUgLyBwZXJSb3cgLyAxLjIgKyBvZmZzZXRYO1xuICAgICAgICAgIGVtYmVkWVtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRZW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyAvIDEuMiArIHlPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtlbWJlZFgsIGVtYmVkWX07XG4gICAgfVxufVxuXG5cbiJdfQ==","import { multiColWebGPUSparseMatrix } from '@datagrok-libraries/math/src/webGPU/sparse-matrix/webGPU-sparse-matrix';\nimport { SparseMatrixService } from '../distance-matrix/sparse-matrix-service';\nimport { MCLSparseReducer } from './markov-cluster';\nonmessage = async (event) => {\n const { data, threshold, weights, aggregationMethod, distanceFnArgs, distanceFns, maxIterations, useWebGPU, inflate } = event.data;\n console.time('sparse matrix');\n let sparse = null;\n if (useWebGPU) {\n try {\n sparse = await multiColWebGPUSparseMatrix(data, threshold / 100, distanceFns, aggregationMethod, weights, distanceFnArgs);\n }\n catch (e) {\n console.error(e);\n }\n }\n if (!sparse) { // falsback to CPU\n if (useWebGPU)\n console.error('WEBGPU sparse matrix calculation failed, falling back to CPU implementation');\n sparse = await new SparseMatrixService()\n .calcMultiColumn(data, distanceFns, threshold / 100, distanceFnArgs, weights, aggregationMethod);\n }\n console.timeEnd('sparse matrix');\n //const res = await new MCLSparseReducer({maxIterations: maxIterations ?? 5}).transform(sparse, data[0].length);\n const reducer = new MCLSparseReducer({ maxIterations: maxIterations ?? 5, inflateFactor: inflate ?? 2 });\n console.time('MCL');\n let res = null;\n if (useWebGPU) {\n try {\n res = await reducer.transformWebGPU(sparse, data[0].length);\n }\n catch (e) {\n console.error('webGPU MCL failed, falling back to CPU implementation');\n console.error(e);\n }\n }\n if (!res)\n res = await reducer.transform(sparse, data[0].length);\n console.timeEnd('MCL');\n postMessage({ res });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDbEgsT0FBTyxFQUFxQixtQkFBbUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBR2pHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRWxELFNBQVMsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDMUIsTUFBTSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FNL0csS0FBSyxDQUFDLElBQUksQ0FBQztJQUVmLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDOUIsSUFBSSxNQUFNLEdBQThCLElBQUksQ0FBQztJQUM3QyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQ3ZDLElBQUksRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFLFdBQWtCLEVBQUUsaUJBQXdCLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtRQUMvQixJQUFJLFNBQVM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7UUFFL0YsTUFBTSxHQUFHLE1BQU0sSUFBSSxtQkFBbUIsRUFBRTthQUNyQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUVqQyxnSEFBZ0g7SUFDaEgsTUFBTSxPQUFPLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFDLGFBQWEsRUFBRSxhQUFhLElBQUksQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUN2RyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFRLElBQUksQ0FBQztJQUNwQixJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsR0FBRyxHQUFHLE1BQU0sT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLENBQUMsR0FBRztRQUNOLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZCLFdBQVcsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHttdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvc3BhcnNlLW1hdHJpeC93ZWJHUFUtc3BhcnNlLW1hdHJpeCc7XG5pbXBvcnQge1NwYXJzZU1hdHJpeFJlc3VsdCwgU3BhcnNlTWF0cml4U2VydmljZX0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3NwYXJzZS1tYXRyaXgtc2VydmljZSc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge01DTFNwYXJzZVJlZHVjZXJ9IGZyb20gJy4vbWFya292LWNsdXN0ZXInO1xuXG5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgY29uc3Qge2RhdGEsIHRocmVzaG9sZCwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QsIGRpc3RhbmNlRm5BcmdzLCBkaXN0YW5jZUZucywgbWF4SXRlcmF0aW9ucywgdXNlV2ViR1BVLCBpbmZsYXRlfTpcbiAgIHtcbiAgICBkYXRhOiBhbnlbXVtdLCB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsXG4gICAgZGlzdGFuY2VGbnM6IEtub3duTWV0cmljc1tdLCBkaXN0YW5jZUZuQXJnczogYW55W10sIG1heEl0ZXJhdGlvbnM6IG51bWJlcixcbiAgICB1c2VXZWJHUFU/OiBib29sZWFuLCBpbmZsYXRlPzogbnVtYmVyXG4gIH0gPSBldmVudC5kYXRhO1xuXG4gIGNvbnNvbGUudGltZSgnc3BhcnNlIG1hdHJpeCcpO1xuICBsZXQgc3BhcnNlOiBTcGFyc2VNYXRyaXhSZXN1bHQgfCBudWxsID0gbnVsbDtcbiAgaWYgKHVzZVdlYkdQVSkge1xuICAgIHRyeSB7XG4gICAgICBzcGFyc2UgPSBhd2FpdCBtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeChcbiAgICAgICAgZGF0YSwgdGhyZXNob2xkIC8gMTAwLCBkaXN0YW5jZUZucyBhcyBhbnksIGFnZ3JlZ2F0aW9uTWV0aG9kIGFzIGFueSwgd2VpZ2h0cywgZGlzdGFuY2VGbkFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICB9XG4gIGlmICghc3BhcnNlKSB7IC8vIGZhbHNiYWNrIHRvIENQVVxuICAgIGlmICh1c2VXZWJHUFUpXG4gICAgICBjb25zb2xlLmVycm9yKCdXRUJHUFUgc3BhcnNlIG1hdHJpeCBjYWxjdWxhdGlvbiBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBDUFUgaW1wbGVtZW50YXRpb24nKTtcblxuICAgIHNwYXJzZSA9IGF3YWl0IG5ldyBTcGFyc2VNYXRyaXhTZXJ2aWNlKClcbiAgICAgIC5jYWxjTXVsdGlDb2x1bW4oZGF0YSwgZGlzdGFuY2VGbnMsIHRocmVzaG9sZCAvIDEwMCwgZGlzdGFuY2VGbkFyZ3MsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kKTtcbiAgfVxuICBjb25zb2xlLnRpbWVFbmQoJ3NwYXJzZSBtYXRyaXgnKTtcblxuICAvL2NvbnN0IHJlcyA9IGF3YWl0IG5ldyBNQ0xTcGFyc2VSZWR1Y2VyKHttYXhJdGVyYXRpb25zOiBtYXhJdGVyYXRpb25zID8/IDV9KS50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgTUNMU3BhcnNlUmVkdWNlcih7bWF4SXRlcmF0aW9uczogbWF4SXRlcmF0aW9ucyA/PyA1LCBpbmZsYXRlRmFjdG9yOiBpbmZsYXRlID8/IDJ9KTtcbiAgY29uc29sZS50aW1lKCdNQ0wnKTtcbiAgbGV0IHJlczogYW55ID0gbnVsbDtcbiAgaWYgKHVzZVdlYkdQVSkge1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBhd2FpdCByZWR1Y2VyLnRyYW5zZm9ybVdlYkdQVShzcGFyc2UsIGRhdGFbMF0ubGVuZ3RoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd3ZWJHUFUgTUNMIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIENQVSBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyZXMpXG4gICAgcmVzID0gYXdhaXQgcmVkdWNlci50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gIGNvbnNvbGUudGltZUVuZCgnTUNMJyk7XG5cbiAgcG9zdE1lc3NhZ2Uoe3Jlc30pO1xufTtcbiJdfQ==","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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFLENBQUM7UUFDMUIsS0FBSywwQkFBMEIsQ0FBQyxTQUFTO1lBQ3ZDLE9BQU8sQ0FBQyxFQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckY7WUFDRSxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUU7Z0JBQ3RCLFlBQVk7Z0JBQ1osTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDO0lBQ04sQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGlzTmlsID0gKHg6IGFueSkgPT4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRTbWFsbGVyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPiBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPCB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExhcmdlcihkaXN0YW5jZXNBcjogbnVtYmVyW10sIGluZGV4ZXM6IG51bWJlcltdLCBudW06IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICBpZiAobnVtIDwgZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoLTFdKVxuICAgIHJldHVybjtcblxuICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtID4gdik7XG4gIGRpc3RhbmNlc0FyLnBvcCgpO1xuICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gIGluZGV4ZXMucG9wKCk7XG4gIGluZGV4ZXMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKFxuICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgd2VpZ2h0czogbnVtYmVyW11cbik6ICh2YWx1ZXM6IG51bWJlcltdKSA9PiBudW1iZXIge1xuICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uTWV0aG9kKSB7XG4gICAgY2FzZSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5NQU5IQVRUQU46XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyB2YWwgKiB3ZWlnaHRzW2lkeF0sIDApO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICAvLyBldWNsaWRlYW5cbiAgICAgICAgY29uc3Qgc3VtID0gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyAodmFsICogd2VpZ2h0c1tpZHhdKSAqKiAyLCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydChzdW0pO1xuICAgICAgfTtcbiAgfVxufVxuIl19","/**\n * Graphology ForceAtlas2 Layout Default Settings\n * ===============================================\n */\nmodule.exports = {\n linLogMode: false,\n outboundAttractionDistribution: false,\n adjustSizes: false,\n edgeWeightInfluence: 1,\n scalingRatio: 1,\n strongGravityMode: false,\n gravity: 1,\n slowDown: 1,\n barnesHutOptimize: false,\n barnesHutTheta: 0.5\n};\n","/**\n * Graphology ForceAtlas2 Helpers\n * ===============================\n *\n * Miscellaneous helper functions.\n */\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\n\n/**\n * Very simple Object.assign-like function.\n *\n * @param {object} target - First object.\n * @param {object} [...objects] - Objects to merge.\n * @return {object}\n */\nexports.assign = function (target) {\n target = target || {};\n\n var objects = Array.prototype.slice.call(arguments).slice(1),\n i,\n k,\n l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n if (!objects[i]) continue;\n\n for (k in objects[i]) target[k] = objects[i][k];\n }\n\n return target;\n};\n\n/**\n * Function used to validate the given settings.\n *\n * @param {object} settings - Settings to validate.\n * @return {object|null}\n */\nexports.validateSettings = function (settings) {\n if ('linLogMode' in settings && typeof settings.linLogMode !== 'boolean')\n return {message: 'the `linLogMode` setting should be a boolean.'};\n\n if (\n 'outboundAttractionDistribution' in settings &&\n typeof settings.outboundAttractionDistribution !== 'boolean'\n )\n return {\n message:\n 'the `outboundAttractionDistribution` setting should be a boolean.'\n };\n\n if ('adjustSizes' in settings && typeof settings.adjustSizes !== 'boolean')\n return {message: 'the `adjustSizes` setting should be a boolean.'};\n\n if (\n 'edgeWeightInfluence' in settings &&\n typeof settings.edgeWeightInfluence !== 'number'\n )\n return {\n message: 'the `edgeWeightInfluence` setting should be a number.'\n };\n\n if (\n 'scalingRatio' in settings &&\n !(typeof settings.scalingRatio === 'number' && settings.scalingRatio >= 0)\n )\n return {message: 'the `scalingRatio` setting should be a number >= 0.'};\n\n if (\n 'strongGravityMode' in settings &&\n typeof settings.strongGravityMode !== 'boolean'\n )\n return {message: 'the `strongGravityMode` setting should be a boolean.'};\n\n if (\n 'gravity' in settings &&\n !(typeof settings.gravity === 'number' && settings.gravity >= 0)\n )\n return {message: 'the `gravity` setting should be a number >= 0.'};\n\n if (\n 'slowDown' in settings &&\n !(typeof settings.slowDown === 'number' || settings.slowDown >= 0)\n )\n return {message: 'the `slowDown` setting should be a number >= 0.'};\n\n if (\n 'barnesHutOptimize' in settings &&\n typeof settings.barnesHutOptimize !== 'boolean'\n )\n return {message: 'the `barnesHutOptimize` setting should be a boolean.'};\n\n if (\n 'barnesHutTheta' in settings &&\n !(\n typeof settings.barnesHutTheta === 'number' &&\n settings.barnesHutTheta >= 0\n )\n )\n return {message: 'the `barnesHutTheta` setting should be a number >= 0.'};\n\n return null;\n};\n\n/**\n * Function generating a flat matrix for both nodes & edges of the given graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {function} getEdgeWeight - Edge weight getter function.\n * @return {object} - Both matrices.\n */\nexports.graphToByteArrays = function (graph, getEdgeWeight) {\n var order = graph.order;\n var size = graph.size;\n var index = {};\n var j;\n\n // NOTE: float32 could lead to issues if edge array needs to index large\n // number of nodes.\n var NodeMatrix = new Float32Array(order * PPN);\n var EdgeMatrix = new Float32Array(size * PPE);\n\n // Iterate through nodes\n j = 0;\n graph.forEachNode(function (node, attr) {\n // Node index\n index[node] = j;\n\n // Populating byte array\n NodeMatrix[j] = attr.x;\n NodeMatrix[j + 1] = attr.y;\n NodeMatrix[j + 2] = 0; // dx\n NodeMatrix[j + 3] = 0; // dy\n NodeMatrix[j + 4] = 0; // old_dx\n NodeMatrix[j + 5] = 0; // old_dy\n NodeMatrix[j + 6] = 1; // mass\n NodeMatrix[j + 7] = 1; // convergence\n NodeMatrix[j + 8] = attr.size || 1;\n NodeMatrix[j + 9] = attr.fixed ? 1 : 0;\n j += PPN;\n });\n\n // Iterate through edges\n j = 0;\n graph.forEachEdge(function (edge, attr, source, target, sa, ta, u) {\n var sj = index[source];\n var tj = index[target];\n\n var weight = getEdgeWeight(edge, attr, source, target, sa, ta, u);\n\n // Incrementing mass to be a node's weighted degree\n NodeMatrix[sj + 6] += weight;\n NodeMatrix[tj + 6] += weight;\n\n // Populating byte array\n EdgeMatrix[j] = sj;\n EdgeMatrix[j + 1] = tj;\n EdgeMatrix[j + 2] = weight;\n j += PPE;\n });\n\n return {\n nodes: NodeMatrix,\n edges: EdgeMatrix\n };\n};\n\n/**\n * Function applying the layout back to the graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A node reducer.\n */\nexports.assignLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var i = 0;\n\n graph.updateEachNodeAttributes(function (node, attr) {\n attr.x = NodeMatrix[i];\n attr.y = NodeMatrix[i + 1];\n\n i += PPN;\n\n return outputReducer ? outputReducer(node, attr) : attr;\n });\n};\n\n/**\n * Function reading the positions (only) from the graph, to write them in the matrix.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n */\nexports.readGraphPositions = function (graph, NodeMatrix) {\n var i = 0;\n\n graph.forEachNode(function (node, attr) {\n NodeMatrix[i] = attr.x;\n NodeMatrix[i + 1] = attr.y;\n\n i += PPN;\n });\n};\n\n/**\n * Function collecting the layout positions.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A nodes reducer.\n * @return {object} - Map to node positions.\n */\nexports.collectLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var nodes = graph.nodes(),\n positions = {};\n\n for (var i = 0, j = 0, l = NodeMatrix.length; i < l; i += PPN) {\n if (outputReducer) {\n var newAttr = Object.assign({}, graph.getNodeAttributes(nodes[j]));\n newAttr.x = NodeMatrix[i];\n newAttr.y = NodeMatrix[i + 1];\n newAttr = outputReducer(nodes[j], newAttr);\n positions[nodes[j]] = {\n x: newAttr.x,\n y: newAttr.y\n };\n } else {\n positions[nodes[j]] = {\n x: NodeMatrix[i],\n y: NodeMatrix[i + 1]\n };\n }\n\n j++;\n }\n\n return positions;\n};\n\n/**\n * Function returning a web worker from the given function.\n *\n * @param {function} fn - Function for the worker.\n * @return {DOMString}\n */\nexports.createWorker = function createWorker(fn) {\n var xURL = window.URL || window.webkitURL;\n var code = fn.toString();\n var objectUrl = xURL.createObjectURL(\n new Blob(['(' + code + ').call(this);'], {type: 'text/javascript'})\n );\n var worker = new Worker(objectUrl);\n xURL.revokeObjectURL(objectUrl);\n\n return worker;\n};\n","/**\n * Graphology ForceAtlas2 Layout\n * ==============================\n *\n * Library endpoint.\n */\nvar isGraph = require('graphology-utils/is-graph');\nvar createEdgeWeightGetter =\n require('graphology-utils/getters').createEdgeWeightGetter;\nvar iterate = require('./iterate.js');\nvar helpers = require('./helpers.js');\n\nvar DEFAULT_SETTINGS = require('./defaults.js');\n\n/**\n * Asbtract function used to run a certain number of iterations.\n *\n * @param {boolean} assign - Whether to assign positions.\n * @param {Graph} graph - Target graph.\n * @param {object|number} params - If number, params.iterations, else:\n * @param {function} getWeight - Edge weight getter function.\n * @param {number} iterations - Number of iterations.\n * @param {function|null} outputReducer - A node reducer\n * @param {object} [settings] - Settings.\n * @return {object|undefined}\n */\nfunction abstractSynchronousLayout(assign, graph, params) {\n if (!isGraph(graph))\n throw new Error(\n 'graphology-layout-forceatlas2: the given graph is not a valid graphology instance.'\n );\n\n if (typeof params === 'number') params = {iterations: params};\n\n var iterations = params.iterations;\n\n if (typeof iterations !== 'number')\n throw new Error(\n 'graphology-layout-forceatlas2: invalid number of iterations.'\n );\n\n if (iterations <= 0)\n throw new Error(\n 'graphology-layout-forceatlas2: you should provide a positive number of iterations.'\n );\n\n var getEdgeWeight = createEdgeWeightGetter(\n 'getEdgeWeight' in params ? params.getEdgeWeight : 'weight'\n ).fromEntry;\n\n var outputReducer =\n typeof params.outputReducer === 'function' ? params.outputReducer : null;\n\n // Validating settings\n var settings = helpers.assign({}, DEFAULT_SETTINGS, params.settings);\n var validationError = helpers.validateSettings(settings);\n\n if (validationError)\n throw new Error(\n 'graphology-layout-forceatlas2: ' + validationError.message\n );\n\n // Building matrices\n var matrices = helpers.graphToByteArrays(graph, getEdgeWeight);\n\n var i;\n\n // Iterating\n for (i = 0; i < iterations; i++)\n iterate(settings, matrices.nodes, matrices.edges);\n\n // Applying\n if (assign) {\n helpers.assignLayoutChanges(graph, matrices.nodes, outputReducer);\n return;\n }\n\n return helpers.collectLayoutChanges(graph, matrices.nodes);\n}\n\n/**\n * Function returning sane layout settings for the given graph.\n *\n * @param {Graph|number} graph - Target graph or graph order.\n * @return {object}\n */\nfunction inferSettings(graph) {\n var order = typeof graph === 'number' ? graph : graph.order;\n\n return {\n barnesHutOptimize: order > 2000,\n strongGravityMode: true,\n gravity: 0.05,\n scalingRatio: 10,\n slowDown: 1 + Math.log(order)\n };\n}\n\n/**\n * Exporting.\n */\nvar synchronousLayout = abstractSynchronousLayout.bind(null, false);\nsynchronousLayout.assign = abstractSynchronousLayout.bind(null, true);\nsynchronousLayout.inferSettings = inferSettings;\n\nmodule.exports = synchronousLayout;\n","/* eslint no-constant-condition: 0 */\n/**\n * Graphology ForceAtlas2 Iteration\n * =================================\n *\n * Function used to perform a single iteration of the algorithm.\n */\n\n/**\n * Matrices properties accessors.\n */\nvar NODE_X = 0;\nvar NODE_Y = 1;\nvar NODE_DX = 2;\nvar NODE_DY = 3;\nvar NODE_OLD_DX = 4;\nvar NODE_OLD_DY = 5;\nvar NODE_MASS = 6;\nvar NODE_CONVERGENCE = 7;\nvar NODE_SIZE = 8;\nvar NODE_FIXED = 9;\n\nvar EDGE_SOURCE = 0;\nvar EDGE_TARGET = 1;\nvar EDGE_WEIGHT = 2;\n\nvar REGION_NODE = 0;\nvar REGION_CENTER_X = 1;\nvar REGION_CENTER_Y = 2;\nvar REGION_SIZE = 3;\nvar REGION_NEXT_SIBLING = 4;\nvar REGION_FIRST_CHILD = 5;\nvar REGION_MASS = 6;\nvar REGION_MASS_CENTER_X = 7;\nvar REGION_MASS_CENTER_Y = 8;\n\nvar SUBDIVISION_ATTEMPTS = 3;\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\nvar PPR = 9;\n\nvar MAX_FORCE = 10;\n\n/**\n * Function used to perform a single interation of the algorithm.\n *\n * @param {object} options - Layout options.\n * @param {Float32Array} NodeMatrix - Node data.\n * @param {Float32Array} EdgeMatrix - Edge data.\n * @return {object} - Some metadata.\n */\nmodule.exports = function iterate(options, NodeMatrix, EdgeMatrix) {\n // Initializing variables\n var l, r, n, n1, n2, rn, e, w, g, s;\n\n var order = NodeMatrix.length,\n size = EdgeMatrix.length;\n\n var adjustSizes = options.adjustSizes;\n\n var thetaSquared = options.barnesHutTheta * options.barnesHutTheta;\n\n var outboundAttCompensation, coefficient, xDist, yDist, ewc, distance, factor;\n\n var RegionMatrix = [];\n\n // 1) Initializing layout data\n //-----------------------------\n\n // Resetting positions & computing max values\n for (n = 0; n < order; n += PPN) {\n NodeMatrix[n + NODE_OLD_DX] = NodeMatrix[n + NODE_DX];\n NodeMatrix[n + NODE_OLD_DY] = NodeMatrix[n + NODE_DY];\n NodeMatrix[n + NODE_DX] = 0;\n NodeMatrix[n + NODE_DY] = 0;\n }\n\n // If outbound attraction distribution, compensate\n if (options.outboundAttractionDistribution) {\n outboundAttCompensation = 0;\n for (n = 0; n < order; n += PPN) {\n outboundAttCompensation += NodeMatrix[n + NODE_MASS];\n }\n\n outboundAttCompensation /= order / PPN;\n }\n\n // 1.bis) Barnes-Hut computation\n //------------------------------\n\n if (options.barnesHutOptimize) {\n // Setting up\n var minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity,\n q,\n q2,\n subdivisionAttempts;\n\n // Computing min and max values\n for (n = 0; n < order; n += PPN) {\n minX = Math.min(minX, NodeMatrix[n + NODE_X]);\n maxX = Math.max(maxX, NodeMatrix[n + NODE_X]);\n minY = Math.min(minY, NodeMatrix[n + NODE_Y]);\n maxY = Math.max(maxY, NodeMatrix[n + NODE_Y]);\n }\n\n // squarify bounds, it's a quadtree\n var dx = maxX - minX,\n dy = maxY - minY;\n if (dx > dy) {\n minY -= (dx - dy) / 2;\n maxY = minY + dx;\n } else {\n minX -= (dy - dx) / 2;\n maxX = minX + dy;\n }\n\n // Build the Barnes Hut root region\n RegionMatrix[0 + REGION_NODE] = -1;\n RegionMatrix[0 + REGION_CENTER_X] = (minX + maxX) / 2;\n RegionMatrix[0 + REGION_CENTER_Y] = (minY + maxY) / 2;\n RegionMatrix[0 + REGION_SIZE] = Math.max(maxX - minX, maxY - minY);\n RegionMatrix[0 + REGION_NEXT_SIBLING] = -1;\n RegionMatrix[0 + REGION_FIRST_CHILD] = -1;\n RegionMatrix[0 + REGION_MASS] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_Y] = 0;\n\n // Add each node in the tree\n l = 1;\n for (n = 0; n < order; n += PPN) {\n // Current region, starting with root\n r = 0;\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n\n while (true) {\n // Are there sub-regions?\n\n // We look at first child index\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // There are sub-regions\n\n // We just iterate to find a \"leaf\" of the tree\n // that is an empty region or a region with a single node\n // (see next case)\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // Update center of mass and mass (we only do it for non-leave regions)\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n (RegionMatrix[r + REGION_MASS_CENTER_X] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_X] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n (RegionMatrix[r + REGION_MASS_CENTER_Y] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_Y] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS] += NodeMatrix[n + NODE_MASS];\n\n // Iterate on the right quadrant\n r = q;\n continue;\n } else {\n // There are no sub-regions: we are in a \"leaf\"\n\n // Is there a node in this leave?\n if (RegionMatrix[r + REGION_NODE] < 0) {\n // There is no node in region:\n // we record node n and go on\n RegionMatrix[r + REGION_NODE] = n;\n break;\n } else {\n // There is a node in this region\n\n // We will need to create sub-regions, stick the two\n // nodes (the old one r[0] and the new one n) in two\n // subregions. If they fall in the same quadrant,\n // we will iterate.\n\n // Create sub-regions\n RegionMatrix[r + REGION_FIRST_CHILD] = l * PPR;\n w = RegionMatrix[r + REGION_SIZE] / 2; // new size (half)\n\n // NOTE: we use screen coordinates\n // from Top Left to Bottom Right\n\n // Top Left sub-region\n g = RegionMatrix[r + REGION_FIRST_CHILD];\n\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Left sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Top Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] =\n RegionMatrix[r + REGION_NEXT_SIBLING];\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n l += 4;\n\n // Now the goal is to find two different sub-regions\n // for the two nodes: the one previously recorded (r[0])\n // and the one we want to add (n)\n\n // Find the quadrant of the old node\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X] <\n RegionMatrix[r + REGION_CENTER_X]\n ) {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // We remove r[0] from the region r, add its mass to r and record it in q\n RegionMatrix[r + REGION_MASS] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_MASS];\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X];\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y];\n\n RegionMatrix[q + REGION_NODE] = RegionMatrix[r + REGION_NODE];\n RegionMatrix[r + REGION_NODE] = -1;\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n if (q === q2) {\n // If both nodes are in the same quadrant,\n // we have to try it again on this quadrant\n if (subdivisionAttempts--) {\n r = q;\n continue; // while\n } else {\n // we are out of precision here, and we cannot subdivide anymore\n // but we have to break the loop anyway\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n break; // while\n }\n }\n\n // If both quadrants are different, we record n\n // in its quadrant\n RegionMatrix[q2 + REGION_NODE] = n;\n break;\n }\n }\n }\n }\n }\n\n // 2) Repulsion\n //--------------\n // NOTES: adjustSizes = antiCollision & scalingRatio = coefficient\n\n if (options.barnesHutOptimize) {\n coefficient = options.scalingRatio;\n\n // Applying repulsion through regions\n for (n = 0; n < order; n += PPN) {\n // Computing leaf quad nodes iteration\n\n r = 0; // Starting with root region\n while (true) {\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // The region has sub-regions\n\n // We run the Barnes Hut test to see if we are at the right distance\n distance =\n Math.pow(\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X],\n 2\n ) +\n Math.pow(\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y],\n 2\n );\n\n s = RegionMatrix[r + REGION_SIZE];\n\n if ((4 * s * s) / distance < thetaSquared) {\n // We treat the region as a single body, and we repulse\n\n xDist =\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X];\n yDist =\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y];\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n } else {\n // The region is too close and we have to look at sub-regions\n r = RegionMatrix[r + REGION_FIRST_CHILD];\n continue;\n }\n } else {\n // The region has no sub-region\n // If there is a node r[0] and it is not n, then repulse\n rn = RegionMatrix[r + REGION_NODE];\n\n if (rn >= 0 && rn !== n) {\n xDist = NodeMatrix[n + NODE_X] - NodeMatrix[rn + NODE_X];\n yDist = NodeMatrix[n + NODE_Y] - NodeMatrix[rn + NODE_Y];\n\n distance = xDist * xDist + yDist * yDist;\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n }\n }\n }\n } else {\n coefficient = options.scalingRatio;\n\n // Square iteration\n for (n1 = 0; n1 < order; n1 += PPN) {\n for (n2 = 0; n2 < n1; n2 += PPN) {\n // Common to both methods\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n if (adjustSizes === true) {\n //-- Anticollision Linear Repulsion\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n } else if (distance < 0) {\n factor =\n 100 *\n coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS];\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n distance = Math.sqrt(xDist * xDist + yDist * yDist);\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n }\n }\n }\n\n // 3) Gravity\n //------------\n g = options.gravity / options.scalingRatio;\n coefficient = options.scalingRatio;\n for (n = 0; n < order; n += PPN) {\n factor = 0;\n\n // Common to both methods\n xDist = NodeMatrix[n + NODE_X];\n yDist = NodeMatrix[n + NODE_Y];\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.strongGravityMode) {\n //-- Strong gravity\n if (distance > 0) factor = coefficient * NodeMatrix[n + NODE_MASS] * g;\n } else {\n //-- Linear Anti-collision Repulsion n\n if (distance > 0)\n factor = (coefficient * NodeMatrix[n + NODE_MASS] * g) / distance;\n }\n\n // Updating node's dx and dy\n NodeMatrix[n + NODE_DX] -= xDist * factor;\n NodeMatrix[n + NODE_DY] -= yDist * factor;\n }\n\n // 4) Attraction\n //---------------\n coefficient =\n 1 * (options.outboundAttractionDistribution ? outboundAttCompensation : 1);\n\n // TODO: simplify distance\n // TODO: coefficient is always used as -c --> optimize?\n for (e = 0; e < size; e += PPE) {\n n1 = EdgeMatrix[e + EDGE_SOURCE];\n n2 = EdgeMatrix[e + EDGE_TARGET];\n w = EdgeMatrix[e + EDGE_WEIGHT];\n\n // Edge weight influence\n ewc = Math.pow(w, options.edgeWeightInfluence);\n\n // Common measures\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n // Applying attraction to nodes\n if (adjustSizes === true) {\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- Linear Anti-collision Attraction\n if (distance > 0) {\n factor = -coefficient * ewc;\n }\n }\n }\n } else {\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Attraction\n if (distance > 0)\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Attraction Mass Distributed\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n } else {\n //-- Linear Attraction\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = -coefficient * ewc;\n }\n }\n }\n\n // Updating nodes' dx and dy\n // TODO: if condition or factor = 1?\n if (distance > 0) {\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n\n // 5) Apply Forces\n //-----------------\n var force, swinging, traction, nodespeed, newX, newY;\n\n // MATH: sqrt and square distances\n if (adjustSizes === true) {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n force = Math.sqrt(\n Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2)\n );\n\n if (force > MAX_FORCE) {\n NodeMatrix[n + NODE_DX] =\n (NodeMatrix[n + NODE_DX] * MAX_FORCE) / force;\n NodeMatrix[n + NODE_DY] =\n (NodeMatrix[n + NODE_DY] * MAX_FORCE) / force;\n }\n\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed = (0.1 * Math.log(1 + traction)) / (1 + Math.sqrt(swinging));\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n } else {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed =\n (NodeMatrix[n + NODE_CONVERGENCE] * Math.log(1 + traction)) /\n (1 + Math.sqrt(swinging));\n\n // Updating node convergence\n NodeMatrix[n + NODE_CONVERGENCE] = Math.min(\n 1,\n Math.sqrt(\n (nodespeed *\n (Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2))) /\n (1 + Math.sqrt(swinging))\n )\n );\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n }\n\n // We return the information about the layout (no need to return the matrices)\n return {};\n};\n","/**\n * Graphology Weight Getter\n * =========================\n *\n * Function creating weight getters.\n */\nfunction coerceWeight(value) {\n // Ensuring target value is a correct number\n if (typeof value !== 'number' || isNaN(value)) return 1;\n\n return value;\n}\n\nfunction createNodeValueGetter(nameOrFunction, defaultValue) {\n var getter = {};\n\n var coerceToDefault = function (v) {\n if (typeof v === 'undefined') return defaultValue;\n\n return v;\n };\n\n if (typeof defaultValue === 'function') coerceToDefault = defaultValue;\n\n var get = function (attributes) {\n return coerceToDefault(attributes[nameOrFunction]);\n };\n\n var returnDefault = function () {\n return coerceToDefault(undefined);\n };\n\n if (typeof nameOrFunction === 'string') {\n getter.fromAttributes = get;\n getter.fromGraph = function (graph, node) {\n return get(graph.getNodeAttributes(node));\n };\n getter.fromEntry = function (node, attributes) {\n return get(attributes);\n };\n } else if (typeof nameOrFunction === 'function') {\n getter.fromAttributes = function () {\n throw new Error(\n 'graphology-utils/getters/createNodeValueGetter: irrelevant usage.'\n );\n };\n getter.fromGraph = function (graph, node) {\n return coerceToDefault(\n nameOrFunction(node, graph.getNodeAttributes(node))\n );\n };\n getter.fromEntry = function (node, attributes) {\n return coerceToDefault(nameOrFunction(node, attributes));\n };\n } else {\n getter.fromAttributes = returnDefault;\n getter.fromGraph = returnDefault;\n getter.fromEntry = returnDefault;\n }\n\n return getter;\n}\n\nfunction createEdgeValueGetter(nameOrFunction, defaultValue) {\n var getter = {};\n\n var coerceToDefault = function (v) {\n if (typeof v === 'undefined') return defaultValue;\n\n return v;\n };\n\n if (typeof defaultValue === 'function') coerceToDefault = defaultValue;\n\n var get = function (attributes) {\n return coerceToDefault(attributes[nameOrFunction]);\n };\n\n var returnDefault = function () {\n return coerceToDefault(undefined);\n };\n\n if (typeof nameOrFunction === 'string') {\n getter.fromAttributes = get;\n getter.fromGraph = function (graph, edge) {\n return get(graph.getEdgeAttributes(edge));\n };\n getter.fromEntry = function (edge, attributes) {\n return get(attributes);\n };\n getter.fromPartialEntry = getter.fromEntry;\n getter.fromMinimalEntry = getter.fromEntry;\n } else if (typeof nameOrFunction === 'function') {\n getter.fromAttributes = function () {\n throw new Error(\n 'graphology-utils/getters/createEdgeValueGetter: irrelevant usage.'\n );\n };\n getter.fromGraph = function (graph, edge) {\n // TODO: we can do better, check #310\n var extremities = graph.extremities(edge);\n return coerceToDefault(\n nameOrFunction(\n edge,\n graph.getEdgeAttributes(edge),\n extremities[0],\n extremities[1],\n graph.getNodeAttributes(extremities[0]),\n graph.getNodeAttributes(extremities[1]),\n graph.isUndirected(edge)\n )\n );\n };\n getter.fromEntry = function (e, a, s, t, sa, ta, u) {\n return coerceToDefault(nameOrFunction(e, a, s, t, sa, ta, u));\n };\n getter.fromPartialEntry = function (e, a, s, t) {\n return coerceToDefault(nameOrFunction(e, a, s, t));\n };\n getter.fromMinimalEntry = function (e, a) {\n return coerceToDefault(nameOrFunction(e, a));\n };\n } else {\n getter.fromAttributes = returnDefault;\n getter.fromGraph = returnDefault;\n getter.fromEntry = returnDefault;\n getter.fromMinimalEntry = returnDefault;\n }\n\n return getter;\n}\n\nexports.createNodeValueGetter = createNodeValueGetter;\nexports.createEdgeValueGetter = createEdgeValueGetter;\nexports.createEdgeWeightGetter = function (name) {\n return createEdgeValueGetter(name, coerceWeight);\n};\n","/**\n * Graphology isGraph\n * ===================\n *\n * Very simple function aiming at ensuring the given variable is a\n * graphology instance.\n */\n\n/**\n * Checking the value is a graphology instance.\n *\n * @param {any} value - Target value.\n * @return {boolean}\n */\nmodule.exports = function isGraph(value) {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof value.addUndirectedEdgeWithKey === 'function' &&\n typeof value.dropNode === 'function' &&\n typeof value.multi === 'boolean'\n );\n};\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).graphology=e()}(this,(function(){\"use strict\";function t(e){return t=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},t(e)}function e(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e)}function n(t){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},n(t)}function r(t,e){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},r(t,e)}function i(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function o(t,e,n){return o=i()?Reflect.construct.bind():function(t,e,n){var i=[null];i.push.apply(i,e);var o=new(Function.bind.apply(t,i));return n&&r(o,n.prototype),o},o.apply(null,arguments)}function a(t){var e=\"function\"==typeof Map?new Map:void 0;return a=function(t){if(null===t||(i=t,-1===Function.toString.call(i).indexOf(\"[native code]\")))return t;var i;if(\"function\"!=typeof t)throw new TypeError(\"Super expression must either be null or a function\");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,a)}function a(){return o(t,arguments,n(this).constructor)}return a.prototype=Object.create(t.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),r(a,t)},a(t)}function c(t){if(void 0===t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return t}var u=function(){for(var t=arguments[0],e=1,n=arguments.length;e<n;e++)if(arguments[e])for(var r in arguments[e])t[r]=arguments[e][r];return t};function d(t,e,n,r){var i=t._nodes.get(e),o=null;return i?o=\"mixed\"===r?i.out&&i.out[n]||i.undirected&&i.undirected[n]:\"directed\"===r?i.out&&i.out[n]:i.undirected&&i.undirected[n]:o}function s(e){return\"object\"===t(e)&&null!==e}function h(t){var e;for(e in t)return!1;return!0}function p(t,e,n){Object.defineProperty(t,e,{enumerable:!1,configurable:!1,writable:!0,value:n})}function f(t,e,n){var r={enumerable:!0,configurable:!0};\"function\"==typeof n?r.get=n:(r.value=n,r.writable=!1),Object.defineProperty(t,e,r)}function l(t){return!!s(t)&&!(t.attributes&&!Array.isArray(t.attributes))}\"function\"==typeof Object.assign&&(u=Object.assign);var g,y={exports:{}},w=\"object\"==typeof Reflect?Reflect:null,v=w&&\"function\"==typeof w.apply?w.apply:function(t,e,n){return Function.prototype.apply.call(t,e,n)};g=w&&\"function\"==typeof w.ownKeys?w.ownKeys:Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.getOwnPropertyNames(t)};var b=Number.isNaN||function(t){return t!=t};function m(){m.init.call(this)}y.exports=m,y.exports.once=function(t,e){return new Promise((function(n,r){function i(n){t.removeListener(e,o),r(n)}function o(){\"function\"==typeof t.removeListener&&t.removeListener(\"error\",i),n([].slice.call(arguments))}U(t,e,o,{once:!0}),\"error\"!==e&&function(t,e,n){\"function\"==typeof t.on&&U(t,\"error\",e,n)}(t,i,{once:!0})}))},m.EventEmitter=m,m.prototype._events=void 0,m.prototype._eventsCount=0,m.prototype._maxListeners=void 0;var k=10;function _(t){if(\"function\"!=typeof t)throw new TypeError('The \"listener\" argument must be of type Function. Received type '+typeof t)}function G(t){return void 0===t._maxListeners?m.defaultMaxListeners:t._maxListeners}function x(t,e,n,r){var i,o,a,c;if(_(n),void 0===(o=t._events)?(o=t._events=Object.create(null),t._eventsCount=0):(void 0!==o.newListener&&(t.emit(\"newListener\",e,n.listener?n.listener:n),o=t._events),a=o[e]),void 0===a)a=o[e]=n,++t._eventsCount;else if(\"function\"==typeof a?a=o[e]=r?[n,a]:[a,n]:r?a.unshift(n):a.push(n),(i=G(t))>0&&a.length>i&&!a.warned){a.warned=!0;var u=new Error(\"Possible EventEmitter memory leak detected. \"+a.length+\" \"+String(e)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");u.name=\"MaxListenersExceededWarning\",u.emitter=t,u.type=e,u.count=a.length,c=u,console&&console.warn&&console.warn(c)}return t}function E(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function A(t,e,n){var r={fired:!1,wrapFn:void 0,target:t,type:e,listener:n},i=E.bind(r);return i.listener=n,r.wrapFn=i,i}function L(t,e,n){var r=t._events;if(void 0===r)return[];var i=r[e];return void 0===i?[]:\"function\"==typeof i?n?[i.listener||i]:[i]:n?function(t){for(var e=new Array(t.length),n=0;n<e.length;++n)e[n]=t[n].listener||t[n];return e}(i):D(i,i.length)}function S(t){var e=this._events;if(void 0!==e){var n=e[t];if(\"function\"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function D(t,e){for(var n=new Array(e),r=0;r<e;++r)n[r]=t[r];return n}function U(t,e,n,r){if(\"function\"==typeof t.on)r.once?t.once(e,n):t.on(e,n);else{if(\"function\"!=typeof t.addEventListener)throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type '+typeof t);t.addEventListener(e,(function i(o){r.once&&t.removeEventListener(e,i),n(o)}))}}function N(t){if(\"function\"!=typeof t)throw new Error(\"obliterator/iterator: expecting a function!\");this.next=t}Object.defineProperty(m,\"defaultMaxListeners\",{enumerable:!0,get:function(){return k},set:function(t){if(\"number\"!=typeof t||t<0||b(t))throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received '+t+\".\");k=t}}),m.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},m.prototype.setMaxListeners=function(t){if(\"number\"!=typeof t||t<0||b(t))throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received '+t+\".\");return this._maxListeners=t,this},m.prototype.getMaxListeners=function(){return G(this)},m.prototype.emit=function(t){for(var e=[],n=1;n<arguments.length;n++)e.push(arguments[n]);var r=\"error\"===t,i=this._events;if(void 0!==i)r=r&&void 0===i.error;else if(!r)return!1;if(r){var o;if(e.length>0&&(o=e[0]),o instanceof Error)throw o;var a=new Error(\"Unhandled error.\"+(o?\" (\"+o.message+\")\":\"\"));throw a.context=o,a}var c=i[t];if(void 0===c)return!1;if(\"function\"==typeof c)v(c,this,e);else{var u=c.length,d=D(c,u);for(n=0;n<u;++n)v(d[n],this,e)}return!0},m.prototype.addListener=function(t,e){return x(this,t,e,!1)},m.prototype.on=m.prototype.addListener,m.prototype.prependListener=function(t,e){return x(this,t,e,!0)},m.prototype.once=function(t,e){return _(e),this.on(t,A(this,t,e)),this},m.prototype.prependOnceListener=function(t,e){return _(e),this.prependListener(t,A(this,t,e)),this},m.prototype.removeListener=function(t,e){var n,r,i,o,a;if(_(e),void 0===(r=this._events))return this;if(void 0===(n=r[t]))return this;if(n===e||n.listener===e)0==--this._eventsCount?this._events=Object.create(null):(delete r[t],r.removeListener&&this.emit(\"removeListener\",t,n.listener||e));else if(\"function\"!=typeof n){for(i=-1,o=n.length-1;o>=0;o--)if(n[o]===e||n[o].listener===e){a=n[o].listener,i=o;break}if(i<0)return this;0===i?n.shift():function(t,e){for(;e+1<t.length;e++)t[e]=t[e+1];t.pop()}(n,i),1===n.length&&(r[t]=n[0]),void 0!==r.removeListener&&this.emit(\"removeListener\",t,a||e)}return this},m.prototype.off=m.prototype.removeListener,m.prototype.removeAllListeners=function(t){var e,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[t]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[t]),this;if(0===arguments.length){var i,o=Object.keys(n);for(r=0;r<o.length;++r)\"removeListener\"!==(i=o[r])&&this.removeAllListeners(i);return this.removeAllListeners(\"removeListener\"),this._events=Object.create(null),this._eventsCount=0,this}if(\"function\"==typeof(e=n[t]))this.removeListener(t,e);else if(void 0!==e)for(r=e.length-1;r>=0;r--)this.removeListener(t,e[r]);return this},m.prototype.listeners=function(t){return L(this,t,!0)},m.prototype.rawListeners=function(t){return L(this,t,!1)},m.listenerCount=function(t,e){return\"function\"==typeof t.listenerCount?t.listenerCount(e):S.call(t,e)},m.prototype.listenerCount=S,m.prototype.eventNames=function(){return this._eventsCount>0?g(this._events):[]},\"undefined\"!=typeof Symbol&&(N.prototype[Symbol.iterator]=function(){return this}),N.of=function(){var t=arguments,e=t.length,n=0;return new N((function(){return n>=e?{done:!0}:{done:!1,value:t[n++]}}))},N.empty=function(){return new N((function(){return{done:!0}}))},N.fromSequence=function(t){var e=0,n=t.length;return new N((function(){return e>=n?{done:!0}:{done:!1,value:t[e++]}}))},N.is=function(t){return t instanceof N||\"object\"==typeof t&&null!==t&&\"function\"==typeof t.next};var O=N,j={};j.ARRAY_BUFFER_SUPPORT=\"undefined\"!=typeof ArrayBuffer,j.SYMBOL_SUPPORT=\"undefined\"!=typeof Symbol;var C=O,M=j,z=M.ARRAY_BUFFER_SUPPORT,W=M.SYMBOL_SUPPORT;var P=function(t){var e=function(t){return\"string\"==typeof t||Array.isArray(t)||z&&ArrayBuffer.isView(t)?C.fromSequence(t):\"object\"!=typeof t||null===t?null:W&&\"function\"==typeof t[Symbol.iterator]?t[Symbol.iterator]():\"function\"==typeof t.next?t:null}(t);if(!e)throw new Error(\"obliterator: target is not iterable nor a valid iterator.\");return e},R=P,K=function(t,e){for(var n,r=arguments.length>1?e:1/0,i=r!==1/0?new Array(r):[],o=0,a=R(t);;){if(o===r)return i;if((n=a.next()).done)return o!==e&&(i.length=o),i;i[o++]=n.value}},T=function(t){function n(e){var n;return(n=t.call(this)||this).name=\"GraphError\",n.message=e,n}return e(n,t),n}(a(Error)),B=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"InvalidArgumentsGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T),F=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"NotFoundGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T),I=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"UsageGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T);function Y(t,e){this.key=t,this.attributes=e,this.clear()}function q(t,e){this.key=t,this.attributes=e,this.clear()}function J(t,e){this.key=t,this.attributes=e,this.clear()}function V(t,e,n,r,i){this.key=e,this.attributes=i,this.undirected=t,this.source=n,this.target=r}Y.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}},q.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}},J.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}},V.prototype.attach=function(){var t=\"out\",e=\"in\";this.undirected&&(t=e=\"undirected\");var n=this.source.key,r=this.target.key;this.source[t][r]=this,this.undirected&&n===r||(this.target[e][n]=this)},V.prototype.attachMulti=function(){var t=\"out\",e=\"in\",n=this.source.key,r=this.target.key;this.undirected&&(t=e=\"undirected\");var i=this.source[t],o=i[r];if(void 0===o)return i[r]=this,void(this.undirected&&n===r||(this.target[e][n]=this));o.previous=this,this.next=o,i[r]=this,this.target[e][n]=this},V.prototype.detach=function(){var t=this.source.key,e=this.target.key,n=\"out\",r=\"in\";this.undirected&&(n=r=\"undirected\"),delete this.source[n][e],delete this.target[r][t]},V.prototype.detachMulti=function(){var t=this.source.key,e=this.target.key,n=\"out\",r=\"in\";this.undirected&&(n=r=\"undirected\"),void 0===this.previous?void 0===this.next?(delete this.source[n][e],delete this.target[r][t]):(this.next.previous=void 0,this.source[n][e]=this.next,this.target[r][t]=this.next):(this.previous.next=this.next,void 0!==this.next&&(this.next.previous=this.previous))};function H(t,e,n,r,i,o,a){var c,u,d,s;if(r=\"\"+r,0===n){if(!(c=t._nodes.get(r)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(r,'\" node in the graph.'));d=i,s=o}else if(3===n){if(i=\"\"+i,!(u=t._edges.get(i)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(i,'\" edge in the graph.'));var h=u.source.key,p=u.target.key;if(r===h)c=u.target;else{if(r!==p)throw new F(\"Graph.\".concat(e,': the \"').concat(r,'\" node is not attached to the \"').concat(i,'\" edge (').concat(h,\", \").concat(p,\").\"));c=u.source}d=o,s=a}else{if(!(u=t._edges.get(r)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(r,'\" edge in the graph.'));c=1===n?u.source:u.target,d=i,s=o}return[c,d,s]}var Q=[{name:function(t){return\"get\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return a.attributes[c]}}},{name:function(t){return\"get\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){return H(this,e,n,t,r)[0].attributes}}},{name:function(t){return\"has\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return a.attributes.hasOwnProperty(c)}}},{name:function(t){return\"set\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i,o){var a=H(this,e,n,t,r,i,o),c=a[0],u=a[1],d=a[2];return c.attributes[u]=d,this.emit(\"nodeAttributesUpdated\",{key:c.key,type:\"set\",attributes:c.attributes,name:u}),this}}},{name:function(t){return\"update\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i,o){var a=H(this,e,n,t,r,i,o),c=a[0],u=a[1],d=a[2];if(\"function\"!=typeof d)throw new B(\"Graph.\".concat(e,\": updater should be a function.\"));var s=c.attributes,h=d(s[u]);return s[u]=h,this.emit(\"nodeAttributesUpdated\",{key:c.key,type:\"set\",attributes:c.attributes,name:u}),this}}},{name:function(t){return\"remove\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return delete a.attributes[c],this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"remove\",attributes:a.attributes,name:c}),this}}},{name:function(t){return\"replace\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(!s(c))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return a.attributes=c,this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"replace\",attributes:a.attributes}),this}}},{name:function(t){return\"merge\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(!s(c))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return u(a.attributes,c),this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"merge\",attributes:a.attributes,data:c}),this}}},{name:function(t){return\"update\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(\"function\"!=typeof c)throw new B(\"Graph.\".concat(e,\": provided updater is not a function.\"));return a.attributes=c(a.attributes),this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"update\",attributes:a.attributes}),this}}}];var X=[{name:function(t){return\"get\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return i.attributes[r]}}},{name:function(t){return\"get\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t){var r;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>1){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var i=\"\"+t,o=\"\"+arguments[1];if(!(r=d(this,i,o,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(i,'\" - \"').concat(o,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(r=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return r.attributes}}},{name:function(t){return\"has\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return i.attributes.hasOwnProperty(r)}}},{name:function(t){return\"set\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>3){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var a=\"\"+t,c=\"\"+r;if(r=arguments[2],i=arguments[3],!(o=d(this,a,c,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(a,'\" - \"').concat(c,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(o=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return o.attributes[r]=i,this.emit(\"edgeAttributesUpdated\",{key:o.key,type:\"set\",attributes:o.attributes,name:r}),this}}},{name:function(t){return\"update\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>3){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var a=\"\"+t,c=\"\"+r;if(r=arguments[2],i=arguments[3],!(o=d(this,a,c,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(a,'\" - \"').concat(c,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(o=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(\"function\"!=typeof i)throw new B(\"Graph.\".concat(e,\": updater should be a function.\"));return o.attributes[r]=i(o.attributes[r]),this.emit(\"edgeAttributesUpdated\",{key:o.key,type:\"set\",attributes:o.attributes,name:r}),this}}},{name:function(t){return\"remove\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return delete i.attributes[r],this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"remove\",attributes:i.attributes,name:r}),this}}},{name:function(t){return\"replace\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(!s(r))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return i.attributes=r,this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"replace\",attributes:i.attributes}),this}}},{name:function(t){return\"merge\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(!s(r))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return u(i.attributes,r),this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"merge\",attributes:i.attributes,data:r}),this}}},{name:function(t){return\"update\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(\"function\"!=typeof r)throw new B(\"Graph.\".concat(e,\": provided updater is not a function.\"));return i.attributes=r(i.attributes),this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"update\",attributes:i.attributes}),this}}}];var Z=O,$=P,tt=function(){var t=arguments,e=null,n=-1;return new Z((function(){for(var r=null;;){if(null===e){if(++n>=t.length)return{done:!0};e=$(t[n])}if(!0!==(r=e.next()).done)break;e=null}return r}))},et=[{name:\"edges\",type:\"mixed\"},{name:\"inEdges\",type:\"directed\",direction:\"in\"},{name:\"outEdges\",type:\"directed\",direction:\"out\"},{name:\"inboundEdges\",type:\"mixed\",direction:\"in\"},{name:\"outboundEdges\",type:\"mixed\",direction:\"out\"},{name:\"directedEdges\",type:\"directed\"},{name:\"undirectedEdges\",type:\"undirected\"}];function nt(t,e,n,r){var i=!1;for(var o in e)if(o!==r){var a=e[o];if(i=n(a.key,a.attributes,a.source.key,a.target.key,a.source.attributes,a.target.attributes,a.undirected),t&&i)return a.key}}function rt(t,e,n,r){var i,o,a,c=!1;for(var u in e)if(u!==r){i=e[u];do{if(o=i.source,a=i.target,c=n(i.key,i.attributes,o.key,a.key,o.attributes,a.attributes,i.undirected),t&&c)return i.key;i=i.next}while(void 0!==i)}}function it(t,e){var n,r=Object.keys(t),i=r.length,o=0;return new O((function(){do{if(n)n=n.next;else{if(o>=i)return{done:!0};var a=r[o++];if(a===e){n=void 0;continue}n=t[a]}}while(!n);return{done:!1,value:{edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected}}}))}function ot(t,e,n,r){var i=e[n];if(i){var o=i.source,a=i.target;return r(i.key,i.attributes,o.key,a.key,o.attributes,a.attributes,i.undirected)&&t?i.key:void 0}}function at(t,e,n,r){var i=e[n];if(i){var o=!1;do{if(o=r(i.key,i.attributes,i.source.key,i.target.key,i.source.attributes,i.target.attributes,i.undirected),t&&o)return i.key;i=i.next}while(void 0!==i)}}function ct(t,e){var n=t[e];return void 0!==n.next?new O((function(){if(!n)return{done:!0};var t={edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected};return n=n.next,{done:!1,value:t}})):O.of({edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected})}function ut(t,e){if(0===t.size)return[];if(\"mixed\"===e||e===t.type)return\"function\"==typeof Array.from?Array.from(t._edges.keys()):K(t._edges.keys(),t._edges.size);for(var n,r,i=\"undirected\"===e?t.undirectedSize:t.directedSize,o=new Array(i),a=\"undirected\"===e,c=t._edges.values(),u=0;!0!==(n=c.next()).done;)(r=n.value).undirected===a&&(o[u++]=r.key);return o}function dt(t,e,n,r){if(0!==e.size)for(var i,o,a=\"mixed\"!==n&&n!==e.type,c=\"undirected\"===n,u=!1,d=e._edges.values();!0!==(i=d.next()).done;)if(o=i.value,!a||o.undirected===c){var s=o,h=s.key,p=s.attributes,f=s.source,l=s.target;if(u=r(h,p,f.key,l.key,f.attributes,l.attributes,o.undirected),t&&u)return h}}function st(t,e){if(0===t.size)return O.empty();var n=\"mixed\"!==e&&e!==t.type,r=\"undirected\"===e,i=t._edges.values();return new O((function(){for(var t,e;;){if((t=i.next()).done)return t;if(e=t.value,!n||e.undirected===r)break}return{value:{edge:e.key,attributes:e.attributes,source:e.source.key,target:e.target.key,sourceAttributes:e.source.attributes,targetAttributes:e.target.attributes,undirected:e.undirected},done:!1}}))}function ht(t,e,n,r,i,o){var a,c=e?rt:nt;if(\"undirected\"!==n){if(\"out\"!==r&&(a=c(t,i.in,o),t&&a))return a;if(\"in\"!==r&&(a=c(t,i.out,o,r?void 0:i.key),t&&a))return a}if(\"directed\"!==n&&(a=c(t,i.undirected,o),t&&a))return a}function pt(t,e,n,r){var i=[];return ht(!1,t,e,n,r,(function(t){i.push(t)})),i}function ft(t,e,n){var r=O.empty();return\"undirected\"!==t&&(\"out\"!==e&&void 0!==n.in&&(r=tt(r,it(n.in))),\"in\"!==e&&void 0!==n.out&&(r=tt(r,it(n.out,e?void 0:n.key)))),\"directed\"!==t&&void 0!==n.undirected&&(r=tt(r,it(n.undirected))),r}function lt(t,e,n,r,i,o,a){var c,u=n?at:ot;if(\"undirected\"!==e){if(void 0!==i.in&&\"out\"!==r&&(c=u(t,i.in,o,a),t&&c))return c;if(void 0!==i.out&&\"in\"!==r&&(r||i.key!==o)&&(c=u(t,i.out,o,a),t&&c))return c}if(\"directed\"!==e&&void 0!==i.undirected&&(c=u(t,i.undirected,o,a),t&&c))return c}function gt(t,e,n,r,i){var o=[];return lt(!1,t,e,n,r,i,(function(t){o.push(t)})),o}function yt(t,e,n,r){var i=O.empty();return\"undirected\"!==t&&(void 0!==n.in&&\"out\"!==e&&r in n.in&&(i=tt(i,ct(n.in,r))),void 0!==n.out&&\"in\"!==e&&r in n.out&&(e||n.key!==r)&&(i=tt(i,ct(n.out,r)))),\"directed\"!==t&&void 0!==n.undirected&&r in n.undirected&&(i=tt(i,ct(n.undirected,r))),i}var wt=[{name:\"neighbors\",type:\"mixed\"},{name:\"inNeighbors\",type:\"directed\",direction:\"in\"},{name:\"outNeighbors\",type:\"directed\",direction:\"out\"},{name:\"inboundNeighbors\",type:\"mixed\",direction:\"in\"},{name:\"outboundNeighbors\",type:\"mixed\",direction:\"out\"},{name:\"directedNeighbors\",type:\"directed\"},{name:\"undirectedNeighbors\",type:\"undirected\"}];function vt(){this.A=null,this.B=null}function bt(t,e,n,r,i){for(var o in r){var a=r[o],c=a.source,u=a.target,d=c===n?u:c;if(!e||!e.has(d.key)){var s=i(d.key,d.attributes);if(t&&s)return d.key}}}function mt(t,e,n,r,i){if(\"mixed\"!==e){if(\"undirected\"===e)return bt(t,null,r,r.undirected,i);if(\"string\"==typeof n)return bt(t,null,r,r[n],i)}var o,a=new vt;if(\"undirected\"!==e){if(\"out\"!==n){if(o=bt(t,null,r,r.in,i),t&&o)return o;a.wrap(r.in)}if(\"in\"!==n){if(o=bt(t,a,r,r.out,i),t&&o)return o;a.wrap(r.out)}}if(\"directed\"!==e&&(o=bt(t,a,r,r.undirected,i),t&&o))return o}function kt(t,e,n){var r=Object.keys(n),i=r.length,o=0;return new O((function(){var a=null;do{if(o>=i)return t&&t.wrap(n),{done:!0};var c=n[r[o++]],u=c.source,d=c.target;a=u===e?d:u,t&&t.has(a.key)&&(a=null)}while(null===a);return{done:!1,value:{neighbor:a.key,attributes:a.attributes}}}))}function _t(t,e){var n=e.name,r=e.type,i=e.direction;t.prototype[n]=function(t){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return[];t=\"\"+t;var e=this._nodes.get(t);if(void 0===e)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" node in the graph.'));return function(t,e,n){if(\"mixed\"!==t){if(\"undirected\"===t)return Object.keys(n.undirected);if(\"string\"==typeof e)return Object.keys(n[e])}var r=[];return mt(!1,t,e,n,(function(t){r.push(t)})),r}(\"mixed\"===r?this.type:r,i,e)}}function Gt(t,e){var n=e.name,r=e.type,i=e.direction,o=n.slice(0,-1)+\"Entries\";t.prototype[o]=function(t){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return O.empty();t=\"\"+t;var e=this._nodes.get(t);if(void 0===e)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return function(t,e,n){if(\"mixed\"!==t){if(\"undirected\"===t)return kt(null,n,n.undirected);if(\"string\"==typeof e)return kt(null,n,n[e])}var r=O.empty(),i=new vt;return\"undirected\"!==t&&(\"out\"!==e&&(r=tt(r,kt(i,n,n.in))),\"in\"!==e&&(r=tt(r,kt(i,n,n.out)))),\"directed\"!==t&&(r=tt(r,kt(i,n,n.undirected))),r}(\"mixed\"===r?this.type:r,i,e)}}function xt(t,e,n,r,i){for(var o,a,c,u,d,s,h,p=r._nodes.values(),f=r.type;!0!==(o=p.next()).done;){var l=!1;if(a=o.value,\"undirected\"!==f)for(c in u=a.out){d=u[c];do{if(s=d.target,l=!0,h=i(a.key,s.key,a.attributes,s.attributes,d.key,d.attributes,d.undirected),t&&h)return d;d=d.next}while(d)}if(\"directed\"!==f)for(c in u=a.undirected)if(!(e&&a.key>c)){d=u[c];do{if((s=d.target).key!==c&&(s=d.source),l=!0,h=i(a.key,s.key,a.attributes,s.attributes,d.key,d.attributes,d.undirected),t&&h)return d;d=d.next}while(d)}if(n&&!l&&(h=i(a.key,null,a.attributes,null,null,null,null),t&&h))return null}}function Et(t){if(!s(t))throw new B('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a \"key\" property.');if(!(\"key\"in t))throw new B(\"Graph.import: serialized node is missing its key.\");if(\"attributes\"in t&&(!s(t.attributes)||null===t.attributes))throw new B(\"Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.\")}function At(t){if(!s(t))throw new B('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a \"source\" & \"target\" property.');if(!(\"source\"in t))throw new B(\"Graph.import: serialized edge is missing its source.\");if(!(\"target\"in t))throw new B(\"Graph.import: serialized edge is missing its target.\");if(\"attributes\"in t&&(!s(t.attributes)||null===t.attributes))throw new B(\"Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.\");if(\"undirected\"in t&&\"boolean\"!=typeof t.undirected)throw new B(\"Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.\")}vt.prototype.wrap=function(t){null===this.A?this.A=t:null===this.B&&(this.B=t)},vt.prototype.has=function(t){return null!==this.A&&t in this.A||null!==this.B&&t in this.B};var Lt,St=(Lt=255&Math.floor(256*Math.random()),function(){return Lt++}),Dt=new Set([\"directed\",\"undirected\",\"mixed\"]),Ut=new Set([\"domain\",\"_events\",\"_eventsCount\",\"_maxListeners\"]),Nt={allowSelfLoops:!0,multi:!1,type:\"mixed\"};function Ot(t,e,n){var r=new t.NodeDataClass(e,n);return t._nodes.set(e,r),t.emit(\"nodeAdded\",{key:e,attributes:n}),r}function jt(t,e,n,r,i,o,a,c){if(!r&&\"undirected\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.\"));if(r&&\"directed\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.\"));if(c&&!s(c))throw new B(\"Graph.\".concat(e,': invalid attributes. Expecting an object but got \"').concat(c,'\"'));if(o=\"\"+o,a=\"\"+a,c=c||{},!t.allowSelfLoops&&o===a)throw new I(\"Graph.\".concat(e,': source & target are the same (\"').concat(o,\"\\\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.\"));var u=t._nodes.get(o),d=t._nodes.get(a);if(!u)throw new F(\"Graph.\".concat(e,': source node \"').concat(o,'\" not found.'));if(!d)throw new F(\"Graph.\".concat(e,': target node \"').concat(a,'\" not found.'));var h={key:null,undirected:r,source:o,target:a,attributes:c};if(n)i=t._edgeKeyGenerator();else if(i=\"\"+i,t._edges.has(i))throw new I(\"Graph.\".concat(e,': the \"').concat(i,'\" edge already exists in the graph.'));if(!t.multi&&(r?void 0!==u.undirected[a]:void 0!==u.out[a]))throw new I(\"Graph.\".concat(e,': an edge linking \"').concat(o,'\" to \"').concat(a,\"\\\" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.\"));var p=new V(r,i,u,d,c);t._edges.set(i,p);var f=o===a;return r?(u.undirectedDegree++,d.undirectedDegree++,f&&(u.undirectedLoops++,t._undirectedSelfLoopCount++)):(u.outDegree++,d.inDegree++,f&&(u.directedLoops++,t._directedSelfLoopCount++)),t.multi?p.attachMulti():p.attach(),r?t._undirectedSize++:t._directedSize++,h.key=i,t.emit(\"edgeAdded\",h),i}function Ct(t,e,n,r,i,o,a,c,d){if(!r&&\"undirected\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.\"));if(r&&\"directed\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.\"));if(c)if(d){if(\"function\"!=typeof c)throw new B(\"Graph.\".concat(e,': invalid updater function. Expecting a function but got \"').concat(c,'\"'))}else if(!s(c))throw new B(\"Graph.\".concat(e,': invalid attributes. Expecting an object but got \"').concat(c,'\"'));var h;if(o=\"\"+o,a=\"\"+a,d&&(h=c,c=void 0),!t.allowSelfLoops&&o===a)throw new I(\"Graph.\".concat(e,': source & target are the same (\"').concat(o,\"\\\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.\"));var p,f,l=t._nodes.get(o),g=t._nodes.get(a);if(!n&&(p=t._edges.get(i))){if(!(p.source.key===o&&p.target.key===a||r&&p.source.key===a&&p.target.key===o))throw new I(\"Graph.\".concat(e,': inconsistency detected when attempting to merge the \"').concat(i,'\" edge with \"').concat(o,'\" source & \"').concat(a,'\" target vs. (\"').concat(p.source.key,'\", \"').concat(p.target.key,'\").'));f=p}if(f||t.multi||!l||(f=r?l.undirected[a]:l.out[a]),f){var y=[f.key,!1,!1,!1];if(d?!h:!c)return y;if(d){var w=f.attributes;f.attributes=h(w),t.emit(\"edgeAttributesUpdated\",{type:\"replace\",key:f.key,attributes:f.attributes})}else u(f.attributes,c),t.emit(\"edgeAttributesUpdated\",{type:\"merge\",key:f.key,attributes:f.attributes,data:c});return y}c=c||{},d&&h&&(c=h(c));var v={key:null,undirected:r,source:o,target:a,attributes:c};if(n)i=t._edgeKeyGenerator();else if(i=\"\"+i,t._edges.has(i))throw new I(\"Graph.\".concat(e,': the \"').concat(i,'\" edge already exists in the graph.'));var b=!1,m=!1;l||(l=Ot(t,o,{}),b=!0,o===a&&(g=l,m=!0)),g||(g=Ot(t,a,{}),m=!0),p=new V(r,i,l,g,c),t._edges.set(i,p);var k=o===a;return r?(l.undirectedDegree++,g.undirectedDegree++,k&&(l.undirectedLoops++,t._undirectedSelfLoopCount++)):(l.outDegree++,g.inDegree++,k&&(l.directedLoops++,t._directedSelfLoopCount++)),t.multi?p.attachMulti():p.attach(),r?t._undirectedSize++:t._directedSize++,v.key=i,t.emit(\"edgeAdded\",v),[i,!0,b,m]}function Mt(t,e){t._edges.delete(e.key);var n=e.source,r=e.target,i=e.attributes,o=e.undirected,a=n===r;o?(n.undirectedDegree--,r.undirectedDegree--,a&&(n.undirectedLoops--,t._undirectedSelfLoopCount--)):(n.outDegree--,r.inDegree--,a&&(n.directedLoops--,t._directedSelfLoopCount--)),t.multi?e.detachMulti():e.detach(),o?t._undirectedSize--:t._directedSize--,t.emit(\"edgeDropped\",{key:e.key,attributes:i,source:n.key,target:r.key,undirected:o})}var zt=function(n){function r(t){var e;if(e=n.call(this)||this,\"boolean\"!=typeof(t=u({},Nt,t)).multi)throw new B(\"Graph.constructor: invalid 'multi' option. Expecting a boolean but got \\\"\".concat(t.multi,'\".'));if(!Dt.has(t.type))throw new B('Graph.constructor: invalid \\'type\\' option. Should be one of \"mixed\", \"directed\" or \"undirected\" but got \"'.concat(t.type,'\".'));if(\"boolean\"!=typeof t.allowSelfLoops)throw new B(\"Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got \\\"\".concat(t.allowSelfLoops,'\".'));var r=\"mixed\"===t.type?Y:\"directed\"===t.type?q:J;p(c(e),\"NodeDataClass\",r);var i=\"geid_\"+St()+\"_\",o=0;return p(c(e),\"_attributes\",{}),p(c(e),\"_nodes\",new Map),p(c(e),\"_edges\",new Map),p(c(e),\"_directedSize\",0),p(c(e),\"_undirectedSize\",0),p(c(e),\"_directedSelfLoopCount\",0),p(c(e),\"_undirectedSelfLoopCount\",0),p(c(e),\"_edgeKeyGenerator\",(function(){var t;do{t=i+o++}while(e._edges.has(t));return t})),p(c(e),\"_options\",t),Ut.forEach((function(t){return p(c(e),t,e[t])})),f(c(e),\"order\",(function(){return e._nodes.size})),f(c(e),\"size\",(function(){return e._edges.size})),f(c(e),\"directedSize\",(function(){return e._directedSize})),f(c(e),\"undirectedSize\",(function(){return e._undirectedSize})),f(c(e),\"selfLoopCount\",(function(){return e._directedSelfLoopCount+e._undirectedSelfLoopCount})),f(c(e),\"directedSelfLoopCount\",(function(){return e._directedSelfLoopCount})),f(c(e),\"undirectedSelfLoopCount\",(function(){return e._undirectedSelfLoopCount})),f(c(e),\"multi\",e._options.multi),f(c(e),\"type\",e._options.type),f(c(e),\"allowSelfLoops\",e._options.allowSelfLoops),f(c(e),\"implementation\",(function(){return\"graphology\"})),e}e(r,n);var i=r.prototype;return i._resetInstanceCounters=function(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0},i.hasNode=function(t){return this._nodes.has(\"\"+t)},i.hasDirectedEdge=function(t,e){if(\"undirected\"===this.type)return!1;if(1===arguments.length){var n=\"\"+t,r=this._edges.get(n);return!!r&&!r.undirected}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var i=this._nodes.get(t);return!!i&&i.out.hasOwnProperty(e)}throw new B(\"Graph.hasDirectedEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.hasUndirectedEdge=function(t,e){if(\"directed\"===this.type)return!1;if(1===arguments.length){var n=\"\"+t,r=this._edges.get(n);return!!r&&r.undirected}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var i=this._nodes.get(t);return!!i&&i.undirected.hasOwnProperty(e)}throw new B(\"Graph.hasDirectedEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.hasEdge=function(t,e){if(1===arguments.length){var n=\"\"+t;return this._edges.has(n)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var r=this._nodes.get(t);return!!r&&(void 0!==r.out&&r.out.hasOwnProperty(e)||void 0!==r.undirected&&r.undirected.hasOwnProperty(e))}throw new B(\"Graph.hasEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.directedEdge=function(t,e){if(\"undirected\"!==this.type){if(t=\"\"+t,e=\"\"+e,this.multi)throw new I(\"Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.\");var n=this._nodes.get(t);if(!n)throw new F('Graph.directedEdge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.directedEdge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.out&&n.out[e]||void 0;return r?r.key:void 0}},i.undirectedEdge=function(t,e){if(\"directed\"!==this.type){if(t=\"\"+t,e=\"\"+e,this.multi)throw new I(\"Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.\");var n=this._nodes.get(t);if(!n)throw new F('Graph.undirectedEdge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.undirectedEdge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.undirected&&n.undirected[e]||void 0;return r?r.key:void 0}},i.edge=function(t,e){if(this.multi)throw new I(\"Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.\");t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.edge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.edge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.out&&n.out[e]||n.undirected&&n.undirected[e]||void 0;if(r)return r.key},i.areDirectedNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areDirectedNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&(e in n.in||e in n.out)},i.areOutNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areOutNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.out},i.areInNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areInNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.in},i.areUndirectedNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areUndirectedNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"!==this.type&&e in n.undirected},i.areNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&(e in n.in||e in n.out)||\"directed\"!==this.type&&e in n.undirected},i.areInboundNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areInboundNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.in||\"directed\"!==this.type&&e in n.undirected},i.areOutboundNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areOutboundNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.out||\"directed\"!==this.type&&e in n.undirected},i.inDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree},i.outDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.outDegree},i.directedDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.directedDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree+e.outDegree},i.undirectedDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.undirectedDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"===this.type?0:e.undirectedDegree},i.inboundDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inboundDegree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.inDegree),n},i.outboundDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outboundDegree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.outDegree),n},i.degree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.degree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.inDegree+e.outDegree),n},i.inDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree-e.directedLoops},i.outDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.outDegree-e.directedLoops},i.directedDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.directedDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree+e.outDegree-2*e.directedLoops},i.undirectedDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.undirectedDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"===this.type?0:e.undirectedDegree-2*e.undirectedLoops},i.inboundDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inboundDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.inDegree,r+=e.directedLoops),n-r},i.outboundDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outboundDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.outDegree,r+=e.directedLoops),n-r},i.degreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.degreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.inDegree+e.outDegree,r+=2*e.directedLoops),n-r},i.source=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.source: could not find the \"'.concat(t,'\" edge in the graph.'));return e.source.key},i.target=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.target: could not find the \"'.concat(t,'\" edge in the graph.'));return e.target.key},i.extremities=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.extremities: could not find the \"'.concat(t,'\" edge in the graph.'));return[e.source.key,e.target.key]},i.opposite=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._edges.get(e);if(!n)throw new F('Graph.opposite: could not find the \"'.concat(e,'\" edge in the graph.'));var r=n.source.key,i=n.target.key;if(t===r)return i;if(t===i)return r;throw new F('Graph.opposite: the \"'.concat(t,'\" node is not attached to the \"').concat(e,'\" edge (').concat(r,\", \").concat(i,\").\"))},i.hasExtremity=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._edges.get(t);if(!n)throw new F('Graph.hasExtremity: could not find the \"'.concat(t,'\" edge in the graph.'));return n.source.key===e||n.target.key===e},i.isUndirected=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isUndirected: could not find the \"'.concat(t,'\" edge in the graph.'));return e.undirected},i.isDirected=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isDirected: could not find the \"'.concat(t,'\" edge in the graph.'));return!e.undirected},i.isSelfLoop=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isSelfLoop: could not find the \"'.concat(t,'\" edge in the graph.'));return e.source===e.target},i.addNode=function(t,e){var n=function(t,e,n){if(n&&!s(n))throw new B('Graph.addNode: invalid attributes. Expecting an object but got \"'.concat(n,'\"'));if(e=\"\"+e,n=n||{},t._nodes.has(e))throw new I('Graph.addNode: the \"'.concat(e,'\" node already exist in the graph.'));var r=new t.NodeDataClass(e,n);return t._nodes.set(e,r),t.emit(\"nodeAdded\",{key:e,attributes:n}),r}(this,t,e);return n.key},i.mergeNode=function(t,e){if(e&&!s(e))throw new B('Graph.mergeNode: invalid attributes. Expecting an object but got \"'.concat(e,'\"'));t=\"\"+t,e=e||{};var n=this._nodes.get(t);return n?(e&&(u(n.attributes,e),this.emit(\"nodeAttributesUpdated\",{type:\"merge\",key:t,attributes:n.attributes,data:e})),[t,!1]):(n=new this.NodeDataClass(t,e),this._nodes.set(t,n),this.emit(\"nodeAdded\",{key:t,attributes:e}),[t,!0])},i.updateNode=function(t,e){if(e&&\"function\"!=typeof e)throw new B('Graph.updateNode: invalid updater function. Expecting a function but got \"'.concat(e,'\"'));t=\"\"+t;var n=this._nodes.get(t);if(n){if(e){var r=n.attributes;n.attributes=e(r),this.emit(\"nodeAttributesUpdated\",{type:\"replace\",key:t,attributes:n.attributes})}return[t,!1]}var i=e?e({}):{};return n=new this.NodeDataClass(t,i),this._nodes.set(t,n),this.emit(\"nodeAdded\",{key:t,attributes:i}),[t,!0]},i.dropNode=function(t){t=\"\"+t;var e,n=this._nodes.get(t);if(!n)throw new F('Graph.dropNode: could not find the \"'.concat(t,'\" node in the graph.'));if(\"undirected\"!==this.type){for(var r in n.out){e=n.out[r];do{Mt(this,e),e=e.next}while(e)}for(var i in n.in){e=n.in[i];do{Mt(this,e),e=e.next}while(e)}}if(\"directed\"!==this.type)for(var o in n.undirected){e=n.undirected[o];do{Mt(this,e),e=e.next}while(e)}this._nodes.delete(t),this.emit(\"nodeDropped\",{key:t,attributes:n.attributes})},i.dropEdge=function(t){var e;if(arguments.length>1){var n=\"\"+arguments[0],r=\"\"+arguments[1];if(!(e=d(this,n,r,this.type)))throw new F('Graph.dropEdge: could not find the \"'.concat(n,'\" -> \"').concat(r,'\" edge in the graph.'))}else if(t=\"\"+t,!(e=this._edges.get(t)))throw new F('Graph.dropEdge: could not find the \"'.concat(t,'\" edge in the graph.'));return Mt(this,e),this},i.dropDirectedEdge=function(t,e){if(arguments.length<2)throw new I(\"Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.\");if(this.multi)throw new I(\"Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.\");var n=d(this,t=\"\"+t,e=\"\"+e,\"directed\");if(!n)throw new F('Graph.dropDirectedEdge: could not find a \"'.concat(t,'\" -> \"').concat(e,'\" edge in the graph.'));return Mt(this,n),this},i.dropUndirectedEdge=function(t,e){if(arguments.length<2)throw new I(\"Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.\");if(this.multi)throw new I(\"Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.\");var n=d(this,t,e,\"undirected\");if(!n)throw new F('Graph.dropUndirectedEdge: could not find a \"'.concat(t,'\" -> \"').concat(e,'\" edge in the graph.'));return Mt(this,n),this},i.clear=function(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit(\"cleared\")},i.clearEdges=function(){for(var t,e=this._nodes.values();!0!==(t=e.next()).done;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit(\"edgesCleared\")},i.getAttribute=function(t){return this._attributes[t]},i.getAttributes=function(){return this._attributes},i.hasAttribute=function(t){return this._attributes.hasOwnProperty(t)},i.setAttribute=function(t,e){return this._attributes[t]=e,this.emit(\"attributesUpdated\",{type:\"set\",attributes:this._attributes,name:t}),this},i.updateAttribute=function(t,e){if(\"function\"!=typeof e)throw new B(\"Graph.updateAttribute: updater should be a function.\");var n=this._attributes[t];return this._attributes[t]=e(n),this.emit(\"attributesUpdated\",{type:\"set\",attributes:this._attributes,name:t}),this},i.removeAttribute=function(t){return delete this._attributes[t],this.emit(\"attributesUpdated\",{type:\"remove\",attributes:this._attributes,name:t}),this},i.replaceAttributes=function(t){if(!s(t))throw new B(\"Graph.replaceAttributes: provided attributes are not a plain object.\");return this._attributes=t,this.emit(\"attributesUpdated\",{type:\"replace\",attributes:this._attributes}),this},i.mergeAttributes=function(t){if(!s(t))throw new B(\"Graph.mergeAttributes: provided attributes are not a plain object.\");return u(this._attributes,t),this.emit(\"attributesUpdated\",{type:\"merge\",attributes:this._attributes,data:t}),this},i.updateAttributes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.updateAttributes: provided updater is not a function.\");return this._attributes=t(this._attributes),this.emit(\"attributesUpdated\",{type:\"update\",attributes:this._attributes}),this},i.updateEachNodeAttributes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.updateEachNodeAttributes: expecting an updater function.\");if(e&&!l(e))throw new B(\"Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}\");for(var n,r,i=this._nodes.values();!0!==(n=i.next()).done;)(r=n.value).attributes=t(r.key,r.attributes);this.emit(\"eachNodeAttributesUpdated\",{hints:e||null})},i.updateEachEdgeAttributes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.updateEachEdgeAttributes: expecting an updater function.\");if(e&&!l(e))throw new B(\"Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}\");for(var n,r,i,o,a=this._edges.values();!0!==(n=a.next()).done;)i=(r=n.value).source,o=r.target,r.attributes=t(r.key,r.attributes,i.key,o.key,i.attributes,o.attributes,r.undirected);this.emit(\"eachEdgeAttributesUpdated\",{hints:e||null})},i.forEachAdjacencyEntry=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAdjacencyEntry: expecting a callback.\");xt(!1,!1,!1,this,t)},i.forEachAdjacencyEntryWithOrphans=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.\");xt(!1,!1,!0,this,t)},i.forEachAssymetricAdjacencyEntry=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAssymetricAdjacencyEntry: expecting a callback.\");xt(!1,!0,!1,this,t)},i.forEachAssymetricAdjacencyEntryWithOrphans=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.\");xt(!1,!0,!0,this,t)},i.nodes=function(){return\"function\"==typeof Array.from?Array.from(this._nodes.keys()):K(this._nodes.keys(),this._nodes.size)},i.forEachNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)t((n=e.value).key,n.attributes)},i.findNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.findNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(t((n=e.value).key,n.attributes))return n.key},i.mapNodes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.mapNode: expecting a callback.\");for(var e,n,r=this._nodes.values(),i=new Array(this.order),o=0;!0!==(e=r.next()).done;)n=e.value,i[o++]=t(n.key,n.attributes);return i},i.someNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.someNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(t((n=e.value).key,n.attributes))return!0;return!1},i.everyNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.everyNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(!t((n=e.value).key,n.attributes))return!1;return!0},i.filterNodes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.filterNodes: expecting a callback.\");for(var e,n,r=this._nodes.values(),i=[];!0!==(e=r.next()).done;)t((n=e.value).key,n.attributes)&&i.push(n.key);return i},i.reduceNodes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.reduceNodes: expecting a callback.\");if(arguments.length<2)throw new B(\"Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\");for(var n,r,i=e,o=this._nodes.values();!0!==(n=o.next()).done;)i=t(i,(r=n.value).key,r.attributes);return i},i.nodeEntries=function(){var t=this._nodes.values();return new O((function(){var e=t.next();if(e.done)return e;var n=e.value;return{value:{node:n.key,attributes:n.attributes},done:!1}}))},i.export=function(){var t=this,e=new Array(this._nodes.size),n=0;this._nodes.forEach((function(t,r){e[n++]=function(t,e){var n={key:t};return h(e.attributes)||(n.attributes=u({},e.attributes)),n}(r,t)}));var r=new Array(this._edges.size);return n=0,this._edges.forEach((function(e,i){r[n++]=function(t,e,n){var r={key:e,source:n.source.key,target:n.target.key};return h(n.attributes)||(r.attributes=u({},n.attributes)),\"mixed\"===t&&n.undirected&&(r.undirected=!0),r}(t.type,i,e)})),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:e,edges:r}},i.import=function(t){var e,n,i,o,a,c=this,u=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t instanceof r)return t.forEachNode((function(t,e){u?c.mergeNode(t,e):c.addNode(t,e)})),t.forEachEdge((function(t,e,n,r,i,o,a){u?a?c.mergeUndirectedEdgeWithKey(t,n,r,e):c.mergeDirectedEdgeWithKey(t,n,r,e):a?c.addUndirectedEdgeWithKey(t,n,r,e):c.addDirectedEdgeWithKey(t,n,r,e)})),this;if(!s(t))throw new B(\"Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.\");if(t.attributes){if(!s(t.attributes))throw new B(\"Graph.import: invalid attributes. Expecting a plain object.\");u?this.mergeAttributes(t.attributes):this.replaceAttributes(t.attributes)}if(t.nodes){if(i=t.nodes,!Array.isArray(i))throw new B(\"Graph.import: invalid nodes. Expecting an array.\");for(e=0,n=i.length;e<n;e++){Et(o=i[e]);var d=o,h=d.key,p=d.attributes;u?this.mergeNode(h,p):this.addNode(h,p)}}if(t.edges){var f=!1;if(\"undirected\"===this.type&&(f=!0),i=t.edges,!Array.isArray(i))throw new B(\"Graph.import: invalid edges. Expecting an array.\");for(e=0,n=i.length;e<n;e++){At(a=i[e]);var l=a,g=l.source,y=l.target,w=l.attributes,v=l.undirected,b=void 0===v?f:v;\"key\"in a?(u?b?this.mergeUndirectedEdgeWithKey:this.mergeDirectedEdgeWithKey:b?this.addUndirectedEdgeWithKey:this.addDirectedEdgeWithKey).call(this,a.key,g,y,w):(u?b?this.mergeUndirectedEdge:this.mergeDirectedEdge:b?this.addUndirectedEdge:this.addDirectedEdge).call(this,g,y,w)}}return this},i.nullCopy=function(t){var e=new r(u({},this._options,t));return e.replaceAttributes(u({},this.getAttributes())),e},i.emptyCopy=function(t){var e=this.nullCopy(t);return this._nodes.forEach((function(t,n){var r=u({},t.attributes);t=new e.NodeDataClass(n,r),e._nodes.set(n,t)})),e},i.copy=function(t){if(\"string\"==typeof(t=t||{}).type&&t.type!==this.type&&\"mixed\"!==t.type)throw new I('Graph.copy: cannot create an incompatible copy from \"'.concat(this.type,'\" type to \"').concat(t.type,'\" because this would mean losing information about the current graph.'));if(\"boolean\"==typeof t.multi&&t.multi!==this.multi&&!0!==t.multi)throw new I(\"Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.\");if(\"boolean\"==typeof t.allowSelfLoops&&t.allowSelfLoops!==this.allowSelfLoops&&!0!==t.allowSelfLoops)throw new I(\"Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.\");for(var e,n,r=this.emptyCopy(t),i=this._edges.values();!0!==(e=i.next()).done;)jt(r,\"copy\",!1,(n=e.value).undirected,n.key,n.source.key,n.target.key,u({},n.attributes));return r},i.toJSON=function(){return this.export()},i.toString=function(){return\"[object Graph]\"},i.inspect=function(){var e=this,n={};this._nodes.forEach((function(t,e){n[e]=t.attributes}));var r={},i={};this._edges.forEach((function(t,n){var o,a=t.undirected?\"--\":\"->\",c=\"\",u=t.source.key,d=t.target.key;t.undirected&&u>d&&(o=u,u=d,d=o);var s=\"(\".concat(u,\")\").concat(a,\"(\").concat(d,\")\");n.startsWith(\"geid_\")?e.multi&&(void 0===i[s]?i[s]=0:i[s]++,c+=\"\".concat(i[s],\". \")):c+=\"[\".concat(n,\"]: \"),r[c+=s]=t.attributes}));var o={};for(var a in this)this.hasOwnProperty(a)&&!Ut.has(a)&&\"function\"!=typeof this[a]&&\"symbol\"!==t(a)&&(o[a]=this[a]);return o.attributes=this._attributes,o.nodes=n,o.edges=r,p(o,\"constructor\",this.constructor),o},r}(y.exports.EventEmitter);\"undefined\"!=typeof Symbol&&(zt.prototype[Symbol.for(\"nodejs.util.inspect.custom\")]=zt.prototype.inspect),[{name:function(t){return\"\".concat(t,\"Edge\")},generateKey:!0},{name:function(t){return\"\".concat(t,\"DirectedEdge\")},generateKey:!0,type:\"directed\"},{name:function(t){return\"\".concat(t,\"UndirectedEdge\")},generateKey:!0,type:\"undirected\"},{name:function(t){return\"\".concat(t,\"EdgeWithKey\")}},{name:function(t){return\"\".concat(t,\"DirectedEdgeWithKey\")},type:\"directed\"},{name:function(t){return\"\".concat(t,\"UndirectedEdgeWithKey\")},type:\"undirected\"}].forEach((function(t){[\"add\",\"merge\",\"update\"].forEach((function(e){var n=t.name(e),r=\"add\"===e?jt:Ct;t.generateKey?zt.prototype[n]=function(i,o,a){return r(this,n,!0,\"undirected\"===(t.type||this.type),null,i,o,a,\"update\"===e)}:zt.prototype[n]=function(i,o,a,c){return r(this,n,!1,\"undirected\"===(t.type||this.type),i,o,a,c,\"update\"===e)}}))})),function(t){Q.forEach((function(e){var n=e.name,r=e.attacher;r(t,n(\"Node\"),0),r(t,n(\"Source\"),1),r(t,n(\"Target\"),2),r(t,n(\"Opposite\"),3)}))}(zt),function(t){X.forEach((function(e){var n=e.name,r=e.attacher;r(t,n(\"Edge\"),\"mixed\"),r(t,n(\"DirectedEdge\"),\"directed\"),r(t,n(\"UndirectedEdge\"),\"undirected\")}))}(zt),function(t){et.forEach((function(e){!function(t,e){var n=e.name,r=e.type,i=e.direction;t.prototype[n]=function(t,e){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return[];if(!arguments.length)return ut(this,r);if(1===arguments.length){t=\"\"+t;var o=this._nodes.get(t);if(void 0===o)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" node in the graph.'));return pt(this.multi,\"mixed\"===r?this.type:r,i,o)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var a=this._nodes.get(t);if(!a)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(n,': could not find the \"').concat(e,'\" target node in the graph.'));return gt(r,this.multi,i,a,e)}throw new B(\"Graph.\".concat(n,\": too many arguments (expecting 0, 1 or 2 and got \").concat(arguments.length,\").\"))}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"forEach\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e,n){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){if(1===arguments.length)return dt(!1,this,r,n=t);if(2===arguments.length){t=\"\"+t,n=e;var a=this._nodes.get(t);if(void 0===a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ht(!1,this.multi,\"mixed\"===r?this.type:r,i,a,n)}if(3===arguments.length){t=\"\"+t,e=\"\"+e;var c=this._nodes.get(t);if(!c)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return lt(!1,r,this.multi,i,c,e,n)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 1, 2 or 3 and got \").concat(arguments.length,\").\"))}};var a=\"map\"+n[0].toUpperCase()+n.slice(1);t.prototype[a]=function(){var t,e=Array.prototype.slice.call(arguments),n=e.pop();if(0===e.length){var i=0;\"directed\"!==r&&(i+=this.undirectedSize),\"undirected\"!==r&&(i+=this.directedSize),t=new Array(i);var a=0;e.push((function(e,r,i,o,c,u,d){t[a++]=n(e,r,i,o,c,u,d)}))}else t=[],e.push((function(e,r,i,o,a,c,u){t.push(n(e,r,i,o,a,c,u))}));return this[o].apply(this,e),t};var c=\"filter\"+n[0].toUpperCase()+n.slice(1);t.prototype[c]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=[];return t.push((function(t,r,i,o,a,c,u){e(t,r,i,o,a,c,u)&&n.push(t)})),this[o].apply(this,t),n};var u=\"reduce\"+n[0].toUpperCase()+n.slice(1);t.prototype[u]=function(){var t,e,n=Array.prototype.slice.call(arguments);if(n.length<2||n.length>4)throw new B(\"Graph.\".concat(u,\": invalid number of arguments (expecting 2, 3 or 4 and got \").concat(n.length,\").\"));if(\"function\"==typeof n[n.length-1]&&\"function\"!=typeof n[n.length-2])throw new B(\"Graph.\".concat(u,\": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\"));2===n.length?(t=n[0],e=n[1],n=[]):3===n.length?(t=n[1],e=n[2],n=[n[0]]):4===n.length&&(t=n[2],e=n[3],n=[n[0],n[1]]);var r=e;return n.push((function(e,n,i,o,a,c,u){r=t(r,e,n,i,o,a,c,u)})),this[o].apply(this,n),r}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"find\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e,n){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return!1;if(1===arguments.length)return dt(!0,this,r,n=t);if(2===arguments.length){t=\"\"+t,n=e;var a=this._nodes.get(t);if(void 0===a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ht(!0,this.multi,\"mixed\"===r?this.type:r,i,a,n)}if(3===arguments.length){t=\"\"+t,e=\"\"+e;var c=this._nodes.get(t);if(!c)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return lt(!0,r,this.multi,i,c,e,n)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 1, 2 or 3 and got \").concat(arguments.length,\").\"))};var a=\"some\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[a]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop();return t.push((function(t,n,r,i,o,a,c){return e(t,n,r,i,o,a,c)})),!!this[o].apply(this,t)};var c=\"every\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[c]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop();return t.push((function(t,n,r,i,o,a,c){return!e(t,n,r,i,o,a,c)})),!this[o].apply(this,t)}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=n.slice(0,-1)+\"Entries\";t.prototype[o]=function(t,e){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return O.empty();if(!arguments.length)return st(this,r);if(1===arguments.length){t=\"\"+t;var n=this._nodes.get(t);if(!n)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ft(r,i,n)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var a=this._nodes.get(t);if(!a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return yt(r,i,a,e)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 0, 1 or 2 and got \").concat(arguments.length,\").\"))}}(t,e)}))}(zt),function(t){wt.forEach((function(e){_t(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"forEach\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){t=\"\"+t;var n=this._nodes.get(t);if(void 0===n)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));mt(!1,\"mixed\"===r?this.type:r,i,n,e)}};var a=\"map\"+n[0].toUpperCase()+n.slice(1);t.prototype[a]=function(t,e){var n=[];return this[o](t,(function(t,r){n.push(e(t,r))})),n};var c=\"filter\"+n[0].toUpperCase()+n.slice(1);t.prototype[c]=function(t,e){var n=[];return this[o](t,(function(t,r){e(t,r)&&n.push(t)})),n};var u=\"reduce\"+n[0].toUpperCase()+n.slice(1);t.prototype[u]=function(t,e,n){if(arguments.length<3)throw new B(\"Graph.\".concat(u,\": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\"));var r=n;return this[o](t,(function(t,n){r=e(r,t,n)})),r}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=n[0].toUpperCase()+n.slice(1,-1),a=\"find\"+o;t.prototype[a]=function(t,e){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){t=\"\"+t;var n=this._nodes.get(t);if(void 0===n)throw new F(\"Graph.\".concat(a,': could not find the \"').concat(t,'\" node in the graph.'));return mt(!0,\"mixed\"===r?this.type:r,i,n,e)}};var c=\"some\"+o;t.prototype[c]=function(t,e){return!!this[a](t,e)};var u=\"every\"+o;t.prototype[u]=function(t,e){return!this[a](t,(function(t,n){return!e(t,n)}))}}(t,e),Gt(t,e)}))}(zt);var Wt=function(t){function n(e){var n=u({type:\"directed\"},e);if(\"multi\"in n&&!1!==n.multi)throw new B(\"DirectedGraph.from: inconsistent indication that the graph should be multi in given options!\");if(\"directed\"!==n.type)throw new B('DirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Pt=function(t){function n(e){var n=u({type:\"undirected\"},e);if(\"multi\"in n&&!1!==n.multi)throw new B(\"UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!\");if(\"undirected\"!==n.type)throw new B('UndirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Rt=function(t){function n(e){var n=u({multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiGraph.from: inconsistent indication that the graph should be simple in given options!\");return t.call(this,n)||this}return e(n,t),n}(zt),Kt=function(t){function n(e){var n=u({type:\"directed\",multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!\");if(\"directed\"!==n.type)throw new B('MultiDirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Tt=function(t){function n(e){var n=u({type:\"undirected\",multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!\");if(\"undirected\"!==n.type)throw new B('MultiUndirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt);function Bt(t){t.from=function(e,n){var r=u({},e.options,n),i=new t(r);return i.import(e),i}}return Bt(zt),Bt(Wt),Bt(Pt),Bt(Rt),Bt(Kt),Bt(Tt),zt.Graph=zt,zt.DirectedGraph=Wt,zt.UndirectedGraph=Pt,zt.MultiGraph=Rt,zt.MultiDirectedGraph=Kt,zt.MultiUndirectedGraph=Tt,zt.InvalidArgumentsGraphError=B,zt.NotFoundGraphError=F,zt.UsageGraphError=I,zt}));\n//# sourceMappingURL=graphology.umd.min.js.map\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\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].call(module.exports, 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, [731], () => (__webpack_require__(6807)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\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 && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\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\t980: 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[\"webpackChunkeda\"] = self[\"webpackChunkeda\"] || [];\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","WEBGSLAGGREGATION","WEBGSLAGGREGATIONFUNCTIONS","EUCLIDEAN","arraySize","MANHATTAN","WEBGPUDISTANCE","webGPUFunctions","HAMMING","_maxArraySize","entryIndex","maxArraySize","_entryIndex","TANIMOTO","LEVENSTEIN","NEEDLEMAN_WUNSCH","MONOMER_CHEMICAL_DISTANCE","SOKAL","COSINE","ASYMMETRIC","Difference","OneHot","distanceFunctionComplexity","maxEntrySize","Math","ceil","_maxEntrySize","TypeSupportedDistances","Set","gpuAdapter","gpuDevice","multiColWebGPUSparseMatrix","entryList","threshold","distanceMetrics","aggregationFunction","weights","options","thisArg","this","_arguments","generator","device","navigator","gpu","console","error","requestAdapter","powerPreference","isLost","lost","then","Promise","r","setTimeout","requiredBufferSize","adapterLimits","limits","buffferSizeLimit","maxBufferSize","storageBufferSizeLimit","maxStorageBufferBindingSize","requestDevice","requiredLimits","min","e","P","resolve","reject","fulfilled","value","step","rejected","result","done","apply","getGPUDevice","availableDistanceMetrics","Object","values","some","metric","includes","Error","join","maxDistance","length","list","numOfColumns","listSize","processInfo","map","entry","i","distanceMetric","gapOpenPenalty","gapExtensionPenalty","_a","_b","entryType","encodedList","Uint32Array","split","c","charCodeAt","Float32Array","_data","Int32Array","encodedListType","arraySizes","arr","has","maxEntryLen","reduce","a","b","max","complexity","EncodedArrayConstructor","flatSourceArray","forEach","seq","set","suppInfoStructWgsl","suppInfoSize","suppInfoType","suppInfoBuffer","maxMonomerIndex","scoringMatrix","alphabetIndexes","keys","prev","n","Array","fill","String","fromCharCode","similarityMatrixSize","transferedSimilarityMatrix","key","key2","offset","range","dataTypeWGSL","dataStructWgsl","sourceArraySize","webGPUProcessInfo","suppInfoWgsl","info","filter","wgsl","needsDummy","trim","dataWgsl","numOfThreads","sparseResultSizePerThread","combinedComplexity","maxIterationsPerThread","workgroupsDim","sqrt","globalThreadDimSize","condensedDistanceMatrixSize","dmChunkSizePerThread","module","createShaderModule","label","code","getCombinedDistanceScript","pipeline","createComputePipeline","layout","compute","entryPoint","startAtCols","startAtRows","endAtCols","endAtRows","chunkSize","floor","startRow","startCol","time","endIdx","endRow","endCol","timeEnd","computeInfoBuffer32Size","suppInfoBuffer32Size","sparseMatrixEachArray32Size","computeInfoBufferSize","BYTES_PER_ELEMENT","paddedComputeInfoBufferSize","remainder","computeInfoBuffer","createBuffer","size","usage","GPUBufferUsage","STORAGE","COPY_SRC","COPY_DST","mappedAtCreation","mappedComputeInfoArrayBuffer","getMappedRange","computeInfoOffSet","ArrayConstructor","unmap","suppInfoBufferSize","paddedSuppInfoBufferSize","suppInfoRemainder","mappedSuppInfoArrayBuffer","suppInfoOffSet","byteLength","resultsBufferSize","paddedResultsBufferSize","resultsRemainder","resultsBuffer","bindGroup","createBindGroup","getBindGroupLayout","entries","binding","resource","buffer","resultsOutBuffer","MAP_READ","resultIs","resultJs","resultDistances","isAllDone","encoder","createCommandEncoder","pass","beginComputePass","setPipeline","setBindGroup","dispatchWorkgroups","end","copyBufferToBuffer","commandBuffer","finish","queue","submit","onSubmittedWorkDone","mapAsync","GPUMapMode","READ","resultsOutArrayBuffer","resultOffset","resultsI","resultsJ","resultsDistances","resultsFound","every","d","totalResults","combinedI","combinedJ","combinedDistances","combinedOffset","resI","found","subarray","push","totalSize","finalI","finalJ","finalDistances","finalOffset","destroy","j","distance","maxEntryLens","aggregation","_","semaphore","lock","async","release","promise","multSparseMatrix","sparseMatrix","nRows","pruneValue","workersNum","hardwareConcurrency","numOfHorizontalStrinps","indexStarts","indexEnds","blockHeight","workers","Worker","URL","availableIndexes","add","initPromises","worker","postMessage","is","js","ds","onmessage","all","res","takeChunk","workerIdx","index","delete","blockStart","blockEnd","data","promises","_worker","terminate","totLen","mclInflate","pow","colwiseNormilize","doPrune","prune","colSums","sum","getWebColaLayot","cluster","clusterConnections","_subCluster","graph","addNode","x","random","y","it","v","weight","addEdge","settings","iterations","getEdgeWeight","weighted","edgeWeightInfluence","embedX1","embedY1","node","getNodeAttributes","minX","minY","maxX","maxY","scaleX","scaleY","embedX","embedY","defaultMCLOptions","expandFactor","maxIterations","inflateFactor","multFactor","MCLSparseReducer","constructor","opts","_options","transform","superClusters","assignClusters","correctClusters","clusters","clusterConnectionMap","splitConnectionsIntoClusters","mclMatrix","inflate","maxIter","matrix","start","initMCLMatrix","log","runMarkovClustering","embeddings","transformWebGPU","Map","cc","get","clusterNum","mergeClusters","iCluster","jCluster","k","clusterSizeMap","sortedIndexes","Number","sort","clusterMap","clusterIdx","subCluster","sortedClusterNames","perRow","yOffset","perRowSizes","clustSize1","clustSize2","curPerRowSize","maxClustersInNextRow","pointsInCurRow","pointsAccum","clustersAccum","perRowIdx","clusterName","offsetX","event","aggregationMethod","distanceFnArgs","distanceFns","useWebGPU","sparse","calcMultiColumn","reducer","isNil","insertSmaller","distancesAr","indexes","num","newPosition","findIndex","pop","splice","exports","linLogMode","outboundAttractionDistribution","adjustSizes","scalingRatio","strongGravityMode","gravity","slowDown","barnesHutOptimize","barnesHutTheta","assign","target","l","objects","prototype","slice","call","arguments","validateSettings","message","graphToByteArrays","order","NodeMatrix","EdgeMatrix","forEachNode","attr","fixed","forEachEdge","edge","source","sa","ta","u","sj","tj","nodes","edges","assignLayoutChanges","outputReducer","updateEachNodeAttributes","readGraphPositions","collectLayoutChanges","positions","newAttr","createWorker","fn","xURL","window","webkitURL","toString","objectUrl","createObjectURL","Blob","type","revokeObjectURL","isGraph","createEdgeWeightGetter","iterate","helpers","DEFAULT_SETTINGS","abstractSynchronousLayout","params","fromEntry","validationError","matrices","synchronousLayout","bind","inferSettings","PPN","n1","n2","rn","w","g","s","outboundAttCompensation","coefficient","xDist","yDist","ewc","factor","force","swinging","traction","nodespeed","newX","newY","thetaSquared","RegionMatrix","q","q2","subdivisionAttempts","Infinity","dx","dy","PPR","coerceWeight","isNaN","name","nameOrFunction","defaultValue","getter","coerceToDefault","attributes","returnDefault","undefined","fromAttributes","fromGraph","getEdgeAttributes","fromPartialEntry","fromMinimalEntry","extremities","isUndirected","t","createEdgeValueGetter","addUndirectedEdgeWithKey","dropNode","multi","Symbol","iterator","create","setPrototypeOf","getPrototypeOf","__proto__","o","Reflect","construct","sham","Proxy","Boolean","valueOf","Function","indexOf","TypeError","enumerable","writable","configurable","ReferenceError","_nodes","out","undirected","h","p","defineProperty","f","isArray","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","concat","m","init","once","removeListener","U","on","EventEmitter","_events","_eventsCount","_maxListeners","G","defaultMaxListeners","newListener","emit","listener","unshift","warned","emitter","count","warn","E","fired","wrapFn","A","L","D","S","addEventListener","removeEventListener","N","RangeError","setMaxListeners","getMaxListeners","context","addListener","prependListener","prependOnceListener","shift","off","removeAllListeners","listeners","rawListeners","listenerCount","eventNames","of","empty","fromSequence","O","ARRAY_BUFFER_SUPPORT","ArrayBuffer","SYMBOL_SUPPORT","C","M","z","W","isView","R","K","T","B","captureStackTrace","F","I","Y","clear","J","V","H","_edges","inDegree","outDegree","undirectedDegree","undirectedLoops","directedLoops","in","attach","attachMulti","previous","detach","detachMulti","Q","attacher","hasOwnProperty","X","Z","$","tt","et","direction","nt","rt","sourceAttributes","targetAttributes","ot","at","ct","dt","ht","lt","wt","vt","bt","mt","wrap","kt","neighbor","xt","Et","At","Lt","St","Dt","Ut","Nt","allowSelfLoops","Ot","NodeDataClass","jt","_edgeKeyGenerator","_undirectedSelfLoopCount","_directedSelfLoopCount","_undirectedSize","_directedSize","Ct","Mt","zt","_resetInstanceCounters","hasNode","hasDirectedEdge","hasUndirectedEdge","hasEdge","directedEdge","undirectedEdge","areDirectedNeighbors","areOutNeighbors","areInNeighbors","areUndirectedNeighbors","areNeighbors","areInboundNeighbors","areOutboundNeighbors","directedDegree","inboundDegree","outboundDegree","degree","inDegreeWithoutSelfLoops","outDegreeWithoutSelfLoops","directedDegreeWithoutSelfLoops","undirectedDegreeWithoutSelfLoops","inboundDegreeWithoutSelfLoops","outboundDegreeWithoutSelfLoops","degreeWithoutSelfLoops","opposite","hasExtremity","isDirected","isSelfLoop","mergeNode","updateNode","dropEdge","dropDirectedEdge","dropUndirectedEdge","clearEdges","getAttribute","_attributes","getAttributes","hasAttribute","setAttribute","updateAttribute","removeAttribute","replaceAttributes","mergeAttributes","updateAttributes","hints","updateEachEdgeAttributes","forEachAdjacencyEntry","forEachAdjacencyEntryWithOrphans","forEachAssymetricAdjacencyEntry","forEachAssymetricAdjacencyEntryWithOrphans","from","findNode","mapNodes","someNode","everyNode","filterNodes","reduceNodes","nodeEntries","export","import","mergeUndirectedEdgeWithKey","mergeDirectedEdgeWithKey","addDirectedEdgeWithKey","mergeUndirectedEdge","mergeDirectedEdge","addUndirectedEdge","addDirectedEdge","nullCopy","emptyCopy","copy","toJSON","inspect","startsWith","for","generateKey","undirectedSize","directedSize","ut","pt","gt","toUpperCase","st","ft","yt","_t","Gt","Wt","Pt","Rt","Kt","Tt","Bt","Graph","DirectedGraph","UndirectedGraph","MultiGraph","MultiDirectedGraph","MultiUndirectedGraph","InvalidArgumentsGraphError","NotFoundGraphError","UsageGraphError","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","__webpack_exports__","chunkIds","priority","notFulfilled","__esModule","definition","chunkId","globalThis","obj","prop","scriptUrl","importScripts","location","document","currentScript","tagName","src","scripts","getElementsByTagName","test","replace","self","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"980.js","mappings":"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","sources":["webpack://eda/webpack/runtime/chunk loaded","webpack://eda/webpack/runtime/startup chunk dependencies","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-aggregation.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-multicol-distances.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/getGPUDevice.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/sparse-matrix/webGPU-sparse-matrix.js","webpack://eda/./node_modules/@datagrok-libraries/math/src/webGPU/preprocessing/webGPU-process-info.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-sparse-matrix-mult.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/clustering-steps.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/webCola.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/markov-cluster.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-worker.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/defaults.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/helpers.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/index.js","webpack://eda/./node_modules/graphology-layout-forceatlas2/iterate.js","webpack://eda/./node_modules/graphology-utils/getters.js","webpack://eda/./node_modules/graphology-utils/is-graph.js","webpack://eda/./node_modules/graphology/dist/graphology.umd.min.js","webpack://eda/webpack/bootstrap","webpack://eda/webpack/runtime/compat get default export","webpack://eda/webpack/runtime/define property getters","webpack://eda/webpack/runtime/ensure chunk","webpack://eda/webpack/runtime/get javascript chunk filename","webpack://eda/webpack/runtime/global","webpack://eda/webpack/runtime/hasOwnProperty shorthand","webpack://eda/webpack/runtime/publicPath","webpack://eda/webpack/runtime/importScripts chunk loading","webpack://eda/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(731).then(next);\n};","function euclideanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `;\n}\n;\nfunction manhattanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `;\n}\nexport var WEBGSLAGGREGATION;\n(function (WEBGSLAGGREGATION) {\n WEBGSLAGGREGATION[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n WEBGSLAGGREGATION[\"MANHATTAN\"] = \"MANHATTAN\";\n})(WEBGSLAGGREGATION || (WEBGSLAGGREGATION = {}));\nexport const WEBGSLAGGREGATIONFUNCTIONS = {\n [WEBGSLAGGREGATION.EUCLIDEAN]: euclideanAggregationWgsl,\n [WEBGSLAGGREGATION.MANHATTAN]: manhattanAggregationWgsl\n};\n//# sourceMappingURL=webGPU-aggregation.js.map","/* eslint-disable max-len */\n// in all the functions below, the variables a and b are assumed to be arrays of uint32/f32\n//values which are infered from the code this chunk is injected into\n// also, we have access to computeInfo struct, which contains the following fields:\n// computeInfo.entrySizes: array of arrays of u32 containing the sizes of the entries\n// other fields are specific to the distance function should be injected from the main script that calls this function,\n// and should be available in the supplementaryInfo struct\n// like the similarity matrix for monomer chemical distance.\n// the getProcessInfo function should return correct buffer allocation mechanism for the supplementaryInfo,\n// for every entry list\n// the maxDistance variable is also assumed to be available in the\n// scope of the function, in case of knn it is the distance in the last postion of knn on this index,\n// in case of sparse matrix, it can be just the threshold for the distance.\n// hamming distance for sequnences of uint32 arrays of max length ${maxArraySize}\nexport function webGPUHamming(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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 < ${_maxArraySize}; 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 / ${_maxArraySize};\n `;\n}\nexport function webGPUMonomerChemicalDistance(_maxArraySize, entryIndex) {\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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${entryIndex}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${_maxArraySize}; 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 / ${_maxArraySize};\n `;\n}\nexport function webGPULevenstein(maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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, ${maxArraySize + 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 `;\n}\nexport function webGPUNeedlemanWunsch(maxArraySize, entryIndex) {\n // version of the levenshtain where the cost of substitution is customizable\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // and gapOpenPenalty, gapExtensionPenalty\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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, ${maxArraySize + 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, ${maxArraySize + 1}u>;\n var horizontalGaps: array<u32, ${maxArraySize + 1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${entryIndex};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${entryIndex};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty; // accounting for the fact that left and right gaps are less costly\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${entryIndex}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0 || i == 1 || i == bLength) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0 || j == 1 || j == aLength) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(minLength);\n\n `;\n}\nexport function webGPUEuclidean(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `;\n}\nexport function webGPUVectorCosine(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n var productSum: f32 = 0.0;\n var aSquareSum: f32 = 0.0;\n var bSquareSum: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n productSum = productSum + f32(a[i] * b[i]);\n aSquareSum = aSquareSum + f32(a[i] * a[i]);\n bSquareSum = bSquareSum + f32(b[i] * b[i]);\n }\n var sim = productSum / (sqrt(aSquareSum) * sqrt(bSquareSum));\n return (1.0 - sim) / 2.0;\n `;\n}\nexport function webGPUManhattan(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `;\n}\nexport function webGPUOneHotDistance(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][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 `;\n}\nexport function webGPUNumericDistance(_maxArraySize, entryIndex) {\n // we assume that range${entryIndex} is available in the supplementaryInfo struct\n return `\n let range = suppInfo.range${entryIndex};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `;\n}\n// tanimoto distance for uint32 arrays of length ${maxArraySize}\nexport function webGPUTanimotoBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}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 < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `;\n}\nexport function webGPUAsymmetricBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}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 < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `;\n}\nexport function webGPUCosineBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}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 < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `;\n}\nexport function webGPUSokalBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}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 < ${maxArraySize}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 `;\n}\nexport var WEBGPUDISTANCE;\n(function (WEBGPUDISTANCE) {\n WEBGPUDISTANCE[\"HAMMING\"] = \"Hamming\";\n WEBGPUDISTANCE[\"EUCLIDEAN\"] = \"Euclidean\";\n WEBGPUDISTANCE[\"VECTOR_COSINE\"] = \"Vector Cosine\";\n WEBGPUDISTANCE[\"MANHATTAN\"] = \"Manhattan\";\n WEBGPUDISTANCE[\"TANIMOTO\"] = \"Tanimoto\";\n WEBGPUDISTANCE[\"LEVENSTEIN\"] = \"Levenshtein\";\n WEBGPUDISTANCE[\"NEEDLEMAN_WUNSCH\"] = \"Needlemann-Wunsch\";\n WEBGPUDISTANCE[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n WEBGPUDISTANCE[\"SOKAL\"] = \"Sokal\";\n WEBGPUDISTANCE[\"COSINE\"] = \"Cosine\";\n WEBGPUDISTANCE[\"ASYMMETRIC\"] = \"Asymmetric\";\n WEBGPUDISTANCE[\"Difference\"] = \"Difference\";\n WEBGPUDISTANCE[\"OneHot\"] = \"One-Hot\";\n})(WEBGPUDISTANCE || (WEBGPUDISTANCE = {}));\nexport const webGPUFunctions = {\n [WEBGPUDISTANCE.HAMMING]: webGPUHamming,\n [WEBGPUDISTANCE.EUCLIDEAN]: webGPUEuclidean,\n [WEBGPUDISTANCE.MANHATTAN]: webGPUManhattan,\n [WEBGPUDISTANCE.VECTOR_COSINE]: webGPUVectorCosine,\n [WEBGPUDISTANCE.TANIMOTO]: webGPUTanimotoBitArray,\n [WEBGPUDISTANCE.LEVENSTEIN]: webGPULevenstein,\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: webGPUNeedlemanWunsch,\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: webGPUMonomerChemicalDistance,\n [WEBGPUDISTANCE.SOKAL]: webGPUSokalBitArray,\n [WEBGPUDISTANCE.COSINE]: webGPUCosineBitArray,\n [WEBGPUDISTANCE.ASYMMETRIC]: webGPUAsymmetricBitArray,\n [WEBGPUDISTANCE.Difference]: webGPUNumericDistance,\n [WEBGPUDISTANCE.OneHot]: webGPUOneHotDistance\n};\nexport const distanceFunctionComplexity = {\n [WEBGPUDISTANCE.HAMMING]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.EUCLIDEAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.MANHATTAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.TANIMOTO]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.SOKAL]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.COSINE]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.ASYMMETRIC]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.LEVENSTEIN]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: (maxEntrySize) => Math.ceil(maxEntrySize / 25),\n [WEBGPUDISTANCE.Difference]: (_maxEntrySize) => 1,\n [WEBGPUDISTANCE.OneHot]: (_maxEntrySize) => Math.ceil(_maxEntrySize / 40),\n [WEBGPUDISTANCE.VECTOR_COSINE]: (maxEntrySize) => Math.ceil(maxEntrySize / 30)\n};\nexport const TypeSupportedDistances = {\n [\"STRING\" /* WGPUENTRYTYPE.STRING */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.OneHot]),\n [\"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.VECTOR_COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference]),\n [\"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference, WEBGPUDISTANCE.VECTOR_COSINE]),\n [\"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference, WEBGPUDISTANCE.VECTOR_COSINE]),\n [\"NUMBER\" /* WGPUENTRYTYPE.NUMBER */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference]),\n [\"BITARRAY\" /* WGPUENTRYTYPE.BITARRAY */]: new Set([WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC])\n};\n//# sourceMappingURL=webGPU-multicol-distances.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nlet gpuAdapter = null;\nlet gpuDevice = null;\nexport function getGPUDevice() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!navigator.gpu) {\n console.error('WebGPU is not supported in this browser');\n return null;\n }\n if (!gpuAdapter) {\n //reason: only here we get the gpuAdapter\n // eslint-disable-next-line no-restricted-syntax\n gpuAdapter = yield navigator.gpu.requestAdapter({ powerPreference: 'high-performance' });\n if (gpuAdapter == null)\n return null;\n }\n let isLost = false;\n if (gpuDevice) {\n gpuDevice.lost.then(() => {\n isLost = true;\n });\n yield new Promise((r) => setTimeout(r, 10)); // wait to see if the device is lost\n }\n if (!gpuDevice || isLost) {\n const requiredBufferSize = 1000000000; // ~1000MB\n const adapterLimits = gpuAdapter.limits;\n const buffferSizeLimit = adapterLimits.maxBufferSize;\n const storageBufferSizeLimit = adapterLimits.maxStorageBufferBindingSize;\n try {\n gpuDevice = yield gpuAdapter.requestDevice({ requiredLimits: {\n maxBufferSize: Math.min(buffferSizeLimit, requiredBufferSize),\n maxStorageBufferBindingSize: Math.min(storageBufferSizeLimit, requiredBufferSize)\n } });\n return gpuDevice;\n }\n catch (e) {\n console.error('Failed to create device with required limits', e);\n gpuDevice = yield gpuAdapter.requestDevice();\n return gpuDevice;\n }\n }\n return gpuDevice;\n });\n}\nexport function getGPUAdapterDescription() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!navigator.gpu) {\n console.error('WebGPU is not supported in this browser');\n return null;\n }\n if (!gpuAdapter) {\n // reason: only here we get the gpuAdapter\n // eslint-disable-next-line no-restricted-syntax\n gpuAdapter = yield navigator.gpu.requestAdapter();\n if (gpuAdapter == null)\n return null;\n }\n let info = null;\n if ('info' in gpuAdapter)\n info = gpuAdapter.info;\n // this option is sort of deprecated but still available in every initial release\n // else if ('requestAdapterInfo' in gpuAdapter && typeof gpuAdapter.requestAdapterInfo === 'function')\n // info = (await gpuAdapter.requestAdapterInfo()) as GPUAdapterInfo;\n if (!info)\n return 'No GPU description available';\n const outString = replaceEmptyString(info.description, replaceEmptyString(info.vendor, 'No GPU description available'));\n return outString;\n });\n}\nfunction replaceEmptyString(str, replacement) {\n return !str || str == '' ? replacement : str;\n}\n//# sourceMappingURL=getGPUDevice.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { WEBGSLAGGREGATION, WEBGSLAGGREGATIONFUNCTIONS, } from '../multi-col-distances/webGPU-aggregation';\nimport { WEBGPUDISTANCE, webGPUFunctions, } from '../multi-col-distances/webGPU-multicol-distances';\nimport { webGPUProcessInfo } from '../preprocessing/webGPU-process-info';\nimport { getGPUDevice } from '../getGPUDevice';\n/** generate sparse matrix based on list of lists of entries.\n * these entries are each encoded as Uint32Array or FLOAT32Array (depending on their type).\n * for example, sequences would be encoded as Uint32Array based on char code of the letter at each position.\n * [65, 66, 67, 68, 69] would be a sequence of 5 letters.\n * for chemical fingerprints, it would be a binary array of 0s and 1s,\n * represented as Uint32Array(_data property of DG bitarray).\n *\n * Be ware that size of entryList, distanceMetrics, weights and options must be the same.\n * if there are no options for entries i, pass an empty object.\n * for now options are needed for\n * needleman-wunsch and monomer chemical distances: see {@link BioDistanceFnOptions} as for how it should be passed\n * numeric distances (Difference): {range: number} where range is the range of the values in the column (max - min).\n * in both cases, if options are not provided, they will be calculated automatically.\n */\nexport function multiColWebGPUSparseMatrix(entryList, // list of lists of entries, for multiple columns\nthreshold = 0.8, // similarity threshold, be ware that if you use too small threshold, there might be memory overflow...\ndistanceMetrics, // distance metrics for each column\naggregationFunction, // aggregation function for the distances\nweights, // weights for each column\noptions // supplementary options for each column\n) {\n return __awaiter(this, void 0, void 0, function* () {\n const device = yield getGPUDevice();\n if (!device)\n return null; // if no device, return null, as we cannot do anything without it.\n const availableDistanceMetrics = Object.values(WEBGPUDISTANCE);\n if (distanceMetrics.some((metric) => !availableDistanceMetrics.includes(metric)))\n throw new Error('Invalid distance metrics provided: ' + distanceMetrics.join(', '));\n const availableAggregationFunctions = Object.values(WEBGSLAGGREGATION);\n if (!availableAggregationFunctions.includes(aggregationFunction))\n throw new Error('Invalid aggregation function provided: ' + aggregationFunction);\n const maxDistance = 1 - threshold; // maximum distance\n // first, check that all the supplementary options are provided and are the same length:\n if (options.length !== entryList.length ||\n options.length !== distanceMetrics.length ||\n options.length !== weights.length) {\n throw new Error('Options, weigths and distance functions must be provided for each column');\n }\n // check that all the entry lists are the same length\n if (entryList.some((list) => list.length !== entryList[0].length))\n throw new Error('All entry lists must be the same length');\n const numOfColumns = entryList.length; // number of columns\n const listSize = entryList[0].length; // size of each list (or column)\n const processInfo = entryList.map((entry, i) => {\n return webGPUProcessInfo(entry, distanceMetrics[i], i, options[i]);\n });\n if (numOfColumns === 0) {\n throw new Error('No columns provided. Please provide at least one column of data.');\n }\n if (numOfColumns === 1)\n aggregationFunction = WEBGSLAGGREGATION.MANHATTAN; // save a bit of time\n // combine all struct types into one to put into the suppInfo struct.\n let suppInfoWgsl = processInfo\n .map((info) => info.suppInfoStructWgsl)\n .filter((wgsl) => !!wgsl && wgsl != '')\n .join(',\\n');\n // structures in wgsl must have at least one member, so if we have no structures, we need to add a dummy one\n let needsDummy = false;\n if (!suppInfoWgsl || suppInfoWgsl.trim() == '') {\n needsDummy = true;\n suppInfoWgsl = '\\ndummy: f32\\n';\n }\n // combine all data wgsl struct code into one\n const dataWgsl = processInfo.map((info) => info.dataStructWgsl).filter((wgsl) => !!wgsl && wgsl != '').join(',\\n');\n // combine all array sizes into one array (easier for setting)\n const arraySizes = new Uint32Array(numOfColumns * listSize);\n processInfo.forEach((info, i) => {\n arraySizes.set(info.arraySizes, i * listSize);\n }); // array.flat is not as optimized as this\n // if we try to map large arrays directly from GPU, sometimes, device disconnects. so we need to do it in chunks, a good number\n // we found is 10000. So we will perform computations in chunks of 10000. meaning that we will dispatch 10000 threads at a time.\n const numOfThreads = 10000;\n // in this case we do not need to worry about complexity of the algorithm, as the 100 is low enaugh number, which is limited by memory usage.\n const sparseResultSizePerThread = 100; // number of iterations per thread (number of pair comparisons)\n const combinedComplexity = processInfo.reduce((a, b) => a + b.complexity, 0); // combined complexity of all the columns\n const maxIterationsPerThread = Math.ceil(6000 / combinedComplexity); // maximum number of iterations per thread\n const workGroupDivision = 10; // how many threads inside of one workgroup dimension (in this case 10 * 10 threads per workgroup)\n const threadsPerWorkgroup = workGroupDivision * workGroupDivision;\n const workgroupsDim = Math.ceil(Math.sqrt(Math.ceil(numOfThreads / threadsPerWorkgroup))); // how many workgroups per 2d dimension\n const globalThreadDimSize = workgroupsDim * workGroupDivision; // how many threads per 2d dimension\n const condensedDistanceMatrixSize = listSize * (listSize - 1) / 2; // size of the condensed distance matrix, this many comparisons will be made.\n const dmChunkSizePerThread = Math.ceil(condensedDistanceMatrixSize / numOfThreads); // how many comparisons per thread\n const module = device.createShaderModule({\n label: 'Sparse matrix compute shader',\n code: `\n // each thread will perform ${sparseResultSizePerThread} iterations at one time, comparing ${sparseResultSizePerThread} pairs of entries.\n // in total, each thread will perform at most ${dmChunkSizePerThread} comparisons.\n // first is the result struct, containing is, js, and distances. each array with length of ${sparseResultSizePerThread},\n // and also integer for how many pairs were found to be below threshold.\n struct SparseResult {\n i: array<array<u32, ${sparseResultSizePerThread}>, ${numOfThreads}>,\n j: array<array<u32, ${sparseResultSizePerThread}>, ${numOfThreads}>,\n distances: array<array<f32, ${sparseResultSizePerThread}>, ${numOfThreads}>,\n found: array<u32, ${numOfThreads}>,\n done: array<u32, ${numOfThreads}>\n }\n // struct for the data\n struct ComputeInfo {\n // start at cols and rows, and end at cols and rows for each thread, these will be calculated on cpu and passed to gpu.\n startAtCols: array<u32, ${numOfThreads}>,\n startAtRows: array<u32, ${numOfThreads}>,\n endAtCols: array<u32, ${numOfThreads}>,\n endAtRows: array<u32, ${numOfThreads}>,\n\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${listSize}>, ${numOfColumns}>,\n // the weights for each entry\n weights: array<f32, ${numOfColumns}>,\n // the data for each entry\n ${dataWgsl} // 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 for the supplementary information\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${suppInfoWgsl}\n };\n\n @group(0) @binding(0) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(1) var<storage, read_write> suppInfo: SuppInfo;\n @group(0) @binding(2) var<storage, read_write> results: SparseResult;\n @compute @workgroup_size(${workGroupDivision}, ${workGroupDivision}) fn calcSparseMatrix(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${needsDummy ? `let otherDummy = suppInfo.dummy * 2;` : ''} // just to make sure that the suppInfo is not optimized out\n let threadCol = id.x;\n let threadRow = id.y;\n let linearIndex = threadRow * ${globalThreadDimSize} + threadCol;\n if (linearIndex >= ${numOfThreads}) {\n return; // if we are out of bounds, return\n } \n var startAtCol: u32 = computeInfo.startAtCols[linearIndex];\n var startAtRow: u32 = computeInfo.startAtRows[linearIndex];\n let endAtCol: u32 = min(computeInfo.endAtCols[linearIndex], ${listSize}u);\n let endAtRow: u32 = min(computeInfo.endAtRows[linearIndex], ${listSize}u);\n let is = &results.i[linearIndex];\n let js = &results.j[linearIndex];\n let distances = &results.distances[linearIndex];\n results.found[linearIndex] = 0; // initialize the found counter\n var found: u32 = 0;\n if (results.done[linearIndex] > 0) {\n return; // if we are done, return\n }\n for (var i = 0; i < ${maxIterationsPerThread}; i++) {\n if (startAtCol >= endAtCol && startAtRow >= endAtRow) {\n results.done[linearIndex] = 1;\n break;\n }\n if (found >= ${sparseResultSizePerThread}) {\n break;\n }\n let dist = combinedDistance(startAtCol, startAtRow);\n if (dist <= ${maxDistance}) {\n (*is)[found] = startAtCol;\n (*js)[found] = startAtRow;\n (*distances)[found] = dist;\n found = found + 1;\n }\n startAtCol = startAtCol + 1;\n if (startAtCol >= ${listSize}u) {\n startAtRow += 1;\n startAtCol = startAtRow + 1;\n }\n }\n results.found[linearIndex] = found;\n // update the startAtCols and startAtRows\n computeInfo.startAtCols[linearIndex] = startAtCol;\n computeInfo.startAtRows[linearIndex] = startAtRow;\n\n }\n\n // this will generate the distance script for each distance metric and then combine them into one\n ${getCombinedDistanceScript(distanceMetrics, processInfo.map((info) => info.maxEntryLen), maxDistance, aggregationFunction)}\n\n\n `\n });\n const pipeline = device.createComputePipeline({\n label: 'sparse matrix compute pipeline',\n layout: 'auto',\n compute: {\n module,\n entryPoint: 'calcSparseMatrix',\n },\n });\n // generate startAtCols, startAtRows, endAtCols, endAtRows\n const startAtCols = new Uint32Array(numOfThreads);\n const startAtRows = new Uint32Array(numOfThreads);\n const endAtCols = new Uint32Array(numOfThreads);\n const endAtRows = new Uint32Array(numOfThreads);\n const chunkSize = Math.floor(condensedDistanceMatrixSize / numOfThreads); // size of the chunk per thread (in total)\n let startRow = 0;\n let startCol = 1;\n console.time('GPUthreadStarts');\n for (let i = 0; i < numOfThreads; i++) {\n const endIdx = i === numOfThreads - 1 ? condensedDistanceMatrixSize - 1 : (i + 1) * chunkSize;\n // fancy formulas to calculate the start and end indices for the condensed distance matrix for each thread start\n const endRow = listSize - 2 - Math.floor(Math.sqrt(-8 * endIdx + 4 * listSize * (listSize - 1) - 7) / 2 - 0.5);\n const endCol = endIdx - listSize * endRow + Math.floor((endRow + 1) * (endRow + 2) / 2);\n startAtCols[i] = startCol;\n startAtRows[i] = startRow;\n endAtCols[i] = endCol;\n endAtRows[i] = endRow;\n startRow = endRow;\n startCol = endCol;\n // const startRow = values[0].length - 2 - Math.floor(\n // Math.sqrt(-8 * startIdx + 4 * values[0].length * (values[0].length - 1) - 7) / 2 - 0.5);\n // const startCol = startIdx - values[0].length * startRow + Math.floor((startRow + 1) * (startRow + 2) / 2);\n }\n console.timeEnd('GPUthreadStarts');\n // size of the computeInfo buffer\n const computeInfoBuffer32Size = numOfThreads * 4 + // startAtCols, startAtRows, endAtCols, endAtRows\n listSize * numOfColumns + // entrySizes\n numOfColumns + // weights\n processInfo.reduce((a, b) => a + b.sourceArraySize, 0);\n // size of the suppInfo buffer\n const suppInfoBuffer32Size = processInfo.reduce((a, b) => a + b.suppInfoSize, 0);\n // size of the results buffer\n const sparseMatrixEachArray32Size = sparseResultSizePerThread * numOfThreads;\n const resultsBuffer32Size = 3 * sparseMatrixEachArray32Size + numOfThreads + numOfThreads; // i, j, distances, found, done\n // create a buffer on the GPU to hold computeInfo\n // beware that struct must be padded to 16 bytes, so we need to calculate the size of the struct in 32bit values\n const computeInfoBufferSize = computeInfoBuffer32Size * Uint32Array.BYTES_PER_ELEMENT;\n let paddedComputeInfoBufferSize = computeInfoBufferSize;\n const remainder = computeInfoBufferSize & 15; // check if the size is a multiple of 16\n if (remainder !== 0)\n paddedComputeInfoBufferSize += 16 - remainder; // pad the size accordingly\n const computeInfoBuffer = device.createBuffer({\n label: 'compute info buffer',\n size: paddedComputeInfoBufferSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n const mappedComputeInfoArrayBuffer = computeInfoBuffer.getMappedRange(); // get full buffer\n // dynamic offset for the computeInfo buffer\n let computeInfoOffSet = 0;\n // first write the startAtCols, startAtRows, endAtCols, endAtRows\n const startAtColsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n startAtColsBufferView.set(startAtCols);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n const startAtRowsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n startAtRowsBufferView.set(startAtRows);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n const endAtColsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n endAtColsBufferView.set(endAtCols);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n const endAtRowsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n endAtRowsBufferView.set(endAtRows);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n // then write the entrySizes\n const entrySizesView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, arraySizes.length);\n entrySizesView.set(arraySizes);\n computeInfoOffSet += arraySizes.length * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n // then write the weights\n const weightsView = new Float32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfColumns);\n weightsView.set(weights);\n computeInfoOffSet += numOfColumns * Float32Array.BYTES_PER_ELEMENT;\n // finally, write the data itself\n for (const info of processInfo) {\n const ArrayConstructor = info.EncodedArrayConstructor;\n const chunkSize = info.sourceArraySize;\n const dataView = new ArrayConstructor(mappedComputeInfoArrayBuffer, computeInfoOffSet, chunkSize); //new ArrayConstructor(computeInfoBuffer.getMappedRange(computeInfoOffSet, chunkByteSize));\n dataView.set(info.flatSourceArray);\n computeInfoOffSet += chunkSize * ArrayConstructor.BYTES_PER_ELEMENT;\n }\n // we are done at this point.\n computeInfoBuffer.unmap();\n // create a buffer on the GPU to hold suppInfo\n // same here, we need to pad the size of the struct to 16 bytes\n const suppInfoBufferSize = suppInfoBuffer32Size * Uint32Array.BYTES_PER_ELEMENT;\n let paddedSuppInfoBufferSize = suppInfoBufferSize;\n const suppInfoRemainder = suppInfoBufferSize & 15; // check if the size is a multiple of 16\n if (suppInfoRemainder !== 0)\n paddedSuppInfoBufferSize += 16 - suppInfoRemainder; // pad the size accordingly\n paddedSuppInfoBufferSize = Math.max(paddedSuppInfoBufferSize, 16);\n const suppInfoBuffer = device.createBuffer({\n label: 'supp info buffer',\n size: paddedSuppInfoBufferSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n const mappedSuppInfoArrayBuffer = suppInfoBuffer.getMappedRange(); // get full buffer\n let suppInfoOffSet = 0;\n for (const info of processInfo) {\n if (info.suppInfoBuffer && info.suppInfoBuffer.byteLength > 0 && info.suppInfoSize > 0) {\n const ArrayConstructor = info.suppInfoType === \"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */ ? Uint32Array : Float32Array;\n const suppInfoView = new ArrayConstructor(mappedSuppInfoArrayBuffer, suppInfoOffSet, info.suppInfoBuffer.length); //new ArrayConstructor(suppInfoBuffer.getMappedRange(suppInfoOffSet, info.suppInfoBuffer.byteLength));\n suppInfoView.set(info.suppInfoBuffer);\n suppInfoOffSet += info.suppInfoBuffer.byteLength; // info.suppInfoBuffer.length * ArrayConstructor.BYTES_PER_ELEMENT;\n }\n }\n if (suppInfoOffSet === 0) {\n const dummyView = new Uint32Array(mappedSuppInfoArrayBuffer, 0, 4); //new Uint32Array(suppInfoBuffer.getMappedRange(0, 16));\n dummyView.set([1, 1, 1, 1]);\n }\n suppInfoBuffer.unmap();\n // create a buffer for the results\n const resultsBufferSize = resultsBuffer32Size * Uint32Array.BYTES_PER_ELEMENT;\n let paddedResultsBufferSize = resultsBufferSize;\n const resultsRemainder = resultsBufferSize & 15; // check if the size is a multiple of 16\n if (resultsRemainder !== 0)\n paddedResultsBufferSize += 16 - resultsRemainder; // pad the size accordingly\n const resultsBuffer = device.createBuffer({\n label: 'results buffer',\n size: paddedResultsBufferSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC\n });\n // Setup a bindGroup to tell the shader which\n // buffer to use for the computation\n const bindGroup = device.createBindGroup({\n label: 'bindGroup for sparse matrix buffer',\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: computeInfoBuffer } },\n { binding: 1, resource: { buffer: suppInfoBuffer } },\n { binding: 2, resource: { buffer: resultsBuffer } },\n ],\n });\n //const pairComparisonsPerPass = maxIterationsPerThread * numOfThreads;\n //const passes = Math.ceil(condensedDistanceMatrixSize / pairComparisonsPerPass);\n // we will distpatch this many passes to the GPU, and it will handle indexes all by itself.\n // we already copied the start/end information to it, so it will know where to start and end on each pass.\n const resultsOutBuffer = device.createBuffer({\n label: 'results out buffer',\n size: resultsBuffer.size,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n const resultIs = [];\n const resultJs = [];\n const resultDistances = [];\n //let combinedFound = 0;\n let isAllDone = false;\n while (!isAllDone) {\n // Encode commands to do the computation\n const encoder = device.createCommandEncoder({\n label: 'distance encoder',\n });\n const pass = encoder.beginComputePass({\n label: 'distance compute pass',\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(workgroupsDim, workgroupsDim);\n pass.end();\n encoder.copyBufferToBuffer(resultsBuffer, 0, resultsOutBuffer, 0, resultsOutBuffer.size);\n // Finish encoding and submit the commands\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n // Read the results\n yield device.queue.onSubmittedWorkDone();\n yield resultsOutBuffer.mapAsync(GPUMapMode.READ);\n const resultsOutArrayBuffer = resultsOutBuffer.getMappedRange();\n // read the results\n let resultOffset = 0;\n const resultsI = new Uint32Array(resultsOutArrayBuffer, resultOffset, sparseMatrixEachArray32Size);\n resultOffset += sparseMatrixEachArray32Size * Uint32Array.BYTES_PER_ELEMENT;\n const resultsJ = new Uint32Array(resultsOutArrayBuffer, resultOffset, sparseMatrixEachArray32Size);\n resultOffset += sparseMatrixEachArray32Size * Uint32Array.BYTES_PER_ELEMENT;\n const resultsDistances = new Float32Array(resultsOutArrayBuffer, resultOffset, sparseMatrixEachArray32Size);\n resultOffset += sparseMatrixEachArray32Size * Float32Array.BYTES_PER_ELEMENT;\n const resultsFound = new Uint32Array(resultsOutArrayBuffer, resultOffset, numOfThreads);\n resultOffset += numOfThreads * Uint32Array.BYTES_PER_ELEMENT;\n const resultsDone = new Uint32Array(resultsOutArrayBuffer, resultOffset, numOfThreads);\n isAllDone = resultsDone.every((d) => d === 1);\n const totalResults = resultsFound.reduce((a, b) => a + b, 0);\n const combinedI = new Uint32Array(totalResults);\n const combinedJ = new Uint32Array(totalResults);\n const combinedDistances = new Float32Array(totalResults);\n let combinedOffset = 0;\n for (let resI = 0; resI < resultsFound.length; resI++) {\n const found = resultsFound[resI];\n if (found === 0)\n continue;\n combinedI.set(resultsI.subarray(resI * sparseResultSizePerThread, resI * sparseResultSizePerThread + found), combinedOffset);\n combinedJ.set(resultsJ.subarray(resI * sparseResultSizePerThread, resI * sparseResultSizePerThread + found), combinedOffset);\n combinedDistances.set(resultsDistances.subarray(resI * sparseResultSizePerThread, resI * sparseResultSizePerThread + found), combinedOffset);\n combinedOffset += found;\n }\n resultIs.push(combinedI);\n resultJs.push(combinedJ);\n resultDistances.push(combinedDistances);\n resultsOutBuffer.unmap();\n }\n const totalSize = resultIs.reduce((a, b) => a + b.length, 0);\n const finalI = new Uint32Array(totalSize);\n const finalJ = new Uint32Array(totalSize);\n const finalDistances = new Float32Array(totalSize);\n let finalOffset = 0;\n for (let i = 0; i < resultIs.length; i++) {\n finalI.set(resultIs[i], finalOffset);\n finalJ.set(resultJs[i], finalOffset);\n finalDistances.set(resultDistances[i], finalOffset);\n finalOffset += resultIs[i].length;\n }\n // as rule mandates, destroy all buffers.\n computeInfoBuffer.destroy();\n suppInfoBuffer.destroy();\n resultsBuffer.destroy();\n resultsOutBuffer.destroy();\n return { i: finalI, j: finalJ, distance: finalDistances };\n });\n}\nfunction getCombinedDistanceScript(distanceMetrics, maxEntryLens, maxDistance, aggregation) {\n const distanceWgsls = distanceMetrics.map((metric, i) => {\n return `\n fn distanceScript${i}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${i}[aIndex];\n let b = computeInfo.data${i}[bIndex];\n let maxDistance: f32 = ${maxDistance};\n ${webGPUFunctions[metric](maxEntryLens[i], i)}\n }\n `;\n });\n const allDistanceScripts = distanceWgsls.join('\\n');\n const combineDistancesScript = `\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${distanceMetrics.length}>;\n ${distanceMetrics.map((_, i) => `distances[${i}] = distanceScript${i}(aIndex, bIndex);`).join('\\n')}\n ${WEBGSLAGGREGATIONFUNCTIONS[aggregation](distanceMetrics.length)}\n }\n \n `;\n return allDistanceScripts + '\\n' + combineDistancesScript;\n}\n//# sourceMappingURL=webGPU-sparse-matrix.js.map","/* eslint-disable max-len */\nimport { distanceFunctionComplexity, TypeSupportedDistances, WEBGPUDISTANCE } from '../multi-col-distances/webGPU-multicol-distances';\nexport function webGPUProcessInfo(entryList, distanceMetric = WEBGPUDISTANCE.HAMMING, entryIndex, // index of the entries in the list of lists that we want to process\noptions = { gapOpenPenalty: 1.0, gapExtensionPenalty: 0.6 }) {\n var _a, _b;\n let entryType = null;\n const encodedList = (() => {\n if (entryList.some((e) => typeof e === 'string')) {\n entryType = \"STRING\" /* WGPUENTRYTYPE.STRING */;\n return entryList.map((entry) => new Uint32Array(entry.split('').map((c) => c.charCodeAt(0))));\n }\n if (entryList.some((e) => typeof e === 'number')) {\n entryType = \"NUMBER\" /* WGPUENTRYTYPE.NUMBER */;\n return entryList.map((entry) => new Float32Array([entry]));\n }\n if (typeof entryList[0] == 'object' && entryList.some((e) => '_data' in e && '_length' in e)) {\n entryType = \"BITARRAY\" /* WGPUENTRYTYPE.BITARRAY */;\n return entryList.map((entry) => entry._data);\n }\n if (entryList.some((e) => e instanceof Float32Array)) {\n entryType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n return entryList;\n }\n if (entryList.some((e) => e instanceof Uint32Array)) {\n entryType = \"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */;\n return entryList;\n }\n if (entryList.some((e) => e instanceof Int32Array)) {\n entryType = \"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */;\n return entryList;\n }\n //return entryList as Uint32Array[];\n })();\n if (!encodedList || !entryType)\n throw new Error('Invalid entry type, could not determine entry type from input list');\n const encodedListType = encodedList[0] instanceof Int32Array ? \"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */ :\n encodedList[0] instanceof Float32Array ? \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */ : \"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */;\n // sizes of each entries might differ, so we need to keep track of that for some distance metrics, like hamming for example\n const arraySizes = new Uint32Array(encodedList.map((arr) => arr.length));\n if (!TypeSupportedDistances[entryType] || !TypeSupportedDistances[entryType].has(distanceMetric))\n throw new Error(`Distance metric '${distanceMetric}' not supported for entry type '${entryType}'`);\n const maxEntryLen = arraySizes.reduce((a, b) => Math.max(a, b), 0);\n // get the complexity of used algorithm\n const complexity = distanceFunctionComplexity[distanceMetric](maxEntryLen);\n const EncodedArrayConstructor = encodedListType === \"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */ ? Int32Array :\n (encodedListType === \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */ ? Float32Array : Uint32Array);\n const flatSourceArray = new EncodedArrayConstructor(encodedList.length * maxEntryLen);\n // when setting, we need to set each array at a specific offset, which is controlled by maxArrayLen because each array might have different sizes.\n // this way we will get correct matrix representation in the compute shader\n encodedList.forEach((seq, i) => {\n flatSourceArray.set(seq, i * maxEntryLen);\n });\n // NB! all this before the line was generic, now we need to calculate some specific things for some specific distance metrics\n // initialize supp info line that will be included in the final shader;\n let suppInfoStructWgsl = ''; // the code that will be included in the struct of suppInfo\n let suppInfoSize = 0;\n let suppInfoType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n let suppInfoBuffer = null;\n if (distanceMetric === WEBGPUDISTANCE.NEEDLEMAN_WUNSCH || distanceMetric === WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE) {\n let maxMonomerIndex = options.scoringMatrix && options.alphabetIndexes ?\n Object.keys(options.alphabetIndexes).reduce((prev, n) => Math.max(prev, n.charCodeAt(0)), 0) : -1;\n // generate default similarity matrix if it is not provided\n if (!options.alphabetIndexes || !options.scoringMatrix) {\n for (let i = 0; i < flatSourceArray.length; i++) {\n if (flatSourceArray[i] > maxMonomerIndex)\n maxMonomerIndex = flatSourceArray[i];\n }\n options.scoringMatrix =\n new Array(maxMonomerIndex + 1).fill(null).map(() => new Array(maxMonomerIndex + 1).fill(0));\n options.alphabetIndexes = {};\n for (let i = 0; i < options.scoringMatrix.length; i++) {\n options.scoringMatrix[i][i] = 1;\n options.alphabetIndexes[String.fromCharCode(i)] = i;\n }\n }\n const similarityMatrixSize = (maxMonomerIndex + 1) * (maxMonomerIndex + 1);\n const transferedSimilarityMatrix = new Array(maxMonomerIndex + 1).fill(null).map(() => new Float32Array(maxMonomerIndex + 1));\n // set diagonal to 1\n for (let i = 0; i < maxMonomerIndex + 1; i++)\n transferedSimilarityMatrix[i][i] = 1;\n const alphabetIndexes = options.alphabetIndexes;\n for (const key of Object.keys(alphabetIndexes)) {\n for (const key2 of Object.keys(alphabetIndexes)) {\n if (key === key2)\n continue;\n transferedSimilarityMatrix[key.charCodeAt(0)][key2.charCodeAt(0)] =\n options.scoringMatrix[alphabetIndexes[key]][alphabetIndexes[key2]];\n }\n }\n // in memory layout, we will have 2 float32 s for gapOpen and gapExtension penalties, and then f32 array<array<f32>> for similarity matrix.\n // because of primitives, there will be no padding, so we can calculate the size directly\n suppInfoSize = 2 + similarityMatrixSize;\n suppInfoType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n suppInfoBuffer = new Float32Array(suppInfoSize);\n suppInfoBuffer[0] = (_a = options.gapOpenPenalty) !== null && _a !== void 0 ? _a : 1.0;\n suppInfoBuffer[1] = (_b = options.gapExtensionPenalty) !== null && _b !== void 0 ? _b : 0.6;\n let offset = 2;\n for (let i = 0; i < transferedSimilarityMatrix.length; i++) {\n suppInfoBuffer.set(transferedSimilarityMatrix[i], offset);\n offset += transferedSimilarityMatrix[i].length;\n }\n suppInfoStructWgsl = `\n gapOpenPenalty${entryIndex}: f32,\n gapExtensionPenalty${entryIndex}: f32,\n similarityMatrix${entryIndex}: array<array<f32, ${maxMonomerIndex + 1}>, ${maxMonomerIndex + 1}>`;\n }\n else if (distanceMetric === WEBGPUDISTANCE.Difference) {\n // for difference, we need range of values for normalization of the difference\n if (!options.range || typeof options.range !== 'number' || options.range <= 0) {\n const min = flatSourceArray.reduce((a, b) => Math.min(a, b), flatSourceArray[0]);\n const max = flatSourceArray.reduce((a, b) => Math.max(a, b), flatSourceArray[0]);\n options.range = max - min;\n }\n if (options.range <= 0)\n options.range = 1.0; // this means that all values are the same, and all distances will produce 0.\n suppInfoSize = 1;\n suppInfoType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n suppInfoBuffer = new Float32Array([options.range]);\n suppInfoStructWgsl = `\n range${entryIndex}: f32`;\n }\n const dataTypeWGSL = flatSourceArray instanceof Int32Array ? 'i32' : (flatSourceArray instanceof Float32Array ? 'f32' : 'u32');\n const dataStructWgsl = `data${entryIndex}: array<array<${dataTypeWGSL}, ${maxEntryLen}>, ${encodedList.length}>`;\n // for now, other distances do not require any additional information, so we can skip that\n return {\n flatSourceArray,\n sourceArraySize: flatSourceArray.length,\n maxEntryLen,\n arraySizes,\n complexity,\n suppInfoBuffer,\n suppInfoSize,\n suppInfoType: suppInfoType,\n suppInfoStructWgsl,\n entryType,\n dataTypeWGSL,\n dataStructWgsl,\n EncodedArrayConstructor\n };\n}\n//# sourceMappingURL=webGPU-process-info.js.map","// simple semaphore\nlet semaphore = Promise.resolve();\nconst lock = async () => {\n await semaphore;\n let release = () => { };\n const promise = new Promise((resolve) => {\n release = resolve;\n });\n semaphore = promise;\n return release;\n};\n/** Multiplies sparse matrix by itself. note that it expects that sparse matrix is full\n * (i.e. not only the upper right corner) and it has self loops if any */\nexport async function multSparseMatrix(sparseMatrix, nRows, pruneValue) {\n const workersNum = Math.min(Math.min(Math.max(navigator.hardwareConcurrency - 2, 1), nRows), 10);\n // number of horizontal strips that we will divide the matrix into\n // we divide the matrix into horizontal strips, because its faster for indexing and better for cache\n const numOfHorizontalStrinps = workersNum * 5;\n const indexStarts = new Uint32Array(numOfHorizontalStrinps);\n const indexEnds = new Uint32Array(numOfHorizontalStrinps);\n const blockHeight = nRows / numOfHorizontalStrinps;\n for (let i = 0; i < numOfHorizontalStrinps; i++) {\n indexStarts[i] = Math.floor(i * blockHeight);\n indexEnds[i] = i === numOfHorizontalStrinps - 1 ? nRows : Math.floor((i + 1) * blockHeight);\n }\n const workers = new Array(workersNum).fill(0)\n .map(() => new Worker(new URL('./mcl-sparse-matrix-mult-worker', import.meta.url)));\n const availableIndexes = new Set();\n for (let i = 0; i < numOfHorizontalStrinps; i++)\n availableIndexes.add(i);\n const initPromises = workers.map((worker) => {\n return new Promise((resolve) => {\n worker.postMessage({\n is: sparseMatrix.i,\n js: sparseMatrix.j,\n ds: sparseMatrix.distance,\n nRows,\n pruneValue\n });\n worker.onmessage = () => {\n resolve();\n };\n });\n });\n await Promise.all(initPromises);\n const res = [];\n const takeChunk = async (workerIdx) => {\n const release = await lock();\n const index = availableIndexes.values().next().value;\n if (index == null) {\n release();\n return;\n }\n availableIndexes.delete(index);\n release();\n await new Promise((resolve) => {\n workers[workerIdx].postMessage({\n blockStart: indexStarts[index],\n blockEnd: indexEnds[index],\n workerIdx\n });\n workers[workerIdx].onmessage = (e) => {\n res.push(e.data);\n resolve();\n };\n });\n await takeChunk(workerIdx);\n };\n const promises = workers.map((_worker, i) => {\n return takeChunk(i);\n });\n await Promise.all(promises);\n workers.forEach((worker) => worker.terminate());\n let totLen = 0;\n for (const r of res)\n totLen += r.i.length;\n const i = new Uint32Array(totLen);\n const j = new Uint32Array(totLen);\n const d = new Float32Array(totLen);\n let offset = 0;\n for (const r of res) {\n i.set(r.i, offset);\n j.set(r.j, offset);\n d.set(r.distance, offset);\n offset += r.i.length;\n }\n // don't forget to get the updated values for the diagonal, their rows need to be basically squared and summed\n // also, the diagonal values are not pruned\n return { i, j, distance: d };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLXNwYXJzZS1tYXRyaXgtbXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC1zcGFyc2UtbWF0cml4LW11bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsbUJBQW1CO0FBQ25CLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUVsQyxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtJQUN0QixNQUFNLFNBQVMsQ0FBQztJQUNoQixJQUFJLE9BQU8sR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM1QyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUNwQixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFHRjt5RUFDeUU7QUFDekUsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsWUFBMEIsRUFBRSxLQUFhLEVBQUUsVUFBa0I7SUFFN0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVqRyxrRUFBa0U7SUFDbEUsb0dBQW9HO0lBQ3BHLE1BQU0sc0JBQXNCLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUU5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFMUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxHQUFHLHNCQUFz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LENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NwYXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoJztcblxuLy8gc2ltcGxlIHNlbWFwaG9yZVxubGV0IHNlbWFwaG9yZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5jb25zdCBsb2NrID0gYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBzZW1hcGhvcmU7XG4gIGxldCByZWxlYXNlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlbGVhc2UgPSByZXNvbHZlO1xuICB9KTtcbiAgc2VtYXBob3JlID0gcHJvbWlzZTtcbiAgcmV0dXJuIHJlbGVhc2U7XG59O1xuXG5cbi8qKiBNdWx0aXBsaWVzIHNwYXJzZSBtYXRyaXggYnkgaXRzZWxmLiBub3RlIHRoYXQgaXQgZXhwZWN0cyB0aGF0IHNwYXJzZSBtYXRyaXggaXMgZnVsbFxuICogKGkuZS4gbm90IG9ubHkgdGhlIHVwcGVyIHJpZ2h0IGNvcm5lcikgYW5kIGl0IGhhcyBzZWxmIGxvb3BzIGlmIGFueSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG11bHRTcGFyc2VNYXRyaXgoXG4gIHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBuUm93czogbnVtYmVyLCBwcnVuZVZhbHVlOiBudW1iZXJcbik6IFByb21pc2U8U3BhcnNlTWF0cml4PiB7XG4gIGNvbnN0IHdvcmtlcnNOdW0gPSBNYXRoLm1pbihNYXRoLm1pbihNYXRoLm1heChuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSAtIDIsIDEpLCBuUm93cyksIDEwKTtcblxuICAvLyBudW1iZXIgb2YgaG9yaXpvbnRhbCBzdHJpcHMgdGhhdCB3ZSB3aWxsIGRpdmlkZSB0aGUgbWF0cml4IGludG9cbiAgLy8gd2UgZGl2aWRlIHRoZSBtYXRyaXggaW50byBob3Jpem9udGFsIHN0cmlwcywgYmVjYXVzZSBpdHMgZmFzdGVyIGZvciBpbmRleGluZyBhbmQgYmV0dGVyIGZvciBjYWNoZVxuICBjb25zdCBudW1PZkhvcml6b250YWxTdHJpbnBzID0gd29ya2Vyc051bSAqIDU7XG5cbiAgY29uc3QgaW5kZXhTdGFydHMgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZIb3Jpem9udGFsU3RyaW5wcyk7XG4gIGNvbnN0IGluZGV4RW5kcyA9IG5ldyBVaW50MzJBcnJheShudW1PZkhvcml6b250YWxTdHJpbnBzKTtcblxuICBjb25zdCBibG9ja0hlaWdodCA9IG5Sb3dzIC8gbnVtT2ZIb3Jpem9udGFsU3RyaW5wcztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1PZkhvcml6b250YWxTdHJpbnBzOyBpKyspIHtcbiAgICBpbmRleFN0YXJ0c1tpXSA9IE1hdGguZmxvb3IoaSAqIGJsb2NrSGVpZ2h0KTtcbiAgICBpbmRleEVuZHNbaV0gPSBpID09PSBudW1PZkhvcml6b250YWxTdHJpbnBzIC0gMSA/IG5Sb3dzIDogTWF0aC5mbG9vcigoaSArIDEpICogYmxvY2tIZWlnaHQpO1xuICB9XG5cblxuICBjb25zdCB3b3JrZXJzOiBXb3JrZXJbXSA9IG5ldyBBcnJheSh3b3JrZXJzTnVtKS5maWxsKDApXG4gICAgLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vbWNsLXNwYXJzZS1tYXRyaXgtbXVsdC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG5cblxuICBjb25zdCBhdmFpbGFibGVJbmRleGVzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT2ZIb3Jpem9udGFsU3RyaW5wczsgaSsrKVxuICAgIGF2YWlsYWJsZUluZGV4ZXMuYWRkKGkpO1xuXG4gIGNvbnN0IGluaXRQcm9taXNlcyA9IHdvcmtlcnMubWFwKCh3b3JrZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGlzOiBzcGFyc2VNYXRyaXguaSxcbiAgICAgICAganM6IHNwYXJzZU1hdHJpeC5qLFxuICAgICAgICBkczogc3BhcnNlTWF0cml4LmRpc3RhbmNlLFxuICAgICAgICBuUm93cyxcbiAgICAgICAgcHJ1bmVWYWx1ZVxuICAgICAgfSk7XG5cbiAgICAgIHdvcmtlci5vbm1lc3NhZ2UgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChpbml0UHJvbWlzZXMpO1xuXG4gIGNvbnN0IHJlczogU3BhcnNlTWF0cml4W10gPSBbXTtcblxuICBjb25zdCB0YWtlQ2h1bmsgPSBhc3luYyAod29ya2VySWR4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCByZWxlYXNlID0gYXdhaXQgbG9jaygpO1xuICAgIGNvbnN0IGluZGV4ID0gYXZhaWxhYmxlSW5kZXhlcy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgaWYgKGluZGV4ID09IG51bGwpIHtcbiAgICAgIHJlbGVhc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXZhaWxhYmxlSW5kZXhlcy5kZWxldGUoaW5kZXgpO1xuICAgIHJlbGVhc2UoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgd29ya2Vyc1t3b3JrZXJJZHhdLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgYmxvY2tTdGFydDogaW5kZXhTdGFydHNbaW5kZXhdLFxuICAgICAgICBibG9ja0VuZDogaW5kZXhFbmRzW2luZGV4XSxcbiAgICAgICAgd29ya2VySWR4XG4gICAgICB9KTtcblxuICAgICAgd29ya2Vyc1t3b3JrZXJJZHhdLm9ubWVzc2FnZSA9IChlKSA9PiB7XG4gICAgICAgIHJlcy5wdXNoKGUuZGF0YSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgYXdhaXQgdGFrZUNodW5rKHdvcmtlcklkeCk7XG4gIH07XG5cblxuICBjb25zdCBwcm9taXNlcyA9IHdvcmtlcnMubWFwKChfd29ya2VyLCBpKSA9PiB7XG4gICAgcmV0dXJuIHRha2VDaHVuayhpKTtcbiAgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgd29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHdvcmtlci50ZXJtaW5hdGUoKSk7XG5cblxuICBsZXQgdG90TGVuID0gMDtcbiAgZm9yIChjb25zdCByIG9mIHJlcylcbiAgICB0b3RMZW4gKz0gci5pLmxlbmd0aDtcblxuICBjb25zdCBpID0gbmV3IFVpbnQzMkFycmF5KHRvdExlbik7XG4gIGNvbnN0IGogPSBuZXcgVWludDMyQXJyYXkodG90TGVuKTtcbiAgY29uc3QgZCA9IG5ldyBGbG9hdDMyQXJyYXkodG90TGVuKTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGZvciAoY29uc3QgciBvZiByZXMpIHtcbiAgICBpLnNldChyLmksIG9mZnNldCk7XG4gICAgai5zZXQoci5qLCBvZmZzZXQpO1xuICAgIGQuc2V0KHIuZGlzdGFuY2UsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHIuaS5sZW5ndGg7XG4gIH1cblxuICAvLyBkb24ndCBmb3JnZXQgdG8gZ2V0IHRoZSB1cGRhdGVkIHZhbHVlcyBmb3IgdGhlIGRpYWdvbmFsLCB0aGVpciByb3dzIG5lZWQgdG8gYmUgYmFzaWNhbGx5IHNxdWFyZWQgYW5kIHN1bW1lZFxuICAvLyBhbHNvLCB0aGUgZGlhZ29uYWwgdmFsdWVzIGFyZSBub3QgcHJ1bmVkXG5cbiAgcmV0dXJuIHtpLCBqLCBkaXN0YW5jZTogZH07XG59XG4iXX0=","import { multSparseMatrix } from './mcl-sparse-matrix-mult';\nexport function prune(sparseMatrix, pruneValue) {\n const is = [];\n const js = [];\n const ds = [];\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n if (sparseMatrix.distance[i] > pruneValue) {\n is.push(sparseMatrix.i[i]);\n js.push(sparseMatrix.j[i]);\n ds.push(sparseMatrix.distance[i]);\n }\n }\n return { i: new Uint32Array(is), j: new Uint32Array(js), distance: new Float32Array(ds) };\n}\nexport function mclInflate(sparseMatrix, pow) {\n const d = sparseMatrix.distance;\n for (let i = 0; i < sparseMatrix.i.length; i++)\n d[i] = Math.pow(d[i], pow);\n return sparseMatrix;\n}\nexport function colwiseNormilize(sparseMatrix, nRows, pruneValue, doPrune) {\n if (doPrune)\n sparseMatrix = prune(sparseMatrix, pruneValue);\n const colSums = new Float32Array(nRows);\n const d = sparseMatrix.distance;\n const js = sparseMatrix.j;\n for (let i = 0; i < sparseMatrix.i.length; i++)\n colSums[js[i]] += d[i];\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const sum = colSums[js[i]];\n if (sum !== 0)\n d[i] /= sum;\n }\n return sparseMatrix;\n}\nexport function initMCLMatrix(sparseMatrix, nRows, pruneValue) {\n // here we get sparse matrix that is only a half of the matrix\n // also, the matrix contains distances, need to convert those into similarities\n // also, we need to add self loops\n const is = new Uint32Array(sparseMatrix.i.length * 2 + nRows);\n const js = new Uint32Array(sparseMatrix.j.length * 2 + nRows);\n const ds = new Float32Array(sparseMatrix.distance.length * 2 + nRows);\n for (let i = 0; i < nRows; i++) {\n is[i] = i;\n js[i] = i;\n ds[i] = 1;\n }\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const start = i * 2 + nRows;\n is[start] = sparseMatrix.i[i];\n js[start] = sparseMatrix.j[i];\n ds[start] = 1 - sparseMatrix.distance[i];\n is[start + 1] = sparseMatrix.j[i];\n js[start + 1] = sparseMatrix.i[i];\n ds[start + 1] = 1 - sparseMatrix.distance[i];\n }\n // normalize\n colwiseNormilize({ i: is, j: js, distance: ds }, nRows, pruneValue, false);\n return { i: is, j: js, distance: ds };\n}\nexport async function runMarkovClustering(sparseMatrix, nRows, inflate, maxIter, pruneValue) {\n let matrix = initMCLMatrix(sparseMatrix, nRows, pruneValue);\n for (let i = 0; i < maxIter; i++) {\n matrix = await multSparseMatrix(matrix, nRows, pruneValue);\n // console.time('inflate');\n //@ts-ignore\n matrix = colwiseNormilize(matrix, nRows, pruneValue, false);\n matrix = mclInflate(matrix, inflate);\n //@ts-ignore\n matrix = colwiseNormilize(matrix, nRows, pruneValue, true);\n console.log('MCL iteration', i);\n }\n return matrix;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcmluZy1zdGVwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsdXN0ZXJpbmctc3RlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxZQUEwQixFQUFFLFVBQWtCO0lBQ2xFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNkLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNkLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQy9DLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQzFGLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLFlBQTBCLEVBQUUsR0FBVztJQUNoRSxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFD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RyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJDLFlBQVk7UUFDWixNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NwYXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoJztcbmltcG9ydCB7bXVsdFNwYXJzZU1hdHJpeH0gZnJvbSAnLi9tY2wtc3BhcnNlLW1hdHJpeC1tdWx0JztcblxuZXhwb3J0IGZ1bmN0aW9uIHBydW5lKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBwcnVuZVZhbHVlOiBudW1iZXIpOiBTcGFyc2VNYXRyaXgge1xuICBjb25zdCBpcyA9IFtdO1xuICBjb25zdCBqcyA9IFtdO1xuICBjb25zdCBkcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXSA+IHBydW5lVmFsdWUpIHtcbiAgICAgIGlzLnB1c2goc3BhcnNlTWF0cml4LmlbaV0pO1xuICAgICAganMucHVzaChzcGFyc2VNYXRyaXgualtpXSk7XG4gICAgICBkcy5wdXNoKHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7aTogbmV3IFVpbnQzMkFycmF5KGlzKSwgajogbmV3IFVpbnQzMkFycmF5KGpzKSwgZGlzdGFuY2U6IG5ldyBGbG9hdDMyQXJyYXkoZHMpfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jbEluZmxhdGUoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIHBvdzogbnVtYmVyKSB7XG4gIGNvbnN0IGQgPSBzcGFyc2VNYXRyaXguZGlzdGFuY2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspXG4gICAgZFtpXSA9IE1hdGgucG93KGRbaV0sIHBvdyk7XG5cbiAgcmV0dXJuIHNwYXJzZU1hdHJpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbHdpc2VOb3JtaWxpemUoXG4gIHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBuUm93czogbnVtYmVyLCBwcnVuZVZhbHVlOiBudW1iZXIsIGRvUHJ1bmU/OiBib29sZWFuXG4pOiBTcGFyc2VNYXRyaXgge1xuICBpZiAoZG9QcnVuZSlcbiAgICBzcGFyc2VNYXRyaXggPSBwcnVuZShzcGFyc2VNYXRyaXgsIHBydW5lVmFsdWUpO1xuXG4gIGNvbnN0IGNvbFN1bXMgPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKTtcbiAgY29uc3QgZCA9IHNwYXJzZU1hdHJpeC5kaXN0YW5jZTtcbiAgY29uc3QganMgPSBzcGFyc2VNYXRyaXguajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKylcbiAgICBjb2xTdW1zW2pzW2ldXSArPSBkW2ldO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdW0gPSBjb2xTdW1zW2pzW2ldXTtcbiAgICBpZiAoc3VtICE9PSAwKVxuICAgICAgZFtpXSAvPSBzdW07XG4gIH1cbiAgcmV0dXJuIHNwYXJzZU1hdHJpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRNQ0xNYXRyaXgoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIG5Sb3dzOiBudW1iZXIsIHBydW5lVmFsdWU6IG51bWJlcik6IFNwYXJzZU1hdHJpeCB7XG4gIC8vIGhlcmUgd2UgZ2V0IHNwYXJzZSBtYXRyaXggdGhhdCBpcyBvbmx5IGEgaGFsZiBvZiB0aGUgbWF0cml4XG4gIC8vIGFsc28sIHRoZSBtYXRyaXggY29udGFpbnMgZGlzdGFuY2VzLCBuZWVkIHRvIGNvbnZlcnQgdGhvc2UgaW50byBzaW1pbGFyaXRpZXNcbiAgLy8gYWxzbywgd2UgbmVlZCB0byBhZGQgc2VsZiBsb29wc1xuICBjb25zdCBpcyA9IG5ldyBVaW50MzJBcnJheShzcGFyc2VNYXRyaXguaS5sZW5ndGggKiAyICsgblJvd3MpO1xuICBjb25zdCBqcyA9IG5ldyBVaW50MzJBcnJheShzcGFyc2VNYXRyaXguai5sZW5ndGggKiAyICsgblJvd3MpO1xuICBjb25zdCBkcyA9IG5ldyBGbG9hdDMyQXJyYXkoc3BhcnNlTWF0cml4LmRpc3RhbmNlLmxlbmd0aCAqIDIgKyBuUm93cyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgIGlzW2ldID0gaTtcbiAgICBqc1tpXSA9IGk7XG4gICAgZHNbaV0gPSAxO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFydCA9IGkgKiAyICsgblJvd3M7XG4gICAgaXNbc3RhcnRdID0gc3BhcnNlTWF0cml4LmlbaV07XG4gICAganNbc3RhcnRdID0gc3BhcnNlTWF0cml4LmpbaV07XG4gICAgZHNbc3RhcnRdID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcblxuICAgIGlzW3N0YXJ0ICsgMV0gPSBzcGFyc2VNYXRyaXgualtpXTtcbiAgICBqc1tzdGFydCArIDFdID0gc3BhcnNlTWF0cml4LmlbaV07XG4gICAgZHNbc3RhcnQgKyAxXSA9IDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV07XG4gIH1cblxuICAvLyBub3JtYWxpemVcbiAgY29sd2lzZU5vcm1pbGl6ZSh7aTogaXMsIGo6IGpzLCBkaXN0YW5jZTogZHN9LCBuUm93cywgcHJ1bmVWYWx1ZSwgZmFsc2UpO1xuXG4gIHJldHVybiB7aTogaXMsIGo6IGpzLCBkaXN0YW5jZTogZHN9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWFya292Q2x1c3RlcmluZyhcbiAgc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIG5Sb3dzOiBudW1iZXIsIGluZmxhdGU6IG51bWJlciwgbWF4SXRlcjogbnVtYmVyLCBwcnVuZVZhbHVlOiBudW1iZXJcbikge1xuICBsZXQgbWF0cml4ID0gaW5pdE1DTE1hdHJpeChzcGFyc2VNYXRyaXgsIG5Sb3dzLCBwcnVuZVZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhJdGVyOyBpKyspIHtcbiAgICBtYXRyaXggPSBhd2FpdCBtdWx0U3BhcnNlTWF0cml4KG1hdHJpeCwgblJvd3MsIHBydW5lVmFsdWUpO1xuICAgIC8vIGNvbnNvbGUudGltZSgnaW5mbGF0ZScpO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIG1hdHJpeCA9IGNvbHdpc2VOb3JtaWxpemUobWF0cml4LCBuUm93cywgcHJ1bmVWYWx1ZSwgZmFsc2UpO1xuICAgIG1hdHJpeCA9IG1jbEluZmxhdGUobWF0cml4LCBpbmZsYXRlKTtcblxuICAgIC8vQHRzLWlnbm9yZVxuICAgIG1hdHJpeCA9IGNvbHdpc2VOb3JtaWxpemUobWF0cml4LCBuUm93cywgcHJ1bmVWYWx1ZSwgdHJ1ZSk7XG4gICAgY29uc29sZS5sb2coJ01DTCBpdGVyYXRpb24nLCBpKTtcbiAgfVxuXG4gIHJldHVybiBtYXRyaXg7XG59XG4iXX0=","/* eslint-disable max-len */\nimport Graph from 'graphology';\nimport forceAtlas2 from 'graphology-layout-forceatlas2';\n// note: subCluster is of size nRows and contains for each point which subcluster it belongs to\n// note: cluster is of size of this concrete supercluster, and contains the indexes of the points in that supercluster\nexport function getWebColaLayot(cluster, clusterConnections, _subCluster) {\n const graph = new Graph();\n for (let i = 0; i < cluster.length; i++)\n graph.addNode(cluster[i], { x: Math.random() * 20000, y: Math.random() * 20000 });\n for (let it = 0; it < clusterConnections.i.length; it++) {\n const i = clusterConnections.i[it];\n const j = clusterConnections.j[it];\n const v = clusterConnections.v[it];\n if (i === j || v <= 0)\n continue;\n const weight = _subCluster[i] === _subCluster[j] ? 2 : 1;\n graph.addEdge(i, j, { weight: v * weight });\n }\n const settings = {\n iterations: 100,\n // edgeWeightInfluence: 1, // Influence of edge weights on the layout\n // scalingRatio: 1, // Scaling ratio to account for node sizes\n // //barnesHutOptimize: true,\n // //barnesHutTheta: 0.5,\n // adjustSizes: true,\n // weighted: true,\n // strongGravityMode: true,\n getEdgeWeight: 'weight',\n settings: { ...forceAtlas2.inferSettings(graph), weighted: true, edgeWeightInfluence: 1 }\n };\n forceAtlas2.assign(graph, settings);\n const embedX1 = new Float32Array(cluster.length);\n const embedY1 = new Float32Array(cluster.length);\n for (let i = 0; i < cluster.length; i++) {\n const node = graph.getNodeAttributes(cluster[i]);\n embedX1[i] = node.x;\n embedY1[i] = node.y;\n }\n let minX = embedX1[0];\n let minY = embedY1[0];\n let maxX = embedX1[0];\n let maxY = embedY1[0];\n for (let i = 1; i < cluster.length; i++) {\n minX = Math.min(minX, embedX1[i]);\n minY = Math.min(minY, embedY1[i]);\n maxX = Math.max(maxX, embedX1[i]);\n maxY = Math.max(maxY, embedY1[i]);\n }\n let scaleX = maxX - minX;\n let scaleY = maxY - minY;\n if (scaleX === 0)\n scaleX = 1;\n if (scaleY === 0)\n scaleY = 1;\n for (let i = 0; i < cluster.length; i++) {\n embedX1[i] = (embedX1[i] - minX) / scaleX;\n embedY1[i] = (embedY1[i] - minY) / scaleY;\n }\n return { embedX: embedX1, embedY: embedY1 };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViQ29sYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYkNvbGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEJBQTRCO0FBRTVCLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RCwrRkFBK0Y7QUFDL0Ysc0hBQXNIO0FBQ3RILE1BQU0sVUFBVSxlQUFlLENBQzdCLE9BQWlCLEVBQUUsa0JBQTJELEVBQUUsV0FBcUI7SUFLckcsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDckMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBQyxDQUFDLENBQUM7SUFFbEYsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4RCxNQUFNLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkIsU0FBUztRQUNYLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FB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R0FBRyxNQUFNLENBQUM7UUFDMUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbmltcG9ydCBHcmFwaCBmcm9tICdncmFwaG9sb2d5JztcbmltcG9ydCBmb3JjZUF0bGFzMiBmcm9tICdncmFwaG9sb2d5LWxheW91dC1mb3JjZWF0bGFzMic7XG5cbi8vIG5vdGU6IHN1YkNsdXN0ZXIgaXMgb2Ygc2l6ZSBuUm93cyBhbmQgY29udGFpbnMgZm9yIGVhY2ggcG9pbnQgd2hpY2ggc3ViY2x1c3RlciBpdCBiZWxvbmdzIHRvXG4vLyBub3RlOiBjbHVzdGVyIGlzIG9mIHNpemUgb2YgdGhpcyBjb25jcmV0ZSBzdXBlcmNsdXN0ZXIsIGFuZCBjb250YWlucyB0aGUgaW5kZXhlcyBvZiB0aGUgcG9pbnRzIGluIHRoYXQgc3VwZXJjbHVzdGVyXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViQ29sYUxheW90KFxuICBjbHVzdGVyOiBudW1iZXJbXSwgY2x1c3RlckNvbm5lY3Rpb25zOiB7aTogbnVtYmVyW10sIGo6IG51bWJlcltdLCB2OiBudW1iZXJbXX0sIF9zdWJDbHVzdGVyOiBudW1iZXJbXVxuKToge1xuICAgIGVtYmVkWDogRmxvYXQzMkFycmF5O1xuICAgIGVtYmVkWTogRmxvYXQzMkFycmF5O1xufSB7XG4gIGNvbnN0IGdyYXBoID0gbmV3IEdyYXBoKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3Rlci5sZW5ndGg7IGkrKylcbiAgICBncmFwaC5hZGROb2RlKGNsdXN0ZXJbaV0sIHt4OiBNYXRoLnJhbmRvbSgpICogMjAwMDAsIHk6IE1hdGgucmFuZG9tKCkgKiAyMDAwMH0pO1xuXG4gIGZvciAobGV0IGl0ID0gMDsgaXQgPCBjbHVzdGVyQ29ubmVjdGlvbnMuaS5sZW5ndGg7IGl0KyspIHtcbiAgICBjb25zdCBpID0gY2x1c3RlckNvbm5lY3Rpb25zLmlbaXRdO1xuICAgIGNvbnN0IGogPSBjbHVzdGVyQ29ubmVjdGlvbnMualtpdF07XG4gICAgY29uc3QgdiA9IGNsdXN0ZXJDb25uZWN0aW9ucy52W2l0XTtcbiAgICBpZiAoaSA9PT0gaiB8fCB2IDw9IDApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCB3ZWlnaHQgPSBfc3ViQ2x1c3RlcltpXSA9PT0gX3N1YkNsdXN0ZXJbal0gPyAyIDogMTtcbiAgICBncmFwaC5hZGRFZGdlKGksIGosIHt3ZWlnaHQ6IHYgKiB3ZWlnaHR9KTtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0ge1xuICAgIGl0ZXJhdGlvbnM6IDEwMCxcbiAgICAvLyBlZGdlV2VpZ2h0SW5mbHVlbmNlOiAxLCAvLyBJbmZsdWVuY2Ugb2YgZWRnZSB3ZWlnaHRzIG9uIHRoZSBsYXlvdXRcbiAgICAvLyBzY2FsaW5nUmF0aW86IDEsIC8vIFNjYWxpbmcgcmF0aW8gdG8gYWNjb3VudCBmb3Igbm9kZSBzaXplc1xuICAgIC8vIC8vYmFybmVzSHV0T3B0aW1pemU6IHRydWUsXG4gICAgLy8gLy9iYXJuZXNIdXRUaGV0YTogMC41LFxuICAgIC8vIGFkanVzdFNpemVzOiB0cnVlLFxuICAgIC8vIHdlaWdodGVkOiB0cnVlLFxuICAgIC8vIHN0cm9uZ0dyYXZpdHlNb2RlOiB0cnVlLFxuICAgIGdldEVkZ2VXZWlnaHQ6ICd3ZWlnaHQnLFxuICAgIHNldHRpbmdzOiB7Li4uZm9yY2VBdGxhczIuaW5mZXJTZXR0aW5ncyhncmFwaCksIHdlaWdodGVkOiB0cnVlLCBlZGdlV2VpZ2h0SW5mbHVlbmNlOiAxfVxuICB9O1xuICBmb3JjZUF0bGFzMi5hc3NpZ24oZ3JhcGgsIHNldHRpbmdzKTtcblxuICBjb25zdCBlbWJlZFgxID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCk7XG4gIGNvbnN0IGVtYmVkWTEgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IGdyYXBoLmdldE5vZGVBdHRyaWJ1dGVzKGNsdXN0ZXJbaV0pO1xuICAgIGVtYmVkWDFbaV0gPSBub2RlLng7XG4gICAgZW1iZWRZMVtpXSA9IG5vZGUueTtcbiAgfVxuXG4gIGxldCBtaW5YID0gZW1iZWRYMVswXTtcbiAgbGV0IG1pblkgPSBlbWJlZFkxWzBdO1xuICBsZXQgbWF4WCA9IGVtYmVkWDFbMF07XG4gIGxldCBtYXhZID0gZW1iZWRZMVswXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIGVtYmVkWDFbaV0pO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBlbWJlZFkxW2ldKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgZW1iZWRYMVtpXSk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGVtYmVkWTFbaV0pO1xuICB9XG4gIGxldCBzY2FsZVggPSBtYXhYIC0gbWluWDtcbiAgbGV0IHNjYWxlWSA9IG1heFkgLSBtaW5ZO1xuICBpZiAoc2NhbGVYID09PSAwKVxuICAgIHNjYWxlWCA9IDE7XG4gIGlmIChzY2FsZVkgPT09IDApXG4gICAgc2NhbGVZID0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgZW1iZWRYMVtpXSA9IChlbWJlZFgxW2ldIC0gbWluWCkgLyBzY2FsZVg7XG4gICAgZW1iZWRZMVtpXSA9IChlbWJlZFkxW2ldIC0gbWluWSkgLyBzY2FsZVk7XG4gIH1cblxuICByZXR1cm4ge2VtYmVkWDogZW1iZWRYMSwgZW1iZWRZOiBlbWJlZFkxfTtcbn1cbiJdfQ==","import { runMarkovClustering } from './clustering-steps';\nimport { getWebColaLayot } from './webCola';\nexport const defaultMCLOptions = {\n expandFactor: 2,\n maxIterations: 5,\n inflateFactor: 2,\n multFactor: 1,\n pruneValue: 1e-17,\n};\nexport class MCLSparseReducer {\n constructor(opts = {}) {\n this._options = { ...defaultMCLOptions, ...opts };\n }\n async transform(sparseMatrix, nRows) {\n // get the superClusters before the MCL\n // this will be used for layouting\n const superClusters = this.assignClusters(sparseMatrix, nRows);\n this.correctClusters(superClusters.clusters);\n // before beggining the mcl, we need to save the connections between original points,\n // as MCL might mutate the matrix\n const clusterConnectionMap = this.splitConnectionsIntoClusters(sparseMatrix, superClusters.clusters);\n // perform the MCL\n const mclMatrix = await runMarkovClustering(sparseMatrix, nRows, this._options.inflateFactor, this._options.maxIterations, this._options.pruneValue);\n const { clusters } = this.assignClusters(mclMatrix, nRows);\n this.correctClusters(clusters);\n const embeddings = this.layout(superClusters.clusters, clusterConnectionMap, nRows, clusters);\n return { clusters, embedX: embeddings.embedX, embedY: embeddings.embedY, is: sparseMatrix.i, js: sparseMatrix.j };\n }\n async transformWebGPU(sparseMatrix, nRows) {\n // TODO: implement correct webGPU version\n return this.transform(sparseMatrix, nRows);\n }\n // here as we operate on original sparse matrix, we know for sure that there are no duplicates or self loops\n splitConnectionsIntoClusters(sparseMatrix, clusters) {\n const clusterConnections = new Map();\n for (let i = 0; i < clusters.length; i++) {\n if (!clusterConnections.has(clusters[i]))\n clusterConnections.set(clusters[i], { i: [], j: [], v: [] });\n }\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const cluster = clusters[sparseMatrix.i[i]];\n const cc = clusterConnections.get(cluster);\n cc.i.push(sparseMatrix.i[i]);\n cc.j.push(sparseMatrix.j[i]);\n cc.v.push(1 - sparseMatrix.distance[i]);\n }\n return clusterConnections;\n }\n assignClusters(sparseMatrix, nRows) {\n let clusterNum = 0;\n const is = [];\n const js = [];\n // array containing for each point which cluster it belongs to\n const clusters = new Array(nRows).fill(-1);\n for (let it = 0; it < sparseMatrix.i.length; it++) {\n const i = sparseMatrix.i[it];\n const j = sparseMatrix.j[it];\n if (i === j)\n continue;\n is.push(i);\n js.push(j);\n if (clusters[i] !== -1 && clusters[j] !== -1) {\n if (clusters[i] !== clusters[j])\n this.mergeClusters(clusters, i, j);\n }\n else if (clusters[i] !== -1) {\n clusters[j] = clusters[i];\n }\n else if (clusters[j] !== -1) {\n clusters[i] = clusters[j];\n }\n else {\n clusterNum++;\n clusters[i] = clusterNum;\n clusters[j] = clusterNum;\n }\n }\n // final step for the clusters that are not connected to anything\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: new Uint32Array(is), js: new Uint32Array(js) };\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 /** After assigning and merging, clusters will need reordering according to size */\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[b] - clusterSizeMap[a]);\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 }\n /** notice that here, first argument is the superclusters and last is the subClusters\n * the second argument is the original sparse matrix, and the third is the number of rows\n */\n layout(clusters, clusterConnectionMap, nRows, subCluster) {\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 // split sparse matrix connections into super-clusters, save only indexes\n let clusterNum = 0;\n const sortedClusterNames = Object.keys(clusterMap);\n sortedClusterNames.sort((a, b) => clusterMap[b].length - clusterMap[a].length);\n let perRow = 1;\n const perRowMultiplier = 3;\n let yOffset = 0;\n const layoutSize = 5;\n // cluster sizes could be different, but also very similar. first cluster size can be quite similar\n // to the second one. if not accounted for, the layout will be very unbalanced, and first cluster will\n // be very large\n const perRowSizes = [1];\n // if first two cluster sizes are very similar, first perrow should be 2\n if (sortedClusterNames.length > 1) {\n const clustSize1 = clusterMap[sortedClusterNames[0]].length;\n const clustSize2 = clusterMap[sortedClusterNames[1]].length;\n if (clustSize1 / clustSize2 < 2)\n perRowSizes[0] = 2;\n let curPerRowSize = perRowSizes[0];\n let maxClustersInNextRow = curPerRowSize * perRowMultiplier;\n let pointsInCurRow = curPerRowSize == 1 ? clustSize1 : clustSize1 + clustSize2;\n let pointsAccum = 0;\n let clustersAccum = 0;\n for (let i = 2; i < sortedClusterNames.length; i++) {\n pointsAccum += clusterMap[sortedClusterNames[i]].length;\n clustersAccum++;\n if (clustersAccum > maxClustersInNextRow || pointsAccum >= pointsInCurRow * 0.7 || i === sortedClusterNames.length - 1) {\n perRowSizes.push(i === sortedClusterNames.length - 1 ? maxClustersInNextRow : clustersAccum);\n curPerRowSize = clustersAccum;\n maxClustersInNextRow = curPerRowSize * perRowMultiplier;\n pointsInCurRow = Math.max(pointsAccum, pointsInCurRow);\n pointsAccum = 0;\n clustersAccum = 0;\n }\n }\n }\n perRow = perRowSizes[0];\n let perRowIdx = 0;\n for (const clusterName of sortedClusterNames) {\n const cluster = clusterMap[clusterName];\n const clusterConnections = clusterConnectionMap.get(Number(clusterName));\n const embeddings = getWebColaLayot(cluster, clusterConnections, subCluster);\n if (clusterNum === perRow) {\n clusterNum = 0;\n yOffset += layoutSize / perRow;\n perRowIdx++;\n perRow = Math.min(Math.ceil(perRowSizes[perRowIdx]), 45);\n }\n //const clustersPerRow = Math.ceil(perRow / 1.5);\n const offsetX = ((clusterNum) * layoutSize / perRow + layoutSize / perRow * (1 / 1.2 / 4));\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 / 1.2 + offsetX;\n embedY[cluster[i]] = embeddings.embedY[i] * layoutSize / perRow / 1.2 + yOffset;\n }\n clusterNum++;\n }\n return { embedX, embedY };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya292LWNsdXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXJrb3YtY2x1c3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRTFDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFlO0lBQzNDLFlBQVksRUFBRSxDQUFDO0lBQ2YsYUFBYSxFQUFFLENBQUM7SUFDaEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsVUFBVSxFQUFFLENBQUM7SUFDYixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDO0FBRUYsTUFBTSxPQUFPLGdCQUFnQjtJQUd6QixZQUFZLE9BQTRCLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFDLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLEVBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUEwQixFQUFFLEtBQWE7UUFDOUQsdUNBQXVDO1FBQ3ZDLGtDQUFrQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxxRkFBcUY7UUFDckYsaUNBQWlDO1FBQ2pDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckcsa0JBQWtCO1FBQ2xCLE1BQU0sU0FBUyxHQUFHLE1BQU0sbUJBQW1CLENBQ3pDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFB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YXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoJztcbmltcG9ydCB7TUNMT3B0aW9uc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3J1bk1hcmtvdkNsdXN0ZXJpbmd9IGZyb20gJy4vY2x1c3RlcmluZy1zdGVwcyc7XG5cbmltcG9ydCB7Z2V0V2ViQ29sYUxheW90fSBmcm9tICcuL3dlYkNvbGEnO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1DTE9wdGlvbnM6IE1DTE9wdGlvbnMgPSB7XG4gIGV4cGFuZEZhY3RvcjogMixcbiAgbWF4SXRlcmF0aW9uczogNSxcbiAgaW5mbGF0ZUZhY3RvcjogMixcbiAgbXVsdEZhY3RvcjogMSxcbiAgcHJ1bmVWYWx1ZTogMWUtMTcsXG59O1xuXG5leHBvcnQgY2xhc3MgTUNMU3BhcnNlUmVkdWNlciB7XG4gICAgcHJpdmF0ZSBfb3B0aW9uczogTUNMT3B0aW9ucztcblxuICAgIGNvbnN0cnVjdG9yKG9wdHM6IFBhcnRpYWw8TUNMT3B0aW9ucz4gPSB7fSkge1xuICAgICAgdGhpcy5fb3B0aW9ucyA9IHsuLi5kZWZhdWx0TUNMT3B0aW9ucywgLi4ub3B0c307XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRyYW5zZm9ybShzcGFyc2VNYXRyaXg6IFNwYXJzZU1hdHJpeCwgblJvd3M6IG51bWJlcikge1xuICAgICAgLy8gZ2V0IHRoZSBzdXBlckNsdXN0ZXJzIGJlZm9yZSB0aGUgTUNMXG4gICAgICAvLyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgbGF5b3V0aW5nXG4gICAgICBjb25zdCBzdXBlckNsdXN0ZXJzID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VNYXRyaXgsIG5Sb3dzKTtcbiAgICAgIHRoaXMuY29ycmVjdENsdXN0ZXJzKHN1cGVyQ2x1c3RlcnMuY2x1c3RlcnMpO1xuICAgICAgLy8gYmVmb3JlIGJlZ2dpbmluZyB0aGUgbWNsLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gb3JpZ2luYWwgcG9pbnRzLFxuICAgICAgLy8gYXMgTUNMIG1pZ2h0IG11dGF0ZSB0aGUgbWF0cml4XG4gICAgICBjb25zdCBjbHVzdGVyQ29ubmVjdGlvbk1hcCA9IHRoaXMuc3BsaXRDb25uZWN0aW9uc0ludG9DbHVzdGVycyhzcGFyc2VNYXRyaXgsIHN1cGVyQ2x1c3RlcnMuY2x1c3RlcnMpO1xuICAgICAgLy8gcGVyZm9ybSB0aGUgTUNMXG4gICAgICBjb25zdCBtY2xNYXRyaXggPSBhd2FpdCBydW5NYXJrb3ZDbHVzdGVyaW5nKFxuICAgICAgICBzcGFyc2VNYXRyaXgsIG5Sb3dzLCB0aGlzLl9vcHRpb25zLmluZmxhdGVGYWN0b3IsIHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucywgdGhpcy5fb3B0aW9ucy5wcnVuZVZhbHVlKTtcbiAgICAgIGNvbnN0IHtjbHVzdGVyc30gPSB0aGlzLmFzc2lnbkNsdXN0ZXJzKG1jbE1hdHJpeCwgblJvd3MpO1xuICAgICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IHRoaXMubGF5b3V0KHN1cGVyQ2x1c3RlcnMuY2x1c3RlcnMsIGNsdXN0ZXJDb25uZWN0aW9uTWFwLCBuUm93cywgY2x1c3RlcnMpO1xuICAgICAgcmV0dXJuIHtjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXM6IHNwYXJzZU1hdHJpeC5pLCBqczogc3BhcnNlTWF0cml4Lmp9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm1XZWJHUFUoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXgsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICAgIC8vIFRPRE86IGltcGxlbWVudCBjb3JyZWN0IHdlYkdQVSB2ZXJzaW9uXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oc3BhcnNlTWF0cml4LCBuUm93cyk7XG4gICAgfVxuXG4gICAgLy8gaGVyZSBhcyB3ZSBvcGVyYXRlIG9uIG9yaWdpbmFsIHNwYXJzZSBtYXRyaXgsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcyBvciBzZWxmIGxvb3BzXG4gICAgcHJpdmF0ZSBzcGxpdENvbm5lY3Rpb25zSW50b0NsdXN0ZXJzKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBjbHVzdGVyczogbnVtYmVyW10pIHtcbiAgICAgIGNvbnN0IGNsdXN0ZXJDb25uZWN0aW9ucyA9IG5ldyBNYXA8bnVtYmVyLCB7aTogbnVtYmVyW10sIGo6IG51bWJlcltdLCB2OiBudW1iZXJbXX0+KCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghY2x1c3RlckNvbm5lY3Rpb25zLmhhcyhjbHVzdGVyc1tpXSkpXG4gICAgICAgICAgY2x1c3RlckNvbm5lY3Rpb25zLnNldChjbHVzdGVyc1tpXSwge2k6IFtdLCBqOiBbXSwgdjogW119KTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJzW3NwYXJzZU1hdHJpeC5pW2ldXTtcbiAgICAgICAgY29uc3QgY2MgPSBjbHVzdGVyQ29ubmVjdGlvbnMuZ2V0KGNsdXN0ZXIpITtcbiAgICAgICAgY2MuaS5wdXNoKHNwYXJzZU1hdHJpeC5pW2ldKTtcbiAgICAgICAgY2Muai5wdXNoKHNwYXJzZU1hdHJpeC5qW2ldKTtcbiAgICAgICAgY2Mudi5wdXNoKDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsdXN0ZXJDb25uZWN0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzc2lnbkNsdXN0ZXJzKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4LCBuUm93czogbnVtYmVyKSB7XG4gICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICBjb25zdCBpczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGpzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgLy8gYXJyYXkgY29udGFpbmluZyBmb3IgZWFjaCBwb2ludCB3aGljaCBjbHVzdGVyIGl0IGJlbG9uZ3MgdG9cbiAgICAgIGNvbnN0IGNsdXN0ZXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheShuUm93cykuZmlsbCgtMSk7XG4gICAgICBmb3IgKGxldCBpdCA9IDA7IGl0IDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpdCsrKSB7XG4gICAgICAgIGNvbnN0IGkgPSBzcGFyc2VNYXRyaXguaVtpdF07XG4gICAgICAgIGNvbnN0IGogPSBzcGFyc2VNYXRyaXgualtpdF07XG4gICAgICAgIGlmIChpID09PSBqKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpcy5wdXNoKGkpO1xuICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IC0xICYmIGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgIGlmIChjbHVzdGVyc1tpXSAhPT0gY2x1c3RlcnNbal0pXG4gICAgICAgICAgICB0aGlzLm1lcmdlQ2x1c3RlcnMoY2x1c3RlcnMsIGksIGopO1xuICAgICAgICB9IGVsc2UgaWYgKGNsdXN0ZXJzW2ldICE9PSAtMSkge1xuICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3RlcnNbaV07XG4gICAgICAgIH0gZWxzZSBpZiAoY2x1c3RlcnNbal0gIT09IC0xKSB7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyc1tqXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3Rlck51bTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaW5hbCBzdGVwIGZvciB0aGUgY2x1c3RlcnMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB0byBhbnl0aGluZ1xuICAgICAgZm9yIChsZXQgaT0wOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICAgIGNsdXN0ZXJOdW0gKys7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge2NsdXN0ZXJzLCBpczogbmV3IFVpbnQzMkFycmF5KGlzKSwganM6IG5ldyBVaW50MzJBcnJheShqcyl9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVyZ2VDbHVzdGVycyhjbHVzdGVyczogbnVtYmVyW10sIGk6IG51bWJlciwgajogbnVtYmVyKSB7XG4gICAgICBjb25zdCBpQ2x1c3RlciA9IGNsdXN0ZXJzW2ldO1xuICAgICAgY29uc3QgakNsdXN0ZXIgPSBjbHVzdGVyc1tqXTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY2x1c3RlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKGNsdXN0ZXJzW2tdID09PSBqQ2x1c3RlcilcbiAgICAgICAgICBjbHVzdGVyc1trXSA9IGlDbHVzdGVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZnRlciBhc3NpZ25pbmcgYW5kIG1lcmdpbmcsIGNsdXN0ZXJzIHdpbGwgbmVlZCByZW9yZGVyaW5nIGFjY29yZGluZyB0byBzaXplICovXG4gICAgcHJpdmF0ZSBjb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnM6IG51bWJlcltdKSB7XG4gICAgICBjb25zdCBjbHVzdGVyU2l6ZU1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgICAgaWYgKCFjbHVzdGVyU2l6ZU1hcFtjbHVzdGVyXSlcbiAgICAgICAgICBjbHVzdGVyU2l6ZU1hcFtjbHVzdGVyXSA9IDA7XG4gICAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKys7XG4gICAgICB9XG4gICAgICBjb25zdCBzb3J0ZWRJbmRleGVzID1cbiAgICAgICAgT2JqZWN0LmtleXMoY2x1c3RlclNpemVNYXApLm1hcChOdW1iZXIpLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJTaXplTWFwW2JdIC0gY2x1c3RlclNpemVNYXBbYV0pO1xuICAgICAgY29uc3QgY2x1c3Rlck1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgICBzb3J0ZWRJbmRleGVzLmZvckVhY2goKGNsdXN0ZXJJZHgsIGkpID0+IGNsdXN0ZXJNYXBbY2x1c3RlcklkeF0gPSBpICsgMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dO1xuICAgIH1cblxuXG4gICAgLyoqIG5vdGljZSB0aGF0IGhlcmUsIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBzdXBlcmNsdXN0ZXJzIGFuZCBsYXN0IGlzIHRoZSBzdWJDbHVzdGVyc1xuICAgICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG9yaWdpbmFsIHNwYXJzZSBtYXRyaXgsIGFuZCB0aGUgdGhpcmQgaXMgdGhlIG51bWJlciBvZiByb3dzXG4gICAgICovXG4gICAgcHJpdmF0ZSBsYXlvdXQoY2x1c3RlcnM6IG51bWJlcltdLCBjbHVzdGVyQ29ubmVjdGlvbk1hcDogTWFwPG51bWJlciwge1xuICAgICAgICBpOiBudW1iZXJbXTtcbiAgICAgICAgajogbnVtYmVyW107XG4gICAgICAgIHY6IG51bWJlcltdO30+LCBuUm93czogbnVtYmVyLCBzdWJDbHVzdGVyOiBudW1iZXJbXSkge1xuICAgICAgY29uc3QgZW1iZWRYID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgICAgIGNvbnN0IGVtYmVkWSA9IG5ldyBGbG9hdDMyQXJyYXkoblJvd3MpLmZpbGwoMCk7XG4gICAgICBjb25zdCBjbHVzdGVyTWFwOiB7W186IG51bWJlcl06IG51bWJlcltdfSA9IHt9O1xuICAgICAgY2x1c3RlcnMuZm9yRWFjaCgoY2x1c3RlciwgaSkgPT4ge1xuICAgICAgICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3Rlcl0pXG4gICAgICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXSA9IFtdO1xuICAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdLnB1c2goaSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gc3BsaXQgc3BhcnNlIG1hdHJpeCBjb25uZWN0aW9ucyBpbnRvIHN1cGVyLWNsdXN0ZXJzLCBzYXZlIG9ubHkgaW5kZXhlc1xuICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgY29uc3Qgc29ydGVkQ2x1c3Rlck5hbWVzID0gT2JqZWN0LmtleXMoY2x1c3Rlck1hcCk7XG4gICAgICBzb3J0ZWRDbHVzdGVyTmFtZXMuc29ydCgoYSwgYikgPT4gY2x1c3Rlck1hcFtiIGFzIGFueV0ubGVuZ3RoIC0gY2x1c3Rlck1hcFthIGFzIGFueV0ubGVuZ3RoKTtcbiAgICAgIGxldCBwZXJSb3cgPSAxO1xuICAgICAgY29uc3QgcGVyUm93TXVsdGlwbGllciA9IDM7XG5cbiAgICAgIGxldCB5T2Zmc2V0ID0gMDtcbiAgICAgIGNvbnN0IGxheW91dFNpemUgPSA1O1xuICAgICAgLy8gY2x1c3RlciBzaXplcyBjb3VsZCBiZSBkaWZmZXJlbnQsIGJ1dCBhbHNvIHZlcnkgc2ltaWxhci4gZmlyc3QgY2x1c3RlciBzaXplIGNhbiBiZSBxdWl0ZSBzaW1pbGFyXG4gICAgICAvLyB0byB0aGUgc2Vjb25kIG9uZS4gaWYgbm90IGFjY291bnRlZCBmb3IsIHRoZSBsYXlvdXQgd2lsbCBiZSB2ZXJ5IHVuYmFsYW5jZWQsIGFuZCBmaXJzdCBjbHVzdGVyIHdpbGxcbiAgICAgIC8vIGJlIHZlcnkgbGFyZ2VcbiAgICAgIGNvbnN0IHBlclJvd1NpemVzOiBudW1iZXJbXSA9IFsxXTtcbiAgICAgIC8vIGlmIGZpcnN0IHR3byBjbHVzdGVyIHNpemVzIGFyZSB2ZXJ5IHNpbWlsYXIsIGZpcnN0IHBlcnJvdyBzaG91bGQgYmUgMlxuICAgICAgaWYgKHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGNsdXN0U2l6ZTEgPSBjbHVzdGVyTWFwW3NvcnRlZENsdXN0ZXJOYW1lc1swXSBhcyBhbnldLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY2x1c3RTaXplMiA9IGNsdXN0ZXJNYXBbc29ydGVkQ2x1c3Rlck5hbWVzWzFdIGFzIGFueV0ubGVuZ3RoO1xuICAgICAgICBpZiAoY2x1c3RTaXplMSAvIGNsdXN0U2l6ZTIgPCAyKVxuICAgICAgICAgIHBlclJvd1NpemVzWzBdID0gMjtcbiAgICAgICAgbGV0IGN1clBlclJvd1NpemUgPSBwZXJSb3dTaXplc1swXTtcbiAgICAgICAgbGV0IG1heENsdXN0ZXJzSW5OZXh0Um93ID0gY3VyUGVyUm93U2l6ZSAqIHBlclJvd011bHRpcGxpZXI7XG4gICAgICAgIGxldCBwb2ludHNJbkN1clJvdyA9IGN1clBlclJvd1NpemUgPT0gMSA/IGNsdXN0U2l6ZTEgOiBjbHVzdFNpemUxICsgY2x1c3RTaXplMjtcbiAgICAgICAgbGV0IHBvaW50c0FjY3VtID0gMDtcbiAgICAgICAgbGV0IGNsdXN0ZXJzQWNjdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHBvaW50c0FjY3VtICs9IGNsdXN0ZXJNYXBbc29ydGVkQ2x1c3Rlck5hbWVzW2ldIGFzIGFueV0ubGVuZ3RoO1xuICAgICAgICAgIGNsdXN0ZXJzQWNjdW0rKztcbiAgICAgICAgICBpZiAoY2x1c3RlcnNBY2N1bSA+IG1heENsdXN0ZXJzSW5OZXh0Um93IHx8IHBvaW50c0FjY3VtID49IHBvaW50c0luQ3VyUm93ICogMC43IHx8IGkgPT09IHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBwZXJSb3dTaXplcy5wdXNoKGkgPT09IHNvcnRlZENsdXN0ZXJOYW1lcy5sZW5ndGggLSAxID8gbWF4Q2x1c3RlcnNJbk5leHRSb3cgOiBjbHVzdGVyc0FjY3VtKTtcbiAgICAgICAgICAgIGN1clBlclJvd1NpemUgPSBjbHVzdGVyc0FjY3VtO1xuICAgICAgICAgICAgbWF4Q2x1c3RlcnNJbk5leHRSb3cgPSBjdXJQZXJSb3dTaXplICogcGVyUm93TXVsdGlwbGllcjtcbiAgICAgICAgICAgIHBvaW50c0luQ3VyUm93ID0gTWF0aC5tYXgocG9pbnRzQWNjdW0sIHBvaW50c0luQ3VyUm93KTtcbiAgICAgICAgICAgIHBvaW50c0FjY3VtID0gMDtcbiAgICAgICAgICAgIGNsdXN0ZXJzQWNjdW0gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGVyUm93ID0gcGVyUm93U2l6ZXNbMF07XG4gICAgICBsZXQgcGVyUm93SWR4ID0gMDtcblxuICAgICAgZm9yIChjb25zdCBjbHVzdGVyTmFtZSBvZiBzb3J0ZWRDbHVzdGVyTmFtZXMpIHtcbiAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJNYXBbY2x1c3Rlck5hbWUgYXMgYW55XSE7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJDb25uZWN0aW9ucyA9IGNsdXN0ZXJDb25uZWN0aW9uTWFwLmdldChOdW1iZXIoY2x1c3Rlck5hbWUpKSE7XG4gICAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBnZXRXZWJDb2xhTGF5b3QoY2x1c3RlciwgY2x1c3RlckNvbm5lY3Rpb25zLCBzdWJDbHVzdGVyKTtcbiAgICAgICAgaWYgKGNsdXN0ZXJOdW0gPT09IHBlclJvdykge1xuICAgICAgICAgIGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICAgIHlPZmZzZXQgKz0gbGF5b3V0U2l6ZSAvIHBlclJvdztcbiAgICAgICAgICBwZXJSb3dJZHgrKztcbiAgICAgICAgICBwZXJSb3cgPSBNYXRoLm1pbihNYXRoLmNlaWwocGVyUm93U2l6ZXNbcGVyUm93SWR4XSksIDQ1KTtcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnN0IGNsdXN0ZXJzUGVyUm93ID0gTWF0aC5jZWlsKHBlclJvdyAvIDEuNSk7XG4gICAgICAgIGNvbnN0IG9mZnNldFggPSAoKGNsdXN0ZXJOdW0pICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIGxheW91dFNpemUgLyBwZXJSb3cgKiAoMSAvIDEuMiAvIDQpKTtcbiAgICAgICAgLy8gY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IoY2x1c3Rlck51bSAvIHBlclJvdykgKiAyO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iZWRkaW5ncy5lbWJlZFgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBlbWJlZFhbY2x1c3RlcltpXV0gPSBlbWJlZGRpbmdzLmVtYmVkWFtpXSAqIGxheW91dFNpemUgLyBwZXJSb3cgLyAxLjIgKyBvZmZzZXRYO1xuICAgICAgICAgIGVtYmVkWVtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRZW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyAvIDEuMiArIHlPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtlbWJlZFgsIGVtYmVkWX07XG4gICAgfVxufVxuXG5cbiJdfQ==","import { multiColWebGPUSparseMatrix } from '@datagrok-libraries/math/src/webGPU/sparse-matrix/webGPU-sparse-matrix';\nimport { SparseMatrixService } from '../distance-matrix/sparse-matrix-service';\nimport { MCLSparseReducer } from './markov-cluster';\nonmessage = async (event) => {\n const { data, threshold, weights, aggregationMethod, distanceFnArgs, distanceFns, maxIterations, useWebGPU, inflate } = event.data;\n console.time('sparse matrix');\n let sparse = null;\n if (useWebGPU) {\n try {\n sparse = await multiColWebGPUSparseMatrix(data, threshold / 100, distanceFns, aggregationMethod, weights, distanceFnArgs);\n }\n catch (e) {\n console.error(e);\n }\n }\n if (!sparse) { // falsback to CPU\n if (useWebGPU)\n console.error('WEBGPU sparse matrix calculation failed, falling back to CPU implementation');\n sparse = await new SparseMatrixService()\n .calcMultiColumn(data, distanceFns, threshold / 100, distanceFnArgs, weights, aggregationMethod);\n }\n const MAX_MCL_CONNECTIONS = 1000000;\n if (sparse.i.length > MAX_MCL_CONNECTIONS)\n sparse = SparseMatrixService.pruneSparseMatrix(sparse, MAX_MCL_CONNECTIONS);\n console.timeEnd('sparse matrix');\n //const res = await new MCLSparseReducer({maxIterations: maxIterations ?? 5}).transform(sparse, data[0].length);\n const reducer = new MCLSparseReducer({ maxIterations: maxIterations ?? 5, inflateFactor: inflate ?? 2 });\n console.time('MCL');\n let res = null;\n if (useWebGPU) {\n try {\n res = await reducer.transformWebGPU(sparse, data[0].length);\n }\n catch (e) {\n console.error('webGPU MCL failed, falling back to CPU implementation');\n console.error(e);\n }\n }\n if (!res)\n res = await reducer.transform(sparse, data[0].length);\n console.timeEnd('MCL');\n postMessage({ res });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDbEgsT0FBTyxFQUFxQixtQkFBbUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBR2pHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRWxELFNBQVMsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDMUIsTUFBTSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FNL0csS0FBSyxDQUFDLElBQUksQ0FBQztJQUVmLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDOUIsSUFBSSxNQUFNLEdBQThCLElBQUksQ0FBQztJQUM3QyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQ3ZDLElBQUksRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFLFdBQWtCLEVBQUUsaUJBQXdCLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtRQUMvQixJQUFJLFNBQVM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7UUFFL0YsTUFBTSxHQUFHLE1BQU0sSUFBSSxtQkFBbUIsRUFBRTthQUNyQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxPQUFTLENBQUM7SUFDdEMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxtQkFBbUI7UUFDdkMsTUFBTSxHQUFHLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFakMsZ0hBQWdIO0lBQ2hILE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUMsRUFBQyxhQUFhLEVBQUUsYUFBYSxJQUFJLENBQUMsRUFBRSxhQUFhLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDdkcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUM7SUFDcEIsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQztZQUNILEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztZQUN2RSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLEdBQUc7UUFDTixHQUFHLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV2QixXQUFXLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXh9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3NwYXJzZS1tYXRyaXgvd2ViR1BVLXNwYXJzZS1tYXRyaXgnO1xuaW1wb3J0IHtTcGFyc2VNYXRyaXhSZXN1bHQsIFNwYXJzZU1hdHJpeFNlcnZpY2V9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXNlcnZpY2UnO1xuaW1wb3J0IHtEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvdHlwZXMnO1xuaW1wb3J0IHtLbm93bk1ldHJpY3N9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtNQ0xTcGFyc2VSZWR1Y2VyfSBmcm9tICcuL21hcmtvdi1jbHVzdGVyJztcblxub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHtkYXRhLCB0aHJlc2hvbGQsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBkaXN0YW5jZUZuQXJncywgZGlzdGFuY2VGbnMsIG1heEl0ZXJhdGlvbnMsIHVzZVdlYkdQVSwgaW5mbGF0ZX06XG4gICB7XG4gICAgZGF0YTogYW55W11bXSwgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgd2VpZ2h0czogbnVtYmVyW10sIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLFxuICAgIGRpc3RhbmNlRm5zOiBLbm93bk1ldHJpY3NbXSwgZGlzdGFuY2VGbkFyZ3M6IGFueVtdLCBtYXhJdGVyYXRpb25zOiBudW1iZXIsXG4gICAgdXNlV2ViR1BVPzogYm9vbGVhbiwgaW5mbGF0ZT86IG51bWJlclxuICB9ID0gZXZlbnQuZGF0YTtcblxuICBjb25zb2xlLnRpbWUoJ3NwYXJzZSBtYXRyaXgnKTtcbiAgbGV0IHNwYXJzZTogU3BhcnNlTWF0cml4UmVzdWx0IHwgbnVsbCA9IG51bGw7XG4gIGlmICh1c2VXZWJHUFUpIHtcbiAgICB0cnkge1xuICAgICAgc3BhcnNlID0gYXdhaXQgbXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXgoXG4gICAgICAgIGRhdGEsIHRocmVzaG9sZCAvIDEwMCwgZGlzdGFuY2VGbnMgYXMgYW55LCBhZ2dyZWdhdGlvbk1ldGhvZCBhcyBhbnksIHdlaWdodHMsIGRpc3RhbmNlRm5BcmdzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuICBpZiAoIXNwYXJzZSkgeyAvLyBmYWxzYmFjayB0byBDUFVcbiAgICBpZiAodXNlV2ViR1BVKVxuICAgICAgY29uc29sZS5lcnJvcignV0VCR1BVIHNwYXJzZSBtYXRyaXggY2FsY3VsYXRpb24gZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gQ1BVIGltcGxlbWVudGF0aW9uJyk7XG5cbiAgICBzcGFyc2UgPSBhd2FpdCBuZXcgU3BhcnNlTWF0cml4U2VydmljZSgpXG4gICAgICAuY2FsY011bHRpQ29sdW1uKGRhdGEsIGRpc3RhbmNlRm5zLCB0aHJlc2hvbGQgLyAxMDAsIGRpc3RhbmNlRm5BcmdzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCk7XG4gIH1cbiAgY29uc3QgTUFYX01DTF9DT05ORUNUSU9OUyA9IDFfMDAwXzAwMDtcbiAgaWYgKHNwYXJzZS5pLmxlbmd0aCA+IE1BWF9NQ0xfQ09OTkVDVElPTlMpXG4gICAgc3BhcnNlID0gU3BhcnNlTWF0cml4U2VydmljZS5wcnVuZVNwYXJzZU1hdHJpeChzcGFyc2UsIE1BWF9NQ0xfQ09OTkVDVElPTlMpO1xuICBjb25zb2xlLnRpbWVFbmQoJ3NwYXJzZSBtYXRyaXgnKTtcblxuICAvL2NvbnN0IHJlcyA9IGF3YWl0IG5ldyBNQ0xTcGFyc2VSZWR1Y2VyKHttYXhJdGVyYXRpb25zOiBtYXhJdGVyYXRpb25zID8/IDV9KS50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgTUNMU3BhcnNlUmVkdWNlcih7bWF4SXRlcmF0aW9uczogbWF4SXRlcmF0aW9ucyA/PyA1LCBpbmZsYXRlRmFjdG9yOiBpbmZsYXRlID8/IDJ9KTtcbiAgY29uc29sZS50aW1lKCdNQ0wnKTtcbiAgbGV0IHJlczogYW55ID0gbnVsbDtcbiAgaWYgKHVzZVdlYkdQVSkge1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBhd2FpdCByZWR1Y2VyLnRyYW5zZm9ybVdlYkdQVShzcGFyc2UsIGRhdGFbMF0ubGVuZ3RoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd3ZWJHUFUgTUNMIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIENQVSBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyZXMpXG4gICAgcmVzID0gYXdhaXQgcmVkdWNlci50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gIGNvbnNvbGUudGltZUVuZCgnTUNMJyk7XG5cbiAgcG9zdE1lc3NhZ2Uoe3Jlc30pO1xufTtcbiJdfQ==","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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFLENBQUM7UUFDMUIsS0FBSywwQkFBMEIsQ0FBQyxTQUFTO1lBQ3ZDLE9BQU8sQ0FBQyxFQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckY7WUFDRSxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUU7Z0JBQ3RCLFlBQVk7Z0JBQ1osTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDO0lBQ04sQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGlzTmlsID0gKHg6IGFueSkgPT4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRTbWFsbGVyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPiBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPCB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExhcmdlcihkaXN0YW5jZXNBcjogbnVtYmVyW10sIGluZGV4ZXM6IG51bWJlcltdLCBudW06IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICBpZiAobnVtIDwgZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoLTFdKVxuICAgIHJldHVybjtcblxuICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtID4gdik7XG4gIGRpc3RhbmNlc0FyLnBvcCgpO1xuICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gIGluZGV4ZXMucG9wKCk7XG4gIGluZGV4ZXMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKFxuICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgd2VpZ2h0czogbnVtYmVyW11cbik6ICh2YWx1ZXM6IG51bWJlcltdKSA9PiBudW1iZXIge1xuICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uTWV0aG9kKSB7XG4gICAgY2FzZSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5NQU5IQVRUQU46XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyB2YWwgKiB3ZWlnaHRzW2lkeF0sIDApO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICAvLyBldWNsaWRlYW5cbiAgICAgICAgY29uc3Qgc3VtID0gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyAodmFsICogd2VpZ2h0c1tpZHhdKSAqKiAyLCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydChzdW0pO1xuICAgICAgfTtcbiAgfVxufVxuIl19","/**\n * Graphology ForceAtlas2 Layout Default Settings\n * ===============================================\n */\nmodule.exports = {\n linLogMode: false,\n outboundAttractionDistribution: false,\n adjustSizes: false,\n edgeWeightInfluence: 1,\n scalingRatio: 1,\n strongGravityMode: false,\n gravity: 1,\n slowDown: 1,\n barnesHutOptimize: false,\n barnesHutTheta: 0.5\n};\n","/**\n * Graphology ForceAtlas2 Helpers\n * ===============================\n *\n * Miscellaneous helper functions.\n */\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\n\n/**\n * Very simple Object.assign-like function.\n *\n * @param {object} target - First object.\n * @param {object} [...objects] - Objects to merge.\n * @return {object}\n */\nexports.assign = function (target) {\n target = target || {};\n\n var objects = Array.prototype.slice.call(arguments).slice(1),\n i,\n k,\n l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n if (!objects[i]) continue;\n\n for (k in objects[i]) target[k] = objects[i][k];\n }\n\n return target;\n};\n\n/**\n * Function used to validate the given settings.\n *\n * @param {object} settings - Settings to validate.\n * @return {object|null}\n */\nexports.validateSettings = function (settings) {\n if ('linLogMode' in settings && typeof settings.linLogMode !== 'boolean')\n return {message: 'the `linLogMode` setting should be a boolean.'};\n\n if (\n 'outboundAttractionDistribution' in settings &&\n typeof settings.outboundAttractionDistribution !== 'boolean'\n )\n return {\n message:\n 'the `outboundAttractionDistribution` setting should be a boolean.'\n };\n\n if ('adjustSizes' in settings && typeof settings.adjustSizes !== 'boolean')\n return {message: 'the `adjustSizes` setting should be a boolean.'};\n\n if (\n 'edgeWeightInfluence' in settings &&\n typeof settings.edgeWeightInfluence !== 'number'\n )\n return {\n message: 'the `edgeWeightInfluence` setting should be a number.'\n };\n\n if (\n 'scalingRatio' in settings &&\n !(typeof settings.scalingRatio === 'number' && settings.scalingRatio >= 0)\n )\n return {message: 'the `scalingRatio` setting should be a number >= 0.'};\n\n if (\n 'strongGravityMode' in settings &&\n typeof settings.strongGravityMode !== 'boolean'\n )\n return {message: 'the `strongGravityMode` setting should be a boolean.'};\n\n if (\n 'gravity' in settings &&\n !(typeof settings.gravity === 'number' && settings.gravity >= 0)\n )\n return {message: 'the `gravity` setting should be a number >= 0.'};\n\n if (\n 'slowDown' in settings &&\n !(typeof settings.slowDown === 'number' || settings.slowDown >= 0)\n )\n return {message: 'the `slowDown` setting should be a number >= 0.'};\n\n if (\n 'barnesHutOptimize' in settings &&\n typeof settings.barnesHutOptimize !== 'boolean'\n )\n return {message: 'the `barnesHutOptimize` setting should be a boolean.'};\n\n if (\n 'barnesHutTheta' in settings &&\n !(\n typeof settings.barnesHutTheta === 'number' &&\n settings.barnesHutTheta >= 0\n )\n )\n return {message: 'the `barnesHutTheta` setting should be a number >= 0.'};\n\n return null;\n};\n\n/**\n * Function generating a flat matrix for both nodes & edges of the given graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {function} getEdgeWeight - Edge weight getter function.\n * @return {object} - Both matrices.\n */\nexports.graphToByteArrays = function (graph, getEdgeWeight) {\n var order = graph.order;\n var size = graph.size;\n var index = {};\n var j;\n\n // NOTE: float32 could lead to issues if edge array needs to index large\n // number of nodes.\n var NodeMatrix = new Float32Array(order * PPN);\n var EdgeMatrix = new Float32Array(size * PPE);\n\n // Iterate through nodes\n j = 0;\n graph.forEachNode(function (node, attr) {\n // Node index\n index[node] = j;\n\n // Populating byte array\n NodeMatrix[j] = attr.x;\n NodeMatrix[j + 1] = attr.y;\n NodeMatrix[j + 2] = 0; // dx\n NodeMatrix[j + 3] = 0; // dy\n NodeMatrix[j + 4] = 0; // old_dx\n NodeMatrix[j + 5] = 0; // old_dy\n NodeMatrix[j + 6] = 1; // mass\n NodeMatrix[j + 7] = 1; // convergence\n NodeMatrix[j + 8] = attr.size || 1;\n NodeMatrix[j + 9] = attr.fixed ? 1 : 0;\n j += PPN;\n });\n\n // Iterate through edges\n j = 0;\n graph.forEachEdge(function (edge, attr, source, target, sa, ta, u) {\n var sj = index[source];\n var tj = index[target];\n\n var weight = getEdgeWeight(edge, attr, source, target, sa, ta, u);\n\n // Incrementing mass to be a node's weighted degree\n NodeMatrix[sj + 6] += weight;\n NodeMatrix[tj + 6] += weight;\n\n // Populating byte array\n EdgeMatrix[j] = sj;\n EdgeMatrix[j + 1] = tj;\n EdgeMatrix[j + 2] = weight;\n j += PPE;\n });\n\n return {\n nodes: NodeMatrix,\n edges: EdgeMatrix\n };\n};\n\n/**\n * Function applying the layout back to the graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A node reducer.\n */\nexports.assignLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var i = 0;\n\n graph.updateEachNodeAttributes(function (node, attr) {\n attr.x = NodeMatrix[i];\n attr.y = NodeMatrix[i + 1];\n\n i += PPN;\n\n return outputReducer ? outputReducer(node, attr) : attr;\n });\n};\n\n/**\n * Function reading the positions (only) from the graph, to write them in the matrix.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n */\nexports.readGraphPositions = function (graph, NodeMatrix) {\n var i = 0;\n\n graph.forEachNode(function (node, attr) {\n NodeMatrix[i] = attr.x;\n NodeMatrix[i + 1] = attr.y;\n\n i += PPN;\n });\n};\n\n/**\n * Function collecting the layout positions.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A nodes reducer.\n * @return {object} - Map to node positions.\n */\nexports.collectLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var nodes = graph.nodes(),\n positions = {};\n\n for (var i = 0, j = 0, l = NodeMatrix.length; i < l; i += PPN) {\n if (outputReducer) {\n var newAttr = Object.assign({}, graph.getNodeAttributes(nodes[j]));\n newAttr.x = NodeMatrix[i];\n newAttr.y = NodeMatrix[i + 1];\n newAttr = outputReducer(nodes[j], newAttr);\n positions[nodes[j]] = {\n x: newAttr.x,\n y: newAttr.y\n };\n } else {\n positions[nodes[j]] = {\n x: NodeMatrix[i],\n y: NodeMatrix[i + 1]\n };\n }\n\n j++;\n }\n\n return positions;\n};\n\n/**\n * Function returning a web worker from the given function.\n *\n * @param {function} fn - Function for the worker.\n * @return {DOMString}\n */\nexports.createWorker = function createWorker(fn) {\n var xURL = window.URL || window.webkitURL;\n var code = fn.toString();\n var objectUrl = xURL.createObjectURL(\n new Blob(['(' + code + ').call(this);'], {type: 'text/javascript'})\n );\n var worker = new Worker(objectUrl);\n xURL.revokeObjectURL(objectUrl);\n\n return worker;\n};\n","/**\n * Graphology ForceAtlas2 Layout\n * ==============================\n *\n * Library endpoint.\n */\nvar isGraph = require('graphology-utils/is-graph');\nvar createEdgeWeightGetter =\n require('graphology-utils/getters').createEdgeWeightGetter;\nvar iterate = require('./iterate.js');\nvar helpers = require('./helpers.js');\n\nvar DEFAULT_SETTINGS = require('./defaults.js');\n\n/**\n * Asbtract function used to run a certain number of iterations.\n *\n * @param {boolean} assign - Whether to assign positions.\n * @param {Graph} graph - Target graph.\n * @param {object|number} params - If number, params.iterations, else:\n * @param {function} getWeight - Edge weight getter function.\n * @param {number} iterations - Number of iterations.\n * @param {function|null} outputReducer - A node reducer\n * @param {object} [settings] - Settings.\n * @return {object|undefined}\n */\nfunction abstractSynchronousLayout(assign, graph, params) {\n if (!isGraph(graph))\n throw new Error(\n 'graphology-layout-forceatlas2: the given graph is not a valid graphology instance.'\n );\n\n if (typeof params === 'number') params = {iterations: params};\n\n var iterations = params.iterations;\n\n if (typeof iterations !== 'number')\n throw new Error(\n 'graphology-layout-forceatlas2: invalid number of iterations.'\n );\n\n if (iterations <= 0)\n throw new Error(\n 'graphology-layout-forceatlas2: you should provide a positive number of iterations.'\n );\n\n var getEdgeWeight = createEdgeWeightGetter(\n 'getEdgeWeight' in params ? params.getEdgeWeight : 'weight'\n ).fromEntry;\n\n var outputReducer =\n typeof params.outputReducer === 'function' ? params.outputReducer : null;\n\n // Validating settings\n var settings = helpers.assign({}, DEFAULT_SETTINGS, params.settings);\n var validationError = helpers.validateSettings(settings);\n\n if (validationError)\n throw new Error(\n 'graphology-layout-forceatlas2: ' + validationError.message\n );\n\n // Building matrices\n var matrices = helpers.graphToByteArrays(graph, getEdgeWeight);\n\n var i;\n\n // Iterating\n for (i = 0; i < iterations; i++)\n iterate(settings, matrices.nodes, matrices.edges);\n\n // Applying\n if (assign) {\n helpers.assignLayoutChanges(graph, matrices.nodes, outputReducer);\n return;\n }\n\n return helpers.collectLayoutChanges(graph, matrices.nodes);\n}\n\n/**\n * Function returning sane layout settings for the given graph.\n *\n * @param {Graph|number} graph - Target graph or graph order.\n * @return {object}\n */\nfunction inferSettings(graph) {\n var order = typeof graph === 'number' ? graph : graph.order;\n\n return {\n barnesHutOptimize: order > 2000,\n strongGravityMode: true,\n gravity: 0.05,\n scalingRatio: 10,\n slowDown: 1 + Math.log(order)\n };\n}\n\n/**\n * Exporting.\n */\nvar synchronousLayout = abstractSynchronousLayout.bind(null, false);\nsynchronousLayout.assign = abstractSynchronousLayout.bind(null, true);\nsynchronousLayout.inferSettings = inferSettings;\n\nmodule.exports = synchronousLayout;\n","/* eslint no-constant-condition: 0 */\n/**\n * Graphology ForceAtlas2 Iteration\n * =================================\n *\n * Function used to perform a single iteration of the algorithm.\n */\n\n/**\n * Matrices properties accessors.\n */\nvar NODE_X = 0;\nvar NODE_Y = 1;\nvar NODE_DX = 2;\nvar NODE_DY = 3;\nvar NODE_OLD_DX = 4;\nvar NODE_OLD_DY = 5;\nvar NODE_MASS = 6;\nvar NODE_CONVERGENCE = 7;\nvar NODE_SIZE = 8;\nvar NODE_FIXED = 9;\n\nvar EDGE_SOURCE = 0;\nvar EDGE_TARGET = 1;\nvar EDGE_WEIGHT = 2;\n\nvar REGION_NODE = 0;\nvar REGION_CENTER_X = 1;\nvar REGION_CENTER_Y = 2;\nvar REGION_SIZE = 3;\nvar REGION_NEXT_SIBLING = 4;\nvar REGION_FIRST_CHILD = 5;\nvar REGION_MASS = 6;\nvar REGION_MASS_CENTER_X = 7;\nvar REGION_MASS_CENTER_Y = 8;\n\nvar SUBDIVISION_ATTEMPTS = 3;\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\nvar PPR = 9;\n\nvar MAX_FORCE = 10;\n\n/**\n * Function used to perform a single interation of the algorithm.\n *\n * @param {object} options - Layout options.\n * @param {Float32Array} NodeMatrix - Node data.\n * @param {Float32Array} EdgeMatrix - Edge data.\n * @return {object} - Some metadata.\n */\nmodule.exports = function iterate(options, NodeMatrix, EdgeMatrix) {\n // Initializing variables\n var l, r, n, n1, n2, rn, e, w, g, s;\n\n var order = NodeMatrix.length,\n size = EdgeMatrix.length;\n\n var adjustSizes = options.adjustSizes;\n\n var thetaSquared = options.barnesHutTheta * options.barnesHutTheta;\n\n var outboundAttCompensation, coefficient, xDist, yDist, ewc, distance, factor;\n\n var RegionMatrix = [];\n\n // 1) Initializing layout data\n //-----------------------------\n\n // Resetting positions & computing max values\n for (n = 0; n < order; n += PPN) {\n NodeMatrix[n + NODE_OLD_DX] = NodeMatrix[n + NODE_DX];\n NodeMatrix[n + NODE_OLD_DY] = NodeMatrix[n + NODE_DY];\n NodeMatrix[n + NODE_DX] = 0;\n NodeMatrix[n + NODE_DY] = 0;\n }\n\n // If outbound attraction distribution, compensate\n if (options.outboundAttractionDistribution) {\n outboundAttCompensation = 0;\n for (n = 0; n < order; n += PPN) {\n outboundAttCompensation += NodeMatrix[n + NODE_MASS];\n }\n\n outboundAttCompensation /= order / PPN;\n }\n\n // 1.bis) Barnes-Hut computation\n //------------------------------\n\n if (options.barnesHutOptimize) {\n // Setting up\n var minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity,\n q,\n q2,\n subdivisionAttempts;\n\n // Computing min and max values\n for (n = 0; n < order; n += PPN) {\n minX = Math.min(minX, NodeMatrix[n + NODE_X]);\n maxX = Math.max(maxX, NodeMatrix[n + NODE_X]);\n minY = Math.min(minY, NodeMatrix[n + NODE_Y]);\n maxY = Math.max(maxY, NodeMatrix[n + NODE_Y]);\n }\n\n // squarify bounds, it's a quadtree\n var dx = maxX - minX,\n dy = maxY - minY;\n if (dx > dy) {\n minY -= (dx - dy) / 2;\n maxY = minY + dx;\n } else {\n minX -= (dy - dx) / 2;\n maxX = minX + dy;\n }\n\n // Build the Barnes Hut root region\n RegionMatrix[0 + REGION_NODE] = -1;\n RegionMatrix[0 + REGION_CENTER_X] = (minX + maxX) / 2;\n RegionMatrix[0 + REGION_CENTER_Y] = (minY + maxY) / 2;\n RegionMatrix[0 + REGION_SIZE] = Math.max(maxX - minX, maxY - minY);\n RegionMatrix[0 + REGION_NEXT_SIBLING] = -1;\n RegionMatrix[0 + REGION_FIRST_CHILD] = -1;\n RegionMatrix[0 + REGION_MASS] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_Y] = 0;\n\n // Add each node in the tree\n l = 1;\n for (n = 0; n < order; n += PPN) {\n // Current region, starting with root\n r = 0;\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n\n while (true) {\n // Are there sub-regions?\n\n // We look at first child index\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // There are sub-regions\n\n // We just iterate to find a \"leaf\" of the tree\n // that is an empty region or a region with a single node\n // (see next case)\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // Update center of mass and mass (we only do it for non-leave regions)\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n (RegionMatrix[r + REGION_MASS_CENTER_X] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_X] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n (RegionMatrix[r + REGION_MASS_CENTER_Y] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_Y] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS] += NodeMatrix[n + NODE_MASS];\n\n // Iterate on the right quadrant\n r = q;\n continue;\n } else {\n // There are no sub-regions: we are in a \"leaf\"\n\n // Is there a node in this leave?\n if (RegionMatrix[r + REGION_NODE] < 0) {\n // There is no node in region:\n // we record node n and go on\n RegionMatrix[r + REGION_NODE] = n;\n break;\n } else {\n // There is a node in this region\n\n // We will need to create sub-regions, stick the two\n // nodes (the old one r[0] and the new one n) in two\n // subregions. If they fall in the same quadrant,\n // we will iterate.\n\n // Create sub-regions\n RegionMatrix[r + REGION_FIRST_CHILD] = l * PPR;\n w = RegionMatrix[r + REGION_SIZE] / 2; // new size (half)\n\n // NOTE: we use screen coordinates\n // from Top Left to Bottom Right\n\n // Top Left sub-region\n g = RegionMatrix[r + REGION_FIRST_CHILD];\n\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Left sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Top Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] =\n RegionMatrix[r + REGION_NEXT_SIBLING];\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n l += 4;\n\n // Now the goal is to find two different sub-regions\n // for the two nodes: the one previously recorded (r[0])\n // and the one we want to add (n)\n\n // Find the quadrant of the old node\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X] <\n RegionMatrix[r + REGION_CENTER_X]\n ) {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // We remove r[0] from the region r, add its mass to r and record it in q\n RegionMatrix[r + REGION_MASS] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_MASS];\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X];\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y];\n\n RegionMatrix[q + REGION_NODE] = RegionMatrix[r + REGION_NODE];\n RegionMatrix[r + REGION_NODE] = -1;\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n if (q === q2) {\n // If both nodes are in the same quadrant,\n // we have to try it again on this quadrant\n if (subdivisionAttempts--) {\n r = q;\n continue; // while\n } else {\n // we are out of precision here, and we cannot subdivide anymore\n // but we have to break the loop anyway\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n break; // while\n }\n }\n\n // If both quadrants are different, we record n\n // in its quadrant\n RegionMatrix[q2 + REGION_NODE] = n;\n break;\n }\n }\n }\n }\n }\n\n // 2) Repulsion\n //--------------\n // NOTES: adjustSizes = antiCollision & scalingRatio = coefficient\n\n if (options.barnesHutOptimize) {\n coefficient = options.scalingRatio;\n\n // Applying repulsion through regions\n for (n = 0; n < order; n += PPN) {\n // Computing leaf quad nodes iteration\n\n r = 0; // Starting with root region\n while (true) {\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // The region has sub-regions\n\n // We run the Barnes Hut test to see if we are at the right distance\n distance =\n Math.pow(\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X],\n 2\n ) +\n Math.pow(\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y],\n 2\n );\n\n s = RegionMatrix[r + REGION_SIZE];\n\n if ((4 * s * s) / distance < thetaSquared) {\n // We treat the region as a single body, and we repulse\n\n xDist =\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X];\n yDist =\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y];\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n } else {\n // The region is too close and we have to look at sub-regions\n r = RegionMatrix[r + REGION_FIRST_CHILD];\n continue;\n }\n } else {\n // The region has no sub-region\n // If there is a node r[0] and it is not n, then repulse\n rn = RegionMatrix[r + REGION_NODE];\n\n if (rn >= 0 && rn !== n) {\n xDist = NodeMatrix[n + NODE_X] - NodeMatrix[rn + NODE_X];\n yDist = NodeMatrix[n + NODE_Y] - NodeMatrix[rn + NODE_Y];\n\n distance = xDist * xDist + yDist * yDist;\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n }\n }\n }\n } else {\n coefficient = options.scalingRatio;\n\n // Square iteration\n for (n1 = 0; n1 < order; n1 += PPN) {\n for (n2 = 0; n2 < n1; n2 += PPN) {\n // Common to both methods\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n if (adjustSizes === true) {\n //-- Anticollision Linear Repulsion\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n } else if (distance < 0) {\n factor =\n 100 *\n coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS];\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n distance = Math.sqrt(xDist * xDist + yDist * yDist);\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n }\n }\n }\n\n // 3) Gravity\n //------------\n g = options.gravity / options.scalingRatio;\n coefficient = options.scalingRatio;\n for (n = 0; n < order; n += PPN) {\n factor = 0;\n\n // Common to both methods\n xDist = NodeMatrix[n + NODE_X];\n yDist = NodeMatrix[n + NODE_Y];\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.strongGravityMode) {\n //-- Strong gravity\n if (distance > 0) factor = coefficient * NodeMatrix[n + NODE_MASS] * g;\n } else {\n //-- Linear Anti-collision Repulsion n\n if (distance > 0)\n factor = (coefficient * NodeMatrix[n + NODE_MASS] * g) / distance;\n }\n\n // Updating node's dx and dy\n NodeMatrix[n + NODE_DX] -= xDist * factor;\n NodeMatrix[n + NODE_DY] -= yDist * factor;\n }\n\n // 4) Attraction\n //---------------\n coefficient =\n 1 * (options.outboundAttractionDistribution ? outboundAttCompensation : 1);\n\n // TODO: simplify distance\n // TODO: coefficient is always used as -c --> optimize?\n for (e = 0; e < size; e += PPE) {\n n1 = EdgeMatrix[e + EDGE_SOURCE];\n n2 = EdgeMatrix[e + EDGE_TARGET];\n w = EdgeMatrix[e + EDGE_WEIGHT];\n\n // Edge weight influence\n ewc = Math.pow(w, options.edgeWeightInfluence);\n\n // Common measures\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n // Applying attraction to nodes\n if (adjustSizes === true) {\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- Linear Anti-collision Attraction\n if (distance > 0) {\n factor = -coefficient * ewc;\n }\n }\n }\n } else {\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Attraction\n if (distance > 0)\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Attraction Mass Distributed\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n } else {\n //-- Linear Attraction\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = -coefficient * ewc;\n }\n }\n }\n\n // Updating nodes' dx and dy\n // TODO: if condition or factor = 1?\n if (distance > 0) {\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n\n // 5) Apply Forces\n //-----------------\n var force, swinging, traction, nodespeed, newX, newY;\n\n // MATH: sqrt and square distances\n if (adjustSizes === true) {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n force = Math.sqrt(\n Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2)\n );\n\n if (force > MAX_FORCE) {\n NodeMatrix[n + NODE_DX] =\n (NodeMatrix[n + NODE_DX] * MAX_FORCE) / force;\n NodeMatrix[n + NODE_DY] =\n (NodeMatrix[n + NODE_DY] * MAX_FORCE) / force;\n }\n\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed = (0.1 * Math.log(1 + traction)) / (1 + Math.sqrt(swinging));\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n } else {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed =\n (NodeMatrix[n + NODE_CONVERGENCE] * Math.log(1 + traction)) /\n (1 + Math.sqrt(swinging));\n\n // Updating node convergence\n NodeMatrix[n + NODE_CONVERGENCE] = Math.min(\n 1,\n Math.sqrt(\n (nodespeed *\n (Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2))) /\n (1 + Math.sqrt(swinging))\n )\n );\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n }\n\n // We return the information about the layout (no need to return the matrices)\n return {};\n};\n","/**\n * Graphology Weight Getter\n * =========================\n *\n * Function creating weight getters.\n */\nfunction coerceWeight(value) {\n // Ensuring target value is a correct number\n if (typeof value !== 'number' || isNaN(value)) return 1;\n\n return value;\n}\n\nfunction createNodeValueGetter(nameOrFunction, defaultValue) {\n var getter = {};\n\n var coerceToDefault = function (v) {\n if (typeof v === 'undefined') return defaultValue;\n\n return v;\n };\n\n if (typeof defaultValue === 'function') coerceToDefault = defaultValue;\n\n var get = function (attributes) {\n return coerceToDefault(attributes[nameOrFunction]);\n };\n\n var returnDefault = function () {\n return coerceToDefault(undefined);\n };\n\n if (typeof nameOrFunction === 'string') {\n getter.fromAttributes = get;\n getter.fromGraph = function (graph, node) {\n return get(graph.getNodeAttributes(node));\n };\n getter.fromEntry = function (node, attributes) {\n return get(attributes);\n };\n } else if (typeof nameOrFunction === 'function') {\n getter.fromAttributes = function () {\n throw new Error(\n 'graphology-utils/getters/createNodeValueGetter: irrelevant usage.'\n );\n };\n getter.fromGraph = function (graph, node) {\n return coerceToDefault(\n nameOrFunction(node, graph.getNodeAttributes(node))\n );\n };\n getter.fromEntry = function (node, attributes) {\n return coerceToDefault(nameOrFunction(node, attributes));\n };\n } else {\n getter.fromAttributes = returnDefault;\n getter.fromGraph = returnDefault;\n getter.fromEntry = returnDefault;\n }\n\n return getter;\n}\n\nfunction createEdgeValueGetter(nameOrFunction, defaultValue) {\n var getter = {};\n\n var coerceToDefault = function (v) {\n if (typeof v === 'undefined') return defaultValue;\n\n return v;\n };\n\n if (typeof defaultValue === 'function') coerceToDefault = defaultValue;\n\n var get = function (attributes) {\n return coerceToDefault(attributes[nameOrFunction]);\n };\n\n var returnDefault = function () {\n return coerceToDefault(undefined);\n };\n\n if (typeof nameOrFunction === 'string') {\n getter.fromAttributes = get;\n getter.fromGraph = function (graph, edge) {\n return get(graph.getEdgeAttributes(edge));\n };\n getter.fromEntry = function (edge, attributes) {\n return get(attributes);\n };\n getter.fromPartialEntry = getter.fromEntry;\n getter.fromMinimalEntry = getter.fromEntry;\n } else if (typeof nameOrFunction === 'function') {\n getter.fromAttributes = function () {\n throw new Error(\n 'graphology-utils/getters/createEdgeValueGetter: irrelevant usage.'\n );\n };\n getter.fromGraph = function (graph, edge) {\n // TODO: we can do better, check #310\n var extremities = graph.extremities(edge);\n return coerceToDefault(\n nameOrFunction(\n edge,\n graph.getEdgeAttributes(edge),\n extremities[0],\n extremities[1],\n graph.getNodeAttributes(extremities[0]),\n graph.getNodeAttributes(extremities[1]),\n graph.isUndirected(edge)\n )\n );\n };\n getter.fromEntry = function (e, a, s, t, sa, ta, u) {\n return coerceToDefault(nameOrFunction(e, a, s, t, sa, ta, u));\n };\n getter.fromPartialEntry = function (e, a, s, t) {\n return coerceToDefault(nameOrFunction(e, a, s, t));\n };\n getter.fromMinimalEntry = function (e, a) {\n return coerceToDefault(nameOrFunction(e, a));\n };\n } else {\n getter.fromAttributes = returnDefault;\n getter.fromGraph = returnDefault;\n getter.fromEntry = returnDefault;\n getter.fromMinimalEntry = returnDefault;\n }\n\n return getter;\n}\n\nexports.createNodeValueGetter = createNodeValueGetter;\nexports.createEdgeValueGetter = createEdgeValueGetter;\nexports.createEdgeWeightGetter = function (name) {\n return createEdgeValueGetter(name, coerceWeight);\n};\n","/**\n * Graphology isGraph\n * ===================\n *\n * Very simple function aiming at ensuring the given variable is a\n * graphology instance.\n */\n\n/**\n * Checking the value is a graphology instance.\n *\n * @param {any} value - Target value.\n * @return {boolean}\n */\nmodule.exports = function isGraph(value) {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof value.addUndirectedEdgeWithKey === 'function' &&\n typeof value.dropNode === 'function' &&\n typeof value.multi === 'boolean'\n );\n};\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).graphology=e()}(this,(function(){\"use strict\";function t(e){return t=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},t(e)}function e(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e)}function n(t){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},n(t)}function r(t,e){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},r(t,e)}function i(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function o(t,e,n){return o=i()?Reflect.construct.bind():function(t,e,n){var i=[null];i.push.apply(i,e);var o=new(Function.bind.apply(t,i));return n&&r(o,n.prototype),o},o.apply(null,arguments)}function a(t){var e=\"function\"==typeof Map?new Map:void 0;return a=function(t){if(null===t||(i=t,-1===Function.toString.call(i).indexOf(\"[native code]\")))return t;var i;if(\"function\"!=typeof t)throw new TypeError(\"Super expression must either be null or a function\");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,a)}function a(){return o(t,arguments,n(this).constructor)}return a.prototype=Object.create(t.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),r(a,t)},a(t)}function c(t){if(void 0===t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return t}var u=function(){for(var t=arguments[0],e=1,n=arguments.length;e<n;e++)if(arguments[e])for(var r in arguments[e])t[r]=arguments[e][r];return t};function d(t,e,n,r){var i=t._nodes.get(e),o=null;return i?o=\"mixed\"===r?i.out&&i.out[n]||i.undirected&&i.undirected[n]:\"directed\"===r?i.out&&i.out[n]:i.undirected&&i.undirected[n]:o}function s(e){return\"object\"===t(e)&&null!==e}function h(t){var e;for(e in t)return!1;return!0}function p(t,e,n){Object.defineProperty(t,e,{enumerable:!1,configurable:!1,writable:!0,value:n})}function f(t,e,n){var r={enumerable:!0,configurable:!0};\"function\"==typeof n?r.get=n:(r.value=n,r.writable=!1),Object.defineProperty(t,e,r)}function l(t){return!!s(t)&&!(t.attributes&&!Array.isArray(t.attributes))}\"function\"==typeof Object.assign&&(u=Object.assign);var g,y={exports:{}},w=\"object\"==typeof Reflect?Reflect:null,v=w&&\"function\"==typeof w.apply?w.apply:function(t,e,n){return Function.prototype.apply.call(t,e,n)};g=w&&\"function\"==typeof w.ownKeys?w.ownKeys:Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.getOwnPropertyNames(t)};var b=Number.isNaN||function(t){return t!=t};function m(){m.init.call(this)}y.exports=m,y.exports.once=function(t,e){return new Promise((function(n,r){function i(n){t.removeListener(e,o),r(n)}function o(){\"function\"==typeof t.removeListener&&t.removeListener(\"error\",i),n([].slice.call(arguments))}U(t,e,o,{once:!0}),\"error\"!==e&&function(t,e,n){\"function\"==typeof t.on&&U(t,\"error\",e,n)}(t,i,{once:!0})}))},m.EventEmitter=m,m.prototype._events=void 0,m.prototype._eventsCount=0,m.prototype._maxListeners=void 0;var k=10;function _(t){if(\"function\"!=typeof t)throw new TypeError('The \"listener\" argument must be of type Function. Received type '+typeof t)}function G(t){return void 0===t._maxListeners?m.defaultMaxListeners:t._maxListeners}function x(t,e,n,r){var i,o,a,c;if(_(n),void 0===(o=t._events)?(o=t._events=Object.create(null),t._eventsCount=0):(void 0!==o.newListener&&(t.emit(\"newListener\",e,n.listener?n.listener:n),o=t._events),a=o[e]),void 0===a)a=o[e]=n,++t._eventsCount;else if(\"function\"==typeof a?a=o[e]=r?[n,a]:[a,n]:r?a.unshift(n):a.push(n),(i=G(t))>0&&a.length>i&&!a.warned){a.warned=!0;var u=new Error(\"Possible EventEmitter memory leak detected. \"+a.length+\" \"+String(e)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");u.name=\"MaxListenersExceededWarning\",u.emitter=t,u.type=e,u.count=a.length,c=u,console&&console.warn&&console.warn(c)}return t}function E(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function A(t,e,n){var r={fired:!1,wrapFn:void 0,target:t,type:e,listener:n},i=E.bind(r);return i.listener=n,r.wrapFn=i,i}function L(t,e,n){var r=t._events;if(void 0===r)return[];var i=r[e];return void 0===i?[]:\"function\"==typeof i?n?[i.listener||i]:[i]:n?function(t){for(var e=new Array(t.length),n=0;n<e.length;++n)e[n]=t[n].listener||t[n];return e}(i):D(i,i.length)}function S(t){var e=this._events;if(void 0!==e){var n=e[t];if(\"function\"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function D(t,e){for(var n=new Array(e),r=0;r<e;++r)n[r]=t[r];return n}function U(t,e,n,r){if(\"function\"==typeof t.on)r.once?t.once(e,n):t.on(e,n);else{if(\"function\"!=typeof t.addEventListener)throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type '+typeof t);t.addEventListener(e,(function i(o){r.once&&t.removeEventListener(e,i),n(o)}))}}function N(t){if(\"function\"!=typeof t)throw new Error(\"obliterator/iterator: expecting a function!\");this.next=t}Object.defineProperty(m,\"defaultMaxListeners\",{enumerable:!0,get:function(){return k},set:function(t){if(\"number\"!=typeof t||t<0||b(t))throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received '+t+\".\");k=t}}),m.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},m.prototype.setMaxListeners=function(t){if(\"number\"!=typeof t||t<0||b(t))throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received '+t+\".\");return this._maxListeners=t,this},m.prototype.getMaxListeners=function(){return G(this)},m.prototype.emit=function(t){for(var e=[],n=1;n<arguments.length;n++)e.push(arguments[n]);var r=\"error\"===t,i=this._events;if(void 0!==i)r=r&&void 0===i.error;else if(!r)return!1;if(r){var o;if(e.length>0&&(o=e[0]),o instanceof Error)throw o;var a=new Error(\"Unhandled error.\"+(o?\" (\"+o.message+\")\":\"\"));throw a.context=o,a}var c=i[t];if(void 0===c)return!1;if(\"function\"==typeof c)v(c,this,e);else{var u=c.length,d=D(c,u);for(n=0;n<u;++n)v(d[n],this,e)}return!0},m.prototype.addListener=function(t,e){return x(this,t,e,!1)},m.prototype.on=m.prototype.addListener,m.prototype.prependListener=function(t,e){return x(this,t,e,!0)},m.prototype.once=function(t,e){return _(e),this.on(t,A(this,t,e)),this},m.prototype.prependOnceListener=function(t,e){return _(e),this.prependListener(t,A(this,t,e)),this},m.prototype.removeListener=function(t,e){var n,r,i,o,a;if(_(e),void 0===(r=this._events))return this;if(void 0===(n=r[t]))return this;if(n===e||n.listener===e)0==--this._eventsCount?this._events=Object.create(null):(delete r[t],r.removeListener&&this.emit(\"removeListener\",t,n.listener||e));else if(\"function\"!=typeof n){for(i=-1,o=n.length-1;o>=0;o--)if(n[o]===e||n[o].listener===e){a=n[o].listener,i=o;break}if(i<0)return this;0===i?n.shift():function(t,e){for(;e+1<t.length;e++)t[e]=t[e+1];t.pop()}(n,i),1===n.length&&(r[t]=n[0]),void 0!==r.removeListener&&this.emit(\"removeListener\",t,a||e)}return this},m.prototype.off=m.prototype.removeListener,m.prototype.removeAllListeners=function(t){var e,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[t]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[t]),this;if(0===arguments.length){var i,o=Object.keys(n);for(r=0;r<o.length;++r)\"removeListener\"!==(i=o[r])&&this.removeAllListeners(i);return this.removeAllListeners(\"removeListener\"),this._events=Object.create(null),this._eventsCount=0,this}if(\"function\"==typeof(e=n[t]))this.removeListener(t,e);else if(void 0!==e)for(r=e.length-1;r>=0;r--)this.removeListener(t,e[r]);return this},m.prototype.listeners=function(t){return L(this,t,!0)},m.prototype.rawListeners=function(t){return L(this,t,!1)},m.listenerCount=function(t,e){return\"function\"==typeof t.listenerCount?t.listenerCount(e):S.call(t,e)},m.prototype.listenerCount=S,m.prototype.eventNames=function(){return this._eventsCount>0?g(this._events):[]},\"undefined\"!=typeof Symbol&&(N.prototype[Symbol.iterator]=function(){return this}),N.of=function(){var t=arguments,e=t.length,n=0;return new N((function(){return n>=e?{done:!0}:{done:!1,value:t[n++]}}))},N.empty=function(){return new N((function(){return{done:!0}}))},N.fromSequence=function(t){var e=0,n=t.length;return new N((function(){return e>=n?{done:!0}:{done:!1,value:t[e++]}}))},N.is=function(t){return t instanceof N||\"object\"==typeof t&&null!==t&&\"function\"==typeof t.next};var O=N,j={};j.ARRAY_BUFFER_SUPPORT=\"undefined\"!=typeof ArrayBuffer,j.SYMBOL_SUPPORT=\"undefined\"!=typeof Symbol;var C=O,M=j,z=M.ARRAY_BUFFER_SUPPORT,W=M.SYMBOL_SUPPORT;var P=function(t){var e=function(t){return\"string\"==typeof t||Array.isArray(t)||z&&ArrayBuffer.isView(t)?C.fromSequence(t):\"object\"!=typeof t||null===t?null:W&&\"function\"==typeof t[Symbol.iterator]?t[Symbol.iterator]():\"function\"==typeof t.next?t:null}(t);if(!e)throw new Error(\"obliterator: target is not iterable nor a valid iterator.\");return e},R=P,K=function(t,e){for(var n,r=arguments.length>1?e:1/0,i=r!==1/0?new Array(r):[],o=0,a=R(t);;){if(o===r)return i;if((n=a.next()).done)return o!==e&&(i.length=o),i;i[o++]=n.value}},T=function(t){function n(e){var n;return(n=t.call(this)||this).name=\"GraphError\",n.message=e,n}return e(n,t),n}(a(Error)),B=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"InvalidArgumentsGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T),F=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"NotFoundGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T),I=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"UsageGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T);function Y(t,e){this.key=t,this.attributes=e,this.clear()}function q(t,e){this.key=t,this.attributes=e,this.clear()}function J(t,e){this.key=t,this.attributes=e,this.clear()}function V(t,e,n,r,i){this.key=e,this.attributes=i,this.undirected=t,this.source=n,this.target=r}Y.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}},q.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}},J.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}},V.prototype.attach=function(){var t=\"out\",e=\"in\";this.undirected&&(t=e=\"undirected\");var n=this.source.key,r=this.target.key;this.source[t][r]=this,this.undirected&&n===r||(this.target[e][n]=this)},V.prototype.attachMulti=function(){var t=\"out\",e=\"in\",n=this.source.key,r=this.target.key;this.undirected&&(t=e=\"undirected\");var i=this.source[t],o=i[r];if(void 0===o)return i[r]=this,void(this.undirected&&n===r||(this.target[e][n]=this));o.previous=this,this.next=o,i[r]=this,this.target[e][n]=this},V.prototype.detach=function(){var t=this.source.key,e=this.target.key,n=\"out\",r=\"in\";this.undirected&&(n=r=\"undirected\"),delete this.source[n][e],delete this.target[r][t]},V.prototype.detachMulti=function(){var t=this.source.key,e=this.target.key,n=\"out\",r=\"in\";this.undirected&&(n=r=\"undirected\"),void 0===this.previous?void 0===this.next?(delete this.source[n][e],delete this.target[r][t]):(this.next.previous=void 0,this.source[n][e]=this.next,this.target[r][t]=this.next):(this.previous.next=this.next,void 0!==this.next&&(this.next.previous=this.previous))};function H(t,e,n,r,i,o,a){var c,u,d,s;if(r=\"\"+r,0===n){if(!(c=t._nodes.get(r)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(r,'\" node in the graph.'));d=i,s=o}else if(3===n){if(i=\"\"+i,!(u=t._edges.get(i)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(i,'\" edge in the graph.'));var h=u.source.key,p=u.target.key;if(r===h)c=u.target;else{if(r!==p)throw new F(\"Graph.\".concat(e,': the \"').concat(r,'\" node is not attached to the \"').concat(i,'\" edge (').concat(h,\", \").concat(p,\").\"));c=u.source}d=o,s=a}else{if(!(u=t._edges.get(r)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(r,'\" edge in the graph.'));c=1===n?u.source:u.target,d=i,s=o}return[c,d,s]}var Q=[{name:function(t){return\"get\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return a.attributes[c]}}},{name:function(t){return\"get\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){return H(this,e,n,t,r)[0].attributes}}},{name:function(t){return\"has\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return a.attributes.hasOwnProperty(c)}}},{name:function(t){return\"set\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i,o){var a=H(this,e,n,t,r,i,o),c=a[0],u=a[1],d=a[2];return c.attributes[u]=d,this.emit(\"nodeAttributesUpdated\",{key:c.key,type:\"set\",attributes:c.attributes,name:u}),this}}},{name:function(t){return\"update\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i,o){var a=H(this,e,n,t,r,i,o),c=a[0],u=a[1],d=a[2];if(\"function\"!=typeof d)throw new B(\"Graph.\".concat(e,\": updater should be a function.\"));var s=c.attributes,h=d(s[u]);return s[u]=h,this.emit(\"nodeAttributesUpdated\",{key:c.key,type:\"set\",attributes:c.attributes,name:u}),this}}},{name:function(t){return\"remove\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return delete a.attributes[c],this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"remove\",attributes:a.attributes,name:c}),this}}},{name:function(t){return\"replace\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(!s(c))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return a.attributes=c,this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"replace\",attributes:a.attributes}),this}}},{name:function(t){return\"merge\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(!s(c))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return u(a.attributes,c),this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"merge\",attributes:a.attributes,data:c}),this}}},{name:function(t){return\"update\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(\"function\"!=typeof c)throw new B(\"Graph.\".concat(e,\": provided updater is not a function.\"));return a.attributes=c(a.attributes),this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"update\",attributes:a.attributes}),this}}}];var X=[{name:function(t){return\"get\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return i.attributes[r]}}},{name:function(t){return\"get\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t){var r;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>1){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var i=\"\"+t,o=\"\"+arguments[1];if(!(r=d(this,i,o,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(i,'\" - \"').concat(o,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(r=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return r.attributes}}},{name:function(t){return\"has\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return i.attributes.hasOwnProperty(r)}}},{name:function(t){return\"set\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>3){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var a=\"\"+t,c=\"\"+r;if(r=arguments[2],i=arguments[3],!(o=d(this,a,c,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(a,'\" - \"').concat(c,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(o=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return o.attributes[r]=i,this.emit(\"edgeAttributesUpdated\",{key:o.key,type:\"set\",attributes:o.attributes,name:r}),this}}},{name:function(t){return\"update\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>3){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var a=\"\"+t,c=\"\"+r;if(r=arguments[2],i=arguments[3],!(o=d(this,a,c,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(a,'\" - \"').concat(c,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(o=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(\"function\"!=typeof i)throw new B(\"Graph.\".concat(e,\": updater should be a function.\"));return o.attributes[r]=i(o.attributes[r]),this.emit(\"edgeAttributesUpdated\",{key:o.key,type:\"set\",attributes:o.attributes,name:r}),this}}},{name:function(t){return\"remove\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return delete i.attributes[r],this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"remove\",attributes:i.attributes,name:r}),this}}},{name:function(t){return\"replace\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(!s(r))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return i.attributes=r,this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"replace\",attributes:i.attributes}),this}}},{name:function(t){return\"merge\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(!s(r))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return u(i.attributes,r),this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"merge\",attributes:i.attributes,data:r}),this}}},{name:function(t){return\"update\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(\"function\"!=typeof r)throw new B(\"Graph.\".concat(e,\": provided updater is not a function.\"));return i.attributes=r(i.attributes),this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"update\",attributes:i.attributes}),this}}}];var Z=O,$=P,tt=function(){var t=arguments,e=null,n=-1;return new Z((function(){for(var r=null;;){if(null===e){if(++n>=t.length)return{done:!0};e=$(t[n])}if(!0!==(r=e.next()).done)break;e=null}return r}))},et=[{name:\"edges\",type:\"mixed\"},{name:\"inEdges\",type:\"directed\",direction:\"in\"},{name:\"outEdges\",type:\"directed\",direction:\"out\"},{name:\"inboundEdges\",type:\"mixed\",direction:\"in\"},{name:\"outboundEdges\",type:\"mixed\",direction:\"out\"},{name:\"directedEdges\",type:\"directed\"},{name:\"undirectedEdges\",type:\"undirected\"}];function nt(t,e,n,r){var i=!1;for(var o in e)if(o!==r){var a=e[o];if(i=n(a.key,a.attributes,a.source.key,a.target.key,a.source.attributes,a.target.attributes,a.undirected),t&&i)return a.key}}function rt(t,e,n,r){var i,o,a,c=!1;for(var u in e)if(u!==r){i=e[u];do{if(o=i.source,a=i.target,c=n(i.key,i.attributes,o.key,a.key,o.attributes,a.attributes,i.undirected),t&&c)return i.key;i=i.next}while(void 0!==i)}}function it(t,e){var n,r=Object.keys(t),i=r.length,o=0;return new O((function(){do{if(n)n=n.next;else{if(o>=i)return{done:!0};var a=r[o++];if(a===e){n=void 0;continue}n=t[a]}}while(!n);return{done:!1,value:{edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected}}}))}function ot(t,e,n,r){var i=e[n];if(i){var o=i.source,a=i.target;return r(i.key,i.attributes,o.key,a.key,o.attributes,a.attributes,i.undirected)&&t?i.key:void 0}}function at(t,e,n,r){var i=e[n];if(i){var o=!1;do{if(o=r(i.key,i.attributes,i.source.key,i.target.key,i.source.attributes,i.target.attributes,i.undirected),t&&o)return i.key;i=i.next}while(void 0!==i)}}function ct(t,e){var n=t[e];return void 0!==n.next?new O((function(){if(!n)return{done:!0};var t={edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected};return n=n.next,{done:!1,value:t}})):O.of({edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected})}function ut(t,e){if(0===t.size)return[];if(\"mixed\"===e||e===t.type)return\"function\"==typeof Array.from?Array.from(t._edges.keys()):K(t._edges.keys(),t._edges.size);for(var n,r,i=\"undirected\"===e?t.undirectedSize:t.directedSize,o=new Array(i),a=\"undirected\"===e,c=t._edges.values(),u=0;!0!==(n=c.next()).done;)(r=n.value).undirected===a&&(o[u++]=r.key);return o}function dt(t,e,n,r){if(0!==e.size)for(var i,o,a=\"mixed\"!==n&&n!==e.type,c=\"undirected\"===n,u=!1,d=e._edges.values();!0!==(i=d.next()).done;)if(o=i.value,!a||o.undirected===c){var s=o,h=s.key,p=s.attributes,f=s.source,l=s.target;if(u=r(h,p,f.key,l.key,f.attributes,l.attributes,o.undirected),t&&u)return h}}function st(t,e){if(0===t.size)return O.empty();var n=\"mixed\"!==e&&e!==t.type,r=\"undirected\"===e,i=t._edges.values();return new O((function(){for(var t,e;;){if((t=i.next()).done)return t;if(e=t.value,!n||e.undirected===r)break}return{value:{edge:e.key,attributes:e.attributes,source:e.source.key,target:e.target.key,sourceAttributes:e.source.attributes,targetAttributes:e.target.attributes,undirected:e.undirected},done:!1}}))}function ht(t,e,n,r,i,o){var a,c=e?rt:nt;if(\"undirected\"!==n){if(\"out\"!==r&&(a=c(t,i.in,o),t&&a))return a;if(\"in\"!==r&&(a=c(t,i.out,o,r?void 0:i.key),t&&a))return a}if(\"directed\"!==n&&(a=c(t,i.undirected,o),t&&a))return a}function pt(t,e,n,r){var i=[];return ht(!1,t,e,n,r,(function(t){i.push(t)})),i}function ft(t,e,n){var r=O.empty();return\"undirected\"!==t&&(\"out\"!==e&&void 0!==n.in&&(r=tt(r,it(n.in))),\"in\"!==e&&void 0!==n.out&&(r=tt(r,it(n.out,e?void 0:n.key)))),\"directed\"!==t&&void 0!==n.undirected&&(r=tt(r,it(n.undirected))),r}function lt(t,e,n,r,i,o,a){var c,u=n?at:ot;if(\"undirected\"!==e){if(void 0!==i.in&&\"out\"!==r&&(c=u(t,i.in,o,a),t&&c))return c;if(void 0!==i.out&&\"in\"!==r&&(r||i.key!==o)&&(c=u(t,i.out,o,a),t&&c))return c}if(\"directed\"!==e&&void 0!==i.undirected&&(c=u(t,i.undirected,o,a),t&&c))return c}function gt(t,e,n,r,i){var o=[];return lt(!1,t,e,n,r,i,(function(t){o.push(t)})),o}function yt(t,e,n,r){var i=O.empty();return\"undirected\"!==t&&(void 0!==n.in&&\"out\"!==e&&r in n.in&&(i=tt(i,ct(n.in,r))),void 0!==n.out&&\"in\"!==e&&r in n.out&&(e||n.key!==r)&&(i=tt(i,ct(n.out,r)))),\"directed\"!==t&&void 0!==n.undirected&&r in n.undirected&&(i=tt(i,ct(n.undirected,r))),i}var wt=[{name:\"neighbors\",type:\"mixed\"},{name:\"inNeighbors\",type:\"directed\",direction:\"in\"},{name:\"outNeighbors\",type:\"directed\",direction:\"out\"},{name:\"inboundNeighbors\",type:\"mixed\",direction:\"in\"},{name:\"outboundNeighbors\",type:\"mixed\",direction:\"out\"},{name:\"directedNeighbors\",type:\"directed\"},{name:\"undirectedNeighbors\",type:\"undirected\"}];function vt(){this.A=null,this.B=null}function bt(t,e,n,r,i){for(var o in r){var a=r[o],c=a.source,u=a.target,d=c===n?u:c;if(!e||!e.has(d.key)){var s=i(d.key,d.attributes);if(t&&s)return d.key}}}function mt(t,e,n,r,i){if(\"mixed\"!==e){if(\"undirected\"===e)return bt(t,null,r,r.undirected,i);if(\"string\"==typeof n)return bt(t,null,r,r[n],i)}var o,a=new vt;if(\"undirected\"!==e){if(\"out\"!==n){if(o=bt(t,null,r,r.in,i),t&&o)return o;a.wrap(r.in)}if(\"in\"!==n){if(o=bt(t,a,r,r.out,i),t&&o)return o;a.wrap(r.out)}}if(\"directed\"!==e&&(o=bt(t,a,r,r.undirected,i),t&&o))return o}function kt(t,e,n){var r=Object.keys(n),i=r.length,o=0;return new O((function(){var a=null;do{if(o>=i)return t&&t.wrap(n),{done:!0};var c=n[r[o++]],u=c.source,d=c.target;a=u===e?d:u,t&&t.has(a.key)&&(a=null)}while(null===a);return{done:!1,value:{neighbor:a.key,attributes:a.attributes}}}))}function _t(t,e){var n=e.name,r=e.type,i=e.direction;t.prototype[n]=function(t){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return[];t=\"\"+t;var e=this._nodes.get(t);if(void 0===e)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" node in the graph.'));return function(t,e,n){if(\"mixed\"!==t){if(\"undirected\"===t)return Object.keys(n.undirected);if(\"string\"==typeof e)return Object.keys(n[e])}var r=[];return mt(!1,t,e,n,(function(t){r.push(t)})),r}(\"mixed\"===r?this.type:r,i,e)}}function Gt(t,e){var n=e.name,r=e.type,i=e.direction,o=n.slice(0,-1)+\"Entries\";t.prototype[o]=function(t){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return O.empty();t=\"\"+t;var e=this._nodes.get(t);if(void 0===e)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return function(t,e,n){if(\"mixed\"!==t){if(\"undirected\"===t)return kt(null,n,n.undirected);if(\"string\"==typeof e)return kt(null,n,n[e])}var r=O.empty(),i=new vt;return\"undirected\"!==t&&(\"out\"!==e&&(r=tt(r,kt(i,n,n.in))),\"in\"!==e&&(r=tt(r,kt(i,n,n.out)))),\"directed\"!==t&&(r=tt(r,kt(i,n,n.undirected))),r}(\"mixed\"===r?this.type:r,i,e)}}function xt(t,e,n,r,i){for(var o,a,c,u,d,s,h,p=r._nodes.values(),f=r.type;!0!==(o=p.next()).done;){var l=!1;if(a=o.value,\"undirected\"!==f)for(c in u=a.out){d=u[c];do{if(s=d.target,l=!0,h=i(a.key,s.key,a.attributes,s.attributes,d.key,d.attributes,d.undirected),t&&h)return d;d=d.next}while(d)}if(\"directed\"!==f)for(c in u=a.undirected)if(!(e&&a.key>c)){d=u[c];do{if((s=d.target).key!==c&&(s=d.source),l=!0,h=i(a.key,s.key,a.attributes,s.attributes,d.key,d.attributes,d.undirected),t&&h)return d;d=d.next}while(d)}if(n&&!l&&(h=i(a.key,null,a.attributes,null,null,null,null),t&&h))return null}}function Et(t){if(!s(t))throw new B('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a \"key\" property.');if(!(\"key\"in t))throw new B(\"Graph.import: serialized node is missing its key.\");if(\"attributes\"in t&&(!s(t.attributes)||null===t.attributes))throw new B(\"Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.\")}function At(t){if(!s(t))throw new B('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a \"source\" & \"target\" property.');if(!(\"source\"in t))throw new B(\"Graph.import: serialized edge is missing its source.\");if(!(\"target\"in t))throw new B(\"Graph.import: serialized edge is missing its target.\");if(\"attributes\"in t&&(!s(t.attributes)||null===t.attributes))throw new B(\"Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.\");if(\"undirected\"in t&&\"boolean\"!=typeof t.undirected)throw new B(\"Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.\")}vt.prototype.wrap=function(t){null===this.A?this.A=t:null===this.B&&(this.B=t)},vt.prototype.has=function(t){return null!==this.A&&t in this.A||null!==this.B&&t in this.B};var Lt,St=(Lt=255&Math.floor(256*Math.random()),function(){return Lt++}),Dt=new Set([\"directed\",\"undirected\",\"mixed\"]),Ut=new Set([\"domain\",\"_events\",\"_eventsCount\",\"_maxListeners\"]),Nt={allowSelfLoops:!0,multi:!1,type:\"mixed\"};function Ot(t,e,n){var r=new t.NodeDataClass(e,n);return t._nodes.set(e,r),t.emit(\"nodeAdded\",{key:e,attributes:n}),r}function jt(t,e,n,r,i,o,a,c){if(!r&&\"undirected\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.\"));if(r&&\"directed\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.\"));if(c&&!s(c))throw new B(\"Graph.\".concat(e,': invalid attributes. Expecting an object but got \"').concat(c,'\"'));if(o=\"\"+o,a=\"\"+a,c=c||{},!t.allowSelfLoops&&o===a)throw new I(\"Graph.\".concat(e,': source & target are the same (\"').concat(o,\"\\\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.\"));var u=t._nodes.get(o),d=t._nodes.get(a);if(!u)throw new F(\"Graph.\".concat(e,': source node \"').concat(o,'\" not found.'));if(!d)throw new F(\"Graph.\".concat(e,': target node \"').concat(a,'\" not found.'));var h={key:null,undirected:r,source:o,target:a,attributes:c};if(n)i=t._edgeKeyGenerator();else if(i=\"\"+i,t._edges.has(i))throw new I(\"Graph.\".concat(e,': the \"').concat(i,'\" edge already exists in the graph.'));if(!t.multi&&(r?void 0!==u.undirected[a]:void 0!==u.out[a]))throw new I(\"Graph.\".concat(e,': an edge linking \"').concat(o,'\" to \"').concat(a,\"\\\" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.\"));var p=new V(r,i,u,d,c);t._edges.set(i,p);var f=o===a;return r?(u.undirectedDegree++,d.undirectedDegree++,f&&(u.undirectedLoops++,t._undirectedSelfLoopCount++)):(u.outDegree++,d.inDegree++,f&&(u.directedLoops++,t._directedSelfLoopCount++)),t.multi?p.attachMulti():p.attach(),r?t._undirectedSize++:t._directedSize++,h.key=i,t.emit(\"edgeAdded\",h),i}function Ct(t,e,n,r,i,o,a,c,d){if(!r&&\"undirected\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.\"));if(r&&\"directed\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.\"));if(c)if(d){if(\"function\"!=typeof c)throw new B(\"Graph.\".concat(e,': invalid updater function. Expecting a function but got \"').concat(c,'\"'))}else if(!s(c))throw new B(\"Graph.\".concat(e,': invalid attributes. Expecting an object but got \"').concat(c,'\"'));var h;if(o=\"\"+o,a=\"\"+a,d&&(h=c,c=void 0),!t.allowSelfLoops&&o===a)throw new I(\"Graph.\".concat(e,': source & target are the same (\"').concat(o,\"\\\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.\"));var p,f,l=t._nodes.get(o),g=t._nodes.get(a);if(!n&&(p=t._edges.get(i))){if(!(p.source.key===o&&p.target.key===a||r&&p.source.key===a&&p.target.key===o))throw new I(\"Graph.\".concat(e,': inconsistency detected when attempting to merge the \"').concat(i,'\" edge with \"').concat(o,'\" source & \"').concat(a,'\" target vs. (\"').concat(p.source.key,'\", \"').concat(p.target.key,'\").'));f=p}if(f||t.multi||!l||(f=r?l.undirected[a]:l.out[a]),f){var y=[f.key,!1,!1,!1];if(d?!h:!c)return y;if(d){var w=f.attributes;f.attributes=h(w),t.emit(\"edgeAttributesUpdated\",{type:\"replace\",key:f.key,attributes:f.attributes})}else u(f.attributes,c),t.emit(\"edgeAttributesUpdated\",{type:\"merge\",key:f.key,attributes:f.attributes,data:c});return y}c=c||{},d&&h&&(c=h(c));var v={key:null,undirected:r,source:o,target:a,attributes:c};if(n)i=t._edgeKeyGenerator();else if(i=\"\"+i,t._edges.has(i))throw new I(\"Graph.\".concat(e,': the \"').concat(i,'\" edge already exists in the graph.'));var b=!1,m=!1;l||(l=Ot(t,o,{}),b=!0,o===a&&(g=l,m=!0)),g||(g=Ot(t,a,{}),m=!0),p=new V(r,i,l,g,c),t._edges.set(i,p);var k=o===a;return r?(l.undirectedDegree++,g.undirectedDegree++,k&&(l.undirectedLoops++,t._undirectedSelfLoopCount++)):(l.outDegree++,g.inDegree++,k&&(l.directedLoops++,t._directedSelfLoopCount++)),t.multi?p.attachMulti():p.attach(),r?t._undirectedSize++:t._directedSize++,v.key=i,t.emit(\"edgeAdded\",v),[i,!0,b,m]}function Mt(t,e){t._edges.delete(e.key);var n=e.source,r=e.target,i=e.attributes,o=e.undirected,a=n===r;o?(n.undirectedDegree--,r.undirectedDegree--,a&&(n.undirectedLoops--,t._undirectedSelfLoopCount--)):(n.outDegree--,r.inDegree--,a&&(n.directedLoops--,t._directedSelfLoopCount--)),t.multi?e.detachMulti():e.detach(),o?t._undirectedSize--:t._directedSize--,t.emit(\"edgeDropped\",{key:e.key,attributes:i,source:n.key,target:r.key,undirected:o})}var zt=function(n){function r(t){var e;if(e=n.call(this)||this,\"boolean\"!=typeof(t=u({},Nt,t)).multi)throw new B(\"Graph.constructor: invalid 'multi' option. Expecting a boolean but got \\\"\".concat(t.multi,'\".'));if(!Dt.has(t.type))throw new B('Graph.constructor: invalid \\'type\\' option. Should be one of \"mixed\", \"directed\" or \"undirected\" but got \"'.concat(t.type,'\".'));if(\"boolean\"!=typeof t.allowSelfLoops)throw new B(\"Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got \\\"\".concat(t.allowSelfLoops,'\".'));var r=\"mixed\"===t.type?Y:\"directed\"===t.type?q:J;p(c(e),\"NodeDataClass\",r);var i=\"geid_\"+St()+\"_\",o=0;return p(c(e),\"_attributes\",{}),p(c(e),\"_nodes\",new Map),p(c(e),\"_edges\",new Map),p(c(e),\"_directedSize\",0),p(c(e),\"_undirectedSize\",0),p(c(e),\"_directedSelfLoopCount\",0),p(c(e),\"_undirectedSelfLoopCount\",0),p(c(e),\"_edgeKeyGenerator\",(function(){var t;do{t=i+o++}while(e._edges.has(t));return t})),p(c(e),\"_options\",t),Ut.forEach((function(t){return p(c(e),t,e[t])})),f(c(e),\"order\",(function(){return e._nodes.size})),f(c(e),\"size\",(function(){return e._edges.size})),f(c(e),\"directedSize\",(function(){return e._directedSize})),f(c(e),\"undirectedSize\",(function(){return e._undirectedSize})),f(c(e),\"selfLoopCount\",(function(){return e._directedSelfLoopCount+e._undirectedSelfLoopCount})),f(c(e),\"directedSelfLoopCount\",(function(){return e._directedSelfLoopCount})),f(c(e),\"undirectedSelfLoopCount\",(function(){return e._undirectedSelfLoopCount})),f(c(e),\"multi\",e._options.multi),f(c(e),\"type\",e._options.type),f(c(e),\"allowSelfLoops\",e._options.allowSelfLoops),f(c(e),\"implementation\",(function(){return\"graphology\"})),e}e(r,n);var i=r.prototype;return i._resetInstanceCounters=function(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0},i.hasNode=function(t){return this._nodes.has(\"\"+t)},i.hasDirectedEdge=function(t,e){if(\"undirected\"===this.type)return!1;if(1===arguments.length){var n=\"\"+t,r=this._edges.get(n);return!!r&&!r.undirected}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var i=this._nodes.get(t);return!!i&&i.out.hasOwnProperty(e)}throw new B(\"Graph.hasDirectedEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.hasUndirectedEdge=function(t,e){if(\"directed\"===this.type)return!1;if(1===arguments.length){var n=\"\"+t,r=this._edges.get(n);return!!r&&r.undirected}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var i=this._nodes.get(t);return!!i&&i.undirected.hasOwnProperty(e)}throw new B(\"Graph.hasDirectedEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.hasEdge=function(t,e){if(1===arguments.length){var n=\"\"+t;return this._edges.has(n)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var r=this._nodes.get(t);return!!r&&(void 0!==r.out&&r.out.hasOwnProperty(e)||void 0!==r.undirected&&r.undirected.hasOwnProperty(e))}throw new B(\"Graph.hasEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.directedEdge=function(t,e){if(\"undirected\"!==this.type){if(t=\"\"+t,e=\"\"+e,this.multi)throw new I(\"Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.\");var n=this._nodes.get(t);if(!n)throw new F('Graph.directedEdge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.directedEdge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.out&&n.out[e]||void 0;return r?r.key:void 0}},i.undirectedEdge=function(t,e){if(\"directed\"!==this.type){if(t=\"\"+t,e=\"\"+e,this.multi)throw new I(\"Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.\");var n=this._nodes.get(t);if(!n)throw new F('Graph.undirectedEdge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.undirectedEdge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.undirected&&n.undirected[e]||void 0;return r?r.key:void 0}},i.edge=function(t,e){if(this.multi)throw new I(\"Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.\");t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.edge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.edge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.out&&n.out[e]||n.undirected&&n.undirected[e]||void 0;if(r)return r.key},i.areDirectedNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areDirectedNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&(e in n.in||e in n.out)},i.areOutNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areOutNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.out},i.areInNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areInNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.in},i.areUndirectedNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areUndirectedNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"!==this.type&&e in n.undirected},i.areNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&(e in n.in||e in n.out)||\"directed\"!==this.type&&e in n.undirected},i.areInboundNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areInboundNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.in||\"directed\"!==this.type&&e in n.undirected},i.areOutboundNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areOutboundNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.out||\"directed\"!==this.type&&e in n.undirected},i.inDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree},i.outDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.outDegree},i.directedDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.directedDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree+e.outDegree},i.undirectedDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.undirectedDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"===this.type?0:e.undirectedDegree},i.inboundDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inboundDegree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.inDegree),n},i.outboundDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outboundDegree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.outDegree),n},i.degree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.degree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.inDegree+e.outDegree),n},i.inDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree-e.directedLoops},i.outDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.outDegree-e.directedLoops},i.directedDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.directedDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree+e.outDegree-2*e.directedLoops},i.undirectedDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.undirectedDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"===this.type?0:e.undirectedDegree-2*e.undirectedLoops},i.inboundDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inboundDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.inDegree,r+=e.directedLoops),n-r},i.outboundDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outboundDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.outDegree,r+=e.directedLoops),n-r},i.degreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.degreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.inDegree+e.outDegree,r+=2*e.directedLoops),n-r},i.source=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.source: could not find the \"'.concat(t,'\" edge in the graph.'));return e.source.key},i.target=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.target: could not find the \"'.concat(t,'\" edge in the graph.'));return e.target.key},i.extremities=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.extremities: could not find the \"'.concat(t,'\" edge in the graph.'));return[e.source.key,e.target.key]},i.opposite=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._edges.get(e);if(!n)throw new F('Graph.opposite: could not find the \"'.concat(e,'\" edge in the graph.'));var r=n.source.key,i=n.target.key;if(t===r)return i;if(t===i)return r;throw new F('Graph.opposite: the \"'.concat(t,'\" node is not attached to the \"').concat(e,'\" edge (').concat(r,\", \").concat(i,\").\"))},i.hasExtremity=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._edges.get(t);if(!n)throw new F('Graph.hasExtremity: could not find the \"'.concat(t,'\" edge in the graph.'));return n.source.key===e||n.target.key===e},i.isUndirected=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isUndirected: could not find the \"'.concat(t,'\" edge in the graph.'));return e.undirected},i.isDirected=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isDirected: could not find the \"'.concat(t,'\" edge in the graph.'));return!e.undirected},i.isSelfLoop=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isSelfLoop: could not find the \"'.concat(t,'\" edge in the graph.'));return e.source===e.target},i.addNode=function(t,e){var n=function(t,e,n){if(n&&!s(n))throw new B('Graph.addNode: invalid attributes. Expecting an object but got \"'.concat(n,'\"'));if(e=\"\"+e,n=n||{},t._nodes.has(e))throw new I('Graph.addNode: the \"'.concat(e,'\" node already exist in the graph.'));var r=new t.NodeDataClass(e,n);return t._nodes.set(e,r),t.emit(\"nodeAdded\",{key:e,attributes:n}),r}(this,t,e);return n.key},i.mergeNode=function(t,e){if(e&&!s(e))throw new B('Graph.mergeNode: invalid attributes. Expecting an object but got \"'.concat(e,'\"'));t=\"\"+t,e=e||{};var n=this._nodes.get(t);return n?(e&&(u(n.attributes,e),this.emit(\"nodeAttributesUpdated\",{type:\"merge\",key:t,attributes:n.attributes,data:e})),[t,!1]):(n=new this.NodeDataClass(t,e),this._nodes.set(t,n),this.emit(\"nodeAdded\",{key:t,attributes:e}),[t,!0])},i.updateNode=function(t,e){if(e&&\"function\"!=typeof e)throw new B('Graph.updateNode: invalid updater function. Expecting a function but got \"'.concat(e,'\"'));t=\"\"+t;var n=this._nodes.get(t);if(n){if(e){var r=n.attributes;n.attributes=e(r),this.emit(\"nodeAttributesUpdated\",{type:\"replace\",key:t,attributes:n.attributes})}return[t,!1]}var i=e?e({}):{};return n=new this.NodeDataClass(t,i),this._nodes.set(t,n),this.emit(\"nodeAdded\",{key:t,attributes:i}),[t,!0]},i.dropNode=function(t){t=\"\"+t;var e,n=this._nodes.get(t);if(!n)throw new F('Graph.dropNode: could not find the \"'.concat(t,'\" node in the graph.'));if(\"undirected\"!==this.type){for(var r in n.out){e=n.out[r];do{Mt(this,e),e=e.next}while(e)}for(var i in n.in){e=n.in[i];do{Mt(this,e),e=e.next}while(e)}}if(\"directed\"!==this.type)for(var o in n.undirected){e=n.undirected[o];do{Mt(this,e),e=e.next}while(e)}this._nodes.delete(t),this.emit(\"nodeDropped\",{key:t,attributes:n.attributes})},i.dropEdge=function(t){var e;if(arguments.length>1){var n=\"\"+arguments[0],r=\"\"+arguments[1];if(!(e=d(this,n,r,this.type)))throw new F('Graph.dropEdge: could not find the \"'.concat(n,'\" -> \"').concat(r,'\" edge in the graph.'))}else if(t=\"\"+t,!(e=this._edges.get(t)))throw new F('Graph.dropEdge: could not find the \"'.concat(t,'\" edge in the graph.'));return Mt(this,e),this},i.dropDirectedEdge=function(t,e){if(arguments.length<2)throw new I(\"Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.\");if(this.multi)throw new I(\"Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.\");var n=d(this,t=\"\"+t,e=\"\"+e,\"directed\");if(!n)throw new F('Graph.dropDirectedEdge: could not find a \"'.concat(t,'\" -> \"').concat(e,'\" edge in the graph.'));return Mt(this,n),this},i.dropUndirectedEdge=function(t,e){if(arguments.length<2)throw new I(\"Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.\");if(this.multi)throw new I(\"Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.\");var n=d(this,t,e,\"undirected\");if(!n)throw new F('Graph.dropUndirectedEdge: could not find a \"'.concat(t,'\" -> \"').concat(e,'\" edge in the graph.'));return Mt(this,n),this},i.clear=function(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit(\"cleared\")},i.clearEdges=function(){for(var t,e=this._nodes.values();!0!==(t=e.next()).done;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit(\"edgesCleared\")},i.getAttribute=function(t){return this._attributes[t]},i.getAttributes=function(){return this._attributes},i.hasAttribute=function(t){return this._attributes.hasOwnProperty(t)},i.setAttribute=function(t,e){return this._attributes[t]=e,this.emit(\"attributesUpdated\",{type:\"set\",attributes:this._attributes,name:t}),this},i.updateAttribute=function(t,e){if(\"function\"!=typeof e)throw new B(\"Graph.updateAttribute: updater should be a function.\");var n=this._attributes[t];return this._attributes[t]=e(n),this.emit(\"attributesUpdated\",{type:\"set\",attributes:this._attributes,name:t}),this},i.removeAttribute=function(t){return delete this._attributes[t],this.emit(\"attributesUpdated\",{type:\"remove\",attributes:this._attributes,name:t}),this},i.replaceAttributes=function(t){if(!s(t))throw new B(\"Graph.replaceAttributes: provided attributes are not a plain object.\");return this._attributes=t,this.emit(\"attributesUpdated\",{type:\"replace\",attributes:this._attributes}),this},i.mergeAttributes=function(t){if(!s(t))throw new B(\"Graph.mergeAttributes: provided attributes are not a plain object.\");return u(this._attributes,t),this.emit(\"attributesUpdated\",{type:\"merge\",attributes:this._attributes,data:t}),this},i.updateAttributes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.updateAttributes: provided updater is not a function.\");return this._attributes=t(this._attributes),this.emit(\"attributesUpdated\",{type:\"update\",attributes:this._attributes}),this},i.updateEachNodeAttributes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.updateEachNodeAttributes: expecting an updater function.\");if(e&&!l(e))throw new B(\"Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}\");for(var n,r,i=this._nodes.values();!0!==(n=i.next()).done;)(r=n.value).attributes=t(r.key,r.attributes);this.emit(\"eachNodeAttributesUpdated\",{hints:e||null})},i.updateEachEdgeAttributes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.updateEachEdgeAttributes: expecting an updater function.\");if(e&&!l(e))throw new B(\"Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}\");for(var n,r,i,o,a=this._edges.values();!0!==(n=a.next()).done;)i=(r=n.value).source,o=r.target,r.attributes=t(r.key,r.attributes,i.key,o.key,i.attributes,o.attributes,r.undirected);this.emit(\"eachEdgeAttributesUpdated\",{hints:e||null})},i.forEachAdjacencyEntry=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAdjacencyEntry: expecting a callback.\");xt(!1,!1,!1,this,t)},i.forEachAdjacencyEntryWithOrphans=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.\");xt(!1,!1,!0,this,t)},i.forEachAssymetricAdjacencyEntry=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAssymetricAdjacencyEntry: expecting a callback.\");xt(!1,!0,!1,this,t)},i.forEachAssymetricAdjacencyEntryWithOrphans=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.\");xt(!1,!0,!0,this,t)},i.nodes=function(){return\"function\"==typeof Array.from?Array.from(this._nodes.keys()):K(this._nodes.keys(),this._nodes.size)},i.forEachNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)t((n=e.value).key,n.attributes)},i.findNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.findNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(t((n=e.value).key,n.attributes))return n.key},i.mapNodes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.mapNode: expecting a callback.\");for(var e,n,r=this._nodes.values(),i=new Array(this.order),o=0;!0!==(e=r.next()).done;)n=e.value,i[o++]=t(n.key,n.attributes);return i},i.someNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.someNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(t((n=e.value).key,n.attributes))return!0;return!1},i.everyNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.everyNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(!t((n=e.value).key,n.attributes))return!1;return!0},i.filterNodes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.filterNodes: expecting a callback.\");for(var e,n,r=this._nodes.values(),i=[];!0!==(e=r.next()).done;)t((n=e.value).key,n.attributes)&&i.push(n.key);return i},i.reduceNodes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.reduceNodes: expecting a callback.\");if(arguments.length<2)throw new B(\"Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\");for(var n,r,i=e,o=this._nodes.values();!0!==(n=o.next()).done;)i=t(i,(r=n.value).key,r.attributes);return i},i.nodeEntries=function(){var t=this._nodes.values();return new O((function(){var e=t.next();if(e.done)return e;var n=e.value;return{value:{node:n.key,attributes:n.attributes},done:!1}}))},i.export=function(){var t=this,e=new Array(this._nodes.size),n=0;this._nodes.forEach((function(t,r){e[n++]=function(t,e){var n={key:t};return h(e.attributes)||(n.attributes=u({},e.attributes)),n}(r,t)}));var r=new Array(this._edges.size);return n=0,this._edges.forEach((function(e,i){r[n++]=function(t,e,n){var r={key:e,source:n.source.key,target:n.target.key};return h(n.attributes)||(r.attributes=u({},n.attributes)),\"mixed\"===t&&n.undirected&&(r.undirected=!0),r}(t.type,i,e)})),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:e,edges:r}},i.import=function(t){var e,n,i,o,a,c=this,u=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t instanceof r)return t.forEachNode((function(t,e){u?c.mergeNode(t,e):c.addNode(t,e)})),t.forEachEdge((function(t,e,n,r,i,o,a){u?a?c.mergeUndirectedEdgeWithKey(t,n,r,e):c.mergeDirectedEdgeWithKey(t,n,r,e):a?c.addUndirectedEdgeWithKey(t,n,r,e):c.addDirectedEdgeWithKey(t,n,r,e)})),this;if(!s(t))throw new B(\"Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.\");if(t.attributes){if(!s(t.attributes))throw new B(\"Graph.import: invalid attributes. Expecting a plain object.\");u?this.mergeAttributes(t.attributes):this.replaceAttributes(t.attributes)}if(t.nodes){if(i=t.nodes,!Array.isArray(i))throw new B(\"Graph.import: invalid nodes. Expecting an array.\");for(e=0,n=i.length;e<n;e++){Et(o=i[e]);var d=o,h=d.key,p=d.attributes;u?this.mergeNode(h,p):this.addNode(h,p)}}if(t.edges){var f=!1;if(\"undirected\"===this.type&&(f=!0),i=t.edges,!Array.isArray(i))throw new B(\"Graph.import: invalid edges. Expecting an array.\");for(e=0,n=i.length;e<n;e++){At(a=i[e]);var l=a,g=l.source,y=l.target,w=l.attributes,v=l.undirected,b=void 0===v?f:v;\"key\"in a?(u?b?this.mergeUndirectedEdgeWithKey:this.mergeDirectedEdgeWithKey:b?this.addUndirectedEdgeWithKey:this.addDirectedEdgeWithKey).call(this,a.key,g,y,w):(u?b?this.mergeUndirectedEdge:this.mergeDirectedEdge:b?this.addUndirectedEdge:this.addDirectedEdge).call(this,g,y,w)}}return this},i.nullCopy=function(t){var e=new r(u({},this._options,t));return e.replaceAttributes(u({},this.getAttributes())),e},i.emptyCopy=function(t){var e=this.nullCopy(t);return this._nodes.forEach((function(t,n){var r=u({},t.attributes);t=new e.NodeDataClass(n,r),e._nodes.set(n,t)})),e},i.copy=function(t){if(\"string\"==typeof(t=t||{}).type&&t.type!==this.type&&\"mixed\"!==t.type)throw new I('Graph.copy: cannot create an incompatible copy from \"'.concat(this.type,'\" type to \"').concat(t.type,'\" because this would mean losing information about the current graph.'));if(\"boolean\"==typeof t.multi&&t.multi!==this.multi&&!0!==t.multi)throw new I(\"Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.\");if(\"boolean\"==typeof t.allowSelfLoops&&t.allowSelfLoops!==this.allowSelfLoops&&!0!==t.allowSelfLoops)throw new I(\"Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.\");for(var e,n,r=this.emptyCopy(t),i=this._edges.values();!0!==(e=i.next()).done;)jt(r,\"copy\",!1,(n=e.value).undirected,n.key,n.source.key,n.target.key,u({},n.attributes));return r},i.toJSON=function(){return this.export()},i.toString=function(){return\"[object Graph]\"},i.inspect=function(){var e=this,n={};this._nodes.forEach((function(t,e){n[e]=t.attributes}));var r={},i={};this._edges.forEach((function(t,n){var o,a=t.undirected?\"--\":\"->\",c=\"\",u=t.source.key,d=t.target.key;t.undirected&&u>d&&(o=u,u=d,d=o);var s=\"(\".concat(u,\")\").concat(a,\"(\").concat(d,\")\");n.startsWith(\"geid_\")?e.multi&&(void 0===i[s]?i[s]=0:i[s]++,c+=\"\".concat(i[s],\". \")):c+=\"[\".concat(n,\"]: \"),r[c+=s]=t.attributes}));var o={};for(var a in this)this.hasOwnProperty(a)&&!Ut.has(a)&&\"function\"!=typeof this[a]&&\"symbol\"!==t(a)&&(o[a]=this[a]);return o.attributes=this._attributes,o.nodes=n,o.edges=r,p(o,\"constructor\",this.constructor),o},r}(y.exports.EventEmitter);\"undefined\"!=typeof Symbol&&(zt.prototype[Symbol.for(\"nodejs.util.inspect.custom\")]=zt.prototype.inspect),[{name:function(t){return\"\".concat(t,\"Edge\")},generateKey:!0},{name:function(t){return\"\".concat(t,\"DirectedEdge\")},generateKey:!0,type:\"directed\"},{name:function(t){return\"\".concat(t,\"UndirectedEdge\")},generateKey:!0,type:\"undirected\"},{name:function(t){return\"\".concat(t,\"EdgeWithKey\")}},{name:function(t){return\"\".concat(t,\"DirectedEdgeWithKey\")},type:\"directed\"},{name:function(t){return\"\".concat(t,\"UndirectedEdgeWithKey\")},type:\"undirected\"}].forEach((function(t){[\"add\",\"merge\",\"update\"].forEach((function(e){var n=t.name(e),r=\"add\"===e?jt:Ct;t.generateKey?zt.prototype[n]=function(i,o,a){return r(this,n,!0,\"undirected\"===(t.type||this.type),null,i,o,a,\"update\"===e)}:zt.prototype[n]=function(i,o,a,c){return r(this,n,!1,\"undirected\"===(t.type||this.type),i,o,a,c,\"update\"===e)}}))})),function(t){Q.forEach((function(e){var n=e.name,r=e.attacher;r(t,n(\"Node\"),0),r(t,n(\"Source\"),1),r(t,n(\"Target\"),2),r(t,n(\"Opposite\"),3)}))}(zt),function(t){X.forEach((function(e){var n=e.name,r=e.attacher;r(t,n(\"Edge\"),\"mixed\"),r(t,n(\"DirectedEdge\"),\"directed\"),r(t,n(\"UndirectedEdge\"),\"undirected\")}))}(zt),function(t){et.forEach((function(e){!function(t,e){var n=e.name,r=e.type,i=e.direction;t.prototype[n]=function(t,e){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return[];if(!arguments.length)return ut(this,r);if(1===arguments.length){t=\"\"+t;var o=this._nodes.get(t);if(void 0===o)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" node in the graph.'));return pt(this.multi,\"mixed\"===r?this.type:r,i,o)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var a=this._nodes.get(t);if(!a)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(n,': could not find the \"').concat(e,'\" target node in the graph.'));return gt(r,this.multi,i,a,e)}throw new B(\"Graph.\".concat(n,\": too many arguments (expecting 0, 1 or 2 and got \").concat(arguments.length,\").\"))}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"forEach\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e,n){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){if(1===arguments.length)return dt(!1,this,r,n=t);if(2===arguments.length){t=\"\"+t,n=e;var a=this._nodes.get(t);if(void 0===a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ht(!1,this.multi,\"mixed\"===r?this.type:r,i,a,n)}if(3===arguments.length){t=\"\"+t,e=\"\"+e;var c=this._nodes.get(t);if(!c)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return lt(!1,r,this.multi,i,c,e,n)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 1, 2 or 3 and got \").concat(arguments.length,\").\"))}};var a=\"map\"+n[0].toUpperCase()+n.slice(1);t.prototype[a]=function(){var t,e=Array.prototype.slice.call(arguments),n=e.pop();if(0===e.length){var i=0;\"directed\"!==r&&(i+=this.undirectedSize),\"undirected\"!==r&&(i+=this.directedSize),t=new Array(i);var a=0;e.push((function(e,r,i,o,c,u,d){t[a++]=n(e,r,i,o,c,u,d)}))}else t=[],e.push((function(e,r,i,o,a,c,u){t.push(n(e,r,i,o,a,c,u))}));return this[o].apply(this,e),t};var c=\"filter\"+n[0].toUpperCase()+n.slice(1);t.prototype[c]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=[];return t.push((function(t,r,i,o,a,c,u){e(t,r,i,o,a,c,u)&&n.push(t)})),this[o].apply(this,t),n};var u=\"reduce\"+n[0].toUpperCase()+n.slice(1);t.prototype[u]=function(){var t,e,n=Array.prototype.slice.call(arguments);if(n.length<2||n.length>4)throw new B(\"Graph.\".concat(u,\": invalid number of arguments (expecting 2, 3 or 4 and got \").concat(n.length,\").\"));if(\"function\"==typeof n[n.length-1]&&\"function\"!=typeof n[n.length-2])throw new B(\"Graph.\".concat(u,\": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\"));2===n.length?(t=n[0],e=n[1],n=[]):3===n.length?(t=n[1],e=n[2],n=[n[0]]):4===n.length&&(t=n[2],e=n[3],n=[n[0],n[1]]);var r=e;return n.push((function(e,n,i,o,a,c,u){r=t(r,e,n,i,o,a,c,u)})),this[o].apply(this,n),r}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"find\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e,n){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return!1;if(1===arguments.length)return dt(!0,this,r,n=t);if(2===arguments.length){t=\"\"+t,n=e;var a=this._nodes.get(t);if(void 0===a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ht(!0,this.multi,\"mixed\"===r?this.type:r,i,a,n)}if(3===arguments.length){t=\"\"+t,e=\"\"+e;var c=this._nodes.get(t);if(!c)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return lt(!0,r,this.multi,i,c,e,n)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 1, 2 or 3 and got \").concat(arguments.length,\").\"))};var a=\"some\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[a]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop();return t.push((function(t,n,r,i,o,a,c){return e(t,n,r,i,o,a,c)})),!!this[o].apply(this,t)};var c=\"every\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[c]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop();return t.push((function(t,n,r,i,o,a,c){return!e(t,n,r,i,o,a,c)})),!this[o].apply(this,t)}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=n.slice(0,-1)+\"Entries\";t.prototype[o]=function(t,e){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return O.empty();if(!arguments.length)return st(this,r);if(1===arguments.length){t=\"\"+t;var n=this._nodes.get(t);if(!n)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ft(r,i,n)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var a=this._nodes.get(t);if(!a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return yt(r,i,a,e)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 0, 1 or 2 and got \").concat(arguments.length,\").\"))}}(t,e)}))}(zt),function(t){wt.forEach((function(e){_t(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"forEach\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){t=\"\"+t;var n=this._nodes.get(t);if(void 0===n)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));mt(!1,\"mixed\"===r?this.type:r,i,n,e)}};var a=\"map\"+n[0].toUpperCase()+n.slice(1);t.prototype[a]=function(t,e){var n=[];return this[o](t,(function(t,r){n.push(e(t,r))})),n};var c=\"filter\"+n[0].toUpperCase()+n.slice(1);t.prototype[c]=function(t,e){var n=[];return this[o](t,(function(t,r){e(t,r)&&n.push(t)})),n};var u=\"reduce\"+n[0].toUpperCase()+n.slice(1);t.prototype[u]=function(t,e,n){if(arguments.length<3)throw new B(\"Graph.\".concat(u,\": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\"));var r=n;return this[o](t,(function(t,n){r=e(r,t,n)})),r}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=n[0].toUpperCase()+n.slice(1,-1),a=\"find\"+o;t.prototype[a]=function(t,e){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){t=\"\"+t;var n=this._nodes.get(t);if(void 0===n)throw new F(\"Graph.\".concat(a,': could not find the \"').concat(t,'\" node in the graph.'));return mt(!0,\"mixed\"===r?this.type:r,i,n,e)}};var c=\"some\"+o;t.prototype[c]=function(t,e){return!!this[a](t,e)};var u=\"every\"+o;t.prototype[u]=function(t,e){return!this[a](t,(function(t,n){return!e(t,n)}))}}(t,e),Gt(t,e)}))}(zt);var Wt=function(t){function n(e){var n=u({type:\"directed\"},e);if(\"multi\"in n&&!1!==n.multi)throw new B(\"DirectedGraph.from: inconsistent indication that the graph should be multi in given options!\");if(\"directed\"!==n.type)throw new B('DirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Pt=function(t){function n(e){var n=u({type:\"undirected\"},e);if(\"multi\"in n&&!1!==n.multi)throw new B(\"UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!\");if(\"undirected\"!==n.type)throw new B('UndirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Rt=function(t){function n(e){var n=u({multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiGraph.from: inconsistent indication that the graph should be simple in given options!\");return t.call(this,n)||this}return e(n,t),n}(zt),Kt=function(t){function n(e){var n=u({type:\"directed\",multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!\");if(\"directed\"!==n.type)throw new B('MultiDirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Tt=function(t){function n(e){var n=u({type:\"undirected\",multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!\");if(\"undirected\"!==n.type)throw new B('MultiUndirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt);function Bt(t){t.from=function(e,n){var r=u({},e.options,n),i=new t(r);return i.import(e),i}}return Bt(zt),Bt(Wt),Bt(Pt),Bt(Rt),Bt(Kt),Bt(Tt),zt.Graph=zt,zt.DirectedGraph=Wt,zt.UndirectedGraph=Pt,zt.MultiGraph=Rt,zt.MultiDirectedGraph=Kt,zt.MultiUndirectedGraph=Tt,zt.InvalidArgumentsGraphError=B,zt.NotFoundGraphError=F,zt.UsageGraphError=I,zt}));\n//# sourceMappingURL=graphology.umd.min.js.map\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\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].call(module.exports, 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, [731], () => (__webpack_require__(6807)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\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 && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\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\t980: 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[\"webpackChunkeda\"] = self[\"webpackChunkeda\"] || [];\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","WEBGSLAGGREGATION","WEBGSLAGGREGATIONFUNCTIONS","EUCLIDEAN","arraySize","MANHATTAN","WEBGPUDISTANCE","webGPUFunctions","HAMMING","_maxArraySize","entryIndex","maxArraySize","_entryIndex","VECTOR_COSINE","TANIMOTO","LEVENSTEIN","NEEDLEMAN_WUNSCH","MONOMER_CHEMICAL_DISTANCE","SOKAL","COSINE","ASYMMETRIC","Difference","OneHot","distanceFunctionComplexity","maxEntrySize","Math","ceil","_maxEntrySize","TypeSupportedDistances","Set","gpuAdapter","gpuDevice","multiColWebGPUSparseMatrix","entryList","threshold","distanceMetrics","aggregationFunction","weights","options","thisArg","this","_arguments","generator","device","navigator","gpu","console","error","requestAdapter","powerPreference","isLost","lost","then","Promise","r","setTimeout","requiredBufferSize","adapterLimits","limits","buffferSizeLimit","maxBufferSize","storageBufferSizeLimit","maxStorageBufferBindingSize","requestDevice","requiredLimits","min","e","P","resolve","reject","fulfilled","value","step","rejected","result","done","apply","getGPUDevice","availableDistanceMetrics","Object","values","some","metric","includes","Error","join","maxDistance","length","list","numOfColumns","listSize","processInfo","map","entry","i","distanceMetric","gapOpenPenalty","gapExtensionPenalty","_a","_b","entryType","encodedList","Uint32Array","split","c","charCodeAt","Float32Array","_data","Int32Array","encodedListType","arraySizes","arr","has","maxEntryLen","reduce","a","b","max","complexity","EncodedArrayConstructor","flatSourceArray","forEach","seq","set","suppInfoStructWgsl","suppInfoSize","suppInfoType","suppInfoBuffer","maxMonomerIndex","scoringMatrix","alphabetIndexes","keys","prev","n","Array","fill","String","fromCharCode","similarityMatrixSize","transferedSimilarityMatrix","key","key2","offset","range","dataTypeWGSL","dataStructWgsl","sourceArraySize","webGPUProcessInfo","suppInfoWgsl","info","filter","wgsl","needsDummy","trim","dataWgsl","numOfThreads","sparseResultSizePerThread","combinedComplexity","maxIterationsPerThread","workgroupsDim","sqrt","globalThreadDimSize","condensedDistanceMatrixSize","dmChunkSizePerThread","module","createShaderModule","label","code","getCombinedDistanceScript","pipeline","createComputePipeline","layout","compute","entryPoint","startAtCols","startAtRows","endAtCols","endAtRows","chunkSize","floor","startRow","startCol","time","endIdx","endRow","endCol","timeEnd","computeInfoBuffer32Size","suppInfoBuffer32Size","sparseMatrixEachArray32Size","computeInfoBufferSize","BYTES_PER_ELEMENT","paddedComputeInfoBufferSize","remainder","computeInfoBuffer","createBuffer","size","usage","GPUBufferUsage","STORAGE","COPY_SRC","COPY_DST","mappedAtCreation","mappedComputeInfoArrayBuffer","getMappedRange","computeInfoOffSet","ArrayConstructor","unmap","suppInfoBufferSize","paddedSuppInfoBufferSize","suppInfoRemainder","mappedSuppInfoArrayBuffer","suppInfoOffSet","byteLength","resultsBufferSize","paddedResultsBufferSize","resultsRemainder","resultsBuffer","bindGroup","createBindGroup","getBindGroupLayout","entries","binding","resource","buffer","resultsOutBuffer","MAP_READ","resultIs","resultJs","resultDistances","isAllDone","encoder","createCommandEncoder","pass","beginComputePass","setPipeline","setBindGroup","dispatchWorkgroups","end","copyBufferToBuffer","commandBuffer","finish","queue","submit","onSubmittedWorkDone","mapAsync","GPUMapMode","READ","resultsOutArrayBuffer","resultOffset","resultsI","resultsJ","resultsDistances","resultsFound","every","d","totalResults","combinedI","combinedJ","combinedDistances","combinedOffset","resI","found","subarray","push","totalSize","finalI","finalJ","finalDistances","finalOffset","destroy","j","distance","maxEntryLens","aggregation","_","semaphore","lock","async","release","promise","multSparseMatrix","sparseMatrix","nRows","pruneValue","workersNum","hardwareConcurrency","numOfHorizontalStrinps","indexStarts","indexEnds","blockHeight","workers","Worker","URL","availableIndexes","add","initPromises","worker","postMessage","is","js","ds","onmessage","all","res","takeChunk","workerIdx","index","delete","blockStart","blockEnd","data","promises","_worker","terminate","totLen","mclInflate","pow","colwiseNormilize","doPrune","prune","colSums","sum","getWebColaLayot","cluster","clusterConnections","_subCluster","graph","addNode","x","random","y","it","v","weight","addEdge","settings","iterations","getEdgeWeight","weighted","edgeWeightInfluence","embedX1","embedY1","node","getNodeAttributes","minX","minY","maxX","maxY","scaleX","scaleY","embedX","embedY","defaultMCLOptions","expandFactor","maxIterations","inflateFactor","multFactor","MCLSparseReducer","constructor","opts","_options","transform","superClusters","assignClusters","correctClusters","clusters","clusterConnectionMap","splitConnectionsIntoClusters","mclMatrix","inflate","maxIter","matrix","start","initMCLMatrix","log","runMarkovClustering","embeddings","transformWebGPU","Map","cc","get","clusterNum","mergeClusters","iCluster","jCluster","k","clusterSizeMap","sortedIndexes","Number","sort","clusterMap","clusterIdx","subCluster","sortedClusterNames","perRow","yOffset","perRowSizes","clustSize1","clustSize2","curPerRowSize","maxClustersInNextRow","pointsInCurRow","pointsAccum","clustersAccum","perRowIdx","clusterName","offsetX","event","aggregationMethod","distanceFnArgs","distanceFns","useWebGPU","sparse","calcMultiColumn","MAX_MCL_CONNECTIONS","pruneSparseMatrix","reducer","isNil","insertSmaller","distancesAr","indexes","num","newPosition","findIndex","pop","splice","exports","linLogMode","outboundAttractionDistribution","adjustSizes","scalingRatio","strongGravityMode","gravity","slowDown","barnesHutOptimize","barnesHutTheta","assign","target","l","objects","prototype","slice","call","arguments","validateSettings","message","graphToByteArrays","order","NodeMatrix","EdgeMatrix","forEachNode","attr","fixed","forEachEdge","edge","source","sa","ta","u","sj","tj","nodes","edges","assignLayoutChanges","outputReducer","updateEachNodeAttributes","readGraphPositions","collectLayoutChanges","positions","newAttr","createWorker","fn","xURL","window","webkitURL","toString","objectUrl","createObjectURL","Blob","type","revokeObjectURL","isGraph","createEdgeWeightGetter","iterate","helpers","DEFAULT_SETTINGS","abstractSynchronousLayout","params","fromEntry","validationError","matrices","synchronousLayout","bind","inferSettings","PPN","n1","n2","rn","w","g","s","outboundAttCompensation","coefficient","xDist","yDist","ewc","factor","force","swinging","traction","nodespeed","newX","newY","thetaSquared","RegionMatrix","q","q2","subdivisionAttempts","Infinity","dx","dy","PPR","coerceWeight","isNaN","name","nameOrFunction","defaultValue","getter","coerceToDefault","attributes","returnDefault","undefined","fromAttributes","fromGraph","getEdgeAttributes","fromPartialEntry","fromMinimalEntry","extremities","isUndirected","t","createEdgeValueGetter","addUndirectedEdgeWithKey","dropNode","multi","Symbol","iterator","create","setPrototypeOf","getPrototypeOf","__proto__","o","Reflect","construct","sham","Proxy","Boolean","valueOf","Function","indexOf","TypeError","enumerable","writable","configurable","ReferenceError","_nodes","out","undirected","h","p","defineProperty","f","isArray","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","concat","m","init","once","removeListener","U","on","EventEmitter","_events","_eventsCount","_maxListeners","G","defaultMaxListeners","newListener","emit","listener","unshift","warned","emitter","count","warn","E","fired","wrapFn","A","L","D","S","addEventListener","removeEventListener","N","RangeError","setMaxListeners","getMaxListeners","context","addListener","prependListener","prependOnceListener","shift","off","removeAllListeners","listeners","rawListeners","listenerCount","eventNames","of","empty","fromSequence","O","ARRAY_BUFFER_SUPPORT","ArrayBuffer","SYMBOL_SUPPORT","C","M","z","W","isView","R","K","T","B","captureStackTrace","F","I","Y","clear","J","V","H","_edges","inDegree","outDegree","undirectedDegree","undirectedLoops","directedLoops","in","attach","attachMulti","previous","detach","detachMulti","Q","attacher","hasOwnProperty","X","Z","$","tt","et","direction","nt","rt","sourceAttributes","targetAttributes","ot","at","ct","dt","ht","lt","wt","vt","bt","mt","wrap","kt","neighbor","xt","Et","At","Lt","St","Dt","Ut","Nt","allowSelfLoops","Ot","NodeDataClass","jt","_edgeKeyGenerator","_undirectedSelfLoopCount","_directedSelfLoopCount","_undirectedSize","_directedSize","Ct","Mt","zt","_resetInstanceCounters","hasNode","hasDirectedEdge","hasUndirectedEdge","hasEdge","directedEdge","undirectedEdge","areDirectedNeighbors","areOutNeighbors","areInNeighbors","areUndirectedNeighbors","areNeighbors","areInboundNeighbors","areOutboundNeighbors","directedDegree","inboundDegree","outboundDegree","degree","inDegreeWithoutSelfLoops","outDegreeWithoutSelfLoops","directedDegreeWithoutSelfLoops","undirectedDegreeWithoutSelfLoops","inboundDegreeWithoutSelfLoops","outboundDegreeWithoutSelfLoops","degreeWithoutSelfLoops","opposite","hasExtremity","isDirected","isSelfLoop","mergeNode","updateNode","dropEdge","dropDirectedEdge","dropUndirectedEdge","clearEdges","getAttribute","_attributes","getAttributes","hasAttribute","setAttribute","updateAttribute","removeAttribute","replaceAttributes","mergeAttributes","updateAttributes","hints","updateEachEdgeAttributes","forEachAdjacencyEntry","forEachAdjacencyEntryWithOrphans","forEachAssymetricAdjacencyEntry","forEachAssymetricAdjacencyEntryWithOrphans","from","findNode","mapNodes","someNode","everyNode","filterNodes","reduceNodes","nodeEntries","export","import","mergeUndirectedEdgeWithKey","mergeDirectedEdgeWithKey","addDirectedEdgeWithKey","mergeUndirectedEdge","mergeDirectedEdge","addUndirectedEdge","addDirectedEdge","nullCopy","emptyCopy","copy","toJSON","inspect","startsWith","for","generateKey","undirectedSize","directedSize","ut","pt","gt","toUpperCase","st","ft","yt","_t","Gt","Wt","Pt","Rt","Kt","Tt","Bt","Graph","DirectedGraph","UndirectedGraph","MultiGraph","MultiDirectedGraph","MultiUndirectedGraph","InvalidArgumentsGraphError","NotFoundGraphError","UsageGraphError","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","__webpack_exports__","chunkIds","priority","notFulfilled","__esModule","definition","chunkId","globalThis","obj","prop","scriptUrl","importScripts","location","document","currentScript","tagName","src","scripts","getElementsByTagName","test","replace","self","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""}
|