@datagrok/bio 2.10.12 → 2.10.14
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 +2 -1
- package/dist/361.js +2 -0
- package/dist/361.js.map +1 -0
- package/dist/381.js +2 -0
- package/dist/381.js.map +1 -0
- package/dist/440.js +2 -0
- package/dist/440.js.map +1 -0
- package/dist/452.js +1 -1
- package/dist/452.js.map +1 -1
- package/dist/868.js +2 -0
- package/dist/868.js.map +1 -0
- 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 +5 -4
- package/src/analysis/sequence-space.ts +34 -27
- package/src/package.ts +4 -2
- package/src/tests/mm-distance-tests.ts +1 -1
- package/src/viewers/web-logo-viewer.ts +20 -22
- package/dist/18.js +0 -2
- package/dist/18.js.map +0 -1
- package/dist/729.js +0 -2
- package/dist/729.js.map +0 -1
package/dist/440.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"440.js","mappings":"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","sources":["webpack://bio/webpack/runtime/chunk loaded","webpack://bio/webpack/runtime/startup chunk dependencies","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/consts.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/random.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/proxy.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/distance-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/spe.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/typed-metrics.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/reduce-dimensionality.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/distance-matrix.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/workers/dimensionality-reducer.js","webpack://bio/./node_modules/@keckelt/tsne/lib/index.js","webpack://bio/./node_modules/@keckelt/tsne/lib/tsne.js","webpack://bio/./node_modules/is-any-array/src/index.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/errorCalculation.js","webpack://bio/./node_modules/ml-matrix/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-max/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-min/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/lib-es6/index.js","webpack://bio/./node_modules/ml-array-min/lib-es6/index.js","webpack://bio/./node_modules/ml-array-max/lib-es6/index.js","webpack://bio/./node_modules/ml-matrix/src/inspect.js","webpack://bio/./node_modules/ml-matrix/src/util.js","webpack://bio/./node_modules/ml-matrix/src/matrix.js","webpack://bio/./node_modules/ml-matrix/src/stat.js","webpack://bio/./node_modules/ml-matrix/src/mathOperations.js","webpack://bio/./node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","webpack://bio/./node_modules/ml-matrix/src/dc/lu.js","webpack://bio/./node_modules/ml-matrix/src/dc/util.js","webpack://bio/./node_modules/ml-matrix/src/dc/qr.js","webpack://bio/./node_modules/ml-matrix/src/dc/svd.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/step.js","webpack://bio/./node_modules/ml-matrix/src/decompositions.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/index.js","webpack://bio/./node_modules/umap-js/dist/heap.js","webpack://bio/./node_modules/umap-js/dist/index.js","webpack://bio/./node_modules/umap-js/dist/matrix.js","webpack://bio/./node_modules/umap-js/dist/nn_descent.js","webpack://bio/./node_modules/umap-js/dist/tree.js","webpack://bio/./node_modules/umap-js/dist/umap.js","webpack://bio/./node_modules/umap-js/dist/utils.js","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/ensure chunk","webpack://bio/webpack/runtime/get javascript chunk filename","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/make namespace object","webpack://bio/webpack/runtime/publicPath","webpack://bio/webpack/runtime/importScripts chunk loading","webpack://bio/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([\n\t\t__webpack_require__.e(1),\n\t\t__webpack_require__.e(452)\n\t]).then(next);\n};","export var StringMetricsNames;\n(function (StringMetricsNames) {\n StringMetricsNames[\"Levenshtein\"] = \"Levenshtein\";\n StringMetricsNames[\"JaroWinkler\"] = \"Jaro-Winkler\";\n StringMetricsNames[\"Manhattan\"] = \"Manhattan\";\n})(StringMetricsNames || (StringMetricsNames = {}));\nexport var VectorMetricsNames;\n(function (VectorMetricsNames) {\n VectorMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(VectorMetricsNames || (VectorMetricsNames = {}));\nexport var BitArrayMetricsNames;\n(function (BitArrayMetricsNames) {\n BitArrayMetricsNames[\"Tanimoto\"] = \"Tanimoto\";\n BitArrayMetricsNames[\"Dice\"] = \"Dice\";\n BitArrayMetricsNames[\"Asymmetric\"] = \"Asymmetric\";\n BitArrayMetricsNames[\"BraunBlanquet\"] = \"Braun-Blanquet\";\n BitArrayMetricsNames[\"Cosine\"] = \"Cosine\";\n BitArrayMetricsNames[\"Kulczynski\"] = \"Kulczynski\";\n BitArrayMetricsNames[\"McConnaughey\"] = \"Mc-Connaughey\";\n BitArrayMetricsNames[\"RogotGoldberg\"] = \"Rogot-Goldberg\";\n BitArrayMetricsNames[\"Russel\"] = \"Russel\";\n BitArrayMetricsNames[\"Sokal\"] = \"Sokal\";\n BitArrayMetricsNames[\"Hamming\"] = \"Hamming\";\n BitArrayMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(BitArrayMetricsNames || (BitArrayMetricsNames = {}));\nexport var IntArrayMetricsNames;\n(function (IntArrayMetricsNames) {\n IntArrayMetricsNames[\"TanimotoIntArray\"] = \"TanimotoIntArray\";\n})(IntArrayMetricsNames || (IntArrayMetricsNames = {}));\nexport var DistanceMetricsSubjects;\n(function (DistanceMetricsSubjects) {\n DistanceMetricsSubjects[\"Vector\"] = \"Vector\";\n DistanceMetricsSubjects[\"String\"] = \"String\";\n DistanceMetricsSubjects[\"BitArray\"] = \"BitArray\";\n DistanceMetricsSubjects[\"MacroMolecule\"] = \"MacroMolecule\";\n DistanceMetricsSubjects[\"Number\"] = \"Number\";\n DistanceMetricsSubjects[\"IntArray\"] = \"IntArray\";\n})(DistanceMetricsSubjects || (DistanceMetricsSubjects = {}));\nexport var NumberMetricsNames;\n(function (NumberMetricsNames) {\n NumberMetricsNames[\"NumericDistance\"] = \"NumericDistance\";\n})(NumberMetricsNames || (NumberMetricsNames = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGtCQUlUO0FBSkgsV0FBWSxrQkFBa0I7SUFDMUIsaURBQTJCLENBQUE7SUFDM0Isa0RBQTRCLENBQUE7SUFDNUIsNkNBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUpTLGtCQUFrQixLQUFsQixrQkFBa0IsUUFJM0I7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFVDtBQUZILFdBQVksa0JBQWtCO0lBQzFCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFGUyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTNCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBYVQ7QUFiSCxXQUFZLG9CQUFvQjtJQUM1Qiw2Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBYSxDQUFBO0lBQ2IsaURBQXlCLENBQUE7SUFDekIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsaURBQXlCLENBQUE7SUFDekIsc0RBQThCLENBQUE7SUFDOUIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLDJDQUFtQixDQUFBO0lBQ25CLCtDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFiUyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBYTdCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBRVg7QUFGRCxXQUFZLG9CQUFvQjtJQUM5Qiw2REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBRlcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUUvQjtBQUVELE1BQU0sQ0FBTixJQUFZLHVCQU9UO0FBUEgsV0FBWSx1QkFBdUI7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7SUFDckIsMERBQStCLENBQUE7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVBTLHVCQUF1QixLQUF2Qix1QkFBdUIsUUFPaEM7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFWDtBQUZELFdBQVksa0JBQWtCO0lBQzVCLHlEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUFGVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gU3RyaW5nTWV0cmljc05hbWVzIHtcbiAgICBMZXZlbnNodGVpbiA9ICdMZXZlbnNodGVpbicsXG4gICAgSmFyb1dpbmtsZXIgPSAnSmFyby1XaW5rbGVyJyxcbiAgICBNYW5oYXR0YW4gPSAnTWFuaGF0dGFuJyxcbiAgfVxuXG5leHBvcnQgZW51bSBWZWN0b3JNZXRyaWNzTmFtZXMge1xuICAgIEV1Y2xpZGVhbiA9ICdFdWNsaWRlYW4nLFxuICB9XG5cbmV4cG9ydCBlbnVtIEJpdEFycmF5TWV0cmljc05hbWVzIHtcbiAgICBUYW5pbW90byA9ICdUYW5pbW90bycsXG4gICAgRGljZSA9ICdEaWNlJyxcbiAgICBBc3ltbWV0cmljID0gJ0FzeW1tZXRyaWMnLFxuICAgIEJyYXVuQmxhbnF1ZXQgPSAnQnJhdW4tQmxhbnF1ZXQnLFxuICAgIENvc2luZSA9ICdDb3NpbmUnLFxuICAgIEt1bGN6eW5za2kgPSAnS3VsY3p5bnNraScsXG4gICAgTWNDb25uYXVnaGV5ID0gJ01jLUNvbm5hdWdoZXknLFxuICAgIFJvZ290R29sZGJlcmcgPSAnUm9nb3QtR29sZGJlcmcnLFxuICAgIFJ1c3NlbCA9ICdSdXNzZWwnLFxuICAgIFNva2FsID0gJ1Nva2FsJyxcbiAgICBIYW1taW5nID0gJ0hhbW1pbmcnLFxuICAgIEV1Y2xpZGVhbiA9ICdFdWNsaWRlYW4nLFxuICB9XG5cbmV4cG9ydCBlbnVtIEludEFycmF5TWV0cmljc05hbWVzIHtcbiAgVGFuaW1vdG9JbnRBcnJheSA9ICdUYW5pbW90b0ludEFycmF5Jyxcbn1cblxuZXhwb3J0IGVudW0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMge1xuICAgIFZlY3RvciA9ICdWZWN0b3InLFxuICAgIFN0cmluZyA9ICdTdHJpbmcnLFxuICAgIEJpdEFycmF5ID0gJ0JpdEFycmF5JyxcbiAgICBNYWNyb01vbGVjdWxlID0gJ01hY3JvTW9sZWN1bGUnLFxuICAgIE51bWJlciA9ICdOdW1iZXInLFxuICAgIEludEFycmF5ID0gJ0ludEFycmF5JyxcbiAgfVxuXG5leHBvcnQgZW51bSBOdW1iZXJNZXRyaWNzTmFtZXMge1xuICBOdW1lcmljRGlzdGFuY2UgPSAnTnVtZXJpY0Rpc3RhbmNlJyxcbn1cblxuIl19","/**\n * Generates single random float from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random float generated.\n */\nexport function randomFloat(range) {\n return Math.random() * range;\n}\n/**\n * Generates single random integer from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random integer generated.\n */\nexport function randomInt(range) {\n return Math.floor(randomFloat(range));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gZmxvYXQgZnJvbSAwIHRvIHJhbmdlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSBNYXggZ2VuZXJhdGluZyB2YWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQgZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tRmxvYXQocmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogcmFuZ2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tRmxvYXQocmFuZ2UpKTtcbn1cbiJdfQ==","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nfunction initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcNormalizedDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n let max = Number.MIN_VALUE;\n let min = Number.MAX_VALUE;\n for (let i = 0; i < nItems; ++i) {\n for (let j = i; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null || i === j) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n if (d > max)\n max = d;\n if (d < min)\n min = d;\n }\n }\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j)\n matrix[i][j] = matrix[j][i] = (matrix[i][j] - min) / (max - min);\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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QUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01hdHJpeCwgVmVjdG9yLCBDb29yZGluYXRlcywgVmVjdG9ycywgRGlzdGFuY2VNZXRyaWN9IGZyb20gJy4vdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtyYW5kb21GbG9hdCwgcmFuZG9tSW50fSBmcm9tICcuL3JhbmRvbSc7XG5cbi8qKlxuICogQXNzZXJ0cyBhIGNvbmRpdGlvbiBieSB0aHJvd2luZyBhbiBFcnJvci5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25kaXRpb249ZmFsc2VdIENvbmRpdGlvbiB0byBhc3NlcnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9J0Fzc2VydGlvbiBlcnJvci4nXSBNZXNzYWdlIHRvIG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBtZXNzYWdlOiBzdHJpbmcgPSAnQXNzZXJ0aW9uIGVycm9yLicpIHtcbiAgaWYgKCFjb25kaXRpb24pXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgbmV3IHR3by1kaW1lbnNpb25hbCBhcnJheSBhbmQgZmlsbHMgaXQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjEgVGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiByb3dzKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24yIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIGNvbHVtbnMpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsPTBdIEEgdmFsdWUgdG8gZmlsbCB0aGUgY29vcmRpbmF0ZXMgd2l0aC5cbiAqIEByZXR1cm4ge0Nvb3JkaW5hdGVzfSBBIHR3by1kaW1lbnNpb25hbCBmaWxsZWQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKiBAdG9kbyBNaWdodCBiZSBzbG93IHNpbmNlIHVzZWQgQXJyYXkubWFwLiBQcm9iYWJseSBuZWVkcyBwZXJmb3JtYW5jZSByZXZpc2lvbi5cbiAqL1xuZnVuY3Rpb24gaW5pdENvb3JkaW5hdGVzKGRpbWVuc2lvbjE6IG51bWJlciwgZGltZW5zaW9uMjogbnVtYmVyLCBmaWxsOiBudW1iZXIgPSAwKTogQ29vcmRpbmF0ZXMge1xuICByZXR1cm4gbmV3IEFycmF5KGRpbWVuc2lvbjEpLmZpbGwoZmlsbCkubWFwKCgpID0+IChuZXcgVmVjdG9yKGRpbWVuc2lvbjIpLmZpbGwoZmlsbCkpKTtcbn1cblxuLyoqXG4gKiBUcmFuc3Bvc2UgbWF0cml4LlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7TWF0cml4fSBtYXRyaXggVGhlIG1hdHJpeCB0byBiZSB0cmFuc3Bvc2VkLlxuICogQHJldHVybiB7TWF0cml4fSBUcmFuc3Bvc2VkIG1hdHJpeC5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlTWF0cml4KG1hdHJpeDogTWF0cml4KTogTWF0cml4IHtcbiAgcmV0dXJuIG5ldyBBcnJheShtYXRyaXhbMF0ubGVuZ3RoKS5maWxsKDApXG4gICAgLm1hcCgoXywgaSkgPT4gKG5ldyBWZWN0b3IobWF0cml4Lmxlbmd0aCkuZmlsbCgwKS5tYXAoKF8sIGopID0+IChtYXRyaXhbal1baV0pKSkpO1xufVxuXG4vKipcbiAqIEFkZHMgdHdvIHZlY3RvcnMgd2l0aCB0aGUgc2Vjb25kIG9uZSB0byBiZSBtdWx0aXBsaWVkIGJ5IHRoZSBnaXZlbiByYXRpby5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yIHRvIGFkZC5cbiAqIEBwYXJhbSB7VmVjdG9yfSBxIFRoZSBzZWNvbmQgdmVjdG9yIHRvIGFkZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbXVsdGlwbGllcj0xXSBBIG11bHRpcGxpZXIgdG8gYmUgdXNlZCBiZWZvcmUgdGhlIHNlY29uZCB2ZWN0b3IgaXMgYWRkZWQuXG4gKiBAcmV0dXJuIHtWZWN0b3J9IE5ldyB2ZWN0b3IgY29udGFpbmVkIHRoZSByZXN1bHQgb2Ygb3BlcmF0aW9uIHArbXVsdGlwbGllcipxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVjdG9yQWRkKHA6IFZlY3RvciwgcTogVmVjdG9yLCBtdWx0aXBsaWVyOiBudW1iZXIgPSAxKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gcC5sZW5ndGg7XG5cbiAgYXNzZXJ0KG5JdGVtcyA9PSBxLmxlbmd0aCwgJ1ZlY3RvciBsZW5ndGhzIGRvIG5vdCBtYXRjaC4nKTtcblxuICBjb25zdCB0b3RhbCA9IG5ldyBWZWN0b3Iobkl0ZW1zKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyArK2kpXG4gICAgdG90YWxbaV0gPSBwW2ldICsgbXVsdGlwbGllciAqIHFbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1bXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gYmUgc3VtbWVkLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVjdG9yJ3MgaXRlbXMgc3VtLlxuICovXG5mdW5jdGlvbiBpdGVtc1N1bSh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgdG90YWwgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbCArPSB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuLyoqXG4gKiBTdXFhcmVzIHRoZSB2ZWN0b3IncyBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gdiBUaGUgdmVjdG9yIHRvIHNxdWFyZS5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gQSBuZXcgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsJ3MgaXRlbXMgc3F1YXJlZC5cbiAqL1xuZnVuY3Rpb24gdmVjdG9yU3F1YXJlKHY6IFZlY3Rvcik6IFZlY3RvciB7XG4gIGNvbnN0IG5JdGVtcyA9IHYubGVuZ3RoO1xuICBjb25zdCB0b3RhbCA9IG5ldyBWZWN0b3Iobkl0ZW1zKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHYubGVuZ3RoOyArK2kpXG4gICAgdG90YWxbaV0gPSB2W2ldICogdltpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JMZW5ndGgodjogVmVjdG9yKTogbnVtYmVyIHtcbiAgbGV0IHNxclN1bTogbnVtYmVyID0gMDtcbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspXG4gICAgc3FyU3VtICs9IHZbaV0gKiB2W2ldO1xuICByZXR1cm4gTWF0aC5zcXJ0KHNxclN1bSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JEb3RQcm9kdWN0KHYxOiBWZWN0b3IsIHYyOiBWZWN0b3IpOiBudW1iZXIge1xuICBpZiAodjEubGVuZ3RoICE9IHYyLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkaW1lbnNpb25hbGl0eSBvZiB0aGUgdmVjdG9ycyBtdXN0IG1hdGNoJyk7XG4gIGxldCBwcm9kOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspXG4gICAgcHJvZCArPSB2MVtpXSAqIHYyW2ldO1xuICByZXR1cm4gcHJvZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZpbGxlZCB3aXRoIHJhbmRvbSBmbG9hdGluZyBwb2ludCB2YWx1ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjEgVGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIG1hdHJpeC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2NhbGU9MS5dIE1heCB2YWx1ZSBnaXZlbiBieSByYW5kb20gZ2VuZXJhdG9yLlxuICogQHJldHVybiB7TWF0cml4fSBBIG5ldyBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50ICB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUmFuZG9tTWF0cml4KGRpbWVuc2lvbjE6IG51bWJlciwgZGltZW5zaW9uMjogbnVtYmVyLCBzY2FsZTogbnVtYmVyID0gMS4pOiBNYXRyaXgge1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMSwgZGltZW5zaW9uMik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW1lbnNpb24xOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRpbWVuc2lvbjI7ICsrailcbiAgICAgIG1hdHJpeFtpXVtqXSA9IHJhbmRvbUZsb2F0KHNjYWxlKTtcbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IHAgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7VmVjdG9yfSBxIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlKHA6IFZlY3RvciwgcTogVmVjdG9yKTogbnVtYmVyIHtcbiAgY29uc3QgZGlmZiA9IHZlY3RvckFkZChwLCBxLCAtMSk7XG4gIGNvbnN0IHNxZGlmZiA9IHZlY3RvclNxdWFyZShkaWZmKTtcbiAgY29uc3Qgc3FkaWZmU3VtbSA9IGl0ZW1zU3VtKHNxZGlmZik7XG4gIHJldHVybiBNYXRoLnNxcnQoc3FkaWZmU3VtbSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3RhbmNlIG1hdHJpeCB1c2luZyBhIGN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3RvcnN9IGRhdGEgSW5wdXQgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzLlxuICogQHBhcmFtIHtEaXN0YW5jZU1ldHJpY30gZGlzdGFuY2UgQ3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICogQHJldHVybiB7TWF0cml4fSBDYWxjdWxhdGVkIGN1c3RvbSBkaXN0YW5jZSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjRGlzdGFuY2VNYXRyaXgoZGF0YTogVmVjdG9ycywgZGlzdGFuY2U6IERpc3RhbmNlTWV0cmljKTogTWF0cml4IHtcbiAgY29uc3Qgbkl0ZW1zID0gZGF0YS5sZW5ndGg7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhuSXRlbXMsIG5JdGVtcywgMCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSkge1xuICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICBjb25zdCBkOiBudW1iZXIgPSAoZGF0YVtpXSA9PSBudWxsKSB8fCAoZGF0YVtqXSA9PSBudWxsKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3RhbmNlIG1hdHJpeCB1c2luZyBhIGN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3RvcnN9IGRhdGEgSW5wdXQgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzLlxuICogQHBhcmFtIHtEaXN0YW5jZU1ldHJpY30gZGlzdGFuY2UgQ3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICogQHJldHVybiB7TWF0cml4fSBDYWxjdWxhdGVkIGN1c3RvbSBkaXN0YW5jZSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjTm9ybWFsaXplZERpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuICBsZXQgbWF4ID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgbGV0IG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICBjb25zdCBkOiBudW1iZXIgPSAoZGF0YVtpXSA9PSBudWxsKSB8fCAoZGF0YVtqXSA9PSBudWxsIHx8IGkgPT09IGopID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICAgIGlmIChkID4gbWF4KSBtYXggPSBkO1xuICAgICAgaWYgKGQgPCBtaW4pIG1pbiA9IGQ7XG4gICAgfVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsrailcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IChtYXRyaXhbaV1bal0gLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","/** Proxy for DistanceMatrix class. Allows to index matrix as matrix[i][j]\n * Note: much slower than direct indexing, but still much faster than recalculating distances.\n * will be used for T-SNE mainly.\n * @param {Float32Array}condensedArray - array of distances between all pairs of objects\n * @param {number}size - number of comparebles in matrix\n * @return {Float32Array} - proxy for condensedArray\n*/\nexport function distanceMatrixProxy(condensedArray, size) {\n const linearFunc = dmLinearIndex(size);\n function linearIndex(i, j) {\n const iNum = Number(i);\n const jNum = Number(j);\n return linearFunc(iNum, jNum);\n }\n function idx2Handler(idx1) {\n return ({\n get(target, idx2, _receiver) {\n if (idx1 === idx2)\n return 0;\n const linearIdx = Number(idx1) > Number(idx2) ? linearIndex(idx2, idx1) : linearIndex(idx1, idx2);\n return target[linearIdx];\n },\n });\n }\n const idx1Handler = {\n get(target, idx1, _receiver) {\n if (idx1 === 'length')\n return size;\n return new Proxy(target, idx2Handler(idx1));\n },\n };\n return new Proxy(condensedArray, idx1Handler);\n}\nexport function dmLinearIndex(size) {\n return (i, j) => size * i + j - Math.floor(((i + 2) * (i + 1)) / 2);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0VBTUU7QUFDRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsY0FBNEIsRUFBRSxJQUFZO0lBQzVFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxTQUFTLFdBQVcsQ0FBQyxDQUFrQixFQUFFLENBQWtCO1FBQ3pELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFxQjtRQUN4QyxPQUFPLENBQ0w7WUFDRSxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTO2dCQUN6QixJQUFJLElBQUksS0FBSyxJQUFJO29CQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsRyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixDQUFDO1NBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sV0FBVyxHQUErQjtRQUM5QyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTO1lBQ3pCLElBQUksSUFBSSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDbkMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbi8qKiBQcm94eSBmb3IgRGlzdGFuY2VNYXRyaXggY2xhc3MuIEFsbG93cyB0byBpbmRleCBtYXRyaXggYXMgbWF0cml4W2ldW2pdXG4gKiBOb3RlOiBtdWNoIHNsb3dlciB0aGFuIGRpcmVjdCBpbmRleGluZywgYnV0IHN0aWxsIG11Y2ggZmFzdGVyIHRoYW4gcmVjYWxjdWxhdGluZyBkaXN0YW5jZXMuXG4gKiB3aWxsIGJlIHVzZWQgZm9yIFQtU05FIG1haW5seS5cbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fWNvbmRlbnNlZEFycmF5IC0gYXJyYXkgb2YgZGlzdGFuY2VzIGJldHdlZW4gYWxsIHBhaXJzIG9mIG9iamVjdHNcbiAqIEBwYXJhbSB7bnVtYmVyfXNpemUgLSBudW1iZXIgb2YgY29tcGFyZWJsZXMgaW4gbWF0cml4XG4gKiBAcmV0dXJuIHtGbG9hdDMyQXJyYXl9IC0gcHJveHkgZm9yIGNvbmRlbnNlZEFycmF5XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlTWF0cml4UHJveHkoY29uZGVuc2VkQXJyYXk6IEZsb2F0MzJBcnJheSwgc2l6ZTogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbGluZWFyRnVuYyA9IGRtTGluZWFySW5kZXgoc2l6ZSk7XG4gIGZ1bmN0aW9uIGxpbmVhckluZGV4KGk6IHN5bWJvbCB8IHN0cmluZywgajogc3ltYm9sIHwgc3RyaW5nKSB7XG4gICAgY29uc3QgaU51bSA9IE51bWJlcihpKTtcbiAgICBjb25zdCBqTnVtID0gTnVtYmVyKGopO1xuICAgIHJldHVybiBsaW5lYXJGdW5jKGlOdW0sIGpOdW0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaWR4MkhhbmRsZXIoaWR4MTogc3ltYm9sIHwgc3RyaW5nKTpQcm94eUhhbmRsZXI8RmxvYXQzMkFycmF5PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgaWR4MiwgX3JlY2VpdmVyKSB7XG4gICAgICAgICAgaWYgKGlkeDEgPT09IGlkeDIpIHJldHVybiAwO1xuICAgICAgICAgIGNvbnN0IGxpbmVhcklkeCA9IE51bWJlcihpZHgxKSA+IE51bWJlcihpZHgyKSA/IGxpbmVhckluZGV4KGlkeDIsIGlkeDEpIDogbGluZWFySW5kZXgoaWR4MSwgaWR4Mik7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtsaW5lYXJJZHhdO1xuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgY29uc3QgaWR4MUhhbmRsZXI6IFByb3h5SGFuZGxlcjxGbG9hdDMyQXJyYXk+ID0ge1xuICAgIGdldCh0YXJnZXQsIGlkeDEsIF9yZWNlaXZlcikge1xuICAgICAgaWYgKGlkeDEgPT09ICdsZW5ndGgnKSByZXR1cm4gc2l6ZTtcbiAgICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBpZHgySGFuZGxlcihpZHgxKSk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb3h5KGNvbmRlbnNlZEFycmF5LCBpZHgxSGFuZGxlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkbUxpbmVhckluZGV4KHNpemU6IG51bWJlcik6IChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gbnVtYmVyIHtcbiAgcmV0dXJuIChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gc2l6ZSAqIGkgKyBqIC0gTWF0aC5mbG9vcigoKGkgKyAyKSAqIChpICsgMSkpIC8gMik7XG59XG4iXX0=","export class DistanceMatrixService {\n constructor(useConcurrentWorkers = true, terminateOnComplete = true) {\n const threadCount = navigator.hardwareConcurrency;\n this._workerCount = useConcurrentWorkers ? Math.max(threadCount - 2, 1) : 1;\n this._workers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./distance-matrix-worker', import.meta.url)));\n this._terminateOnComplete = terminateOnComplete;\n }\n ;\n async calc(values, fnName, normalize = true) {\n return new Promise(async (resolve, reject) => {\n try {\n const len = values.length;\n const promises = new Array(this._workerCount);\n const totalLength = len * (len - 1) / 2; // size of reduced distance matrix\n this._workerCount = Math.min(this._workerCount, totalLength);\n const chunkSize = totalLength / this._workerCount;\n const distanceMatrix = new Float32Array(totalLength);\n let endRow = 0;\n let endCol = 1;\n // minmax for normalization\n let lmin = 0;\n let lmax = Number.MIN_VALUE;\n for (let i = 0; i < this._workerCount; i++) {\n const start = Math.floor(i * chunkSize);\n const end = (i === this._workerCount - 1) ? totalLength : Math.floor((i + 1) * chunkSize);\n const startRow = endRow;\n const startCol = endCol;\n if (i !== this._workerCount - 1) {\n // These formulas map the linear index to the upper triangular matrix indices\n endRow = len - 2 - Math.floor(Math.sqrt(-8 * end + 4 * len * (len - 1) - 7) / 2 - 0.5);\n endCol = end - len * endRow + Math.floor((endRow + 1) * (endRow + 2) / 2);\n }\n this._workers[i].postMessage({ values, fnName, startRow, startCol, chunckSize: end - start });\n promises[i] = new Promise((resolveWorker, rejectWorker) => {\n this._workers[i].onmessage = ({ data: { error, distanceMatrixData, min, max } }) => {\n this._terminateOnComplete && this._workers[i].terminate();\n if (error) {\n rejectWorker(error);\n }\n else {\n distanceMatrix.set(distanceMatrixData, start);\n if (min < lmin)\n lmin = min;\n if (max > lmax)\n lmax = max;\n resolveWorker();\n }\n };\n });\n }\n await Promise.all(promises);\n if (normalize)\n distanceMatrix.forEach((value, index) => { distanceMatrix[index] = (value - lmin) / (lmax - lmin); });\n resolve(distanceMatrix);\n }\n catch (e) {\n reject(e);\n }\n });\n }\n terminate() {\n this._workers.forEach((worker) => worker.terminate());\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaXN0YW5jZS1tYXRyaXgtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8scUJBQXFCO0lBSTlCLFlBQW1CLG9CQUFvQixHQUFHLElBQUksRUFBRSxtQkFBbUIsR0FBRyxJQUFJO1FBQ3hFLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztRQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ3BELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUM7SUFDbEQsQ0FBQztJQUFBLENBQUM7SUFFSyxLQUFLLENBQUMsSUFBSSxDQUFJLE1BQStCLEVBQUUsTUFBb0IsRUFDeEUsU0FBUyxHQUFHLElBQUk7UUFDaEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNDLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQWdCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxXQUFXLEdBQUcsR0FBRyxH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STtvQ0FDWixJQUFJLEdBQUcsR0FBRyxDQUFDO2dDQUNiLGFBQWEsRUFBRSxDQUFDOzZCQUNqQjt3QkFDSCxDQUFDLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLFNBQVM7b0JBQ1gsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDekI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDWDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtLbm93bk1ldHJpY3N9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuXG5leHBvcnQgY2xhc3MgRGlzdGFuY2VNYXRyaXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF93b3JrZXJzOiBXb3JrZXJbXTtcbiAgICBwcml2YXRlIF93b3JrZXJDb3VudDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3Rlcm1pbmF0ZU9uQ29tcGxldGU6IGJvb2xlYW47XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHVzZUNvbmN1cnJlbnRXb3JrZXJzID0gdHJ1ZSwgdGVybWluYXRlT25Db21wbGV0ZSA9IHRydWUpIHtcbiAgICAgIGNvbnN0IHRocmVhZENvdW50ID0gbmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k7XG4gICAgICB0aGlzLl93b3JrZXJDb3VudCA9IHVzZUNvbmN1cnJlbnRXb3JrZXJzID8gTWF0aC5tYXgodGhyZWFkQ291bnQgLSAyLCAxKSA6IDE7XG4gICAgICB0aGlzLl93b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KS5maWxsKG51bGwpXG4gICAgICAgIC5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL2Rpc3RhbmNlLW1hdHJpeC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICB0aGlzLl90ZXJtaW5hdGVPbkNvbXBsZXRlID0gdGVybWluYXRlT25Db21wbGV0ZTtcbiAgICB9O1xuXG4gICAgcHVibGljIGFzeW5jIGNhbGM8VD4odmFsdWVzOiBBcnJheTxUPiB8IEFycmF5TGlrZTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsXG4gICAgICBub3JtYWxpemUgPSB0cnVlKTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGVuID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IG5ldyBBcnJheTxQcm9taXNlPHZvaWQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgICAgY29uc3QgdG90YWxMZW5ndGggPSBsZW4gKiAobGVuIC0gMSkgLyAyOyAvLyBzaXplIG9mIHJlZHVjZWQgZGlzdGFuY2UgbWF0cml4XG4gICAgICAgICAgdGhpcy5fd29ya2VyQ291bnQgPSBNYXRoLm1pbih0aGlzLl93b3JrZXJDb3VudCwgdG90YWxMZW5ndGgpO1xuICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRvdGFsTGVuZ3RoIC8gdGhpcy5fd29ya2VyQ291bnQ7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgICBsZXQgZW5kUm93ID0gMDtcbiAgICAgICAgICBsZXQgZW5kQ29sID0gMTtcbiAgICAgICAgICAvLyBtaW5tYXggZm9yIG5vcm1hbGl6YXRpb25cbiAgICAgICAgICBsZXQgbG1pbiA9IDA7XG4gICAgICAgICAgbGV0IGxtYXggPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fd29ya2VyQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKGkgKiBjaHVua1NpemUpO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gKGkgPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSkgPyB0b3RhbExlbmd0aCA6IE1hdGguZmxvb3IoKGkgKyAxKSAqIGNodW5rU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFJvdyA9IGVuZFJvdztcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29sID0gZW5kQ29sO1xuICAgICAgICAgICAgaWYgKGkgIT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSkge1xuICAgICAgICAgICAgICAvLyBUaGVzZSBmb3JtdWxhcyBtYXAgdGhlIGxpbmVhciBpbmRleCB0byB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXggaW5kaWNlc1xuICAgICAgICAgICAgICBlbmRSb3cgPSBsZW4gLSAyIC0gTWF0aC5mbG9vcihNYXRoLnNxcnQoLTggKiBlbmQgKyA0ICogbGVuICogKGxlbiAtIDEpIC0gNykgLyAyIC0gMC41KTtcbiAgICAgICAgICAgICAgZW5kQ29sID0gZW5kIC0gbGVuICogZW5kUm93ICsgTWF0aC5mbG9vcigoZW5kUm93ICsgMSkgKiAoZW5kUm93ICsgMikgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3dvcmtlcnNbaV0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgZm5OYW1lLCBzdGFydFJvdywgc3RhcnRDb2wsIGNodW5ja1NpemU6IGVuZCAtIHN0YXJ0fSk7XG4gICAgICAgICAgICBwcm9taXNlc1tpXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fd29ya2Vyc1tpXS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgZGlzdGFuY2VNYXRyaXhEYXRhLCBtaW4sIG1heH19KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYXRlT25Db21wbGV0ZSAmJiB0aGlzLl93b3JrZXJzW2ldLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGlzdGFuY2VNYXRyaXguc2V0KGRpc3RhbmNlTWF0cml4RGF0YSwgc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgaWYgKG1pbiA8IGxtaW4pXG4gICAgICAgICAgICAgICAgICAgIGxtaW4gPSBtaW47XG4gICAgICAgICAgICAgICAgICBpZiAobWF4ID4gbG1heClcbiAgICAgICAgICAgICAgICAgICAgbG1heCA9IG1heDtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICAgIGlmIChub3JtYWxpemUpXG4gICAgICAgICAgICBkaXN0YW5jZU1hdHJpeC5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHsgZGlzdGFuY2VNYXRyaXhbaW5kZXhdID0gKHZhbHVlIC0gbG1pbikgLyAobG1heCAtIGxtaW4pOyB9KTtcbiAgICAgICAgICByZXNvbHZlKGRpc3RhbmNlTWF0cml4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRlcm1pbmF0ZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3dvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB3b3JrZXIudGVybWluYXRlKCkpO1xuICAgIH1cbn1cbiJdfQ==","import { calculateEuclideanDistance, fillRandomMatrix, vectorAdd, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { randomInt } from '@datagrok-libraries/utils/src/random';\nimport { DistanceMatrixService, dmLinearIndex } from './distance-matrix';\n/**\n * Implements stochastic proximity embedding.\n *\n * @export\n * @class SPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nclass SPEBase {\n /**\n * Creates an instance of SPEBase.\n * @param {Options} [options] Options to pass to the constructor.\n * @memberof SPEBase\n */\n constructor(options) {\n this.steps = options?.steps ?? 0;\n this.cycles = options?.cycles ?? 1e6;\n // Select a cutoff distance {cutoff} and ...\n this.cutoff = options?.cutoff ?? 0;\n // ... an initial learning rate {lambda} > 0\n this.lambda = options?.lambda ?? 2.0;\n this.dlambda = options?.dlambda ?? 0.01;\n this.lambda2 = this.lambda / 2.;\n this.dlambda2 = this.dlambda / 2.;\n this.epsilon = options?.epsilon ?? 1e-10;\n // eslint-disable-next-line brace-style\n this.distanceFunction = options?.distance ?? calculateEuclideanDistance;\n this.distance = new Float32Array();\n this.distanceFunctionName = options?.distanceFunctionName;\n }\n /**\n * Initializes distance matrix.\n *\n * @param {Vectors} vectors Input vectors to calculate distance between.\n * @memberof SPEBase\n */\n async initDistance(vectors) {\n this.dmIndexFunct = dmLinearIndex(vectors.length);\n const matrixService = new DistanceMatrixService(true, false);\n this.distance = await matrixService.calc(vectors, this.distanceFunctionName);\n matrixService.terminate();\n }\n /**\n * Calculates distance between the two vectors given.\n *\n * @param {Vectors} vectors Set of vectors to calculate distances between.\n * @param {number} index1 Index of the first vector of the pair.\n * @param {number} index2 Index of the second vector of the pair.\n * @return {number} Distance between these two vectors.\n */\n calcDistance(vectors, index1, index2) {\n return this.distance[this.dmIndexFunct(index1, index2)];\n }\n /**\n * Embeds the vectors given into a two-dimensional space.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n async embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, SPEBase.dimension, areaWidth);\n let lambda2 = this.lambda2;\n if (this.steps === 0)\n this.steps = vectors.length - 1;\n await this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // ... compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda2 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda2 -= this.dlambda2;\n if (lambda2 <= 0.)\n break;\n }\n return coordinates;\n }\n}\nSPEBase.dimension = 2;\nexport { SPEBase };\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class PSPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nexport class PSPEBase extends SPEBase {\n /**\n * Embeds the vectors given into a two-dimensional space using a modified update rule.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n async embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, PSPEBase.dimension, areaWidth);\n let lambda = this.lambda;\n await this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n // Select a point, i, at random (pivot).\n const i = randomInt(nItems);\n const rowi = coordinates[i];\n // For every point j != i ...\n for (let j = 0; j < nItems; ++j) {\n if (i == j)\n continue;\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) its proximity to i in the input space, rij ...\n const r = this.calcDistance(vectors, i, j);\n // ... and compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda * (r - d) / (d + this.epsilon);\n const diffIJ = vectorAdd(rowi, rowj, -1);\n // ... update the coordinates xj.\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda -= this.dlambda;\n if (lambda <= 0.)\n break;\n }\n return coordinates;\n }\n}\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class OriginalSPE\n * @link doi:10.1002/jcc.10234\n */\nexport class OriginalSPE extends SPEBase {\n constructor(options) {\n super(options);\n this.cycles = options?.cycles ?? 1e3;\n this.steps = options?.steps ?? 100000;\n this.radiusPercent = options?.radiusPercent ?? 1.0;\n this.maxDistance = options?.maxDistance ?? null;\n this.maxDistanceSteps = options?.maxDistanceSteps ?? null;\n }\n async embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, OriginalSPE.dimension, areaWidth);\n await this.initDistance(vectors);\n if (this.maxDistanceSteps === null)\n this.maxDistanceSteps = nItems * Math.floor((nItems - 1) / 2);\n if (this.maxDistance === null) {\n this.maxDistance = -1e37;\n for (let n = 0; n < this.maxDistanceSteps; n++) {\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const d = this.calcDistance(vectors, i, j);\n if (d > this.maxDistance)\n this.maxDistance = d;\n }\n }\n let lambda = this.lambda;\n const radius = (this.radiusPercent == 0.0) ? this.maxDistance : this.maxDistance * this.radiusPercent;\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n if ((r <= radius) || (d < r)) {\n const multiplier = lambda * 0.5 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n lambda -= ((this.lambda - this.dlambda) / (this.cycles - 1.0));\n ;\n if (lambda < this.dlambda)\n break;\n }\n return coordinates;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsZ0JBQWdCLEVBQ2hCLFNBQVMsR0FDVixNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFdkU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxPQUFPO0lBZWxCOzs7O09BSUc7SUFDSCxZQUFZLE9BQWlCO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLEdBQUcsQ0FBQztRQUNyQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNuQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLEdBQUcsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO1FBQ3pDLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxFQUFFLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQztRQUN4RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxF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IFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZSxcbiAgZmlsbFJhbmRvbU1hdHJpeCxcbiAgdmVjdG9yQWRkLFxufSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUludH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvcmFuZG9tJztcbmltcG9ydCB7S25vd25NZXRyaWNzfSBmcm9tICcuL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtEaXN0YW5jZU1hdHJpeFNlcnZpY2UsIGRtTGluZWFySW5kZXh9IGZyb20gJy4vZGlzdGFuY2UtbWF0cml4JztcblxuLyoqXG4gKiBJbXBsZW1lbnRzIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU1BFQmFzZVxuICogQGxpbmsgZG9pOjEwLjEwMTYvUzEwOTMtMzI2MygwMykwMDE1NS00XG4gKi9cbmV4cG9ydCBjbGFzcyBTUEVCYXNlIHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBkaW1lbnNpb24gPSAyO1xuICBwcm90ZWN0ZWQgc3RlcHM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGN5Y2xlczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgY3V0b2ZmOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsYW1iZGE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRsYW1iZGE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGxhbWJkYTI6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRsYW1iZGEyOiBudW1iZXI7XG4gIHByb3RlY3RlZCBlcHNpbG9uOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkaXN0YW5jZUZ1bmN0aW9uOiBEaXN0YW5jZU1ldHJpYztcbiAgcHJvdGVjdGVkIGRpc3RhbmNlRnVuY3Rpb25OYW1lOiBLbm93bk1ldHJpY3M7XG4gIGRpc3RhbmNlOiBGbG9hdDMyQXJyYXk7XG4gIHByb3RlY3RlZCBkbUluZGV4RnVuY3Q/OiAoaTogbnVtYmVyLCBqOiBudW1iZXIpID0+IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTUEVCYXNlLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFQmFzZVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICB0aGlzLnN0ZXBzID0gb3B0aW9ucz8uc3RlcHMgPz8gMDtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTY7XG4gICAgLy8gU2VsZWN0IGEgY3V0b2ZmIGRpc3RhbmNlIHtjdXRvZmZ9IGFuZCAuLi5cbiAgICB0aGlzLmN1dG9mZiA9IG9wdGlvbnM/LmN1dG9mZiA/PyAwO1xuICAgIC8vIC4uLiBhbiBpbml0aWFsIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gPiAwXG4gICAgdGhpcy5sYW1iZGEgPSBvcHRpb25zPy5sYW1iZGEgPz8gMi4wO1xuICAgIHRoaXMuZGxhbWJkYSA9IG9wdGlvbnM/LmRsYW1iZGEgPz8gMC4wMTtcbiAgICB0aGlzLmxhbWJkYTIgPSB0aGlzLmxhbWJkYSAvIDIuO1xuICAgIHRoaXMuZGxhbWJkYTIgPSB0aGlzLmRsYW1iZGEgLyAyLjtcbiAgICB0aGlzLmVwc2lsb24gPSBvcHRpb25zPy5lcHNpbG9uID8/IDFlLTEwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBicmFjZS1zdHlsZVxuICAgIHRoaXMuZGlzdGFuY2VGdW5jdGlvbiA9IG9wdGlvbnM/LmRpc3RhbmNlID8/IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlO1xuICAgIHRoaXMuZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KCk7XG4gICAgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uTmFtZSA9IG9wdGlvbnM/LmRpc3RhbmNlRnVuY3Rpb25OYW1lITtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBkaXN0YW5jZSBtYXRyaXguXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuLlxuICAgKiBAbWVtYmVyb2YgU1BFQmFzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXREaXN0YW5jZSh2ZWN0b3JzOiBWZWN0b3JzKSB7XG4gICAgdGhpcy5kbUluZGV4RnVuY3QgPSBkbUxpbmVhckluZGV4KHZlY3RvcnMubGVuZ3RoKTtcbiAgICBjb25zdCBtYXRyaXhTZXJ2aWNlID0gbmV3IERpc3RhbmNlTWF0cml4U2VydmljZSh0cnVlLCBmYWxzZSk7XG4gICAgdGhpcy5kaXN0YW5jZSA9IGF3YWl0IG1hdHJpeFNlcnZpY2UuY2FsYyh2ZWN0b3JzLCB0aGlzLmRpc3RhbmNlRnVuY3Rpb25OYW1lKTtcbiAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHZlY3RvcnMgZ2l2ZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBTZXQgb2YgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzIGJldHdlZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleDEgSW5kZXggb2YgdGhlIGZpcnN0IHZlY3RvciBvZiB0aGUgcGFpci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MiBJbmRleCBvZiB0aGUgc2Vjb25kIHZlY3RvciBvZiB0aGUgcGFpci5cbiAgICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNhbGNEaXN0YW5jZSh2ZWN0b3JzOiBWZWN0b3JzLCBpbmRleDE6IG51bWJlciwgaW5kZXgyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRpc3RhbmNlW3RoaXMuZG1JbmRleEZ1bmN0IShpbmRleDEsIGluZGV4MildO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgdmVjdG9ycyBnaXZlbiBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBQcm9taXNlPENvb3JkaW5hdGVzPiB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XG4gICAgY29uc3QgYXJlYVdpZHRoID0gNDA7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyBvZiB0aGUgTiBwb2ludHMuXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgU1BFQmFzZS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICBsZXQgbGFtYmRhMiA9IHRoaXMubGFtYmRhMjtcblxuICAgIGlmICh0aGlzLnN0ZXBzID09PSAwKVxuICAgICAgdGhpcy5zdGVwcyA9IHZlY3RvcnMubGVuZ3RoIC0gMTtcblxuXG4gICAgYXdhaXQgdGhpcy5pbml0RGlzdGFuY2UodmVjdG9ycyk7XG5cbiAgICBmb3IgKGxldCBjeWNsZSA9IDA7IGN5Y2xlIDwgdGhpcy5jeWNsZXM7ICsrY3ljbGUpIHtcbiAgICAgIGZvciAobGV0IHN0ZXAgPSAwOyBzdGVwIDwgdGhpcy5zdGVwczsgKytzdGVwKSB7XG4gICAgICAgIC8vIFNlbGVjdCB0d28gcG9pbnRzLCBpIGFuZCBqLCBhdCByYW5kb20sIC4uLlxuICAgICAgICBjb25zdCBpID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIGxldCBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIHdoaWxlIChpID09IGopIGogPSByYW5kb21JbnQobkl0ZW1zKTtcblxuICAgICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07XG4gICAgICAgIGNvbnN0IHJvd2ogPSBjb29yZGluYXRlc1tqXTtcblxuICAgICAgICAvLyAuLi4gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIC4uLiBjb21wdXRlIHRoZWlyIEV1Y2xpZGVhbiBkaXN0YW5jZSBvbiB0aGUgRC1kaW1lbnNpb25hbCBtYXAsIGRpai5cbiAgICAgICAgY29uc3QgZCA9IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlKHJvd2ksIHJvd2opO1xuXG4gICAgICAgIC8vIElmIHJpaiA8PSByYywgb3IgaWYgcmlqID4gcmMgYW5kIGRpaiA8IHJpaiAuLi5cbiAgICAgICAgaWYgKCh0aGlzLmN1dG9mZiA9PSAwKSB8fCAociA8PSB0aGlzLmN1dG9mZikgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEyICogKHIgLSBkKSAvIChkICsgdGhpcy5lcHNpbG9uKTtcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4aSBhbmQgeGouXG4gICAgICAgICAgY29uc3QgZGlmZklKID0gdmVjdG9yQWRkKHJvd2ksIHJvd2osIC0xKTtcbiAgICAgICAgICBjb29yZGluYXRlc1tpXSA9IHZlY3RvckFkZChyb3dpLCBkaWZmSUosIG11bHRpcGxpZXIpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2pdID0gdmVjdG9yQWRkKHJvd2osIGRpZmZJSiwgLW11bHRpcGxpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEZWNyZWFzZSB0aGUgbGVhcm5pbmcgcmF0ZSB7bGFtYmRhfSBieSBhIHByZXNjcmliZWQge2RsYW1iZGF9LlxuICAgICAgbGFtYmRhMiAtPSB0aGlzLmRsYW1iZGEyO1xuICAgICAgaWYgKGxhbWJkYTIgPD0gMC4pXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIG1vZGlmaWVkIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUFNQRUJhc2VcbiAqIEBsaW5rIGRvaToxMC4xMDE2L1MxMDkzLTMyNjMoMDMpMDAxNTUtNFxuICovXG5leHBvcnQgY2xhc3MgUFNQRUJhc2UgZXh0ZW5kcyBTUEVCYXNlIHtcbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgdmVjdG9ycyBnaXZlbiBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIGEgbW9kaWZpZWQgdXBkYXRlIHJ1bGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzLlxuICAgKiBAcmV0dXJuIHtDb29yZGluYXRlc30gU1BFIGNvb3JkaW5hdGVzIGluIEQgc3BhY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IFByb21pc2U8Q29vcmRpbmF0ZXM+IHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyAgSW5pdGlhbGl6ZSB0aGUgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyBvZiB0aGUgTiBwb2ludHMuXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgUFNQRUJhc2UuZGltZW5zaW9uLCBhcmVhV2lkdGgpO1xuICAgIGxldCBsYW1iZGEgPSB0aGlzLmxhbWJkYTtcblxuICAgIGF3YWl0IHRoaXMuaW5pdERpc3RhbmNlKHZlY3RvcnMpO1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICAvLyBTZWxlY3QgYSBwb2ludCwgaSwgYXQgcmFuZG9tIChwaXZvdCkuXG4gICAgICBjb25zdCBpOiBudW1iZXIgPSByYW5kb21JbnQobkl0ZW1zKTtcbiAgICAgIGNvbnN0IHJvd2kgPSBjb29yZGluYXRlc1tpXTtcblxuICAgICAgLy8gRm9yIGV2ZXJ5IHBvaW50IGogIT0gaSAuLi5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgICAgaWYgKGkgPT0gaikgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJvd2ogPSBjb29yZGluYXRlc1tqXTtcbiAgICAgICAgLy8gLi4uIHJldHJpZXZlIChvciBldmFsdWF0ZSkgaXRzIHByb3hpbWl0eSB0byBpIGluIHRoZSBpbnB1dCBzcGFjZSwgcmlqIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIC4uLiBhbmQgY29tcHV0ZSB0aGVpciBFdWNsaWRlYW4gZGlzdGFuY2Ugb24gdGhlIEQtZGltZW5zaW9uYWwgbWFwLCBkaWouXG4gICAgICAgIGNvbnN0IGQgPSBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShyb3dpLCByb3dqKTtcbiAgICAgICAgLy8gSWYgcmlqIDw9IHJjLCBvciBpZiByaWogPiByYyBhbmQgZGlqIDwgcmlqIC4uLlxuICAgICAgICBpZiAoKHRoaXMuY3V0b2ZmID09IDApIHx8IChyIDw9IHRoaXMuY3V0b2ZmKSB8fCAoZCA8IHIpKSB7XG4gICAgICAgICAgY29uc3QgbXVsdGlwbGllciA9IGxhbWJkYSAqIChyIC0gZCkgLyAoZCArIHRoaXMuZXBzaWxvbik7XG4gICAgICAgICAgY29uc3QgZGlmZklKID0gdmVjdG9yQWRkKHJvd2ksIHJvd2osIC0xKTtcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4ai5cbiAgICAgICAgICBjb29yZGluYXRlc1tqXSA9IHZlY3RvckFkZChyb3dqLCBkaWZmSUosIC1tdWx0aXBsaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRGVjcmVhc2UgdGhlIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gYnkgYSBwcmVzY3JpYmVkIHtkbGFtYmRhfS5cbiAgICAgIGxhbWJkYSAtPSB0aGlzLmRsYW1iZGE7XG4gICAgICBpZiAobGFtYmRhIDw9IDAuKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE9yaWdpbmFsU1BFXG4gKiBAbGluayBkb2k6MTAuMTAwMi9qY2MuMTAyMzRcbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWdpbmFsU1BFIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJhZGl1c1BlcmNlbnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIG1heERpc3RhbmNlOiBudW1iZXI7XG4gIHByb3RlY3RlZCBtYXhEaXN0YW5jZVN0ZXBzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTM7XG4gICAgdGhpcy5zdGVwcyA9IG9wdGlvbnM/LnN0ZXBzID8/IDEwMDAwMDtcbiAgICB0aGlzLnJhZGl1c1BlcmNlbnQgPSBvcHRpb25zPy5yYWRpdXNQZXJjZW50ID8/IDEuMDtcbiAgICB0aGlzLm1heERpc3RhbmNlID0gb3B0aW9ucz8ubWF4RGlzdGFuY2UgPz8gbnVsbDtcbiAgICB0aGlzLm1heERpc3RhbmNlU3RlcHMgPSBvcHRpb25zPy5tYXhEaXN0YW5jZVN0ZXBzID8/IG51bGw7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IFByb21pc2U8Q29vcmRpbmF0ZXM+IHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzIG9mIHRoZSBOIHBvaW50cy5cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGZpbGxSYW5kb21NYXRyaXgobkl0ZW1zLCBPcmlnaW5hbFNQRS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICBhd2FpdCB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcblxuICAgIGlmICh0aGlzLm1heERpc3RhbmNlU3RlcHMgPT09IG51bGwpXG4gICAgICB0aGlzLm1heERpc3RhbmNlU3RlcHMgPSBuSXRlbXMgKiBNYXRoLmZsb29yKChuSXRlbXMgLSAxKSAvIDIpO1xuXG4gICAgaWYgKHRoaXMubWF4RGlzdGFuY2UgPT09IG51bGwpIHtcbiAgICAgIHRoaXMubWF4RGlzdGFuY2UgPSAtMWUzNztcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGhpcy5tYXhEaXN0YW5jZVN0ZXBzOyBuKyspIHtcbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpOyBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3QgZCA9IHRoaXMuY2FsY0Rpc3RhbmNlKHZlY3RvcnMsIGksIGopO1xuICAgICAgICBpZiAoZCA+IHRoaXMubWF4RGlzdGFuY2UpXG4gICAgICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IGQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxhbWJkYSA9IHRoaXMubGFtYmRhO1xuICAgIGNvbnN0IHJhZGl1cyA9ICh0aGlzLnJhZGl1c1BlcmNlbnQgPT0gMC4wKSA/IHRoaXMubWF4RGlzdGFuY2UgOiB0aGlzLm1heERpc3RhbmNlICogdGhpcy5yYWRpdXNQZXJjZW50O1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICBmb3IgKGxldCBzdGVwID0gMDsgc3RlcCA8IHRoaXMuc3RlcHM7ICsrc3RlcCkge1xuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG5cbiAgICAgICAgLy8gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XG5cbiAgICAgICAgaWYgKChyIDw9IHJhZGl1cykgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEgKiAwLjUgKiAociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIC8vIC4uLiB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzIHhpIGFuZCB4ai5cbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2ldID0gdmVjdG9yQWRkKHJvd2ksIGRpZmZJSiwgbXVsdGlwbGllcik7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhbWJkYSAtPSAoKHRoaXMubGFtYmRhIC0gdGhpcy5kbGFtYmRhKSAvICh0aGlzLmN5Y2xlcyAtIDEuMCkpOyA7XG4gICAgICBpZiAobGFtYmRhIDwgdGhpcy5kbGFtYmRhKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG4iXX0=","import * as fl from 'fastest-levenshtein';\nimport { jaroWinkler } from 'jaro-winkler-typescript';\nimport { asymmetricDistance, braunBlanquetDistance, cosineDistance, diceDistance, euclideanDistance, hammingDistance, kulczynskiDistance, mcConnaugheyDistance, rogotGoldbergDistance, russelDistance, sokalDistance, tanimotoDistance, numericDistance, tanimotoDistanceIntArray, } from '../distance-metrics-methods';\nimport { calculateEuclideanDistance } from '@datagrok-libraries/utils/src/vector-operations';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '../macromolecule-distance-functions';\nimport { DistanceMetricsSubjects, BitArrayMetricsNames, StringMetricsNames, VectorMetricsNames, NumberMetricsNames, IntArrayMetricsNames } from './consts';\nexport const vectorDistanceMetricsMethods = {\n [VectorMetricsNames.Euclidean]: calculateEuclideanDistance,\n};\nexport const stringDistanceMetricsMethods = {\n [StringMetricsNames.Levenshtein]: fl.distance,\n [StringMetricsNames.JaroWinkler]: jaroWinkler,\n [StringMetricsNames.Manhattan]: manhattanDistance,\n};\nexport const bitArrayDistanceMetricsMethods = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport const intArrayDistanceMetricsMethods = {\n [IntArrayMetricsNames.TanimotoIntArray]: tanimotoDistanceIntArray,\n};\nexport const numberDistanceMetricsMethods = {\n [NumberMetricsNames.NumericDistance]: numericDistance,\n};\nexport const AvailableMetrics = {\n [DistanceMetricsSubjects.Vector]: {\n [VectorMetricsNames.Euclidean]: vectorDistanceMetricsMethods[VectorMetricsNames.Euclidean],\n },\n [DistanceMetricsSubjects.String]: {\n [StringMetricsNames.Levenshtein]: stringDistanceMetricsMethods[StringMetricsNames.Levenshtein],\n [StringMetricsNames.JaroWinkler]: stringDistanceMetricsMethods[StringMetricsNames.JaroWinkler],\n [StringMetricsNames.Manhattan]: stringDistanceMetricsMethods[StringMetricsNames.Manhattan],\n },\n [DistanceMetricsSubjects.BitArray]: {\n [BitArrayMetricsNames.Tanimoto]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Tanimoto],\n [BitArrayMetricsNames.Dice]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Dice],\n [BitArrayMetricsNames.Asymmetric]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Asymmetric],\n [BitArrayMetricsNames.BraunBlanquet]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.BraunBlanquet],\n [BitArrayMetricsNames.Cosine]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Cosine],\n [BitArrayMetricsNames.Kulczynski]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Kulczynski],\n [BitArrayMetricsNames.McConnaughey]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.McConnaughey],\n [BitArrayMetricsNames.RogotGoldberg]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.RogotGoldberg],\n [BitArrayMetricsNames.Russel]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Russel],\n [BitArrayMetricsNames.Sokal]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Sokal],\n },\n [DistanceMetricsSubjects.MacroMolecule]: {\n [MmDistanceFunctionsNames.HAMMING]: mmDistanceFunctions[MmDistanceFunctionsNames.HAMMING],\n [MmDistanceFunctionsNames.LEVENSHTEIN]: mmDistanceFunctions[MmDistanceFunctionsNames.LEVENSHTEIN],\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: mmDistanceFunctions[MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH],\n },\n [DistanceMetricsSubjects.Number]: {\n [NumberMetricsNames.NumericDistance]: numberDistanceMetricsMethods[NumberMetricsNames.NumericDistance],\n },\n [DistanceMetricsSubjects.IntArray]: {\n [IntArrayMetricsNames.TanimotoIntArray]: intArrayDistanceMetricsMethods[IntArrayMetricsNames.TanimotoIntArray],\n }\n};\nexport const MetricToDataType = Object.keys(AvailableMetrics)\n .reduce((ret, key) => {\n for (const val of Object.keys(AvailableMetrics[key]))\n ret[val] = key;\n return ret;\n}, {});\nexport function isStringMetric(name) {\n return MetricToDataType[name] == 'String';\n}\nexport function isBitArrayMetric(name) {\n return MetricToDataType[name] == 'BitArray';\n}\nexport function isVectorMetric(name) {\n return MetricToDataType[name] == 'Vector';\n}\nexport function isMacroMoleculeMetric(name) {\n return MetricToDataType[name] == DistanceMetricsSubjects.MacroMolecule.toString();\n}\n/** Manhattan distance between two sequences (match - 0, mismatch - 1) normalized for length. */\nexport function manhattanDistance(s1, s2) {\n if (s1.length !== s2.length) {\n return 1;\n }\n else {\n let dist = 0;\n for (let i = 1; i < s1.length; i++)\n dist += s1[i] == s2[i] ? 0 : 1;\n return dist / s1.length;\n }\n}\n/** Unified class implementing different string measures. */\nexport class Measure {\n /**\n * Creates an instance of Measure with .\n * @param {string} method Method to calculate distance between strings.\n * @memberof Measurer\n */\n constructor(method) {\n this.method = method;\n this.dataType = MetricToDataType[method];\n }\n /**\n * Returns custom string distance function specified.\n * @param {opts} opts Options for the measure. used for macromolecule distances\n * @return {DistanceMetric} Callback of the measure chosen.\n * @memberof Measurer\n */\n getMeasure(opts) {\n const dict = AvailableMetrics;\n if (!dict.hasOwnProperty(this.dataType) || !dict[this.dataType].hasOwnProperty(this.method))\n throw new Error(`Unknown measure ${this.method} for data type ${this.dataType}`);\n return isMacroMoleculeMetric(this.method) ?\n dict[this.dataType][this.method](opts) :\n dict[this.dataType][this.method];\n }\n /**\n * Returns custom string distance by the given data type.\n * @param {AvailableDataTypes} dataType Metric's data type\n * @return {string[]} Metric names which expects the given data type\n * @memberof Measurer\n */\n static getMetricByDataType(dataType) {\n return Object.keys(AvailableMetrics[dataType]);\n }\n /** Returns metric names available.\n * @memberof Measurer\n */\n static get availableMeasures() {\n return Object.keys(AvailableMetrics);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUczRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQ25ELGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBR3BHLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUF5RDtJQUNoRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLDBCQUEwQjtDQUMzRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQXlEO0lBQ2hHLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVE7SUFDN0MsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXO0lBQzdDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCO0NBQ2xELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBNkQ7SUFDdEcsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxnQkFBZ0I7SUFDakQsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZO0lBQ3pDLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEVBQUUsa0JBQWtCO0lBQ3JELENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLEVBQUUscUJBQXFCO0lBQzNELENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUUsY0FBYztJQUM3QyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxFQUFFLGtCQUFrQjtJQUNyRCxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxFQUFFLG9CQUFvQjtJQUN6RCxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxFQUFFLHFCQUFxQjtJQUMzRCxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLGNBQWM7SUFDN0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhO0lBQzNDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsZUFBZTtJQUMvQyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFLGlCQUFpQjtDQUNwRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQW1FO0lBQzVHLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsRUFBRSx3QkFBd0I7Q0FDbEUsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUF5RDtJQUNoRyxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxFQUFFLGVBQWU7Q0FDdEQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDaEMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUM7S0FDM0Y7SUFDRCxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ2hDLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsNEJBQTRCLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO1FBQzlGLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsNEJBQTRCLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO1FBQzlGLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsNEJBQTRCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDO0tBQzNGO0lBQ0QsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNsQyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztRQUM5RixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQztRQUN0RixDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztRQUNsRyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQztRQUN4RyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztRQUMxRixDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztRQUNsRyxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxFQUFFLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQztRQUN0RyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQztRQUN4RyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLDhCQUE4QixDQUFDLG9CQUFvQixDQUFD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QWdCLENBQUMsTUFBTSxDQUF1QixDQUFDO0lBQ2pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFVBQVUsQ0FBQyxJQUFVO1FBQzFCLE1BQU0sSUFBSSxHQUVOLGdCQUFnQixDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDekYsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLE1BQU0sa0JBQWtCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFxQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFtQixDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUE0QjtRQUM1RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLEtBQUssaUJBQWlCO1FBQzFCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZsIGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHtqYXJvV2lua2xlcn0gZnJvbSAnamFyby13aW5rbGVyLXR5cGVzY3JpcHQnO1xuaW1wb3J0IHtEaXN0YW5jZU1ldHJpY30gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtcbiAgYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBicmF1bkJsYW5xdWV0RGlzdGFuY2UsXG4gIGNvc2luZURpc3RhbmNlLFxuICBkaWNlRGlzdGFuY2UsXG4gIGV1Y2xpZGVhbkRpc3RhbmNlLFxuICBoYW1taW5nRGlzdGFuY2UsXG4gIGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgbWNDb25uYXVnaGV5RGlzdGFuY2UsXG4gIHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgcnVzc2VsRGlzdGFuY2UsXG4gIHNva2FsRGlzdGFuY2UsXG4gIHRhbmltb3RvRGlzdGFuY2UsXG4gIG51bWVyaWNEaXN0YW5jZSxcbiAgdGFuaW1vdG9EaXN0YW5jZUludEFycmF5LFxufSBmcm9tICcuLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuXG5pbXBvcnQge2NhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmltcG9ydCB7VmVjdG9yLCBTdHJpbmdEaWN0aW9uYXJ5fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvbnMsIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lc30gZnJvbSAnLi4vbWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cywgQml0QXJyYXlNZXRyaWNzTmFtZXMsXG4gIFN0cmluZ01ldHJpY3NOYW1lcywgVmVjdG9yTWV0cmljc05hbWVzLCBOdW1iZXJNZXRyaWNzTmFtZXMsIEludEFycmF5TWV0cmljc05hbWVzfSBmcm9tICcuL2NvbnN0cyc7XG5cblxuZXhwb3J0IGNvbnN0IHZlY3RvckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBWZWN0b3IsIHk6IFZlY3RvcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3Qgc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IHN0cmluZywgeTogc3RyaW5nKSA9PiBudW1iZXIgfSA9IHtcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IGZsLmRpc3RhbmNlLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogamFyb1dpbmtsZXIsXG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogbWFuaGF0dGFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IGludEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IFVpbnQzMkFycmF5LCB5OiBVaW50MzJBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtJbnRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b0ludEFycmF5XTogdGFuaW1vdG9EaXN0YW5jZUludEFycmF5LFxufTtcblxuZXhwb3J0IGNvbnN0IG51bWJlckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtOdW1iZXJNZXRyaWNzTmFtZXMuTnVtZXJpY0Rpc3RhbmNlXTogbnVtZXJpY0Rpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IEF2YWlsYWJsZU1ldHJpY3MgPSB7XG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5WZWN0b3JdOiB7XG4gICAgW1ZlY3Rvck1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiB2ZWN0b3JEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1ZlY3Rvck1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuU3RyaW5nXToge1xuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuTGV2ZW5zaHRlaW5dOiBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl0sXG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5KYXJvV2lua2xlcl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLk1hbmhhdHRhbl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLk1hbmhhdHRhbl0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5CaXRBcnJheV06IHtcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5NYWNyb01vbGVjdWxlXTogeyAvLyBvcHRpb25hbCBhcmdzIG5lZWRlZCBmb3IgbWFjcm9tb2xlY3VsZSBmdW5jdGlvbnMgd2hpY2ggaW5pdGlhbGl6ZSB0aGVtXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlOR10sXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTl06IG1tRGlzdGFuY2VGdW5jdGlvbnNbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXSxcbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTnVtYmVyXToge1xuICAgIFtOdW1iZXJNZXRyaWNzTmFtZXMuTnVtZXJpY0Rpc3RhbmNlXTogbnVtYmVyRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tOdW1iZXJNZXRyaWNzTmFtZXMuTnVtZXJpY0Rpc3RhbmNlXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkludEFycmF5XToge1xuICAgIFtJbnRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b0ludEFycmF5XTogaW50QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0ludEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvSW50QXJyYXldLFxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgTWV0cmljVG9EYXRhVHlwZTogU3RyaW5nRGljdGlvbmFyeSA9IE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3MpXG4gIC5yZWR1Y2UoKHJldDogU3RyaW5nRGljdGlvbmFyeSwga2V5KSA9PiB7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1trZXkgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSkpXG4gICAgICByZXRbdmFsIGFzIEF2YWlsYWJsZURhdGFUeXBlc10gPSBrZXk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LCB7fSk7XG5cbmV4cG9ydCB0eXBlIEF2YWlsYWJsZURhdGFUeXBlcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzO1xuZXhwb3J0IHR5cGUgVmVjdG9yTWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlZlY3Rvcl07XG5leHBvcnQgdHlwZSBTdHJpbmdNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuU3RyaW5nXTtcbmV4cG9ydCB0eXBlIEJpdEFycmF5TWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkJpdEFycmF5XTtcbmV4cG9ydCB0eXBlIEtub3duTWV0cmljcyA9IFN0cmluZ01ldHJpY3MgfCBCaXRBcnJheU1ldHJpY3MgfCBWZWN0b3JNZXRyaWNzIHxcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHwgTnVtYmVyTWV0cmljc05hbWVzIHwgSW50QXJyYXlNZXRyaWNzTmFtZXM7XG5cbmV4cG9ydCB0eXBlIFZhbGlkVHlwZXMgPVxuICB7IGRhdGE6IHN0cmluZ1tdLCBtZXRyaWM6IFN0cmluZ01ldHJpY3MgfCBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMgfSB8XG4gIHsgZGF0YTogVmVjdG9yW10sIG1ldHJpYzogVmVjdG9yTWV0cmljcyB9IHxcbiAgeyBkYXRhOiBCaXRBcnJheVtdLCBtZXRyaWM6IEJpdEFycmF5TWV0cmljcyB9IHxcbiAgeyBkYXRhOiBudW1iZXJbXSwgbWV0cmljOiBOdW1iZXJNZXRyaWNzTmFtZXMgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnU3RyaW5nJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQml0QXJyYXlNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdCaXRBcnJheSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlY3Rvck1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ1ZlY3Rvcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hY3JvTW9sZWN1bGVNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09IERpc3RhbmNlTWV0cmljc1N1YmplY3RzLk1hY3JvTW9sZWN1bGUudG9TdHJpbmcoKTtcbn1cblxuLyoqIE1hbmhhdHRhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgKG1hdGNoIC0gMCwgbWlzbWF0Y2ggLSAxKSBub3JtYWxpemVkIGZvciBsZW5ndGguICovXG5leHBvcnQgZnVuY3Rpb24gbWFuaGF0dGFuRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChzMS5sZW5ndGggIT09IHMyLmxlbmd0aCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIGxldCBkaXN0OiBudW1iZXIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgczEubGVuZ3RoOyBpKyspXG4gICAgICBkaXN0ICs9IHMxW2ldID09IHMyW2ldID8gMCA6IDE7XG4gICAgcmV0dXJuIGRpc3QgLyBzMS5sZW5ndGg7XG4gIH1cbn1cblxuLyoqIFVuaWZpZWQgY2xhc3MgaW1wbGVtZW50aW5nIGRpZmZlcmVudCBzdHJpbmcgbWVhc3VyZXMuICovXG5leHBvcnQgY2xhc3MgTWVhc3VyZSB7XG4gIHByb3RlY3RlZCBtZXRob2Q6IEtub3duTWV0cmljcztcbiAgcHJvdGVjdGVkIGRhdGFUeXBlOiBBdmFpbGFibGVEYXRhVHlwZXM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTWVhc3VyZSB3aXRoIC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gc3RyaW5ncy5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXRob2Q6IEtub3duTWV0cmljcykge1xuICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgIHRoaXMuZGF0YVR5cGUgPSBNZXRyaWNUb0RhdGFUeXBlW21ldGhvZF0gYXMgQXZhaWxhYmxlRGF0YVR5cGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VzdG9tIHN0cmluZyBkaXN0YW5jZSBmdW5jdGlvbiBzcGVjaWZpZWQuXG4gICAqIEBwYXJhbSB7b3B0c30gb3B0cyBPcHRpb25zIGZvciB0aGUgbWVhc3VyZS4gdXNlZCBmb3IgbWFjcm9tb2xlY3VsZSBkaXN0YW5jZXNcbiAgICogQHJldHVybiB7RGlzdGFuY2VNZXRyaWN9IENhbGxiYWNrIG9mIHRoZSBtZWFzdXJlIGNob3Nlbi5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVhc3VyZShvcHRzPzogYW55KTogRGlzdGFuY2VNZXRyaWMge1xuICAgIGNvbnN0IGRpY3Q6IHsgW2tleTogc3RyaW5nXTpcbiAgICAgIHtba2V5Mjogc3RyaW5nXTogRGlzdGFuY2VNZXRyaWMgfCAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpfVxuICAgIH0gPSBBdmFpbGFibGVNZXRyaWNzO1xuICAgIGlmICghZGljdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmRhdGFUeXBlKSB8fCAhZGljdFt0aGlzLmRhdGFUeXBlXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLm1ldGhvZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWVhc3VyZSAke3RoaXMubWV0aG9kfSBmb3IgZGF0YSB0eXBlICR7dGhpcy5kYXRhVHlwZX1gKTtcbiAgICByZXR1cm4gaXNNYWNyb01vbGVjdWxlTWV0cmljKHRoaXMubWV0aG9kKSA/XG4gICAgICAoZGljdFt0aGlzLmRhdGFUeXBlXVt0aGlzLm1ldGhvZF0gYXMgKChvcHRzOiBhbnkpID0+IERpc3RhbmNlTWV0cmljKSkob3B0cykgOlxuICAgICAgZGljdFt0aGlzLmRhdGFUeXBlXVt0aGlzLm1ldGhvZF0gYXMgRGlzdGFuY2VNZXRyaWM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXN0b20gc3RyaW5nIGRpc3RhbmNlIGJ5IHRoZSBnaXZlbiBkYXRhIHR5cGUuXG4gICAqIEBwYXJhbSB7QXZhaWxhYmxlRGF0YVR5cGVzfSBkYXRhVHlwZSBNZXRyaWMncyBkYXRhIHR5cGVcbiAgICogQHJldHVybiB7c3RyaW5nW119IE1ldHJpYyBuYW1lcyB3aGljaCBleHBlY3RzIHRoZSBnaXZlbiBkYXRhIHR5cGVcbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldE1ldHJpY0J5RGF0YVR5cGUoZGF0YVR5cGU6IEF2YWlsYWJsZURhdGFUeXBlcyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1tkYXRhVHlwZV0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgbWV0cmljIG5hbWVzIGF2YWlsYWJsZS5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1lYXN1cmVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljcyk7XG4gIH1cbn1cbiJdfQ==","/* eslint-disable max-len */\nimport * as umj from 'umap-js';\nimport { TSNE } from '@keckelt/tsne';\nimport { Vector, } from '@datagrok-libraries/utils/src/type-declarations';\nimport { transposeMatrix, assert, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { SPEBase, PSPEBase, OriginalSPE } from './spe';\nimport { Measure, AvailableMetrics, isBitArrayMetric } from './typed-metrics/typed-metrics';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport { DistanceMatrix, DistanceMatrixService, distanceMatrixProxy, dmLinearIndex } from './distance-matrix';\nimport { SparseMatrixService } from './distance-matrix/sparse-matrix-service';\nexport var DimReductionMethods;\n(function (DimReductionMethods) {\n DimReductionMethods[\"UMAP\"] = \"UMAP\";\n DimReductionMethods[\"T_SNE\"] = \"t-SNE\";\n})(DimReductionMethods || (DimReductionMethods = {}));\n/** Umap uses precalculated distance matrix to save time. though for too much data, memory becomes constraint.\n * if we have 100 000 rows, distance matrix will take ~10gb of memory and probably overflow.\n */\nexport const MAX_DISTANCE_MATRIX_ROWS = 20000;\nexport class UMAPOptions {\n constructor() {\n this.learningRate = { uiName: 'Learinig rate', value: 1, tooltip: 'The initial learning rate for the embedding optimization' };\n this.nComponents = { uiName: 'Components', value: 2, tooltip: 'The number of components (dimensions) to project the data to' };\n this.nEpochs = { uiName: 'Epochs', value: 0, tooltip: 'The number of epochs to optimize embeddings via SGD. Computed automatically if set to 0' };\n this.nNeighbors = { uiName: 'Neighbors', value: 15, tooltip: 'The number of nearest neighbors to construct the fuzzy manifold' };\n this.spread = { uiName: 'Spread', value: 1, tooltip: 'The effective scale of embedded points, used with min distance to control the clumped/dispersed nature of the embedding' };\n this.minDist = { uiName: 'Min distance', value: 0.1, tooltip: 'The effective minimum distance between embedded points, used with spread to control the clumped/dispersed nature of the embedding' };\n }\n ;\n}\nexport class TSNEOptions {\n constructor() {\n this.epsilon = { uiName: 'Epsilon', value: 10, tooltip: 'Epsilon is learning rate' };\n this.perplexity = { uiName: 'Perplexity', value: 30, tooltip: 'Roughly how many neighbors each point influences' };\n this.dim = { uiName: 'Dimensionality', value: 2, tooltip: 'Dimensionality of the embedding' };\n }\n ;\n}\n/** Abstract dimensionality reducer */\nclass Reducer {\n constructor(options) {\n this.data = options.data;\n }\n}\n/** t-SNE dimensionality reduction. */\nclass TSNEReducer extends Reducer {\n /**\n * Creates an instance of TSNEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof TSNEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new TSNE(options);\n this.iterations = options?.iterations ?? 100;\n this.distanceFname = options.distanceFname;\n this.distanceFn = options.distanceFn;\n }\n /**\n * Embeds the data given into the two-dimensional space using t-SNE method.\\\n * @param {boolean} [parallelDistanceWorkers] Whether to use parallel distance workers.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform(parallelDistanceWorkers) {\n const distance = parallelDistanceWorkers ? await (async () => {\n const matrixService = new DistanceMatrixService(true, false);\n try {\n const dist = await matrixService.calc(this.data, this.distanceFname);\n matrixService.terminate();\n return dist;\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n })() :\n (() => { const ret = DistanceMatrix.calc(this.data, (a, b) => this.distanceFn(a, b)); ret.normalize(); return ret.data; })();\n const matrixProxy = distanceMatrixProxy(distance, this.data.length);\n this.reducer.initDataDist(matrixProxy);\n for (let i = 0; i < this.iterations; ++i)\n this.reducer.step(); // every time you call this, solution gets better\n return { distance: distance, embedding: this.reducer.getSolution() };\n }\n}\n/**\n * Implements UMAP dimensionality reduction.\n *\n * @class UMAPReducer\n * @extends {Reducer}\n */\nclass UMAPReducer extends Reducer {\n /**\n * Creates an instance of UMAPReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof UMAPReducer\n */\n constructor(options) {\n super(options);\n assert('distanceFname' in options);\n assert('distanceFn' in options);\n this.distanceFn = options.distanceFn;\n this.usingSparseMatrix = !!options.usingSparseMatrix || !!options.sparseMatrix;\n this.sparseMatrixThreshold = options.sparseMatrixThreshold ?? 0.8;\n this.transferedSparseMatrix = options.sparseMatrix;\n this.distanceFname = options.distanceFname;\n this.dmIndexFunc = dmLinearIndex(this.data.length);\n //Umap uses vector indexing, so we need to create an array of vectors as indeces.\n this.vectors = new Array(this.data.length).fill(0).map((_, i) => [i]);\n this.usingDistanceMatrix = !((!options.preCalculateDistanceMatrix && this.data.length > MAX_DISTANCE_MATRIX_ROWS)\n || this.usingSparseMatrix);\n if (this.usingDistanceMatrix)\n options.distanceFn = this._encodedDistanceMatrix.bind(this);\n else if (this.usingSparseMatrix)\n options.distanceFn = this._encodedSparseMatrix.bind(this);\n else\n options.distanceFn = this._encodedDistance.bind(this);\n if (this.data.length < 15)\n options.nNeighbors = this.data.length - 1;\n this.reducer = new umj.UMAP(options);\n // this.reducer.distanceFn = this._encodedDistance.bind(this);\n }\n /**\n * Custom distance wrapper to have numeric inputs instead of string ones.\n *\n * @protected\n * @param {number[]} a The first item.\n * @param {number[]} b The first item.\n * @return {number} Distance metric.\n * @memberof UMAPReducer\n */\n _encodedDistanceMatrix(a, b) {\n if (a[0] === b[0])\n return 0;\n if (a[0] > b[0])\n return this.distanceMatrix[this.dmIndexFunc(b[0], a[0])];\n return this.distanceMatrix[this.dmIndexFunc(a[0], b[0])];\n }\n _encodedSparseMatrix(a, b) {\n return this.sparseMatrix.get(a[0])?.get(b[0]) ?? this.sparseMatrix.get(b[0])?.get(a[0]) ?? 1;\n }\n _encodedDistance(a, b) {\n return this.distanceFn(this.data[a[0]], this.data[b[0]]);\n }\n /**\n * Embeds the data given into the two-dimensional space using UMAP method.\n * @param {boolean} [parallelDistanceWorkers] Whether to use parallel distance matrix workers.\n * @return {any} Cartesian coordinate of this embedding.\n */\n async transform(parallelDistanceWorkers) {\n if (this.usingDistanceMatrix) {\n this.distanceMatrix = parallelDistanceWorkers ? await (async () => {\n const matrixService = new DistanceMatrixService(true, false);\n try {\n const dist = await matrixService.calc(this.data, this.distanceFname);\n matrixService.terminate();\n return dist;\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n })() :\n (() => { const ret = DistanceMatrix.calc(this.data, (a, b) => this.distanceFn(a, b)); return ret.data; })();\n }\n else if (this.usingSparseMatrix) {\n const res = this.transferedSparseMatrix ??\n await new SparseMatrixService().calc(this.data, this.distanceFname, this.sparseMatrixThreshold);\n this.sparseMatrix = new Map();\n for (let i = 0; i < res.i.length; ++i) {\n const first = res.i[i];\n const second = res.j[i];\n const distance = res.distance[i];\n if (!this.sparseMatrix.has(first))\n this.sparseMatrix.set(first, new Map());\n this.sparseMatrix.get(first).set(second, distance);\n }\n }\n const embedding = this.reducer.fit(this.vectors);\n function arrayCast2Coordinates(data) {\n return new Array(data.length).fill(0).map((_, i) => (Vector.from(data[i])));\n }\n return { embedding: arrayCast2Coordinates(embedding), ...(this.distanceMatrix ? { distance: this.distanceMatrix } : {}) };\n }\n}\n/**\n * Implements original SPE dimensionality reduction.\n *\n * @class SPEReducer\n * @extends {Reducer}\n */\nclass SPEReducer extends Reducer {\n /**\n * Creates an instance of SPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof SPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new SPEBase(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the original SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n const emb = await this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\n/**\n * Implements modified SPE dimensionality reduction.\n *\n * @class PSPEReducer\n * @extends {Reducer}\n */\nclass PSPEReducer extends Reducer {\n /**\n * Creates an instance of PSPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof PSPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new PSPEBase(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the modified SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n const emb = await this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\n/**\n * Implements original SPE dimensionality reduction.\n *\n * @class OriginalSPEReducer\n * @extends {Reducer}\n */\nclass OriginalSPEReducer extends Reducer {\n /**\n * Creates an instance of OriginalSPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof OriginalSPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new OriginalSPE(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the original SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n const emb = await this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\nconst AvailableReducers = {\n 'UMAP': UMAPReducer,\n 't-SNE': TSNEReducer,\n 'SPE': SPEReducer,\n 'pSPE': PSPEReducer,\n 'OriginalSPE': OriginalSPEReducer,\n};\n/**\n * Unified class implementing different dimensionality reduction methods.\n *\n * @export\n * @class DimensionalityReducer\n */\nexport class DimensionalityReducer {\n /**\n * Creates an instance of DimensionalityReducer.\n * @param {any[]} data Vectors to embed.\n * @param {KnownMethods} method Embedding method to be applied\n * @param {KnownMetrics} metric Distance metric to be computed between each of the vectors.\n * @param {Options} [options] Options to pass to the implementing embedders.\n * @memberof DimensionalityReducer\n */\n constructor(data, method, metric, options) {\n const measure = new Measure(metric).getMeasure();\n let specOptions = {};\n if (isBitArrayMetric(metric)) {\n for (let i = 0; i < data.length; ++i)\n data[i] = new BitArray(data[i]._data, data[i]._length);\n }\n if (method == 'UMAP') {\n specOptions = {\n ...{ data: data },\n ...{ distanceFn: measure },\n ...{ distanceFname: metric },\n ...{ nEpochs: options?.cycles },\n ...options,\n };\n }\n else if (method == 't-SNE') {\n specOptions = {\n ...{ data: data },\n ...{ distanceFn: measure },\n ...{ distanceFname: metric },\n ...{ iterations: options?.cycles ?? undefined },\n ...options,\n };\n }\n else if (method == 'SPE') {\n specOptions = { ...{ data: data }, ...{ distance: measure }, distanceFunctionName: metric, ...options };\n }\n else {\n specOptions = { ...{ data: data }, ...{ distance: measure }, distanceFunctionName: metric, ...options };\n }\n this.reducer = new AvailableReducers[method](specOptions);\n }\n /**\n * Embeds the data given into the two-dimensional space using the chosen method.\n *\n * @param {boolean} transpose Whether to transform coordinates to have columns-first orientation.\n * @param {boolean} parallelDistanceWorkers Whether to use parallel distance computation.\n * @throws {Error} If the embedding method was not found.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n * @memberof DimensionalityReducer\n */\n async transform(transpose = false, parallelDistanceWorkers) {\n if (this.reducer === undefined)\n throw new Error('Reducer was not defined.');\n let { embedding, distance } = await this.reducer.transform(parallelDistanceWorkers);\n if (transpose)\n embedding = transposeMatrix(embedding);\n return { distance: distance, embedding: embedding };\n }\n /**\n * Returns metrics available by type.\n *\n * @param {AvailableDataTypes} typeName type name\n * @return {string[]} Metric names which expects the given data type\n * @memberof DimensionalityReducer\n */\n static availableMetricsByType(typeName) {\n return Object.keys(AvailableMetrics[typeName]);\n }\n /**\n * Returns dimensionality reduction methods available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMethods() {\n return Object.keys(AvailableReducers);\n }\n /**\n * Returns metrics available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMetrics() {\n let ans = [];\n Object.values(AvailableMetrics).forEach((obj) => {\n const array = Object.values(obj);\n ans = [...ans, ...array];\n });\n return ans;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlLWRpbWVuc2lvbmFsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVkdWNlLWRpbWVuc2lvbmFsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25DLE9BQU8sRUFHTCxNQUFNLEdBR1AsTUFBTSxpREFBaUQsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLE1BQU0sR0FDUCxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFnQixnQkFBZ0IsRUFDN0MsZ0JBQWdCLEVBQXFCLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxRQUFRLE1BQU0seUNBQXlDLENBQUM7QUFFL0QsT0FBTyxFQUFDLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQWM5RSxNQUFNLENBQU4sSUFBWSxtQkFHWDtBQUhELFdBQVksbUJBQW1CO0lBQzdCLG9DQUFhLENBQUE7SUFDYixzQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFIVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBRzlCO0FBNEJEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBRTlDLE1BQU0sT0FBTyxXQUFXO0lBUXRCO1FBUEEsaUJBQVksR0FBdUIsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBEQUEwRCxFQUFDLENBQUM7UUFDNUksZ0JBQVcsR0FB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KiBhcyB1bWogZnJvbSAndW1hcC1qcyc7XG5pbXBvcnQge1RTTkV9IGZyb20gJ0BrZWNrZWx0L3RzbmUnO1xuaW1wb3J0IHtcbiAgT3B0aW9ucyxcbiAgQ29vcmRpbmF0ZXMsXG4gIFZlY3RvcixcbiAgVmVjdG9ycyxcbiAgTWF0cml4LFxufSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICB0cmFuc3Bvc2VNYXRyaXgsXG4gIGFzc2VydCxcbn0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtTUEVCYXNlLCBQU1BFQmFzZSwgT3JpZ2luYWxTUEV9IGZyb20gJy4vc3BlJztcbmltcG9ydCB7TWVhc3VyZSwgS25vd25NZXRyaWNzLCBBdmFpbGFibGVNZXRyaWNzLFxuICBpc0JpdEFycmF5TWV0cmljLCBBdmFpbGFibGVEYXRhVHlwZXN9IGZyb20gJy4vdHlwZWQtbWV0cmljcy90eXBlZC1tZXRyaWNzJztcbmltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuaW1wb3J0IHtVTUFQUGFyYW1ldGVyc30gZnJvbSAndW1hcC1qcyc7XG5pbXBvcnQge0Rpc3RhbmNlTWF0cml4LCBEaXN0YW5jZU1hdHJpeFNlcnZpY2UsIGRpc3RhbmNlTWF0cml4UHJveHksIGRtTGluZWFySW5kZXh9IGZyb20gJy4vZGlzdGFuY2UtbWF0cml4JztcbmltcG9ydCB7IFNwYXJzZU1hdHJpeFNlcnZpY2UgfSBmcm9tICcuL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBTcGFyc2VNYXRyaXhUcmFuc2ZlclR5cGUgPSB7XG4gIGk6IEludDMyQXJyYXksXG4gIGo6IEludDMyQXJyYXksXG4gIGRpc3RhbmNlOiBGbG9hdDMyQXJyYXksXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZHVjZURpbWVuc2lvbmFsaXR5UmVzdWx0IHtcbiAgZGlzdGFuY2U/OiBGbG9hdDMyQXJyYXk7XG4gIHNwYXJzZU1hdHJpeD86IE1hcDxudW1iZXIsIE1hcDxudW1iZXIsIG51bWJlcj4+O1xuICBlbWJlZGRpbmc6IE1hdHJpeDtcbn1cblxuZXhwb3J0IGVudW0gRGltUmVkdWN0aW9uTWV0aG9kc3tcbiAgVU1BUCA9ICdVTUFQJyxcbiAgVF9TTkUgPSAndC1TTkUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVNQVBPcHRpb25zIHtcbiAgbGVhcm5pbmdSYXRlPzogbnVtYmVyO1xuICBuQ29tcG9uZW50cz86IG51bWJlcjtcbiAgbkVwb2Nocz86IG51bWJlcjtcbiAgbk5laWdoYm9ycz86IG51bWJlcjtcbiAgc3ByZWFkPzogbnVtYmVyO1xuICBtaW5EaXN0PzogbnVtYmVyO1xuICBzcGFyc2VNYXRyaXhUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIHByZUNhbGN1bGF0ZURpc3RhbmNlTWF0cml4PzogYm9vbGVhbjtcbiAgdXNpbmdTcGFyc2VNYXRyaXg/OiBib29sZWFuO1xuICBzcGFyc2VNYXRyaXg/OiBTcGFyc2VNYXRyaXhUcmFuc2ZlclR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRTTkVPcHRpb25zIHtcbiAgZXBzaWxvbj86IG51bWJlcjtcbiAgcGVycGxleGl0eT86IG51bWJlcjtcbiAgZGltPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaW1SZWR1Y3Rpb25QYXJhbSB7XG4gIHVpTmFtZTogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyIHwgbnVsbDtcbiAgdG9vbHRpcDogc3RyaW5nO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbn1cblxuLyoqIFVtYXAgdXNlcyBwcmVjYWxjdWxhdGVkIGRpc3RhbmNlIG1hdHJpeCB0byBzYXZlIHRpbWUuIHRob3VnaCBmb3IgdG9vIG11Y2ggZGF0YSwgbWVtb3J5IGJlY29tZXMgY29uc3RyYWludC5cbiAqIGlmIHdlIGhhdmUgMTAwIDAwMCByb3dzLCBkaXN0YW5jZSBtYXRyaXggd2lsbCB0YWtlIH4xMGdiIG9mIG1lbW9yeSBhbmQgcHJvYmFibHkgb3ZlcmZsb3cuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfRElTVEFOQ0VfTUFUUklYX1JPV1MgPSAyMDAwMDtcblxuZXhwb3J0IGNsYXNzIFVNQVBPcHRpb25zIHtcbiAgbGVhcm5pbmdSYXRlOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnTGVhcmluaWcgcmF0ZScsIHZhbHVlOiAxLCB0b29sdGlwOiAnVGhlIGluaXRpYWwgbGVhcm5pbmcgcmF0ZSBmb3IgdGhlIGVtYmVkZGluZyBvcHRpbWl6YXRpb24nfTtcbiAgbkNvbXBvbmVudHM6IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdDb21wb25lbnRzJywgdmFsdWU6IDIsIHRvb2x0aXA6ICdUaGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgKGRpbWVuc2lvbnMpIHRvIHByb2plY3QgdGhlIGRhdGEgdG8nfTtcbiAgbkVwb2NoczogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ0Vwb2NocycsIHZhbHVlOiAwLCB0b29sdGlwOiAnVGhlIG51bWJlciBvZiBlcG9jaHMgdG8gb3B0aW1pemUgZW1iZWRkaW5ncyB2aWEgU0dELiBDb21wdXRlZCBhdXRvbWF0aWNhbGx5IGlmIHNldCB0byAwJ307XG4gIG5OZWlnaGJvcnM6IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdOZWlnaGJvcnMnLCB2YWx1ZTogMTUsIHRvb2x0aXA6ICdUaGUgbnVtYmVyIG9mIG5lYXJlc3QgbmVpZ2hib3JzIHRvIGNvbnN0cnVjdCB0aGUgZnV6enkgbWFuaWZvbGQnfTtcbiAgc3ByZWFkOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnU3ByZWFkJywgdmFsdWU6IDEsIHRvb2x0aXA6ICdUaGUgZWZmZWN0aXZlIHNjYWxlIG9mIGVtYmVkZGVkIHBvaW50cywgdXNlZCB3aXRoIG1pbiBkaXN0YW5jZSB0byBjb250cm9sIHRoZSBjbHVtcGVkL2Rpc3BlcnNlZCBuYXR1cmUgb2YgdGhlIGVtYmVkZGluZyd9O1xuICBtaW5EaXN0OiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnTWluIGRpc3RhbmNlJywgdmFsdWU6IDAuMSwgdG9vbHRpcDogJ1RoZSBlZmZlY3RpdmUgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIGVtYmVkZGVkIHBvaW50cywgdXNlZCB3aXRoIHNwcmVhZCB0byBjb250cm9sIHRoZSBjbHVtcGVkL2Rpc3BlcnNlZCBuYXR1cmUgb2YgdGhlIGVtYmVkZGluZyd9O1xuXG4gIGNvbnN0cnVjdG9yKCkge307XG59XG5cbmV4cG9ydCBjbGFzcyBUU05FT3B0aW9ucyB7XG4gIGVwc2lsb246IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdFcHNpbG9uJywgdmFsdWU6IDEwLCB0b29sdGlwOiAnRXBzaWxvbiBpcyBsZWFybmluZyByYXRlJ307XG4gIHBlcnBsZXhpdHk6IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdQZXJwbGV4aXR5JywgdmFsdWU6IDMwLCB0b29sdGlwOiAnUm91Z2hseSBob3cgbWFueSBuZWlnaGJvcnMgZWFjaCBwb2ludCBpbmZsdWVuY2VzJ307XG4gIGRpbTogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ0RpbWVuc2lvbmFsaXR5JywgdmFsdWU6IDIsIHRvb2x0aXA6ICdEaW1lbnNpb25hbGl0eSBvZiB0aGUgZW1iZWRkaW5nJ307XG5cbiAgY29uc3RydWN0b3IoKSB7fTtcbn1cblxuLyoqIEFic3RyYWN0IGRpbWVuc2lvbmFsaXR5IHJlZHVjZXIgKi9cbmFic3RyYWN0IGNsYXNzIFJlZHVjZXIge1xuICBwcm90ZWN0ZWQgZGF0YTogVmVjdG9ycztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgdGhpcy5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICB9XG5cbiAgLyoqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLiAqL1xuICBhYnN0cmFjdCB0cmFuc2Zvcm0ocGFyYWxsZWxEaXN0YW5jZVdvcmtlcnM/OiBib29sZWFuKTogUHJvbWlzZTxJUmVkdWNlRGltZW5zaW9uYWxpdHlSZXN1bHQ+O1xufVxuXG4vKiogdC1TTkUgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLiAqL1xuY2xhc3MgVFNORVJlZHVjZXIgZXh0ZW5kcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIHJlZHVjZXI6IFRTTkU7XG4gIHByb3RlY3RlZCBpdGVyYXRpb25zOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkaXN0YW5jZUZuYW1lOiBLbm93bk1ldHJpY3M7XG4gIHByb3RlY3RlZCBkaXN0YW5jZUZuOiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUU05FUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBUU05FUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVkdWNlciA9IG5ldyBUU05FKG9wdGlvbnMpO1xuICAgIHRoaXMuaXRlcmF0aW9ucyA9IG9wdGlvbnM/Lml0ZXJhdGlvbnMgPz8gMTAwO1xuICAgIHRoaXMuZGlzdGFuY2VGbmFtZSA9IG9wdGlvbnMuZGlzdGFuY2VGbmFtZTtcbiAgICB0aGlzLmRpc3RhbmNlRm4gPSBvcHRpb25zLmRpc3RhbmNlRm47XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0LVNORSBtZXRob2QuXFxcbiAgICogQHBhcmFtIHtib29sZWFufSBbcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnNdIFdoZXRoZXIgdG8gdXNlIHBhcmFsbGVsIGRpc3RhbmNlIHdvcmtlcnMuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybShwYXJhbGxlbERpc3RhbmNlV29ya2Vycz86IGJvb2xlYW4pOiBQcm9taXNlPElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdD4ge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgPyBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbWF0cml4U2VydmljZSA9IG5ldyBEaXN0YW5jZU1hdHJpeFNlcnZpY2UodHJ1ZSwgZmFsc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlzdCA9IGF3YWl0IG1hdHJpeFNlcnZpY2UuY2FsYyh0aGlzLmRhdGEsIHRoaXMuZGlzdGFuY2VGbmFtZSk7XG4gICAgICAgIG1hdHJpeFNlcnZpY2UudGVybWluYXRlKCk7XG4gICAgICAgIHJldHVybiBkaXN0O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pKCkgOlxuICAgICAgKCgpID0+IHsgY29uc3QgcmV0ID0gRGlzdGFuY2VNYXRyaXguY2FsYyh0aGlzLmRhdGEsIChhLCBiKSA9PiB0aGlzLmRpc3RhbmNlRm4oYSwgYikpOyByZXQubm9ybWFsaXplKCk7IHJldHVybiByZXQuZGF0YTsgfSkoKTtcblxuICAgIGNvbnN0IG1hdHJpeFByb3h5ID0gZGlzdGFuY2VNYXRyaXhQcm94eShkaXN0YW5jZSwgdGhpcy5kYXRhLmxlbmd0aCk7XG4gICAgdGhpcy5yZWR1Y2VyLmluaXREYXRhRGlzdChtYXRyaXhQcm94eSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlcmF0aW9uczsgKytpKVxuICAgICAgdGhpcy5yZWR1Y2VyLnN0ZXAoKTsgLy8gZXZlcnkgdGltZSB5b3UgY2FsbCB0aGlzLCBzb2x1dGlvbiBnZXRzIGJldHRlclxuXG4gICAgcmV0dXJuIHtkaXN0YW5jZTogZGlzdGFuY2UsIGVtYmVkZGluZzogdGhpcy5yZWR1Y2VyLmdldFNvbHV0aW9uKCl9O1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFVtYXBPcHRpb25zID0gT3B0aW9ucyAmIFVNQVBQYXJhbWV0ZXJzICYge1xuICBwcmVDYWxjdWxhdGVEaXN0YW5jZU1hdHJpeD86IGJvb2xlYW4sXG4gIHVzaW5nU3BhcnNlTWF0cml4PzogYm9vbGVhbixcbiAgc3BhcnNlTWF0cml4VGhyZXNob2xkPzogbnVtYmVyLFxuICBzcGFyc2VNYXRyaXg/OiBTcGFyc2VNYXRyaXhUcmFuc2ZlclR5cGVcbn07XG5cbi8qKlxuICogSW1wbGVtZW50cyBVTUFQIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi5cbiAqXG4gKiBAY2xhc3MgVU1BUFJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBVTUFQUmVkdWNlciBleHRlbmRzIFJlZHVjZXIge1xuICBwcm90ZWN0ZWQgcmVkdWNlcjogdW1qLlVNQVA7XG4gIHByb3RlY3RlZCBkaXN0YW5jZUZuYW1lOiBLbm93bk1ldHJpY3M7XG4gIHByb3RlY3RlZCBkaXN0YW5jZUZuOiBGdW5jdGlvbjtcbiAgcHJvdGVjdGVkIHZlY3RvcnM6IG51bWJlcltdW107XG4gIHByb3RlY3RlZCBkaXN0YW5jZU1hdHJpeD86IEZsb2F0MzJBcnJheTtcbiAgcHJvdGVjdGVkIHVzaW5nRGlzdGFuY2VNYXRyaXg6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBzcGFyc2VNYXRyaXg/OiBNYXA8bnVtYmVyLCBNYXA8bnVtYmVyLCBudW1iZXI+PjtcbiAgcHJvdGVjdGVkIGRtSW5kZXhGdW5jOiAoaTogbnVtYmVyLCBqOiBudW1iZXIpID0+IG51bWJlcjtcbiAgcHJvdGVjdGVkIHVzaW5nU3BhcnNlTWF0cml4OiBib29sZWFuO1xuICBwcm90ZWN0ZWQgc3BhcnNlTWF0cml4VGhyZXNob2xkOiBudW1iZXI7XG4gIHByb3RlY3RlZCB0cmFuc2ZlcmVkU3BhcnNlTWF0cml4PzogU3BhcnNlTWF0cml4VHJhbnNmZXJUeXBlO1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBVTUFQUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVW1hcE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICBhc3NlcnQoJ2Rpc3RhbmNlRm5hbWUnIGluIG9wdGlvbnMpO1xuICAgIGFzc2VydCgnZGlzdGFuY2VGbicgaW4gb3B0aW9ucyk7XG4gICAgdGhpcy5kaXN0YW5jZUZuID0gb3B0aW9ucy5kaXN0YW5jZUZuITtcbiAgICB0aGlzLnVzaW5nU3BhcnNlTWF0cml4ID0gISFvcHRpb25zLnVzaW5nU3BhcnNlTWF0cml4IHx8ICEhb3B0aW9ucy5zcGFyc2VNYXRyaXg7XG4gICAgdGhpcy5zcGFyc2VNYXRyaXhUaHJlc2hvbGQgPSBvcHRpb25zLnNwYXJzZU1hdHJpeFRocmVzaG9sZCA/PyAwLjg7XG4gICAgdGhpcy50cmFuc2ZlcmVkU3BhcnNlTWF0cml4ID0gb3B0aW9ucy5zcGFyc2VNYXRyaXg7XG5cbiAgICB0aGlzLmRpc3RhbmNlRm5hbWUgPSBvcHRpb25zLmRpc3RhbmNlRm5hbWUhO1xuICAgIHRoaXMuZG1JbmRleEZ1bmMgPSBkbUxpbmVhckluZGV4KHRoaXMuZGF0YS5sZW5ndGgpO1xuICAgIC8vVW1hcCB1c2VzIHZlY3RvciBpbmRleGluZywgc28gd2UgbmVlZCB0byBjcmVhdGUgYW4gYXJyYXkgb2YgdmVjdG9ycyBhcyBpbmRlY2VzLlxuICAgIHRoaXMudmVjdG9ycyA9IG5ldyBBcnJheSh0aGlzLmRhdGEubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaSkgPT4gW2ldKTtcbiAgICB0aGlzLnVzaW5nRGlzdGFuY2VNYXRyaXggPSAhKCghb3B0aW9ucy5wcmVDYWxjdWxhdGVEaXN0YW5jZU1hdHJpeCAmJiB0aGlzLmRhdGEubGVuZ3RoID4gTUFYX0RJU1RBTkNFX01BVFJJWF9ST1dTKVxuICAgICAgfHwgdGhpcy51c2luZ1NwYXJzZU1hdHJpeCk7XG4gICAgaWYgKHRoaXMudXNpbmdEaXN0YW5jZU1hdHJpeClcbiAgICAgIG9wdGlvbnMuZGlzdGFuY2VGbiA9IHRoaXMuX2VuY29kZWREaXN0YW5jZU1hdHJpeC5iaW5kKHRoaXMpO1xuICAgIGVsc2UgaWYgKHRoaXMudXNpbmdTcGFyc2VNYXRyaXgpXG4gICAgICBvcHRpb25zLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkU3BhcnNlTWF0cml4LmJpbmQodGhpcyk7XG4gICAgZWxzZVxuICAgICAgb3B0aW9ucy5kaXN0YW5jZUZuID0gdGhpcy5fZW5jb2RlZERpc3RhbmNlLmJpbmQodGhpcyk7XG5cbiAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA8IDE1KVxuICAgICAgb3B0aW9ucy5uTmVpZ2hib3JzID0gdGhpcy5kYXRhLmxlbmd0aCAtIDE7XG4gICAgdGhpcy5yZWR1Y2VyID0gbmV3IHVtai5VTUFQKG9wdGlvbnMpO1xuICAgIC8vIHRoaXMucmVkdWNlci5kaXN0YW5jZUZuID0gdGhpcy5fZW5jb2RlZERpc3RhbmNlLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3VzdG9tIGRpc3RhbmNlIHdyYXBwZXIgdG8gaGF2ZSBudW1lcmljIGlucHV0cyBpbnN0ZWFkIG9mIHN0cmluZyBvbmVzLlxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IGEgVGhlIGZpcnN0IGl0ZW0uXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IGIgVGhlIGZpcnN0IGl0ZW0uXG4gICAqIEByZXR1cm4ge251bWJlcn0gRGlzdGFuY2UgbWV0cmljLlxuICAgKiBAbWVtYmVyb2YgVU1BUFJlZHVjZXJcbiAgICovXG4gIHByb3RlY3RlZCBfZW5jb2RlZERpc3RhbmNlTWF0cml4KGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgaWYgKGFbMF0gPT09IGJbMF0pXG4gICAgICByZXR1cm4gMDtcbiAgICBpZiAoYVswXSA+IGJbMF0pXG4gICAgICByZXR1cm4gdGhpcy5kaXN0YW5jZU1hdHJpeCFbdGhpcy5kbUluZGV4RnVuYyhiWzBdLCBhWzBdKV07XG4gICAgcmV0dXJuIHRoaXMuZGlzdGFuY2VNYXRyaXghW3RoaXMuZG1JbmRleEZ1bmMoYVswXSwgYlswXSldO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9lbmNvZGVkU3BhcnNlTWF0cml4KGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3BhcnNlTWF0cml4IS5nZXQoYVswXSk/LmdldChiWzBdKSA/PyB0aGlzLnNwYXJzZU1hdHJpeCEuZ2V0KGJbMF0pPy5nZXQoYVswXSkgPz8gMTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZW5jb2RlZERpc3RhbmNlKGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGlzdGFuY2VGbih0aGlzLmRhdGFbYVswXV0sIHRoaXMuZGF0YVtiWzBdXSk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBVTUFQIG1ldGhvZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnNdIFdoZXRoZXIgdG8gdXNlIHBhcmFsbGVsIGRpc3RhbmNlIG1hdHJpeCB3b3JrZXJzLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybShwYXJhbGxlbERpc3RhbmNlV29ya2Vycz86IGJvb2xlYW4pOiBQcm9taXNlPElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdD4ge1xuICAgIGlmICh0aGlzLnVzaW5nRGlzdGFuY2VNYXRyaXgpIHtcbiAgICAgIHRoaXMuZGlzdGFuY2VNYXRyaXggPSBwYXJhbGxlbERpc3RhbmNlV29ya2VycyA/IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdHJpeFNlcnZpY2UgPSBuZXcgRGlzdGFuY2VNYXRyaXhTZXJ2aWNlKHRydWUsIGZhbHNlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkaXN0ID0gYXdhaXQgbWF0cml4U2VydmljZS5jYWxjKHRoaXMuZGF0YSwgdGhpcy5kaXN0YW5jZUZuYW1lKTtcbiAgICAgICAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgIHJldHVybiBkaXN0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbWF0cml4U2VydmljZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9KSgpIDpcbiAgICAgICAgKCgpID0+IHsgY29uc3QgcmV0ID0gRGlzdGFuY2VNYXRyaXguY2FsYyh0aGlzLmRhdGEsIChhLCBiKSA9PiB0aGlzLmRpc3RhbmNlRm4oYSwgYikpOyByZXR1cm4gcmV0LmRhdGE7IH0pKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnVzaW5nU3BhcnNlTWF0cml4KSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gdGhpcy50cmFuc2ZlcmVkU3BhcnNlTWF0cml4ID8/XG4gICAgICAgICAgICBhd2FpdCBuZXcgU3BhcnNlTWF0cml4U2VydmljZSgpLmNhbGModGhpcy5kYXRhLCB0aGlzLmRpc3RhbmNlRm5hbWUsIHRoaXMuc3BhcnNlTWF0cml4VGhyZXNob2xkKTtcbiAgICAgICAgICB0aGlzLnNwYXJzZU1hdHJpeCA9IG5ldyBNYXA8bnVtYmVyLCBNYXA8bnVtYmVyLCBudW1iZXI+PigpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gcmVzLmlbaV07XG4gICAgICAgICAgICBjb25zdCBzZWNvbmQgPSByZXMualtpXTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gcmVzLmRpc3RhbmNlW2ldO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNwYXJzZU1hdHJpeC5oYXMoZmlyc3QpKVxuICAgICAgICAgICAgICB0aGlzLnNwYXJzZU1hdHJpeC5zZXQoZmlyc3QsIG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCkpO1xuICAgICAgICAgICAgdGhpcy5zcGFyc2VNYXRyaXguZ2V0KGZpcnN0KSEuc2V0KHNlY29uZCwgZGlzdGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgfVxuICAgIGNvbnN0IGVtYmVkZGluZyA9IHRoaXMucmVkdWNlci5maXQodGhpcy52ZWN0b3JzKTtcblxuICAgIGZ1bmN0aW9uIGFycmF5Q2FzdDJDb29yZGluYXRlcyhkYXRhOiBudW1iZXJbXVtdKTogQ29vcmRpbmF0ZXMge1xuICAgICAgcmV0dXJuIG5ldyBBcnJheShkYXRhLmxlbmd0aCkuZmlsbCgwKS5tYXAoKF8sIGkpID0+IChWZWN0b3IuZnJvbShkYXRhW2ldKSkpO1xuICAgIH1cblxuICAgIHJldHVybiB7ZW1iZWRkaW5nOiBhcnJheUNhc3QyQ29vcmRpbmF0ZXMoZW1iZWRkaW5nKSwgLi4uKHRoaXMuZGlzdGFuY2VNYXRyaXggPyB7ZGlzdGFuY2U6IHRoaXMuZGlzdGFuY2VNYXRyaXh9IDoge30pfTtcbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgb3JpZ2luYWwgU1BFIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi5cbiAqXG4gKiBAY2xhc3MgU1BFUmVkdWNlclxuICogQGV4dGVuZHMge1JlZHVjZXJ9XG4gKi9cbmNsYXNzIFNQRVJlZHVjZXIgZXh0ZW5kcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIHJlZHVjZXI6IFNQRUJhc2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU1BFUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBTUEVSZWR1Y2VyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5yZWR1Y2VyID0gbmV3IFNQRUJhc2Uob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0aGUgb3JpZ2luYWwgU1BFIG1ldGhvZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKCk6IFByb21pc2U8SVJlZHVjZURpbWVuc2lvbmFsaXR5UmVzdWx0PiB7XG4gICAgY29uc3QgZW1iID0gYXdhaXQgdGhpcy5yZWR1Y2VyLmVtYmVkKHRoaXMuZGF0YSk7XG4gICAgcmV0dXJuIHtkaXN0YW5jZTogdGhpcy5yZWR1Y2VyLmRpc3RhbmNlLCBlbWJlZGRpbmc6IGVtYn07XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIG1vZGlmaWVkIFNQRSBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uXG4gKlxuICogQGNsYXNzIFBTUEVSZWR1Y2VyXG4gKiBAZXh0ZW5kcyB7UmVkdWNlcn1cbiAqL1xuY2xhc3MgUFNQRVJlZHVjZXIgZXh0ZW5kcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIHJlZHVjZXI6IFBTUEVCYXNlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFBTUEVSZWR1Y2VyLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICogQG1lbWJlcm9mIFBTUEVSZWR1Y2VyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5yZWR1Y2VyID0gbmV3IFBTUEVCYXNlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIG1vZGlmaWVkIFNQRSBtZXRob2QuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSgpOiBQcm9taXNlPElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdD4ge1xuICAgIGNvbnN0IGVtYiA9IGF3YWl0IHRoaXMucmVkdWNlci5lbWJlZCh0aGlzLmRhdGEpO1xuICAgIHJldHVybiB7ZGlzdGFuY2U6IHRoaXMucmVkdWNlci5kaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJ9O1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBvcmlnaW5hbCBTUEUgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLlxuICpcbiAqIEBjbGFzcyBPcmlnaW5hbFNQRVJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBPcmlnaW5hbFNQRVJlZHVjZXIgZXh0ZW5kcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIHJlZHVjZXI6IE9yaWdpbmFsU1BFO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIE9yaWdpbmFsU1BFUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBPcmlnaW5hbFNQRVJlZHVjZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgT3JpZ2luYWxTUEUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0aGUgb3JpZ2luYWwgU1BFIG1ldGhvZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKCk6IFByb21pc2U8SVJlZHVjZURpbWVuc2lvbmFsaXR5UmVzdWx0PiB7XG4gICAgY29uc3QgZW1iID0gYXdhaXQgdGhpcy5yZWR1Y2VyLmVtYmVkKHRoaXMuZGF0YSk7XG4gICAgcmV0dXJuIHtkaXN0YW5jZTogdGhpcy5yZWR1Y2VyLmRpc3RhbmNlLCBlbWJlZGRpbmc6IGVtYn07XG4gIH1cbn1cblxuY29uc3QgQXZhaWxhYmxlUmVkdWNlcnMgPSB7XG4gICdVTUFQJzogVU1BUFJlZHVjZXIsXG4gICd0LVNORSc6IFRTTkVSZWR1Y2VyLFxuICAnU1BFJzogU1BFUmVkdWNlcixcbiAgJ3BTUEUnOiBQU1BFUmVkdWNlcixcbiAgJ09yaWdpbmFsU1BFJzogT3JpZ2luYWxTUEVSZWR1Y2VyLFxufTtcblxuZXhwb3J0IHR5cGUgS25vd25NZXRob2RzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZVJlZHVjZXJzO1xuXG4vKipcbiAqIFVuaWZpZWQgY2xhc3MgaW1wbGVtZW50aW5nIGRpZmZlcmVudCBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gbWV0aG9kcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBEaW1lbnNpb25hbGl0eVJlZHVjZXIge1xuICBwcml2YXRlIHJlZHVjZXI6IFJlZHVjZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyLlxuICAgKiBAcGFyYW0ge2FueVtdfSBkYXRhIFZlY3RvcnMgdG8gZW1iZWQuXG4gICAqIEBwYXJhbSB7S25vd25NZXRob2RzfSBtZXRob2QgRW1iZWRkaW5nIG1ldGhvZCB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSB7S25vd25NZXRyaWNzfSBtZXRyaWMgRGlzdGFuY2UgbWV0cmljIHRvIGJlIGNvbXB1dGVkIGJldHdlZW4gZWFjaCBvZiB0aGUgdmVjdG9ycy5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBbb3B0aW9uc10gT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBpbXBsZW1lbnRpbmcgZW1iZWRkZXJzLlxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhOiBhbnlbXSwgbWV0aG9kOiBLbm93bk1ldGhvZHMsIG1ldHJpYzogS25vd25NZXRyaWNzLCBvcHRpb25zPzogT3B0aW9ucykge1xuICAgIGNvbnN0IG1lYXN1cmUgPSBuZXcgTWVhc3VyZShtZXRyaWMpLmdldE1lYXN1cmUoKTtcbiAgICBsZXQgc3BlY09wdGlvbnMgPSB7fTtcblxuICAgIGlmIChpc0JpdEFycmF5TWV0cmljKG1ldHJpYykpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICAgICAgZGF0YVtpXSA9IG5ldyBCaXRBcnJheShkYXRhW2ldLl9kYXRhLCBkYXRhW2ldLl9sZW5ndGgpO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT0gJ1VNQVAnKSB7XG4gICAgICBzcGVjT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ue2RhdGE6IGRhdGF9LFxuICAgICAgICAuLi57ZGlzdGFuY2VGbjogbWVhc3VyZX0sXG4gICAgICAgIC4uLntkaXN0YW5jZUZuYW1lOiBtZXRyaWN9LFxuICAgICAgICAuLi57bkVwb2Noczogb3B0aW9ucz8uY3ljbGVzfSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT0gJ3QtU05FJykge1xuICAgICAgc3BlY09wdGlvbnMgPSB7XG4gICAgICAgIC4uLntkYXRhOiBkYXRhfSxcbiAgICAgICAgLi4ue2Rpc3RhbmNlRm46IG1lYXN1cmV9LFxuICAgICAgICAuLi57ZGlzdGFuY2VGbmFtZTogbWV0cmljfSxcbiAgICAgICAgLi4ue2l0ZXJhdGlvbnM6IG9wdGlvbnM/LmN5Y2xlcyA/PyB1bmRlZmluZWR9LFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAnU1BFJykge1xuICAgICAgc3BlY09wdGlvbnMgPSB7Li4ue2RhdGE6IGRhdGF9LCAuLi57ZGlzdGFuY2U6IG1lYXN1cmV9LCBkaXN0YW5jZUZ1bmN0aW9uTmFtZTogbWV0cmljLCAuLi5vcHRpb25zfTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3BlY09wdGlvbnMgPSB7Li4ue2RhdGE6IGRhdGF9LCAuLi57ZGlzdGFuY2U6IG1lYXN1cmV9LCBkaXN0YW5jZUZ1bmN0aW9uTmFtZTogbWV0cmljLCAuLi5vcHRpb25zfTtcbiAgICB9XG4gICAgdGhpcy5yZWR1Y2VyID0gbmV3IEF2YWlsYWJsZVJlZHVjZXJzW21ldGhvZF0oc3BlY09wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIGNob3NlbiBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJhbnNwb3NlIFdoZXRoZXIgdG8gdHJhbnNmb3JtIGNvb3JkaW5hdGVzIHRvIGhhdmUgY29sdW1ucy1maXJzdCBvcmllbnRhdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbGxlbERpc3RhbmNlV29ya2VycyBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSBjb21wdXRhdGlvbi5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBlbWJlZGRpbmcgbWV0aG9kIHdhcyBub3QgZm91bmQuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKHRyYW5zcG9zZTogYm9vbGVhbiA9IGZhbHNlLCBwYXJhbGxlbERpc3RhbmNlV29ya2Vycz86IGJvb2xlYW4pOiBQcm9taXNlPElSZWR1Y2VEaW1lbnNpb25hbGl0eVJlc3VsdD4ge1xuICAgIGlmICh0aGlzLnJlZHVjZXIgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlciB3YXMgbm90IGRlZmluZWQuJyk7XG5cbiAgICBsZXQge2VtYmVkZGluZywgZGlzdGFuY2V9ID0gYXdhaXQgdGhpcy5yZWR1Y2VyLnRyYW5zZm9ybShwYXJhbGxlbERpc3RhbmNlV29ya2Vycyk7XG5cbiAgICBpZiAodHJhbnNwb3NlKVxuICAgICAgZW1iZWRkaW5nID0gdHJhbnNwb3NlTWF0cml4KGVtYmVkZGluZyk7XG5cbiAgICByZXR1cm4ge2Rpc3RhbmNlOiBkaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJlZGRpbmd9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWV0cmljcyBhdmFpbGFibGUgYnkgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IHR5cGVOYW1lIHR5cGUgbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICBzdGF0aWMgYXZhaWxhYmxlTWV0cmljc0J5VHlwZSh0eXBlTmFtZTogQXZhaWxhYmxlRGF0YVR5cGVzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3NbdHlwZU5hbWVdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBtZXRob2RzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWV0aG9kcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlUmVkdWNlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWV0cmljcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1ldHJpY3MoKSB7XG4gICAgbGV0IGFuczogc3RyaW5nW10gPSBbXTtcbiAgICBPYmplY3QudmFsdWVzKEF2YWlsYWJsZU1ldHJpY3MpLmZvckVhY2goKG9iaikgPT4ge1xuICAgICAgY29uc3QgYXJyYXkgPSBPYmplY3QudmFsdWVzKG9iaik7XG4gICAgICBhbnMgPSBbLi4uYW5zLCAuLi5hcnJheV07XG4gICAgfSk7XG4gICAgcmV0dXJuIGFucztcbiAgfVxufVxuIl19","import { isNil } from './utils';\n/** Distance matrix class compatible with data structure of scipy.spatial.distance.pdist */\nexport class DistanceMatrix {\n get data() { return this._data; }\n get size() { return this._size; }\n /**\n * @param {Float32Array} data Distance data\n * @param {number} size Number of original observations\n */\n constructor(data, size) {\n if (size == undefined) {\n if (data == undefined)\n throw new Error('Arguments error: data or size is required.');\n this._data = data;\n this._size = (1 + Math.sqrt(1 + 4 * 2 * this._data.length)) / 2;\n if (this._size != Math.floor(this._size))\n throw new Error(`Invalid data length ${this._data.length} leads to non integer size ${this._size}`);\n }\n else {\n this._size = size;\n const dataLength = size * (size - 1) / 2;\n if (data) {\n if (data.length != dataLength)\n throw new Error(`Invalid data length. Observations size ${size} requires data length ${dataLength}.`);\n this._data = data;\n }\n else {\n this._data = new Float32Array(dataLength);\n }\n }\n }\n _linearizeIJ(i, j) {\n if (!(i < j))\n throw new Error('i must be less than j');\n return this._size * i + j - Math.floor(((i + 2) * (i + 1)) / 2);\n }\n get(i, j) {\n if (i == j)\n return 0;\n else if (i < j)\n return this._data[this._linearizeIJ(i, j)];\n else\n return this._data[this._linearizeIJ(j, i)];\n }\n set(i, j, value) {\n this._data[this._linearizeIJ(i, j)] = value;\n }\n static calc(list, method) {\n const size = list.length;\n const res = new DistanceMatrix(undefined, size);\n for (let i = 0; i < size; i++) {\n for (let j = i + 1; j < size; j++) {\n // if any of the values is null, set distance to 1\n res.set(i, j, !isNil(list[i]) && !isNil(list[j]) ? method(list[i], list[j]) : 1);\n }\n }\n return res;\n }\n // squares each value in matrix in place\n square() {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] = this._data[i] ** 2;\n }\n // adds another matrix to this one in place\n add(other) {\n if (this._size !== other._size)\n throw new Error(`Matrices must have the same size. This size: ${this._size}, other size: ${other._size}`);\n for (let i = 0; i < this._data.length; i++)\n this._data[i] += other._data[i];\n }\n // square root each value in matrix in place\n sqrt() {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] = Math.sqrt(this._data[i]);\n }\n //normilze distance matrix in place\n normalize() {\n let min = 0;\n let max = this._data[0];\n for (let i = 0; i < this._data.length; i++) {\n if (this._data[i] < min)\n min = this._data[i];\n if (this._data[i] > max)\n max = this._data[i];\n }\n const range = max - min;\n for (let i = 0; i < this._data.length; i++)\n this._data[i] = range === 0 ? this._data[i] - min : (this._data[i] - min) / (max - min);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWF0cml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsMkZBQTJGO0FBQzNGLE1BQU0sT0FBTyxjQUFjO0lBSXpCLElBQUksSUFBSSxLQUFtQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRS9DLElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFekM7OztPQUdHO0lBQ0gsWUFBWSxJQUFtQixFQUFFLElBQWE7UUFDNUMsSUFBSSxJQUFJLElBQUksU0FBUyxFQUFFO1lBQ3JCLElBQUksSUFBSSxJQUFJLFNBQVM7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBRXJGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hFLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSw4QkFBOEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdkc7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLE1BQU0sVUFBVSxHQUFXLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7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QjtRQUNELE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDNUYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7aXNOaWx9IGZyb20gJy4vdXRpbHMnO1xuXG4vKiogRGlzdGFuY2UgbWF0cml4IGNsYXNzIGNvbXBhdGlibGUgd2l0aCBkYXRhIHN0cnVjdHVyZSBvZiBzY2lweS5zcGF0aWFsLmRpc3RhbmNlLnBkaXN0ICovXG5leHBvcnQgY2xhc3MgRGlzdGFuY2VNYXRyaXgge1xuICBfZGF0YTogRmxvYXQzMkFycmF5O1xuICBfc2l6ZTogbnVtYmVyO1xuXG4gIGdldCBkYXRhKCk6IEZsb2F0MzJBcnJheSB7IHJldHVybiB0aGlzLl9kYXRhOyB9XG5cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3NpemU7IH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGbG9hdDMyQXJyYXl9IGRhdGEgRGlzdGFuY2UgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBOdW1iZXIgb2Ygb3JpZ2luYWwgb2JzZXJ2YXRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhPzogRmxvYXQzMkFycmF5LCBzaXplPzogbnVtYmVyKSB7XG4gICAgaWYgKHNpemUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZGF0YSA9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignQXJndW1lbnRzIGVycm9yOiBkYXRhIG9yIHNpemUgaXMgcmVxdWlyZWQuJyk7XG5cbiAgICAgIHRoaXMuX2RhdGEgPSBkYXRhITtcbiAgICAgIHRoaXMuX3NpemUgPSAoMSArIE1hdGguc3FydCgxICsgNCAqIDIgKiB0aGlzLl9kYXRhLmxlbmd0aCkpIC8gMjtcbiAgICAgIGlmICh0aGlzLl9zaXplICE9IE1hdGguZmxvb3IodGhpcy5fc2l6ZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhIGxlbmd0aCAke3RoaXMuX2RhdGEubGVuZ3RofSBsZWFkcyB0byBub24gaW50ZWdlciBzaXplICR7dGhpcy5fc2l6ZX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gICAgICBjb25zdCBkYXRhTGVuZ3RoOiBudW1iZXIgPSBzaXplICogKHNpemUgLSAxKSAvIDI7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT0gZGF0YUxlbmd0aClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSBsZW5ndGguIE9ic2VydmF0aW9ucyBzaXplICR7c2l6ZX0gcmVxdWlyZXMgZGF0YSBsZW5ndGggJHtkYXRhTGVuZ3RofS5gKTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kYXRhID0gbmV3IEZsb2F0MzJBcnJheShkYXRhTGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saW5lYXJpemVJSihpOiBudW1iZXIsIGo6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCEoaSA8IGopKSB0aHJvdyBuZXcgRXJyb3IoJ2kgbXVzdCBiZSBsZXNzIHRoYW4gaicpO1xuICAgIHJldHVybiB0aGlzLl9zaXplICogaSArIGogLSBNYXRoLmZsb29yKCgoaSArIDIpICogKGkgKyAxKSkgLyAyKTtcbiAgfVxuXG4gIGdldChpOiBudW1iZXIsIGo6IG51bWJlcikge1xuICAgIGlmIChpID09IGopXG4gICAgICByZXR1cm4gMDtcbiAgICBlbHNlIGlmIChpIDwgailcbiAgICAgIHJldHVybiB0aGlzLl9kYXRhW3RoaXMuX2xpbmVhcml6ZUlKKGksIGopXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YVt0aGlzLl9saW5lYXJpemVJSihqLCBpKV07XG4gIH1cblxuICBzZXQoaTogbnVtYmVyLCBqOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kYXRhW3RoaXMuX2xpbmVhcml6ZUlKKGksIGopXSA9IHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIGNhbGM8VE9iaj4obGlzdDogSW5kZXhhYmxlPFRPYmo+LCBtZXRob2Q6IChhOiBUT2JqLCBiOiBUT2JqKSA9PiBudW1iZXIpOiBEaXN0YW5jZU1hdHJpeCB7XG4gICAgY29uc3Qgc2l6ZTogbnVtYmVyID0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3QgcmVzID0gbmV3IERpc3RhbmNlTWF0cml4KHVuZGVmaW5lZCwgc2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHNpemU7IGorKykge1xuICAgICAgICAvLyBpZiBhbnkgb2YgdGhlIHZhbHVlcyBpcyBudWxsLCBzZXQgZGlzdGFuY2UgdG8gMVxuICAgICAgICByZXMuc2V0KGksIGosICFpc05pbChsaXN0W2ldKSAmJiAhaXNOaWwobGlzdFtqXSkgPyBtZXRob2QobGlzdFtpXSwgbGlzdFtqXSkgOiAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIHNxdWFyZXMgZWFjaCB2YWx1ZSBpbiBtYXRyaXggaW4gcGxhY2VcbiAgcHVibGljIHNxdWFyZSgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldID0gdGhpcy5fZGF0YVtpXSAqKiAyO1xuICB9XG5cbiAgLy8gYWRkcyBhbm90aGVyIG1hdHJpeCB0byB0aGlzIG9uZSBpbiBwbGFjZVxuICBwdWJsaWMgYWRkKG90aGVyOiBEaXN0YW5jZU1hdHJpeCkge1xuICAgIGlmICh0aGlzLl9zaXplICE9PSBvdGhlci5fc2l6ZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWF0cmljZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUuIFRoaXMgc2l6ZTogJHt0aGlzLl9zaXplfSwgb3RoZXIgc2l6ZTogJHtvdGhlci5fc2l6ZX1gKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldICs9IG90aGVyLl9kYXRhW2ldO1xuICB9XG5cbiAgLy8gc3F1YXJlIHJvb3QgZWFjaCB2YWx1ZSBpbiBtYXRyaXggaW4gcGxhY2VcbiAgcHVibGljIHNxcnQoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IE1hdGguc3FydCh0aGlzLl9kYXRhW2ldKTtcbiAgfVxuXG4gIC8vbm9ybWlsemUgZGlzdGFuY2UgbWF0cml4IGluIHBsYWNlXG4gIHB1YmxpYyBub3JtYWxpemUoKSB7XG4gICAgbGV0IG1pbiA9IDA7XG4gICAgbGV0IG1heCA9IHRoaXMuX2RhdGFbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fZGF0YVtpXSA8IG1pbilcbiAgICAgICAgbWluID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGlmICh0aGlzLl9kYXRhW2ldID4gbWF4KVxuICAgICAgICBtYXggPSB0aGlzLl9kYXRhW2ldO1xuICAgIH1cbiAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldID0gcmFuZ2UgPT09IDAgPyB0aGlzLl9kYXRhW2ldIC0gbWluIDogKHRoaXMuX2RhdGFbaV0gLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmRleGFibGU8VE9iaj4ge1xuICBbaW5kZXg6IG51bWJlcl06IFRPYmo7XG4gIGdldCBsZW5ndGgoKTogbnVtYmVyO1xufVxuIl19","export class SparseMatrixService {\n constructor() {\n this._workerCount = Math.max(navigator.hardwareConcurrency - 2, 1);\n this._workers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./sparse-matrix-worker', import.meta.url)));\n }\n async calc(values, fnName, threshold) {\n const matSize = values.length * (values.length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n this._workers[idx].postMessage({ values, startIdx, endIdx, threshold, fnName });\n this._workers[idx].onmessage = ({ data: { error, i, j, distance } }) => {\n if (error) {\n rejectWorker(error);\n }\n else {\n this._workers[idx].terminate();\n resolveWorker({ i, j, distance, idx });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const fullSize = results.reduce((acc, val) => acc + val.i.length, 0);\n const i = new Int32Array(fullSize);\n const j = new Int32Array(fullSize);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n for (const res of results) {\n i.set(res.i, offset);\n j.set(res.j, offset);\n distance.set(res.distance, offset);\n offset += res.i.length;\n }\n return { i, j, distance };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxtQkFBbUI7SUFHNUI7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ3BELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksQ0FBSSxNQUErQixFQUFFLE1BQW9CLEVBQUUsU0FBaUI7UUFDM0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxNQUFNLFFBQVEsR0FDWixJQUFJLEtBQUssQ0FBK0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdHLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2hELFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsRUFBRTtnQkFDMUQsTUFBTSxRQUFRLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQztnQkFDakMsTUFBTSxNQUFNLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztnQkFDOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBQyxFQUFDLEVBQVEsRUFBRTtvQkFDdkUsSUFBSSxLQUFLLEVBQUU7d0JBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUFFO3lCQUFNO3dCQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUMvQixhQUFhLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO3FCQUN0QztnQkFDSCxDQUFDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUU7WUFDekIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNyQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDbkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ3hCO1FBQ0QsT0FBTyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS25vd25NZXRyaWNzIH0gZnJvbSBcIi4uL3R5cGVkLW1ldHJpY3NcIjtcblxuZXhwb3J0IGNsYXNzIFNwYXJzZU1hdHJpeFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX3dvcmtlckNvdW50OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfd29ya2VyczogV29ya2VyW107XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWF4KG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5IC0gMiwgMSk7XG4gICAgICB0aGlzLl93b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KS5maWxsKG51bGwpXG4gICAgICAgIC5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3NwYXJzZS1tYXRyaXgtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjYWxjPFQ+KHZhbHVlczogQXJyYXk8VD4gfCBBcnJheUxpa2U8VD4sIGZuTmFtZTogS25vd25NZXRyaWNzLCB0aHJlc2hvbGQ6IG51bWJlcikge1xuICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHByb21pc2VzID1cbiAgICAgICAgbmV3IEFycmF5PFByb21pc2U8e2k6IEludDMyQXJyYXksIGo6IEludDMyQXJyYXksIGRpc3RhbmNlOiBGbG9hdDMyQXJyYXksIGlkeDogbnVtYmVyfT4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICB0aGlzLl93b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgdGhyZXNob2xkLCBmbk5hbWV9KTtcbiAgICAgICAgICB0aGlzLl93b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGksIGosIGRpc3RhbmNlfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikgeyByZWplY3RXb3JrZXIoZXJyb3IpOyB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl93b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2ksIGosIGRpc3RhbmNlLCBpZHh9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIGNvbnN0IGZ1bGxTaXplID0gcmVzdWx0cy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwuaS5sZW5ndGgsIDApO1xuICAgICAgY29uc3QgaSA9IG5ldyBJbnQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgIGNvbnN0IGogPSBuZXcgSW50MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IG5ldyBGbG9hdDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGkuc2V0KHJlcy5pLCBvZmZzZXQpO1xuICAgICAgICBqLnNldChyZXMuaiwgb2Zmc2V0KTtcbiAgICAgICAgZGlzdGFuY2Uuc2V0KHJlcy5kaXN0YW5jZSwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IHJlcy5pLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7aSwgaiwgZGlzdGFuY2V9O1xuICAgIH1cbn0iXX0=","import { DimensionalityReducer } from '../reduce-dimensionality';\n/**\n * Worker thread receiving data function.\n *\n * @param {any[]} columnData Samples to process.\n * @param {KnownMethods} method Embedding method.\n * @param {KnownMetrics} measure Distance metric.\n * @param {any} options Options to pass to algorithm.\n * @param {boolean} parallelDistanceWorkers Whether to use parallel distance workers.\n * @return {any} Embedding (and distance matrix where applicable).\n */\nasync function onMessage(columnData, method, measure, options, parallelDistanceWorkers) {\n const reducer = new DimensionalityReducer(columnData, method, measure, options);\n return await reducer.transform(true, parallelDistanceWorkers);\n}\nself.onmessage = async ({ data: { columnData, method, measure, options, parallelDistanceWorkers } }) => {\n let data;\n try {\n data = await onMessage(columnData, method, measure, options, parallelDistanceWorkers);\n }\n catch (e) {\n data = { error: e };\n }\n self.postMessage({\n error: data.error,\n distance: data.distance,\n embedding: data.embedding,\n });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9uYWxpdHktcmVkdWNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpbWVuc2lvbmFsaXR5LXJlZHVjZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHFCQUFxQixFQUFlLE1BQU0sMEJBQTBCLENBQUM7QUFHN0U7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLFNBQVMsQ0FBQyxVQUFpQixFQUFFLE1BQW9CLEVBQUUsT0FBcUIsRUFDckYsT0FBYSxFQUFFLHVCQUFpQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFCQUFxQixDQUN2QyxVQUFVLEVBQ1YsTUFBTSxFQUNOLE9BQU8sRUFDUCxPQUFPLENBQ1IsQ0FBQztJQUNGLE9BQU8sTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBQyxFQUFDLEVBQUUsRUFBRTtJQUNqRyxJQUFJLElBQW9ELENBQUM7SUFDekQsSUFBSTtRQUNGLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztLQUN2RjtJQUFDLE9BQU8sQ0FBTSxFQUFFO1FBQ2YsSUFBSSxHQUFHLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxDQUFDO0tBQ25CO0lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztRQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7UUFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO0tBQzFCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGltZW5zaW9uYWxpdHlSZWR1Y2VyLCBLbm93bk1ldGhvZHN9IGZyb20gJy4uL3JlZHVjZS1kaW1lbnNpb25hbGl0eSc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcy90eXBlZC1tZXRyaWNzJztcblxuLyoqXG4gKiBXb3JrZXIgdGhyZWFkIHJlY2VpdmluZyBkYXRhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7YW55W119IGNvbHVtbkRhdGEgU2FtcGxlcyB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtLbm93bk1ldGhvZHN9IG1ldGhvZCBFbWJlZGRpbmcgbWV0aG9kLlxuICogQHBhcmFtIHtLbm93bk1ldHJpY3N9IG1lYXN1cmUgRGlzdGFuY2UgbWV0cmljLlxuICogQHBhcmFtIHthbnl9IG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIGFsZ29yaXRobS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2Ugd29ya2Vycy5cbiAqIEByZXR1cm4ge2FueX0gRW1iZWRkaW5nIChhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUpLlxuICovXG5hc3luYyBmdW5jdGlvbiBvbk1lc3NhZ2UoY29sdW1uRGF0YTogYW55W10sIG1ldGhvZDogS25vd25NZXRob2RzLCBtZWFzdXJlOiBLbm93bk1ldHJpY3MsXG4gIG9wdGlvbnM/OiBhbnksIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzPzogYm9vbGVhbik6IFByb21pc2U8e2Rpc3RhbmNlPzogYW55LCBlbWJlZGRpbmc/OiBhbnl9PiB7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgRGltZW5zaW9uYWxpdHlSZWR1Y2VyKFxuICAgIGNvbHVtbkRhdGEsXG4gICAgbWV0aG9kLFxuICAgIG1lYXN1cmUsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgcmV0dXJuIGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtKHRydWUsIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzKTtcbn1cblxuc2VsZi5vbm1lc3NhZ2UgPSBhc3luYyAoe2RhdGE6IHtjb2x1bW5EYXRhLCBtZXRob2QsIG1lYXN1cmUsIG9wdGlvbnMsIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzfX0pID0+IHtcbiAgbGV0IGRhdGE6IHtlcnJvcj86IGFueSwgZGlzdGFuY2U/OiBhbnksIGVtYmVkZGluZz86IGFueX07XG4gIHRyeSB7XG4gICAgZGF0YSA9IGF3YWl0IG9uTWVzc2FnZShjb2x1bW5EYXRhLCBtZXRob2QsIG1lYXN1cmUsIG9wdGlvbnMsIHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgZGF0YSA9IHtlcnJvcjogZX07XG4gIH1cbiAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgZXJyb3I6IGRhdGEuZXJyb3IsXG4gICAgZGlzdGFuY2U6IGRhdGEuZGlzdGFuY2UsXG4gICAgZW1iZWRkaW5nOiBkYXRhLmVtYmVkZGluZyxcbiAgfSk7XG59O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nvar tsne_1 = require(\"./tsne\");\nObject.defineProperty(exports, \"TSNE\", { enumerable: true, get: function () { return tsne_1.TSNE; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nclass TSNE {\n constructor(opt) {\n // return 0 mean unit standard deviation random number\n this.returnV = false;\n this.vValue = 0.0;\n this.iter = 0;\n opt = opt || {};\n this.perplexity = this.getopt(opt, 'perplexity', 30); // effective number of nearest neighbors\n this.dim = this.getopt(opt, 'dim', 2); // by default 2-D tSNE\n this.epsilon = this.getopt(opt, 'epsilon', 10); // learning rate\n }\n assert(condition, message) {\n if (!condition) {\n throw message || 'Assertion failed';\n }\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field)) {\n return opt[field];\n }\n else {\n return defaultval;\n }\n }\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * Math.random() - 1;\n const v = 2 * Math.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1) {\n return this.gaussRandom();\n }\n const c = Math.sqrt(-2 * Math.log(r) / r);\n this.vValue = v * c; // cache this for next function call for efficiency\n this.returnV = true;\n return u * c;\n }\n // return random normal number\n randn(mu, std) { return mu + this.gaussRandom() * std; }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n)) {\n return [];\n }\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Array(n);\n for (let i = 0; i < n; i++) {\n arr[i] = 0;\n }\n return arr;\n }\n else {\n return new Float64Array(n); // typed arrays are faster\n }\n }\n // utility that returns 2d array filled with random numbers\n // or with value s, if provided\n randn2d(n, d, s) {\n const uses = typeof s !== 'undefined';\n const x = [];\n for (let i = 0; i < n; i++) {\n const xhere = [];\n for (let j = 0; j < d; j++) {\n if (uses) {\n xhere.push(s);\n }\n else {\n xhere.push(this.randn(0.0, 1e-4));\n }\n }\n x.push(xhere);\n }\n return x;\n }\n // compute L2 distance between two vectors\n L2(x1, x2) {\n const D = x1.length;\n let d = 0;\n for (let i = 0; i < D; i++) {\n const x1i = x1[i];\n const x2i = x2[i];\n d += (x1i - x2i) * (x1i - x2i);\n }\n return d;\n }\n // compute pairwise distance in all vectors in X\n xtod(X) {\n const N = X.length;\n const dist = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = this.L2(X[i], X[j]);\n dist[i * N + j] = d;\n dist[j * N + i] = d;\n }\n }\n return dist;\n }\n // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol) {\n const nf = Math.sqrt(D.length); // this better be an integer\n const n = Math.floor(nf);\n this.assert(n === nf, 'D should have square number of elements.');\n const hTarget = Math.log(perplexity); // target entropy of distribution\n const P = this.zeros(n * n); // temporary probability matrix\n const prow = this.zeros(n); // a temporary storage compartment\n for (let i = 0; i < n; i++) {\n let betamin = -Infinity;\n let betamax = Infinity;\n let beta = 1; // initial value of precision\n let done = false;\n const maxtries = 50;\n // perform binary search to find a suitable precision beta\n // so that the entropy of the distribution is appropriate\n let num = 0;\n while (!done) {\n //debugger;\n // compute entropy and kernel row with beta precision\n let psum = 0.0;\n for (let j = 0; j < n; j++) {\n let pj = Math.exp(-D[i * n + j] * beta);\n if (i === j) {\n pj = 0;\n } // we dont care about diagonals\n prow[j] = pj;\n psum += pj;\n }\n // normalize p and compute entropy\n let nHere = 0.0;\n for (let j = 0; j < n; j++) {\n let pj;\n if (psum === 0) {\n pj = 0;\n }\n else {\n pj = prow[j] / psum;\n }\n prow[j] = pj;\n if (pj > 1e-7) {\n nHere -= pj * Math.log(pj);\n }\n }\n // adjust beta based on result\n if (nHere > hTarget) {\n // entropy was too high (distribution too diffuse)\n // so we need to increase the precision for more peaky distribution\n betamin = beta; // move up the bounds\n if (betamax === Infinity) {\n beta = beta * 2;\n }\n else {\n beta = (beta + betamax) / 2;\n }\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity) {\n beta = beta / 2;\n }\n else {\n beta = (beta + betamin) / 2;\n }\n }\n // stopping conditions: too many tries or got a good precision\n num++;\n if (Math.abs(nHere - hTarget) < tol) {\n done = true;\n }\n if (num >= maxtries) {\n done = true;\n }\n }\n // console.log('data point ' + i + ' gets precision ' + beta + ' after ' + num + ' binary search steps.');\n // copy over the final prow to P at row i\n for (let j = 0; j < n; j++) {\n P[i * n + j] = prow[j];\n }\n } // end loop over examples i\n // symmetrize P and normalize it to sum to 1 over all ij\n const pOut = this.zeros(n * n);\n const N2 = n * 2;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n pOut[i * n + j] = Math.max((P[i * n + j] + P[j * n + i]) / N2, 1e-100);\n }\n }\n return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\n // this function takes a set of high-dimensional points\n // and creates matrix P from them using gaussian kernel\n initDataRaw(X) {\n const N = X.length;\n const D = X[0].length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n this.assert(D > 0, ' X[0] is empty? Where is the data?');\n const dists = this.xtod(X); // convert X to distances using gaussian kernel\n this.P = this.d2p(dists, this.perplexity, 1e-4); // attach to object\n this.N = N; // back up the size of the dataset\n this.initSolution(); // refresh this\n }\n // this function takes a given distance matrix and creates\n // matrix P from them.\n // D is assumed to be provided as a list of lists, and should be symmetric\n initDataDist(D) {\n const N = D.length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n // convert D to a (fast) typed array version\n const dists = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = D[i][j];\n dists[i * N + j] = d;\n dists[j * N + i] = d;\n }\n }\n this.P = this.d2p(dists, this.perplexity, 1e-4);\n this.N = N;\n this.initSolution(); // refresh this\n }\n // (re)initializes the solution to random\n initSolution() {\n // generate random solution to t-SNE\n this.Y = this.randn2d(this.N, this.dim); // the solution\n this.gains = this.randn2d(this.N, this.dim, 1.0); // step gains to accelerate progress in unchanging directions\n this.ystep = this.randn2d(this.N, this.dim, 0.0); // momentum accumulator\n this.iter = 0;\n }\n // return pointer to current solution\n getSolution() {\n return this.Y;\n }\n // perform a single step of optimization to improve the embedding\n step() {\n this.iter += 1;\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n // perform gradient step\n const ymean = this.zeros(this.dim);\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const gid = grad[i][d];\n const sid = this.ystep[i][d];\n const gainid = this.gains[i][d];\n // compute gain update\n let newgain = this.sign(gid) === this.sign(sid) ? gainid * 0.8 : gainid + 0.2;\n if (newgain < 0.01) {\n newgain = 0.01;\n } // clamp\n this.gains[i][d] = newgain; // store for next turn\n // compute momentum step direction\n const momval = this.iter < 250 ? 0.5 : 0.8;\n const newsid = momval * sid - this.epsilon * newgain * grad[i][d];\n this.ystep[i][d] = newsid; // remember the step we took\n // step!\n this.Y[i][d] += newsid;\n ymean[d] += this.Y[i][d]; // accumulate mean so that we can center later\n }\n }\n // reproject Y to be zero mean\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n this.Y[i][d] -= ymean[d] / N;\n }\n }\n //if(this.iter%100===0) console.log('iter ' + this.iter + ', cost: ' + cost);\n return cost; // return current cost\n }\n // for debugging: gradient check\n debugGrad() {\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n const e = 1e-5;\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const yold = this.Y[i][d];\n this.Y[i][d] = yold + e;\n const cg0 = this.costGrad(this.Y);\n this.Y[i][d] = yold - e;\n const cg1 = this.costGrad(this.Y);\n const analytic = grad[i][d];\n const numerical = (cg0.cost - cg1.cost) / (2 * e);\n console.log(i + ',' + d + ': gradcheck analytic: ' + analytic + ' vs. numerical: ' + numerical);\n this.Y[i][d] = yold;\n }\n }\n }\n // return cost and gradient, given an arrangement\n costGrad(Y) {\n const N = this.N;\n const dim = this.dim; // dim of output space\n const P = this.P;\n const pmul = this.iter < 100 ? 4 : 1; // trick that helps with local optima\n // compute current Q distribution, unnormalized first\n const quArr = this.zeros(N * N);\n let qsum = 0.0;\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n let dsum = 0.0;\n for (let d = 0; d < dim; d++) {\n const dhere = Y[i][d] - Y[j][d];\n dsum += dhere * dhere;\n }\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n quArr[i * N + j] = qu;\n quArr[j * N + i] = qu;\n qsum += 2 * qu;\n }\n }\n // normalize Q distribution to sum to 1\n const NN = N * N;\n const Q = this.zeros(NN);\n for (let q = 0; q < NN; q++) {\n Q[q] = Math.max(quArr[q] / qsum, 1e-100);\n }\n let cost = 0.0;\n const grad = [];\n for (let i = 0; i < N; i++) {\n const gsum = new Array(dim); // init grad for point i\n for (let d = 0; d < dim; d++) {\n gsum[d] = 0.0;\n }\n for (let j = 0; j < N; j++) {\n cost += -P[i * N + j] * Math.log(Q[i * N + j]); // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q[i * N + j]) * quArr[i * N + j];\n for (let d = 0; d < dim; d++) {\n gsum[d] += premult * (Y[i][d] - Y[j][d]);\n }\n }\n grad.push(gsum);\n }\n return { cost, grad };\n }\n}\nexports.TSNE = TSNE;\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n return toString.call(object).endsWith('Array]');\n}\n","/**\n * Calculate current error\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {number}\n */\nexport default function errorCalculation(\n data,\n parameters,\n parameterizedFunction,\n) {\n let error = 0;\n const func = parameterizedFunction(parameters);\n\n for (let i = 0; i < data.x.length; i++) {\n error += Math.abs(data.y[i] - func(data.x[i]));\n }\n\n return error;\n}\n","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n } else if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var output;\n\n if (options.output !== undefined) {\n if (!isAnyArray(options.output)) {\n throw new TypeError('output option must be an array if specified');\n }\n\n output = options.output;\n } else {\n output = new Array(input.length);\n }\n\n var currentMin = min(input);\n var currentMax = max(input);\n\n if (currentMin === currentMax) {\n throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n }\n\n var _options$min = options.min,\n minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n _options$max = options.max,\n maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n if (minValue >= maxValue) {\n throw new RangeError('min option must be smaller than max option');\n }\n\n var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n for (var i = 0; i < input.length; i++) {\n output[i] = (input[i] - currentMin) * factor + minValue;\n }\n\n return output;\n}\n\nexport { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var minValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] < minValue) minValue = input[i];\n }\n\n return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var maxValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] > maxValue) maxValue = input[i];\n }\n\n return maxValue;\n}\n\nexport { max as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n const {\n maxRows = 15,\n maxColumns = 10,\n maxNumSize = 8,\n padMinus = 'auto',\n } = options;\n return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n const { rows, columns } = matrix;\n const maxI = Math.min(rows, maxRows);\n const maxJ = Math.min(columns, maxColumns);\n const result = [];\n\n if (padMinus === 'auto') {\n padMinus = false;\n loop: for (let i = 0; i < maxI; i++) {\n for (let j = 0; j < maxJ; j++) {\n if (matrix.get(i, j) < 0) {\n padMinus = true;\n break loop;\n }\n }\n }\n }\n\n for (let i = 0; i < maxI; i++) {\n let line = [];\n for (let j = 0; j < maxJ; j++) {\n line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n }\n result.push(`${line.join(' ')}`);\n }\n if (maxJ !== columns) {\n result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n }\n if (maxI !== rows) {\n result.push(`... ${rows - maxRows} more rows`);\n }\n return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n return (\n num >= 0 && padMinus\n ? ` ${formatNumber2(num, maxNumSize - 1)}`\n : formatNumber2(num, maxNumSize)\n ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n // small.length numbers should be as is\n let str = num.toString();\n if (str.length <= len) return str;\n\n // (7)'0.00123' is better then (7)'1.23e-2'\n // (8)'0.000123' is worse then (7)'1.23e-3',\n let fix = num.toFixed(len);\n if (fix.length > len) {\n fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n }\n if (\n fix.length <= len &&\n !fix.startsWith('0.000') &&\n !fix.startsWith('-0.000')\n ) {\n return fix;\n }\n\n // well, if it's still too long the user should've used longer numbers\n let exp = num.toExponential(len);\n if (exp.length > len) {\n exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n }\n return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n let max = outer ? matrix.rows : matrix.rows - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Row index out of range');\n }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n let max = outer ? matrix.columns : matrix.columns - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Column index out of range');\n }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.columns) {\n throw new RangeError(\n 'vector size must be the same as the number of columns',\n );\n }\n return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.rows) {\n throw new RangeError('vector size must be the same as the number of rows');\n }\n return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n if (!isAnyArray(rowIndices)) {\n throw new TypeError('row indices must be an array');\n }\n\n for (let i = 0; i < rowIndices.length; i++) {\n if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n throw new RangeError('row indices are out of range');\n }\n }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n if (!isAnyArray(columnIndices)) {\n throw new TypeError('column indices must be an array');\n }\n\n for (let i = 0; i < columnIndices.length; i++) {\n if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n throw new RangeError('column indices are out of range');\n }\n }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n if (arguments.length !== 5) {\n throw new RangeError('expected 4 arguments');\n }\n checkNumber('startRow', startRow);\n checkNumber('endRow', endRow);\n checkNumber('startColumn', startColumn);\n checkNumber('endColumn', endColumn);\n if (\n startRow > endRow ||\n startColumn > endColumn ||\n startRow < 0 ||\n startRow >= matrix.rows ||\n endRow < 0 ||\n endRow >= matrix.rows ||\n startColumn < 0 ||\n startColumn >= matrix.columns ||\n endColumn < 0 ||\n endColumn >= matrix.columns\n ) {\n throw new RangeError('Submatrix indices are out of range');\n }\n}\n\nexport function newArray(length, value = 0) {\n let array = [];\n for (let i = 0; i < length; i++) {\n array.push(value);\n }\n return array;\n}\n\nfunction checkNumber(name, value) {\n if (typeof value !== 'number') {\n throw new TypeError(`${name} must be a number`);\n }\n}\n\nexport function checkNonEmpty(matrix) {\n if (matrix.isEmpty()) {\n throw new Error('Empty matrix has no elements to index');\n }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n sumByRow,\n sumByColumn,\n sumAll,\n productByRow,\n productByColumn,\n productAll,\n varianceByRow,\n varianceByColumn,\n varianceAll,\n centerByRow,\n centerByColumn,\n centerAll,\n scaleByRow,\n scaleByColumn,\n scaleAll,\n getScaleByRow,\n getScaleByColumn,\n getScaleAll,\n} from './stat';\nimport {\n checkRowVector,\n checkRowIndex,\n checkColumnIndex,\n checkColumnVector,\n checkRange,\n checkNonEmpty,\n checkRowIndices,\n checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n static from1DArray(newRows, newColumns, newData) {\n let length = newRows * newColumns;\n if (length !== newData.length) {\n throw new RangeError('data length does not match given dimensions');\n }\n let newMatrix = new Matrix(newRows, newColumns);\n for (let row = 0; row < newRows; row++) {\n for (let column = 0; column < newColumns; column++) {\n newMatrix.set(row, column, newData[row * newColumns + column]);\n }\n }\n return newMatrix;\n }\n\n static rowVector(newData) {\n let vector = new Matrix(1, newData.length);\n for (let i = 0; i < newData.length; i++) {\n vector.set(0, i, newData[i]);\n }\n return vector;\n }\n\n static columnVector(newData) {\n let vector = new Matrix(newData.length, 1);\n for (let i = 0; i < newData.length; i++) {\n vector.set(i, 0, newData[i]);\n }\n return vector;\n }\n\n static zeros(rows, columns) {\n return new Matrix(rows, columns);\n }\n\n static ones(rows, columns) {\n return new Matrix(rows, columns).fill(1);\n }\n\n static rand(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { random = Math.random } = options;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.set(i, j, random());\n }\n }\n return matrix;\n }\n\n static randInt(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1000, random = Math.random } = options;\n if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let interval = max - min;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n let value = min + Math.round(random() * interval);\n matrix.set(i, j, value);\n }\n }\n return matrix;\n }\n\n static eye(rows, columns, value) {\n if (columns === undefined) columns = rows;\n if (value === undefined) value = 1;\n let min = Math.min(rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, value);\n }\n return matrix;\n }\n\n static diag(data, rows, columns) {\n let l = data.length;\n if (rows === undefined) rows = l;\n if (columns === undefined) columns = rows;\n let min = Math.min(l, rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, data[i]);\n }\n return matrix;\n }\n\n static min(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static max(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new this(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static checkMatrix(value) {\n return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n }\n\n static isMatrix(value) {\n return value != null && value.klass === 'Matrix';\n }\n\n get size() {\n return this.rows * this.columns;\n }\n\n apply(callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n callback.call(this, i, j);\n }\n }\n return this;\n }\n\n to1DArray() {\n let array = [];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n array.push(this.get(i, j));\n }\n }\n return array;\n }\n\n to2DArray() {\n let copy = [];\n for (let i = 0; i < this.rows; i++) {\n copy.push([]);\n for (let j = 0; j < this.columns; j++) {\n copy[i].push(this.get(i, j));\n }\n }\n return copy;\n }\n\n toJSON() {\n return this.to2DArray();\n }\n\n isRowVector() {\n return this.rows === 1;\n }\n\n isColumnVector() {\n return this.columns === 1;\n }\n\n isVector() {\n return this.rows === 1 || this.columns === 1;\n }\n\n isSquare() {\n return this.rows === this.columns;\n }\n\n isEmpty() {\n return this.rows === 0 || this.columns === 0;\n }\n\n isSymmetric() {\n if (this.isSquare()) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j <= i; j++) {\n if (this.get(i, j) !== this.get(j, i)) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n }\n\n isEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isEchelonForm = true;\n let checked = false;\n while (i < this.rows && isEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isEchelonForm = false;\n checked = true;\n }\n }\n i++;\n }\n return isEchelonForm;\n }\n\n isReducedEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isReducedEchelonForm = true;\n let checked = false;\n while (i < this.rows && isReducedEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isReducedEchelonForm = false;\n checked = true;\n }\n }\n for (let k = j + 1; k < this.rows; k++) {\n if (this.get(i, k) !== 0) {\n isReducedEchelonForm = false;\n }\n }\n i++;\n }\n return isReducedEchelonForm;\n }\n\n echelonForm() {\n let result = this.clone();\n let h = 0;\n let k = 0;\n while (h < result.rows && k < result.columns) {\n let iMax = h;\n for (let i = h; i < result.rows; i++) {\n if (result.get(i, k) > result.get(iMax, k)) {\n iMax = i;\n }\n }\n if (result.get(iMax, k) === 0) {\n k++;\n } else {\n result.swapRows(h, iMax);\n let tmp = result.get(h, k);\n for (let j = k; j < result.columns; j++) {\n result.set(h, j, result.get(h, j) / tmp);\n }\n for (let i = h + 1; i < result.rows; i++) {\n let factor = result.get(i, k) / result.get(h, k);\n result.set(i, k, 0);\n for (let j = k + 1; j < result.columns; j++) {\n result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n }\n }\n h++;\n k++;\n }\n }\n return result;\n }\n\n reducedEchelonForm() {\n let result = this.echelonForm();\n let m = result.columns;\n let n = result.rows;\n let h = n - 1;\n while (h >= 0) {\n if (result.maxRow(h) === 0) {\n h--;\n } else {\n let p = 0;\n let pivot = false;\n while (p < n && pivot === false) {\n if (result.get(h, p) === 1) {\n pivot = true;\n } else {\n p++;\n }\n }\n for (let i = 0; i < h; i++) {\n let factor = result.get(i, p);\n for (let j = p; j < m; j++) {\n let tmp = result.get(i, j) - factor * result.get(h, j);\n result.set(i, j, tmp);\n }\n }\n h--;\n }\n }\n return result;\n }\n\n set() {\n throw new Error('set method is unimplemented');\n }\n\n get() {\n throw new Error('get method is unimplemented');\n }\n\n repeat(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { rows = 1, columns = 1 } = options;\n if (!Number.isInteger(rows) || rows <= 0) {\n throw new TypeError('rows must be a positive integer');\n }\n if (!Number.isInteger(columns) || columns <= 0) {\n throw new TypeError('columns must be a positive integer');\n }\n let matrix = new Matrix(this.rows * rows, this.columns * columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n }\n }\n return matrix;\n }\n\n fill(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, value);\n }\n }\n return this;\n }\n\n neg() {\n return this.mulS(-1);\n }\n\n getRow(index) {\n checkRowIndex(this, index);\n let row = [];\n for (let i = 0; i < this.columns; i++) {\n row.push(this.get(index, i));\n }\n return row;\n }\n\n getRowVector(index) {\n return Matrix.rowVector(this.getRow(index));\n }\n\n setRow(index, array) {\n checkRowIndex(this, index);\n array = checkRowVector(this, array);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, array[i]);\n }\n return this;\n }\n\n swapRows(row1, row2) {\n checkRowIndex(this, row1);\n checkRowIndex(this, row2);\n for (let i = 0; i < this.columns; i++) {\n let temp = this.get(row1, i);\n this.set(row1, i, this.get(row2, i));\n this.set(row2, i, temp);\n }\n return this;\n }\n\n getColumn(index) {\n checkColumnIndex(this, index);\n let column = [];\n for (let i = 0; i < this.rows; i++) {\n column.push(this.get(i, index));\n }\n return column;\n }\n\n getColumnVector(index) {\n return Matrix.columnVector(this.getColumn(index));\n }\n\n setColumn(index, array) {\n checkColumnIndex(this, index);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, array[i]);\n }\n return this;\n }\n\n swapColumns(column1, column2) {\n checkColumnIndex(this, column1);\n checkColumnIndex(this, column2);\n for (let i = 0; i < this.rows; i++) {\n let temp = this.get(i, column1);\n this.set(i, column1, this.get(i, column2));\n this.set(i, column2, temp);\n }\n return this;\n }\n\n addRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[j]);\n }\n }\n return this;\n }\n\n subRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[j]);\n }\n }\n return this;\n }\n\n mulRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[j]);\n }\n }\n return this;\n }\n\n divRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[j]);\n }\n }\n return this;\n }\n\n addColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[i]);\n }\n }\n return this;\n }\n\n subColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[i]);\n }\n }\n return this;\n }\n\n mulColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[i]);\n }\n }\n return this;\n }\n\n divColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[i]);\n }\n }\n return this;\n }\n\n mulRow(index, value) {\n checkRowIndex(this, index);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, this.get(index, i) * value);\n }\n return this;\n }\n\n mulColumn(index, value) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, this.get(i, index) * value);\n }\n return this;\n }\n\n max(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n switch (by) {\n case 'row': {\n const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[row]) {\n max[row] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case 'column': {\n const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[column]) {\n max[column] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case undefined: {\n let max = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max) {\n max = this.get(row, column);\n }\n }\n }\n return max;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n maxIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) > v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n min(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n\n switch (by) {\n case 'row': {\n const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[row]) {\n min[row] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case 'column': {\n const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[column]) {\n min[column] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case undefined: {\n let min = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min) {\n min = this.get(row, column);\n }\n }\n }\n return min;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n minIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) < v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n maxRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n maxRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n minRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n minRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n maxColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n maxColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n minColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n minColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n diag() {\n let min = Math.min(this.rows, this.columns);\n let diag = [];\n for (let i = 0; i < min; i++) {\n diag.push(this.get(i, i));\n }\n return diag;\n }\n\n norm(type = 'frobenius') {\n let result = 0;\n if (type === 'max') {\n return this.max();\n } else if (type === 'frobenius') {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result = result + this.get(i, j) * this.get(i, j);\n }\n }\n return Math.sqrt(result);\n } else {\n throw new RangeError(`unknown norm type: ${type}`);\n }\n }\n\n cumulativeSum() {\n let sum = 0;\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n sum += this.get(i, j);\n this.set(i, j, sum);\n }\n }\n return this;\n }\n\n dot(vector2) {\n if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n let vector1 = this.to1DArray();\n if (vector1.length !== vector2.length) {\n throw new RangeError('vectors do not have the same size');\n }\n let dot = 0;\n for (let i = 0; i < vector1.length; i++) {\n dot += vector1[i] * vector2[i];\n }\n return dot;\n }\n\n mmul(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.columns;\n\n let result = new Matrix(m, p);\n\n let Bcolj = new Float64Array(n);\n for (let j = 0; j < p; j++) {\n for (let k = 0; k < n; k++) {\n Bcolj[k] = other.get(k, j);\n }\n\n for (let i = 0; i < m; i++) {\n let s = 0;\n for (let k = 0; k < n; k++) {\n s += this.get(i, k) * Bcolj[k];\n }\n\n result.set(i, j, s);\n }\n }\n return result;\n }\n\n strassen2x2(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(2, 2);\n const a11 = this.get(0, 0);\n const b11 = other.get(0, 0);\n const a12 = this.get(0, 1);\n const b12 = other.get(0, 1);\n const a21 = this.get(1, 0);\n const b21 = other.get(1, 0);\n const a22 = this.get(1, 1);\n const b22 = other.get(1, 1);\n\n // Compute intermediate values.\n const m1 = (a11 + a22) * (b11 + b22);\n const m2 = (a21 + a22) * b11;\n const m3 = a11 * (b12 - b22);\n const m4 = a22 * (b21 - b11);\n const m5 = (a11 + a12) * b22;\n const m6 = (a21 - a11) * (b11 + b12);\n const m7 = (a12 - a22) * (b21 + b22);\n\n // Combine intermediate values into the output.\n const c00 = m1 + m4 - m5 + m7;\n const c01 = m3 + m5;\n const c10 = m2 + m4;\n const c11 = m1 - m2 + m3 + m6;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n return result;\n }\n\n strassen3x3(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(3, 3);\n\n const a00 = this.get(0, 0);\n const a01 = this.get(0, 1);\n const a02 = this.get(0, 2);\n const a10 = this.get(1, 0);\n const a11 = this.get(1, 1);\n const a12 = this.get(1, 2);\n const a20 = this.get(2, 0);\n const a21 = this.get(2, 1);\n const a22 = this.get(2, 2);\n\n const b00 = other.get(0, 0);\n const b01 = other.get(0, 1);\n const b02 = other.get(0, 2);\n const b10 = other.get(1, 0);\n const b11 = other.get(1, 1);\n const b12 = other.get(1, 2);\n const b20 = other.get(2, 0);\n const b21 = other.get(2, 1);\n const b22 = other.get(2, 2);\n\n const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n const m2 = (a00 - a10) * (-b01 + b11);\n const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n const m5 = (a10 + a11) * (-b00 + b01);\n const m6 = a00 * b00;\n const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n const m8 = (-a00 + a20) * (b02 - b12);\n const m9 = (a20 + a21) * (-b00 + b02);\n const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n const m13 = (a02 - a22) * (b11 - b21);\n const m14 = a02 * b20;\n const m15 = (a21 + a22) * (-b20 + b21);\n const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n const m17 = (a02 - a12) * (b12 - b22);\n const m18 = (a11 + a12) * (-b20 + b22);\n const m19 = a01 * b10;\n const m20 = a12 * b21;\n const m21 = a10 * b02;\n const m22 = a20 * b01;\n const m23 = a22 * b22;\n\n const c00 = m6 + m14 + m19;\n const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n const c11 = m2 + m4 + m5 + m6 + m20;\n const c12 = m14 + m16 + m17 + m18 + m21;\n const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n const c21 = m12 + m13 + m14 + m15 + m22;\n const c22 = m6 + m7 + m8 + m9 + m23;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(0, 2, c02);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n result.set(1, 2, c12);\n result.set(2, 0, c20);\n result.set(2, 1, c21);\n result.set(2, 2, c22);\n return result;\n }\n\n mmulStrassen(y) {\n y = Matrix.checkMatrix(y);\n let x = this.clone();\n let r1 = x.rows;\n let c1 = x.columns;\n let r2 = y.rows;\n let c2 = y.columns;\n if (c1 !== r2) {\n // eslint-disable-next-line no-console\n console.warn(\n `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n );\n }\n\n // Put a matrix into the top left of a matrix of zeros.\n // `rows` and `cols` are the dimensions of the output matrix.\n function embed(mat, rows, cols) {\n let r = mat.rows;\n let c = mat.columns;\n if (r === rows && c === cols) {\n return mat;\n } else {\n let resultat = AbstractMatrix.zeros(rows, cols);\n resultat = resultat.setSubMatrix(mat, 0, 0);\n return resultat;\n }\n }\n\n // Make sure both matrices are the same size.\n // This is exclusively for simplicity:\n // this algorithm can be implemented with matrices of different sizes.\n\n let r = Math.max(r1, r2);\n let c = Math.max(c1, c2);\n x = embed(x, r, c);\n y = embed(y, r, c);\n\n // Our recursive multiplication function.\n function blockMult(a, b, rows, cols) {\n // For small matrices, resort to naive multiplication.\n if (rows <= 512 || cols <= 512) {\n return a.mmul(b); // a is equivalent to this\n }\n\n // Apply dynamic padding.\n if (rows % 2 === 1 && cols % 2 === 1) {\n a = embed(a, rows + 1, cols + 1);\n b = embed(b, rows + 1, cols + 1);\n } else if (rows % 2 === 1) {\n a = embed(a, rows + 1, cols);\n b = embed(b, rows + 1, cols);\n } else if (cols % 2 === 1) {\n a = embed(a, rows, cols + 1);\n b = embed(b, rows, cols + 1);\n }\n\n let halfRows = parseInt(a.rows / 2, 10);\n let halfCols = parseInt(a.columns / 2, 10);\n // Subdivide input matrices.\n let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n // Compute intermediate values.\n let m1 = blockMult(\n AbstractMatrix.add(a11, a22),\n AbstractMatrix.add(b11, b22),\n halfRows,\n halfCols,\n );\n let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n let m6 = blockMult(\n AbstractMatrix.sub(a21, a11),\n AbstractMatrix.add(b11, b12),\n halfRows,\n halfCols,\n );\n let m7 = blockMult(\n AbstractMatrix.sub(a12, a22),\n AbstractMatrix.add(b21, b22),\n halfRows,\n halfCols,\n );\n\n // Combine intermediate values into the output.\n let c11 = AbstractMatrix.add(m1, m4);\n c11.sub(m5);\n c11.add(m7);\n let c12 = AbstractMatrix.add(m3, m5);\n let c21 = AbstractMatrix.add(m2, m4);\n let c22 = AbstractMatrix.sub(m1, m2);\n c22.add(m3);\n c22.add(m6);\n\n // Crop output to the desired size (undo dynamic padding).\n let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n resultat = resultat.setSubMatrix(c11, 0, 0);\n resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n }\n\n return blockMult(x, y, r, c);\n }\n\n scaleRows(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.rows; i++) {\n const row = this.getRow(i);\n if (row.length > 0) {\n rescale(row, { min, max, output: row });\n }\n newMatrix.setRow(i, row);\n }\n return newMatrix;\n }\n\n scaleColumns(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.columns; i++) {\n const column = this.getColumn(i);\n if (column.length) {\n rescale(column, {\n min: min,\n max: max,\n output: column,\n });\n }\n newMatrix.setColumn(i, column);\n }\n return newMatrix;\n }\n\n flipRows() {\n const middle = Math.ceil(this.columns / 2);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < middle; j++) {\n let first = this.get(i, j);\n let last = this.get(i, this.columns - 1 - j);\n this.set(i, j, last);\n this.set(i, this.columns - 1 - j, first);\n }\n }\n return this;\n }\n\n flipColumns() {\n const middle = Math.ceil(this.rows / 2);\n for (let j = 0; j < this.columns; j++) {\n for (let i = 0; i < middle; i++) {\n let first = this.get(i, j);\n let last = this.get(this.rows - 1 - i, j);\n this.set(i, j, last);\n this.set(this.rows - 1 - i, j, first);\n }\n }\n return this;\n }\n\n kroneckerProduct(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.rows;\n let q = other.columns;\n\n let result = new Matrix(m * p, n * q);\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n for (let k = 0; k < p; k++) {\n for (let l = 0; l < q; l++) {\n result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n }\n }\n }\n }\n return result;\n }\n\n kroneckerSum(other) {\n other = Matrix.checkMatrix(other);\n if (!this.isSquare() || !other.isSquare()) {\n throw new Error('Kronecker Sum needs two Square Matrices');\n }\n let m = this.rows;\n let n = other.rows;\n let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n return AxI.add(IxB);\n }\n\n transpose() {\n let result = new Matrix(this.columns, this.rows);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result.set(j, i, this.get(i, j));\n }\n }\n return result;\n }\n\n sortRows(compareFunction = compareNumbers) {\n for (let i = 0; i < this.rows; i++) {\n this.setRow(i, this.getRow(i).sort(compareFunction));\n }\n return this;\n }\n\n sortColumns(compareFunction = compareNumbers) {\n for (let i = 0; i < this.columns; i++) {\n this.setColumn(i, this.getColumn(i).sort(compareFunction));\n }\n return this;\n }\n\n subMatrix(startRow, endRow, startColumn, endColumn) {\n checkRange(this, startRow, endRow, startColumn, endColumn);\n let newMatrix = new Matrix(\n endRow - startRow + 1,\n endColumn - startColumn + 1,\n );\n for (let i = startRow; i <= endRow; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n }\n }\n return newMatrix;\n }\n\n subMatrixRow(indices, startColumn, endColumn) {\n if (startColumn === undefined) startColumn = 0;\n if (endColumn === undefined) endColumn = this.columns - 1;\n if (\n startColumn > endColumn ||\n startColumn < 0 ||\n startColumn >= this.columns ||\n endColumn < 0 ||\n endColumn >= this.columns\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n if (indices[i] < 0 || indices[i] >= this.rows) {\n throw new RangeError(`Row index out of range: ${indices[i]}`);\n }\n newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n }\n }\n return newMatrix;\n }\n\n subMatrixColumn(indices, startRow, endRow) {\n if (startRow === undefined) startRow = 0;\n if (endRow === undefined) endRow = this.rows - 1;\n if (\n startRow > endRow ||\n startRow < 0 ||\n startRow >= this.rows ||\n endRow < 0 ||\n endRow >= this.rows\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startRow; j <= endRow; j++) {\n if (indices[i] < 0 || indices[i] >= this.columns) {\n throw new RangeError(`Column index out of range: ${indices[i]}`);\n }\n newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n }\n }\n return newMatrix;\n }\n\n setSubMatrix(matrix, startRow, startColumn) {\n matrix = Matrix.checkMatrix(matrix);\n if (matrix.isEmpty()) {\n return this;\n }\n let endRow = startRow + matrix.rows - 1;\n let endColumn = startColumn + matrix.columns - 1;\n checkRange(this, startRow, endRow, startColumn, endColumn);\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n this.set(startRow + i, startColumn + j, matrix.get(i, j));\n }\n }\n return this;\n }\n\n selection(rowIndices, columnIndices) {\n checkRowIndices(this, rowIndices);\n checkColumnIndices(this, columnIndices);\n let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n for (let i = 0; i < rowIndices.length; i++) {\n let rowIndex = rowIndices[i];\n for (let j = 0; j < columnIndices.length; j++) {\n let columnIndex = columnIndices[j];\n newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n }\n }\n return newMatrix;\n }\n\n trace() {\n let min = Math.min(this.rows, this.columns);\n let trace = 0;\n for (let i = 0; i < min; i++) {\n trace += this.get(i, i);\n }\n return trace;\n }\n\n clone() {\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n newMatrix.set(row, column, this.get(row, column));\n }\n }\n return newMatrix;\n }\n\n sum(by) {\n switch (by) {\n case 'row':\n return sumByRow(this);\n case 'column':\n return sumByColumn(this);\n case undefined:\n return sumAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n product(by) {\n switch (by) {\n case 'row':\n return productByRow(this);\n case 'column':\n return productByColumn(this);\n case undefined:\n return productAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n mean(by) {\n const sum = this.sum(by);\n switch (by) {\n case 'row': {\n for (let i = 0; i < this.rows; i++) {\n sum[i] /= this.columns;\n }\n return sum;\n }\n case 'column': {\n for (let i = 0; i < this.columns; i++) {\n sum[i] /= this.rows;\n }\n return sum;\n }\n case undefined:\n return sum / this.size;\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n variance(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { unbiased = true, mean = this.mean(by) } = options;\n if (typeof unbiased !== 'boolean') {\n throw new TypeError('unbiased must be a boolean');\n }\n switch (by) {\n case 'row': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByRow(this, unbiased, mean);\n }\n case 'column': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByColumn(this, unbiased, mean);\n }\n case undefined: {\n if (typeof mean !== 'number') {\n throw new TypeError('mean must be a number');\n }\n return varianceAll(this, unbiased, mean);\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n standardDeviation(by, options) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n const variance = this.variance(by, options);\n if (by === undefined) {\n return Math.sqrt(variance);\n } else {\n for (let i = 0; i < variance.length; i++) {\n variance[i] = Math.sqrt(variance[i]);\n }\n return variance;\n }\n }\n\n center(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { center = this.mean(by) } = options;\n switch (by) {\n case 'row': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByRow(this, center);\n return this;\n }\n case 'column': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByColumn(this, center);\n return this;\n }\n case undefined: {\n if (typeof center !== 'number') {\n throw new TypeError('center must be a number');\n }\n centerAll(this, center);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n scale(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n let scale = options.scale;\n switch (by) {\n case 'row': {\n if (scale === undefined) {\n scale = getScaleByRow(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByRow(this, scale);\n return this;\n }\n case 'column': {\n if (scale === undefined) {\n scale = getScaleByColumn(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByColumn(this, scale);\n return this;\n }\n case undefined: {\n if (scale === undefined) {\n scale = getScaleAll(this);\n } else if (typeof scale !== 'number') {\n throw new TypeError('scale must be a number');\n }\n scaleAll(this, scale);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n toString(options) {\n return inspectMatrixWithOptions(this, options);\n }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n return array.every((element) => {\n return typeof element === 'number';\n });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n constructor(nRows, nColumns) {\n super();\n if (Matrix.isMatrix(nRows)) {\n // eslint-disable-next-line no-constructor-return\n return nRows.clone();\n } else if (Number.isInteger(nRows) && nRows >= 0) {\n // Create an empty matrix\n this.data = [];\n if (Number.isInteger(nColumns) && nColumns >= 0) {\n for (let i = 0; i < nRows; i++) {\n this.data.push(new Float64Array(nColumns));\n }\n } else {\n throw new TypeError('nColumns must be a positive integer');\n }\n } else if (isAnyArray(nRows)) {\n // Copy the values from the 2D array\n const arrayData = nRows;\n nRows = arrayData.length;\n nColumns = nRows ? arrayData[0].length : 0;\n if (typeof nColumns !== 'number') {\n throw new TypeError(\n 'Data must be a 2D array with at least one element',\n );\n }\n this.data = [];\n for (let i = 0; i < nRows; i++) {\n if (arrayData[i].length !== nColumns) {\n throw new RangeError('Inconsistent array dimensions');\n }\n if (!isArrayOfNumbers(arrayData[i])) {\n throw new TypeError('Input data contains non-numeric values');\n }\n this.data.push(Float64Array.from(arrayData[i]));\n }\n } else {\n throw new TypeError(\n 'First argument must be a positive number or an array',\n );\n }\n this.rows = nRows;\n this.columns = nColumns;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n\n removeRow(index) {\n checkRowIndex(this, index);\n this.data.splice(index, 1);\n this.rows -= 1;\n return this;\n }\n\n addRow(index, array) {\n if (array === undefined) {\n array = index;\n index = this.rows;\n }\n checkRowIndex(this, index, true);\n array = Float64Array.from(checkRowVector(this, array));\n this.data.splice(index, 0, array);\n this.rows += 1;\n return this;\n }\n\n removeColumn(index) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns - 1);\n for (let j = 0; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n for (let j = index + 1; j < this.columns; j++) {\n newRow[j - 1] = this.data[i][j];\n }\n this.data[i] = newRow;\n }\n this.columns -= 1;\n return this;\n }\n\n addColumn(index, array) {\n if (typeof array === 'undefined') {\n array = index;\n index = this.columns;\n }\n checkColumnIndex(this, index, true);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns + 1);\n let j = 0;\n for (; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n newRow[j++] = array[i];\n for (; j < this.columns + 1; j++) {\n newRow[j] = this.data[i][j - 1];\n }\n this.data[i] = newRow;\n }\n this.columns += 1;\n return this;\n }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n let sum = newArray(matrix.rows);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumByColumn(matrix) {\n let sum = newArray(matrix.columns);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumAll(matrix) {\n let v = 0;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v += matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function productByRow(matrix) {\n let sum = newArray(matrix.rows, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productByColumn(matrix) {\n let sum = newArray(matrix.columns, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productAll(matrix) {\n let v = 1;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v *= matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let i = 0; i < rows; i++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean[i];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n }\n }\n return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let j = 0; j < cols; j++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n x = matrix.get(i, j) - mean[j];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n }\n }\n return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const size = rows * cols;\n\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean;\n sum1 += x;\n sum2 += x * x;\n }\n }\n if (unbiased) {\n return (sum2 - (sum1 * sum1) / size) / (size - 1);\n } else {\n return (sum2 - (sum1 * sum1) / size) / size;\n }\n}\n\nexport function centerByRow(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[i]);\n }\n }\n}\n\nexport function centerByColumn(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[j]);\n }\n }\n}\n\nexport function centerAll(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean);\n }\n }\n}\n\nexport function getScaleByRow(matrix) {\n const scale = [];\n for (let i = 0; i < matrix.rows; i++) {\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[i]);\n }\n }\n}\n\nexport function getScaleByColumn(matrix) {\n const scale = [];\n for (let j = 0; j < matrix.columns; j++) {\n let sum = 0;\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[j]);\n }\n }\n}\n\nexport function getScaleAll(matrix) {\n const divider = matrix.size - 1;\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / divider;\n }\n }\n return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale);\n }\n }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n AbstractMatrix.prototype.add = function add(value) {\n if (typeof value === 'number') return this.addS(value);\n return this.addM(value);\n };\n\n AbstractMatrix.prototype.addS = function addS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.addM = function addM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.add = function add(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.add(value);\n };\n\n AbstractMatrix.prototype.sub = function sub(value) {\n if (typeof value === 'number') return this.subS(value);\n return this.subM(value);\n };\n\n AbstractMatrix.prototype.subS = function subS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.subM = function subM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.sub = function sub(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sub(value);\n };\n AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n AbstractMatrix.subtract = AbstractMatrix.sub;\n\n AbstractMatrix.prototype.mul = function mul(value) {\n if (typeof value === 'number') return this.mulS(value);\n return this.mulM(value);\n };\n\n AbstractMatrix.prototype.mulS = function mulS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.mulM = function mulM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mul = function mul(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mul(value);\n };\n AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n AbstractMatrix.multiply = AbstractMatrix.mul;\n\n AbstractMatrix.prototype.div = function div(value) {\n if (typeof value === 'number') return this.divS(value);\n return this.divM(value);\n };\n\n AbstractMatrix.prototype.divS = function divS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.divM = function divM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.div = function div(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.div(value);\n };\n AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n AbstractMatrix.divide = AbstractMatrix.div;\n\n AbstractMatrix.prototype.mod = function mod(value) {\n if (typeof value === 'number') return this.modS(value);\n return this.modM(value);\n };\n\n AbstractMatrix.prototype.modS = function modS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.modM = function modM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mod = function mod(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mod(value);\n };\n AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n AbstractMatrix.modulus = AbstractMatrix.mod;\n\n AbstractMatrix.prototype.and = function and(value) {\n if (typeof value === 'number') return this.andS(value);\n return this.andM(value);\n };\n\n AbstractMatrix.prototype.andS = function andS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.andM = function andM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.and = function and(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.and(value);\n };\n\n AbstractMatrix.prototype.or = function or(value) {\n if (typeof value === 'number') return this.orS(value);\n return this.orM(value);\n };\n\n AbstractMatrix.prototype.orS = function orS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.orM = function orM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.or = function or(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.or(value);\n };\n\n AbstractMatrix.prototype.xor = function xor(value) {\n if (typeof value === 'number') return this.xorS(value);\n return this.xorM(value);\n };\n\n AbstractMatrix.prototype.xorS = function xorS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.xorM = function xorM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.xor = function xor(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.xor(value);\n };\n\n AbstractMatrix.prototype.leftShift = function leftShift(value) {\n if (typeof value === 'number') return this.leftShiftS(value);\n return this.leftShiftM(value);\n };\n\n AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.leftShift = function leftShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.leftShift(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n return this.signPropagatingRightShiftM(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.signPropagatingRightShift(value);\n };\n\n AbstractMatrix.prototype.rightShift = function rightShift(value) {\n if (typeof value === 'number') return this.rightShiftS(value);\n return this.rightShiftM(value);\n };\n\n AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.rightShift = function rightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.rightShift(value);\n };\n AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n AbstractMatrix.prototype.not = function not() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, ~(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.not = function not(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.not();\n };\n\n AbstractMatrix.prototype.abs = function abs() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.abs(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.abs = function abs(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.abs();\n };\n\n AbstractMatrix.prototype.acos = function acos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acos = function acos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acos();\n };\n\n AbstractMatrix.prototype.acosh = function acosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acosh = function acosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acosh();\n };\n\n AbstractMatrix.prototype.asin = function asin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asin = function asin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asin();\n };\n\n AbstractMatrix.prototype.asinh = function asinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asinh = function asinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asinh();\n };\n\n AbstractMatrix.prototype.atan = function atan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atan = function atan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atan();\n };\n\n AbstractMatrix.prototype.atanh = function atanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atanh = function atanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atanh();\n };\n\n AbstractMatrix.prototype.cbrt = function cbrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cbrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cbrt = function cbrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cbrt();\n };\n\n AbstractMatrix.prototype.ceil = function ceil() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.ceil(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.ceil = function ceil(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.ceil();\n };\n\n AbstractMatrix.prototype.clz32 = function clz32() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.clz32(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.clz32 = function clz32(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.clz32();\n };\n\n AbstractMatrix.prototype.cos = function cos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cos = function cos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cos();\n };\n\n AbstractMatrix.prototype.cosh = function cosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cosh = function cosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cosh();\n };\n\n AbstractMatrix.prototype.exp = function exp() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.exp(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.exp = function exp(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.exp();\n };\n\n AbstractMatrix.prototype.expm1 = function expm1() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.expm1(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.expm1 = function expm1(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.expm1();\n };\n\n AbstractMatrix.prototype.floor = function floor() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.floor(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.floor = function floor(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.floor();\n };\n\n AbstractMatrix.prototype.fround = function fround() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.fround(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.fround = function fround(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.fround();\n };\n\n AbstractMatrix.prototype.log = function log() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log = function log(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log();\n };\n\n AbstractMatrix.prototype.log1p = function log1p() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log1p(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log1p = function log1p(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log1p();\n };\n\n AbstractMatrix.prototype.log10 = function log10() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log10(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log10 = function log10(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log10();\n };\n\n AbstractMatrix.prototype.log2 = function log2() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log2(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log2 = function log2(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log2();\n };\n\n AbstractMatrix.prototype.round = function round() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.round(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.round = function round(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.round();\n };\n\n AbstractMatrix.prototype.sign = function sign() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sign(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sign = function sign(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sign();\n };\n\n AbstractMatrix.prototype.sin = function sin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sin = function sin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sin();\n };\n\n AbstractMatrix.prototype.sinh = function sinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sinh = function sinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sinh();\n };\n\n AbstractMatrix.prototype.sqrt = function sqrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sqrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sqrt = function sqrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sqrt();\n };\n\n AbstractMatrix.prototype.tan = function tan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tan = function tan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tan();\n };\n\n AbstractMatrix.prototype.tanh = function tanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tanh = function tanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tanh();\n };\n\n AbstractMatrix.prototype.trunc = function trunc() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.trunc(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.trunc = function trunc(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.trunc();\n };\n\n AbstractMatrix.pow = function pow(matrix, arg0) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.pow(arg0);\n };\n\n AbstractMatrix.prototype.pow = function pow(value) {\n if (typeof value === 'number') return this.powS(value);\n return this.powM(value);\n };\n\n AbstractMatrix.prototype.powS = function powS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), value));\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.powM = function powM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n }\n }\n return this;\n };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n constructor(data) {\n super();\n this.data = data;\n this.rows = data.length;\n this.columns = data[0].length;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n constructor(matrix) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n let lu = matrix.clone();\n let rows = lu.rows;\n let columns = lu.columns;\n let pivotVector = new Float64Array(rows);\n let pivotSign = 1;\n let i, j, k, p, s, t, v;\n let LUcolj, kmax;\n\n for (i = 0; i < rows; i++) {\n pivotVector[i] = i;\n }\n\n LUcolj = new Float64Array(rows);\n\n for (j = 0; j < columns; j++) {\n for (i = 0; i < rows; i++) {\n LUcolj[i] = lu.get(i, j);\n }\n\n for (i = 0; i < rows; i++) {\n kmax = Math.min(i, j);\n s = 0;\n for (k = 0; k < kmax; k++) {\n s += lu.get(i, k) * LUcolj[k];\n }\n LUcolj[i] -= s;\n lu.set(i, j, LUcolj[i]);\n }\n\n p = j;\n for (i = j + 1; i < rows; i++) {\n if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n p = i;\n }\n }\n\n if (p !== j) {\n for (k = 0; k < columns; k++) {\n t = lu.get(p, k);\n lu.set(p, k, lu.get(j, k));\n lu.set(j, k, t);\n }\n\n v = pivotVector[p];\n pivotVector[p] = pivotVector[j];\n pivotVector[j] = v;\n\n pivotSign = -pivotSign;\n }\n\n if (j < rows && lu.get(j, j) !== 0) {\n for (i = j + 1; i < rows; i++) {\n lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n }\n }\n }\n\n this.LU = lu;\n this.pivotVector = pivotVector;\n this.pivotSign = pivotSign;\n }\n\n isSingular() {\n let data = this.LU;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n if (data.get(j, j) === 0) {\n return true;\n }\n }\n return false;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let lu = this.LU;\n let rows = lu.rows;\n\n if (rows !== value.rows) {\n throw new Error('Invalid matrix dimensions');\n }\n if (this.isSingular()) {\n throw new Error('LU matrix is singular');\n }\n\n let count = value.columns;\n let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n let columns = lu.columns;\n let i, j, k;\n\n for (k = 0; k < columns; k++) {\n for (i = k + 1; i < columns; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n for (k = columns - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / lu.get(k, k));\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n return X;\n }\n\n get determinant() {\n let data = this.LU;\n if (!data.isSquare()) {\n throw new Error('Matrix must be square');\n }\n let determinant = this.pivotSign;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n determinant *= data.get(j, j);\n }\n return determinant;\n }\n\n get lowerTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i > j) {\n X.set(i, j, data.get(i, j));\n } else if (i === j) {\n X.set(i, j, 1);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get upperTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i <= j) {\n X.set(i, j, data.get(i, j));\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get pivotPermutationVector() {\n return Array.from(this.pivotVector);\n }\n}\n","export function hypotenuse(a, b) {\n let r = 0;\n if (Math.abs(a) > Math.abs(b)) {\n r = b / a;\n return Math.abs(a) * Math.sqrt(1 + r * r);\n }\n if (b !== 0) {\n r = a / b;\n return Math.abs(b) * Math.sqrt(1 + r * r);\n }\n return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n constructor(value) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n let qr = value.clone();\n let m = value.rows;\n let n = value.columns;\n let rdiag = new Float64Array(n);\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n let nrm = 0;\n for (i = k; i < m; i++) {\n nrm = hypotenuse(nrm, qr.get(i, k));\n }\n if (nrm !== 0) {\n if (qr.get(k, k) < 0) {\n nrm = -nrm;\n }\n for (i = k; i < m; i++) {\n qr.set(i, k, qr.get(i, k) / nrm);\n }\n qr.set(k, k, qr.get(k, k) + 1);\n for (j = k + 1; j < n; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * qr.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n rdiag[k] = -nrm;\n }\n\n this.QR = qr;\n this.Rdiag = rdiag;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let qr = this.QR;\n let m = qr.rows;\n\n if (value.rows !== m) {\n throw new Error('Matrix row dimensions must agree');\n }\n if (!this.isFullRank()) {\n throw new Error('Matrix is rank deficient');\n }\n\n let count = value.columns;\n let X = value.clone();\n let n = qr.columns;\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n for (j = 0; j < count; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n for (k = n - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n }\n }\n }\n\n return X.subMatrix(0, n - 1, 0, count - 1);\n }\n\n isFullRank() {\n let columns = this.QR.columns;\n for (let i = 0; i < columns; i++) {\n if (this.Rdiag[i] === 0) {\n return false;\n }\n }\n return true;\n }\n\n get upperTriangularMatrix() {\n let qr = this.QR;\n let n = qr.columns;\n let X = new Matrix(n, n);\n let i, j;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i < j) {\n X.set(i, j, qr.get(i, j));\n } else if (i === j) {\n X.set(i, j, this.Rdiag[i]);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get orthogonalMatrix() {\n let qr = this.QR;\n let rows = qr.rows;\n let columns = qr.columns;\n let X = new Matrix(rows, columns);\n let i, j, k, s;\n\n for (k = columns - 1; k >= 0; k--) {\n for (i = 0; i < rows; i++) {\n X.set(i, k, 0);\n }\n X.set(k, k, 1);\n for (j = k; j < columns; j++) {\n if (qr.get(k, k) !== 0) {\n s = 0;\n for (i = k; i < rows; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n\n s = -s / qr.get(k, k);\n\n for (i = k; i < rows; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n }\n return X;\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n constructor(value, options = {}) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n if (value.isEmpty()) {\n throw new Error('Matrix must be non-empty');\n }\n\n let m = value.rows;\n let n = value.columns;\n\n const {\n computeLeftSingularVectors = true,\n computeRightSingularVectors = true,\n autoTranspose = false,\n } = options;\n\n let wantu = Boolean(computeLeftSingularVectors);\n let wantv = Boolean(computeRightSingularVectors);\n\n let swapped = false;\n let a;\n if (m < n) {\n if (!autoTranspose) {\n a = value.clone();\n // eslint-disable-next-line no-console\n console.warn(\n 'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n );\n } else {\n a = value.transpose();\n m = a.rows;\n n = a.columns;\n swapped = true;\n let aux = wantu;\n wantu = wantv;\n wantv = aux;\n }\n } else {\n a = value.clone();\n }\n\n let nu = Math.min(m, n);\n let ni = Math.min(m + 1, n);\n let s = new Float64Array(ni);\n let U = new Matrix(m, nu);\n let V = new Matrix(n, n);\n\n let e = new Float64Array(n);\n let work = new Float64Array(m);\n\n let si = new Float64Array(ni);\n for (let i = 0; i < ni; i++) si[i] = i;\n\n let nct = Math.min(m - 1, n);\n let nrt = Math.max(0, Math.min(n - 2, m));\n let mrc = Math.max(nct, nrt);\n\n for (let k = 0; k < mrc; k++) {\n if (k < nct) {\n s[k] = 0;\n for (let i = k; i < m; i++) {\n s[k] = hypotenuse(s[k], a.get(i, k));\n }\n if (s[k] !== 0) {\n if (a.get(k, k) < 0) {\n s[k] = -s[k];\n }\n for (let i = k; i < m; i++) {\n a.set(i, k, a.get(i, k) / s[k]);\n }\n a.set(k, k, a.get(k, k) + 1);\n }\n s[k] = -s[k];\n }\n\n for (let j = k + 1; j < n; j++) {\n if (k < nct && s[k] !== 0) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += a.get(i, k) * a.get(i, j);\n }\n t = -t / a.get(k, k);\n for (let i = k; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * a.get(i, k));\n }\n }\n e[j] = a.get(k, j);\n }\n\n if (wantu && k < nct) {\n for (let i = k; i < m; i++) {\n U.set(i, k, a.get(i, k));\n }\n }\n\n if (k < nrt) {\n e[k] = 0;\n for (let i = k + 1; i < n; i++) {\n e[k] = hypotenuse(e[k], e[i]);\n }\n if (e[k] !== 0) {\n if (e[k + 1] < 0) {\n e[k] = 0 - e[k];\n }\n for (let i = k + 1; i < n; i++) {\n e[i] /= e[k];\n }\n e[k + 1] += 1;\n }\n e[k] = -e[k];\n if (k + 1 < m && e[k] !== 0) {\n for (let i = k + 1; i < m; i++) {\n work[i] = 0;\n }\n for (let i = k + 1; i < m; i++) {\n for (let j = k + 1; j < n; j++) {\n work[i] += e[j] * a.get(i, j);\n }\n }\n for (let j = k + 1; j < n; j++) {\n let t = -e[j] / e[k + 1];\n for (let i = k + 1; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * work[i]);\n }\n }\n }\n if (wantv) {\n for (let i = k + 1; i < n; i++) {\n V.set(i, k, e[i]);\n }\n }\n }\n }\n\n let p = Math.min(n, m + 1);\n if (nct < n) {\n s[nct] = a.get(nct, nct);\n }\n if (m < p) {\n s[p - 1] = 0;\n }\n if (nrt + 1 < p) {\n e[nrt] = a.get(nrt, p - 1);\n }\n e[p - 1] = 0;\n\n if (wantu) {\n for (let j = nct; j < nu; j++) {\n for (let i = 0; i < m; i++) {\n U.set(i, j, 0);\n }\n U.set(j, j, 1);\n }\n for (let k = nct - 1; k >= 0; k--) {\n if (s[k] !== 0) {\n for (let j = k + 1; j < nu; j++) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += U.get(i, k) * U.get(i, j);\n }\n t = -t / U.get(k, k);\n for (let i = k; i < m; i++) {\n U.set(i, j, U.get(i, j) + t * U.get(i, k));\n }\n }\n for (let i = k; i < m; i++) {\n U.set(i, k, -U.get(i, k));\n }\n U.set(k, k, 1 + U.get(k, k));\n for (let i = 0; i < k - 1; i++) {\n U.set(i, k, 0);\n }\n } else {\n for (let i = 0; i < m; i++) {\n U.set(i, k, 0);\n }\n U.set(k, k, 1);\n }\n }\n }\n\n if (wantv) {\n for (let k = n - 1; k >= 0; k--) {\n if (k < nrt && e[k] !== 0) {\n for (let j = k + 1; j < n; j++) {\n let t = 0;\n for (let i = k + 1; i < n; i++) {\n t += V.get(i, k) * V.get(i, j);\n }\n t = -t / V.get(k + 1, k);\n for (let i = k + 1; i < n; i++) {\n V.set(i, j, V.get(i, j) + t * V.get(i, k));\n }\n }\n }\n for (let i = 0; i < n; i++) {\n V.set(i, k, 0);\n }\n V.set(k, k, 1);\n }\n }\n\n let pp = p - 1;\n let iter = 0;\n let eps = Number.EPSILON;\n while (p > 0) {\n let k, kase;\n for (k = p - 2; k >= -1; k--) {\n if (k === -1) {\n break;\n }\n const alpha =\n Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n e[k] = 0;\n break;\n }\n }\n if (k === p - 2) {\n kase = 4;\n } else {\n let ks;\n for (ks = p - 1; ks >= k; ks--) {\n if (ks === k) {\n break;\n }\n let t =\n (ks !== p ? Math.abs(e[ks]) : 0) +\n (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n if (Math.abs(s[ks]) <= eps * t) {\n s[ks] = 0;\n break;\n }\n }\n if (ks === k) {\n kase = 3;\n } else if (ks === p - 1) {\n kase = 1;\n } else {\n kase = 2;\n k = ks;\n }\n }\n\n k++;\n\n switch (kase) {\n case 1: {\n let f = e[p - 2];\n e[p - 2] = 0;\n for (let j = p - 2; j >= k; j--) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n if (j !== k) {\n f = -sn * e[j - 1];\n e[j - 1] = cs * e[j - 1];\n }\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n V.set(i, j, t);\n }\n }\n }\n break;\n }\n case 2: {\n let f = e[k - 1];\n e[k - 1] = 0;\n for (let j = k; j < p; j++) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n f = -sn * e[j];\n e[j] = cs * e[j];\n if (wantu) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n U.set(i, j, t);\n }\n }\n }\n break;\n }\n case 3: {\n const scale = Math.max(\n Math.abs(s[p - 1]),\n Math.abs(s[p - 2]),\n Math.abs(e[p - 2]),\n Math.abs(s[k]),\n Math.abs(e[k]),\n );\n const sp = s[p - 1] / scale;\n const spm1 = s[p - 2] / scale;\n const epm1 = e[p - 2] / scale;\n const sk = s[k] / scale;\n const ek = e[k] / scale;\n const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n const c = sp * epm1 * (sp * epm1);\n let shift = 0;\n if (b !== 0 || c !== 0) {\n if (b < 0) {\n shift = 0 - Math.sqrt(b * b + c);\n } else {\n shift = Math.sqrt(b * b + c);\n }\n shift = c / (b + shift);\n }\n let f = (sk + sp) * (sk - sp) + shift;\n let g = sk * ek;\n for (let j = k; j < p - 1; j++) {\n let t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n let cs = f / t;\n let sn = g / t;\n if (j !== k) {\n e[j - 1] = t;\n }\n f = cs * s[j] + sn * e[j];\n e[j] = cs * e[j] - sn * s[j];\n g = sn * s[j + 1];\n s[j + 1] = cs * s[j + 1];\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n V.set(i, j, t);\n }\n }\n t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n cs = f / t;\n sn = g / t;\n s[j] = t;\n f = cs * e[j] + sn * s[j + 1];\n s[j + 1] = -sn * e[j] + cs * s[j + 1];\n g = sn * e[j + 1];\n e[j + 1] = cs * e[j + 1];\n if (wantu && j < m - 1) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n U.set(i, j, t);\n }\n }\n }\n e[p - 2] = f;\n iter = iter + 1;\n break;\n }\n case 4: {\n if (s[k] <= 0) {\n s[k] = s[k] < 0 ? -s[k] : 0;\n if (wantv) {\n for (let i = 0; i <= pp; i++) {\n V.set(i, k, -V.get(i, k));\n }\n }\n }\n while (k < pp) {\n if (s[k] >= s[k + 1]) {\n break;\n }\n let t = s[k];\n s[k] = s[k + 1];\n s[k + 1] = t;\n if (wantv && k < n - 1) {\n for (let i = 0; i < n; i++) {\n t = V.get(i, k + 1);\n V.set(i, k + 1, V.get(i, k));\n V.set(i, k, t);\n }\n }\n if (wantu && k < m - 1) {\n for (let i = 0; i < m; i++) {\n t = U.get(i, k + 1);\n U.set(i, k + 1, U.get(i, k));\n U.set(i, k, t);\n }\n }\n k++;\n }\n iter = 0;\n p--;\n break;\n }\n // no default\n }\n }\n\n if (swapped) {\n let tmp = V;\n V = U;\n U = tmp;\n }\n\n this.m = m;\n this.n = n;\n this.s = s;\n this.U = U;\n this.V = V;\n }\n\n solve(value) {\n let Y = value;\n let e = this.threshold;\n let scols = this.s.length;\n let Ls = Matrix.zeros(scols, scols);\n\n for (let i = 0; i < scols; i++) {\n if (Math.abs(this.s[i]) <= e) {\n Ls.set(i, i, 0);\n } else {\n Ls.set(i, i, 1 / this.s[i]);\n }\n }\n\n let U = this.U;\n let V = this.rightSingularVectors;\n\n let VL = V.mmul(Ls);\n let vrows = V.rows;\n let urows = U.rows;\n let VLU = Matrix.zeros(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < scols; k++) {\n sum += VL.get(i, k) * U.get(j, k);\n }\n VLU.set(i, j, sum);\n }\n }\n\n return VLU.mmul(Y);\n }\n\n solveForDiagonal(value) {\n return this.solve(Matrix.diag(value));\n }\n\n inverse() {\n let V = this.V;\n let e = this.threshold;\n let vrows = V.rows;\n let vcols = V.columns;\n let X = new Matrix(vrows, this.s.length);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < vcols; j++) {\n if (Math.abs(this.s[j]) > e) {\n X.set(i, j, V.get(i, j) / this.s[j]);\n }\n }\n }\n\n let U = this.U;\n\n let urows = U.rows;\n let ucols = U.columns;\n let Y = new Matrix(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < ucols; k++) {\n sum += X.get(i, k) * U.get(j, k);\n }\n Y.set(i, j, sum);\n }\n }\n\n return Y;\n }\n\n get condition() {\n return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n }\n\n get norm2() {\n return this.s[0];\n }\n\n get rank() {\n let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n let r = 0;\n let s = this.s;\n for (let i = 0, ii = s.length; i < ii; i++) {\n if (s[i] > tol) {\n r++;\n }\n }\n return r;\n }\n\n get diagonal() {\n return Array.from(this.s);\n }\n\n get threshold() {\n return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n }\n\n get leftSingularVectors() {\n return this.U;\n }\n\n get rightSingularVectors() {\n return this.V;\n }\n\n get diagonalMatrix() {\n return Matrix.diag(this.s);\n }\n}\n","import { inverse, Matrix } from 'ml-matrix';\n\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\nfunction gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n paramFunction,\n) {\n const n = params.length;\n const m = data.x.length;\n\n let ans = new Array(n);\n\n for (let param = 0; param < n; param++) {\n ans[param] = new Array(m);\n let auxParams = params.slice();\n auxParams[param] += gradientDifference;\n let funcParam = paramFunction(auxParams);\n\n for (let point = 0; point < m; point++) {\n ans[param][point] = evaluatedData[point] - funcParam(data.x[point]);\n }\n }\n return new Matrix(ans);\n}\n\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n const m = data.x.length;\n\n let ans = new Array(m);\n\n for (let point = 0; point < m; point++) {\n ans[point] = [data.y[point] - evaluatedData[point]];\n }\n\n return new Matrix(ans);\n}\n\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Array<number>}\n */\nexport default function step(\n data,\n params,\n damping,\n gradientDifference,\n parameterizedFunction,\n) {\n let value = damping * gradientDifference * gradientDifference;\n let identity = Matrix.eye(params.length, params.length, value);\n\n const func = parameterizedFunction(params);\n\n let evaluatedData = new Float64Array(data.x.length);\n for (let i = 0; i < data.x.length; i++) {\n evaluatedData[i] = func(data.x[i]);\n }\n\n let gradientFunc = gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n parameterizedFunction,\n );\n let matrixFunc = matrixFunction(data, evaluatedData);\n let inverseMatrix = inverse(\n identity.add(gradientFunc.mmul(gradientFunc.transpose())),\n );\n\n params = new Matrix([params]);\n params = params.sub(\n inverseMatrix\n .mmul(gradientFunc)\n .mmul(matrixFunc)\n .mul(gradientDifference)\n .transpose(),\n );\n\n return params.to1DArray();\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n if (useSVD) {\n return new SingularValueDecomposition(matrix).inverse();\n } else {\n return solve(matrix, Matrix.eye(matrix.rows));\n }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n if (useSVD) {\n return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n } else {\n return leftHandSide.isSquare()\n ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n : new QrDecomposition(leftHandSide).solve(rightHandSide);\n }\n}\n","import isArray from 'is-any-array';\n\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n\n/**\n * Curve fitting algorithm\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number} [options.damping] - Levenberg-Marquardt parameter\n * @param {number} [options.gradientDifference = 10e-2] - Adjustment for decrease the damping parameter\n * @param {Array<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {Array<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {Array<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport default function levenbergMarquardt(\n data,\n parameterizedFunction,\n options = {},\n) {\n let {\n maxIterations = 100,\n gradientDifference = 10e-2,\n damping = 0,\n errorTolerance = 10e-3,\n minValues,\n maxValues,\n initialValues,\n } = options;\n\n if (damping <= 0) {\n throw new Error('The damping option must be a positive number');\n } else if (!data.x || !data.y) {\n throw new Error('The data parameter must have x and y elements');\n } else if (\n !isArray(data.x) ||\n data.x.length < 2 ||\n !isArray(data.y) ||\n data.y.length < 2\n ) {\n throw new Error(\n 'The data parameter elements must be an array with more than 2 points',\n );\n } else if (data.x.length !== data.y.length) {\n throw new Error('The data parameter elements must have the same size');\n }\n\n let parameters =\n initialValues || new Array(parameterizedFunction.length).fill(1);\n let parLen = parameters.length;\n maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n\n if (maxValues.length !== minValues.length) {\n throw new Error('minValues and maxValues must be the same size');\n }\n\n if (!isArray(parameters)) {\n throw new Error('initialValues must be an array');\n }\n\n let error = errorCalculation(data, parameters, parameterizedFunction);\n\n let converged = error <= errorTolerance;\n\n let iteration;\n for (iteration = 0; iteration < maxIterations && !converged; iteration++) {\n parameters = step(\n data,\n parameters,\n damping,\n gradientDifference,\n parameterizedFunction,\n );\n\n for (let k = 0; k < parLen; k++) {\n parameters[k] = Math.min(\n Math.max(minValues[k], parameters[k]),\n maxValues[k],\n );\n }\n\n error = errorCalculation(data, parameters, parameterizedFunction);\n if (isNaN(error)) break;\n converged = error <= errorTolerance;\n }\n\n return {\n parameterValues: parameters,\n parameterError: error,\n iterations: iteration,\n };\n}\n","\"use strict\";\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nfunction makeHeap(nPoints, size) {\n var makeArrays = function (fillValue) {\n return utils.empty(nPoints).map(function () {\n return utils.filled(size, fillValue);\n });\n };\n var heap = [];\n heap.push(makeArrays(-1));\n heap.push(makeArrays(Infinity));\n heap.push(makeArrays(0));\n return heap;\n}\nexports.makeHeap = makeHeap;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = utils.zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n var j = 0;\n while (rejectSample) {\n j = utils.tauRandInt(poolSize, random);\n var broken = false;\n for (var k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken)\n rejectSample = false;\n }\n result[i] = j;\n }\n return result;\n}\nexports.rejectionSample = rejectionSample;\nfunction heapPush(heap, row, weight, index, flag) {\n row = Math.floor(row);\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n for (var i = 0; i < indices.length; i++) {\n if (index === indices[i]) {\n return 0;\n }\n }\n return uncheckedHeapPush(heap, row, weight, index, flag);\n}\nexports.heapPush = heapPush;\nfunction uncheckedHeapPush(heap, row, weight, index, flag) {\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n weights[0] = weight;\n indices[0] = index;\n isNew[0] = flag;\n var i = 0;\n var iSwap = 0;\n while (true) {\n var ic1 = 2 * i + 1;\n var ic2 = ic1 + 1;\n var heapShape2 = heap[0][0].length;\n if (ic1 >= heapShape2) {\n break;\n }\n else if (ic2 >= heapShape2) {\n if (weights[ic1] > weight) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else if (weights[ic1] >= weights[ic2]) {\n if (weight < weights[ic1]) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else {\n if (weight < weights[ic2]) {\n iSwap = ic2;\n }\n else {\n break;\n }\n }\n weights[i] = weights[iSwap];\n indices[i] = indices[iSwap];\n isNew[i] = isNew[iSwap];\n i = iSwap;\n }\n weights[i] = weight;\n indices[i] = index;\n isNew[i] = flag;\n return 1;\n}\nexports.uncheckedHeapPush = uncheckedHeapPush;\nfunction buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random) {\n var candidateNeighbors = makeHeap(nVertices, maxCandidates);\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n if (currentGraph[0][i][j] < 0) {\n continue;\n }\n var idx = currentGraph[0][i][j];\n var isn = currentGraph[2][i][j];\n var d = utils.tauRand(random);\n heapPush(candidateNeighbors, i, d, idx, isn);\n heapPush(candidateNeighbors, idx, d, i, isn);\n currentGraph[2][i][j] = 0;\n }\n }\n return candidateNeighbors;\n}\nexports.buildCandidates = buildCandidates;\nfunction deheapSort(heap) {\n var indices = heap[0];\n var weights = heap[1];\n for (var i = 0; i < indices.length; i++) {\n var indHeap = indices[i];\n var distHeap = weights[i];\n for (var j = 0; j < indHeap.length - 1; j++) {\n var indHeapIndex = indHeap.length - j - 1;\n var distHeapIndex = distHeap.length - j - 1;\n var temp1 = indHeap[0];\n indHeap[0] = indHeap[indHeapIndex];\n indHeap[indHeapIndex] = temp1;\n var temp2 = distHeap[0];\n distHeap[0] = distHeap[distHeapIndex];\n distHeap[distHeapIndex] = temp2;\n siftDown(distHeap, indHeap, distHeapIndex, 0);\n }\n }\n return { indices: indices, weights: weights };\n}\nexports.deheapSort = deheapSort;\nfunction siftDown(heap1, heap2, ceiling, elt) {\n while (elt * 2 + 1 < ceiling) {\n var leftChild = elt * 2 + 1;\n var rightChild = leftChild + 1;\n var swap = elt;\n if (heap1[swap] < heap1[leftChild]) {\n swap = leftChild;\n }\n if (rightChild < ceiling && heap1[swap] < heap1[rightChild]) {\n swap = rightChild;\n }\n if (swap === elt) {\n break;\n }\n else {\n var temp1 = heap1[elt];\n heap1[elt] = heap1[swap];\n heap1[swap] = temp1;\n var temp2 = heap2[elt];\n heap2[elt] = heap2[swap];\n heap2[swap] = temp2;\n elt = swap;\n }\n }\n}\nfunction smallestFlagged(heap, row) {\n var ind = heap[0][row];\n var dist = heap[1][row];\n var flag = heap[2][row];\n var minDist = Infinity;\n var resultIndex = -1;\n for (var i = 0; i > ind.length; i++) {\n if (flag[i] === 1 && dist[i] < minDist) {\n minDist = dist[i];\n resultIndex = i;\n }\n }\n if (resultIndex >= 0) {\n flag[resultIndex] = 0;\n return Math.floor(ind[resultIndex]);\n }\n else {\n return -1;\n }\n}\nexports.smallestFlagged = smallestFlagged;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar umap_1 = require(\"./umap\");\nexports.UMAP = umap_1.UMAP;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _a;\nvar utils = __importStar(require(\"./utils\"));\nvar SparseMatrix = (function () {\n function SparseMatrix(rows, cols, values, dims) {\n this.entries = new Map();\n this.nRows = 0;\n this.nCols = 0;\n if (rows.length !== cols.length || rows.length !== values.length) {\n throw new Error('rows, cols and values arrays must all have the same length');\n }\n this.nRows = dims[0];\n this.nCols = dims[1];\n for (var i = 0; i < values.length; i++) {\n var row = rows[i];\n var col = cols[i];\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n this.entries.set(key, { value: values[i], row: row, col: col });\n }\n }\n SparseMatrix.prototype.makeKey = function (row, col) {\n return row + \":\" + col;\n };\n SparseMatrix.prototype.checkDims = function (row, col) {\n var withinBounds = row < this.nRows && col < this.nCols;\n if (!withinBounds) {\n throw new Error('row and/or col specified outside of matrix dimensions');\n }\n };\n SparseMatrix.prototype.set = function (row, col, value) {\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (!this.entries.has(key)) {\n this.entries.set(key, { value: value, row: row, col: col });\n }\n else {\n this.entries.get(key).value = value;\n }\n };\n SparseMatrix.prototype.get = function (row, col, defaultValue) {\n if (defaultValue === void 0) { defaultValue = 0; }\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (this.entries.has(key)) {\n return this.entries.get(key).value;\n }\n else {\n return defaultValue;\n }\n };\n SparseMatrix.prototype.getAll = function (ordered) {\n if (ordered === void 0) { ordered = true; }\n var rowColValues = [];\n this.entries.forEach(function (value) {\n rowColValues.push(value);\n });\n if (ordered) {\n rowColValues.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n }\n return rowColValues;\n };\n SparseMatrix.prototype.getDims = function () {\n return [this.nRows, this.nCols];\n };\n SparseMatrix.prototype.getRows = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.row;\n });\n };\n SparseMatrix.prototype.getCols = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.col;\n });\n };\n SparseMatrix.prototype.getValues = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.value;\n });\n };\n SparseMatrix.prototype.forEach = function (fn) {\n this.entries.forEach(function (value) { return fn(value.value, value.row, value.col); });\n };\n SparseMatrix.prototype.map = function (fn) {\n var vals = [];\n this.entries.forEach(function (value) {\n vals.push(fn(value.value, value.row, value.col));\n });\n var dims = [this.nRows, this.nCols];\n return new SparseMatrix(this.getRows(), this.getCols(), vals, dims);\n };\n SparseMatrix.prototype.toArray = function () {\n var _this = this;\n var rows = utils.empty(this.nRows);\n var output = rows.map(function () {\n return utils.zeros(_this.nCols);\n });\n this.entries.forEach(function (value) {\n output[value.row][value.col] = value.value;\n });\n return output;\n };\n return SparseMatrix;\n}());\nexports.SparseMatrix = SparseMatrix;\nfunction transpose(matrix) {\n var cols = [];\n var rows = [];\n var vals = [];\n matrix.forEach(function (value, row, col) {\n cols.push(row);\n rows.push(col);\n vals.push(value);\n });\n var dims = [matrix.nCols, matrix.nRows];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nexports.transpose = transpose;\nfunction identity(size) {\n var _a = __read(size, 1), rows = _a[0];\n var matrix = new SparseMatrix([], [], [], size);\n for (var i = 0; i < rows; i++) {\n matrix.set(i, i, 1);\n }\n return matrix;\n}\nexports.identity = identity;\nfunction pairwiseMultiply(a, b) {\n return elementWise(a, b, function (x, y) { return x * y; });\n}\nexports.pairwiseMultiply = pairwiseMultiply;\nfunction add(a, b) {\n return elementWise(a, b, function (x, y) { return x + y; });\n}\nexports.add = add;\nfunction subtract(a, b) {\n return elementWise(a, b, function (x, y) { return x - y; });\n}\nexports.subtract = subtract;\nfunction maximum(a, b) {\n return elementWise(a, b, function (x, y) { return (x > y ? x : y); });\n}\nexports.maximum = maximum;\nfunction multiplyScalar(a, scalar) {\n return a.map(function (value) {\n return value * scalar;\n });\n}\nexports.multiplyScalar = multiplyScalar;\nfunction eliminateZeros(m) {\n var zeroIndices = new Set();\n var values = m.getValues();\n var rows = m.getRows();\n var cols = m.getCols();\n for (var i = 0; i < values.length; i++) {\n if (values[i] === 0) {\n zeroIndices.add(i);\n }\n }\n var removeByZeroIndex = function (_, index) { return !zeroIndices.has(index); };\n var nextValues = values.filter(removeByZeroIndex);\n var nextRows = rows.filter(removeByZeroIndex);\n var nextCols = cols.filter(removeByZeroIndex);\n return new SparseMatrix(nextRows, nextCols, nextValues, m.getDims());\n}\nexports.eliminateZeros = eliminateZeros;\nfunction normalize(m, normType) {\n if (normType === void 0) { normType = \"l2\"; }\n var e_1, _a;\n var normFn = normFns[normType];\n var colsByRow = new Map();\n m.forEach(function (_, row, col) {\n var cols = colsByRow.get(row) || [];\n cols.push(col);\n colsByRow.set(row, cols);\n });\n var nextMatrix = new SparseMatrix([], [], [], m.getDims());\n var _loop_1 = function (row) {\n var cols = colsByRow.get(row).sort();\n var vals = cols.map(function (col) { return m.get(row, col); });\n var norm = normFn(vals);\n for (var i = 0; i < norm.length; i++) {\n nextMatrix.set(row, cols[i], norm[i]);\n }\n };\n try {\n for (var _b = __values(colsByRow.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {\n var row = _c.value;\n _loop_1(row);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return nextMatrix;\n}\nexports.normalize = normalize;\nvar normFns = (_a = {},\n _a[\"max\"] = function (xs) {\n var max = -Infinity;\n for (var i = 0; i < xs.length; i++) {\n max = xs[i] > max ? xs[i] : max;\n }\n return xs.map(function (x) { return x / max; });\n },\n _a[\"l1\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += xs[i];\n }\n return xs.map(function (x) { return x / sum; });\n },\n _a[\"l2\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += Math.pow(xs[i], 2);\n }\n return xs.map(function (x) { return Math.sqrt(Math.pow(x, 2) / sum); });\n },\n _a);\nfunction elementWise(a, b, op) {\n var visited = new Set();\n var rows = [];\n var cols = [];\n var vals = [];\n var operate = function (row, col) {\n rows.push(row);\n cols.push(col);\n var nextValue = op(a.get(row, col), b.get(row, col));\n vals.push(nextValue);\n };\n var valuesA = a.getValues();\n var rowsA = a.getRows();\n var colsA = a.getCols();\n for (var i = 0; i < valuesA.length; i++) {\n var row = rowsA[i];\n var col = colsA[i];\n var key = row + \":\" + col;\n visited.add(key);\n operate(row, col);\n }\n var valuesB = b.getValues();\n var rowsB = b.getRows();\n var colsB = b.getCols();\n for (var i = 0; i < valuesB.length; i++) {\n var row = rowsB[i];\n var col = colsB[i];\n var key = row + \":\" + col;\n if (visited.has(key))\n continue;\n operate(row, col);\n }\n var dims = [a.nRows, a.nCols];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nfunction getCSR(x) {\n var entries = [];\n x.forEach(function (value, row, col) {\n entries.push({ value: value, row: row, col: col });\n });\n entries.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n var indices = [];\n var values = [];\n var indptr = [];\n var currentRow = -1;\n for (var i = 0; i < entries.length; i++) {\n var _a = entries[i], row = _a.row, col = _a.col, value = _a.value;\n if (row !== currentRow) {\n currentRow = row;\n indptr.push(i);\n }\n indices.push(col);\n values.push(value);\n }\n return { indices: indices, values: values, indptr: indptr };\n}\nexports.getCSR = getCSR;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nfunction makeNNDescent(distanceFn, random) {\n return function nNDescent(data, leafArray, nNeighbors, nIters, maxCandidates, delta, rho, rpTreeInit) {\n if (nIters === void 0) { nIters = 10; }\n if (maxCandidates === void 0) { maxCandidates = 50; }\n if (delta === void 0) { delta = 0.001; }\n if (rho === void 0) { rho = 0.5; }\n if (rpTreeInit === void 0) { rpTreeInit = true; }\n var nVertices = data.length;\n var currentGraph = heap.makeHeap(data.length, nNeighbors);\n for (var i = 0; i < data.length; i++) {\n var indices = heap.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n var d = distanceFn(data[i], data[indices[j]]);\n heap.heapPush(currentGraph, i, d, indices[j], 1);\n heap.heapPush(currentGraph, indices[j], d, i, 1);\n }\n }\n if (rpTreeInit) {\n for (var n = 0; n < leafArray.length; n++) {\n for (var i = 0; i < leafArray[n].length; i++) {\n if (leafArray[n][i] < 0) {\n break;\n }\n for (var j = i + 1; j < leafArray[n].length; j++) {\n if (leafArray[n][j] < 0) {\n break;\n }\n var d = distanceFn(data[leafArray[n][i]], data[leafArray[n][j]]);\n heap.heapPush(currentGraph, leafArray[n][i], d, leafArray[n][j], 1);\n heap.heapPush(currentGraph, leafArray[n][j], d, leafArray[n][i], 1);\n }\n }\n }\n }\n for (var n = 0; n < nIters; n++) {\n var candidateNeighbors = heap.buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random);\n var c = 0;\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < maxCandidates; j++) {\n var p = Math.floor(candidateNeighbors[0][i][j]);\n if (p < 0 || utils.tauRand(random) < rho) {\n continue;\n }\n for (var k = 0; k < maxCandidates; k++) {\n var q = Math.floor(candidateNeighbors[0][i][k]);\n var cj = candidateNeighbors[2][i][j];\n var ck = candidateNeighbors[2][i][k];\n if (q < 0 || (!cj && !ck)) {\n continue;\n }\n var d = distanceFn(data[p], data[q]);\n c += heap.heapPush(currentGraph, p, d, q, 1);\n c += heap.heapPush(currentGraph, q, d, p, 1);\n }\n }\n }\n if (c <= delta * nNeighbors * data.length) {\n break;\n }\n }\n var sorted = heap.deheapSort(currentGraph);\n return sorted;\n };\n}\nexports.makeNNDescent = makeNNDescent;\nfunction makeInitializations(distanceFn) {\n function initFromRandom(nNeighbors, data, queryPoints, _heap, random) {\n for (var i = 0; i < queryPoints.length; i++) {\n var indices = utils.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n continue;\n }\n var d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n }\n function initFromTree(_tree, data, queryPoints, _heap, random) {\n for (var i = 0; i < queryPoints.length; i++) {\n var indices = tree.searchFlatTree(queryPoints[i], _tree, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n return;\n }\n var d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n return;\n }\n return { initFromRandom: initFromRandom, initFromTree: initFromTree };\n}\nexports.makeInitializations = makeInitializations;\nfunction makeInitializedNNSearch(distanceFn) {\n return function nnSearchFn(data, graph, initialization, queryPoints) {\n var e_1, _a;\n var _b = matrix.getCSR(graph), indices = _b.indices, indptr = _b.indptr;\n for (var i = 0; i < queryPoints.length; i++) {\n var tried = new Set(initialization[0][i]);\n while (true) {\n var vertex = heap.smallestFlagged(initialization, i);\n if (vertex === -1) {\n break;\n }\n var candidates = indices.slice(indptr[vertex], indptr[vertex + 1]);\n try {\n for (var candidates_1 = __values(candidates), candidates_1_1 = candidates_1.next(); !candidates_1_1.done; candidates_1_1 = candidates_1.next()) {\n var candidate = candidates_1_1.value;\n if (candidate === vertex ||\n candidate === -1 ||\n tried.has(candidate)) {\n continue;\n }\n var d = distanceFn(data[candidate], queryPoints[i]);\n heap.uncheckedHeapPush(initialization, i, d, candidate, 1);\n tried.add(candidate);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (candidates_1_1 && !candidates_1_1.done && (_a = candidates_1.return)) _a.call(candidates_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n }\n return initialization;\n };\n}\nexports.makeInitializedNNSearch = makeInitializedNNSearch;\nfunction initializeSearch(forest, data, queryPoints, nNeighbors, initFromRandom, initFromTree, random) {\n var e_2, _a;\n var results = heap.makeHeap(queryPoints.length, nNeighbors);\n initFromRandom(nNeighbors, data, queryPoints, results, random);\n if (forest) {\n try {\n for (var forest_1 = __values(forest), forest_1_1 = forest_1.next(); !forest_1_1.done; forest_1_1 = forest_1.next()) {\n var tree_1 = forest_1_1.value;\n initFromTree(tree_1, data, queryPoints, results, random);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (forest_1_1 && !forest_1_1.done && (_a = forest_1.return)) _a.call(forest_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n return results;\n}\nexports.initializeSearch = initializeSearch;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nvar FlatTree = (function () {\n function FlatTree(hyperplanes, offsets, children, indices) {\n this.hyperplanes = hyperplanes;\n this.offsets = offsets;\n this.children = children;\n this.indices = indices;\n }\n return FlatTree;\n}());\nexports.FlatTree = FlatTree;\nfunction makeForest(data, nNeighbors, nTrees, random) {\n var leafSize = Math.max(10, nNeighbors);\n var trees = utils\n .range(nTrees)\n .map(function (_, i) { return makeTree(data, leafSize, i, random); });\n var forest = trees.map(function (tree) { return flattenTree(tree, leafSize); });\n return forest;\n}\nexports.makeForest = makeForest;\nfunction makeTree(data, leafSize, n, random) {\n if (leafSize === void 0) { leafSize = 30; }\n var indices = utils.range(data.length);\n var tree = makeEuclideanTree(data, indices, leafSize, n, random);\n return tree;\n}\nfunction makeEuclideanTree(data, indices, leafSize, q, random) {\n if (leafSize === void 0) { leafSize = 30; }\n if (indices.length > leafSize) {\n var splitResults = euclideanRandomProjectionSplit(data, indices, random);\n var indicesLeft = splitResults.indicesLeft, indicesRight = splitResults.indicesRight, hyperplane = splitResults.hyperplane, offset = splitResults.offset;\n var leftChild = makeEuclideanTree(data, indicesLeft, leafSize, q + 1, random);\n var rightChild = makeEuclideanTree(data, indicesRight, leafSize, q + 1, random);\n var node = { leftChild: leftChild, rightChild: rightChild, isLeaf: false, hyperplane: hyperplane, offset: offset };\n return node;\n }\n else {\n var node = { indices: indices, isLeaf: true };\n return node;\n }\n}\nfunction euclideanRandomProjectionSplit(data, indices, random) {\n var dim = data[0].length;\n var leftIndex = utils.tauRandInt(indices.length, random);\n var rightIndex = utils.tauRandInt(indices.length, random);\n rightIndex += leftIndex === rightIndex ? 1 : 0;\n rightIndex = rightIndex % indices.length;\n var left = indices[leftIndex];\n var right = indices[rightIndex];\n var hyperplaneOffset = 0;\n var hyperplaneVector = utils.zeros(dim);\n for (var i = 0; i < hyperplaneVector.length; i++) {\n hyperplaneVector[i] = data[left][i] - data[right][i];\n hyperplaneOffset -=\n (hyperplaneVector[i] * (data[left][i] + data[right][i])) / 2.0;\n }\n var nLeft = 0;\n var nRight = 0;\n var side = utils.zeros(indices.length);\n for (var i = 0; i < indices.length; i++) {\n var margin = hyperplaneOffset;\n for (var d = 0; d < dim; d++) {\n margin += hyperplaneVector[d] * data[indices[i]][d];\n }\n if (margin === 0) {\n side[i] = utils.tauRandInt(2, random);\n if (side[i] === 0) {\n nLeft += 1;\n }\n else {\n nRight += 1;\n }\n }\n else if (margin > 0) {\n side[i] = 0;\n nLeft += 1;\n }\n else {\n side[i] = 1;\n nRight += 1;\n }\n }\n var indicesLeft = utils.zeros(nLeft);\n var indicesRight = utils.zeros(nRight);\n nLeft = 0;\n nRight = 0;\n for (var i = 0; i < side.length; i++) {\n if (side[i] === 0) {\n indicesLeft[nLeft] = indices[i];\n nLeft += 1;\n }\n else {\n indicesRight[nRight] = indices[i];\n nRight += 1;\n }\n }\n return {\n indicesLeft: indicesLeft,\n indicesRight: indicesRight,\n hyperplane: hyperplaneVector,\n offset: hyperplaneOffset,\n };\n}\nfunction flattenTree(tree, leafSize) {\n var nNodes = numNodes(tree);\n var nLeaves = numLeaves(tree);\n var hyperplanes = utils\n .range(nNodes)\n .map(function () { return utils.zeros(tree.hyperplane ? tree.hyperplane.length : 0); });\n var offsets = utils.zeros(nNodes);\n var children = utils.range(nNodes).map(function () { return [-1, -1]; });\n var indices = utils\n .range(nLeaves)\n .map(function () { return utils.range(leafSize).map(function () { return -1; }); });\n recursiveFlatten(tree, hyperplanes, offsets, children, indices, 0, 0);\n return new FlatTree(hyperplanes, offsets, children, indices);\n}\nfunction recursiveFlatten(tree, hyperplanes, offsets, children, indices, nodeNum, leafNum) {\n var _a;\n if (tree.isLeaf) {\n children[nodeNum][0] = -leafNum;\n (_a = indices[leafNum]).splice.apply(_a, __spread([0, tree.indices.length], tree.indices));\n leafNum += 1;\n return { nodeNum: nodeNum, leafNum: leafNum };\n }\n else {\n hyperplanes[nodeNum] = tree.hyperplane;\n offsets[nodeNum] = tree.offset;\n children[nodeNum][0] = nodeNum + 1;\n var oldNodeNum = nodeNum;\n var res = recursiveFlatten(tree.leftChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n nodeNum = res.nodeNum;\n leafNum = res.leafNum;\n children[oldNodeNum][1] = nodeNum + 1;\n res = recursiveFlatten(tree.rightChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n return { nodeNum: res.nodeNum, leafNum: res.leafNum };\n }\n}\nfunction numNodes(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return 1 + numNodes(tree.leftChild) + numNodes(tree.rightChild);\n }\n}\nfunction numLeaves(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return numLeaves(tree.leftChild) + numLeaves(tree.rightChild);\n }\n}\nfunction makeLeafArray(rpForest) {\n var e_1, _a;\n if (rpForest.length > 0) {\n var output = [];\n try {\n for (var rpForest_1 = __values(rpForest), rpForest_1_1 = rpForest_1.next(); !rpForest_1_1.done; rpForest_1_1 = rpForest_1.next()) {\n var tree = rpForest_1_1.value;\n output.push.apply(output, __spread(tree.indices));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (rpForest_1_1 && !rpForest_1_1.done && (_a = rpForest_1.return)) _a.call(rpForest_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return output;\n }\n else {\n return [[-1]];\n }\n}\nexports.makeLeafArray = makeLeafArray;\nfunction selectSide(hyperplane, offset, point, random) {\n var margin = offset;\n for (var d = 0; d < point.length; d++) {\n margin += hyperplane[d] * point[d];\n }\n if (margin === 0) {\n var side = utils.tauRandInt(2, random);\n return side;\n }\n else if (margin > 0) {\n return 0;\n }\n else {\n return 1;\n }\n}\nfunction searchFlatTree(point, tree, random) {\n var node = 0;\n while (tree.children[node][0] > 0) {\n var side = selectSide(tree.hyperplanes[node], tree.offsets[node], point, random);\n if (side === 0) {\n node = tree.children[node][0];\n }\n else {\n node = tree.children[node][1];\n }\n }\n var index = -1 * tree.children[node][0];\n return tree.indices[index];\n}\nexports.searchFlatTree = searchFlatTree;\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar nnDescent = __importStar(require(\"./nn_descent\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nvar ml_levenberg_marquardt_1 = __importDefault(require(\"ml-levenberg-marquardt\"));\nvar SMOOTH_K_TOLERANCE = 1e-5;\nvar MIN_K_DIST_SCALE = 1e-3;\nvar UMAP = (function () {\n function UMAP(params) {\n if (params === void 0) { params = {}; }\n var _this = this;\n this.learningRate = 1.0;\n this.localConnectivity = 1.0;\n this.minDist = 0.1;\n this.nComponents = 2;\n this.nEpochs = 0;\n this.nNeighbors = 15;\n this.negativeSampleRate = 5;\n this.random = Math.random;\n this.repulsionStrength = 1.0;\n this.setOpMixRatio = 1.0;\n this.spread = 1.0;\n this.transformQueueSize = 4.0;\n this.targetMetric = \"categorical\";\n this.targetWeight = 0.5;\n this.targetNNeighbors = this.nNeighbors;\n this.distanceFn = euclidean;\n this.isInitialized = false;\n this.rpForest = [];\n this.embedding = [];\n this.optimizationState = new OptimizationState();\n var setParam = function (key) {\n if (params[key] !== undefined)\n _this[key] = params[key];\n };\n setParam('distanceFn');\n setParam('learningRate');\n setParam('localConnectivity');\n setParam('minDist');\n setParam('nComponents');\n setParam('nEpochs');\n setParam('nNeighbors');\n setParam('negativeSampleRate');\n setParam('random');\n setParam('repulsionStrength');\n setParam('setOpMixRatio');\n setParam('spread');\n setParam('transformQueueSize');\n }\n UMAP.prototype.fit = function (X) {\n this.initializeFit(X);\n this.optimizeLayout();\n return this.embedding;\n };\n UMAP.prototype.fitAsync = function (X, callback) {\n if (callback === void 0) { callback = function () { return true; }; }\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n this.initializeFit(X);\n return [4, this.optimizeLayoutAsync(callback)];\n case 1:\n _a.sent();\n return [2, this.embedding];\n }\n });\n });\n };\n UMAP.prototype.setSupervisedProjection = function (Y, params) {\n if (params === void 0) { params = {}; }\n this.Y = Y;\n this.targetMetric = params.targetMetric || this.targetMetric;\n this.targetWeight = params.targetWeight || this.targetWeight;\n this.targetNNeighbors = params.targetNNeighbors || this.targetNNeighbors;\n };\n UMAP.prototype.setPrecomputedKNN = function (knnIndices, knnDistances) {\n this.knnIndices = knnIndices;\n this.knnDistances = knnDistances;\n };\n UMAP.prototype.initializeFit = function (X) {\n if (X.length <= this.nNeighbors) {\n throw new Error(\"Not enough data points (\" + X.length + \") to create nNeighbors: \" + this.nNeighbors + \". Add more data points or adjust the configuration.\");\n }\n if (this.X === X && this.isInitialized) {\n return this.getNEpochs();\n }\n this.X = X;\n if (!this.knnIndices && !this.knnDistances) {\n var knnResults = this.nearestNeighbors(X);\n this.knnIndices = knnResults.knnIndices;\n this.knnDistances = knnResults.knnDistances;\n }\n this.graph = this.fuzzySimplicialSet(X, this.nNeighbors, this.setOpMixRatio);\n this.makeSearchFns();\n this.searchGraph = this.makeSearchGraph(X);\n this.processGraphForSupervisedProjection();\n var _a = this.initializeSimplicialSetEmbedding(), head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n this.optimizationState.head = head;\n this.optimizationState.tail = tail;\n this.optimizationState.epochsPerSample = epochsPerSample;\n this.initializeOptimization();\n this.prepareForOptimizationLoop();\n this.isInitialized = true;\n return this.getNEpochs();\n };\n UMAP.prototype.makeSearchFns = function () {\n var _a = nnDescent.makeInitializations(this.distanceFn), initFromTree = _a.initFromTree, initFromRandom = _a.initFromRandom;\n this.initFromTree = initFromTree;\n this.initFromRandom = initFromRandom;\n this.search = nnDescent.makeInitializedNNSearch(this.distanceFn);\n };\n UMAP.prototype.makeSearchGraph = function (X) {\n var knnIndices = this.knnIndices;\n var knnDistances = this.knnDistances;\n var dims = [X.length, X.length];\n var searchGraph = new matrix.SparseMatrix([], [], [], dims);\n for (var i = 0; i < knnIndices.length; i++) {\n var knn = knnIndices[i];\n var distances = knnDistances[i];\n for (var j = 0; j < knn.length; j++) {\n var neighbor = knn[j];\n var distance = distances[j];\n if (distance > 0) {\n searchGraph.set(i, neighbor, distance);\n }\n }\n }\n var transpose = matrix.transpose(searchGraph);\n return matrix.maximum(searchGraph, transpose);\n };\n UMAP.prototype.transform = function (toTransform) {\n var _this = this;\n var rawData = this.X;\n if (rawData === undefined || rawData.length === 0) {\n throw new Error('No data has been fit.');\n }\n var nNeighbors = Math.floor(this.nNeighbors * this.transformQueueSize);\n nNeighbors = Math.min(rawData.length, nNeighbors);\n var init = nnDescent.initializeSearch(this.rpForest, rawData, toTransform, nNeighbors, this.initFromRandom, this.initFromTree, this.random);\n var result = this.search(rawData, this.searchGraph, init, toTransform);\n var _a = heap.deheapSort(result), indices = _a.indices, distances = _a.weights;\n indices = indices.map(function (x) { return x.slice(0, _this.nNeighbors); });\n distances = distances.map(function (x) { return x.slice(0, _this.nNeighbors); });\n var adjustedLocalConnectivity = Math.max(0, this.localConnectivity - 1);\n var _b = this.smoothKNNDistance(distances, this.nNeighbors, adjustedLocalConnectivity), sigmas = _b.sigmas, rhos = _b.rhos;\n var _c = this.computeMembershipStrengths(indices, distances, sigmas, rhos), rows = _c.rows, cols = _c.cols, vals = _c.vals;\n var size = [toTransform.length, rawData.length];\n var graph = new matrix.SparseMatrix(rows, cols, vals, size);\n var normed = matrix.normalize(graph, \"l1\");\n var csrMatrix = matrix.getCSR(normed);\n var nPoints = toTransform.length;\n var eIndices = utils.reshape2d(csrMatrix.indices, nPoints, this.nNeighbors);\n var eWeights = utils.reshape2d(csrMatrix.values, nPoints, this.nNeighbors);\n var embedding = initTransform(eIndices, eWeights, this.embedding);\n var nEpochs = this.nEpochs\n ? this.nEpochs / 3\n : graph.nRows <= 10000\n ? 100\n : 30;\n var graphMax = graph\n .getValues()\n .reduce(function (max, val) { return (val > max ? val : max); }, 0);\n graph = graph.map(function (value) { return (value < graphMax / nEpochs ? 0 : value); });\n graph = matrix.eliminateZeros(graph);\n var epochsPerSample = this.makeEpochsPerSample(graph.getValues(), nEpochs);\n var head = graph.getRows();\n var tail = graph.getCols();\n this.assignOptimizationStateParameters({\n headEmbedding: embedding,\n tailEmbedding: this.embedding,\n head: head,\n tail: tail,\n currentEpoch: 0,\n nEpochs: nEpochs,\n nVertices: graph.getDims()[1],\n epochsPerSample: epochsPerSample,\n });\n this.prepareForOptimizationLoop();\n return this.optimizeLayout();\n };\n UMAP.prototype.processGraphForSupervisedProjection = function () {\n var _a = this, Y = _a.Y, X = _a.X;\n if (Y) {\n if (Y.length !== X.length) {\n throw new Error('Length of X and y must be equal');\n }\n if (this.targetMetric === \"categorical\") {\n var lt = this.targetWeight < 1.0;\n var farDist = lt ? 2.5 * (1.0 / (1.0 - this.targetWeight)) : 1.0e12;\n this.graph = this.categoricalSimplicialSetIntersection(this.graph, Y, farDist);\n }\n }\n };\n UMAP.prototype.step = function () {\n var currentEpoch = this.optimizationState.currentEpoch;\n if (currentEpoch < this.getNEpochs()) {\n this.optimizeLayoutStep(currentEpoch);\n }\n return this.optimizationState.currentEpoch;\n };\n UMAP.prototype.getEmbedding = function () {\n return this.embedding;\n };\n UMAP.prototype.nearestNeighbors = function (X) {\n var _a = this, distanceFn = _a.distanceFn, nNeighbors = _a.nNeighbors;\n var log2 = function (n) { return Math.log(n) / Math.log(2); };\n var metricNNDescent = nnDescent.makeNNDescent(distanceFn, this.random);\n var round = function (n) {\n return n === 0.5 ? 0 : Math.round(n);\n };\n var nTrees = 5 + Math.floor(round(Math.pow(X.length, 0.5) / 20.0));\n var nIters = Math.max(5, Math.floor(Math.round(log2(X.length))));\n this.rpForest = tree.makeForest(X, nNeighbors, nTrees, this.random);\n var leafArray = tree.makeLeafArray(this.rpForest);\n var _b = metricNNDescent(X, leafArray, nNeighbors, nIters), indices = _b.indices, weights = _b.weights;\n return { knnIndices: indices, knnDistances: weights };\n };\n UMAP.prototype.fuzzySimplicialSet = function (X, nNeighbors, setOpMixRatio) {\n if (setOpMixRatio === void 0) { setOpMixRatio = 1.0; }\n var _a = this, _b = _a.knnIndices, knnIndices = _b === void 0 ? [] : _b, _c = _a.knnDistances, knnDistances = _c === void 0 ? [] : _c, localConnectivity = _a.localConnectivity;\n var _d = this.smoothKNNDistance(knnDistances, nNeighbors, localConnectivity), sigmas = _d.sigmas, rhos = _d.rhos;\n var _e = this.computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos), rows = _e.rows, cols = _e.cols, vals = _e.vals;\n var size = [X.length, X.length];\n var sparseMatrix = new matrix.SparseMatrix(rows, cols, vals, size);\n var transpose = matrix.transpose(sparseMatrix);\n var prodMatrix = matrix.pairwiseMultiply(sparseMatrix, transpose);\n var a = matrix.subtract(matrix.add(sparseMatrix, transpose), prodMatrix);\n var b = matrix.multiplyScalar(a, setOpMixRatio);\n var c = matrix.multiplyScalar(prodMatrix, 1.0 - setOpMixRatio);\n var result = matrix.add(b, c);\n return result;\n };\n UMAP.prototype.categoricalSimplicialSetIntersection = function (simplicialSet, target, farDist, unknownDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n var intersection = fastIntersection(simplicialSet, target, unknownDist, farDist);\n intersection = matrix.eliminateZeros(intersection);\n return resetLocalConnectivity(intersection);\n };\n UMAP.prototype.smoothKNNDistance = function (distances, k, localConnectivity, nIter, bandwidth) {\n if (localConnectivity === void 0) { localConnectivity = 1.0; }\n if (nIter === void 0) { nIter = 64; }\n if (bandwidth === void 0) { bandwidth = 1.0; }\n var target = (Math.log(k) / Math.log(2)) * bandwidth;\n var rho = utils.zeros(distances.length);\n var result = utils.zeros(distances.length);\n for (var i = 0; i < distances.length; i++) {\n var lo = 0.0;\n var hi = Infinity;\n var mid = 1.0;\n var ithDistances = distances[i];\n var nonZeroDists = ithDistances.filter(function (d) { return d > 0.0; });\n if (nonZeroDists.length >= localConnectivity) {\n var index = Math.floor(localConnectivity);\n var interpolation = localConnectivity - index;\n if (index > 0) {\n rho[i] = nonZeroDists[index - 1];\n if (interpolation > SMOOTH_K_TOLERANCE) {\n rho[i] +=\n interpolation * (nonZeroDists[index] - nonZeroDists[index - 1]);\n }\n }\n else {\n rho[i] = interpolation * nonZeroDists[0];\n }\n }\n else if (nonZeroDists.length > 0) {\n rho[i] = utils.max(nonZeroDists);\n }\n for (var n = 0; n < nIter; n++) {\n var psum = 0.0;\n for (var j = 1; j < distances[i].length; j++) {\n var d = distances[i][j] - rho[i];\n if (d > 0) {\n psum += Math.exp(-(d / mid));\n }\n else {\n psum += 1.0;\n }\n }\n if (Math.abs(psum - target) < SMOOTH_K_TOLERANCE) {\n break;\n }\n if (psum > target) {\n hi = mid;\n mid = (lo + hi) / 2.0;\n }\n else {\n lo = mid;\n if (hi === Infinity) {\n mid *= 2;\n }\n else {\n mid = (lo + hi) / 2.0;\n }\n }\n }\n result[i] = mid;\n if (rho[i] > 0.0) {\n var meanIthDistances = utils.mean(ithDistances);\n if (result[i] < MIN_K_DIST_SCALE * meanIthDistances) {\n result[i] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n }\n else {\n var meanDistances = utils.mean(distances.map(utils.mean));\n if (result[i] < MIN_K_DIST_SCALE * meanDistances) {\n result[i] = MIN_K_DIST_SCALE * meanDistances;\n }\n }\n }\n return { sigmas: result, rhos: rho };\n };\n UMAP.prototype.computeMembershipStrengths = function (knnIndices, knnDistances, sigmas, rhos) {\n var nSamples = knnIndices.length;\n var nNeighbors = knnIndices[0].length;\n var rows = utils.zeros(nSamples * nNeighbors);\n var cols = utils.zeros(nSamples * nNeighbors);\n var vals = utils.zeros(nSamples * nNeighbors);\n for (var i = 0; i < nSamples; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n var val = 0;\n if (knnIndices[i][j] === -1) {\n continue;\n }\n if (knnIndices[i][j] === i) {\n val = 0.0;\n }\n else if (knnDistances[i][j] - rhos[i] <= 0.0) {\n val = 1.0;\n }\n else {\n val = Math.exp(-((knnDistances[i][j] - rhos[i]) / sigmas[i]));\n }\n rows[i * nNeighbors + j] = i;\n cols[i * nNeighbors + j] = knnIndices[i][j];\n vals[i * nNeighbors + j] = val;\n }\n }\n return { rows: rows, cols: cols, vals: vals };\n };\n UMAP.prototype.initializeSimplicialSetEmbedding = function () {\n var _this = this;\n var nEpochs = this.getNEpochs();\n var nComponents = this.nComponents;\n var graphValues = this.graph.getValues();\n var graphMax = 0;\n for (var i = 0; i < graphValues.length; i++) {\n var value = graphValues[i];\n if (graphMax < graphValues[i]) {\n graphMax = value;\n }\n }\n var graph = this.graph.map(function (value) {\n if (value < graphMax / nEpochs) {\n return 0;\n }\n else {\n return value;\n }\n });\n this.embedding = utils.zeros(graph.nRows).map(function () {\n return utils.zeros(nComponents).map(function () {\n return utils.tauRand(_this.random) * 20 + -10;\n });\n });\n var weights = [];\n var head = [];\n var tail = [];\n var rowColValues = graph.getAll();\n for (var i = 0; i < rowColValues.length; i++) {\n var entry = rowColValues[i];\n if (entry.value) {\n weights.push(entry.value);\n tail.push(entry.row);\n head.push(entry.col);\n }\n }\n var epochsPerSample = this.makeEpochsPerSample(weights, nEpochs);\n return { head: head, tail: tail, epochsPerSample: epochsPerSample };\n };\n UMAP.prototype.makeEpochsPerSample = function (weights, nEpochs) {\n var result = utils.filled(weights.length, -1.0);\n var max = utils.max(weights);\n var nSamples = weights.map(function (w) { return (w / max) * nEpochs; });\n nSamples.forEach(function (n, i) {\n if (n > 0)\n result[i] = nEpochs / nSamples[i];\n });\n return result;\n };\n UMAP.prototype.assignOptimizationStateParameters = function (state) {\n Object.assign(this.optimizationState, state);\n };\n UMAP.prototype.prepareForOptimizationLoop = function () {\n var _a = this, repulsionStrength = _a.repulsionStrength, learningRate = _a.learningRate, negativeSampleRate = _a.negativeSampleRate;\n var _b = this.optimizationState, epochsPerSample = _b.epochsPerSample, headEmbedding = _b.headEmbedding, tailEmbedding = _b.tailEmbedding;\n var dim = headEmbedding[0].length;\n var moveOther = headEmbedding.length === tailEmbedding.length;\n var epochsPerNegativeSample = epochsPerSample.map(function (e) { return e / negativeSampleRate; });\n var epochOfNextNegativeSample = __spread(epochsPerNegativeSample);\n var epochOfNextSample = __spread(epochsPerSample);\n this.assignOptimizationStateParameters({\n epochOfNextSample: epochOfNextSample,\n epochOfNextNegativeSample: epochOfNextNegativeSample,\n epochsPerNegativeSample: epochsPerNegativeSample,\n moveOther: moveOther,\n initialAlpha: learningRate,\n alpha: learningRate,\n gamma: repulsionStrength,\n dim: dim,\n });\n };\n UMAP.prototype.initializeOptimization = function () {\n var headEmbedding = this.embedding;\n var tailEmbedding = this.embedding;\n var _a = this.optimizationState, head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n var nEpochs = this.getNEpochs();\n var nVertices = this.graph.nCols;\n var _b = findABParams(this.spread, this.minDist), a = _b.a, b = _b.b;\n this.assignOptimizationStateParameters({\n headEmbedding: headEmbedding,\n tailEmbedding: tailEmbedding,\n head: head,\n tail: tail,\n epochsPerSample: epochsPerSample,\n a: a,\n b: b,\n nEpochs: nEpochs,\n nVertices: nVertices,\n });\n };\n UMAP.prototype.optimizeLayoutStep = function (n) {\n var optimizationState = this.optimizationState;\n var head = optimizationState.head, tail = optimizationState.tail, headEmbedding = optimizationState.headEmbedding, tailEmbedding = optimizationState.tailEmbedding, epochsPerSample = optimizationState.epochsPerSample, epochOfNextSample = optimizationState.epochOfNextSample, epochOfNextNegativeSample = optimizationState.epochOfNextNegativeSample, epochsPerNegativeSample = optimizationState.epochsPerNegativeSample, moveOther = optimizationState.moveOther, initialAlpha = optimizationState.initialAlpha, alpha = optimizationState.alpha, gamma = optimizationState.gamma, a = optimizationState.a, b = optimizationState.b, dim = optimizationState.dim, nEpochs = optimizationState.nEpochs, nVertices = optimizationState.nVertices;\n var clipValue = 4.0;\n for (var i = 0; i < epochsPerSample.length; i++) {\n if (epochOfNextSample[i] > n) {\n continue;\n }\n var j = head[i];\n var k = tail[i];\n var current = headEmbedding[j];\n var other = tailEmbedding[k];\n var distSquared = rDist(current, other);\n var gradCoeff = 0;\n if (distSquared > 0) {\n gradCoeff = -2.0 * a * b * Math.pow(distSquared, b - 1.0);\n gradCoeff /= a * Math.pow(distSquared, b) + 1.0;\n }\n for (var d = 0; d < dim; d++) {\n var gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n if (moveOther) {\n other[d] += -gradD * alpha;\n }\n }\n epochOfNextSample[i] += epochsPerSample[i];\n var nNegSamples = Math.floor((n - epochOfNextNegativeSample[i]) / epochsPerNegativeSample[i]);\n for (var p = 0; p < nNegSamples; p++) {\n var k_1 = utils.tauRandInt(nVertices, this.random);\n var other_1 = tailEmbedding[k_1];\n var distSquared_1 = rDist(current, other_1);\n var gradCoeff_1 = 0.0;\n if (distSquared_1 > 0.0) {\n gradCoeff_1 = 2.0 * gamma * b;\n gradCoeff_1 /=\n (0.001 + distSquared_1) * (a * Math.pow(distSquared_1, b) + 1);\n }\n else if (j === k_1) {\n continue;\n }\n for (var d = 0; d < dim; d++) {\n var gradD = 4.0;\n if (gradCoeff_1 > 0.0) {\n gradD = clip(gradCoeff_1 * (current[d] - other_1[d]), clipValue);\n }\n current[d] += gradD * alpha;\n }\n }\n epochOfNextNegativeSample[i] += nNegSamples * epochsPerNegativeSample[i];\n }\n optimizationState.alpha = initialAlpha * (1.0 - n / nEpochs);\n optimizationState.currentEpoch += 1;\n return headEmbedding;\n };\n UMAP.prototype.optimizeLayoutAsync = function (epochCallback) {\n var _this = this;\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n return new Promise(function (resolve, reject) {\n var step = function () { return __awaiter(_this, void 0, void 0, function () {\n var _a, nEpochs, currentEpoch, epochCompleted, shouldStop, isFinished;\n return __generator(this, function (_b) {\n try {\n _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n this.embedding = this.optimizeLayoutStep(currentEpoch);\n epochCompleted = this.optimizationState.currentEpoch;\n shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs;\n if (!shouldStop && !isFinished) {\n setTimeout(function () { return step(); }, 0);\n }\n else {\n return [2, resolve(isFinished)];\n }\n }\n catch (err) {\n reject(err);\n }\n return [2];\n });\n }); };\n setTimeout(function () { return step(); }, 0);\n });\n };\n UMAP.prototype.optimizeLayout = function (epochCallback) {\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n var isFinished = false;\n var embedding = [];\n while (!isFinished) {\n var _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n embedding = this.optimizeLayoutStep(currentEpoch);\n var epochCompleted = this.optimizationState.currentEpoch;\n var shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs || shouldStop;\n }\n return embedding;\n };\n UMAP.prototype.getNEpochs = function () {\n var graph = this.graph;\n if (this.nEpochs > 0) {\n return this.nEpochs;\n }\n var length = graph.nRows;\n if (length <= 2500) {\n return 500;\n }\n else if (length <= 5000) {\n return 400;\n }\n else if (length <= 7500) {\n return 300;\n }\n else {\n return 200;\n }\n };\n return UMAP;\n}());\nexports.UMAP = UMAP;\nfunction euclidean(x, y) {\n var result = 0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow((x[i] - y[i]), 2);\n }\n return Math.sqrt(result);\n}\nexports.euclidean = euclidean;\nfunction cosine(x, y) {\n var result = 0.0;\n var normX = 0.0;\n var normY = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += x[i] * y[i];\n normX += Math.pow(x[i], 2);\n normY += Math.pow(y[i], 2);\n }\n if (normX === 0 && normY === 0) {\n return 0;\n }\n else if (normX === 0 || normY === 0) {\n return 1.0;\n }\n else {\n return 1.0 - result / Math.sqrt(normX * normY);\n }\n}\nexports.cosine = cosine;\nvar OptimizationState = (function () {\n function OptimizationState() {\n this.currentEpoch = 0;\n this.headEmbedding = [];\n this.tailEmbedding = [];\n this.head = [];\n this.tail = [];\n this.epochsPerSample = [];\n this.epochOfNextSample = [];\n this.epochOfNextNegativeSample = [];\n this.epochsPerNegativeSample = [];\n this.moveOther = true;\n this.initialAlpha = 1.0;\n this.alpha = 1.0;\n this.gamma = 1.0;\n this.a = 1.5769434603113077;\n this.b = 0.8950608779109733;\n this.dim = 2;\n this.nEpochs = 500;\n this.nVertices = 0;\n }\n return OptimizationState;\n}());\nfunction clip(x, clipValue) {\n if (x > clipValue)\n return clipValue;\n else if (x < -clipValue)\n return -clipValue;\n else\n return x;\n}\nfunction rDist(x, y) {\n var result = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow(x[i] - y[i], 2);\n }\n return result;\n}\nfunction findABParams(spread, minDist) {\n var curve = function (_a) {\n var _b = __read(_a, 2), a = _b[0], b = _b[1];\n return function (x) {\n return 1.0 / (1.0 + a * Math.pow(x, (2 * b)));\n };\n };\n var xv = utils\n .linear(0, spread * 3, 300)\n .map(function (val) { return (val < minDist ? 1.0 : val); });\n var yv = utils.zeros(xv.length).map(function (val, index) {\n var gte = xv[index] >= minDist;\n return gte ? Math.exp(-(xv[index] - minDist) / spread) : val;\n });\n var initialValues = [0.5, 0.5];\n var data = { x: xv, y: yv };\n var options = {\n damping: 1.5,\n initialValues: initialValues,\n gradientDifference: 10e-2,\n maxIterations: 100,\n errorTolerance: 10e-3,\n };\n var parameterValues = ml_levenberg_marquardt_1.default(data, curve, options).parameterValues;\n var _a = __read(parameterValues, 2), a = _a[0], b = _a[1];\n return { a: a, b: b };\n}\nexports.findABParams = findABParams;\nfunction fastIntersection(graph, target, unknownDist, farDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n if (farDist === void 0) { farDist = 5.0; }\n return graph.map(function (value, row, col) {\n if (target[row] === -1 || target[col] === -1) {\n return value * Math.exp(-unknownDist);\n }\n else if (target[row] !== target[col]) {\n return value * Math.exp(-farDist);\n }\n else {\n return value;\n }\n });\n}\nexports.fastIntersection = fastIntersection;\nfunction resetLocalConnectivity(simplicialSet) {\n simplicialSet = matrix.normalize(simplicialSet, \"max\");\n var transpose = matrix.transpose(simplicialSet);\n var prodMatrix = matrix.pairwiseMultiply(transpose, simplicialSet);\n simplicialSet = matrix.add(simplicialSet, matrix.subtract(transpose, prodMatrix));\n return matrix.eliminateZeros(simplicialSet);\n}\nexports.resetLocalConnectivity = resetLocalConnectivity;\nfunction initTransform(indices, weights, embedding) {\n var result = utils\n .zeros(indices.length)\n .map(function (z) { return utils.zeros(embedding[0].length); });\n for (var i = 0; i < indices.length; i++) {\n for (var j = 0; j < indices[0].length; j++) {\n for (var d = 0; d < embedding[0].length; d++) {\n var a = indices[i][j];\n result[i][d] += weights[i][j] * embedding[a][d];\n }\n }\n }\n return result;\n}\nexports.initTransform = initTransform;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction tauRandInt(n, random) {\n return Math.floor(random() * n);\n}\nexports.tauRandInt = tauRandInt;\nfunction tauRand(random) {\n return random();\n}\nexports.tauRand = tauRand;\nfunction norm(vec) {\n var e_1, _a;\n var result = 0;\n try {\n for (var vec_1 = __values(vec), vec_1_1 = vec_1.next(); !vec_1_1.done; vec_1_1 = vec_1.next()) {\n var item = vec_1_1.value;\n result += Math.pow(item, 2);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (vec_1_1 && !vec_1_1.done && (_a = vec_1.return)) _a.call(vec_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return Math.sqrt(result);\n}\nexports.norm = norm;\nfunction empty(n) {\n var output = [];\n for (var i = 0; i < n; i++) {\n output.push(undefined);\n }\n return output;\n}\nexports.empty = empty;\nfunction range(n) {\n return empty(n).map(function (_, i) { return i; });\n}\nexports.range = range;\nfunction filled(n, v) {\n return empty(n).map(function () { return v; });\n}\nexports.filled = filled;\nfunction zeros(n) {\n return filled(n, 0);\n}\nexports.zeros = zeros;\nfunction ones(n) {\n return filled(n, 1);\n}\nexports.ones = ones;\nfunction linear(a, b, len) {\n return empty(len).map(function (_, i) {\n return a + i * ((b - a) / (len - 1));\n });\n}\nexports.linear = linear;\nfunction sum(input) {\n return input.reduce(function (sum, val) { return sum + val; });\n}\nexports.sum = sum;\nfunction mean(input) {\n return sum(input) / input.length;\n}\nexports.mean = mean;\nfunction max(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n max = input[i] > max ? input[i] : max;\n }\n return max;\n}\nexports.max = max;\nfunction max2d(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n for (var j = 0; j < input[i].length; j++) {\n max = input[i][j] > max ? input[i][j] : max;\n }\n }\n return max;\n}\nexports.max2d = max2d;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n while (rejectSample) {\n var j = tauRandInt(poolSize, random);\n var broken = false;\n for (var k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken) {\n rejectSample = false;\n }\n result[i] = j;\n }\n }\n return result;\n}\nexports.rejectionSample = rejectionSample;\nfunction reshape2d(x, a, b) {\n var rows = [];\n var count = 0;\n var index = 0;\n if (x.length !== a * b) {\n throw new Error('Array dimensions must match input length.');\n }\n for (var i = 0; i < a; i++) {\n var col = [];\n for (var j = 0; j < b; j++) {\n col.push(x[index]);\n index += 1;\n }\n rows.push(col);\n count += 1;\n }\n return rows;\n}\nexports.reshape2d = reshape2d;\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, [1,452], () => (__webpack_require__(7440)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = self.location + \"\";\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t440: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkbio\"] = self[\"webpackChunkbio\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","StringMetricsNames","VectorMetricsNames","BitArrayMetricsNames","IntArrayMetricsNames","DistanceMetricsSubjects","NumberMetricsNames","randomFloat","range","Math","random","floor","assert","condition","message","Error","vectorAdd","p","q","multiplier","nItems","length","total","i","fillRandomMatrix","dimension1","dimension2","scale","matrix","fill","Array","map","initCoordinates","j","calculateEuclideanDistance","sqdiffSumm","v","itemsSum","vectorSquare","sqrt","dmLinearIndex","size","DistanceMatrixService","constructor","useConcurrentWorkers","terminateOnComplete","threadCount","navigator","hardwareConcurrency","this","_workerCount","max","_workers","Worker","URL","_terminateOnComplete","async","values","fnName","normalize","Promise","resolve","reject","len","promises","totalLength","min","chunkSize","distanceMatrix","Float32Array","endRow","endCol","lmin","lmax","Number","MIN_VALUE","start","end","startRow","startCol","postMessage","chunckSize","resolveWorker","rejectWorker","onmessage","data","error","distanceMatrixData","terminate","set","all","forEach","value","index","e","worker","SPEBase","options","steps","cycles","cutoff","lambda","dlambda","lambda2","dlambda2","epsilon","distanceFunction","distance","distanceFunctionName","vectors","dmIndexFunct","matrixService","calc","calcDistance","index1","index2","coordinates","dimension","initDistance","cycle","step","rowi","rowj","r","d","diffIJ","PSPEBase","OriginalSPE","super","radiusPercent","maxDistance","maxDistanceSteps","n","radius","vectorDistanceMetricsMethods","Euclidean","stringDistanceMetricsMethods","Levenshtein","JaroWinkler","Manhattan","s1","s2","dist","bitArrayDistanceMetricsMethods","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","intArrayDistanceMetricsMethods","TanimotoIntArray","numberDistanceMetricsMethods","NumericDistance","AvailableMetrics","Vector","String","BitArray","MacroMolecule","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","IntArray","MetricToDataType","Object","keys","reduce","ret","key","val","Measure","method","dataType","getMeasure","opts","dict","hasOwnProperty","name","toString","static","availableMeasures","DimReductionMethods","DistanceMatrix","_data","_size","undefined","dataLength","_linearizeIJ","get","list","res","square","add","other","SparseMatrixService","threshold","matSize","idx","startIdx","endIdx","results","fullSize","acc","Int32Array","offset","Reducer","AvailableReducers","distanceFn","usingSparseMatrix","sparseMatrix","sparseMatrixThreshold","transferedSparseMatrix","distanceFname","dmIndexFunc","_","usingDistanceMatrix","preCalculateDistanceMatrix","_encodedDistanceMatrix","bind","_encodedSparseMatrix","_encodedDistance","nNeighbors","reducer","u","a","b","parallelDistanceWorkers","Map","first","second","has","embedding","fit","from","iterations","matrixProxy","condensedArray","linearFunc","linearIndex","iNum","jNum","idx1Handler","target","idx1","_receiver","Proxy","idx2","idx2Handler","distanceMatrixProxy","initDataDist","getSolution","emb","embed","DimensionalityReducer","metric","measure","specOptions","_length","nEpochs","transpose","transform","typeName","availableMethods","availableMetrics","ans","obj","array","self","columnData","onMessage","exports","tsne_1","defineProperty","enumerable","TSNE","opt","returnV","vValue","iter","perplexity","getopt","dim","field","defaultval","gaussRandom","c","log","randn","mu","std","zeros","isNaN","ArrayBuffer","arr","Float64Array","randn2d","s","uses","x","xhere","push","L2","x1","x2","D","x1i","x2i","xtod","X","N","d2p","tol","nf","hTarget","P","prow","betamin","betamax","Infinity","beta","done","maxtries","num","psum","pj","exp","nHere","abs","pOut","N2","sign","initDataRaw","dists","initSolution","Y","gains","ystep","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","console","pmul","quArr","qsum","dsum","dhere","qu","NN","Q","gsum","premult","prototype","isAnyArray","object","call","endsWith","errorCalculation","parameters","parameterizedFunction","func","y","rescale","input","output","arguments","TypeError","currentMin","_options$fromIndex","fromIndex","_options$toIndex","toIndex","isInteger","minValue","currentMax","maxValue","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","rows","columns","maxI","maxJ","result","loop","line","formatNumber","join","inspectData","formatNumber2","padEnd","str","fix","toFixed","startsWith","toExponential","slice","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","row","column","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","k","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","m","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","sum","dot","vector2","vector1","mmul","Bcolj","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","mat","cols","resultat","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","pow","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log1p","log10","log2","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","count","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","alpha","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","norm2","rank","ii","leftSingularVectors","diagonalMatrix","params","damping","gradientDifference","evaluatedData","gradientFunc","paramFunction","param","auxParams","funcParam","point","gradientFunction","matrixFunc","matrixFunction","inverseMatrix","useSVD","leftHandSide","rightHandSide","levenbergMarquardt","maxIterations","errorTolerance","minValues","maxValues","initialValues","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","iteration","converged","parameterValues","parameterError","__importStar","__esModule","utils","makeHeap","nPoints","makeArrays","fillValue","empty","filled","heap","heapPush","weight","flag","weights","uncheckedHeapPush","isNew","iSwap","ic1","ic2","heapShape2","siftDown","heap1","heap2","ceiling","elt","leftChild","rightChild","swap","temp1","temp2","rejectionSample","nSamples","poolSize","rejectSample","tauRandInt","broken","buildCandidates","currentGraph","nVertices","maxCandidates","candidateNeighbors","isn","tauRand","deheapSort","indHeap","distHeap","indHeapIndex","distHeapIndex","smallestFlagged","ind","minDist","resultIndex","umap_1","UMAP","_a","__read","o","iterator","ar","__values","SparseMatrix","dims","entries","nCols","checkDims","makeKey","defaultValue","getAll","ordered","rowColValues","getDims","getRows","_b","getCols","getValues","fn","vals","toArray","_this","pairwiseMultiply","elementWise","maximum","multiplyScalar","scalar","eliminateZeros","zeroIndices","Set","removeByZeroIndex","nextValues","filter","nextRows","nextCols","normType","e_1","normFn","normFns","colsByRow","nextMatrix","_loop_1","_c","e_1_1","return","xs","op","visited","operate","nextValue","valuesA","rowsA","colsA","valuesB","rowsB","colsB","getCSR","indptr","currentRow","tree","makeNNDescent","leafArray","nIters","delta","rho","rpTreeInit","cj","ck","makeInitializations","initFromRandom","queryPoints","_heap","initFromTree","_tree","searchFlatTree","makeInitializedNNSearch","graph","initialization","tried","vertex","candidates","candidates_1","candidates_1_1","candidate","initializeSearch","forest","e_2","forest_1","forest_1_1","e_2_1","__spread","concat","FlatTree","hyperplanes","offsets","children","makeEuclideanTree","leafSize","splitResults","leftIndex","rightIndex","left","right","hyperplaneOffset","hyperplaneVector","nLeft","nRight","side","margin","indicesLeft","indicesRight","hyperplane","euclideanRandomProjectionSplit","isLeaf","recursiveFlatten","nodeNum","leafNum","oldNodeNum","numNodes","numLeaves","selectSide","makeForest","nTrees","makeTree","nNodes","nLeaves","flattenTree","makeLeafArray","rpForest","rpForest_1","rpForest_1_1","node","__awaiter","thisArg","_arguments","generator","fulfilled","rejected","then","__generator","body","label","sent","trys","ops","verb","pop","__importDefault","nnDescent","ml_levenberg_marquardt_1","SMOOTH_K_TOLERANCE","MIN_K_DIST_SCALE","learningRate","localConnectivity","nComponents","negativeSampleRate","repulsionStrength","setOpMixRatio","spread","transformQueueSize","targetMetric","targetWeight","targetNNeighbors","euclidean","isInitialized","optimizationState","OptimizationState","setParam","initializeFit","optimizeLayout","fitAsync","optimizeLayoutAsync","setSupervisedProjection","setPrecomputedKNN","knnIndices","knnDistances","getNEpochs","knnResults","nearestNeighbors","fuzzySimplicialSet","makeSearchFns","searchGraph","makeSearchGraph","processGraphForSupervisedProjection","initializeSimplicialSetEmbedding","head","tail","epochsPerSample","initializeOptimization","prepareForOptimizationLoop","search","knn","distances","neighbor","toTransform","rawData","init","adjustedLocalConnectivity","smoothKNNDistance","sigmas","rhos","computeMembershipStrengths","normed","csrMatrix","initTransform","reshape2d","graphMax","makeEpochsPerSample","assignOptimizationStateParameters","headEmbedding","tailEmbedding","currentEpoch","farDist","categoricalSimplicialSetIntersection","optimizeLayoutStep","getEmbedding","metricNNDescent","_d","_e","prodMatrix","simplicialSet","unknownDist","intersection","fastIntersection","resetLocalConnectivity","nIter","bandwidth","lo","hi","mid","ithDistances","nonZeroDists","interpolation","meanIthDistances","meanDistances","graphValues","entry","w","state","assign","moveOther","epochsPerNegativeSample","epochOfNextNegativeSample","epochOfNextSample","initialAlpha","gamma","findABParams","current","distSquared","rDist","gradCoeff","gradD","clip","nNegSamples","k_1","other_1","distSquared_1","gradCoeff_1","epochCallback","epochCompleted","shouldStop","isFinished","setTimeout","err","cosine","normX","normY","clipValue","xv","linear","yv","default","z","vec","vec_1","vec_1_1","item","ones","max2d","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","__webpack_exports__","O","chunkIds","priority","notFulfilled","definition","chunkId","globalThis","Function","window","prop","toStringTag","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""}
|