@graphty/algorithms 2.1.2 → 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 @@
|
|
|
1
|
+
{"version":3,"file":"markov.js","sourceRoot":"","sources":["../../../src/indexed/markov.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type GraphSnapshot, type NodeMask, type U32 } from "@graphty/graph-format";
|
|
2
|
+
/** Options of {@link maximumBipartiteMatching} and {@link greedyBipartiteMatching}. @public */
|
|
3
|
+
export interface BipartiteMatchingOptions {
|
|
4
|
+
/**
|
|
5
|
+
* The left side. Given together with `right`, the two sides are used as they are and the graph
|
|
6
|
+
* is not tested for bipartiteness; a node on neither side is never matched. When either is
|
|
7
|
+
* missing both come from `isBipartite`: its first side is the left one.
|
|
8
|
+
*/
|
|
9
|
+
readonly left?: NodeMask | undefined;
|
|
10
|
+
/** The right side; see `left`. */
|
|
11
|
+
readonly right?: NodeMask | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Which arcs of a directed snapshot join a left node to a right one. "both" (default) ignores
|
|
14
|
+
* direction, as a matching does. "out" follows out-arcs of left nodes only, as the legacy
|
|
15
|
+
* functions do, and is also passed to `isBipartite` when the sides are inferred. Ignored on an
|
|
16
|
+
* undirected snapshot.
|
|
17
|
+
*/
|
|
18
|
+
readonly arcs?: "both" | "out" | undefined;
|
|
19
|
+
}
|
|
20
|
+
/** Result of the index-based bipartite matchings. @public */
|
|
21
|
+
export interface BipartiteMatchingResult {
|
|
22
|
+
/**
|
|
23
|
+
* The right partner of every matched left node; INVALID_INDEX for an unmatched left node and
|
|
24
|
+
* for every node that is not on the left side.
|
|
25
|
+
*/
|
|
26
|
+
readonly matching: U32;
|
|
27
|
+
/** The number of matched pairs. */
|
|
28
|
+
readonly size: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Maximum matching of a bipartite graph by augmenting paths (Kuhn's algorithm, O(V E)): every left
|
|
32
|
+
* node in index order searches depth-first, iteratively, for an augmenting path. Parallel arcs and
|
|
33
|
+
* arc direction (by default) make no difference to the matching size.
|
|
34
|
+
* @param s - The snapshot
|
|
35
|
+
* @param options - The two sides, and which arcs to follow on a directed snapshot
|
|
36
|
+
* @returns The partner of every matched left node and the number of pairs
|
|
37
|
+
* @throws Error when the sides are inferred and the graph is not bipartite
|
|
38
|
+
* @public
|
|
39
|
+
*/
|
|
40
|
+
export declare function maximumBipartiteMatching(s: GraphSnapshot, options?: BipartiteMatchingOptions): BipartiteMatchingResult;
|
|
41
|
+
/**
|
|
42
|
+
* Greedy maximal bipartite matching: every left node in index order takes its first unmatched
|
|
43
|
+
* right neighbour in row order (the lowest index; out-arcs before in-arcs). The size depends on
|
|
44
|
+
* those orders, so it can differ from the legacy function, which visits left nodes in its
|
|
45
|
+
* colouring BFS order and neighbours in insertion order; it is at least half the maximum.
|
|
46
|
+
* @param s - The snapshot
|
|
47
|
+
* @param options - The two sides, and which arcs to follow on a directed snapshot
|
|
48
|
+
* @returns The partner of every matched left node and the number of pairs
|
|
49
|
+
* @throws Error when the sides are inferred and the graph is not bipartite
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
52
|
+
export declare function greedyBipartiteMatching(s: GraphSnapshot, options?: BipartiteMatchingOptions): BipartiteMatchingResult;
|
|
53
|
+
//# sourceMappingURL=matching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../../src/indexed/matching.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,aAAa,EAIlB,KAAK,QAAQ,EACb,KAAK,GAAG,EACX,MAAM,uBAAuB,CAAC;AAI/B,+FAA+F;AAC/F,MAAM,WAAW,wBAAwB;IACrC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC,kCAAkC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;CAC9C;AAED,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACpC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;IACvB,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AA6BD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACpC,CAAC,EAAE,aAAa,EAChB,OAAO,GAAE,wBAA6B,GACvC,uBAAuB,CAqEzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACnC,CAAC,EAAE,aAAa,EAChB,OAAO,GAAE,wBAA6B,GACvC,uBAAuB,CAwBzB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { INVALID_INDEX, makeMask, maskTest, } from "@graphty/graph-format";
|
|
2
|
+
import { isBipartite } from "./bipartite.js";
|
|
3
|
+
function resolveSides(s, options) {
|
|
4
|
+
const views = s.directed && options.arcs !== "out" ? [s, s.reverse()] : [s];
|
|
5
|
+
if (options.left !== undefined && options.right !== undefined) {
|
|
6
|
+
return { left: options.left, right: options.right, views };
|
|
7
|
+
}
|
|
8
|
+
const { sides } = isBipartite(s, { arcs: options.arcs });
|
|
9
|
+
if (sides === null) {
|
|
10
|
+
throw new Error("Graph is not bipartite");
|
|
11
|
+
}
|
|
12
|
+
const left = makeMask(s.nodeCount);
|
|
13
|
+
for (let w = 0; w < left.length; w++) {
|
|
14
|
+
left[w] = ~sides[w];
|
|
15
|
+
}
|
|
16
|
+
// Clear the padding bits past nodeCount so the mask stays well formed.
|
|
17
|
+
const tail = s.nodeCount % 32;
|
|
18
|
+
if (tail !== 0) {
|
|
19
|
+
left[left.length - 1] &= (1 << tail) - 1;
|
|
20
|
+
}
|
|
21
|
+
return { left, right: sides, views };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Maximum matching of a bipartite graph by augmenting paths (Kuhn's algorithm, O(V E)): every left
|
|
25
|
+
* node in index order searches depth-first, iteratively, for an augmenting path. Parallel arcs and
|
|
26
|
+
* arc direction (by default) make no difference to the matching size.
|
|
27
|
+
* @param s - The snapshot
|
|
28
|
+
* @param options - The two sides, and which arcs to follow on a directed snapshot
|
|
29
|
+
* @returns The partner of every matched left node and the number of pairs
|
|
30
|
+
* @throws Error when the sides are inferred and the graph is not bipartite
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export function maximumBipartiteMatching(s, options = {}) {
|
|
34
|
+
// ponytail: Kuhn is O(V E) like the legacy function; Hopcroft-Karp (O(sqrt(V) E)) if a caller
|
|
35
|
+
// needs large graphs with long augmenting paths.
|
|
36
|
+
const { left, right, views } = resolveSides(s, options);
|
|
37
|
+
const { nodeCount } = s;
|
|
38
|
+
const matching = new Uint32Array(nodeCount).fill(INVALID_INDEX);
|
|
39
|
+
const mateOfRight = new Uint32Array(nodeCount).fill(INVALID_INDEX);
|
|
40
|
+
const seen = new Uint32Array(nodeCount);
|
|
41
|
+
// The DFS stack of left nodes; view and arc cursors per stacked node; the right node taken to
|
|
42
|
+
// descend from each stacked node.
|
|
43
|
+
const stack = new Uint32Array(nodeCount);
|
|
44
|
+
const viewAt = new Uint8Array(nodeCount);
|
|
45
|
+
const arcAt = new Uint32Array(nodeCount);
|
|
46
|
+
const via = new Uint32Array(nodeCount);
|
|
47
|
+
let size = 0;
|
|
48
|
+
for (let root = 0; root < nodeCount; root++) {
|
|
49
|
+
if (!maskTest(left, root)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const stamp = root + 1;
|
|
53
|
+
let top = 0;
|
|
54
|
+
stack[top++] = root;
|
|
55
|
+
viewAt[root] = 0;
|
|
56
|
+
arcAt[root] = 0;
|
|
57
|
+
let free = INVALID_INDEX;
|
|
58
|
+
search: while (top > 0) {
|
|
59
|
+
const x = stack[top - 1];
|
|
60
|
+
for (; viewAt[x] < views.length; viewAt[x]++) {
|
|
61
|
+
const { rowPtr, colIdx } = views[viewAt[x]];
|
|
62
|
+
const end = rowPtr[x + 1];
|
|
63
|
+
// A cursor of 0 means "not started in this view".
|
|
64
|
+
if (arcAt[x] < rowPtr[x]) {
|
|
65
|
+
arcAt[x] = rowPtr[x];
|
|
66
|
+
}
|
|
67
|
+
while (arcAt[x] < end) {
|
|
68
|
+
const v = colIdx[arcAt[x]++];
|
|
69
|
+
if (seen[v] === stamp || !maskTest(right, v)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
seen[v] = stamp;
|
|
73
|
+
const next = mateOfRight[v];
|
|
74
|
+
if (next === INVALID_INDEX) {
|
|
75
|
+
free = v;
|
|
76
|
+
break search;
|
|
77
|
+
}
|
|
78
|
+
via[x] = v;
|
|
79
|
+
stack[top++] = next;
|
|
80
|
+
viewAt[next] = 0;
|
|
81
|
+
arcAt[next] = 0;
|
|
82
|
+
continue search;
|
|
83
|
+
}
|
|
84
|
+
arcAt[x] = 0;
|
|
85
|
+
}
|
|
86
|
+
top--;
|
|
87
|
+
}
|
|
88
|
+
if (free === INVALID_INDEX) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Flip the path: the top node takes the free right node, every node below takes the right
|
|
92
|
+
// node it descended through.
|
|
93
|
+
for (let k = top - 1; k >= 0; k--) {
|
|
94
|
+
const x = stack[k];
|
|
95
|
+
const v = k === top - 1 ? free : via[x];
|
|
96
|
+
matching[x] = v;
|
|
97
|
+
mateOfRight[v] = x;
|
|
98
|
+
}
|
|
99
|
+
size++;
|
|
100
|
+
}
|
|
101
|
+
return { matching, size };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Greedy maximal bipartite matching: every left node in index order takes its first unmatched
|
|
105
|
+
* right neighbour in row order (the lowest index; out-arcs before in-arcs). The size depends on
|
|
106
|
+
* those orders, so it can differ from the legacy function, which visits left nodes in its
|
|
107
|
+
* colouring BFS order and neighbours in insertion order; it is at least half the maximum.
|
|
108
|
+
* @param s - The snapshot
|
|
109
|
+
* @param options - The two sides, and which arcs to follow on a directed snapshot
|
|
110
|
+
* @returns The partner of every matched left node and the number of pairs
|
|
111
|
+
* @throws Error when the sides are inferred and the graph is not bipartite
|
|
112
|
+
* @public
|
|
113
|
+
*/
|
|
114
|
+
export function greedyBipartiteMatching(s, options = {}) {
|
|
115
|
+
const { left, right, views } = resolveSides(s, options);
|
|
116
|
+
const { nodeCount } = s;
|
|
117
|
+
const matching = new Uint32Array(nodeCount).fill(INVALID_INDEX);
|
|
118
|
+
const taken = new Uint8Array(nodeCount);
|
|
119
|
+
let size = 0;
|
|
120
|
+
for (let u = 0; u < nodeCount; u++) {
|
|
121
|
+
if (!maskTest(left, u)) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
pick: for (const { rowPtr, colIdx } of views) {
|
|
125
|
+
const end = rowPtr[u + 1];
|
|
126
|
+
for (let a = rowPtr[u]; a < end; a++) {
|
|
127
|
+
const v = colIdx[a];
|
|
128
|
+
if (taken[v] === 0 && maskTest(right, v)) {
|
|
129
|
+
taken[v] = 1;
|
|
130
|
+
matching[u] = v;
|
|
131
|
+
size++;
|
|
132
|
+
break pick;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return { matching, size };
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=matching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matching.js","sourceRoot":"","sources":["../../../src/indexed/matching.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,aAAa,EACb,QAAQ,EACR,QAAQ,GAGX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAsC7C,SAAS,YAAY,CAAC,CAAgB,EAAE,OAAiC;IACrE,MAAM,KAAK,GAAoB,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,uEAAuE;IACvE,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;IAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACpC,CAAgB,EAChB,UAAoC,EAAE;IAEtC,8FAA8F;IAC9F,iDAAiD;IACjD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,8FAA8F;IAC9F,kCAAkC;IAClC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;QACvB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,GAAG,aAAa,CAAC;QACzB,MAAM,EAAE,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACzB,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1B,kDAAkD;gBAClD,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvB,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC;gBACD,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;oBACpB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC7B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;wBAC3C,SAAS;oBACb,CAAC;oBACD,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;oBAChB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;oBAC5B,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;wBACzB,IAAI,GAAG,CAAC,CAAC;wBACT,MAAM,MAAM,CAAC;oBACjB,CAAC;oBACD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACX,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAChB,SAAS,MAAM,CAAC;gBACpB,CAAC;gBACD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;YACD,GAAG,EAAE,CAAC;QACV,CAAC;QACD,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YACzB,SAAS;QACb,CAAC;QACD,0FAA0F;QAC1F,6BAA6B;QAC7B,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChB,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,EAAE,CAAC;IACX,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CACnC,CAAgB,EAChB,UAAoC,EAAE;IAEtC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACrB,SAAS;QACb,CAAC;QACD,IAAI,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;oBACvC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACb,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAChB,IAAI,EAAE,CAAC;oBACP,MAAM,IAAI,CAAC;gBACf,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type GraphSnapshot, type NumericVector } from "@graphty/graph-format";
|
|
2
|
+
import { type MinCutResult } from "./flow.js";
|
|
3
|
+
/** Options of {@link stoerWagner}. @public */
|
|
4
|
+
export interface StoerWagnerOptions {
|
|
5
|
+
/** Per-arc weight override, arcCount long; without it the snapshot's weights (1 when unweighted). */
|
|
6
|
+
readonly weights?: NumericVector | undefined;
|
|
7
|
+
}
|
|
8
|
+
/** Options of {@link kargerMinCut}. @public */
|
|
9
|
+
export interface KargerOptions {
|
|
10
|
+
/** Independent contraction trials; the lightest cut found wins. Default 100. */
|
|
11
|
+
readonly iterations?: number | undefined;
|
|
12
|
+
/** Seed of the edge orders; one seed gives one result, bit for bit. Default 42. */
|
|
13
|
+
readonly randomSeed?: number | undefined;
|
|
14
|
+
/** Per-arc weight override, arcCount long; without it the snapshot's weights (1 when unweighted). */
|
|
15
|
+
readonly weights?: NumericVector | undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Global minimum cut by Stoer-Wagner, reading every edge as undirected (a directed snapshot's arcs
|
|
19
|
+
* count in both directions, so two opposite arcs between one pair add up).
|
|
20
|
+
*
|
|
21
|
+
* No graph is contracted (graph-format design 14.2): a representative array and member lists
|
|
22
|
+
* merge the last two nodes of each phase, and each phase's maximum-adjacency order accumulates the
|
|
23
|
+
* weights of the ORIGINAL arcs of the merged members in an {@link IndexedMaxHeap}. A phase starts
|
|
24
|
+
* from the lowest-index remaining representative and takes equal keys lowest index first, and the
|
|
25
|
+
* first phase with the lightest cut wins, which is the order the legacy implementation uses.
|
|
26
|
+
* O(n (m + n) log n).
|
|
27
|
+
* @param s - The snapshot
|
|
28
|
+
* @param options - The weight override
|
|
29
|
+
* @returns The cut value, the side holding the last node of the winning phase, and the cut edges;
|
|
30
|
+
* with fewer than two nodes the value is 0 and every node is on `side`
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export declare function stoerWagner(s: GraphSnapshot, options?: StoerWagnerOptions): MinCutResult;
|
|
34
|
+
/**
|
|
35
|
+
* Global minimum cut by Karger's randomised contraction, reading every edge as undirected. Each
|
|
36
|
+
* trial unions the endpoints of the edges in a seeded random order (an {@link IntUnionFind}, no
|
|
37
|
+
* graph is contracted) until two groups remain, so every edge is equally likely to be contracted
|
|
38
|
+
* next whatever its weight; the trial's cut is the weight of the edges between the two groups.
|
|
39
|
+
* A graph with more than two components gives a cut of 0 with node 0's component on `side`.
|
|
40
|
+
* O(m alpha(n)) per trial.
|
|
41
|
+
* @param s - The snapshot
|
|
42
|
+
* @param options - Trials, seed and weight override
|
|
43
|
+
* @returns The lightest cut found; with fewer than two nodes the value is 0 and `side` is empty
|
|
44
|
+
* @throws RangeError when `randomSeed` is not an integer or `iterations` is not a positive integer
|
|
45
|
+
* @public
|
|
46
|
+
*/
|
|
47
|
+
export declare function kargerMinCut(s: GraphSnapshot, options?: KargerOptions): MinCutResult;
|
|
48
|
+
//# sourceMappingURL=min-cut.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"min-cut.d.ts","sourceRoot":"","sources":["../../../src/indexed/min-cut.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,aAAa,EAKlB,KAAK,aAAa,EACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAK7E,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IAC/B,qGAAqG;IACrG,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC1B,gFAAgF;IAChF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,mFAAmF;IACnF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,qGAAqG;IACrG,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,kBAAuB,GAAG,YAAY,CAuF5F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CAoDxF"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { INVALID_INDEX, makeMask, maskSet, } from "@graphty/graph-format";
|
|
2
|
+
import { crossingEdges, edgeCapacities } from "./flow.js";
|
|
3
|
+
import { mulberry32 } from "./label-propagation.js";
|
|
4
|
+
import { IndexedMaxHeap } from "./structures/max-heap.js";
|
|
5
|
+
import { IntUnionFind } from "./structures/union-find.js";
|
|
6
|
+
/**
|
|
7
|
+
* Global minimum cut by Stoer-Wagner, reading every edge as undirected (a directed snapshot's arcs
|
|
8
|
+
* count in both directions, so two opposite arcs between one pair add up).
|
|
9
|
+
*
|
|
10
|
+
* No graph is contracted (graph-format design 14.2): a representative array and member lists
|
|
11
|
+
* merge the last two nodes of each phase, and each phase's maximum-adjacency order accumulates the
|
|
12
|
+
* weights of the ORIGINAL arcs of the merged members in an {@link IndexedMaxHeap}. A phase starts
|
|
13
|
+
* from the lowest-index remaining representative and takes equal keys lowest index first, and the
|
|
14
|
+
* first phase with the lightest cut wins, which is the order the legacy implementation uses.
|
|
15
|
+
* O(n (m + n) log n).
|
|
16
|
+
* @param s - The snapshot
|
|
17
|
+
* @param options - The weight override
|
|
18
|
+
* @returns The cut value, the side holding the last node of the winning phase, and the cut edges;
|
|
19
|
+
* with fewer than two nodes the value is 0 and every node is on `side`
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export function stoerWagner(s, options = {}) {
|
|
23
|
+
const n = s.nodeCount;
|
|
24
|
+
const capacity = edgeCapacities(s, options.weights);
|
|
25
|
+
if (n < 2) {
|
|
26
|
+
return { cutValue: 0, side: makeMask(n, true), cutEdges: new Uint32Array(0) };
|
|
27
|
+
}
|
|
28
|
+
// Incident (neighbour, edge) pairs per node, both directions of every edge.
|
|
29
|
+
const { src, dst } = s.edgeList();
|
|
30
|
+
const offset = new Uint32Array(n + 1);
|
|
31
|
+
for (let e = 0; e < s.edgeCount; e++) {
|
|
32
|
+
offset[src[e] + 1]++;
|
|
33
|
+
offset[dst[e] + 1]++;
|
|
34
|
+
}
|
|
35
|
+
for (let i = 0; i < n; i++) {
|
|
36
|
+
offset[i + 1] += offset[i];
|
|
37
|
+
}
|
|
38
|
+
const fill = offset.slice(0, n);
|
|
39
|
+
const neighbour = new Uint32Array(offset[n]);
|
|
40
|
+
const weight = new Float64Array(offset[n]);
|
|
41
|
+
for (let e = 0; e < s.edgeCount; e++) {
|
|
42
|
+
neighbour[fill[src[e]]] = dst[e];
|
|
43
|
+
weight[fill[src[e]]++] = capacity[e];
|
|
44
|
+
neighbour[fill[dst[e]]] = src[e];
|
|
45
|
+
weight[fill[dst[e]]++] = capacity[e];
|
|
46
|
+
}
|
|
47
|
+
const rep = new Uint32Array(n);
|
|
48
|
+
const next = new Uint32Array(n).fill(INVALID_INDEX); // member lists, one per representative
|
|
49
|
+
const tail = new Uint32Array(n);
|
|
50
|
+
for (let i = 0; i < n; i++) {
|
|
51
|
+
rep[i] = i;
|
|
52
|
+
tail[i] = i;
|
|
53
|
+
}
|
|
54
|
+
const connection = new Float64Array(n);
|
|
55
|
+
const added = new Uint8Array(n);
|
|
56
|
+
const heap = new IndexedMaxHeap(n);
|
|
57
|
+
let best = Infinity;
|
|
58
|
+
let bestSide = makeMask(n);
|
|
59
|
+
for (let active = n; active > 1; active--) {
|
|
60
|
+
let start = INVALID_INDEX;
|
|
61
|
+
for (let i = 0; i < n; i++) {
|
|
62
|
+
if (rep[i] !== i) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
added[i] = 0;
|
|
66
|
+
connection[i] = 0;
|
|
67
|
+
if (start === INVALID_INDEX) {
|
|
68
|
+
start = i;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
heap.push(i, 0);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
let prev = INVALID_INDEX;
|
|
75
|
+
let last = start;
|
|
76
|
+
for (;;) {
|
|
77
|
+
added[last] = 1;
|
|
78
|
+
for (let m = last; m !== INVALID_INDEX; m = next[m]) {
|
|
79
|
+
for (let k = offset[m]; k < offset[m + 1]; k++) {
|
|
80
|
+
const x = rep[neighbour[k]];
|
|
81
|
+
if (added[x] === 0) {
|
|
82
|
+
connection[x] += weight[k];
|
|
83
|
+
heap.pushOrIncrease(x, connection[x]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (heap.isEmpty()) {
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
prev = last;
|
|
91
|
+
last = heap.pop();
|
|
92
|
+
}
|
|
93
|
+
if (connection[last] < best) {
|
|
94
|
+
best = connection[last];
|
|
95
|
+
bestSide = makeMask(n);
|
|
96
|
+
for (let m = last; m !== INVALID_INDEX; m = next[m]) {
|
|
97
|
+
maskSet(bestSide, m, true);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Merge the last node of the phase into the one before it.
|
|
101
|
+
for (let m = last; m !== INVALID_INDEX; m = next[m]) {
|
|
102
|
+
rep[m] = prev;
|
|
103
|
+
}
|
|
104
|
+
next[tail[prev]] = last;
|
|
105
|
+
tail[prev] = tail[last];
|
|
106
|
+
}
|
|
107
|
+
return { cutValue: best, side: bestSide, cutEdges: crossingEdges(s, bestSide, false, capacity, false) };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Global minimum cut by Karger's randomised contraction, reading every edge as undirected. Each
|
|
111
|
+
* trial unions the endpoints of the edges in a seeded random order (an {@link IntUnionFind}, no
|
|
112
|
+
* graph is contracted) until two groups remain, so every edge is equally likely to be contracted
|
|
113
|
+
* next whatever its weight; the trial's cut is the weight of the edges between the two groups.
|
|
114
|
+
* A graph with more than two components gives a cut of 0 with node 0's component on `side`.
|
|
115
|
+
* O(m alpha(n)) per trial.
|
|
116
|
+
* @param s - The snapshot
|
|
117
|
+
* @param options - Trials, seed and weight override
|
|
118
|
+
* @returns The lightest cut found; with fewer than two nodes the value is 0 and `side` is empty
|
|
119
|
+
* @throws RangeError when `randomSeed` is not an integer or `iterations` is not a positive integer
|
|
120
|
+
* @public
|
|
121
|
+
*/
|
|
122
|
+
export function kargerMinCut(s, options = {}) {
|
|
123
|
+
const iterations = options.iterations ?? 100;
|
|
124
|
+
const randomSeed = options.randomSeed ?? 42;
|
|
125
|
+
if (!Number.isInteger(iterations) || iterations < 1) {
|
|
126
|
+
throw new RangeError(`iterations must be a positive integer, got ${iterations}`);
|
|
127
|
+
}
|
|
128
|
+
if (!Number.isInteger(randomSeed)) {
|
|
129
|
+
throw new RangeError(`randomSeed must be a finite integer, got ${randomSeed}`);
|
|
130
|
+
}
|
|
131
|
+
const n = s.nodeCount;
|
|
132
|
+
const capacity = edgeCapacities(s, options.weights);
|
|
133
|
+
if (n < 2) {
|
|
134
|
+
return { cutValue: 0, side: makeMask(n), cutEdges: new Uint32Array(0) };
|
|
135
|
+
}
|
|
136
|
+
const { src, dst } = s.edgeList();
|
|
137
|
+
const rand = mulberry32(randomSeed);
|
|
138
|
+
const order = new Uint32Array(s.edgeCount);
|
|
139
|
+
let best = Infinity;
|
|
140
|
+
let bestSide = makeMask(n);
|
|
141
|
+
for (let trial = 0; trial < iterations; trial++) {
|
|
142
|
+
for (let e = 0; e < order.length; e++) {
|
|
143
|
+
order[e] = e;
|
|
144
|
+
}
|
|
145
|
+
for (let i = order.length - 1; i > 0; i--) {
|
|
146
|
+
const j = Math.floor(rand() * (i + 1));
|
|
147
|
+
const t = order[i];
|
|
148
|
+
order[i] = order[j];
|
|
149
|
+
order[j] = t;
|
|
150
|
+
}
|
|
151
|
+
const uf = new IntUnionFind(n);
|
|
152
|
+
let groups = n;
|
|
153
|
+
for (let i = 0; i < order.length && groups > 2; i++) {
|
|
154
|
+
if (uf.union(src[order[i]], dst[order[i]])) {
|
|
155
|
+
groups--;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const root = uf.find(0);
|
|
159
|
+
let cut = 0;
|
|
160
|
+
for (let e = 0; e < s.edgeCount; e++) {
|
|
161
|
+
if ((uf.find(src[e]) === root) !== (uf.find(dst[e]) === root)) {
|
|
162
|
+
cut += capacity[e];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (cut < best) {
|
|
166
|
+
best = cut;
|
|
167
|
+
bestSide = makeMask(n);
|
|
168
|
+
for (let v = 0; v < n; v++) {
|
|
169
|
+
maskSet(bestSide, v, uf.find(v) === root);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return { cutValue: best, side: bestSide, cutEdges: crossingEdges(s, bestSide, false, capacity, false) };
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=min-cut.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"min-cut.js","sourceRoot":"","sources":["../../../src/indexed/min-cut.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type AdjacencyView, type NumericVector, type U32 } from "@graphty/graph-format";
|
|
2
|
+
/** Options of the index-based modularity. @public */
|
|
3
|
+
export interface ModularityOptions {
|
|
4
|
+
/** Resolution gamma: above 1 favours smaller communities; default 1. */
|
|
5
|
+
readonly resolution?: number | undefined;
|
|
6
|
+
/** Per-arc weight override, arcCount long -- the facade passes `expandEdges(s, shadow.data)`. */
|
|
7
|
+
readonly weights?: NumericVector | undefined;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Newman's modularity of a partition: `sum_c in_c / 2m - gamma * (tot_c / 2m)^2`, where `2m` is
|
|
11
|
+
* twice the total edge weight, `in_c` counts every edge inside community c twice and `tot_c` sums
|
|
12
|
+
* its nodes' weighted degrees. Degrees follow graph-format's `weightedDegree()` convention -- a
|
|
13
|
+
* self-loop counts twice -- so `sum(tot_c) === 2m`. On a directed snapshot the direction is
|
|
14
|
+
* ignored: every arc counts as an undirected edge, and a node's degree is its in-weight plus its
|
|
15
|
+
* out-weight.
|
|
16
|
+
*
|
|
17
|
+
* On an undirected snapshot without self-loops this equals the legacy `calculateModularity`. On
|
|
18
|
+
* a directed snapshot or one with self-loops the two differ, and this one is the NetworkX value:
|
|
19
|
+
* the legacy degree counts a self-loop once and reads only out-neighbours on a directed graph, so
|
|
20
|
+
* its degrees do not sum to 2m.
|
|
21
|
+
*
|
|
22
|
+
* It is NOT the legacy `calculateMCLModularity`, in two ways. That function subtracts the null-model
|
|
23
|
+
* term `d(u) d(v) / 2m` once per edge whatever the partition: on two separate triangles it scores
|
|
24
|
+
* one community and the two triangles both 1/3, where this returns 0 and 1/2. And it ignores edge
|
|
25
|
+
* weights, where this reads the snapshot's weights by default; pass `weights` filled with 1 for
|
|
26
|
+
* the unweighted value.
|
|
27
|
+
* @param s - Any snapshot or adjacency view
|
|
28
|
+
* @param labels - Community of every node; `INVALID_INDEX` leaves a node out of every community
|
|
29
|
+
* @param options - Resolution and the weight override
|
|
30
|
+
* @returns The modularity, 0 when the snapshot has no edge weight
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export declare function modularity(s: AdjacencyView, labels: U32, options?: ModularityOptions): number;
|
|
34
|
+
//# sourceMappingURL=modularity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modularity.d.ts","sourceRoot":"","sources":["../../../src/indexed/modularity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAExG,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,iGAAiG;IACjG,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA8CjG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { INVALID_INDEX } from "@graphty/graph-format";
|
|
2
|
+
/**
|
|
3
|
+
* Newman's modularity of a partition: `sum_c in_c / 2m - gamma * (tot_c / 2m)^2`, where `2m` is
|
|
4
|
+
* twice the total edge weight, `in_c` counts every edge inside community c twice and `tot_c` sums
|
|
5
|
+
* its nodes' weighted degrees. Degrees follow graph-format's `weightedDegree()` convention -- a
|
|
6
|
+
* self-loop counts twice -- so `sum(tot_c) === 2m`. On a directed snapshot the direction is
|
|
7
|
+
* ignored: every arc counts as an undirected edge, and a node's degree is its in-weight plus its
|
|
8
|
+
* out-weight.
|
|
9
|
+
*
|
|
10
|
+
* On an undirected snapshot without self-loops this equals the legacy `calculateModularity`. On
|
|
11
|
+
* a directed snapshot or one with self-loops the two differ, and this one is the NetworkX value:
|
|
12
|
+
* the legacy degree counts a self-loop once and reads only out-neighbours on a directed graph, so
|
|
13
|
+
* its degrees do not sum to 2m.
|
|
14
|
+
*
|
|
15
|
+
* It is NOT the legacy `calculateMCLModularity`, in two ways. That function subtracts the null-model
|
|
16
|
+
* term `d(u) d(v) / 2m` once per edge whatever the partition: on two separate triangles it scores
|
|
17
|
+
* one community and the two triangles both 1/3, where this returns 0 and 1/2. And it ignores edge
|
|
18
|
+
* weights, where this reads the snapshot's weights by default; pass `weights` filled with 1 for
|
|
19
|
+
* the unweighted value.
|
|
20
|
+
* @param s - Any snapshot or adjacency view
|
|
21
|
+
* @param labels - Community of every node; `INVALID_INDEX` leaves a node out of every community
|
|
22
|
+
* @param options - Resolution and the weight override
|
|
23
|
+
* @returns The modularity, 0 when the snapshot has no edge weight
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export function modularity(s, labels, options = {}) {
|
|
27
|
+
const resolution = options.resolution ?? 1;
|
|
28
|
+
const weights = options.weights ?? s.weights;
|
|
29
|
+
if (labels.length !== s.nodeCount) {
|
|
30
|
+
throw new RangeError(`labels has ${labels.length} entries; the snapshot has ${s.nodeCount} nodes`);
|
|
31
|
+
}
|
|
32
|
+
if (weights !== null && weights.length !== s.arcCount) {
|
|
33
|
+
throw new RangeError(`weights has ${weights.length} entries; the snapshot has ${s.arcCount} arcs`);
|
|
34
|
+
}
|
|
35
|
+
const tot = new Map();
|
|
36
|
+
const inside = new Map();
|
|
37
|
+
const addTo = (map, label, w) => {
|
|
38
|
+
if (label !== INVALID_INDEX) {
|
|
39
|
+
map.set(label, (map.get(label) ?? 0) + w);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
let m2 = 0;
|
|
43
|
+
for (let u = 0; u < s.nodeCount; u++) {
|
|
44
|
+
const end = s.rowPtr[u + 1];
|
|
45
|
+
for (let a = s.rowPtr[u]; a < end; a++) {
|
|
46
|
+
const v = s.colIdx[a];
|
|
47
|
+
const w = weights === null ? 1 : weights[a];
|
|
48
|
+
// An undirected edge between two nodes is read from both rows; a self-loop and a
|
|
49
|
+
// directed arc only once, so they count double here.
|
|
50
|
+
const twice = s.directed || v === u ? 2 * w : w;
|
|
51
|
+
m2 += twice;
|
|
52
|
+
if (s.directed) {
|
|
53
|
+
addTo(tot, labels[u], w);
|
|
54
|
+
addTo(tot, labels[v], w);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
addTo(tot, labels[u], twice);
|
|
58
|
+
}
|
|
59
|
+
if (labels[u] === labels[v]) {
|
|
60
|
+
addTo(inside, labels[u], twice);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (m2 === 0) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
let q = 0;
|
|
68
|
+
for (const [label, degrees] of tot) {
|
|
69
|
+
const share = degrees / m2;
|
|
70
|
+
q += (inside.get(label) ?? 0) / m2 - resolution * share * share;
|
|
71
|
+
}
|
|
72
|
+
return q;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=modularity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modularity.js","sourceRoot":"","sources":["../../../src/indexed/modularity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type GraphSnapshot, type NumericVector, type U32 } from "@graphty/graph-format";
|
|
2
2
|
/** Options of the index-based MST. @public */
|
|
3
3
|
export interface MstOptions {
|
|
4
4
|
/** Per-arc weight override, arcCount long; gathered back to per-edge through `edgeToArc`. */
|
|
@@ -23,4 +23,32 @@ export interface MstResult {
|
|
|
23
23
|
* @public
|
|
24
24
|
*/
|
|
25
25
|
export declare function kruskalMST(s: GraphSnapshot, o?: MstOptions): MstResult;
|
|
26
|
+
/** Options of the index-based Prim. @public */
|
|
27
|
+
export interface PrimOptions extends MstOptions {
|
|
28
|
+
/** The node index the (first) tree grows from; default 0. */
|
|
29
|
+
readonly start?: number | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Grow a tree in every component, rooted at `start` and then at each component's lowest node
|
|
32
|
+
* index, instead of throwing on a disconnected graph. Default false, as legacy `primMST`.
|
|
33
|
+
*/
|
|
34
|
+
readonly forest?: boolean | undefined;
|
|
35
|
+
}
|
|
36
|
+
/** Result of the index-based Prim: the MST result plus each node's discovery arc. @public */
|
|
37
|
+
export interface PrimResult extends MstResult {
|
|
38
|
+
/** The tree arc that reached each node, pointing at it; INVALID_INDEX for every root. */
|
|
39
|
+
readonly predArc: U32;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Prim's minimum spanning tree, grown from a start node by always taking the cheapest arc from the
|
|
43
|
+
* tree to a node outside it (an indexed heap keyed per node, so of several parallel edges the
|
|
44
|
+
* cheapest, and of equal ones the lowest-indexed, is the one taken). `edges` lists the logical
|
|
45
|
+
* edges in the order they joined the tree and `totalWeight` sums them in that order, as legacy
|
|
46
|
+
* `primMST` does. The start index is checked: one outside the graph throws a RangeError.
|
|
47
|
+
* @param s - An undirected snapshot
|
|
48
|
+
* @param o - Per-arc weight override, start node and the spanning-forest switch
|
|
49
|
+
* @returns The accepted edges, their total weight and the discovery arc per node
|
|
50
|
+
* @throws Error on a directed snapshot, and on a disconnected one unless `forest` is set
|
|
51
|
+
* @public
|
|
52
|
+
*/
|
|
53
|
+
export declare function primMST(s: GraphSnapshot, o?: PrimOptions): PrimResult;
|
|
26
54
|
//# sourceMappingURL=mst.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mst.d.ts","sourceRoot":"","sources":["../../../src/indexed/mst.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mst.d.ts","sourceRoot":"","sources":["../../../src/indexed/mst.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAKxG,8CAA8C;AAC9C,MAAM,WAAW,UAAU;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED,kGAAkG;AAClG,MAAM,WAAW,SAAS;IACtB,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACpB,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAE,UAAe,GAAG,SAAS,CAgC1E;AAED,+CAA+C;AAC/C,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC3C,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACzC;AAED,6FAA6F;AAC7F,MAAM,WAAW,UAAW,SAAQ,SAAS;IACzC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAE,WAAgB,GAAG,UAAU,CA8CzE"}
|