diff --git a/simulatingrisk/hawkdove/model.py b/simulatingrisk/hawkdove/model.py index 35e80f8..a7ede81 100644 --- a/simulatingrisk/hawkdove/model.py +++ b/simulatingrisk/hawkdove/model.py @@ -218,6 +218,21 @@ def __init__( random_play_odds=0.00, ): super().__init__() + # check parameters for combinations that aren't allowed together + if grid_size < 5: + if play_neighborhood > 8: + raise ValueError( + "Play neighborhood %d is too large for grid size %d", + play_neighborhood, + grid_size, + ) + if observed_neighborhood > 8: + raise ValueError( + "Observed neighborhood %d is too large for grid size %d", + observed_neighborhood, + grid_size, + ) + # assume a fully-populated square grid self.num_agents = grid_size * grid_size for nsize in [play_neighborhood, observed_neighborhood]: diff --git a/tests/test_hawkdove.py b/tests/test_hawkdove.py index 8d040f4..3cbce31 100644 --- a/tests/test_hawkdove.py +++ b/tests/test_hawkdove.py @@ -27,6 +27,15 @@ def test_agent_neighbors(): assert all([len(agent.play_neighbors) == 24 for agent in model.schedule.agents]) +def test_bad_gridsize(): + # anything less than 5 should not allow play neighborhood of 24 + for grid_size in [3, 4]: + with pytest.raises(ValueError): + HawkDoveSingleRiskModel(3, play_neighborhood=24, agent_risk_level=5) + with pytest.raises(ValueError): + HawkDoveSingleRiskModel(3, observed_neighborhood=24, agent_risk_level=5) + + def test_agent_initial_choice(): grid_size = 100 model = HawkDoveSingleRiskModel(grid_size, agent_risk_level=5) @@ -101,7 +110,7 @@ def test_observed_neighborhood_size(): assert model.observed_neighborhood == 4 model = HawkDoveSingleRiskModel(3, observed_neighborhood=8, **opts) assert model.observed_neighborhood == 8 - model = HawkDoveSingleRiskModel(3, observed_neighborhood=24, **opts) + model = HawkDoveSingleRiskModel(5, observed_neighborhood=24, **opts) assert model.observed_neighborhood == 24 with pytest.raises(ValueError): HawkDoveSingleRiskModel(3, observed_neighborhood=23, **opts) @@ -207,7 +216,7 @@ def test_agent_choose_when_observe_play_differ(): # confirm that adjusted value is used to determine play model = HawkDoveSingleRiskModel( - 4, agent_risk_level=3, observed_neighborhood=24, play_neighborhood=8 + 5, agent_risk_level=3, observed_neighborhood=24, play_neighborhood=8 ) agent = HawkDoveSingleRiskAgent(3, model) with patch.object(HawkDoveAgent, "num_dove_neighbors", 5):