@elarsaks/umap-wasm 0.1.2 → 0.1.4
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/{src/heap.d.ts → heap.d.ts} +1 -1
- package/dist/heap.js +184 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/lib.d.ts +2 -0
- package/dist/lib.js +2 -0
- package/dist/matrix.js +257 -0
- package/dist/{src/nn_descent.d.ts → nn_descent.d.ts} +4 -4
- package/dist/nn_descent.js +127 -0
- package/dist/{src/tree.d.ts → tree.d.ts} +2 -2
- package/dist/tree.js +228 -0
- package/dist/{src/umap.d.ts → umap.d.ts} +1 -1
- package/dist/umap.js +700 -0
- package/dist/{src/utils.d.ts → utils.d.ts} +1 -1
- package/dist/utils.js +98 -0
- package/dist/wasmBridge.js +188 -0
- package/lib/umap-js.js +6842 -7490
- package/lib/umap-js.min.js +1 -1
- package/package.json +64 -63
- package/dist/src/heap.js +0 -226
- package/dist/src/index.d.ts +0 -2
- package/dist/src/index.js +0 -8
- package/dist/src/lib.d.ts +0 -1
- package/dist/src/lib.js +0 -5
- package/dist/src/matrix.js +0 -360
- package/dist/src/nn_descent.js +0 -204
- package/dist/src/tree.js +0 -320
- package/dist/src/umap.js +0 -842
- package/dist/src/utils.js +0 -137
- package/dist/src/wasmBridge.js +0 -290
- package/dist/test/matrix.test.d.ts +0 -1
- package/dist/test/matrix.test.js +0 -169
- package/dist/test/nn_descent.test.d.ts +0 -1
- package/dist/test/nn_descent.test.js +0 -58
- package/dist/test/smoke.playwright.test.d.ts +0 -1
- package/dist/test/smoke.playwright.test.js +0 -98
- package/dist/test/test_data.d.ts +0 -13
- package/dist/test/test_data.js +0 -1054
- package/dist/test/tree.test.d.ts +0 -1
- package/dist/test/tree.test.js +0 -60
- package/dist/test/umap.test.d.ts +0 -1
- package/dist/test/umap.test.js +0 -293
- package/dist/test/utils.test.d.ts +0 -1
- package/dist/test/utils.test.js +0 -128
- package/dist/test/wasmDistance.test.d.ts +0 -1
- package/dist/test/wasmDistance.test.js +0 -124
- package/dist/test/wasmMatrix.test.d.ts +0 -1
- package/dist/test/wasmMatrix.test.js +0 -389
- package/dist/test/wasmTree.test.d.ts +0 -1
- package/dist/test/wasmTree.test.js +0 -212
- /package/dist/{src/matrix.d.ts → matrix.d.ts} +0 -0
- /package/dist/{src/wasmBridge.d.ts → wasmBridge.d.ts} +0 -0
package/dist/src/tree.js
DELETED
|
@@ -1,320 +0,0 @@
|
|
|
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 __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
52
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
53
|
-
if (ar || !(i in from)) {
|
|
54
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
55
|
-
ar[i] = from[i];
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
59
|
-
};
|
|
60
|
-
var __values = (this && this.__values) || function(o) {
|
|
61
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
62
|
-
if (m) return m.call(o);
|
|
63
|
-
if (o && typeof o.length === "number") return {
|
|
64
|
-
next: function () {
|
|
65
|
-
if (o && i >= o.length) o = void 0;
|
|
66
|
-
return { value: o && o[i++], done: !o };
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
70
|
-
};
|
|
71
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
72
|
-
exports.FlatTree = void 0;
|
|
73
|
-
exports.makeForest = makeForest;
|
|
74
|
-
exports.makeLeafArray = makeLeafArray;
|
|
75
|
-
exports.searchFlatTree = searchFlatTree;
|
|
76
|
-
var utils = __importStar(require("./utils"));
|
|
77
|
-
var wasmBridge_1 = require("./wasmBridge");
|
|
78
|
-
var FlatTree = (function () {
|
|
79
|
-
function FlatTree(hyperplanes, offsets, children, indices) {
|
|
80
|
-
this.hyperplanes = hyperplanes;
|
|
81
|
-
this.offsets = offsets;
|
|
82
|
-
this.children = children;
|
|
83
|
-
this.indices = indices;
|
|
84
|
-
}
|
|
85
|
-
FlatTree.fromWasm = function (wasmTree) {
|
|
86
|
-
var jsData = (0, wasmBridge_1.wasmTreeToJs)(wasmTree);
|
|
87
|
-
var tree = new FlatTree(jsData.hyperplanes, jsData.offsets, jsData.children, jsData.indices);
|
|
88
|
-
tree.wasmTree = wasmTree;
|
|
89
|
-
return tree;
|
|
90
|
-
};
|
|
91
|
-
FlatTree.prototype.getWasmTree = function () {
|
|
92
|
-
return this.wasmTree;
|
|
93
|
-
};
|
|
94
|
-
FlatTree.prototype.dispose = function () {
|
|
95
|
-
if (this.wasmTree) {
|
|
96
|
-
this.wasmTree.free();
|
|
97
|
-
this.wasmTree = undefined;
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
return FlatTree;
|
|
101
|
-
}());
|
|
102
|
-
exports.FlatTree = FlatTree;
|
|
103
|
-
function makeForest(data, nNeighbors, nTrees, random, useWasm) {
|
|
104
|
-
if (useWasm === void 0) { useWasm = false; }
|
|
105
|
-
var leafSize = Math.max(10, nNeighbors);
|
|
106
|
-
if (useWasm) {
|
|
107
|
-
if (!(0, wasmBridge_1.isWasmAvailable)()) {
|
|
108
|
-
throw new Error('WASM requested but not available');
|
|
109
|
-
}
|
|
110
|
-
return makeForestWasm(data, leafSize, nTrees, random);
|
|
111
|
-
}
|
|
112
|
-
var trees = utils
|
|
113
|
-
.range(nTrees)
|
|
114
|
-
.map(function (_, i) { return makeTree(data, leafSize, i, random); });
|
|
115
|
-
var forest = trees.map(function (tree) { return flattenTree(tree, leafSize); });
|
|
116
|
-
return forest;
|
|
117
|
-
}
|
|
118
|
-
function makeForestWasm(data, leafSize, nTrees, random) {
|
|
119
|
-
var nSamples = data.length;
|
|
120
|
-
var dim = data[0].length;
|
|
121
|
-
var forest = [];
|
|
122
|
-
for (var i = 0; i < nTrees; i++) {
|
|
123
|
-
var seed = Math.floor(random() * 0xFFFFFFFF);
|
|
124
|
-
var wasmTree = (0, wasmBridge_1.buildRpTreeWasm)(data, nSamples, dim, leafSize, seed);
|
|
125
|
-
forest.push(FlatTree.fromWasm(wasmTree));
|
|
126
|
-
}
|
|
127
|
-
return forest;
|
|
128
|
-
}
|
|
129
|
-
function makeTree(data, leafSize, n, random) {
|
|
130
|
-
if (leafSize === void 0) { leafSize = 30; }
|
|
131
|
-
var indices = utils.range(data.length);
|
|
132
|
-
var tree = makeEuclideanTree(data, indices, leafSize, n, random);
|
|
133
|
-
return tree;
|
|
134
|
-
}
|
|
135
|
-
function makeEuclideanTree(data, indices, leafSize, q, random) {
|
|
136
|
-
if (leafSize === void 0) { leafSize = 30; }
|
|
137
|
-
if (indices.length > leafSize) {
|
|
138
|
-
var splitResults = euclideanRandomProjectionSplit(data, indices, random);
|
|
139
|
-
var indicesLeft = splitResults.indicesLeft, indicesRight = splitResults.indicesRight, hyperplane = splitResults.hyperplane, offset = splitResults.offset;
|
|
140
|
-
var leftChild = makeEuclideanTree(data, indicesLeft, leafSize, q + 1, random);
|
|
141
|
-
var rightChild = makeEuclideanTree(data, indicesRight, leafSize, q + 1, random);
|
|
142
|
-
var node = { leftChild: leftChild, rightChild: rightChild, isLeaf: false, hyperplane: hyperplane, offset: offset };
|
|
143
|
-
return node;
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
var node = { indices: indices, isLeaf: true };
|
|
147
|
-
return node;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
function euclideanRandomProjectionSplit(data, indices, random) {
|
|
151
|
-
var dim = data[0].length;
|
|
152
|
-
var leftIndex = utils.tauRandInt(indices.length, random);
|
|
153
|
-
var rightIndex = utils.tauRandInt(indices.length, random);
|
|
154
|
-
rightIndex += leftIndex === rightIndex ? 1 : 0;
|
|
155
|
-
rightIndex = rightIndex % indices.length;
|
|
156
|
-
var left = indices[leftIndex];
|
|
157
|
-
var right = indices[rightIndex];
|
|
158
|
-
var hyperplaneOffset = 0;
|
|
159
|
-
var hyperplaneVector = utils.zeros(dim);
|
|
160
|
-
for (var i = 0; i < hyperplaneVector.length; i++) {
|
|
161
|
-
hyperplaneVector[i] = data[left][i] - data[right][i];
|
|
162
|
-
hyperplaneOffset -=
|
|
163
|
-
(hyperplaneVector[i] * (data[left][i] + data[right][i])) / 2.0;
|
|
164
|
-
}
|
|
165
|
-
var nLeft = 0;
|
|
166
|
-
var nRight = 0;
|
|
167
|
-
var side = utils.zeros(indices.length);
|
|
168
|
-
for (var i = 0; i < indices.length; i++) {
|
|
169
|
-
var margin = hyperplaneOffset;
|
|
170
|
-
for (var d = 0; d < dim; d++) {
|
|
171
|
-
margin += hyperplaneVector[d] * data[indices[i]][d];
|
|
172
|
-
}
|
|
173
|
-
if (margin === 0) {
|
|
174
|
-
side[i] = utils.tauRandInt(2, random);
|
|
175
|
-
if (side[i] === 0) {
|
|
176
|
-
nLeft += 1;
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
nRight += 1;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
else if (margin > 0) {
|
|
183
|
-
side[i] = 0;
|
|
184
|
-
nLeft += 1;
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
side[i] = 1;
|
|
188
|
-
nRight += 1;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
var indicesLeft = utils.zeros(nLeft);
|
|
192
|
-
var indicesRight = utils.zeros(nRight);
|
|
193
|
-
nLeft = 0;
|
|
194
|
-
nRight = 0;
|
|
195
|
-
for (var i = 0; i < side.length; i++) {
|
|
196
|
-
if (side[i] === 0) {
|
|
197
|
-
indicesLeft[nLeft] = indices[i];
|
|
198
|
-
nLeft += 1;
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
indicesRight[nRight] = indices[i];
|
|
202
|
-
nRight += 1;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
return {
|
|
206
|
-
indicesLeft: indicesLeft,
|
|
207
|
-
indicesRight: indicesRight,
|
|
208
|
-
hyperplane: hyperplaneVector,
|
|
209
|
-
offset: hyperplaneOffset,
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
function flattenTree(tree, leafSize) {
|
|
213
|
-
var nNodes = numNodes(tree);
|
|
214
|
-
var nLeaves = numLeaves(tree);
|
|
215
|
-
var hyperplanes = utils
|
|
216
|
-
.range(nNodes)
|
|
217
|
-
.map(function () { return utils.zeros(tree.hyperplane ? tree.hyperplane.length : 0); });
|
|
218
|
-
var offsets = utils.zeros(nNodes);
|
|
219
|
-
var children = utils.range(nNodes).map(function () { return [-1, -1]; });
|
|
220
|
-
var indices = utils
|
|
221
|
-
.range(nLeaves)
|
|
222
|
-
.map(function () { return utils.range(leafSize).map(function () { return -1; }); });
|
|
223
|
-
recursiveFlatten(tree, hyperplanes, offsets, children, indices, 0, 0);
|
|
224
|
-
return new FlatTree(hyperplanes, offsets, children, indices);
|
|
225
|
-
}
|
|
226
|
-
function recursiveFlatten(tree, hyperplanes, offsets, children, indices, nodeNum, leafNum) {
|
|
227
|
-
var _a;
|
|
228
|
-
if (tree.isLeaf) {
|
|
229
|
-
children[nodeNum][0] = -leafNum;
|
|
230
|
-
(_a = indices[leafNum]).splice.apply(_a, __spreadArray([0, tree.indices.length], __read(tree.indices), false));
|
|
231
|
-
leafNum += 1;
|
|
232
|
-
return { nodeNum: nodeNum, leafNum: leafNum };
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
hyperplanes[nodeNum] = tree.hyperplane;
|
|
236
|
-
offsets[nodeNum] = tree.offset;
|
|
237
|
-
children[nodeNum][0] = nodeNum + 1;
|
|
238
|
-
var oldNodeNum = nodeNum;
|
|
239
|
-
var res = recursiveFlatten(tree.leftChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);
|
|
240
|
-
nodeNum = res.nodeNum;
|
|
241
|
-
leafNum = res.leafNum;
|
|
242
|
-
children[oldNodeNum][1] = nodeNum + 1;
|
|
243
|
-
res = recursiveFlatten(tree.rightChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);
|
|
244
|
-
return { nodeNum: res.nodeNum, leafNum: res.leafNum };
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
function numNodes(tree) {
|
|
248
|
-
if (tree.isLeaf) {
|
|
249
|
-
return 1;
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
return 1 + numNodes(tree.leftChild) + numNodes(tree.rightChild);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
function numLeaves(tree) {
|
|
256
|
-
if (tree.isLeaf) {
|
|
257
|
-
return 1;
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
260
|
-
return numLeaves(tree.leftChild) + numLeaves(tree.rightChild);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
function makeLeafArray(rpForest) {
|
|
264
|
-
var e_1, _a;
|
|
265
|
-
if (rpForest.length > 0) {
|
|
266
|
-
var output = [];
|
|
267
|
-
try {
|
|
268
|
-
for (var rpForest_1 = __values(rpForest), rpForest_1_1 = rpForest_1.next(); !rpForest_1_1.done; rpForest_1_1 = rpForest_1.next()) {
|
|
269
|
-
var tree = rpForest_1_1.value;
|
|
270
|
-
output.push.apply(output, __spreadArray([], __read(tree.indices), false));
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
274
|
-
finally {
|
|
275
|
-
try {
|
|
276
|
-
if (rpForest_1_1 && !rpForest_1_1.done && (_a = rpForest_1.return)) _a.call(rpForest_1);
|
|
277
|
-
}
|
|
278
|
-
finally { if (e_1) throw e_1.error; }
|
|
279
|
-
}
|
|
280
|
-
return output;
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
return [[-1]];
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
function selectSide(hyperplane, offset, point, random) {
|
|
287
|
-
var margin = offset;
|
|
288
|
-
for (var d = 0; d < point.length; d++) {
|
|
289
|
-
margin += hyperplane[d] * point[d];
|
|
290
|
-
}
|
|
291
|
-
if (margin === 0) {
|
|
292
|
-
var side = utils.tauRandInt(2, random);
|
|
293
|
-
return side;
|
|
294
|
-
}
|
|
295
|
-
else if (margin > 0) {
|
|
296
|
-
return 0;
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
return 1;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
function searchFlatTree(point, tree, random) {
|
|
303
|
-
var wasmTree = tree.getWasmTree();
|
|
304
|
-
if (wasmTree && (0, wasmBridge_1.isWasmAvailable)()) {
|
|
305
|
-
var seed = Math.floor(random() * 0xFFFFFFFF);
|
|
306
|
-
return (0, wasmBridge_1.searchFlatTreeWasm)(wasmTree, point, seed);
|
|
307
|
-
}
|
|
308
|
-
var node = 0;
|
|
309
|
-
while (tree.children[node][0] > 0) {
|
|
310
|
-
var side = selectSide(tree.hyperplanes[node], tree.offsets[node], point, random);
|
|
311
|
-
if (side === 0) {
|
|
312
|
-
node = tree.children[node][0];
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
node = tree.children[node][1];
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
var index = -1 * tree.children[node][0];
|
|
319
|
-
return tree.indices[index];
|
|
320
|
-
}
|