Newer
Older
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