SEIS_ct
The SEIS_ct Model [1] assumes that infection spreads only through links between neighboring nodes in a graph \(G=(V,E)\). Each node is in one of three states: \(S\) (susceptible), \(E\) (exposed/incubating), or \(I\) (infected). Compared with the discrete-step SEIS, SEIS_ct uses elapsed-time–dependent transition probabilities for \(E\to I\) and \(I\to S\) based on the time since the last state entry.
Implementation
We use two Boolean indicator vectors \(h, e \in \{0,1\}^N\) and two integer tensors that store entry times:
\(h_i=1\) indicates node \(i\) is
infectedorexposed; \(h_i=0\) indicatessusceptible.\((h_i,e_i)=(0,0)\) denotes Susceptible (S).
\((h_i,e_i)=(1,1)\) denotes Exposed (E).
\((h_i,e_i)=(1,0)\) denotes Infected (I).
\(t_i^{E}\) records the iteration \(k\) when node \(i\) entered E.
\(t_i^{I}\) records the iteration \(k\) when node \(i\) entered I.
With \(k\) denoting the current iteration, define duration variables \(\Delta t_i^{E} = k - t_i^{E}\) and \(\Delta t_i^{I} = k - t_i^{I}\). The update of the system at step \(k\) is decomposed into three stages:
Each infected neighbor \(j\) of node \(i\) transmits a log-probability contribution for exposure (S→E)
Node \(i\) collects contributions from all neighbors \(N(i)\) to compute its exposure probability
The integer tensors and indicator variables are updated with independent uniform random variables \(U_i^{\mathrm{exp}}, U_i^{\mathrm{inf}}, U_i^{\mathrm{rec}} \sim \mathrm{Uniform}(0,1)\)
Status
During the simulation, a node can be in one of the following states:
Status |
Code |
|---|---|
Susceptible |
0 |
Infected |
1 |
Exposed |
2 |
SEISctModel
- class fs_gplib.Epidemics.SEISctModel(data, seeds, infection_beta: float, removal_gamma: float, latent_alpha: float, device='cpu', use_weight: bool = False, rand_seed=None)[source]
Bases:
DiffusionModelSEIS_ct (continuous-time SEIS) diffusion model on static graphs.
Variant of SEIS where the E→I and I→S transition probabilities depend on the elapsed time since entering that state, rather than being constant per step. Specifically, \(P(E \to I) = 1 - e^{-\Delta t^E \,\alpha}\) and \(P(I \to S) = 1 - e^{-\Delta t^I \,\gamma}\).
Returned node states are encoded as: 0 = susceptible, 1 = infected, 2 = exposed.
- Parameters:
data (torch_geometric.data.Data) -- PyTorch Geometric
Dataobject representing graph \(G=(V,E)\). Must containedge_index(the edge set \(E\)) andnum_nodes(\(|V|\)). When use_weight isTrue,edge_attrsupplies per-edge weights \(w_{ji}\).seeds (list[int] | float) -- Nodes whose initial state is Infected. Pass a list of node IDs, or a float in (0, 1) to infect that fraction of nodes chosen uniformly at random.
infection_beta (float) -- Per-contact exposure probability \(\beta \in [0,1]\) (S→E).
removal_gamma (float) -- Recovery rate \(\gamma > 0\) (I→S). Used in \(1 - e^{-\Delta t^I \,\gamma}\).
latent_alpha (float) -- Incubation rate \(\alpha > 0\) (E→I). Used in \(1 - e^{-\Delta t^E \,\alpha}\).
device (str | int) -- (optional)
'cpu'or a CUDA device index. Defaults to'cpu'.use_weight (bool) -- (optional) If
True, each edge \((j,i)\) carries a weight \(w_{ji}\) fromdata.edge_attrand the exposure probability becomes \(\beta w_{ji}\). IfFalseall weights default to 1 (i.e. \(w_{ji}=1\)). Defaults toFalse.rand_seed (int | None) -- (optional) Random seed used when seeds is a float. Defaults to
None.
- run_iteration()[source]
Execute a single simulation step.
The internal
node_statusis updated so that subsequent calls continue from the latest state.- Returns:
Node states after one step, shape
(1, N).- Return type:
torch.Tensor
- run_iterations(times)[source]
Execute times simulation steps sequentially.
The internal
node_statusis updated in-place so that subsequent calls continue from the latest state.- Parameters:
times (int) -- Number of steps to run.
- Returns:
Node states at final step, shape
(1, N).- Return type:
torch.Tensor
- run_epoch(iterations_times)[source]
Run a single Monte-Carlo epoch (one independent realisation).
Node states are re-initialised before the epoch starts.
- Parameters:
iterations_times (int) -- Number of simulation steps per epoch.
- Returns:
Node states at final step of the epoch, shape
(1, N).- Return type:
torch.Tensor
- run_epochs(epochs, iterations_times, batch_size=200)[source]
Run multiple independent Monte-Carlo epochs in batches.
Node states are re-initialised before the run.
- Parameters:
epochs (int) -- Total number of independent realisations.
iterations_times (int) -- Number of simulation steps per epoch.
batch_size (int) -- (optional) Number of epochs processed in parallel per batch. Defaults to
200.
- Returns:
Node states at final step of all epochs, shape
(epochs, N).- Return type:
torch.Tensor