@elarsaks/umap-wasm 0.1.0

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.
Files changed (41) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +349 -0
  3. package/dist/src/heap.d.ts +12 -0
  4. package/dist/src/heap.js +226 -0
  5. package/dist/src/index.d.ts +1 -0
  6. package/dist/src/index.js +5 -0
  7. package/dist/src/lib.d.ts +1 -0
  8. package/dist/src/lib.js +5 -0
  9. package/dist/src/matrix.d.ts +41 -0
  10. package/dist/src/matrix.js +360 -0
  11. package/dist/src/nn_descent.d.ts +17 -0
  12. package/dist/src/nn_descent.js +204 -0
  13. package/dist/src/tree.d.ts +16 -0
  14. package/dist/src/tree.js +320 -0
  15. package/dist/src/umap.d.ts +102 -0
  16. package/dist/src/umap.js +842 -0
  17. package/dist/src/utils.d.ts +16 -0
  18. package/dist/src/utils.js +137 -0
  19. package/dist/src/wasmBridge.d.ts +57 -0
  20. package/dist/src/wasmBridge.js +290 -0
  21. package/dist/test/matrix.test.d.ts +1 -0
  22. package/dist/test/matrix.test.js +169 -0
  23. package/dist/test/nn_descent.test.d.ts +1 -0
  24. package/dist/test/nn_descent.test.js +58 -0
  25. package/dist/test/test_data.d.ts +13 -0
  26. package/dist/test/test_data.js +1054 -0
  27. package/dist/test/tree.test.d.ts +1 -0
  28. package/dist/test/tree.test.js +60 -0
  29. package/dist/test/umap.test.d.ts +1 -0
  30. package/dist/test/umap.test.js +293 -0
  31. package/dist/test/utils.test.d.ts +1 -0
  32. package/dist/test/utils.test.js +128 -0
  33. package/dist/test/wasmDistance.test.d.ts +1 -0
  34. package/dist/test/wasmDistance.test.js +124 -0
  35. package/dist/test/wasmMatrix.test.d.ts +1 -0
  36. package/dist/test/wasmMatrix.test.js +389 -0
  37. package/dist/test/wasmTree.test.d.ts +1 -0
  38. package/dist/test/wasmTree.test.js +212 -0
  39. package/lib/umap-js.js +8657 -0
  40. package/lib/umap-js.min.js +1 -0
  41. package/package.json +58 -0
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.makeHeap = makeHeap;
37
+ exports.rejectionSample = rejectionSample;
38
+ exports.heapPush = heapPush;
39
+ exports.uncheckedHeapPush = uncheckedHeapPush;
40
+ exports.buildCandidates = buildCandidates;
41
+ exports.deheapSort = deheapSort;
42
+ exports.smallestFlagged = smallestFlagged;
43
+ var utils = __importStar(require("./utils"));
44
+ function makeHeap(nPoints, size) {
45
+ var makeArrays = function (fillValue) {
46
+ return utils.empty(nPoints).map(function () {
47
+ return utils.filled(size, fillValue);
48
+ });
49
+ };
50
+ var heap = [];
51
+ heap.push(makeArrays(-1));
52
+ heap.push(makeArrays(Infinity));
53
+ heap.push(makeArrays(0));
54
+ return heap;
55
+ }
56
+ function rejectionSample(nSamples, poolSize, random) {
57
+ var result = utils.zeros(nSamples);
58
+ for (var i = 0; i < nSamples; i++) {
59
+ var rejectSample = true;
60
+ var j = 0;
61
+ while (rejectSample) {
62
+ j = utils.tauRandInt(poolSize, random);
63
+ var broken = false;
64
+ for (var k = 0; k < i; k++) {
65
+ if (j === result[k]) {
66
+ broken = true;
67
+ break;
68
+ }
69
+ }
70
+ if (!broken)
71
+ rejectSample = false;
72
+ }
73
+ result[i] = j;
74
+ }
75
+ return result;
76
+ }
77
+ function heapPush(heap, row, weight, index, flag) {
78
+ row = Math.floor(row);
79
+ var indices = heap[0][row];
80
+ var weights = heap[1][row];
81
+ var isNew = heap[2][row];
82
+ if (weight >= weights[0]) {
83
+ return 0;
84
+ }
85
+ for (var i = 0; i < indices.length; i++) {
86
+ if (index === indices[i]) {
87
+ return 0;
88
+ }
89
+ }
90
+ return uncheckedHeapPush(heap, row, weight, index, flag);
91
+ }
92
+ function uncheckedHeapPush(heap, row, weight, index, flag) {
93
+ var indices = heap[0][row];
94
+ var weights = heap[1][row];
95
+ var isNew = heap[2][row];
96
+ if (weight >= weights[0]) {
97
+ return 0;
98
+ }
99
+ weights[0] = weight;
100
+ indices[0] = index;
101
+ isNew[0] = flag;
102
+ var i = 0;
103
+ var iSwap = 0;
104
+ while (true) {
105
+ var ic1 = 2 * i + 1;
106
+ var ic2 = ic1 + 1;
107
+ var heapShape2 = heap[0][0].length;
108
+ if (ic1 >= heapShape2) {
109
+ break;
110
+ }
111
+ else if (ic2 >= heapShape2) {
112
+ if (weights[ic1] > weight) {
113
+ iSwap = ic1;
114
+ }
115
+ else {
116
+ break;
117
+ }
118
+ }
119
+ else if (weights[ic1] >= weights[ic2]) {
120
+ if (weight < weights[ic1]) {
121
+ iSwap = ic1;
122
+ }
123
+ else {
124
+ break;
125
+ }
126
+ }
127
+ else {
128
+ if (weight < weights[ic2]) {
129
+ iSwap = ic2;
130
+ }
131
+ else {
132
+ break;
133
+ }
134
+ }
135
+ weights[i] = weights[iSwap];
136
+ indices[i] = indices[iSwap];
137
+ isNew[i] = isNew[iSwap];
138
+ i = iSwap;
139
+ }
140
+ weights[i] = weight;
141
+ indices[i] = index;
142
+ isNew[i] = flag;
143
+ return 1;
144
+ }
145
+ function buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random) {
146
+ var candidateNeighbors = makeHeap(nVertices, maxCandidates);
147
+ for (var i = 0; i < nVertices; i++) {
148
+ for (var j = 0; j < nNeighbors; j++) {
149
+ if (currentGraph[0][i][j] < 0) {
150
+ continue;
151
+ }
152
+ var idx = currentGraph[0][i][j];
153
+ var isn = currentGraph[2][i][j];
154
+ var d = utils.tauRand(random);
155
+ heapPush(candidateNeighbors, i, d, idx, isn);
156
+ heapPush(candidateNeighbors, idx, d, i, isn);
157
+ currentGraph[2][i][j] = 0;
158
+ }
159
+ }
160
+ return candidateNeighbors;
161
+ }
162
+ function deheapSort(heap) {
163
+ var indices = heap[0];
164
+ var weights = heap[1];
165
+ for (var i = 0; i < indices.length; i++) {
166
+ var indHeap = indices[i];
167
+ var distHeap = weights[i];
168
+ for (var j = 0; j < indHeap.length - 1; j++) {
169
+ var indHeapIndex = indHeap.length - j - 1;
170
+ var distHeapIndex = distHeap.length - j - 1;
171
+ var temp1 = indHeap[0];
172
+ indHeap[0] = indHeap[indHeapIndex];
173
+ indHeap[indHeapIndex] = temp1;
174
+ var temp2 = distHeap[0];
175
+ distHeap[0] = distHeap[distHeapIndex];
176
+ distHeap[distHeapIndex] = temp2;
177
+ siftDown(distHeap, indHeap, distHeapIndex, 0);
178
+ }
179
+ }
180
+ return { indices: indices, weights: weights };
181
+ }
182
+ function siftDown(heap1, heap2, ceiling, elt) {
183
+ while (elt * 2 + 1 < ceiling) {
184
+ var leftChild = elt * 2 + 1;
185
+ var rightChild = leftChild + 1;
186
+ var swap = elt;
187
+ if (heap1[swap] < heap1[leftChild]) {
188
+ swap = leftChild;
189
+ }
190
+ if (rightChild < ceiling && heap1[swap] < heap1[rightChild]) {
191
+ swap = rightChild;
192
+ }
193
+ if (swap === elt) {
194
+ break;
195
+ }
196
+ else {
197
+ var temp1 = heap1[elt];
198
+ heap1[elt] = heap1[swap];
199
+ heap1[swap] = temp1;
200
+ var temp2 = heap2[elt];
201
+ heap2[elt] = heap2[swap];
202
+ heap2[swap] = temp2;
203
+ elt = swap;
204
+ }
205
+ }
206
+ }
207
+ function smallestFlagged(heap, row) {
208
+ var ind = heap[0][row];
209
+ var dist = heap[1][row];
210
+ var flag = heap[2][row];
211
+ var minDist = Infinity;
212
+ var resultIndex = -1;
213
+ for (var i = 0; i > ind.length; i++) {
214
+ if (flag[i] === 1 && dist[i] < minDist) {
215
+ minDist = dist[i];
216
+ resultIndex = i;
217
+ }
218
+ }
219
+ if (resultIndex >= 0) {
220
+ flag[resultIndex] = 0;
221
+ return Math.floor(ind[resultIndex]);
222
+ }
223
+ else {
224
+ return -1;
225
+ }
226
+ }
@@ -0,0 +1 @@
1
+ export { UMAP, UMAPParameters } from './umap';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UMAP = void 0;
4
+ var umap_1 = require("./umap");
5
+ Object.defineProperty(exports, "UMAP", { enumerable: true, get: function () { return umap_1.UMAP; } });
@@ -0,0 +1 @@
1
+ export { UMAP } from './umap';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UMAP = void 0;
4
+ var umap_1 = require("./umap");
5
+ Object.defineProperty(exports, "UMAP", { enumerable: true, get: function () { return umap_1.UMAP; } });
@@ -0,0 +1,41 @@
1
+ export declare class SparseMatrix {
2
+ private entries;
3
+ readonly nRows: number;
4
+ readonly nCols: number;
5
+ constructor(rows: number[], cols: number[], values: number[], dims: number[]);
6
+ private makeKey;
7
+ private checkDims;
8
+ set(row: number, col: number, value: number): void;
9
+ get(row: number, col: number, defaultValue?: number): number;
10
+ getAll(ordered?: boolean): {
11
+ value: number;
12
+ row: number;
13
+ col: number;
14
+ }[];
15
+ getDims(): number[];
16
+ getRows(): number[];
17
+ getCols(): number[];
18
+ getValues(): number[];
19
+ forEach(fn: (value: number, row: number, col: number) => void): void;
20
+ map(fn: (value: number, row: number, col: number) => number): SparseMatrix;
21
+ toArray(): number[][];
22
+ }
23
+ export declare function transpose(matrix: SparseMatrix): SparseMatrix;
24
+ export declare function identity(size: number[]): SparseMatrix;
25
+ export declare function pairwiseMultiply(a: SparseMatrix, b: SparseMatrix): SparseMatrix;
26
+ export declare function add(a: SparseMatrix, b: SparseMatrix): SparseMatrix;
27
+ export declare function subtract(a: SparseMatrix, b: SparseMatrix): SparseMatrix;
28
+ export declare function maximum(a: SparseMatrix, b: SparseMatrix): SparseMatrix;
29
+ export declare function multiplyScalar(a: SparseMatrix, scalar: number): SparseMatrix;
30
+ export declare function eliminateZeros(m: SparseMatrix): SparseMatrix;
31
+ export declare function normalize(m: SparseMatrix, normType?: NormType): SparseMatrix;
32
+ export declare const enum NormType {
33
+ max = "max",
34
+ l1 = "l1",
35
+ l2 = "l2"
36
+ }
37
+ export declare function getCSR(x: SparseMatrix): {
38
+ indices: number[];
39
+ values: number[];
40
+ indptr: number[];
41
+ };
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __read = (this && this.__read) || function (o, n) {
36
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
37
+ if (!m) return o;
38
+ var i = m.call(o), r, ar = [], e;
39
+ try {
40
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
41
+ }
42
+ catch (error) { e = { error: error }; }
43
+ finally {
44
+ try {
45
+ if (r && !r.done && (m = i["return"])) m.call(i);
46
+ }
47
+ finally { if (e) throw e.error; }
48
+ }
49
+ return ar;
50
+ };
51
+ var __values = (this && this.__values) || function(o) {
52
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
53
+ if (m) return m.call(o);
54
+ if (o && typeof o.length === "number") return {
55
+ next: function () {
56
+ if (o && i >= o.length) o = void 0;
57
+ return { value: o && o[i++], done: !o };
58
+ }
59
+ };
60
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
61
+ };
62
+ var _a;
63
+ Object.defineProperty(exports, "__esModule", { value: true });
64
+ exports.SparseMatrix = void 0;
65
+ exports.transpose = transpose;
66
+ exports.identity = identity;
67
+ exports.pairwiseMultiply = pairwiseMultiply;
68
+ exports.add = add;
69
+ exports.subtract = subtract;
70
+ exports.maximum = maximum;
71
+ exports.multiplyScalar = multiplyScalar;
72
+ exports.eliminateZeros = eliminateZeros;
73
+ exports.normalize = normalize;
74
+ exports.getCSR = getCSR;
75
+ var utils = __importStar(require("./utils"));
76
+ var SparseMatrix = (function () {
77
+ function SparseMatrix(rows, cols, values, dims) {
78
+ this.entries = new Map();
79
+ this.nRows = 0;
80
+ this.nCols = 0;
81
+ if (rows.length !== cols.length || rows.length !== values.length) {
82
+ throw new Error('rows, cols and values arrays must all have the same length');
83
+ }
84
+ this.nRows = dims[0];
85
+ this.nCols = dims[1];
86
+ for (var i = 0; i < values.length; i++) {
87
+ var row = rows[i];
88
+ var col = cols[i];
89
+ this.checkDims(row, col);
90
+ var key = this.makeKey(row, col);
91
+ this.entries.set(key, { value: values[i], row: row, col: col });
92
+ }
93
+ }
94
+ SparseMatrix.prototype.makeKey = function (row, col) {
95
+ return "".concat(row, ":").concat(col);
96
+ };
97
+ SparseMatrix.prototype.checkDims = function (row, col) {
98
+ var withinBounds = row < this.nRows && col < this.nCols;
99
+ if (!withinBounds) {
100
+ throw new Error('row and/or col specified outside of matrix dimensions');
101
+ }
102
+ };
103
+ SparseMatrix.prototype.set = function (row, col, value) {
104
+ this.checkDims(row, col);
105
+ var key = this.makeKey(row, col);
106
+ if (!this.entries.has(key)) {
107
+ this.entries.set(key, { value: value, row: row, col: col });
108
+ }
109
+ else {
110
+ this.entries.get(key).value = value;
111
+ }
112
+ };
113
+ SparseMatrix.prototype.get = function (row, col, defaultValue) {
114
+ if (defaultValue === void 0) { defaultValue = 0; }
115
+ this.checkDims(row, col);
116
+ var key = this.makeKey(row, col);
117
+ if (this.entries.has(key)) {
118
+ return this.entries.get(key).value;
119
+ }
120
+ else {
121
+ return defaultValue;
122
+ }
123
+ };
124
+ SparseMatrix.prototype.getAll = function (ordered) {
125
+ if (ordered === void 0) { ordered = true; }
126
+ var rowColValues = [];
127
+ this.entries.forEach(function (value) {
128
+ rowColValues.push(value);
129
+ });
130
+ if (ordered) {
131
+ rowColValues.sort(function (a, b) {
132
+ if (a.row === b.row) {
133
+ return a.col - b.col;
134
+ }
135
+ else {
136
+ return a.row - b.row;
137
+ }
138
+ });
139
+ }
140
+ return rowColValues;
141
+ };
142
+ SparseMatrix.prototype.getDims = function () {
143
+ return [this.nRows, this.nCols];
144
+ };
145
+ SparseMatrix.prototype.getRows = function () {
146
+ return Array.from(this.entries, function (_a) {
147
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
148
+ return value.row;
149
+ });
150
+ };
151
+ SparseMatrix.prototype.getCols = function () {
152
+ return Array.from(this.entries, function (_a) {
153
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
154
+ return value.col;
155
+ });
156
+ };
157
+ SparseMatrix.prototype.getValues = function () {
158
+ return Array.from(this.entries, function (_a) {
159
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
160
+ return value.value;
161
+ });
162
+ };
163
+ SparseMatrix.prototype.forEach = function (fn) {
164
+ this.entries.forEach(function (value) { return fn(value.value, value.row, value.col); });
165
+ };
166
+ SparseMatrix.prototype.map = function (fn) {
167
+ var vals = [];
168
+ this.entries.forEach(function (value) {
169
+ vals.push(fn(value.value, value.row, value.col));
170
+ });
171
+ var dims = [this.nRows, this.nCols];
172
+ return new SparseMatrix(this.getRows(), this.getCols(), vals, dims);
173
+ };
174
+ SparseMatrix.prototype.toArray = function () {
175
+ var _this = this;
176
+ var rows = utils.empty(this.nRows);
177
+ var output = rows.map(function () {
178
+ return utils.zeros(_this.nCols);
179
+ });
180
+ this.entries.forEach(function (value) {
181
+ output[value.row][value.col] = value.value;
182
+ });
183
+ return output;
184
+ };
185
+ return SparseMatrix;
186
+ }());
187
+ exports.SparseMatrix = SparseMatrix;
188
+ function transpose(matrix) {
189
+ var cols = [];
190
+ var rows = [];
191
+ var vals = [];
192
+ matrix.forEach(function (value, row, col) {
193
+ cols.push(row);
194
+ rows.push(col);
195
+ vals.push(value);
196
+ });
197
+ var dims = [matrix.nCols, matrix.nRows];
198
+ return new SparseMatrix(rows, cols, vals, dims);
199
+ }
200
+ function identity(size) {
201
+ var _a = __read(size, 1), rows = _a[0];
202
+ var matrix = new SparseMatrix([], [], [], size);
203
+ for (var i = 0; i < rows; i++) {
204
+ matrix.set(i, i, 1);
205
+ }
206
+ return matrix;
207
+ }
208
+ function pairwiseMultiply(a, b) {
209
+ return elementWise(a, b, function (x, y) { return x * y; });
210
+ }
211
+ function add(a, b) {
212
+ return elementWise(a, b, function (x, y) { return x + y; });
213
+ }
214
+ function subtract(a, b) {
215
+ return elementWise(a, b, function (x, y) { return x - y; });
216
+ }
217
+ function maximum(a, b) {
218
+ return elementWise(a, b, function (x, y) { return (x > y ? x : y); });
219
+ }
220
+ function multiplyScalar(a, scalar) {
221
+ return a.map(function (value) {
222
+ return value * scalar;
223
+ });
224
+ }
225
+ function eliminateZeros(m) {
226
+ var zeroIndices = new Set();
227
+ var values = m.getValues();
228
+ var rows = m.getRows();
229
+ var cols = m.getCols();
230
+ for (var i = 0; i < values.length; i++) {
231
+ if (values[i] === 0) {
232
+ zeroIndices.add(i);
233
+ }
234
+ }
235
+ var removeByZeroIndex = function (_, index) { return !zeroIndices.has(index); };
236
+ var nextValues = values.filter(removeByZeroIndex);
237
+ var nextRows = rows.filter(removeByZeroIndex);
238
+ var nextCols = cols.filter(removeByZeroIndex);
239
+ return new SparseMatrix(nextRows, nextCols, nextValues, m.getDims());
240
+ }
241
+ function normalize(m, normType) {
242
+ var e_1, _a;
243
+ if (normType === void 0) { normType = "l2"; }
244
+ var normFn = normFns[normType];
245
+ var colsByRow = new Map();
246
+ m.forEach(function (_, row, col) {
247
+ var cols = colsByRow.get(row) || [];
248
+ cols.push(col);
249
+ colsByRow.set(row, cols);
250
+ });
251
+ var nextMatrix = new SparseMatrix([], [], [], m.getDims());
252
+ var _loop_1 = function (row) {
253
+ var cols = colsByRow.get(row).sort();
254
+ var vals = cols.map(function (col) { return m.get(row, col); });
255
+ var norm = normFn(vals);
256
+ for (var i = 0; i < norm.length; i++) {
257
+ nextMatrix.set(row, cols[i], norm[i]);
258
+ }
259
+ };
260
+ try {
261
+ for (var _b = __values(colsByRow.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {
262
+ var row = _c.value;
263
+ _loop_1(row);
264
+ }
265
+ }
266
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
267
+ finally {
268
+ try {
269
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
270
+ }
271
+ finally { if (e_1) throw e_1.error; }
272
+ }
273
+ return nextMatrix;
274
+ }
275
+ var normFns = (_a = {},
276
+ _a["max"] = function (xs) {
277
+ var max = -Infinity;
278
+ for (var i = 0; i < xs.length; i++) {
279
+ max = xs[i] > max ? xs[i] : max;
280
+ }
281
+ return xs.map(function (x) { return x / max; });
282
+ },
283
+ _a["l1"] = function (xs) {
284
+ var sum = 0;
285
+ for (var i = 0; i < xs.length; i++) {
286
+ sum += xs[i];
287
+ }
288
+ return xs.map(function (x) { return x / sum; });
289
+ },
290
+ _a["l2"] = function (xs) {
291
+ var sum = 0;
292
+ for (var i = 0; i < xs.length; i++) {
293
+ sum += Math.pow(xs[i], 2);
294
+ }
295
+ return xs.map(function (x) { return Math.sqrt(Math.pow(x, 2) / sum); });
296
+ },
297
+ _a);
298
+ function elementWise(a, b, op) {
299
+ var visited = new Set();
300
+ var rows = [];
301
+ var cols = [];
302
+ var vals = [];
303
+ var operate = function (row, col) {
304
+ rows.push(row);
305
+ cols.push(col);
306
+ var nextValue = op(a.get(row, col), b.get(row, col));
307
+ vals.push(nextValue);
308
+ };
309
+ var valuesA = a.getValues();
310
+ var rowsA = a.getRows();
311
+ var colsA = a.getCols();
312
+ for (var i = 0; i < valuesA.length; i++) {
313
+ var row = rowsA[i];
314
+ var col = colsA[i];
315
+ var key = "".concat(row, ":").concat(col);
316
+ visited.add(key);
317
+ operate(row, col);
318
+ }
319
+ var valuesB = b.getValues();
320
+ var rowsB = b.getRows();
321
+ var colsB = b.getCols();
322
+ for (var i = 0; i < valuesB.length; i++) {
323
+ var row = rowsB[i];
324
+ var col = colsB[i];
325
+ var key = "".concat(row, ":").concat(col);
326
+ if (visited.has(key))
327
+ continue;
328
+ operate(row, col);
329
+ }
330
+ var dims = [a.nRows, a.nCols];
331
+ return new SparseMatrix(rows, cols, vals, dims);
332
+ }
333
+ function getCSR(x) {
334
+ var entries = [];
335
+ x.forEach(function (value, row, col) {
336
+ entries.push({ value: value, row: row, col: col });
337
+ });
338
+ entries.sort(function (a, b) {
339
+ if (a.row === b.row) {
340
+ return a.col - b.col;
341
+ }
342
+ else {
343
+ return a.row - b.row;
344
+ }
345
+ });
346
+ var indices = [];
347
+ var values = [];
348
+ var indptr = [];
349
+ var currentRow = -1;
350
+ for (var i = 0; i < entries.length; i++) {
351
+ var _a = entries[i], row = _a.row, col = _a.col, value = _a.value;
352
+ if (row !== currentRow) {
353
+ currentRow = row;
354
+ indptr.push(i);
355
+ }
356
+ indices.push(col);
357
+ values.push(value);
358
+ }
359
+ return { indices: indices, values: values, indptr: indptr };
360
+ }
@@ -0,0 +1,17 @@
1
+ import * as heap from './heap';
2
+ import * as matrix from './matrix';
3
+ import * as tree from './tree';
4
+ import { RandomFn, Vectors, DistanceFn } from './umap';
5
+ export declare function makeNNDescent(distanceFn: DistanceFn, random: RandomFn): (data: Vectors, leafArray: Vectors, nNeighbors: number, nIters?: number, maxCandidates?: number, delta?: number, rho?: number, rpTreeInit?: boolean) => {
6
+ indices: number[][];
7
+ weights: number[][];
8
+ };
9
+ export type InitFromRandomFn = (nNeighbors: number, data: Vectors, queryPoints: Vectors, _heap: heap.Heap, random: RandomFn) => void;
10
+ export type InitFromTreeFn = (_tree: tree.FlatTree, data: Vectors, queryPoints: Vectors, _heap: heap.Heap, random: RandomFn) => void;
11
+ export declare function makeInitializations(distanceFn: DistanceFn): {
12
+ initFromRandom: (nNeighbors: number, data: Vectors, queryPoints: Vectors, _heap: heap.Heap, random: RandomFn) => void;
13
+ initFromTree: (_tree: tree.FlatTree, data: Vectors, queryPoints: Vectors, _heap: heap.Heap, random: RandomFn) => void;
14
+ };
15
+ export type SearchFn = (data: Vectors, graph: matrix.SparseMatrix, initialization: heap.Heap, queryPoints: Vectors) => heap.Heap;
16
+ export declare function makeInitializedNNSearch(distanceFn: DistanceFn): (data: Vectors, graph: matrix.SparseMatrix, initialization: heap.Heap, queryPoints: Vectors) => heap.Heap;
17
+ export declare function initializeSearch(forest: tree.FlatTree[], data: Vectors, queryPoints: Vectors, nNeighbors: number, initFromRandom: InitFromRandomFn, initFromTree: InitFromTreeFn, random: RandomFn): heap.Heap;