@graphty/algorithms 2.1.1 → 2.2.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/README.md +139 -50
- package/dist/algorithms.js +15260 -10390
- package/dist/algorithms.js.map +1 -1
- package/dist/algorithms.standalone.js +26675 -21542
- package/dist/algorithms.standalone.js.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.d.ts +18 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +40 -1
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.d.ts +20 -0
- package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +93 -8
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.d.ts +9 -0
- package/dist/src/algorithms/centrality/degree.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +18 -0
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.d.ts +10 -0
- package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.js +29 -0
- package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
- package/dist/src/algorithms/centrality/hits.d.ts +9 -0
- package/dist/src/algorithms/centrality/hits.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/hits.js +23 -0
- package/dist/src/algorithms/centrality/hits.js.map +1 -1
- package/dist/src/algorithms/centrality/katz.d.ts +9 -0
- package/dist/src/algorithms/centrality/katz.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/katz.js +31 -0
- package/dist/src/algorithms/centrality/katz.js.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.d.ts +13 -13
- package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.js +47 -10
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman-legacy.d.ts +27 -0
- package/dist/src/algorithms/community/girvan-newman-legacy.d.ts.map +1 -0
- package/dist/src/algorithms/community/girvan-newman-legacy.js +335 -0
- package/dist/src/algorithms/community/girvan-newman-legacy.js.map +1 -0
- package/dist/src/algorithms/community/girvan-newman.d.ts +5 -3
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.js +34 -308
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
- package/dist/src/algorithms/community/label-propagation.d.ts +9 -6
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
- package/dist/src/algorithms/community/label-propagation.js +24 -110
- package/dist/src/algorithms/community/label-propagation.js.map +1 -1
- package/dist/src/algorithms/components/connected.d.ts.map +1 -1
- package/dist/src/algorithms/components/connected.js +28 -77
- package/dist/src/algorithms/components/connected.js.map +1 -1
- package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -1
- package/dist/src/algorithms/mst/kruskal.js +59 -3
- package/dist/src/algorithms/mst/kruskal.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.js +46 -0
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +27 -0
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +15 -5
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/floyd-warshall.js +97 -107
- package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.d.ts +2 -12
- package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.js +47 -308
- package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs-variants.js +5 -25
- package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs.d.ts +0 -3
- package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +0 -4
- package/dist/src/algorithms/traversal/bfs.js.map +1 -1
- package/dist/src/algorithms/traversal/dfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/dfs.js +33 -154
- package/dist/src/algorithms/traversal/dfs.js.map +1 -1
- package/dist/src/clustering/hierarchical-legacy.d.ts +56 -0
- package/dist/src/clustering/hierarchical-legacy.d.ts.map +1 -0
- package/dist/src/clustering/hierarchical-legacy.js +441 -0
- package/dist/src/clustering/hierarchical-legacy.js.map +1 -0
- package/dist/src/clustering/hierarchical.d.ts +7 -39
- package/dist/src/clustering/hierarchical.d.ts.map +1 -1
- package/dist/src/clustering/hierarchical.js +56 -417
- package/dist/src/clustering/hierarchical.js.map +1 -1
- package/dist/src/clustering/k-core-legacy.d.ts +30 -0
- package/dist/src/clustering/k-core-legacy.d.ts.map +1 -0
- package/dist/src/clustering/k-core-legacy.js +191 -0
- package/dist/src/clustering/k-core-legacy.js.map +1 -0
- package/dist/src/clustering/k-core.d.ts +8 -7
- package/dist/src/clustering/k-core.d.ts.map +1 -1
- package/dist/src/clustering/k-core.js +33 -174
- package/dist/src/clustering/k-core.js.map +1 -1
- package/dist/src/clustering/mcl-legacy.d.ts +42 -0
- package/dist/src/clustering/mcl-legacy.d.ts.map +1 -0
- package/dist/src/clustering/mcl-legacy.js +386 -0
- package/dist/src/clustering/mcl-legacy.js.map +1 -0
- package/dist/src/clustering/mcl.d.ts +9 -32
- package/dist/src/clustering/mcl.d.ts.map +1 -1
- package/dist/src/clustering/mcl.js +48 -374
- package/dist/src/clustering/mcl.js.map +1 -1
- package/dist/src/index.d.ts +29 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexed/accelerator.d.ts +141 -11
- package/dist/src/indexed/accelerator.d.ts.map +1 -1
- package/dist/src/indexed/accelerator.js +319 -5
- package/dist/src/indexed/accelerator.js.map +1 -1
- package/dist/src/indexed/all-pairs.d.ts +59 -0
- package/dist/src/indexed/all-pairs.d.ts.map +1 -0
- package/dist/src/indexed/all-pairs.js +274 -0
- package/dist/src/indexed/all-pairs.js.map +1 -0
- package/dist/src/indexed/bellman-ford.d.ts +25 -0
- package/dist/src/indexed/bellman-ford.d.ts.map +1 -0
- package/dist/src/indexed/bellman-ford.js +59 -0
- package/dist/src/indexed/bellman-ford.js.map +1 -0
- package/dist/src/indexed/betweenness.d.ts +85 -0
- package/dist/src/indexed/betweenness.d.ts.map +1 -0
- package/dist/src/indexed/betweenness.js +188 -0
- package/dist/src/indexed/betweenness.js.map +1 -0
- package/dist/src/indexed/bfs.d.ts +69 -2
- package/dist/src/indexed/bfs.d.ts.map +1 -1
- package/dist/src/indexed/bfs.js +148 -1
- package/dist/src/indexed/bfs.js.map +1 -1
- package/dist/src/indexed/bipartite.d.ts +37 -0
- package/dist/src/indexed/bipartite.d.ts.map +1 -0
- package/dist/src/indexed/bipartite.js +54 -0
- package/dist/src/indexed/bipartite.js.map +1 -0
- package/dist/src/indexed/closeness.d.ts +49 -0
- package/dist/src/indexed/closeness.d.ts.map +1 -0
- package/dist/src/indexed/closeness.js +127 -0
- package/dist/src/indexed/closeness.js.map +1 -0
- package/dist/src/indexed/common-neighbors.d.ts +14 -1
- package/dist/src/indexed/common-neighbors.d.ts.map +1 -1
- package/dist/src/indexed/common-neighbors.js +24 -14
- package/dist/src/indexed/common-neighbors.js.map +1 -1
- package/dist/src/indexed/degree.d.ts +19 -0
- package/dist/src/indexed/degree.d.ts.map +1 -0
- package/dist/src/indexed/degree.js +45 -0
- package/dist/src/indexed/degree.js.map +1 -0
- package/dist/src/indexed/delta-pagerank.d.ts +145 -0
- package/dist/src/indexed/delta-pagerank.d.ts.map +1 -0
- package/dist/src/indexed/delta-pagerank.js +428 -0
- package/dist/src/indexed/delta-pagerank.js.map +1 -0
- package/dist/src/indexed/dfs.d.ts +55 -0
- package/dist/src/indexed/dfs.d.ts.map +1 -0
- package/dist/src/indexed/dfs.js +146 -0
- package/dist/src/indexed/dfs.js.map +1 -0
- package/dist/src/indexed/eigenvector.d.ts +48 -0
- package/dist/src/indexed/eigenvector.d.ts.map +1 -0
- package/dist/src/indexed/eigenvector.js +162 -0
- package/dist/src/indexed/eigenvector.js.map +1 -0
- package/dist/src/indexed/facade.d.ts +109 -0
- package/dist/src/indexed/facade.d.ts.map +1 -0
- package/dist/src/indexed/facade.js +204 -0
- package/dist/src/indexed/facade.js.map +1 -0
- package/dist/src/indexed/flow.d.ts +120 -0
- package/dist/src/indexed/flow.d.ts.map +1 -0
- package/dist/src/indexed/flow.js +377 -0
- package/dist/src/indexed/flow.js.map +1 -0
- package/dist/src/indexed/girvan-newman.d.ts +42 -0
- package/dist/src/indexed/girvan-newman.d.ts.map +1 -0
- package/dist/src/indexed/girvan-newman.js +90 -0
- package/dist/src/indexed/girvan-newman.js.map +1 -0
- package/dist/src/indexed/grsbm.d.ts +85 -0
- package/dist/src/indexed/grsbm.d.ts.map +1 -0
- package/dist/src/indexed/grsbm.js +287 -0
- package/dist/src/indexed/grsbm.js.map +1 -0
- package/dist/src/indexed/hierarchical.d.ts +69 -0
- package/dist/src/indexed/hierarchical.d.ts.map +1 -0
- package/dist/src/indexed/hierarchical.js +245 -0
- package/dist/src/indexed/hierarchical.js.map +1 -0
- package/dist/src/indexed/index.d.ts +29 -3
- package/dist/src/indexed/index.d.ts.map +1 -1
- package/dist/src/indexed/index.js +29 -3
- package/dist/src/indexed/index.js.map +1 -1
- package/dist/src/indexed/isomorphism.d.ts +42 -0
- package/dist/src/indexed/isomorphism.d.ts.map +1 -0
- package/dist/src/indexed/isomorphism.js +269 -0
- package/dist/src/indexed/isomorphism.js.map +1 -0
- package/dist/src/indexed/label-propagation.d.ts +134 -0
- package/dist/src/indexed/label-propagation.d.ts.map +1 -0
- package/dist/src/indexed/label-propagation.js +486 -0
- package/dist/src/indexed/label-propagation.js.map +1 -0
- package/dist/src/indexed/leiden.d.ts +52 -0
- package/dist/src/indexed/leiden.d.ts.map +1 -0
- package/dist/src/indexed/leiden.js +384 -0
- package/dist/src/indexed/leiden.js.map +1 -0
- package/dist/src/indexed/link-prediction.d.ts +147 -0
- package/dist/src/indexed/link-prediction.d.ts.map +1 -0
- package/dist/src/indexed/link-prediction.js +317 -0
- package/dist/src/indexed/link-prediction.js.map +1 -0
- package/dist/src/indexed/markov.d.ts +54 -0
- package/dist/src/indexed/markov.d.ts.map +1 -0
- package/dist/src/indexed/markov.js +284 -0
- package/dist/src/indexed/markov.js.map +1 -0
- package/dist/src/indexed/matching.d.ts +53 -0
- package/dist/src/indexed/matching.d.ts.map +1 -0
- package/dist/src/indexed/matching.js +139 -0
- package/dist/src/indexed/matching.js.map +1 -0
- package/dist/src/indexed/min-cut.d.ts +48 -0
- package/dist/src/indexed/min-cut.d.ts.map +1 -0
- package/dist/src/indexed/min-cut.js +175 -0
- package/dist/src/indexed/min-cut.js.map +1 -0
- package/dist/src/indexed/modularity.d.ts +34 -0
- package/dist/src/indexed/modularity.d.ts.map +1 -0
- package/dist/src/indexed/modularity.js +74 -0
- package/dist/src/indexed/modularity.js.map +1 -0
- package/dist/src/indexed/mst.d.ts +29 -1
- package/dist/src/indexed/mst.d.ts.map +1 -1
- package/dist/src/indexed/mst.js +62 -0
- package/dist/src/indexed/mst.js.map +1 -1
- package/dist/src/indexed/pagerank.d.ts +29 -6
- package/dist/src/indexed/pagerank.d.ts.map +1 -1
- package/dist/src/indexed/pagerank.js +107 -11
- package/dist/src/indexed/pagerank.js.map +1 -1
- package/dist/src/indexed/point-to-point.d.ts +53 -0
- package/dist/src/indexed/point-to-point.d.ts.map +1 -0
- package/dist/src/indexed/point-to-point.js +173 -0
- package/dist/src/indexed/point-to-point.js.map +1 -0
- package/dist/src/indexed/scc.d.ts +53 -0
- package/dist/src/indexed/scc.d.ts.map +1 -0
- package/dist/src/indexed/scc.js +110 -0
- package/dist/src/indexed/scc.js.map +1 -0
- package/dist/src/indexed/spectral.d.ts +61 -0
- package/dist/src/indexed/spectral.d.ts.map +1 -0
- package/dist/src/indexed/spectral.js +476 -0
- package/dist/src/indexed/spectral.js.map +1 -0
- package/dist/src/indexed/structures/bit-set.d.ts +45 -0
- package/dist/src/indexed/structures/bit-set.d.ts.map +1 -0
- package/dist/src/indexed/structures/bit-set.js +57 -0
- package/dist/src/indexed/structures/bit-set.js.map +1 -0
- package/dist/src/indexed/structures/max-heap.d.ts +52 -0
- package/dist/src/indexed/structures/max-heap.d.ts.map +1 -0
- package/dist/src/indexed/structures/max-heap.js +66 -0
- package/dist/src/indexed/structures/max-heap.js.map +1 -0
- package/dist/src/indexed/structures/min-heap.d.ts +30 -1
- package/dist/src/indexed/structures/min-heap.d.ts.map +1 -1
- package/dist/src/indexed/structures/min-heap.js +46 -6
- package/dist/src/indexed/structures/min-heap.js.map +1 -1
- package/dist/src/indexed/structures/ring-queue.d.ts +41 -0
- package/dist/src/indexed/structures/ring-queue.d.ts.map +1 -0
- package/dist/src/indexed/structures/ring-queue.js +64 -0
- package/dist/src/indexed/structures/ring-queue.js.map +1 -0
- package/dist/src/indexed/sync.d.ts +50 -0
- package/dist/src/indexed/sync.d.ts.map +1 -0
- package/dist/src/indexed/sync.js +175 -0
- package/dist/src/indexed/sync.js.map +1 -0
- package/dist/src/indexed/terahac.d.ts +58 -0
- package/dist/src/indexed/terahac.d.ts.map +1 -0
- package/dist/src/indexed/terahac.js +244 -0
- package/dist/src/indexed/terahac.js.map +1 -0
- package/dist/src/indexed/to-snapshot.d.ts +45 -2
- package/dist/src/indexed/to-snapshot.d.ts.map +1 -1
- package/dist/src/indexed/to-snapshot.js +140 -6
- package/dist/src/indexed/to-snapshot.js.map +1 -1
- package/dist/src/link-prediction/common-neighbors-legacy.d.ts +71 -0
- package/dist/src/link-prediction/common-neighbors-legacy.d.ts.map +1 -0
- package/dist/src/link-prediction/common-neighbors-legacy.js +172 -0
- package/dist/src/link-prediction/common-neighbors-legacy.js.map +1 -0
- package/dist/src/link-prediction/common-neighbors.d.ts +11 -19
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
- package/dist/src/link-prediction/common-neighbors.js +56 -123
- package/dist/src/link-prediction/common-neighbors.js.map +1 -1
- package/dist/src/optimized/direction-optimized-bfs.d.ts +6 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -1
- package/dist/src/optimized/direction-optimized-bfs.js +6 -0
- package/dist/src/optimized/direction-optimized-bfs.js.map +1 -1
- package/dist/src/research/grsbm-legacy.d.ts +82 -0
- package/dist/src/research/grsbm-legacy.d.ts.map +1 -0
- package/dist/src/research/grsbm-legacy.js +416 -0
- package/dist/src/research/grsbm-legacy.js.map +1 -0
- package/dist/src/research/grsbm.d.ts +9 -66
- package/dist/src/research/grsbm.d.ts.map +1 -1
- package/dist/src/research/grsbm.js +67 -391
- package/dist/src/research/grsbm.js.map +1 -1
- package/dist/src/research/sync-legacy.d.ts +48 -0
- package/dist/src/research/sync-legacy.d.ts.map +1 -0
- package/dist/src/research/sync-legacy.js +337 -0
- package/dist/src/research/sync-legacy.js.map +1 -0
- package/dist/src/research/sync.d.ts +10 -32
- package/dist/src/research/sync.d.ts.map +1 -1
- package/dist/src/research/sync.js +28 -316
- package/dist/src/research/sync.js.map +1 -1
- package/package.json +4 -3
- package/src/algorithms/centrality/betweenness.ts +51 -1
- package/src/algorithms/centrality/closeness.ts +112 -12
- package/src/algorithms/centrality/degree.ts +19 -0
- package/src/algorithms/centrality/eigenvector.ts +34 -0
- package/src/algorithms/centrality/hits.ts +24 -0
- package/src/algorithms/centrality/katz.ts +32 -0
- package/src/algorithms/centrality/pagerank.ts +53 -13
- package/src/algorithms/community/girvan-newman-legacy.ts +414 -0
- package/src/algorithms/community/girvan-newman.ts +36 -386
- package/src/algorithms/community/label-propagation.ts +24 -133
- package/src/algorithms/components/connected.ts +28 -95
- package/src/algorithms/mst/kruskal.ts +65 -4
- package/src/algorithms/shortest-path/bellman-ford.ts +49 -0
- package/src/algorithms/shortest-path/dijkstra.ts +29 -0
- package/src/algorithms/shortest-path/floyd-warshall.ts +106 -136
- package/src/algorithms/traversal/bfs-unified.ts +52 -366
- package/src/algorithms/traversal/bfs-variants.ts +5 -28
- package/src/algorithms/traversal/bfs.ts +0 -4
- package/src/algorithms/traversal/dfs.ts +39 -182
- package/src/clustering/hierarchical-legacy.ts +551 -0
- package/src/clustering/hierarchical.ts +64 -520
- package/src/clustering/k-core-legacy.ts +229 -0
- package/src/clustering/k-core.ts +38 -209
- package/src/clustering/mcl-legacy.ts +498 -0
- package/src/clustering/mcl.ts +46 -479
- package/src/index.ts +90 -3
- package/src/indexed/accelerator.ts +502 -16
- package/src/indexed/all-pairs.ts +342 -0
- package/src/indexed/bellman-ford.ts +72 -0
- package/src/indexed/betweenness.ts +258 -0
- package/src/indexed/bfs.ts +189 -3
- package/src/indexed/bipartite.ts +77 -0
- package/src/indexed/closeness.ts +160 -0
- package/src/indexed/common-neighbors.ts +31 -14
- package/src/indexed/degree.ts +55 -0
- package/src/indexed/delta-pagerank.ts +513 -0
- package/src/indexed/dfs.ts +189 -0
- package/src/indexed/eigenvector.ts +202 -0
- package/src/indexed/facade.ts +229 -0
- package/src/indexed/flow.ts +500 -0
- package/src/indexed/girvan-newman.ts +120 -0
- package/src/indexed/grsbm.ts +390 -0
- package/src/indexed/hierarchical.ts +295 -0
- package/src/indexed/index.ts +94 -3
- package/src/indexed/isomorphism.ts +305 -0
- package/src/indexed/label-propagation.ts +582 -0
- package/src/indexed/leiden.ts +436 -0
- package/src/indexed/link-prediction.ts +399 -0
- package/src/indexed/markov.ts +324 -0
- package/src/indexed/matching.ts +192 -0
- package/src/indexed/min-cut.ts +201 -0
- package/src/indexed/modularity.ts +81 -0
- package/src/indexed/mst.ts +79 -1
- package/src/indexed/pagerank.ts +128 -15
- package/src/indexed/point-to-point.ts +220 -0
- package/src/indexed/scc.ts +132 -0
- package/src/indexed/spectral.ts +550 -0
- package/src/indexed/structures/bit-set.ts +65 -0
- package/src/indexed/structures/max-heap.ts +74 -0
- package/src/indexed/structures/min-heap.ts +51 -6
- package/src/indexed/structures/ring-queue.ts +70 -0
- package/src/indexed/sync.ts +229 -0
- package/src/indexed/terahac.ts +290 -0
- package/src/indexed/to-snapshot.ts +156 -6
- package/src/link-prediction/common-neighbors-legacy.ts +252 -0
- package/src/link-prediction/common-neighbors.ts +65 -168
- package/src/optimized/direction-optimized-bfs.ts +6 -1
- package/src/research/grsbm-legacy.ts +586 -0
- package/src/research/grsbm.ts +76 -555
- package/src/research/sync-legacy.ts +456 -0
- package/src/research/sync.ts +30 -431
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The arcs of each row reordered into logical edge order: the legacy adjacency's neighbour order.
|
|
3
|
+
* @param s - A directed snapshot
|
|
4
|
+
* @returns Arc indices, grouped by row as `rowPtr` groups them
|
|
5
|
+
*/
|
|
6
|
+
function arcsInEdgeOrder(s) {
|
|
7
|
+
const order = new Uint32Array(s.arcCount);
|
|
8
|
+
const next = s.rowPtr.slice(0, s.nodeCount);
|
|
9
|
+
const { src } = s.edgeList();
|
|
10
|
+
for (let e = 0; e < s.edgeCount; e++) {
|
|
11
|
+
order[next[src[e]]++] = s.edgeToArc[e];
|
|
12
|
+
}
|
|
13
|
+
return order;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Sum of the arc weights (1 where there are none) per node, added in `order`.
|
|
17
|
+
* @param s - The snapshot
|
|
18
|
+
* @param order - Its arcs in the order to add them
|
|
19
|
+
* @param weights - Per-arc weights, or null for 1 each
|
|
20
|
+
* @returns The out-weight per node index
|
|
21
|
+
*/
|
|
22
|
+
function outWeights(s, order, weights) {
|
|
23
|
+
const out = new Float64Array(s.nodeCount);
|
|
24
|
+
for (let u = 0; u < s.nodeCount; u++) {
|
|
25
|
+
let total = 0;
|
|
26
|
+
for (let k = s.rowPtr[u]; k < s.rowPtr[u + 1]; k++) {
|
|
27
|
+
total += weights === null ? 1 : weights[order[k]];
|
|
28
|
+
}
|
|
29
|
+
out[u] = total;
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Divide by the sum in place, when the sum is positive.
|
|
35
|
+
* @param v - The vector to normalise
|
|
36
|
+
*/
|
|
37
|
+
function normalize(v) {
|
|
38
|
+
let sum = 0;
|
|
39
|
+
for (let i = 0; i < v.length; i++) {
|
|
40
|
+
sum += v[i];
|
|
41
|
+
}
|
|
42
|
+
if (sum > 0) {
|
|
43
|
+
for (let i = 0; i < v.length; i++) {
|
|
44
|
+
v[i] /= sum;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A normalised copy of a per-node vector, or null when absent.
|
|
50
|
+
* @param v - The caller's vector
|
|
51
|
+
* @param n - The node count it must match
|
|
52
|
+
* @param name - The option name, for the error message
|
|
53
|
+
* @returns The normalised copy, or null
|
|
54
|
+
*/
|
|
55
|
+
function nodeVector(v, n, name) {
|
|
56
|
+
if (v === undefined) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
if (v.length !== n) {
|
|
60
|
+
throw new RangeError(`${name} has ${String(v.length)} entries; the graph has ${String(n)} nodes`);
|
|
61
|
+
}
|
|
62
|
+
const out = Float64Array.from(v);
|
|
63
|
+
normalize(out);
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The per-arc weight override, checked against the arc count, or the snapshot's own weights.
|
|
68
|
+
* @param s - The snapshot
|
|
69
|
+
* @param w - The caller's override
|
|
70
|
+
* @returns The weights to use, or null when the snapshot has none and no override is given
|
|
71
|
+
*/
|
|
72
|
+
function arcWeights(s, w) {
|
|
73
|
+
if (w === undefined) {
|
|
74
|
+
return s.weights;
|
|
75
|
+
}
|
|
76
|
+
if (w.length !== s.arcCount) {
|
|
77
|
+
throw new RangeError(`weights has ${String(w.length)} entries; the graph has ${String(s.arcCount)} arcs`);
|
|
78
|
+
}
|
|
79
|
+
return w;
|
|
80
|
+
}
|
|
81
|
+
function checkDamping(d) {
|
|
82
|
+
if (d < 0 || d > 1) {
|
|
83
|
+
throw new Error("Damping factor must be between 0 and 1");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* PageRank by power iteration with an L-infinity stopping rule: the `useDelta` path of the legacy
|
|
88
|
+
* `pageRank`, which it takes when `useDelta !== false` and the graph has more than 100 nodes. Its
|
|
89
|
+
* other path runs the same iteration, so this answers both. A node with no out-arcs is dangling
|
|
90
|
+
* and its rank is spread over every node (by the personalization when one is given); a node whose
|
|
91
|
+
* out-weights sum to 0 but has arcs is not dangling and passes nothing on, as in legacy.
|
|
92
|
+
*
|
|
93
|
+
* Not in the `indexed` namespace: it propagates no deltas, and it exists only so the legacy
|
|
94
|
+
* `pageRank` facade can reproduce legacy arithmetic exactly. Snapshot callers use
|
|
95
|
+
* `indexed.pageRank`.
|
|
96
|
+
* @param s - A DIRECTED snapshot
|
|
97
|
+
* @param o - Algorithm options
|
|
98
|
+
* @returns The scores, the iteration count and the convergence flag
|
|
99
|
+
* @internal
|
|
100
|
+
*/
|
|
101
|
+
export function deltaPageRank(s, o = {}) {
|
|
102
|
+
if (!s.directed) {
|
|
103
|
+
throw new Error("PageRank requires a directed graph");
|
|
104
|
+
}
|
|
105
|
+
const d = o.dampingFactor ?? 0.85;
|
|
106
|
+
checkDamping(d);
|
|
107
|
+
const n = s.nodeCount;
|
|
108
|
+
const maxIter = o.maxIterations ?? 100;
|
|
109
|
+
const tol = o.tolerance ?? 1e-6;
|
|
110
|
+
if (n === 0) {
|
|
111
|
+
return { scores: new Float64Array(0), iterations: 0, converged: true };
|
|
112
|
+
}
|
|
113
|
+
const personal = nodeVector(o.personalization, n, "personalization");
|
|
114
|
+
let rank = nodeVector(o.initialRanks, n, "initialRanks") ?? new Float64Array(n).fill(1 / n);
|
|
115
|
+
const order = arcsInEdgeOrder(s);
|
|
116
|
+
const weights = o.weighted === true ? arcWeights(s, o.weights) : null;
|
|
117
|
+
const outW = outWeights(s, order, weights);
|
|
118
|
+
let next = new Float64Array(n);
|
|
119
|
+
let iterations = 0;
|
|
120
|
+
let converged = false;
|
|
121
|
+
while (iterations < maxIter && !converged) {
|
|
122
|
+
iterations++;
|
|
123
|
+
let dangling = 0;
|
|
124
|
+
for (let u = 0; u < n; u++) {
|
|
125
|
+
if (s.rowPtr[u] === s.rowPtr[u + 1]) {
|
|
126
|
+
dangling += rank[u];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const spread = dangling > 0 ? (d * dangling) / n : 0;
|
|
130
|
+
for (let v = 0; v < n; v++) {
|
|
131
|
+
next[v] = personal === null ? (1 - d) / n + spread : (1 - d) * personal[v] + spread * personal[v];
|
|
132
|
+
}
|
|
133
|
+
for (let u = 0; u < n; u++) {
|
|
134
|
+
const ow = outW[u];
|
|
135
|
+
if (ow > 0) {
|
|
136
|
+
for (let k = s.rowPtr[u]; k < s.rowPtr[u + 1]; k++) {
|
|
137
|
+
const a = order[k];
|
|
138
|
+
next[s.colIdx[a]] += d * rank[u] * ((weights === null ? 1 : weights[a]) / ow);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
let maxDiff = 0;
|
|
143
|
+
for (let v = 0; v < n; v++) {
|
|
144
|
+
maxDiff = Math.max(maxDiff, Math.abs(next[v] - rank[v]));
|
|
145
|
+
}
|
|
146
|
+
[rank, next] = [next, rank];
|
|
147
|
+
converged = maxDiff < tol;
|
|
148
|
+
}
|
|
149
|
+
return { scores: rank, iterations, converged };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Delta-propagating PageRank that keeps its state between calls, as the legacy `DeltaPageRank`
|
|
153
|
+
* does: each round, every active node with a delta of at least `deltaThreshold` adds it to its
|
|
154
|
+
* score and pushes `dampingFactor * delta` along its out-arcs; the teleport share is added to
|
|
155
|
+
* every node's next delta each round, and the scores are normalised at the end. The out-weights
|
|
156
|
+
* that split a delta are the WEIGHTED out-degrees even when `weighted` is false -- legacy's
|
|
157
|
+
* arithmetic, kept so the two agree.
|
|
158
|
+
* @public
|
|
159
|
+
*/
|
|
160
|
+
export class DeltaPageRank {
|
|
161
|
+
/**
|
|
162
|
+
* Start every node at score 0 with a pending delta of 1 / n, all active.
|
|
163
|
+
* @param s - A DIRECTED snapshot
|
|
164
|
+
* @param o - The per-arc weight override
|
|
165
|
+
*/
|
|
166
|
+
constructor(s, o = {}) {
|
|
167
|
+
if (!s.directed) {
|
|
168
|
+
throw new Error("DeltaPageRank requires a directed graph");
|
|
169
|
+
}
|
|
170
|
+
this.s = s;
|
|
171
|
+
this.order = arcsInEdgeOrder(s);
|
|
172
|
+
this.weights = arcWeights(s, o.weights);
|
|
173
|
+
this.outW = outWeights(s, this.order, this.weights);
|
|
174
|
+
this.scores = new Float64Array(s.nodeCount);
|
|
175
|
+
this.deltas = new Float64Array(s.nodeCount).fill(1 / s.nodeCount);
|
|
176
|
+
this.active = new Uint8Array(s.nodeCount).fill(1);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Propagate deltas until none is active, every pending delta is below `tolerance`, or
|
|
180
|
+
* `maxIterations` rounds have run; then normalise the scores.
|
|
181
|
+
* @param o - Algorithm options
|
|
182
|
+
* @returns A copy of the scores per node index
|
|
183
|
+
*/
|
|
184
|
+
compute(o = {}) {
|
|
185
|
+
return this.run(o, false);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Make only the given nodes and their in- and out-neighbours active, then {@link compute}.
|
|
189
|
+
* An index outside the graph names nothing and is skipped, but a non-empty `modified` still
|
|
190
|
+
* starts a round, as legacy does for an id the graph lacks. The snapshot is frozen, so this
|
|
191
|
+
* re-runs over the same graph; a changed graph is a new snapshot and a new engine.
|
|
192
|
+
* @param modified - Node indices to reactivate
|
|
193
|
+
* @param o - Algorithm options
|
|
194
|
+
* @returns A copy of the scores per node index
|
|
195
|
+
*/
|
|
196
|
+
update(modified, o = {}) {
|
|
197
|
+
const { s } = this;
|
|
198
|
+
const rev = s.reverse();
|
|
199
|
+
const active = new Uint8Array(s.nodeCount);
|
|
200
|
+
for (let i = 0; i < modified.length; i++) {
|
|
201
|
+
const u = modified[i];
|
|
202
|
+
if (!Number.isInteger(u) || u < 0 || u >= s.nodeCount) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
active[u] = 1;
|
|
206
|
+
for (let a = rev.rowPtr[u]; a < rev.rowPtr[u + 1]; a++) {
|
|
207
|
+
active[rev.colIdx[a]] = 1;
|
|
208
|
+
}
|
|
209
|
+
for (let a = s.rowPtr[u]; a < s.rowPtr[u + 1]; a++) {
|
|
210
|
+
active[s.colIdx[a]] = 1;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
this.active = active;
|
|
214
|
+
return this.run(o, modified.length > 0);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* The propagation rounds behind {@link compute} and {@link update}.
|
|
218
|
+
* @param o - Algorithm options
|
|
219
|
+
* @param startRound - Run the first round even when no node is active
|
|
220
|
+
* @returns A copy of the scores per node index
|
|
221
|
+
*/
|
|
222
|
+
run(o, startRound) {
|
|
223
|
+
const d = o.dampingFactor ?? 0.85;
|
|
224
|
+
const tol = o.tolerance ?? 1e-6;
|
|
225
|
+
const maxIter = o.maxIterations ?? 100;
|
|
226
|
+
const threshold = o.deltaThreshold ?? tol / 10;
|
|
227
|
+
checkDamping(d);
|
|
228
|
+
const { s, order, scores } = this;
|
|
229
|
+
const n = s.nodeCount;
|
|
230
|
+
if (n === 0) {
|
|
231
|
+
return new Float64Array(0);
|
|
232
|
+
}
|
|
233
|
+
const personal = nodeVector(o.personalization, n, "personalization");
|
|
234
|
+
const weights = o.weighted === true ? this.weights : null;
|
|
235
|
+
const randomJump = (1 - d) / n;
|
|
236
|
+
let activeCount = this.active.reduce((sum, x) => sum + x, 0);
|
|
237
|
+
for (let it = 0; (activeCount > 0 || (it === 0 && startRound)) && it < maxIter; it++) {
|
|
238
|
+
const next = new Float64Array(n);
|
|
239
|
+
let dangling = 0;
|
|
240
|
+
for (let u = 0; u < n; u++) {
|
|
241
|
+
if (s.rowPtr[u] === s.rowPtr[u + 1]) {
|
|
242
|
+
dangling += scores[u] + this.deltas[u];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (dangling > 0) {
|
|
246
|
+
const spread = (d * dangling) / n;
|
|
247
|
+
for (let v = 0; v < n; v++) {
|
|
248
|
+
next[v] += personal === null ? spread : spread * personal[v];
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
for (let u = 0; u < n; u++) {
|
|
252
|
+
const delta = this.deltas[u];
|
|
253
|
+
if (this.active[u] === 0 || Math.abs(delta) < threshold) {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
scores[u] += delta;
|
|
257
|
+
const ow = this.outW[u];
|
|
258
|
+
if (ow > 0) {
|
|
259
|
+
for (let k = s.rowPtr[u]; k < s.rowPtr[u + 1]; k++) {
|
|
260
|
+
const a = order[k];
|
|
261
|
+
next[s.colIdx[a]] += d * delta * ((weights === null ? 1 : weights[a]) / ow);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
let maxDelta = 0;
|
|
266
|
+
activeCount = 0;
|
|
267
|
+
for (let v = 0; v < n; v++) {
|
|
268
|
+
next[v] += personal === null ? randomJump : (1 - d) * personal[v];
|
|
269
|
+
const size = Math.abs(next[v]);
|
|
270
|
+
maxDelta = Math.max(maxDelta, size);
|
|
271
|
+
this.active[v] = size >= threshold ? 1 : 0;
|
|
272
|
+
activeCount += this.active[v];
|
|
273
|
+
}
|
|
274
|
+
this.deltas = next;
|
|
275
|
+
if (maxDelta < tol) {
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
normalize(scores);
|
|
280
|
+
return scores.slice();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* A binary max-heap of node indices that allows duplicates and breaks ties exactly as the legacy
|
|
285
|
+
* `PriorityQueue` with comparator `(a, b) => b - a` does, so both dequeue in the same order.
|
|
286
|
+
*/
|
|
287
|
+
class DuplicateMaxHeap {
|
|
288
|
+
constructor() {
|
|
289
|
+
this.node = [];
|
|
290
|
+
this.key = [];
|
|
291
|
+
}
|
|
292
|
+
isEmpty() {
|
|
293
|
+
return this.node.length === 0;
|
|
294
|
+
}
|
|
295
|
+
push(node, key) {
|
|
296
|
+
this.node.push(node);
|
|
297
|
+
this.key.push(key);
|
|
298
|
+
let i = this.node.length - 1;
|
|
299
|
+
while (i > 0) {
|
|
300
|
+
const p = (i - 1) >> 1;
|
|
301
|
+
if (!(this.key[p] - this.key[i] < 0)) {
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
this.swap(i, p);
|
|
305
|
+
i = p;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
pop() {
|
|
309
|
+
const top = this.node[0];
|
|
310
|
+
const lastNode = this.node.pop();
|
|
311
|
+
const lastKey = this.key.pop();
|
|
312
|
+
if (this.node.length === 0) {
|
|
313
|
+
return top;
|
|
314
|
+
}
|
|
315
|
+
this.node[0] = lastNode;
|
|
316
|
+
this.key[0] = lastKey;
|
|
317
|
+
let i = 0;
|
|
318
|
+
for (;;) {
|
|
319
|
+
const l = 2 * i + 1;
|
|
320
|
+
const r = l + 1;
|
|
321
|
+
let t = i;
|
|
322
|
+
if (l < this.node.length && this.key[t] - this.key[l] < 0) {
|
|
323
|
+
t = l;
|
|
324
|
+
}
|
|
325
|
+
if (r < this.node.length && this.key[t] - this.key[r] < 0) {
|
|
326
|
+
t = r;
|
|
327
|
+
}
|
|
328
|
+
if (t === i) {
|
|
329
|
+
return top;
|
|
330
|
+
}
|
|
331
|
+
this.swap(i, t);
|
|
332
|
+
i = t;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
swap(i, j) {
|
|
336
|
+
[this.node[i], this.node[j]] = [this.node[j], this.node[i]];
|
|
337
|
+
[this.key[i], this.key[j]] = [this.key[j], this.key[i]];
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Delta PageRank processed one node at a time, largest pending delta first, keeping its state
|
|
342
|
+
* between calls as the legacy `PriorityDeltaPageRank` does. `maxIterations` counts processed
|
|
343
|
+
* nodes; every 1000 of them the run stops if no pending delta reaches `tolerance`. At the end
|
|
344
|
+
* each pending delta of at least `deltaThreshold` is added to its score (and stays pending), the
|
|
345
|
+
* teleport share is added, and the scores are normalised. The out-weights are the WEIGHTED
|
|
346
|
+
* out-degrees even when `weighted` is false, as in legacy.
|
|
347
|
+
* @public
|
|
348
|
+
*/
|
|
349
|
+
export class PriorityDeltaPageRank {
|
|
350
|
+
/**
|
|
351
|
+
* Start every node at score 0 with a pending delta of 1 / n, queued in index order.
|
|
352
|
+
* @param s - A DIRECTED snapshot
|
|
353
|
+
* @param o - The per-arc weight override
|
|
354
|
+
*/
|
|
355
|
+
constructor(s, o = {}) {
|
|
356
|
+
this.heap = new DuplicateMaxHeap();
|
|
357
|
+
if (!s.directed) {
|
|
358
|
+
throw new Error("PriorityDeltaPageRank requires a directed graph");
|
|
359
|
+
}
|
|
360
|
+
this.s = s;
|
|
361
|
+
this.order = arcsInEdgeOrder(s);
|
|
362
|
+
this.weights = arcWeights(s, o.weights);
|
|
363
|
+
this.outW = outWeights(s, this.order, this.weights);
|
|
364
|
+
this.scores = new Float64Array(s.nodeCount);
|
|
365
|
+
this.deltas = new Float64Array(s.nodeCount).fill(1 / s.nodeCount);
|
|
366
|
+
for (let u = 0; u < s.nodeCount; u++) {
|
|
367
|
+
this.heap.push(u, 1 / s.nodeCount);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Process queued nodes, largest pending delta first.
|
|
372
|
+
* @param o - Algorithm options; `personalization` is ignored
|
|
373
|
+
* @returns A copy of the scores per node index
|
|
374
|
+
*/
|
|
375
|
+
computeWithPriority(o = {}) {
|
|
376
|
+
const d = o.dampingFactor ?? 0.85;
|
|
377
|
+
const tol = o.tolerance ?? 1e-6;
|
|
378
|
+
const maxIter = o.maxIterations ?? 100;
|
|
379
|
+
const threshold = o.deltaThreshold ?? tol / 10;
|
|
380
|
+
const { s, order, scores, deltas, heap } = this;
|
|
381
|
+
const n = s.nodeCount;
|
|
382
|
+
const weights = o.weighted === true ? this.weights : null;
|
|
383
|
+
let iteration = 0;
|
|
384
|
+
let processed = 0;
|
|
385
|
+
while (!heap.isEmpty() && iteration < maxIter) {
|
|
386
|
+
const u = heap.pop();
|
|
387
|
+
const delta = deltas[u];
|
|
388
|
+
if (Math.abs(delta) < threshold) {
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
scores[u] += delta;
|
|
392
|
+
deltas[u] = 0;
|
|
393
|
+
const ow = this.outW[u];
|
|
394
|
+
if (ow > 0) {
|
|
395
|
+
for (let k = s.rowPtr[u]; k < s.rowPtr[u + 1]; k++) {
|
|
396
|
+
const a = order[k];
|
|
397
|
+
const v = s.colIdx[a];
|
|
398
|
+
const pending = deltas[v] + d * delta * ((weights === null ? 1 : weights[a]) / ow);
|
|
399
|
+
deltas[v] = pending;
|
|
400
|
+
if (Math.abs(pending) >= threshold) {
|
|
401
|
+
heap.push(v, Math.abs(pending));
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
processed++;
|
|
406
|
+
if (processed % 1000 === 0) {
|
|
407
|
+
let maxDelta = 0;
|
|
408
|
+
for (let v = 0; v < n; v++) {
|
|
409
|
+
maxDelta = Math.max(maxDelta, Math.abs(deltas[v]));
|
|
410
|
+
}
|
|
411
|
+
if (maxDelta < tol) {
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
iteration++;
|
|
416
|
+
}
|
|
417
|
+
const teleport = (1 - d) / n;
|
|
418
|
+
for (let v = 0; v < n; v++) {
|
|
419
|
+
if (Math.abs(deltas[v]) >= threshold) {
|
|
420
|
+
scores[v] += deltas[v];
|
|
421
|
+
}
|
|
422
|
+
scores[v] += teleport;
|
|
423
|
+
}
|
|
424
|
+
normalize(scores);
|
|
425
|
+
return scores.slice();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=delta-pagerank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delta-pagerank.js","sourceRoot":"","sources":["../../../src/indexed/delta-pagerank.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type AdjacencyView, type U32 } from "@graphty/graph-format";
|
|
2
|
+
import { type ArcOrderOption } from "./bfs.js";
|
|
3
|
+
/** Result of the index-based DFS. @public */
|
|
4
|
+
export interface DfsResult {
|
|
5
|
+
/** The visited nodes in pre-order or post-order (see `DfsOptions.order`); length `visitedCount`. */
|
|
6
|
+
readonly order: U32;
|
|
7
|
+
/** DFS-tree parent of every node, INVALID_INDEX for the start node and for unvisited nodes. */
|
|
8
|
+
readonly parent: U32;
|
|
9
|
+
/** DFS-tree depth of every node, INVALID_INDEX for unvisited nodes. */
|
|
10
|
+
readonly depth: U32;
|
|
11
|
+
/** How many nodes were visited. */
|
|
12
|
+
readonly visitedCount: number;
|
|
13
|
+
}
|
|
14
|
+
/** Options of the index-based DFS. @public */
|
|
15
|
+
export interface DfsOptions extends ArcOrderOption {
|
|
16
|
+
/**
|
|
17
|
+
* Stop the whole walk as soon as this node index is visited. Pre-order only: a post-order walk
|
|
18
|
+
* always runs to the end, since a node's post-order place is known only once its subtree is done.
|
|
19
|
+
* @throws RangeError when it is not a node index
|
|
20
|
+
*/
|
|
21
|
+
readonly target?: number | undefined;
|
|
22
|
+
/** "pre" (default) lists a node when it is first reached, "post" when its subtree is finished. */
|
|
23
|
+
readonly order?: "pre" | "post" | undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Depth-first search over out-neighbours, trying them in row (ascending index) order unless
|
|
27
|
+
* `options.arcOrder` gives another. Takes any
|
|
28
|
+
* `AdjacencyView`, so `s.reverse()` walks in-neighbours.
|
|
29
|
+
* @param g - The adjacency to traverse
|
|
30
|
+
* @param start - The node index to start from
|
|
31
|
+
* @param options - Traversal options
|
|
32
|
+
* @returns The visit order, the DFS tree as a parent array, the tree depths and the visited count
|
|
33
|
+
* @public
|
|
34
|
+
*/
|
|
35
|
+
export declare function depthFirstSearch(g: AdjacencyView, start: number, options?: DfsOptions): DfsResult;
|
|
36
|
+
/**
|
|
37
|
+
* Whether the graph has a cycle. Directed: a DFS back arc. Undirected: an edge closing a loop in a
|
|
38
|
+
* union-find forest. A self-loop is a cycle; a parallel pair is not -- the graph is read as simple,
|
|
39
|
+
* the adjacent-skip idiom of graph-format design section 3.5.
|
|
40
|
+
* @param g - The adjacency to test
|
|
41
|
+
* @returns True when a cycle exists
|
|
42
|
+
* @public
|
|
43
|
+
*/
|
|
44
|
+
export declare function hasCycle(g: AdjacencyView): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Topological order of a directed graph: reverse DFS post-order, roots taken in index order and
|
|
47
|
+
* neighbours in row order unless `options.arcOrder` gives another.
|
|
48
|
+
* @param g - A directed adjacency
|
|
49
|
+
* @param options - The neighbour order
|
|
50
|
+
* @returns The node indices in topological order, or null when the graph has a cycle
|
|
51
|
+
* @throws Error when the graph is undirected
|
|
52
|
+
* @public
|
|
53
|
+
*/
|
|
54
|
+
export declare function topologicalSort(g: AdjacencyView, options?: ArcOrderOption): U32 | null;
|
|
55
|
+
//# sourceMappingURL=dfs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dfs.d.ts","sourceRoot":"","sources":["../../../src/indexed/dfs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAEpF,OAAO,EAAE,KAAK,cAAc,EAA0C,MAAM,UAAU,CAAC;AAGvF,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACtB,oGAAoG;IACpG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACpB,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACpB,mCAAmC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CACjC;AAED,8CAA8C;AAC9C,MAAM,WAAW,UAAW,SAAQ,cAAc;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,kGAAkG;IAClG,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;CAC/C;AAmFD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,SAAS,CASrG;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CA0BlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,cAAmB,GAAG,GAAG,GAAG,IAAI,CAY1F"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { INVALID_INDEX } from "@graphty/graph-format";
|
|
2
|
+
import { checkArcOrder, checkStart, checkTarget } from "./bfs.js";
|
|
3
|
+
import { IntUnionFind } from "./structures/union-find.js";
|
|
4
|
+
const NEW = 0;
|
|
5
|
+
const OPEN = 1;
|
|
6
|
+
const DONE = 2;
|
|
7
|
+
function newWalk(nodeCount) {
|
|
8
|
+
return {
|
|
9
|
+
state: new Uint8Array(nodeCount),
|
|
10
|
+
parent: new Uint32Array(nodeCount).fill(INVALID_INDEX),
|
|
11
|
+
depth: new Uint32Array(nodeCount).fill(INVALID_INDEX),
|
|
12
|
+
cursor: new Uint32Array(nodeCount),
|
|
13
|
+
stack: new Uint32Array(nodeCount),
|
|
14
|
+
pre: new Uint32Array(nodeCount),
|
|
15
|
+
post: new Uint32Array(nodeCount),
|
|
16
|
+
preCount: 0,
|
|
17
|
+
postCount: 0,
|
|
18
|
+
backArc: false,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Iterative DFS from `root` with an explicit arc cursor per node, so the walk tries neighbours in
|
|
23
|
+
* row order (or `arcOrder`) exactly as a recursive DFS would and never overflows the call stack.
|
|
24
|
+
* @param g - The adjacency to walk
|
|
25
|
+
* @param root - An unvisited node index
|
|
26
|
+
* @param w - The shared walk state
|
|
27
|
+
* @param target - Stop the walk when this node is reached; INVALID_INDEX for none
|
|
28
|
+
* @param arcOrder - The order to try each row's arcs in; null for row order
|
|
29
|
+
*/
|
|
30
|
+
function walkFrom(g, root, w, target, arcOrder) {
|
|
31
|
+
const { rowPtr, colIdx } = g;
|
|
32
|
+
const { state, parent, depth, cursor, stack, pre, post } = w;
|
|
33
|
+
let top = 0;
|
|
34
|
+
state[root] = OPEN;
|
|
35
|
+
depth[root] = 0;
|
|
36
|
+
cursor[root] = rowPtr[root];
|
|
37
|
+
pre[w.preCount++] = root;
|
|
38
|
+
stack[top++] = root;
|
|
39
|
+
if (root === target) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
while (top > 0) {
|
|
43
|
+
const u = stack[top - 1];
|
|
44
|
+
if (cursor[u] < rowPtr[u + 1]) {
|
|
45
|
+
const a = cursor[u]++;
|
|
46
|
+
const v = colIdx[arcOrder === null ? a : arcOrder[a]];
|
|
47
|
+
if (state[v] === NEW) {
|
|
48
|
+
state[v] = OPEN;
|
|
49
|
+
parent[v] = u;
|
|
50
|
+
depth[v] = depth[u] + 1;
|
|
51
|
+
cursor[v] = rowPtr[v];
|
|
52
|
+
pre[w.preCount++] = v;
|
|
53
|
+
stack[top++] = v;
|
|
54
|
+
if (v === target) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (state[v] === OPEN) {
|
|
59
|
+
w.backArc = true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
state[u] = DONE;
|
|
64
|
+
post[w.postCount++] = u;
|
|
65
|
+
top--;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Depth-first search over out-neighbours, trying them in row (ascending index) order unless
|
|
71
|
+
* `options.arcOrder` gives another. Takes any
|
|
72
|
+
* `AdjacencyView`, so `s.reverse()` walks in-neighbours.
|
|
73
|
+
* @param g - The adjacency to traverse
|
|
74
|
+
* @param start - The node index to start from
|
|
75
|
+
* @param options - Traversal options
|
|
76
|
+
* @returns The visit order, the DFS tree as a parent array, the tree depths and the visited count
|
|
77
|
+
* @public
|
|
78
|
+
*/
|
|
79
|
+
export function depthFirstSearch(g, start, options = {}) {
|
|
80
|
+
checkStart(g, start);
|
|
81
|
+
const arcOrder = checkArcOrder(g, options.arcOrder);
|
|
82
|
+
const target = checkTarget(g, options.target);
|
|
83
|
+
const w = newWalk(g.nodeCount);
|
|
84
|
+
const postOrder = options.order === "post";
|
|
85
|
+
walkFrom(g, start, w, postOrder ? INVALID_INDEX : target, arcOrder);
|
|
86
|
+
const order = postOrder ? w.post.subarray(0, w.postCount) : w.pre.subarray(0, w.preCount);
|
|
87
|
+
return { order, parent: w.parent, depth: w.depth, visitedCount: w.preCount };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Whether the graph has a cycle. Directed: a DFS back arc. Undirected: an edge closing a loop in a
|
|
91
|
+
* union-find forest. A self-loop is a cycle; a parallel pair is not -- the graph is read as simple,
|
|
92
|
+
* the adjacent-skip idiom of graph-format design section 3.5.
|
|
93
|
+
* @param g - The adjacency to test
|
|
94
|
+
* @returns True when a cycle exists
|
|
95
|
+
* @public
|
|
96
|
+
*/
|
|
97
|
+
export function hasCycle(g) {
|
|
98
|
+
const { nodeCount, rowPtr, colIdx } = g;
|
|
99
|
+
if (g.directed) {
|
|
100
|
+
const w = newWalk(nodeCount);
|
|
101
|
+
for (let r = 0; r < nodeCount && !w.backArc; r++) {
|
|
102
|
+
if (w.state[r] === NEW) {
|
|
103
|
+
walkFrom(g, r, w, INVALID_INDEX, null);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return w.backArc;
|
|
107
|
+
}
|
|
108
|
+
const uf = new IntUnionFind(nodeCount);
|
|
109
|
+
for (let u = 0; u < nodeCount; u++) {
|
|
110
|
+
const end = rowPtr[u + 1];
|
|
111
|
+
for (let a = rowPtr[u]; a < end; a++) {
|
|
112
|
+
const v = colIdx[a];
|
|
113
|
+
if (v === u) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
// Each undirected edge once (v > u), each parallel pair once (rows are sorted).
|
|
117
|
+
if (v > u && (a === rowPtr[u] || colIdx[a - 1] !== v) && !uf.union(u, v)) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Topological order of a directed graph: reverse DFS post-order, roots taken in index order and
|
|
126
|
+
* neighbours in row order unless `options.arcOrder` gives another.
|
|
127
|
+
* @param g - A directed adjacency
|
|
128
|
+
* @param options - The neighbour order
|
|
129
|
+
* @returns The node indices in topological order, or null when the graph has a cycle
|
|
130
|
+
* @throws Error when the graph is undirected
|
|
131
|
+
* @public
|
|
132
|
+
*/
|
|
133
|
+
export function topologicalSort(g, options = {}) {
|
|
134
|
+
if (!g.directed) {
|
|
135
|
+
throw new Error("Topological sort requires a directed graph");
|
|
136
|
+
}
|
|
137
|
+
const arcOrder = checkArcOrder(g, options.arcOrder);
|
|
138
|
+
const w = newWalk(g.nodeCount);
|
|
139
|
+
for (let r = 0; r < g.nodeCount && !w.backArc; r++) {
|
|
140
|
+
if (w.state[r] === NEW) {
|
|
141
|
+
walkFrom(g, r, w, INVALID_INDEX, arcOrder);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return w.backArc ? null : w.post.reverse();
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=dfs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dfs.js","sourceRoot":"","sources":["../../../src/indexed/dfs.ts"],"names":[],"mappings":"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"}
|