Skip to content

Commit 48c42c7

Browse files
AntoineButgdalle
andauthored
Faster dorogovtsev mendes (#371)
* Optimized dorogovtsev_mendes implementation * format * Fixed index * Added a Test * Update src/SimpleGraphs/generators/randgraphs.jl As suggested Co-authored-by: Guillaume Dalle <[email protected]> * Update src/SimpleGraphs/generators/randgraphs.jl --------- Co-authored-by: Guillaume Dalle <[email protected]>
1 parent afb8245 commit 48c42c7

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

src/SimpleGraphs/generators/randgraphs.jl

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,24 +1494,28 @@ function dorogovtsev_mendes(
14941494
n < 3 && throw(DomainError("n=$n must be at least 3"))
14951495
rng = rng_from_rng_or_seed(rng, seed)
14961496
g = cycle_graph(3)
1497+
bag_of_edges = Vector{SimpleEdge{Int}}(undef, 2 * n - 3) # Caching edges as they are added to avoid costly lookups
14971498

1498-
for iteration in 1:(n - 3)
1499-
chosenedge = rand(rng, 1:(2 * ne(g))) # undirected so each edge is listed twice in adjlist
1500-
u, v = -1, -1
1501-
for i in 1:nv(g)
1502-
edgelist = outneighbors(g, i)
1503-
if chosenedge > length(edgelist)
1504-
chosenedge -= length(edgelist)
1505-
else
1506-
u = i
1507-
v = edgelist[chosenedge]
1508-
break
1509-
end
1510-
end
1499+
bag_of_edges[1] = SimpleEdge(1, 2)
1500+
bag_of_edges[2] = SimpleEdge(1, 3)
1501+
bag_of_edges[3] = SimpleEdge(2, 3)
1502+
index = 3
15111503

1504+
for _ in 1:(n - 3)
1505+
# Choose random edge from bag
1506+
edge = bag_of_edges[rand(rng, 1:index)]
1507+
u, v = src(edge), dst(edge)
1508+
1509+
# Add new vertex
15121510
add_vertex!(g)
1511+
# Add new edges
15131512
add_edge!(g, nv(g), u)
15141513
add_edge!(g, nv(g), v)
1514+
1515+
# Add new edges to bag
1516+
bag_of_edges[index + 1] = SimpleEdge(nv(g), edge.src)
1517+
bag_of_edges[index + 2] = SimpleEdge(nv(g), edge.dst)
1518+
index += 2
15151519
end
15161520
return g
15171521
end

test/simplegraphs/generators/randgraphs.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,19 @@
382382
@test δ(g) == 2
383383
g = dorogovtsev_mendes(3; rng=rng)
384384
@test nv(g) == 3 && ne(g) == 3
385+
@test δ(g) == 2 && Δ(g) == 2
386+
387+
# Testing that n=4 graph is one on the possible graphs
388+
g = dorogovtsev_mendes(4; rng=rng)
389+
@test has_edge(g, 1, 2) &&
390+
has_edge(g, 1, 3) &&
391+
has_edge(g, 2, 3) &&
392+
(
393+
has_edge(g, 1, 4) && has_edge(g, 2, 4) ||
394+
has_edge(g, 2, 4) && has_edge(g, 3, 4) ||
395+
has_edge(g, 1, 4) && has_edge(g, 3, 4)
396+
)
397+
385398
# testing domain errors
386399
@test_throws DomainError dorogovtsev_mendes(2, rng=rng)
387400
@test_throws DomainError dorogovtsev_mendes(-1, rng=rng)

0 commit comments

Comments
 (0)