Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/policyengine/utils/parametric_reforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,18 @@ def modifier(simulation):
start=start_period,
stop=stop_period,
)

# Clear caches so calculations use updated parameter values
simulation.tax_benefit_system.reset_parameter_caches()

# Clear computed variable caches (but preserve input variables)
# Variables with formulas are computed; those without are inputs
for population in simulation.populations.values():
for var_name, holder in population._holders.items():
variable = simulation.tax_benefit_system.get_variable(var_name)
if variable.formulas: # Only clear computed variables
holder.delete_arrays()

return simulation

return modifier
68 changes: 68 additions & 0 deletions tests/test_parametric_reforms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
"""Test that parameter reforms are applied correctly."""

from datetime import datetime

from policyengine.core.policy import ParameterValue as PEParameterValue
from policyengine.core.policy import Policy as PEPolicy
from policyengine.tax_benefit_models.uk import uk_latest
from policyengine.tax_benefit_models.uk.analysis import (
UKHouseholdInput,
calculate_household_impact,
)


def test_parameter_reform_affects_calculation():
"""Test that modifying a parameter actually changes the calculation result."""
param_lookup = {p.name: p for p in uk_latest.parameters}
pe_param = param_lookup["gov.dwp.universal_credit.standard_allowance.amount.SINGLE_OLD"]

pe_input = UKHouseholdInput(
people=[{"age": 30, "employment_income": 0}],
benunit={},
household={},
year=2026,
)

# Baseline
baseline = calculate_household_impact(pe_input, policy=None)
baseline_uc = baseline.benunit[0]["universal_credit"]

# Reform - increase standard allowance
pv = PEParameterValue(
parameter=pe_param,
value=533.0,
start_date=datetime(2026, 1, 1),
end_date=None,
)
policy = PEPolicy(name="Test", description="Test", parameter_values=[pv])
reform = calculate_household_impact(pe_input, policy=policy)
reform_uc = reform.benunit[0]["universal_credit"]

# UC should increase
assert reform_uc > baseline_uc
assert abs(reform_uc - 533 * 12) < 1


def test_parameter_reform_preserves_inputs():
"""Test that input variables are preserved when applying a reform."""
param_lookup = {p.name: p for p in uk_latest.parameters}
pe_param = param_lookup["gov.dwp.universal_credit.standard_allowance.amount.SINGLE_OLD"]

pe_input = UKHouseholdInput(
people=[{"age": 30, "employment_income": 5000}],
benunit={},
household={},
year=2026,
)

pv = PEParameterValue(
parameter=pe_param,
value=533.0,
start_date=datetime(2026, 1, 1),
end_date=None,
)
policy = PEPolicy(name="Test", description="Test", parameter_values=[pv])
reform = calculate_household_impact(pe_input, policy=policy)

assert reform.person[0]["employment_income"] == 5000
assert reform.person[0]["age"] == 30