policyengine 4.17.2__tar.gz → 4.17.4__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-4.17.2 → policyengine-4.17.4}/CHANGELOG.md +14 -0
- {policyengine-4.17.2/src/policyengine.egg-info → policyengine-4.17.4}/PKG-INFO +3 -3
- {policyengine-4.17.2 → policyengine-4.17.4}/pyproject.toml +3 -3
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/release_manifests/uk.json +2 -2
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/release_manifests/uk.trace.tro.jsonld +7 -7
- policyengine-4.17.4/src/policyengine/data/release_manifests/us.json +65 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/release_manifests/us.trace.tro.jsonld +22 -22
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/certification.py +78 -4
- {policyengine-4.17.2 → policyengine-4.17.4/src/policyengine.egg-info}/PKG-INFO +3 -3
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/requires.txt +2 -2
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_model_surface.json +2 -2
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_certify_data_release.py +83 -1
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_models.py +2 -2
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_release_manifests.py +9 -19
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_regions.py +10 -25
- {policyengine-4.17.2 → policyengine-4.17.4}/uv.lock +6 -6
- policyengine-4.17.2/src/policyengine/data/release_manifests/us.json +0 -3477
- {policyengine-4.17.2 → policyengine-4.17.4}/.claude/policyengine-guide.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.claude/quick-reference.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/CONTRIBUTING.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/bump_version.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/changelog_template.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/check-changelog.sh +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/copilot-instructions.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/fetch_version.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/get-changelog-diff.sh +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/has-functional-changes.sh +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/is-version-number-acceptable.sh +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/publish-git-tag.sh +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/workflows/draft-pdf.yml +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/workflows/pr_code_changes.yaml +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/workflows/pr_docs_changes.yaml +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.github/workflows/push.yaml +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.gitignore +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/.python-version +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/AGENTS.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/CITATION.cff +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/CLAUDE.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/CODE_OF_CONDUCT.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/LICENSE +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/Makefile +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/README.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/architecture.png +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/architecture.svg +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/changelog.d/.gitkeep +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/.gitignore +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/_generator/README.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/_generator/build_reference.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/_quarto.yml +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/countries.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/data-publishing-design.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/dev.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/engineering/skills/README.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/engineering/skills/data-certification.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/engineering/skills/github-prs.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/engineering/skills/repository-guidance.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/examples.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/getting-started.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/households.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/impact-analysis.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/index.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/methodology/index.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/methodology/model-architecture.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/methodology/us-health-costs.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/microsim.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/outputs.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/programs/index.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/programs/us-chip.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/reference/index.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/reforms.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/regions.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/release-bundles.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/run-records.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/trace-case-study.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/docs/visualisation.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/examples/employment_income_variation_uk.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/examples/employment_income_variation_us.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/examples/household_impact_example.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/examples/income_bands_uk.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/examples/income_distribution_us.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/examples/paper_repro_uk.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/examples/policy_change_uk.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/examples/speedtest_us_simulation.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/examples/us_budgetary_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/paper-preview.html +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/paper.bib +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/paper.md +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/scripts/certify_data_release.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/scripts/check_data_staleness.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/scripts/generate_trace_tros.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/scripts/refresh_release_bundle.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/setup.cfg +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/cli.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/cache.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/dataset.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/dynamic.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/output.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/parameter.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/parameter_node.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/parameter_value.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/policy.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/region.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/run_record.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/scoping_strategy.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/simulation.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/tax_benefit_model.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/tax_benefit_model_version.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/core/variable.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/uk/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/uk/regions.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/data/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/data/districts.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/data/places.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/data/states.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/countries/us/regions.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/schemas/trace_tro.schema.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/data/uk_geography_assets.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/derivations/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/derivations/narrate.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/derivations/trace.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/graph/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/graph/extractor.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/graph/graph.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/aggregate.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/change_aggregate.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/cliff_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/congressional_district_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/constituency_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/decile_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/extra_variables.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/inequality.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/intra_decile_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/labor_supply_response.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/local_authority_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/poverty.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/program_statistics.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/outputs/uk_geography_assets.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/bundle.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/dataset_sources.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/manifest.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/pyproject_pins.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/trace.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/provenance/verify.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/results/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/results/schema.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/results/trace_tro.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/results/tracking.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/extra_variables.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/household.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/model_version.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/reform.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/common/result.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/analysis.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/datasets.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/household.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/uk/model.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/analysis.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/datasets.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/household.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/tax_benefit_models/us/model.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/data/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/data/caching_google_storage_client.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/data/version_aware_storage_client.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/dates.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/design.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/entity_utils.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/errors.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/google_cloud_bucket.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/household_validation.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/parameter_labels.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/parametric_reforms.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine/utils/plotting.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/SOURCES.txt +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/dependency_links.txt +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/entry_points.txt +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/src/policyengine.egg-info/top_level.txt +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/conftest.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/filtering_fixtures.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_couple_two_kids.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_model_surface.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_single_adult_employment_income.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_single_adult_no_income.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/uk_single_parent_one_child.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_married_two_kids_high_income.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_single_adult_employment_income.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_single_adult_no_income.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/household_calculator_snapshots/us_single_parent_one_child.json +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/parameter_labels_fixtures.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/parametric_reforms_fixtures.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/poverty_by_demographics_fixtures.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/region_fixtures.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/us_reform_fixtures.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/fixtures/variable_label_fixtures.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_aggregate.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_bump_version.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_bundle_refresh.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_cache.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_change_aggregate.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_cliff_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_cliff_impact_analysis.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_congressional_district_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_constituency_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_dataset_sources.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_derivations.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_dict_reforms_on_simulation.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_entity_mapping.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_entity_utils.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_errors.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_extra_variables.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_filtering.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_graph/__init__.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_graph/conftest.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_graph/test_extractor.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_household_calculator_snapshot.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_household_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_inequality.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_intra_decile_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_labor_supply_response.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_local_authority_impact.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_manifest_version_mismatch.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_pandas3_compatibility.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_parameter_labels.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_parametric_reforms.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_poverty.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_poverty_by_demographics.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_poverty_run.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_preservation_mirror.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_pyproject_pins.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_region.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_results.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_run_record.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_scoping_strategy.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_small_follow_ups.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_trace_tro.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_trace_tro_verify.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_uk_analysis.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_uk_geography_assets.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_uk_program_statistics.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_uk_regions.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_long_term_datasets.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_microsim_structural_reforms.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_program_statistics.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_us_reform_application.py +0 -0
- {policyengine-4.17.2 → policyengine-4.17.4}/tests/test_variable_labels.py +0 -0
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [4.17.4] - 2026-06-16
|
|
2
|
+
|
|
3
|
+
### Changed
|
|
4
|
+
|
|
5
|
+
- Certify the US data release `populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z` (populace_us_2024, policyengine-us 1.729.0) directly from its data release manifest.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## [4.17.3] - 2026-06-15
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Certify the US data release `populace-us-2024-0cdbb27-c239dfe51c11-20260615T201302Z` (populace_us_2024, policyengine-us 1.729.0) directly from its data release manifest.
|
|
13
|
+
|
|
14
|
+
|
|
1
15
|
## [4.17.2] - 2026-06-15
|
|
2
16
|
|
|
3
17
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: policyengine
|
|
3
|
-
Version: 4.17.
|
|
3
|
+
Version: 4.17.4
|
|
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
|
|
@@ -693,7 +693,7 @@ Requires-Dist: policyengine_core>=3.26.1; extra == "uk"
|
|
|
693
693
|
Requires-Dist: policyengine-uk==2.88.20; extra == "uk"
|
|
694
694
|
Provides-Extra: us
|
|
695
695
|
Requires-Dist: policyengine_core>=3.27.1; extra == "us"
|
|
696
|
-
Requires-Dist: policyengine-us==1.
|
|
696
|
+
Requires-Dist: policyengine-us==1.729.0; extra == "us"
|
|
697
697
|
Provides-Extra: dev
|
|
698
698
|
Requires-Dist: pytest; extra == "dev"
|
|
699
699
|
Requires-Dist: furo; extra == "dev"
|
|
@@ -707,7 +707,7 @@ Requires-Dist: pytest-asyncio>=0.26.0; extra == "dev"
|
|
|
707
707
|
Requires-Dist: ruff>=0.9.0; extra == "dev"
|
|
708
708
|
Requires-Dist: policyengine_core>=3.27.1; extra == "dev"
|
|
709
709
|
Requires-Dist: policyengine-uk==2.88.20; extra == "dev"
|
|
710
|
-
Requires-Dist: policyengine-us==1.
|
|
710
|
+
Requires-Dist: policyengine-us==1.729.0; extra == "dev"
|
|
711
711
|
Requires-Dist: towncrier>=24.8.0; extra == "dev"
|
|
712
712
|
Requires-Dist: mypy>=1.11.0; extra == "dev"
|
|
713
713
|
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "policyengine"
|
|
7
|
-
version = "4.17.
|
|
7
|
+
version = "4.17.4"
|
|
8
8
|
description = "A package to conduct policy analysis using PolicyEngine tax-benefit models."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [
|
|
@@ -49,7 +49,7 @@ uk = [
|
|
|
49
49
|
]
|
|
50
50
|
us = [
|
|
51
51
|
"policyengine_core>=3.27.1",
|
|
52
|
-
"policyengine-us==1.
|
|
52
|
+
"policyengine-us==1.729.0",
|
|
53
53
|
]
|
|
54
54
|
dev = [
|
|
55
55
|
"pytest",
|
|
@@ -64,7 +64,7 @@ dev = [
|
|
|
64
64
|
"ruff>=0.9.0",
|
|
65
65
|
"policyengine_core>=3.27.1",
|
|
66
66
|
"policyengine-uk==2.88.20",
|
|
67
|
-
"policyengine-us==1.
|
|
67
|
+
"policyengine-us==1.729.0",
|
|
68
68
|
"towncrier>=24.8.0",
|
|
69
69
|
"mypy>=1.11.0",
|
|
70
70
|
"pytest-cov>=5.0.0",
|
|
@@ -18,18 +18,18 @@
|
|
|
18
18
|
"schema:url": "https://policyengine.org"
|
|
19
19
|
},
|
|
20
20
|
"schema:dateCreated": "2026-05-20T20:16:50.641086Z",
|
|
21
|
-
"schema:description": "TRACE TRO for certified runtime bundle uk-4.17.
|
|
21
|
+
"schema:description": "TRACE TRO for certified runtime bundle uk-4.17.4 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": "4.17.
|
|
26
|
+
"schema:softwareVersion": "4.17.4"
|
|
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-4.17.
|
|
32
|
+
"rdfs:comment": "Certified arrangement for bundle uk-4.17.4.",
|
|
33
33
|
"trov:hasArtifactLocation": [
|
|
34
34
|
{
|
|
35
35
|
"@id": "arrangement/1/location/bundle_manifest",
|
|
@@ -75,7 +75,7 @@
|
|
|
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": "6eec54f7707fc44dd0b2fc7630cf44897e6d3e18c61a414ea1ea3a4c13678c05"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"@id": "composition/1/artifact/data_release_manifest",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"trov:hasFingerprint": {
|
|
103
103
|
"@id": "composition/1/fingerprint",
|
|
104
104
|
"@type": "trov:CompositionFingerprint",
|
|
105
|
-
"trov:sha256": "
|
|
105
|
+
"trov:sha256": "ee58fee6ad2be7dfafd4f612775276551438f0f26a9985f4c390d3a657f88864"
|
|
106
106
|
}
|
|
107
107
|
},
|
|
108
108
|
"trov:hasPerformance": {
|
|
@@ -112,8 +112,8 @@
|
|
|
112
112
|
"pe:certifiedBy": "policyengine.py bundled manifest",
|
|
113
113
|
"pe:certifiedForModelVersion": "2.88.20",
|
|
114
114
|
"pe:ciGitRef": "refs/heads/main",
|
|
115
|
-
"pe:ciGitSha": "
|
|
116
|
-
"pe:ciRunUrl": "https://github.com/PolicyEngine/policyengine.py/actions/runs/
|
|
115
|
+
"pe:ciGitSha": "e27453d8e0532d2394896570b7a1383f96930c69",
|
|
116
|
+
"pe:ciRunUrl": "https://github.com/PolicyEngine/policyengine.py/actions/runs/27622227038",
|
|
117
117
|
"pe:compatibilityBasis": "exact_build_model_version",
|
|
118
118
|
"pe:dataBuildFingerprint": "sha256:77f149725a36055fd89961855230401852b0712d301c6e26d6d16565c6b23809",
|
|
119
119
|
"pe:dataBuildId": "policyengine-uk-data-1.55.10",
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"bundle_id": "us-4.17.4",
|
|
3
|
+
"certification": {
|
|
4
|
+
"built_with_model_version": "1.729.0",
|
|
5
|
+
"certified_by": "policyengine.py certification",
|
|
6
|
+
"certified_for_model_version": "1.729.0",
|
|
7
|
+
"compatibility_basis": "built_with_model_package",
|
|
8
|
+
"data_build_id": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z"
|
|
9
|
+
},
|
|
10
|
+
"certified_data_artifact": {
|
|
11
|
+
"build_id": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
|
|
12
|
+
"data_package": {
|
|
13
|
+
"name": "populace-data",
|
|
14
|
+
"version": "0.1.0"
|
|
15
|
+
},
|
|
16
|
+
"dataset": "populace_us_2024",
|
|
17
|
+
"sha256": "a912aea0ca0c27bb5225516bf859d4937cad0579a2f3971d7306086bc61cbfd7",
|
|
18
|
+
"uri": "hf://policyengine/populace-us/populace_us_2024.h5@populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z"
|
|
19
|
+
},
|
|
20
|
+
"country_id": "us",
|
|
21
|
+
"data_package": {
|
|
22
|
+
"name": "populace-data",
|
|
23
|
+
"release_manifest_path": "releases/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/release_manifest.json",
|
|
24
|
+
"release_manifest_revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
|
|
25
|
+
"repo_id": "policyengine/populace-us",
|
|
26
|
+
"repo_type": "dataset",
|
|
27
|
+
"version": "0.1.0"
|
|
28
|
+
},
|
|
29
|
+
"datasets": {
|
|
30
|
+
"calibration_diagnostics": {
|
|
31
|
+
"path": "releases/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/calibration_diagnostics.json",
|
|
32
|
+
"repo_id": "policyengine/populace-us",
|
|
33
|
+
"revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
|
|
34
|
+
"sha256": "4c363816bce3decabb392c6d61002420fd60de85beec30022c3d81684765763b"
|
|
35
|
+
},
|
|
36
|
+
"populace_us_2024": {
|
|
37
|
+
"path": "populace_us_2024.h5",
|
|
38
|
+
"repo_id": "policyengine/populace-us",
|
|
39
|
+
"revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
|
|
40
|
+
"sha256": "a912aea0ca0c27bb5225516bf859d4937cad0579a2f3971d7306086bc61cbfd7"
|
|
41
|
+
},
|
|
42
|
+
"populace_us_2024_calibration": {
|
|
43
|
+
"path": "populace_us_2024_calibration.npz",
|
|
44
|
+
"repo_id": "policyengine/populace-us",
|
|
45
|
+
"revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
|
|
46
|
+
"sha256": "f701d36341c5d6c39862acef14db074027bdcd289d3523571020c94892f33ccb"
|
|
47
|
+
},
|
|
48
|
+
"us_source_coverage": {
|
|
49
|
+
"path": "releases/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/us_source_coverage.json",
|
|
50
|
+
"repo_id": "policyengine/populace-us",
|
|
51
|
+
"revision": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
|
|
52
|
+
"sha256": "66c3749e39d324ae892b3482341468b6205d06e69140c19b7c5136f69e0cb0b3"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"default_dataset": "populace_us_2024",
|
|
56
|
+
"model_package": {
|
|
57
|
+
"name": "policyengine-us",
|
|
58
|
+
"sha256": "8d21d3f7c0e82a9415edffe8ea53939330a63d9c8f6bd334299bddb697cf2c00",
|
|
59
|
+
"version": "1.729.0",
|
|
60
|
+
"wheel_url": "https://files.pythonhosted.org/packages/b9/7d/778f92ae94997b00c3c9ac34b345f6c9333435f905670ee4eeb2f5e19809/policyengine_us-1.729.0-py3-none-any.whl"
|
|
61
|
+
},
|
|
62
|
+
"policyengine_version": "4.17.4",
|
|
63
|
+
"region_datasets": {},
|
|
64
|
+
"schema_version": 1
|
|
65
|
+
}
|
|
@@ -17,19 +17,19 @@
|
|
|
17
17
|
"schema:name": "PolicyEngine",
|
|
18
18
|
"schema:url": "https://policyengine.org"
|
|
19
19
|
},
|
|
20
|
-
"schema:dateCreated": "2026-06-
|
|
21
|
-
"schema:description": "TRACE TRO for certified runtime bundle us-4.17.
|
|
20
|
+
"schema:dateCreated": "2026-06-16T13:15:11.179501+00:00",
|
|
21
|
+
"schema:description": "TRACE TRO for certified runtime bundle us-4.17.4 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 us certified bundle TRO",
|
|
23
23
|
"trov:createdWith": {
|
|
24
24
|
"@type": "schema:SoftwareApplication",
|
|
25
25
|
"schema:name": "policyengine",
|
|
26
|
-
"schema:softwareVersion": "4.17.
|
|
26
|
+
"schema:softwareVersion": "4.17.4"
|
|
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 us-4.17.
|
|
32
|
+
"rdfs:comment": "Certified arrangement for bundle us-4.17.4.",
|
|
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/datasets/policyengine/populace-us/resolve/
|
|
48
|
+
"trov:hasLocation": "https://huggingface.co/datasets/policyengine/populace-us/resolve/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/releases/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/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/populace-us/resolve/populace-us-2024-
|
|
56
|
+
"trov:hasLocation": "https://huggingface.co/policyengine/populace-us/resolve/populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z/populace_us_2024.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/
|
|
64
|
+
"trov:hasLocation": "https://files.pythonhosted.org/packages/b9/7d/778f92ae94997b00c3c9ac34b345f6c9333435f905670ee4eeb2f5e19809/policyengine_us-1.729.0-py3-none-any.whl"
|
|
65
65
|
}
|
|
66
66
|
]
|
|
67
67
|
}
|
|
@@ -75,53 +75,53 @@
|
|
|
75
75
|
"@type": "trov:ResearchArtifact",
|
|
76
76
|
"schema:name": "policyengine.py bundle manifest for us",
|
|
77
77
|
"trov:mimeType": "application/json",
|
|
78
|
-
"trov:sha256": "
|
|
78
|
+
"trov:sha256": "e9f9542464d4a73257b0a926463676122ac860ec5e217393d5c043bbc3185444"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"@id": "composition/1/artifact/data_release_manifest",
|
|
82
82
|
"@type": "trov:ResearchArtifact",
|
|
83
83
|
"schema:name": "populace-data release manifest 0.1.0",
|
|
84
84
|
"trov:mimeType": "application/json",
|
|
85
|
-
"trov:sha256": "
|
|
85
|
+
"trov:sha256": "d2506e739a20ab4cdb8a709a93fb9c766e36566028e36b946e5f2f7d6714c061"
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
88
|
"@id": "composition/1/artifact/dataset",
|
|
89
89
|
"@type": "trov:ResearchArtifact",
|
|
90
90
|
"schema:name": "populace_us_2024",
|
|
91
91
|
"trov:mimeType": "application/x-hdf5",
|
|
92
|
-
"trov:sha256": "
|
|
92
|
+
"trov:sha256": "a912aea0ca0c27bb5225516bf859d4937cad0579a2f3971d7306086bc61cbfd7"
|
|
93
93
|
},
|
|
94
94
|
{
|
|
95
95
|
"@id": "composition/1/artifact/model_wheel",
|
|
96
96
|
"@type": "trov:ResearchArtifact",
|
|
97
|
-
"schema:name": "policyengine-us==1.
|
|
97
|
+
"schema:name": "policyengine-us==1.729.0 wheel",
|
|
98
98
|
"trov:mimeType": "application/zip",
|
|
99
|
-
"trov:sha256": "
|
|
99
|
+
"trov:sha256": "8d21d3f7c0e82a9415edffe8ea53939330a63d9c8f6bd334299bddb697cf2c00"
|
|
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": "9ec19a4d5c7074985ba476ebf0f7dff1eb4edb096a7e69857fa53f3c05bed2b5"
|
|
106
106
|
}
|
|
107
107
|
},
|
|
108
108
|
"trov:hasPerformance": {
|
|
109
109
|
"@id": "trp/1",
|
|
110
110
|
"@type": "trov:TransparentResearchPerformance",
|
|
111
|
-
"pe:builtWithModelVersion": "1.
|
|
112
|
-
"pe:certifiedBy": "
|
|
113
|
-
"pe:certifiedForModelVersion": "1.
|
|
111
|
+
"pe:builtWithModelVersion": "1.729.0",
|
|
112
|
+
"pe:certifiedBy": "policyengine.py certification",
|
|
113
|
+
"pe:certifiedForModelVersion": "1.729.0",
|
|
114
114
|
"pe:ciGitRef": "refs/heads/main",
|
|
115
|
-
"pe:ciGitSha": "
|
|
116
|
-
"pe:ciRunUrl": "https://github.com/PolicyEngine/policyengine.py/actions/runs/
|
|
117
|
-
"pe:compatibilityBasis": "
|
|
118
|
-
"pe:dataBuildId": "populace-us-2024-
|
|
115
|
+
"pe:ciGitSha": "e27453d8e0532d2394896570b7a1383f96930c69",
|
|
116
|
+
"pe:ciRunUrl": "https://github.com/PolicyEngine/policyengine.py/actions/runs/27622227038",
|
|
117
|
+
"pe:compatibilityBasis": "built_with_model_package",
|
|
118
|
+
"pe:dataBuildId": "populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z",
|
|
119
119
|
"pe:emittedIn": "github-actions",
|
|
120
|
-
"rdfs:comment": "Certification of build populace-us-2024-
|
|
120
|
+
"rdfs:comment": "Certification of build populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z for policyengine-us 1.729.0.",
|
|
121
121
|
"trov:accessedArrangement": {
|
|
122
122
|
"@id": "arrangement/1"
|
|
123
123
|
},
|
|
124
|
-
"trov:startedAtTime": "2026-06-
|
|
124
|
+
"trov:startedAtTime": "2026-06-16T13:15:11.179501+00:00",
|
|
125
125
|
"trov:wasConductedBy": {
|
|
126
126
|
"@id": "trs"
|
|
127
127
|
}
|
|
@@ -18,8 +18,9 @@ an assertion the test suite then exercises on the exact pair.
|
|
|
18
18
|
country="us",
|
|
19
19
|
manifest_uri=(
|
|
20
20
|
"hf://dataset/policyengine/populace-us"
|
|
21
|
-
"@populace-us-2024-
|
|
22
|
-
"/releases/populace-us-2024-
|
|
21
|
+
"@populace-us-2024-0cdbb27-c239dfe51c11-20260615T201302Z"
|
|
22
|
+
"/releases/populace-us-2024-0cdbb27-c239dfe51c11-20260615T201302Z"
|
|
23
|
+
"/release_manifest.json"
|
|
23
24
|
),
|
|
24
25
|
)
|
|
25
26
|
print(result.summary())
|
|
@@ -117,13 +118,17 @@ def https_manifest_url(parts: dict) -> str:
|
|
|
117
118
|
|
|
118
119
|
def https_release_file_url(parts: dict, filename: str) -> str:
|
|
119
120
|
prefix = "datasets/" if parts["repo_type"] == "dataset" else ""
|
|
120
|
-
release_dir = parts
|
|
121
|
+
release_dir = release_manifest_dir(parts)
|
|
121
122
|
return (
|
|
122
123
|
f"https://huggingface.co/{prefix}{parts['repo_id']}/resolve/"
|
|
123
124
|
f"{parts['revision']}/{release_dir}/{filename}"
|
|
124
125
|
)
|
|
125
126
|
|
|
126
127
|
|
|
128
|
+
def release_manifest_dir(parts: dict) -> str:
|
|
129
|
+
return parts["path"].rsplit("/", 1)[0]
|
|
130
|
+
|
|
131
|
+
|
|
127
132
|
def fetch_release_manifest(
|
|
128
133
|
manifest_uri: str,
|
|
129
134
|
token: Optional[str] = None,
|
|
@@ -248,6 +253,51 @@ def head_release_file(
|
|
|
248
253
|
return response.status_code == 200
|
|
249
254
|
|
|
250
255
|
|
|
256
|
+
def artifact_path_for_country_manifest(artifact, uri_parts: dict) -> str:
|
|
257
|
+
path = artifact.path
|
|
258
|
+
release_dir = release_manifest_dir(uri_parts)
|
|
259
|
+
if (
|
|
260
|
+
artifact.kind == "diagnostics"
|
|
261
|
+
and artifact.repo_id == uri_parts["repo_id"]
|
|
262
|
+
and artifact.revision == uri_parts["revision"]
|
|
263
|
+
and not path.startswith(f"{release_dir}/")
|
|
264
|
+
):
|
|
265
|
+
return f"{release_dir}/{path}"
|
|
266
|
+
return path
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def artifact_reference_url(
|
|
270
|
+
reference: dict, uri_parts: dict, prefix: str = "datasets/"
|
|
271
|
+
) -> str:
|
|
272
|
+
repo_id = reference.get("repo_id") or uri_parts["repo_id"]
|
|
273
|
+
revision = reference.get("revision") or uri_parts["revision"]
|
|
274
|
+
return (
|
|
275
|
+
f"https://huggingface.co/{prefix}{repo_id}/resolve/"
|
|
276
|
+
f"{revision}/{reference['path']}"
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def head_artifact_reference(
|
|
281
|
+
reference: dict,
|
|
282
|
+
uri_parts: dict,
|
|
283
|
+
token: Optional[str] = None,
|
|
284
|
+
) -> bool:
|
|
285
|
+
headers = {"Authorization": f"Bearer {token}"} if token else {}
|
|
286
|
+
for prefix in ("datasets/", ""):
|
|
287
|
+
try:
|
|
288
|
+
response = requests.head(
|
|
289
|
+
artifact_reference_url(reference, uri_parts, prefix=prefix),
|
|
290
|
+
headers=headers,
|
|
291
|
+
timeout=HF_REQUEST_TIMEOUT_SECONDS,
|
|
292
|
+
allow_redirects=True,
|
|
293
|
+
)
|
|
294
|
+
except requests.RequestException:
|
|
295
|
+
continue
|
|
296
|
+
if response.status_code == 200:
|
|
297
|
+
return True
|
|
298
|
+
return False
|
|
299
|
+
|
|
300
|
+
|
|
251
301
|
def required_supplemental_release_files(
|
|
252
302
|
country: str,
|
|
253
303
|
manifest: DataReleaseManifest,
|
|
@@ -262,6 +312,18 @@ def required_supplemental_release_files(
|
|
|
262
312
|
return ()
|
|
263
313
|
|
|
264
314
|
|
|
315
|
+
def should_validate_vendored_artifacts(
|
|
316
|
+
country: str,
|
|
317
|
+
manifest: DataReleaseManifest,
|
|
318
|
+
uri_parts: dict,
|
|
319
|
+
) -> bool:
|
|
320
|
+
return (
|
|
321
|
+
country == "us"
|
|
322
|
+
and manifest.data_package.name == "populace-data"
|
|
323
|
+
and uri_parts["repo_id"] == "policyengine/populace-us"
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
|
|
265
327
|
def build_country_manifest_payload(
|
|
266
328
|
*,
|
|
267
329
|
country: str,
|
|
@@ -284,7 +346,10 @@ def build_country_manifest_payload(
|
|
|
284
346
|
|
|
285
347
|
datasets: dict[str, dict] = {}
|
|
286
348
|
for name, artifact in manifest.artifacts.items():
|
|
287
|
-
payload: dict = {
|
|
349
|
+
payload: dict = {
|
|
350
|
+
"path": artifact_path_for_country_manifest(artifact, uri_parts),
|
|
351
|
+
"revision": artifact.revision,
|
|
352
|
+
}
|
|
288
353
|
if artifact.sha256:
|
|
289
354
|
payload["sha256"] = artifact.sha256
|
|
290
355
|
if artifact.repo_id:
|
|
@@ -413,6 +478,15 @@ def certify_data_release(
|
|
|
413
478
|
model_wheel=model_wheel or {},
|
|
414
479
|
compatibility_basis=compatibility_basis,
|
|
415
480
|
)
|
|
481
|
+
if check_artifacts and should_validate_vendored_artifacts(
|
|
482
|
+
country, manifest, uri_parts
|
|
483
|
+
):
|
|
484
|
+
for name, reference in payload["datasets"].items():
|
|
485
|
+
if not head_artifact_reference(reference, uri_parts, token=token):
|
|
486
|
+
raise CertificationError(
|
|
487
|
+
f"Vendored artifact {name!r} is not reachable at "
|
|
488
|
+
f"{artifact_reference_url(reference, uri_parts)}"
|
|
489
|
+
)
|
|
416
490
|
|
|
417
491
|
if output_dir is None:
|
|
418
492
|
output_dir = Path(str(files("policyengine"))) / "data" / "release_manifests"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: policyengine
|
|
3
|
-
Version: 4.17.
|
|
3
|
+
Version: 4.17.4
|
|
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
|
|
@@ -693,7 +693,7 @@ Requires-Dist: policyengine_core>=3.26.1; extra == "uk"
|
|
|
693
693
|
Requires-Dist: policyengine-uk==2.88.20; extra == "uk"
|
|
694
694
|
Provides-Extra: us
|
|
695
695
|
Requires-Dist: policyengine_core>=3.27.1; extra == "us"
|
|
696
|
-
Requires-Dist: policyengine-us==1.
|
|
696
|
+
Requires-Dist: policyengine-us==1.729.0; extra == "us"
|
|
697
697
|
Provides-Extra: dev
|
|
698
698
|
Requires-Dist: pytest; extra == "dev"
|
|
699
699
|
Requires-Dist: furo; extra == "dev"
|
|
@@ -707,7 +707,7 @@ Requires-Dist: pytest-asyncio>=0.26.0; extra == "dev"
|
|
|
707
707
|
Requires-Dist: ruff>=0.9.0; extra == "dev"
|
|
708
708
|
Requires-Dist: policyengine_core>=3.27.1; extra == "dev"
|
|
709
709
|
Requires-Dist: policyengine-uk==2.88.20; extra == "dev"
|
|
710
|
-
Requires-Dist: policyengine-us==1.
|
|
710
|
+
Requires-Dist: policyengine-us==1.729.0; extra == "dev"
|
|
711
711
|
Requires-Dist: towncrier>=24.8.0; extra == "dev"
|
|
712
712
|
Requires-Dist: mypy>=1.11.0; extra == "dev"
|
|
713
713
|
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
@@ -22,7 +22,7 @@ pytest-asyncio>=0.26.0
|
|
|
22
22
|
ruff>=0.9.0
|
|
23
23
|
policyengine_core>=3.27.1
|
|
24
24
|
policyengine-uk==2.88.20
|
|
25
|
-
policyengine-us==1.
|
|
25
|
+
policyengine-us==1.729.0
|
|
26
26
|
towncrier>=24.8.0
|
|
27
27
|
mypy>=1.11.0
|
|
28
28
|
pytest-cov>=5.0.0
|
|
@@ -39,4 +39,4 @@ policyengine-uk==2.88.20
|
|
|
39
39
|
|
|
40
40
|
[us]
|
|
41
41
|
policyengine_core>=3.27.1
|
|
42
|
-
policyengine-us==1.
|
|
42
|
+
policyengine-us==1.729.0
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"has_income_tax": true,
|
|
6
6
|
"has_region_registry": true,
|
|
7
7
|
"model_package_name": "policyengine-us",
|
|
8
|
-
"num_parameters_bucketed_100s":
|
|
9
|
-
"num_variables_bucketed_100s":
|
|
8
|
+
"num_parameters_bucketed_100s": 917,
|
|
9
|
+
"num_variables_bucketed_100s": 54,
|
|
10
10
|
"region_registry_country": "us"
|
|
11
11
|
}
|
|
@@ -55,6 +55,30 @@ def _release_manifest_payload() -> dict:
|
|
|
55
55
|
"sha256": "a" * 64,
|
|
56
56
|
"size_bytes": 1,
|
|
57
57
|
},
|
|
58
|
+
"populace_us_2024_calibration": {
|
|
59
|
+
"kind": "calibration",
|
|
60
|
+
"path": "populace_us_2024_calibration.npz",
|
|
61
|
+
"repo_id": "policyengine/populace-us",
|
|
62
|
+
"revision": TAG,
|
|
63
|
+
"sha256": "c" * 64,
|
|
64
|
+
"size_bytes": 1,
|
|
65
|
+
},
|
|
66
|
+
"calibration_diagnostics": {
|
|
67
|
+
"kind": "diagnostics",
|
|
68
|
+
"path": "calibration_diagnostics.json",
|
|
69
|
+
"repo_id": "policyengine/populace-us",
|
|
70
|
+
"revision": TAG,
|
|
71
|
+
"sha256": "e" * 64,
|
|
72
|
+
"size_bytes": 1,
|
|
73
|
+
},
|
|
74
|
+
"us_source_coverage": {
|
|
75
|
+
"kind": "diagnostics",
|
|
76
|
+
"path": "us_source_coverage.json",
|
|
77
|
+
"repo_id": "policyengine/populace-us",
|
|
78
|
+
"revision": TAG,
|
|
79
|
+
"sha256": "f" * 64,
|
|
80
|
+
"size_bytes": 1,
|
|
81
|
+
},
|
|
58
82
|
"states/AK": {
|
|
59
83
|
"kind": "microdata",
|
|
60
84
|
"path": "states/AK.h5",
|
|
@@ -170,6 +194,21 @@ class TestBuildCountryManifestPayload:
|
|
|
170
194
|
"repo_id": "policyengine/policyengine-us-data",
|
|
171
195
|
}
|
|
172
196
|
|
|
197
|
+
def test__given_release_scoped_diagnostics__then_rewrites_paths(self):
|
|
198
|
+
payload = self._payload()
|
|
199
|
+
|
|
200
|
+
assert payload["datasets"]["populace_us_2024"]["path"] == "populace_us_2024.h5"
|
|
201
|
+
assert (
|
|
202
|
+
payload["datasets"]["populace_us_2024_calibration"]["path"]
|
|
203
|
+
== "populace_us_2024_calibration.npz"
|
|
204
|
+
)
|
|
205
|
+
assert payload["datasets"]["calibration_diagnostics"]["path"] == (
|
|
206
|
+
f"releases/{TAG}/calibration_diagnostics.json"
|
|
207
|
+
)
|
|
208
|
+
assert payload["datasets"]["us_source_coverage"]["path"] == (
|
|
209
|
+
f"releases/{TAG}/us_source_coverage.json"
|
|
210
|
+
)
|
|
211
|
+
|
|
173
212
|
def test__given_region_templates__then_carried_through(self):
|
|
174
213
|
payload = self._payload()
|
|
175
214
|
|
|
@@ -211,6 +250,10 @@ class TestCertifyDataRelease:
|
|
|
211
250
|
"policyengine.provenance.certification.head_release_file",
|
|
212
251
|
return_value=True,
|
|
213
252
|
),
|
|
253
|
+
patch(
|
|
254
|
+
"policyengine.provenance.certification.head_artifact_reference",
|
|
255
|
+
return_value=True,
|
|
256
|
+
),
|
|
214
257
|
patch(
|
|
215
258
|
"policyengine.provenance.certification.fetch_pypi_wheel_metadata",
|
|
216
259
|
return_value={"sha256": "d" * 64, "url": "https://example"},
|
|
@@ -226,7 +269,7 @@ class TestCertifyDataRelease:
|
|
|
226
269
|
written = json.loads((tmp_path / "us.json").read_text())
|
|
227
270
|
assert written["default_dataset"] == "populace_us_2024"
|
|
228
271
|
assert written["certification"]["data_build_id"] == TAG
|
|
229
|
-
assert result.dataset_count ==
|
|
272
|
+
assert result.dataset_count == 5
|
|
230
273
|
assert result.build_id == TAG
|
|
231
274
|
|
|
232
275
|
def test__given_missing_populace_us_source_coverage__then_raises(self, tmp_path):
|
|
@@ -270,6 +313,10 @@ class TestCertifyDataRelease:
|
|
|
270
313
|
"policyengine.provenance.certification.head_release_file",
|
|
271
314
|
return_value=True,
|
|
272
315
|
),
|
|
316
|
+
patch(
|
|
317
|
+
"policyengine.provenance.certification.head_artifact_reference",
|
|
318
|
+
return_value=True,
|
|
319
|
+
),
|
|
273
320
|
pytest.raises(CertificationError, match="not reachable"),
|
|
274
321
|
):
|
|
275
322
|
certify_data_release(
|
|
@@ -279,6 +326,41 @@ class TestCertifyDataRelease:
|
|
|
279
326
|
output_dir=tmp_path,
|
|
280
327
|
)
|
|
281
328
|
|
|
329
|
+
def test__given_unreachable_vendored_artifact__then_raises(self, tmp_path):
|
|
330
|
+
response = MagicMock()
|
|
331
|
+
response.status_code = 200
|
|
332
|
+
response.content = json.dumps(_release_manifest_payload()).encode()
|
|
333
|
+
|
|
334
|
+
with (
|
|
335
|
+
patch(
|
|
336
|
+
"policyengine.provenance.certification.requests.get",
|
|
337
|
+
return_value=response,
|
|
338
|
+
),
|
|
339
|
+
patch(
|
|
340
|
+
"policyengine.provenance.certification.head_artifact",
|
|
341
|
+
return_value=True,
|
|
342
|
+
),
|
|
343
|
+
patch(
|
|
344
|
+
"policyengine.provenance.certification.head_release_file",
|
|
345
|
+
return_value=True,
|
|
346
|
+
),
|
|
347
|
+
patch(
|
|
348
|
+
"policyengine.provenance.certification.fetch_pypi_wheel_metadata",
|
|
349
|
+
return_value={"sha256": "d" * 64, "url": "https://example"},
|
|
350
|
+
),
|
|
351
|
+
patch(
|
|
352
|
+
"policyengine.provenance.certification.head_artifact_reference",
|
|
353
|
+
return_value=False,
|
|
354
|
+
),
|
|
355
|
+
pytest.raises(CertificationError, match="Vendored artifact"),
|
|
356
|
+
):
|
|
357
|
+
certify_data_release(
|
|
358
|
+
country="us",
|
|
359
|
+
manifest_uri=MANIFEST_URI,
|
|
360
|
+
model_version="1.723.0",
|
|
361
|
+
output_dir=tmp_path,
|
|
362
|
+
)
|
|
363
|
+
|
|
282
364
|
|
|
283
365
|
class TestVendoredSidecarBinding:
|
|
284
366
|
def test__given_vendored_us_manifest__then_tro_sidecar_binds_it(self):
|
|
@@ -113,13 +113,13 @@ class TestUSModel:
|
|
|
113
113
|
assert us_latest.release_manifest is not None
|
|
114
114
|
assert us_latest.release_manifest.country_id == "us"
|
|
115
115
|
assert us_latest.model_package.name == "policyengine-us"
|
|
116
|
-
assert us_latest.model_package.version == "1.
|
|
116
|
+
assert us_latest.model_package.version == "1.729.0"
|
|
117
117
|
assert us_latest.data_package.name == "populace-data"
|
|
118
118
|
assert us_latest.data_package.version == "0.1.0"
|
|
119
119
|
assert (
|
|
120
120
|
us_latest.default_dataset_uri
|
|
121
121
|
== "hf://policyengine/populace-us/populace_us_2024.h5"
|
|
122
|
-
"@populace-us-2024-
|
|
122
|
+
"@populace-us-2024-f32c2e5-0c38bc47db89-20260616T124451Z"
|
|
123
123
|
)
|
|
124
124
|
|
|
125
125
|
def test_has_hundreds_of_parameters(self):
|