policyengine 6.3.4__tar.gz → 6.4.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.3.4 → policyengine-6.4.0}/CHANGELOG.md +11 -0
- {policyengine-6.3.4/src/policyengine.egg-info → policyengine-6.4.0}/PKG-INFO +1 -1
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/_quarto.yml +1 -0
- policyengine-6.4.0/docs/disclosure.md +239 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/engineering/runbooks/build-m-us-populace-certification.md +23 -6
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/engineering/skills/data-certification.md +27 -2
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/examples.md +7 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/outputs.md +22 -1
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/regions.md +5 -0
- policyengine-6.4.0/examples/uk_geography_disclosure.py +84 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/pyproject.toml +1 -1
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/data/bundle/manifest.json +10 -10
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/data/bundle/uk.trace.tro.jsonld +5 -5
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/data/bundle/us.trace.tro.jsonld +5 -5
- policyengine-6.4.0/src/policyengine/disclosure/__init__.py +65 -0
- policyengine-6.4.0/src/policyengine/disclosure/__main__.py +37 -0
- policyengine-6.4.0/src/policyengine/disclosure/areas.py +216 -0
- policyengine-6.4.0/src/policyengine/disclosure/estimate.py +472 -0
- policyengine-6.4.0/src/policyengine/disclosure/noise.py +102 -0
- policyengine-6.4.0/src/policyengine/disclosure/release.py +858 -0
- policyengine-6.4.0/src/policyengine/disclosure/schema.py +278 -0
- policyengine-6.4.0/src/policyengine/disclosure/support.py +166 -0
- policyengine-6.4.0/src/policyengine/disclosure/validate.py +211 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/__init__.py +6 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/constituency_impact.py +12 -1
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/local_authority_impact.py +12 -1
- policyengine-6.4.0/src/policyengine/outputs/uk_geography_disclosure.py +275 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/uk_geography_impact.py +19 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/uk/model.py +6 -0
- {policyengine-6.3.4 → policyengine-6.4.0/src/policyengine.egg-info}/PKG-INFO +1 -1
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine.egg-info/SOURCES.txt +20 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_constituency_impact.py +29 -0
- policyengine-6.4.0/tests/test_disclosure_areas.py +132 -0
- policyengine-6.4.0/tests/test_disclosure_estimate.py +558 -0
- policyengine-6.4.0/tests/test_disclosure_noise.py +108 -0
- policyengine-6.4.0/tests/test_disclosure_release.py +678 -0
- policyengine-6.4.0/tests/test_disclosure_schema.py +186 -0
- policyengine-6.4.0/tests/test_disclosure_support.py +242 -0
- policyengine-6.4.0/tests/test_disclosure_validate.py +217 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_extra_variables.py +3 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_local_authority_impact.py +31 -0
- policyengine-6.4.0/tests/test_uk_geography_disclosure.py +277 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/uv.lock +1 -1
- {policyengine-6.3.4 → policyengine-6.4.0}/.claude/policyengine-guide.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.claude/quick-reference.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/CONTRIBUTING.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/bump_version.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/capture-version.sh +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/changelog_template.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/check-changelog.sh +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/copilot-instructions.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/dispatch-policyengine-release.sh +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/fetch_version.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/get-changelog-diff.sh +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/has-functional-changes.sh +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/is-version-number-acceptable.sh +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/publish-git-tag.sh +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/wait-for-pypi.sh +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/workflows/draft-pdf.yml +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/workflows/pr_code_changes.yaml +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/workflows/pr_docs_changes.yaml +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.github/workflows/push.yaml +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.gitignore +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/.python-version +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/AGENTS.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/CITATION.cff +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/CLAUDE.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/CODE_OF_CONDUCT.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/CONTRIBUTING.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/LICENSE +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/Makefile +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/README.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/architecture.png +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/architecture.svg +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/changelog.d/.gitkeep +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/.gitignore +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/_generator/README.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/_generator/build_reference.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/bundles.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/countries.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/data-publishing-design.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/decile-impact-spec.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/dev.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/engineering/runbooks/acs-local-wic-replacement.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/engineering/runbooks/canonical-spm-development.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/engineering/runbooks/us-legacy-spm-sources.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/engineering/skills/README.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/engineering/skills/github-prs.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/engineering/skills/repository-guidance.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/getting-started.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/households.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/impact-analysis.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/index.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/methodology/index.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/methodology/model-architecture.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/methodology/us-health-costs.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/microsim.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/programs/index.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/programs/us-chip.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/reference/index.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/reforms.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/release-bundles.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/run-records.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/trace-case-study.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/docs/visualisation.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/belgium_axiom_pilot.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/employment_income_variation_uk.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/employment_income_variation_us.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/household_impact_example.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/income_bands_uk.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/income_distribution_us.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/paper_repro_uk.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/policy_change_uk.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/speedtest_us_simulation.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/examples/us_budgetary_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/paper-preview.html +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/paper.bib +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/paper.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/bundle.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/certify_data_release.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/check_data_staleness.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/check_native_spm_loading.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/check_release_credentials.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/export_bundle_release_assets.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/generate_bundle_artifacts.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/generate_trace_tros.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/prepare_package_bundle_update.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/release_lock.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/scripts/spm_bundle.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/setup.cfg +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/bundle.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/cli.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/cache.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/dataset.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/dynamic.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/output.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/parameter.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/parameter_node.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/parameter_value.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/policy.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/region.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/run_record.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/scoping_strategy.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/simulation.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/spm.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/tax_benefit_model.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/tax_benefit_model_version.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/core/variable.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/countries/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/countries/uk/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/countries/uk/regions.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/countries/us/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/countries/us/data/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/countries/us/data/districts.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/countries/us/data/places.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/countries/us/data/states.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/countries/us/regions.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/data/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/data/schemas/trace_tro.schema.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/data/uk_geography_assets.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/derivations/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/derivations/narrate.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/derivations/trace.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/graph/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/graph/extractor.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/graph/graph.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/aggregate.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/change_aggregate.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/cliff_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/congressional_district_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/decile_analysis.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/decile_grouping.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/decile_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/extra_variables.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/inequality.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/intra_decile_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/labor_supply_response.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/poverty.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/program_statistics.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/outputs/uk_geography_assets.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/bundle_validation.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/certification.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/dataset_materialization.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/manifest.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/pyproject_pins.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/spm_configuration.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/trace.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/verify.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/provenance/zenodo.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/results/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/results/schema.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/results/trace_tro.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/results/tracking.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/be/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/be/datasets.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/be/model.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/common/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/common/axes.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/common/extra_variables.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/common/household.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/common/model_version.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/common/reform.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/common/result.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/uk/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/uk/analysis.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/uk/budget_reform_contract.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/uk/budget_reform_population.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/uk/datasets.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/uk/household.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/analysis.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/datasets.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/household.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/legacy_inputs.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/legacy_spm/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/legacy_spm/declarations.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/legacy_spm/independence.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/legacy_spm/model_adapter.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/legacy_spm/record.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/legacy_spm/registry.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/legacy_spm/runs.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/legacy_spm/universe.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/model.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/tax_benefit_models/us/spm.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/dates.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/design.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/entity_utils.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/errors.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/hashing.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/household_validation.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/parameter_labels.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/parametric_reforms.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine/utils/plotting.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine.egg-info/dependency_links.txt +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine.egg-info/entry_points.txt +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine.egg-info/requires.txt +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/src/policyengine.egg-info/top_level.txt +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/conftest.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/filtering_fixtures.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/uk_couple_two_kids.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/uk_model_surface.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/uk_single_adult_employment_income.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/uk_single_adult_no_income.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/uk_single_parent_one_child.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/us_married_two_kids_high_income.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/us_model_surface.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/us_single_adult_employment_income.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/us_single_adult_no_income.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/household_calculator_snapshots/us_single_parent_one_child.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/parameter_labels_fixtures.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/parametric_reforms_fixtures.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/poverty_by_demographics_fixtures.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/region_fixtures.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/release_tros/README.md +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/release_tros/country-models.lock.toml +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/release_tros/manifest.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/release_tros/us-release_manifest.json +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/release_tros/us.trace.tro.jsonld +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/spm_development.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/us_reform_fixtures.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/fixtures/variable_label_fixtures.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_aggregate.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_be_axiom_pilot.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_budgetary_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_bump_version.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_bundle.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_bundle_metadata.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_cache.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_certify_data_release.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_change_aggregate.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_cliff_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_cliff_impact_analysis.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_congressional_district_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_dataset_materialization.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_dataset_persistence.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_dataset_runtime.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_dataset_source.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_decile_grouping.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_derivations.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_dict_reforms_on_simulation.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_entity_mapping.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_entity_utils.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_entity_utils_characterization.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_errors.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_filtering.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_generate_trace_tros.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_graph/__init__.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_graph/conftest.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_graph/test_extractor.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_household_calculator_snapshot.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_household_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_inequality.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_intra_decile_impact.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_labor_supply_response.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_manifest_version_mismatch.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_models.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_pandas3_compatibility.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_parameter_labels.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_parameter_nodes.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_parameter_values.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_parametric_reforms.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_poverty.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_poverty_by_demographics.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_poverty_run.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_preservation_mirror.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_program_statistics.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_pyproject_pins.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_region.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_region_group_strategy.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_release_credentials.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_release_lock.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_release_manifests.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_release_tro_generation.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_results.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_run_record.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_scoping_strategy.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_small_follow_ups.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_spm_bundle_bootstrap.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_spm_bundle_tooling.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_spm_decile.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_spm_development_authentication.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_spm_household.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_spm_model.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_spm_selection.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_spm_selection_schema.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_trace_tro.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_trace_tro_verify.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_uk_analysis.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_uk_budget_reform_contract.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_uk_dated_reforms.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_uk_geography_assets.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_uk_program_statistics.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_uk_regions.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_uk_year_file_data_year.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_legacy_inputs.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_legacy_inputs_integration.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_legacy_spm.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_legacy_spm_integration.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_legacy_spm_model_contract.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_long_term_datasets.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_microsim_structural_reforms.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_native_alignment.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_native_hdf_weights.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_program_statistics.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_reform_application.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_regions.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_us_year_file_stamp.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_variable_labels.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_variable_metadata.py +0 -0
- {policyengine-6.3.4 → policyengine-6.4.0}/tests/test_zenodo_mirror.py +0 -0
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
## [6.4.0] - 2026-10-14
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
|
|
5
|
+
- Added `policyengine.disclosure`, a self-contained layer for statistical disclosure control and uncertainty on area-level outputs, and `compute_uk_geography_disclosure` for UK regions, constituencies and local authorities. Each published number rests on at least 10 distinct survey households (clones counted once through `source_household_id`), carries a 90% bootstrap interval and is rounded to the order of its standard error. Rows are `reported`, `approximate` or `withheld`. A release check reports numbers a reader could recover by subtraction across geography levels, a package and its components, and earlier publications. Keyed noise per survey household is available behind `DisclosureSettings(noise=True)`. `validate_public` and `python -m policyengine.disclosure validate` check the format of published files. UK runs now keep `source_household_id` and `region` on the household output when the dataset provides them.
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Deprecated `compute_uk_constituency_impacts`, `compute_uk_local_authority_impacts` and their `ConstituencyImpact` and `LocalAuthorityImpact` classes. Their output is not disclosure-controlled; use `compute_uk_geography_disclosure` instead. They now log a warning through the `policyengine` logger and emit a `DeprecationWarning`, and otherwise behave as before.
|
|
10
|
+
|
|
11
|
+
|
|
1
12
|
## [6.3.4] - 2026-10-13
|
|
2
13
|
|
|
3
14
|
### Changed
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Disclosure control"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Local results from survey microdata rest on few households, and a licence
|
|
6
|
+
binds every published number. `policyengine.disclosure` turns per-household
|
|
7
|
+
results into area tables that follow the licence's rules and carry their
|
|
8
|
+
uncertainty. Use it for every UK result below the national level that leaves
|
|
9
|
+
your machine.
|
|
10
|
+
|
|
11
|
+
```python
|
|
12
|
+
from policyengine.outputs import compute_uk_geography_disclosure
|
|
13
|
+
|
|
14
|
+
impact = compute_uk_geography_disclosure(
|
|
15
|
+
baseline_simulation=baseline,
|
|
16
|
+
reform_simulation=reform,
|
|
17
|
+
year=2026,
|
|
18
|
+
levels=("region", "constituency"),
|
|
19
|
+
reform="budget",
|
|
20
|
+
)
|
|
21
|
+
impact.findings # what blocks publication, if anything
|
|
22
|
+
impact.public # the rows that may be published, or None while blocked
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The UK datasets derive from surveys under the UK Data Service End User
|
|
26
|
+
Licence. The defaults below follow its disclosure rules. You can raise them
|
|
27
|
+
for a study with stricter conditions; you cannot lower them.
|
|
28
|
+
|
|
29
|
+
## What a published row holds
|
|
30
|
+
|
|
31
|
+
Each row is one outcome for one area, reform and year.
|
|
32
|
+
|
|
33
|
+
| Column | Content |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `level`, `area_code`, `reform`, `year`, `outcome` | The key of the row |
|
|
36
|
+
| `value`, `lo`, `hi` | The rounded estimate and its 90% interval |
|
|
37
|
+
| `direction` | `gain`, `loss`, `too_close_to_call` or `no_change` |
|
|
38
|
+
| `tier` | `reported`, `approximate` or `withheld` |
|
|
39
|
+
| `reason` | `thin_support` for an approximate row, `disclosure_control` for a withheld row |
|
|
40
|
+
| `support_band` | `<10`, `10–29` or `30+` survey households, never an exact count |
|
|
41
|
+
| `noise` | Whether the row carries keyed noise |
|
|
42
|
+
| `estimator` | `direct`: the estimate comes from the area's own records |
|
|
43
|
+
|
|
44
|
+
The outcomes are `average_change`, `relative_change`, `total_change`,
|
|
45
|
+
`share_gaining`, `share_losing` and `share_no_change`. A withheld row carries
|
|
46
|
+
no value, interval, direction or support band.
|
|
47
|
+
|
|
48
|
+
## The rules
|
|
49
|
+
|
|
50
|
+
**Count floor.** A number must rest on at least 10 distinct survey households
|
|
51
|
+
that contribute to it. For a change, a household contributes when its income
|
|
52
|
+
changes by more than `change_tolerance` (£1 a year, which is also the lowest
|
|
53
|
+
value the setting takes). Copies and clones of one survey household count
|
|
54
|
+
once, through the dataset's `source_household_id`. For a share, both sides
|
|
55
|
+
must pass: the households that gain and those that do not.
|
|
56
|
+
|
|
57
|
+
**Dominance.** While noise is off, a number is withheld in two cases:
|
|
58
|
+
|
|
59
|
+
- one survey household carries more than half of it, by size;
|
|
60
|
+
- the p% rule: a reader of the number, or one household that knows its own
|
|
61
|
+
part, could estimate some household's part to within 10%. Every household
|
|
62
|
+
is a possible target and every other household a possible reader, so the
|
|
63
|
+
rule also catches a total whose other parts cancel.
|
|
64
|
+
|
|
65
|
+
These rules protect each household against any reader and against any one
|
|
66
|
+
other household. They do not stop two or more households that pool what they
|
|
67
|
+
know: a number that three households carry almost alone passes, as long as 10
|
|
68
|
+
contribute.
|
|
69
|
+
|
|
70
|
+
**Effective sample.** Weights that differ a lot make an estimate less precise
|
|
71
|
+
than its household count suggests. Where the data gives one area and one
|
|
72
|
+
weight per record, a low effective sample makes a row `approximate`: it keeps
|
|
73
|
+
its value and interval, but the interval understates the uncertainty. Where
|
|
74
|
+
the data is an area × household weight matrix, the household count passes by
|
|
75
|
+
construction, so the effective sample must also be at least 10. Weights given
|
|
76
|
+
as a matrix keep this rule whatever they hold: one row of a dense matrix has
|
|
77
|
+
one weight per record, yet every household of the nation sits in that area.
|
|
78
|
+
|
|
79
|
+
**Zero cells.** A cell with no contributing household is published as zero,
|
|
80
|
+
with the interval [0, 0] and the direction `no_change`. It means that no
|
|
81
|
+
surveyed household in the area changed, not that no household there does. Its
|
|
82
|
+
support band counts the households it was measured on.
|
|
83
|
+
|
|
84
|
+
**Settings.** The layer validates its settings again before it uses them, so
|
|
85
|
+
a copy made with `model_copy(update=...)` cannot lower a floor.
|
|
86
|
+
|
|
87
|
+
**Linked outcomes.** Average, relative and total change share a numerator, so
|
|
88
|
+
they are published or withheld together. Gaining, losing and no change add to
|
|
89
|
+
one, so the third share is published only when it is safe to derive.
|
|
90
|
+
|
|
91
|
+
## Uncertainty and rounding
|
|
92
|
+
|
|
93
|
+
Intervals come from a Poisson bootstrap over survey households with 1,000
|
|
94
|
+
replicates. A ratio resamples its numerator and denominator together. The
|
|
95
|
+
weights stay fixed, so the intervals leave out calibration uncertainty and are
|
|
96
|
+
too narrow, most of all where support is thin.
|
|
97
|
+
|
|
98
|
+
Values are rounded to the order of magnitude of their standard error. The
|
|
99
|
+
interval is rounded outward on the same base.
|
|
100
|
+
|
|
101
|
+
## The release check
|
|
102
|
+
|
|
103
|
+
Published numbers constrain each other. If a region is public and all but one
|
|
104
|
+
of its constituencies are public, subtraction gives the last one. The check
|
|
105
|
+
looks for such remainders:
|
|
106
|
+
|
|
107
|
+
- child areas against their parent area (constituencies in regions, regions in
|
|
108
|
+
the nation);
|
|
109
|
+
- the components of a package against the package;
|
|
110
|
+
- when two levels that do not nest are released together, an area against
|
|
111
|
+
the areas of the other level that lie wholly inside it, and against the
|
|
112
|
+
areas that meet it (their sum minus the area is what they hold outside it);
|
|
113
|
+
- earlier publications, passed as `prior_public`.
|
|
114
|
+
|
|
115
|
+
A remainder gets the rules of a cell. Estimates added with `publish=False`
|
|
116
|
+
are a reference: the release does not emit their rows, but it treats the rows
|
|
117
|
+
that pass as public elsewhere and the withheld ones as secret, and checks
|
|
118
|
+
them like its own.
|
|
119
|
+
|
|
120
|
+
`compute_uk_geography_disclosure` always checks constituencies and local
|
|
121
|
+
authorities against their region, and regions against the nation, also when
|
|
122
|
+
you publish one level only. A level given as a weight matrix needs
|
|
123
|
+
`parent_of=` with the region of each area; without it the function raises,
|
|
124
|
+
because a check against the nation alone nearly always passes.
|
|
125
|
+
|
|
126
|
+
The check reports; it does not withhold cells by itself. A blocking finding
|
|
127
|
+
names the group and suggests a cell. Withhold it, then check again. When a
|
|
128
|
+
finding suggests no cell, withhold the parent (`finding.group` at
|
|
129
|
+
`finding.group_level`) instead:
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
for finding in impact.findings:
|
|
133
|
+
print(finding.code, finding.group, finding.suggested)
|
|
134
|
+
|
|
135
|
+
impact.release.withhold(
|
|
136
|
+
level="constituency",
|
|
137
|
+
area_code="E14001234",
|
|
138
|
+
reform="budget",
|
|
139
|
+
year=2026,
|
|
140
|
+
outcome="average_change",
|
|
141
|
+
)
|
|
142
|
+
impact.refresh() # checks again and fills impact.public once nothing blocks
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Two findings can be accepted after review, with `acknowledge=[...]`:
|
|
146
|
+
|
|
147
|
+
- `unchecked_overlap`: levels that overlap without nesting, such as
|
|
148
|
+
constituencies and local authorities, are released together. The release
|
|
149
|
+
checks each area against the areas wholly inside it and against the areas
|
|
150
|
+
that meet it. It does not check other differences between overlapping
|
|
151
|
+
areas, and on weight-matrix data it checks none.
|
|
152
|
+
- `noise_reference_public`: an earlier table shows the same cells under
|
|
153
|
+
another noise setting.
|
|
154
|
+
|
|
155
|
+
## Noise
|
|
156
|
+
|
|
157
|
+
Noise is off by default. With `DisclosureSettings(noise=True)`, each survey
|
|
158
|
+
household's change is scaled by a fixed factor between 8% and 12% away from 1,
|
|
159
|
+
derived from its id and a secret key. The same household has the same factor
|
|
160
|
+
in every table and every rebuild. Noise replaces the dominance rule; the count
|
|
161
|
+
floor still applies. The range cannot start closer to 1 than 8%.
|
|
162
|
+
|
|
163
|
+
A number that one household dominates, published with noise, gives that
|
|
164
|
+
household's part to within 8 to 12%. The p% rule treats 10% as the line, so
|
|
165
|
+
noise puts such a number right at that line, not safely past it. Whether the
|
|
166
|
+
UK Data Service accepts noise in place of the dominance rule is a licence
|
|
167
|
+
question, which is why noise stays off by default.
|
|
168
|
+
|
|
169
|
+
- **Size.** The noise in a total is about a tenth of that total's sampling
|
|
170
|
+
error.
|
|
171
|
+
- **Key.** Pass `noise_key=` or set `POLICYENGINE_DISCLOSURE_NOISE_KEY`. There
|
|
172
|
+
is no default key. Keep the key out of repositories and CI logs, and do not
|
|
173
|
+
change it between releases of one dataset: two noised versions of a number
|
|
174
|
+
average towards the truth.
|
|
175
|
+
- **Limits.** Denominators carry no noise. The factor cancels in a ratio of
|
|
176
|
+
two numbers that the same household dominates. A remainder that subtraction
|
|
177
|
+
recovers is the noised sum of the withheld cells, so it has the protection
|
|
178
|
+
of a noised cell and no more: the count floor applies to it, and noise
|
|
179
|
+
stands in for the dominance rule as it does for a cell. An un-noised copy
|
|
180
|
+
of the same cell gives the factor away.
|
|
181
|
+
|
|
182
|
+
## Validating published files
|
|
183
|
+
|
|
184
|
+
`validate_public` checks the format of a table, a CSV file or a directory. It
|
|
185
|
+
needs no key and no microdata, so it can run on every pull request:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
python -m policyengine.disclosure validate public/data --reviewed notes.csv
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
It rejects private audit columns, unknown tiers, a value in a withheld row,
|
|
192
|
+
unrounded values, a direction that does not match its interval, and files it
|
|
193
|
+
does not recognise. It cannot tell whether a number rested on enough
|
|
194
|
+
households; only the release that made the file can.
|
|
195
|
+
|
|
196
|
+
## Private objects
|
|
197
|
+
|
|
198
|
+
`audit_dir=` writes the exact values, household counts and shares behind every
|
|
199
|
+
row. The directory must be outside any git repository.
|
|
200
|
+
|
|
201
|
+
`AreaEstimates`, the object that `estimate_change` returns, holds the same
|
|
202
|
+
exact values. With noise on it also holds the noise factor of every household
|
|
203
|
+
that gains or loses, and within one dataset those factors do the same job as
|
|
204
|
+
the key. Keep it in memory and treat it as you treat the key. It cannot be
|
|
205
|
+
pickled or copied.
|
|
206
|
+
|
|
207
|
+
## What a reader can still derive
|
|
208
|
+
|
|
209
|
+
`average_change` and `relative_change` together give the area's total
|
|
210
|
+
baseline income to within a few per cent (household count × average ÷
|
|
211
|
+
relative). That total is a denominator: it carries no noise and is not
|
|
212
|
+
checked for dominance.
|
|
213
|
+
|
|
214
|
+
## Arrays without a simulation
|
|
215
|
+
|
|
216
|
+
The package works on arrays and imports nothing from the rest of the library:
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
from policyengine.disclosure import AreaWeights, Release, estimate_change
|
|
220
|
+
|
|
221
|
+
seats = estimate_change(
|
|
222
|
+
level="constituency",
|
|
223
|
+
reform="budget",
|
|
224
|
+
year=2026,
|
|
225
|
+
areas=AreaWeights.from_labels(seat_codes, household_weights),
|
|
226
|
+
source_ids=source_household_ids,
|
|
227
|
+
baseline=baseline_net_income,
|
|
228
|
+
reformed=reformed_net_income,
|
|
229
|
+
)
|
|
230
|
+
release = Release()
|
|
231
|
+
release.add(seats)
|
|
232
|
+
release.check()
|
|
233
|
+
public = release.to_public()
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
`AreaWeights.from_matrix(matrix, area_codes)` takes an area × household weight
|
|
237
|
+
matrix instead. A dataset without `source_household_id` needs `source_ids=`
|
|
238
|
+
from the caller; the layer does not guess which records share a survey
|
|
239
|
+
household.
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
Use this runbook to certify a new national US Populace release together with
|
|
4
4
|
the shared ACS-local release used for state and congressional-district
|
|
5
|
-
simulations.
|
|
6
|
-
|
|
5
|
+
simulations. For now, state and district simulations use the national release
|
|
6
|
+
instead; see the interim exception in Step 2. Read the
|
|
7
|
+
[data certification](../skills/data-certification.md) skill first for
|
|
8
|
+
validation semantics.
|
|
7
9
|
|
|
8
10
|
This historical filename is retained so existing links remain valid; the
|
|
9
11
|
procedure itself is release-independent.
|
|
@@ -13,7 +15,8 @@ procedure itself is release-independent.
|
|
|
13
15
|
Both release manifests have been published to `policyengine/populace-us`, and
|
|
14
16
|
the model version used by the national release is known. The national release
|
|
15
17
|
will remain the default dataset; the local-area release will remain
|
|
16
|
-
non-default and be selected only for supported regional runs
|
|
18
|
+
non-default and be selected only for supported regional runs (none while the
|
|
19
|
+
interim exception in Step 2 holds).
|
|
17
20
|
|
|
18
21
|
## Prerequisites
|
|
19
22
|
|
|
@@ -60,6 +63,19 @@ This one command:
|
|
|
60
63
|
- writes the changelog fragment
|
|
61
64
|
`changelog.d/certify-us-$NATIONAL_RELEASE_ID.changed.md`.
|
|
62
65
|
|
|
66
|
+
**Interim exception (from policyengine 6.3.4; PolicyEngine/policyengine.py#604).**
|
|
67
|
+
State and congressional-district regions filter the national dataset until an
|
|
68
|
+
ACS-local release has no SPM unit without a classified adult
|
|
69
|
+
(PolicyEngine/microcosm#1263). Run the command above unchanged, with
|
|
70
|
+
`--regional-manifest-uri`: without it, certification drops the ACS-local
|
|
71
|
+
dataset and leaves no state or district template. Then, before Step 3, set
|
|
72
|
+
`region_datasets.state` and `region_datasets.congressional_district` in
|
|
73
|
+
`data_releases.us` to `{"path_template": "populace_us_2024.h5"}` by hand. In
|
|
74
|
+
Step 5, expect those two templates to select the national artifact, not the
|
|
75
|
+
local-area one. The data-certification skill
|
|
76
|
+
(`docs/engineering/skills/data-certification.md`) says what must hold before
|
|
77
|
+
the exception ends.
|
|
78
|
+
|
|
63
79
|
## Step 3 — regenerate TRACE sidecars
|
|
64
80
|
|
|
65
81
|
The certify step does not touch TRACE sidecars. Regenerate them so they record
|
|
@@ -87,15 +103,16 @@ PE_UPDATE_SNAPSHOTS=1 pytest tests/test_household_calculator_snapshot.py
|
|
|
87
103
|
|
|
88
104
|
## Step 5 — certify and verify the local-area release
|
|
89
105
|
|
|
90
|
-
The certification command passes the immutable ACS-local
|
|
91
|
-
`--regional-manifest-uri`. Confirm all of the following:
|
|
106
|
+
The certification command passes the immutable ACS-local
|
|
107
|
+
release manifest with `--regional-manifest-uri`. Confirm all of the following:
|
|
92
108
|
|
|
93
109
|
- `default_dataset` remains the national Populace dataset;
|
|
94
110
|
- the local-area artifact appears in `data_releases.us.datasets` with its
|
|
95
111
|
repository type, immutable revision, and SHA-256;
|
|
96
112
|
- `region_datasets.national` selects the national artifact;
|
|
97
113
|
- `region_datasets.state` and `region_datasets.congressional_district` select
|
|
98
|
-
the shared local-area artifact
|
|
114
|
+
the shared local-area artifact (the national artifact while the interim
|
|
115
|
+
exception in Step 2 holds);
|
|
99
116
|
- no derived `states/*.h5` or `districts/*.h5` artifacts are runtime inputs.
|
|
100
117
|
|
|
101
118
|
```bash
|
|
@@ -35,8 +35,33 @@ python scripts/bundle.py certify-data --country us --data-producer populace \
|
|
|
35
35
|
--model-version "<policyengine-us-version>"
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
**Interim exception (from policyengine 6.3.4; PolicyEngine/policyengine.py#604).**
|
|
39
|
+
State and congressional-district regions currently filter the certified
|
|
40
|
+
national dataset, not the ACS-local one. The certified ACS-local release has
|
|
41
|
+
no source-backed SPM independence, so canonical SPM refuses its SPM units that
|
|
42
|
+
have no classified adult, and with them every state-region run
|
|
43
|
+
(PolicyEngine/microcosm#1263, PolicyEngine/policyengine-sim-api#747). The 6.3.4
|
|
44
|
+
manifest was certified with `--regional-manifest-uri`, as below, and then
|
|
45
|
+
edited by hand. Until the exception ends, do the same:
|
|
46
|
+
|
|
47
|
+
- still pass `--regional-manifest-uri`. Without it, certification rewrites
|
|
48
|
+
`data_releases.us` from the national manifest alone, which drops the
|
|
49
|
+
ACS-local dataset and leaves no state or district template at all;
|
|
50
|
+
- then set `region_datasets.state` and `region_datasets.congressional_district`
|
|
51
|
+
to `{"path_template": "populace_us_2024.h5"}` by hand, before regenerating
|
|
52
|
+
the TRACE sidecars. `tests/test_release_manifests.py` fails if they name
|
|
53
|
+
the ACS-local file, and also if the ACS-local dataset is no longer
|
|
54
|
+
certified.
|
|
55
|
+
|
|
56
|
+
Restore the ACS-local regions only with an ACS-local release in which every
|
|
57
|
+
SPM unit has at least one classified adult under the pinned spm-calculator's
|
|
58
|
+
rule (zero unclassified units), and after a state-region run through the
|
|
59
|
+
public wrapper succeeds on it. Then remove this exception, the temporary test
|
|
60
|
+
and the matching notes in `docs/regions.md` and `docs/bundles.md`.
|
|
61
|
+
|
|
62
|
+
Outside that exception, US state and congressional-district regions are row
|
|
63
|
+
filters over one shared, certified ACS-local Populace dataset. Its release
|
|
64
|
+
manifest must declare
|
|
40
65
|
`dataset_role: non_default_local_area`, `is_default: false`, no default
|
|
41
66
|
datasets, and exactly one pinned H5 microdata artifact. Certification writes:
|
|
42
67
|
|
|
@@ -16,6 +16,13 @@ Applying parametric reforms, comparing baseline and reform with `ChangeAggregate
|
|
|
16
16
|
```{.python include="../examples/policy_change_uk.py"}
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
## UK geography results under disclosure control
|
|
20
|
+
|
|
21
|
+
Estimating results by area from per-household arrays, checking the release, withholding a cell and validating the public table. The data is synthetic.
|
|
22
|
+
|
|
23
|
+
```{.python include="../examples/uk_geography_disclosure.py"}
|
|
24
|
+
```
|
|
25
|
+
|
|
19
26
|
## UK income bands
|
|
20
27
|
|
|
21
28
|
Calculating net income and tax by income decile using representative microdata and `Aggregate` with quantile filters.
|
|
@@ -266,7 +266,28 @@ for row in impacts.district_results:
|
|
|
266
266
|
print(row["district_geoid"], row["avg_change"], row["winner_percentage"])
|
|
267
267
|
```
|
|
268
268
|
|
|
269
|
-
### UK constituencies
|
|
269
|
+
### UK regions, constituencies and local authorities
|
|
270
|
+
|
|
271
|
+
`compute_uk_geography_disclosure` returns results by area under disclosure
|
|
272
|
+
control: each number passes a floor on the survey households behind it and
|
|
273
|
+
carries a 90% interval. Use it for anything you publish. See
|
|
274
|
+
[Disclosure control](disclosure.md).
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
from policyengine.outputs import compute_uk_geography_disclosure
|
|
278
|
+
|
|
279
|
+
impact = compute_uk_geography_disclosure(
|
|
280
|
+
baseline_simulation=baseline,
|
|
281
|
+
reform_simulation=reform,
|
|
282
|
+
year=2026,
|
|
283
|
+
levels=("region", "constituency"),
|
|
284
|
+
)
|
|
285
|
+
impact.public.to_frame()
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
The two older functions below are deprecated. Their output is not
|
|
289
|
+
disclosure-controlled, so do not publish it when the data is licensed survey
|
|
290
|
+
microdata.
|
|
270
291
|
|
|
271
292
|
Constituency and local-authority breakdowns group household output rows by
|
|
272
293
|
dataset-provided longwise geography columns. Constituencies use
|
|
@@ -93,6 +93,11 @@ national UK dataset.
|
|
|
93
93
|
|
|
94
94
|
## UK parliamentary constituencies
|
|
95
95
|
|
|
96
|
+
To publish results by constituency, local authority or region, use
|
|
97
|
+
`compute_uk_geography_disclosure`; see [Disclosure control](disclosure.md).
|
|
98
|
+
The functions in this section and the next are deprecated: their output is
|
|
99
|
+
not disclosure-controlled.
|
|
100
|
+
|
|
96
101
|
Constituency-level impacts group household output rows by the longwise
|
|
97
102
|
`constituency_code_oa` column carried by the dataset. If the constituency CSV is
|
|
98
103
|
available locally or from the PolicyEngine UK GCS bucket, PolicyEngine uses it
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""Example: Publish area results under disclosure control.
|
|
2
|
+
|
|
3
|
+
This script demonstrates:
|
|
4
|
+
1. Building estimates for two geography levels from per-household arrays
|
|
5
|
+
2. Checking a release for numbers a reader could recover by subtraction
|
|
6
|
+
3. Resolving a finding by withholding the suggested cell
|
|
7
|
+
4. Writing the public table and validating its format
|
|
8
|
+
|
|
9
|
+
The data is synthetic, so the script needs no dataset.
|
|
10
|
+
|
|
11
|
+
Run: python examples/uk_geography_disclosure.py
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import tempfile
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from policyengine.disclosure import (
|
|
20
|
+
AreaWeights,
|
|
21
|
+
Release,
|
|
22
|
+
estimate_change,
|
|
23
|
+
validate_public,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def main() -> Path:
|
|
28
|
+
rng = np.random.default_rng(0)
|
|
29
|
+
# Two regions of three seats, 400 households a seat. In seat S1 the
|
|
30
|
+
# reform reaches only a handful of households.
|
|
31
|
+
seats = np.repeat(["S1", "S2", "S3", "S4", "S5", "S6"], 400)
|
|
32
|
+
regions = np.repeat(["North", "South"], 1_200)
|
|
33
|
+
reach = np.where(seats == "S1", 0.01, np.where(seats == "S2", 0.08, 0.35))
|
|
34
|
+
affected = rng.random(len(seats)) < reach
|
|
35
|
+
weights = rng.uniform(150.0, 450.0, len(seats))
|
|
36
|
+
baseline = rng.lognormal(10.4, 0.5, len(seats))
|
|
37
|
+
reformed = baseline + np.where(affected, rng.uniform(100.0, 900.0, len(seats)), 0)
|
|
38
|
+
source_ids = np.arange(len(seats))
|
|
39
|
+
|
|
40
|
+
release = Release()
|
|
41
|
+
for level, codes in (("region", regions), ("constituency", seats)):
|
|
42
|
+
release.add(
|
|
43
|
+
estimate_change(
|
|
44
|
+
level=level,
|
|
45
|
+
reform="example",
|
|
46
|
+
year=2026,
|
|
47
|
+
areas=AreaWeights.from_labels(codes, weights),
|
|
48
|
+
source_ids=source_ids,
|
|
49
|
+
baseline=baseline,
|
|
50
|
+
reformed=reformed,
|
|
51
|
+
)
|
|
52
|
+
)
|
|
53
|
+
release.add_nesting("constituency", "region")
|
|
54
|
+
|
|
55
|
+
# S1 is withheld. Its region is public, so subtraction would recover it
|
|
56
|
+
# unless a second seat is withheld too.
|
|
57
|
+
for finding in release.check():
|
|
58
|
+
print(f"{finding.code}: {finding.message} Suggested: {finding.suggested}")
|
|
59
|
+
release.withhold(
|
|
60
|
+
level="constituency",
|
|
61
|
+
area_code=finding.suggested,
|
|
62
|
+
reform="example",
|
|
63
|
+
year=2026,
|
|
64
|
+
outcome="average_change" if finding.family == "change" else finding.family,
|
|
65
|
+
)
|
|
66
|
+
assert release.check() == []
|
|
67
|
+
|
|
68
|
+
public = release.to_public()
|
|
69
|
+
frame = public.to_frame()
|
|
70
|
+
print(
|
|
71
|
+
frame[frame["outcome"] == "average_change"][
|
|
72
|
+
["level", "area_code", "value", "lo", "hi", "tier", "support_band"]
|
|
73
|
+
].to_string(index=False)
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
output = Path(tempfile.mkdtemp(prefix="disclosure-example-"))
|
|
77
|
+
public.to_csv(output / "example.csv")
|
|
78
|
+
assert validate_public(output) == []
|
|
79
|
+
print(f"Wrote and validated {output / 'example.csv'}")
|
|
80
|
+
return output
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
if __name__ == "__main__":
|
|
84
|
+
main()
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"bundle_version": "6.
|
|
2
|
+
"bundle_version": "6.4.0",
|
|
3
3
|
"citation": {
|
|
4
4
|
"publisher": "PolicyEngine",
|
|
5
|
-
"title": "PolicyEngine bundle 6.
|
|
5
|
+
"title": "PolicyEngine bundle 6.4.0",
|
|
6
6
|
"type": "software-bundle",
|
|
7
|
-
"version": "6.
|
|
7
|
+
"version": "6.4.0"
|
|
8
8
|
},
|
|
9
9
|
"countries": {
|
|
10
10
|
"uk": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"data_releases": {
|
|
18
18
|
"uk": {
|
|
19
19
|
"build_id": "policyengine-uk-data-1.58.0",
|
|
20
|
-
"bundle_id": "uk-6.
|
|
20
|
+
"bundle_id": "uk-6.4.0",
|
|
21
21
|
"certification": {
|
|
22
22
|
"built_with_model_git_sha": "4cbedbecca352f52dffe47e849553c2759a00711",
|
|
23
23
|
"built_with_model_version": "2.122.2",
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
"version": "2.126.12",
|
|
100
100
|
"wheel_url": "https://files.pythonhosted.org/packages/4f/3f/0a611e9b25beb75db3f2f521d359eabad0d1ab4e50194b866663355591ff/policyengine_uk-2.126.12-py3-none-any.whl"
|
|
101
101
|
},
|
|
102
|
-
"policyengine_version": "6.
|
|
102
|
+
"policyengine_version": "6.4.0",
|
|
103
103
|
"region_datasets": {
|
|
104
104
|
"national": {
|
|
105
105
|
"path_template": "enhanced_frs_2024_25.h5"
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
},
|
|
113
113
|
"us": {
|
|
114
114
|
"build_id": "populace-us-2024-spm-20260915",
|
|
115
|
-
"bundle_id": "us-6.
|
|
115
|
+
"bundle_id": "us-6.4.0",
|
|
116
116
|
"certification": {
|
|
117
117
|
"built_with_model_version": "2.2.1",
|
|
118
118
|
"certified_by": "policyengine.py bundle certification",
|
|
@@ -217,7 +217,7 @@
|
|
|
217
217
|
"version": "2.2.1",
|
|
218
218
|
"wheel_url": "https://files.pythonhosted.org/packages/5e/09/86ac3968d2a18e28fce3ba1186fc21728e9f299b96a806d6f204f1e0aaed/policyengine_us-2.2.1-py3-none-any.whl"
|
|
219
219
|
},
|
|
220
|
-
"policyengine_version": "6.
|
|
220
|
+
"policyengine_version": "6.4.0",
|
|
221
221
|
"region_datasets": {
|
|
222
222
|
"congressional_district": {
|
|
223
223
|
"path_template": "populace_us_2024.h5"
|
|
@@ -295,10 +295,10 @@
|
|
|
295
295
|
"packages": {
|
|
296
296
|
"policyengine": {
|
|
297
297
|
"import_name": "policyengine",
|
|
298
|
-
"install_requirement": "policyengine==6.
|
|
298
|
+
"install_requirement": "policyengine==6.4.0",
|
|
299
299
|
"name": "policyengine",
|
|
300
300
|
"role": "bundle_carrier",
|
|
301
|
-
"version": "6.
|
|
301
|
+
"version": "6.4.0"
|
|
302
302
|
},
|
|
303
303
|
"policyengine-core": {
|
|
304
304
|
"import_name": "policyengine_core",
|
|
@@ -334,6 +334,6 @@
|
|
|
334
334
|
"wheel_url": "https://files.pythonhosted.org/packages/19/a0/c484f69a0ebf88a9b9fd0ac28176f8df66550f46714f1b0c5ec0b360824e/spm_calculator-1.0.0-py3-none-any.whl"
|
|
335
335
|
}
|
|
336
336
|
},
|
|
337
|
-
"policyengine_version": "6.
|
|
337
|
+
"policyengine_version": "6.4.0",
|
|
338
338
|
"schema_version": 2
|
|
339
339
|
}
|
|
@@ -18,18 +18,18 @@
|
|
|
18
18
|
"schema:url": "https://policyengine.org"
|
|
19
19
|
},
|
|
20
20
|
"schema:dateCreated": "2026-10-07T17:31:53.189867Z",
|
|
21
|
-
"schema:description": "TRACE TRO for certified runtime bundle uk-6.
|
|
21
|
+
"schema:description": "TRACE TRO for certified runtime bundle uk-6.4.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.4.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.4.0.",
|
|
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": "53430915cbdd1531c0735481c4eaf0fc425fc18f9e945f424b6b0f5120ce11b3"
|
|
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": "76da4207c63012c882686b518126c57797e6cb9b345bf8b755dc18917f8dcceb"
|
|
106
106
|
}
|
|
107
107
|
},
|
|
108
108
|
"trov:hasPerformance": {
|