abstract type NetworkEnsemble <: AbstractProposal end struct ErdosRenyi <: NetworkEnsemble n::Int64 p::Float64 s::Int64 end ErdosRenyi(n::Int64) = ErdosRenyi(n, log(n)/n * (1 + exp(-rand()))) ErdosRenyi(n::Int64, p::AbstractFloat) = ErdosRenyi(n, p, ceil(Int, log(n))) ErdosRenyi(n::Int64, m::Int64, s::Int64=ceil(Int, log(n))) = ErdosRenyi(n, m/(n*(n-1)/2), s) Base.rand(rng::AbstractRNG, e::ErdosRenyi) = erdos_renyi(e.n, e.p; rng) function propose(rng::AbstractRNG, e::ErdosRenyi, G::Graph) G = copy(G) for t = 1:e.s # Choose a pair u = rand(rng, 1:nv(G)) v = rand(rng, 1:nv(G)-1) if (v>=u) v+=1 end # Resample edge if has_edge(G, u, v) if rand(rng) < 1 - e.p rem_edge!(G, u, v) end else if rand(rng) < e.p add_edge!(G, u, v) end end end return G end