From ddab70a474cb9c584814b2f640fae3ae832279b7 Mon Sep 17 00:00:00 2001 From: ihopethiswillfi Date: Wed, 28 Mar 2018 15:07:25 +0200 Subject: [PATCH 1/4] Make batchrunner's variable_parameters optional. --- mesa/batchrunner.py | 99 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 77 insertions(+), 22 deletions(-) diff --git a/mesa/batchrunner.py b/mesa/batchrunner.py index b86f44845f4..a7d9381788c 100644 --- a/mesa/batchrunner.py +++ b/mesa/batchrunner.py @@ -45,7 +45,7 @@ class BatchRunner: entire DataCollector object. """ - def __init__(self, model_cls, variable_parameters=None, + def __init__(self, model_cls, variable_parameters={}, fixed_parameters=None, iterations=1, max_steps=1000, model_reporters=None, agent_reporters=None, display_progress=True): """ Create a new BatchRunner for a given model with the given @@ -98,6 +98,9 @@ def __init__(self, model_cls, variable_parameters=None, self.display_progress = display_progress def _process_parameters(self, params): + if params is None: + return None + params = copy.deepcopy(params) bad_names = [] for name, values in params.items(): @@ -110,30 +113,82 @@ def _process_parameters(self, params): def run_all(self): """ Run the model at all parameter combinations and store results. """ - param_names, param_ranges = zip(*self.variable_parameters.items()) run_count = count() total_iterations = self.iterations - for param_range in param_ranges: - total_iterations *= len(param_range) - with tqdm(total_iterations, disable=not self.display_progress) as pbar: - for param_values in product(*param_ranges): - kwargs = dict(zip(param_names, param_values)) - kwargs.update(self.fixed_parameters) - - for _ in range(self.iterations): - kwargscopy = copy.deepcopy(kwargs) - model = self.model_cls(**kwargscopy) - self.run_model(model) - # Collect and store results: + + if len(self.variable_parameters.keys()) > 0: + param_names, param_ranges = zip(*self.variable_parameters.items()) + for param_range in param_ranges: + total_iterations *= len(param_range) + + with tqdm(total_iterations, disable=not self.display_progress) as pbar: + for param_values in product(*param_ranges): + kwargs = dict(zip(param_names, param_values)) + kwargs.update(self.fixed_parameters) + + for _ in range(self.iterations): + self.run_iteration(kwargs, param_values, run_count) + ''' + kwargscopy = copy.deepcopy(kwargs) + model = self.model_cls(**kwargscopy) + self.run_model(model) + # Collect and store results: + model_key = param_values + (next(run_count),) + if self.model_reporters: + self.model_vars[model_key] = self.collect_model_vars(model) + if self.agent_reporters: + agent_vars = self.collect_agent_vars(model) + for agent_id, reports in agent_vars.items(): + agent_key = model_key + (agent_id,) + self.agent_vars[agent_key] = reports + ''' + pbar.update() + else: + kwargs = self.fixed_parameters + param_values = None + + for _ in range(self.iterations): + self.run_iteration(kwargs, param_values, run_count) + + ''' + kwargscopy = copy.deepcopy(kwargs) + model = self.model_cls(**kwargscopy) + self.run_model(model) + # Collect and store results: + if param_values is not None: model_key = param_values + (next(run_count),) - if self.model_reporters: - self.model_vars[model_key] = self.collect_model_vars(model) - if self.agent_reporters: - agent_vars = self.collect_agent_vars(model) - for agent_id, reports in agent_vars.items(): - agent_key = model_key + (agent_id,) - self.agent_vars[agent_key] = reports - pbar.update() + else: + model_key = (next(run_count),) + if self.model_reporters: + self.model_vars[model_key] = self.collect_model_vars(model) + if self.agent_reporters: + agent_vars = self.collect_agent_vars(model) + for agent_id, reports in agent_vars.items(): + agent_key = model_key + (agent_id,) + self.agent_vars[agent_key] = reports + ''' + + + def run_iteration(self, kwargs, param_values, run_count): + kwargscopy = copy.deepcopy(kwargs) + model = self.model_cls(**kwargscopy) + self.run_model(model) + + # Collect and store results: + if param_values is not None: + model_key = param_values + (next(run_count),) + else: + model_key = (next(run_count),) + + if self.model_reporters: + self.model_vars[model_key] = self.collect_model_vars(model) + if self.agent_reporters: + agent_vars = self.collect_agent_vars(model) + for agent_id, reports in agent_vars.items(): + agent_key = model_key + (agent_id,) + self.agent_vars[agent_key] = reports + + def run_model(self, model): """ Run a model object to completion, or until reaching max steps. From 202408381b9958132d25c97d25718e49638422ad Mon Sep 17 00:00:00 2001 From: ihopethiswillfi Date: Wed, 28 Mar 2018 15:11:53 +0200 Subject: [PATCH 2/4] cleanup temp code. --- mesa/batchrunner.py | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/mesa/batchrunner.py b/mesa/batchrunner.py index a7d9381788c..2a32461e341 100644 --- a/mesa/batchrunner.py +++ b/mesa/batchrunner.py @@ -98,9 +98,6 @@ def __init__(self, model_cls, variable_parameters={}, self.display_progress = display_progress def _process_parameters(self, params): - if params is None: - return None - params = copy.deepcopy(params) bad_names = [] for name, values in params.items(): @@ -128,20 +125,6 @@ def run_all(self): for _ in range(self.iterations): self.run_iteration(kwargs, param_values, run_count) - ''' - kwargscopy = copy.deepcopy(kwargs) - model = self.model_cls(**kwargscopy) - self.run_model(model) - # Collect and store results: - model_key = param_values + (next(run_count),) - if self.model_reporters: - self.model_vars[model_key] = self.collect_model_vars(model) - if self.agent_reporters: - agent_vars = self.collect_agent_vars(model) - for agent_id, reports in agent_vars.items(): - agent_key = model_key + (agent_id,) - self.agent_vars[agent_key] = reports - ''' pbar.update() else: kwargs = self.fixed_parameters @@ -149,24 +132,6 @@ def run_all(self): for _ in range(self.iterations): self.run_iteration(kwargs, param_values, run_count) - - ''' - kwargscopy = copy.deepcopy(kwargs) - model = self.model_cls(**kwargscopy) - self.run_model(model) - # Collect and store results: - if param_values is not None: - model_key = param_values + (next(run_count),) - else: - model_key = (next(run_count),) - if self.model_reporters: - self.model_vars[model_key] = self.collect_model_vars(model) - if self.agent_reporters: - agent_vars = self.collect_agent_vars(model) - for agent_id, reports in agent_vars.items(): - agent_key = model_key + (agent_id,) - self.agent_vars[agent_key] = reports - ''' def run_iteration(self, kwargs, param_values, run_count): From 9bad3353f0b8f503da453bcac8726397bcf1fa50 Mon Sep 17 00:00:00 2001 From: ihopethiswillfi Date: Wed, 28 Mar 2018 15:19:53 +0200 Subject: [PATCH 3/4] re-added progressbar when there are no variable parameters. --- mesa/batchrunner.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mesa/batchrunner.py b/mesa/batchrunner.py index 2a32461e341..2f2234f7a4e 100644 --- a/mesa/batchrunner.py +++ b/mesa/batchrunner.py @@ -130,8 +130,10 @@ def run_all(self): kwargs = self.fixed_parameters param_values = None - for _ in range(self.iterations): - self.run_iteration(kwargs, param_values, run_count) + with tqdm(total_iterations, disable=not self.display_progress) as pbar: + for _ in range(self.iterations): + self.run_iteration(kwargs, param_values, run_count) + pbar.update() def run_iteration(self, kwargs, param_values, run_count): From 5a56c11ebdb6404c3605d8032a31a57c87659d66 Mon Sep 17 00:00:00 2001 From: ihopethiswillfi Date: Wed, 28 Mar 2018 15:41:22 +0200 Subject: [PATCH 4/4] cleanup whitespace. --- mesa/batchrunner.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/mesa/batchrunner.py b/mesa/batchrunner.py index 2f2234f7a4e..4c3a49153b7 100644 --- a/mesa/batchrunner.py +++ b/mesa/batchrunner.py @@ -134,7 +134,6 @@ def run_all(self): for _ in range(self.iterations): self.run_iteration(kwargs, param_values, run_count) pbar.update() - def run_iteration(self, kwargs, param_values, run_count): kwargscopy = copy.deepcopy(kwargs) @@ -155,8 +154,6 @@ def run_iteration(self, kwargs, param_values, run_count): agent_key = model_key + (agent_id,) self.agent_vars[agent_key] = reports - - def run_model(self, model): """ Run a model object to completion, or until reaching max steps.