diff --git a/simulation/__main__.py b/simulation/__main__.py index b5f145e..8b275c3 100644 --- a/simulation/__main__.py +++ b/simulation/__main__.py @@ -189,6 +189,33 @@ def check_string_is_isoformat_datetime(string) -> str: return parser.parse_args(args) +def check_parsed_target_heat_pump_awareness( + campaigns: dict, initial_awareness: float +) -> bool: + """Determine whether target heat pump awareness increases over the model horizon + + Args: + campaigns (dict): modelled heat pump awareness campaigns + initial_awareness (float): initial (t=0) heat pump awareness + + Returns: + bool: True if target awareness values are set to increase over model horizon + """ + + campaigns_date_ordered = sorted(campaigns) + _, awareness_factors = zip(*campaigns_date_ordered) + awareness_factors = list(awareness_factors) + awareness_factors.insert(0, initial_awareness) + + increasing_awareness = all( + [ + awareness_factors[i - 1] < awareness_factors[i] + for i in range(1, len(awareness_factors)) + ] + ) + return increasing_awareness + + def validate_args(args): if args.gas_oil_boiler_ban_announce_date > args.gas_oil_boiler_ban_date: raise ValueError( @@ -197,15 +224,8 @@ def validate_args(args): if args.campaign_target_heat_pump_awareness_date is not None: # Check that target awareness inputs increase over the model horizon - campaigns = sorted(args.campaign_target_heat_pump_awareness_date) - _, awareness_factors = zip(*campaigns) - awareness_factors = list(awareness_factors) - awareness_factors.insert(0, args.heat_pump_awareness) - increasing_awareness = all( - [ - awareness_factors[i - 1] < awareness_factors[i] - for i in range(1, len(awareness_factors)) - ] + increasing_awareness = check_parsed_target_heat_pump_awareness( + args.campaign_target_heat_pump_awareness_date, args.heat_pump_awareness ) if not increasing_awareness: raise ValueError( diff --git a/simulation/tests/test_main.py b/simulation/tests/test_main.py index 464c28e..e6a8985 100644 --- a/simulation/tests/test_main.py +++ b/simulation/tests/test_main.py @@ -10,7 +10,11 @@ import simulation.__main__ from abm import read_jsonlines -from simulation.__main__ import parse_args, validate_args +from simulation.__main__ import ( + check_parsed_target_heat_pump_awareness, + parse_args, + validate_args, +) from simulation.constants import InterventionType @@ -305,5 +309,11 @@ def test_campaign_target_less_than_heat_pump_awareness_raises_value_error( "0.5", ] ) + + increasing_awareness = check_parsed_target_heat_pump_awareness( + args.campaign_target_heat_pump_awareness_date, args.heat_pump_awareness + ) + assert not increasing_awareness + with pytest.raises(ValueError): validate_args(args)