Skip to content

Commit 6fa00c7

Browse files
committed
faster erdos_renyi
1 parent a10ca67 commit 6fa00c7

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

src/SimpleGraphs/generators/randgraphs.jl

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Random: randperm, shuffle!
1+
using Random: randperm, shuffle!, randsubseq
22
using Statistics: mean
33
using Graphs: sample!
44

@@ -126,6 +126,23 @@ function randbn(
126126
return x
127127
end
128128

129+
"maps 1:binomial(n,2) into an upper triangle of [1,n]×[1,n]"
130+
function trianglemap(r)
131+
j = floor(Int, (1+sqrt(8r-7))/2) + 1
132+
i = r - binomial(j-1,2)
133+
Edge(i, j)
134+
end
135+
136+
"maps 1:n*(n-1) into non-diagonal elements of [1,n]×[1,n]"
137+
function nondiagmap(r,n)
138+
j = div(r-1, n-1)
139+
i = r - j*(n-1)
140+
j += 1
141+
i += (i >= j)
142+
Edge(i, j)
143+
end
144+
145+
129146
"""
130147
erdos_renyi(n, p)
131148
@@ -149,7 +166,7 @@ julia> erdos_renyi(10, 0.5)
149166
julia> using Graphs
150167
151168
julia> erdos_renyi(10, 0.5, is_directed=true, seed=123)
152-
{10, 49} directed simple Int64 graph
169+
{10, 41} directed simple Int64 graph
153170
```
154171
"""
155172
function erdos_renyi(
@@ -160,13 +177,16 @@ function erdos_renyi(
160177
seed::Union{Nothing,Integer}=nothing,
161178
)
162179
p >= 1 && return is_directed ? complete_digraph(n) : complete_graph(n)
163-
m = is_directed ? n * (n - 1) : div(n * (n - 1), 2)
164-
ne = randbn(m, p; rng=rng, seed=seed)
165-
return if is_directed
166-
SimpleDiGraph(n, ne; rng=rng, seed=seed)
180+
m = is_directed ? n * (n - 1) : binomial(n, 2)
181+
seq = randsubseq(rng_from_rng_or_seed(rng, seed), 1:m, p)
182+
g = if is_directed
183+
SimpleDiGraphFromIterator(nondiagmap(r,n) for r in seq)
167184
else
168-
SimpleGraph(n, ne; rng=rng, seed=seed)
185+
SimpleGraphFromIterator(trianglemap(r) for r in seq)
169186
end
187+
# complete to exactly n vertices
188+
add_vertices!(g, n - nv(g))
189+
return g
170190
end
171191

172192
"""

0 commit comments

Comments
 (0)