@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,16 @@
1
+ import { RandomFn } from './umap';
2
+ export declare function tauRandInt(n: number, random: RandomFn): number;
3
+ export declare function tauRand(random: RandomFn): number;
4
+ export declare function norm(vec: number[]): number;
5
+ export declare function empty(n: number): undefined[];
6
+ export declare function range(n: number): number[];
7
+ export declare function filled(n: number, v: number): number[];
8
+ export declare function zeros(n: number): number[];
9
+ export declare function ones(n: number): number[];
10
+ export declare function linear(a: number, b: number, len: number): number[];
11
+ export declare function sum(input: number[]): number;
12
+ export declare function mean(input: number[]): number;
13
+ export declare function max(input: number[]): number;
14
+ export declare function max2d(input: number[][]): number;
15
+ export declare function rejectionSample(nSamples: number, poolSize: number, random: RandomFn): number[];
16
+ export declare function reshape2d<T>(x: T[], a: number, b: number): T[][];
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __values = (this && this.__values) || function(o) {
3
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
+ if (m) return m.call(o);
5
+ if (o && typeof o.length === "number") return {
6
+ next: function () {
7
+ if (o && i >= o.length) o = void 0;
8
+ return { value: o && o[i++], done: !o };
9
+ }
10
+ };
11
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.tauRandInt = tauRandInt;
15
+ exports.tauRand = tauRand;
16
+ exports.norm = norm;
17
+ exports.empty = empty;
18
+ exports.range = range;
19
+ exports.filled = filled;
20
+ exports.zeros = zeros;
21
+ exports.ones = ones;
22
+ exports.linear = linear;
23
+ exports.sum = sum;
24
+ exports.mean = mean;
25
+ exports.max = max;
26
+ exports.max2d = max2d;
27
+ exports.rejectionSample = rejectionSample;
28
+ exports.reshape2d = reshape2d;
29
+ function tauRandInt(n, random) {
30
+ return Math.floor(random() * n);
31
+ }
32
+ function tauRand(random) {
33
+ return random();
34
+ }
35
+ function norm(vec) {
36
+ var e_1, _a;
37
+ var result = 0;
38
+ try {
39
+ for (var vec_1 = __values(vec), vec_1_1 = vec_1.next(); !vec_1_1.done; vec_1_1 = vec_1.next()) {
40
+ var item = vec_1_1.value;
41
+ result += Math.pow(item, 2);
42
+ }
43
+ }
44
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
45
+ finally {
46
+ try {
47
+ if (vec_1_1 && !vec_1_1.done && (_a = vec_1.return)) _a.call(vec_1);
48
+ }
49
+ finally { if (e_1) throw e_1.error; }
50
+ }
51
+ return Math.sqrt(result);
52
+ }
53
+ function empty(n) {
54
+ var output = [];
55
+ for (var i = 0; i < n; i++) {
56
+ output.push(undefined);
57
+ }
58
+ return output;
59
+ }
60
+ function range(n) {
61
+ return empty(n).map(function (_, i) { return i; });
62
+ }
63
+ function filled(n, v) {
64
+ return empty(n).map(function () { return v; });
65
+ }
66
+ function zeros(n) {
67
+ return filled(n, 0);
68
+ }
69
+ function ones(n) {
70
+ return filled(n, 1);
71
+ }
72
+ function linear(a, b, len) {
73
+ return empty(len).map(function (_, i) {
74
+ return a + i * ((b - a) / (len - 1));
75
+ });
76
+ }
77
+ function sum(input) {
78
+ return input.reduce(function (sum, val) { return sum + val; });
79
+ }
80
+ function mean(input) {
81
+ return sum(input) / input.length;
82
+ }
83
+ function max(input) {
84
+ var max = 0;
85
+ for (var i = 0; i < input.length; i++) {
86
+ max = input[i] > max ? input[i] : max;
87
+ }
88
+ return max;
89
+ }
90
+ function max2d(input) {
91
+ var max = 0;
92
+ for (var i = 0; i < input.length; i++) {
93
+ for (var j = 0; j < input[i].length; j++) {
94
+ max = input[i][j] > max ? input[i][j] : max;
95
+ }
96
+ }
97
+ return max;
98
+ }
99
+ function rejectionSample(nSamples, poolSize, random) {
100
+ var result = zeros(nSamples);
101
+ for (var i = 0; i < nSamples; i++) {
102
+ var rejectSample = true;
103
+ while (rejectSample) {
104
+ var j = tauRandInt(poolSize, random);
105
+ var broken = false;
106
+ for (var k = 0; k < i; k++) {
107
+ if (j === result[k]) {
108
+ broken = true;
109
+ break;
110
+ }
111
+ }
112
+ if (!broken) {
113
+ rejectSample = false;
114
+ }
115
+ result[i] = j;
116
+ }
117
+ }
118
+ return result;
119
+ }
120
+ function reshape2d(x, a, b) {
121
+ var rows = [];
122
+ var count = 0;
123
+ var index = 0;
124
+ if (x.length !== a * b) {
125
+ throw new Error('Array dimensions must match input length.');
126
+ }
127
+ for (var i = 0; i < a; i++) {
128
+ var col = [];
129
+ for (var j = 0; j < b; j++) {
130
+ col.push(x[index]);
131
+ index += 1;
132
+ }
133
+ rows.push(col);
134
+ count += 1;
135
+ }
136
+ return rows;
137
+ }
@@ -0,0 +1,57 @@
1
+ export declare function initWasm(): Promise<any>;
2
+ export declare function isWasmAvailable(): boolean;
3
+ export declare function euclideanWasm(x: number[], y: number[]): any;
4
+ export declare function cosineWasm(x: number[], y: number[]): any;
5
+ export interface WasmFlatTree {
6
+ hyperplanes(): Float64Array;
7
+ offsets(): Float64Array;
8
+ children(): Int32Array;
9
+ indices(): Int32Array;
10
+ dim(): number;
11
+ n_nodes(): number;
12
+ free(): void;
13
+ }
14
+ export declare function buildRpTreeWasm(data: number[][], nSamples: number, dim: number, leafSize: number, seed: number): WasmFlatTree;
15
+ export declare function searchFlatTreeWasm(tree: WasmFlatTree, point: number[], seed: number): number[];
16
+ export declare function wasmTreeToJs(wasmTree: WasmFlatTree): {
17
+ hyperplanes: number[][];
18
+ offsets: number[];
19
+ children: number[][];
20
+ indices: number[][];
21
+ };
22
+ export interface WasmSparseMatrix {
23
+ n_rows: number;
24
+ n_cols: number;
25
+ set(row: number, col: number, value: number): void;
26
+ get(row: number, col: number, defaultValue: number): number;
27
+ get_dims(): number[];
28
+ get_rows(): Int32Array;
29
+ get_cols(): Int32Array;
30
+ get_values(): Float64Array;
31
+ get_all_ordered(): Float64Array;
32
+ nnz(): number;
33
+ to_array(): Float64Array;
34
+ map_scalar(operation: string, scalar: number): WasmSparseMatrix;
35
+ free(): void;
36
+ }
37
+ export declare function createSparseMatrixWasm(rows: number[], cols: number[], values: number[], nRows: number, nCols: number): WasmSparseMatrix;
38
+ export declare function sparseTransposeWasm(matrix: WasmSparseMatrix): WasmSparseMatrix;
39
+ export declare function sparseIdentityWasm(size: number): WasmSparseMatrix;
40
+ export declare function sparseAddWasm(a: WasmSparseMatrix, b: WasmSparseMatrix): WasmSparseMatrix;
41
+ export declare function sparseSubtractWasm(a: WasmSparseMatrix, b: WasmSparseMatrix): WasmSparseMatrix;
42
+ export declare function sparsePairwiseMultiplyWasm(a: WasmSparseMatrix, b: WasmSparseMatrix): WasmSparseMatrix;
43
+ export declare function sparseMaximumWasm(a: WasmSparseMatrix, b: WasmSparseMatrix): WasmSparseMatrix;
44
+ export declare function sparseMultiplyScalarWasm(matrix: WasmSparseMatrix, scalar: number): WasmSparseMatrix;
45
+ export declare function sparseEliminateZerosWasm(matrix: WasmSparseMatrix): WasmSparseMatrix;
46
+ export declare function sparseNormalizeWasm(matrix: WasmSparseMatrix, normType?: string): WasmSparseMatrix;
47
+ export declare function sparseGetCSRWasm(matrix: WasmSparseMatrix): {
48
+ indices: number[];
49
+ values: number[];
50
+ indptr: number[];
51
+ };
52
+ export declare function wasmSparseMatrixToArray(matrix: WasmSparseMatrix): number[][];
53
+ export declare function wasmSparseMatrixGetAll(matrix: WasmSparseMatrix): {
54
+ value: number;
55
+ row: number;
56
+ col: number;
57
+ }[];
@@ -0,0 +1,290 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __generator = (this && this.__generator) || function (thisArg, body) {
45
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
46
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47
+ function verb(n) { return function (v) { return step([n, v]); }; }
48
+ function step(op) {
49
+ if (f) throw new TypeError("Generator is already executing.");
50
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
51
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
52
+ if (y = 0, t) op = [op[0] & 2, t.value];
53
+ switch (op[0]) {
54
+ case 0: case 1: t = op; break;
55
+ case 4: _.label++; return { value: op[1], done: false };
56
+ case 5: _.label++; y = op[1]; op = [0]; continue;
57
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
58
+ default:
59
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63
+ if (t[2]) _.ops.pop();
64
+ _.trys.pop(); continue;
65
+ }
66
+ op = body.call(thisArg, _);
67
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69
+ }
70
+ };
71
+ Object.defineProperty(exports, "__esModule", { value: true });
72
+ exports.initWasm = initWasm;
73
+ exports.isWasmAvailable = isWasmAvailable;
74
+ exports.euclideanWasm = euclideanWasm;
75
+ exports.cosineWasm = cosineWasm;
76
+ exports.buildRpTreeWasm = buildRpTreeWasm;
77
+ exports.searchFlatTreeWasm = searchFlatTreeWasm;
78
+ exports.wasmTreeToJs = wasmTreeToJs;
79
+ exports.createSparseMatrixWasm = createSparseMatrixWasm;
80
+ exports.sparseTransposeWasm = sparseTransposeWasm;
81
+ exports.sparseIdentityWasm = sparseIdentityWasm;
82
+ exports.sparseAddWasm = sparseAddWasm;
83
+ exports.sparseSubtractWasm = sparseSubtractWasm;
84
+ exports.sparsePairwiseMultiplyWasm = sparsePairwiseMultiplyWasm;
85
+ exports.sparseMaximumWasm = sparseMaximumWasm;
86
+ exports.sparseMultiplyScalarWasm = sparseMultiplyScalarWasm;
87
+ exports.sparseEliminateZerosWasm = sparseEliminateZerosWasm;
88
+ exports.sparseNormalizeWasm = sparseNormalizeWasm;
89
+ exports.sparseGetCSRWasm = sparseGetCSRWasm;
90
+ exports.wasmSparseMatrixToArray = wasmSparseMatrixToArray;
91
+ exports.wasmSparseMatrixGetAll = wasmSparseMatrixGetAll;
92
+ var wasmReady = null;
93
+ var wasmModule = null;
94
+ function initWasm() {
95
+ return __awaiter(this, void 0, void 0, function () {
96
+ var _this = this;
97
+ return __generator(this, function (_a) {
98
+ if (wasmReady)
99
+ return [2, wasmReady];
100
+ wasmReady = (function () { return __awaiter(_this, void 0, void 0, function () {
101
+ var isNode, wasmPath, mod, err_1;
102
+ return __generator(this, function (_a) {
103
+ switch (_a.label) {
104
+ case 0:
105
+ _a.trys.push([0, 2, , 3]);
106
+ isNode = typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
107
+ wasmPath = isNode
108
+ ? '../wasm/pkg/node/umap_wasm_core.js'
109
+ : '../wasm/pkg/web/umap_wasm_core.js';
110
+ return [4, Promise.resolve("".concat(wasmPath)).then(function (s) { return __importStar(require(s)); })];
111
+ case 1:
112
+ mod = _a.sent();
113
+ wasmModule = mod;
114
+ return [2, mod];
115
+ case 2:
116
+ err_1 = _a.sent();
117
+ wasmReady = null;
118
+ wasmModule = null;
119
+ throw new Error("Failed to load WASM module: ".concat(err_1));
120
+ case 3: return [2];
121
+ }
122
+ });
123
+ }); })();
124
+ return [2, wasmReady];
125
+ });
126
+ });
127
+ }
128
+ function isWasmAvailable() {
129
+ return wasmModule !== null;
130
+ }
131
+ function euclideanWasm(x, y) {
132
+ if (!wasmModule)
133
+ throw new Error('WASM module not initialized');
134
+ var xa = new Float64Array(x);
135
+ var ya = new Float64Array(y);
136
+ return wasmModule.euclidean(xa, ya);
137
+ }
138
+ function cosineWasm(x, y) {
139
+ if (!wasmModule)
140
+ throw new Error('WASM module not initialized');
141
+ var xa = new Float64Array(x);
142
+ var ya = new Float64Array(y);
143
+ return wasmModule.cosine(xa, ya);
144
+ }
145
+ function buildRpTreeWasm(data, nSamples, dim, leafSize, seed) {
146
+ if (!wasmModule)
147
+ throw new Error('WASM module not initialized');
148
+ var flatData = new Float64Array(nSamples * dim);
149
+ for (var i = 0; i < nSamples; i++) {
150
+ for (var j = 0; j < dim; j++) {
151
+ flatData[i * dim + j] = data[i][j];
152
+ }
153
+ }
154
+ return wasmModule.build_rp_tree(flatData, nSamples, dim, leafSize, BigInt(seed));
155
+ }
156
+ function searchFlatTreeWasm(tree, point, seed) {
157
+ if (!wasmModule)
158
+ throw new Error('WASM module not initialized');
159
+ var pointArray = new Float64Array(point);
160
+ var result = wasmModule.search_flat_tree(tree, pointArray, BigInt(seed));
161
+ return Array.from(result);
162
+ }
163
+ function wasmTreeToJs(wasmTree) {
164
+ var hyperplanesFlat = Array.from(wasmTree.hyperplanes());
165
+ var offsetsArray = Array.from(wasmTree.offsets());
166
+ var childrenFlat = Array.from(wasmTree.children());
167
+ var indicesFlat = Array.from(wasmTree.indices());
168
+ var dim = wasmTree.dim();
169
+ var nNodes = wasmTree.n_nodes();
170
+ var hyperplanes = [];
171
+ for (var i = 0; i < nNodes; i++) {
172
+ hyperplanes.push(hyperplanesFlat.slice(i * dim, (i + 1) * dim));
173
+ }
174
+ var children = [];
175
+ for (var i = 0; i < nNodes; i++) {
176
+ children.push([childrenFlat[i * 2], childrenFlat[i * 2 + 1]]);
177
+ }
178
+ var maxLeafIdx = 0;
179
+ for (var i = 0; i < childrenFlat.length; i++) {
180
+ var v = childrenFlat[i];
181
+ if (v <= 0) {
182
+ var leafIdx = -v;
183
+ if (leafIdx > maxLeafIdx)
184
+ maxLeafIdx = leafIdx;
185
+ }
186
+ }
187
+ var nLeaves = maxLeafIdx + 1;
188
+ var leafSize = nLeaves > 0 ? Math.floor(indicesFlat.length / nLeaves) : 0;
189
+ var indices = [];
190
+ for (var i = 0; i < nLeaves; i++) {
191
+ var slice = indicesFlat.slice(i * leafSize, (i + 1) * leafSize);
192
+ while (slice.length < leafSize)
193
+ slice.push(-1);
194
+ indices.push(slice);
195
+ }
196
+ return {
197
+ hyperplanes: hyperplanes,
198
+ offsets: offsetsArray,
199
+ children: children,
200
+ indices: indices,
201
+ };
202
+ }
203
+ function createSparseMatrixWasm(rows, cols, values, nRows, nCols) {
204
+ if (!wasmModule)
205
+ throw new Error('WASM module not initialized');
206
+ var rowsArray = new Int32Array(rows);
207
+ var colsArray = new Int32Array(cols);
208
+ var valuesArray = new Float64Array(values);
209
+ return new wasmModule.WasmSparseMatrix(rowsArray, colsArray, valuesArray, nRows, nCols);
210
+ }
211
+ function sparseTransposeWasm(matrix) {
212
+ if (!wasmModule)
213
+ throw new Error('WASM module not initialized');
214
+ return wasmModule.sparse_transpose(matrix);
215
+ }
216
+ function sparseIdentityWasm(size) {
217
+ if (!wasmModule)
218
+ throw new Error('WASM module not initialized');
219
+ return wasmModule.sparse_identity(size);
220
+ }
221
+ function sparseAddWasm(a, b) {
222
+ if (!wasmModule)
223
+ throw new Error('WASM module not initialized');
224
+ return wasmModule.sparse_add(a, b);
225
+ }
226
+ function sparseSubtractWasm(a, b) {
227
+ if (!wasmModule)
228
+ throw new Error('WASM module not initialized');
229
+ return wasmModule.sparse_subtract(a, b);
230
+ }
231
+ function sparsePairwiseMultiplyWasm(a, b) {
232
+ if (!wasmModule)
233
+ throw new Error('WASM module not initialized');
234
+ return wasmModule.sparse_pairwise_multiply(a, b);
235
+ }
236
+ function sparseMaximumWasm(a, b) {
237
+ if (!wasmModule)
238
+ throw new Error('WASM module not initialized');
239
+ return wasmModule.sparse_maximum(a, b);
240
+ }
241
+ function sparseMultiplyScalarWasm(matrix, scalar) {
242
+ if (!wasmModule)
243
+ throw new Error('WASM module not initialized');
244
+ return wasmModule.sparse_multiply_scalar(matrix, scalar);
245
+ }
246
+ function sparseEliminateZerosWasm(matrix) {
247
+ if (!wasmModule)
248
+ throw new Error('WASM module not initialized');
249
+ return wasmModule.sparse_eliminate_zeros(matrix);
250
+ }
251
+ function sparseNormalizeWasm(matrix, normType) {
252
+ if (normType === void 0) { normType = 'l2'; }
253
+ if (!wasmModule)
254
+ throw new Error('WASM module not initialized');
255
+ return wasmModule.sparse_normalize(matrix, normType);
256
+ }
257
+ function sparseGetCSRWasm(matrix) {
258
+ if (!wasmModule)
259
+ throw new Error('WASM module not initialized');
260
+ var result = Array.from(wasmModule.sparse_get_csr(matrix));
261
+ var nIndices = result[0];
262
+ var nValues = result[1];
263
+ var nIndptr = result[2];
264
+ var indices = result.slice(3, 3 + nIndices);
265
+ var values = result.slice(3 + nIndices, 3 + nIndices + nValues);
266
+ var indptr = result.slice(3 + nIndices + nValues, 3 + nIndices + nValues + nIndptr);
267
+ return { indices: indices, values: values, indptr: indptr };
268
+ }
269
+ function wasmSparseMatrixToArray(matrix) {
270
+ var flat = Array.from(matrix.to_array());
271
+ var nRows = matrix.n_rows;
272
+ var nCols = matrix.n_cols;
273
+ var result = [];
274
+ for (var i = 0; i < nRows; i++) {
275
+ result.push(flat.slice(i * nCols, (i + 1) * nCols));
276
+ }
277
+ return result;
278
+ }
279
+ function wasmSparseMatrixGetAll(matrix) {
280
+ var flat = Array.from(matrix.get_all_ordered());
281
+ var entries = [];
282
+ for (var i = 0; i < flat.length; i += 3) {
283
+ entries.push({
284
+ row: flat[i],
285
+ col: flat[i + 1],
286
+ value: flat[i + 2],
287
+ });
288
+ }
289
+ return entries;
290
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var matrix_1 = require("../src/matrix");
4
+ describe('sparse matrix', function () {
5
+ test('constructs a sparse matrix from rows/cols/vals ', function () {
6
+ var rows = [0, 0, 1, 1];
7
+ var cols = [0, 1, 0, 1];
8
+ var vals = [1, 2, 3, 4];
9
+ var dims = [2, 2];
10
+ var matrix = new matrix_1.SparseMatrix(rows, cols, vals, dims);
11
+ expect(matrix.getRows()).toEqual(rows);
12
+ expect(matrix.getCols()).toEqual(cols);
13
+ expect(matrix.getValues()).toEqual(vals);
14
+ expect(matrix.nRows).toEqual(2);
15
+ expect(matrix.nCols).toEqual(2);
16
+ });
17
+ test('sparse matrix has get / set methods', function () {
18
+ var rows = [0, 0, 1, 1];
19
+ var cols = [0, 1, 0, 1];
20
+ var vals = [1, 2, 3, 4];
21
+ var dims = [2, 2];
22
+ var matrix = new matrix_1.SparseMatrix(rows, cols, vals, dims);
23
+ expect(matrix.get(0, 1)).toEqual(2);
24
+ matrix.set(0, 1, 9);
25
+ expect(matrix.get(0, 1)).toEqual(9);
26
+ });
27
+ test('sparse matrix has getAll method', function () {
28
+ var rows = [0, 0, 1, 1];
29
+ var cols = [0, 1, 0, 1];
30
+ var vals = [1, 2, 3, 4];
31
+ var dims = [2, 2];
32
+ var matrix = new matrix_1.SparseMatrix(rows, cols, vals, dims);
33
+ expect(matrix.getAll()).toEqual([
34
+ { row: 0, col: 0, value: 1 },
35
+ { row: 0, col: 1, value: 2 },
36
+ { row: 1, col: 0, value: 3 },
37
+ { row: 1, col: 1, value: 4 },
38
+ ]);
39
+ });
40
+ test('sparse matrix has toArray method', function () {
41
+ var rows = [0, 0, 1, 1];
42
+ var cols = [0, 1, 0, 1];
43
+ var vals = [1, 2, 3, 4];
44
+ var dims = [2, 2];
45
+ var matrix = new matrix_1.SparseMatrix(rows, cols, vals, dims);
46
+ expect(matrix.toArray()).toEqual([[1, 2], [3, 4]]);
47
+ });
48
+ test('sparse matrix has map method', function () {
49
+ var rows = [0, 0, 1, 1];
50
+ var cols = [0, 1, 0, 1];
51
+ var vals = [1, 2, 3, 4];
52
+ var dims = [2, 2];
53
+ var matrix = new matrix_1.SparseMatrix(rows, cols, vals, dims);
54
+ var newMatrix = matrix.map(function (value) {
55
+ return value + 1;
56
+ });
57
+ expect(newMatrix.toArray()).toEqual([[2, 3], [4, 5]]);
58
+ });
59
+ test('sparse matrix has forEach', function () {
60
+ var rows = [0, 1];
61
+ var cols = [0, 0];
62
+ var vals = [1, 3];
63
+ var dims = [2, 2];
64
+ var matrix = new matrix_1.SparseMatrix(rows, cols, vals, dims);
65
+ var entries = [];
66
+ matrix.forEach(function (value, row, col) {
67
+ entries.push([value, row, col]);
68
+ });
69
+ expect(entries).toEqual([[1, 0, 0], [3, 1, 0]]);
70
+ });
71
+ });
72
+ describe('helper methods', function () {
73
+ var A;
74
+ var B;
75
+ beforeEach(function () {
76
+ var rows = [0, 0, 1, 1];
77
+ var cols = [0, 1, 0, 1];
78
+ var vals = [1, 2, 3, 4];
79
+ var dims = [2, 2];
80
+ A = new matrix_1.SparseMatrix(rows, cols, vals, dims);
81
+ B = new matrix_1.SparseMatrix(rows, cols, vals, dims);
82
+ });
83
+ test('transpose method', function () {
84
+ var T = (0, matrix_1.transpose)(A);
85
+ expect(T.toArray()).toEqual([[1, 3], [2, 4]]);
86
+ });
87
+ test('identity method', function () {
88
+ var I = (0, matrix_1.identity)([2, 2]);
89
+ expect(I.toArray()).toEqual([[1, 0], [0, 1]]);
90
+ });
91
+ test('pairwise multiply method', function () {
92
+ var X = (0, matrix_1.pairwiseMultiply)(A, B);
93
+ expect(X.toArray()).toEqual([[1, 4], [9, 16]]);
94
+ });
95
+ test('add method', function () {
96
+ var X = (0, matrix_1.add)(A, B);
97
+ expect(X.toArray()).toEqual([[2, 4], [6, 8]]);
98
+ });
99
+ test('subtract method', function () {
100
+ var X = (0, matrix_1.subtract)(A, B);
101
+ expect(X.toArray()).toEqual([[0, 0], [0, 0]]);
102
+ });
103
+ test('element-wise maximum method', function () {
104
+ var I = (0, matrix_1.multiplyScalar)((0, matrix_1.identity)([2, 2]), 8);
105
+ var X = (0, matrix_1.maximum)(A, I);
106
+ expect(X.toArray()).toEqual([[8, 2], [3, 8]]);
107
+ });
108
+ test('scalar multiply method', function () {
109
+ var X = (0, matrix_1.multiplyScalar)(A, 3);
110
+ expect(X.toArray()).toEqual([[3, 6], [9, 12]]);
111
+ });
112
+ test('eliminateZeros method', function () {
113
+ var defaultValue = 11;
114
+ var rows = [0, 1, 1];
115
+ var cols = [0, 0, 1];
116
+ var vals = [0, 1, 3];
117
+ var dims = [2, 2];
118
+ var matrix = new matrix_1.SparseMatrix(rows, cols, vals, dims);
119
+ expect(matrix.get(0, 0, defaultValue)).toEqual(0);
120
+ var eliminated = (0, matrix_1.eliminateZeros)(matrix);
121
+ expect(eliminated.getValues()).toEqual([1, 3]);
122
+ expect(eliminated.getRows()).toEqual([1, 1]);
123
+ expect(eliminated.getCols()).toEqual([0, 1]);
124
+ expect(eliminated.get(0, 0, defaultValue)).toEqual(defaultValue);
125
+ });
126
+ });
127
+ describe('normalize method', function () {
128
+ var A;
129
+ beforeEach(function () {
130
+ var rows = [0, 0, 0, 1, 1, 1, 2, 2, 2];
131
+ var cols = [0, 1, 2, 0, 1, 2, 0, 1, 2];
132
+ var vals = [1, 2, 3, 4, 5, 6, 7, 8, 9];
133
+ var dims = [3, 3];
134
+ A = new matrix_1.SparseMatrix(rows, cols, vals, dims);
135
+ });
136
+ test('max normalization method', function () {
137
+ var expected = [
138
+ [0.3333333333333333, 0.6666666666666666, 1.0],
139
+ [0.6666666666666666, 0.8333333333333334, 1.0],
140
+ [0.7777777777777778, 0.8888888888888888, 1.0],
141
+ ];
142
+ var n = (0, matrix_1.normalize)(A, "max");
143
+ expect(n.toArray()).toEqual(expected);
144
+ });
145
+ test('l1 normalization method', function () {
146
+ var expected = [
147
+ [0.16666666666666666, 0.3333333333333333, 0.5],
148
+ [0.26666666666666666, 0.3333333333333333, 0.4],
149
+ [0.2916666666666667, 0.3333333333333333, 0.375],
150
+ ];
151
+ var n = (0, matrix_1.normalize)(A, "l1");
152
+ expect(n.toArray()).toEqual(expected);
153
+ });
154
+ test('l2 normalization method (default)', function () {
155
+ var expected = [
156
+ [0.2672612419124244, 0.5345224838248488, 0.8017837257372732],
157
+ [0.4558423058385518, 0.5698028822981898, 0.6837634587578277],
158
+ [0.5025707110324167, 0.5743665268941904, 0.6461623427559643],
159
+ ];
160
+ var n = (0, matrix_1.normalize)(A);
161
+ expect(n.toArray()).toEqual(expected);
162
+ });
163
+ test('getCSR function', function () {
164
+ var _a = (0, matrix_1.getCSR)(A), indices = _a.indices, values = _a.values, indptr = _a.indptr;
165
+ expect(indices).toEqual([0, 1, 2, 0, 1, 2, 0, 1, 2]);
166
+ expect(values).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]);
167
+ expect(indptr).toEqual([0, 3, 6]);
168
+ });
169
+ });
@@ -0,0 +1 @@
1
+ export {};