|
| 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('-om', '--out_macros_file', type=str, default="sirs_zhong_macros.inc", help='Output path of the macros file') |
| 12 | +parser.add_argument('-ov', '--out_var_file', type=str, default="sirs_zhong.var", help='Output path of the .var file') |
| 13 | +parser.add_argument('-v', '--virulences', type=str, default="0.6", help='Default virulence values per infected state') |
| 14 | +parser.add_argument('-c', '--cured_rates', type=str, default="0.0", help='Default cured rates values per infected state') |
| 15 | + |
| 16 | +args = parser.parse_args() |
| 17 | + |
| 18 | +i = 1 |
| 19 | +states = ["sus_0"] |
| 20 | +neighbors = ["(1,0)", "(0,-1)", "(0,1)", "(-1,0)"] |
| 21 | +steps_per_state = list(map(str, [args.infected_steps, args.recovered_steps])) |
| 22 | + |
| 23 | +while i <= args.infected_steps: |
| 24 | + states.append("inf_%d" % i) |
| 25 | + i += 1 |
| 26 | + |
| 27 | +while i <= args.infected_steps + args.recovered_steps: |
| 28 | + states.append("rec_%d" % i) |
| 29 | + i += 1 |
| 30 | + |
| 31 | +############################## |
| 32 | +# GENERATION OF THE .MA FILE |
| 33 | +############################## |
| 34 | +content = "" |
| 35 | +with open(args.template_ma, "r") as f: |
| 36 | + content = f.read() |
| 37 | + |
| 38 | +internal_vars = ["i_%s" % s for s in states] + \ |
| 39 | + ["v_%d" % n for n in range(1, args.infected_steps + 1)] + \ |
| 40 | + ["cr_%d" % n for n in range(1, args.infected_steps)] |
| 41 | +content = content.replace("[[internal_vars]]", " ".join(internal_vars)) |
| 42 | + |
| 43 | +internal_vars_values = " ".join(steps_per_state + ["1.0"] + ["0.0"] * (len(states) - 1)) |
| 44 | +if "," in args.virulences: |
| 45 | + virulences = list(args.virulences.split(",")) |
| 46 | +else: |
| 47 | + virulences = [args.virulences] * args.infected_steps |
| 48 | + |
| 49 | +internal_vars_values += " %s" % " ".join(virulences) |
| 50 | + |
| 51 | +if "," in args.cured_rates: |
| 52 | + cured_rates = list(args.cured_rates.split(",")) |
| 53 | +else: |
| 54 | + cured_rates = [args.cured_rates] * (args.infected_steps - 1) |
| 55 | + |
| 56 | +internal_vars_values += " %s" % " ".join(cured_rates) |
| 57 | + |
| 58 | +content = content.replace("[[internal_vars_values]]", internal_vars_values) |
| 59 | +update_ports_str = " ".join(["~%s := $i_%s;" % (s, s) for s in states]) |
| 60 | +content = content.replace("[[initial_ports_set_up]]", update_ports_str) |
| 61 | +content = content.replace("[[update_ports_step]]", update_ports_str) |
| 62 | +content = content.replace("[[ports]]", " ".join(states)) |
| 63 | + |
| 64 | +update_rules = "" |
| 65 | +idx_first_rec = len(states)-args.recovered_steps |
| 66 | +for i in range(len(states)-1, idx_first_rec, -1): |
| 67 | + update_rules += "$i_%s := $i_%s;\n" % (states[i], states[i-1]) |
| 68 | +update_rules += "$i_%s := $i_%s + #macro(local_cured);\n\n" % (states[idx_first_rec], states[idx_first_rec-1]) |
| 69 | + |
| 70 | +for i in range(idx_first_rec-1, 1, -1): |
| 71 | + cr = "$cr_%s" % states[i - 1].split("_")[-1] |
| 72 | + update_rules += "$i_%s := round(min((1 - %s) * $i_%s, 1)*100)/100;\n" % (states[i], cr, states[i - 1]) |
| 73 | +update_rules += "$i_%s := #macro(internal_infected) + #macro(external_infected);\n\n" % states[1] |
| 74 | + |
| 75 | +update_rules += "$i_%s := 1 " % states[0] |
| 76 | +update_rules += " ".join(["- $i_%s" % s for s in states[1:]]) |
| 77 | +update_rules += ";\n" |
| 78 | + |
| 79 | +content = content.replace("[[update_vars_step]]", update_rules) |
| 80 | + |
| 81 | +with open(args.out_ma_file, "w") as f: |
| 82 | + f.write(content) |
| 83 | + |
| 84 | +################################# |
| 85 | +# GENERATION OF THE MACROS FILE |
| 86 | +################################# |
| 87 | + |
| 88 | +content = "" |
| 89 | +with open(args.template_macros, "r") as f: |
| 90 | + content = f.read() |
| 91 | + |
| 92 | +local_cured_rules = [] |
| 93 | +for i in range(idx_first_rec-2, 0, -1): |
| 94 | + cr = "$cr_%s" % states[i].split("_")[-1] |
| 95 | + local_cured_rules.append("round(min(%s * $i_%s, 1)*100)" % (cr, states[i])) |
| 96 | + |
| 97 | +content = content.replace("[[local_cured]]", "(( %s ) / 100 )" % " +\n".join(local_cured_rules)) |
| 98 | +content = content.replace("[[infected_vars]]", " + ".join(["i_%s" % s for s in states[idx_first_rec:0]])) |
| 99 | + |
| 100 | +external_infected_comp = \ |
| 101 | +"""( round(min(( |
| 102 | +$connection * $movement * $i_sus_0 * ( |
| 103 | +[[external_infected]] |
| 104 | +)), 1)*100) / 100 )""" |
| 105 | + |
| 106 | +internal_infected_comp = \ |
| 107 | +"""( round(min(( |
| 108 | +$i_sus_0 * ( |
| 109 | +[[internal_infected]] |
| 110 | +)), 1)*100) / 100 )""" |
| 111 | + |
| 112 | +external_infected_rules = [] |
| 113 | +for nei in neighbors: |
| 114 | + lines = [] |
| 115 | + for s in states[args.infected_steps:0:-1]: |
| 116 | + v = "$v_%s" % s.split("_")[-1] |
| 117 | + line = "(%s~pop / $population) * %s * %s~%s" % (nei, v, nei, s) |
| 118 | + lines.append(line) |
| 119 | + |
| 120 | + ext_comp = external_infected_comp.replace("[[external_infected]]", " +\n".join(lines)) |
| 121 | + external_infected_rules.append(ext_comp) |
| 122 | + |
| 123 | +content = content.replace("[[external_infected]]", " +\n".join(external_infected_rules)) |
| 124 | + |
| 125 | +lines = [] |
| 126 | +for s in states[args.infected_steps:0:-1]: |
| 127 | + v = "$v_%s" % s.split("_")[-1] |
| 128 | + line = "(%s * $i_%s)" % (v, s) |
| 129 | + lines.append(line) |
| 130 | + |
| 131 | +internal_infected_rule = internal_infected_comp.replace("[[internal_infected]]", " +\n".join(lines)) |
| 132 | +content = content.replace("[[internal_infected]]", internal_infected_rule) |
| 133 | + |
| 134 | +with open(args.out_macros_file, "w") as f: |
| 135 | + f.write(content) |
| 136 | + |
| 137 | + |
| 138 | +################################# |
| 139 | +# GENERATION OF THE .VAR FILE |
| 140 | +################################# |
| 141 | + |
| 142 | +with open(args.out_var_file, "w") as f: |
| 143 | + ivv = internal_vars_values.split() |
| 144 | + assert ivv[2] == "1.0" or ivv[2] == "1", "Unexpected vals (original susceptible: %s)" % ivv[2] |
| 145 | + ivv[2] = "0.7" |
| 146 | + ivv[3] = "0.3" |
| 147 | + stimulus = "(25,25) = 100 1 0.6 %s\n" % " ".join(ivv) |
| 148 | + f.write(stimulus) |
0 commit comments