Skip to content
Snippets Groups Projects
networks.jl 931 B
Newer Older
Luca Lenz's avatar
Luca Lenz committed
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