@danielsimonjr/mathts-parallel 0.6.10 → 0.6.11
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/index.js +1093 -1744
- package/dist/matrix.worker.js +88 -110
- package/package.json +17 -6
package/dist/matrix.worker.js
CHANGED
|
@@ -1,126 +1,104 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
//#region src/matrix.worker.ts
|
|
2
|
+
const isNode = typeof process !== "undefined" && process.versions?.node !== void 0;
|
|
3
|
+
let nodeParentPort = null;
|
|
4
4
|
function sendMessage(message) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
} else {
|
|
10
|
-
postMessage(message);
|
|
11
|
-
}
|
|
5
|
+
if (isNode) {
|
|
6
|
+
if (nodeParentPort) nodeParentPort.postMessage(message);
|
|
7
|
+
} else postMessage(message);
|
|
12
8
|
}
|
|
13
9
|
function handleMessage(event) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
10
|
+
const message = isNode ? event : event.data;
|
|
11
|
+
try {
|
|
12
|
+
const task = message.data;
|
|
13
|
+
let result;
|
|
14
|
+
switch (task.operation) {
|
|
15
|
+
case "multiply":
|
|
16
|
+
result = multiplyTask(task);
|
|
17
|
+
break;
|
|
18
|
+
case "add":
|
|
19
|
+
result = elementwiseTask(task, (a, b) => a + b);
|
|
20
|
+
break;
|
|
21
|
+
case "subtract":
|
|
22
|
+
result = elementwiseTask(task, (a, b) => a - b);
|
|
23
|
+
break;
|
|
24
|
+
case "elementMultiply":
|
|
25
|
+
result = elementwiseTask(task, (a, b) => a * b);
|
|
26
|
+
break;
|
|
27
|
+
case "scale":
|
|
28
|
+
result = scaleTask(task);
|
|
29
|
+
break;
|
|
30
|
+
case "transpose":
|
|
31
|
+
result = transposeTask(task);
|
|
32
|
+
break;
|
|
33
|
+
case "dot":
|
|
34
|
+
result = dotProductTask(task);
|
|
35
|
+
break;
|
|
36
|
+
case "sum":
|
|
37
|
+
result = sumTask(task);
|
|
38
|
+
break;
|
|
39
|
+
default: throw new Error(`Unknown operation: ${task.operation}`);
|
|
40
|
+
}
|
|
41
|
+
sendMessage({
|
|
42
|
+
id: message.id,
|
|
43
|
+
type: "result",
|
|
44
|
+
data: result
|
|
45
|
+
});
|
|
46
|
+
} catch (error) {
|
|
47
|
+
sendMessage({
|
|
48
|
+
id: message.id,
|
|
49
|
+
type: "error",
|
|
50
|
+
error: error instanceof Error ? error.message : String(error)
|
|
51
|
+
});
|
|
52
|
+
}
|
|
58
53
|
}
|
|
59
54
|
function multiplyTask(task) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
out[(i - startRow) * bCols + j] = sum;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return out;
|
|
55
|
+
const { aData, aCols, bData, bCols, startRow, endRow } = task;
|
|
56
|
+
const rowCount = endRow - startRow;
|
|
57
|
+
const out = new Float64Array(rowCount * bCols);
|
|
58
|
+
for (let i = startRow; i < endRow; i++) for (let j = 0; j < bCols; j++) {
|
|
59
|
+
let sum = 0;
|
|
60
|
+
for (let k = 0; k < aCols; k++) sum += aData[i * aCols + k] * bData[k * bCols + j];
|
|
61
|
+
out[(i - startRow) * bCols + j] = sum;
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
73
64
|
}
|
|
74
65
|
function elementwiseTask(task, op) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
return out;
|
|
66
|
+
const { aData, bData, start, end } = task;
|
|
67
|
+
const out = new Float64Array(end - start);
|
|
68
|
+
for (let i = start; i < end; i++) out[i - start] = op(aData[i], bData[i]);
|
|
69
|
+
return out;
|
|
81
70
|
}
|
|
82
71
|
function scaleTask(task) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
return out;
|
|
72
|
+
const { aData, scalar, start, end } = task;
|
|
73
|
+
const out = new Float64Array(end - start);
|
|
74
|
+
for (let i = start; i < end; i++) out[i - start] = aData[i] * scalar;
|
|
75
|
+
return out;
|
|
89
76
|
}
|
|
90
77
|
function transposeTask(task) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
out[j * rowCount + (i - startRow)] = data[i * cols + j];
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return out;
|
|
78
|
+
const { data, cols, startRow, endRow } = task;
|
|
79
|
+
const rowCount = endRow - startRow;
|
|
80
|
+
const out = new Float64Array(rowCount * cols);
|
|
81
|
+
for (let i = startRow; i < endRow; i++) for (let j = 0; j < cols; j++) out[j * rowCount + (i - startRow)] = data[i * cols + j];
|
|
82
|
+
return out;
|
|
100
83
|
}
|
|
101
84
|
function dotProductTask(task) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
return sum;
|
|
85
|
+
const { aData, bData, start, end } = task;
|
|
86
|
+
let sum = 0;
|
|
87
|
+
for (let i = start; i < end; i++) sum += aData[i] * bData[i];
|
|
88
|
+
return sum;
|
|
108
89
|
}
|
|
109
90
|
function sumTask(task) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
return sum;
|
|
116
|
-
}
|
|
117
|
-
if (isNode) {
|
|
118
|
-
void import("worker_threads").then(({ parentPort }) => {
|
|
119
|
-
if (parentPort) {
|
|
120
|
-
nodeParentPort = parentPort;
|
|
121
|
-
parentPort.on("message", handleMessage);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
} else {
|
|
125
|
-
self.onmessage = handleMessage;
|
|
91
|
+
const { aData, start, end } = task;
|
|
92
|
+
let sum = 0;
|
|
93
|
+
for (let i = start; i < end; i++) sum += aData[i];
|
|
94
|
+
return sum;
|
|
126
95
|
}
|
|
96
|
+
if (isNode) import("node:worker_threads").then(({ parentPort }) => {
|
|
97
|
+
if (parentPort) {
|
|
98
|
+
nodeParentPort = parentPort;
|
|
99
|
+
parentPort.on("message", handleMessage);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
else self.onmessage = handleMessage;
|
|
103
|
+
//#endregion
|
|
104
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@danielsimonjr/mathts-parallel",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.11",
|
|
4
4
|
"description": "WebWorker parallelization for MathTS computations",
|
|
5
5
|
"author": "Daniel Simon Jr.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"README.md"
|
|
20
20
|
],
|
|
21
21
|
"scripts": {
|
|
22
|
-
"build": "
|
|
23
|
-
"dev": "
|
|
22
|
+
"build": "tsdown src/index.ts src/matrix.worker.ts --format esm && tsc -p tsconfig.dts.json",
|
|
23
|
+
"dev": "tsdown src/index.ts src/matrix.worker.ts --format esm --watch --on-success \"tsc -p tsconfig.dts.json\"",
|
|
24
24
|
"test": "bun test --isolate --timeout 30000",
|
|
25
25
|
"test:watch": "vitest",
|
|
26
26
|
"test:coverage": "bun test --isolate --timeout 30000 --coverage",
|
|
@@ -28,15 +28,26 @@
|
|
|
28
28
|
"lint": "oxlint src",
|
|
29
29
|
"lint:fix": "oxlint src --fix",
|
|
30
30
|
"clean": "rm -rf dist",
|
|
31
|
-
"build:prod": "
|
|
31
|
+
"build:prod": "tsdown src/index.ts src/matrix.worker.ts --format esm --minify && tsc -p tsconfig.dts.json"
|
|
32
|
+
},
|
|
33
|
+
"tsdown": {
|
|
34
|
+
"fixedExtension": false,
|
|
35
|
+
"dts": false,
|
|
36
|
+
"outputOptions": {
|
|
37
|
+
"comments": {
|
|
38
|
+
"legal": true,
|
|
39
|
+
"annotation": true,
|
|
40
|
+
"jsdoc": false
|
|
41
|
+
}
|
|
42
|
+
}
|
|
32
43
|
},
|
|
33
44
|
"dependencies": {
|
|
34
45
|
"@danielsimonjr/mathts-workerpool": "^0.2.5",
|
|
35
|
-
"@danielsimonjr/mathts-core": "^0.
|
|
46
|
+
"@danielsimonjr/mathts-core": "^0.19.0"
|
|
36
47
|
},
|
|
37
48
|
"devDependencies": {
|
|
38
49
|
"@types/node": "^26.4.0",
|
|
39
|
-
"
|
|
50
|
+
"tsdown": "^0.23.0",
|
|
40
51
|
"typescript": "^7.0.2",
|
|
41
52
|
"vitest": "^5.0.0"
|
|
42
53
|
},
|