policyengine 6.2.5__tar.gz → 6.2.7__tar.gz

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.
Files changed (320) hide show
  1. {policyengine-6.2.5 → policyengine-6.2.7}/CHANGELOG.md +14 -0
  2. {policyengine-6.2.5/src/policyengine.egg-info → policyengine-6.2.7}/PKG-INFO +8 -8
  3. {policyengine-6.2.5 → policyengine-6.2.7}/docs/households.md +6 -2
  4. {policyengine-6.2.5 → policyengine-6.2.7}/docs/reforms.md +13 -1
  5. {policyengine-6.2.5 → policyengine-6.2.7}/pyproject.toml +8 -8
  6. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/data/bundle/manifest.json +48 -48
  7. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/data/bundle/uk.trace.tro.jsonld +21 -21
  8. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/data/bundle/us.trace.tro.jsonld +5 -5
  9. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/common/reform.py +50 -9
  10. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/uk/household.py +14 -5
  11. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/uk/model.py +36 -15
  12. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/parametric_reforms.py +18 -4
  13. {policyengine-6.2.5 → policyengine-6.2.7/src/policyengine.egg-info}/PKG-INFO +8 -8
  14. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine.egg-info/SOURCES.txt +1 -0
  15. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine.egg-info/requires.txt +7 -7
  16. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/uk_couple_two_kids.json +5 -5
  17. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/uk_model_surface.json +2 -2
  18. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/uk_single_adult_employment_income.json +1 -1
  19. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/uk_single_parent_one_child.json +1 -1
  20. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_dict_reforms_on_simulation.py +98 -2
  21. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_household_impact.py +1 -2
  22. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_models.py +3 -3
  23. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_release_manifests.py +7 -7
  24. policyengine-6.2.7/tests/test_uk_dated_reforms.py +305 -0
  25. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_uk_regions.py +1 -1
  26. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_variable_metadata.py +4 -4
  27. {policyengine-6.2.5 → policyengine-6.2.7}/uv.lock +14 -14
  28. {policyengine-6.2.5 → policyengine-6.2.7}/.claude/policyengine-guide.md +0 -0
  29. {policyengine-6.2.5 → policyengine-6.2.7}/.claude/quick-reference.md +0 -0
  30. {policyengine-6.2.5 → policyengine-6.2.7}/.github/CONTRIBUTING.md +0 -0
  31. {policyengine-6.2.5 → policyengine-6.2.7}/.github/bump_version.py +0 -0
  32. {policyengine-6.2.5 → policyengine-6.2.7}/.github/capture-version.sh +0 -0
  33. {policyengine-6.2.5 → policyengine-6.2.7}/.github/changelog_template.md +0 -0
  34. {policyengine-6.2.5 → policyengine-6.2.7}/.github/check-changelog.sh +0 -0
  35. {policyengine-6.2.5 → policyengine-6.2.7}/.github/copilot-instructions.md +0 -0
  36. {policyengine-6.2.5 → policyengine-6.2.7}/.github/dispatch-policyengine-release.sh +0 -0
  37. {policyengine-6.2.5 → policyengine-6.2.7}/.github/fetch_version.py +0 -0
  38. {policyengine-6.2.5 → policyengine-6.2.7}/.github/get-changelog-diff.sh +0 -0
  39. {policyengine-6.2.5 → policyengine-6.2.7}/.github/has-functional-changes.sh +0 -0
  40. {policyengine-6.2.5 → policyengine-6.2.7}/.github/is-version-number-acceptable.sh +0 -0
  41. {policyengine-6.2.5 → policyengine-6.2.7}/.github/publish-git-tag.sh +0 -0
  42. {policyengine-6.2.5 → policyengine-6.2.7}/.github/wait-for-pypi.sh +0 -0
  43. {policyengine-6.2.5 → policyengine-6.2.7}/.github/workflows/draft-pdf.yml +0 -0
  44. {policyengine-6.2.5 → policyengine-6.2.7}/.github/workflows/pr_code_changes.yaml +0 -0
  45. {policyengine-6.2.5 → policyengine-6.2.7}/.github/workflows/pr_docs_changes.yaml +0 -0
  46. {policyengine-6.2.5 → policyengine-6.2.7}/.github/workflows/push.yaml +0 -0
  47. {policyengine-6.2.5 → policyengine-6.2.7}/.gitignore +0 -0
  48. {policyengine-6.2.5 → policyengine-6.2.7}/.python-version +0 -0
  49. {policyengine-6.2.5 → policyengine-6.2.7}/AGENTS.md +0 -0
  50. {policyengine-6.2.5 → policyengine-6.2.7}/CITATION.cff +0 -0
  51. {policyengine-6.2.5 → policyengine-6.2.7}/CLAUDE.md +0 -0
  52. {policyengine-6.2.5 → policyengine-6.2.7}/CODE_OF_CONDUCT.md +0 -0
  53. {policyengine-6.2.5 → policyengine-6.2.7}/CONTRIBUTING.md +0 -0
  54. {policyengine-6.2.5 → policyengine-6.2.7}/LICENSE +0 -0
  55. {policyengine-6.2.5 → policyengine-6.2.7}/Makefile +0 -0
  56. {policyengine-6.2.5 → policyengine-6.2.7}/README.md +0 -0
  57. {policyengine-6.2.5 → policyengine-6.2.7}/architecture.png +0 -0
  58. {policyengine-6.2.5 → policyengine-6.2.7}/architecture.svg +0 -0
  59. {policyengine-6.2.5 → policyengine-6.2.7}/changelog.d/.gitkeep +0 -0
  60. {policyengine-6.2.5 → policyengine-6.2.7}/docs/.gitignore +0 -0
  61. {policyengine-6.2.5 → policyengine-6.2.7}/docs/_generator/README.md +0 -0
  62. {policyengine-6.2.5 → policyengine-6.2.7}/docs/_generator/build_reference.py +0 -0
  63. {policyengine-6.2.5 → policyengine-6.2.7}/docs/_quarto.yml +0 -0
  64. {policyengine-6.2.5 → policyengine-6.2.7}/docs/bundles.md +0 -0
  65. {policyengine-6.2.5 → policyengine-6.2.7}/docs/countries.md +0 -0
  66. {policyengine-6.2.5 → policyengine-6.2.7}/docs/data-publishing-design.md +0 -0
  67. {policyengine-6.2.5 → policyengine-6.2.7}/docs/decile-impact-spec.md +0 -0
  68. {policyengine-6.2.5 → policyengine-6.2.7}/docs/dev.md +0 -0
  69. {policyengine-6.2.5 → policyengine-6.2.7}/docs/engineering/runbooks/acs-local-wic-replacement.md +0 -0
  70. {policyengine-6.2.5 → policyengine-6.2.7}/docs/engineering/runbooks/build-m-us-populace-certification.md +0 -0
  71. {policyengine-6.2.5 → policyengine-6.2.7}/docs/engineering/runbooks/canonical-spm-development.md +0 -0
  72. {policyengine-6.2.5 → policyengine-6.2.7}/docs/engineering/skills/README.md +0 -0
  73. {policyengine-6.2.5 → policyengine-6.2.7}/docs/engineering/skills/data-certification.md +0 -0
  74. {policyengine-6.2.5 → policyengine-6.2.7}/docs/engineering/skills/github-prs.md +0 -0
  75. {policyengine-6.2.5 → policyengine-6.2.7}/docs/engineering/skills/repository-guidance.md +0 -0
  76. {policyengine-6.2.5 → policyengine-6.2.7}/docs/examples.md +0 -0
  77. {policyengine-6.2.5 → policyengine-6.2.7}/docs/getting-started.md +0 -0
  78. {policyengine-6.2.5 → policyengine-6.2.7}/docs/impact-analysis.md +0 -0
  79. {policyengine-6.2.5 → policyengine-6.2.7}/docs/index.md +0 -0
  80. {policyengine-6.2.5 → policyengine-6.2.7}/docs/methodology/index.md +0 -0
  81. {policyengine-6.2.5 → policyengine-6.2.7}/docs/methodology/model-architecture.md +0 -0
  82. {policyengine-6.2.5 → policyengine-6.2.7}/docs/methodology/us-health-costs.md +0 -0
  83. {policyengine-6.2.5 → policyengine-6.2.7}/docs/microsim.md +0 -0
  84. {policyengine-6.2.5 → policyengine-6.2.7}/docs/outputs.md +0 -0
  85. {policyengine-6.2.5 → policyengine-6.2.7}/docs/programs/index.md +0 -0
  86. {policyengine-6.2.5 → policyengine-6.2.7}/docs/programs/us-chip.md +0 -0
  87. {policyengine-6.2.5 → policyengine-6.2.7}/docs/reference/index.md +0 -0
  88. {policyengine-6.2.5 → policyengine-6.2.7}/docs/regions.md +0 -0
  89. {policyengine-6.2.5 → policyengine-6.2.7}/docs/release-bundles.md +0 -0
  90. {policyengine-6.2.5 → policyengine-6.2.7}/docs/run-records.md +0 -0
  91. {policyengine-6.2.5 → policyengine-6.2.7}/docs/trace-case-study.md +0 -0
  92. {policyengine-6.2.5 → policyengine-6.2.7}/docs/visualisation.md +0 -0
  93. {policyengine-6.2.5 → policyengine-6.2.7}/examples/belgium_axiom_pilot.py +0 -0
  94. {policyengine-6.2.5 → policyengine-6.2.7}/examples/employment_income_variation_uk.py +0 -0
  95. {policyengine-6.2.5 → policyengine-6.2.7}/examples/employment_income_variation_us.py +0 -0
  96. {policyengine-6.2.5 → policyengine-6.2.7}/examples/household_impact_example.py +0 -0
  97. {policyengine-6.2.5 → policyengine-6.2.7}/examples/income_bands_uk.py +0 -0
  98. {policyengine-6.2.5 → policyengine-6.2.7}/examples/income_distribution_us.py +0 -0
  99. {policyengine-6.2.5 → policyengine-6.2.7}/examples/paper_repro_uk.py +0 -0
  100. {policyengine-6.2.5 → policyengine-6.2.7}/examples/policy_change_uk.py +0 -0
  101. {policyengine-6.2.5 → policyengine-6.2.7}/examples/speedtest_us_simulation.py +0 -0
  102. {policyengine-6.2.5 → policyengine-6.2.7}/examples/us_budgetary_impact.py +0 -0
  103. {policyengine-6.2.5 → policyengine-6.2.7}/paper-preview.html +0 -0
  104. {policyengine-6.2.5 → policyengine-6.2.7}/paper.bib +0 -0
  105. {policyengine-6.2.5 → policyengine-6.2.7}/paper.md +0 -0
  106. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/bundle.py +0 -0
  107. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/certify_data_release.py +0 -0
  108. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/check_data_staleness.py +0 -0
  109. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/check_native_spm_loading.py +0 -0
  110. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/check_release_credentials.py +0 -0
  111. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/export_bundle_release_assets.py +0 -0
  112. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/generate_bundle_artifacts.py +0 -0
  113. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/generate_trace_tros.py +0 -0
  114. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/prepare_package_bundle_update.py +0 -0
  115. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/release_lock.py +0 -0
  116. {policyengine-6.2.5 → policyengine-6.2.7}/scripts/spm_bundle.py +0 -0
  117. {policyengine-6.2.5 → policyengine-6.2.7}/setup.cfg +0 -0
  118. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/__init__.py +0 -0
  119. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/bundle.py +0 -0
  120. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/cli.py +0 -0
  121. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/__init__.py +0 -0
  122. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/cache.py +0 -0
  123. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/dataset.py +0 -0
  124. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/dynamic.py +0 -0
  125. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/output.py +0 -0
  126. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/parameter.py +0 -0
  127. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/parameter_node.py +0 -0
  128. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/parameter_value.py +0 -0
  129. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/policy.py +0 -0
  130. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/region.py +0 -0
  131. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/run_record.py +0 -0
  132. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/scoping_strategy.py +0 -0
  133. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/simulation.py +0 -0
  134. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/spm.py +0 -0
  135. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/tax_benefit_model.py +0 -0
  136. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/tax_benefit_model_version.py +0 -0
  137. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/core/variable.py +0 -0
  138. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/countries/__init__.py +0 -0
  139. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/countries/uk/__init__.py +0 -0
  140. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/countries/uk/regions.py +0 -0
  141. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/countries/us/__init__.py +0 -0
  142. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/countries/us/data/__init__.py +0 -0
  143. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/countries/us/data/districts.py +0 -0
  144. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/countries/us/data/places.py +0 -0
  145. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/countries/us/data/states.py +0 -0
  146. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/countries/us/regions.py +0 -0
  147. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/data/__init__.py +0 -0
  148. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/data/schemas/trace_tro.schema.json +0 -0
  149. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/data/uk_geography_assets.py +0 -0
  150. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/derivations/__init__.py +0 -0
  151. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/derivations/narrate.py +0 -0
  152. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/derivations/trace.py +0 -0
  153. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/graph/__init__.py +0 -0
  154. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/graph/extractor.py +0 -0
  155. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/graph/graph.py +0 -0
  156. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/__init__.py +0 -0
  157. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/aggregate.py +0 -0
  158. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/change_aggregate.py +0 -0
  159. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/cliff_impact.py +0 -0
  160. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/congressional_district_impact.py +0 -0
  161. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/constituency_impact.py +0 -0
  162. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/decile_analysis.py +0 -0
  163. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/decile_grouping.py +0 -0
  164. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/decile_impact.py +0 -0
  165. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/extra_variables.py +0 -0
  166. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/inequality.py +0 -0
  167. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/intra_decile_impact.py +0 -0
  168. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/labor_supply_response.py +0 -0
  169. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/local_authority_impact.py +0 -0
  170. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/poverty.py +0 -0
  171. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/program_statistics.py +0 -0
  172. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/uk_geography_assets.py +0 -0
  173. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/outputs/uk_geography_impact.py +0 -0
  174. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/__init__.py +0 -0
  175. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/bundle_validation.py +0 -0
  176. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/certification.py +0 -0
  177. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/dataset_materialization.py +0 -0
  178. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/manifest.py +0 -0
  179. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/pyproject_pins.py +0 -0
  180. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/spm_configuration.py +0 -0
  181. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/trace.py +0 -0
  182. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/verify.py +0 -0
  183. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/provenance/zenodo.py +0 -0
  184. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/results/__init__.py +0 -0
  185. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/results/schema.py +0 -0
  186. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/results/trace_tro.py +0 -0
  187. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/results/tracking.py +0 -0
  188. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/be/__init__.py +0 -0
  189. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/be/datasets.py +0 -0
  190. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/be/model.py +0 -0
  191. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/common/__init__.py +0 -0
  192. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/common/axes.py +0 -0
  193. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/common/extra_variables.py +0 -0
  194. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/common/household.py +0 -0
  195. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/common/model_version.py +0 -0
  196. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/common/result.py +0 -0
  197. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/uk/__init__.py +0 -0
  198. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/uk/analysis.py +0 -0
  199. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/uk/datasets.py +0 -0
  200. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/us/__init__.py +0 -0
  201. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/us/analysis.py +0 -0
  202. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/us/datasets.py +0 -0
  203. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/us/household.py +0 -0
  204. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/us/legacy_inputs.py +0 -0
  205. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/us/model.py +0 -0
  206. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/tax_benefit_models/us/spm.py +0 -0
  207. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/__init__.py +0 -0
  208. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/dates.py +0 -0
  209. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/design.py +0 -0
  210. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/entity_utils.py +0 -0
  211. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/errors.py +0 -0
  212. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/hashing.py +0 -0
  213. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/household_validation.py +0 -0
  214. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/parameter_labels.py +0 -0
  215. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine/utils/plotting.py +0 -0
  216. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine.egg-info/dependency_links.txt +0 -0
  217. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine.egg-info/entry_points.txt +0 -0
  218. {policyengine-6.2.5 → policyengine-6.2.7}/src/policyengine.egg-info/top_level.txt +0 -0
  219. {policyengine-6.2.5 → policyengine-6.2.7}/tests/__init__.py +0 -0
  220. {policyengine-6.2.5 → policyengine-6.2.7}/tests/conftest.py +0 -0
  221. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/__init__.py +0 -0
  222. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/filtering_fixtures.py +0 -0
  223. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/uk_single_adult_no_income.json +0 -0
  224. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/us_married_two_kids_high_income.json +0 -0
  225. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/us_model_surface.json +0 -0
  226. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/us_single_adult_employment_income.json +0 -0
  227. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/us_single_adult_no_income.json +0 -0
  228. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/household_calculator_snapshots/us_single_parent_one_child.json +0 -0
  229. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/parameter_labels_fixtures.py +0 -0
  230. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/parametric_reforms_fixtures.py +0 -0
  231. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/poverty_by_demographics_fixtures.py +0 -0
  232. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/region_fixtures.py +0 -0
  233. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/release_tros/README.md +0 -0
  234. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/release_tros/country-models.lock.toml +0 -0
  235. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/release_tros/manifest.json +0 -0
  236. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/release_tros/us-release_manifest.json +0 -0
  237. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/release_tros/us.trace.tro.jsonld +0 -0
  238. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/spm_development.py +0 -0
  239. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/us_reform_fixtures.py +0 -0
  240. {policyengine-6.2.5 → policyengine-6.2.7}/tests/fixtures/variable_label_fixtures.py +0 -0
  241. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_aggregate.py +0 -0
  242. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_be_axiom_pilot.py +0 -0
  243. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_budgetary_impact.py +0 -0
  244. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_bump_version.py +0 -0
  245. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_bundle.py +0 -0
  246. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_bundle_metadata.py +0 -0
  247. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_cache.py +0 -0
  248. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_certify_data_release.py +0 -0
  249. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_change_aggregate.py +0 -0
  250. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_cliff_impact.py +0 -0
  251. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_cliff_impact_analysis.py +0 -0
  252. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_congressional_district_impact.py +0 -0
  253. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_constituency_impact.py +0 -0
  254. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_dataset_materialization.py +0 -0
  255. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_dataset_persistence.py +0 -0
  256. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_dataset_runtime.py +0 -0
  257. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_dataset_source.py +0 -0
  258. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_decile_grouping.py +0 -0
  259. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_derivations.py +0 -0
  260. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_entity_mapping.py +0 -0
  261. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_entity_utils.py +0 -0
  262. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_entity_utils_characterization.py +0 -0
  263. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_errors.py +0 -0
  264. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_extra_variables.py +0 -0
  265. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_filtering.py +0 -0
  266. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_generate_trace_tros.py +0 -0
  267. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_graph/__init__.py +0 -0
  268. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_graph/conftest.py +0 -0
  269. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_graph/test_extractor.py +0 -0
  270. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_household_calculator_snapshot.py +0 -0
  271. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_inequality.py +0 -0
  272. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_intra_decile_impact.py +0 -0
  273. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_labor_supply_response.py +0 -0
  274. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_local_authority_impact.py +0 -0
  275. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_manifest_version_mismatch.py +0 -0
  276. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_pandas3_compatibility.py +0 -0
  277. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_parameter_labels.py +0 -0
  278. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_parameter_nodes.py +0 -0
  279. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_parameter_values.py +0 -0
  280. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_parametric_reforms.py +0 -0
  281. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_poverty.py +0 -0
  282. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_poverty_by_demographics.py +0 -0
  283. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_poverty_run.py +0 -0
  284. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_preservation_mirror.py +0 -0
  285. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_program_statistics.py +0 -0
  286. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_pyproject_pins.py +0 -0
  287. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_region.py +0 -0
  288. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_region_group_strategy.py +0 -0
  289. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_release_credentials.py +0 -0
  290. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_release_lock.py +0 -0
  291. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_release_tro_generation.py +0 -0
  292. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_results.py +0 -0
  293. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_run_record.py +0 -0
  294. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_scoping_strategy.py +0 -0
  295. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_small_follow_ups.py +0 -0
  296. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_spm_bundle_bootstrap.py +0 -0
  297. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_spm_bundle_tooling.py +0 -0
  298. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_spm_decile.py +0 -0
  299. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_spm_development_authentication.py +0 -0
  300. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_spm_household.py +0 -0
  301. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_spm_model.py +0 -0
  302. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_spm_selection.py +0 -0
  303. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_spm_selection_schema.py +0 -0
  304. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_trace_tro.py +0 -0
  305. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_trace_tro_verify.py +0 -0
  306. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_uk_analysis.py +0 -0
  307. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_uk_geography_assets.py +0 -0
  308. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_uk_program_statistics.py +0 -0
  309. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_uk_year_file_data_year.py +0 -0
  310. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_us_legacy_inputs.py +0 -0
  311. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_us_legacy_inputs_integration.py +0 -0
  312. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_us_long_term_datasets.py +0 -0
  313. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_us_microsim_structural_reforms.py +0 -0
  314. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_us_native_alignment.py +0 -0
  315. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_us_native_hdf_weights.py +0 -0
  316. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_us_program_statistics.py +0 -0
  317. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_us_reform_application.py +0 -0
  318. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_us_regions.py +0 -0
  319. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_variable_labels.py +0 -0
  320. {policyengine-6.2.5 → policyengine-6.2.7}/tests/test_zenodo_mirror.py +0 -0
@@ -1,3 +1,17 @@
1
+ ## [6.2.7] - 2026-10-12
2
+
3
+ ### Fixed
4
+
5
+ - Align UK household and population reform routes with policy effective dates and inclusive date intervals, reject ambiguous bare-year keys, and pass parameter reforms at country-model construction so dated changes are reprocessed when supported by policyengine-uk. A UK policy or dynamic carrying both parameter values and a simulation modifier (as a `Policy` or `Dynamic` sum does) now applies its values and then its modifier, where the modifier used to replace the values.
6
+
7
+
8
+ ## [6.2.6] - 2026-10-10
9
+
10
+ ### Changed
11
+
12
+ - Certify policyengine-uk-data 1.58.0 (`enhanced_frs_2024_25`) as the UK default, and pin policyengine-uk 2.125.1 and policyengine-core 3.33.0. The data was built with policyengine-uk 2.122.2 and core 3.32.13; the publisher's compatibility claim in the 1.58.0 release manifest covers the newer versions. UK results change with the new data release and with the policyengine-uk updates since 2.102.3, including Housing Benefit's Guarantee Credit passport now keyed on receipt.
13
+
14
+
1
15
  ## [6.2.5] - 2026-10-09
2
16
 
3
17
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine
3
- Version: 6.2.5
3
+ Version: 6.2.7
4
4
  Summary: A package to conduct policy analysis using PolicyEngine tax-benefit models.
5
5
  Author-email: PolicyEngine <hello@policyengine.org>
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -685,15 +685,15 @@ Requires-Dist: plotly>=5.0.0; extra == "plotting"
685
685
  Provides-Extra: graph
686
686
  Requires-Dist: networkx>=3.0; extra == "graph"
687
687
  Provides-Extra: models
688
- Requires-Dist: policyengine-core==3.32.10; extra == "models"
688
+ Requires-Dist: policyengine-core==3.33.0; extra == "models"
689
689
  Requires-Dist: policyengine-us==2.2.1; extra == "models"
690
- Requires-Dist: policyengine-uk==2.102.3; extra == "models"
690
+ Requires-Dist: policyengine-uk==2.125.1; extra == "models"
691
691
  Requires-Dist: spm-calculator==1.0.0; extra == "models"
692
692
  Provides-Extra: uk
693
- Requires-Dist: policyengine-core==3.32.10; extra == "uk"
694
- Requires-Dist: policyengine-uk==2.102.3; extra == "uk"
693
+ Requires-Dist: policyengine-core==3.33.0; extra == "uk"
694
+ Requires-Dist: policyengine-uk==2.125.1; extra == "uk"
695
695
  Provides-Extra: us
696
- Requires-Dist: policyengine-core==3.32.10; extra == "us"
696
+ Requires-Dist: policyengine-core==3.33.0; extra == "us"
697
697
  Requires-Dist: policyengine-us==2.2.1; extra == "us"
698
698
  Requires-Dist: spm-calculator==1.0.0; extra == "us"
699
699
  Provides-Extra: dev
@@ -711,9 +711,9 @@ Requires-Dist: towncrier>=24.8.0; extra == "dev"
711
711
  Requires-Dist: mypy>=1.11.0; extra == "dev"
712
712
  Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
713
713
  Requires-Dist: hypothesis>=6.100.0; extra == "dev"
714
- Requires-Dist: policyengine-core==3.32.10; extra == "dev"
714
+ Requires-Dist: policyengine-core==3.33.0; extra == "dev"
715
715
  Requires-Dist: policyengine-us==2.2.1; extra == "dev"
716
- Requires-Dist: policyengine-uk==2.102.3; extra == "dev"
716
+ Requires-Dist: policyengine-uk==2.125.1; extra == "dev"
717
717
  Requires-Dist: spm-calculator==1.0.0; extra == "dev"
718
718
  Dynamic: license-file
719
719
 
@@ -106,7 +106,7 @@ separate benefit inputs; they do not override SPM measurement composition.
106
106
 
107
107
  These changes require the coordinated canonical country/calculator bundle, which
108
108
  the packaged production manifest now pins and certifies: `policyengine-us`
109
- 2.2.1, `policyengine-core` 3.32.10, `spm-calculator` 1.0.0, and the US data
109
+ 2.2.1, `policyengine-core` 3.33.0, `spm-calculator` 1.0.0, and the US data
110
110
  release `populace-us-2024-spm-20260915`. Local-wheel development manifest
111
111
  fixtures remain explicitly uncertified. The measurement receipt identifies a
112
112
  calculation; it does not certify a population dataset or establish publication
@@ -150,7 +150,7 @@ Scale parameters use bracket indexing:
150
150
  reform = {"gov.irs.credits.ctc.amount.base[0].amount": 3_000}
151
151
  ```
152
152
 
153
- Time-varying reforms use a nested dict of `YYYY-MM-DD → value`:
153
+ Time-varying reforms use a nested dict of date keys to values:
154
154
 
155
155
  ```python
156
156
  reform = {
@@ -161,6 +161,10 @@ reform = {
161
161
  }
162
162
  ```
163
163
 
164
+ For UK households, a `YYYY-MM-DD` key is effective from that date until the next value for the same parameter, or December 31, 2100 if no later value follows. A `YYYY-MM-DD.YYYY-MM-DD` key applies over that inclusive interval. Scalar values default to January 1 of `year`.
165
+
166
+ UK households reject bare years such as `"2027"` or `2027`, because the underlying packages assign different meanings to them. Use `"2027-04-06.2028-04-05"` for one UK fiscal year or `"2027-01-01"` for an effective date. See [Reforms](reforms.md) for the shared `Simulation(policy=...)` and `Simulation(dynamic=...)` date contract. The US household route retains its country package's period-key handling.
167
+
164
168
  Structural reforms (new variables, formula swaps) require the `Simulation` path — see [Reforms](reforms.md).
165
169
 
166
170
  ## Year
@@ -29,7 +29,19 @@ reform = {
29
29
  }
30
30
  ```
31
31
 
32
- Dates that haven't passed become "from this date onward." Earlier dates replace the baseline schedule.
32
+ A `YYYY-MM-DD` key is an effective date: its value applies from that date until the next date in the same parameter's reform schedule. If no later value follows, the wrapper emits an interval ending on December 31, 2100.
33
+
34
+ Use `YYYY-MM-DD.YYYY-MM-DD` for an inclusive interval. For example, this UK reform applies for fiscal year 2027 only:
35
+
36
+ ```python
37
+ reform = {
38
+ "gov.hmrc.income_tax.rates.uk[0].rate": {
39
+ "2027-04-06.2028-04-05": 0.21,
40
+ },
41
+ }
42
+ ```
43
+
44
+ `Simulation(policy=...)`, `Simulation(dynamic=...)`, and UK `calculate_household(reform=...)` accept these two date formats and reject an interval whose end precedes its start. They reject bare years such as `"2027"` or `2027`, because policyengine-uk reads them as fiscal year 2027 only, while policyengine-core's `Reform.from_dict` reads them as from 2027 onward. Use `"2027-04-06.2028-04-05"` for one UK fiscal year or `"2027-01-01"` for an effective date. The US household route retains its country package's period-key handling.
33
45
 
34
46
  ### Multiple changes
35
47
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "policyengine"
7
- version = "6.2.5"
7
+ version = "6.2.7"
8
8
  description = "A package to conduct policy analysis using PolicyEngine tax-benefit models."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -40,17 +40,17 @@ graph = [
40
40
  "networkx>=3.0",
41
41
  ]
42
42
  models = [
43
- "policyengine-core==3.32.10",
43
+ "policyengine-core==3.33.0",
44
44
  "policyengine-us==2.2.1",
45
- "policyengine-uk==2.102.3",
45
+ "policyengine-uk==2.125.1",
46
46
  "spm-calculator==1.0.0",
47
47
  ]
48
48
  uk = [
49
- "policyengine-core==3.32.10",
50
- "policyengine-uk==2.102.3",
49
+ "policyengine-core==3.33.0",
50
+ "policyengine-uk==2.125.1",
51
51
  ]
52
52
  us = [
53
- "policyengine-core==3.32.10",
53
+ "policyengine-core==3.33.0",
54
54
  "policyengine-us==2.2.1",
55
55
  "spm-calculator==1.0.0",
56
56
  ]
@@ -69,9 +69,9 @@ dev = [
69
69
  "mypy>=1.11.0",
70
70
  "pytest-cov>=5.0.0",
71
71
  "hypothesis>=6.100.0",
72
- "policyengine-core==3.32.10",
72
+ "policyengine-core==3.33.0",
73
73
  "policyengine-us==2.2.1",
74
- "policyengine-uk==2.102.3",
74
+ "policyengine-uk==2.125.1",
75
75
  "spm-calculator==1.0.0",
76
76
  ]
77
77
 
@@ -1,10 +1,10 @@
1
1
  {
2
- "bundle_version": "6.2.5",
2
+ "bundle_version": "6.2.7",
3
3
  "citation": {
4
4
  "publisher": "PolicyEngine",
5
- "title": "PolicyEngine bundle 6.2.5",
5
+ "title": "PolicyEngine bundle 6.2.7",
6
6
  "type": "software-bundle",
7
- "version": "6.2.5"
7
+ "version": "6.2.7"
8
8
  },
9
9
  "countries": {
10
10
  "uk": {
@@ -16,103 +16,103 @@
16
16
  },
17
17
  "data_releases": {
18
18
  "uk": {
19
- "build_id": "policyengine-uk-data-1.56.16",
20
- "bundle_id": "uk-6.2.5",
19
+ "build_id": "policyengine-uk-data-1.58.0",
20
+ "bundle_id": "uk-6.2.7",
21
21
  "certification": {
22
- "built_with_model_git_sha": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3",
23
- "built_with_model_version": "2.89.2",
22
+ "built_with_model_git_sha": "4cbedbecca352f52dffe47e849553c2759a00711",
23
+ "built_with_model_version": "2.122.2",
24
24
  "certified_by": "policyengine.py bundle certification",
25
- "certified_for_model_version": "2.102.3",
25
+ "certified_for_model_version": "2.125.1",
26
26
  "compatibility_basis": "legacy_compatible_model_package",
27
- "data_build_fingerprint": "sha256:6bfff835b504094c05342d2b4d770d2d94c8c1adcb15c4468931f53b21a89ea9",
28
- "data_build_id": "policyengine-uk-data-1.56.16"
27
+ "data_build_fingerprint": "sha256:c094d7006fdd81df220090284212f16bbffb15624643bc442c4bb3e1b1e5dac8",
28
+ "data_build_id": "policyengine-uk-data-1.58.0"
29
29
  },
30
30
  "certified_data_artifact": {
31
- "build_id": "policyengine-uk-data-1.56.16",
31
+ "build_id": "policyengine-uk-data-1.58.0",
32
32
  "data_package": {
33
33
  "name": "policyengine-uk-data",
34
- "version": "1.56.16"
34
+ "version": "1.58.0"
35
35
  },
36
36
  "dataset": "enhanced_frs_2024_25",
37
- "sha256": "e433e532b17bd8ce76030156285816e33d44e93edabd2204adbef71d19a68712",
38
- "uri": "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@1.56.16"
37
+ "sha256": "5ba399ea5ab9a6c7d4e9aaf6c623080beb34d9ad5f330f6244dbad72b8d960b6",
38
+ "uri": "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@1.58.0"
39
39
  },
40
40
  "country_id": "uk",
41
41
  "data_package": {
42
42
  "name": "policyengine-uk-data",
43
- "release_manifest_path": "releases/1.56.16/release_manifest.json",
44
- "release_manifest_revision": "78788372fec47fc8df835bd32307ef61eaed83c2",
43
+ "release_manifest_path": "releases/1.58.0/release_manifest.json",
44
+ "release_manifest_revision": "fdeba38517bd86067f34c0a5d8ed8923efb3b10a",
45
45
  "repo_id": "policyengine/policyengine-uk-data-private",
46
46
  "repo_type": "model",
47
- "version": "1.56.16"
47
+ "version": "1.58.0"
48
48
  },
49
49
  "data_producer": "populace",
50
50
  "datasets": {
51
51
  "enhanced_frs_2024_25": {
52
52
  "path": "enhanced_frs_2024_25.h5",
53
53
  "repo_id": "policyengine/policyengine-uk-data-private",
54
- "revision": "1.56.16",
55
- "sha256": "e433e532b17bd8ce76030156285816e33d44e93edabd2204adbef71d19a68712"
54
+ "revision": "1.58.0",
55
+ "sha256": "5ba399ea5ab9a6c7d4e9aaf6c623080beb34d9ad5f330f6244dbad72b8d960b6"
56
56
  },
57
57
  "enhanced_frs_2024_25_tiny": {
58
58
  "path": "enhanced_frs_2024_25_tiny.h5",
59
59
  "repo_id": "policyengine/policyengine-uk-data-private",
60
- "revision": "1.56.16",
61
- "sha256": "6cbbda7eef1b0b16d62e24a3099dc7959906287d659868d31aa7fc82af598871"
60
+ "revision": "1.58.0",
61
+ "sha256": "a2e938b6c68952dc6fa3af998501371d9014b66263baef262d4f649fe6f19dd5"
62
62
  },
63
63
  "frs_2024_25": {
64
64
  "path": "frs_2024_25.h5",
65
65
  "repo_id": "policyengine/policyengine-uk-data-private",
66
- "revision": "1.56.16",
67
- "sha256": "d4d29901d7ea0c1f636060d4177a411a39c1977fa9fd23a61af3bb0f030769bd"
66
+ "revision": "1.58.0",
67
+ "sha256": "2ec0ea6c10bc82d030a071474c1b376780ea88053e1659d784b4253662341634"
68
68
  },
69
69
  "frs_2024_25_tiny": {
70
70
  "path": "frs_2024_25_tiny.h5",
71
71
  "repo_id": "policyengine/policyengine-uk-data-private",
72
- "revision": "1.56.16",
73
- "sha256": "74ca086be959b2942ecbf7755034d94dc6a817f4d9d54f2585a1c6df849d9588"
72
+ "revision": "1.58.0",
73
+ "sha256": "e91d17c4bae92067222272da33918f15027f65a58e3765c7bdff8aa119df914e"
74
74
  },
75
75
  "local_authority_weights": {
76
76
  "path": "local_authority_weights.h5",
77
77
  "repo_id": "policyengine/policyengine-uk-data-private",
78
- "revision": "1.56.16",
79
- "sha256": "6d634d69fb472b80cc17ffe696e028c54d7b739166bb7d9a57860f9d73537aa5"
78
+ "revision": "1.58.0",
79
+ "sha256": "0f8e43877f13cea86ea7bd78ce938769d0c2746ac0b191be661c25608aa786fc"
80
80
  },
81
81
  "local_geography_weights": {
82
82
  "path": "local_geography_weights.csv.gz",
83
83
  "repo_id": "policyengine/policyengine-uk-data-private",
84
- "revision": "1.56.16",
85
- "sha256": "6f623e277089d06c2c50ec3d8ab766635f695c8579d360410e3dcb4214ea9709"
84
+ "revision": "1.58.0",
85
+ "sha256": "2c4026139eb69d26af5a0ddad7e7fe9ee981b89a0968e77a5f41820091f641c2"
86
86
  },
87
87
  "parliamentary_constituency_weights": {
88
88
  "path": "parliamentary_constituency_weights.h5",
89
89
  "repo_id": "policyengine/policyengine-uk-data-private",
90
- "revision": "1.56.16",
91
- "sha256": "6870c36072a0c34d2e6ce3ebf58664b7932ca46a9e3808d387988773e63b66d5"
90
+ "revision": "1.58.0",
91
+ "sha256": "da3d021bf6cd57f06e878094e48524a6a691207231158d9a109da73ea459e900"
92
92
  }
93
93
  },
94
94
  "default_dataset": "enhanced_frs_2024_25",
95
- "default_dataset_uri": "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@1.56.16",
95
+ "default_dataset_uri": "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@1.58.0",
96
96
  "model_package": {
97
97
  "name": "policyengine-uk",
98
- "sha256": "f02a76712a3edf9983c713c1db42e9653a6e974e4ce335dd4b5676bbc2bcd636",
99
- "version": "2.102.3",
100
- "wheel_url": "https://files.pythonhosted.org/packages/37/e6/e8d9069d498f1510a1380f24a78e957902d01f00b10248c146d6710d5b37/policyengine_uk-2.102.3-py3-none-any.whl"
98
+ "sha256": "a0983b4cef868467578a4fd0d163a977a0da8f710dd5194ec01c75f66d512c5a",
99
+ "version": "2.125.1",
100
+ "wheel_url": "https://files.pythonhosted.org/packages/ec/3a/1d90bad4346d1a8c2715be211ed3d3d7f48917da0d90405b8257b7304091/policyengine_uk-2.125.1-py3-none-any.whl"
101
101
  },
102
- "policyengine_version": "6.2.5",
102
+ "policyengine_version": "6.2.7",
103
103
  "region_datasets": {
104
104
  "national": {
105
105
  "path_template": "enhanced_frs_2024_25.h5"
106
106
  }
107
107
  },
108
- "release_manifest_uri": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/78788372fec47fc8df835bd32307ef61eaed83c2/releases/1.56.16/release_manifest.json",
108
+ "release_manifest_uri": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/fdeba38517bd86067f34c0a5d8ed8923efb3b10a/releases/1.58.0/release_manifest.json",
109
109
  "schema_version": 1,
110
- "source_manifest_uri": "hf://model/policyengine/policyengine-uk-data-private@78788372fec47fc8df835bd32307ef61eaed83c2/releases/1.56.16/release_manifest.json",
111
- "version": "policyengine-uk-data-1.56.16"
110
+ "source_manifest_uri": "hf://model/policyengine/policyengine-uk-data-private@fdeba38517bd86067f34c0a5d8ed8923efb3b10a/releases/1.58.0/release_manifest.json",
111
+ "version": "policyengine-uk-data-1.58.0"
112
112
  },
113
113
  "us": {
114
114
  "build_id": "populace-us-2024-spm-20260915",
115
- "bundle_id": "us-6.2.5",
115
+ "bundle_id": "us-6.2.7",
116
116
  "certification": {
117
117
  "built_with_model_version": "2.2.1",
118
118
  "certified_by": "policyengine.py bundle certification",
@@ -217,7 +217,7 @@
217
217
  "version": "2.2.1",
218
218
  "wheel_url": "https://files.pythonhosted.org/packages/5e/09/86ac3968d2a18e28fce3ba1186fc21728e9f299b96a806d6f204f1e0aaed/policyengine_us-2.2.1-py3-none-any.whl"
219
219
  },
220
- "policyengine_version": "6.2.5",
220
+ "policyengine_version": "6.2.7",
221
221
  "region_datasets": {
222
222
  "congressional_district": {
223
223
  "path_template": "populace_us_2024_acs_local.h5"
@@ -295,25 +295,25 @@
295
295
  "packages": {
296
296
  "policyengine": {
297
297
  "import_name": "policyengine",
298
- "install_requirement": "policyengine==6.2.5",
298
+ "install_requirement": "policyengine==6.2.7",
299
299
  "name": "policyengine",
300
300
  "role": "bundle_carrier",
301
- "version": "6.2.5"
301
+ "version": "6.2.7"
302
302
  },
303
303
  "policyengine-core": {
304
304
  "import_name": "policyengine_core",
305
- "install_requirement": "policyengine-core==3.32.10",
305
+ "install_requirement": "policyengine-core==3.33.0",
306
306
  "name": "policyengine-core",
307
307
  "role": "runtime_dependency",
308
- "version": "3.32.10"
308
+ "version": "3.33.0"
309
309
  },
310
310
  "policyengine-uk": {
311
311
  "country": "uk",
312
312
  "import_name": "policyengine_uk",
313
- "install_requirement": "policyengine-uk==2.102.3",
313
+ "install_requirement": "policyengine-uk==2.125.1",
314
314
  "name": "policyengine-uk",
315
315
  "role": "country_model",
316
- "version": "2.102.3"
316
+ "version": "2.125.1"
317
317
  },
318
318
  "policyengine-us": {
319
319
  "country": "us",
@@ -334,6 +334,6 @@
334
334
  "wheel_url": "https://files.pythonhosted.org/packages/19/a0/c484f69a0ebf88a9b9fd0ac28176f8df66550f46714f1b0c5ec0b360824e/spm_calculator-1.0.0-py3-none-any.whl"
335
335
  }
336
336
  },
337
- "policyengine_version": "6.2.5",
337
+ "policyengine_version": "6.2.7",
338
338
  "schema_version": 2
339
339
  }
@@ -17,19 +17,19 @@
17
17
  "schema:name": "PolicyEngine",
18
18
  "schema:url": "https://policyengine.org"
19
19
  },
20
- "schema:dateCreated": "2026-08-18T14:20:32.100961Z",
21
- "schema:description": "TRACE TRO for certified runtime bundle uk-6.2.5 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
20
+ "schema:dateCreated": "2026-10-07T17:31:53.189867Z",
21
+ "schema:description": "TRACE TRO for certified runtime bundle uk-6.2.7 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
22
22
  "schema:name": "policyengine uk certified bundle TRO",
23
23
  "trov:createdWith": {
24
24
  "@type": "schema:SoftwareApplication",
25
25
  "schema:name": "policyengine",
26
- "schema:softwareVersion": "6.2.5"
26
+ "schema:softwareVersion": "6.2.7"
27
27
  },
28
28
  "trov:hasArrangement": [
29
29
  {
30
30
  "@id": "arrangement/1",
31
31
  "@type": "trov:ArtifactArrangement",
32
- "rdfs:comment": "Certified arrangement for bundle uk-6.2.5.",
32
+ "rdfs:comment": "Certified arrangement for bundle uk-6.2.7.",
33
33
  "trov:hasArtifactLocation": [
34
34
  {
35
35
  "@id": "arrangement/1/location/bundle_manifest",
@@ -45,7 +45,7 @@
45
45
  "trov:hasArtifact": {
46
46
  "@id": "composition/1/artifact/data_release_manifest"
47
47
  },
48
- "trov:hasLocation": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/78788372fec47fc8df835bd32307ef61eaed83c2/releases/1.56.16/release_manifest.json"
48
+ "trov:hasLocation": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/fdeba38517bd86067f34c0a5d8ed8923efb3b10a/releases/1.58.0/release_manifest.json"
49
49
  },
50
50
  {
51
51
  "@id": "arrangement/1/location/dataset",
@@ -53,7 +53,7 @@
53
53
  "trov:hasArtifact": {
54
54
  "@id": "composition/1/artifact/dataset"
55
55
  },
56
- "trov:hasLocation": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/1.56.16/enhanced_frs_2024_25.h5"
56
+ "trov:hasLocation": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/1.58.0/enhanced_frs_2024_25.h5"
57
57
  },
58
58
  {
59
59
  "@id": "arrangement/1/location/model_wheel",
@@ -61,7 +61,7 @@
61
61
  "trov:hasArtifact": {
62
62
  "@id": "composition/1/artifact/model_wheel"
63
63
  },
64
- "trov:hasLocation": "https://files.pythonhosted.org/packages/37/e6/e8d9069d498f1510a1380f24a78e957902d01f00b10248c146d6710d5b37/policyengine_uk-2.102.3-py3-none-any.whl"
64
+ "trov:hasLocation": "https://files.pythonhosted.org/packages/ec/3a/1d90bad4346d1a8c2715be211ed3d3d7f48917da0d90405b8257b7304091/policyengine_uk-2.125.1-py3-none-any.whl"
65
65
  }
66
66
  ]
67
67
  }
@@ -75,52 +75,52 @@
75
75
  "@type": "trov:ResearchArtifact",
76
76
  "schema:name": "policyengine.py bundle manifest for uk",
77
77
  "trov:mimeType": "application/json",
78
- "trov:sha256": "41db4dcd0a64e37901493ffb2235e159892b4e2cb45224d5f83b696dee9d56ea"
78
+ "trov:sha256": "5dadfb8081cee1419de51bfae094fc856444c154505c13bf86ceb40e0838d20c"
79
79
  },
80
80
  {
81
81
  "@id": "composition/1/artifact/data_release_manifest",
82
82
  "@type": "trov:ResearchArtifact",
83
- "schema:name": "policyengine-uk-data release manifest 1.56.16",
83
+ "schema:name": "policyengine-uk-data release manifest 1.58.0",
84
84
  "trov:mimeType": "application/json",
85
- "trov:sha256": "cb61e3d897fbfa0cc079edc140aebc8947b1a685f581a420de91170ce2686155"
85
+ "trov:sha256": "ddd63e1f7755ee358c4ede9050bfdde09f3a80f48a5c0d8ee9d1fb531e4a1a07"
86
86
  },
87
87
  {
88
88
  "@id": "composition/1/artifact/dataset",
89
89
  "@type": "trov:ResearchArtifact",
90
90
  "schema:name": "enhanced_frs_2024_25",
91
91
  "trov:mimeType": "application/x-hdf5",
92
- "trov:sha256": "e433e532b17bd8ce76030156285816e33d44e93edabd2204adbef71d19a68712"
92
+ "trov:sha256": "5ba399ea5ab9a6c7d4e9aaf6c623080beb34d9ad5f330f6244dbad72b8d960b6"
93
93
  },
94
94
  {
95
95
  "@id": "composition/1/artifact/model_wheel",
96
96
  "@type": "trov:ResearchArtifact",
97
- "schema:name": "policyengine-uk==2.102.3 wheel",
97
+ "schema:name": "policyengine-uk==2.125.1 wheel",
98
98
  "trov:mimeType": "application/zip",
99
- "trov:sha256": "f02a76712a3edf9983c713c1db42e9653a6e974e4ce335dd4b5676bbc2bcd636"
99
+ "trov:sha256": "a0983b4cef868467578a4fd0d163a977a0da8f710dd5194ec01c75f66d512c5a"
100
100
  }
101
101
  ],
102
102
  "trov:hasFingerprint": {
103
103
  "@id": "composition/1/fingerprint",
104
104
  "@type": "trov:CompositionFingerprint",
105
- "trov:sha256": "2014602b75a33b7be85717d3ee86056dea50d0b7d37f802b89b0372fb7a80546"
105
+ "trov:sha256": "b0f0f60ca2071d9cc27fdd46fa07d19e518a209929ccc7df64c9017ab3a57114"
106
106
  }
107
107
  },
108
108
  "trov:hasPerformance": {
109
109
  "@id": "trp/1",
110
110
  "@type": "trov:TransparentResearchPerformance",
111
- "pe:builtWithModelGitSha": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3",
112
- "pe:builtWithModelVersion": "2.89.2",
111
+ "pe:builtWithModelGitSha": "4cbedbecca352f52dffe47e849553c2759a00711",
112
+ "pe:builtWithModelVersion": "2.122.2",
113
113
  "pe:certifiedBy": "policyengine.py bundle certification",
114
- "pe:certifiedForModelVersion": "2.102.3",
114
+ "pe:certifiedForModelVersion": "2.125.1",
115
115
  "pe:compatibilityBasis": "legacy_compatible_model_package",
116
- "pe:dataBuildFingerprint": "sha256:6bfff835b504094c05342d2b4d770d2d94c8c1adcb15c4468931f53b21a89ea9",
117
- "pe:dataBuildId": "policyengine-uk-data-1.56.16",
116
+ "pe:dataBuildFingerprint": "sha256:c094d7006fdd81df220090284212f16bbffb15624643bc442c4bb3e1b1e5dac8",
117
+ "pe:dataBuildId": "policyengine-uk-data-1.58.0",
118
118
  "pe:emittedIn": "repository-bundle",
119
- "rdfs:comment": "Certification of build policyengine-uk-data-1.56.16 for policyengine-uk 2.102.3.",
119
+ "rdfs:comment": "Certification of build policyengine-uk-data-1.58.0 for policyengine-uk 2.125.1.",
120
120
  "trov:accessedArrangement": {
121
121
  "@id": "arrangement/1"
122
122
  },
123
- "trov:startedAtTime": "2026-08-18T14:20:32.100961Z",
123
+ "trov:startedAtTime": "2026-10-07T17:31:53.189867Z",
124
124
  "trov:wasConductedBy": {
125
125
  "@id": "trs"
126
126
  }
@@ -17,18 +17,18 @@
17
17
  "schema:name": "PolicyEngine",
18
18
  "schema:url": "https://policyengine.org"
19
19
  },
20
- "schema:description": "TRACE TRO for certified runtime bundle us-6.2.5 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
20
+ "schema:description": "TRACE TRO for certified runtime bundle us-6.2.7 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
21
21
  "schema:name": "policyengine us certified bundle TRO",
22
22
  "trov:createdWith": {
23
23
  "@type": "schema:SoftwareApplication",
24
24
  "schema:name": "policyengine",
25
- "schema:softwareVersion": "6.2.5"
25
+ "schema:softwareVersion": "6.2.7"
26
26
  },
27
27
  "trov:hasArrangement": [
28
28
  {
29
29
  "@id": "arrangement/1",
30
30
  "@type": "trov:ArtifactArrangement",
31
- "rdfs:comment": "Certified arrangement for bundle us-6.2.5.",
31
+ "rdfs:comment": "Certified arrangement for bundle us-6.2.7.",
32
32
  "trov:hasArtifactLocation": [
33
33
  {
34
34
  "@id": "arrangement/1/location/bundle_manifest",
@@ -74,7 +74,7 @@
74
74
  "@type": "trov:ResearchArtifact",
75
75
  "schema:name": "policyengine.py bundle manifest for us",
76
76
  "trov:mimeType": "application/json",
77
- "trov:sha256": "41db4dcd0a64e37901493ffb2235e159892b4e2cb45224d5f83b696dee9d56ea"
77
+ "trov:sha256": "5dadfb8081cee1419de51bfae094fc856444c154505c13bf86ceb40e0838d20c"
78
78
  },
79
79
  {
80
80
  "@id": "composition/1/artifact/data_release_manifest",
@@ -101,7 +101,7 @@
101
101
  "trov:hasFingerprint": {
102
102
  "@id": "composition/1/fingerprint",
103
103
  "@type": "trov:CompositionFingerprint",
104
- "trov:sha256": "a6b92e608e8ae897ad3e3f3e2fbbf14eefb50b9a21a2e0fa458b8693c00710cf"
104
+ "trov:sha256": "e9c575e1126a1c4b688ad1a0cbd9231f0ee0b0b08ad05347c6930c264461e8e0"
105
105
  }
106
106
  },
107
107
  "trov:hasPerformance": {
@@ -1,4 +1,4 @@
1
- """Compile a simple reform dict into the format policyengine_core expects.
1
+ """Compile a simple reform dict into country-model inputs or parameter values.
2
2
 
3
3
  Accepted shapes for the agent-facing API:
4
4
 
@@ -10,6 +10,13 @@ Accepted shapes for the agent-facing API:
10
10
  # With explicit effective date(s).
11
11
  reform = {"gov.irs.deductions.salt.cap": {"2026-01-01": 0}}
12
12
 
13
+ # With an inclusive start and end date.
14
+ reform = {
15
+ "gov.hmrc.income_tax.rates.uk[0].rate": {
16
+ "2027-04-06.2028-04-05": 0.21,
17
+ },
18
+ }
19
+
13
20
  # Multiple parameters.
14
21
  reform = {
15
22
  "gov.irs.deductions.salt.cap": 0,
@@ -25,9 +32,17 @@ the top-bracket SS wage base is ``gov.ssa.payroll.cap``. If a reform
25
32
  dict uses the bracket-head path instead of ``[0].amount`` the
26
33
  ``ValueError`` will list the close match.
27
34
 
28
- The compiled form is ``{param_path: {period: value}}`` — exactly what
29
- ``policyengine_us.Simulation(reform=...)`` /
30
- ``policyengine_uk.Simulation(reform=...)`` accept at construction.
35
+ The parameter-value compiler accepts ``YYYY-MM-DD`` as an effective date
36
+ with no end date, or ``YYYY-MM-DD.YYYY-MM-DD`` as an inclusive interval.
37
+ Months and days may be unpadded (``2027-4-6``), as ``strptime`` reads them.
38
+ Other keys, including bare years, are rejected: policyengine-uk interprets
39
+ a bare year as one fiscal year, while policyengine-core interprets it as
40
+ an effective year continuing onward. Use ``2027-04-06.2028-04-05`` for one
41
+ UK fiscal year, or ``2027-01-01`` for an effective date.
42
+
43
+ The low-level :func:`compile_reform` returns ``{param_path: {period: value}}``
44
+ without interpreting period keys. Parameter-value routes convert values
45
+ to explicit intervals before passing them to the country model.
31
46
 
32
47
  Scalar reforms default to ``{year}-01-01`` so a caller running
33
48
  mid-year does not accidentally get a blended partial-year result.
@@ -103,8 +118,8 @@ def _reform_dict_to_parameter_values(
103
118
  """Compile a flat reform dict into a list of ``ParameterValue`` objects.
104
119
 
105
120
  Uses :func:`compile_reform` for path validation and effective-date
106
- defaulting, then materialises each ``{path: {date: value}}`` pair
107
- as an open-ended ``ParameterValue`` bound to a
121
+ defaulting, then materialises each effective date or inclusive interval
122
+ as a ``ParameterValue`` bound to a
108
123
  ``Parameter(name=path, tax_benefit_model_version=model_version)``.
109
124
  """
110
125
  from policyengine.core.parameter import Parameter
@@ -117,6 +132,32 @@ def _reform_dict_to_parameter_values(
117
132
  parameter_values: list[ParameterValue] = []
118
133
  for path, date_to_value in compiled.items():
119
134
  for effective_date, value in date_to_value.items():
135
+ try:
136
+ parts = str(effective_date).split(".")
137
+ if len(parts) > 2:
138
+ raise ValueError("Too many dates")
139
+ start_date = datetime.datetime.strptime(parts[0], "%Y-%m-%d")
140
+ end_date = (
141
+ datetime.datetime.strptime(parts[1], "%Y-%m-%d")
142
+ if len(parts) == 2
143
+ else None
144
+ )
145
+ except ValueError as exc:
146
+ raise ValueError(
147
+ f"Invalid reform date key {effective_date!r}. Accepted formats are "
148
+ "'YYYY-MM-DD' (effective date) and "
149
+ "'YYYY-MM-DD.YYYY-MM-DD' (inclusive interval); months and "
150
+ "days may be unpadded. Bare years are "
151
+ "ambiguous: policyengine-uk's reform dict reads '2027' as fiscal "
152
+ "year 2027 only, while policyengine-core's Reform.from_dict "
153
+ "reads it as from 2027 on. Use '2027-04-06.2028-04-05' for one "
154
+ "UK fiscal year, or '2027-01-01' for an effective date."
155
+ ) from exc
156
+ if end_date is not None and end_date < start_date:
157
+ raise ValueError(
158
+ f"Reform interval {effective_date!r} has an end date before "
159
+ "its start date."
160
+ )
120
161
  data_type = type(value) if isinstance(value, (int, float, bool)) else float
121
162
  parameter_values.append(
122
163
  ParameterValue(
@@ -125,8 +166,8 @@ def _reform_dict_to_parameter_values(
125
166
  tax_benefit_model_version=model_version,
126
167
  data_type=data_type,
127
168
  ),
128
- start_date=datetime.datetime.strptime(effective_date, "%Y-%m-%d"),
129
- end_date=None,
169
+ start_date=start_date,
170
+ end_date=end_date,
130
171
  value=value,
131
172
  )
132
173
  )
@@ -160,7 +201,7 @@ def compile_reform_to_policy(
160
201
  """Compile a flat reform dict into a fully-assembled ``Policy``.
161
202
 
162
203
  Accepts the same ``{param.path: value}`` /
163
- ``{param.path: {date: value}}`` shape as :func:`compile_reform`,
204
+ ``{param.path: {date_or_interval: value}}`` shape as :func:`compile_reform`,
164
205
  but returns a ready-to-use ``Policy`` with ``ParameterValue``
165
206
  objects so ``Simulation(policy={...})`` works without hand-building
166
207
  ``Parameter`` / ``ParameterValue``.