@datagrok/bio 2.13.3 → 2.13.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +1 -1
- package/CHANGELOG.md +23 -0
- package/detectors.js +52 -38
- package/dist/111.js +2 -0
- package/dist/111.js.map +1 -0
- package/dist/234.js +2 -0
- package/dist/234.js.map +1 -0
- package/dist/242.js +2 -0
- package/dist/242.js.map +1 -0
- package/dist/{286.js → 248.js} +1 -1
- package/dist/248.js.map +1 -0
- package/dist/284.js +3 -0
- package/dist/284.js.map +1 -0
- package/dist/317.js +2 -0
- package/dist/317.js.map +1 -0
- package/dist/589.js +2 -0
- package/dist/589.js.map +1 -0
- package/dist/603.js +2 -0
- package/dist/603.js.map +1 -0
- package/dist/682.js +2 -0
- package/dist/682.js.map +1 -0
- package/dist/705.js +2 -0
- package/dist/705.js.map +1 -0
- package/dist/{590.js → 731.js} +2 -2
- package/dist/731.js.map +1 -0
- package/dist/778.js +2 -0
- package/dist/778.js.map +1 -0
- package/dist/793.js +2 -0
- package/dist/793.js.map +1 -0
- package/dist/950.js +2 -0
- package/dist/950.js.map +1 -0
- package/dist/package-test.js +6 -7
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +6 -7
- package/dist/package.js.map +1 -1
- package/files/cache_config.json +7 -0
- package/package.json +12 -11
- package/src/analysis/sequence-activity-cliffs.ts +1 -1
- package/src/function-edtiors/split-to-monomers-editor.ts +6 -7
- package/src/package-types.ts +14 -7
- package/src/package.ts +6 -6
- package/src/substructure-search/substructure-search.ts +9 -10
- package/src/tests/WebLogo-positions-test.ts +6 -6
- package/src/tests/activity-cliffs-tests.ts +5 -2
- package/src/tests/bio-tests.ts +6 -6
- package/src/tests/checkInputColumn-tests.ts +3 -3
- package/src/tests/converters-test.ts +1 -1
- package/src/tests/detectors-tests.ts +25 -13
- package/src/tests/fasta-export-tests.ts +2 -2
- package/src/tests/mm-distance-tests.ts +1 -1
- package/src/tests/msa-tests.ts +2 -2
- package/src/tests/renderers-test.ts +5 -5
- package/src/tests/scoring.ts +26 -5
- package/src/tests/seq-handler-get-region.ts +4 -4
- package/src/tests/sequence-space-test.ts +1 -1
- package/src/tests/substructure-filters-tests.ts +4 -1
- package/src/tests/to-atomic-level-tests.ts +1 -1
- package/src/utils/cell-renderer.ts +4 -4
- package/src/utils/context-menu.ts +1 -1
- package/src/utils/convert.ts +7 -4
- package/src/utils/get-region-func-editor.ts +11 -16
- package/src/utils/get-region.ts +5 -5
- package/src/utils/macromolecule-column-widget.ts +1 -1
- package/src/utils/monomer-lib/lib-manager.ts +20 -8
- package/src/utils/monomer-lib/library-file-manager/file-manager.ts +28 -24
- package/src/utils/monomer-lib/library-file-manager/file-validator.ts +2 -1
- package/src/utils/monomer-lib/library-file-manager/ui.ts +3 -6
- package/src/utils/multiple-sequence-alignment-ui.ts +10 -11
- package/src/utils/multiple-sequence-alignment.ts +2 -2
- package/src/utils/pepsea.ts +1 -1
- package/src/utils/save-as-fasta.ts +5 -5
- package/src/viewers/vd-regions-viewer.ts +2 -2
- package/src/widgets/bio-substructure-filter.ts +7 -7
- package/src/widgets/package-settings-editor-widget.ts +6 -6
- package/src/widgets/representations.ts +1 -1
- package/tsconfig.json +4 -4
- package/dist/23.js +0 -2
- package/dist/23.js.map +0 -1
- package/dist/231.js +0 -2
- package/dist/231.js.map +0 -1
- package/dist/282.js +0 -2
- package/dist/282.js.map +0 -1
- package/dist/286.js.map +0 -1
- package/dist/356.js +0 -2
- package/dist/356.js.map +0 -1
- package/dist/36.js +0 -2
- package/dist/36.js.map +0 -1
- package/dist/40.js +0 -2
- package/dist/40.js.map +0 -1
- package/dist/413.js +0 -2
- package/dist/413.js.map +0 -1
- package/dist/42.js +0 -2
- package/dist/42.js.map +0 -1
- package/dist/427.js +0 -2
- package/dist/427.js.map +0 -1
- package/dist/545.js +0 -3
- package/dist/545.js.map +0 -1
- package/dist/590.js.map +0 -1
- package/dist/65.js +0 -2
- package/dist/65.js.map +0 -1
- package/dist/796.js +0 -2
- package/dist/796.js.map +0 -1
- package/dist/package-test.js.LICENSE.txt +0 -1
- package/dist/package.js.LICENSE.txt +0 -1
- /package/dist/{545.js.LICENSE.txt → 284.js.LICENSE.txt} +0 -0
|
@@ -392,8 +392,8 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
|
|
|
392
392
|
// this.mainLayout.style.height = '100%';
|
|
393
393
|
// this.mainLayout.style.border = '1px solid black';
|
|
394
394
|
|
|
395
|
-
this.filterSourceInput = ui.
|
|
396
|
-
Object.values(FilterSources), this.filterSourceInputOnValueChanged.bind(this));
|
|
395
|
+
this.filterSourceInput = ui.input.choice<FilterSources>('Data source', {value: this.filterSource,
|
|
396
|
+
items: Object.values(FilterSources), onValueChanged: this.filterSourceInputOnValueChanged.bind(this)});
|
|
397
397
|
this.filterSourceInput.root.style.position = 'absolute';
|
|
398
398
|
this.filterSourceInput.root.style.right = '9px';
|
|
399
399
|
this.filterSourceInput.root.style.top = '-4px';
|
|
@@ -128,7 +128,7 @@ export class BioSubstructureFilter extends DG.Filter implements IRenderer {
|
|
|
128
128
|
}
|
|
129
129
|
const sh = SeqHandler.forColumn(this.column!);
|
|
130
130
|
this.columnName ??= this.column?.name;
|
|
131
|
-
this.notation ??= this.column?.
|
|
131
|
+
this.notation ??= this.column?.meta.units!;
|
|
132
132
|
|
|
133
133
|
this.bioFilter = this.notation === NOTATION.FASTA ?
|
|
134
134
|
new FastaBioFilter() : this.notation === NOTATION.SEPARATOR ?
|
|
@@ -296,10 +296,10 @@ export class FastaBioFilter extends BioFilterBase<BioFilterProps> {
|
|
|
296
296
|
constructor() {
|
|
297
297
|
super();
|
|
298
298
|
|
|
299
|
-
this.substructureInput = ui.
|
|
299
|
+
this.substructureInput = ui.input.string('', {value: '', onValueChanged: () => {
|
|
300
300
|
this.props = new BioFilterProps(this.substructureInput.value);
|
|
301
301
|
if (!this._propsChanging) this.onChanged.next();
|
|
302
|
-
},
|
|
302
|
+
}, placeholder: 'Substructure'});
|
|
303
303
|
}
|
|
304
304
|
|
|
305
305
|
public applyProps() {
|
|
@@ -336,15 +336,15 @@ export class SeparatorBioFilter extends BioFilterBase<SeparatorFilterProps> {
|
|
|
336
336
|
constructor(colSeparator: string) {
|
|
337
337
|
super();
|
|
338
338
|
|
|
339
|
-
this.substructureInput = ui.
|
|
339
|
+
this.substructureInput = ui.input.string('', {value: '', onValueChanged: () => {
|
|
340
340
|
this.props = new SeparatorFilterProps(this.substructureInput.value, this.props.separator);
|
|
341
341
|
if (!this._propsChanging) this.onChanged.next();
|
|
342
|
-
},
|
|
343
|
-
this.separatorInput = ui.
|
|
342
|
+
}, placeholder: 'Substructure'});
|
|
343
|
+
this.separatorInput = ui.input.string('', {value: this.colSeparator = colSeparator, onValueChanged: () => {
|
|
344
344
|
const separator: string | undefined = !!this.separatorInput.value ? this.separatorInput.value : undefined;
|
|
345
345
|
this.props = new SeparatorFilterProps(this.props.substructure, separator);
|
|
346
346
|
if (!this._propsChanging) this.onChanged.next();
|
|
347
|
-
},
|
|
347
|
+
}, placeholder: 'Separator'});
|
|
348
348
|
}
|
|
349
349
|
|
|
350
350
|
applyProps(): void {
|
|
@@ -22,29 +22,29 @@ export class PackageSettingsEditorWidget extends DG.Widget {
|
|
|
22
22
|
|
|
23
23
|
async init(): Promise<void> {
|
|
24
24
|
const maxMonomerLengthInput = ui.input.int('Max Monomer Length', {
|
|
25
|
-
value: _package.properties.
|
|
25
|
+
value: _package.properties.maxMonomerLength!,
|
|
26
26
|
nullable: true, min: 0,
|
|
27
27
|
onValueChanged: () => {
|
|
28
28
|
// Handle user changed value
|
|
29
|
-
_package.properties.
|
|
29
|
+
_package.properties.maxMonomerLength = maxMonomerLengthInput.value ?? null;
|
|
30
30
|
},
|
|
31
31
|
tooltipText: this.maxMonomerLengthProp.description,
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
const tooltipWebLogoInput = ui.input.bool('Tooltip WebLogo', {
|
|
35
|
-
value: _package.properties.
|
|
35
|
+
value: _package.properties.tooltipWebLogo,
|
|
36
36
|
nullable: false,
|
|
37
37
|
onValueChanged: () => {
|
|
38
|
-
_package.properties.
|
|
38
|
+
_package.properties.tooltipWebLogo = tooltipWebLogoInput.value!;
|
|
39
39
|
},
|
|
40
40
|
tooltipText: this.tooltipWebLogo.description,
|
|
41
41
|
});
|
|
42
42
|
|
|
43
43
|
const defaultSeparatorInput = ui.input.choice('Default Separator', {
|
|
44
|
-
value: _package.properties.
|
|
44
|
+
value: _package.properties.defaultSeparator,
|
|
45
45
|
items: ['.', '/', '-'],
|
|
46
46
|
onValueChanged: () => {
|
|
47
|
-
_package.properties.
|
|
47
|
+
_package.properties.defaultSeparator = defaultSeparatorInput.value!;
|
|
48
48
|
},
|
|
49
49
|
tooltipText: this.defaultSeparator.description,
|
|
50
50
|
});
|
|
@@ -25,7 +25,7 @@ export function getMacromoleculeColumnPropertyPanel(col: DG.Column): DG.Widget {
|
|
|
25
25
|
const columnsSet = new Set(columnsList);
|
|
26
26
|
columnsSet.delete(col.name);
|
|
27
27
|
|
|
28
|
-
let maxMonomerLength: number | null = (_package.properties ? _package.properties.
|
|
28
|
+
let maxMonomerLength: number | null = (_package.properties ? _package.properties.maxMonomerLength : 4);
|
|
29
29
|
if (mmcrTAGS.maxMonomerLength in col.tags) {
|
|
30
30
|
const v = parseInt(col.getTag(mmcrTAGS.maxMonomerLength));
|
|
31
31
|
maxMonomerLength = !isNaN(v) ? v : maxMonomerLength;
|
package/tsconfig.json
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
/* Basic Options */
|
|
6
6
|
// "incremental": true, /* Enable incremental compilation */
|
|
7
|
-
"target": "
|
|
8
|
-
"module": "
|
|
9
|
-
"lib": ["ES2022", "ES2022.String", "
|
|
7
|
+
"target": "ES2022", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
|
|
8
|
+
"module": "ES2022", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
|
|
9
|
+
"lib": ["ES2022", "ES2022.String", "DOM"], /* Specify library files to be included in the compilation. */
|
|
10
10
|
// "allowJs": true, /* Allow javascript files to be compiled. */
|
|
11
11
|
// "checkJs": true, /* Report errors in .js files. */
|
|
12
12
|
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
|
66
66
|
"typeRoots": ["./node_modules/@webgpu/types", "./node_modules/@types"],
|
|
67
67
|
/* Advanced Options */
|
|
68
|
-
"skipLibCheck":
|
|
68
|
+
"skipLibCheck": true, /* Skip type checking of declaration files. */
|
|
69
69
|
"forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */
|
|
70
70
|
//"jsx": "react"
|
|
71
71
|
}
|
package/dist/23.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var bio;(()=>{"use strict";var e,r,t={5023:(e,r,t)=>{var n=t(7862);const o=e=>null==e;var a=t(6361),s=t(9657);onmessage=async e=>{const{values:r,startIdx:t,endIdx:i,threshold:l,fnNames:c,opts:h,aggregationMethod:p,weights:u}=e.data;try{const e=[],f=[],g=[],v=i-t,d=function(e,r){return e===n.y.MANHATTAN?e=>e.reduce(((e,t,n)=>e+t*r[n]),0):e=>{const t=e.reduce(((e,t,n)=>e+(t*r[n])**2),0);return Math.sqrt(t)}}(p,u);r.forEach(((e,t)=>{if((0,a.sQ)(c[t]))for(let n=0;n<e.length;++n)o(e[n])||(r[t][n]=new s.Z(r[t][n]._data,r[t][n]._length))}));let b=0;const w=new Array(c.length).fill(null).map(((e,r)=>new a.UH(c[r]).getMeasure(h[r]))),y=r[0].length-2-Math.floor(Math.sqrt(-8*t+4*r[0].length*(r[0].length-1)-7)/2-.5),m=t-r[0].length*y+Math.floor((y+1)*(y+2)/2);let x=y,O=m;for(;b<v;){const t=w.map(((e,t)=>o(r[t][x])||o(r[t][O])?1:e(r[t][x],r[t][O]))),n=1===t.length?t[0]:d(t);1-n>=l&&(e.push(x),f.push(O),g.push(n)),b++,O++,O===r[0].length&&(x++,O=x+1)}const M=new Int32Array(e),j=new Int32Array(f),A=new Float32Array(g);postMessage({i:M,j,distance:A})}catch(e){postMessage({error:e})}}}},n={};function o(e){var r=n[e];if(void 0!==r)return r.exports;var a=n[e]={exports:{}};return t[e](a,a.exports,o),a.exports}o.m=t,o.x=()=>{var e=o.O(void 0,[36,413],(()=>o(5023)));return o.O(e)},e=[],o.O=(r,t,n,a)=>{if(!t){var s=1/0;for(h=0;h<e.length;h++){for(var[t,n,a]=e[h],i=!0,l=0;l<t.length;l++)(!1&a||s>=a)&&Object.keys(o.O).every((e=>o.O[e](t[l])))?t.splice(l--,1):(i=!1,a<s&&(s=a));if(i){e.splice(h--,1);var c=n();void 0!==c&&(r=c)}}return r}a=a||0;for(var h=e.length;h>0&&e[h-1][2]>a;h--)e[h]=e[h-1];e[h]=[t,n,a]},o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((r,t)=>(o.f[t](e,r),r)),[])),o.u=e=>e+".js",o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var r=o.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var n=t.length-1;n>-1&&!e;)e=t[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})(),(()=>{var e={23:1};o.f.i=(r,t)=>{e[r]||importScripts(o.p+o.u(r))};var r=self.webpackChunkbio=self.webpackChunkbio||[],t=r.push.bind(r);r.push=r=>{var[n,a,s]=r;for(var i in a)o.o(a,i)&&(o.m[i]=a[i]);for(s&&s(o);n.length;)e[n.pop()]=1;t(r)}})(),r=o.x,o.x=()=>Promise.all([o.e(36),o.e(413)]).then(r);var a=o.x();bio=a})();
|
|
2
|
-
//# sourceMappingURL=23.js.map
|
package/dist/23.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"23.js","mappings":"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","sources":["webpack://bio/webpack/runtime/chunk loaded","webpack://bio/webpack/runtime/startup chunk dependencies","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-worker.js","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/ensure chunk","webpack://bio/webpack/runtime/get javascript chunk filename","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/publicPath","webpack://bio/webpack/runtime/importScripts chunk loading","webpack://bio/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([\n\t\t__webpack_require__.e(36),\n\t\t__webpack_require__.e(413)\n\t]).then(next);\n};","import { DistanceAggregationMethods } from './types';\nexport const isNil = (x) => x === null || x === undefined;\nexport function insertSmaller(distancesAr, indexes, num, index) {\n if (num > distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num < v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function insertLarger(distancesAr, indexes, num, index) {\n if (num < distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num > v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function getAggregationFunction(aggregationMethod, weights) {\n switch (aggregationMethod) {\n case DistanceAggregationMethods.MANHATTAN:\n return (vs) => vs.reduce((acc, val, idx) => acc + val * weights[idx], 0);\n default:\n return (vs) => {\n // euclidean\n const sum = vs.reduce((acc, val, idx) => acc + (val * weights[idx]) ** 2, 0);\n return Math.sqrt(sum);\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFO1FBQ3pCLEtBQUssMEJBQTBCLENBQUMsU0FBUztZQUN2QyxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JGO1lBQ0UsT0FBTyxDQUFDLEVBQVksRUFBRSxFQUFFO2dCQUN0QixZQUFZO2dCQUNaLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztLQUNMO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeDogYW55KSA9PiB4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFNtYWxsZXIoZGlzdGFuY2VzQXI6IG51bWJlcltdLCBpbmRleGVzOiBudW1iZXJbXSwgbnVtOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgaWYgKG51bSA+IGRpc3RhbmNlc0FyW2Rpc3RhbmNlc0FyLmxlbmd0aC0xXSlcbiAgICByZXR1cm47XG5cbiAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXN0YW5jZXNBci5maW5kSW5kZXgoKHYpID0+IG51bSA8IHYpO1xuICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICBpbmRleGVzLnBvcCgpO1xuICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGFyZ2VyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oXG4gIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzOiBudW1iZXJbXVxuKTogKHZhbHVlczogbnVtYmVyW10pID0+IG51bWJlciB7XG4gIHN3aXRjaCAoYWdncmVnYXRpb25NZXRob2QpIHtcbiAgICBjYXNlIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTjpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArIHZhbCAqIHdlaWdodHNbaWR4XSwgMCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICBjb25zdCBzdW0gPSB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArICh2YWwgKiB3ZWlnaHRzW2lkeF0pICoqIDIsIDApO1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHN1bSk7XG4gICAgICB9O1xuICB9XG59XG4iXX0=","import { getAggregationFunction, isNil } from './utils';\nimport { Measure, isBitArrayMetric } from '../typed-metrics';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nonmessage = async (event) => {\n const { values, startIdx, endIdx, threshold, fnNames, opts, aggregationMethod, weights } = event.data;\n try {\n // if (startIdx != -1)\n // throw new Error('Error in sparse matrix worker'); // TODO: remove this line\n const i = [];\n const j = [];\n const distances = [];\n const chunkSize = endIdx - startIdx;\n //const mi = startRow;\n //const mj = startCol;\n const aggregate = getAggregationFunction(aggregationMethod, weights);\n values.forEach((v, colIdx) => {\n if (isBitArrayMetric(fnNames[colIdx])) {\n for (let i = 0; i < v.length; ++i) {\n if (isNil(v[i]))\n continue;\n values[colIdx][i] = new BitArray(values[colIdx][i]._data, values[colIdx][i]._length);\n }\n }\n });\n let cnt = 0;\n const distanceFns = new Array(fnNames.length).fill(null).map((_, i) => new Measure(fnNames[i]).getMeasure(opts[i]));\n const startRow = values[0].length - 2 - Math.floor(Math.sqrt(-8 * startIdx + 4 * values[0].length * (values[0].length - 1) - 7) / 2 - 0.5);\n const startCol = startIdx - values[0].length * startRow + Math.floor((startRow + 1) * (startRow + 2) / 2);\n let mi = startRow;\n let mj = startCol;\n while (cnt < chunkSize) {\n //const value = seq1List[mi] && seq1List[mj] ? hamming(seq1List[mi], seq1List[mj]) : 0;\n const distanceValues = distanceFns.map((fn, idx) => !isNil(values[idx][mi]) && !isNil(values[idx][mj]) ?\n fn(values[idx][mi], values[idx][mj]) : 1);\n const value = distanceValues.length === 1 ? distanceValues[0] : aggregate(distanceValues);\n if (1 - value >= threshold) {\n i.push(mi);\n j.push(mj);\n distances.push(value);\n }\n cnt++;\n mj++;\n if (mj === values[0].length) {\n mi++;\n mj = mi + 1;\n }\n }\n const iArray = new Int32Array(i);\n const jArray = new Int32Array(j);\n const distanceArray = new Float32Array(distances);\n postMessage({ i: iArray, j: jArray, distance: distanceArray });\n }\n catch (e) {\n postMessage({ error: e });\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC13b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcGFyc2UtbWF0cml4LXdvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3RELE9BQU8sRUFBZSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLFFBQVEsTUFBTSx5Q0FBeUMsQ0FBQztBQUUvRCxTQUFTLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQzFCLE1BQU0sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUMsR0FHbEMsS0FBSyxDQUFDLElBQUksQ0FBQztJQUMvRCxJQUFJO1FBQ0Ysc0JBQXNCO1FBQ3RCLGdGQUFnRjtRQUNoRixNQUFNLENBQUMsR0FBYSxFQUFFLENBQUM7UUFDdkIsTUFBTSxDQUFDLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUMvQixNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3BDLHNCQUFzQjtRQUN0QixzQkFBc0I7UUFFdEIsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFckUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQixJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO2dCQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDakMsSUFBSSxLQUFLLENBQUMsQ0FB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QUFDO2FBQ2I7U0FDRjtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELFdBQVcsQ0FBQyxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFDLENBQUMsQ0FBQztLQUM5RDtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsV0FBVyxDQUFDLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7S0FDekI7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dldEFnZ3JlZ2F0aW9uRnVuY3Rpb24sIGlzTmlsfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7S25vd25NZXRyaWNzLCBNZWFzdXJlLCBpc0JpdEFycmF5TWV0cmljfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzJztcbmltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuaW1wb3J0IHtEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kfSBmcm9tICcuL3R5cGVzJztcbm9ubWVzc2FnZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICBjb25zdCB7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCB0aHJlc2hvbGQsIGZuTmFtZXMsIG9wdHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzfTpcbiAgICB7dmFsdWVzOiBBcnJheTxhbnlbXT4sIHN0YXJ0SWR4OiBudW1iZXIsIGVuZElkeDogbnVtYmVyLFxuICAgICAgdGhyZXNob2xkOiBudW1iZXIsIGZuTmFtZXM6IEtub3duTWV0cmljc1tdLCBvcHRzOiBhbnlbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZH0gPSBldmVudC5kYXRhO1xuICB0cnkge1xuICAgIC8vIGlmIChzdGFydElkeCAhPSAtMSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgaW4gc3BhcnNlIG1hdHJpeCB3b3JrZXInKTsgLy8gVE9ETzogcmVtb3ZlIHRoaXMgbGluZVxuICAgIGNvbnN0IGk6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgajogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBkaXN0YW5jZXM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgY2h1bmtTaXplID0gZW5kSWR4IC0gc3RhcnRJZHg7XG4gICAgLy9jb25zdCBtaSA9IHN0YXJ0Um93O1xuICAgIC8vY29uc3QgbWogPSBzdGFydENvbDtcblxuICAgIGNvbnN0IGFnZ3JlZ2F0ZSA9IGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oYWdncmVnYXRpb25NZXRob2QsIHdlaWdodHMpO1xuXG4gICAgdmFsdWVzLmZvckVhY2goKHYsIGNvbElkeCkgPT4ge1xuICAgICAgaWYgKGlzQml0QXJyYXlNZXRyaWMoZm5OYW1lc1tjb2xJZHhdKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHYubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAoaXNOaWwodltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgIHZhbHVlc1tjb2xJZHhdW2ldID0gbmV3IEJpdEFycmF5KHZhbHVlc1tjb2xJZHhdW2ldLl9kYXRhLCB2YWx1ZXNbY29sSWR4XVtpXS5fbGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCBjbnQgPSAwO1xuICAgIGNvbnN0IGRpc3RhbmNlRm5zID0gbmV3IEFycmF5KGZuTmFtZXMubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4gbmV3IE1lYXN1cmUoZm5OYW1lc1tpXSkuZ2V0TWVhc3VyZShvcHRzW2ldKSk7XG4gICAgY29uc3Qgc3RhcnRSb3cgPSB2YWx1ZXNbMF0ubGVuZ3RoIC0gMiAtIE1hdGguZmxvb3IoXG4gICAgICBNYXRoLnNxcnQoLTggKiBzdGFydElkeCArIDQgKiB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAtIDcpIC8gMiAtIDAuNSk7XG4gICAgY29uc3Qgc3RhcnRDb2wgPSBzdGFydElkeCAtIHZhbHVlc1swXS5sZW5ndGggKiBzdGFydFJvdyArIE1hdGguZmxvb3IoKHN0YXJ0Um93ICsgMSkgKiAoc3RhcnRSb3cgKyAyKSAvIDIpO1xuICAgIGxldCBtaSA9IHN0YXJ0Um93O1xuICAgIGxldCBtaiA9IHN0YXJ0Q29sO1xuICAgIHdoaWxlIChjbnQgPCBjaHVua1NpemUpIHtcbiAgICAgIC8vY29uc3QgdmFsdWUgPSBzZXExTGlzdFttaV0gJiYgc2VxMUxpc3RbbWpdID8gaGFtbWluZyhzZXExTGlzdFttaV0sIHNlcTFMaXN0W21qXSkgOiAwO1xuICAgICAgY29uc3QgZGlzdGFuY2VWYWx1ZXMgPSBkaXN0YW5jZUZucy5tYXAoKGZuLCBpZHgpID0+ICFpc05pbCh2YWx1ZXNbaWR4XVttaV0pICYmICFpc05pbCh2YWx1ZXNbaWR4XVttal0pID9cbiAgICAgICAgZm4odmFsdWVzW2lkeF1bbWldLCB2YWx1ZXNbaWR4XVttal0pIDogMSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRpc3RhbmNlVmFsdWVzLmxlbmd0aCA9PT0gMSA/IGRpc3RhbmNlVmFsdWVzWzBdIDogYWdncmVnYXRlKGRpc3RhbmNlVmFsdWVzKTtcbiAgICAgIGlmICgxIC0gdmFsdWUgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgIGkucHVzaChtaSk7XG4gICAgICAgIGoucHVzaChtaik7XG4gICAgICAgIGRpc3RhbmNlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNudCsrO1xuICAgICAgbWorKztcbiAgICAgIGlmIChtaiA9PT0gdmFsdWVzWzBdLmxlbmd0aCkge1xuICAgICAgICBtaSsrO1xuICAgICAgICBtaiA9IG1pICsgMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpQXJyYXkgPSBuZXcgSW50MzJBcnJheShpKTtcbiAgICBjb25zdCBqQXJyYXkgPSBuZXcgSW50MzJBcnJheShqKTtcbiAgICBjb25zdCBkaXN0YW5jZUFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShkaXN0YW5jZXMpO1xuICAgIHBvc3RNZXNzYWdlKHtpOiBpQXJyYXksIGo6IGpBcnJheSwgZGlzdGFuY2U6IGRpc3RhbmNlQXJyYXl9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHBvc3RNZXNzYWdlKHtlcnJvcjogZX0pO1xuICB9XG59O1xuIl19","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [36,413], () => (__webpack_require__(5023)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t23: 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","isNil","x","onmessage","async","event","values","startIdx","endIdx","threshold","fnNames","opts","aggregationMethod","weights","data","i","j","distances","chunkSize","aggregate","MANHATTAN","vs","reduce","acc","val","idx","sum","Math","sqrt","getAggregationFunction","forEach","v","colIdx","length","_data","_length","cnt","distanceFns","Array","fill","map","_","getMeasure","startRow","floor","startCol","mi","mj","distanceValues","fn","value","push","iArray","Int32Array","jArray","distanceArray","Float32Array","postMessage","distance","e","error","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","__webpack_exports__","O","result","chunkIds","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","r","d","definition","o","defineProperty","enumerable","get","f","chunkId","Promise","all","promises","u","g","globalThis","this","Function","window","obj","prop","prototype","hasOwnProperty","call","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","Error","replace","p","installedChunks","chunkLoadingGlobal","self","parentChunkLoadingFunction","bind","moreModules","runtime","pop","then"],"sourceRoot":""}
|
package/dist/231.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var bio;(()=>{"use strict";var e,n,t={9295:(e,n,t)=>{var r;!function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(r||(r={}));const a={[r.EUCLIDEAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `},[r.MANHATTAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `}};var i;!function(e){e.HAMMING="Hamming",e.EUCLIDEAN="Euclidean",e.MANHATTAN="Manhattan",e.TANIMOTO="Tanimoto",e.LEVENSTEIN="Levenshtein",e.NEEDLEMAN_WUNSCH="Needlemann-Wunsch",e.MONOMER_CHEMICAL_DISTANCE="Monomer chemical distance",e.SOKAL="Sokal",e.COSINE="Cosine",e.ASYMMETRIC="Asymmetric",e.Difference="Difference",e.OneHot="One-Hot"}(i||(i={}));const o={[i.HAMMING]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[i.EUCLIDEAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `},[i.MANHATTAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `},[i.TANIMOTO]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `},[i.LEVENSTEIN]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `},[i.NEEDLEMAN_WUNSCH]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${e+1}u>;\n var horizontalGaps: array<u32, ${e+1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${n};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${n};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${n}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n \n `},[i.MONOMER_CHEMICAL_DISTANCE]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${n}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[i.SOKAL]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `},[i.COSINE]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `},[i.ASYMMETRIC]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `},[i.Difference]:function(e,n){return`\n let range = suppInfo.range${n};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `},[i.OneHot]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `}},s={[i.HAMMING]:e=>Math.ceil(e/30),[i.EUCLIDEAN]:e=>Math.ceil(e/30),[i.MANHATTAN]:e=>Math.ceil(e/30),[i.TANIMOTO]:e=>Math.ceil(e/60),[i.SOKAL]:e=>Math.ceil(e/60),[i.COSINE]:e=>Math.ceil(e/60),[i.ASYMMETRIC]:e=>Math.ceil(e/60),[i.LEVENSTEIN]:e=>Math.ceil(e*e/60),[i.NEEDLEMAN_WUNSCH]:e=>Math.ceil(e*e/60),[i.MONOMER_CHEMICAL_DISTANCE]:e=>Math.ceil(e/25),[i.Difference]:e=>1,[i.OneHot]:e=>Math.ceil(e/40)},u={STRING:new Set([i.HAMMING,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.MONOMER_CHEMICAL_DISTANCE,i.OneHot]),UINT32ARRAY:new Set([i.HAMMING,i.EUCLIDEAN,i.MANHATTAN,i.MONOMER_CHEMICAL_DISTANCE,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC,i.OneHot,i.Difference]),INT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.OneHot,i.Difference]),FLOAT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),NUMBER:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),BITARRAY:new Set([i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC])};var l=function(e,n,t,r){return new(t||(t=Promise))((function(a,i){function o(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var n;e.done?a(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(o,s)}u((r=r.apply(e,n||[])).next())}))};let f=null,c=null;function d(){return l(this,void 0,void 0,(function*(){if(!f&&(f=yield navigator.gpu.requestAdapter({powerPreference:"high-performance"}),null==f))return null;let e=!1;if(c&&(c.lost.then((()=>{e=!0})),yield new Promise((e=>setTimeout(e,10)))),!c||e){const e=1e9,n=f.limits,t=n.maxBufferSize,r=n.maxStorageBufferBindingSize;try{return c=yield f.requestDevice({requiredLimits:{maxBufferSize:Math.min(t,e),maxStorageBufferBindingSize:Math.min(r,e)}}),c}catch(e){return console.error("Failed to create device with required limits",e),c=yield f.requestDevice(),c}}return c}))}var p=function(e,n,t,r){return new(t||(t=Promise))((function(a,i){function o(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var n;e.done?a(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(o,s)}u((r=r.apply(e,n||[])).next())}))};function m(e,n,t,r){return e.map(((e,r)=>`\n fn distanceScript${r}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${r}[aIndex];\n let b = computeInfo.data${r}[bIndex];\n let maxDistance: f32 = ${t};\n ${o[e](n[r],r)}\n }\n `)).join("\n")+"\n"+`\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${e.length}>;\n ${e.map(((e,n)=>`distances[${n}] = distanceScript${n}(aIndex, bIndex);`)).join("\n")}\n ${a[r](e.length)}\n }\n \n `}var h=t(2590);async function g(e,n,t){const r=e.length,a=[],i=[];for(let o=0;o<r;o++)for(let s=o+1;s<r;s++){const r=e[o],u=e[s];n[r]?.[u]>=t&&(a.push(o),i.push(s))}return function(e,n,t){const r=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),a=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),i=new Float32Array(t.length).fill(0),o=new Float32Array(t.length).fill(0);for(let s=0;s<100;s++){const u=1-s/100;i.fill(0),o.fill(0);for(let t=0;t<e.length;t++){const s=e[t],l=n[t],f=r[s]-r[l],c=a[s]-a[l];Math.abs(f)>=1&&(i[s]-=u*f,i[l]+=u*f),Math.abs(c)>=1&&(o[s]-=u*c,o[l]+=u*c)}for(let e=0;e<t.length;e++){const n=Math.sqrt(i[e]*i[e]+o[e]*o[e]);n>0&&(r[e]+=i[e]/n*u,a[e]+=o[e]/n*u)}}let s=r[0],u=a[0],l=r[0],f=a[0];for(let e=1;e<t.length;e++)s=Math.min(s,r[e]),u=Math.min(u,a[e]),l=Math.max(l,r[e]),f=Math.max(f,a[e]);let c=l-s,d=f-u;0===c&&(c=l);for(let e=0;e<t.length;e++)r[e]=(r[e]-s)/c/2+.5;0===d&&(d=f);for(let e=0;e<t.length;e++)a[e]=(a[e]-u)/d/2+.5;return{embedX:r,embedY:a}}(a,i,e)}var y=function(e,n,t,r){return new(t||(t=Promise))((function(a,i){function o(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var n;e.done?a(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(o,s)}u((r=r.apply(e,n||[])).next())}))};function A(e,n,t,r){return y(this,void 0,void 0,(function*(){const a=r,i=Math.ceil(a/100),o=Math.ceil(Math.sqrt(i)),s=10*o,u=e.createShaderModule({label:"colwise-normalize",code:`\n @group(0) @binding(0) var<storage, read_write> knnSimilarities : array<f32>;\n @group(0) @binding(1) var<storage, read> offsets : array<u32>;\n @compute @workgroup_size(10, 10) fn normalize(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let row = id.x;\n let col = id.y;\n let index = row * ${s} + col;\n if (index >= ${r}) {\n return;\n }\n let offsetBegin = offsets[index];\n let offsetEnd = offsets[index + 1];\n var sum = 0.0;\n if (offsetEnd - offsetBegin == 0) {\n return;\n }\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n sum = sum + knnSimilarities[i];\n }\n if (sum > 0.0) {\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n knnSimilarities[i] = knnSimilarities[i] / sum;\n }\n }\n }\n \n `}),l=e.createComputePipeline({label:"hamming compute pipeline",layout:"auto",compute:{module:u,entryPoint:"normalize"}}),f=e.createBuffer({label:"simmilarities info buffer",size:n.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Float32Array(f.getMappedRange()).set(n),f.unmap();const c=e.createBuffer({label:"offsets info buffer",size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(c.getMappedRange()).set(t),c.unmap();const d=e.createBindGroup({layout:l.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:f}},{binding:1,resource:{buffer:c}}]}),p=e.createCommandEncoder(),m=p.beginComputePass();m.setPipeline(l),m.setBindGroup(0,d),m.dispatchWorkgroups(o,o),m.end();const h=e.createBuffer({label:"out similarity buffer",size:n.byteLength,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});p.copyBufferToBuffer(f,0,h,0,n.byteLength),e.queue.submit([p.finish()]),yield e.queue.onSubmittedWorkDone(),yield h.mapAsync(GPUMapMode.READ);const g=new Float32Array(h.getMappedRange());n.set(g),h.unmap(),f.destroy(),c.destroy(),h.destroy()}))}var b=function(e,n,t,r){return new(t||(t=Promise))((function(a,i){function o(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var n;e.done?a(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(o,s)}u((r=r.apply(e,n||[])).next())}))};function w(e,n=2){for(let t=0;t<e.length;t++)e[t]=Math.pow(e[t],n)}function x(e,n,t,r,a){return b(this,void 0,void 0,(function*(){const i=9e4,o=Math.ceil(900),s=Math.ceil(Math.sqrt(o)),u=10*s,l=Math.floor(Math.max(Math.log10(a),2))+1,f=Math.pow(10,-l),c=new Float32Array(n.length),d=e.createShaderModule({label:"expand",code:`\n struct SparseKNN {\n knnSimilarities: array<f32, ${n.length}>,\n knnIndexes: array<u32, ${t.length}>,\n offsets: array<u32, ${r.length}>,\n rowIndexes: array<u32, ${t.length}>,\n }\n\n @group(0) @binding(0) var<storage, read_write> sparseKNN: SparseKNN;\n @group(0) @binding(1) var<storage, read_write> resultSimBlock: array<f32, 90000>;\n @group(0) @binding(2) var<storage, read_write> startAt: u32;\n @compute @workgroup_size(10, 10) fn expand(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col = id.x;\n let row = id.y;\n let index = row * ${u} + col;\n if (index >= 90000) {\n return;\n }\n let workingIndex = index + startAt;\n if (workingIndex >= ${t.length}) {\n return;\n }\n \n let rowIdx = sparseKNN.rowIndexes[workingIndex];\n let colIdx = sparseKNN.knnIndexes[workingIndex];\n let offsetBeginRow = sparseKNN.offsets[rowIdx];\n let offsetEndRow = sparseKNN.offsets[rowIdx + 1];\n let offsetBeginCol = sparseKNN.offsets[colIdx];\n let offsetEndCol = sparseKNN.offsets[colIdx + 1];\n var sum = 0.0;\n for (var i = offsetBeginRow; i < offsetEndRow; i = i + 1) {\n for(var j = offsetBeginCol; j < offsetEndCol; j = j + 1) {\n if (sparseKNN.knnIndexes[i] == sparseKNN.knnIndexes[j]) {\n sum = sum + sparseKNN.knnSimilarities[i] * sparseKNN.knnSimilarities[j];\n break;\n }\n }\n }\n if (sum > ${f}) {\n resultSimBlock[index] = sum;\n } else {\n resultSimBlock[index] = 0.0;\n }\n }\n `}),p=e.createComputePipeline({label:"expand compute pipeline",layout:"auto",compute:{module:d,entryPoint:"expand"}});let m=4*(n.length+t.length+r.length+t.length);const h=15&m;0!==h&&(m+=16-h);const g=e.createBuffer({label:"sparse knn buffer",size:m,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),y=g.getMappedRange();new Float32Array(y,0,n.length).set(n),new Uint32Array(y,4*n.length,t.length).set(t),new Uint32Array(y,4*(n.length+t.length),r.length).set(r);const A=function(e){const n=new Uint32Array(e[e.length-1]);for(let t=0;t<e.length-1;t++)for(let r=e[t];r<e[t+1];r++)n[r]=t;return n}(r);new Uint32Array(y,4*(n.length+t.length+r.length),A.length).set(A),g.unmap();const b=e.createBuffer({label:"start end buffer",size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(b.getMappedRange()).set([0]),b.unmap();const w=e.createBuffer({label:"result block buffer",size:36e4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),x=e.createBindGroup({layout:p.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:g}},{binding:1,resource:{buffer:w}},{binding:2,resource:{buffer:b}}]}),E=e.createBuffer({label:"out block buffer",size:w.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let n=0;n<Math.ceil(t.length/i);n++){const r=n*i,a=Math.min(i,t.length-r);e.queue.writeBuffer(b,0,new Uint32Array([r]));const o=e.createCommandEncoder({label:"expand encoder"}),u=o.beginComputePass({label:"expand compute pass"});u.setPipeline(p),u.setBindGroup(0,x),u.dispatchWorkgroups(s,s),u.end(),o.copyBufferToBuffer(w,0,E,0,E.size),e.queue.submit([o.finish()]),yield e.queue.onSubmittedWorkDone(),yield E.mapAsync(GPUMapMode.READ);const l=new Float32Array(E.getMappedRange(),0,a);c.set(l,r),E.unmap()}return g.destroy(),b.destroy(),w.destroy(),E.destroy(),{KNNIndexes:t,KNNSimilarities:c,indexOffsets:r}}))}function E(e,n){const t=function(e,n){const t=new Uint32Array(n);for(let n=0;n<e.i.length;n++)t[e.i[n]]++,t[e.j[n]]++;for(let e=0;e<n;e++)t[e]++;return t}(e,n),r=function(e){const n=new Uint32Array(e.length+1);let t=0;for(let r=0;r<e.length;r++)n[r]=t,t+=e[r];return n[e.length]=t,n}(t),a=new Uint32Array(n).fill(1),i=new Uint32Array(2*e.i.length+n),o=new Float32Array(2*e.i.length+n);for(let e=0;e<n;e++)i[r[e]]=e,o[r[e]]=1;for(let n=0;n<e.i.length;n++){const t=e.i[n],s=e.j[n],u=1-e.distance[n];i[r[t]+a[t]]=s,o[r[t]+a[t]]=u,a[t]++,i[r[s]+a[s]]=t,o[r[s]+a[s]]=u,a[s]++}return{KNNIndexes:i,KNNSimilarities:o,indexOffsets:r}}Object.prototype.toString;const I={expandFactor:2,maxIterations:5,inflateFactor:2,multFactor:1};class M{constructor(e={}){this._options={...I,...e}}async transform(e,n){let t=this.toObjectForm(e);if(this._options.maxIterations>0){this.addLoops(t,n),this.normalize(t);for(let e=0;e<this._options.maxIterations;e++)t=this.expand(t,n),this.inflate(t),this.normalize(t)}const{clusters:r,is:a,js:i}=this.assignClusters(t,n);this.correctClusters(r);const o=await this.layout(r,t,n);return{clusters:r,embedX:o.embedX,embedY:o.embedY,is:a,js:i}}async transformWebGPU(e,n){if(0===this._options.maxIterations)return this.transform(e,n);const t=await function(e,n,t=5,r=2){return a=this,i=void 0,s=function*(){const a=yield d();if(!a)throw new Error("no gpu device found");const i=E(e,n);yield A(a,i.KNNSimilarities,i.indexOffsets,n);let o=i;for(let e=0;e<t;e++){const e=yield x(a,o.KNNSimilarities,o.KNNIndexes,o.indexOffsets,n);w(e.KNNSimilarities,r),yield A(a,e.KNNSimilarities,e.indexOffsets,n),o=e}return o},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{u(s.next(e))}catch(e){n(e)}}function r(e){try{u(s.throw(e))}catch(e){n(e)}}function u(n){var a;n.done?e(n.value):(a=n.value,a instanceof o?a:new o((function(e){e(a)}))).then(t,r)}u((s=s.apply(a,i||[])).next())}));var a,i,o,s}(e,n,this._options.maxIterations,this._options.inflateFactor),r=this.csrToSparseObject(t,n),{clusters:a,is:i,js:o}=this.assignClusters(r,n);this.correctClusters(a);const s=await this.layout(a,r,n);return{clusters:a,embedX:s.embedX,embedY:s.embedY,is:i,js:o}}correctClusters(e){const n={};for(const t of e)n[t]||(n[t]=0),n[t]++;const t=Object.keys(n).map(Number).sort(((e,t)=>n[e]-n[t])),r={};t.forEach(((e,n)=>r[e]=n+1));for(let n=0;n<e.length;n++)e[n]=r[e[n]]}csrToSparseObject(e,n){const t=Math.floor(Math.max(Math.log10(n),2))+1,r=1/Math.pow(10,t),a={};for(let t=0;t<n;t++){a[t]={};for(let n=e.indexOffsets[t];n<e.indexOffsets[t+1];n++){const i=e.KNNIndexes[n];i<=t||e.KNNSimilarities[n]<r||(a[t][i]=e.KNNSimilarities[n])}}return a}async layout(e,n,t){const r=new Float32Array(t).fill(0),a=new Float32Array(t).fill(0),i={};e.forEach(((e,n)=>{i[e]||(i[e]=[]),i[e].push(n)}));let o=0;const s=Object.keys(i);s.sort(((e,n)=>i[n].length-i[e].length));let u=6,l=0;for(const e of s){const t=i[e],s=await g(t,n,.001);o===Math.ceil(u/1.5)&&(o=0,l+=5/u,u=Math.ceil(1.5*u));const f=o%u*5/u*1.5;for(let e=0;e<s.embedX.length;e++)r[t[e]]=5*s.embedX[e]/u+f,a[t[e]]=5*s.embedY[e]/u+l;o++}return{embedX:r,embedY:a}}mergeClusters(e,n,t){const r=e[n],a=e[t];for(let n=0;n<e.length;n++)e[n]===a&&(e[n]=r)}assignClusters(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=Math.pow(10,i),s=new Array(n).fill(-1);for(const n of Object.keys(e))for(const i of Object.keys(e[n]))Math.round(e[n][i]*o)/o>0&&e[n][i]!==Number(n)&&Number(i)>Number(n)&&(r.push(Number(n)),a.push(Number(i)),-1!==s[Number(n)]&&-1!==s[Number(i)]?s[Number(n)]!==s[Number(i)]&&this.mergeClusters(s,Number(n),Number(i)):-1!==s[Number(n)]?s[Number(i)]=s[Number(n)]:-1!==s[Number(i)]?s[Number(n)]=s[Number(i)]:(t++,s[Number(n)]=t,s[Number(i)]=t));for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a)}}assignClustersCSR(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=1/Math.pow(10,i),s=new Array(n).fill(-1),u=new Uint32Array(n+1);let l=0;u[0]=0;for(let i=0;i<n;i++){for(let n=e.indexOffsets[i];n<e.indexOffsets[i+1];n++){const u=e.KNNIndexes[n];u<=i||e.KNNSimilarities[n]<=o||(r.push(i),a.push(u),l++,-1!==s[i]&&-1!==s[u]?s[i]!==s[u]&&this.mergeClusters(s,i,u):-1!==s[i]?s[u]=s[i]:-1!==s[u]?s[i]=s[u]:(t++,s[i]=t,s[u]=t))}u[i+1]=l}for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a),correctedOffsets:u}}toObjectForm(e){const n={};for(let t=0;t<e.i.length;t++)n[e.i[t]]||(n[e.i[t]]={}),n[e.i[t]][e.j[t]]=1-e.distance[t],n[e.j[t]]||(n[e.j[t]]={}),n[e.j[t]][e.i[t]]=1-e.distance[t];return n}addLoops(e,n){for(let t=0;t<n;t++)e[t]||(e[t]={}),e[t][t]=this._options.multFactor}normalize(e){for(const n of Object.keys(e)){const t=e[n];let r=0;for(const e of Object.keys(t))r+=t[e];if(0!==r)for(const a of Object.keys(t))e[n][a]/=r}}expand(e,n){const t={},r=Math.floor(Math.max(Math.log10(n),2))+1,a=Math.pow(10,r);for(let r=0;r<n;r++)if(e[r]){t[r]??(t[r]={});for(let i=r;i<n;i++){if(!e[r]?.[i])continue;const n=this.getExpandValue(e,r,i);Math.round(n*a)/a>0&&(t[r][i]=n,t[i]||(t[i]={}),t[i][r]=n)}}return t}inflate(e){for(const n of Object.keys(e)){const t=e[n];for(const r of Object.keys(t))e[n][r]=Math.pow(e[n][r],this._options.inflateFactor)}}getExpandValue(e,n,t){let r=0;const a=Object.keys(e[n]??{}),i=Object.keys(e[t]??{});for(const o of a)i.includes(o)&&(r+=e[n][o]*e[t][o]);return r}}onmessage=async e=>{const{data:n,threshold:t,weights:a,aggregationMethod:o,distanceFnArgs:l,distanceFns:f,maxIterations:c,useWebGPU:g,inflate:y}=e.data;console.time("sparse matrix");let A=null;if(g)try{A=await function(e,n=.8,t,a,o,l){return p(this,void 0,void 0,(function*(){const f=yield d();if(!f)return null;const c=Object.values(i);if(t.some((e=>!c.includes(e))))throw new Error("Invalid distance metrics provided: "+t.join(", "));if(!Object.values(r).includes(a))throw new Error("Invalid aggregation function provided: "+a);const p=1-n;if(l.length!==e.length||l.length!==t.length||l.length!==o.length)throw new Error("Options, weigths and distance functions must be provided for each column");if(e.some((n=>n.length!==e[0].length)))throw new Error("All entry lists must be the same length");const h=e.length,g=e[0].length,y=e.map(((e,n)=>function(e,n=i.HAMMING,t,r={gapOpenPenalty:1,gapExtensionPenalty:.6}){var a,o;let l=null;const f=e.some((e=>"string"==typeof e))?(l="STRING",e.map((e=>new Uint32Array(e.split("").map((e=>e.charCodeAt(0))))))):e.some((e=>"number"==typeof e))?(l="NUMBER",e.map((e=>new Float32Array([e])))):"object"==typeof e[0]&&e.some((e=>"_data"in e&&"_length"in e))?(l="BITARRAY",e.map((e=>e._data))):e.some((e=>e instanceof Float32Array))?(l="FLOAT32ARRAY",e):e.some((e=>e instanceof Uint32Array))?(l="UINT32ARRAY",e):e.some((e=>e instanceof Int32Array))?(l="INT32ARRAY",e):void 0;if(!f||!l)throw new Error("Invalid entry type, could not determine entry type from input list");const c=f[0]instanceof Int32Array?"INT32ARRAY":f[0]instanceof Float32Array?"FLOAT32ARRAY":"UINT32ARRAY",d=new Uint32Array(f.map((e=>e.length)));if(!u[l]||!u[l].has(n))throw new Error(`Distance metric '${n}' not supported for entry type '${l}'`);const p=d.reduce(((e,n)=>Math.max(e,n)),0),m=s[n](p),h="INT32ARRAY"===c?Int32Array:"FLOAT32ARRAY"===c?Float32Array:Uint32Array,g=new h(f.length*p);f.forEach(((e,n)=>{g.set(e,n*p)}));let y="",A=0,b="FLOAT32ARRAY",w=null;if(n===i.NEEDLEMAN_WUNSCH||n===i.MONOMER_CHEMICAL_DISTANCE){let e=r.scoringMatrix&&r.alphabetIndexes?Object.keys(r.alphabetIndexes).reduce(((e,n)=>Math.max(e,n.charCodeAt(0))),0):-1;if(!r.alphabetIndexes||!r.scoringMatrix){for(let n=0;n<g.length;n++)g[n]>e&&(e=g[n]);r.scoringMatrix=new Array(e+1).fill(null).map((()=>new Array(e+1).fill(0))),r.alphabetIndexes={};for(let e=0;e<r.scoringMatrix.length;e++)r.scoringMatrix[e][e]=1,r.alphabetIndexes[String.fromCharCode(e)]=e}const n=(e+1)*(e+1),i=new Array(e+1).fill(null).map((()=>new Float32Array(e+1)));for(let n=0;n<e+1;n++)i[n][n]=1;const s=r.alphabetIndexes;for(const e of Object.keys(s))for(const n of Object.keys(s))e!==n&&(i[e.charCodeAt(0)][n.charCodeAt(0)]=r.scoringMatrix[s[e]][s[n]]);A=2+n,b="FLOAT32ARRAY",w=new Float32Array(A),w[0]=null!==(a=r.gapOpenPenalty)&&void 0!==a?a:1,w[1]=null!==(o=r.gapExtensionPenalty)&&void 0!==o?o:.6;let u=2;for(let e=0;e<i.length;e++)w.set(i[e],u),u+=i[e].length;y=`\n gapOpenPenalty${t}: f32,\n gapExtensionPenalty${t}: f32,\n similarityMatrix${t}: array<array<f32, ${e+1}>, ${e+1}>`}else if(n===i.Difference){if(!r.range||"number"!=typeof r.range||r.range<=0){const e=g.reduce(((e,n)=>Math.min(e,n)),g[0]),n=g.reduce(((e,n)=>Math.max(e,n)),g[0]);r.range=n-e}r.range<=0&&(r.range=1),A=1,b="FLOAT32ARRAY",w=new Float32Array([r.range]),y=`\n range${t}: f32`}const x=g instanceof Int32Array?"i32":g instanceof Float32Array?"f32":"u32",E=`data${t}: array<array<${x}, ${p}>, ${f.length}>`;return{flatSourceArray:g,sourceArraySize:g.length,maxEntryLen:p,arraySizes:d,complexity:m,suppInfoBuffer:w,suppInfoSize:A,suppInfoType:b,suppInfoStructWgsl:y,entryType:l,dataTypeWGSL:x,dataStructWgsl:E,EncodedArrayConstructor:h}}(e,t[n],n,l[n])));if(0===h)throw new Error("No columns provided. Please provide at least one column of data.");1===h&&(a=r.MANHATTAN);let A=y.map((e=>e.suppInfoStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),b=!1;A&&""!=A.trim()||(b=!0,A="\ndummy: f32\n");const w=y.map((e=>e.dataStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),x=new Uint32Array(h*g);y.forEach(((e,n)=>{x.set(e.arraySizes,n*g)}));const E=1e4,I=100,M=y.reduce(((e,n)=>e+n.complexity),0),N=Math.ceil(1e4/M),v=Math.ceil(Math.sqrt(Math.ceil(100))),B=10*v,S=g*(g-1)/2,U=Math.ceil(S/E),C=f.createShaderModule({label:"Sparse matrix compute shader",code:`\n // each thread will perform 100 iterations at one time, comparing 100 pairs of entries.\n // in total, each thread will perform at most ${U} comparisons.\n // first is the result struct, containing is, js, and distances. each array with length of 100,\n // and also integer for how many pairs were found to be below threshold.\n struct SparseResult {\n i: array<array<u32, 100>, 10000>,\n j: array<array<u32, 100>, 10000>,\n distances: array<array<f32, 100>, 10000>,\n found: array<u32, 10000>,\n done: array<u32, 10000>\n }\n // struct for the data\n struct ComputeInfo {\n // start at cols and rows, and end at cols and rows for each thread, these will be calculated on cpu and passed to gpu.\n startAtCols: array<u32, 10000>,\n startAtRows: array<u32, 10000>,\n endAtCols: array<u32, 10000>,\n endAtRows: array<u32, 10000>,\n\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${g}>, ${h}>,\n // the weights for each entry\n weights: array<f32, ${h}>,\n // the data for each entry\n ${w} // an example of the dataWgsl would be:\n //data0: array<array<u32,20>,100>,\n //data1: array<array<u32,20>,100>\n }\n\n // struct for the supplementary information\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${A}\n };\n\n @group(0) @binding(0) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(1) var<storage, read_write> suppInfo: SuppInfo;\n @group(0) @binding(2) var<storage, read_write> results: SparseResult;\n @compute @workgroup_size(10, 10) fn calcSparseMatrix(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${b?"let otherDummy = suppInfo.dummy * 2;":""} // just to make sure that the suppInfo is not optimized out\n let threadCol = id.x;\n let threadRow = id.y;\n let linearIndex = threadRow * ${B} + threadCol;\n if (linearIndex >= 10000) {\n return; // if we are out of bounds, return\n } \n var startAtCol: u32 = computeInfo.startAtCols[linearIndex];\n var startAtRow: u32 = computeInfo.startAtRows[linearIndex];\n let endAtCol: u32 = min(computeInfo.endAtCols[linearIndex], ${g}u);\n let endAtRow: u32 = min(computeInfo.endAtRows[linearIndex], ${g}u);\n let is = &results.i[linearIndex];\n let js = &results.j[linearIndex];\n let distances = &results.distances[linearIndex];\n results.found[linearIndex] = 0; // initialize the found counter\n var found: u32 = 0;\n if (results.done[linearIndex] > 0) {\n return; // if we are done, return\n }\n for (var i = 0; i < ${N}; i++) {\n if (startAtCol >= endAtCol && startAtRow >= endAtRow) {\n results.done[linearIndex] = 1;\n break;\n }\n if (found >= 100) {\n break;\n }\n let dist = combinedDistance(startAtCol, startAtRow);\n if (dist <= ${p}) {\n (*is)[found] = startAtCol;\n (*js)[found] = startAtRow;\n (*distances)[found] = dist;\n found = found + 1;\n }\n startAtCol = startAtCol + 1;\n if (startAtCol >= ${g}u) {\n startAtRow += 1;\n startAtCol = startAtRow + 1;\n }\n }\n results.found[linearIndex] = found;\n // update the startAtCols and startAtRows\n computeInfo.startAtCols[linearIndex] = startAtCol;\n computeInfo.startAtRows[linearIndex] = startAtRow;\n\n }\n\n // this will generate the distance script for each distance metric and then combine them into one\n ${m(t,y.map((e=>e.maxEntryLen)),p,a)}\n\n\n `}),O=f.createComputePipeline({label:"sparse matrix compute pipeline",layout:"auto",compute:{module:C,entryPoint:"calcSparseMatrix"}}),L=new Uint32Array(E),P=new Uint32Array(E),R=new Uint32Array(E),T=new Uint32Array(E),_=Math.floor(S/E);let j=0,$=1;console.time("GPUthreadStarts");for(let e=0;e<E;e++){const n=9999===e?S-1:(e+1)*_,t=g-2-Math.floor(Math.sqrt(-8*n+4*g*(g-1)-7)/2-.5),r=n-g*t+Math.floor((t+1)*(t+2)/2);L[e]=$,P[e]=j,R[e]=r,T[e]=t,j=t,$=r}console.timeEnd("GPUthreadStarts");const G=4e4+g*h+h+y.reduce(((e,n)=>e+n.sourceArraySize),0),D=y.reduce(((e,n)=>e+n.suppInfoSize),0),z=1e6,k=G*Uint32Array.BYTES_PER_ELEMENT;let Y=k;const F=15&k;0!==F&&(Y+=16-F);const H=f.createBuffer({label:"compute info buffer",size:Y,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),K=H.getMappedRange();let W=0;new Uint32Array(K,W,E).set(L),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(P),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(R),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(T),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,x.length).set(x),W+=x.length*Uint32Array.BYTES_PER_ELEMENT,new Float32Array(K,W,h).set(o),W+=h*Float32Array.BYTES_PER_ELEMENT;for(const e of y){const n=e.EncodedArrayConstructor,t=e.sourceArraySize;new n(K,W,t).set(e.flatSourceArray),W+=t*n.BYTES_PER_ELEMENT}H.unmap();const q=D*Uint32Array.BYTES_PER_ELEMENT;let X=q;const V=15&q;0!==V&&(X+=16-V),X=Math.max(X,16);const Z=f.createBuffer({label:"supp info buffer",size:X,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),J=Z.getMappedRange();let Q=0;for(const e of y)e.suppInfoBuffer&&e.suppInfoBuffer.byteLength>0&&e.suppInfoSize>0&&(new("UINT32ARRAY"===e.suppInfoType?Uint32Array:Float32Array)(J,Q,e.suppInfoBuffer.length).set(e.suppInfoBuffer),Q+=e.suppInfoBuffer.byteLength);0===Q&&new Uint32Array(J,0,4).set([1,1,1,1]),Z.unmap();const ee=302e4*Uint32Array.BYTES_PER_ELEMENT;let ne=ee;const te=15ⅇ0!==te&&(ne+=16-te);const re=f.createBuffer({label:"results buffer",size:ne,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),ae=f.createBindGroup({label:"bindGroup for sparse matrix buffer",layout:O.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:H}},{binding:1,resource:{buffer:Z}},{binding:2,resource:{buffer:re}}]}),ie=f.createBuffer({label:"results out buffer",size:re.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),oe=[],se=[],ue=[];let le=!1;for(;!le;){const e=f.createCommandEncoder({label:"distance encoder"}),n=e.beginComputePass({label:"distance compute pass"});n.setPipeline(O),n.setBindGroup(0,ae),n.dispatchWorkgroups(v,v),n.end(),e.copyBufferToBuffer(re,0,ie,0,ie.size);const t=e.finish();f.queue.submit([t]),yield f.queue.onSubmittedWorkDone(),yield ie.mapAsync(GPUMapMode.READ);const r=ie.getMappedRange();let a=0;const i=new Uint32Array(r,a,z);a+=z*Uint32Array.BYTES_PER_ELEMENT;const o=new Uint32Array(r,a,z);a+=z*Uint32Array.BYTES_PER_ELEMENT;const s=new Float32Array(r,a,z);a+=z*Float32Array.BYTES_PER_ELEMENT;const u=new Uint32Array(r,a,E);a+=E*Uint32Array.BYTES_PER_ELEMENT,le=new Uint32Array(r,a,E).every((e=>1===e));const l=u.reduce(((e,n)=>e+n),0),c=new Uint32Array(l),d=new Uint32Array(l),p=new Float32Array(l);let m=0;for(let e=0;e<u.length;e++){const n=u[e];0!==n&&(c.set(i.subarray(e*I,e*I+n),m),d.set(o.subarray(e*I,e*I+n),m),p.set(s.subarray(e*I,e*I+n),m),m+=n)}oe.push(c),se.push(d),ue.push(p),ie.unmap()}const fe=oe.reduce(((e,n)=>e+n.length),0),ce=new Uint32Array(fe),de=new Uint32Array(fe),pe=new Float32Array(fe);let me=0;for(let e=0;e<oe.length;e++)ce.set(oe[e],me),de.set(se[e],me),pe.set(ue[e],me),me+=oe[e].length;return H.destroy(),Z.destroy(),re.destroy(),ie.destroy(),{i:ce,j:de,distance:pe}}))}(n,t/100,f,o,a,l)}catch(e){console.error(e)}A||(g&&console.error("WEBGPU sparse matrix calculation failed, falling back to CPU implementation"),A=await(new h._).calcMultiColumn(n,f,t/100,l,a,o)),console.timeEnd("sparse matrix");const b=new M({maxIterations:c??5,inflateFactor:y??2});console.time("MCL");let w=null;if(g)try{w=await b.transformWebGPU(A,n[0].length)}catch(e){console.error("webGPU MCL failed, falling back to CPU implementation"),console.error(e)}w||(w=await b.transform(A,n[0].length)),console.timeEnd("MCL"),postMessage({res:w})}},6814:(e,n,t)=>{t.d(n,{cZ:()=>a,kK:()=>r}),t(7862);const r=e=>null==e;function a(e,n,t,r){if(t>e[e.length-1])return;const a=e.findIndex((e=>t<e));e.pop(),e.splice(a,0,t),n.pop(),n.splice(a,0,r)}}},r={};function a(e){var n=r[e];if(void 0!==n)return n.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,a),i.exports}a.m=t,a.x=()=>{var e=a.O(void 0,[590],(()=>a(9295)));return a.O(e)},e=[],a.O=(n,t,r,i)=>{if(!t){var o=1/0;for(f=0;f<e.length;f++){for(var[t,r,i]=e[f],s=!0,u=0;u<t.length;u++)(!1&i||o>=i)&&Object.keys(a.O).every((e=>a.O[e](t[u])))?t.splice(u--,1):(s=!1,i<o&&(o=i));if(s){e.splice(f--,1);var l=r();void 0!==l&&(n=l)}}return n}i=i||0;for(var f=e.length;f>0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[t,r,i]},a.d=(e,n)=>{for(var t in n)a.o(n,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((n,t)=>(a.f[t](e,n),n)),[])),a.u=e=>e+".js",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var n=a.g.document;if(!e&&n&&(n.currentScript&&(e=n.currentScript.src),!e)){var t=n.getElementsByTagName("script");if(t.length)for(var r=t.length-1;r>-1&&!e;)e=t[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{a.b=self.location+"";var e={231:1};a.f.i=(n,t)=>{e[n]||importScripts(a.p+a.u(n))};var n=self.webpackChunkbio=self.webpackChunkbio||[],t=n.push.bind(n);n.push=n=>{var[r,i,o]=n;for(var s in i)a.o(i,s)&&(a.m[s]=i[s]);for(o&&o(a);r.length;)e[r.pop()]=1;t(n)}})(),n=a.x,a.x=()=>a.e(590).then(n);var i=a.x();bio=i})();
|
|
2
|
-
//# sourceMappingURL=231.js.map
|