Exemple #1
0
def test_human_parameter_changed():
    # Store old human properties
    old_sample_human_1 = copy.copy(sample_human_1)
    # Change parameters and reroll properties
    parameters = base.SimulationParameters(mask_user_rate=0.0,
                                           imune_rate=0.0,
                                           weareable_adoption_rate=0.0)
    base.set_parameters(parameters)
    sample_human_1.parameter_changed()
    # Make sure they're different
    assert old_sample_human_1.mask_user != sample_human_1.mask_user
    assert old_sample_human_1.immune != sample_human_1.immune
    assert old_sample_human_1.early_symptom_detection != sample_human_1.early_symptom_detection
population_size = 1000
simulation_cycles = 180 # days

################################################################################
# Scenarios

scenario = {}

# ------------------------------------------------------------------------------

sc = 1 # Do nothing
print(f"Setting up scenario {sc}")
scenario[sc] = {}
scenario[sc]['parameters'] = copy.deepcopy(common_parameters)
set_parameters(scenario[sc]['parameters'])
scenario[sc]['model'] = CovidModel()
np.random.seed(seed)
setup_city_layout(scenario[sc]['model'], population_size)

# ------------------------------------------------------------------------------

sc = 2 # complete lockdown
print(f"Setting up scenario {sc}")
scenario[sc] = {}
scenario[sc]['parameters'] = copy.deepcopy(common_parameters)
scenario[sc]['parameters'].params['social_policies'] = [
    SocialPolicy.LOCKDOWN_OFFICE,
    SocialPolicy.LOCKDOWN_FACTORY,
    SocialPolicy.LOCKDOWN_RETAIL,
    SocialPolicy.LOCKDOWN_ELEMENTARY_SCHOOL,
Exemple #3
0
def test_flip_coin():
    assert type(base.flip_coin(0.5)) == bool
    with pytest.raises(TypeError):
        base.flip_coin("50")


def test_random_selection():
    random_numbers = np.random.rand(5)
    assert base.random_selection(random_numbers, 1) in random_numbers


# Setting up parameters
hospitalization_capacity = 0.05
parameters = base.SimulationParameters(
    hospitalization_capacity=hospitalization_capacity)
base.set_parameters(parameters)
model = base.CovidModel()
population_size = 1000
setup_city_layout(model, population_size)


def test_agent_base():
    random_id = np.random.randint(50)
    sample_agent = base.AgentBase(random_id, model)
    assert sample_agent.id == random_id
    assert sample_agent in model.agents


def test_initial_model_state():
    # Assert initial model state
    assert model.agents
from model import location
from model.base import CovidModel, SimulationParameters, set_parameters
from model.human import Human, Adult, InfectionStatus
from model.utils import SimulationState, RestaurantType

parameters = SimulationParameters(mask_user_rate=0.0)
set_parameters(parameters)
model = CovidModel()
capacity = 2000


def check_spread(sample_location,
                 spreading_states=None,
                 check_step=True,
                 in_social_event=False):
    if spreading_states is None:
        spreading_states = list(SimulationState)
    # Creates an infected and a susceptible human
    sample_human_1 = Human.factory(covid_model=model, forced_age=20)
    sample_human_1.infection_status = InfectionStatus.INFECTED
    sample_human_1.infection_days_count = 1
    sample_human_1.infection_latency = 0
    assert sample_human_1.is_infected() and sample_human_1.is_contagious()
    sample_human_2 = Adult(covid_model=model,
                           age=50,
                           msp=0.05,
                           hsp=0.1,
                           mfd=False)
    sample_human_2.strid = 'human_2'
    sample_human_2.infection_status = InfectionStatus.SUSCEPTIBLE
    assert not sample_human_2.is_infected()
Exemple #5
0
    mask_user_rate=mask_user_rate,
    mask_efficacy=mask_efficacy,
    imune_rate=imune_rate,
    initial_infection_rate=initial_infection_rate,
    hospitalization_capacity=hospitalization_capacity,
    latency_period_mean=latency_period_mean,
    latency_period_stdev=latency_period_stdev,
    incubation_period_mean=incubation_period_mean,
    incubation_period_stdev=incubation_period_stdev,
    disease_period_mean=disease_period_mean,
    disease_period_stdev=disease_period_stdev,
    daily_interaction_count=daily_interaction_count,
    contagion_probability=contagion_probability,
    asymptomatic_isolation_rate=asymptomatic_isolation_rate,
    symptomatic_isolation_rate=symptomatic_isolation_rate)
set_parameters(scenario[sc]['parameters'])
scenario[sc]['model'] = CovidModel()
scenario[sc]['location'] = SimpleLocation(0, scenario[sc]['model'],
                                          population_size)

# ------------------------------------------------------------------------------

sc = 2  # Restrict the mobility only for infected people - no weareables
scenario[sc] = {}
scenario[sc]['parameters'] = SimulationParameters(
    weareable_adoption_rate=0.0,
    mask_user_rate=mask_user_rate,
    mask_efficacy=mask_efficacy,
    imune_rate=imune_rate,
    initial_infection_rate=initial_infection_rate,
    hospitalization_capacity=hospitalization_capacity,
Exemple #6
0
def multiple_runs(params,
                  population_size,
                  simulation_cycles,
                  num_runs=5,
                  seeds=[],
                  debug=False,
                  desired_stats=None,
                  fname="scenario",
                  listeners=[],
                  do_print=False,
                  home_grid_height=1,
                  home_grid_width=1,
                  work_height=1,
                  work_width=1,
                  school_height=1,
                  school_width=1):
    color = {
        'susceptible': 'lightblue',
        'infected': 'gray',
        'recovered': 'lightgreen',
        'death': 'black',
        'hospitalization': 'orange',
        'icu': 'red',
        'income': 'magenta'
    }
    if desired_stats is None:
        desired_stats = [
            "susceptible", "infected", "recovered", "hospitalization", "icu",
            "death", "income"
        ]
    randomlist = random.sample(range(10000),
                               num_runs) if len(seeds) == 0 else seeds
    if do_print:
        print("Save these seeds if you want to rerun a scenario")
        print(randomlist)

    all_runs = {}
    avg = {}
    last = {}
    peak = {}
    average = {}
    lower = {}
    upper = {}
    for stat in desired_stats:
        all_runs[stat] = {}
        avg[stat] = []
        last[stat] = []
        peak[stat] = []
        average[stat] = []
        upper[stat] = []
        lower[stat] = []
    for s in randomlist:
        paramcopy = copy.deepcopy(params)
        set_parameters(paramcopy)
        model = CovidModel(debug=debug)
        np.random.seed(s + 1)
        random.seed(s + 2)
        model.reset_randomizer(s)

        l = []
        ls = copy.deepcopy(listeners)
        for listener in ls:
            funct = listener.pop(0)
            listener[:0] = [model]
            l.append(globals()[funct](*listener))
        for k in l:
            model.add_listener(k)
        #for m in model.ls:
        #print(m)
        if debug:
            model.debug_each_n_cycles = 20
        setup_grid_layout(model, population_size, home_grid_height,
                          home_grid_width, work_height, work_width,
                          school_height, school_width)
        if do_print:
            print("run with seed {0}:".format(str(s)))
        statistics = BasicStatistics(model)
        model.add_listener(statistics)
        for i in range(simulation_cycles):
            model.step()
        for stat in desired_stats:
            all_runs[stat][s] = getattr(statistics, stat)
            if stat is "income":
                all_runs[stat][s].pop(1)
            avg[stat].append(np.mean(all_runs[stat][s]))
            last[stat].append(all_runs[stat][s][-1])
            peak[stat].append(max(all_runs[stat][s]))

    fig, ax = plt.subplots()
    ax.set_title('Contagion Evolution')
    ax.set_xlim((0, simulation_cycles))
    ax.set_ylim((-0.1, 1.1))
    ax.axhline(y=get_parameters().get('icu_capacity'),
               c="black",
               ls='--',
               label='Critical limit')

    for s in randomlist:
        adict = {stat: all_runs[stat][s] for stat in desired_stats}
        df = pd.DataFrame(data=adict)
        df.to_csv(fname + "-" + str(s) + ".csv")

    each_step = {}
    for stat in desired_stats:
        each_step[stat] = []
        for i in range(simulation_cycles):
            each_step[stat].append([all_runs[stat][s][i] for s in randomlist])
        for i in range(simulation_cycles):
            loweri, averagei, upperi = confidence_interval(each_step[stat][i],
                                                           confidence=0.95)
            lower[stat].append(loweri)
            average[stat].append(averagei)
            upper[stat].append(upperi)
        #print (stat)
        #print (lower[stat])
        #print (upper[stat])


#Plotting:
        ax.plot(lower[stat], color=color[stat], linewidth=2)  #mean curve.
        ax.plot(average[stat], color=color[stat], linewidth=2)
        ax.plot(upper[stat], color=color[stat], linewidth=2)
        ax.fill_between(simulation_cycles,
                        lower[stat],
                        upper[stat],
                        color=color[stat],
                        alpha=.1,
                        label=stat)  #std curves.

    ax.set_xlabel("Days")
    ax.set_ylabel("% of Population")
    handles, labels = ax.get_legend_handles_labels()
    ax.legend(handles, labels, loc='upper right')
    fig.show()
    fig.savefig(fname + ".png")

    if do_print:
        for stat, x in avg.items():
            print("using average of time series:")
            print("stats on {}:".format(stat))
            print("data: {}".format(x))
            print("min:")
            print(np.min(x))
            print("max:")
            print(np.max(x))
            print("std:")
            print(np.std(x))
            low, mean, high = confidence_interval(x, confidence=0.95)
            print("mean:")
            print(mean)
            print("median:")
            print(np.median(x))
            print("95% confidence interval for the mean:")
            print("({0},{1})".format(low, high))
        for stat, x in last.items():
            print("using last of time series:")
            print("stats on {}:".format(stat))
            print("data: {}".format(x))
            print("min:")
            print(np.min(x))
            print("max:")
            print(np.max(x))
            print("std:")
            print(np.std(x))
            low, mean, high = confidence_interval(x, confidence=0.95)
            print("mean:")
            print(mean)
            print("median:")
            print(np.median(x))
            print("95% confidence interval for the mean:")
            print("({0},{1})".format(low, high))
        for stat, x in peak.items():
            print("using peak of time series:")
            print("stats on {}:".format(stat))
            print("data: {}".format(x))
            print("min:")
            print(np.min(x))
            print("max:")
            print(np.max(x))
            print("std:")
            print(np.std(x))
            low, mean, high = confidence_interval(x, confidence=0.95)
            print("mean:")
            print(mean)
            print("median:")
            print(np.median(x))
            print("95% confidence interval for the mean:")
            print("({0},{1})".format(low, high))
    return avg.items, last.items, peak.items
Exemple #7
0
ICR = [0.3, 0.4, 0.5, 0.6, 0.7]
ICS = [0.3, 0.4, 0.5, 0.6, 0.7]

# Baseline

set_parameters(
    SimulationParameters(
        mask_user_rate=0.0,
        mask_efficacy=0.0,
        isolation_cheater_rate=0.0,
        isolation_cheating_severity=0.0,
        imune_rate=imune_rate,
        initial_infection_rate=initial_infection_rate,
        hospitalization_capacity=hospitalization_capacity,
        latency_period_mean=latency_period_mean,
        latency_period_stdev=latency_period_stdev,
        incubation_period_mean=incubation_period_mean,
        incubation_period_stdev=incubation_period_stdev,
        disease_period_mean=disease_period_mean,
        disease_period_stdev=disease_period_stdev,
        asymptomatic_isolation_rate=asymptomatic_isolation_rate,
        symptomatic_isolation_rate=symptomatic_isolation_rate,
        daily_interaction_count=daily_interaction_count,
        contagion_probability=contagion_probability))

sum = 0.0
for k in range(epochs):
    model = CovidModel()
    location = SimpleLocation(0, model, population_size)
    statistics = BasicStatistics(model)
Exemple #8
0
def multiple_runs(params,
                  population_size,
                  simulation_cycles,
                  num_runs=5,
                  seeds=None,
                  debug=False,
                  desired_stats=[
                      "susceptible", "infected", "recovered",
                      "hospitalization", "icu", "death", "income"
                  ],
                  do_print=False):

    randomlist = random.sample(range(10000),
                               num_runs) if seeds is None else seeds
    if (do_print):
        print("Save these seeds if you want to rerun a scenario")
        print(randomlist)

    all_runs = {}
    avg = {}
    last = {}
    peak = {}
    for stat in desired_stats:
        all_runs[stat] = {}
        avg[stat] = []
        last[stat] = []
        peak[stat] = []
    for s in randomlist:
        set_parameters(params)
        model = CovidModel(debug=debug)
        if debug:
            model.debug_each_n_cycles = 20
        np.random.seed(s + 1)
        random.seed(s + 2)
        setup_city_layout(model, population_size)
        if (do_print):
            print("run with seed {0}:".format(str(s)))
        model.reset_randomizer(s)
        statistics = BasicStatistics(model)
        model.add_listener(statistics)
        for i in range(simulation_cycles):
            model.step()
        for stat in desired_stats:
            all_runs[stat][s] = getattr(statistics, stat)
            avg[stat].append(np.mean(all_runs[stat][s]))
            last[stat].append(all_runs[stat][s][-1])
            peak[stat].append(max(all_runs[stat][s]))
    if (do_print):
        for stat, x in avg.items():
            print("using average of time series:")
            print("stats on {}:".format(stat))
            print("data: {}".format(x))
            print("min:")
            print(np.min(x))
            print("max:")
            print(np.max(x))
            print("std:")
            print(np.std(x))
            print("mean:")
            print(np.mean(x))
            print("median:")
            print(np.median(x))
            print("95% confidence interval for the mean:")
            low, high = confidence_interval(x, confidence=0.95)
            print("({0},{1})".format(low, high))
        for stat, x in last.items():
            print("using last of time series:")
            print("stats on {}:".format(stat))
            print("data: {}".format(x))
            print("min:")
            print(np.min(x))
            print("max:")
            print(np.max(x))
            print("std:")
            print(np.std(x))
            print("mean:")
            print(np.mean(x))
            print("median:")
            print(np.median(x))
            print("95% confidence interval for the mean:")
            low, high = confidence_interval(x, confidence=0.95)
            print("({0},{1})".format(low, high))
        for stat, x in peak.items():
            print("using peak of time series:")
            print("stats on {}:".format(stat))
            print("data: {}".format(x))
            print("min:")
            print(np.min(x))
            print("max:")
            print(np.max(x))
            print("std:")
            print(np.std(x))
            print("mean:")
            print(np.mean(x))
            print("median:")
            print(np.median(x))
            print("95% confidence interval for the mean:")
            low, high = confidence_interval(x, confidence=0.95)
            print("({0},{1})".format(low, high))
    return (avg.items, last.items, peak.items)