def input_models(fight_slope: float, move_scale: float, move_shape: float, encounter_rate: float, alpha_ss: float, alpha_rr: float, beta_ss: float, beta_rr: float) -> list: """ Create the input models Args: fight_slope: slope of a fight move_scale: movement scale parameter move_shape: movement shape parameter encounter_rate: encounter rate constant alpha_ss: growth rate ss alpha_rr: growth rate rr beta_ss: cost ss beta_rr: cost rr Returns: """ return [ growth.max_gut(), growth.growth(alpha_ss, alpha_rr, beta_ss, beta_rr, dominance), init_bio.init_num(param.lam_0_egg), init_bio.init_mass(param.mu_0_egg_ss, param.mu_0_egg_rr, param.sig_0_egg_ss, param.sig_0_egg_rr, dominance), init_bio.init_juvenile(44.194, 18.947, 0.552, 0.17, dominance), init_bio.init_mature(param.mu_0_mature_ss, param.mu_0_mature_rr, param.sig_0_mature_ss, param.sig_0_mature_rr, dominance), init_bio.init_plant(param.mu_leaf, param.sig_leaf), repro.init_sex(param.female_prob), move.larva(move_scale, move_shape), forage.adlibitum(param.forage_steps), forage.egg(param.egg_factor), forage.larva(param.larva_factor), forage.fight(fight_slope), forage.radius(param.cannibalism_radius), forage.encounter(encounter_rate) ]
param.mu_0_mature_rr, param.sig_0_mature_ss, param.sig_0_mature_rr, dominance), init_bio.init_plant(param.mu_leaf, param.sig_leaf), develop.egg_dev(param.mu_egg_dev, param.sig_egg_dev), develop.larva_dev(param.mu_larva_dev_ss, param.mu_larva_dev_rr, param.sig_larva_dev_ss, param.sig_larva_dev_rr, dominance), develop.pupa_dev(param.mu_pupa_dev, param.sig_pupa_dev), forage.adlibitum(param.forage_steps), forage.egg(param.egg_factor), forage.larva(param.larva_factor), forage.fight(param.fight_slope), forage.encounter(cannib), forage.radius(param.cannibalism_radius), move.larva(param.larva_scale, param.larva_shape), move.adult(param.adult_scale, param.adult_shape), repro.mating(param.mate_encounter), repro.radius(param.mate_radius), repro.fecundity(param.fecundity_maximum, param.fecundity_decay), repro.density(param.eta, param.gamma),
class Simulator(object): """ Class to setup and run a simulation of only biomass growth: Variables: nums: initial population numbers forage: the plant forage model """ grid = [(keyword.hexagon, 1, 1, True), (keyword.hexagon, 1, 1, True)] attrs = {1: tracking.genotype_attrs} data = (np.inf,) emigration = [] immigration = [] input_models = [growth.max_gut(), growth.growth(param.alpha_ss, param.alpha_rr, param.beta_ss, param.beta_rr, dominance), init_bio.init_num(param.lam_0_egg), init_bio.init_mass(param.mu_0_egg_ss, param.mu_0_egg_rr, param.sig_0_egg_ss, param.sig_0_egg_rr, dominance), init_bio.init_juvenile(param.mu_0_larva_ss, param.mu_0_larva_rr, param.sig_0_larva_ss, param.sig_0_larva_rr, dominance), init_bio.init_mature(param.mu_0_mature_ss, param.mu_0_mature_rr, param.sig_0_mature_ss, param.sig_0_mature_rr, dominance), init_bio.init_plant(param.mu_leaf, param.sig_leaf), forage.adlibitum(1), sex_model, dev.egg_dev(param.mu_egg_dev, param.sig_egg_dev), dev.pupa_dev(param.mu_pupa_dev, param.sig_pupa_dev)] input_variables = param.repro_values nums: hint.init_pops bt_prop: float steps: hint.step_tuples offset_ss: float = 0 offset_rr: float = 0 simulation: hint.simulation = None def __post_init__(self): larva_dev = dev.larva_dev(param.mu_larva_dev_ss - self.offset_ss, param.mu_larva_dev_rr - self.offset_rr, param.sig_larva_dev_ss, param.sig_larva_dev_rr, dominance) input_models = self.input_models.copy() input_models.append(larva_dev) self.simulation = main_simulation.Simulation. \ setup(self.nums, self.grid, self.attrs, self.data, self.bt_prop, self.steps, self.emigration, self.immigration, *input_models, **self.input_variables) def collect(self) -> dict: """ Collect a list of masses Returns: list of all masses in system """ larvae = self.simulation.agents.agents(keyword.pupa) values = { keyword.homo_r: [], keyword.hetero: [], keyword.homo_s: [], } for agent in larvae: # noinspection PyUnresolvedReferences values[agent.genotype].append(agent.mass) return values def run(self, times: list) -> None: """ Run the simulation for each time Args: times: the times for the simulation Returns: biomass data """ for _ in times[1:]: self.simulation.step()
fin_time_homo_s = mdl.Span(location=fin_point_ss[0], dimension='height', line_color=colors[1], line_width=line_width, line_dash='dotted') fin_mass_homo_s = mdl.Span(location=fin_point_ss[1], dimension='width', line_color=colors[1], line_width=line_width, line_dash='dotted') t = list(range(num_steps)) initial_pops = ((0, 0, 0), (1, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 0)) print('{} Running Dominance: {}'.format(datetime.datetime.now(), param.dominance_0)) simulator_dom_0 = Simulator(initial_pops, 1, forage.adlibitum(1), param.alpha_ss, param.alpha_rr, param.beta_ss, param.beta_rr, param.dominance_0) bio_dom_0 = simulator_dom_0.run(t) bio_dom_0_homo_r = bio_dom_0[:, 0] bio_dom_0_hetero = bio_dom_0[:, 1] bio_dom_0_homo_s = bio_dom_0[:, 2] print('{} Running Dominance: {}'.format(datetime.datetime.now(), param.dominance_1)) simulator_dom_1 = Simulator(initial_pops, 1, forage.adlibitum(1), param.alpha_ss, param.alpha_rr, param.beta_ss, param.beta_rr, param.dominance_1) bio_dom_1 = simulator_dom_1.run(t) bio_dom_1_homo_r = bio_dom_1[:, 0] bio_dom_1_hetero = bio_dom_1[:, 1] bio_dom_1_homo_s = bio_dom_1[:, 2]
class Simulator(object): """ Class to setup and run a simulation of only biomass growth: Variables: nums: initial population numbers forage: the plant forage model """ grid = [(keyword.hexagon, 1, 1, True), graph.graph(10)] attrs = {1: tracking.genotype_attrs} data = (np.inf, ) steps = [({ keyword.larva: [keyword.move, keyword.consume] }, param.forage_steps), ({ keyword.larva: [keyword.grow, keyword.reset] }, )] emigration = [] immigration = [] input_models = [ growth.max_gut(), growth.growth(param.alpha_ss, param.alpha_rr, param.beta_ss, param.beta_rr, dominance), init_bio.init_num(param.lam_0_egg), init_bio.init_mass(param.mu_0_egg_ss, param.mu_0_egg_rr, param.sig_0_egg_ss, param.sig_0_egg_rr, dominance), init_bio.init_juvenile(44.194, 18.947, 0.552, 0.17, dominance), init_bio.init_mature(param.mu_0_mature_ss, param.mu_0_mature_rr, param.sig_0_mature_ss, param.sig_0_mature_rr, dominance), init_bio.init_plant(param.mu_leaf, param.sig_leaf), repro.init_sex(param.female_prob), move.larva(param.larva_scale, param.larva_shape), forage.adlibitum(param.forage_steps), forage.egg(param.egg_factor), forage.larva(param.larva_factor), forage.fight(param.fight_slope), forage.radius(param.cannibalism_radius), # forage.loss(param.loss_slope, # param.mid, # param.egg_factor, # param.larva_factor) ] input_variables = param.repro_values nums: hint.init_pops bt_prop: float encounter: float simulation: hint.simulation = None def __post_init__(self): input_models = self.input_models.copy() input_models.append(forage.encounter(self.encounter)) self.simulation = main_simulation.Simulation. \ setup(self.nums, self.grid, self.attrs, self.data, self.bt_prop, self.steps, self.emigration, self.immigration, *input_models, **self.input_variables) def run_sim(self, times: list) -> None: """ Run the simulation for each time Args: times: the times for the simulation Returns: biomass data """ for _ in times[1:]: self.simulation.step() def get_start_data(self, data_key: str) -> int: """ Get the start population of larvae Args: data_key: the genotype table key Returns: the number of larvae at start """ dataframes = self.simulation.agents.dataframes() larva = dataframes['(0, 0)_larva'] column = larva[data_key] return int(column[0]) def get_final_data(self, data_key: str) -> int: """ Get the final population of larvae Args: data_key: the genotype table key Returns: the number of larvae at the end """ dataframes = self.simulation.agents.dataframes() timestep = self.simulation.timestep pupa = dataframes['(0, 0)_larva'] column = pupa[data_key] value = column[timestep] return int(value) @classmethod def run(cls, rho: float, times: list, data_key: str, nums: hint.init_pops) -> tuple: """ Run a bunch of trials Args: rho: encounter constant times: time interval data_key: column key nums: init_population Returns: value of cannibalism rate constant """ print(' {} Starting run for rho: {}'.format(datetime.datetime.now(), rho)) start_data = [] end_data = [] for trial_num in range(trials): print(' {} running trial: {}'.format( datetime.datetime.now(), trial_num)) sim = cls(nums, 1, rho) sim.run_sim(times) start_data.append(sim.get_start_data(data_key)) end_data.append(sim.get_final_data(data_key)) start_pop = np.mean(start_data) end_pop = np.mean(end_data) start_lower = np.percentile(start_data, 2.5) start_upper = np.percentile(start_data, 97.5) end_lower = np.percentile(end_data, 2.5) end_upper = np.percentile(end_data, 97.5) prop = end_pop / start_pop prop_lower = end_lower / start_lower prop_upper = end_upper / start_upper rate = 1 - prop rate_lower = 1 - prop_lower rate_upper = 1 - prop_upper return prop, prop_lower, prop_upper, rate, rate_lower, rate_upper @classmethod def rho(cls, rhos: np.array, times: list, data_key: str, nums: hint.init_pops) -> tuple: """ Run trials for each rho value Args: rhos: list of encounter constants times: time interval data_key: data key nums: init population Returns: list of corresponding values for cannibalism """ prop = [] prop_lower = [] prop_upper = [] rate = [] rate_lower = [] rate_upper = [] for rho in rhos: rho_prop, rho_prop_lower, rho_prop_upper, \ rho_rate, rho_rate_lower, rho_rate_upper = \ cls.run(rho, times, data_key, nums) prop.append(rho_prop) prop_lower.append(rho_prop_lower) prop_upper.append(rho_prop_upper) rate.append(rho_rate) rate_lower.append(rho_rate_lower) rate_upper.append(rho_rate_upper) return prop, prop_lower, prop_upper, rate, rate_lower, rate_upper
euler_plot.legend.location = "bottom_right" euler_plot.title.text_font_size = title_font_size euler_plot.legend.label_text_font_size = legend_font_size euler_plot.yaxis.axis_line_width = axis_line_width euler_plot.xaxis.axis_line_width = axis_line_width euler_plot.yaxis.axis_label_text_font_size = axis_font_size euler_plot.xaxis.axis_label_text_font_size = axis_font_size euler_plot.yaxis.major_label_text_font_size = axis_tick_font_size euler_plot.xaxis.major_label_text_font_size = axis_tick_font_size euler_plot.ygrid.grid_line_width = grid_line_width euler_plot.xgrid.grid_line_width = grid_line_width initial_pops = ((0, 0, 0), (1, 1, 1), (0, 0, 0), (0, 0, 0), (0, 0, 0)) simulator_bt = Simulator(initial_pops, 1, forage.adlibitum(1)) biomass_bt = simulator_bt.run(t) biomass_bt_homo_r = biomass_bt[:, 0] biomass_bt_hetero = biomass_bt[:, 1] biomass_bt_homo_s = biomass_bt[:, 2] rk4_plot = plt.figure(plot_width=plot_width, plot_height=plot_height) rk4_plot.title.text = 'Simulation of Growth, Runge-Kutta 4' rk4_plot.yaxis.axis_label = 'biomass (mg)' rk4_plot.xaxis.axis_label = 'time (days)' rk4_plot.add_layout(fin_time_homo_r) rk4_plot.add_layout(fin_mass_homo_r) rk4_plot.add_layout(fin_time_homo_s) rk4_plot.add_layout(fin_mass_homo_s)