EoN.subsample

EoN.subsample(report_times, times, status1, status2=None, status3=None)[source]

Given a list/array of times to report at, returns the number of nodes of each status at those times.

returns them
subsampled at specific report_times.
Arguments:
report_times iterable (ordered)
times at which we want to know state of system
times iterable (ordered)
times at which we have the system state (assumed no change between these times)
status1 iterable

generally S, I, or R

number of nodes in given status at corresponding time in times.

status2 iterable (optional, default None)

generally S, I, or R

number of nodes in given status at corresponding time in times.

status3 iterable (optional, default None)

generally S, I, or R

number of nodes in given status at corresponding time in times.

Returns:
If only status1 is defined
report_status1 numpy array gives status1 subsampled just at report_times.
If more are defined then it returns a list, either
[report_status1, report_status2]
or
[report_status1, report_status2, report_status3]

In each case, these are subsampled just at report_times.

SAMPLE USE:
import networkx as nx
import EoN
import numpy as np
import matplotlib.pyplot as plt

""" in this example we will run 100 stochastic simulations.
    Each simulation will produce output at a different set
    of times.  In order to calculate an average we will use
    subsample to find the epidemic sizes at a specific set
    of times given by report_times.
"""

G = nx.fast_gnp_random_graph(10000,0.001)
tau = 1.
gamma = 1.
report_times = np.linspace(0,5,101)
Ssum = np.zeros(len(report_times))
Isum = np.zeros(len(report_times))
Rsum = np.zeros(len(report_times))
iterations = 100
for counter in range(iterations):
    t, S, I, R = EoN.fast_SIR(G, tau, gamma, initial_infecteds = range(10))
    #t, S, I, and R have an entry for every single event.
    newS, newI, newR = EoN.subsample(report_times, t, S, I, R)
    #could also do: newI = EoN.subsample(report_times, t, I)
    plt.plot(report_times, newS, linewidth=1, alpha = 0.4)
    plt.plot(report_times, newI, linewidth=1, alpha = 0.4)
    plt.plot(report_times, newR, linewidth=1, alpha = 0.4)
    Ssum += newS
    Isum += newI
    Rsum += newR
Save = Ssum / float(iterations)
Iave = Isum / float(iterations)
Rave = Rsum / float(iterations)
plt.plot(report_times, Save, "--", linewidth = 5, label = "average")
plt.plot(report_times, Iave, "--", linewidth = 5)
plt.plot(report_times, Rave, "--", linewidth = 5)
plt.legend(loc = "upper right")
plt.savefig("tmp.pdf")

If only one of the sample times is given then returns just that.

If report_times goes longer than times, then this simply assumes the system freezes in the final state.

This uses a recursive approach if multiple arguments are defined.