@datagrok/eda 1.2.7 → 1.2.8
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/dist/731.js +1 -1
- package/dist/731.js.map +1 -1
- package/dist/980.js +1 -1
- package/dist/980.js.map +1 -1
- package/dist/package.js.map +1 -1
- package/package.json +2 -2
package/dist/731.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkeda=self.webpackChunkeda||[]).push([[731],{5731:(e,n,t)=>{t.d(n,{p:()=>a});var r=t(6066),s=t(606);class a{constructor(){this._workerCount=Math.max(navigator.hardwareConcurrency-2,1)}async calcMultiColumn(e,n,s,a=[{}],o=[1],l=r.G.EUCLIDEAN){const h=e[0].length*(e[0].length-1)/2,i=Math.floor(h/this._workerCount),c=e[0].length>2e4?await this.getMinimalThreshold(e,n,a,o,l):0;s<c&&(console.log(`using threshold ${c}`),s=c),a.forEach(((e,n)=>a[n].threshold=s));const w=new Array(this._workerCount),g=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(111),t.b))));for(let t=0;t<this._workerCount;t++)w[t]=new Promise(((r,c)=>{const w=t*i,u=t===this._workerCount-1?h:(t+1)*i;u<=w&&r({i:new Int32Array(0),j:new Int32Array(0),distance:new Float32Array(0),idx:t}),g[t].postMessage({values:e,startIdx:w,endIdx:u,threshold:s,fnNames:n,opts:a,weights:o,aggregationMethod:l}),g[t].onmessage=({data:{error:e,i:n,j:s,distance:a}})=>{e?(g[t].terminate(),c(e)):(g[t].terminate(),r({i:n,j:s,distance:a,idx:t}))}}));const u=await Promise.all(w),d=u.reduce(((e,n)=>e+n.i.length),0),k=new Int32Array(d),m=new Int32Array(d),f=new Float32Array(d);let y=0;for(const e of u)k.set(e.i,y),m.set(e.j,y),f.set(e.distance,y),y+=e.i.length;return{i:k,j:m,distance:f}}async calc(e,n,t,r={}){return await this.calcMultiColumn([e],[n],t,[r],[1])}async getKNN(e,n,t=15,r={}){return await this.multiColumnKNN([e],[n],t,[r],[1])}async getThresholdKNN(e,n,t=.8,r={}){return await this.multiColumnThresholdKnn([e],[n],t,[r],[1])}async multiColumnThresholdKnn(e,n,s=.8,a,o,l=r.G.EUCLIDEAN){if(e.length!==n.length||e.length!==a.length||e.length!==o.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const h=e[0].length*(e[0].length-1)/2,i=Math.floor(h/this._workerCount),c=new Array(this._workerCount),w=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(603),t.b))));for(let t=0;t<this._workerCount;t++)c[t]=new Promise(((r,c)=>{const g=t*i,u=t===this._workerCount-1?h:(t+1)*i;u<=g&&r({knnDistances:new Array(0),knnIndexes:new Array(0)}),w[t].postMessage({values:e,startIdx:g,endIdx:u,fnNames:n,opts:a,threshold:s,weights:o,aggregationMethod:l}),w[t].onmessage=({data:{error:e,knnDistances:n,knnIndexes:s}})=>{e?(w[t].terminate(),c(e)):(w[t].terminate(),r({knnDistances:n,knnIndexes:s}))}}));const g=await Promise.all(c),u=new Int32Array(e[0].length);for(const n of g)for(let t=0;t<e[0].length;++t)u[t]+=n.knnIndexes[t]?.length??0;const d={knnDistances:new Array(e[0].length).fill(null).map(((e,n)=>new Array(u[n]))),knnIndexes:new Array(e[0].length).fill(null).map(((e,n)=>new Array(u[n])))};for(const n of g)for(let t=0;t<e[0].length;++t)for(let e=0;e<n.knnDistances[t]?.length;++e)d.knnDistances[t][u[t]-1]=n.knnDistances[t][e],d.knnIndexes[t][u[t]-1]=n.knnIndexes[t][e],u[t]-=1;return d}async multiColumnKNN(e,n,a=15,o,l,h=r.G.EUCLIDEAN){if(e.length!==n.length||e.length!==o.length||e.length!==l.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const i=e[0].length*(e[0].length-1)/2,c=Math.floor(i/this._workerCount),w=new Array(this._workerCount),g=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(950),t.b))));for(let t=0;t<this._workerCount;t++)w[t]=new Promise(((r,s)=>{const w=t*c,u=t===this._workerCount-1?i:(t+1)*c;u<=w&&r({knnDistances:new Array(0),knnIndexes:new Array(0)}),g[t].postMessage({values:e,startIdx:w,endIdx:u,fnNames:n,opts:o,nNeighbours:a,weights:l,aggregationMethod:h}),g[t].onmessage=({data:{error:e,knnDistances:n,knnIndexes:a}})=>{e?(g[t].terminate(),s(e)):(g[t].terminate(),r({knnDistances:n,knnIndexes:a}))}}));const u=await Promise.all(w),d={knnDistances:new Array(e[0].length).fill(null).map((()=>new Array(a).fill(99999))),knnIndexes:new Array(e[0].length).fill(null).map((()=>new Array(a).fill(-1)))};for(const n of u)for(let t=0;t<e[0].length;++t)for(let e=0;e<n.knnDistances[t]?.length;++e)(0,s.Qt)(d.knnDistances[t],d.knnIndexes[t],n.knnDistances[t][e],n.knnIndexes[t][e]);return d}async getSampleDistances(e,n,s=[],a,o=r.G.EUCLIDEAN){const l=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(778),t.b))));try{const t=e[0].length*(e[0].length-1)/2,r=Math.floor(t/this._workerCount),h=1e6,i=Math.max(Math.min(t/1e3,h),Math.min(t,h)),c=Math.floor(i/this._workerCount),w=new Array(this._workerCount);for(let h=0;h<this._workerCount;h++)w[h]=new Promise(((i,w)=>{const g=h*r,u=h===this._workerCount-1?t:(h+1)*r;l[h].postMessage({values:e,startIdx:g,endIdx:u,sampleLength:c,fnNames:n,opts:s,weights:a,aggregationMethod:o}),l[h].onmessage=({data:{error:e,distance:n}})=>{l[h].terminate(),e?w(e):i({distance:n})}}));const g=await Promise.all(w),u=g.reduce(((e,n)=>e+n.distance.length),0),d=new Float32Array(u);let k=0;for(const e of g)d.set(e.distance,k),k+=e.distance.length;return d.sort(),d}catch(e){return l?.forEach((e=>e?.terminate())),console.error(e),new Float32Array(1).fill(.5)}}async getMinimalThreshold(e,n,t=[],s,a=r.G.EUCLIDEAN){try{const r=e.length*(e.length-1)/2,o=await this.getSampleDistances(e,n,t,s,a);return 1-o[Math.floor(7e7/r*o.length)]}catch(e){return console.error(e),.5}}static calcSync(e,n,t,r){const a=[],o=[],l=[];let h=0,i=0,c=0;const w=e.length*(e.length-1)/2;for(;h<w;){const n=(0,s.gD)(e[i])||(0,s.gD)(e[c])?1:t(e[i],e[c]);1-n>=r&&(a.push(i),o.push(c),l.push(n)),h++,c++,c===e.length&&(i++,c=i+1)}return{i:new Int32Array(a),j:new Int32Array(o),distance:new Float32Array(l)}}}},6066:(e,n,t)=>{var r;t.d(n,{G:()=>r}),function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(r||(r={}))}}]);
|
|
1
|
+
"use strict";(self.webpackChunkeda=self.webpackChunkeda||[]).push([[731],{5731:(e,n,t)=>{t.d(n,{p:()=>a});var r=t(6066),s=t(606);class a{constructor(){this._workerCount=Math.max(navigator.hardwareConcurrency-2,1)}async calcMultiColumn(e,n,s,a=[{}],o=[1],l=r.G.EUCLIDEAN){const h=e[0].length*(e[0].length-1)/2,i=Math.floor(h/this._workerCount),c=e[0].length>2e4?await this.getMinimalThreshold(e,n,a,o,l):0;s<c&&(console.log(`using threshold ${c}`),s=c),a.forEach(((e,n)=>a[n].threshold=s));const w=new Array(this._workerCount),g=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(111),t.b))));for(let t=0;t<this._workerCount;t++)w[t]=new Promise(((r,c)=>{const w=t*i,u=t===this._workerCount-1?h:(t+1)*i;u<=w&&r({i:new Int32Array(0),j:new Int32Array(0),distance:new Float32Array(0),idx:t}),g[t].postMessage({values:e,startIdx:w,endIdx:u,threshold:s,fnNames:n,opts:a,weights:o,aggregationMethod:l}),g[t].onmessage=({data:{error:e,i:n,j:s,distance:a}})=>{e?(g[t].terminate(),c(e)):(g[t].terminate(),r({i:n,j:s,distance:a,idx:t}))}}));const u=await Promise.all(w),d=u.reduce(((e,n)=>e+n.i.length),0),k=new Int32Array(d),m=new Int32Array(d),f=new Float32Array(d);let y=0;for(const e of u)k.set(e.i,y),m.set(e.j,y),f.set(e.distance,y),y+=e.i.length;return{i:k,j:m,distance:f}}async calc(e,n,t,r={}){return await this.calcMultiColumn([e],[n],t,[r],[1])}async getKNN(e,n,t=15,r={}){return await this.multiColumnKNN([e],[n],t,[r],[1])}async getThresholdKNN(e,n,t=.8,r={}){return await this.multiColumnThresholdKnn([e],[n],t,[r],[1])}async multiColumnThresholdKnn(e,n,s=.8,a,o,l=r.G.EUCLIDEAN){if(e.length!==n.length||e.length!==a.length||e.length!==o.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const h=e[0].length*(e[0].length-1)/2,i=Math.floor(h/this._workerCount),c=new Array(this._workerCount),w=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(603),t.b))));for(let t=0;t<this._workerCount;t++)c[t]=new Promise(((r,c)=>{const g=t*i,u=t===this._workerCount-1?h:(t+1)*i;u<=g&&r({knnDistances:new Array(0),knnIndexes:new Array(0)}),w[t].postMessage({values:e,startIdx:g,endIdx:u,fnNames:n,opts:a,threshold:s,weights:o,aggregationMethod:l}),w[t].onmessage=({data:{error:e,knnDistances:n,knnIndexes:s}})=>{e?(w[t].terminate(),c(e)):(w[t].terminate(),r({knnDistances:n,knnIndexes:s}))}}));const g=await Promise.all(c),u=new Int32Array(e[0].length);for(const n of g)for(let t=0;t<e[0].length;++t)u[t]+=n.knnIndexes[t]?.length??0;const d={knnDistances:new Array(e[0].length).fill(null).map(((e,n)=>new Array(u[n]))),knnIndexes:new Array(e[0].length).fill(null).map(((e,n)=>new Array(u[n])))};for(const n of g)for(let t=0;t<e[0].length;++t)for(let e=0;e<(n.knnDistances[t]?.length??0);++e)d.knnDistances[t][u[t]-1]=n.knnDistances[t][e],d.knnIndexes[t][u[t]-1]=n.knnIndexes[t][e],u[t]-=1;return d}async multiColumnKNN(e,n,a=15,o,l,h=r.G.EUCLIDEAN){if(e.length!==n.length||e.length!==o.length||e.length!==l.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const i=e[0].length*(e[0].length-1)/2,c=Math.floor(i/this._workerCount),w=new Array(this._workerCount),g=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(950),t.b))));for(let t=0;t<this._workerCount;t++)w[t]=new Promise(((r,s)=>{const w=t*c,u=t===this._workerCount-1?i:(t+1)*c;u<=w&&r({knnDistances:new Array(0),knnIndexes:new Array(0)}),g[t].postMessage({values:e,startIdx:w,endIdx:u,fnNames:n,opts:o,nNeighbours:a,weights:l,aggregationMethod:h}),g[t].onmessage=({data:{error:e,knnDistances:n,knnIndexes:a}})=>{e?(g[t].terminate(),s(e)):(g[t].terminate(),r({knnDistances:n,knnIndexes:a}))}}));const u=await Promise.all(w),d={knnDistances:new Array(e[0].length).fill(null).map((()=>new Array(a).fill(99999))),knnIndexes:new Array(e[0].length).fill(null).map((()=>new Array(a).fill(-1)))};for(const n of u)for(let t=0;t<e[0].length;++t)for(let e=0;e<(n.knnDistances[t]?.length??0);++e)(0,s.Qt)(d.knnDistances[t],d.knnIndexes[t],n.knnDistances[t][e],n.knnIndexes[t][e]);return d}async getSampleDistances(e,n,s=[],a,o=r.G.EUCLIDEAN){const l=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(t.p+t.u(778),t.b))));try{const t=e[0].length*(e[0].length-1)/2,r=Math.floor(t/this._workerCount),h=1e6,i=Math.max(Math.min(t/1e3,h),Math.min(t,h)),c=Math.floor(i/this._workerCount),w=new Array(this._workerCount);for(let h=0;h<this._workerCount;h++)w[h]=new Promise(((i,w)=>{const g=h*r,u=h===this._workerCount-1?t:(h+1)*r;l[h].postMessage({values:e,startIdx:g,endIdx:u,sampleLength:c,fnNames:n,opts:s,weights:a,aggregationMethod:o}),l[h].onmessage=({data:{error:e,distance:n}})=>{l[h].terminate(),e?w(e):i({distance:n})}}));const g=await Promise.all(w),u=g.reduce(((e,n)=>e+n.distance.length),0),d=new Float32Array(u);let k=0;for(const e of g)d.set(e.distance,k),k+=e.distance.length;return d.sort(),d}catch(e){return l?.forEach((e=>e?.terminate())),console.error(e),new Float32Array(1).fill(.5)}}async getMinimalThreshold(e,n,t=[],s,a=r.G.EUCLIDEAN){try{const r=e.length*(e.length-1)/2,o=await this.getSampleDistances(e,n,t,s,a);return 1-o[Math.floor(7e7/r*o.length)]}catch(e){return console.error(e),.5}}static calcSync(e,n,t,r){const a=[],o=[],l=[];let h=0,i=0,c=0;const w=e.length*(e.length-1)/2;for(;h<w;){const n=(0,s.gD)(e[i])||(0,s.gD)(e[c])?1:t(e[i],e[c]);1-n>=r&&(a.push(i),o.push(c),l.push(n)),h++,c++,c===e.length&&(i++,c=i+1)}return{i:new Int32Array(a),j:new Int32Array(o),distance:new Float32Array(l)}}}},6066:(e,n,t)=>{var r;t.d(n,{G:()=>r}),function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(r||(r={}))}}]);
|
|
2
2
|
//# sourceMappingURL=731.js.map
|
package/dist/731.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"731.js","mappings":"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","sources":["webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-service.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js"],"sourcesContent":["import { DistanceAggregationMethods } from './types';\nimport { insertSmaller, isNil } from './utils';\nexport class SparseMatrixService {\n constructor() {\n this._workerCount = Math.max(navigator.hardwareConcurrency - 2, 1);\n }\n async calcMultiColumn(values, fnNames, threshold, opts = [{}], weights = [1], aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const minThreshold = values[0].length > 20000 ?\n await this.getMinimalThreshold(values, fnNames, opts, weights, aggregationMethod) : 0;\n if (threshold < minThreshold) {\n console.log(`using threshold ${minThreshold}`);\n threshold = minThreshold;\n }\n opts.forEach((_, i) => opts[i]['threshold'] = threshold);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./sparse-matrix-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ i: new Int32Array(0), j: new Int32Array(0), distance: new Float32Array(0), idx });\n workers[idx].postMessage({ values, startIdx, endIdx, threshold, fnNames, opts, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, i, j, distance } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ i, j, distance, idx });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const fullSize = results.reduce((acc, val) => acc + val.i.length, 0);\n const i = new Int32Array(fullSize);\n const j = new Int32Array(fullSize);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n // setting the results\n for (const res of results) {\n i.set(res.i, offset);\n j.set(res.j, offset);\n distance.set(res.distance, offset);\n offset += res.i.length;\n }\n return { i, j, distance };\n }\n async calc(values, fnName, threshold, opts = {}) {\n //size of full matrix\n return await this.calcMultiColumn([values], [fnName], threshold, [opts], [1]);\n }\n async getKNN(values, fnName, nNeighbours = 15, opts = {}) {\n return await this.multiColumnKNN([values], [fnName], nNeighbours, [opts], [1]);\n }\n async getThresholdKNN(values, fnName, threshold = 0.8, opts = {}) {\n return await this.multiColumnThresholdKnn([values], [fnName], threshold, [opts], [1]);\n }\n async multiColumnThresholdKnn(values, fnNames, threshold = 0.8, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-threshold-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, threshold, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnSizes = new Int32Array(values[0].length);\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i)\n knnSizes[i] += res.knnIndexes[i]?.length ?? 0;\n }\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i])),\n knnIndexes: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i]))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j) {\n knnRes.knnDistances[i][knnSizes[i] - 1] = res.knnDistances[i][j];\n knnRes.knnIndexes[i][knnSizes[i] - 1] = res.knnIndexes[i][j];\n knnSizes[i] -= 1;\n }\n }\n }\n return knnRes;\n }\n async multiColumnKNN(values, fnNames, nNeighbours = 15, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, nNeighbours, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(99999)),\n knnIndexes: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(-1))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j)\n insertSmaller(knnRes.knnDistances[i], knnRes.knnIndexes[i], res.knnDistances[i][j], res.knnIndexes[i][j]);\n }\n }\n return knnRes;\n }\n async getSampleDistances(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const thresholdWorkers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./sparse-matrix-threshold-worker', import.meta.url)));\n try {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const maxSampleSize = 1000000;\n const sampleSise = Math.max(Math.min(matSize / 1000, maxSampleSize), Math.min(matSize, maxSampleSize));\n const testSetSizePerWorker = Math.floor(sampleSise / this._workerCount);\n const tPromises = new Array(this._workerCount);\n for (let idx = 0; idx < this._workerCount; idx++) {\n tPromises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n thresholdWorkers[idx].postMessage({\n values: values, startIdx, endIdx, sampleLength: testSetSizePerWorker,\n fnNames, opts, weights, aggregationMethod\n });\n thresholdWorkers[idx].onmessage = ({ data: { error, distance } }) => {\n thresholdWorkers[idx].terminate();\n if (error)\n rejectWorker(error);\n else\n resolveWorker({ distance });\n };\n });\n }\n const results = await Promise.all(tPromises);\n const fullSize = results.reduce((acc, val) => acc + val.distance.length, 0);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n for (const res of results) {\n distance.set(res.distance, offset);\n offset += res.distance.length;\n }\n distance.sort();\n return distance;\n }\n catch (e) {\n thresholdWorkers?.forEach((w) => w?.terminate());\n console.error(e);\n return new Float32Array(1).fill(0.5);\n }\n }\n async getMinimalThreshold(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n //We need to calculate the minimal threshold first,\n //in order to get matrix such that it does not exceed the maximum size of 1GB\n //we have 3 return arrays, each 4 bites per element, so if the maximum size of the matrix is 1GB,\n const maxSparseMatrixSize = 70000000;\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const distance = await this.getSampleDistances(values, fnNames, opts, weights, aggregationMethod);\n const fractionIndex = Math.floor(maxSparseMatrixSize / matSize * distance.length);\n const threshold = 1 - distance[fractionIndex];\n // threshold = Math.max(threshold, 0.3);\n return threshold;\n }\n catch (e) {\n console.error(e);\n return 0.5;\n }\n }\n static calcSync(values, fnName, distanceFn, threshold) {\n const i = [];\n const j = [];\n const distances = [];\n let cnt = 0;\n let mi = 0;\n let mj = 0;\n const fullSize = values.length * (values.length - 1) / 2;\n while (cnt < fullSize) {\n //const value = seq1List[mi] && seq1List[mj] ? hamming(seq1List[mi], seq1List[mj]) : 0;\n const value = !isNil(values[mi]) && !isNil(values[mj]) ?\n distanceFn(values[mi], values[mj]) : 1;\n const similarity = 1 - value;\n if (similarity >= threshold) {\n i.push(mi);\n j.push(mj);\n distances.push(value);\n }\n cnt++;\n mj++;\n if (mj === values.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 return { i: iArray, j: jArray, distance: distanceArray };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsMEJBQTBCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFhN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUU1QjtRQUNFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQW9CLEVBQUUsT0FBdUIsRUFDeEUsU0FBaUIsRUFBRSxPQUE2QixDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQzdFLG9CQUErQywwQkFBMEIsQ0FBQyxTQUFTO1FBRW5GLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFMUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFNLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFD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Q0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLFVBQVUsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNYLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQztZQUNELEdBQUcsRUFBRSxDQUFDO1lBQ04sRUFBRSxFQUFFLENBQUM7WUFDTCxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVsRCxPQUFPLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7aW5zZXJ0U21hbGxlciwgaXNOaWx9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBTcGFyc2VNYXRyaXhSZXN1bHQgPSB7XG4gIGk6IEludDMyQXJyYXkgfCBVaW50MzJBcnJheSxcbiAgajogSW50MzJBcnJheSB8IFVpbnQzMkFycmF5LFxuICBkaXN0YW5jZTogRmxvYXQzMkFycmF5LFxuICBpZHg/OiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIEtublJlc3VsdCA9IHtcbiAga25uRGlzdGFuY2VzOiBudW1iZXJbXVtdLFxuICBrbm5JbmRleGVzOiBudW1iZXJbXVtdXG59XG5leHBvcnQgY2xhc3MgU3BhcnNlTWF0cml4U2VydmljZSB7XG4gICAgcHJpdmF0ZSBfd29ya2VyQ291bnQ6IG51bWJlcjtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX3dvcmtlckNvdW50ID0gTWF0aC5tYXgobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgLSAyLCAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsY011bHRpQ29sdW1uKHZhbHVlczogQXJyYXk8YW55W10+LCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSxcbiAgICAgIHRocmVzaG9sZDogbnVtYmVyLCBvcHRzOiB7W186IHN0cmluZ106IGFueX1bXSA9IFt7fV0sIHdlaWdodHM6IG51bWJlcltdID0gWzFdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU5cbiAgICApIHtcbiAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgIGNvbnN0IG1pblRocmVzaG9sZCA9IHZhbHVlc1swXS5sZW5ndGggPiAyMF8wMDAgP1xuICAgICAgICBhd2FpdCB0aGlzLmdldE1pbmltYWxUaHJlc2hvbGQodmFsdWVzLCBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCkgOiAwO1xuICAgICAgaWYgKHRocmVzaG9sZCA8IG1pblRocmVzaG9sZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgdXNpbmcgdGhyZXNob2xkICR7bWluVGhyZXNob2xkfWApO1xuICAgICAgICB0aHJlc2hvbGQgPSBtaW5UaHJlc2hvbGQ7XG4gICAgICB9XG4gICAgICBvcHRzLmZvckVhY2goKF8sIGkpID0+IG9wdHNbaV1bJ3RocmVzaG9sZCddID0gdGhyZXNob2xkKTtcbiAgICAgIGNvbnN0IHByb21pc2VzID1cbiAgICAgICAgbmV3IEFycmF5PFByb21pc2U8U3BhcnNlTWF0cml4UmVzdWx0Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuXG4gICAgICBjb25zdCB3b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KVxuICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3NwYXJzZS1tYXRyaXgtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgIHByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgIGlmIChlbmRJZHggPD0gc3RhcnRJZHgpXG4gICAgICAgICAgICByZXNvbHZlV29ya2VyKHtpOiBuZXcgSW50MzJBcnJheSgwKSwgajogbmV3IEludDMyQXJyYXkoMCksIGRpc3RhbmNlOiBuZXcgRmxvYXQzMkFycmF5KDApLCBpZHh9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgdGhyZXNob2xkLCBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgaSwgaiwgZGlzdGFuY2V9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7aSwgaiwgZGlzdGFuY2UsIGlkeH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgY29uc3QgZnVsbFNpemUgPSByZXN1bHRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbC5pLmxlbmd0aCwgMCk7XG4gICAgICBjb25zdCBpID0gbmV3IEludDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgY29uc3QgaiA9IG5ldyBJbnQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIC8vIHNldHRpbmcgdGhlIHJlc3VsdHNcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaS5zZXQocmVzLmksIG9mZnNldCk7XG4gICAgICAgIGouc2V0KHJlcy5qLCBvZmZzZXQpO1xuICAgICAgICBkaXN0YW5jZS5zZXQocmVzLmRpc3RhbmNlLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gcmVzLmkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtpLCBqLCBkaXN0YW5jZX07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGM8VD4odmFsdWVzOiBBcnJheTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIHRocmVzaG9sZDogbnVtYmVyLCBvcHRzOiB7W186IHN0cmluZ106IGFueX0gPSB7fSkge1xuICAgICAgLy9zaXplIG9mIGZ1bGwgbWF0cml4XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxjTXVsdGlDb2x1bW4oW3ZhbHVlc10sIFtmbk5hbWVdLCB0aHJlc2hvbGQsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S05OKFxuICAgICAgdmFsdWVzOiBBcnJheTxhbnk+LCBmbk5hbWU6IEtub3duTWV0cmljcywgbk5laWdoYm91cnM6IG51bWJlciA9IDE1LCBvcHRzOiB7W186IHN0cmluZ106IGFueX0gPSB7fVxuICAgICkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubXVsdGlDb2x1bW5LTk4oW3ZhbHVlc10sIFtmbk5hbWVdLCBuTmVpZ2hib3VycywgW29wdHNdLCBbMV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRUaHJlc2hvbGRLTk4oXG4gICAgICB2YWx1ZXM6IEFycmF5PGFueT4sIGZuTmFtZTogS25vd25NZXRyaWNzLCB0aHJlc2hvbGQ6IG51bWJlciA9IDAuOCwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge31cbiAgICApIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm11bHRpQ29sdW1uVGhyZXNob2xkS25uKFt2YWx1ZXNdLCBbZm5OYW1lXSwgdGhyZXNob2xkLCBbb3B0c10sIFsxXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG11bHRpQ29sdW1uVGhyZXNob2xkS25uKHZhbHVlczogQXJyYXk8QXJyYXk8YW55Pj4sIGZuTmFtZXM6IEtub3duTWV0cmljc1tdLCB0aHJlc2hvbGQ6IG51bWJlciA9IDAuOCxcbiAgICAgIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdLCB3ZWlnaHRzOiBudW1iZXJbXSxcbiAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kID0gRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOXG4gICAgKSB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCAhPT0gZm5OYW1lcy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gb3B0cy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzLCBkaXN0YW5jZSBmdW5jdGlvbnMsIG9wdGlvbnMgYW5kIHdlaWdodHMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICBpZiAodmFsdWVzLnNvbWUoKHYpID0+IHYubGVuZ3RoICE9PSB2YWx1ZXNbMF0ubGVuZ3RoKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGwgdmFsdWVzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHByb21pc2VzID1cbiAgICAgICAgbmV3IEFycmF5PFByb21pc2U8S25uUmVzdWx0Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgY29uc3Qgd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudClcbiAgICAgICAgLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9rbm4tdGhyZXNob2xkLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzOiBuZXcgQXJyYXkoMCksIGtubkluZGV4ZXM6IG5ldyBBcnJheSgwKX0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBmbk5hbWVzLCBvcHRzLCB0aHJlc2hvbGQsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICBjb25zdCBrbm5TaXplcyA9IG5ldyBJbnQzMkFycmF5KHZhbHVlc1swXS5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSlcbiAgICAgICAgICBrbm5TaXplc1tpXSArPSByZXMua25uSW5kZXhlc1tpXT8ubGVuZ3RoID8/IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBrbm5SZXM6IEtublJlc3VsdCA9IHtcbiAgICAgICAga25uRGlzdGFuY2VzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IG5ldyBBcnJheTxudW1iZXI+KGtublNpemVzW2ldKSksXG4gICAgICAgIGtubkluZGV4ZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4gbmV3IEFycmF5PG51bWJlcj4oa25uU2l6ZXNbaV0pKX07XG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMua25uRGlzdGFuY2VzW2ldPy5sZW5ndGggPz8gMDsgKytqKSB7XG4gICAgICAgICAgICBrbm5SZXMua25uRGlzdGFuY2VzW2ldW2tublNpemVzW2ldIC0gMV0gPSByZXMua25uRGlzdGFuY2VzW2ldW2pdO1xuICAgICAgICAgICAga25uUmVzLmtubkluZGV4ZXNbaV1ba25uU2l6ZXNbaV0gLSAxXSA9IHJlcy5rbm5JbmRleGVzW2ldW2pdO1xuICAgICAgICAgICAga25uU2l6ZXNbaV0gLT0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBrbm5SZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG11bHRpQ29sdW1uS05OKHZhbHVlczogQXJyYXk8QXJyYXk8YW55Pj4sIGZuTmFtZXM6IEtub3duTWV0cmljc1tdLCBuTmVpZ2hib3VyczogbnVtYmVyID0gMTUsXG4gICAgICBvcHRzOiB7W186IHN0cmluZ106IGFueX1bXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTlxuICAgICkge1xuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT09IGZuTmFtZXMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IG9wdHMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IHdlaWdodHMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlcywgZGlzdGFuY2UgZnVuY3Rpb25zLCBvcHRpb25zIGFuZCB3ZWlnaHRzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgaWYgKHZhbHVlcy5zb21lKCh2KSA9PiB2Lmxlbmd0aCAhPT0gdmFsdWVzWzBdLmxlbmd0aCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsIHZhbHVlcyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9XG4gICAgICAgIG5ldyBBcnJheTxQcm9taXNlPEtublJlc3VsdD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgIC5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4va25uLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzOiBuZXcgQXJyYXkoMCksIGtubkluZGV4ZXM6IG5ldyBBcnJheSgwKX0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBmbk5hbWVzLCBvcHRzLCBuTmVpZ2hib3Vycywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGtubkRpc3RhbmNlcywga25uSW5kZXhlc319KTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHtrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIGNvbnN0IGtublJlczogS25uUmVzdWx0ID0ge1xuICAgICAgICBrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXk8bnVtYmVyPihuTmVpZ2hib3VycykuZmlsbCg5OTk5OSkpLFxuICAgICAgICBrbm5JbmRleGVzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEFycmF5PG51bWJlcj4obk5laWdoYm91cnMpLmZpbGwoLTEpKX07XG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMua25uRGlzdGFuY2VzW2ldPy5sZW5ndGggPz8gMDsgKytqKVxuICAgICAgICAgICAgaW5zZXJ0U21hbGxlcihrbm5SZXMua25uRGlzdGFuY2VzW2ldLCBrbm5SZXMua25uSW5kZXhlc1tpXSwgcmVzLmtubkRpc3RhbmNlc1tpXVtqXSwgcmVzLmtubkluZGV4ZXNbaV1bal0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ga25uUmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTYW1wbGVEaXN0YW5jZXModmFsdWVzOiBBcnJheTxhbnlbXT4sXG4gICAgICBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTik6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgICBjb25zdCB0aHJlc2hvbGRXb3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KS5maWxsKG51bGwpXG4gICAgICAgIC5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3NwYXJzZS1tYXRyaXgtdGhyZXNob2xkLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCBtYXhTYW1wbGVTaXplID0gMV8wMDBfMDAwO1xuICAgICAgICBjb25zdCBzYW1wbGVTaXNlID0gTWF0aC5tYXgoTWF0aC5taW4obWF0U2l6ZSAvIDEwMDAsIG1heFNhbXBsZVNpemUpLCBNYXRoLm1pbihtYXRTaXplLCBtYXhTYW1wbGVTaXplKSk7XG4gICAgICAgIGNvbnN0IHRlc3RTZXRTaXplUGVyV29ya2VyID0gTWF0aC5mbG9vcihzYW1wbGVTaXNlIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCB0UHJvbWlzZXMgPSBuZXcgQXJyYXk8UHJvbWlzZTx7ZGlzdGFuY2U6IEZsb2F0MzJBcnJheX0+Pih0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgdFByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBzYW1wbGVMZW5ndGg6IHRlc3RTZXRTaXplUGVyV29ya2VyLFxuICAgICAgICAgICAgICBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGRpc3RhbmNlfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgdGhyZXNob2xkV29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJlamVjdFdvcmtlcihlcnJvcik7IGVsc2VcbiAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHtkaXN0YW5jZX0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0UHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBmdWxsU2l6ZSA9IHJlc3VsdHMucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLmRpc3RhbmNlLmxlbmd0aCwgMCk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgZGlzdGFuY2Uuc2V0KHJlcy5kaXN0YW5jZSwgb2Zmc2V0KTtcbiAgICAgICAgICBvZmZzZXQgKz0gcmVzLmRpc3RhbmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBkaXN0YW5jZS5zb3J0KCk7XG5cbiAgICAgICAgcmV0dXJuIGRpc3RhbmNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJlc2hvbGRXb3JrZXJzPy5mb3JFYWNoKCh3KSA9PiB3Py50ZXJtaW5hdGUoKSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KDEpLmZpbGwoMC41KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldE1pbmltYWxUaHJlc2hvbGQodmFsdWVzOiBBcnJheTxhbnlbXT4sXG4gICAgICBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTikge1xuICAgICAgLy9XZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWluaW1hbCB0aHJlc2hvbGQgZmlyc3QsXG4gICAgICAvL2luIG9yZGVyIHRvIGdldCBtYXRyaXggc3VjaCB0aGF0IGl0IGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplIG9mIDFHQlxuICAgICAgLy93ZSBoYXZlIDMgcmV0dXJuIGFycmF5cywgZWFjaCA0IGJpdGVzIHBlciBlbGVtZW50LCBzbyBpZiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRyaXggaXMgMUdCLFxuICAgICAgY29uc3QgbWF4U3BhcnNlTWF0cml4U2l6ZSA9IDcwXzAwMF8wMDA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGF3YWl0IHRoaXMuZ2V0U2FtcGxlRGlzdGFuY2VzKHZhbHVlcywgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgICBjb25zdCBmcmFjdGlvbkluZGV4ID0gTWF0aC5mbG9vcihtYXhTcGFyc2VNYXRyaXhTaXplIC8gbWF0U2l6ZSAqIGRpc3RhbmNlLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDEgLSBkaXN0YW5jZVtmcmFjdGlvbkluZGV4XTtcbiAgICAgICAgLy8gdGhyZXNob2xkID0gTWF0aC5tYXgodGhyZXNob2xkLCAwLjMpO1xuICAgICAgICByZXR1cm4gdGhyZXNob2xkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICByZXR1cm4gMC41O1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2FsY1N5bmM8VD4oXG4gICAgICB2YWx1ZXM6IEFycmF5PFQ+IHwgQXJyYXlMaWtlPFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcywgZGlzdGFuY2VGbjogRnVuY3Rpb24sIHRocmVzaG9sZDogbnVtYmVyXG4gICAgKSB7XG4gICAgICBjb25zdCBpOiBudW1iZXJbXSA9IFtdO1xuICAgICAgY29uc3QgajogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGxldCBjbnQgPSAwO1xuICAgICAgbGV0IG1pID0gMDtcbiAgICAgIGxldCBtaiA9IDA7XG4gICAgICBjb25zdCBmdWxsU2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIHdoaWxlIChjbnQgPCBmdWxsU2l6ZSkge1xuICAgICAgICAvL2NvbnN0IHZhbHVlID0gc2VxMUxpc3RbbWldICYmIHNlcTFMaXN0W21qXSA/IGhhbW1pbmcoc2VxMUxpc3RbbWldLCBzZXExTGlzdFttal0pIDogMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAhaXNOaWwodmFsdWVzW21pXSkgJiYgIWlzTmlsKHZhbHVlc1ttal0pID9cbiAgICAgICAgICBkaXN0YW5jZUZuKHZhbHVlc1ttaV0sIHZhbHVlc1ttal0pIDogMTtcbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IDEgLSB2YWx1ZTtcbiAgICAgICAgaWYgKHNpbWlsYXJpdHkgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgaS5wdXNoKG1pKTtcbiAgICAgICAgICBqLnB1c2gobWopO1xuICAgICAgICAgIGRpc3RhbmNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjbnQrKztcbiAgICAgICAgbWorKztcbiAgICAgICAgaWYgKG1qID09PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgbWkrKztcbiAgICAgICAgICBtaiA9IG1pICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpQXJyYXkgPSBuZXcgSW50MzJBcnJheShpKTtcbiAgICAgIGNvbnN0IGpBcnJheSA9IG5ldyBJbnQzMkFycmF5KGopO1xuICAgICAgY29uc3QgZGlzdGFuY2VBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZGlzdGFuY2VzKTtcblxuICAgICAgcmV0dXJuIHtpOiBpQXJyYXksIGo6IGpBcnJheSwgZGlzdGFuY2U6IGRpc3RhbmNlQXJyYXl9O1xuICAgIH1cbn1cbiJdfQ==","export var DistanceAggregationMethods;\n(function (DistanceAggregationMethods) {\n DistanceAggregationMethods[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n DistanceAggregationMethods[\"MANHATTAN\"] = \"MANHATTAN\";\n})(DistanceAggregationMethods || (DistanceAggregationMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSwwQkFHVDtBQUhILFdBQVksMEJBQTBCO0lBQ2xDLHFEQUF1QixDQUFBO0lBQ3ZCLHFEQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIUywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR25DO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIHtcbiAgICBFVUNMSURFQU4gPSAnRVVDTElERUFOJyxcbiAgICBNQU5IQVRUQU4gPSAnTUFOSEFUVEFOJyxcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IGtleW9mIHR5cGVvZiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbiJdfQ=="],"names":["SparseMatrixService","constructor","this","_workerCount","Math","max","navigator","hardwareConcurrency","calcMultiColumn","values","fnNames","threshold","opts","weights","aggregationMethod","EUCLIDEAN","matSize","length","chunkSize","floor","minThreshold","getMinimalThreshold","console","log","forEach","_","i","promises","Array","workers","fill","map","Worker","URL","idx","Promise","resolveWorker","rejectWorker","startIdx","endIdx","Int32Array","j","distance","Float32Array","postMessage","onmessage","data","error","terminate","results","all","fullSize","reduce","acc","val","offset","res","set","calc","fnName","getKNN","nNeighbours","multiColumnKNN","getThresholdKNN","multiColumnThresholdKnn","Error","some","v","knnDistances","knnIndexes","knnSizes","knnRes","getSampleDistances","thresholdWorkers","maxSampleSize","sampleSise","min","testSetSizePerWorker","tPromises","sampleLength","sort","e","w","calcSync","distanceFn","distances","cnt","mi","mj","value","push","DistanceAggregationMethods"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"731.js","mappings":"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","sources":["webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-service.js","webpack://eda/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js"],"sourcesContent":["import { DistanceAggregationMethods } from './types';\nimport { insertSmaller, isNil } from './utils';\nexport class SparseMatrixService {\n constructor() {\n this._workerCount = Math.max(navigator.hardwareConcurrency - 2, 1);\n }\n async calcMultiColumn(values, fnNames, threshold, opts = [{}], weights = [1], aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const minThreshold = values[0].length > 20000 ?\n await this.getMinimalThreshold(values, fnNames, opts, weights, aggregationMethod) : 0;\n if (threshold < minThreshold) {\n console.log(`using threshold ${minThreshold}`);\n threshold = minThreshold;\n }\n opts.forEach((_, i) => opts[i]['threshold'] = threshold);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./sparse-matrix-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ i: new Int32Array(0), j: new Int32Array(0), distance: new Float32Array(0), idx });\n workers[idx].postMessage({ values, startIdx, endIdx, threshold, fnNames, opts, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, i, j, distance } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ i, j, distance, idx });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const fullSize = results.reduce((acc, val) => acc + val.i.length, 0);\n const i = new Int32Array(fullSize);\n const j = new Int32Array(fullSize);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n // setting the results\n for (const res of results) {\n i.set(res.i, offset);\n j.set(res.j, offset);\n distance.set(res.distance, offset);\n offset += res.i.length;\n }\n return { i, j, distance };\n }\n async calc(values, fnName, threshold, opts = {}) {\n //size of full matrix\n return await this.calcMultiColumn([values], [fnName], threshold, [opts], [1]);\n }\n async getKNN(values, fnName, nNeighbours = 15, opts = {}) {\n return await this.multiColumnKNN([values], [fnName], nNeighbours, [opts], [1]);\n }\n async getThresholdKNN(values, fnName, threshold = 0.8, opts = {}) {\n return await this.multiColumnThresholdKnn([values], [fnName], threshold, [opts], [1]);\n }\n async multiColumnThresholdKnn(values, fnNames, threshold = 0.8, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-threshold-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, threshold, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnSizes = new Int32Array(values[0].length);\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i)\n knnSizes[i] += res.knnIndexes[i]?.length ?? 0;\n }\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i])),\n knnIndexes: new Array(values[0].length).fill(null).map((_, i) => new Array(knnSizes[i]))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < (res.knnDistances[i]?.length ?? 0); ++j) {\n knnRes.knnDistances[i][knnSizes[i] - 1] = res.knnDistances[i][j];\n knnRes.knnIndexes[i][knnSizes[i] - 1] = res.knnIndexes[i][j];\n knnSizes[i] -= 1;\n }\n }\n }\n return knnRes;\n }\n async multiColumnKNN(values, fnNames, nNeighbours = 15, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, nNeighbours, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(99999)),\n knnIndexes: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(-1))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < (res.knnDistances[i]?.length ?? 0); ++j)\n insertSmaller(knnRes.knnDistances[i], knnRes.knnIndexes[i], res.knnDistances[i][j], res.knnIndexes[i][j]);\n }\n }\n return knnRes;\n }\n async getSampleDistances(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n const thresholdWorkers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./sparse-matrix-threshold-worker', import.meta.url)));\n try {\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const maxSampleSize = 1000000;\n const sampleSise = Math.max(Math.min(matSize / 1000, maxSampleSize), Math.min(matSize, maxSampleSize));\n const testSetSizePerWorker = Math.floor(sampleSise / this._workerCount);\n const tPromises = new Array(this._workerCount);\n for (let idx = 0; idx < this._workerCount; idx++) {\n tPromises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n thresholdWorkers[idx].postMessage({\n values: values, startIdx, endIdx, sampleLength: testSetSizePerWorker,\n fnNames, opts, weights, aggregationMethod\n });\n thresholdWorkers[idx].onmessage = ({ data: { error, distance } }) => {\n thresholdWorkers[idx].terminate();\n if (error)\n rejectWorker(error);\n else\n resolveWorker({ distance });\n };\n });\n }\n const results = await Promise.all(tPromises);\n const fullSize = results.reduce((acc, val) => acc + val.distance.length, 0);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n for (const res of results) {\n distance.set(res.distance, offset);\n offset += res.distance.length;\n }\n distance.sort();\n return distance;\n }\n catch (e) {\n thresholdWorkers?.forEach((w) => w?.terminate());\n console.error(e);\n return new Float32Array(1).fill(0.5);\n }\n }\n async getMinimalThreshold(values, fnNames, opts = [], weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n //We need to calculate the minimal threshold first,\n //in order to get matrix such that it does not exceed the maximum size of 1GB\n //we have 3 return arrays, each 4 bites per element, so if the maximum size of the matrix is 1GB,\n const maxSparseMatrixSize = 70000000;\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const distance = await this.getSampleDistances(values, fnNames, opts, weights, aggregationMethod);\n const fractionIndex = Math.floor(maxSparseMatrixSize / matSize * distance.length);\n const threshold = 1 - distance[fractionIndex];\n // threshold = Math.max(threshold, 0.3);\n return threshold;\n }\n catch (e) {\n console.error(e);\n return 0.5;\n }\n }\n static calcSync(values, fnName, distanceFn, threshold) {\n const i = [];\n const j = [];\n const distances = [];\n let cnt = 0;\n let mi = 0;\n let mj = 0;\n const fullSize = values.length * (values.length - 1) / 2;\n while (cnt < fullSize) {\n //const value = seq1List[mi] && seq1List[mj] ? hamming(seq1List[mi], seq1List[mj]) : 0;\n const value = !isNil(values[mi]) && !isNil(values[mj]) ?\n distanceFn(values[mi], values[mj]) : 1;\n const similarity = 1 - value;\n if (similarity >= threshold) {\n i.push(mi);\n j.push(mj);\n distances.push(value);\n }\n cnt++;\n mj++;\n if (mj === values.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 return { i: iArray, j: jArray, distance: distanceArray };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsMEJBQTBCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFhN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUU1QjtRQUNFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQW9CLEVBQUUsT0FBdUIsRUFDeEUsU0FBaUIsRUFBRSxPQUE2QixDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQzdFLG9CQUErQywwQkFBMEIsQ0FBQyxTQUFTO1FBRW5GLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFMUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFNLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFD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Q0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksVUFBVSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1gsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixDQUFDO1lBQ0QsR0FBRyxFQUFFLENBQUM7WUFDTixFQUFFLEVBQUUsQ0FBQztZQUNMLElBQUksRUFBRSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekIsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxELE9BQU8sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7S25vd25NZXRyaWNzfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtpbnNlcnRTbWFsbGVyLCBpc05pbH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFNwYXJzZU1hdHJpeFJlc3VsdCA9IHtcbiAgaTogSW50MzJBcnJheSB8IFVpbnQzMkFycmF5LFxuICBqOiBJbnQzMkFycmF5IHwgVWludDMyQXJyYXksXG4gIGRpc3RhbmNlOiBGbG9hdDMyQXJyYXksXG4gIGlkeD86IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgS25uUmVzdWx0ID0ge1xuICBrbm5EaXN0YW5jZXM6IG51bWJlcltdW10sXG4gIGtubkluZGV4ZXM6IG51bWJlcltdW11cbn1cbmV4cG9ydCBjbGFzcyBTcGFyc2VNYXRyaXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF93b3JrZXJDb3VudDogbnVtYmVyO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5fd29ya2VyQ291bnQgPSBNYXRoLm1heChuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSAtIDIsIDEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjYWxjTXVsdGlDb2x1bW4odmFsdWVzOiBBcnJheTxhbnlbXT4sIGZuTmFtZXM6IEtub3duTWV0cmljc1tdLFxuICAgICAgdGhyZXNob2xkOiBudW1iZXIsIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdID0gW3t9XSwgd2VpZ2h0czogbnVtYmVyW10gPSBbMV0sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTlxuICAgICkge1xuICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcblxuICAgICAgY29uc3QgbWluVGhyZXNob2xkID0gdmFsdWVzWzBdLmxlbmd0aCA+IDIwXzAwMCA/XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaW1hbFRocmVzaG9sZCh2YWx1ZXMsIGZuTmFtZXMsIG9wdHMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kKSA6IDA7XG4gICAgICBpZiAodGhyZXNob2xkIDwgbWluVGhyZXNob2xkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGB1c2luZyB0aHJlc2hvbGQgJHttaW5UaHJlc2hvbGR9YCk7XG4gICAgICAgIHRocmVzaG9sZCA9IG1pblRocmVzaG9sZDtcbiAgICAgIH1cbiAgICAgIG9wdHMuZm9yRWFjaCgoXywgaSkgPT4gb3B0c1tpXVsndGhyZXNob2xkJ10gPSB0aHJlc2hvbGQpO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPVxuICAgICAgICBuZXcgQXJyYXk8UHJvbWlzZTxTcGFyc2VNYXRyaXhSZXN1bHQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgIC5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vc3BhcnNlLW1hdHJpeC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgcHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgaWYgKGVuZElkeCA8PSBzdGFydElkeClcbiAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2k6IG5ldyBJbnQzMkFycmF5KDApLCBqOiBuZXcgSW50MzJBcnJheSgwKSwgZGlzdGFuY2U6IG5ldyBGbG9hdDMyQXJyYXkoMCksIGlkeH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCB0aHJlc2hvbGQsIGZuTmFtZXMsIG9wdHMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBpLCBqLCBkaXN0YW5jZX19KTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHtpLCBqLCBkaXN0YW5jZSwgaWR4fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICBjb25zdCBmdWxsU2l6ZSA9IHJlc3VsdHMucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLmkubGVuZ3RoLCAwKTtcbiAgICAgIGNvbnN0IGkgPSBuZXcgSW50MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICBjb25zdCBqID0gbmV3IEludDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0c1xuICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICBpLnNldChyZXMuaSwgb2Zmc2V0KTtcbiAgICAgICAgai5zZXQocmVzLmosIG9mZnNldCk7XG4gICAgICAgIGRpc3RhbmNlLnNldChyZXMuZGlzdGFuY2UsIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSByZXMuaS5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4ge2ksIGosIGRpc3RhbmNlfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsYzxUPih2YWx1ZXM6IEFycmF5PFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcywgdGhyZXNob2xkOiBudW1iZXIsIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fSA9IHt9KSB7XG4gICAgICAvL3NpemUgb2YgZnVsbCBtYXRyaXhcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGNNdWx0aUNvbHVtbihbdmFsdWVzXSwgW2ZuTmFtZV0sIHRocmVzaG9sZCwgW29wdHNdLCBbMV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRLTk4oXG4gICAgICB2YWx1ZXM6IEFycmF5PGFueT4sIGZuTmFtZTogS25vd25NZXRyaWNzLCBuTmVpZ2hib3VyczogbnVtYmVyID0gMTUsIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fSA9IHt9XG4gICAgKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5tdWx0aUNvbHVtbktOTihbdmFsdWVzXSwgW2ZuTmFtZV0sIG5OZWlnaGJvdXJzLCBbb3B0c10sIFsxXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFRocmVzaG9sZEtOTihcbiAgICAgIHZhbHVlczogQXJyYXk8YW55PiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIHRocmVzaG9sZDogbnVtYmVyID0gMC44LCBvcHRzOiB7W186IHN0cmluZ106IGFueX0gPSB7fVxuICAgICkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubXVsdGlDb2x1bW5UaHJlc2hvbGRLbm4oW3ZhbHVlc10sIFtmbk5hbWVdLCB0aHJlc2hvbGQsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbXVsdGlDb2x1bW5UaHJlc2hvbGRLbm4odmFsdWVzOiBBcnJheTxBcnJheTxhbnk+PiwgZm5OYW1lczogS25vd25NZXRyaWNzW10sIHRocmVzaG9sZDogbnVtYmVyID0gMC44LFxuICAgICAgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10sIHdlaWdodHM6IG51bWJlcltdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU5cbiAgICApIHtcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9PSBmbk5hbWVzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSBvcHRzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMsIGRpc3RhbmNlIGZ1bmN0aW9ucywgb3B0aW9ucyBhbmQgd2VpZ2h0cyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIGlmICh2YWx1ZXMuc29tZSgodikgPT4gdi5sZW5ndGggIT09IHZhbHVlc1swXS5sZW5ndGgpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FsbCB2YWx1ZXMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPVxuICAgICAgICBuZXcgQXJyYXk8UHJvbWlzZTxLbm5SZXN1bHQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICBjb25zdCB3b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KVxuICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL2tubi10aHJlc2hvbGQtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgIHByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgIGlmIChlbmRJZHggPD0gc3RhcnRJZHgpXG4gICAgICAgICAgICByZXNvbHZlV29ya2VyKHtrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSgwKSwga25uSW5kZXhlczogbmV3IEFycmF5KDApfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHt2YWx1ZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGZuTmFtZXMsIG9wdHMsIHRocmVzaG9sZCwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGtubkRpc3RhbmNlcywga25uSW5kZXhlc319KTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHtrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIGNvbnN0IGtublNpemVzID0gbmV3IEludDMyQXJyYXkodmFsdWVzWzBdLmxlbmd0aCk7XG4gICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKVxuICAgICAgICAgIGtublNpemVzW2ldICs9IHJlcy5rbm5JbmRleGVzW2ldPy5sZW5ndGggPz8gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtublJlczogS25uUmVzdWx0ID0ge1xuICAgICAgICBrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4gbmV3IEFycmF5PG51bWJlcj4oa25uU2l6ZXNbaV0pKSxcbiAgICAgICAga25uSW5kZXhlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKChfLCBpKSA9PiBuZXcgQXJyYXk8bnVtYmVyPihrbm5TaXplc1tpXSkpfTtcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXNbMF0ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IChyZXMua25uRGlzdGFuY2VzW2ldPy5sZW5ndGggPz8gMCk7ICsraikge1xuICAgICAgICAgICAga25uUmVzLmtubkRpc3RhbmNlc1tpXVtrbm5TaXplc1tpXSAtIDFdID0gcmVzLmtubkRpc3RhbmNlc1tpXVtqXTtcbiAgICAgICAgICAgIGtublJlcy5rbm5JbmRleGVzW2ldW2tublNpemVzW2ldIC0gMV0gPSByZXMua25uSW5kZXhlc1tpXVtqXTtcbiAgICAgICAgICAgIGtublNpemVzW2ldIC09IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ga25uUmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtdWx0aUNvbHVtbktOTih2YWx1ZXM6IEFycmF5PEFycmF5PGFueT4+LCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgbk5laWdoYm91cnM6IG51bWJlciA9IDE1LFxuICAgICAgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10sIHdlaWdodHM6IG51bWJlcltdLFxuICAgICAgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU5cbiAgICApIHtcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9PSBmbk5hbWVzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSBvcHRzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMsIGRpc3RhbmNlIGZ1bmN0aW9ucywgb3B0aW9ucyBhbmQgd2VpZ2h0cyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIGlmICh2YWx1ZXMuc29tZSgodikgPT4gdi5sZW5ndGggIT09IHZhbHVlc1swXS5sZW5ndGgpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FsbCB2YWx1ZXMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPVxuICAgICAgICBuZXcgQXJyYXk8UHJvbWlzZTxLbm5SZXN1bHQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICBjb25zdCB3b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KVxuICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL2tubi13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgcHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgaWYgKGVuZElkeCA8PSBzdGFydElkeClcbiAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2tubkRpc3RhbmNlczogbmV3IEFycmF5KDApLCBrbm5JbmRleGVzOiBuZXcgQXJyYXkoMCl9KTtcbiAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2Uoe3ZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgZm5OYW1lcywgb3B0cywgbk5laWdoYm91cnMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBrbm5EaXN0YW5jZXMsIGtubkluZGV4ZXN9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7a25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICBjb25zdCBrbm5SZXM6IEtublJlc3VsdCA9IHtcbiAgICAgICAga25uRGlzdGFuY2VzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEFycmF5PG51bWJlcj4obk5laWdoYm91cnMpLmZpbGwoOTk5OTkpKSxcbiAgICAgICAga25uSW5kZXhlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheTxudW1iZXI+KG5OZWlnaGJvdXJzKS5maWxsKC0xKSl9O1xuICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgKHJlcy5rbm5EaXN0YW5jZXNbaV0/Lmxlbmd0aCA/PyAwKTsgKytqKVxuICAgICAgICAgICAgaW5zZXJ0U21hbGxlcihrbm5SZXMua25uRGlzdGFuY2VzW2ldLCBrbm5SZXMua25uSW5kZXhlc1tpXSwgcmVzLmtubkRpc3RhbmNlc1tpXVtqXSwgcmVzLmtubkluZGV4ZXNbaV1bal0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ga25uUmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTYW1wbGVEaXN0YW5jZXModmFsdWVzOiBBcnJheTxhbnlbXT4sXG4gICAgICBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTik6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgICBjb25zdCB0aHJlc2hvbGRXb3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KS5maWxsKG51bGwpXG4gICAgICAgIC5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3NwYXJzZS1tYXRyaXgtdGhyZXNob2xkLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCBtYXhTYW1wbGVTaXplID0gMV8wMDBfMDAwO1xuICAgICAgICBjb25zdCBzYW1wbGVTaXNlID0gTWF0aC5tYXgoTWF0aC5taW4obWF0U2l6ZSAvIDEwMDAsIG1heFNhbXBsZVNpemUpLCBNYXRoLm1pbihtYXRTaXplLCBtYXhTYW1wbGVTaXplKSk7XG4gICAgICAgIGNvbnN0IHRlc3RTZXRTaXplUGVyV29ya2VyID0gTWF0aC5mbG9vcihzYW1wbGVTaXNlIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCB0UHJvbWlzZXMgPSBuZXcgQXJyYXk8UHJvbWlzZTx7ZGlzdGFuY2U6IEZsb2F0MzJBcnJheX0+Pih0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgdFByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBzYW1wbGVMZW5ndGg6IHRlc3RTZXRTaXplUGVyV29ya2VyLFxuICAgICAgICAgICAgICBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGRpc3RhbmNlfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgdGhyZXNob2xkV29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICBpZiAoZXJyb3IpIHJlamVjdFdvcmtlcihlcnJvcik7IGVsc2VcbiAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHtkaXN0YW5jZX0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0UHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBmdWxsU2l6ZSA9IHJlc3VsdHMucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLmRpc3RhbmNlLmxlbmd0aCwgMCk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgZGlzdGFuY2Uuc2V0KHJlcy5kaXN0YW5jZSwgb2Zmc2V0KTtcbiAgICAgICAgICBvZmZzZXQgKz0gcmVzLmRpc3RhbmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBkaXN0YW5jZS5zb3J0KCk7XG5cbiAgICAgICAgcmV0dXJuIGRpc3RhbmNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJlc2hvbGRXb3JrZXJzPy5mb3JFYWNoKCh3KSA9PiB3Py50ZXJtaW5hdGUoKSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KDEpLmZpbGwoMC41KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldE1pbmltYWxUaHJlc2hvbGQodmFsdWVzOiBBcnJheTxhbnlbXT4sXG4gICAgICBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9W10gPSBbXSwgd2VpZ2h0czogbnVtYmVyW10sXG4gICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTikge1xuICAgICAgLy9XZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWluaW1hbCB0aHJlc2hvbGQgZmlyc3QsXG4gICAgICAvL2luIG9yZGVyIHRvIGdldCBtYXRyaXggc3VjaCB0aGF0IGl0IGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplIG9mIDFHQlxuICAgICAgLy93ZSBoYXZlIDMgcmV0dXJuIGFycmF5cywgZWFjaCA0IGJpdGVzIHBlciBlbGVtZW50LCBzbyBpZiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRyaXggaXMgMUdCLFxuICAgICAgY29uc3QgbWF4U3BhcnNlTWF0cml4U2l6ZSA9IDcwXzAwMF8wMDA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGF3YWl0IHRoaXMuZ2V0U2FtcGxlRGlzdGFuY2VzKHZhbHVlcywgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgICBjb25zdCBmcmFjdGlvbkluZGV4ID0gTWF0aC5mbG9vcihtYXhTcGFyc2VNYXRyaXhTaXplIC8gbWF0U2l6ZSAqIGRpc3RhbmNlLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDEgLSBkaXN0YW5jZVtmcmFjdGlvbkluZGV4XTtcbiAgICAgICAgLy8gdGhyZXNob2xkID0gTWF0aC5tYXgodGhyZXNob2xkLCAwLjMpO1xuICAgICAgICByZXR1cm4gdGhyZXNob2xkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICByZXR1cm4gMC41O1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2FsY1N5bmM8VD4oXG4gICAgICB2YWx1ZXM6IEFycmF5PFQ+IHwgQXJyYXlMaWtlPFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcywgZGlzdGFuY2VGbjogRnVuY3Rpb24sIHRocmVzaG9sZDogbnVtYmVyXG4gICAgKSB7XG4gICAgICBjb25zdCBpOiBudW1iZXJbXSA9IFtdO1xuICAgICAgY29uc3QgajogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGxldCBjbnQgPSAwO1xuICAgICAgbGV0IG1pID0gMDtcbiAgICAgIGxldCBtaiA9IDA7XG4gICAgICBjb25zdCBmdWxsU2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIHdoaWxlIChjbnQgPCBmdWxsU2l6ZSkge1xuICAgICAgICAvL2NvbnN0IHZhbHVlID0gc2VxMUxpc3RbbWldICYmIHNlcTFMaXN0W21qXSA/IGhhbW1pbmcoc2VxMUxpc3RbbWldLCBzZXExTGlzdFttal0pIDogMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAhaXNOaWwodmFsdWVzW21pXSkgJiYgIWlzTmlsKHZhbHVlc1ttal0pID9cbiAgICAgICAgICBkaXN0YW5jZUZuKHZhbHVlc1ttaV0sIHZhbHVlc1ttal0pIDogMTtcbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IDEgLSB2YWx1ZTtcbiAgICAgICAgaWYgKHNpbWlsYXJpdHkgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgaS5wdXNoKG1pKTtcbiAgICAgICAgICBqLnB1c2gobWopO1xuICAgICAgICAgIGRpc3RhbmNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjbnQrKztcbiAgICAgICAgbWorKztcbiAgICAgICAgaWYgKG1qID09PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgbWkrKztcbiAgICAgICAgICBtaiA9IG1pICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpQXJyYXkgPSBuZXcgSW50MzJBcnJheShpKTtcbiAgICAgIGNvbnN0IGpBcnJheSA9IG5ldyBJbnQzMkFycmF5KGopO1xuICAgICAgY29uc3QgZGlzdGFuY2VBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZGlzdGFuY2VzKTtcblxuICAgICAgcmV0dXJuIHtpOiBpQXJyYXksIGo6IGpBcnJheSwgZGlzdGFuY2U6IGRpc3RhbmNlQXJyYXl9O1xuICAgIH1cbn1cbiJdfQ==","export var DistanceAggregationMethods;\n(function (DistanceAggregationMethods) {\n DistanceAggregationMethods[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n DistanceAggregationMethods[\"MANHATTAN\"] = \"MANHATTAN\";\n})(DistanceAggregationMethods || (DistanceAggregationMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSwwQkFHVDtBQUhILFdBQVksMEJBQTBCO0lBQ2xDLHFEQUF1QixDQUFBO0lBQ3ZCLHFEQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIUywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR25DO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIHtcbiAgICBFVUNMSURFQU4gPSAnRVVDTElERUFOJyxcbiAgICBNQU5IQVRUQU4gPSAnTUFOSEFUVEFOJyxcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IGtleW9mIHR5cGVvZiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbiJdfQ=="],"names":["SparseMatrixService","constructor","this","_workerCount","Math","max","navigator","hardwareConcurrency","calcMultiColumn","values","fnNames","threshold","opts","weights","aggregationMethod","EUCLIDEAN","matSize","length","chunkSize","floor","minThreshold","getMinimalThreshold","console","log","forEach","_","i","promises","Array","workers","fill","map","Worker","URL","idx","Promise","resolveWorker","rejectWorker","startIdx","endIdx","Int32Array","j","distance","Float32Array","postMessage","onmessage","data","error","terminate","results","all","fullSize","reduce","acc","val","offset","res","set","calc","fnName","getKNN","nNeighbours","multiColumnKNN","getThresholdKNN","multiColumnThresholdKnn","Error","some","v","knnDistances","knnIndexes","knnSizes","knnRes","getSampleDistances","thresholdWorkers","maxSampleSize","sampleSise","min","testSetSizePerWorker","tPromises","sampleLength","sort","e","w","calcSync","distanceFn","distances","cnt","mi","mj","value","push","DistanceAggregationMethods"],"sourceRoot":""}
|