SIB: [S]tatistical [I]nference in Epidemics via [B]elief Propagation
Message passing algorithm for individual-level inference in epidemics. SIB assumes that the epidemic process is generated by a compartmental model (currently a generalized semi-continuous time SIR model is implemented). Among other things, SIB computes the probability of each individual to be susceptible, infected or recovered at a given time from a list of contacts and partial observations. The method is based on Belief Propagation equations for partial trajectories. See notes and article or go directly to results for more details.
- A C++11 compiler
- python3
- pybind11
you can choose one of the following procedures:
-
make
- Adjust
Makefile
, if needed. - type:
make
- Adjust
-
pip install
- Adjust the setup.py, if needed.
pip install .
You'll obtain a standalone CLI ./sib, plus a dynamic library containing a python module sib
.
When not installing with pip
, make sure to include the sib
folder into the python path.
Use OpenMP with Apple Clang and Homebrew libomp:
- Check requirements.
- Create a conda env (tested with python=3.8) and activate it
conda install openmp
- open setup.py and uncomment the following line:
COMPILE_FLAGS = "-fPIC -std=c++11 -Wall -O3 -g -Xpreprocessor -fopenmp"
extra_link_args = ["-lomp", "-lm"]
pip install .
in the sib folder.
Have a look at this notebook.
Have a look at this document for some preliminary results on the containment of the Covid-19 epidemics.
This code implements and expands the method described in this paper.
sib.Params(
prob_i = Uniform(1.0),
prob_r = Exponential(0.1),
pseed = 0.01,
psus = 0.5,
softconstraint = 0):
Settings the parameters of the model used for inference.
Parameters
----------
prob_i : Function - optional
function to compute the probability of infection,
depending on the difference (t-ti), ti time of infection.
[default: Uniform]
prob_r : Function - optional
function to compute the probability of recovery,
depending on the difference (t-ti), ti time of infection.
[default: exponential decay with mu = 0.1]
pseed : Float - optional
Prior to be source of infections (infected at starting times).
[default 1e-2]
psus: Float - optional
Prior to be susceptible.
[default: 0.5]
Returns
-------
None
sib.FactorGraph(
Params,
contacts = [],
tests = [],
individuals = []
)
Construct the factor graph from the list of contacts,
the lists of observations, the Parameters of the model.
Eventually is possible to set infectiousness and
recoverability priors on each individual.
Parameters
----------
Params: Class sib.Params -- optional
see sib.Params
contacts: list<tuple(int, int, int, float)>
list of single direct contacts (for bidirectional contacts add also
the inverse contact). Order of tuple contact: (node_i, node_j, time, lambda)
The lambdas are the instantaneous probability of infection.
tests: list<tuple(int, sib.Test, int)>
list of single observation on single node a time t. Order of observation tuple: (node_i, sib.Test, time). sib.Test is a class containing the probability to be susceptible, infected, recovery, given by medical tests or symptoms.
individuals: list(tuple(int, prior_t, prior_r)) [optional]
List of tuple where each tuple are the prior on the infectiousness and recoverability of node "i".
return
------
Class FactorGraph
sib.Test(
ps = 0.0,
pi = 0.0,
pr = 0.0
)
Evidence given by a test.
Parameters
----------
ps: probability to be susceptible
pi: probability to be infected
pr: probability to be recovery
sib.iterate(
f,
maxit=100,
tol=1e-3,
damping=0.0,
callback=(lambda t, err, f: print(t, err, flush=True))
)
Iterate the BP messages.
Parameters
----------
f: FactorGraph class
The factor graph. See sib.FactorGraph
maxit: int -- optional
max number of iteration of update of BP equation
tol: float -- optional
If the error of the update of BP equation is less than `tol`the iteration stop.
damping: float -- optional
Damping parameter to help the convergence of BP equation.
callback: function(iter_n, err, f) -- optional
Function callback, called after each iteration. Take as argument the number of current iteration (iter_n), error (err), and the FactorGraph (f).
If you want to participate write us (sibyl-team) or make a pull request.
The sibyl-team:
Alfredo Braunstein ([email protected]), Alessandro Ingrosso (@ai_ingrosso), Indaco Biazzo (@ocadni), Luca Dall'Asta, Anna Paola Muntoni, Fabio Mazza, Giovanni Catania
This project has been partially funded by Fondazione CRT through call "La Ricerca dei Talenti", project SIBYL and by the SmartData@PoliTO center on Big Data and Data Science.