policyengine-uk 2.42.0__py3-none-any.whl → 2.43.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,7 +16,7 @@ reforms:
16
16
  parameters:
17
17
  gov.hmrc.child_benefit.amount.additional: 25
18
18
  - name: Reduce Universal Credit taper rate to 20%
19
- expected_impact: -36.7
19
+ expected_impact: -38.4
20
20
  parameters:
21
21
  gov.dwp.universal_credit.means_test.reduction_rate: 0.2
22
22
  - name: Raise Class 1 main employee NICs rate to 10%
@@ -0,0 +1,184 @@
1
+ from pydantic import BaseModel
2
+ from typing import Optional, Callable, Dict, Type, Union
3
+ from policyengine_core.simulations import Simulation
4
+ from policyengine_core.reforms import Reform
5
+
6
+
7
+ class Scenario(BaseModel):
8
+ """Represents a scenario configuration for policy simulations.
9
+
10
+ A scenario can include parameter changes and/or simulation modifications
11
+ that are applied before running a simulation. Scenarios can be combined
12
+ using the + operator.
13
+ """
14
+
15
+ parameter_changes: Optional[
16
+ Dict[
17
+ str,
18
+ Union[
19
+ int,
20
+ float,
21
+ bool,
22
+ Dict[Union[str, int], Union[int, float, bool]],
23
+ ],
24
+ ]
25
+ ] = None
26
+ """A dictionary of parameter changes to apply to the simulation. These are applied *before* parameter operations."""
27
+
28
+ simulation_modifier: Optional[Callable[["Simulation"], None]] = None
29
+ """A function that modifies the simulation before running it."""
30
+
31
+ class Config:
32
+ """Pydantic configuration."""
33
+
34
+ arbitrary_types_allowed = True # Allow Callable types
35
+
36
+ def __add__(self, other: "Scenario") -> "Scenario":
37
+ """Combine two scenarios by merging parameter changes and chaining modifiers.
38
+
39
+ Args:
40
+ other: Another Scenario to combine with this one
41
+
42
+ Returns:
43
+ A new Scenario with merged parameter changes and combined modifiers
44
+ """
45
+ # Merge parameter changes (other's changes take precedence in conflicts)
46
+ merged_params = {}
47
+
48
+ if self.parameter_changes:
49
+ merged_params.update(self.parameter_changes)
50
+
51
+ if other.parameter_changes:
52
+ for key, value in other.parameter_changes.items():
53
+ if (
54
+ key in merged_params
55
+ and isinstance(merged_params[key], dict)
56
+ and isinstance(value, dict)
57
+ ):
58
+ # Deep merge nested dictionaries
59
+ merged_params[key] = {**merged_params[key], **value}
60
+ else:
61
+ # Simple override
62
+ merged_params[key] = value
63
+
64
+ # Chain simulation modifiers
65
+ combined_modifier = None
66
+
67
+ if self.simulation_modifier and other.simulation_modifier:
68
+ # Both have modifiers - chain them
69
+ def combined_modifier(simulation: Simulation) -> None:
70
+ self.simulation_modifier(simulation)
71
+ other.simulation_modifier(simulation)
72
+
73
+ elif self.simulation_modifier:
74
+ combined_modifier = self.simulation_modifier
75
+ elif other.simulation_modifier:
76
+ combined_modifier = other.simulation_modifier
77
+
78
+ # Return new scenario with merged configuration
79
+ return Scenario(
80
+ parameter_changes=merged_params if merged_params else None,
81
+ simulation_modifier=combined_modifier,
82
+ )
83
+
84
+ @classmethod
85
+ def from_reform(
86
+ cls, reform: Union[tuple, dict, Type[Reform]]
87
+ ) -> "Scenario":
88
+ """Create a Scenario from various reform representations.
89
+
90
+ Args:
91
+ reform: Can be:
92
+ - A Reform class type (will be applied via simulation modifier)
93
+ - A dict of parameter changes
94
+ - A tuple (treated as a Reform for backward compatibility)
95
+
96
+ Returns:
97
+ A new Scenario configured with the reform
98
+
99
+ Raises:
100
+ ValueError: If reform type is not supported
101
+ """
102
+ if isinstance(reform, type) and issubclass(reform, Reform):
103
+ # Reform class - create modifier function
104
+ def modifier(simulation: Simulation) -> None:
105
+ reform_instance = reform()
106
+ reform_instance.apply(simulation.tax_benefit_system)
107
+
108
+ return cls(
109
+ simulation_modifier=modifier,
110
+ )
111
+
112
+ elif isinstance(reform, dict):
113
+ # Dictionary of parameter changes
114
+ return cls(
115
+ parameter_changes=reform,
116
+ )
117
+
118
+ elif isinstance(reform, tuple):
119
+ # Tuple format (legacy support) - treat as a Reform class
120
+ # Assuming the tuple contains (reform_class, *args)
121
+ if (
122
+ len(reform) > 0
123
+ and isinstance(reform[0], type)
124
+ and issubclass(reform[0], Reform)
125
+ ):
126
+ reform_class = reform[0]
127
+ reform_args = reform[1:] if len(reform) > 1 else ()
128
+
129
+ def modifier(simulation: Simulation) -> None:
130
+ reform_instance = reform_class(*reform_args)
131
+ reform_instance.apply(simulation.tax_benefit_system)
132
+
133
+ return cls(
134
+ simulation_modifier=modifier,
135
+ )
136
+ else:
137
+ raise ValueError(f"Invalid tuple format for reform: {reform}")
138
+
139
+ else:
140
+ raise ValueError(
141
+ f"Unsupported reform type: {type(reform)}. "
142
+ "Expected Reform class, dict, or tuple."
143
+ )
144
+
145
+ def apply(self, simulation: Simulation) -> None:
146
+ """Apply this scenario to a simulation.
147
+
148
+ First applies parameter changes, then runs the simulation modifier if present.
149
+
150
+ Args:
151
+ simulation: The simulation to modify
152
+ """
153
+ # Apply parameter changes first
154
+ if self.parameter_changes:
155
+ for path, value in self.parameter_changes.items():
156
+ if isinstance(value, dict):
157
+ # Handle nested parameter changes
158
+ for sub_path, sub_value in value.items():
159
+ full_path = f"{path}.{sub_path}"
160
+ simulation.tax_benefit_system.parameters.update(
161
+ full_path,
162
+ period=None, # Apply to all periods
163
+ value=sub_value,
164
+ )
165
+ else:
166
+ # Simple parameter change
167
+ simulation.tax_benefit_system.parameters.update(
168
+ path, period=None, value=value # Apply to all periods
169
+ )
170
+
171
+ # Then apply simulation modifier
172
+ if self.simulation_modifier:
173
+ self.simulation_modifier(simulation)
174
+
175
+ def __repr__(self) -> str:
176
+ """String representation of the Scenario."""
177
+ parts = []
178
+ if self.parameter_changes:
179
+ parts.append(
180
+ f"parameter_changes={len(self.parameter_changes)} items"
181
+ )
182
+ if self.simulation_modifier:
183
+ parts.append("simulation_modifier=<function>")
184
+ return f"Scenario({', '.join(parts)})"
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.43.0] - 2025-07-26 11:31:02
9
+
10
+ ### Added
11
+
12
+ - Scenario class for reforms.
13
+ - Documentation of Scenario and Simulation.
14
+ - Standardisation of uprating behaviour.
15
+
8
16
  ## [2.42.0] - 2025-07-25 08:57:23
9
17
 
10
18
  ### Changed
@@ -2022,6 +2030,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2022
2030
 
2023
2031
 
2024
2032
 
2033
+ [2.43.0]: https://github.com/PolicyEngine/openfisca-uk/compare/2.42.0...2.43.0
2025
2034
  [2.42.0]: https://github.com/PolicyEngine/openfisca-uk/compare/2.41.4...2.42.0
2026
2035
  [2.41.4]: https://github.com/PolicyEngine/openfisca-uk/compare/2.41.3...2.41.4
2027
2036
  [2.41.3]: https://github.com/PolicyEngine/openfisca-uk/compare/2.41.2...2.41.3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine-uk
3
- Version: 2.42.0
3
+ Version: 2.43.0
4
4
  Summary: PolicyEngine tax and benefit system for the UK
5
5
  Project-URL: Homepage, https://github.com/PolicyEngine/policyengine-uk
6
6
  Project-URL: Repository, https://github.com/PolicyEngine/policyengine-uk
@@ -15,7 +15,7 @@ Classifier: Operating System :: POSIX
15
15
  Classifier: Programming Language :: Python
16
16
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
17
17
  Requires-Python: >=3.10
18
- Requires-Dist: microdf-python==0.4.4
18
+ Requires-Dist: microdf-python>=1.0.0
19
19
  Requires-Dist: policyengine-core>=3.6.4
20
20
  Provides-Extra: dev
21
21
  Requires-Dist: black; extra == 'dev'
@@ -1,12 +1,11 @@
1
1
  policyengine_uk/__init__.py,sha256=ud1uvjBep-lcZKBWUd0eo-PAT_FM92_PqUlDp5OYl4g,355
2
2
  policyengine_uk/entities.py,sha256=9yUbkUWQr3WydNE-gHhUudG97HGyXIZY3dkgQ6Z3t9A,1212
3
- policyengine_uk/model_api.py,sha256=D5OuQpQbdBXiF6r7LvCLWjsTkAWtkeBJWz2ebsJ-GN0,189
3
+ policyengine_uk/model_api.py,sha256=KdwJCL2HkXVxDpL6fCsCnQ9Sub6Kqp7Hyxlis3MNIx4,241
4
4
  policyengine_uk/modelled_policies.yaml,sha256=TLhvmkuI9ip-Fjq63n66RzDErCkN8K4BzY6XLxLMtFg,463
5
- policyengine_uk/repo.py,sha256=-dqpIMUD7UUj94ql9XwaMrFJUYKvNhFQ_9uj83Z8uh0,55
6
- policyengine_uk/system.py,sha256=jfMN-0cDBMsbqIgTenRxCblSY3o69YIeSWGFaBgF76s,9719
5
+ policyengine_uk/system.py,sha256=OooTAxHpzh4H5k8rWiH_qE4SooBomn-pjZnk4UvVR8A,21813
7
6
  policyengine_uk/data/__init__.py,sha256=J0bZ3WnvPzZ4qfVLYcwOc4lziMUMdbcMqJ3xwjoekbM,101
8
- policyengine_uk/data/dataset_schema.py,sha256=aiBxxEwuYQ5TobkX1U8PM0sQK9c58MGJHnHfL2Aymso,8215
9
- policyengine_uk/data/economic_assumptions.py,sha256=ZZ0sXqhYKjfCkcMZhutZgnvI3cWqC_wfwWocMWpniso,5697
7
+ policyengine_uk/data/dataset_schema.py,sha256=4SPUqDmzTsmmWFaJIlpDzT7J6WvBDgxRPfUnbjjtFuQ,9854
8
+ policyengine_uk/data/economic_assumptions.py,sha256=4ZmE6z8Bbf21n0Hm-IpsS04Astg2NJAypv9TdA_udEk,6189
10
9
  policyengine_uk/data/uprating_indices.yaml,sha256=kQtfeGWyqge4dbJhs0iF4kTMqovuegill_Zfs8orJi4,2394
11
10
  policyengine_uk/parameters/gov/README.md,sha256=bHUep1_2pLHD3Or8SwjStOWXDIbW9OuYxOd4ml8IXcM,13
12
11
  policyengine_uk/parameters/gov/benefit_uprating_cpi.yaml,sha256=2zOSdJeUhDZYYsKE2vLkcK-UbKNoOSVwfac0QIAp02g,250
@@ -314,7 +313,7 @@ policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_incom
314
313
  policyengine_uk/parameters/gov/economic_assumptions/create_economic_assumption_indices.py,sha256=Z4dYghSit5gXo4V3wBpnLIc9zgTX4cfEyb_TUlJkTGY,1937
315
314
  policyengine_uk/parameters/gov/economic_assumptions/lag_average_earnings.py,sha256=ksHcyUQkLAJmKizCeSg8j0hzPc7ajgIvbExWLgCra4U,701
316
315
  policyengine_uk/parameters/gov/economic_assumptions/lag_cpi.py,sha256=IdtaMLN1_OSu-RFZsQV8vBlbOvXsPlnNlsOuinRHrxg,642
317
- policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml,sha256=EpUOWaZWE18wJtDbutGPEy9YwoaRJsYO-fDpCydZ7eY,17708
316
+ policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml,sha256=k2xxY4YvioJ0agEOHwebcEWVwQbgePrnXO1dvogGWCs,17673
318
317
  policyengine_uk/parameters/gov/hmrc/README.md,sha256=nkHVZl6lsjI93sR8uC7wAbul3_61wJrsP08iaW8f5lk,7
319
318
  policyengine_uk/parameters/gov/hmrc/minimum_wage.yaml,sha256=1oMbevU0ESHR51mcAG39POd1DA1FgPUep4hL6ojj-P4,2049
320
319
  policyengine_uk/parameters/gov/hmrc/business_rates/README.md,sha256=9ud50i_gMjGj6VymF-nzFDTzkFRMMJx6ybpLwbWzvpI,17
@@ -526,10 +525,14 @@ policyengine_uk/reforms/cps/marriage_tax_reforms.py,sha256=UK7fTMoa4Xh2IvkT3wRDw
526
525
  policyengine_uk/reforms/policyengine/__init__.py,sha256=5ubEO0DGRBXhn3QRSoBNT-jff9ORb4dd2J6FYNpSEik,42
527
526
  policyengine_uk/reforms/policyengine/adjust_budgets.py,sha256=p1NbFB7wwfC_jRdeVLbClHm3MOvRO-gKmU7PzY2zJv8,2084
528
527
  policyengine_uk/reforms/policyengine/disable_simulated_benefits.py,sha256=siEs1EpSHCm5-4CJKwGdDm9jArscd6kVM39JUrFTPlE,2524
528
+ policyengine_uk/scenarios/__init__.py,sha256=_Ci6FeBm6tEiv5LUVsn70ubBftSFlaNZXcc--epBdQM,156
529
+ policyengine_uk/scenarios/pip_reform.py,sha256=fv6-HCuRxhzt-XEYv9yLJTEliAWu3EGx6duADSBO4n8,687
530
+ policyengine_uk/scenarios/reindex_benefit_cap.py,sha256=dPUOsTkgYZNRN15e_ax5hg5ObHngk5tizz7FYStkGaE,1070
531
+ policyengine_uk/scenarios/repeal_two_child_limit.py,sha256=vZndQVFNCe7v7k4v-PgneOCPld-YTnCmlveRbX_1czk,250
529
532
  policyengine_uk/tests/test_parameter_metadata.py,sha256=_2w2dSokAf5Jskye_KIL8eh80N7yIrUszlmqnZtwQws,450
530
533
  policyengine_uk/tests/code_health/test_variables.py,sha256=9Y-KpmzhyRGy9eEqocK9z91NXHX5QIF3mDMNGvegb7Q,1398
531
534
  policyengine_uk/tests/microsimulation/README.md,sha256=1toB1Z06ynlUielTrsAaeo9Vb-c3ZrB3tbbR4E1xUGk,3924
532
- policyengine_uk/tests/microsimulation/reforms_config.yaml,sha256=azRPWlthHO8JEHTUq7qcReKqb4cgm2oFwi-eK6TFImY,1086
535
+ policyengine_uk/tests/microsimulation/reforms_config.yaml,sha256=qIxLo33i7qAAkCc6Pvpa-rhWTxoevrbOlsADjF-w7pk,1086
533
536
  policyengine_uk/tests/microsimulation/test_reform_impacts.py,sha256=xM3M2pclEhA9JIFpnuiPMy1fEBFOKcSzroRPk73FPls,2635
534
537
  policyengine_uk/tests/microsimulation/test_validity.py,sha256=RWhbSKrnrZCNQRVmGYlM8hnpe1_Blo5_xP8vr8u3kV0,694
535
538
  policyengine_uk/tests/microsimulation/update_reform_impacts.py,sha256=2pxp2RNLWxV4CesGKKHmg3qBs79Jq2Jcq3GJIBk4euU,4824
@@ -595,7 +598,6 @@ policyengine_uk/tests/policy/baseline/finance/income/minimum_wage.yaml,sha256=qv
595
598
  policyengine_uk/tests/policy/baseline/finance/income/minimum_wage_category.yaml,sha256=mGVi7xJRUiuoYjmp_Dcc1dWZ2-7ceIKAhN1r6NLI6tg,787
596
599
  policyengine_uk/tests/policy/baseline/finance/tax/income_tax/savings_starter_rate_income.yaml,sha256=MVgdxK3jU9_i5WptA6SxYXipKg__mHm1tGk01A9MwS0,1195
597
600
  policyengine_uk/tests/policy/baseline/finance/tax/income_tax/scottish_rates.yaml,sha256=6W1oeU7i13VJZhSS2_2du6a4P75YHkTSv3vmZJIs92I,181
598
- policyengine_uk/tests/policy/baseline/gov/abolitions/abolition_parameters.yaml,sha256=9oaBaVXSP-3-02UZpr3nLB4b0re50G8jRFOop9SPq_A,4837
599
601
  policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv_licence_discount.yaml,sha256=INGw-yjudsQMxNDTiWpcuWbns-UPDKGnH3VuF000kHY,805
600
602
  policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv-licence/tv_licence.yaml,sha256=cYAZlmmoAxWymv7L0lDzPcX6dexNAERQnVQMOB0HVzE,562
601
603
  policyengine_uk/tests/policy/baseline/gov/dfe/care_to_learn/care_to_learn.yaml,sha256=i5RIghjT2T7uWn_xvaeYb2dIJ7JsreSr_f12UPtFqpg,508
@@ -689,6 +691,7 @@ policyengine_uk/utils/create_ahc_deflator.py,sha256=zCJ_R_hq8DUfuO7u3puhRl6gkC1h
689
691
  policyengine_uk/utils/create_triple_lock.py,sha256=E8qR51cq5jPL6EOXFoPi1qJhrcUBXg3dfWTvdqWN2Bo,948
690
692
  policyengine_uk/utils/dependencies.py,sha256=6mLDZr-lypI6RZMeb0rcWoJy5Ig7QT18kOuAMUgI7vg,8198
691
693
  policyengine_uk/utils/parameters.py,sha256=OQTzTkHMdwbphCo0mV7_n_FJT0rdwIKNFTsk_lsdETE,1301
694
+ policyengine_uk/utils/scenario.py,sha256=xvWjv7WViH6NxqQF5RUECXtIWYktploOn-0kPYC3rXM,6702
692
695
  policyengine_uk/utils/solve_private_school_attendance_factor.py,sha256=LUZCgHKAQTY5qHlGJutn7pOFUWT0AP16YcJy-YUjQ3Q,1609
693
696
  policyengine_uk/utils/water/README.md,sha256=sdBI-JZ-jcRoSUfwNx5wjv5Ig_nM8OPvvjSsSMs_Wh8,443
694
697
  policyengine_uk/utils/water/forecast_water_bills.py,sha256=B4vtfJuR8XfBP-KHGyhRp2Oo7X7buN-lDH6tBIXqE2U,2788
@@ -1370,10 +1373,10 @@ policyengine_uk/variables/misc/spi_imputed.py,sha256=iPVlBF_TisM0rtKvO-3-PQ2UYCe
1370
1373
  policyengine_uk/variables/misc/uc_migrated.py,sha256=zFNcUJaO8gwmbL1iY9GKgUt3G6J9yrCraqBV_5dCvlM,306
1371
1374
  policyengine_uk/variables/misc/categories/lower_middle_or_higher.py,sha256=C54tHYz2DmOyvQYCC1bF8RJwRZinhAq_e3aYC-9F5fM,157
1372
1375
  policyengine_uk/variables/misc/categories/lower_or_higher.py,sha256=81NIbLLabRr9NwjpUZDuV8IV8_mqmp5NM-CZvt55TwE,129
1373
- policyengine_uk-2.42.0.data/data/share/openfisca/openfisca-country-template/CHANGELOG.md,sha256=gvfrTmfJIgfSQPoJOQ5cgJM0ZcWfMOLCut8909_wiGs,58394
1374
- policyengine_uk-2.42.0.data/data/share/openfisca/openfisca-country-template/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1375
- policyengine_uk-2.42.0.data/data/share/openfisca/openfisca-country-template/README.md,sha256=PCy7LRLdUDQS8U4PaeHeBVnyBZAqHv1dAVDDvEcom20,1976
1376
- policyengine_uk-2.42.0.dist-info/METADATA,sha256=8v2z9cix1P4FfGKnDzHwgV_cbF4Xevt-q5kmKbetsiA,3502
1377
- policyengine_uk-2.42.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1378
- policyengine_uk-2.42.0.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1379
- policyengine_uk-2.42.0.dist-info/RECORD,,
1376
+ policyengine_uk-2.43.0.data/data/share/openfisca/openfisca-country-template/CHANGELOG.md,sha256=PQth_bhEgN2NEdwHaelS1QTnRcLNs7UQ2pU6N2vDfeU,58635
1377
+ policyengine_uk-2.43.0.data/data/share/openfisca/openfisca-country-template/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1378
+ policyengine_uk-2.43.0.data/data/share/openfisca/openfisca-country-template/README.md,sha256=PCy7LRLdUDQS8U4PaeHeBVnyBZAqHv1dAVDDvEcom20,1976
1379
+ policyengine_uk-2.43.0.dist-info/METADATA,sha256=E5g6_HGNjojCeqgn6FQlL1vk8HQ6d3hiKcykskekZU4,3502
1380
+ policyengine_uk-2.43.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1381
+ policyengine_uk-2.43.0.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1382
+ policyengine_uk-2.43.0.dist-info/RECORD,,
policyengine_uk/repo.py DELETED
@@ -1,3 +0,0 @@
1
- from pathlib import Path
2
-
3
- REPO = Path(__file__).parent
@@ -1,250 +0,0 @@
1
- - name: Child benefit abolition test
2
- period: 2025
3
- input:
4
- gov.abolitions.child_benefit: true
5
- people:
6
- parent:
7
- age: 35
8
- child:
9
- age: 5
10
- benunits:
11
- benunit:
12
- members: [parent, child]
13
- would_claim_child_benefit: true
14
- output:
15
- child_benefit: [0, 0]
16
-
17
- - name: State pension abolition test
18
- period: 2025
19
- input:
20
- gov.abolitions.state_pension: true
21
- people:
22
- pensioner:
23
- age: 67
24
- state_pension_age: 67
25
- output:
26
- state_pension: 0
27
-
28
- - name: Employment income abolition test
29
- period: 2025
30
- input:
31
- gov.abolitions.employment_income: true
32
- people:
33
- worker:
34
- age: 30
35
- employment_income: 50000
36
- output:
37
- employment_income: 0
38
-
39
- - name: Universal credit abolition test
40
- period: 2025
41
- input:
42
- gov.abolitions.universal_credit: true
43
- people:
44
- claimant:
45
- age: 25
46
- benunits:
47
- benunit:
48
- members: [claimant]
49
- would_claim_uc: true
50
- output:
51
- universal_credit: 0
52
-
53
- - name: Income tax abolition test
54
- period: 2025
55
- input:
56
- gov.abolitions.income_tax: true
57
- people:
58
- taxpayer:
59
- age: 30
60
- employment_income: 50000
61
- output:
62
- income_tax: 0
63
-
64
- - name: National insurance abolition test
65
- period: 2025
66
- input:
67
- gov.abolitions.national_insurance: true
68
- people:
69
- worker:
70
- age: 30
71
- employment_income: 50000
72
- output:
73
- national_insurance: 0
74
-
75
- - name: Carers allowance abolition test
76
- period: 2025
77
- input:
78
- gov.abolitions.carers_allowance: true
79
- people:
80
- carer:
81
- age: 30
82
- care_hours: 40
83
- output:
84
- carers_allowance: 0
85
-
86
- - name: Housing benefit abolition test
87
- period: 2025
88
- input:
89
- gov.abolitions.housing_benefit: true
90
- people:
91
- claimant:
92
- age: 25
93
- benunits:
94
- benunit:
95
- members: [claimant]
96
- households:
97
- household:
98
- members: [claimant]
99
- rent: 500
100
- brma: "CENTRAL_LONDON"
101
- tenure_type: "RENT_PRIVATELY"
102
- output:
103
- housing_benefit: 0
104
-
105
- - name: Pension credit abolition test
106
- period: 2025
107
- input:
108
- gov.abolitions.pension_credit: true
109
- people:
110
- pensioner:
111
- age: 67
112
- state_pension_age: 67
113
- output:
114
- pension_credit: 0
115
-
116
- - name: Working tax credit abolition test
117
- period: 2025
118
- input:
119
- gov.abolitions.working_tax_credit: true
120
- people:
121
- worker:
122
- age: 30
123
- employment_income: 15000
124
- weekly_hours: 35
125
- output:
126
- working_tax_credit: 0
127
-
128
- - name: Child tax credit abolition test
129
- period: 2025
130
- input:
131
- gov.abolitions.child_tax_credit: true
132
- people:
133
- parent:
134
- age: 30
135
- employment_income: 15000
136
- child:
137
- age: 5
138
- benunits:
139
- benunit:
140
- members: [parent, child]
141
- output:
142
- child_tax_credit: 0
143
-
144
- - name: Income support abolition test
145
- period: 2025
146
- input:
147
- gov.abolitions.income_support: true
148
- people:
149
- claimant:
150
- age: 25
151
- output:
152
- income_support: 0
153
-
154
- - name: JSA income abolition test
155
- period: 2025
156
- input:
157
- gov.abolitions.jsa_income: true
158
- people:
159
- claimant:
160
- age: 25
161
- output:
162
- jsa_income: 0
163
-
164
- - name: ESA income abolition test
165
- period: 2025
166
- input:
167
- gov.abolitions.esa_income: true
168
- people:
169
- claimant:
170
- age: 25
171
- output:
172
- esa_income: 0
173
-
174
- - name: Attendance allowance abolition test
175
- period: 2025
176
- input:
177
- gov.abolitions.attendance_allowance: true
178
- people:
179
- claimant:
180
- age: 70
181
- aa_category: "LOWER"
182
- output:
183
- attendance_allowance: 0
184
-
185
- - name: Council tax benefit abolition test
186
- period: 2025
187
- input:
188
- gov.abolitions.council_tax_benefit: true
189
- people:
190
- claimant:
191
- age: 25
192
- benunits:
193
- benunit:
194
- members: [claimant]
195
- households:
196
- household:
197
- members: [claimant]
198
- council_tax_band: "A"
199
- region: "LONDON"
200
- output:
201
- council_tax_benefit: 0
202
-
203
- - name: Stamp duty land tax abolition test
204
- period: 2025
205
- input:
206
- gov.abolitions.stamp_duty_land_tax: true
207
- people:
208
- buyer:
209
- age: 30
210
- households:
211
- household:
212
- members: [buyer]
213
- main_residential_property_purchased: 300000
214
- output:
215
- stamp_duty_land_tax: 0
216
-
217
- - name: VAT abolition test
218
- period: 2025
219
- input:
220
- gov.abolitions.vat: true
221
- people:
222
- consumer:
223
- age: 30
224
- households:
225
- household:
226
- members: [consumer]
227
- full_rate_vat_consumption: 1000
228
- output:
229
- vat: 0
230
-
231
- - name: Capital gains tax abolition test
232
- period: 2025
233
- input:
234
- gov.abolitions.capital_gains_tax: true
235
- people:
236
- investor:
237
- age: 30
238
- capital_gains: 50000
239
- output:
240
- capital_gains_tax: 0
241
-
242
- - name: Business rates abolition test
243
- period: 2025
244
- input:
245
- gov.abolitions.business_rates: true
246
- people:
247
- business_owner:
248
- age: 30
249
- output:
250
- business_rates: 0