EoN.Gillespie_SIR¶
-
EoN.
Gillespie_SIR
(G, tau, gamma, initial_infecteds=None, initial_recovereds=None, rho=None, tmin=0, tmax=inf, recovery_weight=None, transmission_weight=None, return_full_data=False, sim_kwargs=None)[source]¶ Performs SIR simulations for epidemics.
For unweighted networks, the run time is usually slower than fast_SIR, but they are close. If we add weights, then this Gillespie implementation slows down much more.
I think there are better ways to implement the algorithm to remove this. This will need a new data type that allows us to quickly sample a random event with appropriate weight. I think this is doable through a binary tree and it is in development.
Rather than using figure A.1 of Kiss, Miller, & Simon, this uses a method from Petter Holme
“Model versions and fast algorithms for network epidemiology”which focuses on SI edges (versions before 0.99.2 used a method more like fig A.1).
- This approach will not work for nonMarkovian transmission. Boguna et al
- “Simulating non-Markovian stochastic processes”
have looked at how to handle nonMarkovian transmission in a Gillespie Algorithm. At present I don’t see a way to efficientl adapt their approach - I think each substep will take O(N) time. So the full algorithm will be O(N^2). For this, it will be much better to use fast_SIR which I believe is O(N log N)
See Also: fast_SIR which has the same inputs but uses a different method to run faster, particularly in the weighted case.
Arguments: - G networkx Graph
- The underlying network
- tau positive float
- transmission rate per edge
- gamma number
- recovery rate per node
- initial_infecteds node or iterable of nodes
- if a single node, then this node is initially infected if an iterable, then whole set is initially infected if None, then choose randomly based on rho. If rho is also None, a random single node is chosen. If both initial_infecteds and rho are assigned, then there is an error.
- initial_recovereds iterable of nodes (default None)
- this whole collection is made recovered. Currently there is no test for consistency with initial_infecteds. Understood that everyone who isn’t infected or recovered initially is initially susceptible.
- rho number
- initial fraction infected. number is int(round(G.order()*rho))
- tmin number (default 0)
- starting time
- tmax number (default Infinity)
- stop time
- recovery_weight string (default None)
- the string used to define the node attribute for the weight. Assumes that the recovery rate is gamma*G.nodes[u][recovery_weight]. If None, then just uses gamma without scaling.
- transmission_weight string (default None)
- the string used to define the edge attribute for the weight. Assumes that the transmission rate from u to v is tau*G.adj[u][v][transmission_weight] If None, then just uses tau without scaling.
- return_full_data boolean (default False)
- Tells whether a Simulation_Investigation object should be returned.
- sim_kwargs keyword arguments
- Any keyword arguments to be sent to the Simulation_Investigation object
Only relevant if
return_full_data=True
Returns: - times, S, I, R each a numpy array
- giving times and number in each status for corresponding time
OR if return_full_data=True:
- full_data Simulation_Investigation object
- from this we can extract the status history of all nodes We can also plot the network at given times and even create animations using class methods.
SAMPLE USE: import networkx as nx import EoN import matplotlib.pyplot as plt G = nx.configuration_model([1,5,10]*100000) initial_size = 10000 gamma = 1. tau = 0.3 t, S, I, R = EoN.Gillespie_SIR(G, tau, gamma, initial_infecteds = range(initial_size)) plt.plot(t, I)