policyengine 6.1.1__tar.gz → 6.2.0__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.
- {policyengine-6.1.1 → policyengine-6.2.0}/.gitignore +1 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/CHANGELOG.md +22 -0
- {policyengine-6.1.1/src/policyengine.egg-info → policyengine-6.2.0}/PKG-INFO +5 -4
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/microsim.md +47 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/outputs.md +12 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/run-records.md +1 -1
- {policyengine-6.1.1 → policyengine-6.2.0}/pyproject.toml +5 -4
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/run_record.py +9 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/simulation.py +9 -1
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/data/bundle/manifest.json +19 -19
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/data/bundle/uk.trace.tro.jsonld +12 -12
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/data/bundle/us.trace.tro.jsonld +5 -5
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/common/model_version.py +31 -1
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/us/datasets.py +86 -6
- policyengine-6.2.0/src/policyengine/tax_benefit_models/us/legacy_inputs.py +398 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/us/model.py +46 -6
- {policyengine-6.1.1 → policyengine-6.2.0/src/policyengine.egg-info}/PKG-INFO +5 -4
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine.egg-info/SOURCES.txt +3 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine.egg-info/requires.txt +4 -3
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/uk_model_surface.json +2 -2
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_models.py +1 -1
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_release_manifests.py +2 -2
- policyengine-6.2.0/tests/test_us_legacy_inputs.py +656 -0
- policyengine-6.2.0/tests/test_us_legacy_inputs_integration.py +704 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_us_native_alignment.py +2 -1
- {policyengine-6.1.1 → policyengine-6.2.0}/uv.lock +97 -7
- {policyengine-6.1.1 → policyengine-6.2.0}/.claude/policyengine-guide.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.claude/quick-reference.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/CONTRIBUTING.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/bump_version.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/capture-version.sh +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/changelog_template.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/check-changelog.sh +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/copilot-instructions.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/dispatch-policyengine-release.sh +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/fetch_version.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/get-changelog-diff.sh +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/has-functional-changes.sh +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/is-version-number-acceptable.sh +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/publish-git-tag.sh +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/wait-for-pypi.sh +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/workflows/draft-pdf.yml +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/workflows/pr_code_changes.yaml +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/workflows/pr_docs_changes.yaml +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.github/workflows/push.yaml +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/.python-version +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/AGENTS.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/CITATION.cff +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/CLAUDE.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/CODE_OF_CONDUCT.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/CONTRIBUTING.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/LICENSE +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/Makefile +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/README.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/architecture.png +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/architecture.svg +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/changelog.d/.gitkeep +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/.gitignore +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/_generator/README.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/_generator/build_reference.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/_quarto.yml +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/bundles.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/countries.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/data-publishing-design.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/decile-impact-spec.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/dev.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/engineering/runbooks/build-m-us-populace-certification.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/engineering/runbooks/canonical-spm-development.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/engineering/skills/README.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/engineering/skills/data-certification.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/engineering/skills/github-prs.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/engineering/skills/repository-guidance.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/examples.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/getting-started.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/households.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/impact-analysis.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/index.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/methodology/index.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/methodology/model-architecture.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/methodology/us-health-costs.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/programs/index.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/programs/us-chip.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/reference/index.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/reforms.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/regions.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/release-bundles.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/trace-case-study.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/docs/visualisation.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/belgium_axiom_pilot.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/employment_income_variation_uk.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/employment_income_variation_us.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/household_impact_example.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/income_bands_uk.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/income_distribution_us.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/paper_repro_uk.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/policy_change_uk.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/speedtest_us_simulation.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/examples/us_budgetary_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/paper-preview.html +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/paper.bib +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/paper.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/bundle.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/certify_data_release.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/check_data_staleness.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/check_native_spm_loading.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/check_release_credentials.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/export_bundle_release_assets.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/generate_bundle_artifacts.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/generate_trace_tros.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/prepare_package_bundle_update.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/release_lock.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/scripts/spm_bundle.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/setup.cfg +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/bundle.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/cli.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/cache.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/dataset.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/dynamic.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/output.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/parameter.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/parameter_node.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/parameter_value.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/policy.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/region.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/scoping_strategy.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/spm.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/tax_benefit_model.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/tax_benefit_model_version.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/core/variable.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/countries/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/countries/uk/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/countries/uk/regions.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/countries/us/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/countries/us/data/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/countries/us/data/districts.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/countries/us/data/places.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/countries/us/data/states.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/countries/us/regions.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/data/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/data/schemas/trace_tro.schema.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/data/uk_geography_assets.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/derivations/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/derivations/narrate.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/derivations/trace.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/graph/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/graph/extractor.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/graph/graph.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/aggregate.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/change_aggregate.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/cliff_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/congressional_district_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/constituency_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/decile_analysis.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/decile_grouping.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/decile_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/extra_variables.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/inequality.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/intra_decile_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/labor_supply_response.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/local_authority_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/poverty.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/program_statistics.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/uk_geography_assets.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/outputs/uk_geography_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/bundle_validation.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/certification.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/dataset_materialization.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/manifest.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/pyproject_pins.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/spm_configuration.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/trace.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/verify.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/provenance/zenodo.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/results/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/results/schema.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/results/trace_tro.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/results/tracking.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/be/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/be/datasets.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/be/model.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/common/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/common/axes.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/common/extra_variables.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/common/household.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/common/reform.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/common/result.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/uk/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/uk/analysis.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/uk/datasets.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/uk/household.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/uk/model.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/us/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/us/analysis.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/us/household.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/tax_benefit_models/us/spm.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/dates.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/design.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/entity_utils.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/errors.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/hashing.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/household_validation.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/parameter_labels.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/parametric_reforms.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine/utils/plotting.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine.egg-info/dependency_links.txt +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine.egg-info/entry_points.txt +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/src/policyengine.egg-info/top_level.txt +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/conftest.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/filtering_fixtures.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/uk_couple_two_kids.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/uk_single_adult_employment_income.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/uk_single_adult_no_income.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/uk_single_parent_one_child.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/us_married_two_kids_high_income.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/us_model_surface.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/us_single_adult_employment_income.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/us_single_adult_no_income.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/household_calculator_snapshots/us_single_parent_one_child.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/parameter_labels_fixtures.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/parametric_reforms_fixtures.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/poverty_by_demographics_fixtures.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/region_fixtures.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/release_tros/README.md +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/release_tros/country-models.lock.toml +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/release_tros/manifest.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/release_tros/us-release_manifest.json +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/release_tros/us.trace.tro.jsonld +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/spm_development.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/us_reform_fixtures.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/fixtures/variable_label_fixtures.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_aggregate.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_be_axiom_pilot.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_budgetary_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_bump_version.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_bundle.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_bundle_metadata.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_cache.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_certify_data_release.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_change_aggregate.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_cliff_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_cliff_impact_analysis.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_congressional_district_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_constituency_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_dataset_materialization.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_dataset_persistence.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_dataset_runtime.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_dataset_source.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_decile_grouping.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_derivations.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_dict_reforms_on_simulation.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_entity_mapping.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_entity_utils.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_entity_utils_characterization.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_errors.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_extra_variables.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_filtering.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_generate_trace_tros.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_graph/__init__.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_graph/conftest.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_graph/test_extractor.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_household_calculator_snapshot.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_household_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_inequality.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_intra_decile_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_labor_supply_response.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_local_authority_impact.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_manifest_version_mismatch.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_pandas3_compatibility.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_parameter_labels.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_parameter_nodes.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_parameter_values.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_parametric_reforms.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_poverty.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_poverty_by_demographics.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_poverty_run.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_preservation_mirror.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_program_statistics.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_pyproject_pins.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_region.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_region_group_strategy.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_release_credentials.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_release_lock.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_release_tro_generation.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_results.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_run_record.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_scoping_strategy.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_small_follow_ups.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_spm_bundle_bootstrap.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_spm_bundle_tooling.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_spm_decile.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_spm_development_authentication.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_spm_household.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_spm_model.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_spm_selection.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_spm_selection_schema.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_trace_tro.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_trace_tro_verify.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_uk_analysis.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_uk_geography_assets.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_uk_program_statistics.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_uk_regions.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_us_long_term_datasets.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_us_microsim_structural_reforms.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_us_native_hdf_weights.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_us_program_statistics.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_us_reform_application.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_us_regions.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_variable_labels.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_variable_metadata.py +0 -0
- {policyengine-6.1.1 → policyengine-6.2.0}/tests/test_zenodo_mirror.py +0 -0
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
## [6.2.0] - 2026-09-29
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
|
|
5
|
+
- Documented the default headline poverty measure (UK: absolute poverty before housing costs) and the reasons for it.
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Bump policyengine-uk to 2.102.3, which rebases the absolute poverty line to HBAI's FYE 2025 reference year (431.69 BHC / 373.89 AHC a week at FYE 2025, as DWP has reported it since March 2026), and certify the UK data release `policyengine-uk-data-1.56.16` (enhanced_frs_2024_25) for it on the publisher's compatibility claim. UK absolute poverty rates rise: in 2026-27 on the certified enhanced FRS, by about 4 points overall and about 7 points for children after housing costs. The bump also brings every policyengine-uk change since 2.90.2, including relative poverty measured on the median over individuals (policyengine-uk#1865).
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
## [6.1.2] - 2026-09-27
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- US files written before the WIC take-up mapping are no longer reused, because they may have lost the draw or were calculated without it. `Simulation.load()` raises for a saved US output that has no record of renamed stored inputs (`Simulation.ensure()` calculates it again), `load_datasets` raises for such a year file, and `ensure_datasets` creates such year files again.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- Map the stored US WIC take-up draw `would_claim_wic` onto `takes_up_wic_if_eligible` when loading US data, so policyengine-us 2.x no longer gives WIC to every WIC-eligible person in data that stores the draw under its old name, such as the certified default. `Simulation.run()`, `managed_microsimulation` and `create_datasets` apply the mapping and record the renames applied (output dataset metadata, `release_bundle`, saved output and year files, run records and `policyengine_bundle`). A stored table that is not in the simulation's person order, or that stores the draw for only part of a year, is refused. The mapping turns itself off once the data stores `takes_up_wic_if_eligible` or the engine defines `would_claim_wic` again.
|
|
21
|
+
|
|
22
|
+
|
|
1
23
|
## [6.1.1] - 2026-09-22
|
|
2
24
|
|
|
3
25
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: policyengine
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.2.0
|
|
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
|
|
@@ -687,11 +687,11 @@ Requires-Dist: networkx>=3.0; extra == "graph"
|
|
|
687
687
|
Provides-Extra: models
|
|
688
688
|
Requires-Dist: policyengine-core==3.32.5; extra == "models"
|
|
689
689
|
Requires-Dist: policyengine-us==2.2.1; extra == "models"
|
|
690
|
-
Requires-Dist: policyengine-uk==2.
|
|
690
|
+
Requires-Dist: policyengine-uk==2.102.3; extra == "models"
|
|
691
691
|
Requires-Dist: spm-calculator==1.0.0; extra == "models"
|
|
692
692
|
Provides-Extra: uk
|
|
693
693
|
Requires-Dist: policyengine-core==3.32.5; extra == "uk"
|
|
694
|
-
Requires-Dist: policyengine-uk==2.
|
|
694
|
+
Requires-Dist: policyengine-uk==2.102.3; extra == "uk"
|
|
695
695
|
Provides-Extra: us
|
|
696
696
|
Requires-Dist: policyengine-core==3.32.5; extra == "us"
|
|
697
697
|
Requires-Dist: policyengine-us==2.2.1; extra == "us"
|
|
@@ -710,9 +710,10 @@ Requires-Dist: ruff>=0.9.0; extra == "dev"
|
|
|
710
710
|
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
|
+
Requires-Dist: hypothesis>=6.100.0; extra == "dev"
|
|
713
714
|
Requires-Dist: policyengine-core==3.32.5; extra == "dev"
|
|
714
715
|
Requires-Dist: policyengine-us==2.2.1; extra == "dev"
|
|
715
|
-
Requires-Dist: policyengine-uk==2.
|
|
716
|
+
Requires-Dist: policyengine-uk==2.102.3; extra == "dev"
|
|
716
717
|
Requires-Dist: spm-calculator==1.0.0; extra == "dev"
|
|
717
718
|
Dynamic: license-file
|
|
718
719
|
|
|
@@ -324,6 +324,53 @@ mode. GCS dataset URIs are not supported.
|
|
|
324
324
|
For managed simulations, `sim.policyengine_bundle` records the actual source
|
|
325
325
|
package, repository type, revision, verified SHA-256, and local path.
|
|
326
326
|
|
|
327
|
+
## Renamed inputs in stored data
|
|
328
|
+
|
|
329
|
+
A country engine sets a stored column as an input only when it defines a
|
|
330
|
+
variable of that name. When policyengine-us renames an input, data written
|
|
331
|
+
before the rename keeps the old name, and the engine would skip it.
|
|
332
|
+
`policyengine.tax_benefit_models.us.legacy_inputs.LEGACY_INPUT_RENAMES` lists
|
|
333
|
+
each such rename; today it holds one entry, `would_claim_wic` →
|
|
334
|
+
`takes_up_wic_if_eligible` (the WIC take-up draw, PolicyEngine/microcosm#1026).
|
|
335
|
+
|
|
336
|
+
Every US load path applies it: `Simulation.run()`, `managed_microsimulation`
|
|
337
|
+
and `create_datasets` (and so `ensure_datasets` when it creates year files).
|
|
338
|
+
A rename applies when the data stores the old name, the engine does not define
|
|
339
|
+
the old name but does define the new one, and the data does not already store
|
|
340
|
+
the new name. The new input is then set from the stored values for every month
|
|
341
|
+
of every dataset year. The stored table must list the simulation's entity IDs
|
|
342
|
+
in the simulation's order, or loading fails rather than attach values to the
|
|
343
|
+
wrong people. Only values stored for a whole year are mapped, so a file that
|
|
344
|
+
stores the old name for part of a year, and not the new name, is refused. The
|
|
345
|
+
mapping turns itself off once the data stores the new name, or if the engine
|
|
346
|
+
defines the old name again.
|
|
347
|
+
|
|
348
|
+
The renames applied are recorded as `{old: new}` (`{}` when none applied):
|
|
349
|
+
|
|
350
|
+
- `Simulation.run()`: `simulation.output_dataset.metadata["legacy_input_renames"]`,
|
|
351
|
+
also shown as `simulation.release_bundle["legacy_input_renames"]`. It
|
|
352
|
+
includes renames applied when the input year file was cut, so a run over a
|
|
353
|
+
`create_datasets` year file records the rename even though the file already
|
|
354
|
+
stores the new name. A US `save()` writes the record into the output file,
|
|
355
|
+
`load()` restores it, and a run record's `results.json` binds it;
|
|
356
|
+
- `managed_microsimulation`: `sim.policyengine_bundle["legacy_input_renames"]`;
|
|
357
|
+
- `create_datasets`: each year file, and each returned dataset's
|
|
358
|
+
`metadata["legacy_input_renames"]`.
|
|
359
|
+
|
|
360
|
+
`{}` means that no stored column was mapped. It does not show that the data
|
|
361
|
+
carried the draw: data that stores neither name runs with the new input's
|
|
362
|
+
default, which for WIC is full take-up.
|
|
363
|
+
|
|
364
|
+
Files written before this mapping existed have no record, and are not reused:
|
|
365
|
+
|
|
366
|
+
- A saved US output may have been calculated without the mapped inputs.
|
|
367
|
+
`load()` refuses it, and `ensure()` runs the simulation again and saves the new
|
|
368
|
+
output.
|
|
369
|
+
- A year file that `ensure_datasets` or `create_datasets` wrote stores
|
|
370
|
+
neither name, so the draw is lost from it. `ensure_datasets` creates such
|
|
371
|
+
year files again, and `load_datasets` refuses them. A year file opened
|
|
372
|
+
directly, as `PolicyEngineUSDataset(filepath=...)`, is not checked.
|
|
373
|
+
|
|
327
374
|
## Pinned model versions
|
|
328
375
|
|
|
329
376
|
Every `policyengine` release pins specific country-model and country-data versions so results are reproducible. `pe.us.model` and `pe.uk.model` expose the pinned `TaxBenefitModelVersion`.
|
|
@@ -179,6 +179,18 @@ rates.dataframe
|
|
|
179
179
|
|
|
180
180
|
Call it once per simulation for a baseline-vs-reform comparison. Age / gender / race breakdowns: `calculate_us_poverty_by_age`, `_by_gender`, `_by_race`. UK counterparts: `calculate_uk_poverty_rates`, `_by_age`, `_by_gender`.
|
|
181
181
|
|
|
182
|
+
### Which measure to headline
|
|
183
|
+
|
|
184
|
+
PolicyEngine headlines **absolute poverty before housing costs** in the UK: `absolute_bhc` in `calculate_uk_poverty_rates`, from the `in_poverty_bhc` variable. That function also returns `absolute_ahc`, `relative_bhc` and `relative_ahc`. In the US, `calculate_us_poverty_rates` returns the Supplemental Poverty Measure (`spm`) and deep SPM poverty (`spm_deep`).
|
|
185
|
+
|
|
186
|
+
The reasons:
|
|
187
|
+
|
|
188
|
+
- **Relative poverty measures inequality, not poverty.** policyengine-uk draws the relative line at 60% of each simulation's own median income. A reform that raises the median raises the line with it, so relative poverty can rise when every household is better off.
|
|
189
|
+
- Example: raising the personal allowance to £15,000 in 2026-27 lowers absolute child poverty and raises relative child poverty.
|
|
190
|
+
- **After-housing-costs measures subtract housing spending,** and much of that spending is a choice: a flat or a mansion. International poverty statistics are computed on income before housing costs.
|
|
191
|
+
|
|
192
|
+
The absolute line is HBAI's: 60% of median income in a fixed reference year, held constant in real terms (the `household.poverty.absolute_poverty_threshold_bhc` and `_ahc` parameters). Since the March 2026 HBAI release, DWP's reference year is FYE 2025 for FYE 2022 onward: 60% of the FYE 2025 medians of £719.48 (BHC) and £623.14 (AHC), so £431.69 and £373.89 a week (HBAI table 2.4ts). Earlier years keep the FYE 2011 reference, and DWP plans to extend FYE 2025 back to FYE 2019 in its March 2027 release. policyengine-uk follows the same split from version 2.102.3: FYE 2022 to FYE 2024 use HBAI's own annual CPI-variant deflators, and later years are uprated by the OBR's CPI forecast. Earlier policyengine-uk versions use the FYE 2011 line throughout, so their absolute rates are lower than DWP's.
|
|
193
|
+
|
|
182
194
|
## Inequality
|
|
183
195
|
|
|
184
196
|
Gini, top-10 share, top-1 share, bottom-50 share — for one simulation.
|
|
@@ -46,7 +46,7 @@ The directory contains:
|
|
|
46
46
|
| `bundle.trace.tro.jsonld` | The certified bundle TRO (model + data pins) |
|
|
47
47
|
| `reform.json` | The reform as parameter values with effective dates |
|
|
48
48
|
| `input.json` | Input dataset hash, dynamics, scoping, extra variables |
|
|
49
|
-
| `results.json` | Output dataset hash and per-entity table summaries |
|
|
49
|
+
| `results.json` | Output dataset hash and per-entity table summaries; for US runs, the SPM receipt and the renamed stored inputs mapped onto live ones (see [Renamed inputs in stored data](microsim.md#renamed-inputs-in-stored-data)) |
|
|
50
50
|
|
|
51
51
|
All payload files are written with the same canonical JSON used for
|
|
52
52
|
hashing, so the record verifies offline exactly as written.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "policyengine"
|
|
7
|
-
version = "6.
|
|
7
|
+
version = "6.2.0"
|
|
8
8
|
description = "A package to conduct policy analysis using PolicyEngine tax-benefit models."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [
|
|
@@ -42,12 +42,12 @@ graph = [
|
|
|
42
42
|
models = [
|
|
43
43
|
"policyengine-core==3.32.5",
|
|
44
44
|
"policyengine-us==2.2.1",
|
|
45
|
-
"policyengine-uk==2.
|
|
45
|
+
"policyengine-uk==2.102.3",
|
|
46
46
|
"spm-calculator==1.0.0",
|
|
47
47
|
]
|
|
48
48
|
uk = [
|
|
49
49
|
"policyengine-core==3.32.5",
|
|
50
|
-
"policyengine-uk==2.
|
|
50
|
+
"policyengine-uk==2.102.3",
|
|
51
51
|
]
|
|
52
52
|
us = [
|
|
53
53
|
"policyengine-core==3.32.5",
|
|
@@ -68,9 +68,10 @@ dev = [
|
|
|
68
68
|
"towncrier>=24.8.0",
|
|
69
69
|
"mypy>=1.11.0",
|
|
70
70
|
"pytest-cov>=5.0.0",
|
|
71
|
+
"hypothesis>=6.100.0",
|
|
71
72
|
"policyengine-core==3.32.5",
|
|
72
73
|
"policyengine-us==2.2.1",
|
|
73
|
-
"policyengine-uk==2.
|
|
74
|
+
"policyengine-uk==2.102.3",
|
|
74
75
|
"spm-calculator==1.0.0",
|
|
75
76
|
]
|
|
76
77
|
|
|
@@ -184,6 +184,15 @@ def build_simulation_run_record_payloads(
|
|
|
184
184
|
input_payload["spm"] = simulation.spm_config
|
|
185
185
|
results_payload["spm"] = simulation.spm_provenance()
|
|
186
186
|
|
|
187
|
+
# Stored inputs the country loader mapped onto renamed live inputs (for
|
|
188
|
+
# example the US WIC take-up draw) change the results, so the record
|
|
189
|
+
# binds them. See ``policyengine.tax_benefit_models.us.legacy_inputs``.
|
|
190
|
+
renames = (getattr(simulation.output_dataset, "metadata", None) or {}).get(
|
|
191
|
+
"legacy_input_renames"
|
|
192
|
+
)
|
|
193
|
+
if renames is not None:
|
|
194
|
+
results_payload["legacy_input_renames"] = dict(renames)
|
|
195
|
+
|
|
187
196
|
return {"reform": reform, "input": input_payload, "results": results_payload}
|
|
188
197
|
|
|
189
198
|
|
|
@@ -240,7 +240,7 @@ class Simulation(BaseModel):
|
|
|
240
240
|
if self.tax_benefit_model_version is not None
|
|
241
241
|
else {}
|
|
242
242
|
)
|
|
243
|
-
result = {
|
|
243
|
+
result: dict[str, Any] = {
|
|
244
244
|
**bundle,
|
|
245
245
|
"dataset_filepath": self.dataset.filepath
|
|
246
246
|
if self.dataset is not None
|
|
@@ -250,4 +250,12 @@ class Simulation(BaseModel):
|
|
|
250
250
|
recorded = getattr(self.output_dataset, "metadata", {}).get("spm_config")
|
|
251
251
|
result["spm_config"] = dict(recorded or self.spm_config)
|
|
252
252
|
result["spm"] = self.spm_provenance()
|
|
253
|
+
# Stored inputs the country loader mapped onto renamed live inputs
|
|
254
|
+
# (for example the US WIC take-up draw), as the run recorded them.
|
|
255
|
+
# See ``policyengine.tax_benefit_models.us.legacy_inputs``.
|
|
256
|
+
renames = (getattr(self.output_dataset, "metadata", None) or {}).get(
|
|
257
|
+
"legacy_input_renames"
|
|
258
|
+
)
|
|
259
|
+
if renames is not None:
|
|
260
|
+
result["legacy_input_renames"] = dict(renames)
|
|
253
261
|
return result
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"bundle_version": "6.
|
|
2
|
+
"bundle_version": "6.2.0",
|
|
3
3
|
"citation": {
|
|
4
4
|
"publisher": "PolicyEngine",
|
|
5
|
-
"title": "PolicyEngine bundle 6.
|
|
5
|
+
"title": "PolicyEngine bundle 6.2.0",
|
|
6
6
|
"type": "software-bundle",
|
|
7
|
-
"version": "6.
|
|
7
|
+
"version": "6.2.0"
|
|
8
8
|
},
|
|
9
9
|
"countries": {
|
|
10
10
|
"uk": {
|
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
"data_releases": {
|
|
18
18
|
"uk": {
|
|
19
19
|
"build_id": "policyengine-uk-data-1.56.16",
|
|
20
|
-
"bundle_id": "uk-6.
|
|
20
|
+
"bundle_id": "uk-6.2.0",
|
|
21
21
|
"certification": {
|
|
22
22
|
"built_with_model_git_sha": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3",
|
|
23
23
|
"built_with_model_version": "2.89.2",
|
|
24
24
|
"certified_by": "policyengine.py bundle certification",
|
|
25
|
-
"certified_for_model_version": "2.
|
|
25
|
+
"certified_for_model_version": "2.102.3",
|
|
26
26
|
"compatibility_basis": "legacy_compatible_model_package",
|
|
27
27
|
"data_build_fingerprint": "sha256:6bfff835b504094c05342d2b4d770d2d94c8c1adcb15c4468931f53b21a89ea9",
|
|
28
28
|
"data_build_id": "policyengine-uk-data-1.56.16"
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"data_package": {
|
|
42
42
|
"name": "policyengine-uk-data",
|
|
43
43
|
"release_manifest_path": "releases/1.56.16/release_manifest.json",
|
|
44
|
-
"release_manifest_revision": "
|
|
44
|
+
"release_manifest_revision": "78788372fec47fc8df835bd32307ef61eaed83c2",
|
|
45
45
|
"repo_id": "policyengine/policyengine-uk-data-private",
|
|
46
46
|
"repo_type": "model",
|
|
47
47
|
"version": "1.56.16"
|
|
@@ -95,24 +95,24 @@
|
|
|
95
95
|
"default_dataset_uri": "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@1.56.16",
|
|
96
96
|
"model_package": {
|
|
97
97
|
"name": "policyengine-uk",
|
|
98
|
-
"sha256": "
|
|
99
|
-
"version": "2.
|
|
100
|
-
"wheel_url": "https://files.pythonhosted.org/packages/
|
|
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"
|
|
101
101
|
},
|
|
102
|
-
"policyengine_version": "6.
|
|
102
|
+
"policyengine_version": "6.2.0",
|
|
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/
|
|
108
|
+
"release_manifest_uri": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/78788372fec47fc8df835bd32307ef61eaed83c2/releases/1.56.16/release_manifest.json",
|
|
109
109
|
"schema_version": 1,
|
|
110
|
-
"source_manifest_uri": "hf://model/policyengine/policyengine-uk-data-private@
|
|
110
|
+
"source_manifest_uri": "hf://model/policyengine/policyengine-uk-data-private@78788372fec47fc8df835bd32307ef61eaed83c2/releases/1.56.16/release_manifest.json",
|
|
111
111
|
"version": "policyengine-uk-data-1.56.16"
|
|
112
112
|
},
|
|
113
113
|
"us": {
|
|
114
114
|
"build_id": "populace-us-2024-spm-20260915",
|
|
115
|
-
"bundle_id": "us-6.
|
|
115
|
+
"bundle_id": "us-6.2.0",
|
|
116
116
|
"certification": {
|
|
117
117
|
"built_with_model_version": "2.2.1",
|
|
118
118
|
"certified_by": "policyengine.py bundle certification",
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
"version": "2.2.1",
|
|
211
211
|
"wheel_url": "https://files.pythonhosted.org/packages/5e/09/86ac3968d2a18e28fce3ba1186fc21728e9f299b96a806d6f204f1e0aaed/policyengine_us-2.2.1-py3-none-any.whl"
|
|
212
212
|
},
|
|
213
|
-
"policyengine_version": "6.
|
|
213
|
+
"policyengine_version": "6.2.0",
|
|
214
214
|
"region_datasets": {
|
|
215
215
|
"national": {
|
|
216
216
|
"path_template": "populace_us_2024.h5"
|
|
@@ -290,10 +290,10 @@
|
|
|
290
290
|
"packages": {
|
|
291
291
|
"policyengine": {
|
|
292
292
|
"import_name": "policyengine",
|
|
293
|
-
"install_requirement": "policyengine==6.
|
|
293
|
+
"install_requirement": "policyengine==6.2.0",
|
|
294
294
|
"name": "policyengine",
|
|
295
295
|
"role": "bundle_carrier",
|
|
296
|
-
"version": "6.
|
|
296
|
+
"version": "6.2.0"
|
|
297
297
|
},
|
|
298
298
|
"policyengine-core": {
|
|
299
299
|
"import_name": "policyengine_core",
|
|
@@ -305,10 +305,10 @@
|
|
|
305
305
|
"policyengine-uk": {
|
|
306
306
|
"country": "uk",
|
|
307
307
|
"import_name": "policyengine_uk",
|
|
308
|
-
"install_requirement": "policyengine-uk==2.
|
|
308
|
+
"install_requirement": "policyengine-uk==2.102.3",
|
|
309
309
|
"name": "policyengine-uk",
|
|
310
310
|
"role": "country_model",
|
|
311
|
-
"version": "2.
|
|
311
|
+
"version": "2.102.3"
|
|
312
312
|
},
|
|
313
313
|
"policyengine-us": {
|
|
314
314
|
"country": "us",
|
|
@@ -329,6 +329,6 @@
|
|
|
329
329
|
"wheel_url": "https://files.pythonhosted.org/packages/19/a0/c484f69a0ebf88a9b9fd0ac28176f8df66550f46714f1b0c5ec0b360824e/spm_calculator-1.0.0-py3-none-any.whl"
|
|
330
330
|
}
|
|
331
331
|
},
|
|
332
|
-
"policyengine_version": "6.
|
|
332
|
+
"policyengine_version": "6.2.0",
|
|
333
333
|
"schema_version": 2
|
|
334
334
|
}
|
|
@@ -18,18 +18,18 @@
|
|
|
18
18
|
"schema:url": "https://policyengine.org"
|
|
19
19
|
},
|
|
20
20
|
"schema:dateCreated": "2026-08-18T14:20:32.100961Z",
|
|
21
|
-
"schema:description": "TRACE TRO for certified runtime bundle uk-6.
|
|
21
|
+
"schema:description": "TRACE TRO for certified runtime bundle uk-6.2.0 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.
|
|
26
|
+
"schema:softwareVersion": "6.2.0"
|
|
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.
|
|
32
|
+
"rdfs:comment": "Certified arrangement for bundle uk-6.2.0.",
|
|
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/
|
|
48
|
+
"trov:hasLocation": "https://huggingface.co/policyengine/policyengine-uk-data-private/resolve/78788372fec47fc8df835bd32307ef61eaed83c2/releases/1.56.16/release_manifest.json"
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"@id": "arrangement/1/location/dataset",
|
|
@@ -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/
|
|
64
|
+
"trov:hasLocation": "https://files.pythonhosted.org/packages/37/e6/e8d9069d498f1510a1380f24a78e957902d01f00b10248c146d6710d5b37/policyengine_uk-2.102.3-py3-none-any.whl"
|
|
65
65
|
}
|
|
66
66
|
]
|
|
67
67
|
}
|
|
@@ -75,14 +75,14 @@
|
|
|
75
75
|
"@type": "trov:ResearchArtifact",
|
|
76
76
|
"schema:name": "policyengine.py bundle manifest for uk",
|
|
77
77
|
"trov:mimeType": "application/json",
|
|
78
|
-
"trov:sha256": "
|
|
78
|
+
"trov:sha256": "8a942b26fec7ed828ba533c6c456d95c3292c52a0370e1713a4e2d6cf186ae29"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"@id": "composition/1/artifact/data_release_manifest",
|
|
82
82
|
"@type": "trov:ResearchArtifact",
|
|
83
83
|
"schema:name": "policyengine-uk-data release manifest 1.56.16",
|
|
84
84
|
"trov:mimeType": "application/json",
|
|
85
|
-
"trov:sha256": "
|
|
85
|
+
"trov:sha256": "cb61e3d897fbfa0cc079edc140aebc8947b1a685f581a420de91170ce2686155"
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
88
|
"@id": "composition/1/artifact/dataset",
|
|
@@ -94,15 +94,15 @@
|
|
|
94
94
|
{
|
|
95
95
|
"@id": "composition/1/artifact/model_wheel",
|
|
96
96
|
"@type": "trov:ResearchArtifact",
|
|
97
|
-
"schema:name": "policyengine-uk==2.
|
|
97
|
+
"schema:name": "policyengine-uk==2.102.3 wheel",
|
|
98
98
|
"trov:mimeType": "application/zip",
|
|
99
|
-
"trov:sha256": "
|
|
99
|
+
"trov:sha256": "f02a76712a3edf9983c713c1db42e9653a6e974e4ce335dd4b5676bbc2bcd636"
|
|
100
100
|
}
|
|
101
101
|
],
|
|
102
102
|
"trov:hasFingerprint": {
|
|
103
103
|
"@id": "composition/1/fingerprint",
|
|
104
104
|
"@type": "trov:CompositionFingerprint",
|
|
105
|
-
"trov:sha256": "
|
|
105
|
+
"trov:sha256": "aa8a6265cb0660dcbe3d1d8560cfea70011927ff2f29e8f91d4dad4efc9b055a"
|
|
106
106
|
}
|
|
107
107
|
},
|
|
108
108
|
"trov:hasPerformance": {
|
|
@@ -111,12 +111,12 @@
|
|
|
111
111
|
"pe:builtWithModelGitSha": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3",
|
|
112
112
|
"pe:builtWithModelVersion": "2.89.2",
|
|
113
113
|
"pe:certifiedBy": "policyengine.py bundle certification",
|
|
114
|
-
"pe:certifiedForModelVersion": "2.
|
|
114
|
+
"pe:certifiedForModelVersion": "2.102.3",
|
|
115
115
|
"pe:compatibilityBasis": "legacy_compatible_model_package",
|
|
116
116
|
"pe:dataBuildFingerprint": "sha256:6bfff835b504094c05342d2b4d770d2d94c8c1adcb15c4468931f53b21a89ea9",
|
|
117
117
|
"pe:dataBuildId": "policyengine-uk-data-1.56.16",
|
|
118
118
|
"pe:emittedIn": "repository-bundle",
|
|
119
|
-
"rdfs:comment": "Certification of build policyengine-uk-data-1.56.16 for policyengine-uk 2.
|
|
119
|
+
"rdfs:comment": "Certification of build policyengine-uk-data-1.56.16 for policyengine-uk 2.102.3.",
|
|
120
120
|
"trov:accessedArrangement": {
|
|
121
121
|
"@id": "arrangement/1"
|
|
122
122
|
},
|
|
@@ -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.
|
|
20
|
+
"schema:description": "TRACE TRO for certified runtime bundle us-6.2.0 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.
|
|
25
|
+
"schema:softwareVersion": "6.2.0"
|
|
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.
|
|
31
|
+
"rdfs:comment": "Certified arrangement for bundle us-6.2.0.",
|
|
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": "
|
|
77
|
+
"trov:sha256": "8a942b26fec7ed828ba533c6c456d95c3292c52a0370e1713a4e2d6cf186ae29"
|
|
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": "
|
|
104
|
+
"trov:sha256": "acb3c462fafa434aa3f54fd5cfed5e38647679da1889582c3c5edfded5e13dbb"
|
|
105
105
|
}
|
|
106
106
|
},
|
|
107
107
|
"trov:hasPerformance": {
|
|
@@ -358,6 +358,9 @@ class MicrosimulationModelVersion(TaxBenefitModelVersion):
|
|
|
358
358
|
serialized_spm = None
|
|
359
359
|
if self.country_code == "us":
|
|
360
360
|
from policyengine.core.spm import SPMProvenance
|
|
361
|
+
from policyengine.tax_benefit_models.us.legacy_inputs import (
|
|
362
|
+
RENAMES_RECORD_KEY,
|
|
363
|
+
)
|
|
361
364
|
|
|
362
365
|
receipt = SPMProvenance.model_validate(simulation.spm_provenance())
|
|
363
366
|
if (
|
|
@@ -374,6 +377,17 @@ class MicrosimulationModelVersion(TaxBenefitModelVersion):
|
|
|
374
377
|
},
|
|
375
378
|
sort_keys=True,
|
|
376
379
|
)
|
|
380
|
+
# ``PolicyEngineUSDataset.save()`` writes this record into the
|
|
381
|
+
# file, and ``load()`` refuses an output without it.
|
|
382
|
+
renames = (getattr(simulation.output_dataset, "metadata", None) or {}).get(
|
|
383
|
+
RENAMES_RECORD_KEY
|
|
384
|
+
)
|
|
385
|
+
if renames is None:
|
|
386
|
+
raise ValueError(
|
|
387
|
+
"This US output does not record which renamed stored "
|
|
388
|
+
"inputs were mapped when it was calculated; run again "
|
|
389
|
+
"before saving"
|
|
390
|
+
)
|
|
377
391
|
simulation.output_dataset.save()
|
|
378
392
|
if serialized_spm is not None:
|
|
379
393
|
# Store UTF-8 JSON in a dataset rather than an attribute: the
|
|
@@ -399,6 +413,10 @@ class MicrosimulationModelVersion(TaxBenefitModelVersion):
|
|
|
399
413
|
receipt = None
|
|
400
414
|
if self.country_code == "us":
|
|
401
415
|
from policyengine.core.spm import SPMProvenance
|
|
416
|
+
from policyengine.tax_benefit_models.us.legacy_inputs import (
|
|
417
|
+
RENAMES_RECORD_KEY,
|
|
418
|
+
read_renames_record,
|
|
419
|
+
)
|
|
402
420
|
|
|
403
421
|
with h5py.File(filepath, "r") as stream:
|
|
404
422
|
raw = (
|
|
@@ -406,6 +424,7 @@ class MicrosimulationModelVersion(TaxBenefitModelVersion):
|
|
|
406
424
|
if "policyengine_spm" in stream
|
|
407
425
|
else None
|
|
408
426
|
)
|
|
427
|
+
recorded_renames = read_renames_record(filepath)
|
|
409
428
|
if raw is None:
|
|
410
429
|
raise ValueError(
|
|
411
430
|
"Saved US simulation has no SPM configuration or receipt"
|
|
@@ -414,6 +433,15 @@ class MicrosimulationModelVersion(TaxBenefitModelVersion):
|
|
|
414
433
|
if recorded["config"] != simulation.spm_config:
|
|
415
434
|
raise ValueError("Saved US simulation uses different SPM settings")
|
|
416
435
|
receipt = SPMProvenance.model_validate(recorded["provenance"])
|
|
436
|
+
# Outputs saved before stored inputs were mapped onto renamed
|
|
437
|
+
# live inputs were calculated without them (for example with
|
|
438
|
+
# every WIC-eligible person taking WIC up), so they are not
|
|
439
|
+
# reused. ``Simulation.ensure()`` runs such a simulation again.
|
|
440
|
+
if recorded_renames is None:
|
|
441
|
+
raise ValueError(
|
|
442
|
+
"Saved US simulation predates the mapping of renamed "
|
|
443
|
+
"stored inputs (it has no record of them); run it again"
|
|
444
|
+
)
|
|
417
445
|
|
|
418
446
|
simulation.output_dataset = self._dataset_class(
|
|
419
447
|
id=simulation.id,
|
|
@@ -428,7 +456,9 @@ class MicrosimulationModelVersion(TaxBenefitModelVersion):
|
|
|
428
456
|
|
|
429
457
|
simulation.spm_receipt = receipt
|
|
430
458
|
simulation.spm = SPMSelection.model_validate(recorded["config"])
|
|
431
|
-
simulation.output_dataset.metadata
|
|
459
|
+
simulation.output_dataset.metadata.update(
|
|
460
|
+
{"spm_config": recorded["config"], RENAMES_RECORD_KEY: recorded_renames}
|
|
461
|
+
)
|
|
432
462
|
|
|
433
463
|
if os.path.exists(filepath):
|
|
434
464
|
simulation.created_at = datetime.datetime.fromtimestamp(
|