From 8658e94ff747a27daf7ea0f80c982e5a659a3bd5 Mon Sep 17 00:00:00 2001 From: Alfredo Braunstein Date: Sat, 7 Jan 2023 15:36:54 +0100 Subject: [PATCH 1/4] faster erdos_renyi --- src/SimpleGraphs/generators/randgraphs.jl | 34 ++++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/SimpleGraphs/generators/randgraphs.jl b/src/SimpleGraphs/generators/randgraphs.jl index 9e879e032..fc5e32c53 100644 --- a/src/SimpleGraphs/generators/randgraphs.jl +++ b/src/SimpleGraphs/generators/randgraphs.jl @@ -1,4 +1,4 @@ -using Random: randperm, shuffle! +using Random: randperm, shuffle!, randsubseq using Statistics: mean using Graphs: sample! @@ -126,6 +126,23 @@ function randbn( return x end +"maps 1:binomial(n,2) into an upper triangle of [1,n]×[1,n]" +function trianglemap(r) + j = floor(Int, (1+sqrt(8r-7))/2) + 1 + i = r - binomial(j-1,2) + Edge(i, j) +end + +"maps 1:n*(n-1) into non-diagonal elements of [1,n]×[1,n]" +function nondiagmap(r,n) + j = div(r-1, n-1) + i = r - j*(n-1) + j += 1 + i += (i >= j) + Edge(i, j) +end + + """ erdos_renyi(n, p) @@ -149,7 +166,7 @@ julia> erdos_renyi(10, 0.5) julia> using Graphs julia> erdos_renyi(10, 0.5, is_directed=true, seed=123) -{10, 49} directed simple Int64 graph +{10, 41} directed simple Int64 graph ``` """ function erdos_renyi( @@ -160,13 +177,16 @@ function erdos_renyi( seed::Union{Nothing,Integer}=nothing, ) p >= 1 && return is_directed ? complete_digraph(n) : complete_graph(n) - m = is_directed ? n * (n - 1) : div(n * (n - 1), 2) - ne = randbn(m, p; rng=rng, seed=seed) - return if is_directed - SimpleDiGraph(n, ne; rng=rng, seed=seed) + m = is_directed ? n * (n - 1) : binomial(n, 2) + seq = randsubseq(rng_from_rng_or_seed(rng, seed), 1:m, p) + g = if is_directed + SimpleDiGraphFromIterator(nondiagmap(r,n) for r in seq) else - SimpleGraph(n, ne; rng=rng, seed=seed) + SimpleGraphFromIterator(trianglemap(r) for r in seq) end + # complete to exactly n vertices + add_vertices!(g, n - nv(g)) + return g end """ From 566d86c57aa2543985950c48bb26fffa9ddb53bc Mon Sep 17 00:00:00 2001 From: Alfredo Braunstein Date: Sun, 14 May 2023 11:06:28 +0200 Subject: [PATCH 2/4] faster trianglemap, idea by Federico Florio, Gabriele Gatti and Ricardo Garcia --- src/SimpleGraphs/generators/randgraphs.jl | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/SimpleGraphs/generators/randgraphs.jl b/src/SimpleGraphs/generators/randgraphs.jl index fc5e32c53..869d02071 100644 --- a/src/SimpleGraphs/generators/randgraphs.jl +++ b/src/SimpleGraphs/generators/randgraphs.jl @@ -127,22 +127,17 @@ function randbn( end "maps 1:binomial(n,2) into an upper triangle of [1,n]×[1,n]" -function trianglemap(r) - j = floor(Int, (1+sqrt(8r-7))/2) + 1 - i = r - binomial(j-1,2) - Edge(i, j) +function trianglemap(r, n) + j, i = fldmod1(r, n - 1) + i ≥ j ? Edge(i + 1, j) : Edge(n - i + 1, n - j + 1) end "maps 1:n*(n-1) into non-diagonal elements of [1,n]×[1,n]" -function nondiagmap(r,n) - j = div(r-1, n-1) - i = r - j*(n-1) - j += 1 - i += (i >= j) - Edge(i, j) +function nondiagmap(r, n) + j, i = fldmod1(r, n - 1) + i ≥ j ? Edge(i + 1, j) : Edge(i, j) end - """ erdos_renyi(n, p) @@ -182,7 +177,7 @@ function erdos_renyi( g = if is_directed SimpleDiGraphFromIterator(nondiagmap(r,n) for r in seq) else - SimpleGraphFromIterator(trianglemap(r) for r in seq) + SimpleGraphFromIterator(trianglemap(r,n) for r in seq) end # complete to exactly n vertices add_vertices!(g, n - nv(g)) From d1cdaee21dd6334395077edfe2a10a2797d30b54 Mon Sep 17 00:00:00 2001 From: Alfredo Braunstein Date: Thu, 26 Oct 2023 10:30:27 +0200 Subject: [PATCH 3/4] cosmetics --- src/SimpleGraphs/generators/randgraphs.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SimpleGraphs/generators/randgraphs.jl b/src/SimpleGraphs/generators/randgraphs.jl index 869d02071..c4ecd6096 100644 --- a/src/SimpleGraphs/generators/randgraphs.jl +++ b/src/SimpleGraphs/generators/randgraphs.jl @@ -134,8 +134,8 @@ end "maps 1:n*(n-1) into non-diagonal elements of [1,n]×[1,n]" function nondiagmap(r, n) - j, i = fldmod1(r, n - 1) - i ≥ j ? Edge(i + 1, j) : Edge(i, j) + i, j = fldmod1(r, n - 1) + Edge(i + (i ≥ j), j) end """ From 5e3879459567194eab639bb2385db1e6e0a9cc50 Mon Sep 17 00:00:00 2001 From: Alfredo Braunstein Date: Wed, 31 Jan 2024 10:38:30 +0100 Subject: [PATCH 4/4] cosmetics --- src/SimpleGraphs/generators/randgraphs.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SimpleGraphs/generators/randgraphs.jl b/src/SimpleGraphs/generators/randgraphs.jl index c4ecd6096..967d4d76d 100644 --- a/src/SimpleGraphs/generators/randgraphs.jl +++ b/src/SimpleGraphs/generators/randgraphs.jl @@ -129,13 +129,13 @@ end "maps 1:binomial(n,2) into an upper triangle of [1,n]×[1,n]" function trianglemap(r, n) j, i = fldmod1(r, n - 1) - i ≥ j ? Edge(i + 1, j) : Edge(n - i + 1, n - j + 1) + return i ≥ j ? Edge(i + 1, j) : Edge(n - i + 1, n - j + 1) end "maps 1:n*(n-1) into non-diagonal elements of [1,n]×[1,n]" function nondiagmap(r, n) i, j = fldmod1(r, n - 1) - Edge(i + (i ≥ j), j) + return Edge(i + (i ≥ j), j) end """ @@ -175,9 +175,9 @@ function erdos_renyi( m = is_directed ? n * (n - 1) : binomial(n, 2) seq = randsubseq(rng_from_rng_or_seed(rng, seed), 1:m, p) g = if is_directed - SimpleDiGraphFromIterator(nondiagmap(r,n) for r in seq) + SimpleDiGraphFromIterator(nondiagmap(r, n) for r in seq) else - SimpleGraphFromIterator(trianglemap(r,n) for r in seq) + SimpleGraphFromIterator(trianglemap(r, n) for r in seq) end # complete to exactly n vertices add_vertices!(g, n - nv(g))