@datagrok/bio 2.4.30 → 2.4.31

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"457.js","mappings":"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AAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjDzE,EAASkI,YAAcI,UAAU7D,KAAK,EACjC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjDzE,EAASoI,WAAaE,UAAU7D,KAAK,EAChC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EA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","sources":["webpack://bio/webpack/runtime/chunk loaded","webpack://bio/webpack/runtime/startup chunk dependencies","webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.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/spe.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/consts.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/typed-metrics.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/reduce-dimensionality.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/jaro-winkler-typescript/lib/index.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 __webpack_require__.e(562).then(next);\n};","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==","/**\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==","import { calculateEuclideanDistance, calcDistanceMatrix, fillRandomMatrix, vectorAdd, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { randomInt } from '@datagrok-libraries/utils/src/random';\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 var _a, _b, _c, _d, _e, _f, _g;\n this.steps = (_a = options === null || options === void 0 ? void 0 : options.steps) !== null && _a !== void 0 ? _a : 0;\n this.cycles = (_b = options === null || options === void 0 ? void 0 : options.cycles) !== null && _b !== void 0 ? _b : 1e6;\n // Select a cutoff distance {cutoff} and ...\n this.cutoff = (_c = options === null || options === void 0 ? void 0 : options.cutoff) !== null && _c !== void 0 ? _c : 0;\n // ... an initial learning rate {lambda} > 0\n this.lambda = (_d = options === null || options === void 0 ? void 0 : options.lambda) !== null && _d !== void 0 ? _d : 2.0;\n this.dlambda = (_e = options === null || options === void 0 ? void 0 : options.dlambda) !== null && _e !== void 0 ? _e : 0.01;\n this.lambda2 = this.lambda / 2.;\n this.dlambda2 = this.dlambda / 2.;\n this.epsilon = (_f = options === null || options === void 0 ? void 0 : options.epsilon) !== null && _f !== void 0 ? _f : 1e-10;\n // eslint-disable-next-line brace-style\n this.distanceFunction = (_g = options === null || options === void 0 ? void 0 : options.distance) !== null && _g !== void 0 ? _g : calculateEuclideanDistance;\n this.distance = [];\n }\n /**\n * Initializes distance matrix.\n *\n * @param {Vectors} vectors Input vectors to calculate distance between.\n * @memberof SPEBase\n */\n initDistance(vectors) {\n this.distance = calcDistanceMatrix(vectors, this.distanceFunction);\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[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 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 }\n 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 }\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 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 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 }\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 var _a, _b, _c, _d, _e;\n super(options);\n this.cycles = (_a = options === null || options === void 0 ? void 0 : options.cycles) !== null && _a !== void 0 ? _a : 1e3;\n this.steps = (_b = options === null || options === void 0 ? void 0 : options.steps) !== null && _b !== void 0 ? _b : 100000;\n this.radiusPercent = (_c = options === null || options === void 0 ? void 0 : options.radiusPercent) !== null && _c !== void 0 ? _c : 1.0;\n this.maxDistance = (_d = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _d !== void 0 ? _d : null;\n this.maxDistanceSteps = (_e = options === null || options === void 0 ? void 0 : options.maxDistanceSteps) !== null && _e !== void 0 ? _e : null;\n }\n 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 this.initDistance(vectors);\n if (this.maxDistanceSteps == null) {\n this.maxDistanceSteps = nItems * Math.floor((nItems - 1) / 2);\n }\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 }\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 }\n return coordinates;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixTQUFTLEdBQ1YsTUFBTSxpREFBaUQsQ0FBQztBQUN6RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFFL0Q7Ozs7OztHQU1HO0FBQ0gsTUFBYSxPQUFPO0lBYWxCOzs7O09BSUc7SUFDSCxZQUFZLE9BQWlCOztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEtBQUssbUNBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxHQUFHLENBQUM7UUFDckMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxDQUFDLENBQUM7UUFDbkMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxHQUFHLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLG1DQUFJLElBQUksQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBQyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLG1DQUFJ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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPcHRpb25zLCBDb29yZGluYXRlcywgVmVjdG9ycywgRGlzdGFuY2VNZXRyaWN9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlLFxuICBjYWxjRGlzdGFuY2VNYXRyaXgsXG4gIGZpbGxSYW5kb21NYXRyaXgsXG4gIHZlY3RvckFkZCxcbn0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtyYW5kb21JbnR9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3JhbmRvbSc7XG5cbi8qKlxuICogSW1wbGVtZW50cyBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNQRUJhc2VcbiAqIEBsaW5rIGRvaToxMC4xMDE2L1MxMDkzLTMyNjMoMDMpMDAxNTUtNFxuICovXG5leHBvcnQgY2xhc3MgU1BFQmFzZSB7XG4gIHByb3RlY3RlZCBzdGF0aWMgZGltZW5zaW9uID0gMjtcbiAgcHJvdGVjdGVkIHN0ZXBzOiBudW1iZXI7XG4gIHByb3RlY3RlZCBjeWNsZXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGN1dG9mZjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbGFtYmRhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkbGFtYmRhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsYW1iZGEyOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkbGFtYmRhMjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZXBzaWxvbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGdW5jdGlvbjogRGlzdGFuY2VNZXRyaWM7XG4gIGRpc3RhbmNlOiBDb29yZGluYXRlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTUEVCYXNlLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFQmFzZVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICB0aGlzLnN0ZXBzID0gb3B0aW9ucz8uc3RlcHMgPz8gMDtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTY7XG4gICAgLy8gU2VsZWN0IGEgY3V0b2ZmIGRpc3RhbmNlIHtjdXRvZmZ9IGFuZCAuLi5cbiAgICB0aGlzLmN1dG9mZiA9IG9wdGlvbnM/LmN1dG9mZiA/PyAwO1xuICAgIC8vIC4uLiBhbiBpbml0aWFsIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gPiAwXG4gICAgdGhpcy5sYW1iZGEgPSBvcHRpb25zPy5sYW1iZGEgPz8gMi4wO1xuICAgIHRoaXMuZGxhbWJkYSA9IG9wdGlvbnM/LmRsYW1iZGEgPz8gMC4wMTtcbiAgICB0aGlzLmxhbWJkYTIgPSB0aGlzLmxhbWJkYS8yLjtcbiAgICB0aGlzLmRsYW1iZGEyID0gdGhpcy5kbGFtYmRhLzIuO1xuICAgIHRoaXMuZXBzaWxvbiA9IG9wdGlvbnM/LmVwc2lsb24gPz8gMWUtMTA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJyYWNlLXN0eWxlXG4gICAgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uID0gb3B0aW9ucz8uZGlzdGFuY2UgPz8gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2U7XG4gICAgdGhpcy5kaXN0YW5jZSA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGRpc3RhbmNlIG1hdHJpeC5cbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4uXG4gICAqIEBtZW1iZXJvZiBTUEVCYXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdERpc3RhbmNlKHZlY3RvcnM6IFZlY3RvcnMpIHtcbiAgICB0aGlzLmRpc3RhbmNlID0gY2FsY0Rpc3RhbmNlTWF0cml4KHZlY3RvcnMsIHRoaXMuZGlzdGFuY2VGdW5jdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gdmVjdG9ycyBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIFNldCBvZiB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMgYmV0d2Vlbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MSBJbmRleCBvZiB0aGUgZmlyc3QgdmVjdG9yIG9mIHRoZSBwYWlyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgyIEluZGV4IG9mIHRoZSBzZWNvbmQgdmVjdG9yIG9mIHRoZSBwYWlyLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IERpc3RhbmNlIGJldHdlZW4gdGhlc2UgdHdvIHZlY3RvcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FsY0Rpc3RhbmNlKHZlY3RvcnM6IFZlY3RvcnMsIGluZGV4MTogbnVtYmVyLCBpbmRleDI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGlzdGFuY2VbaW5kZXgxXVtpbmRleDJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgdmVjdG9ycyBnaXZlbiBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHVibGljIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBDb29yZGluYXRlcyB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XG4gICAgY29uc3QgYXJlYVdpZHRoID0gNDA7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyBvZiB0aGUgTiBwb2ludHMuXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgU1BFQmFzZS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICBsZXQgbGFtYmRhMiA9IHRoaXMubGFtYmRhMjtcblxuICAgIGlmICh0aGlzLnN0ZXBzID09IDApIHtcbiAgICAgIHRoaXMuc3RlcHMgPSB2ZWN0b3JzLmxlbmd0aC0xO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdERpc3RhbmNlKHZlY3RvcnMpO1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICBmb3IgKGxldCBzdGVwID0gMDsgc3RlcCA8IHRoaXMuc3RlcHM7ICsrc3RlcCkge1xuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG5cbiAgICAgICAgLy8gLi4uIHJldHJpZXZlIChvciBldmFsdWF0ZSkgdGhlaXIgcHJveGltaXR5IGluIHRoZSBpbnB1dCBzcGFjZSwgcmlqIGFuZCAuLi5cbiAgICAgICAgY29uc3QgciA9IHRoaXMuY2FsY0Rpc3RhbmNlKHZlY3RvcnMsIGksIGopO1xuICAgICAgICAvLyAuLi4gY29tcHV0ZSB0aGVpciBFdWNsaWRlYW4gZGlzdGFuY2Ugb24gdGhlIEQtZGltZW5zaW9uYWwgbWFwLCBkaWouXG4gICAgICAgIGNvbnN0IGQgPSBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShyb3dpLCByb3dqKTtcblxuICAgICAgICAvLyBJZiByaWogPD0gcmMsIG9yIGlmIHJpaiA+IHJjIGFuZCBkaWogPCByaWogLi4uXG4gICAgICAgIGlmICgodGhpcy5jdXRvZmYgPT0gMCkgfHwgKHIgPD0gdGhpcy5jdXRvZmYpIHx8IChkIDwgcikpIHtcbiAgICAgICAgICBjb25zdCBtdWx0aXBsaWVyID0gbGFtYmRhMioociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIC8vIC4uLiB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzIHhpIGFuZCB4ai5cbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2ldID0gdmVjdG9yQWRkKHJvd2ksIGRpZmZJSiwgbXVsdGlwbGllcik7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERlY3JlYXNlIHRoZSBsZWFybmluZyByYXRlIHtsYW1iZGF9IGJ5IGEgcHJlc2NyaWJlZCB7ZGxhbWJkYX0uXG4gICAgICBsYW1iZGEyIC09IHRoaXMuZGxhbWJkYTI7XG4gICAgICBpZiAobGFtYmRhMiA8PSAwLikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFBTUEVCYXNlXG4gKiBAbGluayBkb2k6MTAuMTAxNi9TMTA5My0zMjYzKDAzKTAwMTU1LTRcbiAqL1xuZXhwb3J0IGNsYXNzIFBTUEVCYXNlIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHVibGljIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBDb29yZGluYXRlcyB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XG4gICAgY29uc3QgYXJlYVdpZHRoID0gNDA7XG4gICAgLy8gIEluaXRpYWxpemUgdGhlIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMgb2YgdGhlIE4gcG9pbnRzLlxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZmlsbFJhbmRvbU1hdHJpeChuSXRlbXMsIFBTUEVCYXNlLmRpbWVuc2lvbiwgYXJlYVdpZHRoKTtcbiAgICBsZXQgbGFtYmRhID0gdGhpcy5sYW1iZGE7XG5cbiAgICB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcblxuICAgIGZvciAobGV0IGN5Y2xlID0gMDsgY3ljbGUgPCB0aGlzLmN5Y2xlczsgKytjeWNsZSkge1xuICAgICAgLy8gU2VsZWN0IGEgcG9pbnQsIGksIGF0IHJhbmRvbSAocGl2b3QpLlxuICAgICAgY29uc3QgaTogbnVtYmVyID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07XG5cbiAgICAgIC8vIEZvciBldmVyeSBwb2ludCBqICE9IGkgLi4uXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICAgIGlmIChpID09IGopIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG4gICAgICAgIC8vIC4uLiByZXRyaWV2ZSAob3IgZXZhbHVhdGUpIGl0cyBwcm94aW1pdHkgdG8gaSBpbiB0aGUgaW5wdXQgc3BhY2UsIHJpaiAuLi5cbiAgICAgICAgY29uc3QgciA9IHRoaXMuY2FsY0Rpc3RhbmNlKHZlY3RvcnMsIGksIGopO1xuICAgICAgICAvLyAuLi4gYW5kIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XG4gICAgICAgIC8vIElmIHJpaiA8PSByYywgb3IgaWYgcmlqID4gcmMgYW5kIGRpaiA8IHJpaiAuLi5cbiAgICAgICAgaWYgKCh0aGlzLmN1dG9mZiA9PSAwKSB8fCAociA8PSB0aGlzLmN1dG9mZikgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEgKiAociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIGNvbnN0IGRpZmZJSiA9IHZlY3RvckFkZChyb3dpLCByb3dqLCAtMSk7XG4gICAgICAgICAgLy8gLi4uIHVwZGF0ZSB0aGUgY29vcmRpbmF0ZXMgeGouXG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERlY3JlYXNlIHRoZSBsZWFybmluZyByYXRlIHtsYW1iZGF9IGJ5IGEgcHJlc2NyaWJlZCB7ZGxhbWJkYX0uXG4gICAgICBsYW1iZGEgLT0gdGhpcy5kbGFtYmRhO1xuICAgICAgaWYgKGxhbWJkYSA8PSAwLikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE9yaWdpbmFsU1BFXG4gKiBAbGluayBkb2k6MTAuMTAwMi9qY2MuMTAyMzRcbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWdpbmFsU1BFIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJhZGl1c1BlcmNlbnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIG1heERpc3RhbmNlOiBudW1iZXI7XG4gIHByb3RlY3RlZCBtYXhEaXN0YW5jZVN0ZXBzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTM7XG4gICAgdGhpcy5zdGVwcyA9IG9wdGlvbnM/LnN0ZXBzID8/IDEwMDAwMDtcbiAgICB0aGlzLnJhZGl1c1BlcmNlbnQgPSBvcHRpb25zPy5yYWRpdXNQZXJjZW50ID8/IDEuMDtcbiAgICB0aGlzLm1heERpc3RhbmNlID0gb3B0aW9ucz8ubWF4RGlzdGFuY2UgPz8gbnVsbDtcbiAgICB0aGlzLm1heERpc3RhbmNlU3RlcHMgPSBvcHRpb25zPy5tYXhEaXN0YW5jZVN0ZXBzID8/IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IENvb3JkaW5hdGVzIHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzIG9mIHRoZSBOIHBvaW50cy5cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGZpbGxSYW5kb21NYXRyaXgobkl0ZW1zLCBPcmlnaW5hbFNQRS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcblxuICAgIGlmICh0aGlzLm1heERpc3RhbmNlU3RlcHMgPT0gbnVsbCkge1xuICAgICAgdGhpcy5tYXhEaXN0YW5jZVN0ZXBzID0gbkl0ZW1zICogTWF0aC5mbG9vcigobkl0ZW1zIC0gMSkgLyAyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4RGlzdGFuY2UgPT0gbnVsbCkge1xuICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IC0xZTM3O1xuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0aGlzLm1heERpc3RhbmNlU3RlcHM7IG4rKykge1xuICAgICAgICBjb25zdCBpID0gcmFuZG9tSW50KG5JdGVtcyk7IGxldCBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIHdoaWxlIChpID09IGopIGogPSByYW5kb21JbnQobkl0ZW1zKTtcblxuICAgICAgICBjb25zdCBkID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIGlmIChkID4gdGhpcy5tYXhEaXN0YW5jZSkge1xuICAgICAgICAgIHRoaXMubWF4RGlzdGFuY2UgPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxhbWJkYSA9IHRoaXMubGFtYmRhO1xuICAgIGNvbnN0IHJhZGl1cyA9ICh0aGlzLnJhZGl1c1BlcmNlbnQgPT0gMC4wKSA/IHRoaXMubWF4RGlzdGFuY2UgOiB0aGlzLm1heERpc3RhbmNlICogdGhpcy5yYWRpdXNQZXJjZW50O1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICBmb3IgKGxldCBzdGVwID0gMDsgc3RlcCA8IHRoaXMuc3RlcHM7ICsrc3RlcCkge1xuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG5cbiAgICAgICAgLy8gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XG5cbiAgICAgICAgaWYgKChyIDw9IHJhZGl1cykgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEgKiAwLjUgKiAociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIC8vIC4uLiB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzIHhpIGFuZCB4ai5cbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2ldID0gdmVjdG9yQWRkKHJvd2ksIGRpZmZJSiwgbXVsdGlwbGllcik7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhbWJkYSAtPSAoKHRoaXMubGFtYmRhIC0gdGhpcy5kbGFtYmRhKSAvICh0aGlzLmN5Y2xlcyAtIDEuMCkpOyA7XG4gICAgICBpZiAobGFtYmRhIDwgdGhpcy5kbGFtYmRhKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cbn1cbiJdfQ==","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 DistanceMetricsSubjects;\n(function (DistanceMetricsSubjects) {\n DistanceMetricsSubjects[\"Vector\"] = \"Vector\";\n DistanceMetricsSubjects[\"String\"] = \"String\";\n DistanceMetricsSubjects[\"BitArray\"] = \"BitArray\";\n DistanceMetricsSubjects[\"MacroMolecule\"] = \"MacroMolecule\";\n})(DistanceMetricsSubjects || (DistanceMetricsSubjects = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGtCQUlUO0FBSkgsV0FBWSxrQkFBa0I7SUFDMUIsaURBQTJCLENBQUE7SUFDM0Isa0RBQTRCLENBQUE7SUFDNUIsNkNBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUpTLGtCQUFrQixLQUFsQixrQkFBa0IsUUFJM0I7QUFFRCxNQUFNLENBQU4sSUFBWSxrQkFFWDtBQUZELFdBQVksa0JBQWtCO0lBQzVCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFGVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTdCO0FBRUQsTUFBTSxDQUFOLElBQVksb0JBYVg7QUFiRCxXQUFZLG9CQUFvQjtJQUM5Qiw2Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBYSxDQUFBO0lBQ2IsaURBQXlCLENBQUE7SUFDekIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsaURBQXlCLENBQUE7SUFDekIsc0RBQThCLENBQUE7SUFDOUIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLDJDQUFtQixDQUFBO0lBQ25CLCtDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFiVyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBYS9CO0FBRUQsTUFBTSxDQUFOLElBQVksdUJBS1g7QUFMRCxXQUFZLHVCQUF1QjtJQUNqQyw0Q0FBaUIsQ0FBQTtJQUNqQiw0Q0FBaUIsQ0FBQTtJQUNqQixnREFBcUIsQ0FBQTtJQUNyQiwwREFBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBTFcsdUJBQXVCLEtBQXZCLHVCQUF1QixRQUtsQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIFN0cmluZ01ldHJpY3NOYW1lcyB7XG4gICAgTGV2ZW5zaHRlaW4gPSAnTGV2ZW5zaHRlaW4nLFxuICAgIEphcm9XaW5rbGVyID0gJ0phcm8tV2lua2xlcicsXG4gICAgTWFuaGF0dGFuID0gJ01hbmhhdHRhbicsXG4gIH1cbiAgXG4gIGV4cG9ydCBlbnVtIFZlY3Rvck1ldHJpY3NOYW1lcyB7XG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cbiAgXG4gIGV4cG9ydCBlbnVtIEJpdEFycmF5TWV0cmljc05hbWVzIHtcbiAgICBUYW5pbW90byA9ICdUYW5pbW90bycsXG4gICAgRGljZSA9ICdEaWNlJyxcbiAgICBBc3ltbWV0cmljID0gJ0FzeW1tZXRyaWMnLFxuICAgIEJyYXVuQmxhbnF1ZXQgPSAnQnJhdW4tQmxhbnF1ZXQnLFxuICAgIENvc2luZSA9ICdDb3NpbmUnLFxuICAgIEt1bGN6eW5za2kgPSAnS3VsY3p5bnNraScsXG4gICAgTWNDb25uYXVnaGV5ID0gJ01jLUNvbm5hdWdoZXknLFxuICAgIFJvZ290R29sZGJlcmcgPSAnUm9nb3QtR29sZGJlcmcnLFxuICAgIFJ1c3NlbCA9ICdSdXNzZWwnLFxuICAgIFNva2FsID0gJ1Nva2FsJyxcbiAgICBIYW1taW5nID0gJ0hhbW1pbmcnLFxuICAgIEV1Y2xpZGVhbiA9ICdFdWNsaWRlYW4nLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMge1xuICAgIFZlY3RvciA9ICdWZWN0b3InLFxuICAgIFN0cmluZyA9ICdTdHJpbmcnLFxuICAgIEJpdEFycmF5ID0gJ0JpdEFycmF5JyxcbiAgICBNYWNyb01vbGVjdWxlID0gJ01hY3JvTW9sZWN1bGUnXG4gIH1cbiAgIl19","import { BitArrayMetricsNames } from './typed-metrics/consts';\nexport const similarityMetric = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoSimilarity,\n [BitArrayMetricsNames.Dice]: diceSimilarity,\n [BitArrayMetricsNames.Asymmetric]: asymmetricSimilarity,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetSimilarity,\n [BitArrayMetricsNames.Cosine]: cosineSimilarity,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiSimilarity,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheySimilarity,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergSimilarity,\n [BitArrayMetricsNames.Russel]: russelSimilarity,\n [BitArrayMetricsNames.Sokal]: sokalSimilarity,\n [BitArrayMetricsNames.Hamming]: hammingSimilarity,\n [BitArrayMetricsNames.Euclidean]: euclideanSimilarity,\n};\nexport const distanceMetrics = {\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 CHEM_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Dice,\n BitArrayMetricsNames.Cosine\n];\nexport const SEQ_SPACE_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Asymmetric,\n BitArrayMetricsNames.Cosine,\n BitArrayMetricsNames.Sokal\n];\nexport function tanimotoSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 1.0;\n const common = x.andWithCountBits(y, true);\n return common / (total - common);\n}\nexport function tanimotoDistance(x, y) {\n return getDistanceFromSimilarity(tanimotoSimilarity(x, y));\n}\nexport function diceSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return 2 * common / total;\n}\nexport function diceDistance(x, y) {\n return getDistanceFromSimilarity(diceSimilarity(x, y));\n}\nexport function cosineSimilarity(x, y) {\n const total = x.trueCount() * y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / Math.sqrt(total);\n}\nexport function cosineDistance(x, y) {\n return getDistanceFromSimilarity(cosineSimilarity(x, y));\n}\nexport function euclideanSimilarity(x, y) {\n return getSimilarityFromDistance(euclideanDistance(x, y));\n}\nexport function euclideanDistance(x, y) {\n return Math.sqrt(x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true));\n}\nexport function hammingSimilarity(x, y) {\n return getSimilarityFromDistance(hammingDistance(x, y));\n}\nexport function hammingDistance(x, y) {\n return x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true);\n}\nexport function sokalSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const common = x.andWithCountBits(y, true);\n return common / (2 * total - 3 * common);\n}\nexport function sokalDistance(x, y) {\n return getDistanceFromSimilarity(sokalSimilarity(x, y));\n}\nexport function kulczynskiSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total) / (2 * totalProd);\n}\nexport function kulczynskiDistance(x, y) {\n return getDistanceFromSimilarity(kulczynskiSimilarity(x, y));\n}\nexport function mcConnaugheySimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total - totalProd) / totalProd;\n}\nexport function mcConnaugheyDistance(x, y) {\n return getDistanceFromSimilarity(mcConnaugheySimilarity(x, y));\n}\nexport function asymmetricSimilarity(x, y) {\n const min = Math.min(x.trueCount(), y.trueCount());\n if (min == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / min;\n}\nexport function asymmetricDistance(x, y) {\n return getDistanceFromSimilarity(asymmetricSimilarity(x, y));\n}\nexport function braunBlanquetSimilarity(x, y) {\n const max = Math.max(x.trueCount(), y.trueCount());\n if (max == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / max;\n}\nexport function braunBlanquetDistance(x, y) {\n return getDistanceFromSimilarity(braunBlanquetSimilarity(x, y));\n}\nexport function russelSimilarity(x, y) {\n if (x.length == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / x.length;\n}\nexport function russelDistance(x, y) {\n return getDistanceFromSimilarity(russelSimilarity(x, y));\n}\nexport function rogotGoldbergSimilarity(x, y) {\n const common = x.andWithCountBits(y, true);\n const total = x.countBits(true) + y.countBits(true);\n const len = x.length;\n const diff = len - total + common;\n if ((common == len) || (diff == len))\n return 1.0;\n else\n return common / total + diff / (2 * len - total);\n}\nexport function rogotGoldbergDistance(x, y) {\n return getDistanceFromSimilarity(rogotGoldbergSimilarity(x, y));\n}\nexport function getSimilarityFromDistance(distance) {\n return 1 / (1 + distance);\n}\nexport function getDistanceFromSimilarity(similarity) {\n return 1 / similarity - 1;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQjtJQUNuRCxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWM7SUFDM0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxzQkFBc0I7SUFDM0QsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlO0lBQzdDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUUsbUJBQW1CO0NBQ3RELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTZEO0lBQ3ZGLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEVBQUUsZ0JBQWdCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWTtJQUN6QyxDQUFDLG9CQUFvQixDQUFDLFVB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RyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzVELE9BQU8seUJBQXlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxRQUFnQjtJQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQWtCO0lBQzFELE9BQU8sQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuaW1wb3J0IHsgQml0QXJyYXlNZXRyaWNzTmFtZXMgfSBmcm9tICcuL3R5cGVkLW1ldHJpY3MvY29uc3RzJztcblxuZXhwb3J0IGNvbnN0IHNpbWlsYXJpdHlNZXRyaWM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpID0+IG51bWJlciB9ID0ge1xuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiB0YW5pbW90b1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogZGljZVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYnJhdW5CbGFucXVldFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBjb3NpbmVTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogbWNDb25uYXVnaGV5U2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiByb2dvdEdvbGRiZXJnU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IHNva2FsU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkhhbW1pbmddOiBoYW1taW5nU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhblNpbWlsYXJpdHksXG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2VNZXRyaWNzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IENIRU1fU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90byxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZSxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXTtcbmV4cG9ydCBjb25zdCBTRVFfU1BBQ0VfU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90byxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpYyxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbCBdO1xuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9TaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbCA9PSAwKSByZXR1cm4gMS4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyAodG90YWwgLSBjb21tb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9EaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eSh0YW5pbW90b1NpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGljZVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIDIgKiBjb21tb24gLyB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpY2VEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShkaWNlU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3NpbmVTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBNYXRoLnNxcnQodG90YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoY29zaW5lU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldWNsaWRlYW5TaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlKGV1Y2xpZGVhbkRpc3RhbmNlKHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV1Y2xpZGVhbkRpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnNxcnQoeC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCkgLSAyICogeC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbW1pbmdTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlKGhhbW1pbmdEaXN0YW5jZSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW1taW5nRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpIC0gMiAqIHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNva2FsU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyAoMiAqIHRvdGFsIC0gMyAqIGNvbW1vbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb2thbERpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHNva2FsU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdWxjenluc2tpU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCB0b3RhbFByb2QgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsUHJvZCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAoY29tbW9uICogdG90YWwpIC8gKDIgKiB0b3RhbFByb2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3VsY3p5bnNraURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGt1bGN6eW5za2lTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgdG90YWxQcm9kID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbFByb2QgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gKGNvbW1vbiAqIHRvdGFsIC0gdG90YWxQcm9kKSAvIHRvdGFsUHJvZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWluID0gTWF0aC5taW4oeC50cnVlQ291bnQoKSwgeS50cnVlQ291bnQoKSk7XG4gIGlmIChtaW4gPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gbWluO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGFzeW1tZXRyaWNTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyYXVuQmxhbnF1ZXRTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHgudHJ1ZUNvdW50KCksIHkudHJ1ZUNvdW50KCkpO1xuICBpZiAobWF4ID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIG1heDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyYXVuQmxhbnF1ZXREaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShicmF1bkJsYW5xdWV0U2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydXNzZWxTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGlmICh4Lmxlbmd0aCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyB4Lmxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1c3NlbERpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHJ1c3NlbFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICBjb25zdCB0b3RhbCA9IHguY291bnRCaXRzKHRydWUpICsgeS5jb3VudEJpdHModHJ1ZSk7XG4gIGNvbnN0IGxlbiA9IHgubGVuZ3RoO1xuICBjb25zdCBkaWZmID0gbGVuIC0gdG90YWwgKyBjb21tb247XG4gIGlmICgoY29tbW9uID09IGxlbikgfHwgKGRpZmYgPT0gbGVuKSkgcmV0dXJuIDEuMDtcbiAgZWxzZSByZXR1cm4gY29tbW9uIC8gdG90YWwgKyBkaWZmIC8gKDIgKiBsZW4gLSB0b3RhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb2dvdEdvbGRiZXJnRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkocm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShkaXN0YW5jZTogbnVtYmVyKSB7XG4gIHJldHVybiAxIC8gKDEgKyBkaXN0YW5jZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHNpbWlsYXJpdHk6IG51bWJlcikge1xuICByZXR1cm4gMSAvIHNpbWlsYXJpdHkgLSAxO1xufVxuIl19","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunch } from './needleman-wunsch';\n/** Enum containing currently supported macromolecule distance functions\n * Hamming distance will be used if the sequences are already aligned\n * Needleman distance will be used for protein sequences with known BLOSUM62 matrix\n * Levenshtein distance will be used for nucleotide sequences as for them substitution matrix is same as identity matrix\n */\nexport var MmDistanceFunctionsNames;\n(function (MmDistanceFunctionsNames) {\n MmDistanceFunctionsNames[\"HAMMING\"] = \"Hamming\";\n MmDistanceFunctionsNames[\"LEVENSHTEIN\"] = \"Levenshtein\";\n MmDistanceFunctionsNames[\"NEEDLEMANN_WUNSCH\"] = \"Needlemann-Wunsch\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFJWDtBQUpELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0FBQzNDLENBQUMsRUFKVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBSW5DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0NBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCdcbn07XG5cbmV4cG9ydCBjb25zdCBtbURpc3RhbmNlRnVuY3Rpb25zOiBSZWNvcmQ8TW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLCAodmFsdWU/OiBhbnkpID0+IG1tRGlzdGFuY2VGdW5jdGlvblR5cGU+ID0ge1xuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBoYW1taW5nLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbGV2ZW5zdGVpbixcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF06IG5lZWRsZW1hbld1bmNoXG59O1xuIl19","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, } 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 } 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 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};\nexport const MetricToDataType = Object.keys(AvailableMetrics)\n .reduce((ret, key) => {\n for (const val of Object.keys(AvailableMetrics[key])) {\n ret[val] = key;\n }\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 }\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEdBQ2pCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0saURBQWlELENBQUM7QUFHM0YsT0FBTyxFQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDbEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBR2pILE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUF5RDtJQUNoRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLDBCQUEwQjtDQUMzRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQXlEO0lBQ2hHLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVE7SUFDN0MsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXO0lBQzdDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCO0NBQ2xELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBNkQ7SUFDdEcsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxnQkFBZ0I7SUFD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QUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBbUIsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBNEI7UUFDNUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxLQUFLLGlCQUFpQjtRQUMxQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmbCBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB7amFyb1dpbmtsZXJ9IGZyb20gJ2phcm8td2lua2xlci10eXBlc2NyaXB0JztcbmltcG9ydCB7RGlzdGFuY2VNZXRyaWN9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7XG4gIGFzeW1tZXRyaWNEaXN0YW5jZSxcbiAgYnJhdW5CbGFucXVldERpc3RhbmNlLFxuICBjb3NpbmVEaXN0YW5jZSxcbiAgZGljZURpc3RhbmNlLFxuICBldWNsaWRlYW5EaXN0YW5jZSxcbiAgaGFtbWluZ0Rpc3RhbmNlLFxuICBrdWxjenluc2tpRGlzdGFuY2UsXG4gIG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICByb2dvdEdvbGRiZXJnRGlzdGFuY2UsXG4gIHJ1c3NlbERpc3RhbmNlLFxuICBzb2thbERpc3RhbmNlLFxuICB0YW5pbW90b0Rpc3RhbmNlLFxufSBmcm9tICcuLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuXG5pbXBvcnQge2NhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmltcG9ydCB7VmVjdG9yLCBTdHJpbmdEaWN0aW9uYXJ5fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvbnMsIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lc30gZnJvbSAnLi4vbWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMsIEJpdEFycmF5TWV0cmljc05hbWVzLCBTdHJpbmdNZXRyaWNzTmFtZXMsIFZlY3Rvck1ldHJpY3NOYW1lcyB9IGZyb20gJy4vY29uc3RzJztcblxuXG5leHBvcnQgY29uc3QgdmVjdG9yRGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IFZlY3RvciwgeTogVmVjdG9yKSA9PiBudW1iZXIgfSA9IHtcbiAgW1ZlY3Rvck1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogc3RyaW5nLCB5OiBzdHJpbmcpID0+IG51bWJlciB9ID0ge1xuICBbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXTogZmwuZGlzdGFuY2UsXG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdOiBqYXJvV2lua2xlcixcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5NYW5oYXR0YW5dOiBtYW5oYXR0YW5EaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpID0+IG51bWJlciB9ID0ge1xuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiB0YW5pbW90b0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZV06IGRpY2VEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdOiBhc3ltbWV0cmljRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYnJhdW5CbGFucXVldERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXTogY29zaW5lRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXToga3VsY3p5bnNraURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogbWNDb25uYXVnaGV5RGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Sb2dvdEdvbGRiZXJnXTogcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUnVzc2VsXTogcnVzc2VsRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IHNva2FsRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5IYW1taW5nXTogaGFtbWluZ0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogZXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgQXZhaWxhYmxlTWV0cmljcyA9IHtcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlZlY3Rvcl06IHtcbiAgICBbVmVjdG9yTWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IHZlY3RvckRpc3RhbmNlTWV0cmljc01ldGhvZHNbVmVjdG9yTWV0cmljc05hbWVzLkV1Y2xpZGVhbl0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5TdHJpbmddOiB7XG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkJpdEFycmF5XToge1xuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Sb2dvdEdvbGRiZXJnXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUnVzc2VsXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLk1hY3JvTW9sZWN1bGVdOiB7IC8vIG9wdGlvbmFsIGFyZ3MgYXJlIG5lZWRlZCBmb3IgbWFjcm9tb2xlY3VsZSBmdW5jdGlvbnMgd2hpY2ggaW5pdGlhbGl6ZSB0aGVtXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlOR10sXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTl06IG1tRGlzdGFuY2VGdW5jdGlvbnNbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXSxcbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IE1ldHJpY1RvRGF0YVR5cGU6IFN0cmluZ0RpY3Rpb25hcnkgPSBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKVxuICAucmVkdWNlKChyZXQ6IFN0cmluZ0RpY3Rpb25hcnksIGtleSkgPT4ge1xuICAgIGZvciAoY29uc3QgdmFsIG9mIE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3Nba2V5IGFzIEF2YWlsYWJsZURhdGFUeXBlc10pKSB7XG4gICAgICByZXRbdmFsIGFzIEF2YWlsYWJsZURhdGFUeXBlc10gPSBrZXk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sIHt9KTtcblxuZXhwb3J0IHR5cGUgQXZhaWxhYmxlRGF0YVR5cGVzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3M7XG5leHBvcnQgdHlwZSBWZWN0b3JNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuVmVjdG9yXTtcbmV4cG9ydCB0eXBlIFN0cmluZ01ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5TdHJpbmddO1xuZXhwb3J0IHR5cGUgQml0QXJyYXlNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuQml0QXJyYXldO1xuZXhwb3J0IHR5cGUgS25vd25NZXRyaWNzID0gU3RyaW5nTWV0cmljcyB8IEJpdEFycmF5TWV0cmljcyB8IFZlY3Rvck1ldHJpY3MgfCBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXM7XG5cbmV4cG9ydCB0eXBlIFZhbGlkVHlwZXMgPVxuICB7IGRhdGE6IHN0cmluZ1tdLCBtZXRyaWM6IFN0cmluZ01ldHJpY3MgfCBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMgfSB8XG4gIHsgZGF0YTogVmVjdG9yW10sIG1ldHJpYzogVmVjdG9yTWV0cmljcyB9IHxcbiAgeyBkYXRhOiBCaXRBcnJheVtdLCBtZXRyaWM6IEJpdEFycmF5TWV0cmljcyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdTdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCaXRBcnJheU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ0JpdEFycmF5Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVjdG9yTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnVmVjdG9yJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFjcm9Nb2xlY3VsZU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTWFjcm9Nb2xlY3VsZS50b1N0cmluZygpO1xufVxuXG4vKiogTWFuaGF0dGFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcyAobWF0Y2ggLSAwLCBtaXNtYXRjaCAtIDEpIG5vcm1hbGl6ZWQgZm9yIGxlbmd0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW5oYXR0YW5EaXN0YW5jZShzMTogc3RyaW5nLCBzMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHMxLmxlbmd0aCAhPT0gczIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGRpc3Q6IG51bWJlciA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzMS5sZW5ndGg7IGkrKykge1xuICAgICAgZGlzdCArPSBzMVtpXSA9PSBzMltpXSA/IDAgOiAxO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdCAvIHMxLmxlbmd0aDtcbiAgfVxufVxuXG4vKiogVW5pZmllZCBjbGFzcyBpbXBsZW1lbnRpbmcgZGlmZmVyZW50IHN0cmluZyBtZWFzdXJlcy4gKi9cbmV4cG9ydCBjbGFzcyBNZWFzdXJlIHtcbiAgcHJvdGVjdGVkIG1ldGhvZDogS25vd25NZXRyaWNzO1xuICBwcm90ZWN0ZWQgZGF0YVR5cGU6IEF2YWlsYWJsZURhdGFUeXBlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZWFzdXJlIHdpdGggLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIE1ldGhvZCB0byBjYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdHJpbmdzLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1ldGhvZDogS25vd25NZXRyaWNzKSB7XG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgdGhpcy5kYXRhVHlwZSA9IE1ldHJpY1RvRGF0YVR5cGVbbWV0aG9kXSBhcyBBdmFpbGFibGVEYXRhVHlwZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXN0b20gc3RyaW5nIGRpc3RhbmNlIGZ1bmN0aW9uIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIHtvcHRzfSBvcHRzIE9wdGlvbnMgZm9yIHRoZSBtZWFzdXJlLiB1c2VkIGZvciBtYWNyb21vbGVjdWxlIGRpc3RhbmNlc1xuICAgKiBAcmV0dXJuIHtEaXN0YW5jZU1ldHJpY30gQ2FsbGJhY2sgb2YgdGhlIG1lYXN1cmUgY2hvc2VuLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBnZXRNZWFzdXJlKG9wdHM/OiBhbnkpOiBEaXN0YW5jZU1ldHJpYyB7XG4gICAgY29uc3QgZGljdDogeyBba2V5OiBzdHJpbmddOlxuICAgICAge1trZXkyOiBzdHJpbmddOiBEaXN0YW5jZU1ldHJpYyB8ICgob3B0czogYW55KSA9PiBEaXN0YW5jZU1ldHJpYyl9XG4gICAgfSA9IEF2YWlsYWJsZU1ldHJpY3M7XG4gICAgaWYgKCFkaWN0Lmhhc093blByb3BlcnR5KHRoaXMuZGF0YVR5cGUpIHx8ICFkaWN0W3RoaXMuZGF0YVR5cGVdLmhhc093blByb3BlcnR5KHRoaXMubWV0aG9kKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtZWFzdXJlICR7dGhpcy5tZXRob2R9IGZvciBkYXRhIHR5cGUgJHt0aGlzLmRhdGFUeXBlfWApO1xuICAgIHJldHVybiBpc01hY3JvTW9sZWN1bGVNZXRyaWModGhpcy5tZXRob2QpID9cbiAgICAgIChkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpKShvcHRzKSA6XG4gICAgICBkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyBEaXN0YW5jZU1ldHJpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgYnkgdGhlIGdpdmVuIGRhdGEgdHlwZS5cbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IGRhdGFUeXBlIE1ldHJpYydzIGRhdGEgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWV0cmljQnlEYXRhVHlwZShkYXRhVHlwZTogQXZhaWxhYmxlRGF0YVR5cGVzKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW2RhdGFUeXBlXSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBtZXRyaWMgbmFtZXMgYXZhaWxhYmxlLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWVhc3VyZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKTtcbiAgfVxufVxuIl19","export default class BitArray {\n constructor(arg, defaultValue = false) {\n this._length = 0;\n this._version = 0;\n this._updateLevel = 0;\n this._selectedCount = 0;\n this._selectedCountVersion = -1;\n this._selectedIndexesVersion = -1;\n this._versionedName = '';\n this._versionedNameVersion = -1;\n this.SHRINK_THRESHOLD = 0x100;\n if (typeof arg === 'number') {\n const length = arg;\n const buff = BitArray._createBuffer(length);\n if (defaultValue) {\n for (let i = 0; i < buff.length; i++)\n buff[i] = -1;\n }\n this._data = buff;\n this._length = length;\n }\n else if (arg instanceof Uint32Array) {\n this._data = arg;\n this._length = defaultValue;\n }\n else {\n throw new Error('Invalid constructor');\n }\n }\n getRawData() { return this._data; }\n assureGoez(num, argName) {\n if (num < 0)\n throw new Error(`${argName} should be greater than zero`);\n }\n assureInRange(value, min, max, argName) {\n if ((value < min) || (value > max))\n throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);\n }\n copy(src, dst, count) {\n for (let i = 0; i < count; i++)\n dst[i] = src[i];\n }\n copyFrom(other) {\n if (this._length != other._length)\n throw new Error(`Lengths differ (${this._length} != ${other._length})`);\n this.copy(other._data, this._data, this.lengthInInts);\n this._version++;\n }\n get length() {\n return this._length;\n }\n get buffer() {\n return this._data;\n }\n set buffer(data) {\n this._data = data;\n this._version++;\n }\n get version() {\n return this._version;\n }\n set version(value) {\n this._version = value;\n }\n incrementVersion(notify = true) {\n this._version++;\n }\n get lengthInInts() {\n return Math.floor((this._length + 0x1f) / 0x20);\n }\n get versionedName() {\n return this._version == this._versionedNameVersion ? this._versionedName : '';\n }\n set versionedName(name) {\n this._versionedName = name;\n this._versionedNameVersion = this._version;\n }\n get self() {\n return this;\n }\n setLength(value) {\n if (value < 0)\n throw new Error('should be >= 0');\n if (value == this._length)\n return;\n const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);\n if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {\n const newData = new Uint32Array(nIntsNeeded);\n this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);\n this._data = newData;\n }\n if (value > this._length) {\n if (this._length % 0x20 > 0)\n this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;\n this._data.fill(0, this.lengthInInts, nIntsNeeded);\n }\n this._length = value;\n this._version++;\n }\n static fromAnd(set1, set2) {\n if (set1._length != set2._length)\n throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);\n const temp = new BitArray(set1._length);\n temp._length = set1._length;\n temp._data = BitArray._createBuffer(temp._length);\n temp._version = 0;\n const len = set1.lengthInInts;\n for (let i = 0; i < len; i++)\n temp._data[i] = set1._data[i] & set2._data[i];\n return temp;\n }\n static _createBuffer(length) {\n return new Uint32Array(Math.floor((length + 0x1f) / 0x20));\n }\n static fromValues(values) {\n const temp = new BitArray(values.length);\n temp._version = 0;\n for (let i = 0; i < temp._length; i++) {\n if (values[i])\n temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n return temp;\n }\n /// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).\n static fromSeq(count, flag) {\n const temp = new BitArray(count);\n for (let i = 0; i < count; ++i)\n temp.setBit(i, flag(i));\n temp._version = 0;\n return temp;\n }\n /// Constructs a [BitSet] from a string [s] containing '0' or '1'.\n static fromString(s) {\n return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');\n }\n /// Constructs a [BitSet], based on length [_length] and byte array [_data].\n static fromUint32Array(_length, _data) {\n const temp = new BitArray(_length);\n temp._data = _data;\n return temp;\n }\n /// Deserializes a [BitSet] from [bytes].\n static fromBytes(bytes) {\n const len = bytes.length;\n const temp = new BitArray(len * 8);\n temp._data = new Uint32Array(Math.floor((len + 3) / 4));\n temp._length = len * 8;\n let num1 = 0;\n let num2 = 0;\n while ((len - num2) >= 4) {\n temp._data[num1++] = (((bytes[num2] & 0xff) | ((bytes[num2 + 1] & 0xff) << 8)) |\n ((bytes[num2 + 2] & 0xff) << 0x10)) | ((bytes[num2 + 3] & 0xff) << 0x18);\n num2 += 4;\n }\n if (len - num2 == 3)\n temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;\n if (len - num2 == 2)\n temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;\n if (len - num2 == 1)\n temp._data[num1] |= bytes[num2] & 0xff;\n temp._version = 0;\n return temp;\n }\n toString() {\n return `${this._length} bits, ${this.countBits(true)} set`;\n }\n /// Performs deep comparison of two bitsets.\n equals(other) {\n if (this == other)\n return true;\n if (other == null)\n return false;\n if (this._length != other._length)\n return false;\n if (this._length == 0)\n return true;\n for (let i = 0; i < this._data.length - 1; i++)\n if (this._data[i] != other._data[i])\n return false;\n for (let i = (this._data.length - 1) * 8; i < this._length; i++) {\n if (this.getBit(i) != other.getBit(i))\n return false;\n }\n return true;\n }\n /** Clones a bitset. */\n clone() {\n const bitArray = new BitArray(0, false);\n bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)\n bitArray._length = this._length;\n bitArray._version = this._version;\n return bitArray;\n }\n /** Initializes a bitset. */\n init(flag, notify) {\n this.setAll(false, false);\n for (let i = 0; i < this._length; i++) {\n if (flag(i))\n this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts a bitset.\n invert(notify = true) {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] ^= -1;\n this.incrementVersion(notify);\n }\n /// Sets all bits to [value], optionally suppressing notifications.\n setAll(value, notify = false) {\n const flags = value ? -1 : 0;\n const len = this.lengthInInts;\n for (let i = 0; i < len; i++) //todo: optimize\n this._data[i] = flags;\n this.incrementVersion(notify);\n }\n /// Sets bits at [indexes] position to [value].\n /// Clears the bitset if [clear] flag is true.\n /// Change notification is raised when [notify] is true.\n setIndexes(indexes, value = true, clear = true, notify = true) {\n if (clear)\n this.setAll(!value, false);\n for (const i of indexes)\n this.setFast(i, value);\n this.incrementVersion(notify);\n }\n everyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) != value)\n return false;\n }\n return true;\n }\n anyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) == value)\n return true;\n }\n return false;\n }\n setWhere(check, value = true, clear = true, notify = true, allowClear = true) {\n if (clear && allowClear)\n this.setAll(!value, false);\n if (allowClear) {\n for (let i = 0; i < this._length; i++) {\n if (check(i))\n this.setFast(i, value);\n }\n }\n else {\n for (let i = 0; i < this._length; i++)\n this.setFast(i, check(i) ? value : !value);\n }\n this.incrementVersion(notify);\n }\n getRange(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return BitArray.fromValues(arr);\n }\n getRangeAsList(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return arr;\n }\n setRange(from, to, value, notify = true) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length - 1, 'to');\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n //todo: optimize\n if (value) {\n for (let i = start; i <= end; i++)\n this.setTrue(i);\n }\n else {\n for (let i = start; i <= end; i++)\n this.setFalse(i);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Sets n randomly chosen bits to value, remaining bits to !value.\n setRandom(n, value, notify = true) {\n if (n < 0 || n > this._length)\n throw new Error('n must be >= 0 && <= Count');\n if (n > this._length / 2)\n this.setRandom(this._length - n, !value);\n this.setAll(!value);\n for (let k = 0; k < n;) {\n const i = Math.floor(Math.random() * this._length);\n if (this.getBit(i) == value)\n continue;\n this.setFast(i, value);\n k++;\n }\n this.incrementVersion(notify);\n }\n /// Modifies current bitset by performing the bitwise AND operation against the\n /// corresponding elements in the specified bitset.\n and(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] &= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise AND NOT operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n andNot(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n const len = this.lengthInInts;\n for (let num2 = 0; num2 < len; num2++)\n this._data[num2] &= ~value._data[num2];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise NOT AND operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n notAnd(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = (~this._data[i]) & value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts all bit values in the current bitset\n not(notify = true) {\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = ~this._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n or(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] |= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise exclusive OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n xor(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] ^= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.\n insertAt(pos, n, flag = false) {\n this.assureInRange(pos, 0, this._length, 'pos');\n if (n == 0)\n return;\n //TODO: optimize\n //the most primitive implementation, optimize it later!\n // beginUpdate();\n const oldlength = this._length;\n this.setLength(this._length + n);\n //if (!contains(!flag)) return; // nothing to do\n for (let i = oldlength - 1; i >= pos; i--)\n this.setBit(i + n, this.getBit(i));\n for (let i = pos; i < pos + n; i++)\n this.setBit(i, flag);\n // endUpdate();\n }\n /// Deletes n bits beginning at position pos, resizing self and shifting remaining\n /// bits appropriately.\n removeAt(pos, n = 1) {\n // the most primitive implementation, optimize it later!\n if (n < 0)\n throw new Error('n cannot be negative');\n this.assureInRange(pos, 0, this._length - n, 'pos');\n if (this.contains(true)) {\n for (let i = pos; i < this._length - n; i++)\n this.setBit(i, this.getBit(i + n));\n }\n this.setLength(this._length - n);\n }\n removeByMask(mask, flag = true) {\n if (this._length != mask.length)\n throw new Error('length != mask.length');\n if (mask == this) { // no need to iterate\n this.setLength(mask.countBits(!flag));\n this.setAll(!flag);\n }\n else {\n let dstIdx = 0;\n for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;)\n this.setFast(dstIdx++, this.getBit(srcIdx));\n this._length = dstIdx;\n this._version++;\n }\n return this;\n }\n /// Similar to the [] operator.\n getBit(pos) {\n return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;\n }\n /// Similar to the [] operator.\n setBit(pos, bit, notify = true) {\n this.setFast(pos, bit);\n if (notify)\n this._version++;\n else\n this._version++;\n }\n /// Sets [i]-th bit to [value], does not check bounds, does not increment version\n setFast(i, value) {\n if (value)\n this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);\n else\n this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));\n }\n setTrue(pos) {\n this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);\n }\n setFalse(pos) {\n this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));\n }\n trueCount() {\n return this.countBits(true);\n }\n falseCount() {\n return this.countBits(false);\n }\n /// Counts bits of the specified value.\n countBits(value) {\n if (this._length == 0)\n return 0;\n if (this._selectedCountVersion != this._version) {\n this._selectedCount = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n }\n }\n // The last int.\n let k = this._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0) /* if remainingBits == 0, the last int is fully used and ALL bits should be left as is */\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n this._selectedCountVersion = this._version;\n }\n return (value ? this._selectedCount : this._length - this._selectedCount);\n }\n /// Returns a number of set bits where also [check] is true\n countWhere(check) {\n let result = 0;\n if (this.trueCount() == this._length) {\n for (let i = 0; i < this._length; i++)\n result += check(i) ? 1 : 0;\n }\n else {\n for (let i = -1; (i = this.findNext(i, true)) != -1;)\n result += check(i) ? 1 : 0;\n }\n return result;\n }\n /// Performs bit \"and\" and counts bits of the specified value, without bitset modification.\n andWithCountBits(second, value) {\n if (this._length == 0)\n return 0;\n let count = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i] & second._data[i]; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n }\n // The last int.\n let k = this._data[i] & second._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0)\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n return (value ? count : this._length - count);\n }\n clear() {\n this.setLength(0);\n }\n contains(value) {\n return this.findNext(-1, value) >= 0;\n }\n get allTrue() {\n return this.countBits(true) == this._length;\n }\n get allFalse() {\n return this.countBits(false) == this._length;\n }\n get anyTrue() {\n return this.countBits(true) > 0;\n }\n get anyFalse() {\n return this.countBits(false) > 0;\n }\n /// Returns the position of the next bit of the specified value, starting from the specified position.\n /// Returns -1, if there are no such bits.\n findNext(index, value = true) {\n this.assureInRange(index, -1, this._length, 'index');\n if (index >= this._length - 1)\n return -1;\n index = index < 0 ? 0 : index + 1; // skip start\n let unusedBits = index & 0x1f;\n const numInts = this.lengthInInts;\n for (let i = Math.floor(index / 32); i < numInts; i++) {\n let k = (value ? this._data[i] : ~this._data[i]); // uint cast\n if (unusedBits != 0) {\n k &= ((0xffffffff << unusedBits) & 0xffffffff);\n unusedBits = 0;\n }\n else if (!value && k == -4294967296) /* looking for false, all bits are set */ {\n continue;\n }\n for (let j = 0; k != 0; j += 8, k >>>= 8) {\n const p = BitArray._firstOnBit[k & 0xff];\n if (p >= 0) {\n index = p + (i * 32) + j;\n if (index >= this._length)\n return -1;\n return index;\n }\n }\n }\n return -1;\n }\n /// Finds previous bit of the specified value in the bitset.\n findPrev(index, value = true) {\n if (index == 0)\n return -1;\n this.assureInRange(index, -1, this._length, 'index');\n index = index < 0 ? this._length - 1 : index - 1; // skip start\n const lastIntIdx = Math.floor(index / 0x20);\n let remainingBits = (index + 1) & 0x1f;\n for (let i = lastIntIdx; i >= 0; i--) {\n let k = (value ? this._data[i] : ~this._data[i]); // cast\n if (remainingBits != 0) {\n k &= ~((4294967295) << remainingBits);\n remainingBits = 0;\n }\n for (let j = 24; k != 0; j -= 8, k <<= 8) {\n const p = BitArray._lastOnBit[k >>> 0x18];\n if (p >= 0)\n return p + (i * 32) + j;\n }\n }\n return -1;\n }\n}\nBitArray._onBitCount = Int8Array.from([\n 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8\n]);\nBitArray._firstOnBit = Int8Array.from([\n -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0\n]);\nBitArray._lastOnBit = Int8Array.from([\n -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7\n]);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7YUFBTSxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUU7WUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFrQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBc0IsQ0FBQztTQUN2QzthQUFNO1lBQ0wsTUFBTSxJ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QUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsb0JBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQztBQUU1QyxtQkFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQml0QXJyYXkge1xuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXG4gICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNCxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNSwgNiwgNiwgNywgNiwgNywgNywgOF0pO1xuXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcbiAgICAtMSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMF0pO1xuXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xuICAgIC0xLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLFxuICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3XSk7XG5cbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XG4gIHByaXZhdGUgX2xlbmd0aCA9IDA7XG4gIHByaXZhdGUgX3ZlcnNpb24gPSAwO1xuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XG4gIHByaXZhdGUgX3NlbGVjdGVkQ291bnQgPSAwO1xuICBwcml2YXRlIF9zZWxlY3RlZENvdW50VmVyc2lvbiA9IC0xO1xuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWUgPSAnJztcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZVZlcnNpb24gPSAtMTtcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlcilcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXG4gIGNvbnN0cnVjdG9yKGFyZzogbnVtYmVyIHwgVWludDMyQXJyYXksIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiB8IG51bWJlciA9IGZhbHNlKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XG4gICAgICBjb25zdCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZltpXSA9IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XG4gICAgICB0aGlzLl9sZW5ndGggPSBsZW5ndGg7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRlZmF1bHRWYWx1ZSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cblxuICBhc3N1cmVHb2V6KG51bTogbnVtYmVyLCBhcmdOYW1lOiBTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xuICB9XG5cbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xuICAgIGlmICgodmFsdWUgPCBtaW4pIHx8ICh2YWx1ZSA+IG1heCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xuICB9XG5cbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xuICB9XG5cbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XG4gICAgdGhpcy5jb3B5KG90aGVyLl9kYXRhLCB0aGlzLl9kYXRhLCB0aGlzLmxlbmd0aEluSW50cyk7XG4gICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHNldCBidWZmZXIoZGF0YTogVWludDMyQXJyYXkpIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIHNldCB2ZXJzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92ZXJzaW9uID0gdmFsdWU7XG4gIH1cblxuICBpbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKCh0aGlzLl9sZW5ndGggKyAweDFmKSAvIDB4MjApO1xuICB9XG5cbiAgZ2V0IHZlcnNpb25lZE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPT0gdGhpcy5fdmVyc2lvbmVkTmFtZVZlcnNpb24gPyB0aGlzLl92ZXJzaW9uZWROYW1lIDogJyc7XG4gIH1cblxuICBzZXQgdmVyc2lvbmVkTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgc2VsZigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExlbmd0aCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIGJlID49IDAnKTtcblxuICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuSW50c05lZWRlZCA9IE1hdGguZmxvb3IoKHZhbHVlICsgMHgxZikgLyAweDIwKTtcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3IFVpbnQzMkFycmF5KG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuY29weSh0aGlzLl9kYXRhLCBuZXdEYXRhLCAobkludHNOZWVkZWQgPiB0aGlzLl9kYXRhLmxlbmd0aCkgPyB0aGlzLl9kYXRhLmxlbmd0aCA6IG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2xlbmd0aCAlIDB4MjAgPiAwKVxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XG5cbiAgICAgIHRoaXMuX2RhdGEuZmlsbCgwLCB0aGlzLmxlbmd0aEluSW50cywgbkludHNOZWVkZWQpO1xuICAgIH1cbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFuZChzZXQxOiBCaXRBcnJheSwgc2V0MjogQml0QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgaWYgKHNldDEuX2xlbmd0aCAhPSBzZXQyLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlbmd0aHMgZGlmZmVyICgke3NldDEuX2xlbmd0aH0gIT0gJHtzZXQyLl9sZW5ndGh9KWApO1xuXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xuICAgIHRlbXAuX2xlbmd0aCA9IHNldDEuX2xlbmd0aDtcbiAgICB0ZW1wLl9kYXRhID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcih0ZW1wLl9sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgbGVuID0gc2V0MS5sZW5ndGhJbkludHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIHRlbXAuX2RhdGFbaV0gPSBzZXQxLl9kYXRhW2ldICYgc2V0Mi5fZGF0YVtpXTtcblxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZUJ1ZmZlcihsZW5ndGg6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSlcbiAgICAgICAgdGVtcC5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0gb2YgbGVuZ3RoIFtjb3VudF0sIHdoZXJlIGlkeC10aCBiaXQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gW2ZsYWddIChpZHgpLlxuICBzdGF0aWMgZnJvbVNlcShjb3VudDogbnVtYmVyLCBmbGFnOiBGdW5jdGlvbik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHM6IHN0cmluZyk6IEJpdEFycmF5IHtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KF9sZW5ndGgpO1xuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XG4gICAgdGVtcC5fZGF0YSA9IG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW4gKyAzKSAvIDQpKTtcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xuICAgIGxldCBudW0xID0gMDtcbiAgICBsZXQgbnVtMiA9IDA7XG5cbiAgICB3aGlsZSAoKGxlbiAtIG51bTIpID49IDQpIHtcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcbiAgICAgICAgKChieXRlc1tudW0yXSAmIDB4ZmYpIHwgKChieXRlc1tudW0yICsgMV0gJiAweGZmKSA8PCA4KSkgfFxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApXG4gICAgICApIHwgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcblxuICAgICAgbnVtMiArPSA0O1xuICAgIH1cblxuICAgIGlmIChsZW4gLSBudW0yID09IDMpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdID0gKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTA7XG5cbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKVxuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSAoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgODtcblxuICAgIGlmIChsZW4gLSBudW0yID09IDEpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fbGVuZ3RofSBiaXRzLCAke3RoaXMuY291bnRCaXRzKHRydWUpfSBzZXRgO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIGRlZXAgY29tcGFyaXNvbiBvZiB0d28gYml0c2V0cy5cbiAgZXF1YWxzKG90aGVyOiBCaXRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gb3RoZXIuX2xlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgaWYgKHRoaXMuX2RhdGFbaV0gIT0gb3RoZXIuX2RhdGFbaV0pIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpICE9IG90aGVyLmdldEJpdChpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXG4gIGNsb25lKCk6IEJpdEFycmF5IHtcbiAgICBjb25zdCBiaXRBcnJheSA9IG5ldyBCaXRBcnJheSgwLCBmYWxzZSk7XG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxuICAgIGJpdEFycmF5Ll9sZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgYml0QXJyYXkuX3ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgIHJldHVybiBiaXRBcnJheTtcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cbiAgaW5pdChmbGFnOiBGdW5jdGlvbiwgbm90aWZ5OiBib29sZWFuKTogQml0QXJyYXkge1xuICAgIHRoaXMuc2V0QWxsKGZhbHNlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmxhZyhpKSlcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSBePSAtMTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYWxsIGJpdHMgdG8gW3ZhbHVlXSwgb3B0aW9uYWxseSBzdXBwcmVzc2luZyBub3RpZmljYXRpb25zLlxuICBzZXRBbGwodmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIC8vdG9kbzogb3B0aW1pemVcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBmbGFncztcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYml0cyBhdCBbaW5kZXhlc10gcG9zaXRpb24gdG8gW3ZhbHVlXS5cbiAgLy8vIENsZWFycyB0aGUgYml0c2V0IGlmIFtjbGVhcl0gZmxhZyBpcyB0cnVlLlxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxuICBzZXRJbmRleGVzKGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlID0gdHJ1ZSwgY2xlYXIgPSB0cnVlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKGNsZWFyKVxuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcylcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGV2ZXJ5SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpICE9IHZhbHVlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYW55SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpID09IHZhbHVlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2V0V2hlcmUoY2hlY2s6IEZ1bmN0aW9uLCB2YWx1ZSA9IHRydWUsIGNsZWFyID0gdHJ1ZSwgbm90aWZ5ID0gdHJ1ZSwgYWxsb3dDbGVhciA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoY2xlYXIgJiYgYWxsb3dDbGVhcilcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xuXG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoZWNrKGkpKVxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuc2V0RmFzdChpLCBjaGVjayhpKSA/IHZhbHVlIDogIXZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGdldFJhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBBcnJheTxib29sZWFuPiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87ICsraSlcbiAgICAgIGFyci5wdXNoKHRoaXMuZ2V0Qml0KGkpKTtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVZhbHVlcyhhcnIpO1xuICB9XG5cbiAgZ2V0UmFuZ2VBc0xpc3QoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogYm9vbGVhbltdIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyArK2kpXG4gICAgICBhcnIucHVzaCh0aGlzLmdldEJpdChpKSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG5cbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCAtIDEsICd0bycpO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tLCB0byk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5tYXgoZnJvbSwgdG8pO1xuXG4gICAgLy90b2RvOiBvcHRpbWl6ZVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKVxuICAgICAgICB0aGlzLnNldFRydWUoaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKylcbiAgICAgICAgdGhpcy5zZXRGYWxzZShpKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cbiAgc2V0UmFuZG9tKG46IG51bWJlciwgdmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcblxuICAgIGlmIChuID4gdGhpcy5fbGVuZ3RoIC8gMilcbiAgICAgIHRoaXMuc2V0UmFuZG9tKHRoaXMuX2xlbmd0aCAtIG4sICF2YWx1ZSk7XG5cbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOykge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuX2xlbmd0aCk7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcbiAgICAgIGsrKztcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBNb2RpZmllcyBjdXJyZW50IGJpdHNldCBieSBwZXJmb3JtaW5nIHRoZSBiaXR3aXNlIEFORCBvcGVyYXRpb24gYWdhaW5zdCB0aGVcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSAmPSB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIEFORCBOT1Qgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgIGZvciAobGV0IG51bTIgPSAwOyBudW0yIDwgbGVuOyBudW0yKyspXG4gICAgICB0aGlzLl9kYXRhW251bTJdICY9IH52YWx1ZS5fZGF0YVtudW0yXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIG5vdChub3RpZnkgPSB0cnVlKTogQml0QXJyYXkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKylcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gSW5zZXJ0cyBuIDAtYml0cyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIGJpdHMgYXBwcm9wcmlhdGVseS5cbiAgaW5zZXJ0QXQocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmxhZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XG5cbiAgICBpZiAobiA9PSAwKSByZXR1cm47XG5cbiAgICAvL1RPRE86IG9wdGltaXplXG4gICAgLy90aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuXG4gICAgLy8gYmVnaW5VcGRhdGUoKTtcbiAgICBjb25zdCBvbGRsZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XG5cbiAgICAvL2lmICghY29udGFpbnMoIWZsYWcpKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGZvciAobGV0IGkgPSBvbGRsZW5ndGggLSAxOyBpID49IHBvczsgaS0tKVxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcblxuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBwb3MgKyBuOyBpKyspXG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcblxuICAgIC8vIGVuZFVwZGF0ZSgpO1xuICB9XG5cbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xuICAvLy8gYml0cyBhcHByb3ByaWF0ZWx5LlxuICByZW1vdmVBdChwb3M6IG51bWJlciwgbiA9IDEpOiB2b2lkIHtcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuICAgIGlmIChuIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcblxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCAtIG4sICdwb3MnKTtcblxuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRydWUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgdGhpcy5fbGVuZ3RoIC0gbjsgaSsrKVxuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCAtIG4pO1xuICB9XG5cbiAgcmVtb3ZlQnlNYXNrKG1hc2s6IEJpdEFycmF5LCBmbGFnID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggIT0gbWFzay5sZW5ndGgnKTtcblxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXG4gICAgICB0aGlzLnNldExlbmd0aChtYXNrLmNvdW50Qml0cyghZmxhZykpO1xuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHN0SWR4ID0gMDtcblxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XG5cbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgZ2V0Qml0KHBvczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgc2V0Qml0KHBvczogbnVtYmVyLCBiaXQ6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpIHtcbiAgICB0aGlzLnNldEZhc3QocG9zLCBiaXQpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLl92ZXJzaW9uKys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSlcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldIHw9IDEgPDwgKGkgJiAweDFmKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSAmPSB+KDEgPDwgKGkgJiAweDFmKSk7XG4gIH1cblxuICBzZXRUcnVlKHBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcbiAgfVxuXG4gIHNldEZhbHNlKHBvczogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSAmPSB+KDEgPDwgKHBvcyAmIDB4MWYpKTtcbiAgfVxuXG4gIHRydWVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcbiAgfVxuXG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpO1xuICB9XG5cbiAgLy8vIENvdW50cyBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHRoaXMuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHsgLy90b2RvOiBjYXN0IGRhdGFbaV0gdG8gdWludFxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IGludC5cbiAgICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgLyogaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMgKi9cbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcblxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuXG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWx1ZSA/IHRoaXMuX3NlbGVjdGVkQ291bnQgOiB0aGlzLl9sZW5ndGggLSB0aGlzLl9zZWxlY3RlZENvdW50KTtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIGEgbnVtYmVyIG9mIHNldCBiaXRzIHdoZXJlIGFsc28gW2NoZWNrXSBpcyB0cnVlXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBpZiAodGhpcy50cnVlQ291bnQoKSA9PSB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gLTE7IChpID0gdGhpcy5maW5kTmV4dChpLCB0cnVlKSkgIT0gLTE7KVxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyBiaXQgXCJhbmRcIiBhbmQgY291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgd2l0aG91dCBiaXRzZXQgbW9kaWZpY2F0aW9uLlxuICBhbmRXaXRoQ291bnRCaXRzKHNlY29uZDogQml0QXJyYXksIHZhbHVlOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldICYgc2Vjb25kLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KVxuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgaW50LlxuICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcbiAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKVxuICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcbiAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOClcbiAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcblxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xuICB9XG5cbiAgY29udGFpbnModmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XG4gIH1cblxuICBnZXQgYWxsVHJ1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHModHJ1ZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFsbEZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFueVRydWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcbiAgfVxuXG4gIGdldCBhbnlGYWxzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpID4gMDtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cbiAgZmluZE5leHQoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoaW5kZXgsIC0xLCB0aGlzLl9sZW5ndGgsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCAtIDEpIHJldHVybiAtMTtcbiAgICBpbmRleCA9IGluZGV4IDwgMCA/IDAgOiBpbmRleCArIDE7IC8vIHNraXAgc3RhcnRcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcbiAgICBjb25zdCBudW1JbnRzID0gdGhpcy5sZW5ndGhJbkludHM7XG5cbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyB1aW50IGNhc3RcbiAgICAgIGlmICh1bnVzZWRCaXRzICE9IDApIHtcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcbiAgICAgICAgdW51c2VkQml0cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiBrID09IC00Mjk0OTY3Mjk2KSAvKiBsb29raW5nIGZvciBmYWxzZSwgYWxsIGJpdHMgYXJlIHNldCAqL3tcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBrICE9IDA7IGogKz0gOCwgayA+Pj49IDgpIHtcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcbiAgICAgICAgaWYgKHAgPj0gMCkge1xuICAgICAgICAgIGluZGV4ID0gcCArIChpICogMzIpICsgajtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vLyBGaW5kcyBwcmV2aW91cyBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgYml0c2V0LlxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTE7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcblxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fbGVuZ3RoIC0gMSA6IGluZGV4IC0gMTsgLy8gc2tpcCBzdGFydFxuXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IChpbmRleCArIDEpICYgMHgxZjtcblxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyBjYXN0XG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7XG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XG4gICAgICAgIHJlbWFpbmluZ0JpdHMgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xuICAgICAgICBjb25zdCBwID0gQml0QXJyYXkuX2xhc3RPbkJpdFtrID4+PiAweDE4XTtcbiAgICAgICAgaWYgKHAgPj0gMClcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=","import * as umj from 'umap-js';\nimport { TSNE } from '@keckelt/tsne';\nimport { Vector, } from '@datagrok-libraries/utils/src/type-declarations';\nimport { transposeMatrix, assert, calcNormalizedDistanceMatrix, } 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';\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 = 10000;\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 var _a;\n super(options);\n this.reducer = new TSNE(options);\n this.iterations = (_a = options === null || options === void 0 ? void 0 : options.iterations) !== null && _a !== void 0 ? _a : 100;\n this.distanceFn = options.distance;\n }\n /**\n * Embeds the data given into the two-dimensional space using t-SNE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n transform() {\n const distance = calcNormalizedDistanceMatrix(this.data, this.distanceFn);\n this.reducer.initDataDist(distance);\n for (let i = 0; i < this.iterations; ++i) {\n this.reducer.step(); // every time you call this, solution gets better\n }\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('distanceFn' in options);\n this.distanceFn = options.distanceFn;\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 if (!this.usingDistanceMatrix) {\n options.distanceFn = this._encodedDistance.bind(this);\n }\n else {\n this.distanceMatrix = Array(this.data.length).fill(0).map(() => new Float32Array(this.data.length).fill(0));\n options.distanceFn = this._encodedDistanceMatrix.bind(this);\n }\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 return this.distanceMatrix[a[0]][b[0]];\n }\n _encodedDistance(a, b) {\n return this.distanceFn(this.data[a[0]], this.data[b[0]]);\n }\n /**\n * Encodes the input data as a vector of indices.\n *\n * @protected\n * @memberof UMAPReducer\n */\n _encode() {\n for (let i = 0; i < this.data.length; ++i) {\n this.vectors.push([i]);\n }\n }\n /**\n * Embeds the data given into the two-dimensional space using UMAP method.\n * @return {any} Cartesian coordinate of this embedding.\n */\n transform() {\n if (this.usingDistanceMatrix)\n this.distanceMatrix = calcNormalizedDistanceMatrix(this.data, this.distanceFn);\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 Object.assign({ 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 transform() {\n const emb = 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 transform() {\n const emb = 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 transform() {\n const emb = 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 var _a;\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 }\n if (method == 'UMAP') {\n specOptions = Object.assign(Object.assign(Object.assign({ data: data }, { distanceFn: measure }), { nEpochs: options === null || options === void 0 ? void 0 : options.cycles }), options);\n }\n else if (method == 't-SNE') {\n specOptions = Object.assign(Object.assign(Object.assign({ data: data }, { distance: measure }), { iterations: (_a = options === null || options === void 0 ? void 0 : options.cycles) !== null && _a !== void 0 ? _a : undefined }), options);\n }\n else if (method == 'SPE') {\n specOptions = Object.assign(Object.assign({ data: data }, { distance: measure }), options);\n }\n else {\n specOptions = Object.assign(Object.assign({ data: data }, { distance: measure }), 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 * @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 transform(transpose = false) {\n if (this.reducer == undefined) {\n throw new Error('Reducer was not defined.');\n }\n let { embedding, distance } = this.reducer.transform();\n if (transpose) {\n embedding = transposeMatrix(embedding);\n }\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlLWRpbWVuc2lvbmFsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVkdWNlLWRpbWVuc2lvbmFsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUlMLE1BQU0sR0FHUCxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFDTCxlQUFlLEVBQ2YsTUFBTSxFQUNOLDRCQUE0QixHQUM3QixNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFnQixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSwrQkFBK0IsQ0FBQztBQUM1SCxPQUFPLFFBQVEsTUFBTSx5Q0FBeUMsQ0FBQztBQUcvRCxNQUFNLENBQU4sSUFBWSxtQkFHWDtBQUhELFdBQVksbUJBQW1CO0lBQzdCLG9DQUFhLENBQUE7SUFDYixzQ0FBZ0IsQ0FBQTtBQUNsQixDQUFDLEVBSFcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQUc5QjtBQXdCRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEtBQUssQ0FBQztBQUU5QyxNQUFNLE9BQU8sV0FBVztJQVF0QjtRQVBBLGlCQUFZLEdBQXdCLEVBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSwwREFBMEQsRUFBQyxDQUFDO1FBQzdJLGdCQUFXLEdBQXVCLEVBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSw4REFBOEQsRUFBQyxDQUFDO1FBQzVJLFlBQU8sR0FBdUIsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUss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RCxPQUFPLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxRQUE0QjtRQUN4RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLEtBQUssZ0JBQWdCO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sS0FBSyxnQkFBZ0I7UUFDekIsSUFBSSxHQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVtaiBmcm9tICd1bWFwLWpzJztcbmltcG9ydCB7VFNORX0gZnJvbSAnQGtlY2tlbHQvdHNuZSc7XG5pbXBvcnQge1xuICBPcHRpb25zLFxuICBEaXN0YW5jZU1ldHJpYyxcbiAgQ29vcmRpbmF0ZXMsXG4gIFZlY3RvcixcbiAgVmVjdG9ycyxcbiAgTWF0cml4LFxufSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICB0cmFuc3Bvc2VNYXRyaXgsXG4gIGFzc2VydCxcbiAgY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeCxcbn0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtTUEVCYXNlLCBQU1BFQmFzZSwgT3JpZ2luYWxTUEV9IGZyb20gJy4vc3BlJztcbmltcG9ydCB7TWVhc3VyZSwgS25vd25NZXRyaWNzLCBBdmFpbGFibGVNZXRyaWNzLCBpc0JpdEFycmF5TWV0cmljLCBBdmFpbGFibGVEYXRhVHlwZXN9IGZyb20gJy4vdHlwZWQtbWV0cmljcy90eXBlZC1tZXRyaWNzJztcbmltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuaW1wb3J0IHtVTUFQUGFyYW1ldGVyc30gZnJvbSAndW1hcC1qcyc7XG5cbmV4cG9ydCBlbnVtIERpbVJlZHVjdGlvbk1ldGhvZHN7XG4gIFVNQVAgPSAnVU1BUCcsXG4gIFRfU05FID0gICd0LVNORSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVU1BUE9wdGlvbnMge1xuICBsZWFybmluZ1JhdGU/OiBudW1iZXI7XG4gIG5Db21wb25lbnRzPzogbnVtYmVyO1xuICBuRXBvY2hzPzogbnVtYmVyO1xuICBuTmVpZ2hib3JzPzogbnVtYmVyO1xuICBzcHJlYWQ/OiBudW1iZXI7XG4gIG1pbkRpc3Q/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRTTkVPcHRpb25zIHtcbiAgZXBzaWxvbj86IG51bWJlcjtcbiAgcGVycGxleGl0eT86IG51bWJlcjtcbiAgZGltPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaW1SZWR1Y3Rpb25QYXJhbSB7XG4gIHVpTmFtZTogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyIHwgbnVsbDtcbiAgdG9vbHRpcDogc3RyaW5nO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbn1cblxuLyoqIFVtYXAgdXNlcyBwcmVjYWxjdWxhdGVkIGRpc3RhbmNlIG1hdHJpeCB0byBzYXZlIHRpbWUuIHRob3VnaCBmb3IgdG9vIG11Y2ggZGF0YSwgbWVtb3J5IGJlY29tZXMgY29uc3RyYWludC5cbiAqIGlmIHdlIGhhdmUgMTAwIDAwMCByb3dzLCBkaXN0YW5jZSBtYXRyaXggd2lsbCB0YWtlIH4xMGdiIG9mIG1lbW9yeSBhbmQgcHJvYmFibHkgb3ZlcmZsb3cuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfRElTVEFOQ0VfTUFUUklYX1JPV1MgPSAxMDAwMDtcblxuZXhwb3J0IGNsYXNzIFVNQVBPcHRpb25zIHtcbiAgbGVhcm5pbmdSYXRlOiBJRGltUmVkdWN0aW9uUGFyYW0gPSAge3VpTmFtZTogJ0xlYXJpbmlnIHJhdGUnLCB2YWx1ZTogMSwgdG9vbHRpcDogJ1RoZSBpbml0aWFsIGxlYXJuaW5nIHJhdGUgZm9yIHRoZSBlbWJlZGRpbmcgb3B0aW1pemF0aW9uJ307XG4gIG5Db21wb25lbnRzOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnQ29tcG9uZW50cycsIHZhbHVlOiAyLCB0b29sdGlwOiAnVGhlIG51bWJlciBvZiBjb21wb25lbnRzIChkaW1lbnNpb25zKSB0byBwcm9qZWN0IHRoZSBkYXRhIHRvJ307XG4gIG5FcG9jaHM6IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdFcG9jaHMnLCB2YWx1ZTogMCwgdG9vbHRpcDogJ1RoZSBudW1iZXIgb2YgZXBvY2hzIHRvIG9wdGltaXplIGVtYmVkZGluZ3MgdmlhIFNHRC4gQ29tcHV0ZWQgYXV0b21hdGljYWxseSBpZiBzZXQgdG8gMCd9O1xuICBuTmVpZ2hib3JzOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnTmVpZ2hib3JzJywgdmFsdWU6IDE1LCB0b29sdGlwOiAnVGhlIG51bWJlciBvZiBuZWFyZXN0IG5laWdoYm9ycyB0byBjb25zdHJ1Y3QgdGhlIGZ1enp5IG1hbmlmb2xkJ307XG4gIHNwcmVhZDogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ1NwcmVhZCcsIHZhbHVlOiAxLCB0b29sdGlwOiAnVGhlIGVmZmVjdGl2ZSBzY2FsZSBvZiBlbWJlZGRlZCBwb2ludHMsIHVzZWQgd2l0aCBtaW4gZGlzdGFuY2UgdG8gY29udHJvbCB0aGUgY2x1bXBlZC9kaXNwZXJzZWQgbmF0dXJlIG9mIHRoZSBlbWJlZGRpbmcnfTtcbiAgbWluRGlzdDogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ01pbiBkaXN0YW5jZScsIHZhbHVlOiAwLjEsIHRvb2x0aXA6ICdUaGUgZWZmZWN0aXZlIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBlbWJlZGRlZCBwb2ludHMsIHVzZWQgd2l0aCBzcHJlYWQgdG8gY29udHJvbCB0aGUgY2x1bXBlZC9kaXNwZXJzZWQgbmF0dXJlIG9mIHRoZSBlbWJlZGRpbmcnfTtcblxuICBjb25zdHJ1Y3RvcigpIHt9O1xufVxuXG5leHBvcnQgY2xhc3MgVFNORU9wdGlvbnMge1xuICBlcHNpbG9uOiBJRGltUmVkdWN0aW9uUGFyYW0gPSAge3VpTmFtZTogJ0Vwc2lsb24nLCB2YWx1ZTogMTAsIHRvb2x0aXA6ICdFcHNpbG9uIGlzIGxlYXJuaW5nIHJhdGUnfTtcbiAgcGVycGxleGl0eTogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ1BlcnBsZXhpdHknLCB2YWx1ZTogMzAsIHRvb2x0aXA6ICdSb3VnaGx5IGhvdyBtYW55IG5laWdoYm9ycyBlYWNoIHBvaW50IGluZmx1ZW5jZXMnfTtcbiAgZGltOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnRGltZW5zaW9uYWxpdHknLCB2YWx1ZTogMiwgdG9vbHRpcDogJ0RpbWVuc2lvbmFsaXR5IG9mIHRoZSBlbWJlZGRpbmcnfTtcblxuICBjb25zdHJ1Y3RvcigpIHt9O1xufVxuXG5cbi8qKiBBYnN0cmFjdCBkaW1lbnNpb25hbGl0eSByZWR1Y2VyICovXG5hYnN0cmFjdCBjbGFzcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIGRhdGE6IFZlY3RvcnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgfVxuXG4gIC8qKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS4gKi9cbiAgYWJzdHJhY3QgdHJhbnNmb3JtKCk6IHsgW2tleTogc3RyaW5nXTogTWF0cml4IH07XG59XG5cbi8qKiB0LVNORSBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uICovXG5jbGFzcyBUU05FUmVkdWNlciBleHRlbmRzIFJlZHVjZXIge1xuICBwcm90ZWN0ZWQgcmVkdWNlcjogVFNORTtcbiAgcHJvdGVjdGVkIGl0ZXJhdGlvbnM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRpc3RhbmNlRm46IERpc3RhbmNlTWV0cmljO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFRTTkVSZWR1Y2VyLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICogQG1lbWJlcm9mIFRTTkVSZWR1Y2VyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5yZWR1Y2VyID0gbmV3IFRTTkUob3B0aW9ucyk7XG4gICAgdGhpcy5pdGVyYXRpb25zID0gb3B0aW9ucz8uaXRlcmF0aW9ucyA/PyAxMDA7XG4gICAgdGhpcy5kaXN0YW5jZUZuID0gb3B0aW9ucy5kaXN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIHQtU05FIG1ldGhvZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtKCk6IHsgW2tleTogc3RyaW5nXTogTWF0cml4IH0ge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeCh0aGlzLmRhdGEsIHRoaXMuZGlzdGFuY2VGbik7XG4gICAgdGhpcy5yZWR1Y2VyLmluaXREYXRhRGlzdChkaXN0YW5jZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlcmF0aW9uczsgKytpKSB7XG4gICAgICB0aGlzLnJlZHVjZXIuc3RlcCgpOyAvLyBldmVyeSB0aW1lIHlvdSBjYWxsIHRoaXMsIHNvbHV0aW9uIGdldHMgYmV0dGVyXG4gICAgfVxuICAgIHJldHVybiB7ZGlzdGFuY2U6IGRpc3RhbmNlLCBlbWJlZGRpbmc6IHRoaXMucmVkdWNlci5nZXRTb2x1dGlvbigpfTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBVbWFwT3B0aW9ucyA9IE9wdGlvbnMgJiBVTUFQUGFyYW1ldGVycyAmIHtwcmVDYWxjdWxhdGVEaXN0YW5jZU1hdHJpeD86IGJvb2xlYW59O1xuXG4vKipcbiAqIEltcGxlbWVudHMgVU1BUCBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uXG4gKlxuICogQGNsYXNzIFVNQVBSZWR1Y2VyXG4gKiBAZXh0ZW5kcyB7UmVkdWNlcn1cbiAqL1xuY2xhc3MgVU1BUFJlZHVjZXIgZXh0ZW5kcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIHJlZHVjZXI6IHVtai5VTUFQO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbjogRnVuY3Rpb247XG4gIHByb3RlY3RlZCB2ZWN0b3JzOiBudW1iZXJbXVtdO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VNYXRyaXg/OiBNYXRyaXg7XG4gIHByb3RlY3RlZCB1c2luZ0Rpc3RhbmNlTWF0cml4OiBib29sZWFuO1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBVTUFQUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVW1hcE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIGFzc2VydCgnZGlzdGFuY2VGbicgaW4gb3B0aW9ucyk7XG5cbiAgICB0aGlzLmRpc3RhbmNlRm4gPSBvcHRpb25zLmRpc3RhbmNlRm4hO1xuICAgIHRoaXMudmVjdG9ycyA9IG5ldyBBcnJheSh0aGlzLmRhdGEubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaSkgPT4gW2ldKTtcbiAgICB0aGlzLnVzaW5nRGlzdGFuY2VNYXRyaXggPSAhKCFvcHRpb25zLnByZUNhbGN1bGF0ZURpc3RhbmNlTWF0cml4ICYmIHRoaXMuZGF0YS5sZW5ndGggPiBNQVhfRElTVEFOQ0VfTUFUUklYX1JPV1MpO1xuICAgIGlmICghdGhpcy51c2luZ0Rpc3RhbmNlTWF0cml4KSB7XG4gICAgICBvcHRpb25zLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2UuYmluZCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXN0YW5jZU1hdHJpeCA9IEFycmF5KHRoaXMuZGF0YS5sZW5ndGgpLmZpbGwoMCkubWFwKCgpID0+IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5kYXRhLmxlbmd0aCkuZmlsbCgwKSk7XG4gICAgICBvcHRpb25zLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2VNYXRyaXguYmluZCh0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPCAxNSlcbiAgICAgIG9wdGlvbnMubk5laWdoYm9ycyA9IHRoaXMuZGF0YS5sZW5ndGggLSAxO1xuICAgIHRoaXMucmVkdWNlciA9IG5ldyB1bWouVU1BUChvcHRpb25zKTtcbiAgICAvLyB0aGlzLnJlZHVjZXIuZGlzdGFuY2VGbiA9IHRoaXMuX2VuY29kZWREaXN0YW5jZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBkaXN0YW5jZSB3cmFwcGVyIHRvIGhhdmUgbnVtZXJpYyBpbnB1dHMgaW5zdGVhZCBvZiBzdHJpbmcgb25lcy5cbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0ge251bWJlcltdfSBhIFRoZSBmaXJzdCBpdGVtLlxuICAgKiBAcGFyYW0ge251bWJlcltdfSBiIFRoZSBmaXJzdCBpdGVtLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IERpc3RhbmNlIG1ldHJpYy5cbiAgICogQG1lbWJlcm9mIFVNQVBSZWR1Y2VyXG4gICAqL1xuICBwcm90ZWN0ZWQgX2VuY29kZWREaXN0YW5jZU1hdHJpeChhOiBudW1iZXJbXSwgYjogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRpc3RhbmNlTWF0cml4IVthWzBdXVtiWzBdXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZW5jb2RlZERpc3RhbmNlKGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGlzdGFuY2VGbih0aGlzLmRhdGFbYVswXV0sIHRoaXMuZGF0YVtiWzBdXSk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlcyB0aGUgaW5wdXQgZGF0YSBhcyBhIHZlY3RvciBvZiBpbmRpY2VzLlxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgKi9cbiAgcHJvdGVjdGVkIF9lbmNvZGUoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgIHRoaXMudmVjdG9ycy5wdXNoKFtpXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgVU1BUCBtZXRob2QuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtKCk6IHsgW2tleTogc3RyaW5nXTogTWF0cml4IH0ge1xuICAgIGlmKHRoaXMudXNpbmdEaXN0YW5jZU1hdHJpeClcbiAgICAgIHRoaXMuZGlzdGFuY2VNYXRyaXggPSBjYWxjTm9ybWFsaXplZERpc3RhbmNlTWF0cml4KHRoaXMuZGF0YSwgdGhpcy5kaXN0YW5jZUZuIGFzIERpc3RhbmNlTWV0cmljKTtcbiAgICBjb25zdCBlbWJlZGRpbmcgPSB0aGlzLnJlZHVjZXIuZml0KHRoaXMudmVjdG9ycyk7XG5cbiAgICBmdW5jdGlvbiBhcnJheUNhc3QyQ29vcmRpbmF0ZXMoZGF0YTogbnVtYmVyW11bXSk6IENvb3JkaW5hdGVzIHtcbiAgICAgIHJldHVybiBuZXcgQXJyYXkoZGF0YS5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBpKSA9PiAoVmVjdG9yLmZyb20oZGF0YVtpXSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2VtYmVkZGluZzogYXJyYXlDYXN0MkNvb3JkaW5hdGVzKGVtYmVkZGluZyksIC4uLih0aGlzLmRpc3RhbmNlTWF0cml4ID8ge2Rpc3RhbmNlOiB0aGlzLmRpc3RhbmNlTWF0cml4fSA6IHt9KX07XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIG9yaWdpbmFsIFNQRSBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uXG4gKlxuICogQGNsYXNzIFNQRVJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBTUEVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBTUEVCYXNlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNQRVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVkdWNlciA9IG5ldyBTUEVCYXNlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIG9yaWdpbmFsIFNQRSBtZXRob2QuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIHRyYW5zZm9ybSgpOiB7IFtrZXk6IHN0cmluZ106IE1hdHJpeCB9IHtcbiAgICBjb25zdCBlbWIgPSB0aGlzLnJlZHVjZXIuZW1iZWQodGhpcy5kYXRhKTtcbiAgICByZXR1cm4ge2Rpc3RhbmNlOiB0aGlzLnJlZHVjZXIuZGlzdGFuY2UsIGVtYmVkZGluZzogZW1ifTtcbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgbW9kaWZpZWQgU1BFIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi5cbiAqXG4gKiBAY2xhc3MgUFNQRVJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBQU1BFUmVkdWNlciBleHRlbmRzIFJlZHVjZXIge1xuICBwcm90ZWN0ZWQgcmVkdWNlcjogUFNQRUJhc2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUFNQRVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgUFNQRVJlZHVjZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgUFNQRUJhc2Uob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0aGUgbW9kaWZpZWQgU1BFIG1ldGhvZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtKCk6IHsgW2tleTogc3RyaW5nXTogTWF0cml4IH0ge1xuICAgIGNvbnN0IGVtYiA9IHRoaXMucmVkdWNlci5lbWJlZCh0aGlzLmRhdGEpO1xuICAgIHJldHVybiB7ZGlzdGFuY2U6IHRoaXMucmVkdWNlci5kaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJ9O1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBvcmlnaW5hbCBTUEUgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLlxuICpcbiAqIEBjbGFzcyBPcmlnaW5hbFNQRVJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBPcmlnaW5hbFNQRVJlZHVjZXIgZXh0ZW5kcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIHJlZHVjZXI6IE9yaWdpbmFsU1BFO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIE9yaWdpbmFsU1BFUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBPcmlnaW5hbFNQRVJlZHVjZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgT3JpZ2luYWxTUEUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0aGUgb3JpZ2luYWwgU1BFIG1ldGhvZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtKCk6IHsgW2tleTogc3RyaW5nXTogTWF0cml4IH0ge1xuICAgIGNvbnN0IGVtYiA9IHRoaXMucmVkdWNlci5lbWJlZCh0aGlzLmRhdGEpO1xuICAgIHJldHVybiB7ZGlzdGFuY2U6IHRoaXMucmVkdWNlci5kaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJ9O1xuICB9XG59XG5cbmNvbnN0IEF2YWlsYWJsZVJlZHVjZXJzID0ge1xuICAnVU1BUCc6IFVNQVBSZWR1Y2VyLFxuICAndC1TTkUnOiBUU05FUmVkdWNlcixcbiAgJ1NQRSc6IFNQRVJlZHVjZXIsXG4gICdwU1BFJzogUFNQRVJlZHVjZXIsXG4gICdPcmlnaW5hbFNQRSc6IE9yaWdpbmFsU1BFUmVkdWNlcixcbn07XG5cbmV4cG9ydCB0eXBlIEtub3duTWV0aG9kcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVSZWR1Y2VycztcblxuLyoqXG4gKiBVbmlmaWVkIGNsYXNzIGltcGxlbWVudGluZyBkaWZmZXJlbnQgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIG1ldGhvZHMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICovXG5leHBvcnQgY2xhc3MgRGltZW5zaW9uYWxpdHlSZWR1Y2VyIHtcbiAgcHJpdmF0ZSByZWR1Y2VyOiBSZWR1Y2VyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERpbWVuc2lvbmFsaXR5UmVkdWNlci5cbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSBWZWN0b3JzIHRvIGVtYmVkLlxuICAgKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QgdG8gYmUgYXBwbGllZFxuICAgKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWV0cmljIERpc3RhbmNlIG1ldHJpYyB0byBiZSBjb21wdXRlZCBiZXR3ZWVuIGVhY2ggb2YgdGhlIHZlY3RvcnMuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgaW1wbGVtZW50aW5nIGVtYmVkZGVycy5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YTogYW55W10sIG1ldGhvZDogS25vd25NZXRob2RzLCBtZXRyaWM6IEtub3duTWV0cmljcywgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBjb25zdCBtZWFzdXJlID0gbmV3IE1lYXN1cmUobWV0cmljKS5nZXRNZWFzdXJlKCk7XG4gICAgbGV0IHNwZWNPcHRpb25zID0ge307XG5cbiAgICBpZiAoaXNCaXRBcnJheU1ldHJpYyhtZXRyaWMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGF0YVtpXSA9IG5ldyBCaXRBcnJheShkYXRhW2ldLl9kYXRhLCBkYXRhW2ldLl9sZW5ndGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT0gJ1VNQVAnKSB7XG4gICAgICBzcGVjT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ue2RhdGE6IGRhdGF9LFxuICAgICAgICAuLi57ZGlzdGFuY2VGbjogbWVhc3VyZX0sXG4gICAgICAgIC4uLntuRXBvY2hzOiBvcHRpb25zPy5jeWNsZXN9LFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAndC1TTkUnKSB7XG4gICAgICBzcGVjT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ue2RhdGE6IGRhdGF9LFxuICAgICAgICAuLi57ZGlzdGFuY2U6IG1lYXN1cmV9LFxuICAgICAgICAuLi57aXRlcmF0aW9uczogb3B0aW9ucz8uY3ljbGVzID8/IHVuZGVmaW5lZH0sXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAobWV0aG9kID09ICdTUEUnKSB7XG4gICAgICBzcGVjT3B0aW9ucyA9IHsuLi57ZGF0YTogZGF0YX0sIC4uLntkaXN0YW5jZTogbWVhc3VyZX0sIC4uLm9wdGlvbnN9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGVjT3B0aW9ucyA9IHsuLi57ZGF0YTogZGF0YX0sIC4uLntkaXN0YW5jZTogbWVhc3VyZX0sIC4uLm9wdGlvbnN9O1xuICAgIH1cbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgQXZhaWxhYmxlUmVkdWNlcnNbbWV0aG9kXShzcGVjT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0aGUgY2hvc2VuIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0cmFuc3Bvc2UgV2hldGhlciB0byB0cmFuc2Zvcm0gY29vcmRpbmF0ZXMgdG8gaGF2ZSBjb2x1bW5zLWZpcnN0IG9yaWVudGF0aW9uLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGVtYmVkZGluZyBtZXRob2Qgd2FzIG5vdCBmb3VuZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gIHB1YmxpYyB0cmFuc2Zvcm0odHJhbnNwb3NlOiBib29sZWFuID0gZmFsc2UpOiB7IFtrZXk6IHN0cmluZ106IE1hdHJpeCB9IHtcbiAgICBpZiAodGhpcy5yZWR1Y2VyID09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIHdhcyBub3QgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICBsZXQge2VtYmVkZGluZywgZGlzdGFuY2V9ID0gdGhpcy5yZWR1Y2VyLnRyYW5zZm9ybSgpO1xuXG4gICAgaWYgKHRyYW5zcG9zZSkge1xuICAgICAgZW1iZWRkaW5nID0gdHJhbnNwb3NlTWF0cml4KGVtYmVkZGluZyk7XG4gICAgfVxuICAgIHJldHVybiB7ZGlzdGFuY2U6IGRpc3RhbmNlLCBlbWJlZGRpbmc6IGVtYmVkZGluZ307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBtZXRyaWNzIGF2YWlsYWJsZSBieSB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge0F2YWlsYWJsZURhdGFUeXBlc30gdHlwZU5hbWUgdHlwZSBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBNZXRyaWMgbmFtZXMgd2hpY2ggZXhwZWN0cyB0aGUgZ2l2ZW4gZGF0YSB0eXBlXG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gIHN0YXRpYyBhdmFpbGFibGVNZXRyaWNzQnlUeXBlKHR5cGVOYW1lOiBBdmFpbGFibGVEYXRhVHlwZXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1t0eXBlTmFtZV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIG1ldGhvZHMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgc3RhdGljIGdldCBhdmFpbGFibGVNZXRob2RzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVSZWR1Y2Vycyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBtZXRyaWNzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWV0cmljcygpIHtcbiAgICBsZXQgYW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIE9iamVjdC52YWx1ZXMoQXZhaWxhYmxlTWV0cmljcykuZm9yRWFjaCgob2JqKSA9PiB7XG4gICAgICBjb25zdCBhcnJheSA9IE9iamVjdC52YWx1ZXMob2JqKTtcbiAgICAgIGFucyA9IFsuLi5hbnMsIC4uLmFycmF5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gYW5zO1xuICB9XG59XG4iXX0=","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 * @return {any} Embedding (and distance matrix where applicable).\n */\nfunction onMessage(columnData, method, measure, options) {\n const reducer = new DimensionalityReducer(columnData, method, measure, options);\n return reducer.transform(true);\n}\nself.onmessage = ({ data: { columnData, method, measure, options } }) => {\n let data;\n try {\n data = onMessage(columnData, method, measure, options);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9uYWxpdHktcmVkdWNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpbWVuc2lvbmFsaXR5LXJlZHVjZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHFCQUFxQixFQUFlLE1BQU0sMEJBQTBCLENBQUM7QUFHN0U7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxVQUFpQixFQUFFLE1BQW9CLEVBQUUsT0FBcUIsRUFBRSxPQUFhO0lBQzlGLE1BQU0sT0FBTyxHQUFHLElBQUkscUJBQXFCLENBQ3ZDLFVBQVUsRUFDVixNQUFNLEVBQ04sT0FBTyxFQUNQLE9BQU8sQ0FDUixDQUFDO0lBQ0YsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUUsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsRUFBQyxFQUFFLEVBQUU7SUFDbEUsSUFBSSxJQUFvRCxDQUFDO0lBQ3pELElBQUc7UUFDRCxJQUFJLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3hEO0lBQUMsT0FBTyxDQUFNLEVBQUU7UUFDZixJQUFJLEdBQUcsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUM7S0FDbkI7SUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1FBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtRQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7S0FDMUIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaW1lbnNpb25hbGl0eVJlZHVjZXIsIEtub3duTWV0aG9kc30gZnJvbSAnLi4vcmVkdWNlLWRpbWVuc2lvbmFsaXR5JztcbmltcG9ydCB7S25vd25NZXRyaWNzfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzL3R5cGVkLW1ldHJpY3MnO1xuXG4vKipcbiAqIFdvcmtlciB0aHJlYWQgcmVjZWl2aW5nIGRhdGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHthbnlbXX0gY29sdW1uRGF0YSBTYW1wbGVzIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QuXG4gKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWVhc3VyZSBEaXN0YW5jZSBtZXRyaWMuXG4gKiBAcGFyYW0ge2FueX0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gYWxnb3JpdGhtLlxuICogQHJldHVybiB7YW55fSBFbWJlZGRpbmcgKGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZSkuXG4gKi9cbmZ1bmN0aW9uIG9uTWVzc2FnZShjb2x1bW5EYXRhOiBhbnlbXSwgbWV0aG9kOiBLbm93bk1ldGhvZHMsIG1lYXN1cmU6IEtub3duTWV0cmljcywgb3B0aW9ucz86IGFueSk6IHtkaXN0YW5jZT86IGFueSwgZW1iZWRkaW5nPzogYW55fSB7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgRGltZW5zaW9uYWxpdHlSZWR1Y2VyKFxuICAgIGNvbHVtbkRhdGEsXG4gICAgbWV0aG9kLFxuICAgIG1lYXN1cmUsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgcmV0dXJuIHJlZHVjZXIudHJhbnNmb3JtKHRydWUpO1xufVxuXG5zZWxmLm9ubWVzc2FnZSA9ICh7ZGF0YToge2NvbHVtbkRhdGEsIG1ldGhvZCwgbWVhc3VyZSwgb3B0aW9uc319KSA9PiB7XG4gIGxldCBkYXRhOiB7ZXJyb3I/OiBhbnksIGRpc3RhbmNlPzogYW55LCBlbWJlZGRpbmc/OiBhbnl9O1xuICB0cnl7XG4gICAgZGF0YSA9IG9uTWVzc2FnZShjb2x1bW5EYXRhLCBtZXRob2QsIG1lYXN1cmUsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICBkYXRhID0ge2Vycm9yOiBlfTtcbiAgfVxuICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICBlcnJvcjogZGF0YS5lcnJvcixcbiAgICBkaXN0YW5jZTogZGF0YS5kaXN0YW5jZSxcbiAgICBlbWJlZGRpbmc6IGRhdGEuZW1iZWRkaW5nLFxuICB9KTtcbn07XG4iXX0=","\"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","\"use strict\";\n// Reference: https://www.geeksforgeeks.org/jaro-and-jaro-winkler-similarity/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.jaroWinkler = exports.jaro = void 0;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaro(str1, str2, options) {\n // Exit early if either are empty.\n if (str1.length === 0 || str2.length === 0) {\n return 0;\n }\n // Convert to upper if case-sensitive is false.\n if (options && !options.caseSensitive) {\n str1 = str1.toUpperCase();\n str2 = str2.toUpperCase();\n }\n // Exact match\n if (str1 === str2) {\n return 1;\n }\n // Number of matches\n var m = 0;\n // Length of two Strings\n var len1 = str1.length;\n var len2 = str2.length;\n // Maximum distance\n var window = Math.floor(Math.max(len1, len2) / 2) - 1;\n // Hash for matches\n var str1Hash = new Array(len1);\n var str2Hash = new Array(len2);\n for (var i = 0; i < len1; i++) {\n for (var j = Math.max(0, i - window); j <= Math.min(len2, i + window + 1); j++) {\n if (!str1Hash[i] && !str2Hash[j] && str1[i] === str2[j]) {\n ++m;\n str1Hash[i] = str2Hash[j] = true;\n break;\n }\n }\n }\n // Exit early if no matches were found.\n if (m === 0) {\n return 0;\n }\n // Count the transpositions.\n var t = 0;\n var point = 0;\n for (var i = 0; i < len1; i++) {\n if (str1Hash[i]) {\n while (!str2Hash[point]) {\n point++;\n }\n if (str1.charAt(i) !== str2.charAt(point++)) {\n t++;\n }\n }\n }\n t /= 2;\n return (m / len1 + m / len2 + (m - t) / m) / 3;\n}\nexports.jaro = jaro;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaroWinkler(str1, str2, options) {\n // Jaro Distance\n var jaroDist = jaro(str1, str2, options);\n // Same prefix length, maxium is 4\n var prefix = 0;\n if (jaroDist > 0.7) {\n var minIndex = Math.min(str1.length, str2.length);\n var i = 0;\n while (str1[i] === str2[i] && i < 4 && i < minIndex) {\n ++prefix;\n i++;\n }\n jaroDist += 0.1 * prefix * (1 - jaroDist);\n }\n return jaroDist;\n}\nexports.jaroWinkler = jaroWinkler;\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, [562], () => (__webpack_require__(2457)))\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) scriptUrl = scripts[scripts.length - 1].src\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;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t457: 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","Vector","Float32Array","randomFloat","range","Math","random","floor","assert","condition","message","Error","initCoordinates","dimension1","dimension2","fill","Array","map","vectorAdd","p","q","multiplier","nItems","length","total","i","fillRandomMatrix","scale","matrix","j","calculateEuclideanDistance","sqdiffSumm","v","itemsSum","vectorSquare","sqrt","calcNormalizedDistanceMatrix","data","distance","max","Number","MIN_VALUE","min","MAX_VALUE","d","SPEBase","constructor","options","_a","_b","_c","_d","_e","_f","_g","this","steps","cycles","cutoff","lambda","dlambda","lambda2","dlambda2","epsilon","distanceFunction","initDistance","vectors","calcDistanceMatrix","calcDistance","index1","index2","embed","coordinates","dimension","cycle","step","rowi","rowj","r","diffIJ","PSPEBase","OriginalSPE","super","radiusPercent","maxDistance","maxDistanceSteps","n","radius","StringMetricsNames","VectorMetricsNames","BitArrayMetricsNames","DistanceMetricsSubjects","getDistanceFromSimilarity","similarity","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","Euclidean","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","hamming","LEVENSHTEIN","levenstein","NEEDLEMANN_WUNSCH","vectorDistanceMetricsMethods","stringDistanceMetricsMethods","Levenshtein","JaroWinkler","Manhattan","s1","s2","dist","bitArrayDistanceMetricsMethods","x","y","trueCount","common","andWithCountBits","tanimotoSimilarity","diceSimilarity","asymmetricSimilarity","braunBlanquetSimilarity","cosineSimilarity","totalProd","kulczynskiSimilarity","mcConnaugheySimilarity","countBits","len","diff","rogotGoldbergSimilarity","russelSimilarity","sokalSimilarity","AvailableMetrics","String","BitArray","MacroMolecule","MetricToDataType","Object","keys","reduce","ret","key","val","Measure","method","dataType","getMeasure","opts","dict","hasOwnProperty","name","toString","static","availableMeasures","arg","defaultValue","_length","_version","_updateLevel","_selectedCount","_selectedCountVersion","_selectedIndexesVersion","_versionedName","_versionedNameVersion","SHRINK_THRESHOLD","buff","_createBuffer","_data","Uint32Array","getRawData","assureGoez","num","argName","assureInRange","value","copy","src","dst","count","copyFrom","other","lengthInInts","buffer","version","incrementVersion","notify","versionedName","self","setLength","nIntsNeeded","newData","set1","set2","temp","values","flag","setBit","s","fromSeq","charAt","bytes","num1","num2","equals","getBit","clone","bitArray","from","init","setAll","invert","flags","setIndexes","indexes","clear","setFast","everyIndex","index","anyIndex","setWhere","check","allowClear","getRange","to","arr","push","fromValues","getRangeAsList","setRange","start","end","setTrue","setFalse","setRandom","k","and","andNot","notAnd","not","or","xor","insertAt","pos","oldlength","removeAt","contains","removeByMask","mask","dstIdx","srcIdx","findNext","bit","falseCount","_onBitCount","remainingBits","countWhere","result","second","allTrue","allFalse","anyTrue","anyFalse","unusedBits","numInts","_firstOnBit","findPrev","_lastOnBit","DimReductionMethods","Int8Array","Reducer","AvailableReducers","distanceFn","_","usingDistanceMatrix","preCalculateDistanceMatrix","distanceMatrix","_encodedDistanceMatrix","bind","_encodedDistance","nNeighbors","reducer","u","a","b","_encode","transform","embedding","fit","assign","iterations","initDataDist","getSolution","emb","DimensionalityReducer","metric","measure","specOptions","nEpochs","undefined","transpose","typeName","availableMethods","availableMetrics","ans","forEach","obj","array","onmessage","columnData","onMessage","e","error","postMessage","exports","tsne_1","defineProperty","enumerable","get","TSNE","opt","returnV","vValue","iter","perplexity","getopt","dim","field","defaultval","gaussRandom","c","log","randn","mu","std","zeros","isNaN","ArrayBuffer","Float64Array","randn2d","uses","xhere","L2","x1","x2","D","x1i","x2i","xtod","X","N","d2p","tol","nf","hTarget","P","prow","betamin","betamax","Infinity","beta","done","maxtries","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","str1","str2","jaroDist","caseSensitive","toUpperCase","m","len1","len2","window","str1Hash","str2Hash","t","point","jaro","prefix","minIndex","prototype","isAnyArray","object","call","endsWith","errorCalculation","parameters","parameterizedFunction","func","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","loop","line","formatNumber","join","inspectData","formatNumber2","padEnd","str","fix","toFixed","startsWith","toExponential","slice","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newMatrix","Matrix","row","column","set","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","apply","callback","to2DArray","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","h","iMax","swapRows","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","idx","POSITIVE_INFINITY","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","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","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","andS","andM","orS","orM","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","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","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","col","solve","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","threshold","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","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","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","__read","o","iterator","ar","__values","SparseMatrix","dims","entries","Map","nCols","checkDims","makeKey","has","getAll","ordered","rowColValues","getDims","getRows","getCols","getValues","fn","vals","toArray","_this","pairwiseMultiply","elementWise","maximum","multiplyScalar","scalar","eliminateZeros","zeroIndices","Set","removeByZeroIndex","nextValues","filter","nextRows","nextCols","normalize","normType","e_1","normFn","normFns","colsByRow","nextMatrix","_loop_1","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","results","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","offset","euclideanRandomProjectionSplit","isLeaf","recursiveFlatten","nodeNum","leafNum","oldNodeNum","res","numNodes","numLeaves","selectSide","makeForest","nTrees","makeTree","nNodes","nLeaves","flattenTree","makeLeafArray","rpForest","rpForest_1","rpForest_1_1","node","__awaiter","thisArg","_arguments","generator","Promise","resolve","reject","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","adjustedLocalConnectivity","smoothKNNDistance","sigmas","rhos","computeMembershipStrengths","normed","csrMatrix","initTransform","reshape2d","graphMax","makeEpochsPerSample","assignOptimizationStateParameters","headEmbedding","tailEmbedding","currentEpoch","farDist","categoricalSimplicialSetIntersection","optimizeLayoutStep","getEmbedding","metricNNDescent","sparseMatrix","prodMatrix","simplicialSet","target","unknownDist","intersection","fastIntersection","resetLocalConnectivity","nIter","bandwidth","lo","hi","mid","ithDistances","nonZeroDists","interpolation","meanIthDistances","meanDistances","graphValues","entry","w","state","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","all","promises","globalThis","Function","prop","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","replace","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""}