graphwise 1.8.1 → 1.9.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.
- package/dist/{adjacency-map-D-Ul7V1r.js → adjacency-map-BtKzcuJq.js} +1 -1
- package/dist/{adjacency-map-D-Ul7V1r.js.map → adjacency-map-BtKzcuJq.js.map} +1 -1
- package/dist/{adjacency-map-B6wPtmaq.cjs → adjacency-map-JqBnMNkF.cjs} +1 -1
- package/dist/{adjacency-map-B6wPtmaq.cjs.map → adjacency-map-JqBnMNkF.cjs.map} +1 -1
- package/dist/async/index.cjs +2 -2
- package/dist/async/index.js +2 -2
- package/dist/expansion/index.cjs +1 -1
- package/dist/expansion/index.js +1 -1
- package/dist/{expansion-sldRognt.js → expansion-ClDhlMK8.js} +4 -4
- package/dist/{expansion-sldRognt.js.map → expansion-ClDhlMK8.js.map} +1 -1
- package/dist/{expansion-FkmEYlrQ.cjs → expansion-DaTroIyv.cjs} +4 -4
- package/dist/{expansion-FkmEYlrQ.cjs.map → expansion-DaTroIyv.cjs.map} +1 -1
- package/dist/extraction/index.cjs +1 -1
- package/dist/extraction/index.js +1 -1
- package/dist/gpu/csr.d.ts +29 -30
- package/dist/gpu/csr.d.ts.map +1 -1
- package/dist/gpu/dispatch.d.ts +31 -0
- package/dist/gpu/dispatch.d.ts.map +1 -0
- package/dist/gpu/dispatch.unit.test.d.ts +5 -0
- package/dist/gpu/dispatch.unit.test.d.ts.map +1 -0
- package/dist/gpu/index.cjs +15 -410
- package/dist/gpu/index.d.ts +3 -1
- package/dist/gpu/index.d.ts.map +1 -1
- package/dist/gpu/index.js +2 -400
- package/dist/gpu/kernels/bfs/kernel.d.ts +59 -0
- package/dist/gpu/kernels/bfs/kernel.d.ts.map +1 -0
- package/dist/gpu/kernels/bfs/logic.d.ts +47 -0
- package/dist/gpu/kernels/bfs/logic.d.ts.map +1 -0
- package/dist/gpu/kernels/bfs/logic.unit.test.d.ts +2 -0
- package/dist/gpu/kernels/bfs/logic.unit.test.d.ts.map +1 -0
- package/dist/gpu/kernels/degree-histogram/kernel.d.ts +32 -0
- package/dist/gpu/kernels/degree-histogram/kernel.d.ts.map +1 -0
- package/dist/gpu/kernels/degree-histogram/logic.d.ts +45 -0
- package/dist/gpu/kernels/degree-histogram/logic.d.ts.map +1 -0
- package/dist/gpu/kernels/degree-histogram/logic.unit.test.d.ts +2 -0
- package/dist/gpu/kernels/degree-histogram/logic.unit.test.d.ts.map +1 -0
- package/dist/gpu/kernels/jaccard/kernel.d.ts +40 -0
- package/dist/gpu/kernels/jaccard/kernel.d.ts.map +1 -0
- package/dist/gpu/kernels/jaccard/logic.d.ts +43 -0
- package/dist/gpu/kernels/jaccard/logic.d.ts.map +1 -0
- package/dist/gpu/kernels/jaccard/logic.unit.test.d.ts +2 -0
- package/dist/gpu/kernels/jaccard/logic.unit.test.d.ts.map +1 -0
- package/dist/gpu/kernels/pagerank/kernel.d.ts +44 -0
- package/dist/gpu/kernels/pagerank/kernel.d.ts.map +1 -0
- package/dist/gpu/kernels/pagerank/logic.d.ts +50 -0
- package/dist/gpu/kernels/pagerank/logic.d.ts.map +1 -0
- package/dist/gpu/kernels/pagerank/logic.unit.test.d.ts +2 -0
- package/dist/gpu/kernels/pagerank/logic.unit.test.d.ts.map +1 -0
- package/dist/gpu/kernels/spmv/kernel.d.ts +43 -0
- package/dist/gpu/kernels/spmv/kernel.d.ts.map +1 -0
- package/dist/gpu/kernels/spmv/logic.d.ts +31 -0
- package/dist/gpu/kernels/spmv/logic.d.ts.map +1 -0
- package/dist/gpu/kernels/spmv/logic.unit.test.d.ts +2 -0
- package/dist/gpu/kernels/spmv/logic.unit.test.d.ts.map +1 -0
- package/dist/gpu/operations.d.ts +76 -0
- package/dist/gpu/operations.d.ts.map +1 -0
- package/dist/gpu/operations.unit.test.d.ts +5 -0
- package/dist/gpu/operations.unit.test.d.ts.map +1 -0
- package/dist/gpu/root.d.ts +53 -0
- package/dist/gpu/root.d.ts.map +1 -0
- package/dist/gpu/root.unit.test.d.ts +2 -0
- package/dist/gpu/root.unit.test.d.ts.map +1 -0
- package/dist/gpu/types.d.ts +3 -8
- package/dist/gpu/types.d.ts.map +1 -1
- package/dist/gpu-CHiCN0wa.js +16945 -0
- package/dist/gpu-CHiCN0wa.js.map +1 -0
- package/dist/gpu-Y6owRVMi.cjs +17028 -0
- package/dist/gpu-Y6owRVMi.cjs.map +1 -0
- package/dist/graph/index.cjs +1 -1
- package/dist/graph/index.js +1 -1
- package/dist/index/index.cjs +18 -15
- package/dist/index/index.js +10 -10
- package/dist/{jaccard-Yddrtt5D.js → jaccard-3rCdilwm.js} +2 -2
- package/dist/{jaccard-Yddrtt5D.js.map → jaccard-3rCdilwm.js.map} +1 -1
- package/dist/{jaccard-Bmd1IEFO.cjs → jaccard-Bys9_dGW.cjs} +2 -2
- package/dist/{jaccard-Bmd1IEFO.cjs.map → jaccard-Bys9_dGW.cjs.map} +1 -1
- package/dist/{kmeans-D3yX5QFs.cjs → kmeans-B8x9D1kt.cjs} +1 -1
- package/dist/{kmeans-D3yX5QFs.cjs.map → kmeans-B8x9D1kt.cjs.map} +1 -1
- package/dist/{kmeans-DVCe61Me.js → kmeans-DKkL9rAN.js} +1 -1
- package/dist/{kmeans-DVCe61Me.js.map → kmeans-DKkL9rAN.js.map} +1 -1
- package/dist/{ops-4nmI-pwk.cjs → ops-djAsQQSh.cjs} +2 -2
- package/dist/{ops-4nmI-pwk.cjs.map → ops-djAsQQSh.cjs.map} +1 -1
- package/dist/{ops-Zsu4ecEG.js → ops-upIi6JIi.js} +2 -2
- package/dist/{ops-Zsu4ecEG.js.map → ops-upIi6JIi.js.map} +1 -1
- package/dist/{priority-queue-ChVLoG6T.cjs → priority-queue-BIiD1L0k.cjs} +1 -1
- package/dist/{priority-queue-ChVLoG6T.cjs.map → priority-queue-BIiD1L0k.cjs.map} +1 -1
- package/dist/{priority-queue-DqCuFTR8.js → priority-queue-CFDd5cBg.js} +1 -1
- package/dist/{priority-queue-DqCuFTR8.js.map → priority-queue-CFDd5cBg.js.map} +1 -1
- package/dist/ranking/index.cjs +2 -2
- package/dist/ranking/index.js +2 -2
- package/dist/ranking/mi/index.cjs +2 -2
- package/dist/ranking/mi/index.js +2 -2
- package/dist/{ranking-mUm9rV-C.js → ranking-3ez5m67U.js} +2 -2
- package/dist/{ranking-mUm9rV-C.js.map → ranking-3ez5m67U.js.map} +1 -1
- package/dist/{ranking-riRrEVAR.cjs → ranking-DVvajgUZ.cjs} +2 -2
- package/dist/{ranking-riRrEVAR.cjs.map → ranking-DVvajgUZ.cjs.map} +1 -1
- package/dist/seeds/index.cjs +1 -1
- package/dist/seeds/index.js +1 -1
- package/dist/structures/index.cjs +1 -1
- package/dist/structures/index.js +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/{utils-CcIrKAEb.js → utils-BodeE2Mo.js} +1 -1
- package/dist/{utils-CcIrKAEb.js.map → utils-BodeE2Mo.js.map} +1 -1
- package/dist/{utils-CpyzmzIF.cjs → utils-CDtCcsyF.cjs} +1 -1
- package/dist/{utils-CpyzmzIF.cjs.map → utils-CDtCcsyF.cjs.map} +1 -1
- package/package.json +3 -1
- package/dist/gpu/context.d.ts +0 -118
- package/dist/gpu/context.d.ts.map +0 -1
- package/dist/gpu/context.unit.test.d.ts +0 -2
- package/dist/gpu/context.unit.test.d.ts.map +0 -1
- package/dist/gpu/index.cjs.map +0 -1
- package/dist/gpu/index.js.map +0 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure CPU implementation of batch Jaccard similarity.
|
|
3
|
+
*
|
|
4
|
+
* Computes Jaccard coefficient for multiple node pairs in parallel:
|
|
5
|
+
* J(u, v) = |N(u) ∩ N(v)| / |N(u) ∪ N(v)|
|
|
6
|
+
*
|
|
7
|
+
* This is the CPU reference implementation extracted from the WGSL kernel.
|
|
8
|
+
* Uses binary search optimisation: iterate smaller neighbourhood, search in larger.
|
|
9
|
+
*
|
|
10
|
+
* @module gpu/kernels/jaccard/logic
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Binary search in a sorted subarray of colIndices.
|
|
14
|
+
*
|
|
15
|
+
* @param colIndices - CSR column indices array (must be sorted per row)
|
|
16
|
+
* @param start - Start index (inclusive)
|
|
17
|
+
* @param end - End index (exclusive)
|
|
18
|
+
* @param target - Value to search for
|
|
19
|
+
* @returns true if target is found between colIndices[start] and colIndices[end-1]
|
|
20
|
+
*/
|
|
21
|
+
export declare function binarySearch(colIndices: Uint32Array, start: number, end: number, target: number): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Compute Jaccard similarity for a single pair of nodes in CSR format.
|
|
24
|
+
*
|
|
25
|
+
* Neighbours must be sorted (CSR guarantees this from graphToCSR).
|
|
26
|
+
*
|
|
27
|
+
* @param rowOffsets - CSR row offset array
|
|
28
|
+
* @param colIndices - CSR column indices array
|
|
29
|
+
* @param u - First node index
|
|
30
|
+
* @param v - Second node index
|
|
31
|
+
* @returns Jaccard coefficient in [0, 1]
|
|
32
|
+
*/
|
|
33
|
+
export declare function jaccardPair(rowOffsets: Uint32Array, colIndices: Uint32Array, u: number, v: number): number;
|
|
34
|
+
/**
|
|
35
|
+
* Batch Jaccard similarity for multiple node pairs.
|
|
36
|
+
*
|
|
37
|
+
* @param rowOffsets - CSR row offset array
|
|
38
|
+
* @param colIndices - CSR column indices array
|
|
39
|
+
* @param pairs - Array of [u, v] node index pairs
|
|
40
|
+
* @returns Float32Array of Jaccard coefficients, one per pair
|
|
41
|
+
*/
|
|
42
|
+
export declare function jaccardBatch(rowOffsets: Uint32Array, colIndices: Uint32Array, pairs: readonly (readonly [number, number])[]): Float32Array;
|
|
43
|
+
//# sourceMappingURL=logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../../../../src/gpu/kernels/jaccard/logic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC3B,UAAU,EAAE,WAAW,EACvB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACZ,OAAO,CAkBT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAC1B,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACP,MAAM,CAsCR;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC3B,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,GAC3C,YAAY,CAYd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/gpu/kernels/jaccard/logic.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { d, StorageFlag, TgpuBuffer } from 'typegpu';
|
|
2
|
+
import { TypedBufferGroup } from '../../csr';
|
|
3
|
+
import { GraphwiseGPURoot } from '../../root';
|
|
4
|
+
/**
|
|
5
|
+
* Bind group layout for PageRank kernel.
|
|
6
|
+
*/
|
|
7
|
+
declare const PageRankLayout: import('typegpu').TgpuBindGroupLayout<{
|
|
8
|
+
rowOffsets: {
|
|
9
|
+
storage: (elementCount: number) => d.WgslArray<d.U32>;
|
|
10
|
+
};
|
|
11
|
+
colIndices: {
|
|
12
|
+
storage: (elementCount: number) => d.WgslArray<d.U32>;
|
|
13
|
+
};
|
|
14
|
+
ranks: {
|
|
15
|
+
storage: (elementCount: number) => d.WgslArray<d.F32>;
|
|
16
|
+
};
|
|
17
|
+
outDegrees: {
|
|
18
|
+
storage: (elementCount: number) => d.WgslArray<d.U32>;
|
|
19
|
+
};
|
|
20
|
+
newRanks: {
|
|
21
|
+
storage: (elementCount: number) => d.WgslArray<d.F32>;
|
|
22
|
+
access: "mutable";
|
|
23
|
+
};
|
|
24
|
+
nodeCount: {
|
|
25
|
+
uniform: d.U32;
|
|
26
|
+
};
|
|
27
|
+
damping: {
|
|
28
|
+
uniform: d.F32;
|
|
29
|
+
};
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Dispatch one PageRank iteration on GPU.
|
|
33
|
+
*
|
|
34
|
+
* @param root - TypeGPU root instance
|
|
35
|
+
* @param csrBuffers - CSR matrix as typed buffers (transpose graph: in-edges)
|
|
36
|
+
* @param ranks - Current rank values buffer
|
|
37
|
+
* @param outDegrees - Out-degree buffer for each node
|
|
38
|
+
* @param newRanks - Output buffer for new rank values (mutable)
|
|
39
|
+
* @param nodeCount - Number of nodes
|
|
40
|
+
* @param damping - Damping factor (typically 0.85)
|
|
41
|
+
*/
|
|
42
|
+
export declare function dispatchPagerank(root: GraphwiseGPURoot, csrBuffers: TypedBufferGroup, ranks: TgpuBuffer<ReturnType<typeof d.arrayOf<typeof d.f32>>> & StorageFlag, outDegrees: TgpuBuffer<ReturnType<typeof d.arrayOf<typeof d.u32>>> & StorageFlag, newRanks: TgpuBuffer<ReturnType<typeof d.arrayOf<typeof d.f32>>> & StorageFlag, nodeCount: number, damping: number): void;
|
|
43
|
+
export { PageRankLayout };
|
|
44
|
+
//# sourceMappingURL=kernel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../../../src/gpu/kernels/pagerank/kernel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAa,EAAE,CAAC,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;EAQlB,CAAC;AA8BH;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,EAC3E,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GACjE,WAAW,EACZ,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAC/D,WAAW,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACb,IAAI,CAiBN;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure CPU implementation of PageRank power iteration.
|
|
3
|
+
*
|
|
4
|
+
* Computes one iteration of PageRank:
|
|
5
|
+
* r(v) = (1 - d)/N + d * sum(r(u) / deg_out(u)) for u -> v
|
|
6
|
+
*
|
|
7
|
+
* This is the CPU reference implementation extracted from the WGSL kernel.
|
|
8
|
+
* The CSR stores the transpose graph (in-edges as rows).
|
|
9
|
+
*
|
|
10
|
+
* @module gpu/kernels/pagerank/logic
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Compute one node's PageRank contribution from its incoming neighbours.
|
|
14
|
+
*
|
|
15
|
+
* @param rowOffsets - CSR row offset array (transpose graph: in-edges)
|
|
16
|
+
* @param colIndices - CSR column indices array
|
|
17
|
+
* @param ranks - Current rank values
|
|
18
|
+
* @param outDegrees - Out-degree for each node
|
|
19
|
+
* @param node - Node index to compute
|
|
20
|
+
* @param damping - Damping factor (typically 0.85)
|
|
21
|
+
* @param n - Total number of nodes
|
|
22
|
+
* @returns New rank for this node
|
|
23
|
+
*/
|
|
24
|
+
export declare function pagerankNode(rowOffsets: Uint32Array, colIndices: Uint32Array, ranks: Float32Array, outDegrees: Uint32Array, node: number, damping: number, n: number): number;
|
|
25
|
+
/**
|
|
26
|
+
* Full PageRank power iteration: compute new ranks from current ranks.
|
|
27
|
+
*
|
|
28
|
+
* @param rowOffsets - CSR row offset array (transpose graph)
|
|
29
|
+
* @param colIndices - CSR column indices array
|
|
30
|
+
* @param ranks - Current rank values (will be read, not modified)
|
|
31
|
+
* @param outDegrees - Out-degree for each node
|
|
32
|
+
* @param damping - Damping factor (typically 0.85)
|
|
33
|
+
* @param n - Total number of nodes
|
|
34
|
+
* @returns New rank values after one iteration
|
|
35
|
+
*/
|
|
36
|
+
export declare function pagerankIteration(rowOffsets: Uint32Array, colIndices: Uint32Array, ranks: Float32Array, outDegrees: Uint32Array, damping: number, n: number): Float32Array;
|
|
37
|
+
/**
|
|
38
|
+
* Run multiple PageRank iterations until convergence or maxIterations.
|
|
39
|
+
*
|
|
40
|
+
* @param rowOffsets - CSR row offset array (transpose graph)
|
|
41
|
+
* @param colIndices - CSR column indices array
|
|
42
|
+
* @param outDegrees - Out-degree for each node
|
|
43
|
+
* @param n - Total number of nodes
|
|
44
|
+
* @param damping - Damping factor (default: 0.85)
|
|
45
|
+
* @param maxIterations - Maximum iterations (default: 100)
|
|
46
|
+
* @param tolerance - Convergence tolerance (default: 1e-6)
|
|
47
|
+
* @returns Final rank values
|
|
48
|
+
*/
|
|
49
|
+
export declare function pagerank(rowOffsets: Uint32Array, colIndices: Uint32Array, outDegrees: Uint32Array, n: number, damping?: number, maxIterations?: number, tolerance?: number): Float32Array;
|
|
50
|
+
//# sourceMappingURL=logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../../../../src/gpu/kernels/pagerank/logic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC3B,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,WAAW,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,CAAC,EAAE,MAAM,GACP,MAAM,CAgBR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAChC,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,MAAM,EACf,CAAC,EAAE,MAAM,GACP,YAAY,CAgBd;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CACvB,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,CAAC,EAAE,MAAM,EACT,OAAO,GAAE,MAAwB,EACjC,aAAa,GAAE,MAA+B,EAC9C,SAAS,GAAE,MAA0B,GACnC,YAAY,CA4Bd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/gpu/kernels/pagerank/logic.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { d, StorageFlag, TgpuBuffer } from 'typegpu';
|
|
2
|
+
import { TypedBufferGroup } from '../../csr';
|
|
3
|
+
import { GraphwiseGPURoot } from '../../root';
|
|
4
|
+
/**
|
|
5
|
+
* Bind group layout for SpMV kernel.
|
|
6
|
+
*/
|
|
7
|
+
declare const SpMVLayout: import('typegpu').TgpuBindGroupLayout<{
|
|
8
|
+
rowOffsets: {
|
|
9
|
+
storage: (elementCount: number) => d.WgslArray<d.U32>;
|
|
10
|
+
};
|
|
11
|
+
colIndices: {
|
|
12
|
+
storage: (elementCount: number) => d.WgslArray<d.U32>;
|
|
13
|
+
};
|
|
14
|
+
values: {
|
|
15
|
+
storage: (elementCount: number) => d.WgslArray<d.F32>;
|
|
16
|
+
};
|
|
17
|
+
x: {
|
|
18
|
+
storage: (elementCount: number) => d.WgslArray<d.F32>;
|
|
19
|
+
};
|
|
20
|
+
y: {
|
|
21
|
+
storage: (elementCount: number) => d.WgslArray<d.F32>;
|
|
22
|
+
access: "mutable";
|
|
23
|
+
};
|
|
24
|
+
nodeCount: {
|
|
25
|
+
uniform: d.U32;
|
|
26
|
+
};
|
|
27
|
+
hasValues: {
|
|
28
|
+
uniform: d.U32;
|
|
29
|
+
};
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Dispatch SpMV on GPU.
|
|
33
|
+
*
|
|
34
|
+
* @param root - TypeGPU root instance
|
|
35
|
+
* @param csrBuffers - CSR matrix as typed buffers
|
|
36
|
+
* @param x - Input vector buffer
|
|
37
|
+
* @param y - Output vector buffer (mutable)
|
|
38
|
+
* @param nodeCount - Number of nodes/rows
|
|
39
|
+
* @param hasValues - Whether edge weights are present
|
|
40
|
+
*/
|
|
41
|
+
export declare function dispatchSpmv(root: GraphwiseGPURoot, csrBuffers: TypedBufferGroup, x: TgpuBuffer<ReturnType<typeof d.arrayOf<typeof d.f32>>> & StorageFlag, y: TgpuBuffer<ReturnType<typeof d.arrayOf<typeof d.f32>>> & StorageFlag, nodeCount: number, hasValues: boolean): void;
|
|
42
|
+
export { SpMVLayout };
|
|
43
|
+
//# sourceMappingURL=kernel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../../../src/gpu/kernels/spmv/kernel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAa,EAAE,CAAC,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;EAQd,CAAC;AAyBH;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC3B,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,gBAAgB,EAC5B,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,EACvE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,EACvE,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,OAAO,GAChB,IAAI,CA8BN;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure CPU implementation of Sparse Matrix-Vector Multiplication (SpMV).
|
|
3
|
+
*
|
|
4
|
+
* Computes y = A * x where A is a sparse matrix in CSR format.
|
|
5
|
+
* This is the CPU reference implementation extracted from the WGSL kernel.
|
|
6
|
+
*
|
|
7
|
+
* @module gpu/kernels/spmv/logic
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Compute one row of SpMV: dot product of CSR row with vector x.
|
|
11
|
+
*
|
|
12
|
+
* @param rowOffsets - CSR row offset array
|
|
13
|
+
* @param colIndices - CSR column indices array
|
|
14
|
+
* @param values - Optional edge weights (undefined for unweighted)
|
|
15
|
+
* @param x - Input vector
|
|
16
|
+
* @param row - Row index to compute
|
|
17
|
+
* @returns Dot product for this row
|
|
18
|
+
*/
|
|
19
|
+
export declare function spmvRow(rowOffsets: Uint32Array, colIndices: Uint32Array, values: Float32Array | undefined, x: Float32Array, row: number): number;
|
|
20
|
+
/**
|
|
21
|
+
* Full SpMV: y = A * x where A is in CSR format.
|
|
22
|
+
*
|
|
23
|
+
* @param rowOffsets - CSR row offset array (length: nodeCount + 1)
|
|
24
|
+
* @param colIndices - CSR column indices array
|
|
25
|
+
* @param values - Optional edge weights (undefined for unweighted)
|
|
26
|
+
* @param x - Input vector (length: nodeCount)
|
|
27
|
+
* @param nodeCount - Number of nodes/rows
|
|
28
|
+
* @returns Output vector y (length: nodeCount)
|
|
29
|
+
*/
|
|
30
|
+
export declare function spmv(rowOffsets: Uint32Array, colIndices: Uint32Array, values: Float32Array | undefined, x: Float32Array, nodeCount: number): Float32Array;
|
|
31
|
+
//# sourceMappingURL=logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../../../../src/gpu/kernels/spmv/logic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACtB,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,CAAC,EAAE,YAAY,EACf,GAAG,EAAE,MAAM,GACT,MAAM,CAaR;AAED;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CACnB,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,CAAC,EAAE,YAAY,EACf,SAAS,EAAE,MAAM,GACf,YAAY,CAQd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/gpu/kernels/spmv/logic.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { NodeData, EdgeData, NodeId, ReadableGraph } from '../graph';
|
|
2
|
+
import { ComputeResult, GPUComputeOptions } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Degree statistics from histogram computation.
|
|
5
|
+
*/
|
|
6
|
+
export interface DegreeStats {
|
|
7
|
+
/** Minimum degree in the graph */
|
|
8
|
+
readonly min: number;
|
|
9
|
+
/** Maximum degree in the graph */
|
|
10
|
+
readonly max: number;
|
|
11
|
+
/** Average degree */
|
|
12
|
+
readonly mean: number;
|
|
13
|
+
/** Histogram of degree frequencies (index = degree, value = count) */
|
|
14
|
+
readonly histogram: readonly number[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Sparse matrix-vector multiply on GPU.
|
|
18
|
+
*
|
|
19
|
+
* Computes y = A * x where A is the graph adjacency matrix in CSR format.
|
|
20
|
+
*
|
|
21
|
+
* @param graph - Input graph
|
|
22
|
+
* @param x - Input vector (must have length = graph.nodeCount)
|
|
23
|
+
* @param options - Compute options (backend, root, signal)
|
|
24
|
+
* @returns Result vector y
|
|
25
|
+
*/
|
|
26
|
+
export declare function gpuSpmv<N extends NodeData, E extends EdgeData>(graph: ReadableGraph<N, E>, x: Float32Array, options?: GPUComputeOptions & {
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
}): Promise<ComputeResult<Float32Array>>;
|
|
29
|
+
/**
|
|
30
|
+
* PageRank via GPU-accelerated power iteration.
|
|
31
|
+
*
|
|
32
|
+
* @param graph - Input graph (will be converted to transpose CSR for in-edges)
|
|
33
|
+
* @param options - Compute options plus damping factor and iteration count
|
|
34
|
+
* @returns PageRank scores for each node
|
|
35
|
+
*/
|
|
36
|
+
export declare function gpuPageRank<N extends NodeData, E extends EdgeData>(graph: ReadableGraph<N, E>, options?: GPUComputeOptions & {
|
|
37
|
+
damping?: number;
|
|
38
|
+
iterations?: number;
|
|
39
|
+
signal?: AbortSignal;
|
|
40
|
+
}): Promise<ComputeResult<Float32Array>>;
|
|
41
|
+
/**
|
|
42
|
+
* Batch Jaccard similarity for node pairs on GPU.
|
|
43
|
+
*
|
|
44
|
+
* @param graph - Input graph
|
|
45
|
+
* @param pairs - Array of [u, v] node ID pairs
|
|
46
|
+
* @param options - Compute options
|
|
47
|
+
* @returns Jaccard coefficients for each pair
|
|
48
|
+
*/
|
|
49
|
+
export declare function gpuJaccardBatch<N extends NodeData, E extends EdgeData>(graph: ReadableGraph<N, E>, pairs: readonly [NodeId, NodeId][], options?: GPUComputeOptions & {
|
|
50
|
+
signal?: AbortSignal;
|
|
51
|
+
}): Promise<ComputeResult<Float32Array>>;
|
|
52
|
+
/**
|
|
53
|
+
* BFS level assignment from source node on GPU.
|
|
54
|
+
*
|
|
55
|
+
* Note: Full GPU BFS requires atomics not yet available in TypeGPU.
|
|
56
|
+
* This implementation uses CPU for now but maintains the API.
|
|
57
|
+
*
|
|
58
|
+
* @param graph - Input graph
|
|
59
|
+
* @param source - Source node ID
|
|
60
|
+
* @param options - Compute options
|
|
61
|
+
* @returns BFS level for each node (-1 for unreachable)
|
|
62
|
+
*/
|
|
63
|
+
export declare function gpuBfsLevels<N extends NodeData, E extends EdgeData>(graph: ReadableGraph<N, E>, source: NodeId, options?: GPUComputeOptions & {
|
|
64
|
+
signal?: AbortSignal;
|
|
65
|
+
}): Promise<ComputeResult<Int32Array>>;
|
|
66
|
+
/**
|
|
67
|
+
* Degree histogram and statistics on GPU.
|
|
68
|
+
*
|
|
69
|
+
* @param graph - Input graph
|
|
70
|
+
* @param options - Compute options
|
|
71
|
+
* @returns Degree statistics with histogram
|
|
72
|
+
*/
|
|
73
|
+
export declare function gpuDegreeHistogram<N extends NodeData, E extends EdgeData>(graph: ReadableGraph<N, E>, options?: GPUComputeOptions & {
|
|
74
|
+
signal?: AbortSignal;
|
|
75
|
+
}): Promise<ComputeResult<DegreeStats>>;
|
|
76
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/gpu/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAUhE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,kCAAkC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,EACnE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,CAAC,EAAE,YAAY,EACf,OAAO,CAAC,EAAE,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GACpD,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CA8DtC;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,EACvE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,iBAAiB,GAAG;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,GACC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CA+FtC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,EAC3E,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAClC,OAAO,CAAC,EAAE,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GACpD,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CA8FtC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,EACxE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GACpD,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAsDpC;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACvC,CAAC,SAAS,QAAQ,EAClB,CAAC,SAAS,QAAQ,EAElB,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GACpD,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CA+ErC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.unit.test.d.ts","sourceRoot":"","sources":["../../src/gpu/operations.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { tgpu } from 'typegpu';
|
|
2
|
+
/**
|
|
3
|
+
* Options for initialising the GPU root.
|
|
4
|
+
*/
|
|
5
|
+
export interface InitGPUOptions {
|
|
6
|
+
/** Power preference for GPU adapter */
|
|
7
|
+
readonly powerPreference?: "low-power" | "high-performance";
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The TypeGPU root instance used for GPU operations.
|
|
11
|
+
* Re-exports TgpuRoot from TypeGPU for convenience.
|
|
12
|
+
*/
|
|
13
|
+
export type GraphwiseGPURoot = Awaited<ReturnType<typeof tgpu.init>>;
|
|
14
|
+
/**
|
|
15
|
+
* Initialise a TypeGPU root for GPU compute operations.
|
|
16
|
+
*
|
|
17
|
+
* This wraps tgpu.init() with WebGPU availability checking and
|
|
18
|
+
* simplified options.
|
|
19
|
+
*
|
|
20
|
+
* @param options - Initialisation options
|
|
21
|
+
* @returns Promise resolving to a TypeGPU root instance
|
|
22
|
+
* @throws Error if WebGPU is unavailable or device request fails
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import { initGPU } from "graphwise/gpu";
|
|
27
|
+
*
|
|
28
|
+
* const root = await initGPU();
|
|
29
|
+
* // Use root for GPU operations...
|
|
30
|
+
* root.destroy();
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function initGPU(options?: InitGPUOptions): Promise<GraphwiseGPURoot>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a TypeGPU root from an existing GPU device.
|
|
36
|
+
*
|
|
37
|
+
* Use this when you already have a GPUDevice and want to wrap it
|
|
38
|
+
* with TypeGPU functionality.
|
|
39
|
+
*
|
|
40
|
+
* @param device - Existing GPU device
|
|
41
|
+
* @returns TypeGPU root instance
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* import { initGPUFromDevice } from "graphwise/gpu";
|
|
46
|
+
*
|
|
47
|
+
* const adapter = await navigator.gpu.requestAdapter();
|
|
48
|
+
* const device = await adapter.requestDevice();
|
|
49
|
+
* const root = initGPUFromDevice(device);
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function initGPUFromDevice(device: GPUDevice): GraphwiseGPURoot;
|
|
53
|
+
//# sourceMappingURL=root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/gpu/root.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,uCAAuC;IACvC,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,GAAG,kBAAkB,CAAC;CAC5D;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAErE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,OAAO,CAC5B,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAe3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,gBAAgB,CAErE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.unit.test.d.ts","sourceRoot":"","sources":["../../src/gpu/root.unit.test.ts"],"names":[],"mappings":""}
|
package/dist/gpu/types.d.ts
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Type definitions for the WebGPU compute backend.
|
|
3
|
-
*
|
|
4
|
-
* These types define the backend selection options and result types
|
|
5
|
-
* for GPU-accelerated graph operations.
|
|
6
|
-
*/
|
|
1
|
+
import { GraphwiseGPURoot } from './root';
|
|
7
2
|
/**
|
|
8
3
|
* Backend selection for compute operations.
|
|
9
4
|
*
|
|
@@ -44,7 +39,7 @@ export interface ComputeResult<T> {
|
|
|
44
39
|
export interface GPUComputeOptions {
|
|
45
40
|
/** Backend selection: 'auto', 'gpu', or 'cpu' */
|
|
46
41
|
readonly backend?: ComputeBackend;
|
|
47
|
-
/** Optional
|
|
48
|
-
readonly
|
|
42
|
+
/** Optional TypeGPU root to reuse (avoids device acquisition overhead) */
|
|
43
|
+
readonly root?: GraphwiseGPURoot;
|
|
49
44
|
}
|
|
50
45
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/gpu/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gpu/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBAC3B,MAAM,EAAE,MAAM;CAIjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,KAAK,CAAC;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,iDAAiD;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gpu/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBAC3B,MAAM,EAAE,MAAM;CAIjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,KAAK,CAAC;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,iDAAiD;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACjC"}
|