policyengine-uk 2.45.4__py3-none-any.whl → 2.47.2__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.

Potentially problematic release.


This version of policyengine-uk might be problematic. Click here for more details.

Files changed (27) hide show
  1. policyengine_uk/__init__.py +1 -0
  2. policyengine_uk/data/dataset_schema.py +6 -3
  3. policyengine_uk/data/economic_assumptions.py +1 -1
  4. policyengine_uk/dynamics/labour_supply.py +306 -0
  5. policyengine_uk/dynamics/participation.py +629 -0
  6. policyengine_uk/dynamics/progression.py +376 -0
  7. policyengine_uk/microsimulation.py +23 -1
  8. policyengine_uk/parameters/gov/dynamic/obr_labour_supply_assumptions.yaml +9 -0
  9. policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml +270 -32
  10. policyengine_uk/simulation.py +184 -9
  11. policyengine_uk/tax_benefit_system.py +4 -1
  12. policyengine_uk/tests/microsimulation/reforms_config.yaml +7 -7
  13. policyengine_uk/tests/microsimulation/test_validity.py +2 -3
  14. policyengine_uk/tests/microsimulation/update_reform_impacts.py +104 -40
  15. policyengine_uk/tests/policy/baseline/gov/dfe/extended_childcare_entitlement/extended_childcare_entitlement.yaml +8 -8
  16. policyengine_uk/utils/__init__.py +1 -0
  17. policyengine_uk/utils/compare.py +28 -0
  18. policyengine_uk/utils/solve_private_school_attendance_factor.py +4 -6
  19. policyengine_uk/variables/gov/dwp/additional_state_pension.py +1 -1
  20. policyengine_uk/variables/gov/dwp/basic_state_pension.py +1 -1
  21. policyengine_uk/variables/household/demographic/benunit/benunit_count_adults.py +11 -0
  22. policyengine_uk/variables/input/consumption/property/council_tax.py +0 -35
  23. policyengine_uk/variables/input/rent.py +0 -40
  24. {policyengine_uk-2.45.4.dist-info → policyengine_uk-2.47.2.dist-info}/METADATA +5 -4
  25. {policyengine_uk-2.45.4.dist-info → policyengine_uk-2.47.2.dist-info}/RECORD +27 -21
  26. {policyengine_uk-2.45.4.dist-info → policyengine_uk-2.47.2.dist-info}/WHEEL +0 -0
  27. {policyengine_uk-2.45.4.dist-info → policyengine_uk-2.47.2.dist-info}/licenses/LICENSE +0 -0
@@ -8,6 +8,18 @@ from pathlib import Path
8
8
  from policyengine_uk import Microsimulation
9
9
  import argparse
10
10
  from datetime import datetime
11
+ from rich.console import Console
12
+ from rich.table import Table
13
+ from rich.progress import (
14
+ Progress,
15
+ SpinnerColumn,
16
+ TextColumn,
17
+ BarColumn,
18
+ TaskProgressColumn,
19
+ )
20
+ from rich.panel import Panel
21
+ from rich import print as rprint
22
+ import traceback
11
23
 
12
24
  baseline = Microsimulation()
13
25
 
@@ -40,57 +52,97 @@ def update_impacts(
40
52
  dry_run: If True, show changes without writing to file
41
53
  verbose: If True, show detailed output
42
54
  """
55
+ console = Console()
56
+
43
57
  # Load current configuration
44
58
  with open(config_path, "r") as f:
45
59
  config = yaml.safe_load(f)
46
60
 
47
61
  if verbose:
48
- print(f"Loaded configuration from {config_path}")
49
- print(f"Found {len(config['reforms'])} reforms to update\n")
62
+ console.print(
63
+ Panel.fit(
64
+ f"[bold cyan]Loaded configuration from {config_path}[/bold cyan]\n"
65
+ f"[green]Found {len(config['reforms'])} reforms to update[/green]",
66
+ title="Configuration loaded",
67
+ )
68
+ )
50
69
 
51
70
  # Track changes
52
71
  changes = []
53
72
 
54
- # Update each reform's expected impact
55
- for reform in config["reforms"]:
56
- print(f"Processing reform: {reform['name']}") if verbose else None
57
- old_impact = reform["expected_impact"]
58
- new_impact = round(get_fiscal_impact(reform["parameters"]), 1)
59
-
60
- if (
61
- abs(old_impact - new_impact) > 0.01
62
- ): # Only record meaningful changes
63
- changes.append(
64
- {
65
- "name": reform["name"],
66
- "old": old_impact,
67
- "new": new_impact,
68
- "diff": new_impact - old_impact,
69
- }
70
- )
71
-
72
- reform["expected_impact"] = new_impact
73
+ # Update each reform's expected impact with progress bar
74
+ with Progress(
75
+ SpinnerColumn(),
76
+ TextColumn("[progress.description]{task.description}"),
77
+ BarColumn(),
78
+ TaskProgressColumn(),
79
+ console=console,
80
+ ) as progress:
81
+ task = progress.add_task(
82
+ "[cyan]Processing reforms...", total=len(config["reforms"])
83
+ )
73
84
 
74
- if verbose:
75
- print(f"Reform: {reform['name']}")
76
- print(f" Old impact: {old_impact:.1f} billion")
77
- print(f" New impact: {new_impact:.1f} billion")
78
- if abs(old_impact - new_impact) > 0.01:
79
- print(f" Change: {new_impact - old_impact:+.1f} billion")
80
- print()
85
+ for reform in config["reforms"]:
86
+ progress.update(
87
+ task, description=f"[cyan]Processing: {reform['name'][:40]}..."
88
+ )
89
+ old_impact = reform["expected_impact"]
90
+ new_impact = round(get_fiscal_impact(reform["parameters"]), 1)
91
+
92
+ if (
93
+ abs(old_impact - new_impact) > 0.01
94
+ ): # Only record meaningful changes
95
+ changes.append(
96
+ {
97
+ "name": reform["name"],
98
+ "old": old_impact,
99
+ "new": new_impact,
100
+ "diff": new_impact - old_impact,
101
+ }
102
+ )
103
+
104
+ reform["expected_impact"] = new_impact
105
+ progress.advance(task)
106
+
107
+ # Show detailed output if verbose
108
+ if verbose and changes:
109
+ console.print("\n[bold]Detailed changes:[/bold]")
110
+ for change in changes:
111
+ color = "red" if change["diff"] < 0 else "green"
112
+ console.print(
113
+ f" [yellow]{change['name']}[/yellow]\n"
114
+ f" Old impact: [dim]{change['old']:.1f} billion[/dim]\n"
115
+ f" New impact: [bold]{change['new']:.1f} billion[/bold]\n"
116
+ f" Change: [{color}]{change['diff']:+.1f} billion[/{color}]\n"
117
+ )
81
118
 
82
119
  # Show summary of changes
83
120
  if changes:
84
- print("\nSummary of changes:")
85
- print("-" * 70)
121
+ table = Table(
122
+ title="Summary of changes",
123
+ show_header=True,
124
+ header_style="bold magenta",
125
+ )
126
+ table.add_column("Reform", style="cyan", no_wrap=False)
127
+ table.add_column("Old impact (£bn)", justify="right")
128
+ table.add_column("New impact (£bn)", justify="right")
129
+ table.add_column("Change (£bn)", justify="right")
130
+
86
131
  for change in changes:
87
- print(
88
- f"{change['name']:<50} {change['old']:>6.1f} → {change['new']:>6.1f} ({change['diff']:+.1f})"
132
+ color = "red" if change["diff"] < 0 else "green"
133
+ table.add_row(
134
+ change["name"],
135
+ f"{change['old']:.1f}",
136
+ f"{change['new']:.1f}",
137
+ f"[{color}]{change['diff']:+.1f}[/{color}]",
89
138
  )
90
- print("-" * 70)
91
- print(f"Total changes: {len(changes)}")
139
+
140
+ console.print("\n", table)
141
+ console.print(
142
+ f"\n[bold cyan]Total changes: {len(changes)}[/bold cyan]"
143
+ )
92
144
  else:
93
- print("\nNo significant changes detected.")
145
+ console.print("\n[green]✓ No significant changes detected.[/green]")
94
146
 
95
147
  # Write updated configuration
96
148
  if not dry_run:
@@ -109,13 +161,22 @@ def update_impacts(
109
161
  with open(config_path, "w") as f:
110
162
  yaml.dump(config, f, default_flow_style=False, sort_keys=False)
111
163
 
112
- print(f"\nConfiguration updated successfully!")
113
- print(f"Backup saved to: {backup_path}")
164
+ console.print(
165
+ Panel.fit(
166
+ f"[green]✓ Configuration updated successfully![/green]\n"
167
+ f"[dim]Backup saved to: {backup_path}[/dim]",
168
+ title="Success",
169
+ border_style="green",
170
+ )
171
+ )
114
172
  else:
115
- print("\nDry run - no changes written to file.")
173
+ console.print(
174
+ "\n[yellow]⚠ Dry run - no changes written to file.[/yellow]"
175
+ )
116
176
 
117
177
 
118
178
  def main():
179
+ console = Console()
119
180
  parser = argparse.ArgumentParser(
120
181
  description="Update reform impact expectations with current model values"
121
182
  )
@@ -143,14 +204,17 @@ def main():
143
204
  args = parser.parse_args()
144
205
 
145
206
  if not args.config.exists():
146
- print(f"Error: Configuration file '{args.config}' not found!")
207
+ console.print(
208
+ f"[bold red]Error:[/bold red] Configuration file '{args.config}' not found!"
209
+ )
147
210
  return 1
148
211
 
149
212
  try:
150
213
  update_impacts(args.config, dry_run=args.dry_run, verbose=args.verbose)
151
214
  return 0
152
215
  except Exception as e:
153
- print(f"Error updating impacts: {e}")
216
+ console.print(f"[bold red]Error updating impacts:[/bold red] {e}")
217
+ console.print(traceback.format_exc())
154
218
  return 1
155
219
 
156
220
 
@@ -1,6 +1,6 @@
1
1
  - name: Eligible for 30 hours - All conditions met
2
2
  period: 2025
3
- absolute_error_margin: 1
3
+ absolute_error_margin: 3
4
4
  input:
5
5
  people:
6
6
  child1:
@@ -14,7 +14,7 @@
14
14
 
15
15
  - name: Eligible for 15 hours - All first conditions met
16
16
  period: 2025
17
- absolute_error_margin: 1
17
+ absolute_error_margin: 2
18
18
  input:
19
19
  people:
20
20
  child1:
@@ -42,7 +42,7 @@
42
42
 
43
43
  - name: Eligible for mixed hours - Family with multiple children
44
44
  period: 2025
45
- absolute_error_margin: 1
45
+ absolute_error_margin: 4
46
46
  input:
47
47
  people:
48
48
  child1:
@@ -74,7 +74,7 @@
74
74
 
75
75
  - name: Eligible with one working parent and one disabled parent
76
76
  period: 2025
77
- absolute_error_margin: 1
77
+ absolute_error_margin: 6
78
78
  input:
79
79
  people:
80
80
  child1:
@@ -107,7 +107,7 @@
107
107
 
108
108
  - name: Child using fewer hours than maximum entitlement
109
109
  period: 2025
110
- absolute_error_margin: 1
110
+ absolute_error_margin: 2
111
111
  input:
112
112
  people:
113
113
  child1:
@@ -122,7 +122,7 @@
122
122
 
123
123
  - name: Child using fewer hours than maximum entitlement - multiple children
124
124
  period: 2025
125
- absolute_error_margin: 1
125
+ absolute_error_margin: 2
126
126
  input:
127
127
  people:
128
128
  child1:
@@ -140,7 +140,7 @@
140
140
 
141
141
  - name: Benefit unit maximum hours cap applied
142
142
  period: 2025
143
- absolute_error_margin: 1
143
+ absolute_error_margin: 5
144
144
  input:
145
145
  people:
146
146
  child1:
@@ -177,7 +177,7 @@
177
177
 
178
178
  - name: Benefit unit without maximum hours cap applied with 3 years old child
179
179
  period: 2025
180
- absolute_error_margin: 1
180
+ absolute_error_margin: 2
181
181
  input:
182
182
  people:
183
183
  child1:
@@ -0,0 +1 @@
1
+ from .compare import compare_simulations
@@ -0,0 +1,28 @@
1
+ import pandas as pd
2
+ from typing import TYPE_CHECKING
3
+
4
+ if TYPE_CHECKING:
5
+ from policyengine_uk.simulation import Microsimulation
6
+
7
+
8
+ def compare_simulations(
9
+ simulations: list["Microsimulation"],
10
+ names: list[str],
11
+ year: int,
12
+ variables: list[str],
13
+ ):
14
+ dfs = [
15
+ sim.calculate_dataframe(variables, year).rename(
16
+ columns=lambda x: f"{x}_{name}"
17
+ )
18
+ for sim, name in zip(simulations, names)
19
+ ]
20
+
21
+ df = pd.concat(dfs, axis=1).reset_index().rename(columns={"index": "id"})
22
+
23
+ # Sort columns by variable
24
+ columns = []
25
+ for var in variables:
26
+ columns.extend([col for col in df.columns if col.startswith(var)])
27
+
28
+ return df[columns]
@@ -1,4 +1,4 @@
1
- from policyengine import Simulation
1
+ from policyengine_uk import Microsimulation
2
2
  from policyengine_core.reforms import Reform
3
3
  from tqdm import tqdm
4
4
 
@@ -19,11 +19,9 @@ for factor in tqdm([round(x * 0.01, 2) for x in range(70, 91)]):
19
19
  }
20
20
 
21
21
  # Run the reformed microsimulation
22
- reformed = Simulation(
23
- scope="macro",
24
- baseline=reform,
25
- country="uk",
26
- ).baseline_simulation
22
+ reformed = Microsimulation(
23
+ reform=reform,
24
+ )
27
25
  reformed.baseline_simulation.get_holder(
28
26
  "attends_private_school"
29
27
  ).delete_arrays()
@@ -13,7 +13,7 @@ class additional_state_pension(Variable):
13
13
  if simulation.dataset is None:
14
14
  return 0
15
15
 
16
- data_year = simulation.dataset.time_period
16
+ data_year = 2023
17
17
  reported = person("state_pension_reported", data_year) / WEEKS_IN_YEAR
18
18
  type = person("state_pension_type", data_year)
19
19
  maximum_basic_sp = parameters(
@@ -13,7 +13,7 @@ class basic_state_pension(Variable):
13
13
  if simulation.dataset is None:
14
14
  return 0
15
15
 
16
- data_year = simulation.dataset.time_period
16
+ data_year = 2023
17
17
  reported = person("state_pension_reported", data_year) / WEEKS_IN_YEAR
18
18
  type = person("state_pension_type", period)
19
19
  maximum_basic_sp = parameters(
@@ -0,0 +1,11 @@
1
+ from policyengine_uk.model_api import *
2
+
3
+
4
+ class benunit_count_adults(Variable):
5
+ value_type = int
6
+ entity = BenUnit
7
+ label = "number of adults in the benefit unit"
8
+ definition_period = YEAR
9
+
10
+ def formula(benunit, period, parameters):
11
+ return add(benunit, period, ["is_adult"])
@@ -9,38 +9,3 @@ class council_tax(Variable):
9
9
  definition_period = YEAR
10
10
  unit = GBP
11
11
  quantity_type = FLOW
12
-
13
- def formula(household, period, parameters):
14
- if period.start.year < 2023:
15
- # We don't have growth rates for council tax by nation before this.
16
- return 0
17
-
18
- if household.simulation.dataset is None:
19
- return 0
20
-
21
- data_year = household.simulation.dataset.time_period
22
-
23
- original_ct = household("council_tax", data_year)
24
-
25
- ct = parameters.gov.economic_assumptions.indices.obr.council_tax
26
-
27
- def get_growth(country):
28
- param = getattr(ct, country)
29
- return param(period.start.year) / param(data_year)
30
-
31
- country = household("country", period).decode_to_str()
32
-
33
- return select(
34
- [
35
- country == "ENGLAND",
36
- country == "WALES",
37
- country == "SCOTLAND",
38
- True,
39
- ],
40
- [
41
- original_ct * get_growth("england"),
42
- original_ct * get_growth("wales"),
43
- original_ct * get_growth("scotland"),
44
- original_ct,
45
- ],
46
- )
@@ -11,43 +11,3 @@ class rent(Variable):
11
11
  value_type = float
12
12
  unit = GBP
13
13
  quantity_type = FLOW
14
-
15
- def formula(household, period, parameters):
16
- if period.start.year < 2023:
17
- # We don't have growth rates for rent before this.
18
- return 0
19
-
20
- if household.simulation.dataset is None:
21
- return 0
22
-
23
- data_year = household.simulation.dataset.time_period
24
- original_rent = household("rent", data_year)
25
- tenure_type = household("tenure_type", period).decode_to_str()
26
-
27
- is_social_rent = (tenure_type == "RENT_FROM_COUNCIL") | (
28
- tenure_type == "RENT_FROM_HA"
29
- )
30
-
31
- is_private_rent = tenure_type == "RENT_PRIVATELY"
32
-
33
- obr = parameters.gov.economic_assumptions.indices.obr
34
-
35
- private_rent_uprating = obr.lagged_average_earnings(
36
- period
37
- ) / obr.lagged_average_earnings(data_year)
38
- social_rent_uprating = obr.social_rent(period) / obr.social_rent(
39
- data_year
40
- )
41
-
42
- return select(
43
- [
44
- is_social_rent,
45
- is_private_rent,
46
- True,
47
- ],
48
- [
49
- original_rent * social_rent_uprating,
50
- original_rent * private_rent_uprating,
51
- original_rent,
52
- ],
53
- )
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine-uk
3
- Version: 2.45.4
4
- Summary: PolicyEngine tax and benefit system for the UK
3
+ Version: 2.47.2
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
7
7
  Project-URL: Issues, https://github.com/PolicyEngine/policyengine-uk/issues
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
23
- Requires-Python: >=3.10
23
+ Requires-Python: >=3.13
24
24
  Requires-Dist: microdf-python>=1.0.2
25
25
  Requires-Dist: policyengine-core>=3.19.3
26
26
  Requires-Dist: pydantic>=2.11.7
@@ -28,10 +28,11 @@ Provides-Extra: dev
28
28
  Requires-Dist: black; extra == 'dev'
29
29
  Requires-Dist: coverage; extra == 'dev'
30
30
  Requires-Dist: furo<2023; extra == 'dev'
31
- Requires-Dist: jupyter-book; extra == 'dev'
31
+ Requires-Dist: jupyter-book>=2.0.0a0; extra == 'dev'
32
32
  Requires-Dist: linecheck; extra == 'dev'
33
33
  Requires-Dist: pytest; extra == 'dev'
34
34
  Requires-Dist: pytest-cov; extra == 'dev'
35
+ Requires-Dist: rich; extra == 'dev'
35
36
  Requires-Dist: setuptools; extra == 'dev'
36
37
  Requires-Dist: snowballstemmer<3,>=2; extra == 'dev'
37
38
  Requires-Dist: sphinx-argparse<1,>=0.3.2; extra == 'dev'
@@ -1,15 +1,18 @@
1
- policyengine_uk/__init__.py,sha256=ud1uvjBep-lcZKBWUd0eo-PAT_FM92_PqUlDp5OYl4g,355
1
+ policyengine_uk/__init__.py,sha256=unX9Z-eloDZK6yQJKXRRDL31k1ItKP-gpMl0AY6xZZU,380
2
2
  policyengine_uk/entities.py,sha256=9yUbkUWQr3WydNE-gHhUudG97HGyXIZY3dkgQ6Z3t9A,1212
3
- policyengine_uk/microsimulation.py,sha256=k2u8v6TlHiu8hO5gCjd8-qOsfzorCnjrKfnvs8cbGOc,2676
3
+ policyengine_uk/microsimulation.py,sha256=WskrrDrLGfDYwS1CzFk5rJkQSQlTknLkxFufStKRpxc,3379
4
4
  policyengine_uk/model_api.py,sha256=KdwJCL2HkXVxDpL6fCsCnQ9Sub6Kqp7Hyxlis3MNIx4,241
5
5
  policyengine_uk/modelled_policies.yaml,sha256=TLhvmkuI9ip-Fjq63n66RzDErCkN8K4BzY6XLxLMtFg,463
6
- policyengine_uk/simulation.py,sha256=laMnITFnpWqrx1h6F_0WTfjKOiNAsrH9d9obQmrQ0k8,15215
6
+ policyengine_uk/simulation.py,sha256=GaN8ZC7bZVTRzP7Np-PfUiX60F6dKszdTrNhXe_OLuU,21186
7
7
  policyengine_uk/system.py,sha256=Z-ax_ImUq5k4tycuThczTxQNW5iTE6ikBJIBQdKfIzU,91
8
- policyengine_uk/tax_benefit_system.py,sha256=7d5zITUezBcVw9AGvwXsE2Tb_AN-3HY4jMcueFRFaD4,5096
8
+ policyengine_uk/tax_benefit_system.py,sha256=CjX1lERyOm_vlgHQcQO92HZtJiwItLH-MxJveJqk6iM,5165
9
9
  policyengine_uk/data/__init__.py,sha256=J0bZ3WnvPzZ4qfVLYcwOc4lziMUMdbcMqJ3xwjoekbM,101
10
- policyengine_uk/data/dataset_schema.py,sha256=e4ST_kHSdlwX7Fd8rO5MRr2kXMejIJGXb0mUlKlVnEE,9912
11
- policyengine_uk/data/economic_assumptions.py,sha256=A0lJpaAORE3fyBHAo2CbKRuio6HYlnq3KyFvypqvIfg,6239
10
+ policyengine_uk/data/dataset_schema.py,sha256=781beGVnPWJhw2FzcG6he-LtmgxtwS1h6keAz7TPoXI,10036
11
+ policyengine_uk/data/economic_assumptions.py,sha256=U3wyBs4zVI5-bcMB-GivELC1qG-895l5NPds3cuWb90,6239
12
12
  policyengine_uk/data/uprating_indices.yaml,sha256=kQtfeGWyqge4dbJhs0iF4kTMqovuegill_Zfs8orJi4,2394
13
+ policyengine_uk/dynamics/labour_supply.py,sha256=0yVMDWjq8fUxHVuhL51zjrz0Ac69T8g69OoVLrJQ8sA,10785
14
+ policyengine_uk/dynamics/participation.py,sha256=g5xUqg-Nj2lQny9GrUfI2D_swLx0-9k-486NXtcWwbM,23238
15
+ policyengine_uk/dynamics/progression.py,sha256=4Wl3ZE-bYxNTMVGeOGFh22lYtHGPCarrhp8JzuLQs7I,13738
13
16
  policyengine_uk/parameters/gov/README.md,sha256=bHUep1_2pLHD3Or8SwjStOWXDIbW9OuYxOd4ml8IXcM,13
14
17
  policyengine_uk/parameters/gov/benefit_uprating_cpi.yaml,sha256=2zOSdJeUhDZYYsKE2vLkcK-UbKNoOSVwfac0QIAp02g,250
15
18
  policyengine_uk/parameters/gov/contrib/README.md,sha256=b282dmUFAmj7cXSfiMLyE81q5Y0Gnehy-6atLus-ESs,70
@@ -316,10 +319,11 @@ policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/require_benef
316
319
  policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/state_pension_age_requirement.yaml,sha256=8wXlC5wX-ceoZ-s2kOk4IhAiomsXSCM-vnRRbL2kChA,356
317
320
  policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/maximum_taxable_income.yaml,sha256=vtXLTgcLg1tmvnsbmJUv45maVEzzKQTWK-lFYTGzuVk,280
318
321
  policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/use_maximum_taxable_income.yaml,sha256=MKnXmHJaDJbpO-mLemudo5n-yQMCByuVwUtlxItOvjg,280
322
+ policyengine_uk/parameters/gov/dynamic/obr_labour_supply_assumptions.yaml,sha256=lD3jXWlRh39SCms6pRto51OhWT2YiUeMMI2_gi7SUJg,316
319
323
  policyengine_uk/parameters/gov/economic_assumptions/create_economic_assumption_indices.py,sha256=uxJy4X30P8NRSL7dH757bgpPANMdf5efar8Bu7uR78w,1937
320
324
  policyengine_uk/parameters/gov/economic_assumptions/lag_average_earnings.py,sha256=ksHcyUQkLAJmKizCeSg8j0hzPc7ajgIvbExWLgCra4U,701
321
325
  policyengine_uk/parameters/gov/economic_assumptions/lag_cpi.py,sha256=IdtaMLN1_OSu-RFZsQV8vBlbOvXsPlnNlsOuinRHrxg,642
322
- policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml,sha256=k2xxY4YvioJ0agEOHwebcEWVwQbgePrnXO1dvogGWCs,17673
326
+ policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml,sha256=hZtw6qxYnvvk51a050q9rKBvstjbmpN4azh5HEZkP_E,23714
323
327
  policyengine_uk/parameters/gov/hmrc/README.md,sha256=nkHVZl6lsjI93sR8uC7wAbul3_61wJrsP08iaW8f5lk,7
324
328
  policyengine_uk/parameters/gov/hmrc/minimum_wage.yaml,sha256=1oMbevU0ESHR51mcAG39POd1DA1FgPUep4hL6ojj-P4,2049
325
329
  policyengine_uk/parameters/gov/hmrc/business_rates/README.md,sha256=9ud50i_gMjGj6VymF-nzFDTzkFRMMJx6ybpLwbWzvpI,17
@@ -539,10 +543,10 @@ policyengine_uk/scenarios/uc_reform.py,sha256=WPYKGBY_V7A0pQPxDM0lOYTR9GoLrF-iEm
539
543
  policyengine_uk/tests/test_parameter_metadata.py,sha256=_2w2dSokAf5Jskye_KIL8eh80N7yIrUszlmqnZtwQws,450
540
544
  policyengine_uk/tests/code_health/test_variables.py,sha256=9Y-KpmzhyRGy9eEqocK9z91NXHX5QIF3mDMNGvegb7Q,1398
541
545
  policyengine_uk/tests/microsimulation/README.md,sha256=1toB1Z06ynlUielTrsAaeo9Vb-c3ZrB3tbbR4E1xUGk,3924
542
- policyengine_uk/tests/microsimulation/reforms_config.yaml,sha256=QShPK-XzuTQcyxc4j16RCUJYPV--BCe_-AyRNQfyvPY,1086
546
+ policyengine_uk/tests/microsimulation/reforms_config.yaml,sha256=Kh1WlLAEmYbYgpiyrfD7VkT0oMf8a9lsCHLAa8mGuKY,1086
543
547
  policyengine_uk/tests/microsimulation/test_reform_impacts.py,sha256=xM3M2pclEhA9JIFpnuiPMy1fEBFOKcSzroRPk73FPls,2635
544
- policyengine_uk/tests/microsimulation/test_validity.py,sha256=RWhbSKrnrZCNQRVmGYlM8hnpe1_Blo5_xP8vr8u3kV0,694
545
- policyengine_uk/tests/microsimulation/update_reform_impacts.py,sha256=2pxp2RNLWxV4CesGKKHmg3qBs79Jq2Jcq3GJIBk4euU,4824
548
+ policyengine_uk/tests/microsimulation/test_validity.py,sha256=_mHgrNu-hKzVd9V2GSg_yPQgJctxRzdQM7lM2bUvqNY,636
549
+ policyengine_uk/tests/microsimulation/update_reform_impacts.py,sha256=4m5EpPu4SXTE3qOPkx3eIZnlaOzprfm6GmMCXETZuLk,6890
546
550
  policyengine_uk/tests/policy/baseline/consumption/rent/benunit_is_rent_liable.yaml,sha256=-PzGFSa2eY5Q7cWUUeqVhXosPDnbAemLN8AUZqcfP2I,210
547
551
  policyengine_uk/tests/policy/baseline/consumption/rent/rent.yaml,sha256=s_tB77yXF-cn6G0FtIRtsGI9bW6kraLd4qZAesqX9Uw,130
548
552
  policyengine_uk/tests/policy/baseline/contrib/labour/attends_private_school.yaml,sha256=YuZY1R3jMdnKbBR9j613RsapE20ukcEJuaxoEklpuBw,1011
@@ -609,7 +613,7 @@ policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv_licence_discount.yaml,sha2
609
613
  policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv-licence/tv_licence.yaml,sha256=cYAZlmmoAxWymv7L0lDzPcX6dexNAERQnVQMOB0HVzE,562
610
614
  policyengine_uk/tests/policy/baseline/gov/dfe/care_to_learn/care_to_learn.yaml,sha256=i5RIghjT2T7uWn_xvaeYb2dIJ7JsreSr_f12UPtFqpg,508
611
615
  policyengine_uk/tests/policy/baseline/gov/dfe/care_to_learn/care_to_learn_eligible.yaml,sha256=XPeMlYk3ibEpT6GgVzVk_IPnsTHLDzM4mlcru1jwA-k,3745
612
- policyengine_uk/tests/policy/baseline/gov/dfe/extended_childcare_entitlement/extended_childcare_entitlement.yaml,sha256=y7FkeyrU7NQQbA_JZAkuGflWmyM4Cbh1a_fIQhXHQxM,4727
616
+ policyengine_uk/tests/policy/baseline/gov/dfe/extended_childcare_entitlement/extended_childcare_entitlement.yaml,sha256=ZjA7nN4-sAI3GtM7jxBOgl0qU9_e-cRWz_I6IlhjU2M,4727
613
617
  policyengine_uk/tests/policy/baseline/gov/dfe/extended_childcare_entitlement/extended_childcare_entitlement_eligible.yaml,sha256=fE6Cm9K0xQsTWrFS90lrVa8pgwC8gdpGtmttBgLsZhw,4305
614
618
  policyengine_uk/tests/policy/baseline/gov/dfe/extended_childcare_entitlement/extended_childcare_entitlement_income_condition.yaml,sha256=5PihH858DmLIkWZTrDMuqF9X9PXCzejffjbKc_LhZPI,1250
615
619
  policyengine_uk/tests/policy/baseline/gov/dfe/extended_childcare_entitlement/extended_childcare_entitlement_work_condition.yaml,sha256=7KmrVQddB70kbtn2TbdJ8q2ER58H9GhAJmeak0sODoE,2300
@@ -693,13 +697,14 @@ policyengine_uk/tests/policy/reforms/parametric/two_child_limit/__init__.py,sha2
693
697
  policyengine_uk/tests/policy/reforms/parametric/two_child_limit/age_exemption.yaml,sha256=mlNyZewO9LCsVoKCFnhvLVWKaROnaD5TvStmN9ugfUI,3382
694
698
  policyengine_uk/tests/policy/reforms/parametric/two_child_limit/ctc_age_exemption.yaml,sha256=xOgctFi4eLVW7agHdRPUU9szoRzt4p0R9eiMvPqwv_s,3577
695
699
  policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml,sha256=QY3LYJ92VzYH9mXU54XD_6PhefwHNK80kGYQ0R5I0SM,6289
696
- policyengine_uk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
700
+ policyengine_uk/utils/__init__.py,sha256=3c4PdgyrexqRqqkACZxyNNbhKduhuYZmzUWm6t1CkLc,41
701
+ policyengine_uk/utils/compare.py,sha256=mhHOiwYoj_lteA0uActRtO9y_Zd7cqUPVgVmBfx4u5o,697
697
702
  policyengine_uk/utils/create_ahc_deflator.py,sha256=7GvhywFiUMSsh0syBd-A2MVBr-HU6t4RIuqSgMTyZEw,5463
698
703
  policyengine_uk/utils/create_triple_lock.py,sha256=-LpKwztjcDaNYd3RpnMiwxAm48RWsvw0NY9wG6gXIYw,952
699
704
  policyengine_uk/utils/dependencies.py,sha256=8epKWmZBeHnxqh3j0sb-Wl3Of_OdKNX-p1syLowUcWs,8197
700
705
  policyengine_uk/utils/parameters.py,sha256=OQTzTkHMdwbphCo0mV7_n_FJT0rdwIKNFTsk_lsdETE,1301
701
706
  policyengine_uk/utils/scenario.py,sha256=snA0HNfHqMQGjB35vo0hns4dPduCImGPvlGVAXxx85M,6751
702
- policyengine_uk/utils/solve_private_school_attendance_factor.py,sha256=LUZCgHKAQTY5qHlGJutn7pOFUWT0AP16YcJy-YUjQ3Q,1609
707
+ policyengine_uk/utils/solve_private_school_attendance_factor.py,sha256=RIpxsT6OKhLlNCX5ielTRr2ZkPQOfPpg9AbP062iWh4,1555
703
708
  policyengine_uk/utils/water/README.md,sha256=sdBI-JZ-jcRoSUfwNx5wjv5Ig_nM8OPvvjSsSMs_Wh8,443
704
709
  policyengine_uk/utils/water/forecast_water_bills.py,sha256=B4vtfJuR8XfBP-KHGyhRp2Oo7X7buN-lDH6tBIXqE2U,2788
705
710
  policyengine_uk/variables/contrib/cec/non_primary_residence_wealth_tax.py,sha256=Hx5HCHc9ioK6InqTgTt6fX9JwI0sroTLgPB5N5YCJz0,668
@@ -793,7 +798,7 @@ policyengine_uk/variables/gov/dwp/WTC_severely_disabled_element.py,sha256=2dbYIc
793
798
  policyengine_uk/variables/gov/dwp/WTC_worker_element.py,sha256=c1Lm5Ke8Gr30gXV2x-HCAwlcMO1aqy989kiZOMm5QlQ,595
794
799
  policyengine_uk/variables/gov/dwp/aa_category.py,sha256=mY_cgi6Sq4yROsop0Pix024Go6bMWAeYbN4xT5DrN1U,1032
795
800
  policyengine_uk/variables/gov/dwp/access_fund.py,sha256=A5qKLeuwBsvPVrNfQi9grBb-dFSX8XtnE-RB9heCnug,245
796
- policyengine_uk/variables/gov/dwp/additional_state_pension.py,sha256=l-0avxdT7pvqhn42nc-Fi3SZM4DSvpHvmTQKhAS0Vp4,872
801
+ policyengine_uk/variables/gov/dwp/additional_state_pension.py,sha256=R_U1r3nA__kMTpBwWSl2UTAS1kpJVDhLgwmOi_KdK1Q,846
797
802
  policyengine_uk/variables/gov/dwp/adult_ema.py,sha256=M3VfIALFbILPhaOb6NeY3ffBg4HR-ASBuECvDRQPoVE,247
798
803
  policyengine_uk/variables/gov/dwp/afcs.py,sha256=rReaIh1KfrsZUyKRYFElTB_eLAge6zee1Yc5DRoBT7w,228
799
804
  policyengine_uk/variables/gov/dwp/afcs_reported.py,sha256=JueDBWlD1hhSedf8q54EdpqFDEgFdMpBwGWwrMTVDNE,293
@@ -803,7 +808,7 @@ policyengine_uk/variables/gov/dwp/attendance_allowance_reported.py,sha256=6RD4Nq
803
808
  policyengine_uk/variables/gov/dwp/baseline_ctc_entitlement.py,sha256=Z6aAfyDCvaepEX6PPfTdjQPwGgFnMhP4lpQjZ8P8AkE,445
804
809
  policyengine_uk/variables/gov/dwp/baseline_income_support_entitlement.py,sha256=TvcCQjTPbtvrbwWTUhaBPqZSiu93ys6qcoNU7S4kqRU,232
805
810
  policyengine_uk/variables/gov/dwp/baseline_wtc_entitlement.py,sha256=0BKhLGQAPlJBR6P7Yk28XFlyrFojCsVsFkJC00FMgkc,436
806
- policyengine_uk/variables/gov/dwp/basic_state_pension.py,sha256=g_HMjratM1DRmQH-Ys5EpdoeFXPR84y5BUnaKAfFsVc,1040
811
+ policyengine_uk/variables/gov/dwp/basic_state_pension.py,sha256=FQbEQPDakKwTwnrQ3g9b6OWv29a_GNWK8kdkJtK34ek,1014
807
812
  policyengine_uk/variables/gov/dwp/benefit_cap.py,sha256=x6ad7zFYKX6jaNoXV8xj0Hql5O3HraXKZlFFmxYGuSU,1287
808
813
  policyengine_uk/variables/gov/dwp/benefit_cap_reduction.py,sha256=lbRftEtfkQQOt5ojhNnRYlinnDGiqTH9XwAd2fdR7Kg,777
809
814
  policyengine_uk/variables/gov/dwp/bsp.py,sha256=D8WzwacEe789RHAIvB5RYQ1NOq9nsoFMNhDPrvb4qM0,221
@@ -1240,6 +1245,7 @@ policyengine_uk/variables/household/demographic/severe_disability_premium.py,sha
1240
1245
  policyengine_uk/variables/household/demographic/tenure_type.py,sha256=9V40d4ihG6lQ1dZXFKNjVTwChDXvKGTOR3tUGkaMhEg,522
1241
1246
  policyengine_uk/variables/household/demographic/youngest_adult_age.py,sha256=_T_8VEyKCSq31Ho70SZZBpkqbeFBNFDeJ6G6Edrn_y0,425
1242
1247
  policyengine_uk/variables/household/demographic/youngest_child_age.py,sha256=6Tmhbiu8puCBQDYlWwxbpVRuddd7HkraDNyg1tuV5PE,425
1248
+ policyengine_uk/variables/household/demographic/benunit/benunit_count_adults.py,sha256=D82SiPCWFFQSYppWH5CPU6yfQVQ7h1SS4hYeAeYNeww,299
1243
1249
  policyengine_uk/variables/household/demographic/benunit/benunit_count_children.py,sha256=dvOsBE_tCtaWtsjY1NfOw29OvXgfFWTk1hhlLIdfgJE,303
1244
1250
  policyengine_uk/variables/household/income/base_net_income.py,sha256=9WcVGU3QbCJcIiSvVP65c0-fwhiiDKviqMGD-XKZvBQ,282
1245
1251
  policyengine_uk/variables/household/income/baseline_hbai_excluded_income.py,sha256=qlLnaZIPuX1n14HbsDOhUo5hHYFTFBoTp-qlUUj83Z0,638
@@ -1338,7 +1344,7 @@ policyengine_uk/variables/input/pip_m_category.py,sha256=UfgnVrg5p5bR5n1jdcJb8qo
1338
1344
  policyengine_uk/variables/input/private_pension_income.py,sha256=nquIdGsghUZtXY8nWCJM6qsd9zg9jCsuwiXPf3khYQk,473
1339
1345
  policyengine_uk/variables/input/private_transfer_income.py,sha256=gS8QXT__YKCHAqQWrupujXTre-INgJftup4Y_IpZIqw,329
1340
1346
  policyengine_uk/variables/input/property_income.py,sha256=o0JeFu77h9N8LWjlLDw55c8fRBrdcY5lWW_w0tGgnNA,413
1341
- policyengine_uk/variables/input/rent.py,sha256=fUEjF0qkDfvniAPaT6FgoWlEVgH3fmIZuWcZlrYjVIQ,1521
1347
+ policyengine_uk/variables/input/rent.py,sha256=yurkmlodw9KB50FRGA0vCMS_hZ4hgNRjTgNg4IrVs5Q,296
1342
1348
  policyengine_uk/variables/input/savings_interest_income.py,sha256=B8AXrGGPl4MI9nvBaOKI-QYdm35qwNSVQxtpNWEosHA,448
1343
1349
  policyengine_uk/variables/input/self_employment_income.py,sha256=66eqP3jk3czOpmxA6wQOtsWM0Ll9lU2cw4_kuc7SgUA,492
1344
1350
  policyengine_uk/variables/input/state_pension.py,sha256=o4LrBumOYadV-lZ6NC5-3lvafkLVJ_RNKjTrclQA0N4,957
@@ -1362,7 +1368,7 @@ policyengine_uk/variables/input/consumption/recreation_consumption.py,sha256=47I
1362
1368
  policyengine_uk/variables/input/consumption/restaurants_and_hotels_consumption.py,sha256=plke30Xdy_zFvjqkXOhWtVdYqE8NfwMKnWaOD5n4IdM,464
1363
1369
  policyengine_uk/variables/input/consumption/transport_consumption.py,sha256=5JfmRMpap6GOGZwl0PIRyUJvDaZrQyelEUE9z61GAfI,425
1364
1370
  policyengine_uk/variables/input/consumption/property/README.md,sha256=IP9_pLLNXMHRMS5sEjRRqsM1nQMffQC2PJII-z-I6wI,11
1365
- policyengine_uk/variables/input/consumption/property/council_tax.py,sha256=sGrFXHO9JWqlzChroCoZbQKnd2vhfysRVmeJxwg0zys,1360
1371
+ policyengine_uk/variables/input/consumption/property/council_tax.py,sha256=QtcI4JcufejJ-8MVqntcXYP5I_5YuhXeigo3eDkSmRA,291
1366
1372
  policyengine_uk/variables/input/consumption/property/cumulative_non_residential_rent.py,sha256=rhqlRphsTMSx2Xij-B9RjSZeuLTjAyt3sx2VK66Nkf8,338
1367
1373
  policyengine_uk/variables/input/consumption/property/cumulative_residential_rent.py,sha256=KMbISuubgfGaH34kJDe_tfOsKzVUHSJneDhyd-fLeI4,326
1368
1374
  policyengine_uk/variables/input/consumption/property/employee_pension_contributions.py,sha256=J8Ead71hjCZ0vktrl9MbMMgsPCWsdPWSTbVPsVYkgcU,293
@@ -1380,7 +1386,7 @@ policyengine_uk/variables/misc/spi_imputed.py,sha256=iPVlBF_TisM0rtKvO-3-PQ2UYCe
1380
1386
  policyengine_uk/variables/misc/uc_migrated.py,sha256=zFNcUJaO8gwmbL1iY9GKgUt3G6J9yrCraqBV_5dCvlM,306
1381
1387
  policyengine_uk/variables/misc/categories/lower_middle_or_higher.py,sha256=C54tHYz2DmOyvQYCC1bF8RJwRZinhAq_e3aYC-9F5fM,157
1382
1388
  policyengine_uk/variables/misc/categories/lower_or_higher.py,sha256=81NIbLLabRr9NwjpUZDuV8IV8_mqmp5NM-CZvt55TwE,129
1383
- policyengine_uk-2.45.4.dist-info/METADATA,sha256=76Kz17OUMRmIFC-_BSoR4K2jqZJYz9Sl1H_Jt_cRd3Q,3919
1384
- policyengine_uk-2.45.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1385
- policyengine_uk-2.45.4.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1386
- policyengine_uk-2.45.4.dist-info/RECORD,,
1389
+ policyengine_uk-2.47.2.dist-info/METADATA,sha256=iKd-_31YEGeJA1CqRvD2CWN_36SR840qoYoPvFTLnrk,3965
1390
+ policyengine_uk-2.47.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1391
+ policyengine_uk-2.47.2.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1392
+ policyengine_uk-2.47.2.dist-info/RECORD,,