@goshenkata/dryscan-core 1.3.0 → 1.4.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.
|
@@ -3,24 +3,122 @@ import "../chunk-EUXUH3YW.js";
|
|
|
3
3
|
// src/services/ParallelSimilarity.ts
|
|
4
4
|
import os from "os";
|
|
5
5
|
import { Worker } from "worker_threads";
|
|
6
|
+
import debug from "debug";
|
|
6
7
|
import { cosineSimilarity } from "@langchain/core/utils/math";
|
|
7
8
|
var MIN_PARALLEL_ROWS = 50;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
var log = debug("DryScan:ParallelSimilarity");
|
|
10
|
+
var gpuKernel = null;
|
|
11
|
+
var gpuRuntime = null;
|
|
12
|
+
var gpuKernelDims = null;
|
|
13
|
+
var gpuKernelRows = null;
|
|
14
|
+
var gpuKernelCols = null;
|
|
15
|
+
var gpuCtor = null;
|
|
16
|
+
async function getGpuCtor() {
|
|
17
|
+
if (gpuCtor) return gpuCtor;
|
|
18
|
+
const moduleName = "gpu.js";
|
|
19
|
+
try {
|
|
20
|
+
const mod = await import(moduleName);
|
|
21
|
+
gpuCtor = mod.GPU;
|
|
22
|
+
return gpuCtor;
|
|
23
|
+
} catch (_err) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function backendPreference() {
|
|
28
|
+
const value = (process.env.DRYSCAN_SIM_BACKEND ?? "auto").toLowerCase();
|
|
29
|
+
if (value === "gpu" || value === "worker") return value;
|
|
30
|
+
return "auto";
|
|
31
|
+
}
|
|
32
|
+
function canUseGpuPath() {
|
|
33
|
+
return backendPreference() !== "worker";
|
|
34
|
+
}
|
|
35
|
+
function matrixFromGpuResult(result, rows, cols) {
|
|
36
|
+
if (!Array.isArray(result)) {
|
|
37
|
+
throw new Error("GPU kernel returned a non-array result");
|
|
38
|
+
}
|
|
39
|
+
return Array.from({ length: rows }, (_, rowIdx) => {
|
|
40
|
+
const row = result[rowIdx];
|
|
41
|
+
if (!row || typeof row !== "object") {
|
|
42
|
+
throw new Error("GPU kernel returned malformed rows");
|
|
43
|
+
}
|
|
44
|
+
const typed = row;
|
|
45
|
+
return Array.from({ length: cols }, (_2, colIdx) => Number(typed[colIdx] ?? 0));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async function runGpuCosineSimilarity(A, B) {
|
|
49
|
+
const GPU = await getGpuCtor();
|
|
50
|
+
if (!GPU) {
|
|
51
|
+
throw new Error("gpu.js module not available");
|
|
52
|
+
}
|
|
53
|
+
if (GPU.isGPUSupported === false) {
|
|
54
|
+
throw new Error("GPU.js reported GPU support unavailable");
|
|
55
|
+
}
|
|
56
|
+
const dims = A[0]?.length ?? 0;
|
|
57
|
+
if (!dims || !B[0]?.length || B[0].length !== dims) {
|
|
58
|
+
throw new Error("Matrix dimensions are invalid for GPU similarity");
|
|
59
|
+
}
|
|
60
|
+
if (!gpuRuntime) {
|
|
61
|
+
gpuRuntime = new GPU({ mode: "gpu" });
|
|
62
|
+
}
|
|
63
|
+
const shouldRecreateKernel = !gpuKernel || gpuKernelDims !== dims || gpuKernelRows !== A.length || gpuKernelCols !== B.length;
|
|
64
|
+
if (shouldRecreateKernel) {
|
|
65
|
+
gpuKernel = gpuRuntime.createKernel(function(a, b) {
|
|
66
|
+
let dot = 0;
|
|
67
|
+
let normA = 0;
|
|
68
|
+
let normB = 0;
|
|
69
|
+
for (let i = 0; i < this.constants.dims; i++) {
|
|
70
|
+
const av = a[this.thread.y][i];
|
|
71
|
+
const bv = b[this.thread.x][i];
|
|
72
|
+
dot += av * bv;
|
|
73
|
+
normA += av * av;
|
|
74
|
+
normB += bv * bv;
|
|
75
|
+
}
|
|
76
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
77
|
+
if (denom <= 1e-12) return 0;
|
|
78
|
+
return dot / denom;
|
|
79
|
+
}).setOutput([B.length, A.length]).setConstants({ dims });
|
|
80
|
+
gpuKernelDims = dims;
|
|
81
|
+
gpuKernelRows = A.length;
|
|
82
|
+
gpuKernelCols = B.length;
|
|
83
|
+
}
|
|
84
|
+
if (!gpuKernel) {
|
|
85
|
+
throw new Error("GPU kernel initialization failed");
|
|
86
|
+
}
|
|
87
|
+
const raw = gpuKernel(A, B);
|
|
88
|
+
return matrixFromGpuResult(raw, A.length, B.length);
|
|
89
|
+
}
|
|
90
|
+
function computeWithWorkers(A, B) {
|
|
11
91
|
const dims = A[0].length;
|
|
12
92
|
const chunkSize = Math.ceil(A.length / os.cpus().length);
|
|
13
93
|
const sharedB = new SharedArrayBuffer(B.length * dims * 8);
|
|
14
94
|
const bView = new Float64Array(sharedB);
|
|
15
95
|
B.forEach((row, i) => bView.set(row, i * dims));
|
|
16
|
-
const workerUrl = new URL("./
|
|
96
|
+
const workerUrl = new URL("./cosineSimilarityWorker.js", import.meta.url);
|
|
17
97
|
const execArgv = workerUrl.pathname.endsWith(".ts") ? ["--import", "tsx/esm"] : [];
|
|
18
98
|
const chunks = Array.from(
|
|
19
99
|
{ length: Math.ceil(A.length / chunkSize) },
|
|
20
100
|
(_, i) => A.slice(i * chunkSize, (i + 1) * chunkSize)
|
|
21
101
|
);
|
|
22
|
-
|
|
23
|
-
|
|
102
|
+
return Promise.all(chunks.map((chunk) => runWorker(chunk, sharedB, B.length, dims, workerUrl, execArgv))).then((results) => results.flat());
|
|
103
|
+
}
|
|
104
|
+
async function parallelCosineSimilarity(A, B) {
|
|
105
|
+
if (A.length === 0 || B.length === 0) return [];
|
|
106
|
+
if (A.length < MIN_PARALLEL_ROWS) {
|
|
107
|
+
log("SIM_BACKEND=sync rows=%d cols=%d", A.length, B.length);
|
|
108
|
+
return cosineSimilarity(A, B);
|
|
109
|
+
}
|
|
110
|
+
const preference = backendPreference();
|
|
111
|
+
if (canUseGpuPath()) {
|
|
112
|
+
try {
|
|
113
|
+
const result = await runGpuCosineSimilarity(A, B);
|
|
114
|
+
log("SIM_BACKEND=gpu rows=%d cols=%d preference=%s", A.length, B.length, preference);
|
|
115
|
+
return result;
|
|
116
|
+
} catch (err) {
|
|
117
|
+
log("SIM_BACKEND=gpu-failed fallback=worker reason=%s", err?.message ?? "unknown");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
log("SIM_BACKEND=worker rows=%d cols=%d preference=%s", A.length, B.length, preference);
|
|
121
|
+
return computeWithWorkers(A, B);
|
|
24
122
|
}
|
|
25
123
|
function runWorker(chunk, sharedB, bCount, dims, workerUrl, execArgv) {
|
|
26
124
|
return new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/ParallelSimilarity.ts"],"sourcesContent":["import os from \"node:os\";\nimport { Worker } from \"node:worker_threads\";\nimport { cosineSimilarity } from \"@langchain/core/utils/math\";\n\n/** Minimum row count below which synchronous is faster than worker overhead. */\nconst MIN_PARALLEL_ROWS = 50;\n\n/**\n * Computes cosineSimilarity(A, B) using worker threads for large inputs,\n * falling back to the synchronous library call for small ones.\n * B is packed into a SharedArrayBuffer shared across all workers — no copies.\n */\nexport async function parallelCosineSimilarity(A: number[][], B: number[][]): Promise<number[][]> {\n if (A.length === 0 || B.length === 0) return [];\n if (A.length < MIN_PARALLEL_ROWS) return cosineSimilarity(A, B);\n\n const dims = A[0].length;\n const chunkSize = Math.ceil(A.length / os.cpus().length);\n\n const sharedB = new SharedArrayBuffer(B.length * dims * 8);\n const bView = new Float64Array(sharedB);\n B.forEach((row, i) => bView.set(row, i * dims));\n\n // import.meta.resolve respects the active module loader:\n // under tsx it remaps .js → .ts; in compiled output it stays .js.\n const workerUrl = new URL(\"./services/cosineSimilarityWorker.js\", import.meta.url);\n const execArgv = workerUrl.pathname.endsWith(\".ts\") ? [\"--import\", \"tsx/esm\"] : [];\n\n const chunks = Array.from(\n { length: Math.ceil(A.length / chunkSize) },\n (_, i) => A.slice(i * chunkSize, (i + 1) * chunkSize),\n );\n\n const results = await Promise.all(chunks.map(chunk => runWorker(chunk, sharedB, B.length, dims, workerUrl, execArgv)));\n return results.flat();\n}\n\nfunction runWorker(\n chunk: number[][],\n sharedB: SharedArrayBuffer,\n bCount: number,\n dims: number,\n workerUrl: URL,\n execArgv: string[],\n): Promise<number[][]> {\n return new Promise((resolve, reject) => {\n const rowsFlat = new Float64Array(chunk.length * dims);\n chunk.forEach((row, i) => rowsFlat.set(row, i * dims));\n\n const worker = new Worker(workerUrl, {\n workerData: { rowsBuffer: rowsFlat.buffer, rowCount: chunk.length, allBuffer: sharedB, allCount: bCount, dims },\n transferList: [rowsFlat.buffer],\n execArgv,\n });\n\n worker.once(\"message\", ({ result }) => resolve(result));\n worker.once(\"error\", reject);\n });\n}\n"],"mappings":";;;AAAA,OAAO,QAAQ;AACf,SAAS,cAAc;AACvB,SAAS,wBAAwB;AAGjC,IAAM,oBAAoB;AAO1B,eAAsB,yBAAyB,GAAe,GAAoC;AAChG,MAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAG,QAAO,CAAC;AAC9C,MAAI,EAAE,SAAS,kBAAmB,QAAO,iBAAiB,GAAG,CAAC;AAE9D,QAAM,OAAO,EAAE,CAAC,EAAE;AAClB,QAAM,YAAY,KAAK,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,MAAM;AAEvD,QAAM,UAAU,IAAI,kBAAkB,EAAE,SAAS,OAAO,CAAC;AACzD,QAAM,QAAQ,IAAI,aAAa,OAAO;AACtC,IAAE,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC;AAI9C,QAAM,YAAY,IAAI,IAAI,wCAAwC,YAAY,GAAG;AACjF,QAAM,WAAW,UAAU,SAAS,SAAS,KAAK,IAAI,CAAC,YAAY,SAAS,IAAI,CAAC;AAEjF,QAAM,SAAS,MAAM;AAAA,IACnB,EAAE,QAAQ,KAAK,KAAK,EAAE,SAAS,SAAS,EAAE;AAAA,IAC1C,CAAC,GAAG,MAAM,EAAE,MAAM,IAAI,YAAY,IAAI,KAAK,SAAS;AAAA,EACtD;AAEA,QAAM,UAAU,MAAM,QAAQ,IAAI,OAAO,IAAI,WAAS,UAAU,OAAO,SAAS,EAAE,QAAQ,MAAM,WAAW,QAAQ,CAAC,CAAC;AACrH,SAAO,QAAQ,KAAK;AACtB;AAEA,SAAS,UACP,OACA,SACA,QACA,MACA,WACA,UACqB;AACrB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,WAAW,IAAI,aAAa,MAAM,SAAS,IAAI;AACrD,UAAM,QAAQ,CAAC,KAAK,MAAM,SAAS,IAAI,KAAK,IAAI,IAAI,CAAC;AAErD,UAAM,SAAS,IAAI,OAAO,WAAW;AAAA,MACnC,YAAY,EAAE,YAAY,SAAS,QAAQ,UAAU,MAAM,QAAQ,WAAW,SAAS,UAAU,QAAQ,KAAK;AAAA,MAC9G,cAAc,CAAC,SAAS,MAAM;AAAA,MAC9B;AAAA,IACF,CAAC;AAED,WAAO,KAAK,WAAW,CAAC,EAAE,OAAO,MAAM,QAAQ,MAAM,CAAC;AACtD,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B,CAAC;AACH;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/services/ParallelSimilarity.ts"],"sourcesContent":["import os from \"node:os\";\nimport { Worker } from \"node:worker_threads\";\nimport debug from \"debug\";\nimport { cosineSimilarity } from \"@langchain/core/utils/math\";\n\n/** Minimum row count below which synchronous is faster than worker overhead. */\nconst MIN_PARALLEL_ROWS = 50;\nconst log = debug(\"DryScan:ParallelSimilarity\");\n\ntype BackendPreference = \"auto\" | \"gpu\" | \"worker\";\ntype GPUCtor = new (settings?: { mode?: string }) => {\n createKernel: (fn: (...args: any[]) => number) => {\n setOutput: (output: [number, number]) => {\n setConstants: (constants: { dims: number }) => (a: number[][], b: number[][]) => number[][] | Float32Array[] | number[];\n };\n };\n};\ntype GPUModule = {\n GPU: GPUCtor & { isGPUSupported?: boolean };\n};\n\nlet gpuKernel:\n | ((a: number[][], b: number[][]) => number[][] | Float32Array[] | number[])\n | null = null;\nlet gpuRuntime: InstanceType<GPUCtor> | null = null;\nlet gpuKernelDims: number | null = null;\nlet gpuKernelRows: number | null = null;\nlet gpuKernelCols: number | null = null;\nlet gpuCtor: (GPUCtor & { isGPUSupported?: boolean }) | null = null;\n\nasync function getGpuCtor(): Promise<(GPUCtor & { isGPUSupported?: boolean }) | null> {\n if (gpuCtor) return gpuCtor;\n\n const moduleName = \"gpu.js\";\n try {\n const mod = (await import(moduleName)) as unknown as GPUModule;\n gpuCtor = mod.GPU;\n return gpuCtor;\n } catch (_err) {\n return null;\n }\n}\n\nfunction backendPreference(): BackendPreference {\n const value = (process.env.DRYSCAN_SIM_BACKEND ?? \"auto\").toLowerCase();\n if (value === \"gpu\" || value === \"worker\") return value;\n return \"auto\";\n}\n\nfunction canUseGpuPath(): boolean {\n return backendPreference() !== \"worker\";\n}\n\nfunction matrixFromGpuResult(result: unknown, rows: number, cols: number): number[][] {\n if (!Array.isArray(result)) {\n throw new Error(\"GPU kernel returned a non-array result\");\n }\n\n return Array.from({ length: rows }, (_, rowIdx) => {\n const row = result[rowIdx] as unknown;\n if (!row || typeof row !== \"object\") {\n throw new Error(\"GPU kernel returned malformed rows\");\n }\n const typed = row as ArrayLike<number>;\n return Array.from({ length: cols }, (_, colIdx) => Number(typed[colIdx] ?? 0));\n });\n}\n\nasync function runGpuCosineSimilarity(A: number[][], B: number[][]): Promise<number[][]> {\n const GPU = await getGpuCtor();\n if (!GPU) {\n throw new Error(\"gpu.js module not available\");\n }\n\n if (GPU.isGPUSupported === false) {\n throw new Error(\"GPU.js reported GPU support unavailable\");\n }\n\n const dims = A[0]?.length ?? 0;\n if (!dims || !B[0]?.length || B[0].length !== dims) {\n throw new Error(\"Matrix dimensions are invalid for GPU similarity\");\n }\n\n if (!gpuRuntime) {\n gpuRuntime = new GPU({ mode: \"gpu\" });\n }\n\n const shouldRecreateKernel =\n !gpuKernel\n || gpuKernelDims !== dims\n || gpuKernelRows !== A.length\n || gpuKernelCols !== B.length;\n\n if (shouldRecreateKernel) {\n gpuKernel = gpuRuntime\n .createKernel(function (this: any, a: number[][], b: number[][]) {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < this.constants.dims; i++) {\n const av = a[this.thread.y][i];\n const bv = b[this.thread.x][i];\n dot += av * bv;\n normA += av * av;\n normB += bv * bv;\n }\n\n const denom = Math.sqrt(normA) * Math.sqrt(normB);\n if (denom <= 1e-12) return 0;\n return dot / denom;\n })\n .setOutput([B.length, A.length])\n .setConstants({ dims });\n\n gpuKernelDims = dims;\n gpuKernelRows = A.length;\n gpuKernelCols = B.length;\n }\n\n if (!gpuKernel) {\n throw new Error(\"GPU kernel initialization failed\");\n }\n\n const raw = gpuKernel(A, B);\n return matrixFromGpuResult(raw, A.length, B.length);\n}\n\nfunction computeWithWorkers(A: number[][], B: number[][]): Promise<number[][]> {\n const dims = A[0].length;\n const chunkSize = Math.ceil(A.length / os.cpus().length);\n\n const sharedB = new SharedArrayBuffer(B.length * dims * 8);\n const bView = new Float64Array(sharedB);\n B.forEach((row, i) => bView.set(row, i * dims));\n\n // import.meta.resolve respects the active module loader:\n // under tsx it remaps .js → .ts; in compiled output it stays .js.\n const workerUrl = new URL(\"./cosineSimilarityWorker.js\", import.meta.url);\n const execArgv = workerUrl.pathname.endsWith(\".ts\") ? [\"--import\", \"tsx/esm\"] : [];\n\n const chunks = Array.from(\n { length: Math.ceil(A.length / chunkSize) },\n (_, i) => A.slice(i * chunkSize, (i + 1) * chunkSize),\n );\n\n return Promise.all(chunks.map(chunk => runWorker(chunk, sharedB, B.length, dims, workerUrl, execArgv))).then(results => results.flat());\n}\n\n/**\n * Computes cosineSimilarity(A, B) using worker threads for large inputs,\n * falling back to the synchronous library call for small ones.\n * B is packed into a SharedArrayBuffer shared across all workers — no copies.\n */\nexport async function parallelCosineSimilarity(A: number[][], B: number[][]): Promise<number[][]> {\n if (A.length === 0 || B.length === 0) return [];\n if (A.length < MIN_PARALLEL_ROWS) {\n log(\"SIM_BACKEND=sync rows=%d cols=%d\", A.length, B.length);\n return cosineSimilarity(A, B);\n }\n\n const preference = backendPreference();\n if (canUseGpuPath()) {\n try {\n const result = await runGpuCosineSimilarity(A, B);\n log(\"SIM_BACKEND=gpu rows=%d cols=%d preference=%s\", A.length, B.length, preference);\n return result;\n } catch (err: any) {\n log(\"SIM_BACKEND=gpu-failed fallback=worker reason=%s\", err?.message ?? \"unknown\");\n }\n }\n\n log(\"SIM_BACKEND=worker rows=%d cols=%d preference=%s\", A.length, B.length, preference);\n return computeWithWorkers(A, B);\n}\n\nfunction runWorker(\n chunk: number[][],\n sharedB: SharedArrayBuffer,\n bCount: number,\n dims: number,\n workerUrl: URL,\n execArgv: string[],\n): Promise<number[][]> {\n return new Promise((resolve, reject) => {\n const rowsFlat = new Float64Array(chunk.length * dims);\n chunk.forEach((row, i) => rowsFlat.set(row, i * dims));\n\n const worker = new Worker(workerUrl, {\n workerData: { rowsBuffer: rowsFlat.buffer, rowCount: chunk.length, allBuffer: sharedB, allCount: bCount, dims },\n transferList: [rowsFlat.buffer],\n execArgv,\n });\n\n worker.once(\"message\", ({ result }) => resolve(result));\n worker.once(\"error\", reject);\n });\n}\n"],"mappings":"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","names":["_"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goshenkata/dryscan-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Core library for DryScan - semantic code duplication analyzer",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -64,5 +64,8 @@
|
|
|
64
64
|
"tree-sitter-java": "^0.23.5",
|
|
65
65
|
"typeorm": "^0.3.28",
|
|
66
66
|
"upath": "^2.0.1"
|
|
67
|
+
},
|
|
68
|
+
"optionalDependencies": {
|
|
69
|
+
"gpu.js": "^2.16.0"
|
|
67
70
|
}
|
|
68
71
|
}
|