@graphty/algorithms 1.2.0 → 1.3.1
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 +490 -336
- package/dist/algorithms.d.ts +42 -2
- package/dist/algorithms.js +11099 -2
- package/dist/algorithms.js.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.d.ts +4 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +124 -170
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.d.ts +26 -1
- package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +56 -149
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +3 -3
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +39 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js +286 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts +80 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js +294 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -0
- package/dist/src/algorithms/centrality/index.d.ts +2 -0
- package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/index.js +1 -0
- package/dist/src/algorithms/centrality/index.js.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.d.ts +17 -0
- package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.js +45 -0
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.js +47 -54
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
- package/dist/src/algorithms/community/index.d.ts +2 -0
- package/dist/src/algorithms/community/index.d.ts.map +1 -1
- package/dist/src/algorithms/community/index.js.map +1 -1
- package/dist/src/algorithms/community/label-propagation.d.ts +13 -3
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
- package/dist/src/algorithms/community/label-propagation.js +50 -35
- package/dist/src/algorithms/community/label-propagation.js.map +1 -1
- package/dist/src/algorithms/community/leiden.d.ts +3 -2
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
- package/dist/src/algorithms/community/leiden.js +34 -39
- package/dist/src/algorithms/community/leiden.js.map +1 -1
- package/dist/src/algorithms/community/louvain-optimized.d.ts +112 -0
- package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -0
- package/dist/src/algorithms/community/louvain-optimized.js +303 -0
- package/dist/src/algorithms/community/louvain-optimized.js.map +1 -0
- package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
- package/dist/src/algorithms/community/louvain.js +17 -76
- package/dist/src/algorithms/community/louvain.js.map +1 -1
- package/dist/src/algorithms/community/modularity-utils.d.ts +59 -0
- package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -0
- package/dist/src/algorithms/community/modularity-utils.js +112 -0
- package/dist/src/algorithms/community/modularity-utils.js.map +1 -0
- package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
- package/dist/src/algorithms/matching/bipartite.js +8 -40
- package/dist/src/algorithms/matching/bipartite.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 +1 -12
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +37 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +193 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -0
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts +5 -2
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +15 -14
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.d.ts +29 -0
- package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-unified.js +333 -0
- package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts +54 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.js +368 -0
- package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -0
- package/dist/src/algorithms/traversal/bfs.d.ts +4 -18
- package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +5 -182
- package/dist/src/algorithms/traversal/bfs.js.map +1 -1
- package/dist/src/benchmark-all-algorithms.d.ts +23 -0
- package/dist/src/benchmark-all-algorithms.d.ts.map +1 -0
- package/dist/src/benchmark-all-algorithms.js +462 -0
- package/dist/src/benchmark-all-algorithms.js.map +1 -0
- package/dist/src/clustering/hierarchical.d.ts +16 -15
- package/dist/src/clustering/hierarchical.d.ts.map +1 -1
- package/dist/src/clustering/hierarchical.js +209 -223
- package/dist/src/clustering/hierarchical.js.map +1 -1
- package/dist/src/clustering/index.d.ts +4 -2
- package/dist/src/clustering/index.d.ts.map +1 -1
- package/dist/src/clustering/index.js +2 -2
- package/dist/src/clustering/index.js.map +1 -1
- package/dist/src/clustering/k-core.d.ts +16 -15
- package/dist/src/clustering/k-core.d.ts.map +1 -1
- package/dist/src/clustering/k-core.js +57 -21
- package/dist/src/clustering/k-core.js.map +1 -1
- package/dist/src/clustering/spectral.d.ts +8 -0
- package/dist/src/clustering/spectral.d.ts.map +1 -1
- package/dist/src/clustering/spectral.js +40 -21
- package/dist/src/clustering/spectral.js.map +1 -1
- package/dist/src/core/graph.js +4 -4
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/flow/ford-fulkerson.d.ts +17 -11
- package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
- package/dist/src/flow/ford-fulkerson.js +141 -217
- package/dist/src/flow/ford-fulkerson.js.map +1 -1
- package/dist/src/flow/min-cut.d.ts +6 -5
- package/dist/src/flow/min-cut.d.ts.map +1 -1
- package/dist/src/flow/min-cut.js +17 -8
- package/dist/src/flow/min-cut.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
- package/dist/src/link-prediction/adamic-adar.js +17 -26
- package/dist/src/link-prediction/adamic-adar.js.map +1 -1
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
- package/dist/src/link-prediction/common-neighbors.js +7 -11
- package/dist/src/link-prediction/common-neighbors.js.map +1 -1
- package/dist/src/optimized/bit-packed.d.ts +143 -0
- package/dist/src/optimized/bit-packed.d.ts.map +1 -0
- package/dist/src/optimized/bit-packed.js +292 -0
- package/dist/src/optimized/bit-packed.js.map +1 -0
- package/dist/src/optimized/csr-graph.d.ts +86 -0
- package/dist/src/optimized/csr-graph.d.ts.map +1 -0
- package/dist/src/optimized/csr-graph.js +341 -0
- package/dist/src/optimized/csr-graph.js.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts +74 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.js +223 -0
- package/dist/src/optimized/direction-optimized-bfs.js.map +1 -0
- package/dist/src/optimized/graph-adapter.d.ts +62 -0
- package/dist/src/optimized/graph-adapter.d.ts.map +1 -0
- package/dist/src/optimized/graph-adapter.js +146 -0
- package/dist/src/optimized/graph-adapter.js.map +1 -0
- package/dist/src/optimized/index.d.ts +14 -0
- package/dist/src/optimized/index.d.ts.map +1 -0
- package/dist/src/optimized/index.js +28 -0
- package/dist/src/optimized/index.js.map +1 -0
- package/dist/src/research/grsbm.d.ts.map +1 -1
- package/dist/src/research/grsbm.js +6 -14
- package/dist/src/research/grsbm.js.map +1 -1
- package/dist/src/research/sync.d.ts.map +1 -1
- package/dist/src/research/sync.js +3 -29
- package/dist/src/research/sync.js.map +1 -1
- package/dist/src/research/terahac.d.ts +2 -0
- package/dist/src/research/terahac.d.ts.map +1 -1
- package/dist/src/research/terahac.js +7 -3
- package/dist/src/research/terahac.js.map +1 -1
- package/dist/src/types/index.d.ts +8 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/algorithm-utilities.d.ts +2 -0
- package/dist/src/utils/algorithm-utilities.d.ts.map +1 -0
- package/dist/src/utils/algorithm-utilities.js +2 -0
- package/dist/src/utils/algorithm-utilities.js.map +1 -0
- package/dist/src/utils/graph-converters.d.ts +79 -0
- package/dist/src/utils/graph-converters.d.ts.map +1 -0
- package/dist/src/utils/graph-converters.js +196 -0
- package/dist/src/utils/graph-converters.js.map +1 -0
- package/dist/src/utils/graph-utilities.d.ts +62 -0
- package/dist/src/utils/graph-utilities.d.ts.map +1 -0
- package/dist/src/utils/graph-utilities.js +148 -0
- package/dist/src/utils/graph-utilities.js.map +1 -0
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +5 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/math-utilities.d.ts +52 -0
- package/dist/src/utils/math-utilities.d.ts.map +1 -0
- package/dist/src/utils/math-utilities.js +123 -0
- package/dist/src/utils/math-utilities.js.map +1 -0
- package/dist/src/utils/matrix-utilities.d.ts +2 -0
- package/dist/src/utils/matrix-utilities.d.ts.map +1 -0
- package/dist/src/utils/matrix-utilities.js +2 -0
- package/dist/src/utils/matrix-utilities.js.map +1 -0
- package/dist/src/utils/optimization-helpers.d.ts +33 -0
- package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
- package/dist/src/utils/optimization-helpers.js +47 -0
- package/dist/src/utils/optimization-helpers.js.map +1 -0
- package/package.json +18 -3
- package/src/algorithms/centrality/betweenness.ts +167 -199
- package/src/algorithms/centrality/closeness.ts +73 -191
- package/src/algorithms/centrality/degree.ts +3 -3
- package/src/algorithms/centrality/delta-pagerank-simple.ts +366 -0
- package/src/algorithms/centrality/delta-pagerank.ts +435 -0
- package/src/algorithms/centrality/index.ts +2 -0
- package/src/algorithms/centrality/pagerank.ts +66 -0
- package/src/algorithms/community/girvan-newman.ts +52 -59
- package/src/algorithms/community/index.ts +2 -0
- package/src/algorithms/community/label-propagation.ts +64 -35
- package/src/algorithms/community/leiden.ts +40 -41
- package/src/algorithms/community/louvain-optimized.ts +445 -0
- package/src/algorithms/community/louvain.ts +24 -104
- package/src/algorithms/community/modularity-utils.ts +146 -0
- package/src/algorithms/matching/bipartite.ts +8 -44
- package/src/algorithms/shortest-path/bellman-ford.ts +1 -14
- package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
- package/src/algorithms/shortest-path/dijkstra.ts +17 -15
- package/src/algorithms/traversal/bfs-unified.ts +433 -0
- package/src/algorithms/traversal/bfs-variants.ts +496 -0
- package/src/algorithms/traversal/bfs.ts +10 -228
- package/src/benchmark-all-algorithms.ts +548 -0
- package/src/clustering/hierarchical.ts +241 -251
- package/src/clustering/index.ts +4 -2
- package/src/clustering/k-core.ts +87 -39
- package/src/clustering/spectral.ts +44 -20
- package/src/core/graph.ts +4 -4
- package/src/flow/ford-fulkerson.ts +186 -254
- package/src/flow/min-cut.ts +21 -11
- package/src/index.ts +6 -0
- package/src/link-prediction/adamic-adar.ts +17 -30
- package/src/link-prediction/common-neighbors.ts +7 -16
- package/src/optimized/bit-packed.ts +340 -0
- package/src/optimized/csr-graph.ts +455 -0
- package/src/optimized/direction-optimized-bfs.ts +291 -0
- package/src/optimized/graph-adapter.ts +200 -0
- package/src/optimized/index.ts +36 -0
- package/src/research/grsbm.ts +7 -16
- package/src/research/sync.ts +3 -32
- package/src/research/terahac.ts +10 -2
- package/src/types/index.ts +8 -0
- package/src/utils/algorithm-utilities.ts +2 -0
- package/src/utils/graph-converters.ts +241 -0
- package/src/utils/graph-utilities.ts +199 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/math-utilities.ts +140 -0
- package/src/utils/matrix-utilities.ts +2 -0
- package/src/utils/optimization-helpers.ts +81 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { louvainOptimized } from "./louvain-optimized.js";
|
|
2
|
+
import { calculateModularity, getNeighborCommunities, getNodeDegree, getTotalEdgeWeight, } from "./modularity-utils.js";
|
|
1
3
|
/**
|
|
2
4
|
* Louvain community detection algorithm
|
|
3
5
|
*
|
|
@@ -17,6 +19,21 @@ export function louvain(graph, options = {}) {
|
|
|
17
19
|
const resolution = options.resolution ?? 1.0;
|
|
18
20
|
const maxIterations = options.maxIterations ?? 100;
|
|
19
21
|
const tolerance = options.tolerance ?? 1e-6;
|
|
22
|
+
// Use optimized version by default for larger graphs
|
|
23
|
+
// Only disable if explicitly requested or graph is very small
|
|
24
|
+
const shouldUseOptimized = options.useOptimized !== false && graph.nodeCount > 50;
|
|
25
|
+
if (shouldUseOptimized) {
|
|
26
|
+
return louvainOptimized(graph, {
|
|
27
|
+
resolution,
|
|
28
|
+
maxIterations,
|
|
29
|
+
tolerance,
|
|
30
|
+
// Enable all optimizations by default
|
|
31
|
+
pruneLeaves: true,
|
|
32
|
+
importanceOrdering: true,
|
|
33
|
+
thresholdCycling: true,
|
|
34
|
+
pruningThreshold: 0.01,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
20
37
|
// Initialize: each node in its own community
|
|
21
38
|
const communities = initializeCommunities(graph);
|
|
22
39
|
let modularity = calculateModularity(graph, communities, resolution);
|
|
@@ -124,61 +141,6 @@ function nodeModularityContribution(graph, nodeId, community, communities, resol
|
|
|
124
141
|
const modularityIncrease = (internalLinks - ((resolution * nodeDegree * communityDegree) / (2 * totalEdgeWeight))) / totalEdgeWeight;
|
|
125
142
|
return modularityIncrease;
|
|
126
143
|
}
|
|
127
|
-
/**
|
|
128
|
-
* Get communities of neighboring nodes
|
|
129
|
-
*/
|
|
130
|
-
function getNeighborCommunities(graph, nodeId, communities) {
|
|
131
|
-
const neighborCommunities = new Set();
|
|
132
|
-
for (const neighbor of graph.neighbors(nodeId)) {
|
|
133
|
-
const community = communities.get(neighbor);
|
|
134
|
-
if (community !== undefined) {
|
|
135
|
-
neighborCommunities.add(community);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return neighborCommunities;
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Calculate total modularity of the current community assignment
|
|
142
|
-
*/
|
|
143
|
-
function calculateModularity(graph, communities, resolution) {
|
|
144
|
-
const totalEdgeWeight = getTotalEdgeWeight(graph);
|
|
145
|
-
if (totalEdgeWeight === 0) {
|
|
146
|
-
return 0;
|
|
147
|
-
}
|
|
148
|
-
let modularity = 0;
|
|
149
|
-
// For undirected graphs, we need to be careful not to double-count edges
|
|
150
|
-
const countedEdges = new Set();
|
|
151
|
-
// Calculate modularity: Q = (1/2m) * Σ[A_ij - γ(k_i * k_j)/(2m)] * δ(c_i, c_j)
|
|
152
|
-
for (const nodeI of graph.nodes()) {
|
|
153
|
-
for (const nodeJ of graph.nodes()) {
|
|
154
|
-
// Skip if already counted this pair in undirected graph
|
|
155
|
-
if (!graph.isDirected) {
|
|
156
|
-
const nodeIStr = String(nodeI.id);
|
|
157
|
-
const nodeJStr = String(nodeJ.id);
|
|
158
|
-
const edgeKey = nodeIStr <= nodeJStr ? `${nodeIStr}-${nodeJStr}` : `${nodeJStr}-${nodeIStr}`;
|
|
159
|
-
if (countedEdges.has(edgeKey)) {
|
|
160
|
-
continue;
|
|
161
|
-
}
|
|
162
|
-
countedEdges.add(edgeKey);
|
|
163
|
-
}
|
|
164
|
-
if (communities.get(nodeI.id) === communities.get(nodeJ.id)) {
|
|
165
|
-
const edge = graph.getEdge(nodeI.id, nodeJ.id);
|
|
166
|
-
const reverseEdge = !graph.isDirected ? graph.getEdge(nodeJ.id, nodeI.id) : null;
|
|
167
|
-
let edgeWeight = 0;
|
|
168
|
-
if (edge) {
|
|
169
|
-
edgeWeight += edge.weight ?? 1;
|
|
170
|
-
}
|
|
171
|
-
if (reverseEdge && nodeI.id !== nodeJ.id) {
|
|
172
|
-
edgeWeight += reverseEdge.weight ?? 1;
|
|
173
|
-
}
|
|
174
|
-
const degreeI = getNodeDegree(graph, nodeI.id);
|
|
175
|
-
const degreeJ = getNodeDegree(graph, nodeJ.id);
|
|
176
|
-
modularity += edgeWeight - ((resolution * degreeI * degreeJ) / (2 * totalEdgeWeight));
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return modularity / (2 * totalEdgeWeight);
|
|
181
|
-
}
|
|
182
144
|
/**
|
|
183
145
|
* Extract final community structure
|
|
184
146
|
*/
|
|
@@ -195,25 +157,4 @@ function extractCommunities(communities) {
|
|
|
195
157
|
}
|
|
196
158
|
return Array.from(communityMap.values());
|
|
197
159
|
}
|
|
198
|
-
/**
|
|
199
|
-
* Calculate total edge weight in the graph
|
|
200
|
-
*/
|
|
201
|
-
function getTotalEdgeWeight(graph) {
|
|
202
|
-
let totalWeight = 0;
|
|
203
|
-
for (const edge of graph.edges()) {
|
|
204
|
-
totalWeight += edge.weight ?? 1;
|
|
205
|
-
}
|
|
206
|
-
return totalWeight;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Get the total degree (sum of edge weights) for a node
|
|
210
|
-
*/
|
|
211
|
-
function getNodeDegree(graph, nodeId) {
|
|
212
|
-
let degree = 0;
|
|
213
|
-
for (const neighbor of graph.neighbors(nodeId)) {
|
|
214
|
-
const edge = graph.getEdge(nodeId, neighbor);
|
|
215
|
-
degree += edge?.weight ?? 1;
|
|
216
|
-
}
|
|
217
|
-
return degree;
|
|
218
|
-
}
|
|
219
160
|
//# sourceMappingURL=louvain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"louvain.js","sourceRoot":"","sources":["../../../../src/algorithms/community/louvain.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"louvain.js","sourceRoot":"","sources":["../../../../src/algorithms/community/louvain.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACH,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,kBAAkB,GACrB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,OAAO,CACnB,KAAY,EACZ,UAA0B,EAAE;IAE5B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;IAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,GAAG,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAE5C,qDAAqD;IACrD,8DAA8D;IAC9D,MAAM,kBAAkB,GAAG,OAAO,CAAC,YAAY,KAAK,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;IAElF,IAAI,kBAAkB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC,KAAK,EAAE;YAC3B,UAAU;YACV,aAAa;YACb,SAAS;YACT,sCAAsC;YACtC,WAAW,EAAE,IAAI;YACjB,kBAAkB,EAAE,IAAI;YACxB,gBAAgB,EAAE,IAAI;YACtB,gBAAgB,EAAE,IAAI;SACzB,CAAC,CAAC;IACP,CAAC;IAED,6CAA6C;IAC7C,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,UAAU,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACrE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,OAAO,SAAS,GAAG,aAAa,IAAI,QAAQ,EAAE,CAAC;QAC3C,8BAA8B;QAC9B,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAEzD,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAE1E,wBAAwB;YACxB,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC;gBAC3C,MAAM;YACV,CAAC;YAED,UAAU,GAAG,aAAa,CAAC;YAC3B,SAAS,EAAE,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO;QACH,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC;QAC5C,UAAU,EAAE,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;QAC/D,UAAU,EAAE,SAAS;KACxB,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,KAAY;IACvC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAC/B,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,WAAW,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAClB,KAAY,EACZ,WAAgC,EAChC,UAAkB;IAElB,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,gBAAgB,GAAG,IAAI,CAAC;IAE5B,OAAO,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,KAAK,CAAC;QAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEjD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACjC,SAAS;YACb,CAAC;YAED,4CAA4C;YAC5C,MAAM,iBAAiB,GAAG,0BAA0B,CAChD,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,CAC3D,CAAC;YAEF,IAAI,aAAa,GAAG,gBAAgB,CAAC;YACrC,IAAI,cAAc,GAAG,iBAAiB,CAAC;YAEvC,wCAAwC;YACxC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YAE/E,KAAK,MAAM,iBAAiB,IAAI,mBAAmB,EAAE,CAAC;gBAClD,IAAI,iBAAiB,KAAK,gBAAgB,EAAE,CAAC;oBACzC,SAAS;gBACb,CAAC;gBAED,MAAM,aAAa,GAAG,0BAA0B,CAC5C,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAC5D,CAAC;gBAEF,IAAI,aAAa,GAAG,cAAc,EAAE,CAAC;oBACjC,cAAc,GAAG,aAAa,CAAC;oBAC/B,aAAa,GAAG,iBAAiB,CAAC;gBACtC,CAAC;YACL,CAAC;YAED,iCAAiC;YACjC,IAAI,aAAa,KAAK,gBAAgB,EAAE,CAAC;gBACrC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBACvC,gBAAgB,GAAG,IAAI,CAAC;gBACxB,iBAAiB,GAAG,IAAI,CAAC;YAC7B,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,0BAA0B,CAC/B,KAAY,EACZ,MAAc,EACd,SAAiB,EACjB,WAAgC,EAChC,UAAkB;IAElB,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC;IACb,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,gDAAgD;IAChD,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;QACjC,UAAU,IAAI,MAAM,CAAC;QAErB,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1C,aAAa,IAAI,MAAM,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,uFAAuF;IACvF,KAAK,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,WAAW,EAAE,CAAC;QACtD,IAAI,cAAc,KAAK,SAAS,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YACzD,eAAe,IAAI,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,MAAM,kBAAkB,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,UAAU,GAAG,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;IAErI,OAAO,kBAAkB,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,WAAgC;IACxD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEjD,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,cAAc,EAAE,CAAC;YACjB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared modularity calculation utilities for community detection algorithms
|
|
3
|
+
*
|
|
4
|
+
* Used by: Louvain, Leiden, Girvan-Newman
|
|
5
|
+
*/
|
|
6
|
+
import type { Graph } from "../../core/graph.js";
|
|
7
|
+
import type { NodeId } from "../../types/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Calculate total edge weight in the graph
|
|
10
|
+
*
|
|
11
|
+
* For undirected graphs, each edge is counted once.
|
|
12
|
+
* For directed graphs, each directed edge is counted once.
|
|
13
|
+
*
|
|
14
|
+
* @param graph - The input graph
|
|
15
|
+
* @returns Total sum of edge weights (default weight is 1)
|
|
16
|
+
*/
|
|
17
|
+
export declare function getTotalEdgeWeight(graph: Graph): number;
|
|
18
|
+
/**
|
|
19
|
+
* Get the total degree (sum of edge weights) for a node
|
|
20
|
+
*
|
|
21
|
+
* Computes the weighted degree by summing all edge weights incident to the node.
|
|
22
|
+
*
|
|
23
|
+
* @param graph - The input graph
|
|
24
|
+
* @param nodeId - The node ID to compute degree for
|
|
25
|
+
* @returns The weighted degree of the node
|
|
26
|
+
*/
|
|
27
|
+
export declare function getNodeDegree(graph: Graph, nodeId: NodeId): number;
|
|
28
|
+
/**
|
|
29
|
+
* Get communities of neighboring nodes
|
|
30
|
+
*
|
|
31
|
+
* Returns the set of community IDs that neighbors of the given node belong to.
|
|
32
|
+
*
|
|
33
|
+
* @param graph - The input graph
|
|
34
|
+
* @param nodeId - The node to get neighbor communities for
|
|
35
|
+
* @param communities - Map from node IDs to community IDs
|
|
36
|
+
* @returns Set of community IDs that neighbors belong to
|
|
37
|
+
*/
|
|
38
|
+
export declare function getNeighborCommunities(graph: Graph, nodeId: NodeId, communities: Map<NodeId, number>): Set<number>;
|
|
39
|
+
/**
|
|
40
|
+
* Calculate modularity of a partition
|
|
41
|
+
*
|
|
42
|
+
* Modularity measures the quality of a community partition. It compares the
|
|
43
|
+
* number of edges within communities to what would be expected in a random graph.
|
|
44
|
+
*
|
|
45
|
+
* Formula: Q = (1/2m) * Σ[A_ij - γ(k_i * k_j)/(2m)] * δ(c_i, c_j)
|
|
46
|
+
* where:
|
|
47
|
+
* - m = total edge weight
|
|
48
|
+
* - A_ij = adjacency matrix entry (edge weight between i and j)
|
|
49
|
+
* - k_i, k_j = degrees of nodes i and j
|
|
50
|
+
* - γ = resolution parameter (higher values favor smaller communities)
|
|
51
|
+
* - δ = Kronecker delta (1 if same community, 0 otherwise)
|
|
52
|
+
*
|
|
53
|
+
* @param graph - The input graph
|
|
54
|
+
* @param communities - Map from node IDs to community IDs
|
|
55
|
+
* @param resolution - Resolution parameter (default: 1.0)
|
|
56
|
+
* @returns Modularity score (range typically -0.5 to 1.0)
|
|
57
|
+
*/
|
|
58
|
+
export declare function calculateModularity(graph: Graph, communities: Map<NodeId, number>, resolution?: number): number;
|
|
59
|
+
//# sourceMappingURL=modularity-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modularity-utils.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/modularity-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAEjD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAQvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASlE;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAClC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,GAAG,CAAC,MAAM,CAAC,CAWb;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,UAAU,SAAM,GACjB,MAAM,CAgDR"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate total edge weight in the graph
|
|
3
|
+
*
|
|
4
|
+
* For undirected graphs, each edge is counted once.
|
|
5
|
+
* For directed graphs, each directed edge is counted once.
|
|
6
|
+
*
|
|
7
|
+
* @param graph - The input graph
|
|
8
|
+
* @returns Total sum of edge weights (default weight is 1)
|
|
9
|
+
*/
|
|
10
|
+
export function getTotalEdgeWeight(graph) {
|
|
11
|
+
let totalWeight = 0;
|
|
12
|
+
for (const edge of graph.edges()) {
|
|
13
|
+
totalWeight += edge.weight ?? 1;
|
|
14
|
+
}
|
|
15
|
+
return totalWeight;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the total degree (sum of edge weights) for a node
|
|
19
|
+
*
|
|
20
|
+
* Computes the weighted degree by summing all edge weights incident to the node.
|
|
21
|
+
*
|
|
22
|
+
* @param graph - The input graph
|
|
23
|
+
* @param nodeId - The node ID to compute degree for
|
|
24
|
+
* @returns The weighted degree of the node
|
|
25
|
+
*/
|
|
26
|
+
export function getNodeDegree(graph, nodeId) {
|
|
27
|
+
let degree = 0;
|
|
28
|
+
for (const neighbor of graph.neighbors(nodeId)) {
|
|
29
|
+
const edge = graph.getEdge(nodeId, neighbor);
|
|
30
|
+
degree += edge?.weight ?? 1;
|
|
31
|
+
}
|
|
32
|
+
return degree;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get communities of neighboring nodes
|
|
36
|
+
*
|
|
37
|
+
* Returns the set of community IDs that neighbors of the given node belong to.
|
|
38
|
+
*
|
|
39
|
+
* @param graph - The input graph
|
|
40
|
+
* @param nodeId - The node to get neighbor communities for
|
|
41
|
+
* @param communities - Map from node IDs to community IDs
|
|
42
|
+
* @returns Set of community IDs that neighbors belong to
|
|
43
|
+
*/
|
|
44
|
+
export function getNeighborCommunities(graph, nodeId, communities) {
|
|
45
|
+
const neighborCommunities = new Set();
|
|
46
|
+
for (const neighbor of graph.neighbors(nodeId)) {
|
|
47
|
+
const community = communities.get(neighbor);
|
|
48
|
+
if (community !== undefined) {
|
|
49
|
+
neighborCommunities.add(community);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return neighborCommunities;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Calculate modularity of a partition
|
|
56
|
+
*
|
|
57
|
+
* Modularity measures the quality of a community partition. It compares the
|
|
58
|
+
* number of edges within communities to what would be expected in a random graph.
|
|
59
|
+
*
|
|
60
|
+
* Formula: Q = (1/2m) * Σ[A_ij - γ(k_i * k_j)/(2m)] * δ(c_i, c_j)
|
|
61
|
+
* where:
|
|
62
|
+
* - m = total edge weight
|
|
63
|
+
* - A_ij = adjacency matrix entry (edge weight between i and j)
|
|
64
|
+
* - k_i, k_j = degrees of nodes i and j
|
|
65
|
+
* - γ = resolution parameter (higher values favor smaller communities)
|
|
66
|
+
* - δ = Kronecker delta (1 if same community, 0 otherwise)
|
|
67
|
+
*
|
|
68
|
+
* @param graph - The input graph
|
|
69
|
+
* @param communities - Map from node IDs to community IDs
|
|
70
|
+
* @param resolution - Resolution parameter (default: 1.0)
|
|
71
|
+
* @returns Modularity score (range typically -0.5 to 1.0)
|
|
72
|
+
*/
|
|
73
|
+
export function calculateModularity(graph, communities, resolution = 1.0) {
|
|
74
|
+
const totalEdgeWeight = getTotalEdgeWeight(graph);
|
|
75
|
+
if (totalEdgeWeight === 0) {
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
let modularity = 0;
|
|
79
|
+
// For undirected graphs, we need to be careful not to double-count edges
|
|
80
|
+
const countedEdges = new Set();
|
|
81
|
+
// Calculate modularity: Q = (1/2m) * Σ[A_ij - γ(k_i * k_j)/(2m)] * δ(c_i, c_j)
|
|
82
|
+
for (const nodeI of graph.nodes()) {
|
|
83
|
+
for (const nodeJ of graph.nodes()) {
|
|
84
|
+
// Skip if already counted this pair in undirected graph
|
|
85
|
+
if (!graph.isDirected) {
|
|
86
|
+
const nodeIStr = String(nodeI.id);
|
|
87
|
+
const nodeJStr = String(nodeJ.id);
|
|
88
|
+
const edgeKey = nodeIStr <= nodeJStr ? `${nodeIStr}-${nodeJStr}` : `${nodeJStr}-${nodeIStr}`;
|
|
89
|
+
if (countedEdges.has(edgeKey)) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
countedEdges.add(edgeKey);
|
|
93
|
+
}
|
|
94
|
+
if (communities.get(nodeI.id) === communities.get(nodeJ.id)) {
|
|
95
|
+
const edge = graph.getEdge(nodeI.id, nodeJ.id);
|
|
96
|
+
const reverseEdge = !graph.isDirected ? graph.getEdge(nodeJ.id, nodeI.id) : null;
|
|
97
|
+
let edgeWeight = 0;
|
|
98
|
+
if (edge) {
|
|
99
|
+
edgeWeight += edge.weight ?? 1;
|
|
100
|
+
}
|
|
101
|
+
if (reverseEdge && nodeI.id !== nodeJ.id) {
|
|
102
|
+
edgeWeight += reverseEdge.weight ?? 1;
|
|
103
|
+
}
|
|
104
|
+
const degreeI = getNodeDegree(graph, nodeI.id);
|
|
105
|
+
const degreeJ = getNodeDegree(graph, nodeJ.id);
|
|
106
|
+
modularity += edgeWeight - ((resolution * degreeI * degreeJ) / (2 * totalEdgeWeight));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return modularity / (2 * totalEdgeWeight);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=modularity-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modularity-utils.js","sourceRoot":"","sources":["../../../../src/algorithms/community/modularity-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bipartite.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/matching/bipartite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"bipartite.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/matching/bipartite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAGjD;;;;;;;;GAQG;AAEH,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACrC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACpC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,wBAA6B,GACvC,uBAAuB,CAsDzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG;IAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAC,GAAG,IAAI,CAW/F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,wBAA6B,GACvC,uBAAuB,CAgCzB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bfsColoringWithPartitions } from "../traversal/bfs-variants.js";
|
|
1
2
|
/**
|
|
2
3
|
* Find maximum matching in a bipartite graph using augmenting path algorithm
|
|
3
4
|
* (simplified implementation that's more reliable than Hopcroft-Karp for this context)
|
|
@@ -51,47 +52,14 @@ export function maximumBipartiteMatching(graph, options = {}) {
|
|
|
51
52
|
* Check if graph is bipartite and return the partition
|
|
52
53
|
*/
|
|
53
54
|
export function bipartitePartition(graph) {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const nodes = Array.from(graph.nodes());
|
|
58
|
-
for (const startNode of nodes) {
|
|
59
|
-
if (color.has(startNode.id)) {
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
// BFS to color the component
|
|
63
|
-
const queue = [startNode.id];
|
|
64
|
-
color.set(startNode.id, true);
|
|
65
|
-
left.add(startNode.id);
|
|
66
|
-
while (queue.length > 0) {
|
|
67
|
-
const u = queue.shift();
|
|
68
|
-
if (u === undefined) {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
const uColor = color.get(u);
|
|
72
|
-
if (uColor === undefined) {
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
const neighbors = Array.from(graph.neighbors(u));
|
|
76
|
-
for (const v of neighbors) {
|
|
77
|
-
if (!color.has(v)) {
|
|
78
|
-
color.set(v, !uColor);
|
|
79
|
-
if (!uColor) {
|
|
80
|
-
left.add(v);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
right.add(v);
|
|
84
|
-
}
|
|
85
|
-
queue.push(v);
|
|
86
|
-
}
|
|
87
|
-
else if (color.get(v) === uColor) {
|
|
88
|
-
// Same color as neighbor - not bipartite
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
55
|
+
const result = bfsColoringWithPartitions(graph);
|
|
56
|
+
if (!result.isBipartite || !result.partitions) {
|
|
57
|
+
return null;
|
|
93
58
|
}
|
|
94
|
-
return {
|
|
59
|
+
return {
|
|
60
|
+
left: result.partitions[0],
|
|
61
|
+
right: result.partitions[1],
|
|
62
|
+
};
|
|
95
63
|
}
|
|
96
64
|
/**
|
|
97
65
|
* Simple greedy bipartite matching algorithm
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bipartite.js","sourceRoot":"","sources":["../../../../src/algorithms/matching/bipartite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bipartite.js","sourceRoot":"","sources":["../../../../src/algorithms/matching/bipartite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bellman-ford.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/shortest-path/bellman-ford.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"bellman-ford.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/shortest-path/bellman-ford.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAGrE;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B;;OAEG;IACH,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B;;OAEG;IACH,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC;;OAEG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,WAAW,CACvB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GACjC,iBAAiB,CA6EnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACf,kBAAkB,GAAG,IAAI,CA6B3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CA4BtD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { reconstructPath } from "../../utils/graph-utilities.js";
|
|
1
2
|
/**
|
|
2
3
|
* Find shortest paths from source using Bellman-Ford algorithm
|
|
3
4
|
*/
|
|
@@ -116,16 +117,4 @@ export function hasNegativeCycle(graph) {
|
|
|
116
117
|
}
|
|
117
118
|
return false;
|
|
118
119
|
}
|
|
119
|
-
/**
|
|
120
|
-
* Reconstruct path from predecessor map
|
|
121
|
-
*/
|
|
122
|
-
function reconstructPath(target, predecessors) {
|
|
123
|
-
const path = [];
|
|
124
|
-
let current = target;
|
|
125
|
-
while (current !== null) {
|
|
126
|
-
path.unshift(current);
|
|
127
|
-
current = predecessors.get(current) ?? null;
|
|
128
|
-
}
|
|
129
|
-
return path;
|
|
130
|
-
}
|
|
131
120
|
//# sourceMappingURL=bellman-ford.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bellman-ford.js","sourceRoot":"","sources":["../../../../src/algorithms/shortest-path/bellman-ford.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bellman-ford.js","sourceRoot":"","sources":["../../../../src/algorithms/shortest-path/bellman-ford.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Graph } from "../../core/graph.js";
|
|
2
|
+
import type { NodeId, ShortestPathResult } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Bidirectional Dijkstra's algorithm implementation
|
|
5
|
+
*
|
|
6
|
+
* Performs simultaneous forward and backward searches to find shortest paths
|
|
7
|
+
* more efficiently than standard Dijkstra for point-to-point queries.
|
|
8
|
+
*
|
|
9
|
+
* Time Complexity: O(2 * sqrt(V + E) log V) expected for random graphs
|
|
10
|
+
* Space Complexity: O(V)
|
|
11
|
+
*
|
|
12
|
+
* Key optimizations:
|
|
13
|
+
* - Alternating expansion based on frontier size
|
|
14
|
+
* - Early termination when searches meet
|
|
15
|
+
* - Efficient meeting point detection
|
|
16
|
+
*/
|
|
17
|
+
export declare class BidirectionalDijkstra {
|
|
18
|
+
private graph;
|
|
19
|
+
private forwardSearch;
|
|
20
|
+
private backwardSearch;
|
|
21
|
+
private meetingNode;
|
|
22
|
+
private shortestDistance;
|
|
23
|
+
constructor(graph: Graph);
|
|
24
|
+
private initSearchState;
|
|
25
|
+
/**
|
|
26
|
+
* Find shortest path between source and target nodes
|
|
27
|
+
*/
|
|
28
|
+
findShortestPath(source: NodeId, target: NodeId): ShortestPathResult | null;
|
|
29
|
+
private expandSearch;
|
|
30
|
+
private getMinDistance;
|
|
31
|
+
private reconstructPath;
|
|
32
|
+
/**
|
|
33
|
+
* Reset the search state for reuse
|
|
34
|
+
*/
|
|
35
|
+
reset(): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=bidirectional-dijkstra.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bidirectional-dijkstra.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/shortest-path/bidirectional-dijkstra.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAE/C,OAAO,KAAK,EAAC,MAAM,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AASrE;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,gBAAgB,CAAY;gBAExB,KAAK,EAAE,KAAK;IAMxB,OAAO,CAAC,eAAe;IASvB;;KAEC;IACM,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAuElF,OAAO,CAAC,YAAY;IAmEpB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,eAAe;IAqCvB;;KAEC;IACM,KAAK,IAAI,IAAI;CAMvB"}
|