Skip to content

Commit 3f71b2b

Browse files
committed
New zhong-based model
1 parent b864f5b commit 3f71b2b

File tree

7 files changed

+303
-0
lines changed

7 files changed

+303
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
2+
import argparse
3+
4+
parser = argparse.ArgumentParser(description='Auxiliar script to generate Zhong-based CA models')
5+
6+
parser.add_argument('-f', '--infected_steps', type=int, default=6, help='Number of days for the infected state')
7+
parser.add_argument('-r', '--recovered_steps', type=int, default=7, help='Number of days for the recovered state')
8+
parser.add_argument('-t', '--template_ma', type=str, default="template_sirs_zhong_ma", help='Path to zhong .ma template')
9+
parser.add_argument('-m', '--template_macros', type=str, default="template_sirs_zhong_macros", help='Path to zhong macros template')
10+
parser.add_argument('-o', '--out_ma_file', type=str, default="out.ma", help='Output path of the .ma file')
11+
parser.add_argument('-p', '--out_macros_file', type=str, default="sirs_zhong_macros.inc", help='Output path of the macros file')
12+
parser.add_argument('-v', '--virulences', type=str, default="0.6", help='Default virulence values per state')
13+
14+
args = parser.parse_args()
15+
16+
i = 1
17+
states = ["sus_0"]
18+
neighbors = ["(1,0)", "(0,-1)", "(0,1)", "(-1,0)"]
19+
steps_per_state = list(map(str, [args.infected_steps, args.recovered_steps]))
20+
21+
while i <= args.infected_steps:
22+
states.append("inf_%d" % i)
23+
i += 1
24+
25+
while i <= args.infected_steps + args.recovered_steps:
26+
states.append("rec_%d" % i)
27+
i += 1
28+
29+
##############################
30+
# GENERATION OF THE .MA FILE
31+
##############################
32+
content = ""
33+
with open(args.template_ma, "r") as f:
34+
content = f.read()
35+
36+
internal_vars = ["i_%s" % s for s in states] + ["v_%d" % n for n in range(1, args.infected_steps + 1)]
37+
content = content.replace("[[internal_vars]]", " ".join(internal_vars))
38+
39+
internal_vars_values = " ".join(steps_per_state + ["1.0"] + ["0.0"] * (len(states) - 1))
40+
if "," in args.virulences:
41+
virulences = list(args.virulences.split(","))
42+
else:
43+
virulences = [args.virulences] * args.infected_steps
44+
internal_vars_values += " %s" % " ".join(virulences)
45+
content = content.replace("[[internal_vars_values]]", internal_vars_values)
46+
update_ports_str = " ".join(["~%s := $i_%s;" % (s, s) for s in states])
47+
content = content.replace("[[initial_ports_set_up]]", update_ports_str)
48+
content = content.replace("[[update_ports_step]]", update_ports_str)
49+
content = content.replace("[[ports]]", " ".join(states))
50+
51+
update_rules = ""
52+
idx_first_rec = len(states)-args.recovered_steps
53+
for i in range(len(states)-1, idx_first_rec, -1):
54+
update_rules += "$i_%s := $i_%s;\n" % (states[i], states[i-1])
55+
update_rules += "$i_%s := $i_%s + #macro(local_cured);\n\n" % (states[idx_first_rec], states[idx_first_rec-1])
56+
57+
for i in range(idx_first_rec-1, 1, -1):
58+
update_rules += "$i_%s := round(min((1 - $cured_rate) * $i_%s, 1)*100)/100;\n" % (states[i], states[i - 1])
59+
update_rules += "$i_%s := #macro(internal_infected) + #macro(external_infected);\n\n" % states[1]
60+
61+
update_rules += "$i_%s := 1 " % states[0]
62+
update_rules += " ".join(["- $i_%s" % s for s in states[1:]])
63+
update_rules += ";\n"
64+
65+
content = content.replace("[[update_vars_step]]", update_rules)
66+
67+
with open(args.out_ma_file, "w") as f:
68+
f.write(content)
69+
70+
#################################
71+
# GENERATION OF THE MACROS FILE
72+
#################################
73+
74+
content = ""
75+
with open(args.template_macros, "r") as f:
76+
content = f.read()
77+
78+
local_cured_rules = []
79+
for i in range(idx_first_rec-2, 0, -1):
80+
local_cured_rules.append("round(min($cured_rate * $i_%s, 1)*100)" % states[i])
81+
82+
content = content.replace("[[local_cured]]", "(( %s ) / 100 )" % " +\n".join(local_cured_rules))
83+
content = content.replace("[[infected_vars]]", " + ".join(["i_%s" % s for s in states[idx_first_rec:0]]))
84+
85+
external_infected_comp = \
86+
"""( round(min((
87+
$connection * $movement * $i_sus_0 * (
88+
[[external_infected]]
89+
)), 1)*100) / 100 )"""
90+
91+
internal_infected_comp = \
92+
"""( round(min((
93+
$i_sus_0 * (
94+
[[internal_infected]]
95+
)), 1)*100) / 100 )"""
96+
97+
external_infected_rules = []
98+
for nei in neighbors:
99+
lines = []
100+
for s in states[args.infected_steps:0:-1]:
101+
v = "$v_%s" % s.split("_")[-1]
102+
line = "(%s~pop / $population) * %s * %s~%s" % (nei, v, nei, s)
103+
lines.append(line)
104+
105+
ext_comp = external_infected_comp.replace("[[external_infected]]", " +\n".join(lines))
106+
external_infected_rules.append(ext_comp)
107+
108+
content = content.replace("[[external_infected]]", " +\n".join(external_infected_rules))
109+
110+
lines = []
111+
for s in states[args.infected_steps:0:-1]:
112+
v = "$v_%s" % s.split("_")[-1]
113+
line = "(%s * $i_%s)" % (v, s)
114+
lines.append(line)
115+
116+
internal_infected_rule = internal_infected_comp.replace("[[internal_infected]]", " +\n".join(lines))
117+
content = content.replace("[[internal_infected]]", internal_infected_rule)
118+
119+
with open(args.out_macros_file, "w") as f:
120+
f.write(content)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include(sirs_zhong_macros.inc)
2+
[top]
3+
components : area
4+
5+
[area]
6+
type : cell
7+
width : 50
8+
height : 50
9+
delay : transport
10+
defaultDelayTime : 1
11+
border : wrapped
12+
neighbors : area(-1,0)
13+
neighbors : area(0,-1) area(0,0) area(0,1)
14+
neighbors : area(1,0)
15+
initialvalue : -1
16+
17+
localtransition : sirs-zhong-rule
18+
19+
statevariables: population connection movement cured_rate t_i t_r [[internal_vars]]
20+
statevalues: 100 1 0.6 0.0 [[internal_vars_values]]
21+
initialvariablesvalue: sirs_zhong.var
22+
23+
neighborports : initial pop [[ports]]
24+
25+
[sirs-zhong-rule]
26+
rule : {~initial := 0; ~pop := $population; [[initial_ports_set_up]]}
27+
1 {(0,0)~initial = -1}
28+
29+
rule : {
30+
~pop := $population; [[update_ports_step]]
31+
}
32+
{
33+
[[update_vars_step]]
34+
}
35+
1 { (0,0)~initial != -1 }
36+
37+
38+
39+
40+
41+
42+
43+
44+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
#BeginMacro(local_cured)
3+
[[local_cured]]
4+
#EndMacro
5+
6+
#BeginMacro(internal_infected)
7+
[[internal_infected]]
8+
#EndMacro
9+
10+
#BeginMacro(external_infected)
11+
[[external_infected]]
12+
#EndMacro
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include(sirs_zhong_macros.inc)
2+
[top]
3+
components : area
4+
5+
[area]
6+
type : cell
7+
width : 50
8+
height : 50
9+
delay : transport
10+
defaultDelayTime : 1
11+
border : wrapped
12+
neighbors : area(-1,0)
13+
neighbors : area(0,-1) area(0,0) area(0,1)
14+
neighbors : area(1,0)
15+
initialvalue : -1
16+
17+
localtransition : sirs-zhong-rule
18+
19+
statevariables: population connection movement cured_rate t_i t_r i_sus_0 i_inf_1 i_inf_2 i_inf_3 i_inf_4 i_inf_5 i_inf_6 i_rec_7 i_rec_8 i_rec_9 i_rec_10 i_rec_11 i_rec_12 i_rec_13 v_1 v_2 v_3 v_4 v_5 v_6
20+
statevalues: 100 1 0.1 0.0 6 7 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.6 0.6 0.6 0.6 0.6 0.6
21+
initialvariablesvalue: sirs_zhong.var
22+
23+
neighborports : initial pop sus_0 inf_1 inf_2 inf_3 inf_4 inf_5 inf_6 rec_7 rec_8 rec_9 rec_10 rec_11 rec_12 rec_13
24+
25+
[sirs-zhong-rule]
26+
rule : {~initial := 0; ~pop := $population; ~sus_0 := $i_sus_0; ~inf_1 := $i_inf_1; ~inf_2 := $i_inf_2; ~inf_3 := $i_inf_3; ~inf_4 := $i_inf_4; ~inf_5 := $i_inf_5; ~inf_6 := $i_inf_6; ~rec_7 := $i_rec_7; ~rec_8 := $i_rec_8; ~rec_9 := $i_rec_9; ~rec_10 := $i_rec_10; ~rec_11 := $i_rec_11; ~rec_12 := $i_rec_12; ~rec_13 := $i_rec_13;}
27+
1 {(0,0)~initial = -1}
28+
29+
rule : {
30+
~pop := $population; ~sus_0 := $i_sus_0; ~inf_1 := $i_inf_1; ~inf_2 := $i_inf_2; ~inf_3 := $i_inf_3; ~inf_4 := $i_inf_4; ~inf_5 := $i_inf_5; ~inf_6 := $i_inf_6; ~rec_7 := $i_rec_7; ~rec_8 := $i_rec_8; ~rec_9 := $i_rec_9; ~rec_10 := $i_rec_10; ~rec_11 := $i_rec_11; ~rec_12 := $i_rec_12; ~rec_13 := $i_rec_13;
31+
}
32+
{
33+
$i_rec_13 := $i_rec_12;
34+
$i_rec_12 := $i_rec_11;
35+
$i_rec_11 := $i_rec_10;
36+
$i_rec_10 := $i_rec_9;
37+
$i_rec_9 := $i_rec_8;
38+
$i_rec_8 := $i_rec_7;
39+
$i_rec_7 := $i_inf_6 + #macro(local_cured);
40+
41+
$i_inf_6 := round(min((1 - $cured_rate) * $i_inf_5, 1)*100)/100;
42+
$i_inf_5 := round(min((1 - $cured_rate) * $i_inf_4, 1)*100)/100;
43+
$i_inf_4 := round(min((1 - $cured_rate) * $i_inf_3, 1)*100)/100;
44+
$i_inf_3 := round(min((1 - $cured_rate) * $i_inf_2, 1)*100)/100;
45+
$i_inf_2 := round(min((1 - $cured_rate) * $i_inf_1, 1)*100)/100;
46+
$i_inf_1 := #macro(internal_infected) + #macro(external_infected);
47+
48+
$i_sus_0 := 1 - $i_inf_1 - $i_inf_2 - $i_inf_3 - $i_inf_4 - $i_inf_5 - $i_inf_6 - $i_rec_7 - $i_rec_8 - $i_rec_9 - $i_rec_10 - $i_rec_11 - $i_rec_12 - $i_rec_13;
49+
50+
}
51+
1 { (0,0)~initial != -1 }
52+
53+
54+
55+
56+
57+
58+
59+
60+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[-100; -0.001] 255 0 0
2+
[0; 0.200] 0 0 0
3+
[0.201; 0.400] 50 50 50
4+
[0.401; 0.600] 100 100 100
5+
[0.601; 0.800] 150 150 150
6+
[0.801; 1.00] 200 200 200
7+
[1.001;100] 255 0 0
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
(25,25) = 100 1 0.1 0.0 6 7 0.7 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.6 0.6 0.6 0.6 0.6 0.6
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
2+
#BeginMacro(local_cured)
3+
(( round(min($cured_rate * $i_inf_5, 1)*100) +
4+
round(min($cured_rate * $i_inf_4, 1)*100) +
5+
round(min($cured_rate * $i_inf_3, 1)*100) +
6+
round(min($cured_rate * $i_inf_2, 1)*100) +
7+
round(min($cured_rate * $i_inf_1, 1)*100) ) / 100 )
8+
#EndMacro
9+
10+
#BeginMacro(internal_infected)
11+
( round(min((
12+
$i_sus_0 * (
13+
($v_6 * $i_inf_6) +
14+
($v_5 * $i_inf_5) +
15+
($v_4 * $i_inf_4) +
16+
($v_3 * $i_inf_3) +
17+
($v_2 * $i_inf_2) +
18+
($v_1 * $i_inf_1)
19+
)), 1)*100) / 100 )
20+
#EndMacro
21+
22+
#BeginMacro(external_infected)
23+
( round(min((
24+
$connection * $movement * $i_sus_0 * (
25+
((1,0)~pop / $population) * $v_6 * (1,0)~inf_6 +
26+
((1,0)~pop / $population) * $v_5 * (1,0)~inf_5 +
27+
((1,0)~pop / $population) * $v_4 * (1,0)~inf_4 +
28+
((1,0)~pop / $population) * $v_3 * (1,0)~inf_3 +
29+
((1,0)~pop / $population) * $v_2 * (1,0)~inf_2 +
30+
((1,0)~pop / $population) * $v_1 * (1,0)~inf_1
31+
)), 1)*100) / 100 ) +
32+
( round(min((
33+
$connection * $movement * $i_sus_0 * (
34+
((0,-1)~pop / $population) * $v_6 * (0,-1)~inf_6 +
35+
((0,-1)~pop / $population) * $v_5 * (0,-1)~inf_5 +
36+
((0,-1)~pop / $population) * $v_4 * (0,-1)~inf_4 +
37+
((0,-1)~pop / $population) * $v_3 * (0,-1)~inf_3 +
38+
((0,-1)~pop / $population) * $v_2 * (0,-1)~inf_2 +
39+
((0,-1)~pop / $population) * $v_1 * (0,-1)~inf_1
40+
)), 1)*100) / 100 ) +
41+
( round(min((
42+
$connection * $movement * $i_sus_0 * (
43+
((0,1)~pop / $population) * $v_6 * (0,1)~inf_6 +
44+
((0,1)~pop / $population) * $v_5 * (0,1)~inf_5 +
45+
((0,1)~pop / $population) * $v_4 * (0,1)~inf_4 +
46+
((0,1)~pop / $population) * $v_3 * (0,1)~inf_3 +
47+
((0,1)~pop / $population) * $v_2 * (0,1)~inf_2 +
48+
((0,1)~pop / $population) * $v_1 * (0,1)~inf_1
49+
)), 1)*100) / 100 ) +
50+
( round(min((
51+
$connection * $movement * $i_sus_0 * (
52+
((-1,0)~pop / $population) * $v_6 * (-1,0)~inf_6 +
53+
((-1,0)~pop / $population) * $v_5 * (-1,0)~inf_5 +
54+
((-1,0)~pop / $population) * $v_4 * (-1,0)~inf_4 +
55+
((-1,0)~pop / $population) * $v_3 * (-1,0)~inf_3 +
56+
((-1,0)~pop / $population) * $v_2 * (-1,0)~inf_2 +
57+
((-1,0)~pop / $population) * $v_1 * (-1,0)~inf_1
58+
)), 1)*100) / 100 )
59+
#EndMacro

0 commit comments

Comments
 (0)