Weighted network example

Downloadable Source Code

../_images/SIS_weighted.png
import networkx as nx
import EoN
import matplotlib.pyplot as plt

r'''This code simulates an SIS epidemic in a graph.  The edges are weighted by
two methods: the product of the degrees, or the inverse of that product.

I then run simulations with the transmission rates scaled by the edge weights
such that a random edge would have expected transmission weight 1 (though since
there will be biases in which nodes are most likely to be infected, the
random edge that has an infected node will have higher transmission weight).
'''

N= 100000
rho = 0.001
gamma = 1

G = nx.configuration_model([2,6]*int(N/2)) #N nodes, half have degree 6 and half degree 2
G=nx.Graph(G)

#assign edge weights to be product of degree.  Also give another weight to be inverse of product of degrees
weight_sum = 0
inv_weight_sum = 0

for edge in G.edges():
    G.edges[edge[0],edge[1]]['weight'] = G.degree(edge[0])*G.degree(edge[1])
    G.edges[edge[0],edge[1]]['inv_weight'] = 1./(G.degree(edge[0])*G.degree(edge[1]))
    #If networkx is older, use G.edge[edge[0]][edge[1]][...

    weight_sum += G.degree(edge[0])*G.degree(edge[1])
    inv_weight_sum += 1./(G.degree(edge[0])*G.degree(edge[1]))

#first do it with weight, scaled so that average weight is 1.
t, S, I = EoN.fast_SIS(G, G.number_of_edges()/weight_sum, gamma, rho = rho, transmission_weight= 'weight', tmax = 10)
plt.plot(t, I, label = 'weight')


t, S, I = EoN.fast_SIS(G, G.number_of_edges()/inv_weight_sum, gamma, rho = rho, transmission_weight= 'inv_weight', tmax = 10)
plt.plot(t, I, label = 'inv_weight')

plt.legend(loc = 'lower right')
plt.savefig('SIS_weighted.png')