A python implementation of the exact solution of irreversible binary dynamics on networks.
After having declared your parameters, you must initiate an instance and run the algorithm:
solver = Solver(params)
Q = solver.get_probabilities_Q()
The output of solver.get_probabilities_Q()
is a dictionary where keys are the configurations as strings (e.g. "101011011") and values are the probabilities of getting the key configuration. For example, the output could look like:
{
'01110': -3.5575383784680611984e-21,
'01111': 1.8973538018496326391e-20,
'11001': -5.4887734982078661633e-20,
...
}
The algorithm needs some parameters to run. We use a dictionary to feed the parameters.
params = {
"edgelist_path" : "./edgelist.txt",
"response_function": [
{
"name": "bond",
"nodes": [0,1,2],
"params": {
"p": 0.3,
"p_spontaneous": 0.1
}
},
{
"name": "watts",
"nodes": [3,4],
"params": {
"threshold": 3.0,
"p": 0.4
}
},
]
}
edgelist_path
: The path to the edgelistresponse_function
: A list of response functions to use.
In each element of params["response_function"]
, you must declare the name of the response function and the nodes that apply to.
It is possible to output the result in a symbolic form. In this case, you do not need to specify the response functions
params = {
"edgelist_path" : "./edgelist.txt",
"symbolic" : True
}
solver = Solver(params)
Q = solver.get_probabilities_Q()
The output will look like
'00001' : '<prod><add>1;-<div><prod>G(0,0);G(1,0);G(2,0);G(3,0);G(4,0)</prod>;<prod>G(0,0);G(1,0);G(2,0.0);G(3,0.0);</prod></div>;</add>;<prod>G(0,0);G(1,1);G(2,0.0);G(3,0.0);</prod></prod>',
'00000' : '<prod>G(0,0);G(1,0);G(2,0);G(3,0);G(4,0)</prod>',
'00100' : '<prod><add>1;-<div><prod>G(0,0);G(1,0);G(2,0);G(3,0);G(4,0)</prod>;<prod>G(0,0);G(1,0);G(3,0.0);G(4,0.0);</prod></div>;</add>;<prod>G(0,0);G(1,1);G(3,0.0);G(4,0.0);</prod></prod>',
...
The symbolic form can be interpreted like a HTML code. Use BeautifulSoup
to prettify the output.
import numpy as np
from bs4 import BeautifulSoup
symbols = "<prod><add>1;-<div><prod>G(0,0);G(1,0);G(2,0);G(3,0);G(4,0)</prod>;<prod>G(0,0);G(1,0);G(2,0.0);G(3,0.0);</prod></div>;</add>;<prod>G(0,0);G(1,1);G(2,0.0);G(3,0.0);</prod></prod>"
soup = BeautifulSoup(symbols, 'html.parser')
soup.prettify()
<prod>
<add>
1;-
<div>
<prod>
G(0,0);G(1,0);G(2,0);G(3,0);G(4,0)
</prod>
;
<prod>
G(0,0);G(1,0);G(2,0.0);G(3,0.0);
</prod>
</div>
;
</add>
;
<prod>
G(0,0);G(1,1);G(2,0.0);G(3,0.0);
</prod>
</prod>
The XML format has three tags
<prod>
: Product<add>
: Addition<div>
: DivisionG(i,m)
: Means1-F_i(m)
wherei
is the node index andm
is the number of active neighbors
where contents are separated by ;
.
For example,
<prod>G(0,1);G(1,3)</prod>
meansG(0,1)*G(1,3)
<add>G(0,1);G(1,3)</add>
meansG(0,1)+G(1,3)
<div>G(0,1);G(1,3)</div>
meansG(0,1)/G(1,3)
And more complex statements should keep the hierarchy, such as
<prod><add>1;G(0,1)</add>;G(2,2)</prod>
means[1-G(0,1)]*G(2,2)
Please cite:
"Exact analytical solution of irreversible binary dynamics on networks"
E. Laurence, J.-G. Young, S. Melnik, and L. J. Dubé
Phys. Rev. E. 97, 032302 (2018)
DOI: 10.1103/PhysRevE.97.032302
Read it on: arXiv