Skip to content

Commit 1cace9f

Browse files
committed
faster erdos_renyi
1 parent 1a7594a commit 1cace9f

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

Diff for: src/SimpleGraphs/generators/randgraphs.jl

+27-7
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

@@ -122,6 +122,23 @@ function randbn(
122122
return x
123123
end
124124

125+
"maps 1:binomial(n,2) into an upper triangle of [1,n]×[1,n]"
126+
function trianglemap(r)
127+
j = floor(Int, (1+sqrt(8r-7))/2) + 1
128+
i = r - binomial(j-1,2)
129+
Edge(i, j)
130+
end
131+
132+
"maps 1:n*(n-1) into non-diagonal elements of [1,n]×[1,n]"
133+
function nondiagmap(r,n)
134+
j = div(r-1, n-1)
135+
i = r - j*(n-1)
136+
j += 1
137+
i += (i >= j)
138+
Edge(i, j)
139+
end
140+
141+
125142
"""
126143
erdos_renyi(n, p)
127144
@@ -140,7 +157,7 @@ julia> erdos_renyi(10, 0.5)
140157
{10, 20} undirected simple Int64 graph
141158
142159
julia> erdos_renyi(10, 0.5, is_directed=true, seed=123)
143-
{10, 49} directed simple Int64 graph
160+
{10, 41} directed simple Int64 graph
144161
```
145162
"""
146163
function erdos_renyi(
@@ -151,13 +168,16 @@ function erdos_renyi(
151168
seed::Union{Nothing,Integer}=nothing,
152169
)
153170
p >= 1 && return is_directed ? complete_digraph(n) : complete_graph(n)
154-
m = is_directed ? n * (n - 1) : div(n * (n - 1), 2)
155-
ne = randbn(m, p; rng=rng, seed=seed)
156-
return if is_directed
157-
SimpleDiGraph(n, ne; rng=rng, seed=seed)
171+
m = is_directed ? n * (n - 1) : binomial(n, 2)
172+
seq = randsubseq(rng_from_rng_or_seed(rng, seed), 1:m, p)
173+
g = if is_directed
174+
SimpleDiGraphFromIterator(nondiagmap(r,n) for r in seq)
158175
else
159-
SimpleGraph(n, ne; rng=rng, seed=seed)
176+
SimpleGraphFromIterator(trianglemap(r) for r in seq)
160177
end
178+
# complete to exactly n vertices
179+
add_vertices!(g, n - nv(g))
180+
return g
161181
end
162182

163183
"""

0 commit comments

Comments
 (0)